From 3436aa64cbf02ab77268c8343a07e0de89e9bf47 Mon Sep 17 00:00:00 2001 From: QTbin <52951453+QT-one@users.noreply.github.com> Date: Mon, 13 Jan 2025 10:32:15 +0800 Subject: [PATCH 01/51] =?UTF-8?q?[ht32][drv]=E6=96=B0=E5=A2=9E=E4=BA=86CAN?= =?UTF-8?q?=E3=80=81USB=E5=92=8CSDIO=E7=9A=84=E9=A9=B1=E5=8A=A8=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/bsp_buildings.yml | 1 + bsp/ht32/ht32f12366/.config | 260 +- bsp/ht32/ht32f12366/README.md | 4 +- bsp/ht32/ht32f12366/SConstruct | 3 + bsp/ht32/ht32f12366/applications/test.c | 123 +- bsp/ht32/ht32f12366/board/Kconfig | 137 +- bsp/ht32/ht32f12366/board/inc/board.h | 4 + bsp/ht32/ht32f12366/board/inc/ht32_msp.h | 65 +- .../board/inc/ht32f1xxxx_01_usbdconf.h | 52 +- bsp/ht32/ht32f12366/board/src/ht32_msp.c | 48 +- bsp/ht32/ht32f12366/project.uvoptx | 508 ++-- bsp/ht32/ht32f12366/project.uvprojx | 527 +--- bsp/ht32/ht32f12366/rtconfig.h | 147 +- bsp/ht32/ht32f12366/template.uvoptx | 2 +- bsp/ht32/ht32f12366/template.uvprojx | 6 +- bsp/ht32/ht32f52352/.config | 258 +- bsp/ht32/ht32f52352/README.md | 4 +- bsp/ht32/ht32f52352/SConstruct | 3 + bsp/ht32/ht32f52352/applications/test.c | 102 +- bsp/ht32/ht32f52352/board/Kconfig | 134 + .../board/inc/ht32f5xxxx_01_usbdconf.h | 52 +- bsp/ht32/ht32f52352/project.uvoptx | 432 ++-- bsp/ht32/ht32f52352/project.uvprojx | 506 +--- bsp/ht32/ht32f52352/rtconfig.h | 146 +- bsp/ht32/ht32f52352/template.uvprojx | 6 +- .../.ci/attachconfig/ci.attachconfig.yml | 18 + bsp/ht32/ht32f53252/.config | 1326 ++++++++++ bsp/ht32/ht32f53252/Kconfig | 12 + bsp/ht32/ht32f53252/README.md | 108 + bsp/ht32/ht32f53252/SConscript | 15 + bsp/ht32/ht32f53252/SConstruct | 63 + bsp/ht32/ht32f53252/applications/SConscript | 26 + bsp/ht32/ht32f53252/applications/main.c | 37 + bsp/ht32/ht32f53252/applications/test.c | 941 +++++++ bsp/ht32/ht32f53252/board/Kconfig | 449 ++++ bsp/ht32/ht32f53252/board/SConscript | 27 + bsp/ht32/ht32f53252/board/inc/board.h | 56 + .../ht32f53252/board/inc/ht32_can_config.h | 111 + bsp/ht32/ht32f53252/board/inc/ht32_msp.h | 368 +++ .../board/inc/ht32f5xxxx_01_usbdconf.h | 453 ++++ .../board/inc/ht32f5xxxx_02_usbdconf.h | 569 +++++ .../ht32f53252/board/inc/ht32f5xxxx_conf.h | 556 ++++ .../ht32f53252/board/linker_scripts/link.icf | 28 + .../ht32f53252/board/linker_scripts/link.lds | 156 ++ .../ht32f53252/board/linker_scripts/link.sct | 15 + bsp/ht32/ht32f53252/board/src/board.c | 17 + bsp/ht32/ht32f53252/board/src/ht32_msp.c | 272 ++ bsp/ht32/ht32f53252/figures/board.jpg | Bin 0 -> 477663 bytes bsp/ht32/ht32f53252/project.uvoptx | 1203 +++++++++ bsp/ht32/ht32f53252/project.uvprojx | 2234 +++++++++++++++++ bsp/ht32/ht32f53252/rtconfig.h | 394 +++ bsp/ht32/ht32f53252/rtconfig.py | 152 ++ bsp/ht32/ht32f53252/template.uvoptx | 179 ++ bsp/ht32/ht32f53252/template.uvprojx | 391 +++ bsp/ht32/libraries/.ignore_format.yml | 1 + .../HT32_STD_1xxxx_FWLib/Release_Notes.txt | 87 +- .../libraries/HT32_STD_1xxxx_FWLib/SConscript | 28 +- .../Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h | 35 +- .../Source/ARM/startup_ht32f12345.s | 80 +- .../Source/ARM/startup_ht32f12364.s | 30 +- .../Source/ARM/startup_ht32f12365_66.s | 80 +- .../HT32F1xxxx/Source/ARM/startup_ht32f165x.s | 80 +- .../Source/ARM/startup_ht32f1xxxx_01.s | 80 +- .../Source/ARM/startup_ht32f1xxxx_03.s | 30 +- .../CodeSourcery/startup_ht32f1xxxx_cs3_01.s | 36 +- .../Source/GCC/startup_ht32f1xxxx_gcc_01.s | 36 +- .../Source/IAR/startup_ht32f1xxxx_iar_01.s | 52 +- .../emStudio/startup_ht32f1xxxx_es_01.s | 36 +- .../HT32F1xxxx_Driver/inc/ht32_cm3_misc.h | 9 +- .../HT32F1xxxx_Driver/inc/ht32_dependency.h | 18 +- .../library/HT32F1xxxx_Driver/inc/ht32_time.h | 24 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h | 16 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h | 6 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h | 4 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h | 6 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h | 18 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h | 34 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h | 6 +- .../HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h | 19 +- .../HT32F1xxxx_Driver/src/ht32_cm3_misc.c | 97 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c | 46 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c | 104 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c | 6 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c | 11 +- .../HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c | 10 +- .../HT32_STD_5xxxx_FWLib/Release_Notes.txt | 281 ++- .../libraries/HT32_STD_5xxxx_FWLib/SConscript | 29 +- .../Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h | 153 +- .../HT32F5xxxx/Source/ARM/startup_hf5032.s | 34 +- .../HT32F5xxxx/Source/ARM/startup_ht32f0006.s | 30 +- .../HT32F5xxxx/Source/ARM/startup_ht32f0008.s | 30 +- .../Source/ARM/startup_ht32f50020_30.s | 33 +- .../Source/ARM/startup_ht32f50220_30.s | 38 +- .../Source/ARM/startup_ht32f50231_41.s | 38 +- .../Source/ARM/startup_ht32f50343.s | 30 +- .../Source/ARM/startup_ht32f50431_41.s | 34 +- .../Source/ARM/startup_ht32f50442_52.s | 34 +- .../Source/ARM/startup_ht32f52142.s | 30 +- .../Source/ARM/startup_ht32f52220_30.s | 48 +- .../Source/ARM/startup_ht32f52231_41.s | 48 +- .../Source/ARM/startup_ht32f52234_44.s | 36 +- .../Source/ARM/startup_ht32f52243_53.s | 48 +- .../Source/ARM/startup_ht32f52331_41.s | 48 +- .../Source/ARM/startup_ht32f52342_52.s | 48 +- .../Source/ARM/startup_ht32f52344_54.s | 30 +- .../Source/ARM/startup_ht32f52357_67.s | 30 +- .../Source/ARM/startup_ht32f53231_41.s | 30 +- .../Source/ARM/startup_ht32f53242_52.s | 30 +- .../Source/ARM/startup_ht32f54231_41.s | 30 +- .../Source/ARM/startup_ht32f54243_53.s | 30 +- .../Source/ARM/startup_ht32f57331_41.s | 38 +- .../Source/ARM/startup_ht32f57342_52.s | 38 +- .../Source/ARM/startup_ht32f57541.s | 378 +++ .../Source/ARM/startup_ht32f57552.s | 378 +++ .../HT32F5xxxx/Source/ARM/startup_ht32f5826.s | 42 +- .../HT32F5xxxx/Source/ARM/startup_ht32f5828.s | 38 +- .../Source/ARM/startup_ht32f59041.s | 38 +- .../Source/ARM/startup_ht32f59045.s | 520 ++++ .../Source/ARM/startup_ht32f59741.s | 38 +- .../Source/ARM/startup_ht32f59746.s | 38 +- .../Source/ARM/startup_ht32f5xxxx_01.s | 48 +- .../Source/ARM/startup_ht32f5xxxx_02.s | 38 +- .../Source/ARM/startup_ht32f5xxxx_03.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_05.s | 38 +- .../Source/ARM/startup_ht32f5xxxx_06.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_07.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_08.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_09.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_10.s | 34 +- .../Source/ARM/startup_ht32f5xxxx_11.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_12.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_13.s | 34 +- .../Source/ARM/startup_ht32f5xxxx_14.s | 34 +- .../Source/ARM/startup_ht32f5xxxx_15.s | 30 +- .../Source/ARM/startup_ht32f5xxxx_16.s | 36 +- .../Source/ARM/startup_ht32f5xxxx_17.s | 34 +- .../Source/ARM/startup_ht32f61030.s | 34 +- .../Source/ARM/startup_ht32f61041.s | 38 +- .../Source/ARM/startup_ht32f61052.s | 288 +++ .../Source/ARM/startup_ht32f61141.s | 30 +- .../Source/ARM/startup_ht32f61244_45.s | 34 +- .../Source/ARM/startup_ht32f61352.s | 30 +- .../Source/ARM/startup_ht32f61355_56_57.s | 30 +- .../Source/ARM/startup_ht32f61630.s | 34 +- .../Source/ARM/startup_ht32f61641.s | 38 +- .../Source/ARM/startup_ht32f61730.s | 259 ++ .../Source/ARM/startup_ht32f61741.s | 347 +++ .../Source/ARM/startup_ht32f62030.s | 48 +- .../Source/ARM/startup_ht32f62040.s | 48 +- .../Source/ARM/startup_ht32f62050.s | 48 +- .../Source/ARM/startup_ht32f62140.s | 520 ++++ .../Source/ARM/startup_ht32f65230_40.s | 30 +- .../Source/ARM/startup_ht32f65232.s | 30 +- .../Source/ARM/startup_ht32f66242.s | 36 +- .../Source/ARM/startup_ht32f66246.s | 36 +- .../Source/ARM/startup_ht32f67041_51.s | 30 +- .../Source/ARM/startup_ht32f67232.s | 48 +- .../Source/ARM/startup_ht32f67233.s | 48 +- .../Source/ARM/startup_ht32f67741.s | 48 +- .../Source/ARM/startup_ht32f67742.s | 38 +- .../Source/ARM/startup_ht50f32002.s | 38 +- .../Source/ARM/startup_ht50f32003.s | 48 +- .../Source/ARM/startup_ht50f3200s.s | 30 +- .../Source/ARM/startup_ht50f3200t.s | 30 +- .../Source/ARM/startup_ht50f3200u.s | 520 ++++ .../HT32F5xxxx/Source/ARM/startup_mxtx52231.s | 520 ++++ .../HT32F5xxxx/Source/ARM/startup_mxtx52352.s | 520 ++++ .../HT32F5xxxx/Source/ARM/startup_mxtx6306.s | 30 +- .../Source/ARM/startup_nw32f61242.s | 259 ++ .../CodeSourcery/startup_ht32f5xxxx_cs3_01.s | 24 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_02.s | 12 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_05.s | 12 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_10.s | 8 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_13.s | 8 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_14.s | 8 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_16.s | 8 +- .../CodeSourcery/startup_ht32f5xxxx_cs3_17.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_01.s | 24 +- .../Source/GCC/startup_ht32f5xxxx_gcc_02.s | 12 +- .../Source/GCC/startup_ht32f5xxxx_gcc_05.s | 12 +- .../Source/GCC/startup_ht32f5xxxx_gcc_10.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_13.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_14.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_16.s | 8 +- .../Source/GCC/startup_ht32f5xxxx_gcc_17.s | 8 +- .../Source/IAR/startup_ht32f5xxxx_iar_01.s | 22 +- .../Source/IAR/startup_ht32f5xxxx_iar_02.s | 12 +- .../Source/IAR/startup_ht32f5xxxx_iar_05.s | 12 +- .../Source/IAR/startup_ht32f5xxxx_iar_10.s | 8 +- .../Source/IAR/startup_ht32f5xxxx_iar_13.s | 8 +- .../Source/IAR/startup_ht32f5xxxx_iar_14.s | 8 +- .../Source/IAR/startup_ht32f5xxxx_iar_16.s | 10 +- .../Source/IAR/startup_ht32f5xxxx_iar_17.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_01.s | 24 +- .../emStudio/startup_ht32f5xxxx_es_02.s | 12 +- .../emStudio/startup_ht32f5xxxx_es_05.s | 12 +- .../emStudio/startup_ht32f5xxxx_es_10.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_13.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_14.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_16.s | 8 +- .../emStudio/startup_ht32f5xxxx_es_17.s | 8 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_01.c | 6 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_02.c | 12 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_04.c | 8 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_05.c | 8 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_10.c | 6 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_13.c | 6 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_14.c | 6 +- .../HT32F5xxxx/Source/system_ht32f5xxxx_18.c | 19 +- .../inc/ht32_can_config0_calc.h | 385 +++ .../HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h | 9 +- .../HT32F5xxxx_Driver/inc/ht32_config.h | 96 +- .../HT32F5xxxx_Driver/inc/ht32_dependency.h | 18 +- .../library/HT32F5xxxx_Driver/inc/ht32_time.h | 24 +- .../inc/ht32f50020_30_libcfg.h | 5 +- .../HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h | 4 +- .../inc/ht32f50431_41_libcfg.h | 5 +- .../inc/ht32f50442_52_libcfg.h | 6 +- .../inc/ht32f53231_41_libcfg.h | 5 +- .../inc/ht32f53242_52_libcfg.h | 6 +- .../inc/ht32f54231_41_libcfg.h | 5 +- .../inc/ht32f54243_53_libcfg.h | 5 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h | 6 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h | 471 ++-- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h | 43 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h | 47 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h | 13 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h | 18 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h | 6 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h | 20 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h | 14 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h | 17 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h | 31 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h | 17 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h | 14 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h | 52 +- .../HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h | 19 +- .../inc/ht32f65230_40_libcfg.h | 10 +- .../HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h | 13 +- .../inc/ht32f65xxx_66xxx_adc.h | 95 +- .../inc/ht32f65xxx_66xxx_opa.h | 35 +- .../inc/ht32f65xxx_66xxx_pga.h | 107 +- .../HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h | 62 +- .../HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h | 63 +- .../HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h | 242 +- .../HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h | 103 +- .../HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c | 99 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c | 11 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c | 18 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_can.c | 1480 ++++++----- .../HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c | 132 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c | 8 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c | 17 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c | 14 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c | 6 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c | 11 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c | 15 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c | 21 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c | 9 +- .../HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c | 18 +- .../src/ht32f65xxx_66xxx_adc.c | 131 +- .../src/ht32f65xxx_66xxx_opa.c | 122 +- .../src/ht32f65xxx_66xxx_pga.c | 652 ++++- .../HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c | 188 +- .../HT32F5xxxx_Driver/src/ht32f66xxx_pid.c | 299 ++- bsp/ht32/libraries/ht32_drivers/SConscript | 9 + bsp/ht32/libraries/ht32_drivers/cpuport.h | 23 + bsp/ht32/libraries/ht32_drivers/drv_can.c | 673 +++++ bsp/ht32/libraries/ht32_drivers/drv_can.h | 26 + bsp/ht32/libraries/ht32_drivers/drv_common.c | 2 +- bsp/ht32/libraries/ht32_drivers/drv_sdio.c | 747 ++++++ bsp/ht32/libraries/ht32_drivers/drv_sdio.h | 58 + bsp/ht32/libraries/ht32_drivers/drv_usart.c | 10 +- bsp/ht32/libraries/ht32_drivers/drv_usbd.c | 301 +++ bsp/ht32/libraries/ht32_drivers/drv_usbd.h | 27 + bsp/ht32/libraries/usbd_library/SConscript | 22 + bsp/ht32/libraries/usbd_library/checkout.py | 39 + .../usbd_library/inc/ht32_usbd_core.h | 437 ++++ .../usbd_library/inc/ht32_usbd_int.h | 48 + .../libraries/usbd_library/inc/usb_port.h | 29 + .../libraries/usbd_library/inc/usbd_code.h | 434 ++++ .../usbd_library/src/ht32_usbd_core.c | 1069 ++++++++ .../usbd_library/src/ht32_usbd_int.c | 353 +++ .../libraries/usbd_library/src/usb_port.c | 203 ++ .../libraries/usbd_library/src/usbd_code.c | 327 +++ bsp/ht32/tools/sdk_dist.py | 24 + 286 files changed, 29004 insertions(+), 3950 deletions(-) create mode 100644 bsp/ht32/ht32f53252/.ci/attachconfig/ci.attachconfig.yml create mode 100644 bsp/ht32/ht32f53252/.config create mode 100644 bsp/ht32/ht32f53252/Kconfig create mode 100644 bsp/ht32/ht32f53252/README.md create mode 100644 bsp/ht32/ht32f53252/SConscript create mode 100644 bsp/ht32/ht32f53252/SConstruct create mode 100644 bsp/ht32/ht32f53252/applications/SConscript create mode 100644 bsp/ht32/ht32f53252/applications/main.c create mode 100644 bsp/ht32/ht32f53252/applications/test.c create mode 100644 bsp/ht32/ht32f53252/board/Kconfig create mode 100644 bsp/ht32/ht32f53252/board/SConscript create mode 100644 bsp/ht32/ht32f53252/board/inc/board.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32_can_config.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32_msp.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_01_usbdconf.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_02_usbdconf.h create mode 100644 bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_conf.h create mode 100644 bsp/ht32/ht32f53252/board/linker_scripts/link.icf create mode 100644 bsp/ht32/ht32f53252/board/linker_scripts/link.lds create mode 100644 bsp/ht32/ht32f53252/board/linker_scripts/link.sct create mode 100644 bsp/ht32/ht32f53252/board/src/board.c create mode 100644 bsp/ht32/ht32f53252/board/src/ht32_msp.c create mode 100644 bsp/ht32/ht32f53252/figures/board.jpg create mode 100644 bsp/ht32/ht32f53252/project.uvoptx create mode 100644 bsp/ht32/ht32f53252/project.uvprojx create mode 100644 bsp/ht32/ht32f53252/rtconfig.h create mode 100644 bsp/ht32/ht32f53252/rtconfig.py create mode 100644 bsp/ht32/ht32f53252/template.uvoptx create mode 100644 bsp/ht32/ht32f53252/template.uvprojx create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57541.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57552.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59045.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61052.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61730.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61741.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62140.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200u.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52231.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52352.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_nw32f61242.s create mode 100644 bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_can_config0_calc.h create mode 100644 bsp/ht32/libraries/ht32_drivers/cpuport.h create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_can.c create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_can.h create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_sdio.c create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_sdio.h create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_usbd.c create mode 100644 bsp/ht32/libraries/ht32_drivers/drv_usbd.h create mode 100644 bsp/ht32/libraries/usbd_library/SConscript create mode 100644 bsp/ht32/libraries/usbd_library/checkout.py create mode 100644 bsp/ht32/libraries/usbd_library/inc/ht32_usbd_core.h create mode 100644 bsp/ht32/libraries/usbd_library/inc/ht32_usbd_int.h create mode 100644 bsp/ht32/libraries/usbd_library/inc/usb_port.h create mode 100644 bsp/ht32/libraries/usbd_library/inc/usbd_code.h create mode 100644 bsp/ht32/libraries/usbd_library/src/ht32_usbd_core.c create mode 100644 bsp/ht32/libraries/usbd_library/src/ht32_usbd_int.c create mode 100644 bsp/ht32/libraries/usbd_library/src/usb_port.c create mode 100644 bsp/ht32/libraries/usbd_library/src/usbd_code.c diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index fcd219d33b6..488583e39b6 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -101,6 +101,7 @@ jobs: - "rm48x50" - "ht32/ht32f52352" - "ht32/ht32f12366" + - "ht32/ht32f53252" - "w60x" - "essemi/es32f0654" - "essemi/es32f365x" diff --git a/bsp/ht32/ht32f12366/.config b/bsp/ht32/ht32f12366/.config index 80ce545f3d7..f0a158b0518 100644 --- a/bsp/ht32/ht32f12366/.config +++ b/bsp/ht32/ht32f12366/.config @@ -1,15 +1,117 @@ + # -# Automatically generated file; DO NOT EDIT. -# RT-Thread Configuration +# RT-Thread Kernel # # -# RT-Thread Kernel +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options # +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set -# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_AMP is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_CPUS_NR=1 @@ -19,26 +121,24 @@ 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_OVERFLOW_CHECK is not set CONFIG_RT_USING_HOOK=y CONFIG_RT_HOOK_USING_FUNC_PTR=y # CONFIG_RT_USING_HOOKLIST is not set CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 -CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_IDLE_THREAD_STACK_SIZE=512 # CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set # -# kservice optimization +# kservice options # -# 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_USING_DEBUG=y -CONFIG_RT_DEBUGING_COLOR=y -CONFIG_RT_DEBUGING_CONTEXT=y -# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# end of kservice options + +# CONFIG_RT_USING_DEBUG is not set +# CONFIG_RT_USING_CI_ACTION is not set # # Inter-Thread communication @@ -50,6 +150,7 @@ CONFIG_RT_USING_MAILBOX=y CONFIG_RT_USING_MESSAGEQUEUE=y # CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set # CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication # # Memory Management @@ -68,21 +169,21 @@ CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMTRACE is not set # CONFIG_RT_USING_HEAP_ISR is not set CONFIG_RT_USING_HEAP=y +# end of Memory Management + CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set # CONFIG_RT_USING_THREADSAFE_PRINTF is not set -# CONFIG_RT_USING_SCHED_THREAD_CTX is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart0" CONFIG_RT_VER_NUM=0x50200 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 -# CONFIG_RT_USING_CACHE is not set +# end of RT-Thread Kernel + CONFIG_RT_USING_HW_ATOMIC=y -# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set -# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y @@ -117,12 +218,15 @@ CONFIG_FINSH_USING_OPTION_COMPLETION=y # DFS: device virtual file system # # CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + # CONFIG_RT_USING_FAL is not set # # Device Drivers # # CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_UNAMED_PIPE_NUMBER=64 # CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set @@ -131,53 +235,40 @@ CONFIG_RT_USING_SERIAL_V1=y # CONFIG_RT_USING_SERIAL_V2 is not set CONFIG_RT_SERIAL_USING_DMA=y CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_CPUTIME is not set -CONFIG_RT_USING_I2C=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_SOFT_I2C is not set +# CONFIG_RT_USING_I2C is not set # CONFIG_RT_USING_PHY is not set -CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set # CONFIG_RT_USING_NULL is not set # CONFIG_RT_USING_ZERO is not set # CONFIG_RT_USING_RANDOM is not set # CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_RTC is not set # CONFIG_RT_USING_SDIO is not set -CONFIG_RT_USING_SPI=y -# CONFIG_RT_USING_SPI_BITOPS is not set -# CONFIG_RT_USING_QSPI is not set -# 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=y +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set # CONFIG_RT_USING_TOUCH is not set # CONFIG_RT_USING_LCD is not set # CONFIG_RT_USING_HWCRYPTO is not set -# CONFIG_RT_USING_PULSE_ENCODER is not set -# CONFIG_RT_USING_INPUT_CAPTURE is not set -# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set # CONFIG_RT_USING_VIRTIO is not set CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_KTIME is not set # CONFIG_RT_USING_HWTIMER is not set - -# -# 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 +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers # # C/C++ and POSIX layer @@ -195,6 +286,8 @@ CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer # # POSIX (Portable Operating System Interface) layer @@ -216,7 +309,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # Socket is in the 'Network' category # +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + # CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer # # Network @@ -225,12 +322,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_NETDEV is not set # CONFIG_RT_USING_LWIP is not set # CONFIG_RT_USING_AT is not set +# end of Network # # Memory protection # # CONFIG_RT_USING_MEM_PROTECTION is not set # CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection # # Utilities @@ -242,12 +341,25 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RESOURCE_ID is not set # CONFIG_RT_USING_ADT is not set # CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + # CONFIG_RT_USING_VBUS is not set +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + # # RT-Thread Utestcases # # CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases # # RT-Thread online packages @@ -256,7 +368,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # 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 @@ -279,27 +390,35 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Marvell WiFi # # CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi # # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + # CONFIG_PKG_USING_RW007 is not set # # CYW43012 WiFi # # CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi # # BL808 WiFi # # CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi # # CYW43439 WiFi # # CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set @@ -322,6 +441,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set # CONFIG_PKG_USING_JOYLINK is not set # CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + # CONFIG_PKG_USING_NIMBLE is not set # CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set @@ -365,6 +486,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set # CONFIG_PKG_USING_LHC_MODBUS is not set # CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things # # security packages @@ -375,6 +497,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_TINYCRYPT is not set # CONFIG_PKG_USING_TFM is not set # CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages # # language packages @@ -390,18 +513,22 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_JSMN is not set # CONFIG_PKG_USING_AGILE_JSMN is not set # CONFIG_PKG_USING_PARSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format # # XML: Extensible Markup Language # # CONFIG_PKG_USING_SIMPLE_XML is not set # CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + # CONFIG_PKG_USING_LUATOS_SOC is not set # CONFIG_PKG_USING_LUA is not set # CONFIG_PKG_USING_JERRYSCRIPT is not set # CONFIG_PKG_USING_MICROPYTHON is not set # CONFIG_PKG_USING_PIKASCRIPT is not set # CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages # # multimedia packages @@ -413,12 +540,15 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_LVGL is not set # CONFIG_PKG_USING_LV_MUSIC_DEMO is not set # CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library # # u8g2: a monochrome graphic library # # CONFIG_PKG_USING_U8G2_OFFICIAL is not set # CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -438,6 +568,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_GUIENGINE is not set # CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages # # tools packages @@ -487,6 +618,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_VOFA_PLUS is not set # CONFIG_PKG_USING_RT_TRACE is not set # CONFIG_PKG_USING_ZDEBUG is not set +# end of tools packages # # system packages @@ -498,6 +630,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT_MEMCPY_CM is not set # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set # CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +# end of enhanced kernel services + # CONFIG_PKG_USING_AUNITY is not set # @@ -506,6 +640,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QFPLIB_M0_FULL is not set # CONFIG_PKG_USING_QFPLIB_M0_TINY is not set # CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages # # CMSIS: ARM Cortex-M Microcontroller Software Interface Standard @@ -516,6 +651,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_CMSIS_NN is not set # CONFIG_PKG_USING_CMSIS_RTOS1 is not set # CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard # # Micrium: Micrium software products porting for RT-Thread @@ -526,6 +662,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_LITEOS_SDK is not set # CONFIG_PKG_USING_TZ_DATABASE is not set @@ -573,6 +711,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RTP is not set # CONFIG_PKG_USING_REB is not set # CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages # # peripheral libraries and drivers @@ -589,6 +728,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set # CONFIG_PKG_USING_STM32WB55_SDK is not set # CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers # # Infineon HAL Packages @@ -603,6 +743,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_INFINEON_CSDIDAC is not set # CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set # CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + # CONFIG_PKG_USING_BLUETRUM_SDK is not set # CONFIG_PKG_USING_EMBARC_BSP is not set # CONFIG_PKG_USING_ESP_IDF is not set @@ -612,9 +754,12 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_K210_SDK is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + # CONFIG_PKG_USING_NRF5X_SDK is not set # CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers # # sensors drivers @@ -684,6 +829,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers # # touch drivers @@ -698,6 +844,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_XPT2046_TOUCH is not set # CONFIG_PKG_USING_CST816X is not set # CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set @@ -771,6 +919,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_BT_MX01 is not set # CONFIG_PKG_USING_RGPOWER is not set # CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers # # AI packages @@ -785,6 +934,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set # CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages # # Signal Processing and Control Algorithm Packages @@ -795,6 +945,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_DIGITALCTRL is not set # CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages # # miscellaneous packages @@ -803,6 +954,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # project laboratory # +# end of project laboratory # # samples: kernel and components samples @@ -811,6 +963,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples # # entertainment: terminal games and other interesting software packages @@ -827,6 +980,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_COWSAY is not set # CONFIG_PKG_USING_MORSE is not set # CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + # CONFIG_PKG_USING_LIBCSV is not set # CONFIG_PKG_USING_OPTPARSE is not set # CONFIG_PKG_USING_FASTLZ is not set @@ -860,6 +1015,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_SOEM is not set # CONFIG_PKG_USING_QPARAM is not set # CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages # # Arduino libraries @@ -875,6 +1031,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set # CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set # CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos # # Sensors @@ -1015,6 +1172,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set # CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set # CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors # # Display @@ -1026,6 +1184,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set # CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display # # Timing @@ -1034,6 +1193,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set # CONFIG_PKG_USING_ARDUINO_TICKER is not set # CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing # # Data Processing @@ -1042,6 +1202,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set # CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set # CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing # # Data Storage @@ -1052,6 +1213,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication # # Device Control @@ -1063,12 +1225,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set # CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control # # Other # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other # # Signal IO @@ -1081,10 +1245,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO # # Uncategorized # +# end of Arduino libraries +# end of RT-Thread online packages + CONFIG_SOC_FAMILY_HT32=y CONFIG_SOC_SERIES_HT32F1=y @@ -1103,11 +1271,13 @@ CONFIG_CORTEX_M3=y # CONFIG_SOC_HT32F12345 is not set # CONFIG_SOC_HT32F12364 is not set CONFIG_SOC_HT32F12366=y +# end of Chip Configuration # # Onboard Peripheral Drivers # # CONFIG_BSP_USING_TEST is not set +# end of Onboard Peripheral Drivers # # On-chip Peripheral Drivers @@ -1123,7 +1293,11 @@ CONFIG_BSP_USING_USART0_NAME="usart0" # CONFIG_BSP_USING_I2C is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_USBD is not set +# end of On-chip Peripheral Drivers # # Board extended module Drivers # +# end of Hardware Drivers Config diff --git a/bsp/ht32/ht32f12366/README.md b/bsp/ht32/ht32f12366/README.md index 04de7527d74..4f07d115d21 100644 --- a/bsp/ht32/ht32f12366/README.md +++ b/bsp/ht32/ht32f12366/README.md @@ -41,8 +41,8 @@ ESK32-30105使用32位ARM® Cortex®-M3高性能、低功耗单片机HT32F12366 | UART | 支持 | UART0/1 | | SPI | 支持 | SPI0/1 | | I2C | 支持 | 硬件 I2C0/1 | -| ADC | 暂不支持 | | -| WDT | 暂不支持 | | +| ADC | 支持 | | +| WDT | 支持 | | ## 使用说明 diff --git a/bsp/ht32/ht32f12366/SConstruct b/bsp/ht32/ht32f12366/SConstruct index 5fcd0e3860a..218a226a5f0 100644 --- a/bsp/ht32/ht32f12366/SConstruct +++ b/bsp/ht32/ht32f12366/SConstruct @@ -53,6 +53,9 @@ rtconfig.BSP_LIBRARY_TYPE = ht32_library # include libraries objs.extend(SConscript(os.path.join(libraries_path_prefix, ht32_library, 'SConscript'))) +# include usb libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'usbd_library', 'SConscript'))) + # include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'ht32_drivers', 'SConscript'))) diff --git a/bsp/ht32/ht32f12366/applications/test.c b/bsp/ht32/ht32f12366/applications/test.c index 1146f0aec6c..50ab776ca1a 100644 --- a/bsp/ht32/ht32f12366/applications/test.c +++ b/bsp/ht32/ht32f12366/applications/test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -58,10 +58,18 @@ static struct rt_semaphore rx_sem; static rt_mutex_t task_mutex = RT_NULL; /* task mutex */ /* device handle */ +#ifdef BSP_USING_UART static rt_device_t serial; +#endif +#ifdef BSP_USING_WDT static rt_device_t wdt_dev; +#endif +#ifdef BSP_USING_I2C struct rt_i2c_bus_device *i2c_dev; +#endif +#ifdef BSP_USING_SPI static struct rt_spi_device *spi_dev; +#endif /* In-file function declarations */ static void sys_run_dir(void *parameter); @@ -90,6 +98,7 @@ int task_registration(void) INIT_BOARD_EXPORT(task_registration); /* System operation indicator */ +#ifdef BSP_USING_GPIO static void sys_run_dir(void *parameter) { rt_uint32_t e; @@ -301,7 +310,9 @@ static int gpio_input_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(gpio_input_task, gpio input task operation); +#endif /* uart test */ +#ifdef BSP_USING_UART static rt_err_t uart_iqr_handle(rt_device_t dev, rt_size_t size) { /* Serial port callback function */ @@ -396,7 +407,9 @@ static int uart_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(uart_task, uart device sample); +#endif /* hw/sw iic test */ +#ifdef BSP_USING_I2C static void i2c_thread(void *parameter) { uint8_t write_addr = 0x00; @@ -497,7 +510,9 @@ static int i2c_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(i2c_task, i2c device sample); +#endif /* spi test */ +#ifdef BSP_USING_SPI static void spi_thread(void *parameter) { rt_uint8_t w25x_read_id = 0x9F; @@ -584,7 +599,9 @@ static int spi_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(spi_task, spi device sample); +#endif /* adc test */ +#ifdef BSP_USING_ADC static void adc_test(void *parameter) { rt_uint32_t adc0_ch11_val,adc0_ch12_val; @@ -640,8 +657,9 @@ static int adc_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(adc_task, adc task operation); - +#endif /* wdt test */ +#ifdef BSP_USING_WDT static void wdt_test(void) { rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); @@ -712,5 +730,106 @@ static int wdt_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(wdt_task, wdt task operation); +#endif +/* usbd test */ +#ifdef BSP_USING_USBD +static void usbd_test(void *parameter) +{ + rt_device_t dev = RT_NULL; + char dev_name[] = "vcom"; + char buf[] = "usbd vcom test!\r\n"; + + dev = rt_device_find(dev_name); + + if (dev) + { + rt_device_open(dev, RT_DEVICE_FLAG_RDWR); + } + else + { + rt_kprintf("Device with name %s not found.\n",dev_name); + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + while (1) + { + rt_device_write(dev, 0, buf, rt_strlen(buf)); + rt_thread_mdelay(500); + } +} + +static int usbd_task(int argc, char *argv[]) +{ + rt_err_t ret = -RT_ERROR; + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Gpio input test tasks */ + rt_thread_t usbd_vcom_task = rt_thread_create("usbd_vcom_task", + usbd_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (usbd_vcom_task != RT_NULL) + { + rt_thread_startup(usbd_vcom_task); + rt_kprintf("The usbd vcom task is registered.\n"); + } + else + { + rt_kprintf("usbd vcom task registration failed.\n"); + } + ret = RT_EOK; + } + else if(rt_strcmp(argv[1],"stop") == 0) + { + ret = RT_EOK; + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s stop\n",__func__); + } + return ret; +} +MSH_CMD_EXPORT(usbd_task, usbd task operation); +#endif +#ifdef BSP_USING_SDIO +int mnt_init(void) +{ + rt_device_t dev = RT_NULL; + char dev_name[] = BSP_USING_SDIO_NAME; + rt_thread_mdelay(1000); + + dev = rt_device_find(dev_name); + if(dev) + { + if(dfs_mount("sd0","/","elm",0,0) == RT_EOK) + { + rt_kprintf("dfs mount success!\r\n"); + } + else + { + rt_kprintf("dfs mount failed!\r\n"); + rt_kprintf("Formatting the SD card!\r\n"); + dfs_mkfs("elm",dev_name); + if(dfs_mount("sd0","/","elm",0,0) == RT_EOK) + { + rt_kprintf("dfs mount success!\r\n"); + } + else + { + rt_kprintf("dfs mount failed!\r\n"); + rt_kprintf("Exit SD card mount!\r\n"); + } + } + } + return 0; +} +INIT_FS_EXPORT(mnt_init); +#endif /* BSP_USING_SDIO */ #endif /* BSP_USING_TEST */ diff --git a/bsp/ht32/ht32f12366/board/Kconfig b/bsp/ht32/ht32f12366/board/Kconfig index 0623d4e30ef..78fde329271 100644 --- a/bsp/ht32/ht32f12366/board/Kconfig +++ b/bsp/ht32/ht32f12366/board/Kconfig @@ -126,7 +126,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_UART bool "Enable UART" default n - select RT_USING_SERIAL + select RT_USING_SERIAL if BSP_USING_UART if BSP_USING_UART config BSP_USING_USART0 bool "Enable USART0" @@ -306,6 +306,141 @@ menu "On-chip Peripheral Drivers" depends on BSP_USING_WDT string "wdt device name" default "wdt" + + menuconfig BSP_USING_CAN + bool "Enable CAN" + depends on SOC_HT32F53241 || SOC_HT32F53242 || SOC_HT32F53252 + default n + select RT_USING_CAN if BSP_USING_CAN + config BSP_USING_CAN_NAME + depends on BSP_USING_CAN + string "can device name" + default "can" + if BSP_USING_CAN + config CAN_DEFAULT_BASE_CONFIGURATION + choice + prompt "Default CAN baud rate" + default BSP_USING_CAN500kBaud + config BSP_USING_CAN1MBaud + bool "CAN1MBaud" + config BSP_USING_CAN800kBaud + bool "CAN800kBaud" + config BSP_USING_CAN500kBaud + bool "CAN500kBaud" + config BSP_USING_CAN250kBaud + bool "CAN250kBaud" + config BSP_USING_CAN125kBaud + bool "CAN125kBaud" + config BSP_USING_CAN100kBaud + bool "CAN100kBaud" + config BSP_USING_CAN50kBaud + bool "CAN50kBaud" + config BSP_USING_CAN20kBaud + bool "CAN20kBaud" + config BSP_USING_CAN10kBaud + bool "CAN10kBaud" + endchoice + choice + prompt "Default CAN mode" + default BSP_USING_RT_CAN_MODE_NORMAL + config BSP_USING_RT_CAN_MODE_NORMAL + bool "RT_CAN_MODE_NORMAL" + config BSP_USING_RT_CAN_MODE_LISTEN + bool "RT_CAN_MODE_LISTEN" + config BSP_USING_RT_CAN_MODE_LOOPBACK + bool "RT_CAN_MODE_LOOPBACK" + config BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + bool "RT_CAN_MODE_LOOPBACKANLISTEN" + endchoice + + config BSP_USING_CAN_BAUD + int + default 1000000 if BSP_USING_CAN1MBaud + default 800000 if BSP_USING_CAN800kBaud + default 500000 if BSP_USING_CAN500kBaud + default 250000 if BSP_USING_CAN250kBaud + default 125000 if BSP_USING_CAN125kBaud + default 100000 if BSP_USING_CAN100kBaud + default 50000 if BSP_USING_CAN50kBaud + default 20000 if BSP_USING_CAN20kBaud + default 10000 if BSP_USING_CAN10kBaud + + config BSP_USING_CAN_MODE + int + default 0 if BSP_USING_RT_CAN_MODE_NORMAL + default 1 if BSP_USING_RT_CAN_MODE_LISTEN + default 2 if BSP_USING_RT_CAN_MODE_LOOPBACK + default 3 if BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + + config CAN_DEFAULT_FILTER_TABLE_CONFIGURATION + choice + prompt "Default filter id mode" + default BSP_USING_CAN_STD_ID + config BSP_USING_CAN_STD_ID + bool "CAN_STD_ID" + config BSP_USING_CAN_EXT_ID + bool "CAN_EXT_ID" + endchoice + + choice + prompt "Default filter frame mode" + default BSP_USING_CAN_DATA_FRAME + config BSP_USING_CAN_DATA_FRAME + bool "CAN_DATA_FRAME" + config BSP_USING_CAN_REMOTE_FRAME + bool "CAN_REMOTE_FRAME" + endchoice + + config BSP_USING_CAN_ID_MODE + int + default 0 if BSP_USING_CAN_STD_ID + default 1 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_FRAME_MODE + int + default 0 if BSP_USING_CAN_REMOTE_FRAME + default 1 if BSP_USING_CAN_DATA_FRAME + + config BSP_USING_CAN_MSG_NUM + int "Default filter table number" + range 0 31 + default 0 + + config BSP_USING_CAN_ID + hex "Default filter arbitration bit(ID)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x541 if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x541 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_MASK + hex "Default filter mask bit(MASK)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x7FF if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + + endif + + menuconfig BSP_USING_SDIO + bool "Enable SDIO" + depends on SOC_HT32F12345 || SOC_HT32F12365 || SOC_HT32F12366 + default n + select RT_USING_SDIO if BSP_USING_SDIO + select RT_USING_DFS if BSP_USING_SDIO + config BSP_USING_SDIO_NAME + depends on BSP_USING_SDIO + string "sdio device name" + default "sd0" + + menuconfig BSP_USING_USBD + bool "Enable USB BUS" + default n + select RT_USING_USB_DEVICE if BSP_USING_USBD + config BSP_USING_USBD_NAME + depends on BSP_USING_USBD + string "usbd device name" + default "usbd" endmenu menu "Board extended module Drivers" diff --git a/bsp/ht32/ht32f12366/board/inc/board.h b/bsp/ht32/ht32f12366/board/inc/board.h index c4a817d79bb..91b93e424ed 100644 --- a/bsp/ht32/ht32f12366/board/inc/board.h +++ b/bsp/ht32/ht32f12366/board/inc/board.h @@ -23,6 +23,10 @@ #include "drv_spi.h" #endif +#ifdef BSP_USING_SDIO +#include "dfs_fs.h" +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/bsp/ht32/ht32f12366/board/inc/ht32_msp.h b/bsp/ht32/ht32f12366/board/inc/ht32_msp.h index 3b6a4624e4e..ba940614271 100644 --- a/bsp/ht32/ht32f12366/board/inc/ht32_msp.h +++ b/bsp/ht32/ht32f12366/board/inc/ht32_msp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -100,7 +100,7 @@ extern "C" { #define HTCFG_UART1_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART1_RX_GPION) #endif -#endif +#endif /* BSP_USING_UART */ /* SPI gpio */ #ifdef BSP_USING_SPI @@ -156,7 +156,7 @@ extern "C" { #define HTCFG_SPI1_MOSI_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI1_MOSI_GPION) #endif -#endif +#endif /* BSP_USING_SPI */ /* I2C gpio */ #ifdef BSP_USING_I2C_HW @@ -198,7 +198,8 @@ extern "C" { #define HTCFG_I2C1_SDA_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C1_SDA_GPION) #endif -#endif +#endif /* BSP_USING_I2C_HW */ + /* ADC gpio */ #ifdef BSP_USING_ADC #ifdef BSP_USING_ADC0 @@ -335,12 +336,66 @@ extern "C" { #define HTCFG_ADC1CH7_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH7_AFION) #endif -#endif +#endif /* BSP_USING_ADC */ + +/* SDIO gpio */ +#ifdef BSP_USING_SDIO + #define HTCFG_SDIO_IPN SDIO + + #define _HTCFG_SDIO_CLK_GPIOX A + #define _HTCFG_SDIO_CLK_GPION 5 + + #define _HTCFG_SDIO_CMD_GPIOX A + #define _HTCFG_SDIO_CMD_GPION 4 + + #define _HTCFG_SDIO_DAT0_GPIOX C + #define _HTCFG_SDIO_DAT0_GPION 9 + + #define _HTCFG_SDIO_DAT1_GPIOX C + #define _HTCFG_SDIO_DAT1_GPION 10 + + #define _HTCFG_SDIO_DAT2_GPIOX C + #define _HTCFG_SDIO_DAT2_GPION 11 + + #define _HTCFG_SDIO_DAT3_GPIOX C + #define _HTCFG_SDIO_DAT3_GPION 12 + + #define HTCFG_SDIO_CLK_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_CLK_GPIOX) + #define HTCFG_SDIO_CLK_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_CLK_GPIOX) + #define HTCFG_SDIO_CLK_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_CLK_GPIOX) + #define HTCFG_SDIO_CLK_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_CLK_GPION) + + #define HTCFG_SDIO_CMD_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_CMD_GPIOX) + #define HTCFG_SDIO_CMD_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_CMD_GPIOX) + #define HTCFG_SDIO_CMD_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_CMD_GPIOX) + #define HTCFG_SDIO_CMD_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_CMD_GPION) + + #define HTCFG_SDIO_DAT0_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_DAT0_GPIOX) + #define HTCFG_SDIO_DAT0_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_DAT0_GPIOX) + #define HTCFG_SDIO_DAT0_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_DAT0_GPIOX) + #define HTCFG_SDIO_DAT0_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_DAT0_GPION) + + #define HTCFG_SDIO_DAT1_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_DAT1_GPIOX) + #define HTCFG_SDIO_DAT1_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_DAT1_GPIOX) + #define HTCFG_SDIO_DAT1_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_DAT1_GPIOX) + #define HTCFG_SDIO_DAT1_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_DAT1_GPION) + + #define HTCFG_SDIO_DAT2_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_DAT2_GPIOX) + #define HTCFG_SDIO_DAT2_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_DAT2_GPIOX) + #define HTCFG_SDIO_DAT2_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_DAT2_GPIOX) + #define HTCFG_SDIO_DAT2_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_DAT2_GPION) + + #define HTCFG_SDIO_DAT3_GPIO_CLK STRCAT2(P, _HTCFG_SDIO_DAT3_GPIOX) + #define HTCFG_SDIO_DAT3_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SDIO_DAT3_GPIOX) + #define HTCFG_SDIO_DAT3_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_SDIO_DAT3_GPIOX) + #define HTCFG_SDIO_DAT3_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SDIO_DAT3_GPION) +#endif /* BSP_USING_SDIO */ void ht32_usart_gpio_init(void *instance); void ht32_spi_gpio_init(void *instance); void ht32_hardware_i2c_gpio_init(void *instance); void ht32_adc_gpio_init(void *instance,int8_t channel); +void ht32_sdio_gpio_init(void *instance); #ifdef __cplusplus } diff --git a/bsp/ht32/ht32f12366/board/inc/ht32f1xxxx_01_usbdconf.h b/bsp/ht32/ht32f12366/board/inc/ht32f1xxxx_01_usbdconf.h index 432b323d7a4..e617b95e8a7 100644 --- a/bsp/ht32/ht32f12366/board/inc/ht32f1xxxx_01_usbdconf.h +++ b/bsp/ht32/ht32f12366/board/inc/ht32f1xxxx_01_usbdconf.h @@ -58,7 +58,7 @@ // Endpoint5 Interrupt Enable (EP5IE) // Endpoint6 Interrupt Enable (EP6IE) // Endpoint7 Interrupt Enable (EP7IE) -#define _UIER (0x011D) +#define _UIER (0xFF1D) // @@ -96,7 +96,7 @@ /* Endpoint1 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint1 Configuration -#define _EP1_ENABLE (0) +#define _EP1_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -114,7 +114,7 @@ // Endpoint Transfer Type // <2=> Bulk // <3=> Interrupt -#define _EP1_TYPR (3) +#define _EP1_TYPR (2) // Endpoint Direction (EPDIR) // <1=> IN @@ -123,7 +123,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP1LEN_TMP (8) +#define _EP1LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -135,7 +135,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP1_IER (0x10) +#define _EP1_IER (0x12) // // @@ -144,7 +144,7 @@ /* Endpoint2 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint2 Configuration -#define _EP2_ENABLE (0) +#define _EP2_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -162,7 +162,7 @@ // Endpoint Transfer Type // <2=> Bulk // <3=> Interrupt -#define _EP2_TYPR (3) +#define _EP2_TYPR (2) // Endpoint Direction (EPDIR) // <1=> IN @@ -171,7 +171,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP2LEN_TMP (8) +#define _EP2LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -183,7 +183,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP2_IER (0x002) +#define _EP2_IER (0x012) // // @@ -191,7 +191,7 @@ /* Endpoint3 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint3 Configuration -#define _EP3_ENABLE (0) +#define _EP3_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -218,7 +218,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP3LEN_TMP (8) +#define _EP3LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -230,7 +230,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP3_IER (0x10) +#define _EP3_IER (0x12) // // @@ -238,7 +238,7 @@ /* Endpoint4 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint4 Configuration -#define _EP4_ENABLE (0) +#define _EP4_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -266,7 +266,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP4LEN_TMP (8) +#define _EP4LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -283,7 +283,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP4_IER (0x02) +#define _EP4_IER (0x12) // // @@ -292,7 +292,7 @@ /* Endpoint5 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint5 Configuration -#define _EP5_ENABLE (0) +#define _EP5_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -311,7 +311,7 @@ // <1=> Isochronous // <2=> Bulk // <3=> Interrupt -#define _EP5_TYPR (3) +#define _EP5_TYPR (1) // Endpoint Direction (EPDIR) // <1=> IN @@ -320,7 +320,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP5LEN_TMP (8) +#define _EP5LEN_TMP (64) // Single/Double Buffer Selection (SDBS) @@ -338,7 +338,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP5_IER (0x10) +#define _EP5_IER (0x12) // // @@ -347,7 +347,7 @@ /* Endpoint6 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint6 Configuration -#define _EP6_ENABLE (0) +#define _EP6_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -366,7 +366,7 @@ // <1=> Isochronous // <2=> Bulk // <3=> Interrupt -#define _EP6_TYPR (3) +#define _EP6_TYPR (1) // Endpoint Direction (EPDIR) // <1=> IN @@ -375,7 +375,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP6LEN_TMP (8) +#define _EP6LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -392,7 +392,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP6_IER (0x02) +#define _EP6_IER (0x12) // // @@ -401,7 +401,7 @@ /* Endpoint7 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint7 Configuration -#define _EP7_ENABLE (0) +#define _EP7_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -429,7 +429,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP7LEN_TMP (8) +#define _EP7LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -446,7 +446,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP7_IER (0x10) +#define _EP7_IER (0x12) // // diff --git a/bsp/ht32/ht32f12366/board/src/ht32_msp.c b/bsp/ht32/ht32f12366/board/src/ht32_msp.c index d8d055ef4ea..0208647be3e 100644 --- a/bsp/ht32/ht32f12366/board/src/ht32_msp.c +++ b/bsp/ht32/ht32f12366/board/src/ht32_msp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -69,7 +69,7 @@ void ht32_usart_gpio_init(void *instance) } #endif } -#endif +#endif /* BSP_USING_UART */ /* GPIO configuration for SPI */ #ifdef BSP_USING_SPI @@ -104,7 +104,7 @@ void ht32_spi_gpio_init(void *instance) } #endif } -#endif +#endif /* BSP_USING_SPI */ /* GPIO configuration for I2C */ #ifdef BSP_USING_I2C_HW @@ -135,7 +135,7 @@ void ht32_hardware_i2c_gpio_init(void *instance) } #endif } -#endif +#endif /* BSP_USING_I2C_HW */ /* GPIO configuration for ADC */ #ifdef BSP_USING_ADC void ht32_adc_gpio_init(void *instance,int8_t channel) @@ -247,4 +247,42 @@ void ht32_adc_gpio_init(void *instance,int8_t channel) } #endif } -#endif +#endif /* BSP_USING_ADC */ + +/* GPIO configuration for SDIO */ +#ifdef BSP_USING_SDIO +void ht32_sdio_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; + HT_SDIO_TypeDef *sdio_x = (HT_SDIO_TypeDef *)instance; + if(HT_SDIO == sdio_x) + { + CKCUClock.Bit.HTCFG_SDIO_CLK_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_CMD_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_DAT0_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_DAT1_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_DAT2_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SDIO_DAT3_GPIO_CLK = 1; + CKCUClock.Bit.SDIO = 1; + CKCUClock.Bit.PDMA = 1; + CKCUClock.Bit.AFIO = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + /* Configure SDIO pins */ + AFIO_GPxConfig(HTCFG_SDIO_CLK_GPIO_ID, HTCFG_SDIO_CLK_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_CMD_GPIO_ID, HTCFG_SDIO_CMD_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_DAT0_GPIO_ID, HTCFG_SDIO_DAT0_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_DAT1_GPIO_ID, HTCFG_SDIO_DAT1_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_DAT2_GPIO_ID, HTCFG_SDIO_DAT2_GPIO_PIN, AFIO_FUN_SDIO); + AFIO_GPxConfig(HTCFG_SDIO_DAT3_GPIO_ID, HTCFG_SDIO_DAT3_GPIO_PIN, AFIO_FUN_SDIO); + /* 配置SDIO引脚驱动能力 */ + GPIO_DriveConfig(HTCFG_SDIO_CLK_GPIO_PORT, HTCFG_SDIO_CLK_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_CMD_GPIO_PORT, HTCFG_SDIO_CMD_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_DAT0_GPIO_PORT, HTCFG_SDIO_DAT0_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_DAT1_GPIO_PORT, HTCFG_SDIO_DAT1_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_DAT2_GPIO_PORT, HTCFG_SDIO_DAT2_GPIO_PIN, GPIO_DV_8MA); + GPIO_DriveConfig(HTCFG_SDIO_DAT3_GPIO_PORT, HTCFG_SDIO_DAT3_GPIO_PIN, GPIO_DV_8MA); + + } +} +#endif /* BSP_USING_SDIO */ diff --git a/bsp/ht32/ht32f12366/project.uvoptx b/bsp/ht32/ht32f12366/project.uvoptx index 5e3bbba332f..06f3300cfb8 100644 --- a/bsp/ht32/ht32f12366/project.uvoptx +++ b/bsp/ht32/ht32f12366/project.uvoptx @@ -73,7 +73,7 @@ 0 - 1 + 0 0 1 @@ -186,18 +186,6 @@ 0 0 - - 1 - 2 - 1 - 0 - 0 - 0 - applications\test.c - test.c - 0 - 0 - @@ -208,7 +196,7 @@ 0 2 - 3 + 2 1 0 0 @@ -220,7 +208,7 @@ 2 - 4 + 3 1 0 0 @@ -232,7 +220,7 @@ 2 - 5 + 4 1 0 0 @@ -244,7 +232,7 @@ 2 - 6 + 5 1 0 0 @@ -256,7 +244,7 @@ 2 - 7 + 6 1 0 0 @@ -268,7 +256,7 @@ 2 - 8 + 7 1 0 0 @@ -280,7 +268,7 @@ 2 - 9 + 8 1 0 0 @@ -292,7 +280,7 @@ 2 - 10 + 9 1 0 0 @@ -312,7 +300,7 @@ 0 3 - 11 + 10 1 0 0 @@ -324,55 +312,31 @@ 3 - 12 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - i2c-bit-ops.c - 0 - 0 - - - 3 - 13 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\i2c\i2c_core.c - i2c_core.c - 0 - 0 - - - 3 - 14 + 11 1 0 0 0 - ..\..\..\components\drivers\i2c\i2c_dev.c - i2c_dev.c + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c 0 0 3 - 15 + 12 1 0 0 0 - ..\..\..\components\drivers\ipc\completion.c - completion.c + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c 0 0 3 - 16 + 13 1 0 0 @@ -384,7 +348,7 @@ 3 - 17 + 14 1 0 0 @@ -396,7 +360,7 @@ 3 - 18 + 15 1 0 0 @@ -408,7 +372,7 @@ 3 - 19 + 16 1 0 0 @@ -420,7 +384,7 @@ 3 - 20 + 17 1 0 0 @@ -432,7 +396,7 @@ 3 - 21 + 18 1 0 0 @@ -444,7 +408,7 @@ 3 - 22 + 19 1 0 0 @@ -456,73 +420,25 @@ 3 - 23 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\misc\adc.c - adc.c - 0 - 0 - - - 3 - 24 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\pin\pin.c - pin.c - 0 - 0 - - - 3 - 25 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\serial\serial.c - serial.c - 0 - 0 - - - 3 - 26 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\spi\spi_core.c - spi_core.c - 0 - 0 - - - 3 - 27 + 20 1 0 0 0 - ..\..\..\components\drivers\spi\spi_dev.c - spi_dev.c + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c 0 0 3 - 28 + 21 1 0 0 0 - ..\..\..\components\drivers\watchdog\watchdog.c - watchdog.c + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c 0 0 @@ -536,7 +452,7 @@ 0 4 - 29 + 22 1 0 0 @@ -548,7 +464,7 @@ 4 - 30 + 23 1 0 0 @@ -560,7 +476,7 @@ 4 - 31 + 24 2 0 0 @@ -572,7 +488,7 @@ 4 - 32 + 25 1 0 0 @@ -584,7 +500,7 @@ 4 - 33 + 26 1 0 0 @@ -596,7 +512,7 @@ 4 - 34 + 27 1 0 0 @@ -616,31 +532,31 @@ 0 5 - 35 + 28 1 0 0 0 - ..\..\..\components\finsh\shell.c - shell.c + ..\..\..\components\finsh\cmd.c + cmd.c 0 0 5 - 36 + 29 1 0 0 0 - ..\..\..\components\finsh\msh.c - msh.c + ..\..\..\components\finsh\shell.c + shell.c 0 0 5 - 37 + 30 1 0 0 @@ -652,13 +568,13 @@ 5 - 38 + 31 1 0 0 0 - ..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\components\finsh\msh.c + msh.c 0 0 @@ -672,7 +588,7 @@ 0 6 - 39 + 32 1 0 0 @@ -684,7 +600,7 @@ 6 - 40 + 33 1 0 0 @@ -696,67 +612,67 @@ 6 - 41 + 34 1 0 0 0 - ..\..\..\src\idle.c - idle.c + ..\..\..\src\cpu_up.c + cpu_up.c 0 0 6 - 42 + 35 1 0 0 0 - ..\..\..\src\ipc.c - ipc.c + ..\..\..\src\defunct.c + defunct.c 0 0 6 - 43 + 36 1 0 0 0 - ..\..\..\src\irq.c - irq.c + ..\..\..\src\idle.c + idle.c 0 0 6 - 44 + 37 1 0 0 0 - ..\..\..\src\klibc\kstdio.c - kstdio.c + ..\..\..\src\ipc.c + ipc.c 0 0 6 - 45 + 38 1 0 0 0 - ..\..\..\src\klibc\kstring.c - kstring.c + ..\..\..\src\irq.c + irq.c 0 0 6 - 46 + 39 1 0 0 @@ -768,7 +684,7 @@ 6 - 47 + 40 1 0 0 @@ -780,7 +696,7 @@ 6 - 48 + 41 1 0 0 @@ -792,7 +708,7 @@ 6 - 49 + 42 1 0 0 @@ -804,7 +720,7 @@ 6 - 50 + 43 1 0 0 @@ -816,7 +732,7 @@ 6 - 51 + 44 1 0 0 @@ -828,7 +744,7 @@ 6 - 52 + 45 1 0 0 @@ -840,7 +756,7 @@ 6 - 53 + 46 1 0 0 @@ -852,7 +768,7 @@ 6 - 54 + 47 1 0 0 @@ -865,14 +781,82 @@ - libcpu + klibc 0 0 0 0 7 - 55 + 48 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 53 1 0 0 @@ -883,8 +867,8 @@ 0 - 7 - 56 + 8 + 54 1 0 0 @@ -895,8 +879,8 @@ 0 - 7 - 57 + 8 + 55 1 0 0 @@ -907,8 +891,8 @@ 0 - 7 - 58 + 8 + 56 2 0 0 @@ -919,8 +903,8 @@ 0 - 7 - 59 + 8 + 57 1 0 0 @@ -939,43 +923,67 @@ 0 0 - 8 + 9 + 58 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2s.c + ht32f1xxxx_i2s.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_mctm.c + ht32f1xxxx_mctm.c + 0 + 0 + + + 9 60 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_wdt.c - ht32f1xxxx_wdt.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_bftm.c + ht32f1xxxx_bftm.c 0 0 - 8 + 9 61 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sci.c - ht32f1xxxx_sci.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_flash.c + ht32f1xxxx_flash.c 0 0 - 8 + 9 62 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rstcu.c - ht32f1xxxx_rstcu.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_tm.c + ht32f1xxxx_tm.c 0 0 - 8 + 9 63 1 0 @@ -987,278 +995,254 @@ 0 - 8 + 9 64 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_tm.c - ht32f1xxxx_tm.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ebi.c + ht32f1xxxx_ebi.c 0 0 - 8 + 9 65 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ckcu.c - ht32f1xxxx_ckcu.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_exti.c + ht32f1xxxx_exti.c 0 0 - 8 + 9 66 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usart.c - ht32f1xxxx_usart.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_crc.c + ht32f1xxxx_crc.c 0 0 - 8 + 9 67 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_aes.c - ht32f1xxxx_aes.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rtc.c + ht32f1xxxx_rtc.c 0 0 - 8 + 9 68 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_flash.c - ht32f1xxxx_flash.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rstcu.c + ht32f1xxxx_rstcu.c 0 0 - 8 + 9 69 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_gpio.c - ht32f1xxxx_gpio.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_aes.c + ht32f1xxxx_aes.c 0 0 - 8 + 9 70 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32_cm3_misc.c - ht32_cm3_misc.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Source\system_ht32f1xxxx_02.c + system_ht32f1xxxx_02.c 0 0 - 8 + 9 71 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_crc.c - ht32f1xxxx_crc.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_cmp.c + ht32f1xxxx_cmp.c 0 0 - 8 + 9 72 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sdio.c - ht32f1xxxx_sdio.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32_cm3_misc.c + ht32_cm3_misc.c 0 0 - 8 + 9 73 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ebi.c - ht32f1xxxx_ebi.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sci.c + ht32f1xxxx_sci.c 0 0 - 8 + 9 74 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_cmp.c - ht32f1xxxx_cmp.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pwrcu.c + ht32f1xxxx_pwrcu.c 0 0 - 8 + 9 75 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f2xxxx_csif.c - ht32f2xxxx_csif.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_spi.c + ht32f1xxxx_spi.c 0 0 - 8 + 9 76 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2c.c - ht32f1xxxx_i2c.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_adc.c + ht32f1xxxx_adc.c 0 0 - 8 + 9 77 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_adc.c - ht32f1xxxx_adc.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sdio.c + ht32f1xxxx_sdio.c 0 0 - 8 + 9 78 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pwrcu.c - ht32f1xxxx_pwrcu.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usart.c + ht32f1xxxx_usart.c 0 0 - 8 + 9 79 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pdma.c - ht32f1xxxx_pdma.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ckcu.c + ht32f1xxxx_ckcu.c 0 0 - 8 + 9 80 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Source\system_ht32f1xxxx_02.c - system_ht32f1xxxx_02.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_gpio.c + ht32f1xxxx_gpio.c 0 0 - 8 + 9 81 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_mctm.c - ht32f1xxxx_mctm.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pdma.c + ht32f1xxxx_pdma.c 0 0 - 8 + 9 82 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_spi.c - ht32f1xxxx_spi.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f2xxxx_csif.c + ht32f2xxxx_csif.c 0 0 - 8 + 9 83 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_bftm.c - ht32f1xxxx_bftm.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_wdt.c + ht32f1xxxx_wdt.c 0 0 - 8 + 9 84 1 0 0 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2s.c - ht32f1xxxx_i2s.c - 0 - 0 - - - 8 - 85 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_exti.c - ht32f1xxxx_exti.c - 0 - 0 - - - 8 - 86 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rtc.c - ht32f1xxxx_rtc.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2c.c + ht32f1xxxx_i2c.c 0 0 diff --git a/bsp/ht32/ht32f12366/project.uvprojx b/bsp/ht32/ht32f12366/project.uvprojx index 0bf964bce3b..578dcd6fca4 100644 --- a/bsp/ht32/ht32f12366/project.uvprojx +++ b/bsp/ht32/ht32f12366/project.uvprojx @@ -15,8 +15,8 @@ HT32F12366 Holtek - Holtek.HT32_DFP.1.0.19 - http://mcu.holtek.com.tw/pack + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack IRAM(0x20000000,0x20000) IROM(0x00000000,0x3FC00) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -332,10 +332,10 @@ 0 0 - - __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, RT_USING_LIBC, USE_HT32F12366_SK, USE_HT32F12365_66, USE_MEM_HT32F12366, __CLK_TCK=RT_TICK_PER_SECOND, USE_HT32_DRIVER, __RTTHREAD__ + --gnu + __CLK_TCK=RT_TICK_PER_SECOND, USE_HT32_DRIVER, USE_HT32F12366_SK, USE_HT32F12365_66, USE_MEM_HT32F12366, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_LIBC, RT_USING_ARMLIBC - ..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\include;..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\inc;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include;..\libraries\ht32_drivers;board\inc;..\..\..\libcpu\arm\common;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;applications;..\libraries\HT32_STD_1xxxx_FWLib\library\CMSIS\Include;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\drivers\include;.;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\poll;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\include;..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Include;..\..\..\components\finsh;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\libcpu\arm\cortex-m3 + ..\..\..\libcpu\arm\common;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\posix\io\eventfd;board\inc;..\..\..\libcpu\arm\cortex-m3;..\..\..\components\finsh;..\..\..\components\libc\posix\ipc;..\libraries\usbd_library\inc;..\libraries\ht32_drivers;applications;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\poll;..\..\..\include;..\..\..\components\drivers\smp_call;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\inc;.;..\libraries\HT32_STD_1xxxx_FWLib\library\CMSIS\Include;..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Include;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\phy;..\..\..\components\drivers\include @@ -384,11 +384,6 @@ 1 applications\main.c - - test.c - 1 - applications\test.c - @@ -495,119 +490,9 @@ - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - i2c_dev.c + completion_comm.c 1 - ..\..\..\components\drivers\i2c\i2c_dev.c + ..\..\..\components\drivers\ipc\completion_comm.c 2 @@ -660,9 +545,9 @@ - completion.c + completion_up.c 1 - ..\..\..\components\drivers\ipc\completion.c + ..\..\..\components\drivers\ipc\completion_up.c 2 @@ -1100,9 +985,9 @@ - adc.c + dev_pin.c 1 - ..\..\..\components\drivers\misc\adc.c + ..\..\..\components\drivers\pin\dev_pin.c 2 @@ -1155,229 +1040,9 @@ - pin.c + dev_serial.c 1 - ..\..\..\components\drivers\pin\pin.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c + ..\..\..\components\drivers\serial\dev_serial.c 2 @@ -1470,14 +1135,14 @@ Finsh - shell.c + cmd.c 1 - ..\..\..\components\finsh\shell.c + ..\..\..\components\finsh\cmd.c - msh.c + shell.c 1 - ..\..\..\components\finsh\msh.c + ..\..\..\components\finsh\shell.c msh_parse.c @@ -1485,9 +1150,9 @@ ..\..\..\components\finsh\msh_parse.c - cmd.c + msh.c 1 - ..\..\..\components\finsh\cmd.c + ..\..\..\components\finsh\msh.c @@ -1605,9 +1270,9 @@ - idle.c + cpu_up.c 1 - ..\..\..\src\idle.c + ..\..\..\src\cpu_up.c 2 @@ -1660,9 +1325,9 @@ - ipc.c + defunct.c 1 - ..\..\..\src\ipc.c + ..\..\..\src\defunct.c 2 @@ -1715,9 +1380,9 @@ - irq.c + idle.c 1 - ..\..\..\src\irq.c + ..\..\..\src\idle.c 2 @@ -1770,9 +1435,9 @@ - kstdio.c + ipc.c 1 - ..\..\..\src\klibc\kstdio.c + ..\..\..\src\ipc.c 2 @@ -1825,9 +1490,9 @@ - kstring.c + irq.c 1 - ..\..\..\src\klibc\kstring.c + ..\..\..\src\irq.c 2 @@ -2376,6 +2041,36 @@ + + klibc + + + kstdio.c + 1 + ..\..\..\src\klibc\kstdio.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kstring.c + 1 + ..\..\..\src\klibc\kstring.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + libcpu @@ -2410,24 +2105,24 @@ Libraries - ht32f1xxxx_wdt.c + ht32f1xxxx_i2s.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_wdt.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2s.c - ht32f1xxxx_sci.c + ht32f1xxxx_mctm.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sci.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_mctm.c - ht32f1xxxx_rstcu.c + ht32f1xxxx_bftm.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rstcu.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_bftm.c - ht32f1xxxx_usbd.c + ht32f1xxxx_flash.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usbd.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_flash.c ht32f1xxxx_tm.c @@ -2435,114 +2130,114 @@ ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_tm.c - ht32f1xxxx_ckcu.c + ht32f1xxxx_usbd.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ckcu.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usbd.c - ht32f1xxxx_usart.c + ht32f1xxxx_ebi.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usart.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ebi.c - ht32f1xxxx_aes.c + ht32f1xxxx_exti.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_aes.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_exti.c - ht32f1xxxx_flash.c + ht32f1xxxx_crc.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_flash.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_crc.c - ht32f1xxxx_gpio.c + ht32f1xxxx_rtc.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_gpio.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rtc.c - ht32_cm3_misc.c + ht32f1xxxx_rstcu.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32_cm3_misc.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rstcu.c - ht32f1xxxx_crc.c + ht32f1xxxx_aes.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_crc.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_aes.c - ht32f1xxxx_sdio.c + system_ht32f1xxxx_02.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sdio.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Source\system_ht32f1xxxx_02.c - ht32f1xxxx_ebi.c + ht32f1xxxx_cmp.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ebi.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_cmp.c - ht32f1xxxx_cmp.c + ht32_cm3_misc.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_cmp.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32_cm3_misc.c - ht32f2xxxx_csif.c + ht32f1xxxx_sci.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f2xxxx_csif.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sci.c - ht32f1xxxx_i2c.c + ht32f1xxxx_pwrcu.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2c.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pwrcu.c - ht32f1xxxx_adc.c + ht32f1xxxx_spi.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_adc.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_spi.c - ht32f1xxxx_pwrcu.c + ht32f1xxxx_adc.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pwrcu.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_adc.c - ht32f1xxxx_pdma.c + ht32f1xxxx_sdio.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pdma.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_sdio.c - system_ht32f1xxxx_02.c + ht32f1xxxx_usart.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\Device\Holtek\HT32F1xxxx\Source\system_ht32f1xxxx_02.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_usart.c - ht32f1xxxx_mctm.c + ht32f1xxxx_ckcu.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_mctm.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_ckcu.c - ht32f1xxxx_spi.c + ht32f1xxxx_gpio.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_spi.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_gpio.c - ht32f1xxxx_bftm.c + ht32f1xxxx_pdma.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_bftm.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_pdma.c - ht32f1xxxx_i2s.c + ht32f2xxxx_csif.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2s.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f2xxxx_csif.c - ht32f1xxxx_exti.c + ht32f1xxxx_wdt.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_exti.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_wdt.c - ht32f1xxxx_rtc.c + ht32f1xxxx_i2c.c 1 - ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_rtc.c + ..\libraries\HT32_STD_1xxxx_FWLib\library\HT32F1xxxx_Driver\src\ht32f1xxxx_i2c.c diff --git a/bsp/ht32/ht32f12366/rtconfig.h b/bsp/ht32/ht32f12366/rtconfig.h index 39d7f03646c..fa25b0a78e5 100644 --- a/bsp/ht32/ht32f12366/rtconfig.h +++ b/bsp/ht32/ht32f12366/rtconfig.h @@ -1,29 +1,81 @@ #ifndef RT_CONFIG_H__ #define RT_CONFIG_H__ -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - /* RT-Thread Kernel */ +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ #define RT_NAME_MAX 8 #define RT_CPUS_NR 1 #define RT_ALIGN_SIZE 4 #define RT_THREAD_PRIORITY_32 #define RT_THREAD_PRIORITY_MAX 32 #define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK #define RT_HOOK_USING_FUNC_PTR #define RT_USING_IDLE_HOOK #define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 256 +#define IDLE_THREAD_STACK_SIZE 512 -/* kservice optimization */ +/* kservice options */ -#define RT_USING_DEBUG -#define RT_DEBUGING_COLOR -#define RT_DEBUGING_CONTEXT +/* end of kservice options */ /* Inter-Thread communication */ @@ -32,6 +84,7 @@ #define RT_USING_EVENT #define RT_USING_MAILBOX #define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ /* Memory Management */ @@ -41,12 +94,14 @@ #define RT_MEMHEAP_FAST_MODE #define RT_USING_SMALL_MEM_AS_HEAP #define RT_USING_HEAP +/* end of Memory Management */ #define RT_USING_DEVICE #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart0" #define RT_VER_NUM 0x50200 #define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC #define RT_USING_CPU_FFS #define ARCH_ARM @@ -76,6 +131,7 @@ /* DFS: device virtual file system */ +/* end of DFS: device virtual file system */ /* Device Drivers */ @@ -85,15 +141,8 @@ #define RT_USING_SERIAL_V1 #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_ADC -#define RT_USING_SPI -#define RT_USING_WDT #define RT_USING_PIN - -/* Using USB */ - +/* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -105,6 +154,8 @@ #define RT_LIBC_TZ_DEFAULT_HOUR 8 #define RT_LIBC_TZ_DEFAULT_MIN 0 #define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ /* POSIX (Portable Operating System Interface) layer */ @@ -114,18 +165,30 @@ /* Socket is in the 'Network' category */ +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ /* Network */ +/* end of Network */ /* Memory protection */ +/* end of Memory protection */ /* Utilities */ +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ /* RT-Thread Utestcases */ +/* end of RT-Thread Utestcases */ /* RT-Thread online packages */ @@ -136,57 +199,78 @@ /* Marvell WiFi */ +/* end of Marvell WiFi */ /* Wiced WiFi */ +/* end of Wiced WiFi */ /* CYW43012 WiFi */ +/* end of CYW43012 WiFi */ /* BL808 WiFi */ +/* end of BL808 WiFi */ /* CYW43439 WiFi */ +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ /* IoT Cloud */ +/* end of IoT Cloud */ +/* end of IoT - internet of things */ /* security packages */ +/* end of security packages */ /* language packages */ /* JSON: JavaScript Object Notation, a lightweight data-interchange format */ +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ /* XML: Extensible Markup Language */ +/* end of XML: Extensible Markup Language */ +/* end of language packages */ /* multimedia packages */ /* LVGL: powerful and easy-to-use embedded GUI library */ +/* end of LVGL: powerful and easy-to-use embedded GUI library */ /* u8g2: a monochrome graphic library */ +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ /* tools packages */ +/* end of tools packages */ /* system packages */ /* enhanced kernel services */ +/* end of enhanced kernel services */ /* acceleration: Assembly language or algorithmic acceleration packages */ +/* end of acceleration: Assembly language or algorithmic acceleration packages */ /* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ /* Micrium: Micrium software products porting for RT-Thread */ +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ /* peripheral libraries and drivers */ @@ -194,69 +278,94 @@ /* STM32 HAL & SDK Drivers */ +/* end of STM32 HAL & SDK Drivers */ /* Infineon HAL Packages */ +/* end of Infineon HAL Packages */ /* Kendryte SDK */ +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ /* sensors drivers */ +/* end of sensors drivers */ /* touch drivers */ +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ /* AI packages */ +/* end of AI packages */ /* Signal Processing and Control Algorithm Packages */ +/* end of Signal Processing and Control Algorithm Packages */ /* miscellaneous packages */ /* project laboratory */ +/* end of project laboratory */ + /* samples: kernel and components samples */ +/* end of samples: kernel and components samples */ /* entertainment: terminal games and other interesting software packages */ +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ /* Arduino libraries */ /* Projects and Demos */ +/* end of Projects and Demos */ /* Sensors */ +/* end of Sensors */ /* Display */ +/* end of Display */ /* Timing */ +/* end of Timing */ /* Data Processing */ +/* end of Data Processing */ /* Data Storage */ /* Communication */ +/* end of Communication */ /* Device Control */ +/* end of Device Control */ /* Other */ +/* end of Other */ /* Signal IO */ +/* end of Signal IO */ /* Uncategorized */ +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ #define SOC_FAMILY_HT32 #define SOC_SERIES_HT32F1 @@ -267,9 +376,11 @@ #define SOC_KERNEL #define CORTEX_M3 #define SOC_HT32F12366 +/* end of Chip Configuration */ /* Onboard Peripheral Drivers */ +/* end of Onboard Peripheral Drivers */ /* On-chip Peripheral Drivers */ @@ -277,8 +388,10 @@ #define BSP_USING_UART #define BSP_USING_USART0 #define BSP_USING_USART0_NAME "usart0" +/* end of On-chip Peripheral Drivers */ /* Board extended module Drivers */ +/* end of Hardware Drivers Config */ #endif diff --git a/bsp/ht32/ht32f12366/template.uvoptx b/bsp/ht32/ht32f12366/template.uvoptx index 4c6655f9dd9..bca728b9ba7 100644 --- a/bsp/ht32/ht32f12366/template.uvoptx +++ b/bsp/ht32/ht32f12366/template.uvoptx @@ -73,7 +73,7 @@ 0 - 1 + 0 0 1 diff --git a/bsp/ht32/ht32f12366/template.uvprojx b/bsp/ht32/ht32f12366/template.uvprojx index 9b24487b535..cc3940694f6 100644 --- a/bsp/ht32/ht32f12366/template.uvprojx +++ b/bsp/ht32/ht32f12366/template.uvprojx @@ -15,8 +15,8 @@ HT32F12366 Holtek - Holtek.HT32_DFP.1.0.19 - http://mcu.holtek.com.tw/pack + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack IRAM(0x20000000,0x20000) IROM(0x00000000,0x3FC00) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -332,7 +332,7 @@ 0 0 - + --gnu diff --git a/bsp/ht32/ht32f52352/.config b/bsp/ht32/ht32f52352/.config index 6ee81a58710..8456d0fbe7c 100644 --- a/bsp/ht32/ht32f52352/.config +++ b/bsp/ht32/ht32f52352/.config @@ -1,15 +1,117 @@ + # -# Automatically generated file; DO NOT EDIT. -# RT-Thread Configuration +# RT-Thread Kernel # # -# RT-Thread Kernel +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options # +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set -# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_AMP is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_CPUS_NR=1 @@ -19,23 +121,24 @@ 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_OVERFLOW_CHECK is not set CONFIG_RT_USING_HOOK=y CONFIG_RT_HOOK_USING_FUNC_PTR=y # CONFIG_RT_USING_HOOKLIST is not set CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 -CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_IDLE_THREAD_STACK_SIZE=512 # CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set # -# kservice optimization +# kservice options # -# 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 +# end of kservice options + # CONFIG_RT_USING_DEBUG is not set +# CONFIG_RT_USING_CI_ACTION is not set # # Inter-Thread communication @@ -47,6 +150,7 @@ CONFIG_RT_USING_MAILBOX=y CONFIG_RT_USING_MESSAGEQUEUE=y # CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set # CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication # # Memory Management @@ -65,22 +169,20 @@ CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMTRACE is not set # CONFIG_RT_USING_HEAP_ISR is not set CONFIG_RT_USING_HEAP=y +# end of Memory Management + CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set # CONFIG_RT_USING_THREADSAFE_PRINTF is not set -# CONFIG_RT_USING_SCHED_THREAD_CTX is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" CONFIG_RT_VER_NUM=0x50200 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 -# CONFIG_RT_USING_CACHE is not set -# CONFIG_RT_USING_HW_ATOMIC is not set -# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set -# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set -# CONFIG_RT_USING_CPU_FFS is not set +# end of RT-Thread Kernel + CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M0=y @@ -90,7 +192,7 @@ CONFIG_ARCH_ARM_CORTEX_M0=y # CONFIG_RT_USING_COMPONENTS_INIT=y CONFIG_RT_USING_USER_MAIN=y -CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_STACK_SIZE=1024 CONFIG_RT_MAIN_THREAD_PRIORITY=10 # CONFIG_RT_USING_LEGACY is not set CONFIG_RT_USING_MSH=y @@ -114,12 +216,15 @@ CONFIG_FINSH_USING_OPTION_COMPLETION=y # DFS: device virtual file system # # CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + # CONFIG_RT_USING_FAL is not set # # Device Drivers # # CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_UNAMED_PIPE_NUMBER=64 # CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set @@ -128,53 +233,40 @@ 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=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_CPUTIME is not set -CONFIG_RT_USING_I2C=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_SOFT_I2C is not set +# CONFIG_RT_USING_I2C is not set # CONFIG_RT_USING_PHY is not set -CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set # CONFIG_RT_USING_NULL is not set # CONFIG_RT_USING_ZERO is not set # CONFIG_RT_USING_RANDOM is not set # CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_RTC is not set # CONFIG_RT_USING_SDIO is not set -CONFIG_RT_USING_SPI=y -# CONFIG_RT_USING_SPI_BITOPS is not set -# CONFIG_RT_USING_QSPI is not set -# 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=y +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set # CONFIG_RT_USING_TOUCH is not set # CONFIG_RT_USING_LCD is not set # CONFIG_RT_USING_HWCRYPTO is not set -# CONFIG_RT_USING_PULSE_ENCODER is not set -# CONFIG_RT_USING_INPUT_CAPTURE is not set -# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set # CONFIG_RT_USING_VIRTIO is not set CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_KTIME is not set # CONFIG_RT_USING_HWTIMER is not set - -# -# 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 +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers # # C/C++ and POSIX layer @@ -192,6 +284,8 @@ CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer # # POSIX (Portable Operating System Interface) layer @@ -213,7 +307,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # Socket is in the 'Network' category # +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + # CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer # # Network @@ -222,12 +320,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_NETDEV is not set # CONFIG_RT_USING_LWIP is not set # CONFIG_RT_USING_AT is not set +# end of Network # # Memory protection # # CONFIG_RT_USING_MEM_PROTECTION is not set # CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection # # Utilities @@ -239,12 +339,25 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RESOURCE_ID is not set # CONFIG_RT_USING_ADT is not set # CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + # CONFIG_RT_USING_VBUS is not set +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + # # RT-Thread Utestcases # # CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases # # RT-Thread online packages @@ -253,7 +366,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # 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 @@ -276,27 +388,35 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Marvell WiFi # # CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi # # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + # CONFIG_PKG_USING_RW007 is not set # # CYW43012 WiFi # # CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi # # BL808 WiFi # # CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi # # CYW43439 WiFi # # CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set @@ -319,6 +439,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set # CONFIG_PKG_USING_JOYLINK is not set # CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + # CONFIG_PKG_USING_NIMBLE is not set # CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set @@ -362,6 +484,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set # CONFIG_PKG_USING_LHC_MODBUS is not set # CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things # # security packages @@ -372,6 +495,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_TINYCRYPT is not set # CONFIG_PKG_USING_TFM is not set # CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages # # language packages @@ -387,18 +511,22 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_JSMN is not set # CONFIG_PKG_USING_AGILE_JSMN is not set # CONFIG_PKG_USING_PARSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format # # XML: Extensible Markup Language # # CONFIG_PKG_USING_SIMPLE_XML is not set # CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + # CONFIG_PKG_USING_LUATOS_SOC is not set # CONFIG_PKG_USING_LUA is not set # CONFIG_PKG_USING_JERRYSCRIPT is not set # CONFIG_PKG_USING_MICROPYTHON is not set # CONFIG_PKG_USING_PIKASCRIPT is not set # CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages # # multimedia packages @@ -410,12 +538,15 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_LVGL is not set # CONFIG_PKG_USING_LV_MUSIC_DEMO is not set # CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library # # u8g2: a monochrome graphic library # # CONFIG_PKG_USING_U8G2_OFFICIAL is not set # CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -435,6 +566,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_GUIENGINE is not set # CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages # # tools packages @@ -484,6 +616,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_VOFA_PLUS is not set # CONFIG_PKG_USING_RT_TRACE is not set # CONFIG_PKG_USING_ZDEBUG is not set +# end of tools packages # # system packages @@ -495,6 +628,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT_MEMCPY_CM is not set # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set # CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +# end of enhanced kernel services + # CONFIG_PKG_USING_AUNITY is not set # @@ -503,6 +638,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QFPLIB_M0_FULL is not set # CONFIG_PKG_USING_QFPLIB_M0_TINY is not set # CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages # # CMSIS: ARM Cortex-M Microcontroller Software Interface Standard @@ -513,6 +649,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_CMSIS_NN is not set # CONFIG_PKG_USING_CMSIS_RTOS1 is not set # CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard # # Micrium: Micrium software products porting for RT-Thread @@ -523,6 +660,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_LITEOS_SDK is not set # CONFIG_PKG_USING_TZ_DATABASE is not set @@ -570,6 +709,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RTP is not set # CONFIG_PKG_USING_REB is not set # CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages # # peripheral libraries and drivers @@ -586,6 +726,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set # CONFIG_PKG_USING_STM32WB55_SDK is not set # CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers # # Infineon HAL Packages @@ -600,6 +741,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_INFINEON_CSDIDAC is not set # CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set # CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + # CONFIG_PKG_USING_BLUETRUM_SDK is not set # CONFIG_PKG_USING_EMBARC_BSP is not set # CONFIG_PKG_USING_ESP_IDF is not set @@ -609,9 +752,12 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_K210_SDK is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + # CONFIG_PKG_USING_NRF5X_SDK is not set # CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers # # sensors drivers @@ -681,6 +827,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers # # touch drivers @@ -695,6 +842,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_XPT2046_TOUCH is not set # CONFIG_PKG_USING_CST816X is not set # CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set @@ -767,6 +916,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_BT_MX01 is not set # CONFIG_PKG_USING_RGPOWER is not set # CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers # # AI packages @@ -781,6 +931,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set # CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages # # Signal Processing and Control Algorithm Packages @@ -791,6 +942,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_DIGITALCTRL is not set # CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages # # miscellaneous packages @@ -799,6 +951,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # project laboratory # +# end of project laboratory # # samples: kernel and components samples @@ -807,6 +960,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples # # entertainment: terminal games and other interesting software packages @@ -823,6 +977,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_COWSAY is not set # CONFIG_PKG_USING_MORSE is not set # CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + # CONFIG_PKG_USING_LIBCSV is not set # CONFIG_PKG_USING_OPTPARSE is not set # CONFIG_PKG_USING_FASTLZ is not set @@ -856,6 +1012,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_SOEM is not set # CONFIG_PKG_USING_QPARAM is not set # CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages # # Arduino libraries @@ -871,6 +1028,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set # CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set # CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos # # Sensors @@ -1011,6 +1169,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set # CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set # CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors # # Display @@ -1022,6 +1181,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set # CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display # # Timing @@ -1030,6 +1190,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set # CONFIG_PKG_USING_ARDUINO_TICKER is not set # CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing # # Data Processing @@ -1038,6 +1199,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set # CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set # CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing # # Data Storage @@ -1048,6 +1210,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication # # Device Control @@ -1059,12 +1222,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set # CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control # # Other # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other # # Signal IO @@ -1077,10 +1242,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO # # Uncategorized # +# end of Arduino libraries +# end of RT-Thread online packages + CONFIG_SOC_FAMILY_HT32=y CONFIG_SOC_SERIES_HT32F5=y @@ -1125,11 +1294,13 @@ CONFIG_SOC_HT32F52352=y # CONFIG_SOC_HT32F65240 is not set # CONFIG_SOC_HT32F67051 is not set # CONFIG_SOC_HT32F67741 is not set +# end of Chip Configuration # # Onboard Peripheral Drivers # # CONFIG_BSP_USING_TEST is not set +# end of Onboard Peripheral Drivers # # On-chip Peripheral Drivers @@ -1145,7 +1316,10 @@ CONFIG_BSP_USING_USART1_NAME="usart1" # CONFIG_BSP_USING_I2C is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_USBD is not set +# end of On-chip Peripheral Drivers # # Board extended module Drivers # +# end of Hardware Drivers Config diff --git a/bsp/ht32/ht32f52352/README.md b/bsp/ht32/ht32f52352/README.md index 10644a76a4a..2b80c781f37 100644 --- a/bsp/ht32/ht32f52352/README.md +++ b/bsp/ht32/ht32f52352/README.md @@ -41,8 +41,8 @@ ESK32-30501使用32位Arm® Cortex®-M0+高性能、低功耗单片机HT32F52352 | UART | 支持 | UART0/1 | | SPI | 支持 | SPI0/1 | | I2C | 支持 | 硬件 I2C0/1 | -| ADC | 暂不支持 | | -| WDT | 暂不支持 | | +| ADC | 支持 | | +| WDT | 支持 | | ## 使用说明 diff --git a/bsp/ht32/ht32f52352/SConstruct b/bsp/ht32/ht32f52352/SConstruct index 9f16ec63d24..26ac123a476 100644 --- a/bsp/ht32/ht32f52352/SConstruct +++ b/bsp/ht32/ht32f52352/SConstruct @@ -53,6 +53,9 @@ rtconfig.BSP_LIBRARY_TYPE = ht32_library # include libraries objs.extend(SConscript(os.path.join(libraries_path_prefix, ht32_library, 'SConscript'))) +# include usb libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'usbd_library', 'SConscript'))) + # include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'ht32_drivers', 'SConscript'))) diff --git a/bsp/ht32/ht32f52352/applications/test.c b/bsp/ht32/ht32f52352/applications/test.c index 85e86ac883a..967217b656a 100644 --- a/bsp/ht32/ht32f52352/applications/test.c +++ b/bsp/ht32/ht32f52352/applications/test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -58,20 +58,29 @@ static struct rt_semaphore rx_sem; static rt_mutex_t task_mutex = RT_NULL; /* task mutex */ /* device handle */ +#ifdef BSP_USING_UART static rt_device_t serial; +#endif +#ifdef BSP_USING_WDT static rt_device_t wdt_dev; -struct rt_i2c_bus_device *i2c_dev; +#endif +#ifdef BSP_USING_I2C +static struct rt_i2c_bus_device *i2c_dev; +#endif +#ifdef BSP_USING_SPI static struct rt_spi_device *spi_dev; +#endif /* In-file function declarations */ -static void sys_run_dir(void *parameter); -static void gpio_output_test(void *parameter); -static void gpio_input_test(void *parameter); -static void key_iqr_handle(void *args); +//static void sys_run_dir(void *parameter); +//static void gpio_output_test(void *parameter); +//static void gpio_input_test(void *parameter); +//static void key_iqr_handle(void *args); /* Task registration */ int task_registration(void) { +// USB_Configuration(RT_NULL); /* Create a dynamic mutex */ task_mutex = rt_mutex_create("task_mutex", RT_IPC_FLAG_FIFO); if (task_mutex == RT_NULL) @@ -90,6 +99,7 @@ int task_registration(void) INIT_BOARD_EXPORT(task_registration); /* System operation indicator */ +#ifdef BSP_USING_GPIO static void sys_run_dir(void *parameter) { rt_uint32_t e; @@ -301,7 +311,9 @@ static int gpio_input_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(gpio_input_task, gpio input task operation); +#endif /* uart test */ +#ifdef BSP_USING_UART static rt_err_t uart_iqr_handle(rt_device_t dev, rt_size_t size) { /* Serial port callback function */ @@ -396,7 +408,9 @@ static int uart_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(uart_task, uart device sample); +#endif /* hw/sw iic test */ +#ifdef BSP_USING_I2C static void i2c_thread(void *parameter) { uint8_t write_addr = 0x00; @@ -497,7 +511,9 @@ static int i2c_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(i2c_task, i2c device sample); +#endif /* spi test */ +#ifdef BSP_USING_SPI static void spi_thread(void *parameter) { rt_uint8_t w25x_read_id = 0x9F; @@ -584,7 +600,9 @@ static int spi_task(int argc, char *argv[]) return ret; } MSH_CMD_EXPORT(spi_task, spi device sample); +#endif /* adc test */ +#ifdef BSP_USING_ADC static void adc_test(void *parameter) { rt_uint32_t adc0_ch6_val,adc0_ch7_val; @@ -640,8 +658,9 @@ static int adc_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(adc_task, adc task operation); - +#endif /* wdt test */ +#ifdef BSP_USING_WDT static void wdt_test(void) { rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); @@ -712,5 +731,74 @@ static int wdt_task(int argc, char *argv[]) return -1; } MSH_CMD_EXPORT(wdt_task, wdt task operation); +#endif +/* usbd test */ +#ifdef BSP_USING_USBD +static void usbd_test(void *parameter) +{ + rt_device_t dev = RT_NULL; + char dev_name[] = "vcom"; + char buf[] = "usbd vcom test!\r\n"; + + dev = rt_device_find(dev_name); + + if (dev) + { + rt_device_open(dev, RT_DEVICE_FLAG_RDWR); + } + else + { + rt_kprintf("Device with name %s not found.\n",dev_name); + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + while (1) + { + rt_device_write(dev, 0, buf, rt_strlen(buf)); + rt_thread_mdelay(500); + } +} + +static int usbd_task(int argc, char *argv[]) +{ + rt_err_t ret = -RT_ERROR; + + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Gpio input test tasks */ + rt_thread_t usbd_vcom_task = rt_thread_create("usbd_vcom_task", + usbd_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (usbd_vcom_task != RT_NULL) + { + rt_thread_startup(usbd_vcom_task); + rt_kprintf("The usbd vcom task is registered.\n"); + } + else + { + rt_kprintf("usbd vcom task registration failed.\n"); + } + ret = RT_EOK; + } + else if(rt_strcmp(argv[1],"stop") == 0) + { + ret = RT_EOK; + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s stop\n",__func__); + } + return ret; +} +MSH_CMD_EXPORT(usbd_task, usbd task operation); + +#endif #endif /* BSP_USING_TEST */ diff --git a/bsp/ht32/ht32f52352/board/Kconfig b/bsp/ht32/ht32f52352/board/Kconfig index 57aed30985f..8ba20cd72d2 100644 --- a/bsp/ht32/ht32f52352/board/Kconfig +++ b/bsp/ht32/ht32f52352/board/Kconfig @@ -306,6 +306,140 @@ menu "On-chip Peripheral Drivers" depends on BSP_USING_WDT string "wdt device name" default "wdt" + + menuconfig BSP_USING_CAN + bool "Enable CAN" + depends on SOC_HT32F53241 || SOC_HT32F53242 || SOC_HT32F53252 + default n + select RT_USING_CAN if BSP_USING_CAN + config BSP_USING_CAN_NAME + depends on BSP_USING_CAN + string "can device name" + default "can" + if BSP_USING_CAN + config CAN_DEFAULT_BASE_CONFIGURATION + choice + prompt "Default CAN baud rate" + default BSP_USING_CAN500kBaud + config BSP_USING_CAN1MBaud + bool "CAN1MBaud" + config BSP_USING_CAN800kBaud + bool "CAN800kBaud" + config BSP_USING_CAN500kBaud + bool "CAN500kBaud" + config BSP_USING_CAN250kBaud + bool "CAN250kBaud" + config BSP_USING_CAN125kBaud + bool "CAN125kBaud" + config BSP_USING_CAN100kBaud + bool "CAN100kBaud" + config BSP_USING_CAN50kBaud + bool "CAN50kBaud" + config BSP_USING_CAN20kBaud + bool "CAN20kBaud" + config BSP_USING_CAN10kBaud + bool "CAN10kBaud" + endchoice + choice + prompt "Default CAN mode" + default BSP_USING_RT_CAN_MODE_NORMAL + config BSP_USING_RT_CAN_MODE_NORMAL + bool "RT_CAN_MODE_NORMAL" + config BSP_USING_RT_CAN_MODE_LISTEN + bool "RT_CAN_MODE_LISTEN" + config BSP_USING_RT_CAN_MODE_LOOPBACK + bool "RT_CAN_MODE_LOOPBACK" + config BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + bool "RT_CAN_MODE_LOOPBACKANLISTEN" + endchoice + + config BSP_USING_CAN_BAUD + int + default 1000000 if BSP_USING_CAN1MBaud + default 800000 if BSP_USING_CAN800kBaud + default 500000 if BSP_USING_CAN500kBaud + default 250000 if BSP_USING_CAN250kBaud + default 125000 if BSP_USING_CAN125kBaud + default 100000 if BSP_USING_CAN100kBaud + default 50000 if BSP_USING_CAN50kBaud + default 20000 if BSP_USING_CAN20kBaud + default 10000 if BSP_USING_CAN10kBaud + + config BSP_USING_CAN_MODE + int + default 0 if BSP_USING_RT_CAN_MODE_NORMAL + default 1 if BSP_USING_RT_CAN_MODE_LISTEN + default 2 if BSP_USING_RT_CAN_MODE_LOOPBACK + default 3 if BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + + config CAN_DEFAULT_FILTER_TABLE_CONFIGURATION + choice + prompt "Default filter id mode" + default BSP_USING_CAN_STD_ID + config BSP_USING_CAN_STD_ID + bool "CAN_STD_ID" + config BSP_USING_CAN_EXT_ID + bool "CAN_EXT_ID" + endchoice + + choice + prompt "Default filter frame mode" + default BSP_USING_CAN_DATA_FRAME + config BSP_USING_CAN_DATA_FRAME + bool "CAN_DATA_FRAME" + config BSP_USING_CAN_REMOTE_FRAME + bool "CAN_REMOTE_FRAME" + endchoice + + config BSP_USING_CAN_ID_MODE + int + default 0 if BSP_USING_CAN_STD_ID + default 1 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_FRAME_MODE + int + default 0 if BSP_USING_CAN_REMOTE_FRAME + default 1 if BSP_USING_CAN_DATA_FRAME + + config BSP_USING_CAN_MSG_NUM + int "Default filter table number" + range 0 31 + default 0 + + config BSP_USING_CAN_ID + hex "Default filter arbitration bit(ID)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x541 if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x541 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_MASK + hex "Default filter mask bit(MASK)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x7FF if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + + endif + + menuconfig BSP_USING_SDIO + bool "Enable SDIO" + depends on SOC_HT32F12345 || SOC_HT32F12365 || SOC_HT32F12366 + default n + select RT_USING_SDIO if BSP_USING_SDIO + config BSP_USING_SDIO_NAME + depends on BSP_USING_SDIO + string "sdio device name" + default "sdio" + + menuconfig BSP_USING_USBD + bool "Enable USB BUS" + default n + select RT_USING_USB_DEVICE if BSP_USING_USBD + config BSP_USING_USBD_NAME + depends on BSP_USING_USBD + string "usbd device name" + default "usbd" endmenu menu "Board extended module Drivers" diff --git a/bsp/ht32/ht32f52352/board/inc/ht32f5xxxx_01_usbdconf.h b/bsp/ht32/ht32f52352/board/inc/ht32f5xxxx_01_usbdconf.h index a512579519a..d1ef029d1b1 100644 --- a/bsp/ht32/ht32f52352/board/inc/ht32f5xxxx_01_usbdconf.h +++ b/bsp/ht32/ht32f52352/board/inc/ht32f5xxxx_01_usbdconf.h @@ -58,7 +58,7 @@ // Endpoint5 Interrupt Enable (EP5IE) // Endpoint6 Interrupt Enable (EP6IE) // Endpoint7 Interrupt Enable (EP7IE) -#define _UIER (0x011D) +#define _UIER (0xFF1D) // @@ -96,7 +96,7 @@ /* Endpoint1 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint1 Configuration -#define _EP1_ENABLE (0) +#define _EP1_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -114,7 +114,7 @@ // Endpoint Transfer Type // <2=> Bulk // <3=> Interrupt -#define _EP1_TYPR (3) +#define _EP1_TYPR (2) // Endpoint Direction (EPDIR) // <1=> IN @@ -123,7 +123,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP1LEN_TMP (8) +#define _EP1LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -135,7 +135,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP1_IER (0x10) +#define _EP1_IER (0x12) // // @@ -144,7 +144,7 @@ /* Endpoint2 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint2 Configuration -#define _EP2_ENABLE (0) +#define _EP2_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -162,7 +162,7 @@ // Endpoint Transfer Type // <2=> Bulk // <3=> Interrupt -#define _EP2_TYPR (3) +#define _EP2_TYPR (2) // Endpoint Direction (EPDIR) // <1=> IN @@ -171,7 +171,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP2LEN_TMP (8) +#define _EP2LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -183,7 +183,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP2_IER (0x002) +#define _EP2_IER (0x012) // // @@ -191,7 +191,7 @@ /* Endpoint3 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint3 Configuration -#define _EP3_ENABLE (0) +#define _EP3_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -218,7 +218,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> /* Maximum: 64 Bytes */ -#define _EP3LEN_TMP (8) +#define _EP3LEN_TMP (64) // Endpoint Interrupt Enable Settings (EPIER) // Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> @@ -230,7 +230,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP3_IER (0x10) +#define _EP3_IER (0x12) // // @@ -238,7 +238,7 @@ /* Endpoint4 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint4 Configuration -#define _EP4_ENABLE (0) +#define _EP4_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -266,7 +266,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP4LEN_TMP (8) +#define _EP4LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -283,7 +283,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP4_IER (0x02) +#define _EP4_IER (0x12) // // @@ -292,7 +292,7 @@ /* Endpoint5 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint5 Configuration -#define _EP5_ENABLE (0) +#define _EP5_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -311,7 +311,7 @@ // <1=> Isochronous // <2=> Bulk // <3=> Interrupt -#define _EP5_TYPR (3) +#define _EP5_TYPR (1) // Endpoint Direction (EPDIR) // <1=> IN @@ -320,7 +320,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP5LEN_TMP (8) +#define _EP5LEN_TMP (64) // Single/Double Buffer Selection (SDBS) @@ -338,7 +338,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP5_IER (0x10) +#define _EP5_IER (0x12) // // @@ -347,7 +347,7 @@ /* Endpoint6 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint6 Configuration -#define _EP6_ENABLE (0) +#define _EP6_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -366,7 +366,7 @@ // <1=> Isochronous // <2=> Bulk // <3=> Interrupt -#define _EP6_TYPR (3) +#define _EP6_TYPR (1) // Endpoint Direction (EPDIR) // <1=> IN @@ -375,7 +375,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP6LEN_TMP (8) +#define _EP6LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -392,7 +392,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP6_IER (0x02) +#define _EP6_IER (0x12) // // @@ -401,7 +401,7 @@ /* Endpoint7 Configuration Setting */ /*----------------------------------------------------------------------------------------------------------*/ // Endpoint7 Configuration -#define _EP7_ENABLE (0) +#define _EP7_ENABLE (1) // Endpoint Address (EPADR) // <1=> 1 @@ -429,7 +429,7 @@ // Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> /* Maximum: 1000 Bytes */ -#define _EP7LEN_TMP (8) +#define _EP7LEN_TMP (64) // Single/Double Buffer Selection (SDBS) // <0=> Single Buffer @@ -446,7 +446,7 @@ // NAK Transmitted Interrupt Enable (NAKIE) // STALL Transmitted Interrupt Enable (STLIE) // USB Error Interrupt Enable (UERIE) -#define _EP7_IER (0x10) +#define _EP7_IER (0x12) // // diff --git a/bsp/ht32/ht32f52352/project.uvoptx b/bsp/ht32/ht32f52352/project.uvoptx index f767ec2636a..50637f5197b 100644 --- a/bsp/ht32/ht32f52352/project.uvoptx +++ b/bsp/ht32/ht32f52352/project.uvoptx @@ -73,7 +73,7 @@ 0 - 1 + 0 0 1 @@ -170,7 +170,7 @@ Applications - 1 + 0 0 0 0 @@ -317,8 +317,8 @@ 0 0 0 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - i2c-bit-ops.c + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c 0 0 @@ -329,8 +329,8 @@ 0 0 0 - ..\..\..\components\drivers\i2c\i2c_core.c - i2c_core.c + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c 0 0 @@ -341,30 +341,6 @@ 0 0 0 - ..\..\..\components\drivers\i2c\i2c_dev.c - i2c_dev.c - 0 - 0 - - - 3 - 14 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\ipc\completion.c - completion.c - 0 - 0 - - - 3 - 15 - 1 - 0 - 0 - 0 ..\..\..\components\drivers\ipc\condvar.c condvar.c 0 @@ -372,7 +348,7 @@ 3 - 16 + 14 1 0 0 @@ -384,7 +360,7 @@ 3 - 17 + 15 1 0 0 @@ -396,7 +372,7 @@ 3 - 18 + 16 1 0 0 @@ -408,7 +384,7 @@ 3 - 19 + 17 1 0 0 @@ -420,7 +396,7 @@ 3 - 20 + 18 1 0 0 @@ -432,7 +408,7 @@ 3 - 21 + 19 1 0 0 @@ -444,73 +420,25 @@ 3 - 22 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\misc\adc.c - adc.c - 0 - 0 - - - 3 - 23 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\pin\pin.c - pin.c - 0 - 0 - - - 3 - 24 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\serial\serial.c - serial.c - 0 - 0 - - - 3 - 25 - 1 - 0 - 0 - 0 - ..\..\..\components\drivers\spi\spi_core.c - spi_core.c - 0 - 0 - - - 3 - 26 + 20 1 0 0 0 - ..\..\..\components\drivers\spi\spi_dev.c - spi_dev.c + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c 0 0 3 - 27 + 21 1 0 0 0 - ..\..\..\components\drivers\watchdog\watchdog.c - watchdog.c + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c 0 0 @@ -518,13 +446,13 @@ Drivers - 1 + 0 0 0 0 4 - 28 + 22 1 0 0 @@ -536,7 +464,7 @@ 4 - 29 + 23 1 0 0 @@ -548,7 +476,7 @@ 4 - 30 + 24 2 0 0 @@ -560,7 +488,7 @@ 4 - 31 + 25 1 0 0 @@ -572,7 +500,7 @@ 4 - 32 + 26 1 0 0 @@ -584,7 +512,7 @@ 4 - 33 + 27 1 0 0 @@ -604,31 +532,31 @@ 0 5 - 34 + 28 1 0 0 0 - ..\..\..\components\finsh\shell.c - shell.c + ..\..\..\components\finsh\msh.c + msh.c 0 0 5 - 35 + 29 1 0 0 0 - ..\..\..\components\finsh\msh.c - msh.c + ..\..\..\components\finsh\cmd.c + cmd.c 0 0 5 - 36 + 30 1 0 0 @@ -640,13 +568,13 @@ 5 - 37 + 31 1 0 0 0 - ..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\components\finsh\shell.c + shell.c 0 0 @@ -660,7 +588,7 @@ 0 6 - 38 + 32 1 0 0 @@ -672,7 +600,7 @@ 6 - 39 + 33 1 0 0 @@ -684,67 +612,67 @@ 6 - 40 + 34 1 0 0 0 - ..\..\..\src\idle.c - idle.c + ..\..\..\src\cpu_up.c + cpu_up.c 0 0 6 - 41 + 35 1 0 0 0 - ..\..\..\src\ipc.c - ipc.c + ..\..\..\src\defunct.c + defunct.c 0 0 6 - 42 + 36 1 0 0 0 - ..\..\..\src\irq.c - irq.c + ..\..\..\src\idle.c + idle.c 0 0 6 - 43 + 37 1 0 0 0 - ..\..\..\src\klibc\kstdio.c - kstdio.c + ..\..\..\src\ipc.c + ipc.c 0 0 6 - 44 + 38 1 0 0 0 - ..\..\..\src\klibc\kstring.c - kstring.c + ..\..\..\src\irq.c + irq.c 0 0 6 - 45 + 39 1 0 0 @@ -756,7 +684,7 @@ 6 - 46 + 40 1 0 0 @@ -768,7 +696,7 @@ 6 - 47 + 41 1 0 0 @@ -780,7 +708,7 @@ 6 - 48 + 42 1 0 0 @@ -792,7 +720,7 @@ 6 - 49 + 43 1 0 0 @@ -804,7 +732,7 @@ 6 - 50 + 44 1 0 0 @@ -816,7 +744,7 @@ 6 - 51 + 45 1 0 0 @@ -828,7 +756,7 @@ 6 - 52 + 46 1 0 0 @@ -840,7 +768,7 @@ 6 - 53 + 47 1 0 0 @@ -853,14 +781,82 @@ - libcpu + klibc 0 0 0 0 7 - 54 + 48 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 53 1 0 0 @@ -871,8 +867,8 @@ 0 - 7 - 55 + 8 + 54 1 0 0 @@ -883,8 +879,8 @@ 0 - 7 - 56 + 8 + 55 2 0 0 @@ -895,8 +891,8 @@ 0 - 7 - 57 + 8 + 56 1 0 0 @@ -915,211 +911,223 @@ 0 0 - 8 + 9 + 57 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c + ht32f5xxxx_ckcu.c + 0 + 0 + + + 9 58 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_sci.c - ht32f5xxxx_sci.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c + ht32f5xxxx_pwrcu.c 0 0 - 8 + 9 59 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c - ht32f5xxxx_rstcu.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c + ht32f5xxxx_wdt.c 0 0 - 8 + 9 60 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c - ht32f5xxxx_adc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c + ht32f5xxxx_mctm.c 0 0 - 8 + 9 61 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c - ht32f5xxxx_cmp.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + ht32f5xxxx_usart.c 0 0 - 8 + 9 62 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c - ht32_cm0plus_misc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + ht32f5xxxx_ebi.c 0 0 - 8 + 9 63 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_crc.c - ht32f5xxxx_crc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c + ht32f5xxxx_exti.c 0 0 - 8 + 9 64 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c - ht32f5xxxx_spi.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_crc.c + ht32f5xxxx_crc.c 0 0 - 8 + 9 65 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c - ht32f5xxxx_pwrcu.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c + ht32f5xxxx_spi.c 0 0 - 8 + 9 66 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c - ht32f5xxxx_pdma.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_sci.c + ht32f5xxxx_sci.c 0 0 - 8 + 9 67 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c - ht32f5xxxx_mctm.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c + ht32f5xxxx_i2c.c 0 0 - 8 + 9 68 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c - ht32f5xxxx_rtc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c + ht32f5xxxx_tm.c 0 0 - 8 + 9 69 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2s.c - ht32f5xxxx_i2s.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c + ht32f5xxxx_pdma.c 0 0 - 8 + 9 70 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usbd.c - ht32f5xxxx_usbd.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + ht32f5xxxx_adc.c 0 0 - 8 + 9 71 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c - ht32f5xxxx_wdt.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usbd.c + ht32f5xxxx_usbd.c 0 0 - 8 + 9 72 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c - ht32f5xxxx_ebi.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_01.c + system_ht32f5xxxx_01.c 0 0 - 8 + 9 73 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c - ht32f5xxxx_tm.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + ht32f5xxxx_rstcu.c 0 0 - 8 + 9 74 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c - ht32f5xxxx_ckcu.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + ht32f5xxxx_flash.c 0 0 - 8 + 9 75 1 0 @@ -1131,19 +1139,19 @@ 0 - 8 + 9 76 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c - ht32f5xxxx_exti.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + ht32_cm0plus_misc.c 0 0 - 8 + 9 77 1 0 @@ -1155,50 +1163,38 @@ 0 - 8 + 9 78 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c - ht32f5xxxx_usart.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2s.c + ht32f5xxxx_i2s.c 0 0 - 8 + 9 79 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c - ht32f5xxxx_i2c.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c + ht32f5xxxx_rtc.c 0 0 - 8 + 9 80 1 0 0 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c - ht32f5xxxx_flash.c - 0 - 0 - - - 8 - 81 - 1 - 0 - 0 - 0 - ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_01.c - system_ht32f5xxxx_01.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + ht32f5xxxx_cmp.c 0 0 diff --git a/bsp/ht32/ht32f52352/project.uvprojx b/bsp/ht32/ht32f52352/project.uvprojx index 602e06a7754..8f9e53c8704 100644 --- a/bsp/ht32/ht32f52352/project.uvprojx +++ b/bsp/ht32/ht32f52352/project.uvprojx @@ -15,8 +15,8 @@ HT32F52352 Holtek - Holtek.HT32_DFP.1.0.19 - http://mcu.holtek.com.tw/pack + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack IRAM(0x20000000,0x4000) IROM(0x00000000,0x1FE00) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE @@ -332,10 +332,10 @@ 0 0 - - __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, USE_HT32_DRIVER, __RTTHREAD__, USE_HT32F52352_SK, USE_HT32F52342_52, USE_MEM_HT32F52352 + --gnu + RT_USING_LIBC, RT_USING_ARMLIBC, __RTTHREAD__, USE_HT32F52352_SK, USE_HT32F52342_52, USE_MEM_HT32F52352, __CLK_TCK=RT_TICK_PER_SECOND, __STDC_LIMIT_MACROS, USE_HT32_DRIVER - ..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\include;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include;..\libraries\ht32_drivers;..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Include;..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\inc;..\..\..\libcpu\arm\common;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\HT32_STD_5xxxx_FWLib\library\CMSIS\Include;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\eventfd;board\inc;..\..\..\components\drivers\include;..\..\..\components\drivers\include;.;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;applications;..\..\..\components\drivers\spi;..\..\..\libcpu\arm\cortex-m0 + ..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\smp_call;..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\inc;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\libc\posix\ipc;..\libraries\ht32_drivers;..\..\..\components\libc\posix\io\poll;..\libraries\usbd_library\inc;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;.;..\..\..\components\drivers\phy;board\inc;..\..\..\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\finsh;applications;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\HT32_STD_5xxxx_FWLib\library\CMSIS\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\posix\io\eventfd;..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Include @@ -490,64 +490,9 @@ - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - i2c_core.c + completion_comm.c 1 - ..\..\..\components\drivers\i2c\i2c_core.c + ..\..\..\components\drivers\ipc\completion_comm.c 2 @@ -600,64 +545,9 @@ - i2c_dev.c + completion_up.c 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c + ..\..\..\components\drivers\ipc\completion_up.c 2 @@ -1095,174 +985,9 @@ - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - pin.c - 1 - ..\..\..\components\drivers\pin\pin.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - spi_core.c + dev_pin.c 1 - ..\..\..\components\drivers\spi\spi_core.c + ..\..\..\components\drivers\pin\dev_pin.c 2 @@ -1315,64 +1040,9 @@ - spi_dev.c + dev_serial.c 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - __RT_IPC_SOURCE__ - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c + ..\..\..\components\drivers\serial\dev_serial.c 2 @@ -1465,14 +1135,14 @@ Finsh - shell.c + msh.c 1 - ..\..\..\components\finsh\shell.c + ..\..\..\components\finsh\msh.c - msh.c + cmd.c 1 - ..\..\..\components\finsh\msh.c + ..\..\..\components\finsh\cmd.c msh_parse.c @@ -1480,9 +1150,9 @@ ..\..\..\components\finsh\msh_parse.c - cmd.c + shell.c 1 - ..\..\..\components\finsh\cmd.c + ..\..\..\components\finsh\shell.c @@ -1600,9 +1270,9 @@ - idle.c + cpu_up.c 1 - ..\..\..\src\idle.c + ..\..\..\src\cpu_up.c 2 @@ -1655,9 +1325,9 @@ - ipc.c + defunct.c 1 - ..\..\..\src\ipc.c + ..\..\..\src\defunct.c 2 @@ -1710,9 +1380,9 @@ - irq.c + idle.c 1 - ..\..\..\src\irq.c + ..\..\..\src\idle.c 2 @@ -1765,9 +1435,9 @@ - kstdio.c + ipc.c 1 - ..\..\..\src\klibc\kstdio.c + ..\..\..\src\ipc.c 2 @@ -1820,9 +1490,9 @@ - kstring.c + irq.c 1 - ..\..\..\src\klibc\kstring.c + ..\..\..\src\irq.c 2 @@ -2371,6 +2041,36 @@ + + klibc + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kstdio.c + 1 + ..\..\..\src\klibc\kstdio.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + kstring.c + 1 + ..\..\..\src\klibc\kstring.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + libcpu @@ -2400,29 +2100,39 @@ Libraries - ht32f5xxxx_sci.c + ht32f5xxxx_ckcu.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_sci.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c - ht32f5xxxx_rstcu.c + ht32f5xxxx_pwrcu.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c - ht32f5xxxx_adc.c + ht32f5xxxx_wdt.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c - ht32f5xxxx_cmp.c + ht32f5xxxx_mctm.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c - ht32_cm0plus_misc.c + ht32f5xxxx_usart.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + + + ht32f5xxxx_ebi.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + + + ht32f5xxxx_exti.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c ht32f5xxxx_crc.c @@ -2435,29 +2145,29 @@ ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c - ht32f5xxxx_pwrcu.c + ht32f5xxxx_sci.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_sci.c - ht32f5xxxx_pdma.c + ht32f5xxxx_i2c.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c - ht32f5xxxx_mctm.c + ht32f5xxxx_tm.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c - ht32f5xxxx_rtc.c + ht32f5xxxx_pdma.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c - ht32f5xxxx_i2s.c + ht32f5xxxx_adc.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2s.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c ht32f5xxxx_usbd.c @@ -2465,24 +2175,19 @@ ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usbd.c - ht32f5xxxx_wdt.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c - - - ht32f5xxxx_ebi.c + system_ht32f5xxxx_01.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_01.c - ht32f5xxxx_tm.c + ht32f5xxxx_rstcu.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c - ht32f5xxxx_ckcu.c + ht32f5xxxx_flash.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c ht32f5xxxx_gpio.c @@ -2490,9 +2195,9 @@ ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_gpio.c - ht32f5xxxx_exti.c + ht32_cm0plus_misc.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c ht32f5xxxx_bftm.c @@ -2500,24 +2205,19 @@ ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_bftm.c - ht32f5xxxx_usart.c - 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c - - - ht32f5xxxx_i2c.c + ht32f5xxxx_i2s.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2s.c - ht32f5xxxx_flash.c + ht32f5xxxx_rtc.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c - system_ht32f5xxxx_01.c + ht32f5xxxx_cmp.c 1 - ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_01.c + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c diff --git a/bsp/ht32/ht32f52352/rtconfig.h b/bsp/ht32/ht32f52352/rtconfig.h index a2410d09679..b7406d9fc7d 100644 --- a/bsp/ht32/ht32f52352/rtconfig.h +++ b/bsp/ht32/ht32f52352/rtconfig.h @@ -1,26 +1,81 @@ #ifndef RT_CONFIG_H__ #define RT_CONFIG_H__ -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - /* RT-Thread Kernel */ +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ #define RT_NAME_MAX 8 #define RT_CPUS_NR 1 #define RT_ALIGN_SIZE 4 #define RT_THREAD_PRIORITY_32 #define RT_THREAD_PRIORITY_MAX 32 #define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK #define RT_HOOK_USING_FUNC_PTR #define RT_USING_IDLE_HOOK #define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 256 +#define IDLE_THREAD_STACK_SIZE 512 -/* kservice optimization */ +/* kservice options */ +/* end of kservice options */ /* Inter-Thread communication */ @@ -29,6 +84,7 @@ #define RT_USING_EVENT #define RT_USING_MAILBOX #define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ /* Memory Management */ @@ -38,12 +94,14 @@ #define RT_MEMHEAP_FAST_MODE #define RT_USING_SMALL_MEM_AS_HEAP #define RT_USING_HEAP +/* end of Memory Management */ #define RT_USING_DEVICE #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" #define RT_VER_NUM 0x50200 #define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M0 @@ -52,7 +110,7 @@ #define RT_USING_COMPONENTS_INIT #define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_STACK_SIZE 1024 #define RT_MAIN_THREAD_PRIORITY 10 #define RT_USING_MSH #define RT_USING_FINSH @@ -71,6 +129,7 @@ /* DFS: device virtual file system */ +/* end of DFS: device virtual file system */ /* Device Drivers */ @@ -79,15 +138,8 @@ #define RT_USING_SERIAL #define RT_USING_SERIAL_V1 #define RT_SERIAL_RB_BUFSZ 64 -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_ADC -#define RT_USING_SPI -#define RT_USING_WDT #define RT_USING_PIN - -/* Using USB */ - +/* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -99,6 +151,8 @@ #define RT_LIBC_TZ_DEFAULT_HOUR 8 #define RT_LIBC_TZ_DEFAULT_MIN 0 #define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ /* POSIX (Portable Operating System Interface) layer */ @@ -108,18 +162,30 @@ /* Socket is in the 'Network' category */ +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ /* Network */ +/* end of Network */ /* Memory protection */ +/* end of Memory protection */ /* Utilities */ +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ /* RT-Thread Utestcases */ +/* end of RT-Thread Utestcases */ /* RT-Thread online packages */ @@ -130,57 +196,78 @@ /* Marvell WiFi */ +/* end of Marvell WiFi */ /* Wiced WiFi */ +/* end of Wiced WiFi */ /* CYW43012 WiFi */ +/* end of CYW43012 WiFi */ /* BL808 WiFi */ +/* end of BL808 WiFi */ /* CYW43439 WiFi */ +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ /* IoT Cloud */ +/* end of IoT Cloud */ +/* end of IoT - internet of things */ /* security packages */ +/* end of security packages */ /* language packages */ /* JSON: JavaScript Object Notation, a lightweight data-interchange format */ +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ /* XML: Extensible Markup Language */ +/* end of XML: Extensible Markup Language */ +/* end of language packages */ /* multimedia packages */ /* LVGL: powerful and easy-to-use embedded GUI library */ +/* end of LVGL: powerful and easy-to-use embedded GUI library */ /* u8g2: a monochrome graphic library */ +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ /* tools packages */ +/* end of tools packages */ /* system packages */ /* enhanced kernel services */ +/* end of enhanced kernel services */ /* acceleration: Assembly language or algorithmic acceleration packages */ +/* end of acceleration: Assembly language or algorithmic acceleration packages */ /* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ /* Micrium: Micrium software products porting for RT-Thread */ +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ /* peripheral libraries and drivers */ @@ -188,69 +275,94 @@ /* STM32 HAL & SDK Drivers */ +/* end of STM32 HAL & SDK Drivers */ /* Infineon HAL Packages */ +/* end of Infineon HAL Packages */ /* Kendryte SDK */ +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ /* sensors drivers */ +/* end of sensors drivers */ /* touch drivers */ +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ /* AI packages */ +/* end of AI packages */ /* Signal Processing and Control Algorithm Packages */ +/* end of Signal Processing and Control Algorithm Packages */ /* miscellaneous packages */ /* project laboratory */ +/* end of project laboratory */ + /* samples: kernel and components samples */ +/* end of samples: kernel and components samples */ /* entertainment: terminal games and other interesting software packages */ +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ /* Arduino libraries */ /* Projects and Demos */ +/* end of Projects and Demos */ /* Sensors */ +/* end of Sensors */ /* Display */ +/* end of Display */ /* Timing */ +/* end of Timing */ /* Data Processing */ +/* end of Data Processing */ /* Data Storage */ /* Communication */ +/* end of Communication */ /* Device Control */ +/* end of Device Control */ /* Other */ +/* end of Other */ /* Signal IO */ +/* end of Signal IO */ /* Uncategorized */ +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ #define SOC_FAMILY_HT32 #define SOC_SERIES_HT32F5 @@ -261,9 +373,11 @@ #define SOC_KERNEL #define CORTEX_M0 #define SOC_HT32F52352 +/* end of Chip Configuration */ /* Onboard Peripheral Drivers */ +/* end of Onboard Peripheral Drivers */ /* On-chip Peripheral Drivers */ @@ -271,8 +385,10 @@ #define BSP_USING_UART #define BSP_USING_USART1 #define BSP_USING_USART1_NAME "usart1" +/* end of On-chip Peripheral Drivers */ /* Board extended module Drivers */ +/* end of Hardware Drivers Config */ #endif diff --git a/bsp/ht32/ht32f52352/template.uvprojx b/bsp/ht32/ht32f52352/template.uvprojx index 2530ad2a7e3..039f087c175 100644 --- a/bsp/ht32/ht32f52352/template.uvprojx +++ b/bsp/ht32/ht32f52352/template.uvprojx @@ -15,8 +15,8 @@ HT32F52352 Holtek - Holtek.HT32_DFP.1.0.19 - http://mcu.holtek.com.tw/pack + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack IRAM(0x20000000,0x4000) IROM(0x00000000,0x1FE00) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE @@ -332,7 +332,7 @@ 0 0 - + --gnu diff --git a/bsp/ht32/ht32f53252/.ci/attachconfig/ci.attachconfig.yml b/bsp/ht32/ht32f53252/.ci/attachconfig/ci.attachconfig.yml new file mode 100644 index 00000000000..817cf4e3d02 --- /dev/null +++ b/bsp/ht32/ht32f53252/.ci/attachconfig/ci.attachconfig.yml @@ -0,0 +1,18 @@ +devices.strict: + depend_scons_arg: + - '--strict' +devices.gpio: + depends: + - devices.strict + kconfig: + - CONFIG_BSP_USING_GPIO=y +devices.uart: + kconfig: + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_USART1=y +# ------ SEGGER CI ------ +segger: + kconfig: + - CONFIG_BSP_USING_GPIO=y + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_USART1=y \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/.config b/bsp/ht32/ht32f53252/.config new file mode 100644 index 00000000000..7dc7e334d38 --- /dev/null +++ b/bsp/ht32/ht32f53252/.config @@ -0,0 +1,1326 @@ + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=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 is not set +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=512 +# CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +# CONFIG_RT_USING_DEBUG is not set +# CONFIG_RT_USING_CI_ACTION is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +CONFIG_RT_USING_MEMHEAP=y +CONFIG_RT_MEMHEAP_FAST_MODE=y +# CONFIG_RT_MEMHEAP_BEST_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 +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" +CONFIG_RT_VER_NUM=0x50200 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M0=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=1024 +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=1024 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=32 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +# CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_RT_TRACE is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +CONFIG_SOC_FAMILY_HT32=y +CONFIG_SOC_SERIES_HT32F5=y + +# +# Hardware Drivers Config +# + +# +# Chip Configuration +# +CONFIG_SOC_KERNEL=y +CONFIG_CORTEX_M0=y +# CONFIG_CORTEX_M3 is not set +# CONFIG_SOC_HT32F0006 is not set +# CONFIG_SOC_HT32F0008 is not set +# CONFIG_SOC_HT32F50241 is not set +# CONFIG_SOC_HT32F50343 is not set +# CONFIG_SOC_HT32F50441 is not set +# CONFIG_SOC_HT32F50452 is not set +# CONFIG_SOC_HT32F52241 is not set +# CONFIG_SOC_HT32F52244 is not set +# CONFIG_SOC_HT32F52253 is not set +# CONFIG_SOC_HT32F52341 is not set +# CONFIG_SOC_HT32F52352 is not set +# CONFIG_SOC_HT32F52354 is not set +# CONFIG_SOC_HT32F52367 is not set +# CONFIG_SOC_HT32F53241 is not set +CONFIG_SOC_HT32F53252=y +# CONFIG_SOC_HT32F54241 is not set +# CONFIG_SOC_HT32F54253 is not set +# CONFIG_SOC_HT32F57341 is not set +# CONFIG_SOC_HT32F57352 is not set +# CONFIG_SOC_HT32F5828 is not set +# CONFIG_SOC_HT32F59041 is not set +# CONFIG_SOC_HT32F59741 is not set +# CONFIG_SOC_HT32F61141 is not set +# CONFIG_SOC_HT32F61245 is not set +# CONFIG_SOC_HT32F61355 is not set +# CONFIG_SOC_HT32F61356 is not set +# CONFIG_SOC_HT32F61357 is not set +# CONFIG_SOC_HT32F61641 is not set +# CONFIG_SOC_HT32F65240 is not set +# CONFIG_SOC_HT32F67051 is not set +# CONFIG_SOC_HT32F67741 is not set +# end of Chip Configuration + +# +# Onboard Peripheral Drivers +# +# CONFIG_BSP_USING_TEST is not set +# end of Onboard Peripheral Drivers + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +# CONFIG_BSP_USING_USART0 is not set +CONFIG_BSP_USING_USART1=y +CONFIG_BSP_USING_USART1_NAME="usart1" +# CONFIG_BSP_USING_UART0 is not set +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2C is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_USBD is not set +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/ht32/ht32f53252/Kconfig b/bsp/ht32/ht32f53252/Kconfig new file mode 100644 index 00000000000..73238d3a13b --- /dev/null +++ b/bsp/ht32/ht32f53252/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/ht32/ht32f53252/README.md b/bsp/ht32/ht32f53252/README.md new file mode 100644 index 00000000000..e35b8f00b31 --- /dev/null +++ b/bsp/ht32/ht32f53252/README.md @@ -0,0 +1,108 @@ +# HT32F53252 BSP 说明 + +## 简介 + +ESK32-30522是合泰基于HT32F53252芯片并针对Cortex®-M0+入门而设计的评估板。本文档是为ESK32-30522开发板提供的BSP(板级支持包)说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。 + +## 开发板介绍 + +ESK32-30522使用32位Arm® Cortex®-M0+高性能、低功耗单片机HT32F53252,针对Cortex®-M0+入门而设计。开发板外观如下图所示: + +![board.png](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:HT32F53252,主频 60MHz,128KB FLASH ,16KB SRAM +- 常用外设 + - LED:2个,(绿色,PC14、PC15) +- 常用接口:USB 转串口 、USB SLAVE +- 调试接口:板载的 e-Link32 Lite SWD 下载 + +开发板更多详细信息请参考合泰官网的相关文档[ESK32-30522](https://www.holtek.com.cn/page/detail/dev_kit/ESK32-30522)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :--- | :---: | :--- | +| USB 转串口 | 支持 | 使用 USART1 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1...PD3 ---> PIN: 0, 1...51 | +| USART | 支持 | USART0/1 | +| UART | 支持 | UART0/1 | +| SPI | 支持 | SPI0/1 | +| I2C | 支持 | 硬件 I2C0/1 | +| ADC | 暂不支持 | | +| WDT | 暂不支持 | | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多片上资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为仅为开发者提供MDK5的工程。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线通过板载的 e-Link32 Lite将芯片连接到 PC。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 注:工程默认配置使用CMSIS-DAP下载方式,在通过 e-Link32 Lite 连接开发板的基础上,点击下载按钮即可下载程序到开发板。 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,LED1和LED2交替闪烁。 + +连接开发板对应串口到 PC(也可以通过e-Link32 Lite的模拟串口将开发板连接到PC), 在终端工具里调整好串口配置(115200-8-1-N)并打开相应的串口,复位设备后,可以看到 RT-Thread 的输出信息: + +> 注:由于RT-Thread的finsh控制台使用的是命令行的输入形式,推荐使用串口调试工具如:Tabby terminal 或者 Tera Term。 + +```bash + \ | / +- RT - Thread Operating System + / | \ 5.1.0 build Apr 10 2024 14:39:43 + 2006 - 2024 Copyright by RT-Thread team +msh > +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 USART1 的功能,如果需使用更多的片上资源,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`scons --target=mdk5` 命令重新生成工程。 + +## 注意事项 + +开发板和芯片的相关资料可以在[合泰官网](https://www.holtek.com.cn/page/index)进行查找和下载,如芯片的数据手册和开发使用手册、开发板的原理图、Keil_v5的pack安装包等。 + +## 联系人信息 + +维护人: + +- [QT-one](https://github.com/QT-one) \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/SConscript b/bsp/ht32/ht32f53252/SConscript new file mode 100644 index 00000000000..682f94215ca --- /dev/null +++ b/bsp/ht32/ht32f53252/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os #包含os库 +Import('RTT_ROOT') #导入RTT_ROOT对象(RTT_ROOT代表的是RT-Thread源码包) +from building import * #把building模块的所有内容都导入到当前模块中 + +cwd = GetCurrentDir() #获取当前路径,并将该路径信息保存到变量cwd中 +objs = [] #创建一个list型变量objs +list = os.listdir(cwd) #得到当前目录下的所有子目录,并保存到变量list中 + +for d in list: #for循环用d记录循环的次数,直到寻遍所有路径 + path = os.path.join(cwd, d) #根据d获取到不同的路径 + if os.path.isfile(os.path.join(path, 'SConscript')): #如果该路径下存在名为SConscript的文件 + objs = objs + SConscript(os.path.join(d, 'SConscript')) #将路径中SConscript文件内的源码读取到objs中 + +Return('objs') #将objs返回出去 diff --git a/bsp/ht32/ht32f53252/SConstruct b/bsp/ht32/ht32f53252/SConstruct new file mode 100644 index 00000000000..26ac123a476 --- /dev/null +++ b/bsp/ht32/ht32f53252/SConstruct @@ -0,0 +1,63 @@ +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 = 'rt-thread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == '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) + +ht32_library = 'HT32_STD_5xxxx_FWLib' +rtconfig.BSP_LIBRARY_TYPE = ht32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, ht32_library, 'SConscript'))) + +# include usb libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'usbd_library', 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'ht32_drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/ht32/ht32f53252/applications/SConscript b/bsp/ht32/ht32f53252/applications/SConscript new file mode 100644 index 00000000000..395a1202900 --- /dev/null +++ b/bsp/ht32/ht32f53252/applications/SConscript @@ -0,0 +1,26 @@ +#导入其他模块的变量 +Import('RTT_ROOT') +Import('rtconfig') + +#导入使用到的模块 +from building import * + +#获取当前目录的路径 +cwd = GetCurrentDir() + +#创建一个列表,用于保存需要使用到的C文件路径 +#src = Glob('*.c') +src = Split(""" +main.c +""") +if GetDepend(['BSP_USING_TEST']): + src += ['test.c'] + +#创建一个列表,用于保存需要包含的H文件路径 +path = [cwd] + +#创建一个组别 +group = DefineGroup('Applications', src, depend = [''], CPPPATH = path) + +#返回创建好的组别 +Return('group') \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/applications/main.c b/bsp/ht32/ht32f53252/applications/main.c new file mode 100644 index 00000000000..8e5d2d47c6a --- /dev/null +++ b/bsp/ht32/ht32f53252/applications/main.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#include +#include +#include "board.h" + +/* defined the led1 pin: pc14 */ +#define LED1_PIN GET_PIN(C, 14) +/* defined the led2 pin: pc15 */ +#define LED2_PIN GET_PIN(C, 15) + +int main(void) +{ + rt_uint32_t speed = 200; + /* set led1 pin mode to output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + /* set led2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (1) + { + rt_pin_write(LED1_PIN, PIN_LOW); + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(speed); + rt_pin_write(LED1_PIN, PIN_HIGH); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(speed); + } +} diff --git a/bsp/ht32/ht32f53252/applications/test.c b/bsp/ht32/ht32f53252/applications/test.c new file mode 100644 index 00000000000..894f7a18983 --- /dev/null +++ b/bsp/ht32/ht32f53252/applications/test.c @@ -0,0 +1,941 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-06-17 QT-one first version + */ + +#include "board.h" + +#ifdef BSP_USING_TEST + +/* Task stack */ +#define THREAD_PRIORITY 25 +#define THREAD_STACK_SIZE 512 +#define THREAD_TIMESLICE 5 + +/* Test pins */ +#define TEST_LED0_PIN GET_PIN(C, 14) +#define TEST_LED1_PIN GET_PIN(C, 15) +#define TEST_LED2_PIN GET_PIN(C, 1) + +#define TEST_WAKEUP_PIN GET_PIN(B, 12) +#define TEST_KEY1_PIN GET_PIN(D, 1) +#define TEST_KEY2_PIN GET_PIN(D, 2) + +#define TEST_OTHER_PIN GET_PIN(B, 12) +#define TEST_OUTPUT_PIN GET_PIN(C, 1) + +#define TEST_INPUT_PIN GET_PIN(D, 1) +#define TEST_INT_PIN GET_PIN(D, 2) +#define TEST_RES_PIN GET_PIN(C, 1) + + +/* Event flags */ +#define TEST_GPIO_INT_ENV (1 << 10) +#define TEST_GPIO_KEY_ENV (1 << 15) +static struct rt_event led_event; /* LED event */ +#define TASK_KILL_FLAG (1 << 10) +static struct rt_event task_event; /* Task event */ + +/* EEPROM Read/Write Data Structure */ +typedef union +{ + rt_uint8_t data[30]; + struct + { + rt_uint8_t write_addr; + char write_date[29]; + }in_data; +}eeprom_write_type; +/* Semaphore variables */ +static struct rt_semaphore rx_sem; + +/* Mutually exclusive variables */ +static rt_mutex_t task_mutex = RT_NULL; /* task mutex */ + +/* device handle */ +#ifdef BSP_USING_UART +static rt_device_t serial; +#endif +#ifdef BSP_USING_WDT +static rt_device_t wdt_dev; +#endif +#ifdef BSP_USING_I2C +static struct rt_i2c_bus_device *i2c_dev; +#endif +#ifdef BSP_USING_SPI +static struct rt_spi_device *spi_dev; +#endif + +/* In-file function declarations */ +//static void sys_run_dir(void *parameter); +//static void gpio_output_test(void *parameter); +//static void gpio_input_test(void *parameter); +//static void key_iqr_handle(void *args); + +/* Task registration */ +int task_registration(void) +{ +// USB_Configuration(RT_NULL); + /* Create a dynamic mutex */ + task_mutex = rt_mutex_create("task_mutex", RT_IPC_FLAG_FIFO); + if (task_mutex == RT_NULL) + { + rt_kprintf("rt_mutex_create error.\n"); + return -1; + } + /* Create a task event */ + if(rt_event_init(&task_event,"task_event",RT_IPC_FLAG_FIFO) != RT_EOK) + { + rt_kprintf("rt_mutex_create error.\n"); + return -1; + } + return 0; +} +INIT_BOARD_EXPORT(task_registration); + +/* System operation indicator */ +#ifdef BSP_USING_GPIO +static void sys_run_dir(void *parameter) +{ + rt_uint32_t e; + rt_pin_mode(TEST_LED2_PIN, PIN_MODE_OUTPUT); + while(1) + { + if(rt_event_recv(&task_event,TASK_KILL_FLAG, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, &e) == RT_EOK) + { + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + rt_pin_write(TEST_LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + rt_pin_write(TEST_LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + } +} + +static int sys_run_task(int argc, char *argv[]) +{ + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK) + { + rt_kprintf("The test thread is occupied.\n"); + return -RT_ERROR; + } + else + { + /* Register the system indicator task */ + rt_thread_t sys_led_task = rt_thread_create("sys_led_task", + sys_run_dir, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (sys_led_task != RT_NULL) + rt_thread_startup(sys_led_task); + rt_kprintf("The sys run task is registered.\n"); + } + } + else if(rt_strcmp(argv[1],"end") == 0) + { + rt_event_send(&task_event,TASK_KILL_FLAG); + rt_mutex_release(task_mutex); + rt_kprintf("The sys run task has been deleted.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(sys_run_task, sys run task operation); + +/* Gpio output test */ +static void gpio_output_test(void *parameter) +{ + rt_uint32_t e; + rt_pin_mode(TEST_OUTPUT_PIN, PIN_MODE_OUTPUT); + while(1) + { + if(rt_event_recv(&task_event,TASK_KILL_FLAG, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, &e) == RT_EOK) + { + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + rt_pin_write(TEST_OUTPUT_PIN, PIN_LOW); + rt_thread_mdelay(500); + rt_pin_write(TEST_OUTPUT_PIN, PIN_HIGH); + rt_thread_mdelay(500); + } +} + +static int gpio_output_task(int argc, char *argv[]) +{ + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK) + { + rt_kprintf("The test thread is occupied.\n"); + return -RT_ERROR; + } + else + { + /* Gpio output test tasks */ + rt_thread_t gpio_output_task = rt_thread_create("gpio_output_task", + gpio_output_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (gpio_output_task != RT_NULL) + rt_thread_startup(gpio_output_task); + rt_kprintf("The gpio output task is registered.\n"); + } + } + else if(rt_strcmp(argv[1],"end") == 0) + { + rt_event_send(&task_event,TASK_KILL_FLAG); + rt_mutex_release(task_mutex); + rt_kprintf("The gpio output task has been deleted.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(gpio_output_task, gpio output task operation); +/* Gpio input test */ +static void key_iqr_handle(void *args) +{ + /* gpio iqr fun */ + rt_event_send(&led_event,TEST_GPIO_INT_ENV); +} + +static void gpio_input_test(void *parameter) +{ + uint8_t led_flag = PIN_LOW; + rt_uint32_t e; + + rt_pin_mode(TEST_RES_PIN, PIN_MODE_OUTPUT); + rt_pin_write(TEST_RES_PIN, PIN_LOW); + + rt_pin_mode(TEST_WAKEUP_PIN,PIN_MODE_INPUT_PULLDOWN); + rt_pin_mode(TEST_INPUT_PIN,PIN_MODE_INPUT_PULLUP); + + rt_pin_attach_irq(TEST_INT_PIN,PIN_IRQ_MODE_FALLING,key_iqr_handle,RT_NULL); + rt_pin_irq_enable(TEST_INT_PIN,PIN_IRQ_ENABLE); + + if(rt_event_init(&led_event,"led_event",RT_IPC_FLAG_FIFO) != RT_EOK) + { + rt_kprintf("rt_mutex_create error.\n"); + } + while(1) + { + if(PIN_LOW == rt_pin_read(TEST_INPUT_PIN)) + { + while(PIN_LOW == rt_pin_read(TEST_INPUT_PIN)); + rt_event_send(&led_event,TEST_GPIO_KEY_ENV); + } + if(rt_event_recv(&led_event,(TEST_GPIO_INT_ENV|TEST_GPIO_KEY_ENV), + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, &e) == RT_EOK) + { + led_flag = (led_flag == PIN_LOW)?PIN_HIGH:PIN_LOW; + rt_pin_write(TEST_RES_PIN, led_flag); + } + if(rt_event_recv(&task_event,TASK_KILL_FLAG, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, &e) == RT_EOK) + { + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + } +} + +static int gpio_input_task(int argc, char *argv[]) +{ + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + if(rt_mutex_take(task_mutex, RT_WAITING_NO) != RT_EOK) + { + rt_kprintf("The test thread is occupied.\n"); + return -RT_ERROR; + } + /* Gpio input test tasks */ + rt_thread_t gpio_input_task = rt_thread_create("gpio_input_task", + gpio_input_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (gpio_input_task != RT_NULL) + rt_thread_startup(gpio_input_task); + rt_kprintf("The gpio input task is registered.\n"); + } + else if(rt_strcmp(argv[1],"end") == 0) + { + rt_event_send(&task_event,TASK_KILL_FLAG); + rt_mutex_release(task_mutex); + rt_kprintf("The gpio input task has been deleted.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(gpio_input_task, gpio input task operation); +#endif +/* uart test */ +#ifdef BSP_USING_UART +static rt_err_t uart_iqr_handle(rt_device_t dev, rt_size_t size) +{ + /* Serial port callback function */ + rt_sem_release(&rx_sem); + return RT_EOK; +} + +static void uart_thread(void *parameter) +{ + char ch; + while (1) + { + /* Serial port readout */ + while (rt_device_read(serial, -1, &ch, 1) != 1) + { + /* semaphore blocking */ + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + } + /* Output the data obtained from the serial port */ + rt_device_write(serial, 0, &ch, 1); + rt_device_write(serial,0,"\n",1); + } +} + +static int uart_task(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + + char uart_name[RT_NAME_MAX] = "uart1"; + char str[] = "hello RT-Thread!\r\n"; + if (argc == 3) + { + if(rt_strcmp(argv[2],"start") == 0) + { + rt_strncpy(uart_name, argv[1], RT_NAME_MAX); + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else + { + rt_kprintf("Incomplete instruction.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start/end\n",__func__); + rt_kprintf("or\n"); + rt_kprintf("%s start/end\n",__func__); + return -1; + } + /* Find Serial Devices */ + serial = rt_device_find(uart_name); + if (!serial) + { + rt_kprintf("find %s failed!\n", uart_name); + return -RT_ERROR; + } + /* Initializing a Signal */ + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + /* Open the serial device with read/write and interrupt reception. */ + rt_device_open(serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); + /* Setting the receive callback function */ + rt_device_set_rx_indicate(serial, uart_iqr_handle); + /* Send String */ + rt_device_write(serial, 0, str, (sizeof(str) - 1)); + /* Creating a serial thread */ + rt_thread_t thread = rt_thread_create("serial", + uart_thread, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (thread != RT_NULL) + rt_thread_startup(thread); + + return ret; +} +MSH_CMD_EXPORT(uart_task, uart device sample); +#endif +/* hw/sw iic test */ +#ifdef BSP_USING_I2C +static void i2c_thread(void *parameter) +{ + uint8_t write_addr = 0x00; + eeprom_write_type eeprom_date; + char send_dat[] = "i2c write eeprom"; + char read_dat[20] = {0}; + struct rt_i2c_msg msg1[2]; + + eeprom_date.in_data.write_addr = write_addr; + rt_strncpy(eeprom_date.in_data.write_date, send_dat, rt_strlen(send_dat)); + + msg1[0].addr = 0x51; + msg1[0].flags = RT_I2C_WR; + msg1[0].buf = eeprom_date.data; + msg1[0].len = (rt_strlen(send_dat) + 1); + if (rt_i2c_transfer(i2c_dev, msg1, 1) == 1) + { + rt_kprintf("eeprom write succeed!\n"); + rt_kprintf("write_dat = %s\r\n",send_dat); + } + else + { + rt_kprintf("eeprom write error!\n"); + } + msg1[0].addr = 0x51; + msg1[0].flags = RT_I2C_WR; + msg1[0].buf = &write_addr; + msg1[0].len = 1; + + msg1[1].addr = 0x51; + msg1[1].flags = RT_I2C_RD; + msg1[1].buf = (uint8_t *)read_dat; + msg1[1].len = rt_strlen(send_dat); + + if (rt_i2c_transfer(i2c_dev, msg1, 2) == 2) + { + rt_kprintf("eeprom read succeed!\n"); + rt_kprintf("read_dat = %s\r\n",read_dat); + } + else + { + rt_kprintf("eeprom read error!\n"); + } +} + +static int i2c_task(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + + char i2c_name[RT_NAME_MAX] = "hw_i2c1"; + if (argc == 3) + { + if(rt_strcmp(argv[2],"start") == 0) + { + rt_strncpy(i2c_name, argv[1], RT_NAME_MAX); + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else + { + rt_kprintf("Incomplete instruction.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start/end\n",__func__); + rt_kprintf("or\n"); + rt_kprintf("%s start/end\n",__func__); + return -1; + } + /* Find I2C Devices */ + i2c_dev = (struct rt_i2c_bus_device *)rt_device_find(i2c_name); + if (!i2c_dev) + { + rt_kprintf("find %s failed!\n", i2c_name); + return -RT_ERROR; + } + /* Execute I2C read/write eeprom function */ + i2c_thread(RT_NULL); + return ret; +} +MSH_CMD_EXPORT(i2c_task, i2c device sample); +#endif +/* spi test */ +#ifdef BSP_USING_SPI +static void spi_thread(void *parameter) +{ + rt_uint8_t w25x_read_id = 0x9F; + rt_uint8_t id[5] = {0}; + + /* Use rt_spi_send_then_recv() to send commands to read IDs */ + rt_spi_take_bus(spi_dev); + rt_spi_take(spi_dev); + rt_spi_send_then_recv(spi_dev, &w25x_read_id, 1, id, 3); + rt_spi_release(spi_dev); + rt_spi_release_bus(spi_dev); + rt_kprintf("use rt_spi_send_then_recv() read MX25L6406 ID is:0x%X%X%X\n", id[0], id[1], id[2]); +} + +static int spi_task(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + struct rt_spi_configuration cfg; + char spi_name[RT_NAME_MAX] = "spi1"; + char flash_name[RT_NAME_MAX] = "flash"; + + if (argc == 3) + { + if(rt_strcmp(argv[2],"start") == 0) + { + rt_strncpy(spi_name, argv[1], RT_NAME_MAX); + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + } + else + { + rt_kprintf("Incomplete instruction.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start/end\n",__func__); + rt_kprintf("or\n"); + rt_kprintf("%s start/end\n",__func__); + return -1; + } + /* Binding CS pin */ + ret = rt_hw_spi_device_attach(spi_name,flash_name,HT_GPIOD,GPIO_PIN_0); + if(ret != RT_EOK) + { + rt_kprintf("Failed CS pin binding for %s!\n", spi_name); + return -RT_ERROR; + } + /* Find flash devices */ + spi_dev = (struct rt_spi_device*)rt_device_find(flash_name); + if (!spi_dev) + { + rt_kprintf("find %s failed!\n", spi_name); + return -RT_ERROR; + } + /* Configuring the SPI Bus */ + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB; + cfg.max_hz = 8; + rt_spi_configure(spi_dev,&cfg); + rt_kprintf("SPI0 initialization succeeded!\n"); + + /* Execute flash read and write functions */ + spi_thread(RT_NULL); + rt_device_unregister((rt_device_t)spi_dev); + return ret; +} +MSH_CMD_EXPORT(spi_task, spi device sample); +#endif +/* adc test */ +#ifdef BSP_USING_ADC +static void adc_test(void *parameter) +{ + rt_uint32_t adc0_ch6_val,adc0_ch7_val; + rt_adc_device_t adc_dev = (rt_adc_device_t)rt_device_find("adc0"); + if (!adc_dev) + { + rt_kprintf("No ADC0 device found!\n"); + } + else + { + rt_adc_enable(adc_dev,ADC_CH_6); + rt_adc_enable(adc_dev,ADC_CH_7); + } + while(1) + { + adc0_ch6_val = rt_adc_read(adc_dev,6); + adc0_ch7_val = rt_adc_read(adc_dev,7); + rt_kprintf("adc0_ch6_val = %d\n",adc0_ch6_val); + rt_kprintf("adc0_ch7_val = %d\n",adc0_ch7_val); + rt_thread_mdelay(50); + } +} + +static int adc_task(int argc, char *argv[]) +{ + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Adc test tasks */ + rt_thread_t adc_task = rt_thread_create("adc_task", + adc_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (adc_task != RT_NULL) + rt_thread_startup(adc_task); + rt_kprintf("The adc task is registered.\n"); + } + else if(rt_strcmp(argv[1],"end") == 0) + { + rt_event_send(&task_event,TASK_KILL_FLAG); + rt_kprintf("The adc task has been deleted.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s end\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(adc_task, adc task operation); +#endif +/* wdt test */ +#ifdef BSP_USING_WDT +static void wdt_test(void) +{ + rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); +} + +static int wdt_task(int argc, char *argv[]) +{ + rt_err_t ret = -RT_ERROR; + rt_uint16_t wdt_time = 5; + char dev_name[] = "wdt"; + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Find wdt devices */ + wdt_dev = rt_device_find(dev_name); + if(wdt_dev == RT_NULL) + { + rt_kprintf("No corresponding equipment found.\n"); + return -1; + } + /* Configuring the Watchdog */ + ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &wdt_time); + if(ret != RT_EOK) + { + rt_kprintf("wdt configuration failed.\n"); + return -1; + } + /* Start the Watchdog */ + ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); + if(ret != RT_EOK) + { + rt_kprintf("wdt start failed.\n"); + return -1; + } + /* Setting up idle threads */ + rt_thread_idle_sethook(wdt_test); + rt_kprintf("Watchdog started successfully.\n"); + } + else if(rt_strcmp(argv[1],"stop") == 0) + { + /* Verify device handle */ + if(wdt_dev == RT_NULL) + { + rt_kprintf("Device handle does not exist.\n"); + return -1; + } + /* Stop the Watchdog */ + ret = rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_STOP, RT_NULL); + if(ret != RT_EOK) + { + rt_kprintf("wdt start failed.\n"); + return -1; + } + /* Hook function to delete idle threads */ + rt_thread_idle_delhook(wdt_test); + rt_kprintf("Watchdog has stopped.\n"); + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s stop\n",__func__); + return -1; + } + return -1; +} +MSH_CMD_EXPORT(wdt_task, wdt task operation); +#endif +/* usbd test */ +#ifdef BSP_USING_USBD +static void usbd_test(void *parameter) +{ + rt_device_t dev = RT_NULL; + char dev_name[] = "vcom"; + char buf[] = "usbd vcom test!\r\n"; + + dev = rt_device_find(dev_name); + + if (dev) + { + rt_device_open(dev, RT_DEVICE_FLAG_RDWR); + } + else + { + rt_kprintf("Device with name %s not found.\n",dev_name); + rt_thread_t tid = rt_thread_self(); + rt_thread_delete(tid); + } + while (1) + { + rt_device_write(dev, 0, buf, rt_strlen(buf)); + rt_thread_mdelay(500); + } +} + +static int usbd_task(int argc, char *argv[]) +{ + rt_err_t ret = -RT_ERROR; + + if(argc == 2) + { + if(rt_strcmp(argv[1],"start") == 0) + { + /* Gpio input test tasks */ + rt_thread_t usbd_vcom_task = rt_thread_create("usbd_vcom_task", + usbd_test, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + if (usbd_vcom_task != RT_NULL) + { + rt_thread_startup(usbd_vcom_task); + rt_kprintf("The usbd vcom task is registered.\n"); + } + else + { + rt_kprintf("usbd vcom task registration failed.\n"); + } + ret = RT_EOK; + } + else if(rt_strcmp(argv[1],"stop") == 0) + { + ret = RT_EOK; + } + } + else + { + rt_kprintf("Necessary parameters are missing.\n"); + rt_kprintf("You can use the following commands.\n"); + rt_kprintf("%s start\n",__func__); + rt_kprintf("%s stop\n",__func__); + } + return ret; +} +MSH_CMD_EXPORT(usbd_task, usbd task operation); + +#endif /* BSP_USING_USBD */ + +#ifdef BSP_USING_CAN + +#define CAN_DEV_NAME BSP_USING_CAN_NAME + +static struct rt_semaphore rx_sem; +static rt_device_t can_dev; + +static rt_err_t can_rx_call(rt_device_t dev, rt_size_t size) +{ + rt_sem_release(&rx_sem); + return RT_EOK; +} +static rt_err_t can_tx_data(void) +{ + struct rt_can_msg msg = {0}; + rt_size_t size; + + msg.id = 0x540; + msg.ide = RT_CAN_STDID; + msg.rtr = RT_CAN_DTR; + msg.len = 8; + + msg.data[0] = 0x00; + msg.data[1] = 0x01; + msg.data[2] = 0x02; + msg.data[3] = 0x03; + msg.data[4] = 0x04; + msg.data[5] = 0x05; + msg.data[6] = 0x06; + msg.data[7] = 0x07; + + size = rt_device_write(can_dev, 0, &msg, sizeof(msg)); + if (size == 0) + { + rt_kprintf("can dev write data failed!\n"); + } + return 0; +} + +static void can_rx_thread(void *parameter) +{ + int i; + rt_size_t size; + rt_uint8_t send_cut = 0; + struct rt_can_msg rxmsg = {0}; + + /* Setting the receive callback function */ + rt_device_set_rx_indicate(can_dev, can_rx_call); + + /* Setting the Hardware Filter Table */ + struct rt_can_filter_item items[1] = + { /* id ide rtr mode mask */ + RT_CAN_FILTER_ITEM_INIT(0x541, RT_CAN_STDID, RT_CAN_DTR, 0, 0x7ff), + }; + struct rt_can_filter_config cfg = {1, 1, items}; + rt_device_control(can_dev, RT_CAN_CMD_SET_FILTER, &cfg); + + can_tx_data(); + while (1) + { + + rxmsg.hdr_index = -1; + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + rt_device_read(can_dev, 0, &rxmsg, sizeof(rxmsg)); + + rt_kprintf("ID:%x ", rxmsg.id); + for (i = 0; i < 8; i++) + { + rt_kprintf(" %2x", rxmsg.data[i]); + rxmsg.data[i] += 1; + } + rt_kprintf(" \n"); + rxmsg.id = 0x540; + rxmsg.ide = RT_CAN_STDID; + rxmsg.rtr = RT_CAN_DTR; + rxmsg.len = 8; + rt_thread_mdelay(1000); + if(send_cut < 10) + { + size = rt_device_write(can_dev, 0, &rxmsg, sizeof(rxmsg)); + send_cut++; + if (size == 0) + { + rt_kprintf("can dev write data failed!\n"); + } + } + } +} + +int can_test(int argc, char *argv[]) +{ + rt_err_t res; + rt_thread_t thread; + char can_name[RT_NAME_MAX]; + + if (argc == 2) + { + rt_strncpy(can_name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(can_name, CAN_DEV_NAME, RT_NAME_MAX); + } + + /* Find a CAN Device */ + can_dev = rt_device_find(can_name); + if (!can_dev) + { + rt_kprintf("find %s failed!\n", can_name); + return -RT_ERROR; + } + + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + + res = rt_device_open(can_dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX); + RT_ASSERT(res == RT_EOK); + + res = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD, (void *)CAN500kBaud); + RT_ASSERT(res == RT_EOK); + + thread = rt_thread_create("can_rx", can_rx_thread, RT_NULL, 1024, 25, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + rt_kprintf("create can_rx thread failed!\n"); + } + + return res; +} + +MSH_CMD_EXPORT(can_test, can device sample); + +#endif /* BSP_USING_CAN */ + +#endif /* BSP_USING_TEST */ diff --git a/bsp/ht32/ht32f53252/board/Kconfig b/bsp/ht32/ht32f53252/board/Kconfig new file mode 100644 index 00000000000..8ba20cd72d2 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/Kconfig @@ -0,0 +1,449 @@ +menu "Hardware Drivers Config" + +menu "Chip Configuration" + config SOC_KERNEL + bool + select SOC_SERIES_HT32F5 if CORTEX_M0 + select SOC_SERIES_HT32F1 if CORTEX_M3 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + choice + prompt "Select the kernel" + default CORTEX_M0 + config CORTEX_M0 + bool "CORTEX_M0" + config CORTEX_M3 + bool "CORTEX_M3" + endchoice + + choice + prompt "Select the chip you are using" + depends on CORTEX_M0 + default HT32F52352 + config SOC_HT32F0006 + bool "HT32F0006" + config SOC_HT32F0008 + bool "HT32F0008" + config SOC_HT32F50241 + bool "HT32F50241" + config SOC_HT32F50343 + bool "HT32F50343" + config SOC_HT32F50441 + bool "HT32F50441" + config SOC_HT32F50452 + bool "HT32F50452" + config SOC_HT32F52241 + bool "HT32F52241" + config SOC_HT32F52244 + bool "HT32F52244" + config SOC_HT32F52253 + bool "HT32F52253" + config SOC_HT32F52341 + bool "HT32F52341" + config SOC_HT32F52352 + bool "HT32F52352" + config SOC_HT32F52354 + bool "HT32F52354" + config SOC_HT32F52367 + bool "HT32F52367" + config SOC_HT32F53241 + bool "HT32F53241" + config SOC_HT32F53252 + bool "HT32F53252" + config SOC_HT32F54241 + bool "HT32F54241" + config SOC_HT32F54253 + bool "HT32F54253" + config SOC_HT32F57341 + bool "HT32F57341" + config SOC_HT32F57352 + bool "HT32F57352" + config SOC_HT32F5828 + bool "HT32F5828" + config SOC_HT32F59041 + bool "HT32F59041" + config SOC_HT32F59741 + bool "HT32F59741" + config SOC_HT32F61141 + bool "HT32F61141" + config SOC_HT32F61245 + bool "HT32F61245" + config SOC_HT32F61355 + bool "HT32F61355" + config SOC_HT32F61356 + bool "HT32F61356" + config SOC_HT32F61357 + bool "HT32F61357" + config SOC_HT32F61641 + bool "HT32F61641" + config SOC_HT32F65240 + bool "HT32F65240" + config SOC_HT32F67051 + bool "HT32F67051" + config SOC_HT32F67741 + bool "HT32F67741" + endchoice + + choice + prompt "Select the chip you are using" + depends on CORTEX_M3 + default HT32F52352 + config SOC_HT32F1654 + bool "HT32F1654" + config SOC_HT32F1656 + bool "HT32F1656" + config SOC_HT32F12345 + bool "HT32F12345" + config SOC_HT32F12364 + bool "HT32F12364" + config SOC_HT32F12366 + bool "HT32F12366" + endchoice +endmenu + +menu "Onboard Peripheral Drivers" + + config BSP_USING_TEST + bool "Enable test" + default n + + if RT_USING_CONSOLE + config RT_CONSOLE_DEVICE_NAME + string "the device name for console" + default "usart1" + endif + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN if BSP_USING_GPIO + default n + + menuconfig BSP_USING_UART + bool "Enable UART" + default n + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_USART0 + bool "Enable USART0" + default n + config BSP_USING_USART0_NAME + depends on BSP_USING_USART0 + string "usart0 bus name" + default "usart0" + + config BSP_USING_USART1 + bool "Enable USART1" + default n + config BSP_USING_USART1_NAME + depends on BSP_USING_USART1 + string "usart1 bus name" + default "usart1" + + config BSP_USING_UART0 + bool "Enable UART0" + default n + config BSP_USING_UART0_NAME + depends on BSP_USING_UART0 + string "uart0 bus name" + default "uart0" + + config BSP_USING_UART1 + bool "Enable UART1" + default n + config BSP_USING_UART1_NAME + depends on BSP_USING_UART1 + string "uart1 bus name" + default "uart1" + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI Bus" + default n + select RT_USING_SPI if BSP_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI0 + bool "Enable SPI0 Bus" + default n + config BSP_USING_SPI0_NAME + depends on BSP_USING_SPI0 + string "spi0 bus name" + default "spi0" + + config BSP_USING_SPI1 + bool "Enable SPI1 Bus" + default n + config BSP_USING_SPI1_NAME + depends on BSP_USING_SPI1 + string "spi1 bus name" + default "spi1" + endif + + menuconfig BSP_USING_I2C + bool "Enable I2C Bus" + default n + if BSP_USING_I2C + menuconfig BSP_USING_I2C_HW + bool "Enable I2C Bus(hardware)" + default n + select RT_USING_I2C if BSP_USING_I2C_HW + if BSP_USING_I2C_HW + config BSP_USING_I2C0_HW + bool "Enable Hardware I2C0 Bus" + default n + config BSP_USING_I2C0_HW_NAME + depends on BSP_USING_I2C0_HW + string "hardware i2c0 name" + default "hw_i2c0" + + config BSP_USING_I2C1_HW + bool "Enable Hardware I2C1 Bus" + default n + config BSP_USING_I2C1_HW_NAME + depends on BSP_USING_I2C1_HW + string "hardware i2c1 name" + default "hw_i2c1" + endif + + menuconfig BSP_USING_I2C_SW + bool "Enable I2C Bus(software)" + default n + select BSP_USING_GPIO if BSP_USING_I2C_SW + select RT_USING_I2C if BSP_USING_I2C_SW + + if BSP_USING_I2C_SW + config BSP_USING_I2C0_SW + bool "Enable Software I2C0 Bus" + default n + config BSP_USING_I2C0_SW_NAME + depends on BSP_USING_I2C0_SW + string "software i2c0 name" + default "sw_i2c0" + if BSP_USING_I2C0_SW + config BSP_I2C0_SLC_PIN + int "i2c0 slc pin number" + range 0 51 + default 22 + + config BSP_I2C0_SDA_PIN + int "i2c0 sda pin number" + range 0 51 + default 23 + endif + + config BSP_USING_I2C1_SW + bool "Enable Software I2C1 Bus" + default n + config BSP_USING_I2C1_SW_NAME + depends on BSP_USING_I2C1_SW + string "software i2c1 name" + default "sw_i2c1" + if BSP_USING_I2C1_SW + config BSP_I2C1_SLC_PIN + int "i2c1 slc pin number" + range 0 51 + default 24 + + config BSP_I2C1_SDA_PIN + int "i2c1 sda pin number" + range 0 51 + default 25 + endif + + config BSP_USING_I2C2_SW + bool "Enable Software I2C2 Bus" + default n + config BSP_USING_I2C2_SW_NAME + depends on BSP_USING_I2C2_SW + string "software i2c2 name" + default "sw_i2c2" + if BSP_USING_I2C2_SW + config BSP_I2C2_SLC_PIN + int "i2c2 slc pin number" + range 0 51 + default 26 + + config BSP_I2C2_SDA_PIN + int "i2c2 sda pin number" + range 0 51 + default 27 + endif + endif + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC if BSP_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC0 + bool "Enable ADC0" + default n + config BSP_USING_ADC0_NAME + depends on BSP_USING_ADC0 + string "adc0 device name" + default "adc0" + + config BSP_USING_ADC1 + bool "Enable ADC1" + depends on SOC_HT32F65240 + default n + config BSP_USING_ADC1_NAME + depends on BSP_USING_ADC1 + string "adc1 device name" + default "adc1" + endif + + menuconfig BSP_USING_WDT + bool "Enable WDT" + default n + select RT_USING_WDT if BSP_USING_WDT + config BSP_USING_WDT_NAME + depends on BSP_USING_WDT + string "wdt device name" + default "wdt" + + menuconfig BSP_USING_CAN + bool "Enable CAN" + depends on SOC_HT32F53241 || SOC_HT32F53242 || SOC_HT32F53252 + default n + select RT_USING_CAN if BSP_USING_CAN + config BSP_USING_CAN_NAME + depends on BSP_USING_CAN + string "can device name" + default "can" + if BSP_USING_CAN + config CAN_DEFAULT_BASE_CONFIGURATION + choice + prompt "Default CAN baud rate" + default BSP_USING_CAN500kBaud + config BSP_USING_CAN1MBaud + bool "CAN1MBaud" + config BSP_USING_CAN800kBaud + bool "CAN800kBaud" + config BSP_USING_CAN500kBaud + bool "CAN500kBaud" + config BSP_USING_CAN250kBaud + bool "CAN250kBaud" + config BSP_USING_CAN125kBaud + bool "CAN125kBaud" + config BSP_USING_CAN100kBaud + bool "CAN100kBaud" + config BSP_USING_CAN50kBaud + bool "CAN50kBaud" + config BSP_USING_CAN20kBaud + bool "CAN20kBaud" + config BSP_USING_CAN10kBaud + bool "CAN10kBaud" + endchoice + choice + prompt "Default CAN mode" + default BSP_USING_RT_CAN_MODE_NORMAL + config BSP_USING_RT_CAN_MODE_NORMAL + bool "RT_CAN_MODE_NORMAL" + config BSP_USING_RT_CAN_MODE_LISTEN + bool "RT_CAN_MODE_LISTEN" + config BSP_USING_RT_CAN_MODE_LOOPBACK + bool "RT_CAN_MODE_LOOPBACK" + config BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + bool "RT_CAN_MODE_LOOPBACKANLISTEN" + endchoice + + config BSP_USING_CAN_BAUD + int + default 1000000 if BSP_USING_CAN1MBaud + default 800000 if BSP_USING_CAN800kBaud + default 500000 if BSP_USING_CAN500kBaud + default 250000 if BSP_USING_CAN250kBaud + default 125000 if BSP_USING_CAN125kBaud + default 100000 if BSP_USING_CAN100kBaud + default 50000 if BSP_USING_CAN50kBaud + default 20000 if BSP_USING_CAN20kBaud + default 10000 if BSP_USING_CAN10kBaud + + config BSP_USING_CAN_MODE + int + default 0 if BSP_USING_RT_CAN_MODE_NORMAL + default 1 if BSP_USING_RT_CAN_MODE_LISTEN + default 2 if BSP_USING_RT_CAN_MODE_LOOPBACK + default 3 if BSP_USING_RT_CAN_MODE_LOOPBACKANLISTEN + + config CAN_DEFAULT_FILTER_TABLE_CONFIGURATION + choice + prompt "Default filter id mode" + default BSP_USING_CAN_STD_ID + config BSP_USING_CAN_STD_ID + bool "CAN_STD_ID" + config BSP_USING_CAN_EXT_ID + bool "CAN_EXT_ID" + endchoice + + choice + prompt "Default filter frame mode" + default BSP_USING_CAN_DATA_FRAME + config BSP_USING_CAN_DATA_FRAME + bool "CAN_DATA_FRAME" + config BSP_USING_CAN_REMOTE_FRAME + bool "CAN_REMOTE_FRAME" + endchoice + + config BSP_USING_CAN_ID_MODE + int + default 0 if BSP_USING_CAN_STD_ID + default 1 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_FRAME_MODE + int + default 0 if BSP_USING_CAN_REMOTE_FRAME + default 1 if BSP_USING_CAN_DATA_FRAME + + config BSP_USING_CAN_MSG_NUM + int "Default filter table number" + range 0 31 + default 0 + + config BSP_USING_CAN_ID + hex "Default filter arbitration bit(ID)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x541 if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x541 if BSP_USING_CAN_EXT_ID + + config BSP_USING_CAN_MASK + hex "Default filter mask bit(MASK)" + range 0 0x7FF if BSP_USING_CAN_STD_ID + default 0x7FF if BSP_USING_CAN_STD_ID + range 0 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + default 0x1FFFFFFF if BSP_USING_CAN_EXT_ID + + endif + + menuconfig BSP_USING_SDIO + bool "Enable SDIO" + depends on SOC_HT32F12345 || SOC_HT32F12365 || SOC_HT32F12366 + default n + select RT_USING_SDIO if BSP_USING_SDIO + config BSP_USING_SDIO_NAME + depends on BSP_USING_SDIO + string "sdio device name" + default "sdio" + + menuconfig BSP_USING_USBD + bool "Enable USB BUS" + default n + select RT_USING_USB_DEVICE if BSP_USING_USBD + config BSP_USING_USBD_NAME + depends on BSP_USING_USBD + string "usbd device name" + default "usbd" +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/ht32/ht32f53252/board/SConscript b/bsp/ht32/ht32f53252/board/SConscript new file mode 100644 index 00000000000..e92da4da29c --- /dev/null +++ b/bsp/ht32/ht32f53252/board/SConscript @@ -0,0 +1,27 @@ + +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +src = Glob('src/*.c') + +startup_path_prefix = SDK_LIB +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s'] + +path = [cwd] +path = [cwd + '/inc'] + +CPPDEFINES = ['USE_HT32F53252_SK, USE_HT32F53242_52, USE_MEM_HT32F53252'] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/board/inc/board.h b/bsp/ht32/ht32f53252/board/inc/board.h new file mode 100644 index 00000000000..c4a817d79bb --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/board.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include "ht32.h" +#include "ht32_msp.h" + +#ifdef BSP_USING_GPIO + #include "drv_gpio.h" +#endif + +#ifdef BSP_USING_SPI + #include "drv_spi.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* whether use board external SRAM memory */ +#define HT32_EXT_SRAM 0 +#define HT32_EXT_SRAM_BEGIN 0x68000000 +#define HT32_EXT_SRAM_END (HT32_EXT_SRAM_BEGIN + HT32_EXT_SRAM*1024) + +/* internal sram memory size */ +#define HT32_SRAM_END (0x20000000 + LIBCFG_RAM_SIZE) + +#ifdef __CC_ARM +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="HEAP" +#define HEAP_BEGIN (__segment_end("HEAP")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif +#define HEAP_END HT32_SRAM_END + +void rt_hw_board_clock_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/ht32/ht32f53252/board/inc/ht32_can_config.h b/bsp/ht32/ht32f53252/board/inc/ht32_can_config.h new file mode 100644 index 00000000000..bbef2115c92 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32_can_config.h @@ -0,0 +1,111 @@ +/*********************************************************************************************************//** + * @file CAN/Send_DATA/ht32_can_config.h + * @version $Rev:: 8164 $ + * @date $Date:: 2024-09-20 #$ + * @brief The header file of CAN baudrate configuration. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +//-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32_CAN_CONFIG_H +#define __HT32_CAN_CONFIG_H + +#ifdef __cplusplus + extern "C" { +#endif + + +// Enable CAN Config Check +// Display related setting by printf(). +#define HTCFG_CAN_CONF_CHECK_ENABLE (0) + +// Core Clock Setting +// +// -- Core Clock Calculation Setting +// HTCFG_CAN_CORECLKSEL +// Define the Core Clock by default maximum clock setting or manual input. +// 0 = Default Maximum (LIBCFG_MAX_SPEED) +// 1 = Manual Input (HTCFG_CAN_CORECLK_MANUAL) +// <0=> Default Maximum (LIBCFG_MAX_SPEED) +// <1=> Manual Input (HTCFG_CAN_CORECLK_MANUAL) +// Note: CK_CAN = (Core Clock) / (CAN Peripheral Clock Prescaler) +// -- Core Clock Manual Input (Hz) +// HTCFG_CAN_CORECLK_MANUAL +// Only meaningful when HTCFG_CAN_CLKSEL = 1 (Manual Input) +#define HTCFG_CAN_CORECLKSEL (0) // 0 = Default Maximum (LIBCFG_MAX_SPEED), 1 = Manual Input (HTCFG_CAN_CORECLK_MANUAL) +#define HTCFG_CAN_CORECLK_MANUAL (8000000) // Only meaningful when HTCFG_CAN_CORECLKSEL = 1 (Manual Input) + +// ------------------------------------------ +// + +// CAN Config 0 Setting +// +// CAN Peripheral Clock Selection (CANnPCLK) +// HTCFG_CAN_CLK_PRESCALER +// <0=> Div 1 +// <1=> Div 2 +// <2=> Div 4 +// <3=> Div 8 +#define HTCFG_CAN_CF0_CLK_DIV (0) // 0 = /1, 1 = /2, 2 = /4, 3 = /8 + +/* +// CAN Baudrate +// HTCFG_CAN_BAUDRATE +// <1000000=> 1000 kbps +// <800000=> 800 kbps +// <500000=> 500 kbps +// <250000=> 250 kbps +// <125000=> 125 kbps +// <100000=> 100 kbps +// <50000=> 50 kbps +// <20000=> 20 kbps +// <10000=> 10 kbps +// <5000=> 5 kbps +// The CAN baudrate specifies the frequency of transitions occurring per second. +*/ +#define HTCFG_CAN_CF0_BAUDRATE (500000) + +/* +// CAN Sample Point Target (%) <50-90:1> +// HTCFG_CAN_SAMPLE_POINT +// The Sample Point is the specific location within each bit period where the CAN_Core samples the CAN bus's state (dominant or recessive). +// Notice: The real calculation result may small than the HTCFG_CAN_SAMPLE_POINT setting. +*/ +#define HTCFG_CAN_CF0_SAMPLE_POINT (70) + +// CAN SJW (Synchronisation Jump Width) +// HTCFG_CAN_BIT_TIME_SJW +// The (Re-)Synchronisation Jump Width. +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +#define HTCFG_CAN_CF0_BIT_TIME_SJW (1) // 1 ~ 4 + +#include "ht32_can_config0_calc.h" + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/ht32/ht32f53252/board/inc/ht32_msp.h b/bsp/ht32/ht32f53252/board/inc/ht32_msp.h new file mode 100644 index 00000000000..e45294becbd --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32_msp.h @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#ifndef __HT32_MSP_H__ +#define __HT32_MSP_H__ + +#include +#include "ht32.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* UART gpio */ +#ifdef BSP_USING_UART +#ifdef BSP_USING_USART0 +#define HTCFG_USART0_IPN USART0 + +#define _HTCFG_USART0_TX_GPIOX A +#define _HTCFG_USART0_TX_GPION 2 +#define _HTCFG_USART0_RX_GPIOX A +#define _HTCFG_USART0_RX_GPION 3 + +#define HTCFG_USART0_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_USART0_TX_GPIOX) +#define HTCFG_USART0_TX_GPIO_CLK STRCAT2(P, _HTCFG_USART0_TX_GPIOX) +#define HTCFG_USART0_TX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_USART0_TX_GPIOX) +#define HTCFG_USART0_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_USART0_TX_GPION) + +#define HTCFG_USART0_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_USART0_RX_GPIOX) +#define HTCFG_USART0_RX_GPIO_CLK STRCAT2(P, _HTCFG_USART0_RX_GPIOX) +#define HTCFG_USART0_RX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_USART0_RX_GPIOX) +#define HTCFG_USART0_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_USART0_RX_GPION) + +#endif +#ifdef BSP_USING_USART1 + +#define HTCFG_USART1_IPN USART1 + +#define _HTCFG_USART1_TX_GPIOX A +#define _HTCFG_USART1_TX_GPION 4 +#define _HTCFG_USART1_RX_GPIOX A +#define _HTCFG_USART1_RX_GPION 5 + +#define HTCFG_USART1_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_USART1_TX_GPIOX) +#define HTCFG_USART1_TX_GPIO_CLK STRCAT2(P, _HTCFG_USART1_TX_GPIOX) +#define HTCFG_USART1_TX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_USART1_TX_GPIOX) +#define HTCFG_USART1_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_USART1_TX_GPION) + +#define HTCFG_USART1_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_USART1_RX_GPIOX) +#define HTCFG_USART1_RX_GPIO_CLK STRCAT2(P, _HTCFG_USART1_RX_GPIOX) +#define HTCFG_USART1_RX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_USART1_RX_GPIOX) +#define HTCFG_USART1_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_USART1_RX_GPION) + +#endif +#ifdef BSP_USING_UART0 + +#define HTCFG_UART0_IPN UART0 + +#define _HTCFG_UART0_TX_GPIOX B +#define _HTCFG_UART0_TX_GPION 2 +#define _HTCFG_UART0_RX_GPIOX B +#define _HTCFG_UART0_RX_GPION 3 + +#define HTCFG_UART0_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_UART0_TX_GPIOX) +#define HTCFG_UART0_TX_GPIO_CLK STRCAT2(P, _HTCFG_UART0_TX_GPIOX) +#define HTCFG_UART0_TX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_UART0_TX_GPIOX) +#define HTCFG_UART0_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART0_TX_GPION) + +#define HTCFG_UART0_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_UART0_RX_GPIOX) +#define HTCFG_UART0_RX_GPIO_CLK STRCAT2(P, _HTCFG_UART0_RX_GPIOX) +#define HTCFG_UART0_RX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_UART0_RX_GPIOX) +#define HTCFG_UART0_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART0_RX_GPION) + +#endif +#ifdef BSP_USING_UART1 + +#define HTCFG_UART1_IPN UART1 + +#define _HTCFG_UART1_TX_GPIOX B +#define _HTCFG_UART1_TX_GPION 4 +#define _HTCFG_UART1_RX_GPIOX B +#define _HTCFG_UART1_RX_GPION 5 + +#define HTCFG_UART1_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_UART1_TX_GPIOX) +#define HTCFG_UART1_TX_GPIO_CLK STRCAT2(P, _HTCFG_UART1_TX_GPIOX) +#define HTCFG_UART1_TX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_UART1_TX_GPIOX) +#define HTCFG_UART1_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART1_TX_GPION) + +#define HTCFG_UART1_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_UART1_RX_GPIOX) +#define HTCFG_UART1_RX_GPIO_CLK STRCAT2(P, _HTCFG_UART1_RX_GPIOX) +#define HTCFG_UART1_RX_GPIO_PORT STRCAT2(HT_GPIO, _HTCFG_UART1_RX_GPIOX) +#define HTCFG_UART1_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_UART1_RX_GPION) + +#endif +#endif + +/* SPI gpio */ +#ifdef BSP_USING_SPI +#ifdef BSP_USING_SPI0 + +#define HTCFG_SPI0_IPN SPI0 + +#define _HTCFG_SPI0_SCK_GPIOX C +#define _HTCFG_SPI0_SCK_GPION 0 + +#define _HTCFG_SPI0_MISO_GPIOX A +#define _HTCFG_SPI0_MISO_GPION 11 + +#define _HTCFG_SPI0_MOSI_GPIOX A +#define _HTCFG_SPI0_MOSI_GPION 9 + +#define HTCFG_SPI0_SCK_GPIO_CLK STRCAT2(P, _HTCFG_SPI0_SCK_GPIOX) +#define HTCFG_SPI0_SCK_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI0_SCK_GPIOX) +#define HTCFG_SPI0_SCK_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI0_SCK_GPION) + +#define HTCFG_SPI0_MISO_GPIO_CLK STRCAT2(P, _HTCFG_SPI0_MISO_GPIOX) +#define HTCFG_SPI0_MISO_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI0_MISO_GPIOX) +#define HTCFG_SPI0_MISO_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI0_MISO_GPION) + +#define HTCFG_SPI0_MOSI_GPIO_CLK STRCAT2(P, _HTCFG_SPI0_MOSI_GPIOX) +#define HTCFG_SPI0_MOSI_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI0_MOSI_GPIOX) +#define HTCFG_SPI0_MOSI_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI0_MOSI_GPION) + +#endif +#ifdef BSP_USING_SPI1 + +#define HTCFG_SPI1_IPN SPI1 + +#define _HTCFG_SPI1_SCK_GPIOX C +#define _HTCFG_SPI1_SCK_GPION 5 + +#define _HTCFG_SPI1_MISO_GPIOX C +#define _HTCFG_SPI1_MISO_GPION 9 + +#define _HTCFG_SPI1_MOSI_GPIOX C +#define _HTCFG_SPI1_MOSI_GPION 8 + +#define HTCFG_SPI1_SCK_GPIO_CLK STRCAT2(P, _HTCFG_SPI1_SCK_GPIOX) +#define HTCFG_SPI1_SCK_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI1_SCK_GPIOX) +#define HTCFG_SPI1_SCK_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI1_SCK_GPION) + +#define HTCFG_SPI1_MISO_GPIO_CLK STRCAT2(P, _HTCFG_SPI1_MISO_GPIOX) +#define HTCFG_SPI1_MISO_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI1_MISO_GPIOX) +#define HTCFG_SPI1_MISO_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI1_MISO_GPION) + +#define HTCFG_SPI1_MOSI_GPIO_CLK STRCAT2(P, _HTCFG_SPI1_MOSI_GPIOX) +#define HTCFG_SPI1_MOSI_GPIO_ID STRCAT2(GPIO_P, _HTCFG_SPI1_MOSI_GPIOX) +#define HTCFG_SPI1_MOSI_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_SPI1_MOSI_GPION) + +#endif +#endif + +/* I2C gpio */ +#ifdef BSP_USING_I2C_HW +#ifdef BSP_USING_I2C0_HW + +#define HTCFG_I2C0_IPN I2C0 + +#define _HTCFG_I2C0_SCL_GPIOX C +#define _HTCFG_I2C0_SCL_GPION 12 + +#define _HTCFG_I2C0_SDA_GPIOX C +#define _HTCFG_I2C0_SDA_GPION 13 + +#define HTCFG_I2C0_SCL_GPIO_CLK STRCAT2(P, _HTCFG_I2C0_SCL_GPIOX) +#define HTCFG_I2C0_SCL_GPIO_ID STRCAT2(GPIO_P, _HTCFG_I2C0_SCL_GPIOX) +#define HTCFG_I2C0_SCL_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C0_SCL_GPION) + +#define HTCFG_I2C0_SDA_GPIO_CLK STRCAT2(P, _HTCFG_I2C0_SDA_GPIOX) +#define HTCFG_I2C0_SDA_GPIO_ID STRCAT2(GPIO_P, _HTCFG_I2C0_SDA_GPIOX) +#define HTCFG_I2C0_SDA_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C0_SDA_GPION) + +#endif +#ifdef BSP_USING_I2C1_HW + +#define HTCFG_I2C1_IPN I2C1 + +#define _HTCFG_I2C1_SCL_GPIOX A +#define _HTCFG_I2C1_SCL_GPION 0 + +#define _HTCFG_I2C1_SDA_GPIOX A +#define _HTCFG_I2C1_SDA_GPION 1 + +#define HTCFG_I2C1_SCL_GPIO_CLK STRCAT2(P, _HTCFG_I2C1_SCL_GPIOX) +#define HTCFG_I2C1_SCL_GPIO_ID STRCAT2(GPIO_P, _HTCFG_I2C1_SCL_GPIOX) +#define HTCFG_I2C1_SCL_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C1_SCL_GPION) + +#define HTCFG_I2C1_SDA_GPIO_CLK STRCAT2(P, _HTCFG_I2C1_SDA_GPIOX) +#define HTCFG_I2C1_SDA_GPIO_ID STRCAT2(GPIO_P, _HTCFG_I2C1_SDA_GPIOX) +#define HTCFG_I2C1_SDA_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_I2C1_SDA_GPION) + +#endif +#endif + +/* ADC gpio */ +#ifdef BSP_USING_ADC +#ifdef BSP_USING_ADC0 + +#define HTCFG_ADC0_IPN ADC0 + +#define _HTCFG_ADC0CH0_GPIOX A +#define _HTCFG_ADC0CH0_AFION 0 + +#define _HTCFG_ADC0CH1_GPIOX A +#define _HTCFG_ADC0CH1_AFION 1 + +#define _HTCFG_ADC0CH2_GPIOX A +#define _HTCFG_ADC0CH2_AFION 2 + +#define _HTCFG_ADC0CH3_GPIOX A +#define _HTCFG_ADC0CH3_AFION 3 + +#define _HTCFG_ADC0CH4_GPIOX A +#define _HTCFG_ADC0CH4_AFION 4 + +#define _HTCFG_ADC0CH5_GPIOX A +#define _HTCFG_ADC0CH5_AFION 5 + +#define _HTCFG_ADC0CH6_GPIOX A +#define _HTCFG_ADC0CH6_AFION 6 + +#define _HTCFG_ADC0CH7_GPIOX A +#define _HTCFG_ADC0CH7_AFION 7 + +#define _HTCFG_ADC0CH8_GPIOX C +#define _HTCFG_ADC0CH8_AFION 4 + +#define _HTCFG_ADC0CH9_GPIOX C +#define _HTCFG_ADC0CH9_AFION 5 + +#define _HTCFG_ADC0CH10_GPIOX C +#define _HTCFG_ADC0CH10_AFION 8 + +#define _HTCFG_ADC0CH11_GPIOX C +#define _HTCFG_ADC0CH11_AFION 9 + +#define _HTCFG_ADC0CH12_GPIOX C +#define _HTCFG_ADC0CH12_AFION 1 + +#define _HTCFG_ADC0CH13_GPIOX C +#define _HTCFG_ADC0CH13_AFION 1 + +#define _HTCFG_ADC0CH14_GPIOX C +#define _HTCFG_ADC0CH14_AFION 1 + +#define _HTCFG_ADC0CH15_GPIOX C +#define _HTCFG_ADC0CH15_AFION 1 + +#define HTCFG_ADC0CH0_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH0_GPIOX) +#define HTCFG_ADC0CH1_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH1_GPIOX) +#define HTCFG_ADC0CH2_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH2_GPIOX) +#define HTCFG_ADC0CH3_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH3_GPIOX) +#define HTCFG_ADC0CH4_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH4_GPIOX) +#define HTCFG_ADC0CH5_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH5_GPIOX) +#define HTCFG_ADC0CH6_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH6_GPIOX) +#define HTCFG_ADC0CH7_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH7_GPIOX) +#define HTCFG_ADC0CH8_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH8_GPIOX) +#define HTCFG_ADC0CH9_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH9_GPIOX) +#define HTCFG_ADC0CH10_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH10_GPIOX) +#define HTCFG_ADC0CH11_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH11_GPIOX) +#define HTCFG_ADC0CH12_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH12_GPIOX) +#define HTCFG_ADC0CH13_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH13_GPIOX) +#define HTCFG_ADC0CH14_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH14_GPIOX) +#define HTCFG_ADC0CH15_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC0CH15_GPIOX) + +#define HTCFG_ADC0CH0_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH0_AFION) +#define HTCFG_ADC0CH1_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH1_AFION) +#define HTCFG_ADC0CH2_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH2_AFION) +#define HTCFG_ADC0CH3_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH3_AFION) +#define HTCFG_ADC0CH4_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH4_AFION) +#define HTCFG_ADC0CH5_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH5_AFION) +#define HTCFG_ADC0CH6_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH6_AFION) +#define HTCFG_ADC0CH7_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH7_AFION) +#define HTCFG_ADC0CH8_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH8_AFION) +#define HTCFG_ADC0CH9_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH9_AFION) +#define HTCFG_ADC0CH10_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH10_AFION) +#define HTCFG_ADC0CH11_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH11_AFION) +#define HTCFG_ADC0CH12_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH12_AFION) +#define HTCFG_ADC0CH13_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH13_AFION) +#define HTCFG_ADC0CH14_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH14_AFION) +#define HTCFG_ADC0CH15_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC0CH15_AFION) + +#endif +#ifdef BSP_USING_ADC1 + +#define HTCFG_ADC1_IPN ADC1 + +#define _HTCFG_ADC1CH0_GPIOX B +#define _HTCFG_ADC1CH0_AFION 8 + +#define _HTCFG_ADC1CH1_GPIOX A +#define _HTCFG_ADC1CH1_AFION 0 + +#define _HTCFG_ADC1CH2_GPIOX A +#define _HTCFG_ADC1CH2_AFION 1 + +#define _HTCFG_ADC1CH3_GPIOX A +#define _HTCFG_ADC1CH3_AFION 2 + +#define _HTCFG_ADC1CH4_GPIOX A +#define _HTCFG_ADC1CH4_AFION 3 + +#define _HTCFG_ADC1CH5_GPIOX A +#define _HTCFG_ADC1CH5_AFION 4 + +#define _HTCFG_ADC1CH6_GPIOX A +#define _HTCFG_ADC1CH6_AFION 5 + +#define _HTCFG_ADC1CH7_GPIOX A +#define _HTCFG_ADC1CH7_AFION 6 + +#define HTCFG_ADC1CH0_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH0_GPIOX) +#define HTCFG_ADC1CH1_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH1_GPIOX) +#define HTCFG_ADC1CH2_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH2_GPIOX) +#define HTCFG_ADC1CH3_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH3_GPIOX) +#define HTCFG_ADC1CH4_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH4_GPIOX) +#define HTCFG_ADC1CH5_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH5_GPIOX) +#define HTCFG_ADC1CH6_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH6_GPIOX) +#define HTCFG_ADC1CH7_GPIO_ID STRCAT2(GPIO_P, _HTCFG_ADC1CH7_GPIOX) + +#define HTCFG_ADC1CH0_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH0_AFION) +#define HTCFG_ADC1CH1_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH1_AFION) +#define HTCFG_ADC1CH2_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH2_AFION) +#define HTCFG_ADC1CH3_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH3_AFION) +#define HTCFG_ADC1CH4_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH4_AFION) +#define HTCFG_ADC1CH5_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH5_AFION) +#define HTCFG_ADC1CH6_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH6_AFION) +#define HTCFG_ADC1CH7_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_ADC1CH7_AFION) + +#endif +#endif +/* CAN gpio */ +#ifdef BSP_USING_CAN +#define HTCFG_CAN_IPN CAN0 + +#define _HTCFG_CAN_TX_GPIOX C +#define _HTCFG_CAN_TX_GPION 6 + +#define _HTCFG_CAN_RX_GPIOX C +#define _HTCFG_CAN_RX_GPION 7 + +#define HTCFG_CAN_TX_GPIO_CLK STRCAT2(P, _HTCFG_CAN_TX_GPIOX) +#define HTCFG_CAN_TX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_CAN_TX_GPIOX) +#define HTCFG_CAN_TX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_CAN_TX_GPION) + +#define HTCFG_CAN_RX_GPIO_CLK STRCAT2(P, _HTCFG_CAN_RX_GPIOX) +#define HTCFG_CAN_RX_GPIO_ID STRCAT2(GPIO_P, _HTCFG_CAN_RX_GPIOX) +#define HTCFG_CAN_RX_GPIO_PIN STRCAT2(GPIO_PIN_, _HTCFG_CAN_RX_GPION) +#endif + +void ht32_usart_gpio_init(void *instance); +void ht32_spi_gpio_init(void *instance); +void ht32_hardware_i2c_gpio_init(void *instance); +void ht32_adc_gpio_init(void *instance,int8_t channel); +void ht32_can_gpio_init(void *instance); + +#ifdef __cplusplus +} +#endif + +#endif /* __HT32_MSP_H__ */ diff --git a/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_01_usbdconf.h b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_01_usbdconf.h new file mode 100644 index 00000000000..d1ef029d1b1 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_01_usbdconf.h @@ -0,0 +1,453 @@ +/*********************************************************************************************************//** + * @file IP/Example/ht32f5xxxx_01_usbdconf.h + * @version $Rev:: 2390 $ + * @date $Date:: 2017-12-21 #$ + * @brief The configuration file of USB Device Driver. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +// <<< Use Configuration Wizard in Context Menu >>> + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32F5XXXX_01_USBDCONF_H +#define __HT32F5XXXX_01_USBDCONF_H + +// Enter Low Power mode when Suspended +#define USBDCORE_ENABLE_LOW_POWER (0) +// + +#if (USBDCORE_ENABLE_LOW_POWER == 1) + #define USBDCore_LowPower() PWRCU_DeepSleep1(PWRCU_SLEEP_ENTRY_WFE) +#else + #define USBDCore_LowPower(...) +#endif + +/*----------------------------------------------------------------------------------------------------------*/ +/* USB Interrupt Enable */ +/*----------------------------------------------------------------------------------------------------------*/ +// USB Interrupt Setting (UIER) +// USB Global Interrupt Enable (UGIE) (Default) +// Start Of Frame Interrupt Enable (SOFIE) +// USB Reset Interrupt Enable (URSTIE) (Default) +// Resume Interrupt Enable (RSMIE) (Default) +// Suspend Interrupt Enable (SUSPIE) (Default) +// Expected Start of Frame Interrupt Enable (ESOFE) +// Control Endpoint Interrupt Enable (EP0IE) (Default) +// Endpoint1 Interrupt Enable (EP1IE) +// Endpoint2 Interrupt Enable (EP2IE) +// Endpoint3 Interrupt Enable (EP3IE) +// Endpoint4 Interrupt Enable (EP4IE) +// Endpoint5 Interrupt Enable (EP5IE) +// Endpoint6 Interrupt Enable (EP6IE) +// Endpoint7 Interrupt Enable (EP7IE) +#define _UIER (0xFF1D) +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint0 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Control Endpoint0 Configuration +// Endpoint Buffer Length (EPLEN) +// <8=> 8 bytes +// <16=> 16 bytes +// <32=> 32 bytes +// <64=> 64 bytes + /* Maximum: 64 Bytes */ +#define _EP0LEN (64) + + +// Control Endpoint0 Interrupt Enable Settings (EP0IER) +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) (Default) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) (Default) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +// SETUP Token Packet Received Interrupt Enable (STRXIE) +// SETUP Data Packet Received Interrupt Enable (SDRXIE) (Default) +// SETUP Data Error Interrupt Enable (SDERIE) +// Zero Length Data Packet Received Interrupt Enable (ZLRXIE) +#define _EP0_IER (0x212) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint1 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint1 Configuration +#define _EP1_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP1_CFG_EPADR (1) + +// Endpoint Enable (EPEN) +#define _EP1_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP1_TYPR (2) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP1_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP1LEN_TMP (64) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP1_IER (0x12) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint2 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint2 Configuration +#define _EP2_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP2_CFG_EPADR (2) + +// Endpoint Enable (EPEN) +#define _EP2_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP2_TYPR (2) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP2_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP2LEN_TMP (64) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP2_IER (0x012) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint3 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint3 Configuration +#define _EP3_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP3_CFG_EPADR (3) + +// Endpoint Enable (EPEN) +#define _EP3_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP3_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP3_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP3LEN_TMP (64) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP3_IER (0x12) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint4 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint4 Configuration +#define _EP4_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP4_CFG_EPADR (4) + +// Endpoint Enable (EPEN) +#define _EP4_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP4_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP4_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP4LEN_TMP (64) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP4_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP4_IER (0x12) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint5 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint5 Configuration +#define _EP5_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP5_CFG_EPADR (5) + +// Endpoint Enable (EPEN) +#define _EP5_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP5_TYPR (1) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP5_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP5LEN_TMP (64) + + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP5_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP5_IER (0x12) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint6 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint6 Configuration +#define _EP6_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP6_CFG_EPADR (6) + +// Endpoint Enable (EPEN) +#define _EP6_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP6_TYPR (1) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP6_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP6LEN_TMP (64) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP6_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP6_IER (0x12) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint7 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint7 Configuration +#define _EP7_ENABLE (1) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +#define _EP7_CFG_EPADR (7) + +// Endpoint Enable (EPEN) +#define _EP7_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP7_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP7_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP7LEN_TMP (64) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP7_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP7_IER (0x12) +// +// + +#endif diff --git a/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_02_usbdconf.h b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_02_usbdconf.h new file mode 100644 index 00000000000..272e8cd127b --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_02_usbdconf.h @@ -0,0 +1,569 @@ +/*********************************************************************************************************//** + * @file IP/Example/ht32f5xxxx_02_usbdconf.h + * @version $Rev:: 5656 $ + * @date $Date:: 2021-11-24 #$ + * @brief The configuration file of USB Device Driver. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +// <<< Use Configuration Wizard in Context Menu >>> + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32F5XXXX_02_USBDCONF_H +#define __HT32F5XXXX_02_USBDCONF_H + +// Enter Low Power mode when Suspended +#define USBDCORE_ENABLE_LOW_POWER (0) +// + +#if (USBDCORE_ENABLE_LOW_POWER == 1) + #define USBDCore_LowPower() PWRCU_DeepSleep1(PWRCU_SLEEP_ENTRY_WFE) +#else + #define USBDCore_LowPower(...) +#endif + +/*----------------------------------------------------------------------------------------------------------*/ +/* USB Interrupt Enable */ +/*----------------------------------------------------------------------------------------------------------*/ +// USB Interrupt Setting (UIER) +// USB Global Interrupt Enable (UGIE) (Default) +// Start Of Frame Interrupt Enable (SOFIE) +// USB Reset Interrupt Enable (URSTIE) (Default) +// Resume Interrupt Enable (RSMIE) (Default) +// Suspend Interrupt Enable (SUSPIE) (Default) +// Expected Start of Frame Interrupt Enable (ESOFE) +// Control Endpoint Interrupt Enable (EP0IE) (Default) +// Endpoint1 Interrupt Enable (EP1IE) +// Endpoint2 Interrupt Enable (EP2IE) +// Endpoint3 Interrupt Enable (EP3IE) +// Endpoint4 Interrupt Enable (EP4IE) +// Endpoint5 Interrupt Enable (EP5IE) +// Endpoint6 Interrupt Enable (EP6IE) +// Endpoint7 Interrupt Enable (EP7IE) +// Endpoint8 Interrupt Enable (EP8IE) +// Endpoint9 Interrupt Enable (EP9IE) +#define _UIER (0x011D) +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint0 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Control Endpoint0 Configuration +// Endpoint Buffer Length (EPLEN) +// <8=> 8 bytes +// <16=> 16 bytes +// <32=> 32 bytes +// <64=> 64 bytes + /* Maximum: 64 Bytes */ +#define _EP0LEN (64) + + +// Control Endpoint0 Interrupt Enable Settings (EP0IER) +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) (Default) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) (Default) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +// SETUP Token Packet Received Interrupt Enable (STRXIE) +// SETUP Data Packet Received Interrupt Enable (SDRXIE) (Default) +// SETUP Data Error Interrupt Enable (SDERIE) +// Zero Length Data Packet Received Interrupt Enable (ZLRXIE) +#define _EP0_IER (0x212) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint1 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint1 Configuration +#define _EP1_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP1_CFG_EPADR (1) + +// Endpoint Enable (EPEN) +#define _EP1_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP1_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP1_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP1LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP1_IER (0x10) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint2 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint2 Configuration +#define _EP2_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP2_CFG_EPADR (2) + +// Endpoint Enable (EPEN) +#define _EP2_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP2_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP2_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP2LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP2_IER (0x002) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint3 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint3 Configuration +#define _EP3_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP3_CFG_EPADR (3) + +// Endpoint Enable (EPEN) +#define _EP3_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP3_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP3_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP3LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP3_IER (0x10) +// +// + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint4 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint4 Configuration +#define _EP4_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP4_CFG_EPADR (4) + +// Endpoint Enable (EPEN) +#define _EP4_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP4_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP4_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP4LEN_TMP (8) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP4_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP4_IER (0x02) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint5 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint5 Configuration +#define _EP5_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP5_CFG_EPADR (5) + +// Endpoint Enable (EPEN) +#define _EP5_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP5_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP5_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP5LEN_TMP (8) + + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP5_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP5_IER (0x10) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint6 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint6 Configuration +#define _EP6_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP6_CFG_EPADR (6) + +// Endpoint Enable (EPEN) +#define _EP6_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP6_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP6_CFG_EPDIR (0) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP6LEN_TMP (8) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP6_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP6_IER (0x02) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint7 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint7 Configuration +#define _EP7_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP7_CFG_EPADR (7) + +// Endpoint Enable (EPEN) +#define _EP7_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <1=> Isochronous +// <2=> Bulk +// <3=> Interrupt +#define _EP7_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP7_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-1000:4> + /* Maximum: 1000 Bytes */ +#define _EP7LEN_TMP (8) + +// Single/Double Buffer Selection (SDBS) +// <0=> Single Buffer +// <1=> Double Buffer +#define _EP7_CFG_SDBS (0) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP7_IER (0x10) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint8 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint8 Configuration +#define _EP8_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP8_CFG_EPADR (8) + +// Endpoint Enable (EPEN) +#define _EP8_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP8_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP8_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP8LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP8_IER (0x10) +// +// + + +/*----------------------------------------------------------------------------------------------------------*/ +/* Endpoint9 Configuration Setting */ +/*----------------------------------------------------------------------------------------------------------*/ +// Endpoint9 Configuration +#define _EP9_ENABLE (0) + +// Endpoint Address (EPADR) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 +// <8=> 8 +// <9=> 9 +#define _EP9_CFG_EPADR (9) + +// Endpoint Enable (EPEN) +#define _EP9_CFG_EPEN_TMP (1) + +// Endpoint Transfer Type +// <2=> Bulk +// <3=> Interrupt +#define _EP9_TYPR (3) + +// Endpoint Direction (EPDIR) +// <1=> IN +// <0=> OUT +#define _EP9_CFG_EPDIR (1) + +// Endpoint Buffer Length (EPLEN) (in byte) <4-64:4> + /* Maximum: 64 Bytes */ +#define _EP9LEN_TMP (8) + +// Endpoint Interrupt Enable Settings (EPIER) +// Endpoint Interrupt Enable Settings (EPIER) <0x0-0xFF:1> +// OUT Token Packet Received Interrupt Enable (OTRXIE) +// OUT Data Packet Received Interrupt Enable (ODRXIE) +// OUT Data Buffer Overrun Interrupt Enable (ODOVIE) +// IN Token Packet Received Interrupt Enable (ITRXIE) +// IN Data Packet Transmitted Interrupt Enable (IDTXIE) +// NAK Transmitted Interrupt Enable (NAKIE) +// STALL Transmitted Interrupt Enable (STLIE) +// USB Error Interrupt Enable (UERIE) +#define _EP9_IER (0x10) +// +// + +#endif diff --git a/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_conf.h b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_conf.h new file mode 100644 index 00000000000..c78b9bb75d7 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/inc/ht32f5xxxx_conf.h @@ -0,0 +1,556 @@ +/*********************************************************************************************************//** + * @file IP/Example/ht32f5xxxx_conf.h + * @version $Rev:: 7109 $ + * @date $Date:: 2023-08-10 #$ + * @brief Library configuration file. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +//-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32F5XXXX_CONF_H +#define __HT32F5XXXX_CONF_H + +/* Exported constants --------------------------------------------------------------------------------------*/ + +#define RETARGET_USB 1 +#define RETARGET_SYSLOG 2 +#define RETARGET_COM1 10 +#define RETARGET_COM2 11 +#define RETARGET_USART0 12 +#define RETARGET_USART1 13 +#define RETARGET_UART0 14 +#define RETARGET_UART1 15 +#define RETARGET_UART2 16 +#define RETARGET_UART3 17 + + +/* Retarget settings of the C standard I/O library functions (printf, scanf, getchar, ...etc.) */ +/* +// Enable Retarget +// Retarget Port +// <1=> USB Virtual COM +// <2=> Syslog +// <10=> COM1 +// <11=> COM2 +// <12=> USART0 +// <13=> USART1 +// <14=> UART0 +// <15=> UART1 +// <16=> UART2 +// <17=> UART3 +// Enable Auto Return +// Auto Return function adds "\r" before "\n" automatically when print message by Retarget. +*/ +#define _RETARGET 1 +#define RETARGET_PORT 10 +#define _AUTO_RETURN 0 + +#ifndef AUTO_RETURN +#if (_AUTO_RETURN == 1) +#define AUTO_RETURN +#endif +#endif + +/* Enable Interrupt Mode for UxART Retarget +// Retarget COM/UxART Setting +// UxART Baudrate +// Enable Interrupt Mode for UxART Tx Retarget +// Define UxARTn_IRQHandler By Retarget (ht32_serial.c) +// Disable (RETARGET_DEFINE_HANDLER = 0) if application already have UxARTn_IRQHandler. +// RETARGET_UART_IRQHandler() shall be called by UxARTn_IRQHandler when disable. +// Tx Buffer Length (in byte) +// +*/ +#define RETARGET_UxART_BAUDRATE 115200 +#define RETARGET_INT_MODE 0 +#define RETARGET_DEFINE_HANDLER 1 +#define RETARGET_INT_BUFFER_SIZE 64 + +#if (_RETARGET == 1) +#if (RETARGET_PORT == RETARGET_USB) + #define RETARGET_IS_USB +// Retarget USB Virtual COM Setting +// Communication (Interrupt IN) +// <1=> Endpoint 1 +// <2=> Endpoint 2 +// <3=> Endpoint 3 +// <4=> Endpoint 4 +// <5=> Endpoint 5 +// <6=> Endpoint 6 +// <7=> Endpoint 7 +// Data Rx (Bulk OUT) +// <1=> Endpoint 1 +// <2=> Endpoint 2 +// <3=> Endpoint 3 +// <4=> Endpoint 4 +// <5=> Endpoint 5 +// <6=> Endpoint 6 +// <7=> Endpoint 7 +// Data Tx (Bulk IN) +// <1=> Endpoint 1 +// <2=> Endpoint 2 +// <3=> Endpoint 3 +// <4=> Endpoint 4 +// <5=> Endpoint 5 +// <6=> Endpoint 6 +// <7=> Endpoint 7 +// Communication Endpoint Buffer Length (in byte) <4-64:4> +// Data Rx Endpoint Buffer Length (in byte) <4-64:4> +// Data Tx Endpoint Buffer Length (in byte) <4-64:4> +// Rx Buffer Length (in byte) <64-1024:4> +// Tx Buffer Length (in byte) <1-63:1> +// Please use "SERIAL_Flush()" to sent out the buffer data immediately when Tx Buffer Length > 1. +// USB Tx Mode (BULK IN) +// <0=> Block Mode (Wait until both USB and terminal software are ready) +// <1=> Non-Block Mode (Drop data if USB or terminal software is not ready) +// Enable HSI Auto Trim By USB Function +// Need turn on if the USB clock source is from HSI (PLL USBPLL clock Source). + #define RETARGET_CTRL_EPT (5) + #define RETARGET_RX_EPT (6) + #define RETARGET_TX_EPT (7) + #define RETARGET_CTRL_EPTLEN (8) + #define RETARGET_RX_EPTLEN (64) + #define RETARGET_TX_EPTLEN (64) + #define RETARGET_BUFFER_SIZE (64) + #define RETARGET_TXBUFFER_SIZE (1) // Use "SERIAL_Flush()" to sent out the buffer data immediately when Tx Buffer Length > 1. + #define RETARGET_USB_MODE (0) + #define RETARGET_HSI_ATM (1) +// +#elif (RETARGET_PORT == RETARGET_COM1) + #define RETARGET_COM_PORT COM1 + #define RETARGET_USART_PORT COM1_PORT + #define RETARGET_UART_IRQn COM1_IRQn + #define RETARGET_UART_IRQHandler COM1_IRQHandler + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_COM2) + #define RETARGET_COM_PORT COM2 + #define RETARGET_USART_PORT COM2_PORT + #define RETARGET_UART_IRQn COM2_IRQn + #define RETARGET_UART_IRQHandler COM2_IRQHandler + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_USART0) + #define RETARGET_UxART_IPN USART0 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_USART1) + #define RETARGET_UxART_IPN USART1 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_UART0) + #define RETARGET_UxART_IPN UART0 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_UART1) + #define RETARGET_UxART_IPN UART1 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_UART2) + #define RETARGET_UxART_IPN UART2 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#elif (RETARGET_PORT == RETARGET_UART3) + #define RETARGET_UxART_IPN UART3 + #define RETARGET_USART_PORT STRCAT2(HT_, RETARGET_UxART_IPN) + #define RETARGET_UART_IRQn STRCAT2(RETARGET_UxART_IPN, _IRQn) + #define RETARGET_UART_IRQHandler STRCAT2(RETARGET_UxART_IPN, _IRQHandler) + #define RETARGET_IS_UART +#endif + extern void RETARGET_Configuration(void); +#else + #define RETARGET_Configuration(...) + #undef printf + #undef getchar + #define printf(...) + #define getchar() (0) +#endif + +#if (RETARGET_DEFINE_HANDLER == 0) +#undef RETARGET_UART_IRQHandler +#endif + +/* +// Enable HT32 Time Function +// Provide "Time_GetTick()" and "Time_Dealy()" functions. + +// Timer Selection +// <0=> BFTM0 +// <1=> BFTM1 +// <2=> SCTM0 +// <3=> SCTM1 +// <4=> SCTM2 +// <5=> SCTM3 +// <6=> PWM0 +// <7=> PWM1 +// <8=> PWM2 +// <9=> GPTM0 +// <10=> GPTM1 +// <11=> MCTM0 + +// Timer Clock Setting +// +// Timer Clock = (Core Clock) / (APB Peripheral Clock Prescaler) +// HTCFG_TIME_CLKSRC = _HTCFG_TIME_CORECLK / (2^HTCFG_TIME_PCLK_DIV) +// _HTCFG_TIME_CORECLK = LIBCFG_MAX_SPEED or HTCFG_TIME_CLK_MANUAL (selected by HTCFG_TIME_CLKSEL) + +// -- Core Clock Setting (CK_AHB) +// HTCFG_TIME_CLKSEL +// 0 = Default Maximum (LIBCFG_MAX_SPEED) +// 1 = Manual Input (HTCFG_TIME_CLK_MANUAL) +// <0=> Default Maximum (LIBCFG_MAX_SPEED) +// <1=> Manual Input (HTCFG_TIME_CLK_MANUAL) + +// -- Core Clock Manual Input (Hz) +// HTCFG_TIME_CLK_MANUAL +// Only meaningful when Core Clock Setting (HTCFG_TIME_CLKSEL) = Manual Input (1) + +// -- APB Peripheral Clock Prescaler +// HTCFG_TIME_PCLK_DIV +// <0=> /1 +// <1=> /2 +// <2=> /4 +// <3=> /8 + +// Time Tick (Hz, not applicable for BFTM) <1-1000000:100> +// Not applicable for BFTM, fixed TICKHZ to HTCFG_TIME_CLKSRC for BFTM. +*/ +#if (0) // Enable HT32 Time Function +#define HTCFG_TIME_IPSEL (0) +#define HTCFG_TIME_CLKSEL (0) // 0 = Default Maximum (LIBCFG_MAX_SPEED), 1 = Manual Input (HTCFG_TIME_CLKSRC) +#define HTCFG_TIME_CLK_MANUAL (20000000) // Only meaningful when HTCFG_TIME_CLKSEL = 1 (Manual Input) +#define HTCFG_TIME_PCLK_DIV (0) // 0 ~ 3. (/1, /2, /4, /8) +#define HTCFG_TIME_TICKHZ (1000) // Hz, not applicable for BFTM, fixed TICKHZ to HTCFG_TIME_CLKSRC for BFTM +#define HTCFG_TIME_MULTIPLE (1) // MUST be 1, 2, 4, 8. TICK = COUNT / MULTIPLE. Not applicable for BFTM. +/* + + Timer Clock = (Core Clock) / (APB Peripheral Clock Prescaler) + HTCFG_TIME_CLKSRC = (_HTCFG_TIME_CORECLK) / (2^HTCFG_TIME_PCLK_DIV) + where _HTCFG_TIME_CORECLK can be LIBCFG_MAX_SPEED or HTCFG_TIME_CLK_MANUAL (selected by HTCFG_TIME_CLKSEL) + + Tick Range: 0 ~ 2^32 / HTCFG_TIME_TICKHZ (maximum tick time) + Interrupt Time: _HTCFG_TIME_OVERFLOW_VALUE / (HTCFG_TIME_TICKHZ * HTCFG_TIME_MULTIPLE) Second + (Interrupt Time is not applicable for BFTM) + + Example: 32-bit BFTM with 48 MHz Timer Clock + HTCFG_TIME_TICKHZ = HTCFG_TIME_CLKSRC = 48000000 + Tick Range: 0 ~ 2^32 / 48000000 = 0 ~ 89.478485 Second (maximum tick time, return to 0 every 89.478485 Second) + BFTM do not use interrupt + + Example: 16-bit GPTM with 1 ms tick + HTCFG_TIME_TICKHZ = 1000 (Hz) + HTCFG_TIME_MULTIPLE = 1 (1 Timer Count = 1 Tick) + Tick Range: 0 ~ 2^32 / 1000 = 0 ~ 4294967 Second = 0 ~ 49.7 Day (maximum tick time, return to 0 every 49.7 Day) + Interrupt Time: 65536 / (1000 * 1) = 65.536 Second (Trigger interrupt every 65.536 Second) +*/ +#endif +/* +// +*/ + +/* !!! NOTICE !!! + * How to adjust the value of High Speed External oscillator (HSE)? + The default value of HSE is define by "HSE_VALUE" in "ht32fxxxxx_nn.h". + If your board uses a different HSE speed, please add a new compiler preprocessor + C define, "HSE_VALUE=n000000" ("n" represents n MHz) in the toolchain/IDE, + or edit the "HSE_VALUE" in the "ht32f5xxxx_conf.h" file (this file). +*/ +/* +// Enable User Define HSE Value +// Enable user define HSE value to overwrite default "HSE_VALUE" define in "ht32fxxxxx_nn.h". +// HSE Value (Hz) +*/ +#if (0) +#define HSE_VALUE 16000000 +#endif +/* +// +*/ + +/* +// Enable CKOUT Function +*/ +#define ENABLE_CKOUT 0 + +/* +// Enable Get CK_ADC of "CKCU_GetClocksFrequency()" +// Enable ADC0_Freq and ADC1_Freq of the "CKCU_GetClocksFrequency()" function. It required the division calculation (by C Library) and increased the code size. +*/ +#define HT32_LIB_ENABLE_GET_CK_ADC 0 + +/* The DEBUG definition to enter debug mode for library */ +/* +// Library Debug Mode +*/ +#define HT32_LIB_DEBUG 0 + + +/* Enable/disable the specific peripheral inclusion */ + +// Library Inclusion Configuration +/* ADC -----------------------------------------------------------------------------------------------------*/ +/* +// ADC Library +*/ +#define _ADC 1 + +/* AES -----------------------------------------------------------------------------------------------------*/ +/* +// AES Library +*/ +#define _AES 1 + +/* BFTM ----------------------------------------------------------------------------------------------------*/ +/* +// BFTM Library +*/ +#define _BFTM 1 + +/* CAN -----------------------------------------------------------------------------------------------------*/ +/* +// CAN Library +*/ +#define _CAN 1 + +/* Clock Control -------------------------------------------------------------------------------------------*/ +/* +// Clock Control Library +*/ +#define _CKCU 1 + +/* Comparator ----------------------------------------------------------------------------------------------*/ +/* +// Comparator Library +*/ +#define _CMP 1 + +/* CRC -----------------------------------------------------------------------------------------------------*/ +/* +// CRC Library +*/ +#define _CRC 1 + +/* DAC -----------------------------------------------------------------------------------------------------*/ +/* +// DAC Library +*/ +#define _DAC 1 + +/* DAC Dual 16-bit -----------------------------------------------------------------------------------------*/ +/* +// DAC_Dual16 Library +*/ +#define _DAC_DUAL16 1 + +/* DIV -----------------------------------------------------------------------------------------------------*/ +/* +// DIV Library +*/ +#define _DIV 1 + +/* EBI -----------------------------------------------------------------------------------------------------*/ +/* +// EBI Library +*/ +#define _EBI 1 + +/* EXTI ----------------------------------------------------------------------------------------------------*/ +/* +// EXTI Library +*/ +#define _EXTI 1 + +/* Flash ---------------------------------------------------------------------------------------------------*/ +/* +// Flash Library +*/ +#define _FLASH 1 + +/* GPIO ----------------------------------------------------------------------------------------------------*/ +/* +// GPIO Library +*/ +#define _GPIO 1 + +/* GPTM ----------------------------------------------------------------------------------------------------*/ +/* +// GPTM Library +*/ +#define _GPTM 1 + +/* I2C -----------------------------------------------------------------------------------------------------*/ +/* +// I2C Library +*/ +#define _I2C 1 + +/* I2S -----------------------------------------------------------------------------------------------------*/ +/* +// I2S Library +*/ +#define _I2S 1 + +/* LCD -----------------------------------------------------------------------------------------------------*/ +/* +// LCD Library +*/ +#define _LCD 1 + +/* LEDC ----------------------------------------------------------------------------------------------------*/ +/* +// LEDC Library +*/ +#define _LEDC 1 + +/* MCTM ----------------------------------------------------------------------------------------------------*/ +/* +// MCTM Library +*/ +#define _MCTM 1 + +/* MIDI ----------------------------------------------------------------------------------------------------*/ +/* +// MIDI Library +*/ +#define _MIDI 1 + +/* OPA -----------------------------------------------------------------------------------------------------*/ +/* +// OPA +*/ +#define _OPA 1 + +/* PDMA ----------------------------------------------------------------------------------------------------*/ +/* +// PDMA Library +*/ +#define _PDMA 1 + +/* PWM -----------------------------------------------------------------------------------------------------*/ +/* +// PWM Library +*/ +#define _PWM 1 + +/* PWRCU ---------------------------------------------------------------------------------------------------*/ +/* +// PWRCU Library +*/ +#define _PWRCU 1 + +/* RSTCU ---------------------------------------------------------------------------------------------------*/ +/* +// RSTCU Library +*/ +#define _RSTCU 1 + +/* RTC -----------------------------------------------------------------------------------------------------*/ +/* +// RTC Library +*/ +#define _RTC 1 + +/* SCI -----------------------------------------------------------------------------------------------------*/ +/* +// SCI Library +*/ +#define _SCI 1 + +/* SCTM ----------------------------------------------------------------------------------------------------*/ +/* +// SCTM Library +*/ +#define _SCTM 1 + +/* SLED ----------------------------------------------------------------------------------------------------*/ +/* +// SLED Library +*/ +#define _SLED 1 + +/* SPI -----------------------------------------------------------------------------------------------------*/ +/* +// SPI Library +*/ +#define _SPI 1 + +/* TKEY ----------------------------------------------------------------------------------------------------*/ +/* +// TKEY Library +*/ +#define _TKEY 1 + +/* USART ---------------------------------------------------------------------------------------------------*/ +/* +// USART/UART Library +*/ +#define _USART 1 + +/* USBD ----------------------------------------------------------------------------------------------------*/ +/* +// USB Library +*/ +#define _USB 1 + +/* WDT -----------------------------------------------------------------------------------------------------*/ +/* +// WDT Library +*/ +#define _WDT 1 + +/* Misc ----------------------------------------------------------------------------------------------------*/ +/* +// Misc Library +*/ +#define _MISC 1 + +/* Serial --------------------------------------------------------------------------------------------------*/ +/* +// Serial Library +*/ +#define _SERIAL 1 + +/* Software DIV --------------------------------------------------------------------------------------------*/ +/* +// Software Divider Library +*/ +#define _SWDIV 1 + +/* Software Random Number ----------------------------------------------------------------------------------*/ +/* +// Software Random Number Library +*/ +#define _SWRAND 1 + + +// + +#endif diff --git a/bsp/ht32/ht32f53252/board/linker_scripts/link.icf b/bsp/ht32/ht32f53252/board/linker_scripts/link.icf new file mode 100644 index 00000000000..65c2bfc8b7c --- /dev/null +++ b/bsp/ht32/ht32f53252/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; \ No newline at end of file diff --git a/bsp/ht32/ht32f53252/board/linker_scripts/link.lds b/bsp/ht32/ht32f53252/board/linker_scripts/link.lds new file mode 100644 index 00000000000..27269dd77ea --- /dev/null +++ b/bsp/ht32/ht32f53252/board/linker_scripts/link.lds @@ -0,0 +1,156 @@ +/* + * linker script for AT32 with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 96k /* 96K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/ht32/ht32f53252/board/linker_scripts/link.sct b/bsp/ht32/ht32f53252/board/linker_scripts/link.sct new file mode 100644 index 00000000000..ece577cb3ea --- /dev/null +++ b/bsp/ht32/ht32f53252/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x00000000 0x0001FE00 { ; load region size_region + ER_IROM1 0x00000000 0x0001FE00 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00004000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/ht32/ht32f53252/board/src/board.c b/bsp/ht32/ht32f53252/board/src/board.c new file mode 100644 index 00000000000..e0160468e94 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/src/board.c @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#include "board.h" + +/* This feature will initialize the HT32 chip clock */ +void rt_hw_board_clock_init(void) +{ + +} diff --git a/bsp/ht32/ht32f53252/board/src/ht32_msp.c b/bsp/ht32/ht32f53252/board/src/ht32_msp.c new file mode 100644 index 00000000000..6d57bd4d4b6 --- /dev/null +++ b/bsp/ht32/ht32f53252/board/src/ht32_msp.c @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-04-08 QT-one first version + */ + +#include "ht32_msp.h" + +/* GPIO configuration for UART */ +#ifdef BSP_USING_UART +void ht32_usart_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; + HT_USART_TypeDef *usart_x = (HT_USART_TypeDef *)instance; +#ifdef BSP_USING_USART0 + if (HT_USART0 == usart_x) + { + CKCUClock.Bit.HTCFG_USART0_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_USART0_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Turn on UxART Rx internal pull up resistor to prevent unknow state */ + GPIO_PullResistorConfig(HTCFG_USART0_RX_GPIO_PORT, HTCFG_USART0_RX_GPIO_PIN, GPIO_PR_UP); + /* Config AFIO mode as UxART function */ + AFIO_GPxConfig(HTCFG_USART0_TX_GPIO_ID, HTCFG_USART0_TX_GPIO_PIN, AFIO_FUN_USART_UART); + AFIO_GPxConfig(HTCFG_USART0_RX_GPIO_ID, HTCFG_USART0_RX_GPIO_PIN, AFIO_FUN_USART_UART); + } +#endif +#ifdef BSP_USING_USART1 + if (HT_USART1 == usart_x) + { + CKCUClock.Bit.HTCFG_USART1_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_USART1_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Turn on UxART Rx internal pull up resistor to prevent unknow state */ + GPIO_PullResistorConfig(HTCFG_USART1_RX_GPIO_PORT, HTCFG_USART1_RX_GPIO_PIN, GPIO_PR_UP); + /* Config AFIO mode as UxART function */ + AFIO_GPxConfig(HTCFG_USART1_TX_GPIO_ID, HTCFG_USART1_TX_GPIO_PIN, AFIO_FUN_USART_UART); + AFIO_GPxConfig(HTCFG_USART1_RX_GPIO_ID, HTCFG_USART1_RX_GPIO_PIN, AFIO_FUN_USART_UART); + } +#endif +#ifdef BSP_USING_UART0 + if (HT_UART0 == usart_x) + { + CKCUClock.Bit.HTCFG_UART0_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_UART0_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Turn on UxART Rx internal pull up resistor to prevent unknow state */ + GPIO_PullResistorConfig(HTCFG_UART0_RX_GPIO_PORT, HTCFG_UART0_RX_GPIO_PIN, GPIO_PR_UP); + /* Config AFIO mode as UxART function */ + AFIO_GPxConfig(HTCFG_UART0_TX_GPIO_ID, HTCFG_UART0_TX_GPIO_PIN, AFIO_FUN_USART_UART); + AFIO_GPxConfig(HTCFG_UART0_RX_GPIO_ID, HTCFG_UART0_RX_GPIO_PIN, AFIO_FUN_USART_UART); + } +#endif +#ifdef BSP_USING_UART1 + if (HT_UART1 == usart_x) + { + CKCUClock.Bit.HTCFG_UART1_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_UART1_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Turn on UxART Rx internal pull up resistor to prevent unknow state */ + GPIO_PullResistorConfig(HTCFG_UART1_RX_GPIO_PORT, HTCFG_UART1_RX_GPIO_PIN, GPIO_PR_UP); + /* Config AFIO mode as UxART function */ + AFIO_GPxConfig(HTCFG_UART1_TX_GPIO_ID, HTCFG_UART1_TX_GPIO_PIN, AFIO_FUN_USART_UART); + AFIO_GPxConfig(HTCFG_UART1_RX_GPIO_ID, HTCFG_UART1_RX_GPIO_PIN, AFIO_FUN_USART_UART); + } +#endif +} +#endif + +/* GPIO configuration for SPI */ +#ifdef BSP_USING_SPI +void ht32_spi_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; + HT_SPI_TypeDef *spi_x = (HT_SPI_TypeDef *)instance; +#ifdef BSP_USING_SPI0 + if (HT_SPI0 == spi_x) + { + CKCUClock.Bit.HTCFG_SPI0_SCK_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SPI0_MISO_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SPI0_MOSI_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + AFIO_GPxConfig(HTCFG_SPI0_SCK_GPIO_ID, HTCFG_SPI0_SCK_GPIO_PIN, AFIO_FUN_SPI); + AFIO_GPxConfig(HTCFG_SPI0_MISO_GPIO_ID, HTCFG_SPI0_MISO_GPIO_PIN, AFIO_FUN_SPI); + AFIO_GPxConfig(HTCFG_SPI0_MOSI_GPIO_ID, HTCFG_SPI0_MOSI_GPIO_PIN, AFIO_FUN_SPI); + } +#endif +#ifdef BSP_USING_SPI1 + if (HT_SPI1 == spi_x) + { + CKCUClock.Bit.HTCFG_SPI1_SCK_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SPI1_MISO_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_SPI1_MOSI_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + AFIO_GPxConfig(HTCFG_SPI1_SCK_GPIO_ID, HTCFG_SPI1_SCK_GPIO_PIN, AFIO_FUN_SPI); + AFIO_GPxConfig(HTCFG_SPI1_MISO_GPIO_ID, HTCFG_SPI1_MISO_GPIO_PIN, AFIO_FUN_SPI); + AFIO_GPxConfig(HTCFG_SPI1_MOSI_GPIO_ID, HTCFG_SPI1_MOSI_GPIO_PIN, AFIO_FUN_SPI); + } +#endif +} +#endif + +/* GPIO configuration for I2C */ +#ifdef BSP_USING_I2C_HW +void ht32_hardware_i2c_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}}; + HT_I2C_TypeDef *i2c_x = (HT_I2C_TypeDef *)instance; +#ifdef BSP_USING_I2C0_HW + if (HT_I2C0 == i2c_x) + { + CKCUClock.Bit.HTCFG_I2C0_SCL_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_I2C0_SDA_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Configure GPIO to I2C mode */ + AFIO_GPxConfig(HTCFG_I2C0_SCL_GPIO_ID, HTCFG_I2C0_SCL_GPIO_PIN, AFIO_FUN_I2C); + AFIO_GPxConfig(HTCFG_I2C0_SDA_GPIO_ID, HTCFG_I2C0_SDA_GPIO_PIN, AFIO_FUN_I2C); + } +#endif +#ifdef BSP_USING_I2C1_HW + if (HT_I2C1 == i2c_x) + { + CKCUClock.Bit.HTCFG_I2C1_SCL_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_I2C1_SDA_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Configure GPIO to I2C mode */ + AFIO_GPxConfig(HTCFG_I2C1_SCL_GPIO_ID, HTCFG_I2C1_SCL_GPIO_PIN, AFIO_FUN_I2C); + AFIO_GPxConfig(HTCFG_I2C1_SDA_GPIO_ID, HTCFG_I2C1_SDA_GPIO_PIN, AFIO_FUN_I2C); + } +#endif +} +#endif + +/* GPIO configuration for ADC */ +#ifdef BSP_USING_ADC +void ht32_adc_gpio_init(void *instance,int8_t channel) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + HT_ADC_TypeDef *adc_x = (HT_ADC_TypeDef *)instance; +#ifdef BSP_USING_ADC0 + if (HT_ADC0 == adc_x) + { + /* Enable peripheral clock */ + CKCUClock.Bit.AFIO = 1; + CKCUClock.Bit.ADC0 = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + /* Configure AFIO mode as ADC function */ + switch(channel) + { + case 0: + AFIO_GPxConfig(HTCFG_ADC0CH0_GPIO_ID, HTCFG_ADC0CH0_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 1: + AFIO_GPxConfig(HTCFG_ADC0CH1_GPIO_ID, HTCFG_ADC0CH1_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 2: + AFIO_GPxConfig(HTCFG_ADC0CH2_GPIO_ID, HTCFG_ADC0CH2_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 3: + AFIO_GPxConfig(HTCFG_ADC0CH3_GPIO_ID, HTCFG_ADC0CH3_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 4: + AFIO_GPxConfig(HTCFG_ADC0CH4_GPIO_ID, HTCFG_ADC0CH4_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 5: + AFIO_GPxConfig(HTCFG_ADC0CH5_GPIO_ID, HTCFG_ADC0CH5_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 6: + AFIO_GPxConfig(HTCFG_ADC0CH6_GPIO_ID, HTCFG_ADC0CH6_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 7: + AFIO_GPxConfig(HTCFG_ADC0CH7_GPIO_ID, HTCFG_ADC0CH7_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 8: + AFIO_GPxConfig(HTCFG_ADC0CH8_GPIO_ID, HTCFG_ADC0CH8_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 9: + AFIO_GPxConfig(HTCFG_ADC0CH9_GPIO_ID, HTCFG_ADC0CH9_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 10: + AFIO_GPxConfig(HTCFG_ADC0CH10_GPIO_ID, HTCFG_ADC0CH10_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 11: + AFIO_GPxConfig(HTCFG_ADC0CH11_GPIO_ID, HTCFG_ADC0CH11_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 12: + AFIO_GPxConfig(HTCFG_ADC0CH12_GPIO_ID, HTCFG_ADC0CH12_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 13: + AFIO_GPxConfig(HTCFG_ADC0CH13_GPIO_ID, HTCFG_ADC0CH13_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 14: + AFIO_GPxConfig(HTCFG_ADC0CH14_GPIO_ID, HTCFG_ADC0CH14_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 15: + AFIO_GPxConfig(HTCFG_ADC0CH15_GPIO_ID, HTCFG_ADC0CH15_AFIO_PIN, AFIO_FUN_ADC0); + break; + default: + break; + } + } +#endif +#ifdef BSP_USING_ADC1 + if (HT_ADC1 == adc_x) + { + /* Enable peripheral clock */ + CKCUClock.Bit.AFIO = 1; + CKCUClock.Bit.ADC1 = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + /* Configure AFIO mode as ADC function */ + switch(channel) + { + case 0: + AFIO_GPxConfig(HTCFG_ADC1CH0_GPIO_ID, HTCFG_ADC1CH0_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 1: + AFIO_GPxConfig(HTCFG_ADC1CH1_GPIO_ID, HTCFG_ADC1CH1_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 2: + AFIO_GPxConfig(HTCFG_ADC1CH2_GPIO_ID, HTCFG_ADC1CH2_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 3: + AFIO_GPxConfig(HTCFG_ADC1CH3_GPIO_ID, HTCFG_ADC1CH3_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 4: + AFIO_GPxConfig(HTCFG_ADC1CH4_GPIO_ID, HTCFG_ADC1CH4_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 5: + AFIO_GPxConfig(HTCFG_ADC1CH5_GPIO_ID, HTCFG_ADC1CH5_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 6: + AFIO_GPxConfig(HTCFG_ADC1CH6_GPIO_ID, HTCFG_ADC1CH6_AFIO_PIN, AFIO_FUN_ADC0); + break; + case 7: + AFIO_GPxConfig(HTCFG_ADC1CH7_GPIO_ID, HTCFG_ADC1CH7_AFIO_PIN, AFIO_FUN_ADC0); + break; + default: + break; + } + } +#endif +} +#endif +/* GPIO configuration for ADC */ +#ifdef BSP_USING_CAN +void ht32_can_gpio_init(void *instance) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + HT_CAN_TypeDef *can_x = (HT_CAN_TypeDef *)instance; + + if (HT_CAN0 == can_x) + { + CKCUClock.Bit.HTCFG_CAN_TX_GPIO_CLK = 1; + CKCUClock.Bit.HTCFG_CAN_RX_GPIO_CLK = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + /* Configure GPIO to CAN mode */ + AFIO_GPxConfig(HTCFG_CAN_TX_GPIO_ID, HTCFG_CAN_TX_GPIO_PIN, AFIO_FUN_CAN); + AFIO_GPxConfig(HTCFG_CAN_RX_GPIO_ID, HTCFG_CAN_RX_GPIO_PIN, AFIO_FUN_CAN); + } + +} +#endif + + diff --git a/bsp/ht32/ht32f53252/figures/board.jpg b/bsp/ht32/ht32f53252/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8905a38e996a27915bcd2d39c449dbf590d1bf45 GIT binary patch literal 477663 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%0DMF~2KP6oUNNey4RqgvhpL#}NacQ=Kv5PQP3 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

M((Bd+W-yW%93@Gva1&)?Yy3CgLJ#lW$`5D`r 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%0Dps)}2JpPjNbZnm2T-l|U<`DfgcCQMK% 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�KwG&fT!G$%~>8i;N++oh)xR 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 R0hOA8$Zja1ZTCOl{V&2DH)a3; literal 0 HcmV?d00001 diff --git a/bsp/ht32/ht32f53252/project.uvoptx b/bsp/ht32/ht32f53252/project.uvoptx new file mode 100644 index 00000000000..454293cb527 --- /dev/null +++ b/bsp/ht32/ht32f53252/project.uvoptx @@ -0,0 +1,1203 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 2 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN2 -FF0HT32F -FS00 -FL0100000 -FF1HT32F_OPT -FS11FF00000 -FL11000 -FP0($$Device:HT32F53252$ARM\Flash\HT32F.FLM) -FP1($$Device:HT32F53252$ARM\Flash\HT32F_OPT.FLM)) + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S8 -C0 -P00 -TO18 -TC10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN2 -FF0HT32F -FS00 -FL01FC00 -FF1HT32F_OPT -FS11FF00000 -FL1400 + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + Applications + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 22 + 1 + 0 + 0 + 0 + board\src\board.c + board.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + board\src\ht32_msp.c + ht32_msp.c + 0 + 0 + + + 4 + 24 + 2 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\ARM\startup_ht32f5xxxx_15.s + startup_ht32f5xxxx_15.s + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\libraries\ht32_drivers\drv_common.c + drv_common.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\libraries\ht32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\libraries\ht32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + klibc + 0 + 0 + 0 + 0 + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 53 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 8 + 55 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + context_rvds.S + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + cpuport.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 9 + 57 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_gpio.c + ht32f5xxxx_gpio.c + 0 + 0 + + + 9 + 58 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + ht32_cm0plus_misc.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ledc.c + ht32f5xxxx_ledc.c + 0 + 0 + + + 9 + 60 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c + ht32f5xxxx_tm.c + 0 + 0 + + + 9 + 61 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c + ht32f5xxxx_wdt.c + 0 + 0 + + + 9 + 62 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_bftm.c + ht32f5xxxx_bftm.c + 0 + 0 + + + 9 + 63 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + ht32f5xxxx_usart.c + 0 + 0 + + + 9 + 64 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + ht32f5xxxx_flash.c + 0 + 0 + + + 9 + 65 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + ht32f5xxxx_ebi.c + 0 + 0 + + + 9 + 66 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c + ht32f5xxxx_ckcu.c + 0 + 0 + + + 9 + 67 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_div.c + ht32f5xxxx_div.c + 0 + 0 + + + 9 + 68 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c + ht32f5xxxx_pwrcu.c + 0 + 0 + + + 9 + 69 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c + ht32f5xxxx_i2c.c + 0 + 0 + + + 9 + 70 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + ht32f5xxxx_cmp.c + 0 + 0 + + + 9 + 71 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c + ht32f5xxxx_pdma.c + 0 + 0 + + + 9 + 72 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_can.c + ht32f5xxxx_can.c + 0 + 0 + + + 9 + 73 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_crc.c + ht32f5xxxx_crc.c + 0 + 0 + + + 9 + 74 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c + ht32f5xxxx_rtc.c + 0 + 0 + + + 9 + 75 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c + ht32f5xxxx_mctm.c + 0 + 0 + + + 9 + 76 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + ht32f5xxxx_adc.c + 0 + 0 + + + 9 + 77 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_15.c + system_ht32f5xxxx_15.c + 0 + 0 + + + 9 + 78 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c + ht32f5xxxx_exti.c + 0 + 0 + + + 9 + 79 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + ht32f5xxxx_rstcu.c + 0 + 0 + + + 9 + 80 + 1 + 0 + 0 + 0 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c + ht32f5xxxx_spi.c + 0 + 0 + + + + diff --git a/bsp/ht32/ht32f53252/project.uvprojx b/bsp/ht32/ht32f53252/project.uvprojx new file mode 100644 index 00000000000..4f6e9268d33 --- /dev/null +++ b/bsp/ht32/ht32f53252/project.uvprojx @@ -0,0 +1,2234 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060422::V5.06 update 4 (build 422)::ARMCC + + + HT32F53252 + Holtek + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack + IRAM(0x20000000-0x20003FFF) IROM(0x00000000-0x0001FBFF) CLOCK(8000000) CPUTYPE("Cortex-M0+") + + "STARTUP\Holtek\HT32F5xxxx\startup_ht32f53242_52.s" ("Holtek HT32F5xxxx Startup Code") + UL2CM3(-O142 -S0 -C0 -FO7 -FD20000000 -FC800 -FN2 -FF0HT32F -FS00 -FL01FC00 -FF1HT32F_OPT -FS11FF00000 -FL1400) + 0 + HT32F5xxxx_01.h + + + + + + + + + + SFD\Holtek\HT32F5xxxx\HT32F53242_52.SFR + 0 + 0 + + + + Holtek\HT32F5xxxx\ + Holtek\HT32F5xxxx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + + TARMCM1.DLL + -pCM0+ + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 1 + 0x0 + 0x1fc00 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x1fc00 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --gnu + __CLK_TCK=RT_TICK_PER_SECOND, USE_HT32_DRIVER, RT_USING_ARMLIBC, __STDC_LIMIT_MACROS, USE_HT32F53252_SK, USE_HT32F53242_52, USE_MEM_HT32F53252, __RTTHREAD__, RT_USING_LIBC + + ..\..\..\components\libc\posix\io\epoll;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\HT32_STD_5xxxx_FWLib\library\CMSIS\Include;..\..\..\components\drivers\phy;..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Include;..\..\..\components\drivers\include;.;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\libc\compilers\common\include;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\finsh;board\inc;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\libcpu\arm\common;..\libraries\ht32_drivers;applications;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\smp_call;..\..\..\components\drivers\include;..\libraries\usbd_library\inc;..\..\..\components\libc\compilers\common\extension;..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\inc;..\..\..\include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + USE_HT32_CHIP=28 + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\..\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\..\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\..\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_pin.c + 1 + ..\..\..\components\drivers\pin\dev_pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_serial.c + 1 + ..\..\..\components\drivers\serial\dev_serial.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board\src\board.c + + + ht32_msp.c + 1 + board\src\ht32_msp.c + + + startup_ht32f5xxxx_15.s + 2 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\ARM\startup_ht32f5xxxx_15.s + + + drv_common.c + 1 + ..\libraries\ht32_drivers\drv_common.c + + + drv_gpio.c + 1 + ..\libraries\ht32_drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\ht32_drivers\drv_usart.c + + + + + Finsh + + + msh_parse.c + 1 + ..\..\..\components\finsh\msh_parse.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\..\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\..\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\..\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\..\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + memheap.c + 1 + ..\..\..\src\memheap.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\..\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\..\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\..\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\..\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + kstring.c + 1 + ..\..\..\src\klibc\kstring.c + + + kstdio.c + 1 + ..\..\..\src\klibc\kstdio.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + + + libcpu + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + + + Libraries + + + ht32f5xxxx_gpio.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_gpio.c + + + ht32_cm0plus_misc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32_cm0plus_misc.c + + + ht32f5xxxx_ledc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ledc.c + + + ht32f5xxxx_tm.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_tm.c + + + ht32f5xxxx_wdt.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_wdt.c + + + ht32f5xxxx_bftm.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_bftm.c + + + ht32f5xxxx_usart.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_usart.c + + + ht32f5xxxx_flash.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_flash.c + + + ht32f5xxxx_ebi.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ebi.c + + + ht32f5xxxx_ckcu.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_ckcu.c + + + ht32f5xxxx_div.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_div.c + + + ht32f5xxxx_pwrcu.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pwrcu.c + + + ht32f5xxxx_i2c.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_i2c.c + + + ht32f5xxxx_cmp.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_cmp.c + + + ht32f5xxxx_pdma.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_pdma.c + + + ht32f5xxxx_can.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_can.c + + + ht32f5xxxx_crc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_crc.c + + + ht32f5xxxx_rtc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rtc.c + + + ht32f5xxxx_mctm.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_mctm.c + + + ht32f5xxxx_adc.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_adc.c + + + system_ht32f5xxxx_15.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\Device\Holtek\HT32F5xxxx\Source\system_ht32f5xxxx_15.c + + + ht32f5xxxx_exti.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_exti.c + + + ht32f5xxxx_rstcu.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_rstcu.c + + + ht32f5xxxx_spi.c + 1 + ..\libraries\HT32_STD_5xxxx_FWLib\library\HT32F5xxxx_Driver\src\ht32f5xxxx_spi.c + + + + + + + + + + + + + +
diff --git a/bsp/ht32/ht32f53252/rtconfig.h b/bsp/ht32/ht32f53252/rtconfig.h new file mode 100644 index 00000000000..54fac2e6db4 --- /dev/null +++ b/bsp/ht32/ht32f53252/rtconfig.h @@ -0,0 +1,394 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 8 +#define RT_CPUS_NR 1 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 512 + +/* kservice options */ + +/* end of kservice options */ + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_MEMHEAP +#define RT_MEMHEAP_FAST_MODE +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "usart1" +#define RT_VER_NUM 0x50200 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M0 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 1024 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 1024 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 32 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ +#define SOC_FAMILY_HT32 +#define SOC_SERIES_HT32F5 + +/* Hardware Drivers Config */ + +/* Chip Configuration */ + +#define SOC_KERNEL +#define CORTEX_M0 +#define SOC_HT32F53252 +/* end of Chip Configuration */ + +/* Onboard Peripheral Drivers */ + +/* end of Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_USART1 +#define BSP_USING_USART1_NAME "usart1" +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/bsp/ht32/ht32f53252/rtconfig.py b/bsp/ht32/ht32f53252/rtconfig.py new file mode 100644 index 00000000000..6f853dccc25 --- /dev/null +++ b/bsp/ht32/ht32f53252/rtconfig.py @@ -0,0 +1,152 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m0' +CROSS_TOOL='keil' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' +# EXEC_PATH = r'D:\keil5\keil_v532\UV4' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m0 -mthumb -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + CFLAGS += ' -D USE_HT32F53242_52' + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M0 ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M0' + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M0' + AFLAGS += ' --fpu None' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +def dist_handle(BSP_ROOT, dist_dir): + import sys + cwd_path = os.getcwd() + sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools')) + from sdk_dist import dist_do_building + dist_do_building(BSP_ROOT, dist_dir) + diff --git a/bsp/ht32/ht32f53252/template.uvoptx b/bsp/ht32/ht32f53252/template.uvoptx new file mode 100644 index 00000000000..dd685d044b7 --- /dev/null +++ b/bsp/ht32/ht32f53252/template.uvoptx @@ -0,0 +1,179 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 2 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN2 -FF0HT32F -FS00 -FL0100000 -FF1HT32F_OPT -FS11FF00000 -FL11000 -FP0($$Device:HT32F53252$ARM\Flash\HT32F.FLM) -FP1($$Device:HT32F53252$ARM\Flash\HT32F_OPT.FLM)) + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S8 -C0 -P00 -TO18 -TC10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN2 -FF0HT32F -FS00 -FL01FC00 -FF1HT32F_OPT -FS11FF00000 -FL1400 + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/ht32/ht32f53252/template.uvprojx b/bsp/ht32/ht32f53252/template.uvprojx new file mode 100644 index 00000000000..f799045dfb3 --- /dev/null +++ b/bsp/ht32/ht32f53252/template.uvprojx @@ -0,0 +1,391 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + + + HT32F53252 + Holtek + Holtek.HT32_DFP.1.0.55 + https://mcu.holtek.com.tw/pack + IRAM(0x20000000-0x20003FFF) IROM(0x00000000-0x0001FBFF) CLOCK(8000000) CPUTYPE("Cortex-M0+") + + "STARTUP\Holtek\HT32F5xxxx\startup_ht32f53242_52.s" ("Holtek HT32F5xxxx Startup Code") + UL2CM3(-O142 -S0 -C0 -FO7 -FD20000000 -FC800 -FN2 -FF0HT32F -FS00 -FL01FC00 -FF1HT32F_OPT -FS11FF00000 -FL1400) + 0 + HT32F5xxxx_01.h + + + + + + + + + + SFD\Holtek\HT32F5xxxx\HT32F53242_52.SFR + 0 + 0 + + + + Holtek\HT32F5xxxx\ + Holtek\HT32F5xxxx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + + TARMCM1.DLL + -pCM0+ + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 0 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 1 + 0x0 + 0x1fc00 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x1fc00 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + --gnu + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + USE_HT32_CHIP=28 + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
diff --git a/bsp/ht32/libraries/.ignore_format.yml b/bsp/ht32/libraries/.ignore_format.yml index 65b2f1a1564..265fe032432 100644 --- a/bsp/ht32/libraries/.ignore_format.yml +++ b/bsp/ht32/libraries/.ignore_format.yml @@ -5,3 +5,4 @@ dir_path: - HT32_STD_1xxxx_FWLib - HT32_STD_5xxxx_FWLib +- usbd_library \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/Release_Notes.txt b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/Release_Notes.txt index 20ad57f3fc1..322af83bff3 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/Release_Notes.txt +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/Release_Notes.txt @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file Release_Notes.txt - * @version V1.4.1 - * @date 2023-10-31 + * @version V1.5.1 + * @date 2023-11-08 * @brief The Release notes of HT32 Firmware Library. ************************************************************************************************************* * @attention @@ -34,6 +34,83 @@ // HT32F12365, HT32F12366 // HT32F22366 +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_1xxxx_FWLib_V1.5.1_3190 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-11-08 + + Main Changes + + Add new examples: + - "Tips/Checksum_CRC16" + - "Tips/StackOnTop" + + Add HT32 Stack Usage Analysis feature. + - Modify "ht32f1xxxx_conf.h", add "HTCFG_STACK_USAGE_ANALYSIS" setting for enabling HT32 Stack Usage + Analysis. + - Update project templates and "ht32_cm3_misc.c/.h", add "StackUsageAnalysisInit()" function to + initialize stack. + - Update project files, add HT32 Stack Usage Analysis component viewer. + - Update and sync "startup_ht32f1xxxx_nn.s" for the "Stack On Top" and "Stack Usage Analysis" feature." + - Add "USE_LIBCFG_RAM_SIZE" define in Keil project files for the "Stack On Top" feature. + + Rename WDT parameters. + - Old Name | New Name + - --------------------------------- | ---------------------------- + - "MODE0_WDTSHLT_BOTH" | "WDT_SLEEP_HALT_NONE" + - "MODE0_WDTSHLT_SLEEP" | "WDT_SLEEP_HALT_DEEPSLEEP" + - "MODE0_WDTSHLT_SLEEP" | "WDT_SLEEP_HALT_ALL" + + Fix "AES_SetKeyTable()" and "AES_SetVectorTable()" Key and Vector index errors, which cause incorrect AES + encryption and decryption. + + Update example, add "__ALIGN4" to variables and enforced type conversion for 4 bytes read/write API calls. + - "AES/CBC" + - "AES/CTR" + - "AES/ECB" + + Modify "ht32f5xxxx_01.h", fix the MCTM alias mismatch. + - "MCTMn_IRQHandler" alias from "MCTM0_G_IRQHandler" to "MCTM0_UP_IRQHandler" + + Update USB example, add the process of detecting USB bus status before USBDCore_LowPower(). + - "CKCU/HSI_AutoTrim_By_USB" + - "USBD/*" + + Improve the thread-safe capability of "utilities/common/ring_buffer.c". + + Modify "ht32f1xxxx_01.h" to add alignment and packing attributes for ARM compiler versions, with GCC fallback. + + Update "ht32f1xxxx_rtc.c", modify the RTC_LSECmd() related flow. + + Modify "WDT/Auto_Enable" example to change the mechanism of the example. + + Update "ht32f12366_sk.h" to share EBI_BL pin with LED3. + + Others + + Update comment, format, typing error, and coding style. + + Update project related file and setting. + + Update CKCU API. Enhanced program stability with robustness settings for parameter "PCLKPrescaler" + in "CKCU_SetPeripPrescaler(..., CKCU_APBCLKPRE_TypeDef PCLKPrescaler)". + + Modify "void FLASH_SetRemappingMode(FLASH_Vector FLASH_BOOT_x);". Changed parameter name from + "RemapMode" to "FLASH_BOOT_x". + + Update "SPI_DUALCmd()" and "SPI_SoftwareSELCmd()" make sure the SPI Bus is not busy + before changing the settings. + + Modify "ht32_dependency.h",to change the preprocessors for dependency check. + + Update the following middleware. + "utilities/middleware/eeprom_emulation.c" + "utilities/middleware/i2c_master.c" + "utilities/middleware/i2c_master.h" + "utilities/middleware/spi_module.c" + "utilities/middleware/spi_module.h" + "utilities/middleware/spi_module_config_templet.h" + "utilities/middleware/uart_module.c" + "utilities/middleware/uart_module.h" + + Update AES examples. + - Change the key, IV, and plain text from hex array to string, making the result easier to compare with + online tools. + - Add expected cipher text and compare it with the MCU's H/W AES result as an error-proofing mechanism." + + Update the following readme file. + - "CKCU/CKCU_HSI_AutoTrim_By_USB" + - "CKCU/CKCU_HSI_AutoTrim_By_LSE" + - "USBD/*" + + Modify "afterbuild.bat" to add logic to use ARMCC or ARMCLANG fromelf tool based on available toolchain. + + Add "_ProjectConfig.ini" in the "CKCU/HSI_AutoTrim_By_LSE" example. + + Update "project_template/Script" for improving script mechanism. + - "Script/_CreateProjectConfScript.bat" + - "Script/_CreateProjectScript.bat" + - "Script/_ht32_ic_name.ini" + + Update e-Link32 Pro/Lite Command line tool as "V1.20" ("utilities/elink32pro/eLink32pro.exe"). + + Change path of the "Holtek.HT32_DFP.latest.pack". + + /*----------------------------------------------------------------------------------------------------------*/ /* HT32_STD_1xxxx_FWLib_V1.4.1_2982 */ /*----------------------------------------------------------------------------------------------------------*/ @@ -45,9 +122,9 @@ + Modify examples below, add volatile qualifiers on some variables (in the for loop usage) to fix the Arm Compiler Version 6 optimization issue. ("u32" to "vu32", unsigned int to volatile unsigned int). - - “PWRCU/PowerDown_WAKEUPPin” - - “PWRCU/PowerDown_RTC” - - “TM/PWM” + - "PWRCU/PowerDown_WAKEUPPin" + - "PWRCU/PowerDown_RTC" + - "TM/PWM" + Modify examples below, use separate "if" statements instead of "if-else" to avoid double-entry ISR. - "PWRCU/DeepSleepMode1" - "PWRCU/DeepSleepMode2" diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/SConscript b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/SConscript index ef04fa4fa95..7e3699bd214 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/SConscript +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/SConscript @@ -2,37 +2,11 @@ import os import sys import rtconfig from building import * - -def get_source(ic_model, file_path, system_path, base_path): - source_path = [] - files_list = [] - readafter = 0 - if not os.path.isfile(file_path): - return - - with open(file_path, 'r') as file: - # content = file.read() - for line in file: - if readafter == 2 and line.find('>') != -1: - break - if readafter == 2: - files_list.append(line.strip()) - if line.find(ic_model) != -1: - readafter = 1 - if readafter == 1 and line.find('<') != -1: - readafter = 2 - for line in files_list: - if line.find('system') != -1: - source_path.append(os.path.join(system_path, line.strip())) - else: - source_path.append(os.path.join(base_path, line.strip())) - return source_path - Import('rtconfig') tools_path = os.path.normpath(os.getcwd() + '../../..' + '/tools') sys.path.append(tools_path) - +from sdk_dist import get_source source_file_path = os.path.join(os.getcwd(), 'Source_file') base_path = 'library/HT32F1xxxx_Driver/src/' diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h index f2bcf5de2ad..d8500195d4a 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Include/ht32f1xxxx_01.h @@ -1,8 +1,8 @@ /***************************************************************************//** * @file ht32f1xxxx_01.h * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File - * @version $Rev:: 2914 $ - * @date $Date:: 2023-05-18 #$ + * @version $Rev:: 3097 $ + * @date $Date:: 2024-06-20 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -156,14 +156,14 @@ typedef enum IRQn #endif ADC0_IRQn = 25, /*!< ADC Interrupt */ #if !defined(USE_HT32F12364) - MCTM0BRK_IRQn = 27, /*!< MCTM0 BRK interrupt */ - MCTM0UP_IRQn = 28, /*!< MCTM0 UP interrupt */ - MCTM0TR_IRQn = 29, /*!< MCTM0 TR interrupt */ - MCTM0CC_IRQn = 30, /*!< MCTM0 CC interrupt */ - MCTM1BRK_IRQn = 31, /*!< MCTM1 BRK interrupt */ - MCTM1UP_IRQn = 32, /*!< MCTM1 UP interrupt */ - MCTM1TR_IRQn = 33, /*!< MCTM1 TR interrupt */ - MCTM1CC_IRQn = 34, /*!< MCTM1 CC interrupt */ + MCTM0_BRK_IRQn = 27, /*!< MCTM0 BRK interrupt */ + MCTM0_UP_IRQn = 28, /*!< MCTM0 UP interrupt */ + MCTM0_TR_IRQn = 29, /*!< MCTM0 TR interrupt */ + MCTM0_CC_IRQn = 30, /*!< MCTM0 CC interrupt */ + MCTM1_BRK_IRQn = 31, /*!< MCTM1 BRK interrupt */ + MCTM1_UP_IRQn = 32, /*!< MCTM1 UP interrupt */ + MCTM1_TR_IRQn = 33, /*!< MCTM1 TR interrupt */ + MCTM1_CC_IRQn = 34, /*!< MCTM1 CC interrupt */ #endif GPTM0_IRQn = 35, /*!< General-Purpose Timer0 Interrupt */ #if !defined(USE_HT32F12364) @@ -223,10 +223,10 @@ typedef enum IRQn #endif } IRQn_Type; -#define MCTM0_IRQn MCTM0UP_IRQn -#define MCTM0_IRQHandler MCTM0UP_IRQHandler -#define MCTM1_IRQn MCTM1UP_IRQn -#define MCTM1_IRQHandler MCTM1UP_IRQHandler +#define MCTM0_IRQn MCTM0_UP_IRQn +#define MCTM0_IRQHandler MCTM0_UP_IRQHandler +#define MCTM1_IRQn MCTM1_UP_IRQn +#define MCTM1_IRQHandler MCTM1_UP_IRQHandler /** @@ -303,13 +303,18 @@ typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; #if defined (__CC_ARM) #define __ALIGN4 __align(4) +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #define __ALIGN4 __attribute__((aligned(4))) #elif defined (__ICCARM__) #define __ALIGN4 _Pragma("data_alignment = 4") #elif defined (__GNUC__) #define __ALIGN4 __attribute__((aligned(4))) #endif -#if defined (__GNUC__) +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #define __PACKED_H + #define __PACKED_F __attribute__ ((packed)) +#elif defined (__GNUC__) #define __PACKED_H #define __PACKED_F __attribute__ ((packed)) #elif defined (__ICCARM__) || (__CC_ARM) diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12345.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12345.s index f3f24a1faf0..aaea73066fd 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12345.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12345.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_01.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -49,13 +49,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -125,14 +136,14 @@ __Vectors DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -330,14 +341,14 @@ Default_Handler PROC EXPORT EXTI15_IRQHandler [WEAK] EXPORT COMP_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] - EXPORT MCTM0BRK_IRQHandler [WEAK] - EXPORT MCTM0UP_IRQHandler [WEAK] - EXPORT MCTM0TR_IRQHandler [WEAK] - EXPORT MCTM0CC_IRQHandler [WEAK] - EXPORT MCTM1BRK_IRQHandler [WEAK] - EXPORT MCTM1UP_IRQHandler [WEAK] - EXPORT MCTM1TR_IRQHandler [WEAK] - EXPORT MCTM1CC_IRQHandler [WEAK] + EXPORT MCTM0_BRK_IRQHandler [WEAK] + EXPORT MCTM0_UP_IRQHandler [WEAK] + EXPORT MCTM0_TR_IRQHandler [WEAK] + EXPORT MCTM0_CC_IRQHandler [WEAK] + EXPORT MCTM1_BRK_IRQHandler [WEAK] + EXPORT MCTM1_UP_IRQHandler [WEAK] + EXPORT MCTM1_TR_IRQHandler [WEAK] + EXPORT MCTM1_CC_IRQHandler [WEAK] EXPORT GPTM0_IRQHandler [WEAK] EXPORT GPTM1_IRQHandler [WEAK] EXPORT BFTM0_IRQHandler [WEAK] @@ -395,14 +406,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler @@ -442,10 +453,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -456,14 +468,22 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN ENDIF - END + END \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12364.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12364.s index a1a24ab522b..dd77afac019 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12364.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12364.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_03.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -366,10 +377,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -380,11 +392,19 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12365_66.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12365_66.s index 3381f582403..0ee3a5b64d3 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12365_66.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f12365_66.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_01.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -49,13 +49,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -125,14 +136,14 @@ __Vectors DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -330,14 +341,14 @@ Default_Handler PROC EXPORT EXTI15_IRQHandler [WEAK] EXPORT COMP_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] - EXPORT MCTM0BRK_IRQHandler [WEAK] - EXPORT MCTM0UP_IRQHandler [WEAK] - EXPORT MCTM0TR_IRQHandler [WEAK] - EXPORT MCTM0CC_IRQHandler [WEAK] - EXPORT MCTM1BRK_IRQHandler [WEAK] - EXPORT MCTM1UP_IRQHandler [WEAK] - EXPORT MCTM1TR_IRQHandler [WEAK] - EXPORT MCTM1CC_IRQHandler [WEAK] + EXPORT MCTM0_BRK_IRQHandler [WEAK] + EXPORT MCTM0_UP_IRQHandler [WEAK] + EXPORT MCTM0_TR_IRQHandler [WEAK] + EXPORT MCTM0_CC_IRQHandler [WEAK] + EXPORT MCTM1_BRK_IRQHandler [WEAK] + EXPORT MCTM1_UP_IRQHandler [WEAK] + EXPORT MCTM1_TR_IRQHandler [WEAK] + EXPORT MCTM1_CC_IRQHandler [WEAK] EXPORT GPTM0_IRQHandler [WEAK] EXPORT GPTM1_IRQHandler [WEAK] EXPORT BFTM0_IRQHandler [WEAK] @@ -395,14 +406,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler @@ -442,10 +453,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -456,14 +468,22 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN ENDIF - END + END \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f165x.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f165x.s index 9a0fd83e614..f4c626c6580 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f165x.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f165x.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_01.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -49,13 +49,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -125,14 +136,14 @@ __Vectors DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -330,14 +341,14 @@ Default_Handler PROC EXPORT EXTI15_IRQHandler [WEAK] EXPORT COMP_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] - EXPORT MCTM0BRK_IRQHandler [WEAK] - EXPORT MCTM0UP_IRQHandler [WEAK] - EXPORT MCTM0TR_IRQHandler [WEAK] - EXPORT MCTM0CC_IRQHandler [WEAK] - EXPORT MCTM1BRK_IRQHandler [WEAK] - EXPORT MCTM1UP_IRQHandler [WEAK] - EXPORT MCTM1TR_IRQHandler [WEAK] - EXPORT MCTM1CC_IRQHandler [WEAK] + EXPORT MCTM0_BRK_IRQHandler [WEAK] + EXPORT MCTM0_UP_IRQHandler [WEAK] + EXPORT MCTM0_TR_IRQHandler [WEAK] + EXPORT MCTM0_CC_IRQHandler [WEAK] + EXPORT MCTM1_BRK_IRQHandler [WEAK] + EXPORT MCTM1_UP_IRQHandler [WEAK] + EXPORT MCTM1_TR_IRQHandler [WEAK] + EXPORT MCTM1_CC_IRQHandler [WEAK] EXPORT GPTM0_IRQHandler [WEAK] EXPORT GPTM1_IRQHandler [WEAK] EXPORT BFTM0_IRQHandler [WEAK] @@ -395,14 +406,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler @@ -442,10 +453,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -456,14 +468,22 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN ENDIF - END + END \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_01.s index 481edd75d07..aa08b6c8605 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_01.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_01.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -49,13 +49,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -125,14 +136,14 @@ __Vectors DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -330,14 +341,14 @@ Default_Handler PROC EXPORT EXTI15_IRQHandler [WEAK] EXPORT COMP_IRQHandler [WEAK] EXPORT ADC_IRQHandler [WEAK] - EXPORT MCTM0BRK_IRQHandler [WEAK] - EXPORT MCTM0UP_IRQHandler [WEAK] - EXPORT MCTM0TR_IRQHandler [WEAK] - EXPORT MCTM0CC_IRQHandler [WEAK] - EXPORT MCTM1BRK_IRQHandler [WEAK] - EXPORT MCTM1UP_IRQHandler [WEAK] - EXPORT MCTM1TR_IRQHandler [WEAK] - EXPORT MCTM1CC_IRQHandler [WEAK] + EXPORT MCTM0_BRK_IRQHandler [WEAK] + EXPORT MCTM0_UP_IRQHandler [WEAK] + EXPORT MCTM0_TR_IRQHandler [WEAK] + EXPORT MCTM0_CC_IRQHandler [WEAK] + EXPORT MCTM1_BRK_IRQHandler [WEAK] + EXPORT MCTM1_UP_IRQHandler [WEAK] + EXPORT MCTM1_TR_IRQHandler [WEAK] + EXPORT MCTM1_CC_IRQHandler [WEAK] EXPORT GPTM0_IRQHandler [WEAK] EXPORT GPTM1_IRQHandler [WEAK] EXPORT BFTM0_IRQHandler [WEAK] @@ -395,14 +406,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler @@ -442,10 +453,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -456,14 +468,22 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN ENDIF - END + END \ No newline at end of file diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_03.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_03.s index 323e76c6b6e..41df8c40c10 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_03.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/ARM/startup_ht32f1xxxx_03.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_03.s -; Version : $Rev:: 2524 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 3052 $ +; Date : $Date:: 2024-02-26 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-131072:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-131072:8> Heap_Size EQU 0 @@ -366,10 +377,11 @@ AES_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -380,11 +392,19 @@ AES_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/CodeSourcery/startup_ht32f1xxxx_cs3_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/CodeSourcery/startup_ht32f1xxxx_cs3_01.s index 0e11813688a..2e47e3309e4 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/CodeSourcery/startup_ht32f1xxxx_cs3_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/CodeSourcery/startup_ht32f1xxxx_cs3_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_cs3_01.s -; Version : $Rev:: 1578 $ -; Date : $Date:: 2019-03-29 #$ +; Version : $Rev:: 3030 $ +; Date : $Date:: 2024-01-31 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -139,14 +139,14 @@ __cs3_interrupt_vector_cortex_m: .long COMP_IRQHandler /* 24, 40, 0x0A0, */ .long ADC_IRQHandler /* 25, 41, 0x0A4, */ .long _RESERVED /* 26, 42, 0x0A8, */ - .long MCTM0BRK_IRQHandler /* 27, 43, 0x0AC, */ - .long MCTM0UP_IRQHandler /* 28, 44, 0x0B0, */ - .long MCTM0TR_IRQHandler /* 29, 45, 0x0B4, */ - .long MCTM0CC_IRQHandler /* 30, 46, 0x0B8, */ - .long MCTM1BRK_IRQHandler /* 31, 47, 0x0BC, */ - .long MCTM1UP_IRQHandler /* 32, 48, 0x0C0, */ - .long MCTM1TR_IRQHandler /* 33, 49, 0x0C4, */ - .long MCTM1CC_IRQHandler /* 34, 50, 0x0C8, */ + .long MCTM0_BRK_IRQHandler /* 27, 43, 0x0AC, */ + .long MCTM0_UP_IRQHandler /* 28, 44, 0x0B0, */ + .long MCTM0_TR_IRQHandler /* 29, 45, 0x0B4, */ + .long MCTM0_CC_IRQHandler /* 30, 46, 0x0B8, */ + .long MCTM1_BRK_IRQHandler /* 31, 47, 0x0BC, */ + .long MCTM1_UP_IRQHandler /* 32, 48, 0x0C0, */ + .long MCTM1_TR_IRQHandler /* 33, 49, 0x0C4, */ + .long MCTM1_CC_IRQHandler /* 34, 50, 0x0C8, */ .long GPTM0_IRQHandler /* 35, 51, 0x0CC, */ .long GPTM1_IRQHandler /* 36, 52, 0x0D0, */ .long _RESERVED /* 37, 53, 0x0D4, */ @@ -384,14 +384,14 @@ Default_Handler: IRQ EXTI15_IRQHandler IRQ COMP_IRQHandler IRQ ADC_IRQHandler - IRQ MCTM0BRK_IRQHandler - IRQ MCTM0UP_IRQHandler - IRQ MCTM0TR_IRQHandler - IRQ MCTM0CC_IRQHandler - IRQ MCTM1BRK_IRQHandler - IRQ MCTM1UP_IRQHandler - IRQ MCTM1TR_IRQHandler - IRQ MCTM1CC_IRQHandler + IRQ MCTM0_BRK_IRQHandler + IRQ MCTM0_UP_IRQHandler + IRQ MCTM0_TR_IRQHandler + IRQ MCTM0_CC_IRQHandler + IRQ MCTM1_BRK_IRQHandler + IRQ MCTM1_UP_IRQHandler + IRQ MCTM1_TR_IRQHandler + IRQ MCTM1_CC_IRQHandler IRQ GPTM0_IRQHandler IRQ GPTM1_IRQHandler IRQ BFTM0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/GCC/startup_ht32f1xxxx_gcc_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/GCC/startup_ht32f1xxxx_gcc_01.s index 623ce3b725f..aede8caf55e 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/GCC/startup_ht32f1xxxx_gcc_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/GCC/startup_ht32f1xxxx_gcc_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_gcc_01.s -; Version : $Rev:: 1578 $ -; Date : $Date:: 2019-03-29 #$ +; Version : $Rev:: 3030 $ +; Date : $Date:: 2024-01-31 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -163,14 +163,14 @@ __interrupt_vector_cortex_m: .long COMP_IRQHandler /* 24, 40, 0x0A0, */ .long ADC_IRQHandler /* 25, 41, 0x0A4, */ .long _RESERVED /* 26, 42, 0x0A8, */ - .long MCTM0BRK_IRQHandler /* 27, 43, 0x0AC, */ - .long MCTM0UP_IRQHandler /* 28, 44, 0x0B0, */ - .long MCTM0TR_IRQHandler /* 29, 45, 0x0B4, */ - .long MCTM0CC_IRQHandler /* 30, 46, 0x0B8, */ - .long MCTM1BRK_IRQHandler /* 31, 47, 0x0BC, */ - .long MCTM1UP_IRQHandler /* 32, 48, 0x0C0, */ - .long MCTM1TR_IRQHandler /* 33, 49, 0x0C4, */ - .long MCTM1CC_IRQHandler /* 34, 50, 0x0C8, */ + .long MCTM0_BRK_IRQHandler /* 27, 43, 0x0AC, */ + .long MCTM0_UP_IRQHandler /* 28, 44, 0x0B0, */ + .long MCTM0_TR_IRQHandler /* 29, 45, 0x0B4, */ + .long MCTM0_CC_IRQHandler /* 30, 46, 0x0B8, */ + .long MCTM1_BRK_IRQHandler /* 31, 47, 0x0BC, */ + .long MCTM1_UP_IRQHandler /* 32, 48, 0x0C0, */ + .long MCTM1_TR_IRQHandler /* 33, 49, 0x0C4, */ + .long MCTM1_CC_IRQHandler /* 34, 50, 0x0C8, */ .long GPTM0_IRQHandler /* 35, 51, 0x0CC, */ .long GPTM1_IRQHandler /* 36, 52, 0x0D0, */ .long _RESERVED /* 37, 53, 0x0D4, */ @@ -442,14 +442,14 @@ Default_Handler: IRQ EXTI15_IRQHandler IRQ COMP_IRQHandler IRQ ADC_IRQHandler - IRQ MCTM0BRK_IRQHandler - IRQ MCTM0UP_IRQHandler - IRQ MCTM0TR_IRQHandler - IRQ MCTM0CC_IRQHandler - IRQ MCTM1BRK_IRQHandler - IRQ MCTM1UP_IRQHandler - IRQ MCTM1TR_IRQHandler - IRQ MCTM1CC_IRQHandler + IRQ MCTM0_BRK_IRQHandler + IRQ MCTM0_UP_IRQHandler + IRQ MCTM0_TR_IRQHandler + IRQ MCTM0_CC_IRQHandler + IRQ MCTM1_BRK_IRQHandler + IRQ MCTM1_UP_IRQHandler + IRQ MCTM1_TR_IRQHandler + IRQ MCTM1_CC_IRQHandler IRQ GPTM0_IRQHandler IRQ GPTM1_IRQHandler IRQ BFTM0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/IAR/startup_ht32f1xxxx_iar_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/IAR/startup_ht32f1xxxx_iar_01.s index 331f561dc03..1c37c2d79f5 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/IAR/startup_ht32f1xxxx_iar_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/IAR/startup_ht32f1xxxx_iar_01.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_iar_01.s -; Version : $Rev:: 1774 $ -; Date : $Date:: 2019-07-25 #$ +; Version : $Rev:: 3030 $ +; Date : $Date:: 2024-01-31 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -104,14 +104,14 @@ __vector_table DCD COMP_IRQHandler ; 24, 40, 0x0A0, DCD ADC_IRQHandler ; 25, 41, 0x0A4, DCD _RESERVED ; 26, 42, 0x0A8, - DCD MCTM0BRK_IRQHandler ; 27, 43, 0x0AC, - DCD MCTM0UP_IRQHandler ; 28, 44, 0x0B0, - DCD MCTM0TR_IRQHandler ; 29, 45, 0x0B4, - DCD MCTM0CC_IRQHandler ; 30, 46, 0x0B8, - DCD MCTM1BRK_IRQHandler ; 31, 47, 0x0BC, - DCD MCTM1UP_IRQHandler ; 32, 48, 0x0C0, - DCD MCTM1TR_IRQHandler ; 33, 49, 0x0C4, - DCD MCTM1CC_IRQHandler ; 34, 50, 0x0C8, + DCD MCTM0_BRK_IRQHandler ; 27, 43, 0x0AC, + DCD MCTM0_UP_IRQHandler ; 28, 44, 0x0B0, + DCD MCTM0_TR_IRQHandler ; 29, 45, 0x0B4, + DCD MCTM0_CC_IRQHandler ; 30, 46, 0x0B8, + DCD MCTM1_BRK_IRQHandler ; 31, 47, 0x0BC, + DCD MCTM1_UP_IRQHandler ; 32, 48, 0x0C0, + DCD MCTM1_TR_IRQHandler ; 33, 49, 0x0C4, + DCD MCTM1_CC_IRQHandler ; 34, 50, 0x0C8, DCD GPTM0_IRQHandler ; 35, 51, 0x0CC, DCD GPTM1_IRQHandler ; 36, 52, 0x0D0, DCD _RESERVED ; 37, 53, 0x0D4, @@ -306,14 +306,14 @@ SysTick_Handler PUBWEAK EXTI15_IRQHandler PUBWEAK COMP_IRQHandler PUBWEAK ADC_IRQHandler - PUBWEAK MCTM0BRK_IRQHandler - PUBWEAK MCTM0UP_IRQHandler - PUBWEAK MCTM0TR_IRQHandler - PUBWEAK MCTM0CC_IRQHandler - PUBWEAK MCTM1BRK_IRQHandler - PUBWEAK MCTM1UP_IRQHandler - PUBWEAK MCTM1TR_IRQHandler - PUBWEAK MCTM1CC_IRQHandler + PUBWEAK MCTM0_BRK_IRQHandler + PUBWEAK MCTM0_UP_IRQHandler + PUBWEAK MCTM0_TR_IRQHandler + PUBWEAK MCTM0_CC_IRQHandler + PUBWEAK MCTM1_BRK_IRQHandler + PUBWEAK MCTM1_UP_IRQHandler + PUBWEAK MCTM1_TR_IRQHandler + PUBWEAK MCTM1_CC_IRQHandler PUBWEAK GPTM0_IRQHandler PUBWEAK GPTM1_IRQHandler PUBWEAK BFTM0_IRQHandler @@ -372,14 +372,14 @@ EXTI14_IRQHandler EXTI15_IRQHandler COMP_IRQHandler ADC_IRQHandler -MCTM0BRK_IRQHandler -MCTM0UP_IRQHandler -MCTM0TR_IRQHandler -MCTM0CC_IRQHandler -MCTM1BRK_IRQHandler -MCTM1UP_IRQHandler -MCTM1TR_IRQHandler -MCTM1CC_IRQHandler +MCTM0_BRK_IRQHandler +MCTM0_UP_IRQHandler +MCTM0_TR_IRQHandler +MCTM0_CC_IRQHandler +MCTM1_BRK_IRQHandler +MCTM1_UP_IRQHandler +MCTM1_TR_IRQHandler +MCTM1_CC_IRQHandler GPTM0_IRQHandler GPTM1_IRQHandler BFTM0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/emStudio/startup_ht32f1xxxx_es_01.s b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/emStudio/startup_ht32f1xxxx_es_01.s index 5f60bca990d..ed4a8124388 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/emStudio/startup_ht32f1xxxx_es_01.s +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/Device/Holtek/HT32F1xxxx/Source/emStudio/startup_ht32f1xxxx_es_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f1xxxx_es_01.s -; Version : $Rev:: 1578 $ -; Date : $Date:: 2019-03-29 #$ +; Version : $Rev:: 3030 $ +; Date : $Date:: 2024-01-31 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -109,14 +109,14 @@ _vectors: .long COMP_IRQHandler /* 24, 40, 0x0A0, */ .long ADC_IRQHandler /* 25, 41, 0x0A4, */ .long _RESERVED /* 26, 42, 0x0A8, */ - .long MCTM0BRK_IRQHandler /* 27, 43, 0x0AC, */ - .long MCTM0UP_IRQHandler /* 28, 44, 0x0B0, */ - .long MCTM0TR_IRQHandler /* 29, 45, 0x0B4, */ - .long MCTM0CC_IRQHandler /* 30, 46, 0x0B8, */ - .long MCTM1BRK_IRQHandler /* 31, 47, 0x0BC, */ - .long MCTM1UP_IRQHandler /* 32, 48, 0x0C0, */ - .long MCTM1TR_IRQHandler /* 33, 49, 0x0C4, */ - .long MCTM1CC_IRQHandler /* 34, 50, 0x0C8, */ + .long MCTM0_BRK_IRQHandler /* 27, 43, 0x0AC, */ + .long MCTM0_UP_IRQHandler /* 28, 44, 0x0B0, */ + .long MCTM0_TR_IRQHandler /* 29, 45, 0x0B4, */ + .long MCTM0_CC_IRQHandler /* 30, 46, 0x0B8, */ + .long MCTM1_BRK_IRQHandler /* 31, 47, 0x0BC, */ + .long MCTM1_UP_IRQHandler /* 32, 48, 0x0C0, */ + .long MCTM1_TR_IRQHandler /* 33, 49, 0x0C4, */ + .long MCTM1_CC_IRQHandler /* 34, 50, 0x0C8, */ .long GPTM0_IRQHandler /* 35, 51, 0x0CC, */ .long GPTM1_IRQHandler /* 36, 52, 0x0D0, */ .long _RESERVED /* 37, 53, 0x0D4, */ @@ -348,14 +348,14 @@ Default_Handler: IRQ EXTI15_IRQHandler IRQ COMP_IRQHandler IRQ ADC_IRQHandler - IRQ MCTM0BRK_IRQHandler - IRQ MCTM0UP_IRQHandler - IRQ MCTM0TR_IRQHandler - IRQ MCTM0CC_IRQHandler - IRQ MCTM1BRK_IRQHandler - IRQ MCTM1UP_IRQHandler - IRQ MCTM1TR_IRQHandler - IRQ MCTM1CC_IRQHandler + IRQ MCTM0_BRK_IRQHandler + IRQ MCTM0_UP_IRQHandler + IRQ MCTM0_TR_IRQHandler + IRQ MCTM0_CC_IRQHandler + IRQ MCTM1_BRK_IRQHandler + IRQ MCTM1_UP_IRQHandler + IRQ MCTM1_TR_IRQHandler + IRQ MCTM1_CC_IRQHandler IRQ GPTM0_IRQHandler IRQ GPTM1_IRQHandler IRQ BFTM0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_cm3_misc.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_cm3_misc.h index 2acc00f77ac..66345b6f9b7 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_cm3_misc.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_cm3_misc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_cm3_misc.h - * @version $Rev:: 5 $ - * @date $Date:: 2017-05-11 #$ + * @version $Rev:: 3143 $ + * @date $Date:: 2024-07-04 #$ * @brief All the function prototypes for the miscellaneous firmware library. ************************************************************************************************************* * @attention @@ -112,6 +112,11 @@ void SYSTICK_ClockSourceConfig(u32 SysTick_ClockSource); void SYSTICK_CounterCmd(u32 SysTick_Counter); void SYSTICK_IntConfig(ControlStatus NewState); void SYSTICK_SetReloadValue(u32 SysTick_Reload); +#if (HTCFG_STACK_USAGE_ANALYSIS == 1) +void StackUsageAnalysisInit(u32 addr); +#else +#define StackUsageAnalysisInit(...) +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_dependency.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_dependency.h index 46eef808e91..e33f4cbf193 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_dependency.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_dependency.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_dependency.h - * @version $Rev:: 2971 $ - * @date $Date:: 2023-10-25 #$ + * @version $Rev:: 3048 $ + * @date $Date:: 2024-02-22 #$ * @brief The header file of dependency check. ************************************************************************************************************* * @attention @@ -41,14 +41,22 @@ #if 0 // Version setting example for module /* Dependency check ----------------------------------------------------------------------------------------*/ -#if (__CORTEX_M == 0) +#if defined(__HT32L5XXXX_LIB_H) +#define MIN_HT32_FWLIB_VER (0x01000000) //0xmmnnnrrr -> Vm.n.r +#define MIN_HT32_FWLIB_SVN (0x209) +#endif +#if defined(__HT32F5XXXX_LIB_H) #define MIN_HT32_FWLIB_VER (0x01000024) //0xmmnnnrrr -> Vm.n.r #define MIN_HT32_FWLIB_SVN (0x5762) #endif -#if (__CORTEX_M == 3) +#if defined(__HT32F1XXXX_LIB_H) #define MIN_HT32_FWLIB_VER (0x01000009) //0xmmnnnrrr -> Vm.n.r #define MIN_HT32_FWLIB_SVN (0x2556) #endif +#if defined(__HT32F4XXXX_LIB_H) +#define MIN_HT32_FWLIB_VER (0x01000000) //0xmmnnnrrr -> Vm.n.r +#define MIN_HT32_FWLIB_SVN (0x336) +#endif #include "ht32_dependency.h" // Not exist means the version of HT32 Firmware Library is older than the module required. #endif @@ -62,7 +70,7 @@ #endif -// Check "ht32fxxxxx_lib.h" for the version of HT32 Firmwar Library +// Check "ht32f1xxxx_lib.h" for the version of HT32 Firmwar Library #if (HT32_FWLIB_VER != 999999) #if HT32_FWLIB_VER < MIN_HT32_FWLIB_VER #error !!! The version of HT32 Firmware Library is older than the module required. Please update HT32 Firmware Library. diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_time.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_time.h index 1fc44cdc7c4..47178c1e794 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_time.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32_time.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_time.h - * @version $Rev:: 2896 $ - * @date $Date:: 2023-03-04 #$ + * @version $Rev:: 3089 $ + * @date $Date:: 2024-04-02 #$ * @brief The header file of time function. ************************************************************************************************************* * @attention @@ -132,23 +132,23 @@ #define TIME_TICKDIFF(start, current) ((current >= start) ? (u32)(current - start) : (u32)(0xFFFFFFFF - start + 1 + current)) #if (HTCFG_TIME_TICKHZ < 1000000) -#define TIME_US2TICK(us) (us / (1000000UL / HTCFG_TIME_TICKHZ)) -#define TIME_TICK2US(t) (t * (1000000UL / HTCFG_TIME_TICKHZ)) +#define TIME_US2TICK(us) ((us) / (1000000UL / HTCFG_TIME_TICKHZ)) +#define TIME_TICK2US(t) ((t) * (1000000UL / HTCFG_TIME_TICKHZ)) #else -#define TIME_US2TICK(us) (us * (HTCFG_TIME_TICKHZ / 1000000UL)) -#define TIME_TICK2US(t) (t / (HTCFG_TIME_TICKHZ / 1000000UL)) +#define TIME_US2TICK(us) ((us) * (HTCFG_TIME_TICKHZ / 1000000UL)) +#define TIME_TICK2US(t) ((t) / (HTCFG_TIME_TICKHZ / 1000000UL)) #endif #if (HTCFG_TIME_TICKHZ < 1000) -#define TIME_MS2TICK(ms) (ms / (1000UL / HTCFG_TIME_TICKHZ)) -#define TIME_TICK2MS(t) (t * (1000UL / HTCFG_TIME_TICKHZ)) +#define TIME_MS2TICK(ms) ((ms) / (1000UL / HTCFG_TIME_TICKHZ)) +#define TIME_TICK2MS(t) ((t) * (1000UL / HTCFG_TIME_TICKHZ)) #else -#define TIME_MS2TICK(ms) (ms * (HTCFG_TIME_TICKHZ / 1000UL)) -#define TIME_TICK2MS(t) (t / (HTCFG_TIME_TICKHZ / 1000UL)) +#define TIME_MS2TICK(ms) ((ms) * (HTCFG_TIME_TICKHZ / 1000UL)) +#define TIME_TICK2MS(t) ((t) / (HTCFG_TIME_TICKHZ / 1000UL)) #endif -#define TIME_S2TICK(s) (s * (u32)(HTCFG_TIME_TICKHZ)) -#define TIME_TICK2S(t) (t / (HTCFG_TIME_TICKHZ)) +#define TIME_S2TICK(s) ((s) * (u32)(HTCFG_TIME_TICKHZ)) +#define TIME_TICK2S(t) ((t) / (HTCFG_TIME_TICKHZ)) #define GET_CNT() (_HTCFG_TIME_PORT->CNTR) diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h index 176bf19e728..901edaacfbf 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_aes.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_aes.h - * @version $Rev:: 2022 $ - * @date $Date:: 2020-02-03 #$ + * @version $Rev:: 2985 $ + * @date $Date:: 2023-12-14 #$ * @brief The header file of the ADC library. ************************************************************************************************************* * @attention @@ -159,15 +159,15 @@ typedef enum void AES_ECB_Init(HT_AES_TypeDef* HT_AESn, AES_InitTypeDef* AES_InitStruct); void AES_CBC_Init(HT_AES_TypeDef* HT_AESn, AES_InitTypeDef* AES_InitStruct); void AES_CTR_Init(HT_AES_TypeDef* HT_AESn, AES_InitTypeDef* AES_InitStruct); -void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, uc8* Key, u32 keySize); -ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, uc8 *iv, u32 length, uc8 *inputData, u8 *outputData); +void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, u32 *Key, u32 keySize); +ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, u32 *iv, u32 length, u32 *inputData, u32 *outputData); #define AES_ECB_CryptData(a, b, c, d, e) _AES_CryptData(a, b, NULL, c, d, e) #define AES_CBC_CryptData _AES_CryptData #define AES_CTR_CryptData(a, b, c, d, e) _AES_CryptData(a, AES_DIR_ENCRYPT, b, c, d, e) #if 0 -ErrStatus AES_ECB_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum mode, u32 length, uc8 *inputData, u8 *outputData); -ErrStatus AES_CBC_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum mode, uc8 *iv, u32 length, uc8 *inputData, u8 *outputData); -ErrStatus AES_CTR_CryptData(HT_AES_TypeDef* HT_AESn, uc8 *iv, u32 length, uc8 *inputData, u8 *outputData); +ErrStatus AES_ECB_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum mode, u32 length, u32 *inputData, u32 *outputData); +ErrStatus AES_CBC_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum mode, u32 *iv, u32 length, u32 *inputData, u32 *outputData); +ErrStatus AES_CTR_CryptData(HT_AES_TypeDef* HT_AESn, u32 *iv, u32 length, u32 *inputData, u32 *outputData); #endif void AES_StartKey(HT_AES_TypeDef* HT_AESn); @@ -180,7 +180,7 @@ FlagStatus AES_GetIntStatus(HT_AES_TypeDef* HT_AESn, u32 AES_INTSR_x); void AES_IntConfig(HT_AES_TypeDef* HT_AESn, u32 AES_IER_x, ControlStatus NewState); void AES_SetInputData(HT_AES_TypeDef* HT_AESn, uc32 AES_Data); u32 AES_GetOutputData(HT_AES_TypeDef* HT_AESn); -void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, uc8* Vector); +void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, u32 *Vector); void AESCore_IRQHandler(HT_AES_TypeDef* HT_AESn); /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h index cb194268c00..0371043f4b0 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_flash.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_flash.h - * @version $Rev:: 2971 $ - * @date $Date:: 2023-10-25 #$ + * @version $Rev:: 3145 $ + * @date $Date:: 2024-07-05 #$ * @brief The header file of the FLASH library. ************************************************************************************************************* * @attention @@ -160,7 +160,7 @@ ErrStatus FLASH_FlashHalfCycleCmd(ControlStatus NewState); #if (LIBCFG_FLASH_ZWPWESAVING) ErrStatus FLASH_FlashZwPwrSavingCmd(ControlStatus NewState); #endif -void FLASH_SetRemappingMode(FLASH_Vector RemapMode); +void FLASH_SetRemappingMode(FLASH_Vector FLASH_BOOT_x); FLASH_State FLASH_ErasePage(u32 PageAddress); FLASH_State FLASH_EraseOptionByte(void); FLASH_State FLASH_MassErase(void); diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h index f3c09ec6c04..558ac3ed742 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_lib.h @@ -34,8 +34,8 @@ #endif /* Settings ------------------------------------------------------------------------------------------------*/ -#define HT32_FWLIB_VER (0x01004001) -#define HT32_FWLIB_SVN (0x2982) +#define HT32_FWLIB_VER (0x01005001) +#define HT32_FWLIB_SVN (0x3190) #if defined(USE_HT32F1653_54) #include "ht32f1653_54_libcfg.h" diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h index f2e50b49f9b..0ee2de96d57 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_rtc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_rtc.h - * @version $Rev:: 2971 $ - * @date $Date:: 2023-10-25 #$ + * @version $Rev:: 3094 $ + * @date $Date:: 2024-06-19 #$ * @brief The header file of the RTC library. ************************************************************************************************************* * @attention @@ -105,7 +105,7 @@ typedef enum RTC_ROWM_LEVEL /*!< Level mode. */ } RTC_ROWM_Enum; /** - * @brief Waveform mode of RTC output + * @brief Event selection of RTC output */ typedef enum { diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h index d69c32afbfa..015344e1998 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_spi.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_spi.h - * @version $Rev:: 2797 $ - * @date $Date:: 2022-11-28 #$ + * @version $Rev:: 3180 $ + * @date $Date:: 2024-10-15 #$ * @brief The header file of the SPI library. ************************************************************************************************************* * @attention @@ -159,14 +159,14 @@ typedef struct #define SPI_FLAG_TOUT ((u32)0x00000080) #define SPI_FLAG_BUSY ((u32)0x00000100) -#define IS_SPI_FLAG(FLAG) ((FLAG == SPI_FLAG_TXBE) || \ - (FLAG == SPI_FLAG_TXE) || \ +#define IS_SPI_FLAG(FLAG) ((FLAG == SPI_FLAG_TXBE) || \ + (FLAG == SPI_FLAG_TXE) || \ (FLAG == SPI_FLAG_RXBNE) || \ - (FLAG == SPI_FLAG_WC) || \ - (FLAG == SPI_FLAG_RO) || \ - (FLAG == SPI_FLAG_MF) || \ - (FLAG == SPI_FLAG_SA) || \ - (FLAG == SPI_FLAG_TOUT) || \ + (FLAG == SPI_FLAG_WC) || \ + (FLAG == SPI_FLAG_RO) || \ + (FLAG == SPI_FLAG_MF) || \ + (FLAG == SPI_FLAG_SA) || \ + (FLAG == SPI_FLAG_TOUT) || \ (FLAG == SPI_FLAG_BUSY)) #define IS_SPI_FLAG_CLEAR(CLEAR) ((CLEAR == SPI_FLAG_WC) || \ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h index b15bbbdbd09..d1663c7f569 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_tm.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_tm.h - * @version $Rev:: 2971 $ - * @date $Date:: 2023-10-25 #$ + * @version $Rev:: 3180 $ + * @date $Date:: 2024-10-15 #$ * @brief The header file of the TM library. ************************************************************************************************************* * @attention @@ -341,11 +341,11 @@ typedef struct * @brief Used to check parameter of the output compare mode. */ #define IS_TM_OM_CMP(x) (((x) == TM_OM_MATCH_NOCHANGE) || \ - ((x) == TM_OM_MATCH_INACTIVE) || \ - ((x) == TM_OM_MATCH_ACTIVE) || \ - ((x) == TM_OM_MATCH_TOGGLE) || \ - ((x) == TM_OM_PWM1) || \ - ((x) == TM_OM_PWM2)) + ((x) == TM_OM_MATCH_INACTIVE) || \ + ((x) == TM_OM_MATCH_ACTIVE) || \ + ((x) == TM_OM_MATCH_TOGGLE) || \ + ((x) == TM_OM_PWM1) || \ + ((x) == TM_OM_PWM2)) /** * @brief Used to check parameter of the output mode. */ @@ -377,7 +377,7 @@ typedef struct /** * @brief Used to check parameter of the counter mode. */ -#define IS_TM_CNT_MODE(x) ((x == TM_CNT_MODE_UP) || \ +#define IS_TM_CNT_MODE(x) ((x == TM_CNT_MODE_UP) || \ (x == TM_CNT_MODE_CA1) || \ (x == TM_CNT_MODE_CA2) || \ (x == TM_CNT_MODE_CA3) || \ @@ -397,23 +397,23 @@ typedef struct /** * @brief Used to check parameter of the channel input selection. */ -#define IS_TM_CHCCS(x) ((x == TM_CHCCS_DIRECT) || \ - (x == TM_CHCCS_INDIRECT) || \ - (x == TM_CHCCS_TRCED)) +#define IS_TM_CHCCS(x) ((x == TM_CHCCS_DIRECT) || \ + (x == TM_CHCCS_INDIRECT) || \ + (x == TM_CHCCS_TRCED)) /** * @brief Used to check parameter of the channel capture prescaler. */ #define IS_TM_CHPSC(x) ((x == TM_CHPSC_OFF) || \ - (x == TM_CHPSC_2) || \ - (x == TM_CHPSC_4) || \ - (x == TM_CHPSC_8)) + (x == TM_CHPSC_2) || \ + (x == TM_CHPSC_4) || \ + (x == TM_CHPSC_8)) /** * @brief Used to check parameter of the ETI prescaler. */ #define IS_TM_ETIPSC(x) ((x == TM_ETIPSC_OFF) || \ - (x == TM_ETIPSC_2) || \ - (x == TM_ETIPSC_4) || \ - (x == TM_ETIPSC_8)) + (x == TM_ETIPSC_2) || \ + (x == TM_ETIPSC_4) || \ + (x == TM_ETIPSC_8)) /** * @brief Used to check parameter of the TM interrupt. */ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h index 6e0c5332b20..bc74274296d 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_usart.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_usart.h - * @version $Rev:: 2797 $ - * @date $Date:: 2022-11-28 #$ + * @version $Rev:: 3180 $ + * @date $Date:: 2024-10-15 #$ * @brief The header file of the USART library. ************************************************************************************************************* * @attention @@ -459,7 +459,7 @@ typedef struct #define IS_USART_PDMA_REQ(REQ) ((REQ == USART_PDMAREQ_TX) || (REQ == USART_PDMAREQ_RX)) #define IS_USART(USART) ((USART == HT_USART0) || \ - (IS_USART1(USART)) || \ + (IS_USART1(USART)) || \ (USART == HT_UART0) || \ (USART == HT_UART1)) diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h index c0a9c03951f..99192232533 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/inc/ht32f1xxxx_wdt.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_wdt.h - * @version $Rev:: 122 $ - * @date $Date:: 2017-06-13 #$ + * @version $Rev:: 3103 $ + * @date $Date:: 2024-06-24 #$ * @brief The header file of the WDT library. ************************************************************************************************************* * @attention @@ -72,14 +72,17 @@ /* WDT runs or halts in sleep and deep sleep1 mode */ /* WDT WDTSHLT mask */ -#define MODE0_WDTSHLT_BOTH ((u32)0x00000000) -#define MODE0_WDTSHLT_SLEEP ((u32)0x00004000) -#define MODE0_WDTSHLT_HALT ((u32)0x00008000) +#define WDT_SLEEP_HALT_NONE ((u32)0x00000000) +#define WDT_SLEEP_HALT_DEEPSLEEP ((u32)0x00004000) +#define WDT_SLEEP_HALT_ALL ((u32)0x00008000) -#define IS_WDT_WDTSHLT_MODE(WDT_Mode) ((WDT_Mode == MODE0_WDTSHLT_BOTH) || \ - (WDT_Mode == MODE0_WDTSHLT_SLEEP) || \ - (WDT_Mode == MODE0_WDTSHLT_HALT)) +#define MODE0_WDTSHLT_BOTH WDT_SLEEP_HALT_NONE +#define MODE0_WDTSHLT_SLEEP WDT_SLEEP_HALT_DEEPSLEEP +#define MODE0_WDTSHLT_HALT WDT_SLEEP_HALT_ALL +#define IS_WDT_WDTSHLT_MODE(WDT_Mode) ((WDT_Mode == WDT_SLEEP_HALT_NONE) || \ + (WDT_Mode == WDT_SLEEP_HALT_DEEPSLEEP) || \ + (WDT_Mode == WDT_SLEEP_HALT_ALL)) /* WDT Flag */ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32_cm3_misc.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32_cm3_misc.c index c9632a267d1..401dd331ac9 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32_cm3_misc.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32_cm3_misc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_cm3_misc.c - * @version $Rev:: 2437 $ - * @date $Date:: 2021-06-01 #$ + * @version $Rev:: 3162 $ + * @date $Date:: 2024-07-23 #$ * @brief This file provides all the miscellaneous firmware functions. ************************************************************************************************************* * @attention @@ -218,6 +218,99 @@ void SYSTICK_SetReloadValue(u32 SysTick_Reload) SysTick->LOAD = SysTick_Reload; } + +#if 0 +// Copy the code below to the begin of the main(). +// START + + #if (HTCFG_STACK_USAGE_ANALYSIS == 1) + /* !!! NOTICE !!! + Please update the Keil HT32 PACK and HT32 Firmware Library to the latest version to make sure the + Stack Usage Analysis function works properly. + */ + /* + Set HTCFG_STACK_USAGE_ANALYSIS as 1 in the "ht32xxxxxx_conf.h" to enable Stack Usage Analysis feature. + This feature is only applicable to the Keil MDK-ARM. Please call the "StackUsageAnalysisInit()" function + in the begin of the "main()". + The "StackUsageAnalysisInit()" parameter shall be the start address of the vector table. + Under Keil Debug mode, tick "View > Watch Window > HT32 Stack Usage Analysis" to show the stack usage + information. Those information is only valid after calling "StackUsageAnalysisInit()" function. + */ + StackUsageAnalysisInit(0x00000000); + #endif + +// END +#endif + +#if (HTCFG_STACK_USAGE_ANALYSIS == 1) +#if defined (__CC_ARM) +#define STACKLIMITADDR 0x20000010 +#define STACKSTART 0x20000014 +u32 _StackLimit __attribute__((at(STACKLIMITADDR)))= HT_SRAM_BASE + LIBCFG_RAM_SIZE; +u32 _StackStart __attribute__((at(STACKSTART)))= HT_SRAM_BASE; +/*********************************************************************************************************//** + * @brief Stack Usage Analysis Init + * @retval None + ***********************************************************************************************************/ +__ASM void StackUsageAnalysisInit(u32 addr) +{ + extern _StackLimit; + extern __HT_check_sp; + extern _StackStart; + LDR R0, [r0] + LDR R1, =_StackLimit + STR R0, [r1] + + LDR R0, =__HT_check_sp + LDR R1, =_StackStart + STR R0, [r1] + MOV R1, SP + LDR R2, =0xCDCDCDCD + LDR R3, =0xABABABAB + STR R3, [ R0 ] + B Loop_Check +Loop + STR R2, [ R0 ] +Loop_Check + ADDS R0, R0, #0x04 + CMP R0, R1 + BLT Loop + BX LR + ALIGN +} +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define STACKLIMITADDR "0x20000010" +#define STACKSTART "0x20000014" +u32 _StackLimit __attribute__((section(".ARM.__at_"STACKLIMITADDR))) = HT_SRAM_BASE + LIBCFG_RAM_SIZE; +u32 _StackStart __attribute__((section(".ARM.__at_"STACKSTART))) = HT_SRAM_BASE; +/*********************************************************************************************************//** + * @brief Stack Usage Analysis Init + * @retval None + ***********************************************************************************************************/ +__attribute__((noinline)) void StackUsageAnalysisInit(u32 addr) +{ + __ASM volatile (" LDR R0, [r0]"); + __ASM volatile (" LDR R1, =_StackLimit"); + __ASM volatile (" STR R0, [r1]"); + + __ASM volatile (" LDR R0, =__HT_check_sp"); + __ASM volatile (" LDR R1, =_StackStart"); + __ASM volatile (" STR R0, [r1]"); + __ASM volatile (" MOV R1, SP"); + __ASM volatile (" LDR R2, =0xCDCDCDCD"); + __ASM volatile (" LDR R3, =0xABABABAB"); + __ASM volatile (" STR R3, [ R0 ]"); + __ASM volatile (" B Loop_Check"); + __ASM volatile ("Loop:"); + __ASM volatile (" STR R2, [ R0 ]"); + __ASM volatile ("Loop_Check:"); + __ASM volatile (" ADDS R0, R0, #0x04"); + __ASM volatile (" CMP R0, R1"); + __ASM volatile (" BLT Loop"); + __ASM volatile (" BX LR"); +} +#endif +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c index c6e8ea2a5b8..cb66365032f 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_aes.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_aes.c - * @version $Rev:: 2788 $ - * @date $Date:: 2022-11-24 #$ + * @version $Rev:: 3174 $ + * @date $Date:: 2024-08-27 #$ * @brief This file provides all the AES firmware functions. ************************************************************************************************************* * @attention @@ -331,7 +331,7 @@ u32 AES_GetOutputData(HT_AES_TypeDef* HT_AESn) * @param keySize: Key table's size * @retval None ************************************************************************************************************/ -void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, uc8* Key, u32 keySize) +void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, u32 *Key, u32 keySize) { u32 i; u32 uCRTemp = HT_AESn->CR & (~(0x00000060UL)); @@ -353,12 +353,12 @@ void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, uc8* Key, u32 keySize) } HT_AESn->CR = uCRTemp; - for (i = 0; i < keySize; i += 4) + for (i = 0; i < (keySize / 4); i++) { #if (LIBCFG_AES_SWAP) - HT_AESn->KEYR[i >> 2] = __REV(*(u32*)&Key[i]); + HT_AESn->KEYR[i] = __REV(*&Key[i]); #else - HT_AESn->KEYR[i >> 2] = *(u32*)&Key[i]; + HT_AESn->KEYR[i] = *&Key[i]; #endif } @@ -371,17 +371,17 @@ void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, uc8* Key, u32 keySize) * @param Vector: * @retval None ************************************************************************************************************/ -void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, uc8* Vector) +void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, u32 *Vector) { int i; Assert_Param(IS_AES(HT_AESn)); - for (i = 0; i < 16; i += 4) + for (i = 0; i < 4; i++) { #if (LIBCFG_AES_SWAP) - HT_AESn->IVR[i >> 2] = __REV(*(u32*)&Vector[i]); + HT_AESn->IVR[i] = __REV(*&Vector[i]); #else - HT_AESn->IVR[i >> 2] = *(u32*)&Vector[i]; + HT_AESn->IVR[i] = *&Vector[i]; #endif } } @@ -398,10 +398,10 @@ void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, uc8* Vector) ************************************************************************************************************/ ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, - uc8 *iv, + u32 *iv, u32 length, - uc8 *inputData, - u8 *outputData) + u32 *inputData, + u32 *outputData) { /*AES Data blocks 16 byte */ if ((length % 16) != 0) @@ -423,8 +423,8 @@ ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, HT_AESn->CR = (HT_AESn->CR & 0xFFFFFFFD) | dir; /*Create input/output data */ - gpu32InputBuff = (u32*)inputData; - gpu32OutputBuff = (u32*)outputData; + gpu32InputBuff = inputData; + gpu32OutputBuff = outputData; /*Init Index */ gu32OutputIndex = 0; @@ -451,8 +451,8 @@ ErrStatus _AES_CryptData(HT_AES_TypeDef* HT_AESn, ErrStatus AES_ECB_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, u32 length, - uc8 *inputData, - u8 *outputData) + u32 *inputData, + u32 *outputData) { return _AES_CryptData(HT_AESn, dir, @@ -474,10 +474,10 @@ ErrStatus AES_ECB_CryptData(HT_AES_TypeDef* HT_AESn, ************************************************************************************************************/ ErrStatus AES_CBC_CryptData(HT_AES_TypeDef* HT_AESn, AES_DIR_Enum dir, - uc8 *iv, + u32 *iv, u32 length, - uc8 *inputData, - u8 *outputData) + u32 *inputData, + u32 *outputData) { return _AES_CryptData(HT_AESn, dir, @@ -497,10 +497,10 @@ ErrStatus AES_CBC_CryptData(HT_AES_TypeDef* HT_AESn, * @retval SUCCESS or ERROR ************************************************************************************************************/ ErrStatus AES_CTR_CryptData(HT_AES_TypeDef* HT_AESn, - uc8 *iv, + u32 *iv, u32 length, - uc8 *inputData, - u8 *outputData) + u32 *inputData, + u32 *outputData) { return _AES_CryptData(HT_AESn, AES_DIR_ENCRYPT, diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c index 81e7f8f143d..b29f74848e1 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_ckcu.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_ckcu.c - * @version $Rev:: 2972 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 3181 $ + * @date $Date:: 2024-10-15 #$ * @brief This file provides all the Clock Control Unit firmware functions. ************************************************************************************************************* * @attention @@ -432,9 +432,9 @@ void CKCU_SetCKREFPrescaler(CKCU_CKREFPRE_TypeDef CKREFPRE) /********************************************************************************************************//** * @brief Configure the CK_USART prescaler. * @param URPRE: specify the prescaler value. - * This parameter can be: - * @arg CKCU_URPRE_DIV1: USART clock divided by 1 - * @arg CKCU_URPRE_DIV2: USART clock divided by 2 + * This parameter can be: + * @arg CKCU_URPRE_DIV1: USART clock divided by 1 + * @arg CKCU_URPRE_DIV2: USART clock divided by 2 * @retval None ************************************************************************************************************/ void CKCU_SetUSARTPrescaler(CKCU_URPRE_TypeDef URPRE) @@ -574,28 +574,28 @@ u32 CKCU_GetPLLFrequency(void) /*********************************************************************************************************//** * @brief Configure the APB peripheral prescaler. * @param Perip: specify the APB peripheral. - * This parameter can be: - * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, - * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, - * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, - * CKCU_PCLK_MCTM0, CKCU_PCLK_MCTM1, - * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, - * CKCU_PCLK_USART0, CKCU_PCLK_USART1, - * CKCU_PCLK_UART0, CKCU_PCLK_UART1, - * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, - * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, - * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, - * CKCU_PCLK_I2S, - * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, - * CKCU_PCLK_PWM0 + * This parameter can be: + * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, + * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, + * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, + * CKCU_PCLK_MCTM0, CKCU_PCLK_MCTM1, + * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, + * CKCU_PCLK_USART0, CKCU_PCLK_USART1, + * CKCU_PCLK_UART0, CKCU_PCLK_UART1, + * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, + * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, + * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, + * CKCU_PCLK_I2S, + * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, + * CKCU_PCLK_PWM0 * @param PCLKPrescaler: specify the value of prescaler. - * This parameter can be: - * @arg CKCU_APBCLKPRE_DIV1: specific peripheral clock = PCLK / 1 (inapplicable to BKPRCLK) - * @arg CKCU_APBCLKPRE_DIV2: specific peripheral clock = PCLK / 2 (inapplicable to BKPRCLK) - * @arg CKCU_APBCLKPRE_DIV4: specific peripheral clock = PCLK / 4 - * @arg CKCU_APBCLKPRE_DIV8: specific peripheral clock = PCLK / 8 - * @arg CKCU_APBCLKPRE_DIV16: specific peripheral clock = PCLK / 16 (BKPRCLK only) - * @arg CKCU_APBCLKPRE_DIV32: specific peripheral clock = PCLK / 32 (BKPRCLK only) + * This parameter can be: + * @arg CKCU_APBCLKPRE_DIV1: specific peripheral clock = PCLK / 1 (inapplicable to BKPRCLK) + * @arg CKCU_APBCLKPRE_DIV2: specific peripheral clock = PCLK / 2 (inapplicable to BKPRCLK) + * @arg CKCU_APBCLKPRE_DIV4: specific peripheral clock = PCLK / 4 + * @arg CKCU_APBCLKPRE_DIV8: specific peripheral clock = PCLK / 8 + * @arg CKCU_APBCLKPRE_DIV16: specific peripheral clock = PCLK / 16 (BKPRCLK only) + * @arg CKCU_APBCLKPRE_DIV32: specific peripheral clock = PCLK / 32 (BKPRCLK only) * @retval None ************************************************************************************************************/ void CKCU_SetPeripPrescaler(CKCU_PeripPrescaler_TypeDef Perip, CKCU_APBCLKPRE_TypeDef PCLKPrescaler) @@ -607,28 +607,28 @@ void CKCU_SetPeripPrescaler(CKCU_PeripPrescaler_TypeDef Perip, CKCU_APBCLKPRE_Ty Prescaler -= 2; } Perip &= 0x0000001F; - CKCU_BF_WRITE(*PCSR, (3UL << Perip), Perip, Prescaler); + CKCU_BF_WRITE(*PCSR, (3UL << Perip), Perip, (Prescaler & 0x3)); } #endif /*********************************************************************************************************//** * @brief Return the operating frequency of the specific APB peripheral. * @param Perip: specify the APB peripheral. - * This parameter can be: - * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, - * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, - * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, - * CKCU_PCLK_MCTM0, CKCU_PCLK_MCTM1, - * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, - * CKCU_PCLK_USART0, CKCU_PCLK_USART1, - * CKCU_PCLK_UART0, CKCU_PCLK_UART1, - * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, - * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, - * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, - * CKCU_PCLK_I2S, - * CKCU_PCLK_I2S, - * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, - * CKCU_PCLK_PWM0 + * This parameter can be: + * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, + * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, + * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, + * CKCU_PCLK_MCTM0, CKCU_PCLK_MCTM1, + * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, + * CKCU_PCLK_USART0, CKCU_PCLK_USART1, + * CKCU_PCLK_UART0, CKCU_PCLK_UART1, + * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, + * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, + * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, + * CKCU_PCLK_I2S, + * CKCU_PCLK_I2S, + * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, + * CKCU_PCLK_PWM0 * @retval Frequency in Hz ************************************************************************************************************/ u32 CKCU_GetPeripFrequency(CKCU_PeripPrescaler_TypeDef Perip) @@ -953,10 +953,10 @@ void CKCU_PeripClockConfig(CKCU_PeripClockConfig_TypeDef Clock, ControlStatus Cm /*********************************************************************************************************//** * @brief Configure the reference clock of HSI auto-trim function. * @param CLKSRC: specify the clock source. - * This parameter can be: - * @arg CKCU_ATC_LSE: LSE is selected as reference clock - * @arg CKCU_ATC_USB: USB is selected as reference clock - * @arg CKCU_ATC_CKIN: External pin (CKIN) is selected as reference clock + * This parameter can be: + * @arg CKCU_ATC_LSE: LSE is selected as reference clock + * @arg CKCU_ATC_USB: USB is selected as reference clock + * @arg CKCU_ATC_CKIN: External pin (CKIN) is selected as reference clock * @retval None ************************************************************************************************************/ void CKCU_HSIAutoTrimClkConfig(CKCU_ATC_TypeDef CLKSRC) @@ -983,9 +983,9 @@ void CKCU_ATCInit(CKCU_ATCInitTypeDef* ATC_InitStruct) /*********************************************************************************************************//** * @brief Automatic Trimming Algorithm Mode Selection. * @param Algo: Search Algorithm. - * This parameter can be: - * @arg CKCU_ATC_BINARY_SEARCH: Auto Trimming Controller is used binary search to approach the target range - * @arg CKCU_ATC_LINEAR_SEARCH: Auto Trimming Controller is used linear search to approach the target range + * This parameter can be: + * @arg CKCU_ATC_BINARY_SEARCH: Auto Trimming Controller is used binary search to approach the target range + * @arg CKCU_ATC_LINEAR_SEARCH: Auto Trimming Controller is used linear search to approach the target range * @retval None ***********************************************************************************************************/ void CKCU_HSIAutoTrimAlgorithm(u32 Algo) @@ -996,9 +996,9 @@ void CKCU_HSIAutoTrimAlgorithm(u32 Algo) /*********************************************************************************************************//** * @brief Lock Target Range Selection. * @param Tolerance: Variation Tolerance. - * This parameter can be: - * @arg CKCU_ATC_DOUBLE_PRECISION: 0.2 % variation - * @arg CKCU_ATC_SINGLE_PRECISION: 0.1 % variation + * This parameter can be: + * @arg CKCU_ATC_DOUBLE_PRECISION: 0.2 % variation + * @arg CKCU_ATC_SINGLE_PRECISION: 0.1 % variation * @retval None ***********************************************************************************************************/ void CKCU_HSIAutoTrimFreqTolerance(u32 Tolerance) diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c index 6c8a2638a73..3c01d6a6dc4 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_rtc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_rtc.c - * @version $Rev:: 2233 $ - * @date $Date:: 2020-10-13 #$ + * @version $Rev:: 2984 $ + * @date $Date:: 2023-11-23 #$ * @brief This file provides all the RTC firmware functions. ************************************************************************************************************* * @attention @@ -138,12 +138,10 @@ void RTC_LSECmd(ControlStatus NewState) if (NewState == DISABLE) { BB_LSE_EN = 0; - while (HT_CKCU->GCSR & 0x10); } else { BB_LSE_EN = 1; - while ((HT_CKCU->GCSR & 0x10) == 0); } } diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c index c0e8face8c5..3c3c22aa826 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_spi.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_spi.c - * @version $Rev:: 2797 $ - * @date $Date:: 2022-11-28 #$ + * @version $Rev:: 3086 $ + * @date $Date:: 2024-03-28 #$ * @brief This file provides all the SPI firmware functions. ************************************************************************************************************* * @attention @@ -325,6 +325,11 @@ void SPI_SoftwareSELCmd(HT_SPI_TypeDef* SPIx, u32 SPI_SoftwareSEL) } else { + /* Inactive SEL pin needs to ensure the transmission has ended. If the program flow cannot guarantee */ + /* SPI transmission completion, you can enable the procedure below. */ + #if 0 + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + #endif SPIx->CR0 &= SPI_SEL_INACTIVE; } } @@ -560,6 +565,8 @@ void SPI_DUALCmd(HT_SPI_TypeDef* SPIx, ControlStatus NewState) Assert_Param(IS_SPI(SPIx)); Assert_Param(IS_CONTROL_STATUS(NewState)); + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + (NewState == ENABLE)?(SPIx->CR0 |= CR0_DUALEN_SET):(SPIx->CR0 &= CR0_DUALEN_RESET); } diff --git a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c index 5bd9a98e770..9e7adf1bf64 100644 --- a/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c +++ b/bsp/ht32/libraries/HT32_STD_1xxxx_FWLib/library/HT32F1xxxx_Driver/src/ht32f1xxxx_wdt.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f1xxxx_wdt.c - * @version $Rev:: 2797 $ - * @date $Date:: 2022-11-28 #$ + * @version $Rev:: 3103 $ + * @date $Date:: 2024-06-24 #$ * @brief This file provides all the WDT firmware functions. ************************************************************************************************************* * @attention @@ -109,9 +109,9 @@ void WDT_Cmd(ControlStatus NewState) * @brief Configure the WDT to run or halt in sleep and deep sleep1 mode. * @param WDT_Mode: * This parameter can be one of the following values: - * @arg MODE0_WDTSHLT_BOTH : WDT runs in sleep and deep sleep1 mode - * @arg MODE0_WDTSHLT_SLEEP : WDT runs in sleep mode - * @arg MODE0_WDTSHLT_HALT : WDT halts in sleep and deep sleep1 mode + * @arg WDT_SLEEP_HALT_NONE : WDT no halt + * @arg WDT_SLEEP_HALT_DEEPSLEEP : WDT halts in deep sleep1 mode + * @arg WDT_SLEEP_HALT_ALL : WDT halts in sleep and deep sleep1 mode * @retval None ************************************************************************************************************/ void WDT_HaltConfig(u32 WDT_Mode) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/Release_Notes.txt b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/Release_Notes.txt index 948233eafca..1a18dbff8d3 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/Release_Notes.txt +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/Release_Notes.txt @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file Release_Notes.txt - * @version V1.9.1 - * @date 2023-12-22 + * @version V1.14.3 + * @date 2024-11-29 * @brief The Release notes of HT32 Firmware Library. ************************************************************************************************************* * @attention @@ -48,20 +48,24 @@ // HT32F57331, HT32F57341 // HT32F57342, HT32F57352 // HT32F59041, HT32F59741 -// HT32F59046, HT32F59746 +// HT32F59045 +// HT32F59746 // HT32F5826, HT32F5828 // HT32F0006 // HT32F0008 // HT32F52142 // HT32F61030, HT32F61041 +// HT32F61052 // HT32F61141 // HT32F61244, HT32F61245 // HT32F61352 // HT32F61355, HT32F61356, HT32F61357 // HT32F61630, HT32F61641 +// HT32F61730, HT32F61741 // HT32F62030, HT32F62040, HT32F62050 // HT32F65230, HT32F65240 // HT32F65232 +// HT32F66242, HT32F66246 // HT32F67041, HT32F67051 // HT32F67232 // HT32F67233 @@ -71,6 +75,267 @@ // HT50F3200S, HT50F3200T // HF5032 // MXTX6306 +// MXTX52231, MXTX52352 +// NW32F61242 + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.14.3_8294 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-11-29 + Main Changes + + Add new device support. + - HT32F61052 + + Others + + Update comment, format, typing error, and coding style. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.14.2_8286 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-11-26 + Main Changes + + Add example support of HT32F65232. + + Fix "ADC/OneShot_SWTrigger/ht32f5xxxx_01_it.h" parameter error. + - Rename "ADC_IRQHandler" to "HTCFG_ADC_IRQHandler" + + Add the "DISABLE_BOOTPIN_OUTPUT" definition in "CKCU/Clock_Configuration/ht32_board_config.h" to prevent + circuit conflicts on certain development boards. + - HT32F65232_DVB + - HT32F66242_DVB + - HT32F66246_DVB + + Modify the "OPA/OPA_Enable" example to use a single OPA and add "ht32_board_config.h". + + Add the "LED_HIGH_ACTIVE" definition to the following files and Fix "ht32f5xxxx_board_01.c" to align with + the LED circuit on the development board: + - bm18b367a_dvb.h + - bm53b367a_dvb.h + - ht32f65232_dvb.h + - ht32f65240_dvb.h + - ht32f66242_dvb.h + - ht32f66246_dvb.h + + Others + + Update comment, format, typing error, and coding style. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.14.1_8273 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-11-08 + Main Changes + + Add new device support. + - HT32F66242, HT32F66246 + + Add new IP drivers. + - Programmable Gain Amplifier, "ht32f65xxx_66xxx_pga.c/h" + - Coordinate Rotation Digital Computer, "ht32f66xxx_cordic.c/h" + - Proportion Integration Differentiation driver, "ht32f66xxx_pid.c/h" + + Add new examples: + - "CORDIC/CosSin_Interrupt" + - "CORDIC/CosSin_Polling" + - "PGA/Comparator" + - "PGA/Inverting" + - "PGA/InvertingAdder" + - "PGA/NonInverting" + - "PGA/NonInvertingAdder" + - "PGA/VoltageFollower" + - "PID/ChangePara_inSameMode" + - "PID/Interrupt" + - "PID/MultiMode" + - "PID/Polling" + + Add the "LIBCFG_CKCU_NO_LPCR" definition in "ht32f65230_40_libcfg.h" and "ht32f65232_libcfg.h" to + fix the "CKCU_BKISOCmd" the redundant flow of the HT32F65230/65240 and HT32F65232 (related to the Low Power Control). + + Add the "LIBCFG_PWRCU_NO_DS2_MODE" definition in "ht32f65230_40_libcfg.h" and "ht32f65232_libcfg.h" to + fix the "PWRCU_DeepSleep2()" and "PWRCU_GetDMOSStatus()" the redundant flow + of the HT32F65230/65240 and HT32F65232 (related to the Deep-Sleep2 Mode). + + Remove the "LIBCFG_PWRCU_NO_PORF" definition in "ht32f65232_libcfg.h" to fix the "PWRCU_DeInit()" + missing flow of the HT32F65232 (related to the Power-On Reset Flag). + + Change the HTCFG_TIMER_PRESCALER value according to HTCFG_PULSE_SYS_CLK is less + than or greater than 60 MHz to ensure that the Counter-Reload value is less than 0xFFFF. + - "TM/UpdateEvent" + - "TM/SinglePulseMode" + - "TM/TriggerCounter" + + Others + + Update comment, format, typing error, and coding style. + + Change define "LIBCFG_CMP_65x_VER" to "LIBCFG_CMP_65x_66x_VER" for the HT32F65xxx and HT32F66xxx series ICs. + + Add "IS_ADC_TRIG_CMP2()" macro, for use to confirm the adc trigger is CMP2 in ht32f65xxx_66xxx_adc.h + + Fix the bit position error in the "IS_ADC_INT" macro. + + Change define "LIBCFG_TM_652XX_V1" to "LIBCFG_TM_65X_66X_V1" + + Change define "LIBCFG_TM_65232" to "LIBCFG_TM_65X_66X_BK_FROM_CMP" and "LIBCFG_TM_65X_66X_RECCDI" + + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.13.2_8218 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-10-23 + Main Changes + + Fix "CAN_Legacy/TxRxLoopback" example compiling error. + + Others + + Update comment, format, typing error, and coding style. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.13.1_8190 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-09-24 + Main Changes + + Add new device support. + - NW32F61242 + + Change the CAN IP Driver, switch to the latest designed API. + + Add new examples. + "CAN/Recv_DATA" + "CAN/Recv_Interrupt" + "CAN/Recv_Mask_Filter" + "CAN/Recv_REMOTE" + "CAN/Send_DATA" + "CAN/Send_Recv_DATA" + "CAN/Send_REMOTE" + + Fix "AES_SetKeyTable()" and "AES_SetVectorTable()" Key and Vector index errors, which cause incorrect AES + encryption and decryption. + + Modify "I2C/7_bit_mode" example, fix pin assignment error of HT32F50343. + + Others + + Update comment, format, typing error, and coding style. + + Update AES examples. + - Change the key, IV, and plain text from hex array to string, making the result easier to compare with + online tools. + - Add expected cipher text and compare it with the MCU's H/W AES result as an error-proofing mechanism. + + Remove device support. + - HT32F57541, HT32F57552 + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.12.1_7949 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-08-08 + Main Changes + + Add new device support. + - HT32F57541 + - HT32F57552 + + Update "uart_module.c" to fix the UART0 ~ UART3 not work issue of BM53A367A. + + Others + + Update comment, format, typing error, and coding style. + + Change path of the "Holtek.HT32_DFP.latest.pack". + + Minor changes were made to the USBD "HID_Keyboard_Virtual_COM" and "Virtual_COM" examples. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.11.1_7908 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-07-26 + Main Changes + + Add new device support. + - HT32F59045 + - MXTX52231, MXTX52352 + + Remove device support. + - HT32F59046 + + Rename WDT parameters. + - Old Name | New Name + - --------------------------------- | ---------------------------- + - "MODE0_WDTSHLT_BOTH" | "WDT_SLEEP_HALT_NONE" + - "MODE0_WDTSHLT_SLEEP" | "WDT_SLEEP_HALT_DEEPSLEEP" + - "MODE0_WDTSHLT_SLEEP" | "WDT_SLEEP_HALT_ALL" + + Update below files to support the BMduino shield/module Keil Driver. + - Modify :"utilities/bmduino_board.h". + - Add :"utilities/bmduino_check.h". + + Modify "void StackUsageAnalysisInit(void)". Added parameter "u32 addr" and reimplemented as + "void StackUsageAnalysisInit(u32 addr);" + + Fix the below examples ADC_IRQHandler define error of HT32F65232 and HT32F65240. + - "ADC/AnalogWatchdog" + - "ADC/Continuous_Potentiometer" + - "ADC/Discontinuous_EXTITrigger" + - "ADC/OneShot_PWMTrigger" + - "ADC/OneShot_PWMTrigger_with_Delay" + - "ADC/OneShot_SWTrigger" + + Modify example IO define of HT32F65232. + - "ADC/AnalogWatchdog" + - "ADC/Continuous_Potentiometer" + - "ADC/Discontinuous_EXTITrigger" + - "ADC/OneShot_PWMTrigger" + - "ADC/OneShot_PWMTrigger_with_Delay" + - "ADC/OneShot_SWTrigger" + - "ADC/OneShot_TMTrigger_PDMA" + + Others + + Update comment, format, typing error, and coding style. + + Update ht32f5xxxx_01.h. + - Modify the preprocessor define of "__ALIGN4", "__PACKED_H", "__PACKED_F" for old Arm Compiler V6. + + Modify "void FLASH_SetRemappingMode(FLASH_Vector FLASH_BOOT_x);". Changed parameter name from + "RemapMode" to "FLASH_BOOT_x". + + Modify comments to remind users about "Stack Usage Analysis" notification. + + Remove redefined "PWRRST_SET" setting in "ht32f5xxxx_pwrcu.c". + + Update CKCU API. Enhanced program stability with robustness settings for parameter "PCLKPrescaler" + in "CKCU_SetPeripPrescaler(..., CKCU_APBCLKPRE_TypeDef PCLKPrescaler)". + + Update I2C Master middleware, improve setting way and fix minor errors. + + Update the following middleware to support the BMduino Keil Driver. + "utilities/middleware/i2c_master.c" + "utilities/middleware/i2c_master.h" + "utilities/middleware/spi_module.c" + "utilities/middleware/spi_module.h" + "utilities/middleware/uart_module.c" + "utilities/middleware/uart_module.h" + + Update xxTM IP Driver + - Remove redundant "TM_ClearOREFConfig()" function. + + Update "DAC_Cmd()" of "ht32f5xxxx_dac.c", remove compiler warning of the GNU compiler. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.10.1_7761 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-06-11 + Main Changes + + Add new device support. + - HT32F61730, HT32F61741 + + Add new examples. + "ADC/BandgapVoltage" + "GPIO/SinkCurrentEnhanced" + + Update related files of HT32F59046. + + Fix the "USE_HT32_CHIP" ID error of HT32F52244 (change from 33 to 35). + + Remove "LIBCFG_GPIO_SINK_CURRENT_ENHANCED" setting error for the following part number. + HT32F50431/50441 + HT32F50442/50452 + HT32F53231/53241 + HT32F53242/53252 + HT32F54231/54241 + HT32F54243/54253 + + Change the ADC API, "ADC_VREFOutputCmd()" as "ADC_VREFOutputADVREFPCmd()". + + Change the CKCU API, "CKCU_Set_HSIReadyCounter" as "CKCU_SetHSIReadyCounter()". + + Add "LIBCFG_GPIO_SINK_CURRENT_ENHANCED" setting of HT32F50020/50030. + + Improve the thread-safe capability of "utilities/common/ring_buffer.c". + + Others + + Update comment, format, typing error, and coding style. + + Update the project file of HT32F61141, change the "ht32f5xxxx_01_usbdconf.h" as ht32f5xxxx_02_usbdconf.h". + + Update "SPI_DUALCmd()", "QSPI_QuadCmd()", and "QSPI_DirectionConfig()", make sure the SPI Bus is not busy + before changing the settings. + +/*----------------------------------------------------------------------------------------------------------*/ +/* HT32_STD_5xxxx_FWLib_V1.9.2_7624 */ +/*----------------------------------------------------------------------------------------------------------*/ + Release Date: 2024-02-29 + Main Changes + + Add new examples. + "Tips/Checksum_CRC16" + "Tips/StackOnTop" + "USART/LIN_Master" + "USART/LIN_Slave" + "CAN/TxRxLoopback" + + Add "LIBCFG_CMP_IVREF_CN_IN" define of the following parts, to fix the comparator function/feature + missing (select VREF as inverted input). + - HT32F50442/50452/53242/53252. + + Add HT32 Stack Usage Analysis feature. + - Modify "ht32f5xxxx_conf.h", add "HTCFG_STACK_USAGE_ANALYSIS" setting for enabling HT32 Stack Usage + Analysis. + - Update project templates and "ht32_cm0plus_misc.c/.h", add "StackUsageAnalysisInit()" function to + initialize stack. + - Update project files, add HT32 Stack Usage Analysis component viewer. + + Update and sync "startup_ht32f5xxxx_nn.s" for the "Stack On Top" and "Stack Usage Analysis" feature. + + Add "USE_LIBCFG_RAM_SIZE" define in Keil project files for the "Stack On Top" feature. + + Modify "ht32f5xxxx_01.h", fix the MCTM alias mismatch. + - "MCTMn_IRQHandler" alias from "MCTM0_G_IRQHandler" to "MCTM0_UP_IRQHandler" + + Update related middleware (eeprom_emulation and spi_module). + + Others + + Update comment, format, typing error, and coding style. + + Update e-Link32 Pro/Lite Command line tool as "V1.20" ("utilities/elink32pro/eLink32pro.exe"). + + Update "TM/PWM_Buzzer/buzzer_pwm.c" to remove redefine alias (they are also defined in "ht32f5xxxx_01.h.). + + Update Keil after build setting, add double quotes (") in the command to prevent space in the path issues. + + Remove "ht32_board_config.h" from the "PDMA/SoftwareTrigger" example. /*----------------------------------------------------------------------------------------------------------*/ /* HT32_STD_5xxxx_FWLib_V1.9.1_7446 */ @@ -386,8 +651,8 @@ - Add "gEXTIn_IRQn[]" and "EXTI_GetIRQn()"" macro to map GPIO pin number (0 ~ 15) to "EXTIn_IRQn". - Add "GPIO2EXTI()"" macro to map GPIO pin to EXTI Channel. - Change "AFIO_EXTISourceConfig()"" API, remove "AFIO_EXTI_CH_Enum" and "AFIO_ESS_Enum". - Old: "void AFIO_EXTISourceConfig(AFIO_EXTI_CH_Enum AFIO_EXTI_CH_n, AFIO_ESS_Enum AFIO_ESS_Px);" - New: "void AFIO_EXTISourceConfig(u32 GPIO_PIN_NUM_n, u32 GPIO_Px);" + Old: void AFIO_EXTISourceConfig(AFIO_EXTI_CH_Enum AFIO_EXTI_CH_n, AFIO_ESS_Enum AFIO_ESS_Px) + New: void AFIO_EXTISourceConfig(u32 GPIO_PIN_NUM_n, u32 GPIO_Px) + LEDC - Fix typing error of the following define. Old New @@ -772,7 +1037,7 @@ + Update GNU project (*.uvprojx), fix the compile error when use new GNU Arm version ("gcc-arm-none-eabi-10-2020-q2-preview-win32" or above). + Fix Keil compiling error when disable both retarget and MicroLib. - + Update "ht32f1xxxx_01.h", fix the compatibility issue when user include "stdbool.h". + + Update "ht32f5xxxx_01.h", fix the compatibility issue when user include "stdbool.h". + Modify GNU compiler settings, output text file (disassembly) after building the code. + Change the startup/system supporting files of specify MCU device. Old New @@ -782,12 +1047,12 @@ startup_ht32f5xxxx_xxx_01.s to startup_ht32f5xxxx_xxx_07.s - HT32F52344/HT32F52354 startup_ht32f5xxxx_01.s to startup_ht32f5xxxx_03.s - + Add "HT32_FWLIB_VER" and "HT32_FWLIB_SVN" in "ht32f1xxxx_lib.h" for the version information of + + Add "HT32_FWLIB_VER" and "HT32_FWLIB_SVN" in "ht32f5xxxx_lib.h" for the version information of HT32 Firmware Library. Example: "#define HT32_FWLIB_VER (018)" "#define HT32_FWLIB_VER (5303)" - + Add new AFIO define in "ht32f1xxxx_gpio.h". + + Add new AFIO define in "ht32f5xxxx_gpio.h". - "AFIO_FUN_MCTM0", "AFIO_FUN_MCTM1" - "AFIO_FUN_GPTM0", "AFIO_FUN_GPTM1", "AFIO_FUN_GPTM2", "AFIO_FUN_GPTM3" - "AFIO_FUN_PWM0", "AFIO_FUN_PWM1", "AFIO_FUN_PWM2", "AFIO_FUN_PWM3" diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/SConscript b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/SConscript index 32e59edc7c4..2411aa028fe 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/SConscript +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/SConscript @@ -2,38 +2,11 @@ import os import sys import rtconfig from building import * - -def get_source(ic_model, file_path, system_path, base_path): - source_path = [] - files_list = [] - readafter = 0 - if not os.path.isfile(file_path): - return - - with open(file_path, 'r') as file: - # content = file.read() - for line in file: - if readafter == 2 and line.find('>') != -1: - break - if readafter == 2: - files_list.append(line.strip()) - if line.find(ic_model) != -1: - readafter = 1 - if readafter == 1 and line.find('<') != -1: - readafter = 2 - for line in files_list: - if line.find('system') != -1: - source_path.append(os.path.join(system_path, line.strip())) - else: - source_path.append(os.path.join(base_path, line.strip())) - return source_path - - Import('rtconfig') tools_path = os.path.normpath(os.getcwd() + '../../..' + '/tools') sys.path.append(tools_path) - +from sdk_dist import get_source source_file_path = os.path.join(os.getcwd(), 'Source_file') base_path = 'library/HT32F5xxxx_Driver/src/' diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h index f72fd72a6f8..41ea34e832b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Include/ht32f5xxxx_01.h @@ -1,8 +1,8 @@ /***************************************************************************//** * @file ht32f5xxxx_01.h * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Header File - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -255,9 +255,7 @@ typedef enum IRQn ADC0_IRQn = 8, /*!< ADC0 Interrupt */ #if defined(USE_HT32F65230_40) ADC1_IRQn = 9, /*!< ADC1 Interrupt */ - #elif defined(USE_HT32F66242) - CORDIC_IRQn = 9, /*!< CORDIC global Interrupt */ - #elif defined(USE_HT32F66246) + #elif defined(USE_HT32F66242) || defined(USE_HT32F66246) CORDIC_IRQn = 9, /*!< CORDIC global Interrupt */ #endif MCTM0_BRK_IRQn = 10, /*!< MCTM BRK Interrupt */ @@ -272,10 +270,8 @@ typedef enum IRQn CMP1_IRQn = 19, /*!< Comparator1 Interrupt */ #if defined(USE_HT32F65230_40) CMP2_IRQn = 20, /*!< Comparator2 Interrupt */ - #elif defined(USE_HT32F66242) - PID_IRQn = 20, /*!< PID global Interrupt */ - #elif defined(USE_HT32F66246) - PID_IRQn = 20, /*!< PID global Interrupt */ + #elif defined(USE_HT32F66242) || defined(USE_HT32F66246) + PID0_IRQn = 20, /*!< PID global Interrupt */ #endif I2C0_IRQn = 21, /*!< I2C global Interrupt */ SPI0_IRQn = 22, /*!< SPI global Interrupt */ @@ -538,13 +534,18 @@ typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; #if defined (__CC_ARM) #define __ALIGN4 __align(4) +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #define __ALIGN4 __attribute__((aligned(4))) #elif defined (__ICCARM__) #define __ALIGN4 _Pragma("data_alignment = 4") #elif defined (__GNUC__) #define __ALIGN4 __attribute__((aligned(4))) #endif -#if defined (__GNUC__) +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #define __PACKED_H + #define __PACKED_F __attribute__ ((packed)) +#elif defined (__GNUC__) #define __PACKED_H #define __PACKED_F __attribute__ ((packed)) #elif defined (__ICCARM__) || (__CC_ARM) @@ -675,14 +676,21 @@ typedef struct { /* ADC0: 0x40010000 */ /* ADC1: 0x40050000 */ - __IO uint32_t CFGR; /*!< 0x000 ADC Configuration Register (ADC1 only) */ + __IO uint32_t CFGR; /*!< 0x000 ADC Configuration Register (ADC1 only for specific */ + /*! model) */ __IO uint32_t RST; /*!< 0x004 ADC Reset Register */ __IO uint32_t CONV; /*!< 0x008 ADC Regular Conversion Mode Register */ __IO uint32_t HCONV; /*!< 0x00C ADC High-priority Conversion Mode Register */ __IO uint32_t LST[2]; /*!< 0x010 - 0x014 ADC Conversion List Register */ uint32_t RESERVE0[2]; /*!< 0x018 - 0x01C Reserved */ + #if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) __IO uint32_t HLST; /*!< 0x020 ADC High-priority Conversion List Register */ uint32_t RESERVE1[3]; /*!< 0x024 - 0x02C Reserved */ + #endif + #if defined(USE_HT32F66242) || defined(USE_HT32F66246) + __IO uint32_t HLST[3]; /*!< 0x020 - 0x028 ADC High-priority Conversion List Register 0-2 */ + uint32_t RESERVE1[1]; /*!< 0x02C Reserved */ + #endif #if defined(USE_HT32F65230_40) __IO uint32_t OFR[12]; /*!< 0x030 - 0x05C ADC Input Offset Register 0-11 */ uint32_t RESERVE2[4]; /*!< 0x060 - 0x06C Reserved */ @@ -695,12 +703,9 @@ typedef struct __IO uint32_t STR[15]; /*!< 0x070 - 0x0A8 ADC Input Sampling Time Register 0-14 */ uint32_t RESERVE3[1]; /*!< 0x0AC Reserved */ #endif - #if defined(USE_HT32F66242) - uint32_t RESERVE2[16]; /*!< 0x030 - 0x06C Reserved */ - __IO uint32_t STR[16]; /*!< 0x070 - 0x0AC ADC Input Sampling Time Register 0-15 */ - #endif - #if defined(USE_HT32F66246) - uint32_t RESERVE2[16]; /*!< 0x030 - 0x06C Reserved */ + #if defined(USE_HT32F66242) || defined(USE_HT32F66246) + uint32_t RESERVE2[15]; /*!< 0x030 - 0x068 Reserved */ + uint32_t RESERVE3[1]; /*!< 0x06C Reserved */ __IO uint32_t STR[16]; /*!< 0x070 - 0x0AC ADC Input Sampling Time Register 0-15 */ #endif __IO uint32_t DR[8]; /*!< 0x0B0 - 0x0CC ADC Regular Conversion Data Register 0-7 */ @@ -726,15 +731,7 @@ typedef struct __IO uint32_t DIESR; /*!< 0x150 Dual ADC Interrupt Enable/Status Register (ADC1 only) */ __IO uint32_t DPDMAR; /*!< 0x154 Dual ADC PDMA Request Register (ADC1 only) */ #endif - #if defined(USE_HT32F66242) - uint32_t RESERVE8[3]; /*!< 0x144 - 0x14C Reserved */ - __IO uint32_t VREFCR; /*!< 0x150 ADC Reference Voltage Control Register */ - uint32_t RESERVE9[3]; /*!< 0x154 - 0x15C Reserved */ - __IO uint32_t HDR4[8]; /*!< 0x160 - 0x17C ADC High-priority Conversion Data Register 4-11 */ - uint32_t RESERVE10[4]; /*!< 0x180 - 0x18C Reserved */ - __IO uint32_t STR16[2]; /*!< 0x190 - 0x194 ADC Input Sampling Time Register 16-17 */ - #endif - #if defined(USE_HT32F66246) + #if defined(USE_HT32F66242) || defined(USE_HT32F66246) uint32_t RESERVE8[3]; /*!< 0x144 - 0x14C Reserved */ __IO uint32_t VREFCR; /*!< 0x150 ADC Reference Voltage Control Register */ uint32_t RESERVE9[3]; /*!< 0x154 - 0x15C Reserved */ @@ -909,7 +906,7 @@ typedef struct __IO uint32_t DOUTR; /*!< 0x020 Data Output Register */ __IO uint32_t SRR; /*!< 0x024 Output Set and Reset Control Register */ __IO uint32_t RR; /*!< 0x028 Output Reset Control Register */ - #if defined(USE_HT32F50220_30) || defined(USE_HT32F50231_41) || defined(USE_HT32F54231_41) || defined(USE_HT32F54243_53) || defined(USE_HT32F53231_41) || defined(USE_HT32F53242_52) || defined(USE_HT32F50431_41) || defined(USE_HT32F50442_52) + #if defined(USE_HT32F50020_30) || defined(USE_HT32F50220_30) || defined(USE_HT32F50231_41) __IO uint32_t SCER; /*!< 0x02C Sink Current Enhanced Selection Register */ #endif } HT_GPIO_TypeDef; @@ -1055,7 +1052,7 @@ typedef struct __IO uint32_t LVDCSR; /*!< 0x010 Low Voltage/Brown Out Detect Control and Status Register*/ #if defined(USE_HT32F57342_52) uint32_t RESERVE2[2]; /*!< 0x014 ~ 0x18 Reserved */ - __IO uint32_t LDOSR ; /*!< 0x01C Power Control LDO Status Register */ + __IO uint32_t LDOSR; /*!< 0x01C Power Control LDO Status Register */ #endif #if defined(USE_HT32F52342_52) || defined(USE_HT32F5826) || defined(USE_HT32F52357_67) uint32_t RESERVE3[59]; /*!< 0x014 ~ 0x0FC Reserved */ @@ -1180,7 +1177,7 @@ typedef struct #else uint32_t RESERVED3[2]; /*!< 0x040 ~ 0x44 Reserved */ #endif - #if defined(USE_HT32F0008) || defined(USE_HT32F50220_30) || defined(USE_HT32F50231_41) || defined(USE_HT32F0006) || defined(USE_HT32F52357_67) || defined(USE_HT32F57342_52) || defined(USE_HT32F57331_41) || defined(USE_HT32F50343) || defined(USE_HT32F54231_41) || defined(USE_HT32F54243_53) || defined(USE_HT32F61244_45) || defined(USE_HT32F53231_41) || defined(USE_HT32F53242_52) || defined(USE_HT32F50431_41) || defined(USE_HT32F50442_52) + #if defined(USE_HT32F0008) || defined(USE_HT32F50220_30) || defined(USE_HT32F50231_41) || defined(USE_HT32F0006) || defined(USE_HT32F52357_67) || defined(USE_HT32F57342_52) || defined(USE_HT32F57331_41) || defined(USE_HT32F50343) || defined(USE_HT32F54231_41) || defined(USE_HT32F54243_53) || defined(USE_HT32F61244_45) || defined(USE_HT32F53231_41) || defined(USE_HT32F53242_52) || defined(USE_HT32F50431_41) || defined(USE_HT32F50442_52) || defined(USE_HT32F66242) || defined(USE_HT32F66246) __IO uint32_t APBPCSR2; /*!< 0x048 APB Peripheral Clock Selection Register 2 */ uint32_t RESERVED4[173]; /*!< 0x04C ~ 0x2FC Reserved */ #elif defined(USE_HT32F52234_44) @@ -1190,7 +1187,7 @@ typedef struct #else uint32_t RESERVED4[174]; /*!< 0x048 ~ 0x2FC Reserved */ #endif - #if !defined(USE_HT32F50020_30) + #if !defined(USE_HT32F50020_30) && !defined(USE_HT32F65230_40) && !defined(USE_HT32F65232) && !defined(USE_HT32F66242) && !defined(USE_HT32F66246) __IO uint32_t LPCR; /*!< 0x300 Low Power Control Register */ #else uint32_t RESERVED5; /*!< 0x300 Reserved */ @@ -1799,6 +1796,7 @@ typedef struct __IO uint32_t DB1R; /*!< 0x028 CAN Interface Data B 1 Register */ } HT_CANIF_TypeDef; + /** * @brief Controller Area Network Global */ @@ -1830,6 +1828,7 @@ typedef struct __IO uint32_t MVR1; /*!< 0x164 Message Valid Register 1 */ } HT_CAN_TypeDef; + /** * @brief Coordinate Rotation Digital Computer */ @@ -1841,69 +1840,47 @@ typedef struct __IO uint32_t RDATA; /*!< 0x008 Result Register */ } HT_CORDIC_TypeDef; +/** + * @brief Proportional Mode parameters + */ +typedef struct +{ + + __IO uint32_t LEIR; /*!< 0x000 Last Error Input Register */ + __IO uint32_t KPIR; /*!< 0x004 KP Input Register */ + __IO uint32_t KIIR; /*!< 0x008 KI Input Register */ + __IO uint32_t KDIR; /*!< 0x00C KD Input Register */ + __IO uint32_t LIFVR; /*!< 0x010 Last Integral Function Value Register */ + __IO uint32_t IFVMAXLR; /*!< 0x014 Integral Function Value Maximum Limitation Register */ + __IO uint32_t IFVMINLR; /*!< 0x018 Integral Function Value Minimum Limitation Register */ + __IO uint32_t PIDORLR; /*!< 0x01C PID Output Result Limitation Register */ +} HT_PIDPARA_TypeDef; +/** + * @} + */ + /** * @brief Proportional Integral Derivative controller */ typedef struct { /* PID: 0x400EC000 */ - __IO uint32_t CR0; /*!< 0x000 Control Register 0 */ - __IO uint32_t UI_INPUT; /*!< 0x004 */ - __IO uint32_t ERR_n; /*!< 0x008 */ - __IO uint32_t PID_OUT; /*!< 0x00C */ - __IO uint32_t SPD1ERR1; /*!< 0x010 */ - __IO uint32_t SPD1KP; /*!< 0x014 */ - __IO uint32_t SPD1KI; /*!< 0x018 */ - __IO uint32_t SPD1KD; /*!< 0x01C */ - __IO uint32_t SPD1UI1; /*!< 0x020 */ - __IO uint32_t SPD1UI_MAX; /*!< 0x024 */ - __IO uint32_t SPD1UI_MIN; /*!< 0x028 */ - __IO uint32_t SPD1_PIDOUT_LIM; /*!< 0x02C */ - __IO uint32_t IQ1ERR1; /*!< 0x030 */ - __IO uint32_t IQ1KP; /*!< 0x034 */ - __IO uint32_t IQ1KI; /*!< 0x038 */ - __IO uint32_t IQ1KD; /*!< 0x03C */ - __IO uint32_t IQ1UI1; /*!< 0x040 */ - __IO uint32_t IQ1UI_MAX; /*!< 0x044 */ - __IO uint32_t IQ1UI_MIN; /*!< 0x048 */ - __IO uint32_t IQ1_PIDOUT_LIM; /*!< 0x04C */ - __IO uint32_t ID1ERR1; /*!< 0x050 */ - __IO uint32_t ID1KP; /*!< 0x054 */ - __IO uint32_t ID1KI; /*!< 0x058 */ - __IO uint32_t ID1KD; /*!< 0x05C */ - __IO uint32_t ID1UI1; /*!< 0x060 */ - __IO uint32_t ID1UI_MAX; /*!< 0x064 */ - __IO uint32_t ID1UI_MIN; /*!< 0x068 */ - __IO uint32_t ID1_PIDOUT_LIM; /*!< 0x06C */ - __IO uint32_t FWNK1ERR1; /*!< 0x070 */ - __IO uint32_t FWNK1KP; /*!< 0x074 */ - __IO uint32_t FWNK1KI; /*!< 0x078 */ - __IO uint32_t FWNK1KD; /*!< 0x07C */ - __IO uint32_t FWNK1UI1; /*!< 0x080 */ - __IO uint32_t FWNK1UI_MAX; /*!< 0x084 */ - __IO uint32_t FWNK1UI_MIN; /*!< 0x088 */ - __IO uint32_t FWNK1_PIDOUT_LIM;/*!< 0x08C */ - __IO uint32_t PLL1ERR1; /*!< 0x090 */ - __IO uint32_t PLL1KP; /*!< 0x094 */ - __IO uint32_t PLL1KI; /*!< 0x098 */ - __IO uint32_t PLL1KD; /*!< 0x09C */ - __IO uint32_t PLL1UI1; /*!< 0x0A0 */ - __IO uint32_t PLL1UI_MAX; /*!< 0x0A4 */ - __IO uint32_t PLL1UI_MIN; /*!< 0x0A8 */ - __IO uint32_t PLL1_PIDOUT_LIM; /*!< 0x0AC */ - __IO uint32_t USR1ERR1; /*!< 0x0B0 */ - __IO uint32_t USR1KP; /*!< 0x0B4 */ - __IO uint32_t USR1KI; /*!< 0x0B8 */ - __IO uint32_t USR1KD; /*!< 0x0BC */ - __IO uint32_t USR1UI1; /*!< 0x0C0 */ - __IO uint32_t USR1UI_MAX; /*!< 0x0C4 */ - __IO uint32_t USR1UI_MIN; /*!< 0x0C8 */ - __IO uint32_t USR1_PIDOUT_LIM; /*!< 0x0CC */ + __IO uint32_t CR; /*!< 0x000 Control Register */ + __IO uint32_t IFIVR; /*!< 0x004 Integral Function Input Value Register */ + __IO uint32_t EIVR; /*!< 0x008 Error Input Value Register */ + __IO uint32_t ORR; /*!< 0x00C Output Result Register */ + HT_PIDPARA_TypeDef SPD; /*!< 0x010 - 0x02C SPD Mode */ + HT_PIDPARA_TypeDef IQ; /*!< 0x030 - 0x04C IQ Mode */ + HT_PIDPARA_TypeDef ID; /*!< 0x050 - 0x06C ID Mode */ + HT_PIDPARA_TypeDef FWNK; /*!< 0x070 - 0x08C FWNK Mode */ + HT_PIDPARA_TypeDef PLL; /*!< 0x090 - 0x0AC PLL Mode */ + HT_PIDPARA_TypeDef USR; /*!< 0x0B0 - 0x0CC USR Mode */ } HT_PID_TypeDef; /** * @} */ + /** * @brief RF */ @@ -2132,7 +2109,7 @@ typedef struct #define HT_DIV_BASE (HT_AHBPERIPH_BASE + 0x4A000) /* 0x400CA000 */ #define HT_RF_BASE (HT_AHBPERIPH_BASE + 0x50000) /* 0x400D0000 */ #define HT_CORDIC_BASE (HT_AHBPERIPH_BASE + 0x5C000) /* 0x400DC000 */ -#define HT_PID_BASE (HT_AHBPERIPH_BASE + 0x5E000) /* 0x400DE000 */ +#define HT_PID0_BASE (HT_AHBPERIPH_BASE + 0x5E000) /* 0x400DE000 */ #define HT_QSPI_BASE (HT_AHBPERIPH_BASE + 0x60000) /* 0x400E0000 */ /** @@ -2596,7 +2573,7 @@ typedef struct #define HT_PGA2 ((HT_PGA0_X_TypeDef *) HT_PGA2_BASE) #define HT_PGA3 ((HT_PGA0_X_TypeDef *) HT_PGA3_BASE) #define HT_PGA ((HT_PGA_TypeDef *) HT_PGA_BASE) -#define HT_PID ((HT_LCD_TypeDef *) HT_LCD_BASE) +#define HT_PID0 ((HT_PID_TypeDef *) HT_PID0_BASE) #define HT_CORDIC ((HT_CORDIC_TypeDef *) HT_CORDIC_BASE) #define HT_LSTM0 ((HT_RTC_TypeDef *) HT_RTC_BASE) @@ -2618,7 +2595,7 @@ typedef struct #define HT_PGA2 ((HT_PGA0_X_TypeDef *) HT_PGA2_BASE) #define HT_PGA3 ((HT_PGA0_X_TypeDef *) HT_PGA3_BASE) #define HT_PGA ((HT_PGA_TypeDef *) HT_PGA_BASE) -#define HT_PID ((HT_LCD_TypeDef *) HT_LCD_BASE) +#define HT_PID0 ((HT_PID_TypeDef *) HT_PID0_BASE) #define HT_CORDIC ((HT_CORDIC_TypeDef *) HT_CORDIC_BASE) #define HT_LSTM0 ((HT_RTC_TypeDef *) HT_RTC_BASE) @@ -2689,14 +2666,14 @@ typedef struct #define UART3_IRQn UART1_UART3_IRQn #endif -#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) +#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F66242) || defined(USE_HT32F66246) // Alias #define GPTM0_IRQn GPTM0_G_IRQn #define GPTM0_IRQHandler GPTM0_G_IRQHandler #define MCTM0_IRQn MCTM0_UP_IRQn - #define MCTM0_IRQHandler MCTM0_G_IRQHandler + #define MCTM0_IRQHandler MCTM0_UP_IRQHandler #define MCTM1_IRQn MCTM1_UP_IRQn - #define MCTM1_IRQHandler MCTM1_G_IRQHandler + #define MCTM1_IRQHandler MCTM1_UP_IRQHandler #endif #define AFIO_ESS_Enum u32 diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_hf5032.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_hf5032.s index a86606d9663..23655e6b121 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_hf5032.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_hf5032.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7648 $ +; Date : $Date:: 2024-03-20 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,7 +19,6 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,7 +33,6 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 USE_HT32_CHIP_SET EQU 7 ; Notice that the project's Asm Define has the higher priority. @@ -47,7 +45,6 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 HT32F50220_30 EQU 7 @@ -56,7 +53,6 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 IF USE_HT32_CHIP_SET=0 @@ -72,13 +68,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +307,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +322,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0006.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0006.s index e0b5ba76e21..1c93c451bed 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0006.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0006.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_07.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -52,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -277,10 +288,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -291,11 +303,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0008.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0008.s index db72cb363fa..239d45c26f8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0008.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f0008.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50020_30.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50020_30.s index 45853e20f1f..f5c17e8bae3 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50020_30.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50020_30.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -26,6 +26,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 25 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -33,10 +34,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -51,13 +54,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-2048:8> Heap_Size EQU 0 @@ -208,10 +222,11 @@ LEDC_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +237,19 @@ LEDC_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50220_30.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50220_30.s index a86606d9663..40fff3b7bdb 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50220_30.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50220_30.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 7 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50231_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50231_41.s index 8e689529096..3c1522bed8a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50231_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50231_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50343.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50343.s index 1a58d66e73b..eb2c66aebaf 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50343.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50343.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_06.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-12288:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-12288:8> Heap_Size EQU 0 @@ -271,10 +282,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -285,11 +297,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50431_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50431_41.s index be3f3ca0f7f..c1ecefc8967 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50431_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50431_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 USE_HT32_CHIP_SET EQU 30 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -31,9 +33,11 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050452 ;_HT32FWID EQU 0x00050431 ;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 HT32F50442_52 EQU 26 HT32F50431_41 EQU 30 +HT32F61052 EQU 26 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -48,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -237,10 +252,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -251,11 +267,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50442_52.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50442_52.s index 214cdf9e323..152ae6ca6f8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50442_52.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f50442_52.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 USE_HT32_CHIP_SET EQU 26 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -31,9 +33,11 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050452 ;_HT32FWID EQU 0x00050431 ;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 HT32F50442_52 EQU 26 HT32F50431_41 EQU 30 +HT32F61052 EQU 26 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -48,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -237,10 +252,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -251,11 +267,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52142.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52142.s index db72cb363fa..239d45c26f8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52142.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52142.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52220_30.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52220_30.s index ae562b2a89a..1b71dcbac46 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52220_30.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52220_30.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 1 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52231_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52231_41.s index c653285b1f2..ff7688a37ff 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52231_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52231_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52234_44.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52234_44.s index 9f80e3bd0eb..e1a1b740e3d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52234_44.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52234_44.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_17.s -; Version : $Rev:: 7027 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,14 +21,14 @@ ;// Select HT32 Device for the assembly setting. ;// Notice that the project's Asm Define has the higher priority. ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 -USE_HT32_CHIP_SET EQU 33 ; Notice that the project's Asm Define has the higher priority. +;// <35=> HT32F52234/44 +USE_HT32_CHIP_SET EQU 35 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00052234 ;_HT32FWID EQU 0x00052244 -HT32F52234_44 EQU 33 +HT32F52234_44 EQU 35 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -43,13 +43,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -212,10 +223,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -226,11 +238,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52243_53.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52243_53.s index e9b3a2c1946..7ece1c101aa 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52243_53.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52243_53.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 5 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52331_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52331_41.s index 8cd61fd13a8..39d0d94d15f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52331_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52331_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 3 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52342_52.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52342_52.s index 2285fed9c8b..536d5252d53 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52342_52.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52342_52.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 4 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52344_54.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52344_54.s index e745eaa8033..a7fa970bc75 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52344_54.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52344_54.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52357_67.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52357_67.s index 4533138d126..ea3bd5c1dd7 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52357_67.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f52357_67.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53231_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53231_41.s index e1bc80febe4..46d1ded0b43 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53231_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53231_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_15.s -; Version : $Rev:: 6874 $ -; Date : $Date:: 2023-05-03 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -239,10 +250,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -253,11 +265,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53242_52.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53242_52.s index f4dbd9cf62f..3afd815b485 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53242_52.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f53242_52.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_15.s -; Version : $Rev:: 6874 $ -; Date : $Date:: 2023-05-03 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -239,10 +250,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -253,11 +265,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54231_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54231_41.s index 5db17956e76..2d239879ac2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54231_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54231_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_09.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -316,10 +327,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -330,11 +342,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54243_53.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54243_53.s index 657d0d65230..44e996c83b4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54243_53.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f54243_53.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_09.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -316,10 +327,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -330,11 +342,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57331_41.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57331_41.s index cbaf7f3ee16..b545bc467b4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57331_41.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57331_41.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57342_52.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57342_52.s index b1d916864c8..82c72c182ba 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57342_52.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57342_52.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 14 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57541.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57541.s new file mode 100644 index 00000000000..b545bc467b4 --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57541.s @@ -0,0 +1,378 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_05.s +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F57331, HT32F57341 +; HT32F57342, HT32F57352 +; HT32F59741 +; HT32F5828 +; HT32F67742 +; HT32F59746 +; HT32F57541 +; HT32F57552 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <13=> HT32F57331/41 +;// <14=> HT32F57342/52 +;// <13=> HT32F59741 +;// <14=> HT32F5828 +;// <13=> HT32F67742 +;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 +USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00057331 +;_HT32FWID EQU 0x00057341 +;_HT32FWID EQU 0x00057342 +;_HT32FWID EQU 0x00057352 +;_HT32FWID EQU 0x00059741 +;_HT32FWID EQU 0x00005828 +;_HT32FWID EQU 0x00067742 +;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 + +HT32F57331_41 EQU 13 +HT32F57342_52 EQU 14 +HT32F59741 EQU 13 +HT32F5828 EQU 14 +HT32F67742 EQU 13 +HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD COMP_DAC_IRQHandler ; 07, 23, 0x05C, + ENDIF + DCD ADC_IRQHandler ; 08, 24, 0x060, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD AES_IRQHandler ; 09, 25, 0x064, + ENDIF + DCD _RESERVED ; 10, 26, 0x068, + DCD LCD_IRQHandler ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD I2C1_IRQHandler ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD SPI1_IRQHandler ; 22, 38, 0x098, + DCD USART0_IRQHandler ; 23, 39, 0x09C, + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + DCD USB_IRQHandler ; 29, 45, 0x0B4, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 30, 46, 0x0B8, + DCD _RESERVED ; 31, 47, 0x0BC, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_DAC_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT LCD_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_DAC_IRQHandler +ADC_IRQHandler +AES_IRQHandler +LCD_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +SCI_IRQHandler +I2S_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57552.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57552.s new file mode 100644 index 00000000000..82c72c182ba --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f57552.s @@ -0,0 +1,378 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_05.s +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F57331, HT32F57341 +; HT32F57342, HT32F57352 +; HT32F59741 +; HT32F5828 +; HT32F67742 +; HT32F59746 +; HT32F57541 +; HT32F57552 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <13=> HT32F57331/41 +;// <14=> HT32F57342/52 +;// <13=> HT32F59741 +;// <14=> HT32F5828 +;// <13=> HT32F67742 +;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 +USE_HT32_CHIP_SET EQU 14 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00057331 +;_HT32FWID EQU 0x00057341 +;_HT32FWID EQU 0x00057342 +;_HT32FWID EQU 0x00057352 +;_HT32FWID EQU 0x00059741 +;_HT32FWID EQU 0x00005828 +;_HT32FWID EQU 0x00067742 +;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 + +HT32F57331_41 EQU 13 +HT32F57342_52 EQU 14 +HT32F59741 EQU 13 +HT32F5828 EQU 14 +HT32F67742 EQU 13 +HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD COMP_DAC_IRQHandler ; 07, 23, 0x05C, + ENDIF + DCD ADC_IRQHandler ; 08, 24, 0x060, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD AES_IRQHandler ; 09, 25, 0x064, + ENDIF + DCD _RESERVED ; 10, 26, 0x068, + DCD LCD_IRQHandler ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD I2C1_IRQHandler ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD SPI1_IRQHandler ; 22, 38, 0x098, + DCD USART0_IRQHandler ; 23, 39, 0x09C, + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + DCD USB_IRQHandler ; 29, 45, 0x0B4, + IF (USE_HT32_CHIP=HT32F57331_41) + DCD _RESERVED ; 30, 46, 0x0B8, + DCD _RESERVED ; 31, 47, 0x0BC, + ENDIF + IF (USE_HT32_CHIP=HT32F57342_52) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_DAC_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT LCD_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_DAC_IRQHandler +ADC_IRQHandler +AES_IRQHandler +LCD_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +SCI_IRQHandler +I2S_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5826.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5826.s index eba919c13e5..f4501184d1f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5826.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5826.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5826.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7596 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,25 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp - -;// Heap Size (in Bytes) <0-16384:8> -Heap_Size EQU 0 - - AREA HEAP, NOINIT, READWRITE, ALIGN = 3 -__HT_check_heap -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit - - PRESERVE8 - THUMB + ENDIF ;******************************************************************************* ; Fill-up the Vector Table entries with the exceptions ISR address @@ -284,10 +283,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -298,11 +298,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5828.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5828.s index b1d916864c8..82c72c182ba 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5828.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5828.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 14 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59041.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59041.s index 8e689529096..3c1522bed8a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59041.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59041.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59045.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59045.s new file mode 100644 index 00000000000..ff7688a37ff --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59045.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59741.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59741.s index cbaf7f3ee16..b545bc467b4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59741.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59741.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59746.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59746.s index cbaf7f3ee16..b545bc467b4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59746.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f59746.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_01.s index b11048b5e03..05c1c116361 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_01.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_02.s index de2009c868d..0dd429e1523 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_02.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_03.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_03.s index 1ff2f77f4b7..015d5a46dfe 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_03.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_03.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_05.s index 842644ceee5..6e05ca4bfdb 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_05.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_06.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_06.s index bf17a58ce71..780374807b9 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_06.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_06.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_06.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-12288:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-12288:8> Heap_Size EQU 0 @@ -271,10 +282,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -285,11 +297,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_07.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_07.s index 10f210c5a27..b23401ff33a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_07.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_07.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_07.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -52,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -277,10 +288,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -291,11 +303,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_08.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_08.s index 24cf68758d8..6ffff354d86 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_08.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_08.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_09.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_09.s index 089c851eb17..1d2eedce913 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_09.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_09.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_09.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -316,10 +327,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -330,11 +342,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_10.s index 57fb44e3145..d28f4c4e8c2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_10.s @@ -6,14 +6,15 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_10.s -; Version : $Rev:: 5783 $ -; Date : $Date:: 2022-03-30 #$ +; Version : $Rev:: 8105 $ +; Date : $Date:: 2024-09-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,13 +23,16 @@ ;// Notice that the project's Asm Define has the higher priority. ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00061244 ;_HT32FWID EQU 0x00061245 +;_HT32FWID EQU 0x00061242 HT32F61244_45 EQU 24 +NW32F61242 EQU 24 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -43,13 +47,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_11.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_11.s index 784096cf664..5c6c48a1c43 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_11.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_11.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_11.s -; Version : $Rev:: 5991 $ -; Date : $Date:: 2022-06-23 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -43,13 +43,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -218,10 +229,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -232,11 +244,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_12.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_12.s index 45e5c701091..6a24f616fb1 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_12.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_12.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_12.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ USB_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ USB_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_13.s index f03c345a43d..feec236f331 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_13.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -33,10 +35,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -51,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-2048:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ LEDC_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ LEDC_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_14.s index a76b5da417b..224232f9c77 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_14.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -31,9 +33,11 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050452 ;_HT32FWID EQU 0x00050431 ;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 HT32F50442_52 EQU 26 HT32F50431_41 EQU 30 +HT32F61052 EQU 26 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -48,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -237,10 +252,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -251,11 +267,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s index e261fa60210..0d440d350ae 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_15.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_15.s -; Version : $Rev:: 6874 $ -; Date : $Date:: 2023-05-03 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -48,13 +48,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -239,10 +250,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -253,11 +265,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_16.s index 23328ec7c45..b3aa7a12154 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_16.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_16.s -; Version : $Rev:: 7092 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ _HT32FWID EQU 0x00066242 ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -124,7 +135,7 @@ __Vectors DCD BFTM1_IRQHandler ; 17, 33, 0x084, DCD CMP0_IRQHandler ; 18, 34, 0x088, DCD CMP1_IRQHandler ; 19, 35, 0x08C, - DCD PID_IRQHandler ; 20, 36, 0x090, + DCD PID0_IRQHandler ; 20, 36, 0x090, DCD I2C0_IRQHandler ; 21, 37, 0x094, DCD SPI0_IRQHandler ; 22, 38, 0x098, DCD USART0_IRQHandler ; 23, 39, 0x09C, @@ -195,7 +206,7 @@ Default_Handler PROC EXPORT BFTM1_IRQHandler [WEAK] EXPORT CMP0_IRQHandler [WEAK] EXPORT CMP1_IRQHandler [WEAK] - EXPORT PID_IRQHandler [WEAK] + EXPORT PID0_IRQHandler [WEAK] EXPORT I2C0_IRQHandler [WEAK] EXPORT SPI0_IRQHandler [WEAK] EXPORT USART0_IRQHandler [WEAK] @@ -228,7 +239,7 @@ BFTM0_IRQHandler BFTM1_IRQHandler CMP0_IRQHandler CMP1_IRQHandler -PID_IRQHandler +PID0_IRQHandler I2C0_IRQHandler SPI0_IRQHandler USART0_IRQHandler @@ -248,10 +259,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -262,11 +274,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_17.s index 0829021a82f..6187c06586e 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f5xxxx_17.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_17.s -; Version : $Rev:: 7027 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,14 +21,14 @@ ;// Select HT32 Device for the assembly setting. ;// Notice that the project's Asm Define has the higher priority. ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 USE_HT32_CHIP_SET EQU 0 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00052234 ;_HT32FWID EQU 0x00052244 -HT32F52234_44 EQU 33 +HT32F52234_44 EQU 35 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -43,13 +43,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -212,10 +223,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -226,11 +238,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61030.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61030.s index 45853e20f1f..e6e528a0506 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61030.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61030.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 25 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -33,10 +35,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -51,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-2048:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ LEDC_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ LEDC_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61041.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61041.s index 8e689529096..3c1522bed8a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61041.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61041.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61052.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61052.s new file mode 100644 index 00000000000..152ae6ca6f8 --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61052.s @@ -0,0 +1,288 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_14.s +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F50442, HT32F50452 +; HT32F50431, HT32F50441 +; HT32F61052 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <26=> HT32F50442/52 +;// <30=> HT32F50431/41 +;// <26=> HT32F61052 +USE_HT32_CHIP_SET EQU 26 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00050442 +;_HT32FWID EQU 0x00050452 +;_HT32FWID EQU 0x00050431 +;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 + +HT32F50442_52 EQU 26 +HT32F50431_41 EQU 30 +HT32F61052 EQU 26 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F50442_52) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + DCD ADC_IRQHandler ; 08, 24, 0x060, + DCD _RESERVED ; 09, 25, 0x064, + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + DCD _RESERVED ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + IF (USE_HT32_CHIP=HT32F50442_52) + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ELSE + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD I2C1_IRQHandler ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD SPI1_IRQHandler ; 22, 38, 0x098, + DCD USART0_IRQHandler ; 23, 39, 0x09C, + IF (USE_HT32_CHIP=HT32F50442_52) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + DCD _RESERVED ; 27, 43, 0x0AC, + DCD _RESERVED ; 28, 44, 0x0B0, + DCD LEDC_IRQHandler ; 29, 45, 0x0B4, + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + +; Reset handler routine +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 +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT LEDC_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM0_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +LEDC_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61141.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61141.s index e01651cc145..90ccad9f985 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61141.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61141.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_12.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -42,13 +42,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ USB_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ USB_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61244_45.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61244_45.s index 5477d2e2554..8150b2440ab 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61244_45.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61244_45.s @@ -6,14 +6,15 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_10.s -; Version : $Rev:: 5783 $ -; Date : $Date:: 2022-03-30 #$ +; Version : $Rev:: 8105 $ +; Date : $Date:: 2024-09-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,13 +23,16 @@ ;// Notice that the project's Asm Define has the higher priority. ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 USE_HT32_CHIP_SET EQU 24 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00061244 ;_HT32FWID EQU 0x00061245 +;_HT32FWID EQU 0x00061242 HT32F61244_45 EQU 24 +NW32F61242 EQU 24 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -43,13 +47,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61352.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61352.s index e0b5ba76e21..1c93c451bed 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61352.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61352.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_07.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -52,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -277,10 +288,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -291,11 +303,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61355_56_57.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61355_56_57.s index 418bcfd86f8..bb34fecd2ae 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61355_56_57.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61355_56_57.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_07.s -; Version : $Rev:: 5740 $ -; Date : $Date:: 2022-02-17 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -52,13 +52,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -277,10 +288,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -291,11 +303,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61630.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61630.s index 45853e20f1f..e6e528a0506 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61630.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61630.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 25 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -33,10 +35,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -51,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-2048:8> Heap_Size EQU 0 @@ -208,10 +223,11 @@ LEDC_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -222,11 +238,19 @@ LEDC_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61641.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61641.s index 8e689529096..3c1522bed8a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61641.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61641.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61730.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61730.s new file mode 100644 index 00000000000..e6e528a0506 --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61730.s @@ -0,0 +1,259 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_13.s +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F50020, HT32F50030 +; HT32F61630 +; HT32F61030 +; HT32F61730 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <25=> HT32F50020/30 +;// <25=> HT32F61630 +;// <25=> HT32F61030 +;// <25=> HT32F61730 +USE_HT32_CHIP_SET EQU 25 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00050020 +;_HT32FWID EQU 0x00050030 +;_HT32FWID EQU 0x00061630 +;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 + +HT32F50020_30 EQU 25 +HT32F61630 EQU 25 +HT32F61030 EQU 25 +HT32F61730 EQU 25 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-2048:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-2048:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_7_IRQHandler ; 06, 22, 0x058, + DCD _RESERVED ; 07, 23, 0x05C, + DCD ADC_IRQHandler ; 08, 24, 0x060, + DCD _RESERVED ; 09, 25, 0x064, + DCD _RESERVED ; 10, 26, 0x068, + DCD _RESERVED ; 11, 27, 0x06C, + DCD _RESERVED ; 12, 28, 0x070, + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD _RESERVED ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD _RESERVED ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD _RESERVED ; 22, 38, 0x098, + DCD _RESERVED ; 23, 39, 0x09C, + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + DCD _RESERVED ; 27, 43, 0x0AC, + DCD _RESERVED ; 28, 44, 0x0B0, + DCD LEDC_IRQHandler ; 29, 45, 0x0B4, + +; Reset handler routine +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 +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_7_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT LEDC_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_7_IRQHandler +ADC_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +BFTM0_IRQHandler +I2C0_IRQHandler +SPI0_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +LEDC_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61741.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61741.s new file mode 100644 index 00000000000..3c1522bed8a --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f61741.s @@ -0,0 +1,347 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_02.s +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F50220, HT32F50230 +; HT32F50231, HT32F50241 +; HT50F32002 +; HT32F59041 +; HF5032 +; HT32F61641 +; HT32F61041 +; HT32F61741 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <7=> HT32F50220/30 +;// <8=> HT32F50231/41 +;// <7=> HT50F32002 +;// <8=> HT32F59041 +;// <7=> HF5032 +;// <8=> HT32F61641 +;// <8=> HT32F61041 +;// <8=> HT32F61741 +USE_HT32_CHIP_SET EQU 8 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00050220 +;_HT32FWID EQU 0x00050230 +;_HT32FWID EQU 0x00050231 +;_HT32FWID EQU 0x00050241 +;_HT32FWID EQU 0x00032002 +;_HT32FWID EQU 0x00059041 +;_HT32FWID EQU 0x000F5032 +;_HT32FWID EQU 0x00061641 +;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 + +HT32F50220_30 EQU 7 +HT32F50231_41 EQU 8 +HT50F32002 EQU 7 +HT32F59041 EQU 8 +HF5032 EQU 7 +HT32F61641 EQU 8 +HT32F61041 EQU 8 +HT32F61741 EQU 8 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-4096:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + DCD _RESERVED ; 07, 23, 0x05C, + DCD ADC_IRQHandler ; 08, 24, 0x060, + DCD _RESERVED ; 09, 25, 0x064, + IF (USE_HT32_CHIP=HT32F50220_30) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + DCD _RESERVED ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F50220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F50220_30) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD SPI1_IRQHandler ; 22, 38, 0x098, + IF (USE_HT32_CHIP=HT32F50220_30) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM0_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +UART0_IRQHandler +UART1_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62030.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62030.s index ae562b2a89a..1b71dcbac46 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62030.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62030.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 1 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62040.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62040.s index c653285b1f2..ff7688a37ff 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62040.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62040.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62050.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62050.s index e9b3a2c1946..7ece1c101aa 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62050.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62050.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 5 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62140.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62140.s new file mode 100644 index 00000000000..ff7688a37ff --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f62140.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65230_40.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65230_40.s index b9865368094..204d6a2150a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65230_40.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65230_40.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65232.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65232.s index 0ec4ece850d..5b0c20ca246 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65232.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f65232.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66242.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66242.s index d2f753c1156..77dafb95e96 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66242.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66242.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_16.s -; Version : $Rev:: 7092 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 7599 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ _HT32FWID EQU 0x00066242 ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -124,7 +135,7 @@ __Vectors DCD BFTM1_IRQHandler ; 17, 33, 0x084, DCD CMP0_IRQHandler ; 18, 34, 0x088, DCD CMP1_IRQHandler ; 19, 35, 0x08C, - DCD PID_IRQHandler ; 20, 36, 0x090, + DCD PID0_IRQHandler ; 20, 36, 0x090, DCD I2C0_IRQHandler ; 21, 37, 0x094, DCD SPI0_IRQHandler ; 22, 38, 0x098, DCD USART0_IRQHandler ; 23, 39, 0x09C, @@ -195,7 +206,7 @@ Default_Handler PROC EXPORT BFTM1_IRQHandler [WEAK] EXPORT CMP0_IRQHandler [WEAK] EXPORT CMP1_IRQHandler [WEAK] - EXPORT PID_IRQHandler [WEAK] + EXPORT PID0_IRQHandler [WEAK] EXPORT I2C0_IRQHandler [WEAK] EXPORT SPI0_IRQHandler [WEAK] EXPORT USART0_IRQHandler [WEAK] @@ -228,7 +239,7 @@ BFTM0_IRQHandler BFTM1_IRQHandler CMP0_IRQHandler CMP1_IRQHandler -PID_IRQHandler +PID0_IRQHandler I2C0_IRQHandler SPI0_IRQHandler USART0_IRQHandler @@ -248,10 +259,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -262,11 +274,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66246.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66246.s index 9a02335cc69..fd226bf9c20 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66246.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f66246.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_16.s -; Version : $Rev:: 7092 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 7599 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ _HT32FWID EQU 0x00066242 ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -124,7 +135,7 @@ __Vectors DCD BFTM1_IRQHandler ; 17, 33, 0x084, DCD CMP0_IRQHandler ; 18, 34, 0x088, DCD CMP1_IRQHandler ; 19, 35, 0x08C, - DCD PID_IRQHandler ; 20, 36, 0x090, + DCD PID0_IRQHandler ; 20, 36, 0x090, DCD I2C0_IRQHandler ; 21, 37, 0x094, DCD SPI0_IRQHandler ; 22, 38, 0x098, DCD USART0_IRQHandler ; 23, 39, 0x09C, @@ -195,7 +206,7 @@ Default_Handler PROC EXPORT BFTM1_IRQHandler [WEAK] EXPORT CMP0_IRQHandler [WEAK] EXPORT CMP1_IRQHandler [WEAK] - EXPORT PID_IRQHandler [WEAK] + EXPORT PID0_IRQHandler [WEAK] EXPORT I2C0_IRQHandler [WEAK] EXPORT SPI0_IRQHandler [WEAK] EXPORT USART0_IRQHandler [WEAK] @@ -228,7 +239,7 @@ BFTM0_IRQHandler BFTM1_IRQHandler CMP0_IRQHandler CMP1_IRQHandler -PID_IRQHandler +PID0_IRQHandler I2C0_IRQHandler SPI0_IRQHandler USART0_IRQHandler @@ -248,10 +259,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -262,11 +274,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67041_51.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67041_51.s index 13c68a18eca..8035d2c44a8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67041_51.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67041_51.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_11.s -; Version : $Rev:: 5991 $ -; Date : $Date:: 2022-06-23 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -43,13 +43,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -218,10 +229,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -232,11 +244,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67232.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67232.s index ae562b2a89a..1b71dcbac46 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67232.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67232.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 1 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67233.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67233.s index ae562b2a89a..1b71dcbac46 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67233.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67233.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 1 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67741.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67741.s index c653285b1f2..ff7688a37ff 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67741.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67741.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67742.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67742.s index cbaf7f3ee16..b545bc467b4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67742.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht32f67742.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 13 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -43,6 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -50,6 +56,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -64,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -323,10 +342,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -337,11 +357,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32002.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32002.s index a86606d9663..40fff3b7bdb 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32002.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32002.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 7 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -47,8 +47,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -56,8 +56,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -72,13 +72,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-4096:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-4096:8> Heap_Size EQU 0 @@ -300,10 +311,11 @@ UART1_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -314,11 +326,19 @@ UART1_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32003.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32003.s index 2285fed9c8b..536d5252d53 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32003.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f32003.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 4 ; Notice that the project's Asm Define has the higher priority. _HT32FWID EQU 0xFFFFFFFF @@ -69,12 +79,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -86,12 +99,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ; Use project's Asm Define setting (default) @@ -106,13 +124,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -455,10 +484,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -469,11 +499,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200s.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200s.s index b9865368094..204d6a2150a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200s.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200s.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200t.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200t.s index 4533138d126..ea3bd5c1dd7 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200t.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200t.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_03.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7594 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -60,13 +60,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-16384:8> Heap_Size EQU 0 @@ -376,10 +387,11 @@ PDMA_CH2_5_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -390,11 +402,19 @@ PDMA_CH2_5_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200u.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200u.s new file mode 100644 index 00000000000..ff7688a37ff --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_ht50f3200u.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52231.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52231.s new file mode 100644 index 00000000000..ff7688a37ff --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52231.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 2 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52352.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52352.s new file mode 100644 index 00000000000..536d5252d53 --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx52352.s @@ -0,0 +1,520 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_01.s +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F52220, HT32F52230 +; HT32F52231, HT32F52241 +; HT32F52331, HT32F52341 +; HT32F52342, HT32F52352 +; HT32F52243, HT32F52253 +; HT32F0008 +; HT32F52344, HT32F52354 +; HT32F0006 +; HT32F61352 +; HT50F32003 +; HT50F3200U +; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 +; HT32F67741 +; HT32F67232 +; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <1=> HT32F52220/30 +;// <2=> HT32F52231/41 +;// <3=> HT32F52331/41 +;// <4=> HT32F52342/52 +;// <5=> HT32F52243/53 +;// <6=> HT32F0008 +;// <9=> HT32F52344/54 +;// <10=> HT32F0006 +;// <10=> HT32F61352 +;// <4=> HT50F32003 +;// <2=> HT50F3200U +;// <2=> HT32F67741 +;// <1=> HT32F67232 +;// <1=> HT32F67233 +;// <1=> HT32F62030 +;// <2=> HT32F62040 +;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 +USE_HT32_CHIP_SET EQU 4 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00052220 +;_HT32FWID EQU 0x00052230 +;_HT32FWID EQU 0x00052231 +;_HT32FWID EQU 0x00052241 +;_HT32FWID EQU 0x00052331 +;_HT32FWID EQU 0x00052341 +;_HT32FWID EQU 0x00052342 +;_HT32FWID EQU 0x00052352 +;_HT32FWID EQU 0x00052243 +;_HT32FWID EQU 0x00052253 +;_HT32FWID EQU 0x00000008 +;_HT32FWID EQU 0x00052344 +;_HT32FWID EQU 0x00052354 +;_HT32FWID EQU 0x00000006 +;_HT32FWID EQU 0x00061352 +;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F +;_HT32FWID EQU 0x00062030 +;_HT32FWID EQU 0x00062040 +;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 +;_HT32FWID EQU 0x00067741 +;_HT32FWID EQU 0x00067232 +;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 + +HT32F52220_30 EQU 1 +HT32F52231_41 EQU 2 +HT32F52331_41 EQU 3 +HT32F52342_52 EQU 4 +HT32F52243_53 EQU 5 +HT32F0008 EQU 6 +HT32F52344_54 EQU 9 +HT32F0006 EQU 10 +HT32F61352 EQU 10 +HT50F32003 EQU 4 +HT50F3200U EQU 2 +HT32F62030 EQU 1 +HT32F62040 EQU 2 +HT32F62050 EQU 5 +HT32F62140 EQU 2 +HT32F67741 EQU 2 +HT32F67232 EQU 1 +HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-16384:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-16384:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 01, 17, 0x044, + ELSE + DCD RTC_IRQHandler ; 01, 17, 0x044, + ENDIF + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD COMP_IRQHandler ; 07, 23, 0x05C, + ELSE + DCD _RESERVED ; 07, 23, 0x05C, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 08, 24, 0x060, + ELSE + DCD ADC_IRQHandler ; 08, 24, 0x060, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD I2C2_IRQHandler ; 09, 25, 0x064, + ELSE + DCD _RESERVED ; 09, 25, 0x064, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 10, 26, 0x068, + ELSE + DCD MCTM0_IRQHandler ; 10, 26, 0x068, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) + DCD GPTM1_IRQHandler ; 11, 27, 0x06C, + ELSE + DCD _RESERVED ; 11, 27, 0x06C, + ENDIF + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + IF (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 13, 29, 0x074, + DCD _RESERVED ; 14, 30, 0x078, + ELSE + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + ENDIF + IF (USE_HT32_CHIP=HT32F52231_41) || (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0006) + DCD SCTM2_IRQHandler ; 15, 31, 0x07C, + DCD SCTM3_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD PWM0_IRQHandler ; 15, 31, 0x07C, + DCD PWM1_IRQHandler ; 16, 32, 0x080, + ENDIF + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + ENDIF + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + IF (USE_HT32_CHIP=HT32F52220_30) + DCD _RESERVED ; 18, 34, 0x088, + ELSE + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + ENDIF + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 20, 36, 0x090, + ELSE + DCD I2C1_IRQHandler ; 20, 36, 0x090, + ENDIF + DCD SPI0_IRQHandler ; 21, 37, 0x094, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) + DCD _RESERVED ; 22, 38, 0x098, + ELSE + IF (USE_HT32_CHIP=HT32F0006) + DCD QSPI_IRQHandler ; 22, 38, 0x098, + ELSE + DCD SPI1_IRQHandler ; 22, 38, 0x098, + ENDIF + ENDIF + IF (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 23, 39, 0x09C, + ELSE + DCD USART0_IRQHandler ; 23, 39, 0x09C, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) + DCD USART1_IRQHandler ; 24, 40, 0x0A0, + ELSE + DCD _RESERVED ; 24, 40, 0x0A0, + ENDIF + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + IF (USE_HT32_CHIP=HT32F52220_30) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F0006) + DCD _RESERVED ; 26, 42, 0x0A8, + ELSE + DCD UART1_IRQHandler ; 26, 42, 0x0A8, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) + DCD SCI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART2_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0006) + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 27, 43, 0xAC, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0006) + DCD I2S_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52344_54) + DCD _RESERVED ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD UART3_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F0008) + DCD AES_IRQHandler ; 28, 44, 0x0B0, + ENDIF + IF (USE_HT32_CHIP=HT32F52331_41) || (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD USB_IRQHandler ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52243_53) + DCD _RESERVED ; 29, 45, 0x0B4, + ENDIF + IF (USE_HT32_CHIP=HT32F52342_52) || (USE_HT32_CHIP=HT32F52243_53) || (USE_HT32_CHIP=HT32F0008) || (USE_HT32_CHIP=HT32F52344_54) || (USE_HT32_CHIP=HT32F0006) + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + ENDIF + +; Reset handler routine +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =BootProcess + BLX R0 + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +BootProcess PROC + LDR R0, =0x40080300 + LDR R1,[R0, #0x10] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x14] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x18] + CMP R1, #0 + BNE BP1 + LDR R1,[R0, #0x1C] + CMP R1, #0 + BEQ BP2 +BP1 LDR R0, =0x40080180 + LDR R1,[R0, #0xC] + LSLS R1, R1, #4 + LSRS R1, R1, #20 + CMP R1, #0 + BEQ BP3 + CMP R1, #5 + BEQ BP3 + CMP R1, #6 + BEQ BP3 +BP2 DSB + LDR R0, =0x20000000 + LDR R1, =0x05fa0004 + STR R1, [R0] + LDR R1, =0xe000ed00 + LDR R0, =0x05fa0004 + STR R0, [R1, #0xC] + DSB + B . +BP3 LDR R0, =0x20000000 + LDR R1, [R0] + LDR R0, =0x05fa0004 + CMP R0, R1 + BEQ BP4 + BX LR +BP4 LDR R0, =0x40088100 + LDR R1, =0x00000001 + STR R1, [R0] + LDR R0, =0x20000000 + LDR R1, =0x0 + STR R1, [R0] + BX LR + ENDP + +; Dummy Exception Handlers +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT MCTM0_IRQHandler [WEAK] + EXPORT GPTM1_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT SCTM2_IRQHandler [WEAK] + EXPORT SCTM3_IRQHandler [WEAK] + EXPORT PWM0_IRQHandler [WEAK] + EXPORT PWM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT SCI_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT I2S_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT USB_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +COMP_IRQHandler +ADC_IRQHandler +MCTM0_IRQHandler +GPTM1_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +SCTM2_IRQHandler +SCTM3_IRQHandler +PWM0_IRQHandler +PWM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +QSPI_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +UART0_IRQHandler +UART1_IRQHandler +UART2_IRQHandler +UART3_IRQHandler +SCI_IRQHandler +MIDI_IRQHandler +I2S_IRQHandler +AES_IRQHandler +USB_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx6306.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx6306.s index b9865368094..204d6a2150a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx6306.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_mxtx6306.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_08.s -; Version : $Rev:: 6877 $ -; Date : $Date:: 2023-05-04 #$ +; Version : $Rev:: 7595 $ +; Date : $Date:: 2024-02-23 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -55,13 +55,24 @@ USE_HT32_CHIP EQU USE_HT32_CHIP_SET ; Amount of memory (in bytes) allocated for Stack and Heap ; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + ;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). Stack_Size EQU 512 AREA STACK, NOINIT, READWRITE, ALIGN = 3 __HT_check_sp Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE __initial_sp + ENDIF ;// Heap Size (in Bytes) <0-8192:8> Heap_Size EQU 0 @@ -251,10 +262,11 @@ SCTM3_IRQHandler ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __HT_check_heap EXPORT __HT_check_sp + + IF :DEF:__MICROLIB + EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit @@ -265,11 +277,19 @@ SCTM3_IRQHandler EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem LDR R1, = (Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR + ENDIF ALIGN diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_nw32f61242.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_nw32f61242.s new file mode 100644 index 00000000000..8150b2440ab --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/ARM/startup_nw32f61242.s @@ -0,0 +1,259 @@ +;/*---------------------------------------------------------------------------------------------------------*/ +;/* Holtek Semiconductor Inc. */ +;/* */ +;/* Copyright (C) Holtek Semiconductor Inc. */ +;/* All rights reserved. */ +;/* */ +;/*----------------------------------------------------------------------------------------------------------- +; File Name : startup_ht32f5xxxx_10.s +; Version : $Rev:: 8105 $ +; Date : $Date:: 2024-09-05 #$ +; Description : Startup code. +;-----------------------------------------------------------------------------------------------------------*/ + +; Supported Device +; ======================================== +; HT32F61244, HT32F61245 +; NW32F61242 + +;/* <<< Use Configuration Wizard in Context Menu >>> */ + +;// HT32 Device +;// Select HT32 Device for the assembly setting. +;// Notice that the project's Asm Define has the higher priority. +;// <0=> By Project Asm Define +;// <24=> HT32F61244/45 +;// <24=> NW32F61242 +USE_HT32_CHIP_SET EQU 24 ; Notice that the project's Asm Define has the higher priority. + +_HT32FWID EQU 0xFFFFFFFF +;_HT32FWID EQU 0x00061244 +;_HT32FWID EQU 0x00061245 +;_HT32FWID EQU 0x00061242 + +HT32F61244_45 EQU 24 +NW32F61242 EQU 24 + + IF USE_HT32_CHIP_SET=0 + ; Use project's Asm Define setting (default) + ELSE + IF :DEF:USE_HT32_CHIP + ; Use project's Asm Define setting (higher priority than the "USE_HT32_CHIP_SET") + ELSE + ; Use "USE_HT32_CHIP_SET" in the "startup_ht32xxxxx_xx.s" file +USE_HT32_CHIP EQU USE_HT32_CHIP_SET + ENDIF + ENDIF + +; Amount of memory (in bytes) allocated for Stack and Heap +; Tailor those values to your application needs + +;// Stack Location +;// <0=> After the RW/ZI/Heap (Default) +;// <1=> On the top of the SRAM (The end of the SRAM) +USE_STACK_ON_TOP EQU 0 + +;// Stack Size (in Bytes, must 8 byte aligned) <0-8192:8> +;// Only meanful when the Stack Location = "After the RW/ZI/Heap" (USE_STACK_ON_TOP = 0). +Stack_Size EQU 512 + + AREA STACK, NOINIT, READWRITE, ALIGN = 3 +__HT_check_sp +Stack_Mem SPACE Stack_Size + IF (USE_STACK_ON_TOP = 1) +__initial_sp EQU 0x20000000 + USE_LIBCFG_RAM_SIZE + ELSE +__initial_sp + ENDIF + +;// Heap Size (in Bytes) <0-8192:8> +Heap_Size EQU 0 + + AREA HEAP, NOINIT, READWRITE, ALIGN = 3 +__HT_check_heap +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +;******************************************************************************* +; Fill-up the Vector Table entries with the exceptions ISR address +;******************************************************************************* + AREA RESET, CODE, READONLY + EXPORT __Vectors +_RESERVED EQU 0xFFFFFFFF +__Vectors + DCD __initial_sp ; ---, 00, 0x000, Top address of Stack + DCD Reset_Handler ; ---, 01, 0x004, Reset Handler + DCD NMI_Handler ; -14, 02, 0x008, NMI Handler + DCD HardFault_Handler ; -13, 03, 0x00C, Hard Fault Handler + DCD _RESERVED ; ---, 04, 0x010, Reserved + DCD _RESERVED ; ---, 05, 0x014, Reserved + DCD _RESERVED ; ---, 06, 0x018, Reserved + DCD _RESERVED ; ---, 07, 0x01C, Reserved + DCD _HT32FWID ; ---, 08, 0x020, Reserved + DCD _RESERVED ; ---, 09, 0x024, Reserved + DCD _RESERVED ; ---, 10, 0x028, Reserved + DCD SVC_Handler ; -05, 11, 0x02C, SVC Handler + DCD _RESERVED ; ---, 12, 0x030, Reserved + DCD _RESERVED ; ---, 13, 0x034, Reserved + DCD PendSV_Handler ; -02, 14, 0x038, PendSV Handler + DCD SysTick_Handler ; -01, 15, 0x03C, SysTick Handler + + ; External Interrupt Handler + DCD LVD_BOD_IRQHandler ; 00, 16, 0x040, + DCD RTC_IRQHandler ; 01, 17, 0x044, + DCD FLASH_IRQHandler ; 02, 18, 0x048, + DCD EVWUP_IRQHandler ; 03, 19, 0x04C, + DCD EXTI0_1_IRQHandler ; 04, 20, 0x050, + DCD EXTI2_3_IRQHandler ; 05, 21, 0x054, + DCD EXTI4_15_IRQHandler ; 06, 22, 0x058, + DCD _RESERVED ; 07, 23, 0x05C, + DCD ADC_IRQHandler ; 08, 24, 0x060, + DCD _RESERVED ; 09, 25, 0x064, + DCD _RESERVED ; 10, 26, 0x068, + DCD _RESERVED ; 11, 27, 0x06C, + DCD GPTM0_IRQHandler ; 12, 28, 0x070, + DCD SCTM0_IRQHandler ; 13, 29, 0x074, + DCD SCTM1_IRQHandler ; 14, 30, 0x078, + DCD _RESERVED ; 15, 31, 0x07C, + DCD _RESERVED ; 16, 32, 0x080, + DCD BFTM0_IRQHandler ; 17, 33, 0x084, + DCD BFTM1_IRQHandler ; 18, 34, 0x088, + DCD I2C0_IRQHandler ; 19, 35, 0x08C, + DCD _RESERVED ; 20, 36, 0x090, + DCD SPI0_IRQHandler ; 21, 37, 0x094, + DCD QSPI_IRQHandler ; 22, 38, 0x098, + DCD _RESERVED ; 23, 39, 0x09C, + DCD _RESERVED ; 24, 40, 0x0A0, + DCD UART0_IRQHandler ; 25, 41, 0x0A4, + DCD _RESERVED ; 26, 42, 0x0A8, + DCD MIDI_IRQHandler ; 27, 43, 0x0AC, + DCD _RESERVED ; 28, 44, 0x0B0, + DCD _RESERVED ; 29, 45, 0x0B4, + DCD PDMA_CH0_1_IRQHandler ; 30, 46, 0x0B8, + DCD PDMA_CH2_5_IRQHandler ; 31, 47, 0x0BC, + +; Reset handler routine +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 +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP + +SVC_Handler PROC + EXPORT SVC_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_BOD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT EVWUP_IRQHandler [WEAK] + EXPORT EXTI0_1_IRQHandler [WEAK] + EXPORT EXTI2_3_IRQHandler [WEAK] + EXPORT EXTI4_15_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT GPTM0_IRQHandler [WEAK] + EXPORT SCTM0_IRQHandler [WEAK] + EXPORT SCTM1_IRQHandler [WEAK] + EXPORT BFTM0_IRQHandler [WEAK] + EXPORT BFTM1_IRQHandler [WEAK] + EXPORT I2C0_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT QSPI_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT MIDI_IRQHandler [WEAK] + EXPORT PDMA_CH0_1_IRQHandler [WEAK] + EXPORT PDMA_CH2_5_IRQHandler [WEAK] + +LVD_BOD_IRQHandler +RTC_IRQHandler +FLASH_IRQHandler +EVWUP_IRQHandler +EXTI0_1_IRQHandler +EXTI2_3_IRQHandler +EXTI4_15_IRQHandler +ADC_IRQHandler +GPTM0_IRQHandler +SCTM0_IRQHandler +SCTM1_IRQHandler +BFTM0_IRQHandler +BFTM1_IRQHandler +I2C0_IRQHandler +SPI0_IRQHandler +QSPI_IRQHandler +UART0_IRQHandler +MIDI_IRQHandler +PDMA_CH0_1_IRQHandler +PDMA_CH2_5_IRQHandler + B . + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __HT_check_heap + EXPORT __HT_check_sp + + 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 + + IF (USE_STACK_ON_TOP = 1) + LDR R0, = Heap_Mem + LDR R1, = (0x20000000 + USE_LIBCFG_RAM_SIZE) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = (Heap_Mem + Heap_Size) + BX LR + ELSE + LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDIF + + ALIGN + + ENDIF + + END diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_01.s index 13adc8cdcc3..f3f551a4c20 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -24,10 +24,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 */ .equ USE_HT32_CHIP_SET, 0 @@ -71,12 +81,15 @@ .equ _HT32FWID, 0x00000006 .equ _HT32FWID, 0x00061352 .equ _HT32FWID, 0x00032003 + .equ _HT32FWID, 0x0003200F .equ _HT32FWID, 0x00062030 .equ _HT32FWID, 0x00062040 .equ _HT32FWID, 0x00062050 + .equ _HT32FWID, 0x00062140 .equ _HT32FWID, 0x00067741 .equ _HT32FWID, 0x00067232 - .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00059045 */ .equ HT32F52220_30, 1 @@ -89,12 +102,17 @@ .equ HT32F0006, 10 .equ HT32F61352, 10 .equ HT50F32003, 4 + .equ HT50F3200U, 2 .equ HT32F62030, 1 .equ HT32F62040, 2 .equ HT32F62050, 5 + .equ HT32F62140, 2 .equ HT32F67741, 2 .equ HT32F67232, 1 .equ HT32F67233, 1 + .equ HT32F59045, 2 + .equ MXTX52231, 2 + .equ MXTX52352, 4 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_02.s index 1521f84226f..f35f677f245 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_02.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,8 +20,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 */ .equ USE_HT32_CHIP_SET, 0 @@ -49,8 +49,8 @@ .equ _HT32FWID, 0x00059041 .equ _HT32FWID, 0x000F5032 .equ _HT32FWID, 0x00061641 - .equ _HT32FWID, 0x00059046 .equ _HT32FWID, 0x00061041 + .equ _HT32FWID, 0x00061741 */ .equ HT32F50220_30, 7 @@ -59,8 +59,8 @@ .equ HT32F59041, 8 .equ HF5032, 7 .equ HT32F61641, 8 - .equ HT32F59046, 8 .equ HT32F61041, 8 + .equ HT32F61741, 8 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_05.s index 1618d4b1c0c..4bf6a4bba22 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_05.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,6 +20,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 */ .equ USE_HT32_CHIP_SET, 0 @@ -45,6 +49,8 @@ .equ _HT32FWID, 0x00005828 .equ _HT32FWID, 0x00067742 .equ _HT32FWID, 0x00059746 + .equ _HT32FWID, 0x00057541 + .equ _HT32FWID, 0x00057552 */ .equ HT32F57331_41, 13 @@ -53,6 +59,8 @@ .equ HT32F5828, 14 .equ HT32F67742, 13 .equ HT32F59746, 13 + .equ HT32F57541, 13 + .equ HT32F57552, 14 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_10.s index c2fb7bd0281..486ddf7400d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_10.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_10.s -; Version : $Rev:: 6601 $ -; Date : $Date:: 2022-12-27 #$ +; Version : $Rev:: 8101 $ +; Date : $Date:: 2024-09-04 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,6 +23,7 @@ ;// HT32 Device ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 */ .equ USE_HT32_CHIP_SET, 0 @@ -29,9 +31,11 @@ /* .equ _HT32FWID, 0x00061244 .equ _HT32FWID, 0x00061245 + .equ _HT32FWID, 0x00061242 */ .equ HT32F61244_45, 24 + .equ NW32F61242, 24 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_13.s index 649b402684f..d8e743f9c37 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_13.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -17,6 +17,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 */ .equ USE_HT32_CHIP_SET, 0 @@ -35,11 +37,13 @@ .equ _HT32FWID, 0x00050030 .equ _HT32FWID, 0x00061630 .equ _HT32FWID, 0x00061030 + .equ _HT32FWID, 0x00061730 */ .equ HT32F50020_30, 25 .equ HT32F61630, 25 .equ HT32F61030, 25 + .equ HT32F61730, 25 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_14.s index 335d485622b..a4c44a90e7e 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_14.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 */ .equ USE_HT32_CHIP_SET, 0 @@ -33,10 +35,12 @@ .equ _HT32FWID, 0x00050452 .equ _HT32FWID, 0x00050431 .equ _HT32FWID, 0x00050441 + .equ _HT32FWID, 0x00061052 */ .equ HT32F50442_52, 26 .equ HT32F50431_41, 30 + .equ HT32F61052, 26 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_16.s index 01f644a0a3b..710e4a36d26 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_16.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_16.s -; Version : $Rev:: 7094 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -138,7 +138,7 @@ __cs3_interrupt_vector_cortex_m: .long BFTM1_IRQHandler /* 17, 33, 0x084, */ .long CMP0_IRQHandler /* 18, 34, 0x088, */ .long CMP1_IRQHandler /* 19, 35, 0x08C, */ - .long PID_IRQHandler /* 20, 36, 0x090, */ + .long PID0_IRQHandler /* 20, 36, 0x090, */ .long I2C0_IRQHandler /* 21, 37, 0x094, */ .long SPI0_IRQHandler /* 22, 38, 0x098, */ .long USART0_IRQHandler /* 23, 39, 0x09C, */ @@ -243,7 +243,7 @@ Default_Handler: IRQ BFTM1_IRQHandler IRQ CMP0_IRQHandler IRQ CMP1_IRQHandler - IRQ PID_IRQHandler + IRQ PID0_IRQHandler IRQ I2C0_IRQHandler IRQ SPI0_IRQHandler IRQ USART0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_17.s index 47dac68db7d..07095a16a0f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/CodeSourcery/startup_ht32f5xxxx_cs3_17.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_cs3_17.s -; Version : $Rev:: 7030 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,7 +21,7 @@ /* ;// HT32 Device ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 */ .equ USE_HT32_CHIP_SET, 0 @@ -31,7 +31,7 @@ .equ _HT32FWID, 0x00052244 */ - .equ HT32F52234_44, 33 + .equ HT32F52234_44, 35 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s index 6ef935fb93a..7dcf6183025 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -24,10 +24,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 */ .equ USE_HT32_CHIP_SET, 0 @@ -71,12 +81,15 @@ .equ _HT32FWID, 0x00000006 .equ _HT32FWID, 0x00061352 .equ _HT32FWID, 0x00032003 + .equ _HT32FWID, 0x0003200F .equ _HT32FWID, 0x00062030 .equ _HT32FWID, 0x00062040 .equ _HT32FWID, 0x00062050 + .equ _HT32FWID, 0x00062140 .equ _HT32FWID, 0x00067741 .equ _HT32FWID, 0x00067232 - .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00059045 */ .equ HT32F52220_30, 1 @@ -89,12 +102,17 @@ .equ HT32F0006, 10 .equ HT32F61352, 10 .equ HT50F32003, 4 + .equ HT50F3200U, 2 .equ HT32F62030, 1 .equ HT32F62040, 2 .equ HT32F62050, 5 + .equ HT32F62140, 2 .equ HT32F67741, 2 .equ HT32F67232, 1 .equ HT32F67233, 1 + .equ HT32F59045, 2 + .equ MXTX52231, 2 + .equ MXTX52352, 4 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_02.s index 784c9cef994..b215d283acb 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_02.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,8 +20,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 */ .equ USE_HT32_CHIP_SET, 0 @@ -49,8 +49,8 @@ .equ _HT32FWID, 0x00059041 .equ _HT32FWID, 0x000F5032 .equ _HT32FWID, 0x00061641 - .equ _HT32FWID, 0x00059046 .equ _HT32FWID, 0x00061041 + .equ _HT32FWID, 0x00061741 */ .equ HT32F50220_30, 7 @@ -59,8 +59,8 @@ .equ HT32F59041, 8 .equ HF5032, 7 .equ HT32F61641, 8 - .equ HT32F59046, 8 .equ HT32F61041, 8 + .equ HT32F61741, 8 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_05.s index 5aba9e9f485..1ae17988634 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_05.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,6 +20,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 */ .equ USE_HT32_CHIP_SET, 0 @@ -45,6 +49,8 @@ .equ _HT32FWID, 0x00005828 .equ _HT32FWID, 0x00067742 .equ _HT32FWID, 0x00059746 + .equ _HT32FWID, 0x00057541 + .equ _HT32FWID, 0x00057552 */ .equ HT32F57331_41, 13 @@ -53,6 +59,8 @@ .equ HT32F5828, 14 .equ HT32F67742, 13 .equ HT32F59746, 13 + .equ HT32F57541, 13 + .equ HT32F57552, 14 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_10.s index d6688b44417..ab52e8f7b08 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_10.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_10.s -; Version : $Rev:: 6601 $ -; Date : $Date:: 2022-12-27 #$ +; Version : $Rev:: 8101 $ +; Date : $Date:: 2024-09-04 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,6 +23,7 @@ ;// HT32 Device ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 */ .equ USE_HT32_CHIP_SET, 0 @@ -29,9 +31,11 @@ /* .equ _HT32FWID, 0x00061244 .equ _HT32FWID, 0x00061245 + .equ _HT32FWID, 0x00061242 */ .equ HT32F61244_45, 24 + .equ NW32F61242, 24 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_13.s index 1d5b8a33b1e..869e7f35375 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_13.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -17,6 +17,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 */ .equ USE_HT32_CHIP_SET, 0 @@ -35,11 +37,13 @@ .equ _HT32FWID, 0x00050030 .equ _HT32FWID, 0x00061630 .equ _HT32FWID, 0x00061030 + .equ _HT32FWID, 0x00061730 */ .equ HT32F50020_30, 25 .equ HT32F61630, 25 .equ HT32F61030, 25 + .equ HT32F61730, 25 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_14.s index 9a02b727d93..43ed5712663 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_14.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_14.s -; Version : $Rev:: 6838 $ -; Date : $Date:: 2023-04-06 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 */ .equ USE_HT32_CHIP_SET, 0 @@ -33,10 +35,12 @@ .equ _HT32FWID, 0x00050452 .equ _HT32FWID, 0x00050431 .equ _HT32FWID, 0x00050441 + .equ _HT32FWID, 0x00061052 */ .equ HT32F50442_52, 26 .equ HT32F50431_41, 30 + .equ HT32F61052, 26 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_16.s index 8cb1f85b48b..12f0e3127f2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_16.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_16.s -; Version : $Rev:: 7094 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -162,7 +162,7 @@ __interrupt_vector_cortex_m: .long BFTM1_IRQHandler /* 17, 33, 0x084, */ .long CMP0_IRQHandler /* 18, 34, 0x088, */ .long CMP1_IRQHandler /* 19, 35, 0x08C, */ - .long PID_IRQHandler /* 20, 36, 0x090, */ + .long PID0_IRQHandler /* 20, 36, 0x090, */ .long I2C0_IRQHandler /* 21, 37, 0x094, */ .long SPI0_IRQHandler /* 22, 38, 0x098, */ .long USART0_IRQHandler /* 23, 39, 0x09C, */ @@ -301,7 +301,7 @@ Default_Handler: IRQ BFTM1_IRQHandler IRQ CMP0_IRQHandler IRQ CMP1_IRQHandler - IRQ PID_IRQHandler + IRQ PID0_IRQHandler IRQ I2C0_IRQHandler IRQ SPI0_IRQHandler IRQ USART0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_17.s index f19b45b36f8..2f8ef4ead27 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/GCC/startup_ht32f5xxxx_gcc_17.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_gcc_17.s -; Version : $Rev:: 7030 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,7 +21,7 @@ /* ;// HT32 Device ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 */ .equ USE_HT32_CHIP_SET, 0 @@ -31,7 +31,7 @@ .equ _HT32FWID, 0x00052244 */ - .equ HT32F52234_44, 33 + .equ HT32F52234_44, 35 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s index 1fc4bed7a63..e1179462c6d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_01.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -23,10 +23,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -42,12 +47,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -67,12 +77,15 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00000006 ;_HT32FWID EQU 0x00061352 ;_HT32FWID EQU 0x00032003 +;_HT32FWID EQU 0x0003200F ;_HT32FWID EQU 0x00062030 ;_HT32FWID EQU 0x00062040 ;_HT32FWID EQU 0x00062050 +;_HT32FWID EQU 0x00062140 ;_HT32FWID EQU 0x00067741 ;_HT32FWID EQU 0x00067232 ;_HT32FWID EQU 0x00067233 +;_HT32FWID EQU 0x00059045 HT32F52220_30 EQU 1 HT32F52231_41 EQU 2 @@ -84,12 +97,17 @@ HT32F52344_54 EQU 9 HT32F0006 EQU 10 HT32F61352 EQU 10 HT50F32003 EQU 4 +HT50F3200U EQU 2 HT32F62030 EQU 1 HT32F62040 EQU 2 HT32F62050 EQU 5 +HT32F62140 EQU 2 HT32F67741 EQU 2 HT32F67232 EQU 1 HT32F67233 EQU 1 +HT32F59045 EQU 2 +MXTX52231 EQU 2 +MXTX52352 EQU 4 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_02.s index 90e00906880..daf124989c0 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_02.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,8 +19,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,8 +32,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -45,8 +45,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00059041 ;_HT32FWID EQU 0x000F5032 ;_HT32FWID EQU 0x00061641 -;_HT32FWID EQU 0x00059046 ;_HT32FWID EQU 0x00061041 +;_HT32FWID EQU 0x00061741 HT32F50220_30 EQU 7 HT32F50231_41 EQU 8 @@ -54,8 +54,8 @@ HT50F32002 EQU 7 HT32F59041 EQU 8 HF5032 EQU 7 HT32F61641 EQU 8 -HT32F59046 EQU 8 HT32F61041 EQU 8 +HT32F61741 EQU 8 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_05.s index 2d5a99264b3..bba37d7b673 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_05.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,6 +19,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -30,6 +32,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -41,6 +45,8 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00005828 ;_HT32FWID EQU 0x00067742 ;_HT32FWID EQU 0x00059746 +;_HT32FWID EQU 0x00057541 +;_HT32FWID EQU 0x00057552 HT32F57331_41 EQU 13 HT32F57342_52 EQU 14 @@ -48,6 +54,8 @@ HT32F59741 EQU 13 HT32F5828 EQU 14 HT32F67742 EQU 13 HT32F59746 EQU 13 +HT32F57541 EQU 13 +HT32F57552 EQU 14 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_10.s index a8289bc68eb..e930ae96a2b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_10.s @@ -6,27 +6,31 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_10.s -; Version : $Rev:: 5780 $ -; Date : $Date:: 2022-03-28 #$ +; Version : $Rev:: 8101 $ +; Date : $Date:: 2024-09-04 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 ;/* <<< Use Configuration Wizard in Context Menu >>> */ ;// HT32 Device ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00061244 ;_HT32FWID EQU 0x00061245 +;_HT32FWID EQU 0x00061242 HT32F61244_45 EQU 24 +HT32F61242 EQU 24 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_13.s index b573c7b115f..45ca9e15d02 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_13.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -31,10 +33,12 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050030 ;_HT32FWID EQU 0x00061630 ;_HT32FWID EQU 0x00061030 +;_HT32FWID EQU 0x00061730 HT32F50020_30 EQU 25 HT32F61630 EQU 25 HT32F61030 EQU 25 +HT32F61730 EQU 25 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_14.s index ffd489d97ab..2f7dbec0682 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_14.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_14.s -; Version : $Rev:: 6834 $ -; Date : $Date:: 2023-03-31 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,6 +23,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF @@ -29,9 +31,11 @@ _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00050452 ;_HT32FWID EQU 0x00050431 ;_HT32FWID EQU 0x00050441 +;_HT32FWID EQU 0x00061052 HT32F50442_52 EQU 26 HT32F50431_41 EQU 30 +HT32F61052 EQU 26 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_16.s index 753e6eb1659..6d6fa80b87a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_16.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_16.s -; Version : $Rev:: 7212 $ -; Date : $Date:: 2023-09-11 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -105,7 +105,7 @@ __vector_table DCD BFTM1_IRQHandler ; 17, 33, 0x084, DCD CMP0_IRQHandler ; 18, 34, 0x088, DCD CMP1_IRQHandler ; 19, 35, 0x08C, - DCD PID_IRQHandler ; 20, 36, 0x090, + DCD PID0_IRQHandler ; 20, 36, 0x090, DCD I2C0_IRQHandler ; 21, 37, 0x094, DCD SPI0_IRQHandler ; 22, 38, 0x098, DCD USART0_IRQHandler ; 23, 39, 0x09C, @@ -174,7 +174,7 @@ SysTick_Handler PUBWEAK BFTM1_IRQHandler PUBWEAK CMP0_IRQHandler PUBWEAK CMP1_IRQHandler - PUBWEAK PID_IRQHandler + PUBWEAK PID0_IRQHandler PUBWEAK I2C0_IRQHandler PUBWEAK SPI0_IRQHandler PUBWEAK USART0_IRQHandler @@ -207,7 +207,7 @@ BFTM0_IRQHandler BFTM1_IRQHandler CMP0_IRQHandler CMP1_IRQHandler -PID_IRQHandler +PID0_IRQHandler I2C0_IRQHandler SPI0_IRQHandler USART0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_17.s index bfabd93ba90..9db666fddeb 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/IAR/startup_ht32f5xxxx_iar_17.s @@ -6,8 +6,8 @@ ;/* */ ;/*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_iar_17.s -; Version : $Rev:: 7212 $ -; Date : $Date:: 2023-09-11 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -19,14 +19,14 @@ ;// HT32 Device ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 USE_HT32_CHIP_SET EQU 0 _HT32FWID EQU 0xFFFFFFFF ;_HT32FWID EQU 0x00052234 ;_HT32FWID EQU 0x00052244 -HT32F52234_44 EQU 33 +HT32F52234_44 EQU 35 IF USE_HT32_CHIP_SET=0 ELSE diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_01.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_01.s index a667619b58b..a2805097bdd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_01.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_01.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_01.s -; Version : $Rev:: 6953 $ -; Date : $Date:: 2023-05-30 #$ +; Version : $Rev:: 7848 $ +; Date : $Date:: 2024-07-16 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -24,10 +24,15 @@ ; HT32F0006 ; HT32F61352 ; HT50F32003 +; HT50F3200U ; HT32F62030, HT32F62040, HT32F62050 +; HT32F62140 ; HT32F67741 ; HT32F67232 ; HT32F67233 +; HT32F59045 +; MXTX52231 +; MXTX52352 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -44,12 +49,17 @@ ;// <10=> HT32F0006 ;// <10=> HT32F61352 ;// <4=> HT50F32003 +;// <2=> HT50F3200U ;// <2=> HT32F67741 ;// <1=> HT32F67232 ;// <1=> HT32F67233 ;// <1=> HT32F62030 ;// <2=> HT32F62040 ;// <5=> HT32F62050 +;// <2=> HT32F62140 +;// <2=> HT32F59045 +;// <2=> MXTX52231 +;// <4=> MXTX52352 */ .equ USE_HT32_CHIP_SET, 0 @@ -71,12 +81,15 @@ .equ _HT32FWID, 0x00000006 .equ _HT32FWID, 0x00061352 .equ _HT32FWID, 0x00032003 + .equ _HT32FWID, 0x0003200F .equ _HT32FWID, 0x00062030 .equ _HT32FWID, 0x00062040 .equ _HT32FWID, 0x00062050 + .equ _HT32FWID, 0x00062140 .equ _HT32FWID, 0x00067741 .equ _HT32FWID, 0x00067232 - .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00067233 + .equ _HT32FWID, 0x00059045 */ .equ HT32F52220_30, 1 @@ -89,12 +102,17 @@ .equ HT32F0006, 10 .equ HT32F61352, 10 .equ HT50F32003, 4 + .equ HT50F3200U, 2 .equ HT32F62030, 1 .equ HT32F62040, 2 .equ HT32F62050, 5 + .equ HT32F62140, 2 .equ HT32F67741, 2 .equ HT32F67232, 1 .equ HT32F67233, 1 + .equ HT32F59045, 2 + .equ MXTX52231, 2 + .equ MXTX52352, 4 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_02.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_02.s index 5b5110f922e..5615abd1636 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_02.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_02.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_02.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,8 +20,8 @@ ; HT32F59041 ; HF5032 ; HT32F61641 -; HT32F59046 ; HT32F61041 +; HT32F61741 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -34,8 +34,8 @@ ;// <8=> HT32F59041 ;// <7=> HF5032 ;// <8=> HT32F61641 -;// <8=> HT32F59046 ;// <8=> HT32F61041 +;// <8=> HT32F61741 */ .equ USE_HT32_CHIP_SET, 0 @@ -49,8 +49,8 @@ .equ _HT32FWID, 0x00059041 .equ _HT32FWID, 0x000F5032 .equ _HT32FWID, 0x00061641 - .equ _HT32FWID, 0x00059046 .equ _HT32FWID, 0x00061041 + .equ _HT32FWID, 0x00061741 */ .equ HT32F50220_30, 7 @@ -59,8 +59,8 @@ .equ HT32F59041, 8 .equ HF5032, 7 .equ HT32F61641, 8 - .equ HT32F59046, 8 .equ HT32F61041, 8 + .equ HT32F61741, 8 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_05.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_05.s index 25447b9b1f8..20f3a2be81d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_05.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_05.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_05.s -; Version : $Rev:: 6993 $ -; Date : $Date:: 2023-06-26 #$ +; Version : $Rev:: 7935 $ +; Date : $Date:: 2024-08-08 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -20,6 +20,8 @@ ; HT32F5828 ; HT32F67742 ; HT32F59746 +; HT32F57541 +; HT32F57552 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -32,6 +34,8 @@ ;// <14=> HT32F5828 ;// <13=> HT32F67742 ;// <13=> HT32F59746 +;// <13=> HT32F57541 +;// <14=> HT32F57552 */ .equ USE_HT32_CHIP_SET, 0 @@ -45,6 +49,8 @@ .equ _HT32FWID, 0x00005828 .equ _HT32FWID, 0x00067742 .equ _HT32FWID, 0x00059746 + .equ _HT32FWID, 0x00057541 + .equ _HT32FWID, 0x00057552 */ .equ HT32F57331_41, 13 @@ -53,6 +59,8 @@ .equ HT32F5828, 14 .equ HT32F67742, 13 .equ HT32F59746, 13 + .equ HT32F57541, 13 + .equ HT32F57552, 14 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_10.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_10.s index d9253dcbca5..7d45a714532 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_10.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_10.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_10.s -; Version : $Rev:: 6601 $ -; Date : $Date:: 2022-12-27 #$ +; Version : $Rev:: 8101 $ +; Date : $Date:: 2024-09-04 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -15,6 +15,7 @@ ; Supported Device ; ======================================== ; HT32F61244, HT32F61245 +; NW32F61242 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -22,6 +23,7 @@ ;// HT32 Device ;// <0=> By Project Asm Define ;// <24=> HT32F61244/45 +;// <24=> NW32F61242 */ .equ USE_HT32_CHIP_SET, 0 @@ -29,9 +31,11 @@ /* .equ _HT32FWID, 0x00061244 .equ _HT32FWID, 0x00061245 + .equ _HT32FWID, 0x00061242 */ .equ HT32F61244_45, 24 + .equ NW32F61242, 24 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_13.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_13.s index 8c3a524ef12..68cc2d3ce4a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_13.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_13.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_13.s -; Version : $Rev:: 7119 $ -; Date : $Date:: 2023-08-15 #$ +; Version : $Rev:: 7704 $ +; Date : $Date:: 2024-05-10 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -17,6 +17,7 @@ ; HT32F50020, HT32F50030 ; HT32F61630 ; HT32F61030 +; HT32F61730 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -26,6 +27,7 @@ ;// <25=> HT32F50020/30 ;// <25=> HT32F61630 ;// <25=> HT32F61030 +;// <25=> HT32F61730 */ .equ USE_HT32_CHIP_SET, 0 @@ -35,11 +37,13 @@ .equ _HT32FWID, 0x00050030 .equ _HT32FWID, 0x00061630 .equ _HT32FWID, 0x00061030 + .equ _HT32FWID, 0x00061730 */ .equ HT32F50020_30, 25 .equ HT32F61630, 25 .equ HT32F61030, 25 + .equ HT32F61730, 25 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_14.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_14.s index 530eb0949ff..a55ad72c139 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_14.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_14.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_14.s -; Version : $Rev:: 6793 $ -; Date : $Date:: 2023-03-14 #$ +; Version : $Rev:: 8287 $ +; Date : $Date:: 2024-11-27 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -16,6 +16,7 @@ ; ======================================== ; HT32F50442, HT32F50452 ; HT32F50431, HT32F50441 +; HT32F61052 */ ;/* <<< Use Configuration Wizard in Context Menu >>> */ @@ -24,6 +25,7 @@ ;// <0=> By Project Asm Define ;// <26=> HT32F50442/52 ;// <30=> HT32F50431/41 +;// <26=> HT32F61052 */ .equ USE_HT32_CHIP_SET, 0 @@ -33,10 +35,12 @@ .equ _HT32FWID, 0x00050452 .equ _HT32FWID, 0x00050431 .equ _HT32FWID, 0x00050441 + .equ _HT32FWID, 0x00061052 */ .equ HT32F50442_52, 26 .equ HT32F50431_41, 30 + .equ.HT32F61052, 26 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_16.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_16.s index 81260f6c782..da44c1d66a5 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_16.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_16.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_16.s -; Version : $Rev:: 7094 $ -; Date : $Date:: 2023-08-02 #$ +; Version : $Rev:: 8260 $ +; Date : $Date:: 2024-11-05 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -108,7 +108,7 @@ _vectors: .long BFTM1_IRQHandler /* 17, 33, 0x084, */ .long CMP0_IRQHandler /* 18, 34, 0x088, */ .long CMP1_IRQHandler /* 19, 35, 0x08C, */ - .long PID_IRQHandler /* 20, 36, 0x090, */ + .long PID0_IRQHandler /* 20, 36, 0x090, */ .long I2C0_IRQHandler /* 21, 37, 0x094, */ .long SPI0_IRQHandler /* 22, 38, 0x098, */ .long USART0_IRQHandler /* 23, 39, 0x09C, */ @@ -205,7 +205,7 @@ Default_Handler: IRQ BFTM1_IRQHandler IRQ CMP0_IRQHandler IRQ CMP1_IRQHandler - IRQ PID_IRQHandler + IRQ PID0_IRQHandler IRQ I2C0_IRQHandler IRQ SPI0_IRQHandler IRQ USART0_IRQHandler diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_17.s b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_17.s index d5be1f4cd53..91206a4f1ff 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_17.s +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/emStudio/startup_ht32f5xxxx_es_17.s @@ -6,8 +6,8 @@ /* */ /*----------------------------------------------------------------------------------------------------------- ; File Name : startup_ht32f5xxxx_es_17.s -; Version : $Rev:: 7030 $ -; Date : $Date:: 2023-07-18 #$ +; Version : $Rev:: 7718 $ +; Date : $Date:: 2024-05-13 #$ ; Description : Startup code. ;-----------------------------------------------------------------------------------------------------------*/ @@ -21,7 +21,7 @@ /* ;// HT32 Device ;// <0=> By Project Asm Define -;// <33=> HT32F52234/44 +;// <35=> HT32F52234/44 */ .equ USE_HT32_CHIP_SET, 0 @@ -31,7 +31,7 @@ .equ _HT32FWID, 0x00052244 */ - .equ HT32F52234_44, 33 + .equ HT32F52234_44, 35 .if USE_HT32_CHIP_SET == 0 .else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c index e6f4c361e5d..fa205a5a625 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_01.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6597 $ - * @date $Date:: 2022-12-27 #$ + * @version $Rev:: 7848 $ + * @date $Date:: 2024-07-16 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -30,6 +30,7 @@ // HT32F52342, HT32F52352 // HT32F52243, HT32F52253 // HT50F32003 +// MXTX52352 //#define USE_HT32F52220_30 //#define USE_HT32F52231_41 @@ -37,6 +38,7 @@ //#define USE_HT32F52342_52 //#define USE_HT32F52243_53 //#define USE_HT50F32003 +//#define USE_MXTX52352 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c index f8647355441..5c14d07f8e6 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_02.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6953 $ - * @date $Date:: 2023-05-30 #$ + * @version $Rev:: 7848 $ + * @date $Date:: 2024-07-16 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -30,8 +30,12 @@ // HT32F52342, HT32F52352 // HT32F52243, HT32F52253 // HT32F62030, HT32F62040, HT32F62050 +// HT32F62140, // HT32F67232, HT32F67233 // HT32F67741, +// HT50F3200U +// HT32F59045 +// MXTX52231 //#define USE_HT32F52220_30 //#define USE_HT32F52231_41 @@ -41,9 +45,13 @@ //#define USE_HT32F62030 //#define USE_HT32F62040 //#define USE_HT32F62050 +//#define USE_HT32F62140 //#define USE_HT32F67232 //#define USE_HT32F67233 //#define USE_HT32F67741 +//#define USE_HT50F3200U +//#define USE_HT32F59045 +//#define USE_MXTX52231 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c index b709d27c6f7..18d8b71531a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_04.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 7119 $ - * @date $Date:: 2023-08-15 #$ + * @version $Rev:: 7704 $ + * @date $Date:: 2024-05-10 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -30,8 +30,8 @@ // HT32F59041 // HF5032 // HT32F61641 -// HT32F59046 // HT32F61041 +// HT32F61741 //#define USE_HT32F50220_30 //#define USE_HT32F50231_41 @@ -39,8 +39,8 @@ //#define USE_HT32F59041 //#define USE_HF5032 //#define USE_HT32F61641 -//#define USE_HT32F59046 //#define USE_HT32F61041 +//#define USE_HT32F61741 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c index e0460f199e0..f17e3637b37 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_05.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6993 $ - * @date $Date:: 2023-06-26 #$ + * @version $Rev:: 7935 $ + * @date $Date:: 2024-08-08 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -30,6 +30,8 @@ // HT32F5828 // HT32F67742 // HT32F59746 +// HT32F57541 +// HT32F57552 //#define USE_HT32F57331_41 //#define USE_HT32F57342_52 @@ -37,6 +39,8 @@ //#define USE_HT32F5828 //#define USE_HT32F67742 //#define USE_HT32F59746 +//#define USE_HT32F57541 +//#define USE_HT32F57552 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c index 704ebb5730f..60bc450dfdd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_10.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6597 $ - * @date $Date:: 2022-12-27 #$ + * @version $Rev:: 8101 $ + * @date $Date:: 2024-09-04 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -25,8 +25,10 @@ // Supported Device // ======================================== // HT32F61244, HT32F61245 +// NW32F61242 //#define USE_HT32F61244_45 +//#define USE_NW32F61242 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c index c906eb16400..f4a0e62ce5e 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_13.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 7119 $ - * @date $Date:: 2023-08-15 #$ + * @version $Rev:: 7704 $ + * @date $Date:: 2024-05-10 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -27,10 +27,12 @@ // HT32F50020, HT32F50030 // HT32F61630 // HT32F61030 +// HT32F61730 //#define USE_HT32F50020_30 //#define USE_HT32F61630 //#define USE_HT32F61030 +//#define USE_HT32F61730 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c index 2dc4216f4b5..0cba0c6c51d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_14.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 6790 $ - * @date $Date:: 2023-03-13 #$ + * @version $Rev:: 8287 $ + * @date $Date:: 2024-11-27 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -26,9 +26,11 @@ // ======================================== // HT32F50442, HT32F50452 // HT32F50431, HT32F50441 +// HT32F61052 //#define USE_HT32F50442_52 //#define USE_HT32F50431_41 +//#define USE_HT32F61052 /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c index ba5073e76f2..ef0dd2ec67f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c @@ -2,8 +2,8 @@ * @file library/Device/Holtek/HT32F5xxxx/Source/system_ht32f5xxxx_18.c * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer Source File * for the Holtek HT32F5xxxx Device Series - * @version $Rev:: 7413 $ - * @date $Date:: 2023-12-15 #$ + * @version $Rev:: 7610 $ + * @date $Date:: 2024-02-27 #$ * * @note * Copyright (C) Holtek Semiconductor Inc. All rights reserved. @@ -24,19 +24,10 @@ // Supported Device // ======================================== -// HT32F0008 -// HT32F52142 -// HT32F52344, HT32F52354 -// HT32F52357, HT32F52367 -// HT32F65230, HT32F65240 -// HT50F3200T - -//#define USE_HT32F0008 -//#define USE_HT32F52142 -//#define USE_HT32F52344_54 +// BM18B367A + + //#define USE_HT32F52357_67 -//#define USE_HT32F65230_40 -//#define USE_HT50F3200T /** @addtogroup CMSIS * @{ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_can_config0_calc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_can_config0_calc.h new file mode 100644 index 00000000000..6ff016f06cd --- /dev/null +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_can_config0_calc.h @@ -0,0 +1,385 @@ +/*********************************************************************************************************//** + * @file ht32_can_config0_calc.h + * @version $Rev:: 8147 $ + * @date $Date:: 2024-09-16 #$ + * @brief The CAN config calculation features. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32_CAN_CONFIG0_CALC_H +#define __HT32_CAN_CONFIG0_CALC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Settings ------------------------------------------------------------------------------------------------*/ +#define CAN_CF0_CALC_DEBUG (0) + +/*----------------------------------------------------------------------------------------------------------*/ +/* CAN Parameter Calculation */ +/* !!! DO NOT MODIFY !!! */ +/*----------------------------------------------------------------------------------------------------------*/ +#if (HTCFG_CAN_CORECLKSEL == 0) + #define _HTCFG_CAN_CORE_CLK (LIBCFG_MAX_SPEED) +#else + #define _HTCFG_CAN_CORE_CLK (HTCFG_CAN_CORECLK_MANUAL) +#endif + +#define _HTCFG_CF0_CK_CAN (_HTCFG_CAN_CORE_CLK / (1 << HTCFG_CAN_CF0_CLK_DIV)) + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (25UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 25 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (24UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 24 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (23UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 23 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (22UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 22 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (21UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 21 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (20UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 20 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (19UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 19 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (18UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 18 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (17UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 17 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (16UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 16 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (15UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 15 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (14UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 14 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (13UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 13 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (12UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 12 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (11UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 11 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (10UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 10 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (9UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 9 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #undef _TMP_CF0_NBT + #define _TMP_CF0_NBT (8UL) + #if (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT > 0) + #if ((_HTCFG_CF0_CK_CAN / (_HTCFG_CF0_CK_CAN / HTCFG_CAN_CF0_BAUDRATE / _TMP_CF0_NBT)) / _TMP_CF0_NBT <= HTCFG_CAN_CF0_BAUDRATE) + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME _TMP_CF0_NBT + #if (CAN_CF0_CALC_DEBUG == 1) + #warning Set HTCFG_CAN_CF0_NOMINAL_BIT_TIME as 8 + #endif + #endif + #endif +#endif + +#ifndef HTCFG_CAN_CF0_NOMINAL_BIT_TIME + #error Can't find the suitable Nominal Bit Time setting. Try to increase CK_CAN or lower the CAN Baudrate. +#endif + +/* define value for CAN_Init() */ +#define CAN_CONF0_PRESCALER (_HTCFG_CF0_CK_CAN / (HTCFG_CAN_CF0_BAUDRATE * HTCFG_CAN_CF0_NOMINAL_BIT_TIME)) +#define CAN_CONF0_BIT_TIME_TSEG1 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME - (HTCFG_CAN_CF0_NOMINAL_BIT_TIME * HTCFG_CAN_CF0_SAMPLE_POINT) / 100) +#define CAN_CONF0_BIT_TIME_TSEG0 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME - 1 - CAN_CONF0_BIT_TIME_TSEG1) +#define CAN_CONF0_BIT_TIME_SJW (HTCFG_CAN_CF0_BIT_TIME_SJW) + +/*----------------------------------------------------------------------------------------------------------*/ +/* CAN Parameter Checking */ +/* !!! DO NOT MODIFY !!! */ +/*----------------------------------------------------------------------------------------------------------*/ +#if (CAN_CONF0_PRESCALER < 1) + #error CAN Config 0 "Prescaler" value out of spec (must >= 1)! Try to lower the Nominal Bit Time or CAN Baudrate. +#endif + +#if (CAN_CONF0_PRESCALER > 1024) + #error CAN Config 0 "Prescaler" value out of spec (must <= 1024)! +#endif + +#if (CAN_CONF0_BIT_TIME_TSEG0 > 16) + #error CAN Config 0 "TSEG0" value out of spec (must <= 16)! +#endif + +#if (CAN_CONF0_BIT_TIME_TSEG1 > 8) + #if (HTCFG_CAN_CF0_NOMINAL_BIT_TIME < 16) + #error CAN Config 0 "TSEG1" value out of spec (must <= 8)! May try to larger the Sample Point. + #else + + // Reduce HTCFG_CAN_CF0_NOMINAL_BIT_TIME and try again + #undef CAN_CONF0_PRESCALER + #undef CAN_CONF0_BIT_TIME_TSEG1 + #undef CAN_CONF0_BIT_TIME_TSEG0 + #define HTCFG_CAN_CF0_NOMINAL_BIT_TIME2 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME/2) + #define CAN_CONF0_PRESCALER (_HTCFG_CF0_CK_CAN / (HTCFG_CAN_CF0_BAUDRATE * HTCFG_CAN_CF0_NOMINAL_BIT_TIME2)) + #define CAN_CONF0_BIT_TIME_TSEG1 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME2 - (HTCFG_CAN_CF0_NOMINAL_BIT_TIME2 * HTCFG_CAN_CF0_SAMPLE_POINT) / 100) + #define CAN_CONF0_BIT_TIME_TSEG0 (HTCFG_CAN_CF0_NOMINAL_BIT_TIME2 - 1 - CAN_CONF0_BIT_TIME_TSEG1) + + #if (CAN_CONF0_BIT_TIME_TSEG1 > 8) + #error CAN Config 0 "TSEG1" value out of spec (must <= 8)! May try to lager the Sample Point. + #endif + + #endif +#endif + +#if (CAN_CONF0_BIT_TIME_TSEG1 > 4) + #define CAN_CONF0_BIT_TIME_SJW_MAX (4) +#else + #define CAN_CONF0_BIT_TIME_SJW_MAX CAN_CONF0_BIT_TIME_TSEG1 +#endif + +#if (HTCFG_CAN_CF0_BIT_TIME_SJW > CAN_CONF0_BIT_TIME_SJW_MAX) + #error CAN Config 0 "SJW" value out of spec (must <= 4 and TSEG1)! +#endif + +/*----------------------------------------------------------------------------------------------------------*/ +/* CAN Config Check function */ +/*----------------------------------------------------------------------------------------------------------*/ +#if (HTCFG_CAN_CONF_CHECK_ENABLE == 1) +__STATIC_INLINE void CAN_Config0_Check(void) +{ + u32 Core_Clock = _HTCFG_CAN_CORE_CLK; + u32 IPPrescaler = (1 << HTCFG_CAN_CF0_CLK_DIV); + u32 CK_CAN = Core_Clock / IPPrescaler; + u32 BRP = CAN_CONF0_PRESCALER; + u32 ftq = CK_CAN / BRP; + u32 TSEG0 = CAN_CONF0_BIT_TIME_TSEG0; + u32 TSEG1 = CAN_CONF0_BIT_TIME_TSEG1; + u32 NBT = (1 + TSEG0 + TSEG1); + u32 SamplePoint = ((NBT - TSEG1) * 100) / NBT; + u32 Baudrate = ftq / (1 + TSEG0 + TSEG1) ; + + RETARGET_Configuration(); + + printf("HT32 CAN Config 0 Check\r\n"); + printf("---------------------------------------------\r\n"); + printf(" Core Clock (CK_AHB, Hz) = %d\r\n", Core_Clock); + printf(" CAN IP Prescaler = %d\r\n", IPPrescaler); + printf(" CAN IP Clock (CK_CAN, Hz) = %d\r\n", CK_CAN); + printf(" CAN Prescaler (BRP) = %d\r\n", BRP); + printf(" 1 / time quantum (1/tq, Hz) = %d\r\n", ftq); + printf(" Prop_Seg + Phase_Seg0 = %d\r\n", TSEG0); + printf(" Phase_Seg1 = %d\r\n", TSEG1); + printf(" Nominal Bit Time(NBT, calc) = %d tq\r\n", HTCFG_CAN_CF0_NOMINAL_BIT_TIME); + printf(" Nominal Bit Time(NBT, real) = %d tq\r\n", NBT); + printf(" Sample Point (setting) = %d %%\r\n", HTCFG_CAN_CF0_SAMPLE_POINT); + printf(" Sample Point (real) = %d %%\r\n", SamplePoint); + printf(" CAN BAUDRATE (setting, Hz) = %d\r\n", HTCFG_CAN_CF0_BAUDRATE); + printf(" CAN BAUDRATE (real, Hz) = %d\r\n", Baudrate); + printf("\r\n"); + printf("Please check the above setting is as expected....\r\n\r\n"); +} +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h index 8919d357bc9..5edace51cbf 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_cm0plus_misc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_cm0plus_misc.h - * @version $Rev:: 750 $ - * @date $Date:: 2016-05-31 #$ + * @version $Rev:: 7802 $ + * @date $Date:: 2024-07-01 #$ * @brief All the function prototypes for the miscellaneous firmware library. ************************************************************************************************************* * @attention @@ -112,6 +112,11 @@ void SYSTICK_CounterCmd(u32 SysTick_Counter); void SYSTICK_IntConfig(ControlStatus NewState); void SYSTICK_SetReloadValue(u32 SysTick_Reload); u32 RBIT(u32 in); +#if (HTCFG_STACK_USAGE_ANALYSIS == 1) +void StackUsageAnalysisInit(u32 addr); +#else +#define StackUsageAnalysisInit(...) +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_config.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_config.h index bd4e5612472..3ff43db6d62 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_config.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_config.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_config.h - * @version $Rev:: 7125 $ - * @date $Date:: 2023-08-16 #$ + * @version $Rev:: 8288 $ + * @date $Date:: 2024-11-27 #$ * @brief Configuration file of HT32. ************************************************************************************************************* * @attention @@ -200,6 +200,16 @@ #define USE_MEM_HT32F52367 #endif +#ifdef USE_HT50F3200U_SK + #define USE_HT32F62140_SK +#endif +#ifdef USE_HT50F3200U + #define USE_HT32F62140 +#endif +#ifdef USE_MEM_HT50F3200U + #define USE_MEM_HT32F62140 +#endif + #ifdef USE_HT32F62030_SK #define USE_HT32F52230_SK #endif @@ -220,6 +230,16 @@ #define USE_MEM_HT32F52241 #endif +#ifdef USE_HT32F62140_SK + #define USE_HT32F52241_SK +#endif +#ifdef USE_HT32F62140 + #define USE_HT32F52231_41 +#endif +#ifdef USE_MEM_HT32F62140 + #define USE_MEM_HT32F52241 +#endif + #ifdef USE_HT32F62050_SK #define USE_HT32F52253_SK #endif @@ -260,14 +280,14 @@ #define USE_MEM_HT32F57341 #endif -#ifdef USE_HT32F59046_SK - #define USE_HT32F50241_SK +#ifdef USE_HT32F59045_SK + #define USE_HT32F52241_SK #endif -#ifdef USE_HT32F59046 - #define USE_HT32F50231_41 +#ifdef USE_HT32F59045 + #define USE_HT32F52231_41 #endif -#ifdef USE_MEM_HT32F59046 - #define USE_MEM_HT32F50241 +#ifdef USE_MEM_HT32F59045 + #define USE_MEM_HT32F52241 #endif #ifdef USE_HT32F59746_SK @@ -300,6 +320,66 @@ #define USE_MEM_HT32F50241 #endif +#ifdef USE_HT32F61730_SK + #define USE_HT32F50030_SK +#endif +#ifdef USE_HT32F61730 + #define USE_HT32F50020_30 +#endif +#ifdef USE_MEM_HT32F61730 + #define USE_MEM_HT32F50030 +#endif + +#ifdef USE_HT32F61741_SK + #define USE_HT32F50241_SK +#endif +#ifdef USE_HT32F61741 + #define USE_HT32F50231_41 +#endif +#ifdef USE_MEM_HT32F61741 + #define USE_MEM_HT32F50241 +#endif + +#ifdef USE_MXTX52231_SK + #define USE_HT32F52241_SK +#endif +#ifdef USE_MXTX52231 + #define USE_HT32F52231_41 +#endif +#ifdef USE_MEM_MXTX52231 + #define USE_MEM_HT32F52241 +#endif + +#ifdef USE_MXTX52352_SK + #define USE_HT32F52352_SK +#endif +#ifdef USE_MXTX52352 + #define USE_HT32F52342_52 +#endif +#ifdef USE_MEM_MXTX52352 + #define USE_MEM_HT32F52352 +#endif + +#ifdef USE_NW32F61242_SK + #define USE_HT32F61245_SK +#endif +#ifdef USE_NW32F61242 + #define USE_HT32F61244_45 +#endif +#ifdef USE_MEM_NW32F61242 + #define USE_MEM_HT32F61245 +#endif + +#ifdef USE_HT32F61052_SK + #define USE_HT32F50452_SK +#endif +#ifdef USE_HT32F61052 + #define USE_HT32F50442_52 +#endif +#ifdef USE_MEM_HT32F61052 + #define USE_MEM_HT32F50452 +#endif + #ifdef __cplusplus } #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_dependency.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_dependency.h index d96ecb9c3c4..518d99be5c3 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_dependency.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_dependency.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_dependency.h - * @version $Rev:: 5863 $ - * @date $Date:: 2022-05-12 #$ + * @version $Rev:: 7593 $ + * @date $Date:: 2024-02-22 #$ * @brief The header file of dependency check. ************************************************************************************************************* * @attention @@ -41,14 +41,22 @@ #if 0 // Version setting example for module /* Dependency check ----------------------------------------------------------------------------------------*/ -#if (__CORTEX_M == 0) +#if defined(__HT32L5XXXX_LIB_H) +#define MIN_HT32_FWLIB_VER (0x01000000) //0xmmnnnrrr -> Vm.n.r +#define MIN_HT32_FWLIB_SVN (0x209) +#endif +#if defined(__HT32F5XXXX_LIB_H) #define MIN_HT32_FWLIB_VER (0x01000024) //0xmmnnnrrr -> Vm.n.r #define MIN_HT32_FWLIB_SVN (0x5762) #endif -#if (__CORTEX_M == 3) +#if defined(__HT32F1XXXX_LIB_H) #define MIN_HT32_FWLIB_VER (0x01000009) //0xmmnnnrrr -> Vm.n.r #define MIN_HT32_FWLIB_SVN (0x2556) #endif +#if defined(__HT32F4XXXX_LIB_H) +#define MIN_HT32_FWLIB_VER (0x01000000) //0xmmnnnrrr -> Vm.n.r +#define MIN_HT32_FWLIB_SVN (0x336) +#endif #include "ht32_dependency.h" // Not exist means the version of HT32 Firmware Library is older than the module required. #endif @@ -62,7 +70,7 @@ #endif -// Check "ht32fxxxxx_lib.h" for the version of HT32 Firmwar Library +// Check "ht32f5xxxx_lib.h" for the version of HT32 Firmwar Library #if (HT32_FWLIB_VER != 999999) #if HT32_FWLIB_VER < MIN_HT32_FWLIB_VER #error !!! The version of HT32 Firmware Library is older than the module required. Please update HT32 Firmware Library. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_time.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_time.h index 51aeba2c3ee..1640af5c09e 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_time.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32_time.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_time.h - * @version $Rev:: 6751 $ - * @date $Date:: 2023-03-02 #$ + * @version $Rev:: 7693 $ + * @date $Date:: 2024-04-02 #$ * @brief The header file of time function. ************************************************************************************************************* * @attention @@ -132,23 +132,23 @@ #define TIME_TICKDIFF(start, current) ((current >= start) ? (u32)(current - start) : (u32)(0xFFFFFFFF - start + 1 + current)) #if (HTCFG_TIME_TICKHZ < 1000000) -#define TIME_US2TICK(us) (us / (1000000UL / HTCFG_TIME_TICKHZ)) -#define TIME_TICK2US(t) (t * (1000000UL / HTCFG_TIME_TICKHZ)) +#define TIME_US2TICK(us) ((us) / (1000000UL / HTCFG_TIME_TICKHZ)) +#define TIME_TICK2US(t) ((t) * (1000000UL / HTCFG_TIME_TICKHZ)) #else -#define TIME_US2TICK(us) (us * (HTCFG_TIME_TICKHZ / 1000000UL)) -#define TIME_TICK2US(t) (t / (HTCFG_TIME_TICKHZ / 1000000UL)) +#define TIME_US2TICK(us) ((us) * (HTCFG_TIME_TICKHZ / 1000000UL)) +#define TIME_TICK2US(t) ((t) / (HTCFG_TIME_TICKHZ / 1000000UL)) #endif #if (HTCFG_TIME_TICKHZ < 1000) -#define TIME_MS2TICK(ms) (ms / (1000UL / HTCFG_TIME_TICKHZ)) -#define TIME_TICK2MS(t) (t * (1000UL / HTCFG_TIME_TICKHZ)) +#define TIME_MS2TICK(ms) ((ms) / (1000UL / HTCFG_TIME_TICKHZ)) +#define TIME_TICK2MS(t) ((t) * (1000UL / HTCFG_TIME_TICKHZ)) #else -#define TIME_MS2TICK(ms) (ms * (HTCFG_TIME_TICKHZ / 1000UL)) -#define TIME_TICK2MS(t) (t / (HTCFG_TIME_TICKHZ / 1000UL)) +#define TIME_MS2TICK(ms) ((ms) * (HTCFG_TIME_TICKHZ / 1000UL)) +#define TIME_TICK2MS(t) ((t) / (HTCFG_TIME_TICKHZ / 1000UL)) #endif -#define TIME_S2TICK(s) (s * (u32)(HTCFG_TIME_TICKHZ)) -#define TIME_TICK2S(t) (t / (HTCFG_TIME_TICKHZ)) +#define TIME_S2TICK(s) ((s) * (u32)(HTCFG_TIME_TICKHZ)) +#define TIME_TICK2S(t) ((t) / (HTCFG_TIME_TICKHZ)) #define GET_CNT() (_HTCFG_TIME_PORT->CNTR) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50020_30_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50020_30_libcfg.h index 44d05bdcc92..dddf5d4e078 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50020_30_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50020_30_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f50020_30_libcfg.h - * @version $Rev:: 6386 $ - * @date $Date:: 2022-10-27 #$ + * @version $Rev:: 7661 $ + * @date $Date:: 2024-03-21 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -52,6 +52,7 @@ #define LIBCFG_GPIOC (1) #define LIBCFG_GPIOF (1) +#define LIBCFG_GPIO_SINK_CURRENT_ENHANCED (1) #define LIBCFG_LEDC (1) #define LIBCFG_LSE (1) #define LIBCFG_SCTM0 (1) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h index 2e13c2bea0a..c8fc4b8afe0 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50343_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f50343_libcfg.h - * @version $Rev:: 6386 $ - * @date $Date:: 2022-10-27 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50431_41_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50431_41_libcfg.h index 9c3bb3bb397..44898e5dd81 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50431_41_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50431_41_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f50431_41_libcfg.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -90,6 +90,5 @@ #define LIBCFG_ADC_MVDDA (1) #define LIBCFG_USART_LIN (1) #define LIBCFG_USART_SINGLE_WIRE (1) -#define LIBCFG_GPIO_SINK_CURREMT_ENHANCED (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50442_52_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50442_52_libcfg.h index 6a3cff8ab63..d601c4699ae 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50442_52_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f50442_52_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f50442_52_libcfg.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -80,6 +80,7 @@ #define LIBCFG_CKCU_ATM_V01 (1) #define LIBCFG_CKCU_SYS_CK_60M (1) #define LIBCFG_CKCU_REFCLK_EXT_PIN (1) +#define LIBCFG_CMP_IVREF_CN_IN (1) #define LIBCFG_PWRCU_VDD_5V (1) #define LIBCFG_PWRCU_WAKEUP1 (1) #define LIBCFG_PWRCU_WAKEUP_V01 (1) @@ -94,6 +95,5 @@ #define LIBCFG_ADC_MVDDA (1) #define LIBCFG_USART_LIN (1) #define LIBCFG_USART_SINGLE_WIRE (1) -#define LIBCFG_GPIO_SINK_CURREMT_ENHANCED (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53231_41_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53231_41_libcfg.h index 43068a9c12f..839f61da6f2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53231_41_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53231_41_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f53231_41_libcfg.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -91,6 +91,5 @@ #define LIBCFG_ADC_MVDDA (1) #define LIBCFG_USART_LIN (1) #define LIBCFG_USART_SINGLE_WIRE (1) -#define LIBCFG_GPIO_SINK_CURREMT_ENHANCED (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53242_52_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53242_52_libcfg.h index c2493ba610c..bd9dc9cb514 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53242_52_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f53242_52_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f53242_52_libcfg.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -81,6 +81,7 @@ #define LIBCFG_CKCU_ATM_V01 (1) #define LIBCFG_CKCU_SYS_CK_60M (1) #define LIBCFG_CKCU_REFCLK_EXT_PIN (1) +#define LIBCFG_CMP_IVREF_CN_IN (1) #define LIBCFG_PWRCU_VDD_5V (1) #define LIBCFG_PWRCU_WAKEUP1 (1) #define LIBCFG_PWRCU_WAKEUP_V01 (1) @@ -95,6 +96,5 @@ #define LIBCFG_ADC_MVDDA (1) #define LIBCFG_USART_LIN (1) #define LIBCFG_USART_SINGLE_WIRE (1) -#define LIBCFG_GPIO_SINK_CURREMT_ENHANCED (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54231_41_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54231_41_libcfg.h index 671765ef1ba..d5876b4d50f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54231_41_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54231_41_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f54231_41_libcfg.h - * @version $Rev:: 7184 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -64,7 +64,6 @@ #define LIBCFG_FMC_PREFETCH (1) #define LIBCFG_FMC_WAIT_STATE_2 (1) #define LIBCFG_GPIOC (1) -#define LIBCFG_GPIO_SINK_CURRENT_ENHANCED (1) #define LIBCFG_I2C1 (1) #define LIBCFG_LEDC (1) #define LIBCFG_LEDC_NO_COM_8_11 (1) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54243_53_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54243_53_libcfg.h index 750e4fb3773..d92296ea525 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54243_53_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f54243_53_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f54243_53_libcfg.h - * @version $Rev:: 6896 $ - * @date $Date:: 2023-05-08 #$ + * @version $Rev:: 7664 $ + * @date $Date:: 2024-03-26 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -66,7 +66,6 @@ #define LIBCFG_FMC_WAIT_STATE_2 (1) #define LIBCFG_GPIOC (1) #define LIBCFG_GPIOD (1) -#define LIBCFG_GPIO_SINK_CURRENT_ENHANCED (1) #define LIBCFG_I2C1 (1) #define LIBCFG_I2C2 (1) #define LIBCFG_LEDC (1) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h index c50babaa1aa..dc06ae3145f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_adc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_adc.h - * @version $Rev:: 7265 $ - * @date $Date:: 2023-10-02 #$ + * @version $Rev:: 7678 $ + * @date $Date:: 2024-04-01 #$ * @brief The header file of the ADC library. ************************************************************************************************************* * @attention @@ -634,7 +634,7 @@ void ADC_VREFConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_VREF_x); #endif #if (LIBCFG_ADC_VREFBUF) -void ADC_VREFOutputCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState); +void ADC_VREFOutputADVREFPCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState); #endif #if (LIBCFG_ADC_MVDDA) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h index a66d141dd79..465560807ba 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_can.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_can.h - * @version $Rev:: 7188 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8284 $ + * @date $Date:: 2024-11-22 #$ * @brief The header file of the CAN library. ************************************************************************************************************* * @attention @@ -44,66 +44,86 @@ * @{ */ + /* Exported types ------------------------------------------------------------------------------------------*/ /** @defgroup CAN_Exported_Types CAN exported types * @{ */ /** - * @brief CAN message structure - */ + * @brief CAN init structure definition + */ typedef struct { - u32 IdType; - u32 FrameType; - u32 Id; - u32 DLC; -} STR_CANMSG_TypeDef; + u16 CAN_BRPrescaler; /* Synchronisation Jump Width , Range: 1~1024. */ + u8 CAN_Mode; /* CAN_MODE_NORMAL : Normal mode. */ + /* CAN_MODE_BASIC : Basic mode. */ + /* CAN_MODE_SILENT : Silent mode. */ + /* CAN_MODE_LBACK : Loop Back Mode. */ + /* CAN_MODE_MONITORER : Sample Point can be monitored. */ + /* CAN_MODE_TX_DOMINANT : CAN_TX pin drives a dominant. */ + /* CAN_MODE_TX_RECESSIVE : CAN_TX pin drives a recessive. */ + u8 CAN_SJW; /* Synchronisation Jump Width , Range: 1~4. */ + u8 CAN_TSEG0; /* The time segment before the sample point. */ + u8 CAN_TSEG1; /* The time segment after the sample point. */ + ControlStatus CAN_NART; /* Set the no automatic retransmission */ +} CAN_InitTypeDef; + +/** + * @brief CAN receive status structure + */ +typedef enum +{ + MSG_RX_FINISH, + MSG_OBJ_NOT_SET, + MSG_NOT_RECEIVED, + MSG_OVER_RUN +} CAN_RxStatus_TypeDef; /** - * @brief CAN TX message structure + * @brief CAN mask message structure */ -typedef struct +typedef enum { - u32 IdType; - u32 FrameType; - u32 Id; - u32 MCR; - u32 DLC; - u32 EOB; - u32 RMTEN; - u32 UMASK; - u32 Data[8]; -} STR_CANMSG_T_TypeDef; - -/** - * @brief CAN RX message structure + NO_ERROR = 0, + STUFF_ERROR = 1, + FORM_ERROR = 2, + ACK_ERROR = 3, + BIT1_EROR = 4, + BIT0_ERROR = 5, + CRC_ERROR = 6, + NO_CHANGE = 7 +} CAN_LastErrorCode_TypeDef; + +/** + * @brief Message ID Type Constant structure */ -typedef struct +typedef enum { - u32 IdType; - u32 Id; - u32 u8Xtd; - u32 u8Dir; - u32 MCR; - u32 MASK0; - u32 MASK1; - u32 EOB; - u32 UMASK; - u32 RMTEN; - u32 DIR; /* For receive remote frame. */ - } STR_CANMSG_R_TypeDef; + CAN_STD_ID = 0, + CAN_EXT_ID = 1 +} CAN_IdType_Enum; /** - * @brief CAN mask message structure + * @brief Message Frame Type Constant structure + */ +typedef enum +{ + CAN_REMOTE_FRAME = 0, + CAN_DATA_FRAME = 1 +} CAN_FrameType_Enum; + +/** + * @brief CAN message structure */ typedef struct { - u32 u8Xtd; - u32 u8Dir; - u32 u32Id; - u32 u8IdType; -} STR_CANMASK_TyprDef; + u32 Id; /* Arbitration ID. Rang 0x0 ~ 0x1FFFFFFF */ + u32 IdMask; /* Arbitration ID mask. Rang 0x0 ~ 0x1FFFFFFF */ + u8 MsgNum; /* Message number */ + CAN_IdType_Enum IdType; /* CAN_STD_ID (0x0 ~ 0x7FF) or CAN_EXT_ID (0x0 ~ 0x1FFFFFFF) */ + CAN_FrameType_Enum FrameType; /* CAN_REMOTE_FRAME or CAN_DATA_FRAME */ +} CAN_MSG_TypeDef; /** * @} */ @@ -115,336 +135,311 @@ typedef struct #define IS_CAN(x) IS_CAN0(x) #define IS_CAN0(x) (x == HT_CAN0) -/** - * @brief CAN Test Mode Constant Definitions - */ -#define CAN_NORMAL_MODE 0 -#define CAN_BASIC_MODE 0x04 -#define CAN_SILENT_MODE 0x08 -#define CAN_LBACK_MODE 0x10 -#define CAN_LBS_MODE 0x18 - -/** - * @brief DMessage ID Type Constant Definitions - */ -#define CAN_STD_ID 0 -#define CAN_EXT_ID 1 +#define CAN_STD_FRAME_Msk 0x7FF +#define CAN_EXT_FRAME_MSB_Msk 0x1FFF +#define CAN_EXT_FRAME_LSB_Msk 0xFFFF -/** - * @brief Message Frame Type Constant Definitions - */ -#define CAN_REMOTE_FRAME 0 -#define CAN_DATA_FRAME 1 -#define CAN_NBR 1 -#define CAN_VECTOR_NBR 1 -#define DATA_NBR 4 +#define CAN_MODE_NORMAL 0 +#define MSG_OBJ_TOTAL_NUM 32 /** * @brief CAN CR Bit Field Definitions */ -#define CAN_CR_TEST_Pos 7 /*!< CAN_T::CR: TEST Position */ -#define CAN_CR_TEST_Msk (1ul << CAN_CR_TEST_Pos) /*!< CAN_T::CR: TEST Mask */ +#define CAN_CR_TEST_Pos 7 /*!< CAN_T::CR: TEST Position */ +#define CAN_CR_TEST (1ul << CAN_CR_TEST_Pos) /*!< CAN_T::CR: TEST */ -#define CAN_CR_CCE_Pos 6 /*!< CAN_T::CR: CCE Position */ -#define CAN_CR_CCE_Msk (1ul << CAN_CR_CCE_Pos) /*!< CAN_T::CR: CCE Mask */ +#define CAN_CR_CCE_Pos 6 /*!< CAN_T::CR: CCE Position */ +#define CAN_CR_CCE (1ul << CAN_CR_CCE_Pos) /*!< CAN_T::CR: CCE */ -#define CAN_CR_DAR_Pos 5 /*!< CAN_T::CR: DAR Position */ -#define CAN_CR_DAR_Msk (1ul << CAN_CR_DAR_Pos) /*!< CAN_T::CR: DAR Mask */ +#define CAN_CR_DAR_Pos 5 /*!< CAN_T::CR: DAR Position */ +#define CAN_CR_DAR (1ul << CAN_CR_DAR_Pos) /*!< CAN_T::CR: DAR */ -#define CAN_CR_EIE_Pos 3 /*!< CAN_T::CR: EIE Position */ -#define CAN_CR_EIE_Msk (1ul << CAN_CR_EIE_Pos) /*!< CAN_T::CR: EIE Mask */ +#define CAN_CR_EIE_Pos 3 /*!< CAN_T::CR: EIE Position */ +#define CAN_INT_EIE (1ul << CAN_CR_EIE_Pos) /*!< CAN_T::CR: EIE */ -#define CAN_CR_SIE_Pos 2 /*!< CAN_T::CR: SIE Position */ -#define CAN_CR_SIE_Msk (1ul << CAN_CR_SIE_Pos) /*!< CAN_T::CR SIE Mask */ +#define CAN_CR_SIE_Pos 2 /*!< CAN_T::CR: SIE Position */ +#define CAN_INT_SIE (1ul << CAN_CR_SIE_Pos) /*!< CAN_T::CR SIE */ -#define CAN_CR_IE_Pos 1 /*!< CAN_T::CR: IE Position */ -#define CAN_CR_IE_Msk (1ul << CAN_CR_IE_Pos) /*!< CAN_T::CR: IE Mask */ +#define CAN_CR_IE_Pos 1 /*!< CAN_T::CR: IE Position */ +#define CAN_INT_IE (1ul << CAN_CR_IE_Pos) /*!< CAN_T::CR: IE */ -#define CAN_CR_INIT_Pos 0 /*!< CAN_T::CR: INIT Position */ -#define CAN_CR_INIT_Msk (1ul << CAN_CR_INIT_Pos) /*!< CAN_T::CR: INIT Mask */ +#define CAN_INT_ALL (CAN_INT_EIE | CAN_INT_SIE | CAN_INT_IE) + +#define CAN_CR_INIT_Pos 0 /*!< CAN_T::CR: INIT Position */ +#define CAN_CR_INIT (1ul << CAN_CR_INIT_Pos) /*!< CAN_T::CR: INIT */ /** * @brief CAN STATUS Bit Field Definitions */ -#define CAN_SR_BOFF_Pos 7 /*!< CAN_T::STATUS: BOFF Position */ -#define CAN_SR_BOFF_Msk (1ul << CAN_SR_BOFF_Pos) /*!< CAN_T::STATUS: BOFF Mask */ +#define CAN_BOFF_Pos 7 /*!< CAN_T::STATUS: BOFF Position */ +#define CAN_FLAG_BOFF (1ul << CAN_BOFF_Pos) /*!< CAN_T::STATUS: BOFF Flag */ -#define CAN_SR_EWARN_Pos 6 /*!< CAN_T::STATUS: EWARN Position */ -#define CAN_SR_EWARN_Msk (1ul << CAN_SR_EWARN_Pos) /*!< CAN_T::STATUS: EWARN Mask */ +#define CAN_EWARN_Pos 6 /*!< CAN_T::STATUS: EWARN Position */ +#define CAN_FLAG_EWARN (1ul << CAN_EWARN_Pos) /*!< CAN_T::STATUS: EWARN Flag */ -#define CAN_SR_EPASS_Pos 5 /*!< CAN_T::STATUS: EPASS Position */ -#define CAN_SR_EPASS_Msk (1ul << CAN_SR_EPASS_Pos) /*!< CAN_T::STATUS: EPASS Mask */ +#define CAN_EPASS_Pos 5 /*!< CAN_T::STATUS: EPASS Position */ +#define CAN_FLAG_EPASS (1ul << CAN_EPASS_Pos) /*!< CAN_T::STATUS: EPASS Flag */ -#define CAN_SR_RXOK_Pos 4 /*!< CAN_T::STATUS: RXOK Position */ -#define CAN_SR_RXOK_Msk (1ul << CAN_SR_RXOK_Pos) /*!< CAN_T::STATUS: RXOK Mask */ +#define CAN_RXOK_Pos 4 /*!< CAN_T::STATUS: RXOK Position */ +#define CAN_FLAG_RXOK (1ul << CAN_RXOK_Pos) /*!< CAN_T::STATUS: RXOK Flag */ -#define CAN_SR_TXOK_Pos 3 /*!< CAN_T::STATUS: TXOK Position */ -#define CAN_SR_TXOK_Msk (1ul << CAN_SR_TXOK_Pos) /*!< CAN_T::STATUS: TXOK Mask */ +#define CAN_TXOK_Pos 3 /*!< CAN_T::STATUS: TXOK Position */ +#define CAN_FLAG_TXOK (1ul << CAN_TXOK_Pos) /*!< CAN_T::STATUS: TXOK Flag */ -#define CAN_SR_LEC_Pos 0 /*!< CAN_T::STATUS: LEC Position */ -#define CAN_SR_LEC_Msk (0x3ul << CAN_SR_LEC_Pos) /*!< CAN_T::STATUS: LEC Mask */ +#define CAN_LEC_Pos 0 /*!< CAN_T::STATUS: LEC Position */ +#define CAN_LEC_Msk (0x7ul << CAN_LEC_Pos) /*!< CAN_T::STATUS: LEC Mask */ /** * @brief CAN ECR Bit Field Definitions */ -#define CAN_ECR_RP_Pos 15 /*!< CAN_T::ECR: RP Position */ -#define CAN_ECR_RP_Msk (1ul << CAN_ECR_RP_Pos) /*!< CAN_T::ECR: RP Mask */ +#define CAN_ECR_RP_Pos 15 /*!< CAN_T::ECR: RP Position */ +#define CAN_ECR_RP_MsK (1ul << CAN_ECR_RP_Pos) /*!< CAN_T::ECR: RP */ -#define CAN_ECR_REC_Pos 8 /*!< CAN_T::ECR: REC Position */ -#define CAN_ECR_REC_Msk (0x7Ful << CAN_ECR_REC_Pos) /*!< CAN_T::ECR: REC Mask */ +#define CAN_ECR_REC_Pos 8 /*!< CAN_T::ECR: REC Position */ +#define CAN_ECR_REC_MsK (0x7Ful << CAN_ECR_REC_Pos) /*!< CAN_T::ECR: REC Mask */ -#define CAN_ECR_TEC_Pos 0 /*!< CAN_T::ECR: TEC Position */ -#define CAN_ECR_TEC_Msk (0xFFul << CAN_ECR_TEC_Pos) /*!< CAN_T::ECR: TEC Mask */ +#define CAN_ECR_TEC_Pos 0 /*!< CAN_T::ECR: TEC Position */ +#define CAN_ECR_TEC_MsK (0xFFul << CAN_ECR_TEC_Pos) /*!< CAN_T::ECR: TEC Mask */ /** * @brief CAN BTR Bit Field Definitions */ -#define CAN_BTR_TSEG1_Pos 12 /*!< CAN_T::BTR: TSEG1 Position */ -#define CAN_BTR_TSEG1_Msk (0x7ul << CAN_BTR_TSEG1_Pos) /*!< CAN_T::BTR: TSEG1 Mask */ +#define CAN_BTR_TSEG1_Pos 12 /*!< CAN_T::BTR: TSEG1 Position */ +#define CAN_BTR_TSEG1_Msk (0x7ul << CAN_BTR_TSEG1_Pos) /*!< CAN_T::BTR: TSEG1 Mask */ -#define CAN_BTR_TSEG0_Pos 8 /*!< CAN_T::BTR: TSEG0 Position */ -#define CAN_BTR_TSEG0_Msk (0xFul << CAN_BTR_TSEG0_Pos) /*!< CAN_T::BTR: TSEG0 Mask */ +#define CAN_BTR_TSEG0_Pos 8 /*!< CAN_T::BTR: TSEG0 Position */ +#define CAN_BTR_TSEG0_Msk (0xFul << CAN_BTR_TSEG0_Pos) /*!< CAN_T::BTR: TSEG0 Mask */ -#define CAN_BTR_SJW_Pos 6 /*!< CAN_T::BTR: SJW Position */ -#define CAN_BTR_SJW_Msk (0x3ul << CAN_BTR_SJW_Pos) /*!< CAN_T::BTR: SJW Mask */ +#define CAN_BTR_SJW_Pos 6 /*!< CAN_T::BTR: SJW Position */ +#define CAN_BTR_SJW_Msk (0x3ul << CAN_BTR_SJW_Pos) /*!< CAN_T::BTR: SJW Mask */ -#define CAN_BTR_BRP_Pos 0 /*!< CAN_T::BTR: BRP Position */ -#define CAN_BTR_BRP_Msk (0x3Ful << CAN_BTR_BRP_Pos) /*!< CAN_T::BTR: BRP Mask */ +#define CAN_BTR_BRP_Pos 0 /*!< CAN_T::BTR: BRP Position */ +#define CAN_BTR_BRP_Msk (0x3Ful << CAN_BTR_BRP_Pos) /*!< CAN_T::BTR: BRP Mask */ /** * @brief CAN IR Bit Field Definitions */ -#define CAN_IR_INTID_Pos 0 /*!< CAN_T::IR: INTID Position */ -#define CAN_IR_INTID_Msk (0xFFFFul << CAN_IR_INTID_Pos) /*!< CAN_T::R: INTID Mask */ +#define CAN_IR_INTID_Pos 0 /*!< CAN_T::IR: INTID Position */ +#define CAN_IR_INTID_Msk (0xFFFFul << CAN_IR_INTID_Pos) /*!< CAN_T::IR: INTID Mask */ /** * @brief CAN TEST Bit Field Definitions */ -#define CAN_TEST_RX_Pos 7 /*!< CAN_T::TEST: RX Position */ -#define CAN_TEST_RX_Msk (1ul << CAN_TEST_RX_Pos) /*!< CAN_T::TEST: RX Mask */ +#define CAN_TEST_RX_Pos 7 /*!< CAN_T::TEST: RX Position */ +#define CAN_TEST_RX (1ul << CAN_TEST_RX_Pos) /*!< CAN_T::TEST: RX */ -#define CAN_TEST_TX_Pos 5 /*!< CAN_T::TEST: TX Position */ -#define CAN_TEST_TX_Msk (0x3ul << CAN_TEST_TX_Pos) /*!< CAN_T::TEST: TX Mask */ +#define CAN_TEST_TX_Pos 5 /*!< CAN_T::TEST: TX Position */ +#define CAN_MODE_MONITORER (0x1ul << CAN_TEST_TX_Pos) /*!< CAN_T::TEST: SP monitored */ +#define CAN_MODE_TX_DOMINANT (0x2ul << CAN_TEST_TX_Pos) /*!< CAN_T::TEST: TX dominant */ +#define CAN_MODE_TX_RECESSIVE (0x3ul << CAN_TEST_TX_Pos) /*!< CAN_T::TEST: TX recessive */ -#define CAN_TEST_LBACK_Pos 4 /*!< CAN_T::TEST: LBACK Position */ -#define CAN_TEST_LBACK_Msk (1ul << CAN_TEST_LBACK_Pos) /*!< CAN_T::TEST: LBACK Mask */ +#define CAN_TEST_LBACK_Pos 4 /*!< CAN_T::TEST: LBACK Position */ +#define CAN_MODE_LBACK (1ul << CAN_TEST_LBACK_Pos) /*!< CAN_T::TEST: LBACK */ -#define CAN_TEST_SILENT_Pos 3 /*!< CAN_T::TEST: Silent Position */ -#define CAN_TEST_SILENT_Msk (1ul << CAN_TEST_SILENT_Pos) /*!< CAN_T::TEST: Silent Mask */ +#define CAN_TEST_SILENT_Pos 3 /*!< CAN_T::TEST: Silent Position */ +#define CAN_MODE_SILENT (1ul << CAN_TEST_SILENT_Pos) /*!< CAN_T::TEST: Silent */ -#define CAN_TEST_BASIC_Pos 2 /*!< CAN_T::TEST: Basic Position */ -#define CAN_TEST_BASIC_Msk (1ul << CAN_TEST_BASIC_Pos) /*!< CAN_T::TEST: Basic Mask */ +#define CAN_TEST_BASIC_Pos 2 /*!< CAN_T::TEST: Basic Position */ +#define CAN_MODE_BASIC (1ul << CAN_TEST_BASIC_Pos) /*!< CAN_T::TEST: Basic */ /** * @brief CAN BPRE Bit Field Definitions */ -#define CAN_BRPE_BRPE_Pos 0 /*!< CAN_T::BRPE: BRPE Position */ -#define CAN_BRPE_BRPE_Msk (0xFul << CAN_BRPE_BRPE_Pos) /*!< CAN_T::BRPE: BRPE Mask */ +#define CAN_BRPE_BRPE_Pos 0 /*!< CAN_T::BRPE: BRPE Position */ +#define CAN_BRPE_BRPE_Msk (0xFul << CAN_BRPE_BRPE_Pos) /*!< CAN_T::BRPE: BRPE Mask */ /** * @brief CAN IFn_CREQ Bit Field Definitions */ -#define CAN_IF_CREQ_BUSY_Pos 15 /*!< CAN_T::IFnCREQ: BUSY Position */ -#define CAN_IF_CREQ_BUSY_Msk (1ul << CAN_IF_CREQ_BUSY_Pos) /*!< CAN_T::IFnCREQ: BUSY Mask */ +#define CAN_IF_CREQ_BUSY_Pos 15 /*!< CAN_T::IFnCREQ: BUSY Position */ +#define CAN_FLAG_IF_BUSY (1ul << CAN_IF_CREQ_BUSY_Pos) /*!< CAN_T::IFnCREQ: BUSY FLAG */ -#define CAN_IF_CREQ_MSGNUM_Pos 0 /*!< CAN_T::IFnCREQ: MSGNUM Position */ -#define CAN_IF_CREQ_MSGNUM_Msk (0x3Ful << CAN_IF_CREQ_MSGNUM_Pos) /*!< CAN_T::IFnCREQ: MSGNUM Mask */ +#define CAN_IF_CREQ_MSGNUM_Pos 0 /*!< CAN_T::IFnCREQ: MSGNUM Position */ +#define CAN_IF_CREQ_MSGNUM_Msk (0x3Ful << CAN_IF_CREQ_MSGNUM_Pos) /*!< CAN_T::IFnCREQ: MSGNUM Mask */ /** * @brief CAN IFn_CMASK Bit Field Definitions */ -#define CAN_IF_CMASK_WRRD_Pos 7 /*!< CAN_T::IFnCMASK: WRRD Position */ -#define CAN_IF_CMASK_WRRD_Msk (1ul << CAN_IF_CMASK_WRRD_Pos) /*!< CAN_T::IFnCMASK: WRRD Mask */ +#define CAN_IF_CMASK_WRRD_Pos 7 /*!< CAN_T::IFnCMASK: WRRD Position */ +#define CAN_IF_CMASK_WRRD (1ul << CAN_IF_CMASK_WRRD_Pos) /*!< CAN_T::IFnCMASK: WRRD */ -#define CAN_IF_CMASK_MASK_Pos 6 /*!< CAN_T::IFnCMASK: MASK Position */ -#define CAN_IF_CMASK_MASK_Msk (1ul << CAN_IF_CMASK_MASK_Pos) /*!< CAN_T::IFnCMASK: MASK Mask */ +#define CAN_IF_CMASK_MASK_Pos 6 /*!< CAN_T::IFnCMASK: MASK Position */ +#define CAN_IF_CMASK_MASK (1ul << CAN_IF_CMASK_MASK_Pos) /*!< CAN_T::IFnCMASK: MASK */ -#define CAN_IF_CMASK_ARB_Pos 5 /*!< CAN_T::IFnCMASK: ARB Position */ -#define CAN_IF_CMASK_ARB_Msk (1ul << CAN_IF_CMASK_ARB_Pos) /*!< CAN_T::IFnCMASK: ARB Mask */ +#define CAN_IF_CMASK_ARB_Pos 5 /*!< CAN_T::IFnCMASK: ARB Position */ +#define CAN_IF_CMASK_ARB (1ul << CAN_IF_CMASK_ARB_Pos) /*!< CAN_T::IFnCMASK: ARB */ -#define CAN_IF_CMASK_CONTROL_Pos 4 /*!< CAN_T::IFnCMASK: CONTROL Position */ -#define CAN_IF_CMASK_CONTROL_Msk (1ul << CAN_IF_CMASK_CONTROL_Pos) /*!< CAN_T::IFnCMASK: CONTROL Mask */ +#define CAN_IF_CMASK_CONTROL_Pos 4 /*!< CAN_T::IFnCMASK: CONTROL Position */ +#define CAN_IF_CMASK_CONTROL (1ul << CAN_IF_CMASK_CONTROL_Pos) /*!< CAN_T::IFnCMASK: CONTROL */ -#define CAN_IF_CMASK_CLRINTPND_Pos 3 /*!< CAN_T::IFnCMASK: CLRINTPND Position */ -#define CAN_IF_CMASK_CLRINTPND_Msk (1ul << CAN_IF_CMASK_CLRINTPND_Pos) /*!< CAN_T::IFnCMASK: CLRINTPND Mask */ +#define CAN_IF_CMASK_CLRINTPND_Pos 3 /*!< CAN_T::IFnCMASK: CLRINTPND Position */ +#define CAN_IF_CMASK_CLRINTPND (1ul << CAN_IF_CMASK_CLRINTPND_Pos) /*!< CAN_T::IFnCMASK: CLRINTPND */ -#define CAN_IF_CMASK_TXRQSTNEWDAT_Pos 2 /*!< CAN_T::IFnCMASK: TXRQSTNEWDAT Position */ -#define CAN_IF_CMASK_TXRQSTNEWDAT_Msk (1ul << CAN_IF_CMASK_TXRQSTNEWDAT_Pos) /*!< CAN_T::IFnCMASK: TXRQSTNEWDAT Mask */ +#define CAN_IF_CMASK_TXRQSTNEWDAT_Pos 2 /*!< CAN_T::IFnCMASK: TXRQSTNEWDAT Position */ +#define CAN_IF_CMASK_TXRQSTNEWDAT (1ul << CAN_IF_CMASK_TXRQSTNEWDAT_Pos) /*!< CAN_T::IFnCMASK: TXRQSTNEWDAT */ -#define CAN_IF_CMASK_DATAA_Pos 1 /*!< CAN_T::IFnCMASK: DATAA Position */ -#define CAN_IF_CMASK_DATAA_Msk (1ul << CAN_IF_CMASK_DATAA_Pos) /*!< CAN_T::IFnCMASK: DATAA Mask */ +#define CAN_IF_CMASK_DATAA_Pos 1 /*!< CAN_T::IFnCMASK: DATAA Position */ +#define CAN_IF_CMASK_DATAA (1ul << CAN_IF_CMASK_DATAA_Pos) /*!< CAN_T::IFnCMASK: DATAA */ -#define CAN_IF_CMASK_DATAB_Pos 0 /*!< CAN_T::IFnCMASK: DATAB Position */ -#define CAN_IF_CMASK_DATAB_Msk (1ul << CAN_IF_CMASK_DATAB_Pos) /*!< CAN_T::IFnCMASK: DATAB Mask */ +#define CAN_IF_CMASK_DATAB_Pos 0 /*!< CAN_T::IFnCMASK: DATAB Position */ +#define CAN_IF_CMASK_DATAB (1ul << CAN_IF_CMASK_DATAB_Pos) /*!< CAN_T::IFnCMASK: DATAB */ /** * @brief CAN IFn_MASK0 Bit Field Definitions */ -#define CAN_IF_MASK0_MSK_Pos 0 /*!< CAN_T::IFnMASK0: MSK Position */ -#define CAN_IF_MASK0_MSK_Msk (0xFFul << CAN_IF_MASK0_MSK_Pos) /*!< CAN_T::IFnMASK0: MSK Mask */ +#define CAN_IF_MASK0_MSK_Pos 0 /*!< CAN_T::IFnMASK0: MSK Position */ +#define CAN_IF_MASK0_MSK_Msk (0xFFul << CAN_IF_MASK0_MSK_Pos) /*!< CAN_T::IFnMASK0: MSK Mask */ /** * @brief CAN IFn_MASK1 Bit Field Definitions */ #define CAN_IF_MASK1_MXTD_Pos 15 /*!< CAN_T::IFnMASK1: MXTD Position */ -#define CAN_IF_MASK1_MXTD_Msk (1ul << CAN_IF_MASK1_MXTD_Pos) /*!< CAN_T::IFnMASK1: MXTD Mask */ +#define CAN_IF_MASK1_MXTD (1ul << CAN_IF_MASK1_MXTD_Pos) /*!< CAN_T::IFnMASK1: MXTD */ #define CAN_IF_MASK1_MDIR_Pos 14 /*!< CAN_T::IFnMASK1: MDIR Position */ -#define CAN_IF_MASK1_MDIR_Msk (1ul << CAN_IF_MASK1_MDIR_Pos) /*!< CAN_T::IFnMASK1: MDIR Mask */ +#define CAN_IF_MASK1_MDIR (1ul << CAN_IF_MASK1_MDIR_Pos) /*!< CAN_T::IFnMASK1: MDIR */ -#define CAN_IF_MASK1_MSK_Pos 0 /*!< CAN_T::IFnMASK1: MSK Position */ -#define CAN_IF_MASK1_MSK_Msk (0x1FFul << CAN_IF_MASK1_MSK_Pos) /*!< CAN_T::IFnMASK1: MSK Mask */ +#define CAN_IF_MASK1_MSK_Pos 0 /*!< CAN_T::IFnMASK1: MSK Position */ +#define CAN_IF_MASK1_MSK_Msk (0x1FFul << CAN_IF_MASK1_MSK_Pos) /*!< CAN_T::IFnMASK1: MSK Mask */ /** * @brief CAN IFn_ARB0 Bit Field Definitions */ -#define CAN_IF_ARB0_ID_Pos 0 /*!< CAN_T::IFnARB0: ID Position */ -#define CAN_IF_ARB0_ID_Msk (0xFFFFul << CAN_IF_ARB0_ID_Pos) /*!< CAN_T::IFnARB0: ID Mask */ +#define CAN_IF_ARB0_ID_Pos 0 /*!< CAN_T::IFnARB0: ID Position */ +#define CAN_IF_ARB0_ID_Msk (0xFFFFul << CAN_IF_ARB0_ID_Pos) /*!< CAN_T::IFnARB0: ID Mask */ /** * @brief CAN IFn_ARB1 Bit Field Definitions */ -#define CAN_IF_ARB1_MSGVAL_Pos 15 /*!< CAN_T::IFnARB1: MSGVAL Position */ -#define CAN_IF_ARB1_MSGVAL_Msk (1ul << CAN_IF_ARB1_MSGVAL_Pos) /*!< CAN_T::IFnARB1: MSGVAL Mask */ +#define CAN_IF_ARB1_MSGVAL_Pos 15 /*!< CAN_T::IFnARB1: MSGVAL Position */ +#define CAN_IF_ARB1_MSGVAL (1ul << CAN_IF_ARB1_MSGVAL_Pos) /*!< CAN_T::IFnARB1: MSGVAL */ -#define CAN_IF_ARB1_XTD_Pos 14 /*!< CAN_T::IFnARB1: XTD Position */ -#define CAN_IF_ARB1_XTD_Msk (1ul << CAN_IF_ARB1_XTD_Pos) /*!< CAN_T::IFnARB1: XTD Mask */ +#define CAN_IF_ARB1_XTD_Pos 14 /*!< CAN_T::IFnARB1: XTD Position */ +#define CAN_IF_ARB1_XTD (1ul << CAN_IF_ARB1_XTD_Pos) /*!< CAN_T::IFnARB1: XTD */ -#define CAN_IF_ARB1_DIR_Pos 13 /*!< CAN_T::IFnARB1: DIR Position */ -#define CAN_IF_ARB1_DIR_Msk (1ul << CAN_IF_ARB1_DIR_Pos) /*!< CAN_T::IFnARB1: DIR Mask */ +#define CAN_IF_ARB1_DIR_Pos 13 /*!< CAN_T::IFnARB1: DIR Position */ +#define CAN_IF_ARB1_DIR (1ul << CAN_IF_ARB1_DIR_Pos) /*!< CAN_T::IFnARB1: DIR */ -#define CAN_IF_ARB1_ID_Pos 0 /*!< CAN_T::IFnARB1: ID Position */ -#define CAN_IF_ARB1_ID_Msk (0x1FFFul << CAN_IF_ARB1_ID_Pos) /*!< CAN_T::IFnARB1: ID Mask */ +#define CAN_IF_ARB1_ID_Pos 0 /*!< CAN_T::IFnARB1: ID Position */ +#define CAN_IF_ARB1_ID_Msk (0x1FFFul << CAN_IF_ARB1_ID_Pos) /*!< CAN_T::IFnARB1: ID Mask */ /** * @brief CAN IFn_MCR Bit Field Definitions */ #define CAN_IF_MCR_NEWDAT_Pos 15 /*!< CAN_T::IFnMCON: NEWDAT Position */ -#define CAN_IF_MCR_NEWDAT_Msk (1ul << CAN_IF_MCR_NEWDAT_Pos) /*!< CAN_T::IFnMCON: NEWDAT Mask */ +#define CAN_IF_MCR_NEWDAT (1ul << CAN_IF_MCR_NEWDAT_Pos) /*!< CAN_T::IFnMCON: NEWDAT */ #define CAN_IF_MCR_MSGLST_Pos 14 /*!< CAN_T::IFnMCON: MSGLST Position */ -#define CAN_IF_MCR_MSGLST_Msk (1ul << CAN_IF_MCR_MSGLST_Pos) /*!< CAN_T::IFnMCON: MSGLST Mask */ +#define CAN_IF_MCR_MSGLST (1ul << CAN_IF_MCR_MSGLST_Pos) /*!< CAN_T::IFnMCON: MSGLST */ #define CAN_IF_MCR_INTPND_Pos 13 /*!< CAN_T::IFnMCON: INTPND Position */ -#define CAN_IF_MCR_INTPND_Msk (1ul << CAN_IF_MCR_INTPND_Pos) /*!< CAN_T::IFnMCON: INTPND Mask */ +#define CAN_IF_MCR_INTPND (1ul << CAN_IF_MCR_INTPND_Pos) /*!< CAN_T::IFnMCON: INTPND */ #define CAN_IF_MCR_UMASK_Pos 12 /*!< CAN_T::IFnMCON: UMASK Position */ -#define CAN_IF_MCR_UMASK_Msk (1ul << CAN_IF_MCR_UMASK_Pos) /*!< CAN_T::IFnMCON: UMASK Mask */ +#define CAN_IF_MCR_UMASK (1ul << CAN_IF_MCR_UMASK_Pos) /*!< CAN_T::IFnMCON: UMASK */ #define CAN_IF_MCR_TXIE_Pos 11 /*!< CAN_T::IFnMCON: TXIE Position */ -#define CAN_IF_MCR_TXIE_Msk (1ul << CAN_IF_MCR_TXIE_Pos) /*!< CAN_T::IFnMCON: TXIE Mask */ +#define CAN_IF_MCR_TXIE (1ul << CAN_IF_MCR_TXIE_Pos) /*!< CAN_T::IFnMCON: TXIE */ #define CAN_IF_MCR_RXIE_Pos 10 /*!< CAN_T::IFnMCON: RXIE Position */ -#define CAN_IF_MCR_RXIE_Msk (1ul << CAN_IF_MCR_RXIE_Pos) /*!< CAN_T::IFnMCON: RXIE Mask */ +#define CAN_IF_MCR_RXIE (1ul << CAN_IF_MCR_RXIE_Pos) /*!< CAN_T::IFnMCON: RXIE */ #define CAN_IF_MCR_RMTEN_Pos 9 /*!< CAN_T::IFnMCON: RMTEN Position */ -#define CAN_IF_MCR_RMTEN_Msk (1ul << CAN_IF_MCR_RMTEN_Pos) /*!< CAN_T::IFnMCON: RMTEN Mask */ +#define CAN_IF_MCR_RMTEN (1ul << CAN_IF_MCR_RMTEN_Pos) /*!< CAN_T::IFnMCON: RMTEN */ #define CAN_IF_MCR_TXRQST_Pos 8 /*!< CAN_T::IFnMCON: TXRQST Position */ -#define CAN_IF_MCR_TXRQST_Msk (1ul << CAN_IF_MCR_TXRQST_Pos) /*!< CAN_T::IFnMCON: TXRQST Mask */ +#define CAN_IF_MCR_TXRQST (1ul << CAN_IF_MCR_TXRQST_Pos) /*!< CAN_T::IFnMCON: TXRQST */ #define CAN_IF_MCR_EOB_Pos 7 /*!< CAN_T::IFnMCON: EOB Position */ -#define CAN_IF_MCR_EOB_Msk (1ul << CAN_IF_MCR_EOB_Pos) /*!< CAN_T::IFnMCON: EOB Mask */ +#define CAN_IF_MCR_EOB (1ul << CAN_IF_MCR_EOB_Pos) /*!< CAN_T::IFnMCON: EOB */ #define CAN_IF_MCR_DLC_Pos 0 /*!< CAN_T::IFnMCON: DLC Position */ -#define CAN_IF_MCR_DLC_Msk (0xFul << CAN_IF_MCR_DLC_Pos) /*!< CAN_T::IFnMCON: DLC Mask */ +#define CAN_IF_MCR_DLC_Msk (0xFul << CAN_IF_MCR_DLC_Pos) /*!< CAN_T::IFnMCON: DLC Mask */ /** * @brief CAN IFn_DATA_A0 Bit Field Definitions */ -#define CAN_IF_DAT_A0_DATA1_Pos 8 /*!< CAN_T::IFnDATAA0: DATA1 Position */ -#define CAN_IF_DAT_A0_DATA1_Msk (0xFFul << CAN_IF_DAT_A0_DATA1_Pos) /*!< CAN_T::IFnDATAA0: DATA1 Mask */ +#define CAN_IF_DAT_A0_DATA1_Pos 8 /*!< CAN_T::IFnDATAA0: DATA1 Position */ +#define CAN_IF_DAT_A0_DATA1_Msk (0xFFul << CAN_IF_DAT_A0_DATA1_Pos) /*!< CAN_T::IFnDATAA0: DATA1 Mask */ -#define CAN_IF_DAT_A0_DATA0_Pos 0 /*!< CAN_T::IFnDATAA0: DATA0 Position */ -#define CAN_IF_DAT_A0_DATA0_Msk (0xFFul << CAN_IF_DAT_A0_DATA0_Pos) /*!< CAN_T::IFnDATAA0: DATA0 Mask */ +#define CAN_IF_DAT_A0_DATA0_Pos 0 /*!< CAN_T::IFnDATAA0: DATA0 Position */ +#define CAN_IF_DAT_A0_DATA0_Msk (0xFFul << CAN_IF_DAT_A0_DATA0_Pos) /*!< CAN_T::IFnDATAA0: DATA0 Mask */ /** * @brief CAN IFn_DATA_A1 Bit Field Definitions */ -#define CAN_IF_DAT_A1_DATA3_Pos 8 /*!< CAN_T::IFnDATAA1: DATA3 Position */ -#define CAN_IF_DAT_A1_DATA3_Msk (0xFFul << CAN_IF_DAT_A1_DATA3_Pos) /*!< CAN_T::IFnDATAA1: DATA3 Mask */ +#define CAN_IF_DAT_A1_DATA3_Pos 8 /*!< CAN_T::IFnDATAA1: DATA3 Position */ +#define CAN_IF_DAT_A1_DATA3_Msk (0xFFul << CAN_IF_DAT_A1_DATA3_Pos) /*!< CAN_T::IFnDATAA1: DATA3 Mask */ -#define CAN_IF_DAT_A1_DATA2_Pos 0 /*!< CAN_T::IFnDATAA1: DATA2 Position */ -#define CAN_IF_DAT_A1_DATA2_Msk (0xFFul << CAN_IF_DAT_A1_DATA2_Pos) /*!< CAN_T::IFnDATAA1: DATA2 Mask */ +#define CAN_IF_DAT_A1_DATA2_Pos 0 /*!< CAN_T::IFnDATAA1: DATA2 Position */ +#define CAN_IF_DAT_A1_DATA2_Msk (0xFFul << CAN_IF_DAT_A1_DATA2_Pos) /*!< CAN_T::IFnDATAA1: DATA2 Mask */ /** * @brief CAN IFn_DATA_B0 Bit Field Definitions */ -#define CAN_IF_DAT_B0_DATA5_Pos 8 /*!< CAN_T::IFnDATAB0: DATA5 Position */ -#define CAN_IF_DAT_B0_DATA5_Msk (0xFFul << CAN_IF_DAT_B0_DATA5_Pos) /*!< CAN_T::IFnDATAB0: DATA5 Mask */ +#define CAN_IF_DAT_B0_DATA5_Pos 8 /*!< CAN_T::IFnDATAB0: DATA5 Position */ +#define CAN_IF_DAT_B0_DATA5_Msk (0xFFul << CAN_IF_DAT_B0_DATA5_Pos) /*!< CAN_T::IFnDATAB0: DATA5 Mask */ -#define CAN_IF_DAT_B0_DATA4_Pos 0 /*!< CAN_T::IFnDATAB0: DATA4 Position */ -#define CAN_IF_DAT_B0_DATA4_Msk (0xFFul << CAN_IF_DAT_B0_DATA4_Pos) /*!< CAN_T::IFnDATAB0: DATA4 Mask */ +#define CAN_IF_DAT_B0_DATA4_Pos 0 /*!< CAN_T::IFnDATAB0: DATA4 Position */ +#define CAN_IF_DAT_B0_DATA4_Msk (0xFFul << CAN_IF_DAT_B0_DATA4_Pos) /*!< CAN_T::IFnDATAB0: DATA4 Mask */ /** * @brief CAN IFn_DATA_B1 Bit Field Definitions */ -#define CAN_IF_DAT_B1_DATA7_Pos 8 /*!< CAN_T::IFnDATAB1: DATA7 Position */ -#define CAN_IF_DAT_B1_DATA7_Msk (0xFFul << CAN_IF_DAT_B1_DATA7_Pos) /*!< CAN_T::IFnDATAB1: DATA7 Mask */ +#define CAN_IF_DAT_B1_DATA7_Pos 8 /*!< CAN_T::IFnDATAB1: DATA7 Position */ +#define CAN_IF_DAT_B1_DATA7_Msk (0xFFul << CAN_IF_DAT_B1_DATA7_Pos) /*!< CAN_T::IFnDATAB1: DATA7 Mask */ -#define CAN_IF_DAT_B1_DATA6_Pos 0 /*!< CAN_T::IFnDATAB1: DATA6 Position */ -#define CAN_IF_DAT_B1_DATA6_Msk (0xFFul << CAN_IF_DAT_B1_DATA6_Pos) /*!< CAN_T::IFnDATAB1: DATA6 Mask */ +#define CAN_IF_DAT_B1_DATA6_Pos 0 /*!< CAN_T::IFnDATAB1: DATA6 Position */ +#define CAN_IF_DAT_B1_DATA6_Msk (0xFFul << CAN_IF_DAT_B1_DATA6_Pos) /*!< CAN_T::IFnDATAB1: DATA6 Mask */ /** * @brief CAN IFn_TXRQST0 Bit Field Definitions */ -#define CAN_IF_TXRQST0_TXRQST_Pos 0 /*!< CAN_T::IFnTXRQST0: TXRQST Position */ -#define CAN_IF_TXRQST0_TXRQST_Msk (0xFFFFul << CAN_IF_TXRQST0_TXRQST_Pos) /*!< CAN_T::IFnTXRQST0: TXRQST Mask */ +#define CAN_IF_TXRQST0_TXRQST_Pos 0 /*!< CAN_T::IFnTXRQST0: TXRQST Position */ +#define CAN_IF_TXRQST0_TXRQST_Msk (0xFFFFul << CAN_IF_TXRQST0_TXRQST_Pos) /*!< CAN_T::IFnTXRQST0: TXRQST Mask */ /** * @brief CAN IFn_TXRQST1 Bit Field Definitions */ -#define CAN_IF_TXRQST1_TXRQST_Pos 0 /*!< CAN_T::IFnTXRQST1: TXRQST Position */ -#define CAN_IF_TXRQST1_TXRQST_Msk (0xFFFFul << CAN_IF_TXRQST1_TXRQST_Pos) /*!< CAN_T::IFnTXRQST1: TXRQST Mask */ +#define CAN_IF_TXRQST1_TXRQST_Pos 0 /*!< CAN_T::IFnTXRQST1: TXRQST Position */ +#define CAN_IF_TXRQST1_TXRQST_Msk (0xFFFFul << CAN_IF_TXRQST1_TXRQST_Pos) /*!< CAN_T::IFnTXRQST1: TXRQST Mask */ /** * @brief CAN IFn_NDAT0 Bit Field Definitions */ -#define CAN_IF_NDAT0_NEWDATA_Pos 0 /*!< CAN_T::IFnNDAT0: NEWDATA Position */ -#define CAN_IF_NDAT0_NEWDATA_Msk (0xFFFFul << CAN_IF_NDAT0_NEWDATA_Pos) /*!< CAN_T::IFnNDAT0: NEWDATA Mask */ +#define CAN_IF_NDAT0_NEWDATA_Pos 0 /*!< CAN_T::IFnNDAT0: NEWDATA Position */ +#define CAN_IF_NDAT0_NEWDATA_Msk (0xFFFFul << CAN_IF_NDAT0_NEWDATA_Pos) /*!< CAN_T::IFnNDAT0: NEWDATA Mask */ /** * @brief CAN IFn_NDAT1 Bit Field Definitions */ -#define CAN_IF_NDAT1_NEWDATA_Pos 0 /*!< CAN_T::IFnNDAT1: NEWDATA Position */ -#define CAN_IF_NDAT1_NEWDATA_Msk (0xFFFFul << CAN_IF_NDAT1_NEWDATA_Pos) /*!< CAN_T::IFnNDAT1: NEWDATA Mask */ +#define CAN_IF_NDAT1_NEWDATA_Pos 0 /*!< CAN_T::IFnNDAT1: NEWDATA Position */ +#define CAN_IF_NDAT1_NEWDATA_Msk (0xFFFFul << CAN_IF_NDAT1_NEWDATA_Pos) /*!< CAN_T::IFnNDAT1: NEWDATA Mask */ /** * @brief CAN IFn_IPND0 Bit Field Definitions */ -#define CAN_IF_IPND0_INTPND_Pos 0 /*!< CAN_T::IFnIPND0: INTPND Position */ -#define CAN_IF_IPND0_INTPND_Msk (0xFFFFul << CAN_IF_IPND0_INTPND_Pos) /*!< CAN_T::IFnIPND0: INTPND Mask */ +#define CAN_IF_IPND0_INTPND_Pos 0 /*!< CAN_T::IFnIPND0: INTPND Position */ +#define CAN_IF_IPND0_INTPND_Msk (0xFFFFul << CAN_IF_IPND0_INTPND_Pos) /*!< CAN_T::IFnIPND0: INTPND Mask */ /** * @brief CAN IFn_IPND1 Bit Field Definitions */ -#define CAN_IF_IPND1_INTPND_Pos 0 /*!< CAN_T::IFnIPND1: INTPND Position */ -#define CAN_IF_IPND1_INTPND_Msk (0xFFFFul << CAN_IF_IPND1_INTPND_Pos) /*!< CAN_T::IFnIPND1: INTPND Mask */ +#define CAN_IF_IPND1_INTPND_Pos 0 /*!< CAN_T::IFnIPND1: INTPND Position */ +#define CAN_IF_IPND1_INTPND_Msk (0xFFFFul << CAN_IF_IPND1_INTPND_Pos) /*!< CAN_T::IFnIPND1: INTPND Mask */ /** * @brief CAN IFn_MVLD0 Bit Field Definitions */ -#define CAN_IF_MVLD0_MSGVAL_Pos 0 /*!< CAN_T::IFnMVLD0: MSGVAL Position */ -#define CAN_IF_MVLD0_MSGVAL_Msk (0xFFFFul << CAN_IF_MVLD0_MSGVAL_Pos) /*!< CAN_T::IFnMVLD0: MSGVAL Mask */ +#define CAN_IF_MVLD0_MSGVAL_Pos 0 /*!< CAN_T::IFnMVLD0: MSGVAL Position */ +#define CAN_IF_MVLD0_MSGVAL_Msk (0xFFFFul << CAN_IF_MVLD0_MSGVAL_Pos) /*!< CAN_T::IFnMVLD0: MSGVAL Mask */ /** * @brief CAN IFn_MVLD1 Bit Field Definitions */ -#define CAN_IF_MVLD1_MSGVAL_Pos 0 /*!< CAN_T::IFnMVLD1: MSGVAL Position */ -#define CAN_IF_MVLD1_MSGVAL_Msk (0xFFFFul << CAN_IF_MVLD1_MSGVAL_Pos) /*!< CAN_T::IFnMVLD1: MSGVAL Mask */ - -/** - * @brief CAN WUEN Bit Field Definitions - */ -#define CAN_WUEN_WAKUP_EN_Pos 0 /*!< CAN_T::WUEN: WAKUP_EN Position */ -#define CAN_WUEN_WAKUP_EN_Msk (1ul << CAN_WUEN_WAKUP_EN_Pos) /*!< CAN_T::WUEN: WAKUP_EN Mask */ - -/** - * @brief CAN WUSTATUS Bit Field Definitions - */ -#define CAN_WUSTATUS_WAKUP_STS_Pos 0 /*!< CAN_T::WUSTATUS: WAKUP_STS Position */ -#define CAN_WUSTATUS_WAKUP_STS_Msk (1ul << CAN_WUSTATUS_WAKUP_STS_Pos) /*!< CAN_T::WUSTATUS: WAKUP_STS Mask */ +#define CAN_IF_MVLD1_MSGVAL_Pos 0 /*!< CAN_T::IFnMVLD1: MSGVAL Position */ +#define CAN_IF_MVLD1_MSGVAL_Msk (0xFFFFul << CAN_IF_MVLD1_MSGVAL_Pos) /*!< CAN_T::IFnMVLD1: MSGVAL Mask */ /** * @} */ @@ -453,31 +448,45 @@ typedef struct /** @defgroup CAN_Exported_Functions CAN exported functions * @{ */ +/* Initialization functions *********************************************************************************/ void CAN_DeInit(HT_CAN_TypeDef* CANx); -u32 CAN_SetBaudRate(HT_CAN_TypeDef *CANx, u32 u32BaudRate); -void CAN_Close(HT_CAN_TypeDef *CANx); -u32 CAN_Open(HT_CAN_TypeDef *CANx, u32 u32BaudRate, u32 u32Mode); -void CAN_CLR_INT_PENDING_BIT(HT_CAN_TypeDef *CANx, u32 u32MsgNum); -void CAN_EnableInt(HT_CAN_TypeDef *CANx, u32 u32Mask); -void CAN_DisableInt(HT_CAN_TypeDef *CANx, u32 u32Mask); -s32 CAN_Transmit(HT_CAN_TypeDef *CANx, u32 u32MsgNum , STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_Receive(HT_CAN_TypeDef *CANx, u32 u32MsgNum , STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_SetRxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum , STR_CANMSG_R_TypeDef* pCanMsg); -s32 CAN_SetTxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum , STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_TriggerTxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum); -void CAN_EnterInitMode(HT_CAN_TypeDef *CANx); -void CAN_LeaveInitMode(HT_CAN_TypeDef *CANx); -void CAN_WaitMsg(HT_CAN_TypeDef *CANx); -u32 CAN_GetCANBitRate(HT_CAN_TypeDef *CANx); +void CAN_Init(HT_CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct); + +/* Interrupts and flags management functions ****************************************************************/ +void CAN_IntConfig(HT_CAN_TypeDef *CANx, u32 CAN_Int, ControlStatus NewState); +FlagStatus CAN_GetIntStatus(HT_CAN_TypeDef* CANx, u32 CAN_Int); +FlagStatus CAN_GetFlagStatus(HT_CAN_TypeDef* CANx, uint32_t CAN_Flag); +void CAN_ClearFlag(HT_CAN_TypeDef* CANx, uint32_t CAN_Flag); + +/* Error management functions *******************************************************************************/ +CAN_LastErrorCode_TypeDef CAN_GetLastErrorCode(HT_CAN_TypeDef* CANx); +u32 CAN_GetReceiveErrorCounter(HT_CAN_TypeDef* CANx); +u32 CAN_GetLSBTransmitErrorCounter(HT_CAN_TypeDef* CANx); +void CAN_BusOffRecovery(HT_CAN_TypeDef *CANx); + +/* Test Mode functions **************************************************************************************/ void CAN_EnterTestMode(HT_CAN_TypeDef *CANx, u32 u8TestMask); void CAN_LeaveTestMode(HT_CAN_TypeDef *CANx); -u32 CAN_IsNewDataReceived(HT_CAN_TypeDef *CANx, u32 u8MsgObj); -s32 CAN_BasicSendMsg(HT_CAN_TypeDef *CANx, STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_BasicReceiveMsg(HT_CAN_TypeDef *CANx, STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_SetRxMsgObj(HT_CAN_TypeDef *CANx, u32 MsgObj, STR_CANMSG_R_TypeDef* pCanMsg); -s32 CAN_ReadMsgObj(HT_CAN_TypeDef *CANx, u32 u8MsgObj, u32 u8Release, STR_CANMSG_T_TypeDef* pCanMsg); -s32 CAN_MsgObjMaskConfig(HT_CAN_TypeDef *tCAN, u32 u8MsgObj, STR_CANMSG_R_TypeDef* MaskMsg); -s32 CAN_SetMultiRxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum , u32 u32MsgCount, STR_CANMSG_R_TypeDef* pCanMsg); +ErrStatus CAN_BasicSendMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len); +ErrStatus CAN_BasicReceiveMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8* len); + +/* Transmit/Receive functions *******************************************************************************/ +ErrStatus CAN_Transmit(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len); +CAN_RxStatus_TypeDef CAN_Receive(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u32* len); +ErrStatus CAN_UpdateTxMsgData(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len); +ErrStatus CAN_TriggerTxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg); + +/* Set Rx Message Object ************************************************************************************/ +ErrStatus CAN_SetRxMsg(HT_CAN_TypeDef *CANx ,CAN_MSG_TypeDef* pCanMsg, u32 FifoDepth); + +/* Message Object status function ***************************************************************************/ +ErrStatus CAN_CancelTransmit(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg); +ErrStatus CAN_DiscardRxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg); +bool CAN_NewDataReceived(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg); +s32 CAN_TransmitStatus(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg); +bool CAN_GetMsgPending(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg); +ErrStatus CAN_ClearMsgPendingFlag(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg); +void CAN_ClearAllMsgPendingFlag(HT_CAN_TypeDef *CANx); /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h index 531078537b5..cc5dabb858b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_ckcu.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_ckcu.h - * @version $Rev:: 7108 $ - * @date $Date:: 2023-08-09 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the Clock Control Unit library. ************************************************************************************************************* * @attention @@ -425,9 +425,9 @@ typedef union unsigned long DIV :1; // Bit 24 unsigned long QSPI :1; // Bit 25 unsigned long RF :1; // Bit 26 - unsigned long :1; // Bit 27 + unsigned long PID0 :1; // Bit 27 unsigned long :1; // Bit 28 - unsigned long :1; // Bit 29 + unsigned long CORDIC :1; // Bit 29 unsigned long :1; // Bit 30 unsigned long :1; // Bit 31 @@ -494,8 +494,11 @@ typedef union unsigned long LCDC :1; // Bit 20 unsigned long DAC0 :1; // Bit 21 unsigned long CMP :1; // Bit 22 +#if defined(USE_HT32F66242) || defined(USE_HT32F66246) + unsigned long PGA :1; // Bit 23 +#else unsigned long OPA :1; // Bit 23 - +#endif unsigned long ADC0 :1; // Bit 24 unsigned long ADC1 :1; // Bit 25 unsigned long :1; // Bit 26 @@ -565,6 +568,9 @@ typedef enum #if (LIBCFG_OPA) CKCU_PCLK_OPA = (CKCU_APBPCSR1 | 10), #endif + #if (LIBCFG_PGA) + CKCU_PCLK_PGA = (CKCU_APBPCSR1 | 10), + #endif CKCU_PCLK_WDTR = (CKCU_APBPCSR1 | 12), CKCU_PCLK_BKPR = (CKCU_APBPCSR1 | 14), #if (LIBCFG_SCI0) @@ -679,6 +685,13 @@ typedef enum #define CKCU_PLL_16M_56M ((1UL << 28) | ( 7UL << 23) | (0UL << 21)) #endif +#if (LIBCFG_CKCU_SYS_CK_80M) +#define CKCU_PLL_4M_80M ((0UL << 28) | (20UL << 23) | (0UL << 21)) +#define CKCU_PLL_8M_80M ((0UL << 28) | (10UL << 23) | (0UL << 21)) +#define CKCU_PLL_12M_78M ((1UL << 28) | (13UL << 23) | (0UL << 21)) +#define CKCU_PLL_16M_80M ((0UL << 28) | ( 5UL << 23) | (0UL << 21)) +#endif + #define IS_PLL_CFG(CFG) (((CFG & 0xE81FFFFF) == 0x0) && (CFG != 0)) #endif @@ -699,13 +712,12 @@ typedef enum #define IS_USBPLL_CFG(CFG) (((CFG & 0xFFFFF81F) == 0x0) && (CFG != 0)) #endif - - - /* Definitions of MCU debug control */ #define CKCU_DBG_SLEEP (1UL) #define CKCU_DBG_DEEPSLEEP1 (1UL << 1) +#if (!LIBCFG_PWRCU_NO_PD_MODE) #define CKCU_DBG_POWERDOWN (1UL << 2) +#endif #define CKCU_DBG_WDT_HALT (1UL << 3) #if (LIBCFG_MCTM0) @@ -828,6 +840,14 @@ typedef enum #if (LIBCFG_CKCU_HSIRDYCR) #define IS_COUNTER_VALUE(VALUE) ((VALUE) < 0x20) #endif + +/* HSE Gain mode */ +#define CKCU_HSE_LOW_GAIN_MODE (0UL << 8) +#define CKCU_HSE_HIGH_GAIN_MODE (1UL << 8) + +#define IS_GAINMODE(GanMode) ((GanMode == CKCU_HSE_LOW_GAIN_MODE) || \ + (GanMode == CKCU_HSE_HIGH_GAIN_MODE)) + /** * @} */ @@ -904,7 +924,7 @@ void CKCU_IntConfig(u32 CKCU_INT, ControlStatus Cmd); FlagStatus CKCU_GetIntStatus(u32 CKCU_INT); void CKCU_ClearIntFlag(u32 CKCU_INT); -#if (((LIBCFG_LSE) || (LIBCFG_USBD)) && (!LIBCFG_CKCU_NO_AUTO_TRIM)) +#if (((LIBCFG_LSE) || (LIBCFG_USBD) || (LIBCFG_CKCU_REFCLK_EXT_PIN)) && (!LIBCFG_CKCU_NO_AUTO_TRIM)) #if (LIBCFG_CKCU_ATM_V01) void CKCU_ATCInit(CKCU_ATCInitTypeDef* ATC_InitStruct); #endif @@ -914,8 +934,11 @@ bool CKCU_HSIAutoTrimIsReady(void); #endif #if (LIBCFG_CKCU_HSIRDYCR) -void CKCU_Set_HSIReadyCounter(u8 value); +void CKCU_SetHSIReadyCounter(u8 value); #endif + +void CKCU_SetHSEGainMode(u32 GanMode); + /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h index 5869bcd21c2..5213360e5e5 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_cmp.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_cmp.h - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the CMP library. ************************************************************************************************************* * @attention @@ -59,7 +59,7 @@ typedef struct u32 CMP_ScalerEnable; u32 CMP_CoutSync; u32 CMP_OutputPol; - #if (LIBCFG_CMP_65x_VER) + #if (LIBCFG_CMP_65x_66x_VER) u32 CMP_InputSelection; #endif u32 CMP_InvInputSelection; @@ -108,7 +108,7 @@ typedef enum /* Definitions of CMP Output Selection for IP Trigger Source */ -#if (LIBCFG_CMP_65x_VER) +#if (LIBCFG_CMP_65x_66x_VER) #define CMP_TRIG_NONE ((u32)0x0 << 11) #define CMP_TRIG_GPTM_CH0 ((u32)0x1 << 11) // CMP0 #define CMP_TRIG_GPTM_CH1 ((u32)0x1 << 11) // CMP1 @@ -198,7 +198,7 @@ typedef enum /* Definitions of CMP Inverted Input Source Selection */ -#if (LIBCFG_CMP_65x_VER) +#if (LIBCFG_CMP_65x_66x_VER) #if (LIBCFG_CMP_POS_INPUT_SEL_V2) #define CMP_INPUT_CMPnP ((u32)0x00000000) #define CMP_INPUT_CMPnP0 ((u32)0x00000000) @@ -211,6 +211,26 @@ typedef enum (x == CMP_INPUT_CMPnP1) || \ (x == CMP_INPUT_CMPnP2) || \ (x == CMP_INPUT_OPA0O)) +#elif (LIBCFG_CMP_POS_INPUT_SEL_V3) +#define CMP_INPUT_CMP0P ((u32)0x00000000) +#define CMP_INPUT_CMP0P0 ((u32)0x00000000) +#define CMP_INPUT_CMP1P0 ((u32)0x00000001) +#define CMP_INPUT_CMP1P1 ((u32)0x00000002) +#define CMP_INPUT_CMP1P2 ((u32)0x00000003) +#define CMP_INPUT_PGA0O ((u32)0x00000004) +#define CMP_INPUT_PGA1O ((u32)0x00000005) +#define CMP_INPUT_PGA2O ((u32)0x00000006) +#define CMP_INPUT_PGA3O ((u32)0x00000007) + +#define IS_CMP_InputSelection(x) ((x == CMP_INPUT_CMP0P) || \ + (x == CMP_INPUT_CMP0P0) || \ + (x == CMP_INPUT_CMP1P0) || \ + (x == CMP_INPUT_CMP1P1) || \ + (x == CMP_INPUT_CMP1P2) || \ + (x == CMP_INPUT_PGA0O) || \ + (x == CMP_INPUT_PGA1O) || \ + (x == CMP_INPUT_PGA2O) || \ + (x == CMP_INPUT_PGA3O)) #else #define CMP_INPUT_CMPnP ((u32)0x00000000) #define CMP_INPUT_OPA0O ((u32)0x00000001) @@ -223,6 +243,22 @@ typedef enum /* Definitions of CMP Inverted Input Source Selection */ #define CMP_EXTERNAL_CN_IN ((u32)0x00000000) + +#if defined(USE_HT32F66242) || defined(USE_HT32F66246) +#define CMP0_CMP0N_CN_IN ((u32)0x00000000) +#define CMP1_CMP1N_CN_IN ((u32)0x00000000) + +#define CMP0_CMP1N_CN_IN ((u32)0x00000010) +#define CMP1_CMP0N_CN_IN ((u32)0x00000010) + +#define CMP_CVREF0_CN_IN ((u32)0x00000020) +#define CMP_CVREF1_CN_IN ((u32)0x00000030) + +#define IS_CMP_InvInputSelection(x) ((x == CMP_EXTERNAL_CN_IN) || (x == CMP0_CMP0N_CN_IN) || (x == CMP1_CMP1N_CN_IN) || \ + (x == CMP0_CMP1N_CN_IN) || (x == CMP1_CMP0N_CN_IN) || \ + (x == CMP_CVREF0_CN_IN) || \ + (x == CMP_CVREF1_CN_IN)) +#else #define CMP_SCALER_CN_IN ((u32)0x00000010) #define IS_CMP_InvInSel2(x) (0) @@ -247,6 +283,7 @@ typedef enum #endif #define IS_CMP_InvInputSelection(x) ((x == CMP_EXTERNAL_CN_IN) || (x == CMP_SCALER_CN_IN) || IS_CMP_InvInSel2(x)) +#endif /* Definitions of CMP Hysteresis Level Selection */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h index 0ee8ba77d71..d3b2c901803 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_flash.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_flash.h - * @version $Rev:: 5496 $ - * @date $Date:: 2021-07-19 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the FLASH library. ************************************************************************************************************* * @attention @@ -97,8 +97,13 @@ typedef struct #if (LIBCFG_FMC_WAIT_STATE_2) #define FLASH_WAITSTATE_2 (0x00000003) /* FLASH two wait state */ #endif +#if (LIBCFG_FMC_WAIT_STATE_3) +#define FLASH_WAITSTATE_3 (0x00000004) /* FLASH three wait state */ +#endif -#if (LIBCFG_FMC_WAIT_STATE_2) +#if (LIBCFG_FMC_WAIT_STATE_3) +#define FLASH_WAITSTATE_MAX (FLASH_WAITSTATE_3) +#elif (LIBCFG_FMC_WAIT_STATE_2) #define FLASH_WAITSTATE_MAX (FLASH_WAITSTATE_2) #else #define FLASH_WAITSTATE_MAX (FLASH_WAITSTATE_1) @@ -159,7 +164,7 @@ void FLASH_PrefetchBufferCmd(ControlStatus NewState); #if (LIBCFG_FMC_BRANCHCACHE) void FLASH_BranchCacheCmd(ControlStatus NewState); #endif -void FLASH_SetRemappingMode(FLASH_Vector RemapMode); +void FLASH_SetRemappingMode(FLASH_Vector FLASH_BOOT_x); FLASH_State FLASH_ErasePage(u32 PageAddress); FLASH_State FLASH_EraseOptionByte(void); FLASH_State FLASH_MassErase(void); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h index 42f274c4e7c..8d0bc22df99 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_gpio.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_gpio.h - * @version $Rev:: 7115 $ - * @date $Date:: 2023-08-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the GPIO and AFIO library. ************************************************************************************************************* * @attention @@ -166,7 +166,15 @@ typedef enum #else #define AFIO_FUN_LEDC AFIO_MODE_14 /*!< AFIO mode LEDC */ #endif +#if ((LIBCFG_CMP) && (LIBCFG_OPA)) +#define AFIO_FUN_CMP AFIO_FUN_CMP_OPA /*!< AFIO mode CMP */ +#define AFIO_FUN_OPA AFIO_FUN_CMP_OPA /*!< AFIO mode OPA */ +#elif ((LIBCFG_CMP) && (LIBCFG_PGA)) +#define AFIO_FUN_CMP AFIO_FUN_CMP_PGA /*!< AFIO mode CMP */ +#define AFIO_FUN_PGA AFIO_FUN_CMP_PGA /*!< AFIO mode PGA */ +#elif (LIBCFG_CMP) #define AFIO_FUN_CMP AFIO_MODE_3 /*!< AFIO mode CMP */ +#endif #define AFIO_FUN_MCTM_GPTM AFIO_MODE_4 /*!< AFIO mode MCTM/GPTM */ #if (LIBCFG_AFIO_SCTM_MODE4) #define AFIO_FUN_SCTM AFIO_MODE_4 /*!< AFIO mode SCTM */ @@ -184,7 +192,11 @@ typedef enum #define AFIO_FUN_USART_UART AFIO_MODE_6 /*!< AFIO mode USART/UART */ #define AFIO_FUN_I2C AFIO_MODE_7 /*!< AFIO mode I2C */ #define AFIO_FUN_SCI AFIO_MODE_8 /*!< AFIO mode SCI */ +#if ((LIBCFG_CMP) && (LIBCFG_OPA)) #define AFIO_FUN_CMP_OPA AFIO_MODE_8 /*!< AFIO mode CMP/OPA */ +#elif ((LIBCFG_CMP) && (LIBCFG_PGA)) +#define AFIO_FUN_CMP_PGA AFIO_MODE_8 /*!< AFIO mode CMP/PGA */ +#endif #define AFIO_FUN_EBI AFIO_MODE_9 /*!< AFIO mode EBI */ #define AFIO_FUN_I2S AFIO_MODE_10 /*!< AFIO mode I2S */ #define AFIO_FUN_CAN AFIO_MODE_12 /*!< AFIO mode CAN */ @@ -465,7 +477,7 @@ void GPIO_PullResistorConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, GP void GPIO_InputConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, ControlStatus Cmd); void GPIO_DriveConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, GPIO_DV_Enum GPIO_DV_nMA); void GPIO_OpenDrainConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, ControlStatus Cmd); -#if LIBCFG_GPIO_SINK_CURRENT_ENHANCED +#if (LIBCFG_GPIO_SINK_CURRENT_ENHANCED) void GPIO_SinkConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_n, ControlStatus Cmd); #endif FlagStatus GPIO_ReadInBit(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_n); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h index 1f822f93d64..af864739f4b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_i2c.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_i2c.h - * @version $Rev:: 7104 $ - * @date $Date:: 2023-08-08 #$ + * @version $Rev:: 7698 $ + * @date $Date:: 2024-04-15 #$ * @brief The header file of the I2C library. ************************************************************************************************************* * @attention @@ -347,7 +347,7 @@ typedef enum #define SEQ_FILTER_2_PCLK ((u32)0x00008000) #define IS_I2C_SEQ_FILTER_MASK(CONFIG) ((CONFIG == SEQ_FILTER_DISABLE) || \ - (CONFIG == SEQ_FILTER_1_PCLK) || \ + (CONFIG == SEQ_FILTER_1_PCLK) || \ (CONFIG == SEQ_FILTER_2_PCLK)) /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h index b04cdb33a48..d49a8a111d3 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_lib.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_lib.h - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 7924 $ + * @date $Date:: 2024-08-07 #$ * @brief The header file includes all the header files of the libraries. ************************************************************************************************************* * @attention @@ -34,8 +34,8 @@ #endif /* Settings ------------------------------------------------------------------------------------------------*/ -#define HT32_FWLIB_VER (0x01009001) -#define HT32_FWLIB_SVN (0x7446) +#define HT32_FWLIB_VER (0x01014003) +#define HT32_FWLIB_SVN (0x8294) #if defined(USE_HT32F52220_30) #include "ht32f52220_30_libcfg.h" @@ -179,6 +179,10 @@ void assert_error(u8* file, u32 line); #include "ht32f5xxxx_cmp.h" #endif +#if _CORDIC && LIBCFG_CORDIC + #include "ht32f66xxx_cordic.h" +#endif + #if _CRC && LIBCFG_CRC #include "ht32f5xxxx_crc.h" #endif @@ -253,6 +257,14 @@ void assert_error(u8* file, u32 line); #include "ht32f5xxxx_pdma.h" #endif +#if _PGA && LIBCFG_PGA + #include "ht32f65xxx_66xxx_pga.h" +#endif + +#if _PID && LIBCFG_PID + #include "ht32f66xxx_pid.h" +#endif + #if _PWRCU #include "ht32f5xxxx_pwrcu.h" #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h index cbea7b628ba..42da0d55889 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_mctm.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_mctm.h - * @version $Rev:: 5258 $ - * @date $Date:: 2021-02-04 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the MCTM library. ************************************************************************************************************* * @attention @@ -75,7 +75,7 @@ typedef union /* Definitions of CHBRKCTR */ unsigned long Break0 :1; // BK0E unsigned long Break0Polarity :1; // BK0P - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) unsigned long Break1 :1; // BK1E unsigned long Break1Polarity :1; // BK1E #else @@ -84,7 +84,7 @@ typedef union #endif unsigned long :1; // CHMOE unsigned long AutomaticOutput :1; // CHAOE - #if (LIBCFG_TM_65232) + #if (LIBCFG_TM_BK_FROM_CMP) unsigned long Break0FromCMP0 :1; // BK0CMP0 unsigned long Break0FromCMP1 :1; // BK0CMP1 #else @@ -92,7 +92,7 @@ typedef union unsigned long :1; #endif - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) unsigned long Break0EventCount :2; // BK0FN unsigned long Break0FDiv :2; // BK0FF unsigned long Break1EventCount :2; // BK1FN @@ -103,11 +103,11 @@ typedef union #endif unsigned long LockLevel :2; // LOCKLV - unsigned long DeglitchFilte :1; // GFSEL + unsigned long DeglitchFilter :1; // GFSEL unsigned long :1; unsigned long OSSIState :1; // CHOSSI unsigned long OSSRState :1; // CHOSSR - #if (LIBCFG_TM_65232) + #if (LIBCFG_TM_BK_FROM_CMP) unsigned long Break1FromCMP0 :1; // BK1CMP0 unsigned long Break1FromCMP1 :1; // BK1CMP1 #else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h index 1dbea97ba3f..35cba593cda 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pdma.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_pdma.h - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the PDMA library. ************************************************************************************************************* * @attention @@ -134,7 +134,7 @@ typedef struct #define PDMA_DAC1_CH1 PDMA_CH5 /*!< DAC1 CH1 PDMA channel number */ #endif -#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F0006) || defined(USE_HT32F61244_45) +#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F0006) || defined(USE_HT32F61244_45) || defined(USE_HT32F66242) || defined (USE_HT32F66246) #define PDMA_SPI0_RX PDMA_CH4 /*!< SPI0_RX PDMA channel number */ #define PDMA_SPI0_TX PDMA_CH5 /*!< SPI0_TX PDMA channel number */ #elif defined(USE_HT32F57342_52) || defined(USE_HT32F52357_67) || defined(USE_HT32F67041_51) || defined(USE_HT32F52234_44) @@ -196,6 +196,7 @@ typedef struct #endif #endif +#if (LIBCFG_I2C2) #if defined(USE_HT32F52243_53) || defined(USE_HT32F54243_53) #define PDMA_I2C2_RX PDMA_CH0 /*!< I2C2_RX PDMA channel number */ #define PDMA_I2C2_TX PDMA_CH1 /*!< I2C2_TX PDMA channel number */ @@ -203,6 +204,7 @@ typedef struct #define PDMA_I2C2_RX PDMA_CH4 /*!< I2C2_RX PDMA channel number */ #define PDMA_I2C2_TX PDMA_CH5 /*!< I2C2_TX PDMA channel number */ #endif +#endif #if defined(USE_HT32F52342_52) || defined(USE_HT32F5826) || defined(USE_HT32F57342_52) || defined(USE_HT32F52357_67) #define PDMA_SCI0_TX PDMA_CH5 /*!< SCI0_TX PDMA channel number */ @@ -228,7 +230,7 @@ typedef struct #if (LIBCFG_NO_GPTM0) #else -#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) +#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F66242) || defined (USE_HT32F66246) #define PDMA_GPTM0_CH1 PDMA_CH0 /*!< GPTM0_CH1 PDMA channel number */ #define PDMA_GPTM0_CH2 PDMA_CH1 /*!< GPTM0_CH2 PDMA channel number */ #define PDMA_GPTM0_CH0 PDMA_CH2 /*!< GPTM0_CH0 PDMA channel number */ @@ -254,7 +256,7 @@ typedef struct #define PDMA_GPTM1_TRIG PDMA_CH5 /*!< GPTM1_TRIG PDMA channel number */ #endif -#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) +#if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) || defined(USE_HT32F66242) || defined (USE_HT32F66246) #define PDMA_SCTM0_CH0 PDMA_CH0 /*!< SCTM0_CH0 PDMA channel number */ #define PDMA_SCTM0_CH1 PDMA_CH1 /*!< SCTM0_CH1 PDMA channel number */ #define PDMA_SCTM1_CH0 PDMA_CH2 /*!< SCTM1_CH0 PDMA channel number */ @@ -318,6 +320,11 @@ typedef struct #define PDMA_MIDI_OUT PDMA_CH4 /*!< MIDI_OUT PDMA channel number */ #endif +#if (LIBCFG_CORDIC) +#define PDMA_CORDIC_WR PDMA_CH4 /*!< CORDIC_WR PDMA channel number */ +#define PDMA_CORDIC_RD PDMA_CH5 /*!< CORDIC_RD PDMA channel number */ +#endif + /* flag */ #define PDMA_FLAG_GE (1UL << 0) /*!< PDMA channel global event flag */ #define PDMA_FLAG_BE (1UL << 1) /*!< PDMA channel block end flag */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h index a98fb162890..45eba73ee5a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_pwrcu.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_pwrcu.h - * @version $Rev:: 7054 $ - * @date $Date:: 2023-07-24 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the Power Control Unit library. ************************************************************************************************************* * @attention @@ -64,6 +64,7 @@ typedef enum PWRCU_WAKEUP_PIN_1 #endif } PWRCU_WUP_Enum; + /** * @brief Wakeup pin trigger type selection */ @@ -82,6 +83,8 @@ typedef enum PWRCU_TIMEOUT, /*!< Time out */ PWRCU_ERROR /*!< Error */ } PWRCU_Status; + +#if (!LIBCFG_PWRCU_NO_DS2_MODE) /** * @brief DMOS status */ @@ -91,6 +94,8 @@ typedef enum PWRCU_DMOS_STS_OFF, /*!< DMOS off */ PWRCU_DMOS_STS_OFF_BY_BODRESET /*!< DMOS off caused by brow out reset */ } PWRCU_DMOSStatus; +#endif + /** * @brief LVD level selection */ @@ -105,6 +110,7 @@ typedef enum PWRCU_LVDS_LV7 = 0x00440000, /*!< LVD level 7 */ PWRCU_LVDS_LV8 = 0x00460000 /*!< LVD level 8 */ } PWRCU_LVDS_Enum; + #if (LIBCFG_PWRCU_VDD_5V) #define PWRCU_LVDS_2V65 PWRCU_LVDS_LV1 #define PWRCU_LVDS_2V85 PWRCU_LVDS_LV2 @@ -133,6 +139,7 @@ typedef enum #define PWRCU_LVDS_2V95 PWRCU_LVDS_LV7 #define PWRCU_LVDS_3V15 PWRCU_LVDS_LV8 #endif + /** * @brief BOD reset or interrupt selection */ @@ -141,6 +148,7 @@ typedef enum PWRCU_BODRIS_RESET = 0, /*!< Reset the whole chip */ PWRCU_BODRIS_INT = 1, /*!< Assert interrupt */ } PWRCU_BODRIS_Enum; + /** * @brief Sleep entry instruction selection */ @@ -149,6 +157,7 @@ typedef enum PWRCU_SLEEP_ENTRY_WFE = 0, /*!< Sleep then wait for event */ PWRCU_SLEEP_ENTRY_WFI /*!< Sleep then wait for interrupt */ } PWRCU_SLEEP_ENTRY_Enum; + #if (LIBCFG_BAKREG) /** * @brief Backup register selection @@ -167,6 +176,8 @@ typedef enum PWRCU_BAKREG_9 } PWRCU_BAKREG_Enum; #endif + +#if (LIBCFG_PWRCU_V15_READY_SOURCE) /** * @brief Vdd15 power good source selection */ @@ -175,6 +186,8 @@ typedef enum PWRCU_V15RDYSC_V33ISO = 0, /*!< Vdd15 power good source come from BK_ISO bit in CKCU unit */ PWRCU_V15RDYSC_V15POR /*!< Vdd15 power good source come from Vdd15 power on reset */ } PWRCU_V15RDYSC_Enum; +#endif + /** * @brief LDO operation mode selection */ @@ -183,6 +196,7 @@ typedef enum PWRCU_LDO_NORMAL = 0, /*!< The LDO is operated in normal current mode */ PWRCU_LDO_LOWCURRENT /*!< The LDO is operated in low current mode */ } PWRCU_LDOMODE_Enum; + #if defined(USE_HT32F52342_52) || defined(USE_HT32F5826) /** * @brief HSI ready counter bit length selection @@ -195,6 +209,7 @@ typedef enum PWRCU_HSIRCBL_7 /*!< 7 bits (Default) */ } PWRCU_HSIRCBL_Enum; #endif + #if (LIBCFG_PWRCU_VREG) /** * @brief VREG output voltage selection @@ -210,6 +225,7 @@ typedef enum PWRCU_VREG_3V0 = 0x04000000, /*!< VREG output voltage is 3.0 V */ PWRCU_VREG_1V8 = 0x0C000000, /*!< VREG output voltage is 1.8 V */ } PWRCU_VREG_VOLT_Enum; + /** * @brief VREG operation mode */ @@ -220,6 +236,7 @@ typedef enum PWRCU_VREG_BYPASS = 0x02000000, /*!< VREG is bypassed */ } PWRCU_VREG_MODE_Enum; #endif + /** * @} */ @@ -254,17 +271,23 @@ typedef enum /* check PWRCU_BODRIS parameter */ #define IS_PWRCU_BODRIS(x) ((x == PWRCU_BODRIS_RESET) || (x == PWRCU_BODRIS_INT)) +#if defined(USE_HT32F52342_52) || defined(USE_HT32F5826) /* check PWRCU_HSIRCBL parameter */ #define IS_PWRCU_HSIRCBL(x) (x <= 3) +#endif /* check PWRCU_SLEEP_ENTRY parameter */ #define IS_PWRCU_SLEEP_ENTRY(x) ((x == PWRCU_SLEEP_ENTRY_WFI) || (x == PWRCU_SLEEP_ENTRY_WFE)) +#if (LIBCFG_BAKREG) /* check PWRCU_BAKREG parameter */ #define IS_PWRCU_BAKREG(x) (x < 10) +#endif +#if (LIBCFG_PWRCU_V15_READY_SOURCE) /* check PWRCU_V15RDY_SRC parameter */ #define IS_PWRCU_V15RDYSC(x) ((x == PWRCU_V15RDYSC_V33ISO) || (x == PWRCU_V15RDYSC_V15POR)) +#endif /* check PWRCU_LDOMODE parameter */ #define IS_PWRCU_LDOMODE(x) ((x == PWRCU_LDO_NORMAL) || (x == PWRCU_LDO_LOWCURRENT)) @@ -324,10 +347,12 @@ void PWRCU_WriteBackupRegister(PWRCU_BAKREG_Enum BAKREGx, u32 DATA); #endif void PWRCU_Sleep(PWRCU_SLEEP_ENTRY_Enum SleepEntry); void PWRCU_DeepSleep1(PWRCU_SLEEP_ENTRY_Enum SleepEntry); +#if (!LIBCFG_PWRCU_NO_DS2_MODE) void PWRCU_DeepSleep2(PWRCU_SLEEP_ENTRY_Enum SleepEntry); #if !defined(USE_HT32F52220_30) void PWRCU_DeepSleep2Ex(PWRCU_SLEEP_ENTRY_Enum SleepEntry); #endif +#endif #if (!LIBCFG_PWRCU_NO_PD_MODE) void PWRCU_PowerDown(void); #endif @@ -338,8 +363,10 @@ void PWRCU_BODCmd(ControlStatus NewState); void PWRCU_BODRISConfig(PWRCU_BODRIS_Enum Selection); FlagStatus PWRCU_GetLVDFlagStatus(void); FlagStatus PWRCU_GetBODFlagStatus(void); +#if (!LIBCFG_PWRCU_NO_DS2_MODE) PWRCU_DMOSStatus PWRCU_GetDMOSStatus(void); void PWRCU_DMOSCmd(ControlStatus NewState); +#endif #if (LIBCFG_PWRCU_V15_READY_SOURCE) void PWRCU_V15RDYSourceConfig(PWRCU_V15RDYSC_Enum Sel); #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h index 60eabde7800..907452261ae 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rstcu.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_rstcu.h - * @version $Rev:: 7115 $ - * @date $Date:: 2023-08-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the Reset Control Unit library. ************************************************************************************************************* * @attention @@ -87,7 +87,7 @@ typedef union unsigned long :1; // Bit 14 unsigned long AES :1; // Bit 15 - #ifdef USE_HT32F65230_40 + #if defined(USE_HT32F65230_40) || defined(USE_HT32F65232) unsigned long DIV :1; // Bit 16 #else unsigned long :1; // Bit 16 @@ -100,7 +100,7 @@ typedef union unsigned long :1; // Bit 22 unsigned long :1; // Bit 23 - #ifndef USE_HT32F65230_40 + #if !defined(USE_HT32F65230_40) && !defined(USE_HT32F65232) unsigned long DIV :1; // Bit 24 #else unsigned long :1; // Bit 24 @@ -108,8 +108,8 @@ typedef union unsigned long QSPI :1; // Bit 25 unsigned long RF :1; // Bit 26 unsigned long :1; // Bit 27 - unsigned long :1; // Bit 28 - unsigned long :1; // Bit 29 + unsigned long CORDIC :1; // Bit 28 + unsigned long PID0 :1; // Bit 29 unsigned long :1; // Bit 30 unsigned long :1; // Bit 31 @@ -176,8 +176,11 @@ typedef union unsigned long :1; // Bit 20 unsigned long DAC0 :1; // Bit 21 unsigned long CMP :1; // Bit 22 + #if defined(USE_HT32F66242) || defined(USE_HT32F66246) + unsigned long PGA :1; // Bit 23 + #else unsigned long OPA :1; // Bit 23 - + #endif unsigned long ADC0 :1; // Bit 24 unsigned long ADC1 :1; // Bit 25 unsigned long :1; // Bit 26 diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h index 0677ae67176..3544ae37442 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_rtc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_rtc.h - * @version $Rev:: 7278 $ - * @date $Date:: 2023-10-04 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the RTC library. ************************************************************************************************************* * @attention @@ -60,6 +60,8 @@ typedef enum RTC_SRC_LSE /*!< Low speed external 32768 Hz clock */ #endif } RTC_SRC_Enum; + +#if (LIBCFG_LSE) /** * @brief Selection of RTC LSE startup mode */ @@ -68,6 +70,7 @@ typedef enum RTC_LSESM_NORMAL = 0, /*!< Little power consumption but longer startup time. */ RTC_LSESM_FAST /*!< Shortly startup time but higher power consumption. */ } RTC_LSESM_Enum; +#endif /** * @brief Selection of RTC prescaler */ @@ -107,7 +110,7 @@ typedef enum RTC_ROWM_LEVEL /*!< Level mode. */ } RTC_ROWM_Enum; /** - * @brief Waveform mode of RTC output + * @brief Event selection of RTC output */ typedef enum { @@ -166,10 +169,13 @@ typedef enum #define IS_RTC_SRC_LSE(x) (0) #endif #define IS_RTC_SRC(x) ((x == RTC_SRC_LSI) || IS_RTC_SRC_LSE(x)) + +#if (LIBCFG_LSE) /** * @brief Used to check RTC_LSESM_Enum parameter */ #define IS_RTC_LSESM(x) ((x == RTC_LSESM_NORMAL) || (x == RTC_LSESM_FAST)) +#endif /** * @brief Used to check RTC_RPRE_Enum parameter */ @@ -220,7 +226,9 @@ void RTC_ClockSourceConfig(RTC_SRC_Enum Source); #if (LIBCFG_RTC_LSI_LOAD_TRIM) void RTC_LSILoadTrimData(void); #endif +#if (LIBCFG_LSE) void RTC_LSESMConfig(RTC_LSESM_Enum Mode); +#endif void RTC_LSECmd(ControlStatus NewState); void RTC_CMPCLRCmd(ControlStatus NewState); void RTC_SetPrescaler(RTC_RPRE_Enum Psc); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h index eb0d814f23f..a94a2118f2d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_tm.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_tm.h - * @version $Rev:: 7319 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the TM library. ************************************************************************************************************* * @attention @@ -103,7 +103,7 @@ typedef enum TM_CHPSC_4 = 0x00080000, /*!< TM channel capture is done once every 4 event */ TM_CHPSC_8 = 0x000C0000 /*!< TM channel capture is done once every 8 event */ } TM_CHPSC_Enum; -#if (LIBCFG_TM_652XX_V1) +#if (LIBCFG_TM_65X_66X_V1) /** * @brief Enumeration of TM channel Filter (Fsampling) Clock Divider. */ @@ -176,7 +176,7 @@ typedef enum TM_CKDIV_OFF = 0x0000, /*!< fDTS = fCLKIN */ TM_CKDIV_2 = 0x0100, /*!< fDTS = fCLKIN / 2 */ TM_CKDIV_4 = 0x0200, /*!< fDTS = fCLKIN / 4 */ - #if (LIBCFG_TM_652XX_V1 || LIBCFG_TM_CKDIV_8) + #if (LIBCFG_TM_65X_66X_V1 || LIBCFG_TM_CKDIV_8) TM_CKDIV_8 = 0x0300, /*!< fDTS = fCLKIN / 8 */ #endif } TM_CKDIV_Enum; @@ -237,7 +237,7 @@ typedef enum TM_SMSEL_PAUSE = 0x0500, /*!< Slave pause mode */ TM_SMSEL_TRIGGER = 0x0600, /*!< Slave trigger mode */ TM_SMSEL_STIED = 0x0700, /*!< Rising edge of the selected trigger(STI) clock the counter */ - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) TM_SMSEL_DECODER4 = 0x0800, /*!< Pluse/Direction mode(Counter counts on Ch0, Count up/down on Ch1 */ #endif } TM_SMSEL_Enum; @@ -254,7 +254,7 @@ typedef enum TM_MMSEL_CH1OREF = 0x00050000, /*!< The CH1OREF signal is used as trigger output. */ TM_MMSEL_CH2OREF = 0x00060000, /*!< The CH2OREF signal is used as trigger output. */ TM_MMSEL_CH3OREF = 0x00070000, /*!< The CH3OREF signal is used as trigger output. */ - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) TM_MMSEL_VCLK = 0x000C0000 /*!< The VCLK signal is used as trigger output. */ #endif #if (LIBCFG_PWM_8_CHANNEL) @@ -314,7 +314,7 @@ typedef struct TM_CHP_Enum Polarity; /*!< Channel input polarity refer to \ref TM_CHP_Enum */ TM_CHCCS_Enum Selection; /*!< Channel capture source selection refer to \ref TM_CHCCS_Enum */ TM_CHPSC_Enum Prescaler; /*!< Channel Capture prescaler refer to \ref TM_CHPSC_Enum */ - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) TM_CHFDIV_Enum Fsampling; /*!< Digital filter Fsampling Frequency, it must fDTS/1 ~ fDTS/64 */ #if (LIBCFG_TM_TIFN_5BIT) u8 Event; /*!< Digital filter N-event counter Setting, it must be 0 ~ 31 */ @@ -352,7 +352,7 @@ typedef struct #define TM_INT_TEV 0x0400 /*!< Trigger interrupt */ #define TM_INT_BRKEV 0x0800 /*!< Break interrupt */ -#if (LIBCFG_TM_652XX_V1) +#if (LIBCFG_TM_65X_66X_V1) #define MCTM_INT_CH0CD 0x100000 /*!< Channel 0 Count-Down compare interrupt */ #define MCTM_INT_CH1CD 0x200000 /*!< Channel 1 Count-Down compare interrupt */ #define MCTM_INT_CH2CD 0x400000 /*!< Channel 2 Count-Down compare interrupt */ @@ -365,7 +365,7 @@ typedef struct #define MCTM_INT_OVER 0x2000 /*!< Counter overflow interrupt */ #define MCTM_INT_UNDER 0x4000 /*!< Counter underflow Interrupt */ -#if (LIBCFG_TM_65232) +#if (LIBCFG_TM_RECCDI) #define MCTM_INT_RECCDIF 0x8000 /*!< CCIF or CDIF Interrupt flag control by REPR */ #endif @@ -512,11 +512,11 @@ typedef struct * @brief Used to check parameter of the output compare mode. */ #define IS_TM_OM_CMP(x) (((x) == TM_OM_MATCH_NOCHANGE) || \ - ((x) == TM_OM_MATCH_INACTIVE) || \ - ((x) == TM_OM_MATCH_ACTIVE) || \ - ((x) == TM_OM_MATCH_TOGGLE) || \ - ((x) == TM_OM_PWM1) || \ - ((x) == TM_OM_PWM2)) + ((x) == TM_OM_MATCH_INACTIVE) || \ + ((x) == TM_OM_MATCH_ACTIVE) || \ + ((x) == TM_OM_MATCH_TOGGLE) || \ + ((x) == TM_OM_PWM1) || \ + ((x) == TM_OM_PWM2)) /** * @brief Used to check parameter of the output mode. */ @@ -586,7 +586,7 @@ typedef struct /** * @brief Used to check parameter of the counter mode. */ -#define IS_TM_CNT_MODE(x) ((x == TM_CNT_MODE_UP) || \ +#define IS_TM_CNT_MODE(x) ((x == TM_CNT_MODE_UP) || \ (x == TM_CNT_MODE_CA1) || \ (x == TM_CNT_MODE_CA2) || \ (x == TM_CNT_MODE_CA3) || \ @@ -606,24 +606,24 @@ typedef struct /** * @brief Used to check parameter of the channel input selection. */ -#define IS_TM_CHCCS(x) ((x == TM_CHCCS_DIRECT) || \ - (x == TM_CHCCS_INDIRECT) || \ - (x == TM_CHCCS_TRCED)) +#define IS_TM_CHCCS(x) ((x == TM_CHCCS_DIRECT) || \ + (x == TM_CHCCS_INDIRECT) || \ + (x == TM_CHCCS_TRCED)) /** * @brief Used to check parameter of the channel capture prescaler. */ #define IS_TM_CHPSC(x) ((x == TM_CHPSC_OFF) || \ - (x == TM_CHPSC_2) || \ - (x == TM_CHPSC_4) || \ - (x == TM_CHPSC_8)) + (x == TM_CHPSC_2) || \ + (x == TM_CHPSC_4) || \ + (x == TM_CHPSC_8)) #if 0 /** * @brief Used to check parameter of the ETI prescaler. */ #define IS_TM_ETIPSC(x) ((x == TM_ETIPSC_OFF) || \ - (x == TM_ETIPSC_2) || \ - (x == TM_ETIPSC_4) || \ - (x == TM_ETIPSC_8)) + (x == TM_ETIPSC_2) || \ + (x == TM_ETIPSC_4) || \ + (x == TM_ETIPSC_8)) #endif /** * @brief Used to check parameter of the TM interrupt. @@ -804,7 +804,7 @@ typedef struct /** * @brief Used to check value of TM digital filter. */ -#if (LIBCFG_TM_652XX_V1) +#if (LIBCFG_TM_65X_66X_V1) #define IS_TM_FILTER(x) (x <= 0xFF) #else #define IS_TM_FILTER(x) (x <= 0xF) @@ -886,7 +886,9 @@ void TM_DecoderConfig(HT_TM_TypeDef* TMx, TM_SMSEL_Enum DecoderMod, TM_CHP_Enum void TM_ForcedOREF(HT_TM_TypeDef* TMx, TM_CH_Enum TM_CH_n, TM_OM_Enum ForcedAction); void TM_CRRPreloadCmd(HT_TM_TypeDef* TMx, ControlStatus NewState); void TM_CHCCRPreloadConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus NewState); +#if 0 // M0+ not supported void TM_ClearOREFConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus NewState); +#endif void TM_ChPolarityConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, TM_CHP_Enum Pol); void TM_ImmActiveConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus NewState); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h index ae5fdd1c5e9..ed96545ac7f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f5xxxx_wdt.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_wdt.h - * @version $Rev:: 1704 $ - * @date $Date:: 2017-08-17 #$ + * @version $Rev:: 7779 $ + * @date $Date:: 2024-06-24 #$ * @brief The header file of the WDT library. ************************************************************************************************************* * @attention @@ -72,14 +72,17 @@ /* WDT runs or halts in sleep and deep sleep1 mode */ /* WDT WDTSHLT mask */ -#define MODE0_WDTSHLT_BOTH ((u32)0x00000000) -#define MODE0_WDTSHLT_SLEEP ((u32)0x00004000) -#define MODE0_WDTSHLT_HALT ((u32)0x00008000) +#define WDT_SLEEP_HALT_NONE ((u32)0x00000000) +#define WDT_SLEEP_HALT_DEEPSLEEP ((u32)0x00004000) +#define WDT_SLEEP_HALT_ALL ((u32)0x00008000) -#define IS_WDT_WDTSHLT_MODE(WDT_Mode) ((WDT_Mode == MODE0_WDTSHLT_BOTH) || \ - (WDT_Mode == MODE0_WDTSHLT_SLEEP) || \ - (WDT_Mode == MODE0_WDTSHLT_HALT)) +#define MODE0_WDTSHLT_BOTH WDT_SLEEP_HALT_NONE +#define MODE0_WDTSHLT_SLEEP WDT_SLEEP_HALT_DEEPSLEEP +#define MODE0_WDTSHLT_HALT WDT_SLEEP_HALT_ALL +#define IS_WDT_WDTSHLT_MODE(WDT_Mode) ((WDT_Mode == WDT_SLEEP_HALT_NONE) || \ + (WDT_Mode == WDT_SLEEP_HALT_DEEPSLEEP) || \ + (WDT_Mode == WDT_SLEEP_HALT_ALL)) /* WDT Flag */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65230_40_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65230_40_libcfg.h index bbf4192d74d..df5f4dfa9f3 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65230_40_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65230_40_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65230_40_libcfg.h - * @version $Rev:: 7184 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -56,12 +56,13 @@ #define LIBCFG_BFTM1 (1) #define LIBCFG_CKCU_ATM_V01 (1) #define LIBCFG_CKCU_NO_ADCPRE_DIV1 (1) +#define LIBCFG_CKCU_NO_LPCR (1) #define LIBCFG_CKCU_PLLSRCDIV (1) #define LIBCFG_CKCU_SYS_CK_60M (1) #define LIBCFG_CMP (1) #define LIBCFG_CMP2 (1) #define LIBCFG_CMP_NOSCALER_SRC (1) -#define LIBCFG_CMP_65x_VER (1) +#define LIBCFG_CMP_65x_66x_VER (1) #define LIBCFG_CRC (1) #define LIBCFG_DIV (1) #define LIBCFG_EXTI_4_9_GROUP (1) @@ -75,6 +76,7 @@ #define LIBCFG_MCTM_UEV1DIS (1) #define LIBCFG_PWRCU_NO_PD_MODE (1) #define LIBCFG_PWRCU_NO_PDF (1) +#define LIBCFG_PWRCU_NO_DS2_MODE (1) #define LIBCFG_PWRCU_NO_VDDPORF (1) #define LIBCFG_NO_PWRCU_TEST_REG (1) #define LIBCFG_OPA (1) @@ -85,7 +87,7 @@ #define LIBCFG_SCTM1 (1) #define LIBCFG_SCTM2 (1) #define LIBCFG_SCTM3 (1) -#define LIBCFG_TM_652XX_V1 (1) +#define LIBCFG_TM_65X_66X_V1 (1) #define LIBCFG_PWRCU_VDD_5V (1) #define LIBCFG_PWRCU_NO_PORF (1) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h index 8787c994132..6909553bc41 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65232_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65232_libcfg.h - * @version $Rev:: 6932 $ - * @date $Date:: 2023-05-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -52,11 +52,12 @@ #define LIBCFG_BFTM1 (1) #define LIBCFG_CKCU_ATM_V01 (1) #define LIBCFG_CKCU_NO_ADCPRE_DIV1 (1) +#define LIBCFG_CKCU_NO_LPCR (1) #define LIBCFG_CKCU_PLLSRCDIV (1) #define LIBCFG_CKCU_SYS_CK_60M (1) #define LIBCFG_CMP (1) #define LIBCFG_CMP_NOSCALER_SRC (1) -#define LIBCFG_CMP_65x_VER (1) +#define LIBCFG_CMP_65x_66x_VER (1) #define LIBCFG_CMP_POS_INPUT_SEL_V2 (1) #define LIBCFG_CMP_CO (1) #define LIBCFG_CMP_SCALER_8BIT (1) @@ -72,6 +73,7 @@ #define LIBCFG_MCTM_UEV1DIS (1) #define LIBCFG_PWRCU_NO_PD_MODE (1) #define LIBCFG_PWRCU_NO_PDF (1) +#define LIBCFG_PWRCU_NO_DS2_MODE (1) #define LIBCFG_PWRCU_NO_VDDPORF (1) #define LIBCFG_NO_PWRCU_TEST_REG (1) #define LIBCFG_OPA (1) @@ -81,10 +83,9 @@ #define LIBCFG_SCTM1 (1) #define LIBCFG_SCTM2 (1) #define LIBCFG_SCTM3 (1) -#define LIBCFG_TM_652XX_V1 (1) -#define LIBCFG_TM_65232 (1) +#define LIBCFG_TM_65X_66X_V1 (1) +#define LIBCFG_TM_BK_FROM_CMP (1) #define LIBCFG_TM_TIFN_5BIT (1) #define LIBCFG_PWRCU_VDD_5V (1) -#define LIBCFG_PWRCU_NO_PORF (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_adc.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_adc.h index 0b0313fc40c..35f8689af84 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_adc.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_adc.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_adc.h - * @version $Rev:: 7058 $ - * @date $Date:: 2023-07-27 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the ADC library. ************************************************************************************************************* * @attention @@ -67,6 +67,7 @@ ((HP_MODE) == CONTINUOUS_MODE) || \ ((HP_MODE) == DISCONTINUOUS_MODE)) +#if (LIBCFG_ADC1) #define DUAL_INDEPENDENT (0x00000000) #define DUAL_CASCADE_REGULAR (0x00000001) #define DUAL_CASCADE_REGULAR_H_PRIORITY (0x00000003) @@ -74,6 +75,7 @@ #define IS_ADC_DUAL_MODE(DUAL_MODE) (((DUAL_MODE) == DUAL_INDEPENDENT) || \ ((DUAL_MODE) == DUAL_CASCADE_REGULAR) || \ ((DUAL_MODE) == DUAL_CASCADE_REGULAR_H_PRIORITY)) +#endif #if (LIBCFG_ADC_CH_65232) #define ADC_CH_0 (0) @@ -106,6 +108,44 @@ ((CHANNEL) == ADC_CH_4) || ((CHANNEL) == ADC_CH_5) || \ ((CHANNEL) == ADC_CH_6) || ((CHANNEL) == ADC_CH_7) || \ ((CHANNEL) == ADC_CH_OPA0)) +#elif (LIBCFG_ADC_CH_66XXX_V1) +#define ADC_CH_0 (0) +#define ADC_CH_1 (1) +#define ADC_CH_2 (2) +#define ADC_CH_3 (3) +#define ADC_CH_4 (4) +#define ADC_CH_5 (5) +#define ADC_CH_6 (6) +#define ADC_CH_7 (7) +#define ADC_CH_8 (8) +#define ADC_CH_9 (9) +#define ADC_CH_10 (10) +#define ADC_CH_11 (11) +#define ADC_CH_PGA0O (12) +#define ADC_CH_PGA1O (13) +#define ADC_CH_PGA2O (14) +#define ADC_CH_PGA3O (15) +#define ADC_CH_BANDGAP (16) +#define ADC_CH_MVDDA (17) + +#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_CH_0) || ((CHANNEL) == ADC_CH_1) || \ + ((CHANNEL) == ADC_CH_2) || ((CHANNEL) == ADC_CH_3) || \ + ((CHANNEL) == ADC_CH_4) || ((CHANNEL) == ADC_CH_5) || \ + ((CHANNEL) == ADC_CH_6) || ((CHANNEL) == ADC_CH_7) || \ + ((CHANNEL) == ADC_CH_8) || ((CHANNEL) == ADC_CH_9) || \ + ((CHANNEL) == ADC_CH_10) || ((CHANNEL) == ADC_CH_11) || \ + ((CHANNEL) == ADC_CH_PGA0O) || ((CHANNEL) == ADC_CH_PGA1O) || \ + ((CHANNEL) == ADC_CH_PGA2O) || ((CHANNEL) == ADC_CH_PGA3O) || \ + ((CHANNEL) == ADC_CH_BANDGAP) || ((CHANNEL) == ADC_CH_MVDDA)) + +#define IS_ADC_INPUT_CHANNEL(CHANNEL) (((CHANNEL) == ADC_CH_0) || ((CHANNEL) == ADC_CH_1) || \ + ((CHANNEL) == ADC_CH_2) || ((CHANNEL) == ADC_CH_3) || \ + ((CHANNEL) == ADC_CH_4) || ((CHANNEL) == ADC_CH_5) || \ + ((CHANNEL) == ADC_CH_6) || ((CHANNEL) == ADC_CH_7) || \ + ((CHANNEL) == ADC_CH_8) || ((CHANNEL) == ADC_CH_9) || \ + ((CHANNEL) == ADC_CH_10) || ((CHANNEL) == ADC_CH_11) || \ + ((CHANNEL) == ADC_CH_PGA0O) || ((CHANNEL) == ADC_CH_PGA1O) || \ + ((CHANNEL) == ADC_CH_PGA2O) || ((CHANNEL) == ADC_CH_PGA3O)) #else #define ADC_CH_0 (0) #define ADC_CH_1 (1) @@ -170,8 +210,14 @@ #define ADC_TRIG_CMP0 ((1UL << 4) | (0UL << 20)) #define ADC_TRIG_CMP1 ((1UL << 4) | (1UL << 20)) +#if (LIBCFG_CMP2) #define ADC_TRIG_CMP2 ((1UL << 4) | (2UL << 20)) +#define IS_ADC_TRIG_CMP2(REGTRIG) ((REGTRIG == ADC_TRIG_CMP2)) +#else +#define IS_ADC_TRIG_CMP2(REGTRIG) (0) +#endif + #define ADC_TRIG_BFTM0 ((1UL << 3) | (0UL << 22) | (0UL << 19)) #define ADC_TRIG_BFTM1 ((1UL << 3) | (0UL << 22) | (1UL << 19)) @@ -225,7 +271,7 @@ ((REGTRIG) == ADC_TRIG_BFTM1) || \ ((REGTRIG) == ADC_TRIG_CMP0) || \ ((REGTRIG) == ADC_TRIG_CMP1) || \ - ((REGTRIG) == ADC_TRIG_CMP2) || \ + (IS_ADC_TRIG_CMP2(REGTRIG)) || \ ((REGTRIG) == ADC_TRIG_EXTI_0) || \ ((REGTRIG) == ADC_TRIG_EXTI_1) || \ ((REGTRIG) == ADC_TRIG_EXTI_2) || \ @@ -256,7 +302,7 @@ #define ADC_INT_DATA_OVERWRITE (0x01000000) #define ADC_INT_HP_DATA_OVERWRITE (0x02000000) -#define IS_ADC_INT(INT) ((((INT) & 0xFCFCFF88) == 0) && ((INT) != 0)) +#define IS_ADC_INT(INT) ((((INT) & 0xFCFCF8F8) == 0) && ((INT) != 0)) #define ADC_FLAG_SINGLE_EOC (0x00000001) @@ -270,7 +316,7 @@ #define ADC_FLAG_DATA_OVERWRITE (0x01000000) #define ADC_FLAG_HP_DATA_OVERWRITE (0x02000000) -#define IS_ADC_FLAG(FLAG) ((((FLAG) & 0xFCFCFF88) == 0) && ((FLAG) != 0)) +#define IS_ADC_FLAG(FLAG) ((((FLAG) & 0xFCFCF8F8) == 0) && ((FLAG) != 0)) #define ADC_REGULAR_DATA0 (0) @@ -289,8 +335,22 @@ #define ADC_HP_DATA1 (1) #define ADC_HP_DATA2 (2) #define ADC_HP_DATA3 (3) +#if (LIBCFG_ADC_HDR_4_11) +#define ADC_HP_DATA4 (4) +#define ADC_HP_DATA5 (5) +#define ADC_HP_DATA6 (6) +#define ADC_HP_DATA7 (7) +#define ADC_HP_DATA8 (8) +#define ADC_HP_DATA9 (9) +#define ADC_HP_DATA10 (10) +#define ADC_HP_DATA11 (11) +#endif +#if (LIBCFG_ADC_HDR_4_11) +#define IS_ADC_HP_DATA(DATA) ((DATA) < 12) +#else #define IS_ADC_HP_DATA(DATA) ((DATA) < 4) +#endif #define ADC_AWD_DISABLE (u8)0x00 @@ -329,20 +389,34 @@ #define IS_ADC_INPUT_SAMPLING_TIME(TIME) ((TIME) <= 255) +#if (!LIBCFG_ADC_NO_OFFSET_REG) #define IS_ADC_OFFSET(OFFSET) ((OFFSET) < 4096) +#endif #define IS_ADC_REGULAR_RANK(RANK) ((RANK) < 8) +#if (LIBCFG_ADC_HDR_4_11) +#define IS_ADC_HP_RANK(RANK) ((RANK) < 12) +#else #define IS_ADC_HP_RANK(RANK) ((RANK) < 4) +#endif #define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 1) && ((LENGTH) <= 8)) #define IS_ADC_REGULAR_SUB_LENGTH(SUB_LENGTH) (((SUB_LENGTH) >= 1) && ((SUB_LENGTH) <= 8)) +#if (LIBCFG_ADC_HCONV_LENGTH_V2) +#define IS_ADC_HP_LENGTH(LENGTH) (((LENGTH) >= 1) && ((LENGTH) <= 8)) +#define IS_ADC_HP_SUB_LENGTH(SUB_LENGTH) (((SUB_LENGTH) >= 1) && ((SUB_LENGTH) <= 8)) +#else #define IS_ADC_HP_LENGTH(LENGTH) (((LENGTH) >= 1) && ((LENGTH) <= 4)) #define IS_ADC_HP_SUB_LENGTH(SUB_LENGTH) (((SUB_LENGTH) >= 1) && ((SUB_LENGTH) <= 4)) +#endif +#if (LIBCFG_ADC_TRIG_DELAY) #define IS_ADC_TRIG_DELAY(DELAY) ((DELAY) < 256) +#endif +#if (!LIBCFG_ADC_NO_OFFSET_REG) typedef enum { ADC_ALIGN_RIGHT = (0 << 14), @@ -350,6 +424,7 @@ typedef enum } ADC_ALIGN_Enum; #define IS_ADC_ALIGN(ALIGN) (((ALIGN) == ADC_ALIGN_RIGHT) || ((ALIGN) == ADC_ALIGN_LEFT)) +#endif /** * @} */ @@ -373,9 +448,11 @@ void ADC_HPChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 Sampl void ADC_HPGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 SubLength); void ADC_HPTrigConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_TRIG_x); +#if (!LIBCFG_ADC_NO_OFFSET_REG) void ADC_ChannelDataAlign(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, ADC_ALIGN_Enum ADC_ALIGN_x); void ADC_ChannelOffsetValue(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u16 OffsetValue); void ADC_ChannelOffsetCmd(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, ControlStatus NewState); +#endif #if (LIBCFG_ADC_TRIG_DELAY) void ADC_TrigDelayConfig(HT_ADC_TypeDef* HT_ADCn, u8 HDelayTime, u8 DelayTime); @@ -397,6 +474,14 @@ void ADC_AWDSingleChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n); void ADC_AWDThresholdsConfig(HT_ADC_TypeDef* HT_ADCn, u16 UPPER, u16 LOWER); void ADC_PDMAConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_PDMA_x, ControlStatus NewState); + +#if (LIBCFG_ADC_IVREF) +void ADC_VREFCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState); +#endif + +#if (LIBCFG_ADC_MVDDA) +void ADC_MVDDACmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState); +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_opa.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_opa.h index f8cfc6cca8c..495ca589231 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_opa.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_opa.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_opa.h - * @version $Rev:: 6911 $ - * @date $Date:: 2023-05-10 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The header file of the OPA library. ************************************************************************************************************* * @attention @@ -57,11 +57,6 @@ typedef struct { u32 OPA_ScalerEnable; u32 OPA_ExternalPinEnable; - #if (LIBCFG_OPA_PGA) - u32 OPA_PGAEnable; - u32 OPA_UnitGainEnable; - u32 OPA_PGAGain; - #endif } OPA_InitTypeDef; /** * @brief Enumeration of OPA PGA Gain. @@ -115,14 +110,6 @@ typedef enum #define OPA_ExternalPin_ENABLE ((u32)0x00000008) #define OPA_ExternalPin_DISABLE ((u32)0x00000000) -/* Definitions of OPA PGA Enable Bit */ -#define OPA_PGA_ENABLE ((u32)0x00000004) -#define OPA_PGA_DISABLE ((u32)0x00000000) - -/* Definitions of OPA UnitGain Enable Bit */ -#define OPA_UNITGAIN_ENABLE ((u32)0x00000002) -#define OPA_UNITGAIN_DISABLE ((u32)0x00000000) - /* Definitions of OPA Output Status */ #define OPA_OUTPUT_HIGH ((u32)0x00000080) #define OPA_OUTPUT_LOW ((u32)0x00000000) @@ -140,19 +127,6 @@ typedef enum #define IS_OPA_ExtPinEnable(x) ((x == OPA_ExternalPin_ENABLE) || (x == OPA_ExternalPin_DISABLE)) -#define IS_OPA_PGAEnable(x) ((x == OPA_PGA_ENABLE) || (x == OPA_PGA_DISABLE)) - -#define IS_OPA_UnitGainEnable(x) ((x == OPA_UNITGAIN_ENABLE) || (x == OPA_UNITGAIN_DISABLE)) - -#define IS_OPA_PGA_SEL(SEL) ((SEL == PGA_GAIN_5) || (SEL == PGA_GAIN_6) || \ - (SEL == PGA_GAIN_7) || (SEL == PGA_GAIN_8) || \ - (SEL == PGA_GAIN_11) || (SEL == PGA_GAIN_12) || \ - (SEL == PGA_GAIN_15) || (SEL == PGA_GAIN_16) || \ - (SEL == PGA_GAIN_23) || (SEL == PGA_GAIN_24) || \ - (SEL == PGA_GAIN_31) || (SEL == PGA_GAIN_32) || \ - (SEL == PGA_GAIN_47) || (SEL == PGA_GAIN_48) || \ - (SEL == PGA_GAIN_63) || (SEL == PGA_GAIN_64)) - #define IS_OPA_OFMMODE(MODE) ((MODE == OPA_OFFSET_CALIBRATION_MODE) || \ (MODE == OPA_NORMAL_MODE)) @@ -183,11 +157,6 @@ void OPA_UnprotectConfig(HT_OPA_TypeDef* HT_OPAn); void OPA_Init(HT_OPA_TypeDef* HT_OPAn, OPA_InitTypeDef* OPA_InitStruct); void OPA_StructInit(OPA_InitTypeDef* OPA_InitStruct); void OPA_ExternalInputCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState); -#if (LIBCFG_OPA_PGA) -void OPA_UnitGainCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState); -void OPA_PGACmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState); -void OPA_PGAGain(HT_OPA_TypeDef* HT_OPAn, u8 bGAIN_SEL); -#endif void OPA_ScalerCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState); void OPA_SetScalerValue(HT_OPA_TypeDef* HT_OPAn, u32 Scaler_Value); FlagStatus OPA_GetOutputStatus(HT_OPA_TypeDef* HT_OPAn); diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_pga.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_pga.h index c72336c2fad..740ae8da562 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_pga.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f65xxx_66xxx_pga.h @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_pga.h - * @version $Rev:: 6915 $ - * @date $Date:: 2023-05-10 #$ - * @brief The header file of the PGA library (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief The header file of the PGA library. ************************************************************************************************************* * @attention * @@ -44,8 +44,109 @@ * @{ */ +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Exported_Types PGA exported types + * @{ + */ +#define PGA_GAIN_LEVEL_0 (0x0) +#define PGA_GAIN_LEVEL_1 (0x1) +#define PGA_GAIN_LEVEL_2 (0x2) +#define PGA_GAIN_LEVEL_3 (0x3) +#define PGA_GAIN_LEVEL_4 (0x4) +#define PGA_GAIN_LEVEL_5 (0x5) + +/** + * @brief Enumeration of PGA Gain Type 1. + */ +typedef enum +{ + /* PGAnPGA = 1, PGAnHVDDAEN[1:0] = b0x, PGAnNUG = 0 */ + PGA_GAIN_6 = PGA_GAIN_LEVEL_0, + PGA_GAIN_8 = PGA_GAIN_LEVEL_1, + PGA_GAIN_12 = PGA_GAIN_LEVEL_2, + PGA_GAIN_16 = PGA_GAIN_LEVEL_3, + PGA_GAIN_24 = PGA_GAIN_LEVEL_4, + PGA_GAIN_32 = PGA_GAIN_LEVEL_5, +} PGA_GAIN_TYPE1_Enum; +/** + * @brief Enumeration of PGA Gain Type 2. + */ +typedef enum +{ + /* PGAnPGA = 1, PGAnHVDDAEN[1:0] = b10, PGAnNUG = 0 */ + PGA_GAIN_5 = PGA_GAIN_LEVEL_0, + PGA_GAIN_7 = PGA_GAIN_LEVEL_1, + PGA_GAIN_11 = PGA_GAIN_LEVEL_2, + PGA_GAIN_15 = PGA_GAIN_LEVEL_3, + PGA_GAIN_23 = PGA_GAIN_LEVEL_4, + PGA_GAIN_31 = PGA_GAIN_LEVEL_5, +} PGA_GAIN_TYPE2_Enum; +/** + * @brief Enumeration of Calibration Reference Input. + */ +typedef enum +{ + PGA_CALIBRATION_INPUT_NEGATIVE = 0, + PGA_CALIBRATION_INPUT_POSITIVE = 1, +} PGA_CALIBRATION_INPUT_Enum; +/** + * @brief Definition of PGA init structure. + */ +typedef struct +{ + u8 PGA_REF; + u8 PGA_NUG; + u8 PGA_NE; + u8 PGA_PGA; + u8 PGA_HVDDA; +} PGA_InitTypeDef; +/** + * @} + */ +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Exported_Constants PGA exported constants + * @{ + */ +#define PGA_UNPROTECT_KEY (0x9C3A) + +#define PGA_HVDDA_DISABLE (0x0) +#define PGA_HVDDA_RESISTOR (0x2) +#define PGA_HVDDA_POS_INPUT (0x3) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Exported_Functions PGA exported functions + * @{ + */ +void PGA_DeInit(void); +void PGA_Cmd(HT_PGA0_X_TypeDef* HT_PGAn, ControlStatus NewState); +void PGA_SetUnProtectKey(u32 uUnProtectKey); +void PGA_ProtectConfig(HT_PGA0_X_TypeDef* HT_PGAn); +void PGA_UnprotectConfig(HT_PGA0_X_TypeDef* HT_PGAn); +void PGA_Init(HT_PGA0_X_TypeDef* HT_PGAn, PGA_InitTypeDef* PGA_InitStruct); +void PGA_StructInit(PGA_InitTypeDef* PGA_InitStruct); +void PGA_GainConfig(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x); +void PGA_HVDDACmd(ControlStatus NewState); +void PGA_CalibrationCmd(HT_PGA0_X_TypeDef* HT_PGAn, ControlStatus NewState); +void PGA_SetCalibrationInput(HT_PGA0_X_TypeDef* HT_PGAn, PGA_CALIBRATION_INPUT_Enum PGA_INPUT_x); +void PGA_SetCalibrationValue(HT_PGA0_X_TypeDef* HT_PGAn, u32 Value); +FlagStatus PGA_ReadOutputBit(HT_PGA0_X_TypeDef* HT_PGAn); +void PGA_SetModeInverting(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x); +void PGA_SetModeDifferentiator(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x); +void PGA_SetModeNonInverting(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x); +void PGA_SetModeInvertingAdder(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x); +void PGA_SetModeExponent(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x); +void PGA_SetModeManual(HT_PGA0_X_TypeDef* HT_PGAn); +void PGA_SetModeNonInvertingAdder(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x); +void PGA_SetModeComparator(HT_PGA0_X_TypeDef* HT_PGAn); + +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h index 953106da19d..8a64ca1567a 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66242_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f66242_libcfg.h - * @version $Rev:: 7184 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -44,9 +44,65 @@ #define LIBCFG_CHIPNAME (0x66242) #endif +#define LIBCFG_ADC_SAMPLE_TIME_BY_CH (1) #define LIBCFG_ADC_NO_OFFSET_REG (1) +#define LIBCFG_ADC_CH_66XXX_V1 (1) +#define LIBCFG_ADC_TRIG_SRC_V2 (1) +#define LIBCFG_ADC_TRIG_DELAY (1) +#define LIBCFG_ADC_HCONV_LENGTH_V2 (1) +#define LIBCFG_ADC_HDR_4_11 (1) +#define LIBCFG_ADC_STR_16_17 (1) +#define LIBCFG_ADC_HLST_0_2 (1) +#define LIBCFG_ADC_IVREF (1) +#define LIBCFG_ADC_MVDDA (1) +#define LIBCFG_AFIO_SCTM_MODE9 (1) +#define LIBCFG_BFTM1 (1) +#define LIBCFG_CKCU_ATM_V01 (1) +#define LIBCFG_CKCU_NO_ADCPRE_DIV1 (1) +#define LIBCFG_CKCU_NO_LPCR (1) +#define LIBCFG_CKCU_PLLSRCDIV (1) +#define LIBCFG_CKCU_REFCLK_EXT_PIN (1) +#define LIBCFG_CKCU_SYS_CK_60M (1) +#define LIBCFG_CKCU_SYS_CK_80M (1) +#define LIBCFG_CMP (1) +#define LIBCFG_CMP_65x_66x_VER (1) +#define LIBCFG_CMP_CO (1) +#define LIBCFG_CMP_NOSCALER_SRC (1) +#define LIBCFG_CMP_POS_INPUT_SEL_V3 (1) +#define LIBCFG_CMP_SCALER_8BIT (1) +#define LIBCFG_CRC (1) +#define LIBCFG_CORDIC (1) +#define LIBCFG_DIV (1) +#define LIBCFG_FMC_PREFETCH (1) +#define LIBCFG_FMC_BRANCHCACHE (1) +#define LIBCFG_FMC_WAIT_STATE_2 (1) +#define LIBCFG_FMC_WAIT_STATE_3 (1) +#define LIBCFG_MCTM0 (1) +#define LIBCFG_MCTM_UEV1DIS (1) #define LIBCFG_GPIOC (1) -#define LIBCFG_NO_PWRCU_TEST_REG (1) +#define LIBCFG_GPTM_GIRQ (1) #define LIBCFG_PDMA (1) +#define LIBCFG_PGA (1) +#define LIBCFG_PGA1 (1) +#define LIBCFG_PGA2 (1) +#define LIBCFG_PGA3 (1) +#define LIBCFG_PID (1) +#define LIBCFG_PWRCU_VDD_5V (1) +#define LIBCFG_PWRCU_NO_PORF (1) +#define LIBCFG_PWRCU_NO_PD_MODE (1) +#define LIBCFG_PWRCU_NO_PDF (1) +#define LIBCFG_PWRCU_NO_DS2_MODE (1) +#define LIBCFG_PWRCU_NO_VDDPORF (1) +#define LIBCFG_NO_PWRCU_TEST_REG (1) +#define LIBCFG_SCTM0 (1) +#define LIBCFG_SCTM1 (1) +#define LIBCFG_SCTM2 (1) +#define LIBCFG_SCTM3 (1) +#define LIBCFG_TM_65X_66X_V1 (1) +#define LIBCFG_TM_BK_FROM_CMP (1) +#define LIBCFG_TM_RECCDI (1) +#define LIBCFG_TM_TIFN_5BIT (1) +#define LIBCFG_USART_LIN (1) +#define LIBCFG_USART_SINGLE_WIRE (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h index 90a37a17030..ef490dac1cd 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66246_libcfg.h @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f66246_libcfg.h - * @version $Rev:: 7184 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief The library configuration file. ************************************************************************************************************* * @attention @@ -44,9 +44,66 @@ #define LIBCFG_CHIPNAME (0x66246) #endif +#define LIBCFG_ADC_SAMPLE_TIME_BY_CH (1) #define LIBCFG_ADC_NO_OFFSET_REG (1) +#define LIBCFG_ADC_CH_66XXX_V1 (1) +#define LIBCFG_ADC_TRIG_SRC_V2 (1) +#define LIBCFG_ADC_TRIG_DELAY (1) +#define LIBCFG_ADC_HCONV_LENGTH_V2 (1) +#define LIBCFG_ADC_HDR_4_11 (1) +#define LIBCFG_ADC_STR_16_17 (1) +#define LIBCFG_ADC_HLST_0_2 (1) +#define LIBCFG_ADC_IVREF (1) +#define LIBCFG_ADC_MVDDA (1) +#define LIBCFG_AFIO_SCTM_MODE9 (1) +#define LIBCFG_BFTM1 (1) +#define LIBCFG_CAN0 (1) +#define LIBCFG_CKCU_ATM_V01 (1) +#define LIBCFG_CKCU_NO_ADCPRE_DIV1 (1) +#define LIBCFG_CKCU_NO_LPCR (1) +#define LIBCFG_CKCU_PLLSRCDIV (1) +#define LIBCFG_CKCU_REFCLK_EXT_PIN (1) +#define LIBCFG_CKCU_SYS_CK_60M (1) +#define LIBCFG_CKCU_SYS_CK_80M (1) +#define LIBCFG_CMP (1) +#define LIBCFG_CMP_65x_66x_VER (1) +#define LIBCFG_CMP_CO (1) +#define LIBCFG_CMP_NOSCALER_SRC (1) +#define LIBCFG_CMP_POS_INPUT_SEL_V3 (1) +#define LIBCFG_CMP_SCALER_8BIT (1) +#define LIBCFG_CRC (1) +#define LIBCFG_CORDIC (1) +#define LIBCFG_DIV (1) +#define LIBCFG_FMC_PREFETCH (1) +#define LIBCFG_FMC_BRANCHCACHE (1) +#define LIBCFG_FMC_WAIT_STATE_2 (1) +#define LIBCFG_FMC_WAIT_STATE_3 (1) +#define LIBCFG_MCTM0 (1) +#define LIBCFG_MCTM_UEV1DIS (1) #define LIBCFG_GPIOC (1) -#define LIBCFG_NO_PWRCU_TEST_REG (1) +#define LIBCFG_GPTM_GIRQ (1) #define LIBCFG_PDMA (1) +#define LIBCFG_PGA (1) +#define LIBCFG_PGA1 (1) +#define LIBCFG_PGA2 (1) +#define LIBCFG_PGA3 (1) +#define LIBCFG_PID (1) +#define LIBCFG_PWRCU_VDD_5V (1) +#define LIBCFG_PWRCU_NO_PORF (1) +#define LIBCFG_PWRCU_NO_PD_MODE (1) +#define LIBCFG_PWRCU_NO_PDF (1) +#define LIBCFG_PWRCU_NO_DS2_MODE (1) +#define LIBCFG_PWRCU_NO_VDDPORF (1) +#define LIBCFG_NO_PWRCU_TEST_REG (1) +#define LIBCFG_SCTM0 (1) +#define LIBCFG_SCTM1 (1) +#define LIBCFG_SCTM2 (1) +#define LIBCFG_SCTM3 (1) +#define LIBCFG_TM_65X_66X_V1 (1) +#define LIBCFG_TM_BK_FROM_CMP (1) +#define LIBCFG_TM_RECCDI (1) +#define LIBCFG_TM_TIFN_5BIT (1) +#define LIBCFG_USART_LIN (1) +#define LIBCFG_USART_SINGLE_WIRE (1) #endif diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h index 1c25b4c0367..24e7abaf075 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_cordic.h @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f66xxx_cordic.h - * @version $Rev:: 6915 $ - * @date $Date:: 2023-05-10 #$ - * @brief The header file of the CORDIC library (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief The header file of the CORDIC library. ************************************************************************************************************* * @attention * @@ -44,7 +44,243 @@ * @{ */ +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Exported_Types CORDIC exported types + * @{ + */ +typedef struct +{ + u32 Function; + u32 Scale; + u32 InSize; + u32 OutSize; + u32 NbWrite; + u32 NbRead; + u32 Precision; +} CORDIC_InitTypeDef; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Exported_Constants CORDIC exported constants + * @{ + */ +/************************ Bit definition for CORDIC_CSR register **********************/ +#define CORDIC_CSR_FUNC_POS (0U) +#define CORDIC_CSR_FUNC_MASK (0xFUL << CORDIC_CSR_FUNC_POS) /*!< 0x0000000F */ +#define CORDIC_CSR_FUNC CORDIC_CSR_FUNC_MASK /*!< Function */ +#define CORDIC_CSR_FUNC_0 (0x1UL << CORDIC_CSR_FUNC_POS) /*!< 0x00000001 */ +#define CORDIC_CSR_FUNC_1 (0x2UL << CORDIC_CSR_FUNC_POS) /*!< 0x00000002 */ +#define CORDIC_CSR_FUNC_2 (0x4UL << CORDIC_CSR_FUNC_POS) /*!< 0x00000004 */ +#define CORDIC_CSR_FUNC_3 (0x8UL << CORDIC_CSR_FUNC_POS) /*!< 0x00000008 */ +#define CORDIC_CSR_PRECISION_POS (4U) +#define CORDIC_CSR_PRECISION_MASK (0xFUL << CORDIC_CSR_PRECISION_POS) /*!< 0x000000F0 */ +#define CORDIC_CSR_PRECISION CORDIC_CSR_PRECISION_MASK /*!< Precision */ +#define CORDIC_CSR_PRECISION_0 (0x1UL << CORDIC_CSR_PRECISION_POS) /*!< 0x00000010 */ +#define CORDIC_CSR_PRECISION_1 (0x2UL << CORDIC_CSR_PRECISION_POS) /*!< 0x00000020 */ +#define CORDIC_CSR_PRECISION_2 (0x4UL << CORDIC_CSR_PRECISION_POS) /*!< 0x00000040 */ +#define CORDIC_CSR_PRECISION_3 (0x8UL << CORDIC_CSR_PRECISION_POS) /*!< 0x00000080 */ +#define CORDIC_CSR_SCALE_POS (8U) +#define CORDIC_CSR_SCALE_MASK (0x7UL << CORDIC_CSR_SCALE_POS) /*!< 0x00000700 */ +#define CORDIC_CSR_SCALE CORDIC_CSR_SCALE_MASK /*!< Scaling factor */ +#define CORDIC_CSR_SCALE_0 (0x1UL << CORDIC_CSR_SCALE_POS) /*!< 0x00000100 */ +#define CORDIC_CSR_SCALE_1 (0x2UL << CORDIC_CSR_SCALE_POS) /*!< 0x00000200 */ +#define CORDIC_CSR_SCALE_2 (0x4UL << CORDIC_CSR_SCALE_POS) /*!< 0x00000400 */ +#define CORDIC_CSR_IEN_POS (16U) +#define CORDIC_CSR_IEN_MASK (0x1UL << CORDIC_CSR_IEN_POS) /*!< 0x00010000 */ +#define CORDIC_CSR_IEN CORDIC_CSR_IEN_MASK /*!< Interrupt Enable */ +#define CORDIC_CSR_DMAREN_POS (17U) +#define CORDIC_CSR_DMAREN_MASK (0x1UL << CORDIC_CSR_DMAREN_POS) /*!< 0x00020000 */ +#define CORDIC_CSR_DMAREN CORDIC_CSR_DMAREN_MASK /*!< DMA Read channel Enable */ +#define CORDIC_CSR_DMAWEN_POS (18U) +#define CORDIC_CSR_DMAWEN_MASK (0x1UL << CORDIC_CSR_DMAWEN_POS) /*!< 0x00040000 */ +#define CORDIC_CSR_DMAWEN CORDIC_CSR_DMAWEN_MASK /*!< DMA Write channel Enable */ +#define CORDIC_CSR_NRES_POS (19U) +#define CORDIC_CSR_NRES_MASK (0x1UL << CORDIC_CSR_NRES_POS) /*!< 0x00080000 */ +#define CORDIC_CSR_NRES CORDIC_CSR_NRES_MASK /*!< Number of results in WDATA register */ +#define CORDIC_CSR_NARGS_POS (20U) +#define CORDIC_CSR_NARGS_MASK (0x3UL << CORDIC_CSR_NARGS_POS) /*!< 0x00300000 */ +#define CORDIC_CSR_NARGS CORDIC_CSR_NARGS_MASK /*!< Number of arguments in RDATA register */ +#define CORDIC_CSR_NARGS_0 (0x1UL << CORDIC_CSR_NARGS_POS) /*!< 0x00100000 */ +#define CORDIC_CSR_NARGS_1 (0x2UL << CORDIC_CSR_NARGS_POS) /*!< 0x00200000 */ +#define CORDIC_CSR_RESSIZE_POS (22U) +#define CORDIC_CSR_RESSIZE_MASK (0x1UL << CORDIC_CSR_RESSIZE_POS) /*!< 0x00400000 */ +#define CORDIC_CSR_RESSIZE CORDIC_CSR_RESSIZE_MASK /*!< Width of output data */ +#define CORDIC_CSR_ARGSIZE_POS (23U) +#define CORDIC_CSR_ARGSIZE_MASK (0x1UL << CORDIC_CSR_ARGSIZE_POS) /*!< 0x00800000 */ +#define CORDIC_CSR_ARGSIZE CORDIC_CSR_ARGSIZE_MASK /*!< Width of input data */ +#define CORDIC_CSR_RRDY_POS (31U) +#define CORDIC_CSR_RRDY_MASK (0x1UL << CORDIC_CSR_RRDY_POS) /*!< 0x80000000 */ +#define CORDIC_CSR_RRDY CORDIC_CSR_RRDY_MASK /*!< Result Ready Flag */ + +/************************ Bit definition for CORDIC_WDATA register ********************/ +#define CORDIC_WDATA_ARG_POS (0U) +#define CORDIC_WDATA_ARG_MASK (0xFFFFFFFFUL << CORDIC_WDATA_ARG_POS) /*!< 0xFFFFFFFF */ +#define CORDIC_WDATA_ARG CORDIC_WDATA_ARG_MASK /*!< Input Argument */ + +/************************ Bit definition for CORDIC_RDATA register ********************/ +#define CORDIC_RDATA_RES_POS (0U) +#define CORDIC_RDATA_RES_MASK (0xFFFFFFFFUL << CORDIC_RDATA_RES_POS) /*!< 0xFFFFFFFF */ +#define CORDIC_RDATA_RES CORDIC_RDATA_RES_MASK /*!< Output Result */ + +/** @defgroup CORDIC_Function CORDIC Function + * @{ + */ +#define CORDIC_FUNCTION_COSINE (0x00000000U) /*!< Cosine */ +#define CORDIC_FUNCTION_SINE ((u32)(CORDIC_CSR_FUNC_0)) /*!< Sine */ +#define CORDIC_FUNCTION_PHASE ((u32)(CORDIC_CSR_FUNC_1)) /*!< Phase */ +#define CORDIC_FUNCTION_MODULUS ((u32)(CORDIC_CSR_FUNC_1 | CORDIC_CSR_FUNC_0)) /*!< Modulus */ +#define CORDIC_FUNCTION_ARCTANGENT ((u32)(CORDIC_CSR_FUNC_2)) /*!< Arctangent */ +#define CORDIC_FUNCTION_HCOSINE ((u32)(CORDIC_CSR_FUNC_2 | CORDIC_CSR_FUNC_0)) /*!< Hyperbolic Cosine */ +#define CORDIC_FUNCTION_HSINE ((u32)(CORDIC_CSR_FUNC_2 | CORDIC_CSR_FUNC_1)) /*!< Hyperbolic Sine */ +#define CORDIC_FUNCTION_HARCTANGENT ((u32)(CORDIC_CSR_FUNC_2 | CORDIC_CSR_FUNC_1 | CORDIC_CSR_FUNC_0))/*!< Hyperbolic Arctangent */ +#define CORDIC_FUNCTION_NATURALLOG ((u32)(CORDIC_CSR_FUNC_3)) /*!< Natural Logarithm */ +#define CORDIC_FUNCTION_SQUAREROOT ((u32)(CORDIC_CSR_FUNC_3 | CORDIC_CSR_FUNC_0)) /*!< Square Root */ +#define CORDIC_FUNCTION_ROTATIONMATRIX ((u32)(CORDIC_CSR_FUNC_3 | CORDIC_CSR_FUNC_1)) /*!< Rotation Matrix */ +#define CORDIC_FUNCTION_INTEGERMODULUS ((u32)(CORDIC_CSR_FUNC_3 | CORDIC_CSR_FUNC_1 | CORDIC_CSR_FUNC_0))/*!< Integer Modulus */ +#define CORDIC_FUNCTION_INTEGERSQUAREROOT ((u32)(CORDIC_CSR_FUNC_3 | CORDIC_CSR_FUNC_2)) /*!< Integer Square Root */ +/** + * @} + */ + +/** @defgroup CORDIC_Precision_In_Cycles_Number CORDIC Precision in Cycles Number + * @{ + */ +/* Note: 1 cycle corresponds to 4 algorithm iterations */ +#define CORDIC_PRECISION_1CYCLE ((u32)(CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_2CYCLES ((u32)(CORDIC_CSR_PRECISION_1)) +#define CORDIC_PRECISION_3CYCLES ((u32)(CORDIC_CSR_PRECISION_1 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_4CYCLES ((u32)(CORDIC_CSR_PRECISION_2)) +#define CORDIC_PRECISION_5CYCLES ((u32)(CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_6CYCLES ((u32)(CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_1)) +#define CORDIC_PRECISION_7CYCLES ((u32)(CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_1 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_8CYCLES ((u32)(CORDIC_CSR_PRECISION_3)) +#define CORDIC_PRECISION_9CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_10CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_1)) +#define CORDIC_PRECISION_11CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_1 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_12CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_2)) +#define CORDIC_PRECISION_13CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_0)) +#define CORDIC_PRECISION_14CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_1)) +#define CORDIC_PRECISION_15CYCLES ((u32)(CORDIC_CSR_PRECISION_3 | CORDIC_CSR_PRECISION_2 | CORDIC_CSR_PRECISION_1 |CORDIC_CSR_PRECISION_0)) +/** + * @} + */ + +/** @defgroup CORDIC_Scale CORDIC Scaling factor + * @{ + */ +/* Scale factor value 'n' implies that the input data have been multiplied + by a factor 2exp(-n), and/or the output data need to be multiplied by 2exp(n). */ +#define CORDIC_SCALE_0 (0x00000000U) +#define CORDIC_SCALE_1 ((u32)(CORDIC_CSR_SCALE_0)) +#define CORDIC_SCALE_2 ((u32)(CORDIC_CSR_SCALE_1)) +#define CORDIC_SCALE_3 ((u32)(CORDIC_CSR_SCALE_1 | CORDIC_CSR_SCALE_0)) +#define CORDIC_SCALE_4 ((u32)(CORDIC_CSR_SCALE_2)) +#define CORDIC_SCALE_5 ((u32)(CORDIC_CSR_SCALE_2 | CORDIC_CSR_SCALE_0)) +#define CORDIC_SCALE_6 ((u32)(CORDIC_CSR_SCALE_2 | CORDIC_CSR_SCALE_1)) +#define CORDIC_SCALE_7 ((u32)(CORDIC_CSR_SCALE_2 | CORDIC_CSR_SCALE_1 | CORDIC_CSR_SCALE_0)) +/** + * @} + */ + +/** @defgroup CORDIC_Interrupts_Enable CORDIC Interrupts Enable bit + * @{ + */ +#define CORDIC_IT_IEN CORDIC_CSR_IEN /*!< Result ready interrupt enable */ +/** + * @} + */ + +/** @defgroup CORDIC_DMAR DMA Read Request Enable bit + * @{ + */ +#define CORDIC_DMA_REN CORDIC_CSR_DMAREN /*!< DMA Read requests enable */ +/** + * @} + */ + +/** @defgroup CORDIC_DMAW DMA Write Request Enable bit + * @{ + */ +#define CORDIC_DMA_WEN CORDIC_CSR_DMAWEN /*!< DMA Write channel enable */ +/** + * @} + */ + +/** @defgroup CORDIC_Nb_Write CORDIC Number of 32-bit write required for one calculation + * @{ + */ +#define CORDIC_NBWRITE_1 (0x00000000U) /*!< One 32-bits write containing either only one + 32-bit data input (Q1.31 format), or two 16-bit + data input (Q1.15 format) packed in one 32 bits + Data */ +#define CORDIC_NBWRITE_2 ((u32)(CORDIC_CSR_NARGS_0)) /*!< Two 32-bit write containing two 32-bits data input + (Q1.31 format) */ +#define CORDIC_NBWRITE_3 ((u32)(CORDIC_CSR_NARGS_1)) /*!< Three 32-bit write containing three 32-bits data input + (Q1.31 format) */ +/** + * @} + */ + +/** @defgroup CORDIC_Nb_Read CORDIC Number of 32-bit read required after one calculation + * @{ + */ +#define CORDIC_NBREAD_1 (0x00000000U) /*!< One 32-bits read containing either only one + 32-bit data output (Q1.31 format), or two 16-bit + data output (Q1.15 format) packed in one 32 bits + Data */ +#define CORDIC_NBREAD_2 CORDIC_CSR_NRES /*!< Two 32-bit Data containing two 32-bits data output + (Q1.31 format) */ +/** + * @} + */ +/** @defgroup CORDIC_In_Size CORDIC input data size + * @{ + */ +#define CORDIC_INSIZE_32BITS (0x00000000U) /*!< 32 bits input data size (Q1.31 format) */ +#define CORDIC_INSIZE_16BITS CORDIC_CSR_ARGSIZE /*!< 16 bits input data size (Q1.15 format) */ +/** + * @} + */ + +/** @defgroup CORDIC_Out_Size CORDIC Results Size + * @{ + */ +#define CORDIC_OUTSIZE_32BITS (0x00000000U) /*!< 32 bits output data size (Q1.31 format) */ +#define CORDIC_OUTSIZE_16BITS CORDIC_CSR_RESSIZE /*!< 16 bits output data size (Q1.15 format) */ +/** + * @} + */ + +/** @defgroup CORDIC_Flags CORDIC status flags + * @{ + */ +#define CORDIC_FLAG_RRDY CORDIC_CSR_RRDY /*!< Result Ready Flag */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Exported_Functions CORDIC exported functions + * @{ + */ +void CORDIC_DeInit(void); +void CORDIC_Init(CORDIC_InitTypeDef *CORDIC_InitStruct); +void CORDIC_IntCmd(ControlStatus NewState); +void CORDIC_PDMACmd(u32 CORDIC_DMA, ControlStatus NewState); +FlagStatus CORDIC_GetFlagStatus_RRDY(void); +void CORDIC_WriteData(u32 InData); +u32 CORDIC_ReadData(void); + +/** + * @} + */ /** diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h index c47671643ce..56d3bbe830d 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/inc/ht32f66xxx_pid.h @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f66xxx_pid.h - * @version $Rev:: 6915 $ - * @date $Date:: 2023-05-10 #$ - * @brief The header file of the PID library (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief The header file of the PID library. ************************************************************************************************************* * @attention * @@ -44,8 +44,105 @@ * @{ */ +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup PID_Exported_Types PID exported types + * @{ + */ + +/** + * @brief PID PID_Mode + */ +typedef enum +{ + PID_SPD_MODE = 0, + PID_IQ_MODE, + PID_ID_MODE, + PID_FWNK_MODE, + PID_PLL_MODE, + PID_USR_MODE, +} PID_Mode_Enum; + +#define IS_PID_MODE(PID_MODE) (((PID_MODE) == PID_SPD_MODE) || \ + ((PID_MODE) == PID_IQ_MODE) || \ + ((PID_MODE) == PID_ID_MODE) || \ + ((PID_MODE) == PID_FWNK_MODE) || \ + ((PID_MODE) == PID_PLL_MODE) || \ + ((PID_MODE) == PID_USR_MODE)) + +/** + * @brief PID paramater init structure + */ +typedef struct +{ + s32 ERRn_1; + s32 UIn_1; + s32 KP; + s32 KI; + s32 KD; + s32 UI_MAX; + s32 UI_MIN; + s16 OUT_MAX; + s16 OUT_MIN; +} PID_InitTypeDef; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup PID_Exported_Constants PID exported constants + * @{ + */ +#define IS_PID(x) IS_PID0(x) +#define IS_PID0(x) (x == HT_PID0) + +/** + * @brief PID CR Bit Field Definitions + */ +#define PID_CR_MODSEL_Pos 24 +#define PID_CR_MODSEL_Msk (0xFul << PID_CR_MODSEL_Pos) +#define PID_CR_UIF (0x00000008) +#define PID_CR_PIDEN (0x00000001) +#define PID_FLAG_OVF (0x00020000) +#define PID_FLAG_CMP (0x00000200) + +#define IS_PID_FLAG(FLAG) ((FLAG == PID_FLAG_OVF) || \ + (FLAG == PID_FLAG_CMP)) + +#define PID_INT_OVF (0x00010000) +#define PID_INT_CMP (0x00000100) + +#define IS_PID_INT(INT) ((INT == PID_INT_OVF) || \ + (INT == PID_INT_CMP)) + +#define PID_INT_Status_Pos 2 +#define PID_INT_Clear_Pos 3 + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup PID_Exported_Functions PID exported functions + * @{ + */ +void PID_DeInit(HT_PID_TypeDef* HT_PIDn); +void PID_Init(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode, PID_InitTypeDef* PID_Para); +void PID_IntConfig(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x, ControlStatus NewState); +FlagStatus PID_GetIntStatus(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x); +void PID_ClearIntPendingBit(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x); +void PID_SetComPara_ERRn(HT_PID_TypeDef* HT_PIDn, s32 ERRn); +void PID_SetComPara_UI_Input(HT_PID_TypeDef* HT_PIDn, s32 UI_Input); +void PID_Compute(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode); +s16 PID_GetOutResult(HT_PID_TypeDef* HT_PIDn); +FlagStatus PID_GetFlagStatus(HT_PID_TypeDef* HT_PIDn, u32 PID_FLAG_x); +void PID_UI_InputCmd(HT_PID_TypeDef* HT_PIDn, ControlStatus NewState); +s32 PID_GetERRn_1(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode); +s32 PID_GetUIn_1(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode); +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c index 91fc97ab995..80a7b66eac5 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32_cm0plus_misc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32_cm0plus_misc.c - * @version $Rev:: 5377 $ - * @date $Date:: 2021-05-26 #$ + * @version $Rev:: 7888 $ + * @date $Date:: 2024-07-22 #$ * @brief This file provides all the miscellaneous firmware functions. ************************************************************************************************************* * @attention @@ -221,7 +221,7 @@ u32 RBIT(u32 in) u32 uRBIT = 0; s32 i; - for(i = 31; i >=0; i--) + for (i = 31; i >=0; i--) { uRBIT |= ((in & 0x1) << i); in = in >> 1; @@ -229,6 +229,99 @@ u32 RBIT(u32 in) return uRBIT; } + +#if 0 +// Copy the code below to the begin of the main(). +// START + + #if (HTCFG_STACK_USAGE_ANALYSIS == 1) + /* !!! NOTICE !!! + Please update the Keil HT32 PACK and HT32 Firmware Library to the latest version to make sure the + Stack Usage Analysis function works properly. + */ + /* + Set HTCFG_STACK_USAGE_ANALYSIS as 1 in the "ht32xxxxxx_conf.h" to enable Stack Usage Analysis feature. + This feature is only applicable to the Keil MDK-ARM. Please call the "StackUsageAnalysisInit()" function + in the begin of the "main()". + The "StackUsageAnalysisInit()" parameter shall be the start address of the vector table. + Under Keil Debug mode, tick "View > Watch Window > HT32 Stack Usage Analysis" to show the stack usage + information. Those information is only valid after calling "StackUsageAnalysisInit()" function. + */ + StackUsageAnalysisInit(0x00000000); + #endif + +// END +#endif + +#if (HTCFG_STACK_USAGE_ANALYSIS == 1) +#if defined (__CC_ARM) +#define STACKLIMITADDR 0x20000010 +#define STACKSTART 0x20000014 +u32 _StackLimit __attribute__((at(STACKLIMITADDR)))= HT_SRAM_BASE + LIBCFG_RAM_SIZE; +u32 _StackStart __attribute__((at(STACKSTART)))= HT_SRAM_BASE; +/*********************************************************************************************************//** + * @brief Stack Usage Analysis Init + * @retval None + ***********************************************************************************************************/ +__ASM void StackUsageAnalysisInit(u32 addr) +{ + extern _StackLimit; + extern __HT_check_sp; + extern _StackStart; + LDR R0, [r0] + LDR R1, =_StackLimit + STR R0, [r1] + + LDR R0, =__HT_check_sp + LDR R1, =_StackStart + STR R0, [r1] + MOV R1, SP + LDR R2, =0xCDCDCDCD + LDR R3, =0xABABABAB + STR R3, [ R0 ] + B Loop_Check +Loop + STR R2, [ R0 ] +Loop_Check + ADDS R0, R0, #0x04 + CMP R0, R1 + BLT Loop + BX LR + ALIGN +} +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define STACKLIMITADDR "0x20000010" +#define STACKSTART "0x20000014" +u32 _StackLimit __attribute__((section(".ARM.__at_"STACKLIMITADDR))) = HT_SRAM_BASE + LIBCFG_RAM_SIZE; +u32 _StackStart __attribute__((section(".ARM.__at_"STACKSTART))) = HT_SRAM_BASE; +/*********************************************************************************************************//** + * @brief Stack Usage Analysis Init + * @retval None + ***********************************************************************************************************/ +__attribute__((noinline)) void StackUsageAnalysisInit(u32 addr) +{ + __ASM volatile (" LDR R0, [r0]"); + __ASM volatile (" LDR R1, =_StackLimit"); + __ASM volatile (" STR R0, [r1]"); + + __ASM volatile (" LDR R0, =__HT_check_sp"); + __ASM volatile (" LDR R1, =_StackStart"); + __ASM volatile (" STR R0, [r1]"); + __ASM volatile (" MOV R1, SP"); + __ASM volatile (" LDR R2, =0xCDCDCDCD"); + __ASM volatile (" LDR R3, =0xABABABAB"); + __ASM volatile (" STR R3, [ R0 ]"); + __ASM volatile (" B Loop_Check"); + __ASM volatile ("Loop:"); + __ASM volatile (" STR R2, [ R0 ]"); + __ASM volatile ("Loop_Check:"); + __ASM volatile (" ADDS R0, R0, #0x04"); + __ASM volatile (" CMP R0, R1"); + __ASM volatile (" BLT Loop"); + __ASM volatile (" BX LR"); +} +#endif +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c index d244507c110..af11e3bd482 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_adc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_adc.c - * @version $Rev:: 7366 $ - * @date $Date:: 2023-12-06 #$ + * @version $Rev:: 7691 $ + * @date $Date:: 2024-04-02 #$ * @brief This file provides all the ADC firmware functions. ************************************************************************************************************* * @attention @@ -90,6 +90,7 @@ void ADC_Reset(HT_ADC_TypeDef* HT_ADCn) Assert_Param(IS_ADC(HT_ADCn)); HT_ADCn->CR |= ADC_SOFTWARE_RESET; + while ((HT_ADCn->CR & ADC_SOFTWARE_RESET) != 0); } /*********************************************************************************************************//** @@ -107,6 +108,7 @@ void ADC_Cmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) if (NewState != DISABLE) { HT_ADCn->CR |= ADC_ENABLE_BIT; + ADC_Reset(HT_ADCn); } else { @@ -539,12 +541,13 @@ void ADC_VREFConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_VREF_x) #if (LIBCFG_ADC_VREFBUF) /*********************************************************************************************************//** - * @brief Enable or Disable the VREF output. When enable, the VREF provides a stable voltage output to the ADVREFP pin (ADC reference positive voltage). + * @brief Enable or Disable the VREF output. When enable, the VREF provides a stable voltage output to the + ADVREFP pin (ADC reference positive voltage). * @param HT_ADCn: where HT_ADCn is the selected ADC from the ADC peripherals. * @param NewState: This parameter can be ENABLE or DISABLE. * @retval None ************************************************************************************************************/ -void ADC_VREFOutputCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) +void ADC_VREFOutputADVREFPCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) { /* !!! NOTICE !!! The ADCREFP pin should not be connected to an external voltage when the VREF output is enabled. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c index 133889a2583..cce69677ec2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_aes.c @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_aes.c - * @version $Rev:: 7390 $ - * @date $Date:: 2023-12-12 #$ - * @brief This file provides all the ADC firmware functions. + * @version $Rev:: 8205 $ + * @date $Date:: 2024-10-15 #$ + * @brief This file provides all the AES firmware functions. ************************************************************************************************************* * @attention * @@ -355,12 +355,12 @@ void AES_SetKeyTable(HT_AES_TypeDef* HT_AESn, u32 *Key, u32 keySize) } HT_AESn->CR = uCRTemp; - for (i = 0; i < keySize; i += 4) + for (i = 0; i < (keySize / 4); i++) { #if (LIBCFG_AES_SWAP) - HT_AESn->KEYR[i >> 2] = __REV(*&Key[i]); + HT_AESn->KEYR[i] = __REV(*&Key[i]); #else - HT_AESn->KEYR[i >> 2] = *&Key[i]; + HT_AESn->KEYR[i] = *&Key[i]; #endif } @@ -378,12 +378,12 @@ void AES_SetVectorTable(HT_AES_TypeDef* HT_AESn, u32 *Vector) int i; Assert_Param(IS_AES(HT_AESn)); - for (i = 0; i < 16; i += 4) + for (i = 0; i < 4; i++) { #if (LIBCFG_AES_SWAP) - HT_AESn->IVR[i >> 2] = __REV(*&Vector[i]); + HT_AESn->IVR[i] = __REV(*&Vector[i]); #else - HT_AESn->IVR[i >> 2] = *&Vector[i]; + HT_AESn->IVR[i] = *&Vector[i]; #endif } } diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_can.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_can.c index 22fca5ab022..0287f0469a2 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_can.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_can.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_can.c - * @version $Rev:: 7187 $ - * @date $Date:: 2023-08-31 #$ + * @version $Rev:: 8284 $ + * @date $Date:: 2024-11-22 #$ * @brief This file provides all the CAN firmware functions. ************************************************************************************************************* * @attention @@ -37,6 +37,7 @@ * @{ */ + /* Private types -------------------------------------------------------------------------------------------*/ typedef enum { @@ -45,9 +46,18 @@ typedef enum IF_TOTAL_NUM } CANIF_NUMBER_Enum; - /* Private function prototypes -----------------------------------------------------------------------------*/ -static CANIF_NUMBER_Enum GetFreeIF(HT_CAN_TypeDef *CANx); +static HT_CANIF_TypeDef *_GetFreeIF(HT_CAN_TypeDef *CANx); +static void _CAN_EnterInitMode(HT_CAN_TypeDef *CANx); +static void _CAN_LeaveInitMode(HT_CAN_TypeDef *CANx); +static void _CAN_SetRxMsgObj(HT_CAN_TypeDef *CANx, u32 MsgNum, CAN_MSG_TypeDef* pCanMsg, u32 uSingleOrFifoLast); +static s32 _CAN_ReadMsgObj(HT_CAN_TypeDef *CANx, u32 MsgNum, u32 Release, CAN_MSG_TypeDef* pCanMsg, u8* data, u32* len); +static ErrStatus _CAN_SetTxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len); +static int _CAN_GetValidMsg(HT_CAN_TypeDef *CANx); +static bool _CAN_GetNewData(HT_CAN_TypeDef *CANx, u32 MsgNum); +static bool _CAN_CheckMsgIsValid(HT_CAN_TypeDef *CANx, u32 MsgNum); +static void _CAN_ClearMsgPendingFlag(HT_CAN_TypeDef *CANx, u32 MsgNum); +static volatile bool gIsBusOff = FALSE; /* Global functions ----------------------------------------------------------------------------------------*/ /** @defgroup CAN_Exported_Functions CAN exported functions @@ -73,943 +83,1049 @@ void CAN_DeInit(HT_CAN_TypeDef* CANx) } /*********************************************************************************************************//** - * @brief This function is used to set CAN to enter initialization mode and enable access bit timing - * register.After bit timing configuration ready, user must call CAN_LeaveInitMode() - * to leave initialization mode and lock bit timing register to let new configuration - * take effect. - * @param CANx: The pointer to CAN module base address. + * @brief Set CAN operation mode and target baud-rate. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure. * @retval None ***********************************************************************************************************/ -void CAN_EnterInitMode(HT_CAN_TypeDef *CANx) +void CAN_Init(HT_CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) { - CANx->CR |= CAN_CR_INIT_Msk; - CANx->CR |= CAN_CR_CCE_Msk; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + _CAN_EnterInitMode(CANx); + + CANx->BTR = (((u32)(CAN_InitStruct->CAN_TSEG1 - 1) << CAN_BTR_TSEG1_Pos) & CAN_BTR_TSEG1_Msk)| + (((u32)(CAN_InitStruct->CAN_TSEG0 -1) << CAN_BTR_TSEG0_Pos) & CAN_BTR_TSEG0_Msk)| + (((u32)(CAN_InitStruct->CAN_BRPrescaler -1) << CAN_BTR_BRP_Pos) & CAN_BTR_BRP_Msk) | + (((u32)(CAN_InitStruct->CAN_SJW -1) << CAN_BTR_SJW_Pos) & CAN_BTR_SJW_Msk); + + CANx->BRPER = (CAN_InitStruct->CAN_BRPrescaler >> 6) & CAN_BRPE_BRPE_Msk; + _CAN_LeaveInitMode(CANx); + + if (CAN_InitStruct->CAN_NART) + HT_CAN0->CR |= CAN_CR_DAR; + + if (CAN_InitStruct->CAN_Mode) + { + CAN_EnterTestMode(CANx, CAN_InitStruct->CAN_Mode); + } + CAN_IntConfig(CANx, CAN_INT_EIE | CAN_INT_IE , ENABLE); + + return; } -/*********************************************************************************************************//** - * @brief Leave initialization mode - * @param CANx: The pointer to CAN module base address. +/**********************************************************************************************************//** + * @brief Enable or Disable the specified CAN interrupt. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_Int: specify if the CAN interrupt source to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg CAN_INT_IE : Module interrupt enable. + * @arg CAN_INT_SIE : Status change interrupt enable. + * @arg CAN_INT_EIE : Error interrupt enable. + * @arg CAN_INT_ALL : All CAN interrupt + * @param NewState: this parameter can be ENABLE or DISABLE. * @retval None ***********************************************************************************************************/ -void CAN_LeaveInitMode(HT_CAN_TypeDef *CANx) +void CAN_IntConfig(HT_CAN_TypeDef *CANx, u32 CAN_Int, ControlStatus NewState) { - CANx->CR &= (~(CAN_CR_INIT_Msk | CAN_CR_CCE_Msk)); + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + CAN_Int = CAN_Int & CAN_INT_ALL; - while(CANx->CR & CAN_CR_INIT_Msk); /* Check INIT bit is released */ + _CAN_EnterInitMode(CANx); + if (NewState != DISABLE) + { + CANx->CR |= CAN_Int; + } + else + { + CANx->CR = CANx->CR & ~(CAN_Int); + } + _CAN_LeaveInitMode(CANx); } -/*********************************************************************************************************//** - * @brief This function is used to Wait message into message buffer in basic mode. Please notice the - * function is polling NEWDAT bit of MCR register by while loop and it is used in basic mode. - * @param CANx: The pointer to CAN module base address. - * @retval None +/**********************************************************************************************************//** + * @brief Get the specified CAN INT status. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_Int: the CAN interrupt source. + * This parameter can be one of the following values: + * @arg CAN_INT_IE : Module interrupt enable. + * @arg CAN_INT_SIE : Status change interrupt enable. + * @arg CAN_INT_EIE : Error interrupt enable. + * @retval SET or RESET ***********************************************************************************************************/ -void CAN_WaitMsg(HT_CAN_TypeDef *CANx) +FlagStatus CAN_GetIntStatus(HT_CAN_TypeDef* CANx, u32 CAN_Int) { - CANx->SR = 0x0; /* clr status */ + FlagStatus Status; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + if ((CANx->CR & CAN_Int) != RESET) + { + Status = SET; + } + else + { + Status = RESET; + } + return Status; +} - while(1) +/*********************************************************************************************************//** + * @brief Check whether the specified CAN flag has been set. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_Flag: specify the flag to be check. + * This parameter can be one of the following values: + * @arg CAN_FLAG_BOFF : Busoff Status + * @arg CAN_FLAG_EWARN : Warning Status + * @arg CAN_FLAG_EPASS : Error Passive + * @arg CAN_FLAG_RXOK : Received a Message Successfully + * @arg CAN_FLAG_TXOK : Transmitted a Message Successfully + * @retval SET or RESET + ************************************************************************************************************/ +FlagStatus CAN_GetFlagStatus(HT_CAN_TypeDef* CANx, uint32_t CAN_Flag) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + if (CANx->SR & CAN_Flag) { - if(CANx->IF1.MCR & CAN_IF_MCR_NEWDAT_Msk) /* check new data */ - { - /*DEBUG_PRINTF("New Data IN\n");*/ - break; - } - if(CANx->SR & CAN_SR_RXOK_Msk) - { - /*DEBUG_PRINTF("Rx OK\n");*/ - } - if(CANx->SR & CAN_SR_LEC_Msk) - { - /*DEBUG_PRINTF("Error\n");*/ - } + return SET; + } + else + { + return RESET; } } +/**********************************************************************************************************//** + * @brief Clear the interrupt flag of the specified CAN. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param CAN_Flag: specify the flag that is to be cleared. + * @arg CAN_FLAG_RXOK : Received a Message Successfully + * @arg CAN_FLAG_TXOK : Transmitted a Message Successfully + * @retval None + ***********************************************************************************************************/ +void CAN_ClearFlag(HT_CAN_TypeDef* CANx, uint32_t CAN_Flag) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + CANx->SR &= ~CAN_Flag; +} + +/**********************************************************************************************************//** + * @brief Returns the CANx's last error code (LEC). + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval This function will return the CAN_ErrorCode following values: + * - NO_ERROR : No Error + * - STUFF_ERROR : Stuff Error + * - FORM_ERROR : Form Error + * - ACK_ERROR : Acknowledgment Error + * - BIT1_EROR : Bit Recessive Error + * - BIT0_ERROR : Bit Dominant Error + * - CRC_ERROR : CRC Error + * - NO_CHANGE : Software Set Error + ***********************************************************************************************************/ +CAN_LastErrorCode_TypeDef CAN_GetLastErrorCode(HT_CAN_TypeDef* CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + return (CAN_LastErrorCode_TypeDef)(CANx->SR & CAN_LEC_Msk); +} + +/**********************************************************************************************************//** + * @brief Returns the CANx Receive Error Counter (REC). + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval CAN Receive Error Counter. + ***********************************************************************************************************/ +u32 CAN_GetReceiveErrorCounter(HT_CAN_TypeDef* CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + return ((CANx->ECR & CAN_ECR_REC_MsK) >> CAN_ECR_REC_Pos); +} + /*********************************************************************************************************//** - * @brief Get current bit rate - * @param CANx: The pointer to CAN module base address. - * @retval Current Bit-Rate (kilo bit per second) + * @brief Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC). + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval LSB of the 9-bit CAN Transmit Error Counter. ***********************************************************************************************************/ -u32 CAN_GetCANBitRate(HT_CAN_TypeDef *CANx) +u32 CAN_GetLSBTransmitErrorCounter(HT_CAN_TypeDef* CANx) { - u32 wTseg1, wTseg2; - u32 wBpr; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + return (CANx->ECR & CAN_ECR_TEC_MsK); +} - wTseg1 = (CANx->BTR & CAN_BTR_TSEG0_Msk) >> CAN_BTR_TSEG0_Pos; - wTseg2 = (CANx->BTR & CAN_BTR_TSEG1_Msk) >> CAN_BTR_TSEG1_Pos; - wBpr = CANx->BTR & CAN_BTR_BRP_Msk; - wBpr |= CANx->BRPER << 6; +/*********************************************************************************************************//** + * @brief Monitor CAN BusOff status. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval None + ***********************************************************************************************************/ +void CAN_BusOffRecovery(HT_CAN_TypeDef *CANx) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); - return (SystemCoreClock / (wBpr + 1) / (wTseg1 + wTseg2 + 3)); + /* Get BusOff Flag */ + if (CANx->SR & CAN_FLAG_BOFF) + { + _CAN_LeaveInitMode(CANx); + } + return; } /**********************************************************************************************************//** * @brief Switch the CAN into test mode. - * @param CANx: The pointer to CAN module base address. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. * @param u8TestMask Specifies the configuration in test modes - * @arg CAN_TEST_BASIC_Msk : Enable basic mode of test mode - * @arg CAN_TEST_SILENT_Msk : Enable silent mode of test mode - * @arg CAN_TEST_LBACK_Msk : Enable Loop Back Mode of test mode - * @arg CAN_TEST_TX0_Msk/CAN_TEST_TX1_Msk: Control CAN_TX pin bit field + * @arg CAN_MODE_BASIC : Enable basic mode of test mode + * @arg CAN_MODE_SILENT : Enable silent mode of test mode + * @arg CAN_MODE_LBACK : Enable Loop Back Mode of test mode + * @arg CAN_MODE_MONITORER : Sample Point can be monitored at CAN_TX pin. + * @arg CAN_MODE_TX_DOMINANT : CAN_TX pin drives a dominant ('0') value + * @arg CAN_MODE_TX_RECESSIVE : CAN_TX pin drives a recessive ('1') value * @retval None ***********************************************************************************************************/ void CAN_EnterTestMode(HT_CAN_TypeDef *CANx, u32 u8TestMask) { - CANx->CR |= CAN_CR_TEST_Msk; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + CANx->CR |= CAN_CR_TEST; CANx->TR = u8TestMask; } /*********************************************************************************************************//** * @brief Leave the test mode - * @param CANx: The pointer to CAN module base address. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. * @retval None ***********************************************************************************************************/ void CAN_LeaveTestMode(HT_CAN_TypeDef *CANx) { - CANx->CR |= CAN_CR_TEST_Msk; - CANx->TR &= ~(CAN_TEST_LBACK_Msk | CAN_TEST_SILENT_Msk | CAN_TEST_BASIC_Msk); - CANx->CR &= (~CAN_CR_TEST_Msk); -} + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); -/*********************************************************************************************************//** - * @brief Get the waiting status of a received message. - * @param CANx: The pointer to CAN module base address. - * @param MsgObj: Specifies the Message object number, from 0 to 31. 0 No message object has new data. - ***********************************************************************************************************/ -u32 CAN_IsNewDataReceived(HT_CAN_TypeDef *CANx, u32 MsgObj) -{ - MsgObj--; - return (MsgObj < 16 ? CANx->NDR0 & (1 << MsgObj) : CANx->NDR1 & (1 << (MsgObj - 16))); + CANx->CR |= CAN_CR_TEST; + CANx->TR &= ~(CAN_MODE_LBACK | CAN_MODE_SILENT | CAN_MODE_BASIC | CAN_MODE_TX_RECESSIVE); + CANx->CR &= (~CAN_CR_TEST); } /*********************************************************************************************************//** * @brief The function is used to Send CAN message in BASIC mode of test mode. Before call the API, * the user should be call CAN_EnterTestMode(CAN_TEST_BASIC) and let CAN controller enter * basic mode of test mode. Please notice IF0 Registers used as Tx Buffer in basic mode. - * @param CANx: The pointer to CAN module base address. - * @param pCanMsg: Pointer to the message structure containing data to transmit. - * @retval TRUE: Transmission OK, FALSE: Check busy flag of interface 0 is timeout + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the data buffer to be transmitted. + * @param len: Length of the data to be transmitted. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -s32 CAN_BasicSendMsg(HT_CAN_TypeDef *CANx, STR_CANMSG_T_TypeDef* pCanMsg) +ErrStatus CAN_BasicSendMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len) { - u32 i = 0; - while(CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk); + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + if (CANx->SR & CAN_FLAG_BOFF) + { + return ERROR; + } + while (CANx->IF0.CREQ & CAN_FLAG_IF_BUSY) + { + } - CANx->SR &= (~CAN_SR_TXOK_Msk); + CANx->SR &= (~CAN_FLAG_TXOK); - if(pCanMsg->IdType == CAN_STD_ID) + if (pCanMsg->IdType == CAN_STD_ID) { - /* standard ID*/ + /* standard ID */ CANx->IF0.ARB0 = 0; - CANx->IF0.ARB1 = (((pCanMsg->Id) & 0x7FF) << 2) ; + CANx->IF0.ARB1 = (((pCanMsg->Id) & CAN_STD_FRAME_Msk) << 2); } else { - /* extended ID*/ - CANx->IF0.ARB0 = (pCanMsg->Id) & 0xFFFF; - CANx->IF0.ARB1 = ((pCanMsg->Id) & 0x1FFF0000) >> 16 | CAN_IF_ARB1_XTD_Msk; + /* extended ID */ + CANx->IF0.ARB0 = (pCanMsg->Id) & CAN_EXT_FRAME_LSB_Msk; + CANx->IF0.ARB1 = (((pCanMsg->Id) >> 16) & CAN_EXT_FRAME_MSB_Msk) | CAN_IF_ARB1_XTD; } - if(pCanMsg->FrameType) - CANx->IF0.ARB1 |= CAN_IF_ARB1_DIR_Msk; + if (pCanMsg->FrameType) + CANx->IF0.ARB1 |= CAN_IF_ARB1_DIR; else - CANx->IF0.ARB1 &= (~CAN_IF_ARB1_DIR_Msk); + CANx->IF0.ARB1 &= (~CAN_IF_ARB1_DIR); - CANx->IF0.MCR = (CANx->IF0.MCR & (~CAN_IF_MCR_DLC_Msk)) | pCanMsg->DLC; - CANx->IF0.DA0R = ((u16)pCanMsg->Data[1] << 8) | pCanMsg->Data[0]; - CANx->IF0.DA1R = ((u16)pCanMsg->Data[3] << 8) | pCanMsg->Data[2]; - CANx->IF0.DB0R = ((u16)pCanMsg->Data[5] << 8) | pCanMsg->Data[4]; - CANx->IF0.DB1R = ((u16)pCanMsg->Data[7] << 8) | pCanMsg->Data[6]; + CANx->IF0.MCR = (CANx->IF0.MCR & (~CAN_IF_MCR_DLC_Msk)) | len; + CANx->IF0.DA0R = ((u16)data[1] << 8) | data[0]; + CANx->IF0.DA1R = ((u16)data[3] << 8) | data[2]; + CANx->IF0.DB0R = ((u16)data[5] << 8) | data[4]; + CANx->IF0.DB1R = ((u16)data[7] << 8) | data[6]; - /* request transmission*/ - CANx->IF0.CREQ &= (~CAN_IF_CREQ_BUSY_Msk); - if(CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) + /* request transmission */ + CANx->IF0.CREQ &= (~CAN_FLAG_IF_BUSY); + if (CANx->IF0.CREQ & CAN_FLAG_IF_BUSY) { - return FALSE; + return ERROR; } - CANx->IF0.CREQ |= CAN_IF_CREQ_BUSY_Msk; /* Sending */ - - for(i = 0; i < 0xFFFFF; i++) - { - if((CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - break; - } + CANx->IF0.CREQ |= CAN_FLAG_IF_BUSY; /* Sending */ - if(i >= 0xFFFFFFF) - { - return FALSE; - } - return TRUE; + return SUCCESS; } /*********************************************************************************************************//** * @brief Get a message information in BASIC mode. - * @param CANx: The pointer to CAN module base address. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval FALSE: No any message received, TRUE: Receive a message success. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the buffer where received data will be stored. + * @param len: Pointer to a variable that will store the length of the received data. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -s32 CAN_BasicReceiveMsg(HT_CAN_TypeDef *CANx, STR_CANMSG_T_TypeDef* pCanMsg) +ErrStatus CAN_BasicReceiveMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8* len) { - if((CANx->IF1.MCR & CAN_IF_MCR_NEWDAT_Msk) == 0) /* In basic mode, receive data always save in IF1 */ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + if ((CANx->IF1.MCR & CAN_IF_MCR_NEWDAT) == 0) /* In basic mode, receive data always save in IF1 */ { - return FALSE; + return ERROR; } - CANx->SR &= (~CAN_SR_RXOK_Msk); + CANx->SR &= (~CAN_FLAG_RXOK); - CANx->IF1.CMASK = CAN_IF_CMASK_ARB_Msk - | CAN_IF_CMASK_CONTROL_Msk - | CAN_IF_CMASK_DATAA_Msk - | CAN_IF_CMASK_DATAB_Msk; + CANx->IF1.CMASK = CAN_IF_CMASK_ARB + | CAN_IF_CMASK_CONTROL + | CAN_IF_CMASK_DATAA + | CAN_IF_CMASK_DATAB; - if((CANx->IF1.MASK1 & CAN_IF_ARB1_XTD_Msk) == 0) + if ((CANx->IF1.MASK1 & CAN_IF_ARB1_XTD) == 0) { - /* standard ID*/ + /* standard ID */ pCanMsg->IdType = CAN_STD_ID; - pCanMsg->Id = (CANx->IF1.MASK1 >> 2) & 0x07FF; + pCanMsg->Id = (CANx->IF1.MASK1 >> 2) & CAN_STD_FRAME_Msk; } else { - /* extended ID*/ + /* extended ID */ pCanMsg->IdType = CAN_EXT_ID; - pCanMsg->Id = (CANx->IF1.ARB1 & 0x1FFF) << 16; - pCanMsg->Id |= (u32)CANx->IF1.ARB0; + pCanMsg->Id = (CANx->IF1.ARB1 & CAN_EXT_FRAME_MSB_Msk) << 16; + pCanMsg->Id |= (u32)CANx->IF1.ARB0; } - pCanMsg->FrameType = !((CANx->IF1.ARB1 & CAN_IF_ARB1_DIR_Msk) >> CAN_IF_ARB1_DIR_Pos); - - pCanMsg->DLC = CANx->IF1.MCR & CAN_IF_MCR_DLC_Msk; - pCanMsg->Data[0] = CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA0_Msk; - pCanMsg->Data[1] = (CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; - pCanMsg->Data[2] = CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA2_Msk; - pCanMsg->Data[3] = (CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; - pCanMsg->Data[4] = CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA4_Msk; - pCanMsg->Data[5] = (CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; - pCanMsg->Data[6] = CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA6_Msk; - pCanMsg->Data[7] = (CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; - - return TRUE; + *len = CANx->IF1.MCR & CAN_IF_MCR_DLC_Msk; + data[0] = CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA0_Msk; + data[1] = (CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; + data[2] = CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA2_Msk; + data[3] = (CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; + data[4] = CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA4_Msk; + data[5] = (CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; + data[6] = CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA6_Msk; + data[7] = (CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; + + return SUCCESS; } /*********************************************************************************************************//** - * @brief Set Rx message object - * @param CANx: The pointer to CAN module base address. - * @param MsgObj: Specifies the Message object number, from 0 to 31. - * @arg CAN_STD_ID (standard ID, 11-bit) - * @arg CAN_EXT_ID (extended ID, 29-bit) - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval TRUE: SUCCESS, FALSE: No useful interface. + * @brief Send CAN message. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the data buffer to be transmitted. + * @param len: Length of the data to be transmitted. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -s32 CAN_SetRxMsgObj(HT_CAN_TypeDef *CANx, u32 MsgObj, STR_CANMSG_R_TypeDef* pCanMsg) +ErrStatus CAN_Transmit(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len) { - u32 u8MsgIfNum = 0; - - if((u8MsgIfNum = GetFreeIF(CANx)) == 2) /* Check Free Interface for configure */ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + if (_CAN_SetTxMsg(CANx, pCanMsg, data, len) == ERROR) { - return FALSE; + return ERROR; } + return (CAN_TriggerTxMsg(CANx, pCanMsg)); +} - if (u8MsgIfNum == 1) +/*********************************************************************************************************//** + * @brief Gets the message, if received. + * The Interface Registers avoid conflict between the CPU accesses to the Message RAM and CAN message + * reception and transmission by buffering the data to be transferred. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the buffer where received data will be stored. + * @param len: Pointer to a variable that will store the length of the received data. + * @retval RxStatus_TypeDef: Returns the status of the message reception. Possible values are: + * - MSG_OBJ_NOT_SET + * - MSG_NOT_RECEIVED + * - MSG_OVER_RUN + ***********************************************************************************************************/ +CAN_RxStatus_TypeDef CAN_Receive(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u32* len) +{ + u32 _MsgNum = pCanMsg->MsgNum; + CAN_RxStatus_TypeDef status = MSG_OBJ_NOT_SET; + bool firstMsg = TRUE; + *len = 0; + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) != FALSE) { - /* Command Setting */ - CANx->IF1.CMASK = CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_MASK_Msk | CAN_IF_CMASK_ARB_Msk | - CAN_IF_CMASK_CONTROL_Msk | CAN_IF_CMASK_DATAA_Msk | CAN_IF_CMASK_DATAB_Msk; - - if(pCanMsg->IdType == CAN_STD_ID) /* According STD/EXT ID format,Configure Mask and Arbitration register */ - { - CANx->IF1.ARB0 = 0; - CANx->IF1.ARB1 = CAN_IF_ARB1_MSGVAL_Msk | (pCanMsg->Id & 0x7FF) << 2; - CANx->IF1.MASK0 = pCanMsg->MASK0; - CANx->IF1.MASK1 = pCanMsg->MASK1; - } - else + while (1) { - CANx->IF1.ARB0 = pCanMsg->Id & 0xFFFF; - CANx->IF1.ARB1 = CAN_IF_ARB1_MSGVAL_Msk | CAN_IF_ARB1_XTD_Msk | (pCanMsg->Id & 0x1FFF0000) >> 16; + s32 ReadMsgStatus; + if (_CAN_GetNewData(CANx, _MsgNum) == FALSE) + { + if (firstMsg == TRUE) + status = MSG_NOT_RECEIVED; + else + status = MSG_RX_FINISH; + break; + } + firstMsg = FALSE; + ReadMsgStatus = _CAN_ReadMsgObj(CANx, _MsgNum, TRUE, pCanMsg, &data[*len], len); + if (ReadMsgStatus != 0) + { + if (ReadMsgStatus == 2) + { + status = MSG_OVER_RUN; + break; + } + status = MSG_RX_FINISH; + break; + } + _MsgNum++; } + } + return status; +} - CANx->IF1.MCR |= CAN_IF_MCR_RXIE_Msk | pCanMsg->MCR ; +/*********************************************************************************************************//** + * @brief Cancels a transmit request. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_CancelTransmit(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg) +{ + HT_CANIF_TypeDef *IFx = NULL; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); - if(pCanMsg->UMASK) - { - CANx->IF1.MCR |= CAN_IF_MCR_UMASK_Msk; - CANx->IF1.MASK0 = pCanMsg->MASK0; - CANx->IF1.MASK1 = pCanMsg->MASK1; - } + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return ERROR; + } - if(pCanMsg->RMTEN) - CANx->IF1.MCR |= CAN_IF_MCR_RMTEN_Msk; - else - CANx->IF1.MCR &= (~CAN_IF_MCR_RMTEN_Msk); + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + if ((IFx->CREQ & CAN_FLAG_IF_BUSY) == 0) + { + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_CLRINTPND; + IFx->MCR = 0; + IFx->CREQ = pCanMsg->MsgNum; + } - if(pCanMsg->EOB) - CANx->IF1.MCR |= CAN_IF_MCR_EOB_Msk; - else - CANx->IF1.MCR &= (~CAN_IF_MCR_EOB_Msk); + return SUCCESS; +} - CANx->IF1.MCR &= (~CAN_IF_MCR_INTPND_Msk); - CANx->IF1.MCR &= (~CAN_IF_MCR_NEWDAT_Msk); - CANx->IF1.DA0R = 0; - CANx->IF1.DA1R = 0; - CANx->IF1.DB0R = 0; - CANx->IF1.DB1R = 0; - CANx->IF1.CREQ = MsgObj+1; +/*********************************************************************************************************//** + * @brief Discard the specified FIFO. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_DiscardRxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg) +{ + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return ERROR; } - else + while (1) { - /* Command Setting */ - CANx->IF0.CMASK = CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_MASK_Msk | CAN_IF_CMASK_ARB_Msk | - CAN_IF_CMASK_CONTROL_Msk | CAN_IF_CMASK_DATAA_Msk | CAN_IF_CMASK_DATAB_Msk; - - if(pCanMsg->IdType == CAN_STD_ID) /* According STD/EXT ID format,Configure Mask and Arbitration register */ + HT_CANIF_TypeDef *IFx = NULL; + while (IFx == NULL) { - CANx->IF0.ARB0 = 0; - CANx->IF0.ARB1 = CAN_IF_ARB1_MSGVAL_Msk | (pCanMsg->Id & 0x7FF) << 2; - CANx->IF0.MASK0 = pCanMsg->MASK0; - CANx->IF0.MASK1 = pCanMsg->MASK1; + IFx = _GetFreeIF(CANx); } - else + IFx->CMASK = CAN_IF_CMASK_TXRQSTNEWDAT | CAN_IF_CMASK_CONTROL; + IFx->CREQ = pCanMsg->MsgNum; + if (IFx->MCR & CAN_IF_MCR_EOB) { - CANx->IF0.ARB0 = pCanMsg->Id & 0xFFFF; - CANx->IF0.ARB1 = CAN_IF_ARB1_MSGVAL_Msk | CAN_IF_ARB1_XTD_Msk | (pCanMsg->Id & 0x1FFF0000) >> 16; + break; } + } + return SUCCESS; +} - CANx->IF0.MCR |= CAN_IF_MCR_RXIE_Msk | pCanMsg->MCR ; +/*********************************************************************************************************//** + * @brief The function is used to configure several receive message objects. + * The Interface Registers avoid conflict between the CPU accesses to the Message RAM and CAN message + * reception and transmission by buffering the data to be transferred. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param FifoDepth: the number of MSG RAM of the FIFO. + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_SetRxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u32 FifoDepth) +{ + s32 i = 0; + u32 _MsgNum; - if(pCanMsg->UMASK) + u32 eob; + if (pCanMsg->MsgNum == 0) + { + _MsgNum = _CAN_GetValidMsg(CANx); + } + else + { + _MsgNum = pCanMsg->MsgNum; + } + if ((_MsgNum + FifoDepth) > MSG_OBJ_TOTAL_NUM) + { + return ERROR; + } + pCanMsg->MsgNum = _MsgNum; + eob = 0; + for (i = _MsgNum; i < FifoDepth + _MsgNum + 1; i++) + { + if (i == FifoDepth + _MsgNum) { - CANx->IF0.MCR |= CAN_IF_MCR_UMASK_Msk; - CANx->IF0.MASK0 = pCanMsg->MASK0; - CANx->IF0.MASK1 = pCanMsg->MASK1; + eob = 1; } + _CAN_SetRxMsgObj(CANx, i, pCanMsg, eob); + } + return SUCCESS; +} - if(pCanMsg->RMTEN) - CANx->IF0.MCR |= CAN_IF_MCR_RMTEN_Msk; - else - CANx->IF0.MCR &= (~CAN_IF_MCR_RMTEN_Msk); - - if(pCanMsg->EOB) - CANx->IF0.MCR |= CAN_IF_MCR_EOB_Msk; - else - CANx->IF0.MCR &= (~CAN_IF_MCR_EOB_Msk); +/*********************************************************************************************************//** + * @brief Get the waiting status of a received message. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval TRUE: The corresponding message object has a new data bit is set, FALSE otherwise. + ***********************************************************************************************************/ +bool CAN_NewDataReceived(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg) +{ - CANx->IF0.MCR &= (~CAN_IF_MCR_INTPND_Msk); - CANx->IF0.MCR &= (~CAN_IF_MCR_NEWDAT_Msk); - CANx->IF0.DA0R = 0; - CANx->IF0.DA1R = 0; - CANx->IF0.DB0R = 0; - CANx->IF0.DB1R = 0; - CANx->IF0.CREQ = MsgObj+1; + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return FALSE; } - return TRUE; + return _CAN_GetNewData(CANx, pCanMsg->MsgNum); } /*********************************************************************************************************//** - * @brief Gets the message - * @param CANx: The pointer to CAN module base address. - * @param MsgObj: Specifies the Message object number, from 0 to 31. - * @param Release: Specifies the message release indicator. - * @arg TRUE : the message object is released when getting the data. - * @arg FALSE: the message object is not released. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval TRUE Success, FALSE No any message received + * @brief Get the interrupt pending status of a message object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval TRUE: The corresponding message object has a interrupt pending bit is set, FALSE otherwise. ***********************************************************************************************************/ -s32 CAN_ReadMsgObj(HT_CAN_TypeDef *CANx, u32 MsgObj, u32 Release, STR_CANMSG_T_TypeDef* pCanMsg) +bool CAN_GetMsgPending(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg) { - u32 u8MsgIfNum = 0; + u32 Pending = CANx->IPR0; + Pending |= CANx->IPR1 << 16; - if(!CAN_IsNewDataReceived(CANx, MsgObj)) + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) { return FALSE; } - if((u8MsgIfNum = GetFreeIF(CANx)) == 2) /* Check Free Interface for configure */ + if ((Pending & 1 << (pCanMsg->MsgNum - 1)) == 0) { return FALSE; } + return TRUE; +} - CANx->SR &= (~CAN_SR_RXOK_Msk); - - if (u8MsgIfNum == 1) +/*********************************************************************************************************//** + * @brief Clear interrupt pending bit. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval SUCCESS or ERROR + ***********************************************************************************************************/ +ErrStatus CAN_ClearMsgPendingFlag(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg) +{ + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) { - /* read the message contents*/ - CANx->IF1.CMASK = CAN_IF_CMASK_MASK_Msk - | CAN_IF_CMASK_ARB_Msk - | CAN_IF_CMASK_CONTROL_Msk - | CAN_IF_CMASK_CLRINTPND_Msk - | (Release ? CAN_IF_CMASK_TXRQSTNEWDAT_Msk : 0) - | CAN_IF_CMASK_DATAA_Msk - | CAN_IF_CMASK_DATAB_Msk; + return ERROR; + } + _CAN_ClearMsgPendingFlag(CANx, pCanMsg->MsgNum); - CANx->IF1.CREQ = MsgObj; + return SUCCESS; +} - while(CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) - { - /*Wait*/ - } +/*********************************************************************************************************//** + * @brief Checks the transmission of a message object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval 0: Transmitting, 1: Transmission successful, -1: Transmission failed. + ***********************************************************************************************************/ +s32 CAN_TransmitStatus(HT_CAN_TypeDef* CANx, CAN_MSG_TypeDef* pCanMsg) +{ + s32 TxStatus = 0; + u32 u32Reg; + s32 MsgNum = pCanMsg->MsgNum -1; - if((CANx->IF1.ARB1 & CAN_IF_ARB1_XTD_Msk) == 0) - { - /* standard ID*/ - pCanMsg->IdType = CAN_STD_ID; - pCanMsg->Id = (CANx->IF1.ARB1 & CAN_IF_ARB1_ID_Msk) >> 2; - } - else - { - /* extended ID*/ - pCanMsg->IdType = CAN_EXT_ID; - pCanMsg->Id = (CANx->IF1.ARB1 & 0x1FFF) << 16 ; - pCanMsg->Id |= CANx->IF1.ARB0; - } - pCanMsg->MCR = CANx->IF1.MCR; - pCanMsg->DLC = CANx->IF1.MCR & CAN_IF_MCR_DLC_Msk; - pCanMsg->EOB = CANx->IF1.MCR & CAN_IF_MCR_EOB_Msk; - pCanMsg->Data[0] = CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA0_Msk; - pCanMsg->Data[1] = (CANx->IF1.DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; - pCanMsg->Data[2] = CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA2_Msk; - pCanMsg->Data[3] = (CANx->IF1.DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; - pCanMsg->Data[4] = CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA4_Msk; - pCanMsg->Data[5] = (CANx->IF1.DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; - pCanMsg->Data[6] = CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA6_Msk; - pCanMsg->Data[7] = (CANx->IF1.DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; - } - else + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) { - /* read the message contents*/ - CANx->IF0.CMASK = CAN_IF_CMASK_MASK_Msk - | CAN_IF_CMASK_ARB_Msk - | CAN_IF_CMASK_CONTROL_Msk - | CAN_IF_CMASK_CLRINTPND_Msk - | (Release ? CAN_IF_CMASK_TXRQSTNEWDAT_Msk : 0) - | CAN_IF_CMASK_DATAA_Msk - | CAN_IF_CMASK_DATAB_Msk; - - CANx->IF0.CREQ = MsgObj; + return -1; + } - while(CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) - { - /*Wait*/ - } + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); - if((CANx->IF0.ARB1 & CAN_IF_ARB1_XTD_Msk) == 0) - { - /* standard ID*/ - pCanMsg->IdType = CAN_STD_ID; - pCanMsg->Id = (CANx->IF0.ARB1 & CAN_IF_ARB1_ID_Msk) >> 2; - } - else - { - /* extended ID*/ - pCanMsg->IdType = CAN_EXT_ID; - pCanMsg->Id = (CANx->IF0.ARB1 & 0x1FFF) << 16; - pCanMsg->Id |= CANx->IF0.ARB0; - } + u32Reg = CANx->TRR0; + u32Reg |= (CANx->TRR1 << 16); + MsgNum = 1 << (MsgNum); + if ((u32Reg & (MsgNum)) == 0) + { + TxStatus = 1; + } - pCanMsg->MCR = CANx->IF0.MCR; - pCanMsg->DLC = CANx->IF0.MCR & CAN_IF_MCR_DLC_Msk; - pCanMsg->EOB = CANx->IF0.MCR & CAN_IF_MCR_EOB_Msk; - pCanMsg->Data[0] = CANx->IF0.DA0R & CAN_IF_DAT_A0_DATA0_Msk; - pCanMsg->Data[1] = (CANx->IF0.DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; - pCanMsg->Data[2] = CANx->IF0.DA1R & CAN_IF_DAT_A1_DATA2_Msk; - pCanMsg->Data[3] = (CANx->IF0.DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; - pCanMsg->Data[4] = CANx->IF0.DB0R & CAN_IF_DAT_B0_DATA4_Msk; - pCanMsg->Data[5] = (CANx->IF0.DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; - pCanMsg->Data[6] = CANx->IF0.DB1R & CAN_IF_DAT_B1_DATA6_Msk; - pCanMsg->Data[7] = (CANx->IF0.DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; + u32Reg = CANx->NDR0; + u32Reg |= (CANx->NDR1 << 16); + if ((u32Reg & (MsgNum)) > 0) + { + TxStatus = -1; } - return TRUE; + return TxStatus; } /*********************************************************************************************************//** - * @brief Set bus baud-rate. - * @param CANx: The pointer to CAN module base address. - * @param wBaudRate: The target CAN baud-rate. The range of u32BaudRate is 1~1000KHz. - * @retval CurrentBitRate: Real baud-rate value. + * @brief Updates the data of a specified CAN message object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the data array. + * @param len: Length of the data to be sent, in bytes (maximum 8 bytes). + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -u32 CAN_SetBaudRate(HT_CAN_TypeDef *CANx, u32 wBaudRate) +ErrStatus CAN_UpdateTxMsgData(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len) { - u32 wTseg0, wTseg1; - u32 wBrp; - u32 wValue; - - CAN_EnterInitMode(CANx); - - SystemCoreClockUpdate(); + HT_CANIF_TypeDef *IFx = NULL; - wTseg0 = 2; - wTseg1 = 1; - - wValue = SystemCoreClock / wBaudRate; - - while(1) + len &= CAN_IF_MCR_DLC_Msk; + while (IFx == NULL) { - if(((wValue % (wTseg0 + wTseg1 + 3)) == 0)) - break; - if(wTseg1 < 7) - wTseg1++; + IFx = _GetFreeIF(CANx); + } - if((wValue % (wTseg0 + wTseg1 + 3)) == 0) - break; - if(wTseg0 < 15) - wTseg0++; - else - { - wTseg0 = 2; - wTseg1 = 1; - break; - } + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return ERROR; } - wBrp = SystemCoreClock / (wBaudRate) / (wTseg0 + wTseg1 + 3) - 1; + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_DATAA | CAN_IF_CMASK_DATAB | CAN_IF_CMASK_CONTROL; - wValue = ((u32)wTseg1 << CAN_BTR_TSEG1_Pos) | ((u32)wTseg0 << CAN_BTR_TSEG0_Pos) | - (wBrp & CAN_BTR_BRP_Msk) | (CANx->BTR & CAN_BTR_SJW_Msk); - CANx->BTR = wValue; - CANx->BRPER = (wBrp >> 6) & 0x0F; + IFx->MCR &= (~CAN_IF_MCR_DLC_Msk); + IFx->MCR |= (len & CAN_IF_MCR_DLC_Msk); + IFx->DA0R = ((u16)(data[1] << 8) | data[0]); + IFx->DA1R = ((u16)(data[3] << 8) | data[2]); + IFx->DB0R = ((u16)(data[5] << 8) | data[4]); + IFx->DB1R = ((u16)(data[7] << 8) | data[6]); - CAN_LeaveInitMode(CANx); + IFx->CREQ = pCanMsg->MsgNum; - return (CAN_GetCANBitRate(CANx)); + return SUCCESS; } /*********************************************************************************************************//** - * @brief The function is used to disable all CAN interrupt. - * @param CANx: The pointer to CAN module base address. - * @retval None + * @brief Set transmit request bit. + * If a transmission is requested by programming bit TxRqst/NewDat, the TxRqst will be ignored. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -void CAN_Close(HT_CAN_TypeDef *CANx) +ErrStatus CAN_TriggerTxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg) { - CAN_DisableInt(CANx, (CAN_CR_IE_Msk | CAN_CR_SIE_Msk | CAN_CR_EIE_Msk)); + HT_CANIF_TypeDef *IFx = NULL; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + if (CANx->SR & CAN_FLAG_BOFF) + { + return ERROR; + } + + if (_CAN_CheckMsgIsValid(CANx, pCanMsg->MsgNum) == FALSE) + { + return ERROR; + } + + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_CONTROL; + IFx->MCR |= CAN_IF_MCR_NEWDAT | CAN_IF_MCR_TXRQST; + IFx->CREQ = pCanMsg->MsgNum; + + return SUCCESS; } /*********************************************************************************************************//** - * @brief Set CAN operation mode and target baud-rate. - * @param CANx: The pointer to CAN module base address. - * @param wBaudRate The target CAN baud-rate. The range of u32BaudRate is 1~1000KHz. - * @param wMode The CAN operation mode. - * @arg CAN_NORMAL_MODE : Normal operation. - * @arg CAN_BASIC_MODE : Basic operation. - * @arg CAN_SILENT_MODE : Silent operation. - * @arg CAN_LBACK_MODE : Loop Back operation. - * @arg CAN_LBS_MODE : Loop Back combined with Silent operation. - * @retval u32CurrentBitRate Real baud-rate value. + * @brief Clears all pending message flags. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval None ***********************************************************************************************************/ -u32 CAN_Open(HT_CAN_TypeDef *CANx, u32 wBaudRate, u32 wMode) +void CAN_ClearAllMsgPendingFlag(HT_CAN_TypeDef *CANx) { - u32 CurrentBitRate; - - CurrentBitRate = CAN_SetBaudRate(CANx, wBaudRate); - - if(wMode) - CAN_EnterTestMode(CANx, wMode); + int i; + u32 Pending = CANx->IPR0; + Pending |= CANx->IPR1 << 16; + for (i = 0 ; i < MSG_OBJ_TOTAL_NUM ; i++) + { + if ((Pending & 1) == 1) + { + _CAN_ClearMsgPendingFlag(CANx, i + 1); + } - return CurrentBitRate; + Pending = Pending >> 1; + if (Pending == 0) + { + break; + } + } } +/** + * @} + */ +/* Private functions ---------------------------------------------------------------------------------------*/ +/** @defgroup CAN_Private_Functions CAN private functions + * @{ + */ /*********************************************************************************************************//** * @brief The function is used to configure a transmit object. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval FALSE No useful interface, TRUE Config message object success. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the data buffer to be transmitted. + * @param len: Length of the data to be transmitted. + * @retval SUCCESS or ERROR ***********************************************************************************************************/ -s32 CAN_SetTxMsg(HT_CAN_TypeDef *CANx, u32 MsgNum , STR_CANMSG_T_TypeDef* pCanMsg) +ErrStatus _CAN_SetTxMsg(HT_CAN_TypeDef *CANx, CAN_MSG_TypeDef* pCanMsg, u8* data, u8 len) { - u32 MsgIfNum = 0; - u32 i = 0; - - while((MsgIfNum = GetFreeIF(CANx)) == 2) + HT_CANIF_TypeDef *IFx = NULL; + if (pCanMsg->MsgNum == 0) { - i++; - if(i > 0x10000000) - return FALSE; + pCanMsg->MsgNum = _CAN_GetValidMsg(CANx); + } + if (pCanMsg->MsgNum > MSG_OBJ_TOTAL_NUM) + { + return ERROR; } - /* update the contents needed for transmission*/ - if(MsgIfNum ==0) + while (IFx == NULL) { - CANx->IF0.CMASK = 0xF3; /* CAN_CMASK_WRRD_Msk | CAN_CMASK_MASK_Msk | CAN_CMASK_ARB_Msk - | CAN_CMASK_CONTROL_Msk | CAN_CMASK_DATAA_Msk | CAN_CMASK_DATAB_Msk ; */ + IFx = _GetFreeIF(CANx); + } - if(pCanMsg->IdType == CAN_STD_ID) - { - /* standard ID*/ - CANx->IF0.ARB0 = 0; - CANx->IF0.ARB1 = (((pCanMsg->Id) & 0x7FF) << 2) | CAN_IF_ARB1_DIR_Msk | CAN_IF_ARB1_MSGVAL_Msk; - } - else - { - /* extended ID*/ - CANx->IF0.ARB0 = (pCanMsg->Id) & 0xFFFF; - CANx->IF0.ARB1 = ((pCanMsg->Id) & 0x1FFF0000) >> 16 | CAN_IF_ARB1_DIR_Msk - | CAN_IF_ARB1_XTD_Msk | CAN_IF_ARB1_MSGVAL_Msk; - } + /* update the contents needed for transmission */ + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_MASK | CAN_IF_CMASK_ARB + | CAN_IF_CMASK_CONTROL | CAN_IF_CMASK_DATAA | CAN_IF_CMASK_DATAB; - if(pCanMsg->FrameType) - CANx->IF0.ARB1 |= CAN_IF_ARB1_DIR_Msk; - else - CANx->IF0.ARB1 &= (~CAN_IF_ARB1_DIR_Msk); - - CANx->IF0.DA0R = ((u16)pCanMsg->Data[1] << 8) | pCanMsg->Data[0]; - CANx->IF0.DA1R = ((u16)pCanMsg->Data[3] << 8) | pCanMsg->Data[2]; - CANx->IF0.DB0R = ((u16)pCanMsg->Data[5] << 8) | pCanMsg->Data[4]; - CANx->IF0.DB1R = ((u16)pCanMsg->Data[7] << 8) | pCanMsg->Data[6]; - CANx->IF0.MCR = 0; - if(pCanMsg->RMTEN) - CANx->IF0.MCR |= CAN_IF_MCR_RMTEN_Msk; - else - CANx->IF0.MCR &= (~CAN_IF_MCR_RMTEN_Msk); - if(pCanMsg->EOB) - CANx->IF0.MCR |= CAN_IF_MCR_EOB_Msk; - else - CANx->IF0.MCR &= (~CAN_IF_MCR_EOB_Msk); - - CANx->IF0.MCR |= CAN_IF_MCR_NEWDAT_Msk | pCanMsg->DLC | CAN_IF_MCR_TXIE_Msk ; - CANx->IF0.CREQ = MsgNum +1; + if (pCanMsg->IdType == CAN_STD_ID) + { + /* standard ID */ + IFx->ARB0 = 0; + IFx->ARB1 = (((pCanMsg->Id) & CAN_STD_FRAME_Msk) << 2) | CAN_IF_ARB1_DIR | CAN_IF_ARB1_MSGVAL; } else { - CANx->IF1.CMASK = 0xF3; /* CAN_CMASK_WRRD_Msk | CAN_CMASK_MASK_Msk | CAN_CMASK_ARB_Msk - | CAN_CMASK_CONTROL_Msk | CAN_CMASK_DATAA_Msk | CAN_CMASK_DATAB_Msk ; */ + /* extended ID */ + IFx->ARB0 = (pCanMsg->Id) & CAN_EXT_FRAME_LSB_Msk; + IFx->ARB1 = (((pCanMsg->Id) >> 16) & CAN_EXT_FRAME_MSB_Msk) + | CAN_IF_ARB1_DIR | CAN_IF_ARB1_XTD | CAN_IF_ARB1_MSGVAL; + } - if(pCanMsg->IdType == CAN_STD_ID) - { - /* standard ID*/ - CANx->IF1.ARB0 = 0; - CANx->IF1.ARB1 = (((pCanMsg->Id) & 0x7FF) << 2) | CAN_IF_ARB1_DIR_Msk | CAN_IF_ARB1_MSGVAL_Msk; - } - else - { - /* extended ID*/ - CANx->IF1.ARB0 = (pCanMsg->Id) & 0xFFFF; - CANx->IF1.ARB1 = ((pCanMsg->Id) & 0x1FFF0000) >> 16 | CAN_IF_ARB1_DIR_Msk - | CAN_IF_ARB1_XTD_Msk | CAN_IF_ARB1_MSGVAL_Msk; - } + if (pCanMsg->FrameType) + IFx->ARB1 |= CAN_IF_ARB1_DIR; + else + IFx->ARB1 &= (~CAN_IF_ARB1_DIR); - if(pCanMsg->FrameType) - CANx->IF1.ARB1 |= CAN_IF_ARB1_DIR_Msk; - else - CANx->IF1.ARB1 &= (~CAN_IF_ARB1_DIR_Msk); + IFx->DA0R = ((u16)data[1] << 8) | data[0]; + IFx->DA1R = ((u16)data[3] << 8) | data[2]; + IFx->DB0R = ((u16)data[5] << 8) | data[4]; + IFx->DB1R = ((u16)data[7] << 8) | data[6]; - CANx->IF1.DA0R = ((u16)pCanMsg->Data[1] << 8) | pCanMsg->Data[0]; - CANx->IF1.DA1R = ((u16)pCanMsg->Data[3] << 8) | pCanMsg->Data[2]; - CANx->IF1.DB0R = ((u16)pCanMsg->Data[5] << 8) | pCanMsg->Data[4]; - CANx->IF1.DB1R = ((u16)pCanMsg->Data[7] << 8) | pCanMsg->Data[6]; + IFx->MCR = 0; - CANx->IF1.MCR = 0; + IFx->MCR &= (~CAN_IF_MCR_RMTEN); - if(pCanMsg->RMTEN) - CANx->IF1.MCR |= CAN_IF_MCR_RMTEN_Msk; - else - CANx->IF1.MCR &= (~CAN_IF_MCR_RMTEN_Msk); + IFx->MCR |= CAN_IF_MCR_NEWDAT | len | CAN_IF_MCR_TXIE; + IFx->CREQ = pCanMsg->MsgNum; + return SUCCESS; +} - if(pCanMsg->EOB) - CANx->IF1.MCR |= CAN_IF_MCR_EOB_Msk; - else - CANx->IF1.MCR &= (~CAN_IF_MCR_EOB_Msk); +/*********************************************************************************************************//** + * @brief Get the waiting status of a received message. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param MsgNum: Specifies the Message object number, from 1 to 32. + * @retval TRUE: The corresponding message object has a new data bit is set, FALSE otherwise. + ***********************************************************************************************************/ +bool _CAN_GetNewData(HT_CAN_TypeDef *CANx, u32 MsgNum) +{ + u32 NewData = CANx->NDR0; + NewData |= CANx->NDR1 << 16; - CANx->IF1.MCR |= CAN_IF_MCR_NEWDAT_Msk | pCanMsg->DLC | CAN_IF_MCR_TXIE_Msk ; - CANx->IF1.CREQ = MsgNum +1; + if ((NewData & 1 << (MsgNum - 1)) == 0) + { + return FALSE; } return TRUE; } /*********************************************************************************************************//** - * @brief Set transmit request bit. - * If a transmission is requested by programming bit TxRqst/NewDat (IFn_CMASK[2]), the TxRqst - * (IFn_MCON[8]) will be ignored. - * @param CANx: The pointer to CAN module base address. - * @param u32MsgNum: Specifies the Message object number, from 0 to 31. - * @retval TRUE: Start transmit message. + * @brief Get free interface. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval Free IF pointer. NULL: No IF is free ***********************************************************************************************************/ -s32 CAN_TriggerTxMsg(HT_CAN_TypeDef *CANx, u32 u32MsgNum) +static HT_CANIF_TypeDef *_GetFreeIF(HT_CAN_TypeDef *CANx) { - CANx->SR &= (~CAN_SR_TXOK_Msk); - - /* read the message contents*/ - CANx->IF1.CMASK = CAN_IF_CMASK_CLRINTPND_Msk - | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - - CANx->IF1.CREQ = u32MsgNum+1; + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); - while(CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) + if ((CANx->IF0.CREQ & CAN_FLAG_IF_BUSY) == 0) { - /*Wait*/ + return &CANx->IF0; } - CANx->IF0.CMASK = CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - CANx->IF0.CREQ = u32MsgNum+1; - - return TRUE; + else if ((CANx->IF1.CREQ & CAN_FLAG_IF_BUSY) == 0) + { + return &CANx->IF1; + } + else + { + return NULL; + } } /*********************************************************************************************************//** - * @brief Enable CAN interrupt. - * The application software has two possibilities to follow the source of a message interrupt. - * First, it can follow the IntId in the Interrupt Register and second it can poll the Interrupt Pending Register. - * @param CANx: The pointer to CAN module base address. - * @param u32Mask: Interrupt Mask. - * @arg CAN_CR_IE_Msk : Module interrupt enable. - * @arg CAN_CR_SIE_Msk: Status change interrupt enable. - * @arg CAN_CR_EIE_Msk: Error interrupt enable. + * @brief This function is used to set CAN to enter initialization mode and enable access bit timing + * register.After bit timing configuration ready, user must call CAN_LeaveInitMode() to leave + * initialization mode and lock bit timing register to let new configuration take effect. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. * @retval None ***********************************************************************************************************/ -void CAN_EnableInt(HT_CAN_TypeDef *CANx, u32 u32Mask) +static void _CAN_EnterInitMode(HT_CAN_TypeDef *CANx) { - CAN_EnterInitMode(CANx); - - CANx->CR = (CANx->CR & 0xF1) | ((u32Mask & CAN_CR_IE_Msk) ? CAN_CR_IE_Msk : 0) - | ((u32Mask & CAN_CR_SIE_Msk) ? CAN_CR_SIE_Msk : 0) - | ((u32Mask & CAN_CR_EIE_Msk) ? CAN_CR_EIE_Msk : 0); - + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); - CAN_LeaveInitMode(CANx); + CANx->CR |= CAN_CR_INIT; + CANx->CR |= CAN_CR_CCE; } /*********************************************************************************************************//** - * @brief Disable CAN interrupt. - * @param CANx: The pointer to CAN module base address. - * @param Mask: Interrupt Mask. (CAN_CR_IE_Msk / CAN_CR_SIE_Msk / CAN_CR_EIE_Msk). + * @brief Leave initialization mode + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. * @retval None ***********************************************************************************************************/ -void CAN_DisableInt(HT_CAN_TypeDef *CANx, u32 Mask) +static void _CAN_LeaveInitMode(HT_CAN_TypeDef *CANx) { - CAN_EnterInitMode(CANx); + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); - CANx->CR = CANx->CR & ~(CAN_CR_IE_Msk | ((Mask & CAN_CR_SIE_Msk) ? CAN_CR_SIE_Msk : 0) - | ((Mask & CAN_CR_EIE_Msk) ? CAN_CR_EIE_Msk : 0)); + CANx->CR &= (~(CAN_CR_INIT | CAN_CR_CCE)); - CAN_LeaveInitMode(CANx); + while (CANx->CR & CAN_CR_INIT); /* Check INIT bit is released */ } - /*********************************************************************************************************//** - * @brief The function is used to configure a receive message object. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @arg CAN_STD_ID: The 11-bit identifier. - * @arg CAN_EXT_ID: The 29-bit identifier. - * @retval FALSE No useful interface, TRUE Configure a receive message object success. + * @brief Set Rx message object + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param MsgNum: Specifies the Message object number, from 1 to 32. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param uSingleOrFifoLast: Specifies the end-of-buffer indicator. + * @retval None ***********************************************************************************************************/ -s32 CAN_SetRxMsg(HT_CAN_TypeDef *CANx, u32 MsgNum , STR_CANMSG_R_TypeDef* pCanMsg) +static void _CAN_SetRxMsgObj(HT_CAN_TypeDef *CANx, u32 MsgNum, CAN_MSG_TypeDef* pCanMsg, u32 uSingleOrFifoLast) { - u32 TimeOutCount = 0; + HT_CANIF_TypeDef *IFx = NULL; - while(CAN_SetRxMsgObj(CANx, MsgNum, pCanMsg) == FALSE) + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + while (IFx == NULL) { - TimeOutCount++; - - if(TimeOutCount >= 0x10000000) return FALSE; + IFx = _GetFreeIF(CANx); } + /* Command Setting */ + IFx->CMASK = CAN_IF_CMASK_WRRD | CAN_IF_CMASK_MASK | CAN_IF_CMASK_ARB | + CAN_IF_CMASK_CONTROL | CAN_IF_CMASK_DATAA | CAN_IF_CMASK_DATAB; - return TRUE; -} - -/*********************************************************************************************************//** - * @brief The function is used to configure several receive message objects. - * The Interface Registers avoid conflict between the CPU accesses to the Message RAM and CAN message - * reception and transmission by buffering the data to be transferred. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: The starting MSG RAM number(0 ~ 31). - * @param MsgCount: the number of MSG RAM of the FIFO. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @arg CAN_STD_ID: The 11-bit identifier. - * @arg CAN_EXT_ID: The 29-bit identifier. - * @retval FALSE No useful interface, TRUE Configure receive message objects success. - ***********************************************************************************************************/ -s32 CAN_SetMultiRxMsg(HT_CAN_TypeDef *CANx, u32 MsgNum , u32 MsgCount, STR_CANMSG_R_TypeDef* pCanMsg) -{ - u32 i = 0; - u32 TimeOutCount; - - for(i = 1; i < MsgCount+1; i++) + if (pCanMsg->IdType == CAN_STD_ID) /* According STD/EXT ID format, Configure Mask and Arbitration register */ + { + /* Standard Mask.(bit28..bit18). */ + IFx->ARB0 = 0; + IFx->ARB1 = CAN_IF_ARB1_MSGVAL | (pCanMsg->Id & CAN_STD_FRAME_Msk) << 2; + IFx->MASK0 = 0; + IFx->MASK1 = CAN_IF_MASK1_MDIR | (pCanMsg->IdMask & CAN_STD_FRAME_Msk) << 2; + } + else { - TimeOutCount = 0; - pCanMsg->EOB = 0; + IFx->ARB0 = pCanMsg->Id & CAN_EXT_FRAME_LSB_Msk; + IFx->ARB1 = CAN_IF_ARB1_MSGVAL | CAN_IF_ARB1_XTD | ((pCanMsg->Id >> 16) & CAN_EXT_FRAME_MSB_Msk); + IFx->MASK0 = pCanMsg->IdMask & CAN_EXT_FRAME_LSB_Msk; + IFx->MASK1 = CAN_IF_MASK1_MXTD | CAN_IF_MASK1_MDIR | ((pCanMsg->IdMask>> 16) & CAN_EXT_FRAME_MSB_Msk); + } - if(i == MsgCount) - pCanMsg->EOB=1; + IFx->MCR = CAN_IF_MCR_RXIE | CAN_IF_MCR_UMASK; - while(CAN_SetRxMsgObj(CANx, MsgNum, pCanMsg) == FALSE) - { - TimeOutCount++; + if (pCanMsg->FrameType == CAN_REMOTE_FRAME) + { - if(TimeOutCount >= 0x10000000) - return FALSE; - } - MsgNum ++; + IFx->ARB1 |= CAN_IF_ARB1_DIR; + IFx->MCR |= CAN_IF_MCR_RMTEN; } - return TRUE; + if (uSingleOrFifoLast) + IFx->MCR |= CAN_IF_MCR_EOB; + + IFx->MCR &= (~CAN_IF_MCR_INTPND); + IFx->MCR &= (~CAN_IF_MCR_NEWDAT); + IFx->CREQ = MsgNum; } /*********************************************************************************************************//** - * @brief Send CAN message. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval FALSE: 1. When operation in basic mode: Transmit message time out. - * 2. When operation in normal mode: No useful interface. - * TRUE: Transmit Message success. + * @brief Gets the message + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param MsgNum: Specifies the Message object number, from 1 to 32. + * @param Release: Specifies the message release indicator. + * @arg TRUE : the message object is released when getting the data. + * @arg FALSE: the message object is not released. + * @param pCanMsg: Pointer to the message structure for transmitting or receiving data. + * @param data: Pointer to the buffer where received data will be stored. + * @param len: Pointer to a variable that will store the length of the received data. +* @retval 0: Data not empty, 1: Finish, 2: data over run ***********************************************************************************************************/ -s32 CAN_Transmit(HT_CAN_TypeDef *CANx, u32 MsgNum , STR_CANMSG_T_TypeDef* pCanMsg) +static s32 _CAN_ReadMsgObj(HT_CAN_TypeDef *CANx, u32 MsgNum, u32 Release, CAN_MSG_TypeDef* pCanMsg, u8* data, u32* len) { - if((CANx->CR & CAN_CR_TEST_Msk) && (CANx->TR & CAN_TEST_BASIC_Msk)) + HT_CANIF_TypeDef *IFx = NULL; + + /* Check the parameters */ + Assert_Param(IS_CAN(CANx)); + + while (IFx == NULL) { - return (CAN_BasicSendMsg(CANx, pCanMsg)); + IFx = _GetFreeIF(CANx); } - else - { - if(CAN_SetTxMsg(CANx, MsgNum, pCanMsg) == FALSE) - return FALSE; - - CANx->SR &= (~CAN_SR_TXOK_Msk); - /* read the message contents*/ - CANx->IF1.CMASK = CAN_IF_CMASK_CLRINTPND_Msk - | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; + /* read the message contents */ + IFx->CMASK = CAN_IF_CMASK_MASK + | CAN_IF_CMASK_ARB + | CAN_IF_CMASK_CONTROL + | CAN_IF_CMASK_CLRINTPND + | (Release ? CAN_IF_CMASK_TXRQSTNEWDAT : 0) + | CAN_IF_CMASK_DATAA + | CAN_IF_CMASK_DATAB; - CANx->IF1.CREQ = MsgNum+1; + IFx->CREQ = MsgNum; - while(CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) - { - /*Wait*/ - } - CANx->IF0.CMASK = CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - CANx->IF0.CREQ = MsgNum+1; + while (IFx->CREQ & CAN_FLAG_IF_BUSY) + { + /*Wait */ } - return TRUE; -} + if ((IFx->ARB1 & CAN_IF_ARB1_XTD) == 0) + { + /* standard ID */ + pCanMsg->Id = (IFx->ARB1 & CAN_IF_ARB1_ID_Msk) >> 2; + } + else + { + /* extended ID */ + pCanMsg->Id = (IFx->ARB1 & CAN_EXT_FRAME_MSB_Msk) << 16; + pCanMsg->Id |= IFx->ARB0; + } + if ((IFx->MCR & CAN_IF_MCR_RMTEN) == 0) + { + pCanMsg->FrameType = CAN_DATA_FRAME; + } + else + { + pCanMsg->FrameType = CAN_REMOTE_FRAME; + } -/*********************************************************************************************************//** - * @brief Gets the message, if received. - * The Interface Registers avoid conflict between the CPU accesses to the Message RAM and CAN message - * reception and transmission by buffering the data to be transferred. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @param pCanMsg: Pointer to the message structure where received data is copied. - * @retval FALSE: No any message received, TRUE: Receive Message success. - ***********************************************************************************************************/ -s32 CAN_Receive(HT_CAN_TypeDef *CANx, u32 MsgNum , STR_CANMSG_T_TypeDef* pCanMsg) -{ - if((CANx->CR & CAN_CR_TEST_Msk) && (CANx->TR & CAN_TEST_BASIC_Msk)) + *len += IFx->MCR & CAN_IF_MCR_DLC_Msk; + data[0] = IFx->DA0R & CAN_IF_DAT_A0_DATA0_Msk; + data[1] = (IFx->DA0R & CAN_IF_DAT_A0_DATA1_Msk) >> CAN_IF_DAT_A0_DATA1_Pos; + data[2] = IFx->DA1R & CAN_IF_DAT_A1_DATA2_Msk; + data[3] = (IFx->DA1R & CAN_IF_DAT_A1_DATA3_Msk) >> CAN_IF_DAT_A1_DATA3_Pos; + data[4] = IFx->DB0R & CAN_IF_DAT_B0_DATA4_Msk; + data[5] = (IFx->DB0R & CAN_IF_DAT_B0_DATA5_Msk) >> CAN_IF_DAT_B0_DATA5_Pos; + data[6] = IFx->DB1R & CAN_IF_DAT_B1_DATA6_Msk; + data[7] = (IFx->DB1R & CAN_IF_DAT_B1_DATA7_Msk) >> CAN_IF_DAT_B1_DATA7_Pos; + if ((IFx->MCR & CAN_IF_MCR_MSGLST) > 0) + { + IFx->CMASK =CAN_IF_CMASK_WRRD | CAN_IF_CMASK_CONTROL; + IFx->MCR &= ~CAN_IF_MCR_MSGLST; + IFx->CREQ = MsgNum; + IFx->CMASK = CAN_IF_CMASK_TXRQSTNEWDAT; + IFx->CREQ = MsgNum; + return 2; + } + if ((IFx->MCR & CAN_IF_MCR_EOB) > 0) { - return (CAN_BasicReceiveMsg(CANx, pCanMsg)); + return 1; } else { - return CAN_ReadMsgObj(CANx, MsgNum, TRUE, pCanMsg); + return 0; } } /*********************************************************************************************************//** - * @brief Clear interrupt pending bit. - * @param CANx: The pointer to CAN module base address. - * @param MsgNum: Specifies the Message object number, from 0 to 31. - * @retval None - ***********************************************************************************************************/ -void CAN_CLR_INT_PENDING_BIT(HT_CAN_TypeDef *CANx, u32 MsgNum) + * @brief Gets the first valid message object number from the CAN message valid registers (MVR0 and MVR1). + * This function scans through the message object table to find the first valid message object that is + * not set (i.e., where the corresponding bit in the message valid register is 0). + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @retval The index of the first valid message object that is not set. + ***********************************************************************************************************/ +static int _CAN_GetValidMsg(HT_CAN_TypeDef *CANx) { - u32 u32IFBusyCount = 0; - - while(u32IFBusyCount < 0x10000000) + s32 _MsgNum; + u32 msgNumTable = CANx->MVR0; + msgNumTable |= CANx->MVR1 << 16; + for (_MsgNum = 0 ; _MsgNum < MSG_OBJ_TOTAL_NUM ; _MsgNum++) { - if((CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - { - CANx->IF0.CMASK = CAN_IF_CMASK_CLRINTPND_Msk | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - CANx->IF0.CREQ = MsgNum+1; - break; - } - else if((CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) + if ((msgNumTable & 1) == 0) { - CANx->IF1.CMASK = CAN_IF_CMASK_CLRINTPND_Msk | CAN_IF_CMASK_TXRQSTNEWDAT_Msk; - CANx->IF1.CREQ = MsgNum+1; break; } - - u32IFBusyCount++; + msgNumTable = msgNumTable >> 1; } + return _MsgNum + 1; } /*********************************************************************************************************//** - * @brief The function is used to configure Mask as the message object. - * @param CANx: The pointer to CAN module base address. - * @param MsgObj: Specifies the Message object number, from 0 to 31. - * @param MaskMsg: Pointer to the message structure where received data is copied. - * @arg CAN_STD_ID: The 11-bit identifier. - * @arg CAN_EXT_ID: The 29-bit identifier. - * @retval FALSE No useful interface, TRUE Configure a receive message object success. - ***********************************************************************************************************/ -s32 CAN_MsgObjMaskConfig(HT_CAN_TypeDef *CANx, u32 MsgObj, STR_CANMSG_R_TypeDef* MaskMsg) + * @brief Checks if the specified message number is valid. + * @param CANx: Pointer to the CAN peripheral. + * @param MsgNum: The message number. + * @retval TRUE if the message number is valid, FALSE otherwise. + ***********************************************************************************************************/ +static bool _CAN_CheckMsgIsValid(HT_CAN_TypeDef *CANx, u32 MsgNum) { - if(MaskMsg->IdType == CAN_STD_ID) + if ((MsgNum == 0) || (MsgNum > MSG_OBJ_TOTAL_NUM)) { - /* standard ID*/ - CANx->IF0.ARB0 = 0; - CANx->IF0.ARB1 = (((MaskMsg->Id) & 0x7FF) << 2) | CAN_IF_ARB1_MSGVAL_Msk ; - - /* Set the Mask Standard ID(11-bit) for IFn Mask Register is used for acceptance filtering*/ - CANx->IF0.MASK0 = 0; - CANx->IF0.MASK1 = ((MaskMsg->Id & 0x7FF) << 2) ; - } - else - { - /* extended ID*/ - CANx->IF0.ARB0 = (MaskMsg->Id) & 0xFFFF; - CANx->IF0.ARB1 = ((MaskMsg->Id) & 0x1FFF0000) >> 16 | CAN_IF_ARB1_DIR_Msk - | CAN_IF_ARB1_XTD_Msk | CAN_IF_ARB1_MSGVAL_Msk; - /* Set the Mask Extended ID(29-bit) for IFn Mask Register is used for acceptance filtering*/ - CANx->IF0.MASK0 = (MaskMsg->Id) & 0xFFFF; - CANx->IF0.MASK1 = ((MaskMsg->Id) & 0x1FFF0000) >> 16 ; + return FALSE; } - - if(MaskMsg->u8Xtd) - CANx->IF0.MASK1 |= CAN_IF_MASK1_MXTD_Msk; /* The extended identifier bit (IDE) is used for acceptance filtering */ - else - CANx->IF0.MASK1 &= (~CAN_IF_MASK1_MXTD_Msk); /* The extended identifier bit (IDE) has no effect on the acceptance filtering */ - - if(MaskMsg->u8Dir) - CANx->IF0.MASK1 |= CAN_IF_MASK1_MDIR_Msk; /* The message direction bit (Dir) is used for acceptance filtering */ - else - CANx->IF0.MASK1 &= (~CAN_IF_MASK1_MDIR_Msk); /* The message direction bit (Dir) has no effect on the acceptance filtering */ - - CANx->IF0.MCR |= CAN_IF_MCR_UMASK_Msk; /* Use Mask (Msk28-0, MXtd, and MDir) for acceptance filtering */ - - /* Update the contents needed for transmission*/ - CANx->IF0.CMASK = CAN_IF_CMASK_WRRD_Msk /* Transfer data from the selected Message Buffer Registers to the Message Object addressed */ - | CAN_IF_CMASK_MASK_Msk; /* Transfer Identifier Mask + MDir + MXtd to Message Object */ - - CANx->IF0.DA0R = 0; - CANx->IF0.DA1R = 0; - CANx->IF0.DB0R = 0; - CANx->IF0.DB1R = 0; - - /* Set the Message Object in the Message RAM is selected for data transfer */ - CANx->IF0.CREQ = 1 + MsgObj; - return TRUE; } -/* Private functions ----------------------------------------------------------------------------------------*/ -/** @defgroup CAN_Private_Functions CAN private functions - * @{ - */ /*********************************************************************************************************//** - * @brief Check if SmartCard slot is presented. - * @param CANx: The pointer to CAN module base address. -* @retval Free IF number. IF0_NUM or IF1_NUM or IF_TOTAL_NUM (No IF is free) - ***********************************************************************************************************/ -static CANIF_NUMBER_Enum GetFreeIF(HT_CAN_TypeDef *CANx) + * @brief Clears the pending flag for a specific CAN message object. + * @param CANx: where the CANx is the selected CAN from the CAN peripherals. + * @param MsgNum: The message number. + * @retval None. + ***********************************************************************************************************/ +static void _CAN_ClearMsgPendingFlag(HT_CAN_TypeDef *CANx, u32 MsgNum) { - if((CANx->IF0.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - return IF0_NUM; - else if((CANx->IF1.CREQ & CAN_IF_CREQ_BUSY_Msk) == 0) - return IF1_NUM; - else - return IF_TOTAL_NUM; + HT_CANIF_TypeDef *IFx = NULL; + while (IFx == NULL) + { + IFx = _GetFreeIF(CANx); + } + IFx->CMASK = CAN_IF_CMASK_CLRINTPND; + IFx->CREQ = MsgNum; } /** * @} @@ -1023,7 +1139,3 @@ static CANIF_NUMBER_Enum GetFreeIF(HT_CAN_TypeDef *CANx) /** * @} */ - -/** - * @} - */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c index 9238830a049..8cfac0313b4 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_ckcu.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_ckcu.c - * @version $Rev:: 7322 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the Clock Control Unit firmware functions. ************************************************************************************************************* * @attention @@ -90,7 +90,7 @@ #define CKCU_MASK_POTD ((u32)0x3 << CKCU_POS_POTD) #define CKCU_POS_PFBD 23 -#define CKCU_MASK_PFBD ((u32)0x0F << CKCU_POS_PFBD) +#define CKCU_MASK_PFBD ((u32)0x1F << CKCU_POS_PFBD) /* PLLCR bit field definition */ #define CKCU_POS_PLLBYPASS 31 @@ -139,8 +139,10 @@ #define CKCU_MASK_CKSWST ((u32)0x7 << CKCU_POS_CKSWST) /* LPCR bit field definition */ +#if (!LIBCFG_CKCU_NO_LPCR) #define CKCU_POS_BKISO 0 #define CKCU_MASK_BKISO ((u32)0x1 << CKCU_POS_BKISO) +#endif /* HSICR bit field definition */ #define CKCU_POS_TRIMEN (0) @@ -152,6 +154,7 @@ #define CKCU_POS_REFCLKSEL (5) #define CKCU_MASK_REFCLKSEL ((u32)0x3 << CKCU_POS_REFCLKSEL) + /** * @} */ @@ -521,12 +524,12 @@ void CKCU_SetLCDPrescaler(CKCU_LCDPRE_TypeDef LCDPRE) /*********************************************************************************************************//** * @brief Configure the CK_MIDI prescaler. * @param MIDIPRE: specify the value of divider. - * This parameter can be: - * @arg CKCU_MIDIPRE_DIV8 : CK_MIDI = HCLK / 8 - * @arg CKCU_MIDIPRE_DIV9 : CK_MIDI = HCLK / 9 - * @arg CKCU_MIDIPRE_DIV11 : CK_MIDI = HCLK / 11 - * @arg CKCU_MIDIPRE_DIV13 : CK_MIDI = HCLK / 13 - * @arg CKCU_MIDIPRE_DIV16 : CK_MIDI = HCLK / 16 + * This parameter can be: + * @arg CKCU_MIDIPRE_DIV8 : CK_MIDI = HCLK / 8 + * @arg CKCU_MIDIPRE_DIV9 : CK_MIDI = HCLK / 9 + * @arg CKCU_MIDIPRE_DIV11 : CK_MIDI = HCLK / 11 + * @arg CKCU_MIDIPRE_DIV13 : CK_MIDI = HCLK / 13 + * @arg CKCU_MIDIPRE_DIV16 : CK_MIDI = HCLK / 16 * @retval None ************************************************************************************************************/ void CKCU_SetMIDIPrescaler(CKCU_MIDIPRE_TypeDef MIDIPRE) @@ -637,31 +640,31 @@ u32 CKCU_GetPLLFrequency(void) /*********************************************************************************************************//** * @brief Configure the APB peripheral prescaler. * @param Perip: specify the APB peripheral. - * This parameter can be: - * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, CKCU_PCLK_I2C2, - * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, - * CKCU_PCLK_CAN0, - * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, - * CKCU_PCLK_MCTM0, - * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, - * CKCU_PCLK_USART0, CKCU_PCLK_USART1, - * CKCU_PCLK_UART0, CKCU_PCLK_UART1, CKCU_PCLK_UART2, CKCU_PCLK_UART3 - * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, CKCU_PCLK_OPA - * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, - * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, - * CKCU_PCLK_I2S, - * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, CKCU_PCLK_SCTM2, CKCU_PCLK_SCTM3 - * CKCU_PCLK_PWM0, CKCU_PCLK_PWM1 - * CKCU_PCLK_AFE, CKCU_PCLK_DAC0, CKCU_PCLK_DAC1, CKCU_PCLK_MIDI - * CKCU_PCLK_LEDC, CKCU_PCLK_TKEY + * This parameter can be: + * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, CKCU_PCLK_I2C2, + * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, + * CKCU_PCLK_CAN0, + * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, + * CKCU_PCLK_MCTM0, + * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, + * CKCU_PCLK_USART0, CKCU_PCLK_USART1, + * CKCU_PCLK_UART0, CKCU_PCLK_UART1, CKCU_PCLK_UART2, CKCU_PCLK_UART3 + * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC, CKCU_PCLK_CMP, CKCU_PCLK_OPA, CKCU_PCLK_PGA + * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, + * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, + * CKCU_PCLK_I2S, + * CKCU_PCLK_SCTM0, CKCU_PCLK_SCTM1, CKCU_PCLK_SCTM2, CKCU_PCLK_SCTM3 + * CKCU_PCLK_PWM0, CKCU_PCLK_PWM1 + * CKCU_PCLK_AFE, CKCU_PCLK_DAC0, CKCU_PCLK_DAC1, CKCU_PCLK_MIDI + * CKCU_PCLK_LEDC, CKCU_PCLK_TKEY * @param PCLKPrescaler: specify the value of prescaler. - * This parameter can be: - * @arg CKCU_APBCLKPRE_DIV1: specific peripheral clock = PCLK / 1 (inapplicable to BKPRCLK) - * @arg CKCU_APBCLKPRE_DIV2: specific peripheral clock = PCLK / 2 (inapplicable to BKPRCLK) - * @arg CKCU_APBCLKPRE_DIV4: specific peripheral clock = PCLK / 4 - * @arg CKCU_APBCLKPRE_DIV8: specific peripheral clock = PCLK / 8 - * @arg CKCU_APBCLKPRE_DIV16: specific peripheral clock = PCLK / 16 (BKPRCLK only) - * @arg CKCU_APBCLKPRE_DIV32: specific peripheral clock = PCLK / 32 (BKPRCLK only) + * This parameter can be: + * @arg CKCU_APBCLKPRE_DIV1: specific peripheral clock = PCLK / 1 (inapplicable to BKPRCLK) + * @arg CKCU_APBCLKPRE_DIV2: specific peripheral clock = PCLK / 2 (inapplicable to BKPRCLK) + * @arg CKCU_APBCLKPRE_DIV4: specific peripheral clock = PCLK / 4 + * @arg CKCU_APBCLKPRE_DIV8: specific peripheral clock = PCLK / 8 + * @arg CKCU_APBCLKPRE_DIV16: specific peripheral clock = PCLK / 16 (BKPRCLK only) + * @arg CKCU_APBCLKPRE_DIV32: specific peripheral clock = PCLK / 32 (BKPRCLK only) * @retval None ************************************************************************************************************/ void CKCU_SetPeripPrescaler(CKCU_PeripPrescaler_TypeDef Perip, CKCU_APBCLKPRE_TypeDef PCLKPrescaler) @@ -673,29 +676,29 @@ void CKCU_SetPeripPrescaler(CKCU_PeripPrescaler_TypeDef Perip, CKCU_APBCLKPRE_Ty Prescaler -= 2; } Perip &= 0x0000001F; - CKCU_BF_WRITE(*PCSR, (3UL << Perip), Perip, Prescaler); + CKCU_BF_WRITE(*PCSR, (3UL << Perip), Perip, (Prescaler & 0x3)); } #endif /*********************************************************************************************************//** * @brief Return the operating frequency of the specific APB peripheral. * @param Perip: specify the APB peripheral. - * This parameter can be: - * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, CKCU_PCLK_I2C2, - * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, - * CKCU_PCLK_CAN0, - * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, - * CKCU_PCLK_MCTM0, - * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, - * CKCU_PCLK_USART0, CKCU_PCLK_USART1, - * CKCU_PCLK_UART0, CKCU_PCLK_UART1, CKCU_PCLK_UART2, CKCU_PCLK_UART3 - * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC0, CKCU_PCLK_ADC1, CKCU_PCLK_CMP, CKCU_PCLK_OPA - * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, - * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, - * CKCU_PCLK_I2S, - * CKCU_PCLK_PWM0, CKCU_PCLK_PWM1 - * CKCU_PCLK_AFE, CKCU_PCLK_DAC0, CKCU_PCLK_DAC1, CKCU_PCLK_MIDI - * CKCU_PCLK_LEDC, CKCU_PCLK_TKEY + * This parameter can be: + * @arg CKCU_PCLK_I2C0, CKCU_PCLK_I2C1, CKCU_PCLK_I2C2, + * CKCU_PCLK_SPI0, CKCU_PCLK_SPI1, + * CKCU_PCLK_CAN0, + * CKCU_PCLK_BFTM0, CKCU_PCLK_BFTM1, + * CKCU_PCLK_MCTM0, + * CKCU_PCLK_GPTM0, CKCU_PCLK_GPTM1, + * CKCU_PCLK_USART0, CKCU_PCLK_USART1, + * CKCU_PCLK_UART0, CKCU_PCLK_UART1, CKCU_PCLK_UART2, CKCU_PCLK_UART3 + * CKCU_PCLK_AFIO, CKCU_PCLK_EXTI, CKCU_PCLK_ADC0, CKCU_PCLK_ADC1, CKCU_PCLK_CMP, CKCU_PCLK_OPA, CKCU_PCLK_PGA + * CKCU_PCLK_WDTR, CKCU_PCLK_BKPR, + * CKCU_PCLK_SCI0, CKCU_PCLK_SCI1, + * CKCU_PCLK_I2S, + * CKCU_PCLK_PWM0, CKCU_PCLK_PWM1 + * CKCU_PCLK_AFE, CKCU_PCLK_DAC0, CKCU_PCLK_DAC1, CKCU_PCLK_MIDI + * CKCU_PCLK_LEDC, CKCU_PCLK_TKEY * @retval Frequency in Hz ************************************************************************************************************/ u32 CKCU_GetPeripFrequency(CKCU_PeripPrescaler_TypeDef Perip) @@ -993,14 +996,14 @@ void CKCU_PeripClockConfig(CKCU_PeripClockConfig_TypeDef Clock, ControlStatus Cm HT_CKCU->APBCCR1 = uAPBCCR1; } -#if (((LIBCFG_LSE) || (LIBCFG_USBD)) && (!LIBCFG_CKCU_NO_AUTO_TRIM)) +#if (((LIBCFG_LSE) || (LIBCFG_USBD) || (LIBCFG_CKCU_REFCLK_EXT_PIN)) && (!LIBCFG_CKCU_NO_AUTO_TRIM)) /*********************************************************************************************************//** * @brief Configure the reference clock of HSI auto-trim function. * @param CLKSRC: specify the clock source. - * This parameter can be: - * @arg CKCU_ATC_LSE: LSE is selected as reference clock - * @arg CKCU_ATC_USB: USB is selected as reference clock - * @arg CKCU_ATC_CKIN: External pin (CKIN) is selected as reference clock + * This parameter can be: + * @arg CKCU_ATC_LSE: LSE is selected as reference clock + * @arg CKCU_ATC_USB: USB is selected as reference clock + * @arg CKCU_ATC_CKIN: External pin (CKIN) is selected as reference clock * @retval None ************************************************************************************************************/ void CKCU_HSIAutoTrimClkConfig(CKCU_ATC_TypeDef CLKSRC) @@ -1083,7 +1086,7 @@ bool CKCU_HSIAutoTrimIsReady(void) * @param Value: 0x0~0x1F. * @retval None ************************************************************************************************************/ -void CKCU_Set_HSIReadyCounter(u8 Value) +void CKCU_SetHSIReadyCounter(u8 Value) { /* Check the parameters */ Assert_Param(IS_COUNTER_VALUE(Value)); @@ -1091,6 +1094,23 @@ void CKCU_Set_HSIReadyCounter(u8 Value) HT_CKCU->HSIRDYCR = ((HT_CKCU->HSIRDYCR) & (~(0x1F))) | Value; } #endif + +/*********************************************************************************************************//** + * @brief Set HSE Gain Mode. + * @param GanMode: Specify the gain mode of HSE. + * This parameter can be: + * @arg CKCU_HSE_LOW_GAIN_MODE : HSE low gain mode + * @arg CKCU_HSE_HIGH_GAIN_MODE : HSE high gain mode + * @retval None + ************************************************************************************************************/ +void CKCU_SetHSEGainMode(u32 GanMode) +{ + /* Check the parameters */ + Assert_Param(IS_GAINMODE(GanMode)); + + HT_CKCU->GCCR = (HT_CKCU->GCCR & ~(0x100)) | GanMode; +} + /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c index 10f4b9dded7..fff32e05494 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_cmp.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_cmp.c - * @version $Rev:: 6932 $ - * @date $Date:: 2023-05-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the CMP firmware functions. ************************************************************************************************************* * @attention @@ -90,7 +90,7 @@ void CMP_Init(HT_CMP_TypeDef* HT_CMPn, CMP_InitTypeDef* CMP_InitStruct) Assert_Param(IS_CMP_ScalerEnable(CMP_InitStruct->CMP_ScalerEnable)); Assert_Param(IS_CMP_CoutSynchronized(CMP_InitStruct->CMP_CoutSync)); Assert_Param(IS_CMP_OutputPol_Set(CMP_InitStruct->CMP_OutputPol)); - #if (LIBCFG_CMP_65x_VER) + #if (LIBCFG_CMP_65x_66x_VER) Assert_Param(IS_CMP_InputSelection(CMP_InitStruct->CMP_InputSelection)); #endif Assert_Param(IS_CMP_InvInputSelection(CMP_InitStruct->CMP_InvInputSelection)); @@ -102,7 +102,7 @@ void CMP_Init(HT_CMP_TypeDef* HT_CMPn, CMP_InitTypeDef* CMP_InitStruct) CMP_InitStruct->CMP_OutputPol | CMP_InitStruct->CMP_InvInputSelection | CMP_InitStruct->CMP_Hysteresis | \ CMP_InitStruct->CMP_Speed; - #if (LIBCFG_CMP_65x_VER) + #if (LIBCFG_CMP_65x_66x_VER) HT_CMPn->CI = CMP_InitStruct->CMP_InputSelection; #endif } diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c index e209d4c1a04..97e58529f6f 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_dac.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_dac.c - * @version $Rev:: 7081 $ - * @date $Date:: 2023-08-01 #$ + * @version $Rev:: 7904 $ + * @date $Date:: 2024-07-26 #$ * @brief This file provides all the DAC firmware functions. ************************************************************************************************************* * @attention @@ -38,6 +38,15 @@ */ +/* Private constants ---------------------------------------------------------------------------------------*/ +/** @defgroup DAC_Private_Define DAC private definitions + * @{ + */ +#define DAC_ENABLE_BIT (0x00000001) +/** + * @} + */ + /* Global functions ----------------------------------------------------------------------------------------*/ /** @defgroup DAC_Exported_Functions DAC exported functions * @{ @@ -185,11 +194,11 @@ void DAC_Cmd(HT_DAC_TypeDef* HT_DACn, u8 DAC_Ch, ControlStatus NewState) if (NewState != DISABLE) { - SetBit_BB((u32)&DACnCH->CR, 0); + DACnCH->CR |= DAC_ENABLE_BIT; } else { - ResetBit_BB((u32)&DACnCH->CR, 0); + DACnCH->CR &= ~(DAC_ENABLE_BIT); } } diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c index 18e04c04fa7..936ef0896d6 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_flash.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_flash.c - * @version $Rev:: 6657 $ - * @date $Date:: 2023-01-16 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the FLASH firmware functions. ************************************************************************************************************* * @attention @@ -92,9 +92,16 @@ #define IS_WAIT_STATE2(x) (0) #endif +#if (LIBCFG_FMC_WAIT_STATE_3) +#define IS_WAIT_STATE3(x) (x == FLASH_WAITSTATE_3) +#else +#define IS_WAIT_STATE3(x) (0) +#endif + #define IS_FLASH_WAITSTATE(WAIT) ((WAIT == FLASH_WAITSTATE_0) || \ (WAIT == FLASH_WAITSTATE_1) || \ - (IS_WAIT_STATE2(WAIT))) + (IS_WAIT_STATE2(WAIT)) || \ + (IS_WAIT_STATE3(WAIT))) #endif /** * @brief Check parameter of the FLASH vector mapping. @@ -137,6 +144,7 @@ * @arg \ref FLASH_WAITSTATE_0 : zero wait state * @arg \ref FLASH_WAITSTATE_1 : one wait state * @arg \ref FLASH_WAITSTATE_2 : two wait state + * @arg \ref FLASH_WAITSTATE_3 : three wait state * @retval None ************************************************************************************************************/ void FLASH_SetWaitState(u32 FLASH_WAITSTATE_n) diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c index 4f778467dee..ed29369ffb7 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_gpio.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_gpio.c - * @version $Rev:: 6398 $ - * @date $Date:: 2022-10-27 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the GPIO and AFIO firmware functions. ************************************************************************************************************* * @attention @@ -293,7 +293,7 @@ void GPIO_OpenDrainConfig(HT_GPIO_TypeDef* HT_GPIOx, u16 GPIO_PIN_nBITMAP, Contr GPIO_CK_OFF(); } -#if LIBCFG_GPIO_SINK_CURRENT_ENHANCED +#if (LIBCFG_GPIO_SINK_CURRENT_ENHANCED) /*********************************************************************************************************//** * @brief Select the sink current of specified GPIO pins. * @param HT_GPIOx: where HT_GPIOx is the selected GPIO from the GPIO peripherals. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c index 0ab83cf9195..d659df08308 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_pwrcu.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_pwrcu.c - * @version $Rev:: 6386 $ - * @date $Date:: 2022-10-27 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the Power Control Unit firmware functions. ************************************************************************************************************* * @attention @@ -68,9 +68,11 @@ #define Reset_V15RDYSC ResetBit_BB((u32)&HT_PWRCU->CR, 12) #endif +#if (!LIBCFG_PWRCU_NO_DS2_MODE) #define Set_DMOSSTS SetBit_BB((u32)&HT_PWRCU->CR, 15) #define Reset_DMOSSTS ResetBit_BB((u32)&HT_PWRCU->CR, 15) #define Get_DMOSSTS GetBit_BB((u32)&HT_PWRCU->CR, 15) +#endif #define Set_BODEN SetBit_BB((u32)&HT_PWRCU->LVDCSR, 0) #define Reset_BODEN ResetBit_BB((u32)&HT_PWRCU->LVDCSR, 0) @@ -105,7 +107,6 @@ #define LVDS_MASK 0xFFB9FFFF #define VREG_V_MASK 0xF3FFFFFF #define VREG_M_MASK 0xFCFFFFFF -#define PWRRST_SET 0x1 /** * @} */ @@ -266,6 +267,7 @@ void PWRCU_DeepSleep1(PWRCU_SLEEP_ENTRY_Enum SleepEntry) SCB->SCR &= ~(u32)SLEEPDEEP_SET; } +#if (!LIBCFG_PWRCU_NO_DS2_MODE) /*********************************************************************************************************//** * @brief Enter DEEP-SLEEP Mode 2. * @param SleepEntry : Enters sleep mode instruction that is used to WFI or WFE. @@ -385,6 +387,7 @@ void PWRCU_DeepSleep2Ex(PWRCU_SLEEP_ENTRY_Enum SleepEntry) } } #endif +#endif #if (!LIBCFG_PWRCU_NO_PD_MODE) /*********************************************************************************************************//** @@ -561,6 +564,7 @@ FlagStatus PWRCU_GetBODFlagStatus(void) return (FlagStatus)Get_BODF; } +#if (!LIBCFG_PWRCU_NO_DS2_MODE) /*********************************************************************************************************//** * @brief Return the DMOS status. * @retval This function will return one of the following values: @@ -610,6 +614,7 @@ void PWRCU_DMOSCmd(ControlStatus NewState) Reset_DMOSON; } } +#endif /*********************************************************************************************************//** * @brief Configure the LDO operation mode. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c index 55158596419..ffc160adf99 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_spi.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_spi.c - * @version $Rev:: 7322 $ - * @date $Date:: 2023-10-28 #$ + * @version $Rev:: 7674 $ + * @date $Date:: 2024-03-28 #$ * @brief This file provides all the SPI firmware functions. ************************************************************************************************************* * @attention @@ -364,6 +364,11 @@ void SPI_SoftwareSELCmd(HT_SPI_TypeDef* SPIx, u32 SPI_SoftwareSEL) } else { + /* Inactive SEL pin needs to ensure the transmission has ended. If the program flow cannot guarantee */ + /* SPI transmission completion, you can enable the procedure below. */ + #if 0 + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + #endif SPIx->CR0 &= SPI_SEL_INACTIVE; } } @@ -602,6 +607,8 @@ void SPI_DUALCmd(HT_SPI_TypeDef* SPIx, ControlStatus NewState) Assert_Param(IS_SPI(SPIx)); Assert_Param(IS_CONTROL_STATUS(NewState)); + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + (NewState == ENABLE)?(SPIx->CR0 |= CR0_DUALEN_SET):(SPIx->CR0 &= CR0_DUALEN_RESET); } #endif @@ -619,6 +626,8 @@ void QSPI_QuadCmd(HT_SPI_TypeDef* SPIx, ControlStatus NewState) Assert_Param(IS_QSPI(SPIx)); Assert_Param(IS_CONTROL_STATUS(NewState)); + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + if (NewState == DISABLE) { QSPI_DirectionConfig(SPIx, SIO_DIR_IN); @@ -645,6 +654,8 @@ void QSPI_DirectionConfig(HT_SPI_TypeDef* SPIx, SIO_DIR_Enum SIO_DIR_INorOUT) Assert_Param(IS_QSPI(SPIx)); Assert_Param(IS_SIO_DIR(SIO_DIR_INorOUT)); + while (SPIx->SR & SPI_FLAG_BUSY); /* Wait until SPI NOT BUSY */ + if (SIO_DIR_INorOUT != SIO_DIR_IN) SPIx->CR0 |= CR0_QDIODIR_OUT; else diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c index 1e4a2fe15d8..dbc66535b22 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_tm.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_tm.c - * @version $Rev:: 7059 $ - * @date $Date:: 2023-07-27 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the TM firmware functions. ************************************************************************************************************* * @attention @@ -67,7 +67,8 @@ #define CTR_CHCCDS 0x00010000ul #define CH0ICFR_CH0SRC 0x80000000ul -#define CHICFR_CHF_MASK ~0x000000FFul +#define CHICFR_CHF_MASK ~0x000000FFul /* CHF Mask for CHICFR, varies by model. + Using ~0x000000FFul for all model. */ #define CHICFR_CHCCS_MASK ~0x00030000ul #define CHICFR_CHPSC_MASK ~0x000C0000ul @@ -335,12 +336,12 @@ void TM_CaptureInit(HT_TM_TypeDef* TMx, TM_CaptureInitTypeDef* CapInit) Assert_Param(IS_TM_CHP(CapInit->Polarity)); Assert_Param(IS_TM_CHCCS(CapInit->Selection)); Assert_Param(IS_TM_CHPSC(CapInit->Prescaler)); - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) #else Assert_Param(IS_TM_FILTER(CapInit->Filter)); #endif - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) Filter = FILTER_PROCESS(CapInit); #else Filter = CapInit->Filter; @@ -373,7 +374,7 @@ void TM_PwmInputInit(HT_TM_TypeDef* TMx, TM_CaptureInitTypeDef* CapInit) Assert_Param(IS_TM_CHP(CapInit->Polarity)); Assert_Param(IS_TM_CHCCS(CapInit->Selection)); Assert_Param(IS_TM_CHPSC(CapInit->Prescaler)); - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) #else Assert_Param(IS_TM_FILTER(CapInit->Filter)); #endif @@ -409,7 +410,7 @@ void TM_PwmInputInit(HT_TM_TypeDef* TMx, TM_CaptureInitTypeDef* CapInit) OppositeChannel = TM_CH_0; } - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) Filter = FILTER_PROCESS(CapInit); #else Filter = CapInit->Filter; @@ -479,7 +480,7 @@ void TM_CaptureStructInit(TM_CaptureInitTypeDef* CapInit) CapInit->Polarity = TM_CHP_NONINVERTED; CapInit->Selection = TM_CHCCS_DIRECT; CapInit->Prescaler = TM_CHPSC_OFF; - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) CapInit->Fsampling = TM_CHFDIV_1; CapInit->Event = TM_CHFEV_OFF; #else @@ -559,7 +560,7 @@ void TM_ChExternalClockConfig(HT_TM_TypeDef* TMx, TM_TRSEL_Enum Sel, TM_CHP_Enum Assert_Param(IS_TM(TMx)); Assert_Param(IS_TM_TRSEL_CH(Sel)); Assert_Param(IS_TM_CHP(Pol)); - #if (LIBCFG_TM_652XX_V1) + #if (LIBCFG_TM_65X_66X_V1) #else Assert_Param(IS_TM_FILTER(Filter)); #endif @@ -903,6 +904,7 @@ void TM_CHCCRPreloadConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus } } +#if 0 /*********************************************************************************************************//** * @brief Clear or Safeguard the CHxOREF signal when ETI is active. * @param TMx: where TMx is the selected TM from the TM peripheral. @@ -934,6 +936,7 @@ void TM_ClearOREFConfig(HT_TM_TypeDef* TMx, TM_CH_Enum Channel, ControlStatus Ne *pOcfr &= ~CHOCFR_REFCE; } } +#endif /*********************************************************************************************************//** * @brief Configure polarity of the TMx channel N. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c index c0dd366f364..b5ec97acf6e 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_usart.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_usart.c - * @version $Rev:: 7054 $ - * @date $Date:: 2023-07-24 #$ + * @version $Rev:: 7698 $ + * @date $Date:: 2024-04-15 #$ * @brief This file provides all the USART firmware functions. ************************************************************************************************************* * @attention @@ -366,7 +366,7 @@ void USART_ClearFlag(HT_USART_TypeDef* USARTx, u32 USART_Flag) * @arg USART_INT_RSADD : * @arg USART_INT_TOUT : * @arg USART_INT_CTS : -* @arg USART_INT_LBD : + * @arg USART_INT_LBD : * @param NewState: This parameter can be ENABLE or DISABLE. * @retval None ************************************************************************************************************/ @@ -871,11 +871,10 @@ void USART_LIN_SendBreak(HT_USART_TypeDef* USARTx) USARTx->CR |= USART_LINSENDBREAK; } - /*********************************************************************************************************//** * @brief Configure the break detection length in LIN mode. * @param USARTx: where USARTx is the selected USART/UART from the USART/UART peripherals. - * @param length: data length in byte. + * @param USART_LIN_Length: data length in byte. * This parameter can be one of the following values: * @arg USART_LINLENGTH_11BIT * @arg USART_LINLENGTH_10BIT diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c index b90f5b1face..13d5064e60c 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f5xxxx_wdt.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f5xxxx_wdt.c - * @version $Rev:: 2772 $ - * @date $Date:: 2018-05-15 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the WDT firmware functions. ************************************************************************************************************* * @attention @@ -55,8 +55,8 @@ #define MODE0_WDTFIEN_RESET ((u32)0xFFFFEFFF) /* WDT WDTRSTEN mask */ -#define MODE0_WDTRETEN_SET ((u32)0x00002000) -#define MODE0_WDTRETEN_RESET ((u32)0xFFFFDFFF) +#define MODE0_WDTRSTEN_SET ((u32)0x00002000) +#define MODE0_WDTRSTEN_RESET ((u32)0xFFFFDFFF) /* WDT WDTEN mask */ #define MODE0_WDTEN_SET ((u32)0x00010000) @@ -109,9 +109,9 @@ void WDT_Cmd(ControlStatus NewState) * @brief Configure the WDT to run or halt in sleep and deep sleep1 mode. * @param WDT_Mode: * This parameter can be one of the following values: - * @arg MODE0_WDTSHLT_BOTH : WDT runs in sleep and deep sleep1 mode - * @arg MODE0_WDTSHLT_SLEEP : WDT runs in sleep mode - * @arg MODE0_WDTSHLT_HALT : WDT halts in sleep and deep sleep1 mode + * @arg WDT_SLEEP_HALT_NONE : WDT no halt + * @arg WDT_SLEEP_HALT_DEEPSLEEP : WDT halts in deep sleep1 mode + * @arg WDT_SLEEP_HALT_ALL : WDT halts in sleep and deep sleep1 mode * @retval None ************************************************************************************************************/ void WDT_HaltConfig(u32 WDT_Mode) @@ -134,11 +134,11 @@ void WDT_ResetCmd(ControlStatus NewState) if (NewState != DISABLE) { - HT_WDT->MR0 |= MODE0_WDTRETEN_SET; + HT_WDT->MR0 |= MODE0_WDTRSTEN_SET; } else { - HT_WDT->MR0 &= MODE0_WDTRETEN_RESET; + HT_WDT->MR0 &= MODE0_WDTRSTEN_RESET; } } diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_adc.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_adc.c index 88c5d8acede..c624ee02898 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_adc.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_adc.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_adc.c - * @version $Rev:: 7367 $ - * @date $Date:: 2023-12-06 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the ADC firmware functions. ************************************************************************************************************* * @attention @@ -43,7 +43,11 @@ * @{ */ #define ADC_ENABLE_BIT (0x00000080) + +#if (LIBCFG_ADC1) #define DUAL_MODE_MASK (0x00000003) +#endif + #define ADC_SOFTWARE_RESET (0x00000001) #define LST_SEQ_SET (0x0000001F) #define TCR_SC_SET (0x00000001) @@ -51,9 +55,15 @@ #define HLST_SEQ_SET (0x0000001F) #define HTCR_SC_SET (0x00000001) +#if (!LIBCFG_ADC_NO_OFFSET_REG) #define OFR_ADOF_MASK (0x00000FFF) #define OFR_ADAL (1 << 14) #define OFR_ADOFE (1 << 15) +#endif + +#if (LIBCFG_ADC_MVDDA) +#define ADC_VREF_MVDDAEN (0x00000100) +#endif /** * @} */ @@ -162,8 +172,8 @@ void ADC_DualModeConfig(HT_ADC_TypeDef* HT_ADCn, u32 DUAL_X, u8 HDelayTime, u8 D * @arg ONE_SHOT_MODE : * @arg CONTINUOUS_MODE : * @arg DISCONTINUOUS_MODE : - * @param Length: must between 1 ~ 16 - * @param SubLength: must between 1 ~ 16, only valid for DISCONTINUOUS_MODE. + * @param Length: must between 1 ~ 8 + * @param SubLength: must between 1 ~ 8, only valid for DISCONTINUOUS_MODE. * @retval None ************************************************************************************************************/ void ADC_RegularGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 SubLength) @@ -189,8 +199,8 @@ void ADC_RegularGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 * @arg ONE_SHOT_MODE : * @arg CONTINUOUS_MODE : * @arg DISCONTINUOUS_MODE : - * @param Length: must between 1 ~ 4 - * @param SubLength: must between 1 ~ 4 + * @param Length: must between 1 ~ 8 (5 ~ 8 only for specific model) + * @param SubLength: must between 1 ~ 8 (5 ~ 8 only for specific model) * @retval None ************************************************************************************************************/ void ADC_HPGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 SubLength) @@ -211,8 +221,16 @@ void ADC_HPGroupConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_MODE, u8 Length, u8 SubLe * @param ADC_CH_n: the ADC channel to configure * This parameter can be one of the following values: * @arg ADC_CH_n : ADC Channel x selected, x must between 0 ~ 7 + * @arg ADC_CH_OPA0 : ADC OPA0O selected + * @arg ADC_CH_OPA1 : ADC OPA1O selected + * @arg ADC_CH_PGA0O : ADC PGA0O selected + * @arg ADC_CH_PGA1O : ADC PGA1O selected + * @arg ADC_CH_PGA2O : ADC PGA2O selected + * @arg ADC_CH_PGA3O : ADC PGA3O selected * @arg ADC_CH_GND_VREF : ADC GND VREF selected * @arg ADC_CH_VDD_VREF : ADC VDD VREF selected + * @arg ADC_CH_BANDGAP : ADC BANDGAP selected + * @arg ADC_CH_MVDDA : ADC MVDDA selected * @param Rank: The rank in the regular group sequencer. * This parameter must be between 0 to 7. * @param SampleClock: Number of sampling clocks. @@ -230,7 +248,18 @@ void ADC_RegularChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 Assert_Param(IS_ADC_INPUT_SAMPLING_TIME(SampleClock)); /* config sampling clock of correspond ADC input channel */ + #if (LIBCFG_ADC_STR_16_17) + if (ADC_CH_n < 16) + { + HT_ADCn->STR[ADC_CH_n] = SampleClock; + } + else + { + HT_ADCn->STR16[ADC_CH_n - 16] = SampleClock; + } + #else HT_ADCn->STR[ADC_CH_n] = SampleClock; + #endif /* Get the old register value */ tmpreg1 = HT_ADCn->LST[Rank >> 2]; @@ -252,10 +281,18 @@ void ADC_RegularChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 * @param ADC_CH_n: the ADC channel to configure * This parameter can be one of the following values: * @arg ADC_CH_n : ADC Channel x selected, x must between 0 ~ 7 + * @arg ADC_CH_OPA0 : ADC OPA0O selected + * @arg ADC_CH_OPA1 : ADC OPA1O selected + * @arg ADC_CH_PGA0O : ADC PGA0O selected + * @arg ADC_CH_PGA1O : ADC PGA1O selected + * @arg ADC_CH_PGA2O : ADC PGA2O selected + * @arg ADC_CH_PGA3O : ADC PGA3O selected * @arg ADC_CH_GND_VREF : ADC GND VREF selected * @arg ADC_CH_VDD_VREF : ADC VDD VREF selected + * @arg ADC_CH_BANDGAP : ADC BANDGAP selected + * @arg ADC_CH_MVDDA : ADC MVDDA selected * @param Rank: The rank in the high priority group sequencer. - * This parameter must be between 0 to 3. + * This parameter must be between 0 to 11. (4 ~ 11 only for specific model) * @param SampleClock: Number of sampling clocks. * This parameter must be between 0x00 to 0xFF. * @retval None @@ -271,10 +308,25 @@ void ADC_HPChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 Sampl Assert_Param(IS_ADC_INPUT_SAMPLING_TIME(SampleClock)); /* config sampling clock of correspond ADC input channel */ + #if (LIBCFG_ADC_STR_16_17) + if (ADC_CH_n < 16) + { + HT_ADCn->STR[ADC_CH_n] = SampleClock; + } + else + { + HT_ADCn->STR16[ADC_CH_n - 16] = SampleClock; + } + #else HT_ADCn->STR[ADC_CH_n] = SampleClock; + #endif /* Get the old register value */ + #if (LIBCFG_ADC_HLST_0_2) + tmpreg1 = HT_ADCn->HLST[Rank >> 2]; + #else tmpreg1 = HT_ADCn->HLST; + #endif /* Calculate the mask to clear */ tmpreg2 = HLST_SEQ_SET << (8 * (Rank & 0x3)); /* Clear the old SEQx bits for the selected rank */ @@ -284,7 +336,11 @@ void ADC_HPChannelConfig(HT_ADC_TypeDef* HT_ADCn, u8 ADC_CH_n, u8 Rank, u8 Sampl /* Set the SEQx bits for the selected rank */ tmpreg1 |= tmpreg2; /* Store the new register value */ + #if (LIBCFG_ADC_HLST_0_2) + HT_ADCn->HLST[Rank >> 2] = tmpreg1; + #else HT_ADCn->HLST = tmpreg1; + #endif } /*********************************************************************************************************//** @@ -537,7 +593,7 @@ u16 ADC_GetConversionData(HT_ADC_TypeDef* HT_ADCn, u8 ADC_REGULAR_DATAn) /*********************************************************************************************************//** * @brief Return the result of ADC high priority channel conversion. * @param HT_ADCn: where HT_ADCn is the selected ADC from the ADC peripherals. - * @param ADC_HP_DATAn: where x can be 0 ~ 3 + * @param ADC_HP_DATAn: where x can be 0 ~ 11, (4 ~ 11 only for specific model) * @retval The Value of data conversion. ************************************************************************************************************/ u16 ADC_GetHPConversionData(HT_ADC_TypeDef* HT_ADCn, u8 ADC_HP_DATAn) @@ -546,7 +602,18 @@ u16 ADC_GetHPConversionData(HT_ADC_TypeDef* HT_ADCn, u8 ADC_HP_DATAn) Assert_Param(IS_ADC(HT_ADCn)); Assert_Param(IS_ADC_HP_DATA(ADC_HP_DATAn)); + #if (LIBCFG_ADC_HDR_4_11) + if (ADC_HP_DATAn < 4) + { + return ((u16)HT_ADCn->HDR[ADC_HP_DATAn]); + } + else + { + return ((u16)HT_ADCn->HDR4[ADC_HP_DATAn - 4]); + } + #else return ((u16)HT_ADCn->HDR[ADC_HP_DATAn]); + #endif } /*********************************************************************************************************//** @@ -770,6 +837,54 @@ void ADC_PDMAConfig(HT_ADC_TypeDef* HT_ADCn, u32 ADC_PDMA_x, ControlStatus NewSt HT_ADCn->PDMAR &= ~ADC_PDMA_x; } } + +#if (LIBCFG_ADC_IVREF) +/*********************************************************************************************************//** + * @brief Enable or Disable the VREF. + * @param HT_ADCn: where HT_ADCn is the selected ADC from the ADC peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void ADC_VREFCmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_ADC(HT_ADCn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_ADCn->VREFCR |= 0x00000001; + } + else + { + HT_ADCn->VREFCR &= ~(0x00000001); + } +} +#endif + +#if (LIBCFG_ADC_MVDDA) +/*********************************************************************************************************//** + * @brief Enable or Disable the power of MVDDA (VDDA/2) + * @param HT_ADCn: where HT_ADCn is the selected ADC from the ADC peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void ADC_MVDDACmd(HT_ADC_TypeDef* HT_ADCn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_ADC(HT_ADCn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_ADCn->VREFCR |= ADC_VREF_MVDDAEN; + } + else + { + HT_ADCn->VREFCR &= ~(ADC_VREF_MVDDAEN); + } +} +#endif /** * @} */ diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_opa.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_opa.c index 6df13c0c01f..69a13d106e8 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_opa.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_opa.c @@ -1,7 +1,7 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_opa.c - * @version $Rev:: 6932 $ - * @date $Date:: 2023-05-11 #$ + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ * @brief This file provides all the OPA firmware functions. ************************************************************************************************************* * @attention @@ -113,7 +113,7 @@ void OPA_ProtectConfig(HT_OPA_TypeDef* HT_OPAn) /* Check the parameters */ Assert_Param(IS_OPA(HT_OPAn)); - /* Write any value to bit 16 ~ 31 (PROTECT) and keep the other control bir */ + /* Write any value to bit 16 ~ 31 (PROTECT) and keep the other control bit */ HT_OPAn->CR = HT_OPAn->CR; } @@ -153,28 +153,9 @@ void OPA_Init(HT_OPA_TypeDef* HT_OPAn, OPA_InitTypeDef* OPA_InitStruct) Assert_Param(IS_OPA(HT_OPAn)); Assert_Param(IS_OPA_ScalerEnable(OPA_InitStruct->OPA_ScalerEnable)); Assert_Param(IS_OPA_ExtPinEnable(OPA_InitStruct->OPA_ExternalPinEnable)); - #if (LIBCFG_OPA_PGA) - Assert_Param(IS_OPA_PGAEnable(OPA_InitStruct->OPA_PGAEnable)); - Assert_Param(IS_OPA_UnitGainEnable(OPA_InitStruct->OPA_UnitGainEnable)); - Assert_Param(IS_OPA_PGA_SEL(OPA_InitStruct->OPA_PGAGain)); - #endif - - #if (LIBCFG_OPA_PGA) - /* avoid both PGA and unit gain active at the same time */ - if (OPA_InitStruct->OPA_UnitGainEnable == OPA_UNITGAIN_ENABLE) - { - OPA_InitStruct->OPA_PGAEnable = OPA_PGA_DISABLE; - } - #endif - #if (LIBCFG_OPA_PGA) - HT_OPAn->CR = OPA_InitStruct->OPA_ScalerEnable | OPA_InitStruct->OPA_PGAGain | \ - OPA_InitStruct->OPA_ExternalPinEnable | OPA_InitStruct->OPA_PGAEnable | \ - OPA_InitStruct->OPA_UnitGainEnable; - #else HT_OPAn->CR = OPA_InitStruct->OPA_ScalerEnable | \ OPA_InitStruct->OPA_ExternalPinEnable; - #endif } /*********************************************************************************************************//** @@ -187,11 +168,6 @@ void OPA_StructInit(OPA_InitTypeDef* OPA_InitStruct) /* OPA_InitStruct members default value */ OPA_InitStruct->OPA_ScalerEnable = OPA_SCALER_DISABLE; OPA_InitStruct->OPA_ExternalPinEnable = OPA_ExternalPin_DISABLE; - #if (LIBCFG_OPA_PGA) - OPA_InitStruct->OPA_PGAEnable = OPA_PGA_DISABLE; - OPA_InitStruct->OPA_UnitGainEnable = OPA_UNITGAIN_DISABLE; - OPA_InitStruct->OPA_PGAGain = PGA_GAIN_6; - #endif } /*********************************************************************************************************//** @@ -220,98 +196,6 @@ void OPA_ExternalInputCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState) } } -#if (LIBCFG_OPA_PGA) -/*********************************************************************************************************//** - * @brief Enable or Disable the Unit Gain. - * @param HT_OPAn: where HT_OPAn is the selected OPA from the OPA peripherals. - * @param NewState: This parameter can be ENABLE or DISABLE. - * @retval None - ************************************************************************************************************/ -void OPA_UnitGainCmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState) -{ - u32 OPA_CR = (u32)(&HT_OPAn->CR); - u32 CRValue; - - /* Check the parameters */ - Assert_Param(IS_OPA(HT_OPAn)); - Assert_Param(IS_CONTROL_STATUS(NewState)); - - CRValue = HT_OPAn->CR & (~(0x06UL)); // reset unit gain & PGA - - if (NewState == ENABLE) - { - CRValue |= 0x2; - } - - HT_OPAn->CR = gOPAUnProtectKey; - HT_OPAn->CR = CRValue; -} - -/*********************************************************************************************************//** - * @brief Enable or Disable the PGA. - * @param HT_OPAn: where HT_OPAn is the selected OPA from the OPA peripherals. - * @param NewState: This parameter can be ENABLE or DISABLE. - * @retval None - ************************************************************************************************************/ -void OPA_PGACmd(HT_OPA_TypeDef* HT_OPAn, ControlStatus NewState) -{ - u32 OPA_CR = (u32)(&HT_OPAn->CR); - u32 CRValue; - - /* Check the parameters */ - Assert_Param(IS_OPA(HT_OPAn)); - Assert_Param(IS_CONTROL_STATUS(NewState)); - - CRValue = HT_OPAn->CR & (~(0x06UL)); // reset unit gain & PGA - - if (NewState == ENABLE) - { - CRValue |= 0x4; // set PGA - } - - HT_OPAn->CR = gOPAUnProtectKey; - HT_OPAn->CR = CRValue; -} - -/*********************************************************************************************************//** - * @brief Configure the Gain Selection for the PGA. - * @param HT_OPAn: where HT_OPAn is the selected OPA from the OPA peripherals. - * @param GAIN_SEL : - * This parameter can be one of the following value: - * @arg PGA_GAIN_6 : - * @arg PGA_GAIN_8 : - * @arg PGA_GAIN_12 : - * @arg PGA_GAIN_16 : - * @arg PGA_GAIN_24 : - * @arg PGA_GAIN_32 : - * @arg PGA_GAIN_48 : - * @arg PGA_GAIN_64 : - * @arg PGA_GAIN_5 : - * @arg PGA_GAIN_7 : - * @arg PGA_GAIN_11 : - * @arg PGA_GAIN_15 : - * @arg PGA_GAIN_23 : - * @arg PGA_GAIN_31 : - * @arg PGA_GAIN_47 : - * @arg PGA_GAIN_63 : - * @retval None - ************************************************************************************************************/ -void OPA_PGAGain(HT_OPA_TypeDef* HT_OPAn, u8 bGAIN_SEL) -{ - u32 CRValue; - - /* Check the parameters */ - Assert_Param(IS_OPA(HT_OPAn)); - Assert_Param(IS_OPA_PGA_SEL(bGAIN_SEL)); - - CRValue = HT_OPAn->CR & (~0x70UL); - CRValue |= (u32)bGAIN_SEL << 4; - - HT_OPAn->CR = gOPAUnProtectKey; - HT_OPAn->CR = CRValue; -} -#endif - /*********************************************************************************************************//** * @brief Enable or Disable the 10bit Scaler. * @param HT_OPAn: where HT_OPAn is the selected OPA from the OPA peripherals. diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_pga.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_pga.c index 6dacca7f49f..41b1b509e73 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_pga.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f65xxx_66xxx_pga.c @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f65xxx_66xxx_pga.c - * @version $Rev:: 6914 $ - * @date $Date:: 2023-05-10 #$ - * @brief This file provides all the PGA firmware functions. (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief This file provides all the PGA firmware functions. ************************************************************************************************************* * @attention * @@ -37,8 +37,654 @@ * @{ */ +/* Private constants ---------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Private_Define PGA private definitions + * @{ + */ +#define PGA_ENABLE (0x00000001ul) + +#define CR_REF_POS 10 +#define CR_HVDDA_POS 8 + +#define CR_OUTPUT_HIGH (1) +#define CR_OUTPUT_POS 7 + +#define CR_GAIN_POS 4 +#define CR_GAIN_MASK (0x7ul << CR_GAIN_POS) + +#define CR_NE_POS 3 + +#define CR_PGA_POS 2 + +#define CR_NUG_POS 1 + +#define VOS_OFM_CALIBRATION_MODE (1) +#define VOS_OFM_POS 7 + +#define VOS_RSP_POS 6 + +#define VOS_OF_DEFAULT_VALUE (0x10) +#define VOS_OF_POS 0 +#define VOS_OF_MASK (0x1Ful << VOS_OF_POS) + +#define VR_VFEN_SET ((u32)0x00000001) +#define VR_VFEN_RESET ((u32)0xFFFFFFFE) + +#define PGA0_OF_WITH_CALIBRATION 0x1 +#define PGA1_OF_WITH_CALIBRATION 0x2 +#define PGA2_OF_WITH_CALIBRATION 0x4 +#define PGA3_OF_WITH_CALIBRATION 0x8 +/** + * @} + */ +/* Private macro -------------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Private_Macro PGA private macros + * @{ + */ +#define IS_PGA0(x) (x == HT_PGA0) +#if (LIBCFG_PGA1) +#define IS_PGA1(x) (x == HT_PGA1) +#else +#define IS_PGA1(x) (0) +#endif +#if (LIBCFG_PGA2) +#define IS_PGA2(x) (x == HT_PGA2) +#else +#define IS_PGA2(x) (0) +#endif +#if (LIBCFG_PGA3) +#define IS_PGA3(x) (x == HT_PGA3) +#else +#define IS_PGA3(x) (0) +#endif +#define IS_PGA(x) (IS_PGA0(x) || \ + IS_PGA1(x) || \ + IS_PGA2(x) || \ + IS_PGA3(x)) + +#define IS_PGA_HVDDA_OPTION(x) ((x == PGA_HVDDA_DISABLE) || \ + (x == PGA_HVDDA_RESISTOR) || \ + (x == PGA_HVDDA_POS_INPUT)) + +#define IS_PGA_GAIN(x) ((x == PGA_GAIN_LEVEL_0) || \ + (x == PGA_GAIN_LEVEL_1) || \ + (x == PGA_GAIN_LEVEL_2) || \ + (x == PGA_GAIN_LEVEL_3) || \ + (x == PGA_GAIN_LEVEL_4) || \ + (x == PGA_GAIN_LEVEL_5)) + +#define IS_PGA_INPUT(x) ((x == PGA_INPUT_NEGATIVE) || \ + (x == PGA_INPUT_POSITIVE)) + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------------------------------------*/ +static u32 gPGAUnProtectKey = 0; +static vu32 gPGACaliValInit = 0; + +/* Global functions ----------------------------------------------------------------------------------------*/ +/** @defgroup PGA_Exported_Functions PGA exported functions + * @{ + */ +/*********************************************************************************************************//** + * @brief Deinitialize the PGA peripheral registers to their default reset values. + * @retval None + ************************************************************************************************************/ +void PGA_DeInit(void) +{ + RSTCU_PeripReset_TypeDef RSTCUReset = {{0}}; + + RSTCUReset.Bit.PGA = 1; + RSTCU_PeripReset(RSTCUReset, ENABLE); + + gPGACaliValInit = 0; +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the specified PGA peripheral. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None +*************************************************************************************************************/ +void PGA_Cmd(HT_PGA0_X_TypeDef* HT_PGAn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + HT_PGAn->CR = gPGAUnProtectKey; + + if (NewState != DISABLE) + { + /* Enable the selected HT_PGAn peripheral */ + HT_PGAn->CR |= PGA_ENABLE; + } + else + { + /* Disable the selected HT_PGAn peripheral */ + HT_PGAn->CR &= ~(u32)PGA_ENABLE; + } +} + +/*********************************************************************************************************//** + * @brief Set the unprotect key. + * @param uUnProtectKey: protect key, shall be PGA_UNPROTECT_KEY + * @retval None + ************************************************************************************************************/ +void PGA_SetUnProtectKey(u32 uUnProtectKey) +{ + gPGAUnProtectKey = uUnProtectKey << 16; +} + +/*********************************************************************************************************//** + * @brief Protect the selected PGA before setting the PGA Control Register. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None + ************************************************************************************************************/ +void PGA_ProtectConfig(HT_PGA0_X_TypeDef* HT_PGAn) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + /* Write any value to bit 16 ~ 31 (PROTECT) and keep the other control bit */ + HT_PGAn->CR = HT_PGAn->CR; +} + +/*********************************************************************************************************//** + * @brief Unprotect the selected PGA before setting the PGA Control Register. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None + ************************************************************************************************************/ +void PGA_UnprotectConfig(HT_PGA0_X_TypeDef* HT_PGAn) +{ + u32 CRValue; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + /* Set the unlock code corresponding to selected PGA */ + CRValue = HT_PGAn->CR & 0x0000FFFF; + HT_PGAn->CR = gPGAUnProtectKey | CRValue; +} + +/*********************************************************************************************************//** + * @brief Initialize the PGA peripheral according to the specified parameters in the PGA_InitStruct. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_InitStruct: pointer to a PGA_InitTypeDef structure. + * @retval None + ************************************************************************************************************/ +void PGA_Init(HT_PGA0_X_TypeDef* HT_PGAn, PGA_InitTypeDef* PGA_InitStruct) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_HVDDA_OPTION(PGA_InitStruct->PGA_HVDDA)); + + /* According to the HT_PGAn calibration value flag, initialize the calibration value to 0x10 if needed. */ + if((HT_PGAn == HT_PGA0) && !(gPGACaliValInit & PGA0_OF_WITH_CALIBRATION)) + { + HT_PGA0->VOS = 0x00000090; + HT_PGA0->VOS &= 0xFFFFFF7F; + } + #if (LIBCFG_PGA1) + else if((HT_PGAn == HT_PGA1) && !(gPGACaliValInit & PGA1_OF_WITH_CALIBRATION)) + { + HT_PGA1->VOS = 0x00000090; + HT_PGA1->VOS &= 0xFFFFFF7F; + } + #endif + #if (LIBCFG_PGA2) + else if((HT_PGAn == HT_PGA2) && !(gPGACaliValInit & PGA2_OF_WITH_CALIBRATION)) + { + HT_PGA2->VOS = 0x00000090; + HT_PGA2->VOS &= 0xFFFFFF7F; + } + #endif + #if (LIBCFG_PGA3) + else if((HT_PGAn == HT_PGA3) && !(gPGACaliValInit & PGA3_OF_WITH_CALIBRATION)) + { + HT_PGA3->VOS = 0x00000090; + HT_PGA3->VOS &= 0xFFFFFF7F; + } + #endif + + HT_PGAn->CR = gPGAUnProtectKey; + + HT_PGAn->CR = (u32)PGA_InitStruct->PGA_REF << CR_REF_POS | \ + (u32)PGA_InitStruct->PGA_NUG << CR_NUG_POS | \ + (u32)PGA_InitStruct->PGA_NE << CR_NE_POS | \ + (u32)PGA_InitStruct->PGA_PGA << CR_PGA_POS | \ + (u32)PGA_InitStruct->PGA_HVDDA << CR_HVDDA_POS; +} + +/*********************************************************************************************************//** + * @brief Fill each PGA_InitStruct member with its default value. + * @param PGA_InitStruct: pointer to an PGA_InitTypeDef structure. + * @retval None + ************************************************************************************************************/ +void PGA_StructInit(PGA_InitTypeDef* PGA_InitStruct) +{ + /* PGA_InitStruct members default value */ + PGA_InitStruct->PGA_REF = DISABLE; + PGA_InitStruct->PGA_NUG = DISABLE; + PGA_InitStruct->PGA_NE = DISABLE; + PGA_InitStruct->PGA_PGA = DISABLE; + PGA_InitStruct->PGA_HVDDA = PGA_HVDDA_DISABLE; +} + +/*********************************************************************************************************//** + * @brief Configure the Gain for the selected PGA Control Register. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_LEVEL_x: Where PGA_GAIN_LEVEL_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_LEVEL_0 + * @arg PGA_GAIN_LEVEL_1 + * @arg PGA_GAIN_LEVEL_2 + * @arg PGA_GAIN_LEVEL_3 + * @arg PGA_GAIN_LEVEL_4 + * @arg PGA_GAIN_LEVEL_5 + * @retval None + ************************************************************************************************************/ +void PGA_GainConfig(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x) +{ + u32 CRValue; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_LEVEL_x)); + + CRValue = HT_PGAn->CR & 0x0000FFFF; + CRValue &= ~CR_GAIN_MASK; + + HT_PGAn->CR = gPGAUnProtectKey; + HT_PGAn->CR = ((u32)PGA_GAIN_LEVEL_x << CR_GAIN_POS) | CRValue; +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the PGAHVDDA Voltage Follower. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None +*************************************************************************************************************/ +void PGA_HVDDACmd(ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_CONTROL_STATUS(NewState)); + if(NewState != DISABLE) + { + /* Enable the selected HT_PGAn peripheral */ + HT_PGA->VR |= (u32)VR_VFEN_SET; + } + else + { + /* Disable the selected HT_PGAn peripheral */ + HT_PGA->VR &= (u32)VR_VFEN_RESET; + } +} +/*********************************************************************************************************//** + * @brief Enable or Disable the Calibration mode. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None +*************************************************************************************************************/ +void PGA_CalibrationCmd(HT_PGA0_X_TypeDef* HT_PGAn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if(NewState != DISABLE) + { + HT_PGAn->VOS |= (u32)VOS_OFM_CALIBRATION_MODE << VOS_OFM_POS; + /* + Set the HT_PGAn calibration value flag to true to ensure that the calibration value does not change + after executing calibration. + */ + if(HT_PGAn == HT_PGA0) + { + gPGACaliValInit |= PGA0_OF_WITH_CALIBRATION; + } + #if (LIBCFG_PGA1) + else if(HT_PGAn == HT_PGA1) + { + gPGACaliValInit |= PGA1_OF_WITH_CALIBRATION; + } + #endif + #if (LIBCFG_PGA2) + else if(HT_PGAn == HT_PGA2) + { + gPGACaliValInit |= PGA2_OF_WITH_CALIBRATION; + } + #endif + #if (LIBCFG_PGA3) + else if(HT_PGAn == HT_PGA3) + { + gPGACaliValInit |= PGA3_OF_WITH_CALIBRATION; + } + #endif + } + else + { + HT_PGAn->VOS &= ~((u32)VOS_OFM_CALIBRATION_MODE << VOS_OFM_POS); + } +} + +/*********************************************************************************************************//** + * @brief Configure the direction of Calibration reference pins. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_INPUT_x: where PGA_INPUT_x is the calibration reference. + * This parameter can be one of the following values: + * @arg PGA_INPUT_NEGATIVE + * @arg PGA_INPUT_POSITIVE + * @retval None +*************************************************************************************************************/ +void PGA_SetCalibrationInput(HT_PGA0_X_TypeDef* HT_PGAn, PGA_CALIBRATION_INPUT_Enum PGA_INPUT_x) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_INPUT(PGA_INPUT_x)); + + if(PGA_INPUT_x == PGA_CALIBRATION_INPUT_NEGATIVE) + { + PGA_UnprotectConfig(HT_PGAn); + HT_PGAn->CR |= (u32)ENABLE << CR_NE_POS; + HT_PGAn->VOS &= ~((u32)ENABLE << VOS_RSP_POS); + } + else + { + HT_PGAn->VOS |= (u32)ENABLE << VOS_RSP_POS; + } +} + +/*********************************************************************************************************//** + * @brief Configure the calibration value. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param Value: the calibration value. + * @retval None +*************************************************************************************************************/ +void PGA_SetCalibrationValue(HT_PGA0_X_TypeDef* HT_PGAn, u32 Value) +{ + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + HT_PGAn->VOS = (HT_PGAn->VOS & ~(u32)(VOS_OF_MASK)) | Value; +} + +/*********************************************************************************************************//** + * @brief Check whether the specified PID flag has been set. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None +*************************************************************************************************************/ +FlagStatus PGA_ReadOutputBit(HT_PGA0_X_TypeDef* HT_PGAn) +{ + FlagStatus Status; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + if ((HT_PGAn->CR & ((u32)CR_OUTPUT_HIGH << CR_OUTPUT_POS)) != RESET) + { + Status = SET; + } + else + { + Status = RESET; + } + + return Status; +} + +/*********************************************************************************************************//** + * @brief Set Inverting Amplifier Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_x: Where PGA_GAIN_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_6 + * @arg PGA_GAIN_8 + * @arg PGA_GAIN_12 + * @arg PGA_GAIN_16 + * @arg PGA_GAIN_24 + * @arg PGA_GAIN_32 + * @retval None + * @note Model configuration must follow the rules below: + * Inverting Amplifier Mode : The positive input must be grounded. + ************************************************************************************************************/ +void PGA_SetModeInverting(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_x)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_x); +} + +/*********************************************************************************************************//** + * @brief Set the Differentiator Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_LEVEL_x: Where PGA_GAIN_LEVEL_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_LEVEL_0 + * @arg PGA_GAIN_LEVEL_1 + * @arg PGA_GAIN_LEVEL_2 + * @arg PGA_GAIN_LEVEL_3 + * @arg PGA_GAIN_LEVEL_4 + * @arg PGA_GAIN_LEVEL_5 + * @retval None + * @note Model configuration must follow the rules below: + * Differentiator : The positive input must have an external capacitor and be grounded. + ************************************************************************************************************/ +void PGA_SetModeDifferentiator(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_LEVEL_x)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_LEVEL_x); +} + +/*********************************************************************************************************//** + * @brief Set the Non-Inverting Amplifier Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_x: Where PGA_GAIN_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_6 + * @arg PGA_GAIN_8 + * @arg PGA_GAIN_12 + * @arg PGA_GAIN_16 + * @arg PGA_GAIN_24 + * @arg PGA_GAIN_32 + * @retval None + ************************************************************************************************************/ +void PGA_SetModeNonInverting(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_x)); + + PGA_InitStruct.PGA_REF = DISABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_x); +} + +/*********************************************************************************************************//** + * @brief Set the Inverting Adder Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_LEVEL_x: Where PGA_GAIN_LEVEL_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_LEVEL_0 + * @arg PGA_GAIN_LEVEL_1 + * @arg PGA_GAIN_LEVEL_2 + * @arg PGA_GAIN_LEVEL_3 + * @arg PGA_GAIN_LEVEL_4 + * @arg PGA_GAIN_LEVEL_5 + * @retval None + * @note Model configuration must follow the rules below: + * Inverting Adder Mode : The positive input must be grounded. + * The negative input must be voltage divider. + ************************************************************************************************************/ +void PGA_SetModeInvertingAdder(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_LEVEL_x)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = ENABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_LEVEL_x); +} + +/*********************************************************************************************************//** + * @brief Set the Exponent Amplifier Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_LEVEL_x: Where PGA_GAIN_LEVEL_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_LEVEL_0 + * @arg PGA_GAIN_LEVEL_1 + * @arg PGA_GAIN_LEVEL_2 + * @arg PGA_GAIN_LEVEL_3 + * @arg PGA_GAIN_LEVEL_4 + * @arg PGA_GAIN_LEVEL_5 + * @retval None + * @note Model configuration must follow the rules below: + * Exponent Amplifier Mode : The positive input must be grounded. + * The negative input must have an external diode. + ************************************************************************************************************/ +void PGA_SetModeExponent(HT_PGA0_X_TypeDef* HT_PGAn, u32 PGA_GAIN_LEVEL_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_LEVEL_x)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = ENABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_LEVEL_x); +} + +/*********************************************************************************************************//** + * @brief Set the Manual Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None + * @note This mode prototype is a voltage follower, and the following modes can be used + * with external components: + * Peak Detector + * Active Filter + * R-2R D/A conversion circuit (+) + ************************************************************************************************************/ +void PGA_SetModeManual(HT_PGA0_X_TypeDef* HT_PGAn) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + PGA_InitStruct.PGA_REF = ENABLE; + PGA_InitStruct.PGA_NUG = ENABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = DISABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); +} + +/*********************************************************************************************************//** + * @brief Set the Non-Inverting Adder Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @param PGA_GAIN_x: Where PGA_GAIN_x is the Gain for PGA resistor. + * This parameter can be one of the following values: + * @arg PGA_GAIN_6 + * @arg PGA_GAIN_8 + * @arg PGA_GAIN_12 + * @arg PGA_GAIN_16 + * @arg PGA_GAIN_24 + * @arg PGA_GAIN_32 + * @retval None + * @note Model configuration must follow the rules below: + * Non-Inverting Adder : The positive input must be voltage divider. + * The negative input must be grounded. + ************************************************************************************************************/ +void PGA_SetModeNonInvertingAdder(HT_PGA0_X_TypeDef* HT_PGAn, PGA_GAIN_TYPE1_Enum PGA_GAIN_x) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + Assert_Param(IS_PGA_GAIN(PGA_GAIN_x)); + + PGA_InitStruct.PGA_REF = DISABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = DISABLE; + PGA_InitStruct.PGA_PGA = ENABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); + PGA_GainConfig(HT_PGAn, PGA_GAIN_x); +} + +/*********************************************************************************************************//** + * @brief Set the Comparator Mode of the specified HT_PGAn. + * @param HT_PGAn: where HT_PGAn is the selected PGA from the PGA peripherals. + * @retval None + ************************************************************************************************************/ +void PGA_SetModeComparator(HT_PGA0_X_TypeDef* HT_PGAn) +{ + PGA_InitTypeDef PGA_InitStruct; + + /* Check the parameters */ + Assert_Param(IS_PGA(HT_PGAn)); + + PGA_InitStruct.PGA_REF = DISABLE; + PGA_InitStruct.PGA_NUG = DISABLE; + PGA_InitStruct.PGA_NE = ENABLE; + PGA_InitStruct.PGA_PGA = DISABLE; + PGA_InitStruct.PGA_HVDDA = PGA_HVDDA_DISABLE; + + PGA_Init(HT_PGAn, &PGA_InitStruct); +} + +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c index 724e166fbed..ab3b316067b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_cordic.c @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f66xxx_cordic.c - * @version $Rev:: 6914 $ - * @date $Date:: 2023-05-10 #$ - * @brief This file provides all the CORDIC firmware functions. (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief This file provides all the CORDIC firmware functions. ************************************************************************************************************* * @attention * @@ -38,7 +38,189 @@ */ +/* Private constants ---------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Private_Define CORDIC private definitions + * @{ + */ +#define IS_CORDIC_FUNCTION(__FUNCTION__) (((__FUNCTION__) == CORDIC_FUNCTION_COSINE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_SINE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_PHASE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_MODULUS) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_ARCTANGENT) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_HCOSINE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_HSINE) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_HARCTANGENT) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_NATURALLOG) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_SQUAREROOT) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_ROTATIONMATRIX) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_INTEGERMODULUS) || \ + ((__FUNCTION__) == CORDIC_FUNCTION_INTEGERSQUAREROOT)) + +#define IS_CORDIC_PRECISION(__PRECISION__) (((__PRECISION__) == CORDIC_PRECISION_1CYCLE) || \ + ((__PRECISION__) == CORDIC_PRECISION_2CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_3CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_4CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_5CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_6CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_7CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_8CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_9CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_10CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_11CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_12CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_13CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_14CYCLES) || \ + ((__PRECISION__) == CORDIC_PRECISION_15CYCLES)) + + +#define IS_CORDIC_SCALE(__SCALE__) (((__SCALE__) == CORDIC_SCALE_0) || \ + ((__SCALE__) == CORDIC_SCALE_1) || \ + ((__SCALE__) == CORDIC_SCALE_2) || \ + ((__SCALE__) == CORDIC_SCALE_3) || \ + ((__SCALE__) == CORDIC_SCALE_4) || \ + ((__SCALE__) == CORDIC_SCALE_5) || \ + ((__SCALE__) == CORDIC_SCALE_6) || \ + ((__SCALE__) == CORDIC_SCALE_7)) + +#define IS_CORDIC_PDMA_REQ(REQ) (((REQ & 0xFFF9FFFF) == 0x0) && (REQ != 0x0)) + +#define IS_CORDIC_NBWRITE(__NBWRITE__) (((__NBWRITE__) == CORDIC_NBWRITE_1) || \ + ((__NBWRITE__) == CORDIC_NBWRITE_2) || \ + ((__NBWRITE__) == CORDIC_NBWRITE_3)) + +#define IS_CORDIC_NBREAD(__NBREAD__) (((__NBREAD__) == CORDIC_NBREAD_1) || \ + ((__NBREAD__) == CORDIC_NBREAD_2)) + +#define IS_CORDIC_INSIZE(__INSIZE__) (((__INSIZE__) == CORDIC_INSIZE_32BITS) || \ + ((__INSIZE__) == CORDIC_INSIZE_16BITS)) + +#define IS_CORDIC_OUTSIZE(__OUTSIZE__) (((__OUTSIZE__) == CORDIC_OUTSIZE_32BITS) || \ + ((__OUTSIZE__) == CORDIC_OUTSIZE_16BITS)) +/** + * @} + */ + +/* Global functions ----------------------------------------------------------------------------------------*/ +/** @defgroup CORDIC_Exported_Functions CORDIC exported functions + * @{ + */ +/*********************************************************************************************************//** + * @brief Deinitialize the CORDIC peripheral registers to their default reset values. + * @retval None + ************************************************************************************************************/ +void CORDIC_DeInit(void) +{ + RSTCU_PeripReset_TypeDef RSTCUReset = {{0}}; + + RSTCUReset.Bit.CORDIC = 1; + RSTCU_PeripReset(RSTCUReset, ENABLE); +} + +/*********************************************************************************************************//** + * @brief Initialize the CORDIC peripheral according to the specified parameters in the CORDIC_InitStruct. + * @param CORDIC_InitStruct: pointer to a CORDIC_InitTypeDef structure. + * @retval None + ************************************************************************************************************/ +void CORDIC_Init(CORDIC_InitTypeDef *CORDIC_InitStruct) +{ + /* Check the parameters */ + Assert_Param(IS_CORDIC_FUNCTION(CORDIC_InitStruct->Function)); + Assert_Param(IS_CORDIC_PRECISION(CORDIC_InitStruct->Precision)); + Assert_Param(IS_CORDIC_SCALE(CORDIC_InitStruct->Scale)); + Assert_Param(IS_CORDIC_NBWRITE(CORDIC_InitStruct->NbWrite)); + Assert_Param(IS_CORDIC_NBREAD(CORDIC_InitStruct->NbRead)); + Assert_Param(IS_CORDIC_INSIZE(CORDIC_InitStruct->InSize)); + Assert_Param(IS_CORDIC_OUTSIZE(CORDIC_InitStruct->OutSize)); + HT_CORDIC->CSR &= ~(CORDIC_CSR_FUNC_MASK | CORDIC_CSR_PRECISION_MASK | CORDIC_CSR_SCALE_MASK | \ + CORDIC_CSR_NRES_MASK | CORDIC_CSR_NARGS_MASK | CORDIC_CSR_RESSIZE_MASK | CORDIC_CSR_ARGSIZE_MASK); + + HT_CORDIC->CSR |= (CORDIC_InitStruct->Function | CORDIC_InitStruct->Precision | CORDIC_InitStruct->Scale | \ + CORDIC_InitStruct->NbWrite | CORDIC_InitStruct->NbRead | CORDIC_InitStruct->InSize | CORDIC_InitStruct->OutSize); +} + +/*********************************************************************************************************//** + * @brief Enable or Disable CORDIC result ready interrupt. (RRDY) + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void CORDIC_IntCmd(ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_CORDIC->CSR |= CORDIC_CSR_IEN; + } + else + { + HT_CORDIC->CSR &= ~CORDIC_CSR_IEN; + } +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the CORDIC PDMA interface. + * @param CORDIC_DMA: specify the CORDIC PDMA transfer request to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg CORDIC_DMA_REN: Read PDMA transfer request + * @arg CORDIC_DMA_WEN: Write PDMA transfer request + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void CORDIC_PDMACmd(u32 CORDIC_DMA, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_CORDIC_PDMA_REQ(CORDIC_DMA)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_CORDIC->CSR |= CORDIC_DMA; + } + else + { + HT_CORDIC->CSR &= ~CORDIC_DMA; + } +} + +/*********************************************************************************************************//** + * @brief Check CORDIC result ready flag state. (RRDY) + * @retval SET or RESET + ************************************************************************************************************/ +FlagStatus CORDIC_GetFlagStatus_RRDY(void) +{ + if ((HT_CORDIC->CSR & CORDIC_FLAG_RRDY) != (u32)RESET) + { + return (SET); + } + else + { + return (RESET); + } +} + +/*********************************************************************************************************//** + * @brief Write 32-bit input data for the CORDIC processing. + * @param InData: 32-bit value to be provided as input data for CORDIC processing. + * @retval None + ************************************************************************************************************/ +void CORDIC_WriteData(u32 InData) +{ + HT_CORDIC->WDATA = InData; +} + +/*********************************************************************************************************//** + * @brief Return 32-bit output data of CORDIC processing. + * @retval 32-bit output data of CORDIC processing. + ************************************************************************************************************/ +u32 CORDIC_ReadData(void) +{ + return (u32)HT_CORDIC->RDATA; +} +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_pid.c b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_pid.c index d956f5fcf92..ad68960888b 100644 --- a/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_pid.c +++ b/bsp/ht32/libraries/HT32_STD_5xxxx_FWLib/library/HT32F5xxxx_Driver/src/ht32f66xxx_pid.c @@ -1,8 +1,8 @@ /*********************************************************************************************************//** * @file ht32f66xxx_pid.c - * @version $Rev:: 6914 $ - * @date $Date:: 2023-05-10 #$ - * @brief This file provides all the PID firmware functions. (temporary file, not finish/support yet). + * @version $Rev:: 8260 $ + * @date $Date:: 2024-11-05 #$ + * @brief This file provides all the PID firmware functions. ************************************************************************************************************* * @attention * @@ -37,8 +37,301 @@ * @{ */ +/* Global functions ----------------------------------------------------------------------------------------*/ +/** @addtogroup PID_Exported_Functions PID exported functions + * @{ + */ +/*********************************************************************************************************//** + * @brief Deinitialize the HT_PIDn peripheral registers to their default reset values. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @retval None + ************************************************************************************************************/ +void PID_DeInit(HT_PID_TypeDef* HT_PIDn) +{ + RSTCU_PeripReset_TypeDef RSTCUReset = {{0}}; + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + + if (HT_PIDn == HT_PID0) + { + RSTCUReset.Bit.PID0 = 1; + } + + RSTCU_PeripReset(RSTCUReset, ENABLE); +} + +/*********************************************************************************************************//** + * @brief Initialize the HT_PIDn PID_Mode peripheral according to the specified parameters in the PID_InitTypeDef. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_Mode: where PID_Mode is the selected PID mode. + * This parameter can be one of the following values: + * @arg PID_SPD_MODE + * @arg PID_IQ_MODE + * @arg PID_ID_MODE + * @arg PID_FWNK_MODE + * @arg PID_PLL_MODE + * @arg PID_USR_MODE + * @param PID_Para: where PID_Para is PID paramater structure. + * @retval None + ************************************************************************************************************/ +void PID_Init(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode, PID_InitTypeDef* PID_Para) +{ + HT_PIDPARA_TypeDef * gPID_ModePara = &(HT_PIDn->SPD); + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_MODE(PID_Mode)); + + (gPID_ModePara + PID_Mode)->KPIR = PID_Para->KP; + (gPID_ModePara + PID_Mode)->KIIR = PID_Para->KI; + (gPID_ModePara + PID_Mode)->KDIR = PID_Para->KD; + (gPID_ModePara + PID_Mode)->IFVMAXLR = PID_Para->UI_MAX; + (gPID_ModePara + PID_Mode)->IFVMINLR = PID_Para->UI_MIN; + (gPID_ModePara + PID_Mode)->PIDORLR = (u32)((PID_Para->OUT_MAX << 16) | ((u16)PID_Para->OUT_MIN)); + (gPID_ModePara + PID_Mode)->LEIR = PID_Para->ERRn_1; + (gPID_ModePara + PID_Mode)->LIFVR = PID_Para->UIn_1; +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the specified PID interrupts. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_INT_x: Specify the PID interrupt sources that is to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg PID_INT_CMP : + * @arg PID_INT_OVF : + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void PID_IntConfig(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_INT(PID_INT_x)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_PIDn->CR |= PID_INT_x; + } + else + { + HT_PIDn->CR &= ~PID_INT_x; + } +} +/*********************************************************************************************************//** + * @brief Check whether the specified PID interrupt has occurred. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_INT_x: Specify the PID interrupt sources that is to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg PID_INT_CMP : + * @arg PID_INT_OVF : + * @retval SET or RESET + ************************************************************************************************************/ +FlagStatus PID_GetIntStatus(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x) +{ + FlagStatus Status; + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_INT(PID_INT_x)); + + if ((HT_PIDn->CR & (PID_INT_x << PID_INT_Status_Pos)) != RESET) + { + Status = SET; + } + else + { + Status = RESET; + } + + return Status; +} + +/*********************************************************************************************************//** + * @brief Clear the PID interrupt pending bits. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_INT_x: Specify the PID interrupt sources that is to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg PID_INT_CMP : + * @arg PID_INT_OVF : + * @retval None + ************************************************************************************************************/ +void PID_ClearIntPendingBit(HT_PID_TypeDef* HT_PIDn, u32 PID_INT_x) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_INT(PID_INT_x)); + + HT_PIDn->CR |= (PID_INT_x << PID_INT_Clear_Pos); +} + +/*********************************************************************************************************//** + * @brief Set the PID ERR(n) value of the common parameters. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param ERRn: where ERRn is PID Controller Error Input Value. + * @retval None + ************************************************************************************************************/ +void PID_SetComPara_ERRn(HT_PID_TypeDef* HT_PIDn, s32 ERRn) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + + HT_PIDn->EIVR = ERRn; +} + +/*********************************************************************************************************//** + * @brief Set the PID UI_input(n) value of the common parameters. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param UI_Input: where UI_Input is PID Controller integrator accumulation selection. + * @retval None + ************************************************************************************************************/ +void PID_SetComPara_UI_Input(HT_PID_TypeDef* HT_PIDn, s32 UI_Input) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + HT_PIDn->IFIVR = UI_Input; +} + +/*********************************************************************************************************//** + * @brief Enable compute the PID calculation. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_Mode: where PID_Mode is the selected PID mode. + * This parameter can be one of the following values: + * @arg PID_SPD_MODE + * @arg PID_IQ_MODE + * @arg PID_ID_MODE + * @arg PID_FWNK_MODE + * @arg PID_PLL_MODE + * @arg PID_USR_MODE + * @retval None + ************************************************************************************************************/ +void PID_Compute(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_MODE(PID_Mode)); + + HT_PIDn->CR &= ~(u32)PID_CR_MODSEL_Msk; + HT_PIDn->CR |= (PID_Mode << PID_CR_MODSEL_Pos) | (PID_CR_PIDEN); +} + +/*********************************************************************************************************//** + * @brief Return the PID ouput result value. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @retval The Value of PID result. + ************************************************************************************************************/ +s16 PID_GetOutResult(HT_PID_TypeDef* HT_PIDn) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + + return HT_PIDn->ORR; +} + +/*********************************************************************************************************//** + * @brief Check whether the specified PID flag has been set. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_FLAG_x: Specify the flag to check. + * This parameter can be any combination of the following values: + * @arg PID_FLAG_CMP : + * @arg PID_FLAG_OVF : + * @retval SET or RESET + ************************************************************************************************************/ +FlagStatus PID_GetFlagStatus(HT_PID_TypeDef* HT_PIDn, u32 PID_FLAG_x) +{ + FlagStatus Status; + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_FLAG(PID_FLAG_x)); + + if ((HT_PIDn->CR & PID_FLAG_x) != RESET) + { + Status = SET; + } + else + { + Status = RESET; + } + + return Status; +} + +/*********************************************************************************************************//** + * @brief Enable or Disable the integrator accumulation value set by UI_input(n). + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param NewState: This parameter can be ENABLE or DISABLE. + * @retval None + ************************************************************************************************************/ +void PID_UI_InputCmd(HT_PID_TypeDef* HT_PIDn, ControlStatus NewState) +{ + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_CONTROL_STATUS(NewState)); + + if (NewState != DISABLE) + { + HT_PIDn->CR |= PID_CR_UIF; + } + else + { + HT_PIDn->CR &= ~(u32)PID_CR_UIF; + } +} + +/*********************************************************************************************************//** + * @brief Return the PID last error input value (ERRn_1) for the selected PID mode. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_Mode: where PID_Mode is the selected PID mode. + * This parameter can be one of the following values: + * @arg PID_SPD_MODE + * @arg PID_IQ_MODE + * @arg PID_ID_MODE + * @arg PID_FWNK_MODE + * @arg PID_PLL_MODE + * @arg PID_USR_MODE + * @retval The Value of ERRn_1 for the selected PID mode. + ************************************************************************************************************/ +s32 PID_GetERRn_1(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode) +{ + HT_PIDPARA_TypeDef * gPID_ModePara = &(HT_PIDn->SPD); + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_MODE(PID_Mode)); + + return (gPID_ModePara + PID_Mode)->LEIR; +} + +/*********************************************************************************************************//** + * @brief Return the PID last integral function value (UIn_1) for the selected PID mode. + * @param HT_PIDn: where HT_PIDn is the selected PID from the PID peripherals. + * @param PID_Mode: where PID_Mode is the selected PID mode. + * This parameter can be one of the following values: + * @arg PID_SPD_MODE + * @arg PID_IQ_MODE + * @arg PID_ID_MODE + * @arg PID_FWNK_MODE + * @arg PID_PLL_MODE + * @arg PID_USR_MODE + * @retval The Value of UIn_1 for the selected PID mode. + ************************************************************************************************************/ +s32 PID_GetUIn_1(HT_PID_TypeDef* HT_PIDn, PID_Mode_Enum PID_Mode) +{ + HT_PIDPARA_TypeDef * gPID_ModePara = &(HT_PIDn->SPD); + + /* Check the parameters */ + Assert_Param(IS_PID(HT_PIDn)); + Assert_Param(IS_PID_MODE(PID_Mode)); + return (gPID_ModePara + PID_Mode)->LIFVR; +} + +/** + * @} + */ /** * @} diff --git a/bsp/ht32/libraries/ht32_drivers/SConscript b/bsp/ht32/libraries/ht32_drivers/SConscript index f3c00c8aab4..86ba719ad98 100644 --- a/bsp/ht32/libraries/ht32_drivers/SConscript +++ b/bsp/ht32/libraries/ht32_drivers/SConscript @@ -34,6 +34,15 @@ if GetDepend(['BSP_USING_ADC']): if GetDepend(['BSP_USING_WDT']): src += ['drv_wdt.c'] + +if GetDepend(['BSP_USING_CAN']): + src += ['drv_can.c'] + +if GetDepend(['BSP_USING_SDIO']): + src += ['drv_sdio.c'] + +if GetDepend(['BSP_USING_USBD']): + src += ['drv_usbd.c'] #创建一个列表,用于保存需要包含的H文件路径 path = [cwd] diff --git a/bsp/ht32/libraries/ht32_drivers/cpuport.h b/bsp/ht32/libraries/ht32_drivers/cpuport.h new file mode 100644 index 00000000000..05bb12cf2fc --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/cpuport.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#ifndef CPUPORT_H__ +#define CPUPORT_H__ + +#ifdef RT_USING_SMP +typedef union { + unsigned long slock; + struct __arch_tickets { + unsigned short owner; + unsigned short next; + } tickets; +} rt_hw_spinlock_t; +#endif + +#endif /*CPUPORT_H__*/ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_can.c b/bsp/ht32/libraries/ht32_drivers/drv_can.c new file mode 100644 index 00000000000..2c6db98f735 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_can.c @@ -0,0 +1,673 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-08-22 QT-one first version + */ + +#include +#include "drv_can.h" +#include "ht32_can_config.h" + +#ifdef BSP_USING_CAN +#if !defined(BSP_USING_CAN) + #error "Please define at least one BSP_USING_CAN" +#endif + +#define CAN_UMASK_MODE 0 +#define CAN_MASK_MODE 1 + +struct ht32_can_msg_type +{ + CAN_MSG_TypeDef cfg_msg; + uint32_t data_len; + uint8_t data[8]; +}; + +/* Baud rate mapping structure */ +struct ht32_baud_rate +{ + enum CANBAUD rt_baud_rate; + uint32_t us_baus_rate; +}; +/* CAN Filter Table Configuration Structure */ +struct ht32_can_filter_config +{ + /* Each bit represents a message;1: the message is occupied;0: the message is not occupied */ + uint32_t filter_flag; + /* Filter table configuration information */ + CAN_MSG_TypeDef filter_mag[MSG_OBJ_TOTAL_NUM]; +}; +/* CAN Object Structures */ +struct ht32_can +{ + char *name; /* Equipment name */ + HT_CAN_TypeDef *can_x; /* peripheral base address */ + struct can_configure cfg; /* CAN Configuration Structure */ + struct rt_can_device device; /* Inherited device options */ + struct ht32_can_filter_config filter_cfg; /* Filter Table Configuration */ +}; +/* CAN Baud Rate Mapping Table */ +static const struct ht32_baud_rate can_baud_rate_tab[] = +{ + {CAN1MBaud, 1000000}, + {CAN800kBaud, 800000}, + {CAN500kBaud, 500000}, + {CAN250kBaud, 250000}, + {CAN125kBaud, 125000}, + {CAN100kBaud, 100000}, + {CAN50kBaud, 50000}, + {CAN20kBaud, 20000}, + {CAN10kBaud, 10000}, +}; +/* CAN Object Information */ +static struct ht32_can ht32_can_config = +{ + .name = BSP_USING_CAN_NAME, + .can_x = HT_CAN0, + .cfg = {0}, + .device = RT_NULL, + .filter_cfg = {0}, +}; +/** + * @brief Default Filter Table Configuration + * @param can_instance:CAN object + * @retval + */ +static rt_uint32_t cfg_can_default_filter(struct ht32_can *can_instance) +{ + uint8_t filter_num = BSP_USING_CAN_MSG_NUM; + can_instance->filter_cfg.filter_flag |= 1 << filter_num; + can_instance->filter_cfg.filter_mag[filter_num].MsgNum = filter_num + 1; + can_instance->filter_cfg.filter_mag[filter_num].IdType = (CAN_IdType_Enum)BSP_USING_CAN_ID_MODE; + can_instance->filter_cfg.filter_mag[filter_num].IdMask = BSP_USING_CAN_MASK; + can_instance->filter_cfg.filter_mag[filter_num].FrameType = (CAN_FrameType_Enum)BSP_USING_CAN_FRAME_MODE; + can_instance->filter_cfg.filter_mag[filter_num].Id = BSP_USING_CAN_ID; + CAN_SetRxMsg(can_instance->can_x, &can_instance->filter_cfg.filter_mag[filter_num], 1); + return RT_EOK; +} +/** + * @brief Get baud rate mapping parameters for CAN + * @info This function is mainly used to convert the baud rate of RTT format to HT32 format baud rate + * @param baud:CAN baud rate in RTT format + * @retval Returns the CAN baud rate in HT32 format. + */ +static rt_uint32_t get_can_baud_index(rt_uint32_t baud) +{ + rt_uint32_t len, index; + + len = sizeof(can_baud_rate_tab) / sizeof(can_baud_rate_tab[0]); + for (index = 0; index < len; index++) + { + if (can_baud_rate_tab[index].rt_baud_rate == baud) + return can_baud_rate_tab[index].us_baus_rate; + } + return 0; +} +/** + * @brief Configuring CAN Structures + * @info This function depends on the ht32_can_config.h file + * @param can_ck:System clock for CAN + * @param can_buad:CAN baud rate to be configured + * @param mode:Modes of CAN + * @param nart:enable or disable the no automatic retransmission + * @param CAN_InitStruct:Structures to be configured + * @retval 1:success;0:error + */ +static rt_uint32_t config_can_struct(uint32_t can_ck, + uint32_t can_buad, + uint8_t mode, + ControlStatus nart, + CAN_InitTypeDef* CAN_InitStruct) +{ + uint8_t cf0_nbt = 0; + uint32_t nominal_bit_time = 0; + + for (cf0_nbt = 25; cf0_nbt > 8; cf0_nbt--) + { + if ((can_ck / can_buad / cf0_nbt) > 0) + { + if (((can_ck / (can_ck / can_buad / cf0_nbt)) / cf0_nbt) <= can_buad) + { + nominal_bit_time = cf0_nbt; + break; + } + } + } + if (cf0_nbt < 8) + { + return 0; + } + CAN_InitStruct->CAN_BRPrescaler = (can_ck / (can_buad * nominal_bit_time)); + CAN_InitStruct->CAN_SJW = HTCFG_CAN_CF0_BIT_TIME_SJW; + CAN_InitStruct->CAN_TSEG1 = (nominal_bit_time - (nominal_bit_time * HTCFG_CAN_CF0_SAMPLE_POINT) / 100); + CAN_InitStruct->CAN_TSEG0 = (nominal_bit_time - 1 - CAN_InitStruct->CAN_TSEG1); + CAN_InitStruct->CAN_NART = nart; + CAN_InitStruct->CAN_Mode = mode; + return 1; +} +/** + * @brief CAN Configuration Functions + * @param + * @retval + */ +static rt_err_t ht32_can_configure(struct rt_can_device *can, struct can_configure *cfg) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + struct ht32_can *can_instance = RT_NULL; + rt_uint32_t can_baud = 0; + rt_uint8_t can_mode = 0; + CAN_InitTypeDef CAN_InitStruct = {0}; + + RT_ASSERT(can); + RT_ASSERT(cfg); + can_instance = (struct ht32_can *)can->parent.user_data; + RT_ASSERT(can_instance != RT_NULL); + + CKCUClock.Bit.AFIO = 1; + CKCUClock.Bit.CAN0 = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + ht32_can_gpio_init(can_instance->can_x); + + /* Get baud rate */ + can_baud = get_can_baud_index(cfg->baud_rate); + if (can_baud == 0) + { + return -RT_ERROR; + } + + can_instance->cfg.baud_rate = cfg->baud_rate; + can_instance->cfg.mode = cfg->mode; + + /* Configuring the operating mode of CAN */ + switch (cfg->mode) + { + case RT_CAN_MODE_NORMAL: + can_mode = CAN_MODE_NORMAL; + break; + case RT_CAN_MODE_LISTEN: + can_mode = CAN_MODE_SILENT; + break; + case RT_CAN_MODE_LOOPBACK: + can_mode = CAN_MODE_LBACK; + break; + case RT_CAN_MODE_LOOPBACKANLISTEN: + can_mode = CAN_MODE_SILENT | CAN_MODE_LBACK; + break; + default: + return -RT_ERROR; + } + + if (0 == (config_can_struct(_HTCFG_CF0_CK_CAN, can_baud, can_mode, DISABLE, &CAN_InitStruct))) + { + return -RT_ERROR; + } + /* Reset CAN */ + CAN_DeInit(can_instance->can_x); + /* Initialising CAN */ + CAN_Init(can_instance->can_x, &CAN_InitStruct); + + /* Configuring the Default Filter for CAN */ + cfg_can_default_filter(can_instance); + + return RT_EOK; +} +/** + * @brief CAN Control Functions + * @param + * @retval + */ +rt_err_t ht32_can_control(struct rt_can_device *can, int cmd, void *arg) +{ + rt_uint32_t argval; + struct ht32_can *can_instance; + struct rt_can_filter_config *filter_cfg; + + RT_ASSERT(can != RT_NULL); + can_instance = (struct ht32_can *)can->parent.user_data; + RT_ASSERT(can_instance != RT_NULL); + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT:/* Clear Interrupt */ + { + argval = (rt_uint32_t) arg; + if (argval == RT_DEVICE_FLAG_INT_RX) /* receive interruptions */ + { + if (CAN_GetFlagStatus(can_instance->can_x, CAN_FLAG_RXOK)) + { + /* Clear RXOK Flag */ + CAN_ClearFlag(can_instance->can_x, CAN_FLAG_RXOK); + } + } + else if (argval == RT_DEVICE_FLAG_INT_TX) /* Send Interrupt */ + { + if (CAN_GetFlagStatus(can_instance->can_x, CAN_FLAG_TXOK)) + { + /* Clear TXOK flag*/ + CAN_ClearFlag(can_instance->can_x, CAN_FLAG_TXOK); + } + } + else if (argval == RT_DEVICE_CAN_INT_ERR) /* false interruption */ + { + /* Error Process*/ + CAN_LastErrorCode_TypeDef lec = CAN_GetLastErrorCode(can_instance->can_x); + if (lec != NO_ERROR) + { + LOG_W("LEC: %d\r\n", lec); + } + if (CAN_GetFlagStatus(can_instance->can_x, CAN_FLAG_BOFF)) + { + /* Recover from Bus off state.*/ + CAN_BusOffRecovery(can_instance->can_x); + } + } + break; + } + case RT_DEVICE_CTRL_SET_INT:/* Setting Up Interruptions */ + { + argval = (rt_uint32_t) arg; + if (argval == RT_DEVICE_FLAG_INT_RX) /* interrupt receive mode */ + { + LOG_W("Configuring Receive Interrupts!\r\n"); + CAN_IntConfig(can_instance->can_x, CAN_INT_EIE | CAN_INT_SIE | CAN_INT_IE, ENABLE); + NVIC_EnableIRQ(CAN0_IRQn); + } + else if (argval == RT_DEVICE_FLAG_INT_TX) /* interrupt transmission mode */ + { + LOG_W("Configuring Transmit Interrupts!\r\n"); + } + else if (argval == RT_DEVICE_CAN_INT_ERR) /* false interruption */ + { + LOG_W("Configuration error interrupt!\r\n"); + } + break; + } + case RT_CAN_CMD_SET_FILTER:/* Configuring the Hardware Filter Table */ + { + int i = 0; + uint8_t filter_num = 0; + uint32_t idmask = 0; + if (RT_NULL == arg) + { + /* default filter config */ + cfg_can_default_filter(can_instance); + } + else + { + filter_cfg = (struct rt_can_filter_config *)arg; + if (filter_cfg->count > MSG_OBJ_TOTAL_NUM) + { + LOG_W("Filter list length exceeds the limit(max 32)!"); + return -RT_ERROR; + } + for (i = 0; i < filter_cfg->count; i++) + { + /* Specify the filter table number or no */ + if (filter_cfg->items[i].hdr_bank == -1) + { + filter_num = i; + } + else + { + if (filter_cfg->items[i].hdr_bank > MSG_OBJ_TOTAL_NUM) + { + LOG_W("Filter List Number Out of Limits(1-32)!"); + return -RT_ERROR; + } + else + { + filter_num = filter_cfg->items[i].hdr_bank; + } + } + if (can_instance->filter_cfg.filter_flag & (1 << filter_num)) + { + LOG_W("This filter channel will be changed(num:%d)!", filter_num); + rt_kprintf("This filter channel will be changed(num:%d)!", filter_num); + } + can_instance->filter_cfg.filter_flag |= 1 << filter_num; + can_instance->filter_cfg.filter_mag[filter_num].MsgNum = filter_num + 1; + + /* Standard or Extended Frames */ + if (filter_cfg->items[i].ide == RT_CAN_STDID) + { + can_instance->filter_cfg.filter_mag[filter_num].IdType = CAN_STD_ID; + idmask = 0x7FF; + } + else if (filter_cfg->items[i].ide == RT_CAN_EXTID) + { + can_instance->filter_cfg.filter_mag[filter_num].IdType = CAN_EXT_ID; + idmask = 0x1FFFFFFF; + } + else + { + LOG_W("Frame pattern error(CAN_STD_ID/CAN_EXT_ID)!"); + return -RT_ERROR; + } + /* Whether to use MASK mode */ + if (filter_cfg->items[i].mode == CAN_UMASK_MODE) + { + can_instance->filter_cfg.filter_mag[filter_num].IdMask = idmask; + } + else if (filter_cfg->items[i].mode == CAN_MASK_MODE) + { + can_instance->filter_cfg.filter_mag[filter_num].IdMask = filter_cfg->items[i].mask; + } + else + { + LOG_W("MASK mode error(CAN_UMASK_MODE/CAN_MASK_MODE)!"); + return -RT_ERROR; + } + + /* Remote frames or data frames */ + if (filter_cfg->items[i].rtr == RT_CAN_RTR) + { + can_instance->filter_cfg.filter_mag[filter_num].FrameType = CAN_REMOTE_FRAME; + } + else if (filter_cfg->items[i].rtr == RT_CAN_DTR) + { + can_instance->filter_cfg.filter_mag[filter_num].FrameType = CAN_DATA_FRAME; + } + /* Setting ID */ + can_instance->filter_cfg.filter_mag[filter_num].Id = filter_cfg->items[i].id; + /* Setting up the CAN filter table */ + CAN_SetRxMsg(can_instance->can_x, &can_instance->filter_cfg.filter_mag[filter_num], 1); + } + } + break; + } + case RT_CAN_CMD_SET_BAUD:/* Setting the baud rate */ + { + argval = (rt_uint32_t) arg; + if (argval != CAN1MBaud && + argval != CAN800kBaud && + argval != CAN500kBaud && + argval != CAN250kBaud && + argval != CAN125kBaud && + argval != CAN100kBaud && + argval != CAN50kBaud && + argval != CAN20kBaud && + argval != CAN10kBaud) + { + return -RT_ERROR; + } + if (argval != can_instance->cfg.baud_rate) + { + can_instance->cfg.baud_rate = argval; + return ht32_can_configure(&can_instance->device, &can_instance->cfg); + } + break; + } + case RT_CAN_CMD_SET_MODE:/* Setting the CAN Operating Mode */ + { + argval = (rt_uint32_t) arg; + if (argval != RT_CAN_MODE_NORMAL && + argval != RT_CAN_MODE_LISTEN && + argval != RT_CAN_MODE_LOOPBACK && + argval != RT_CAN_MODE_LOOPBACKANLISTEN) + { + return -RT_ERROR; + } + if (argval != can_instance->cfg.mode) + { + can_instance->cfg.mode = argval; + return ht32_can_configure(&can_instance->device, &can_instance->cfg); + } + break; + } + case RT_CAN_CMD_GET_STATUS:/* Get CAN device status */ + { + rt_uint32_t errtype; + + errtype = can_instance->can_x->ECR; + can_instance->device.status.rcverrcnt = ((errtype >> 8) & 0x7f); + can_instance->device.status.snderrcnt = (errtype & 0xff); + + errtype = can_instance->can_x->SR; + can_instance->device.status.lasterrtype = (errtype & 0x07); + can_instance->device.status.errcode = ((errtype >> 5) & 0x07); + + rt_memcpy(arg, &can_instance->device.status, sizeof(can_instance->device.status)); + break; + } + default: + return -RT_ERROR; + } + return RT_EOK; +} +/** + * @brief CAN sends data + * @param + * @retval + */ +rt_ssize_t ht32_can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno) +{ + struct ht32_can *can_instance = RT_NULL; + struct rt_can_msg *pmsg = (struct rt_can_msg *) buf; + struct ht32_can_msg_type tx_msg = {0}; + + RT_ASSERT(can != RT_NULL); + can_instance = (struct ht32_can *)can->parent.user_data; + RT_ASSERT(can_instance != RT_NULL); + + /* Standard and Extended Frames */ + if (CAN_STD_ID == pmsg->ide) + { + tx_msg.cfg_msg.IdType = CAN_STD_ID; + tx_msg.cfg_msg.Id = pmsg->id; + } + else if (CAN_EXT_ID == pmsg->ide) + { + tx_msg.cfg_msg.IdType = CAN_EXT_ID; + tx_msg.cfg_msg.Id = pmsg->id; + } + else + { + LOG_W("Frame pattern error(CAN_STD_ID/CAN_EXT_ID)!"); + return -RT_ERROR; + } + + /* Teleframes and data frames */ + if (RT_CAN_RTR == pmsg->rtr) + { + tx_msg.cfg_msg.FrameType = CAN_REMOTE_FRAME; + } + else if (RT_CAN_DTR == pmsg->rtr) + { + tx_msg.cfg_msg.FrameType = CAN_DATA_FRAME; + } + else + { + LOG_W("Remote frame setting error(CAN_REMOTE_FRAME/CAN_DATA_FRAME)!"); + return -RT_ERROR; + } + + /* Length of sent data */ + tx_msg.data_len = pmsg->len & 0x0FU; + /* data being sent */ + tx_msg.data[0] = pmsg->data[0]; + tx_msg.data[1] = pmsg->data[1]; + tx_msg.data[2] = pmsg->data[2]; + tx_msg.data[3] = pmsg->data[3]; + tx_msg.data[4] = pmsg->data[4]; + tx_msg.data[5] = pmsg->data[5]; + tx_msg.data[6] = pmsg->data[6]; + tx_msg.data[7] = pmsg->data[7]; + + /* Waiting tx Msg idle */ + while (CAN_TransmitStatus(can_instance->can_x, &tx_msg.cfg_msg) == 0); + /* Loopback data */ + CAN_Transmit(can_instance->can_x, &tx_msg.cfg_msg, tx_msg.data, tx_msg.data_len); + + return RT_EOK; +} +/** + * @brief CAN receive data + * @param + * @retval + */ +rt_ssize_t ht32_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno) +{ + uint8_t i = 0; + uint32_t msgnum = 0; + CAN_RxStatus_TypeDef rx_status; + struct ht32_can_msg_type rx_msg = {0}; + struct ht32_can *can_instance = RT_NULL; + struct rt_can_msg *pmsg = (struct rt_can_msg *) buf; + + RT_ASSERT(can != RT_NULL); + RT_ASSERT(pmsg != RT_NULL); + can_instance = (struct ht32_can *)can->parent.user_data; + RT_ASSERT(can_instance != RT_NULL); + + msgnum = can_instance->filter_cfg.filter_flag; + for (i = 0; i < MSG_OBJ_TOTAL_NUM; i++) + { + if ((msgnum & 1) == 1) + { + rx_status = CAN_Receive(can_instance->can_x, &can_instance->filter_cfg.filter_mag[i], rx_msg.data, &rx_msg.data_len); + if (rx_status == MSG_OVER_RUN) + { + LOG_W("ID[%X] rx message over run\r\n", can_instance->filter_cfg.filter_mag[i].Id); + } + else if (rx_status == MSG_OBJ_NOT_SET) + { + LOG_W("rx message not set \r\n"); + } + else if (rx_status == MSG_RX_FINISH) + { + LOG_W("rx ok \r\n"); + pmsg->data[0] = rx_msg.data[0]; + pmsg->data[1] = rx_msg.data[1]; + pmsg->data[2] = rx_msg.data[2]; + pmsg->data[3] = rx_msg.data[3]; + pmsg->data[4] = rx_msg.data[4]; + pmsg->data[5] = rx_msg.data[5]; + pmsg->data[6] = rx_msg.data[6]; + pmsg->data[7] = rx_msg.data[7]; + pmsg->len = rx_msg.data_len; + + if (can_instance->filter_cfg.filter_mag[i].IdType == CAN_EXT_ID) + { + pmsg->id = can_instance->filter_cfg.filter_mag[i].Id; + pmsg->ide = RT_CAN_EXTID; + } + else if (can_instance->filter_cfg.filter_mag[i].IdType == CAN_STD_ID) + { + pmsg->id = can_instance->filter_cfg.filter_mag[i].Id; + pmsg->ide = RT_CAN_EXTID; + } + + if (can_instance->filter_cfg.filter_mag[i].FrameType == CAN_DATA_FRAME) + { + pmsg->rtr = RT_CAN_DTR; + } + else if (can_instance->filter_cfg.filter_mag[i].FrameType == CAN_REMOTE_FRAME) + { + pmsg->rtr = RT_CAN_RTR; + } + return RT_EOK; + } + } + msgnum = msgnum >> 1; + if (msgnum == 0) + { + return -1; + } + } + return -1; +} +/* Mapping CAN interfaces */ +static const struct rt_can_ops ht32_can_ops = +{ + .configure = ht32_can_configure, /* CAN Configuration Functions */ + .control = ht32_can_control, /* CAN Control Functions */ + .sendmsg = ht32_can_sendmsg, /* CAN Transmit Data */ + .recvmsg = ht32_can_recvmsg, /* CAN Receive Data */ +}; + +int rt_hw_can_init(void) +{ + + struct can_configure config = CANDEFAULTCONFIG; + config.mode = BSP_USING_CAN_MODE; + config.baud_rate = BSP_USING_CAN_BAUD; + config.privmode = RT_CAN_MODE_NOPRIV; + config.ticks = 50; + +#ifdef RT_CAN_USING_HDR + config.maxhdr = 14; +#endif + ht32_can_config.device.config = config; + /* Registration of CAN devices */ + rt_hw_can_register(&ht32_can_config.device, + ht32_can_config.name, + &ht32_can_ops, + &ht32_can_config); + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_hw_can_init); + +void CAN0_IRQHandler(void) +{ + CAN_LastErrorCode_TypeDef lec; + rt_interrupt_enter(); + /* Recover from Bus off state. */ + if (CAN_GetFlagStatus(ht32_can_config.can_x, CAN_FLAG_BOFF)) + { + CAN_BusOffRecovery(ht32_can_config.can_x); + } + /* Transmit message finished */ + if (CAN_GetFlagStatus(ht32_can_config.can_x, CAN_FLAG_TXOK)) + { + rt_hw_can_isr(&ht32_can_config.device, RT_CAN_EVENT_TX_DONE); + CAN_ClearFlag(ht32_can_config.can_x, CAN_FLAG_TXOK); + } + /* Message received. */ + if (CAN_GetFlagStatus(ht32_can_config.can_x, CAN_FLAG_RXOK)) + { + /* Clear all message objects' interrupt pending flag */ + CAN_ClearAllMsgPendingFlag(ht32_can_config.can_x); + rt_hw_can_isr(&ht32_can_config.device, RT_CAN_EVENT_RX_IND); + CAN_ClearFlag(ht32_can_config.can_x, CAN_FLAG_RXOK); + } + lec = CAN_GetLastErrorCode(ht32_can_config.can_x); + if (lec != NO_ERROR) + { + switch (lec) + { + case NO_ERROR: + break; + case STUFF_ERROR: + ht32_can_config.device.status.bitpaderrcnt++; + break; + case FORM_ERROR: + ht32_can_config.device.status.formaterrcnt++; + break; + case ACK_ERROR: + ht32_can_config.device.status.ackerrcnt++; + break; + case BIT1_EROR: + case BIT0_ERROR: + ht32_can_config.device.status.biterrcnt++; + break; + case CRC_ERROR: + ht32_can_config.device.status.crcerrcnt++; + break; + case NO_CHANGE: + break; + } + ht32_can_config.device.status.lasterrtype = lec; + ht32_can_config.device.status.rcverrcnt = CAN_GetReceiveErrorCounter(ht32_can_config.can_x); + ht32_can_config.device.status.snderrcnt = CAN_GetLSBTransmitErrorCounter(ht32_can_config.can_x); + ht32_can_config.device.status.errcode = lec; + } + + rt_interrupt_leave(); +} + +#endif /* BSP_USING_CAN */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_can.h b/bsp/ht32/libraries/ht32_drivers/drv_can.h new file mode 100644 index 00000000000..4b5c63cecfd --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_can.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-08-22 QT-one first version + */ + +#ifndef __DRV_CAN_H__ +#define __DRV_CAN_H__ + +#include +#include +#include "drv_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_CAN_H__ */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_common.c b/bsp/ht32/libraries/ht32_drivers/drv_common.c index 1bdb6a36e1e..fe689d47281 100644 --- a/bsp/ht32/libraries/ht32_drivers/drv_common.c +++ b/bsp/ht32/libraries/ht32_drivers/drv_common.c @@ -27,7 +27,7 @@ MSH_CMD_EXPORT(reboot, Reboot System); void rt_hw_systick_init(void) { SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK); - SYSTICK_SetReloadValue(SystemCoreClock / 8 / RT_TICK_PER_SECOND); + SYSTICK_SetReloadValue(SystemCoreClock / 10 / RT_TICK_PER_SECOND); SYSTICK_IntConfig(ENABLE); SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR); SYSTICK_CounterCmd(SYSTICK_COUNTER_ENABLE); diff --git a/bsp/ht32/libraries/ht32_drivers/drv_sdio.c b/bsp/ht32/libraries/ht32_drivers/drv_sdio.c new file mode 100644 index 00000000000..d9ea9e69542 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_sdio.c @@ -0,0 +1,747 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-11-06 QT-one first version + */ + +#include +#include "drv_sdio.h" + +#ifdef BSP_USING_SDIO +#if !defined (BSP_USING_SDIO) + #error "Please define at least one SDIOx" +#endif + +#define RT_HW_SDIO_LOCK(_sdio) rt_mutex_take(&_sdio->mutex, RT_WAITING_FOREVER) +#define RT_HW_SDIO_UNLOCK(_sdio) rt_mutex_release(&_sdio->mutex); + +typedef rt_err_t (*dma_txconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size); +typedef rt_err_t (*dma_rxconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size); +typedef rt_uint32_t (*sdio_clk_get)(HT_SDIO_TypeDef *hw_sdio); + +struct ht32_sdio_config +{ + SDIO_InitTypeDef sdio_cfg; /* SDIO Configuration Structure */ + PDMACH_InitTypeDef dma_tx_cfg; /* TX DMA Configuration Structure */ + PDMACH_InitTypeDef dma_rx_cfg; /* RX DMA Configuration Structure */ +}; + +struct ht32_sdio_des +{ + HT_SDIO_TypeDef *hw_sdio; /* Pointer to sdio hardware structure */ + dma_txconfig txconfig; /* Pointer to the configuration function for the TX DMA */ + dma_rxconfig rxconfig; /* Pointer to the configuration function for the RX DMA */ + sdio_clk_get clk_get; /* Pointer to get sdio clock function */ +}; + +struct sdio_pkg +{ + struct rt_mmcsd_cmd *cmd; /* RTT-defined mmcsd command structure */ + void *buff; /* Pointer to hold data */ + SDIO_CmdInitTypeDef sdio_cmd_str; /* Send Command Configuration */ + SDIO_DataInitTypeDef sdio_dat_str; /* Send Data Configuration */ +}; + +struct rt_hw_sdio +{ + struct rt_mmcsd_host *host; /* mmcsd host structure */ + struct ht32_sdio_des sdio_des; /* Configuration information for sdio */ + struct rt_event dat_event; /* data event variable */ + struct rt_event cmd_event; /* command event variable */ + struct rt_mutex mutex; /* mutually exclusive variable */ + struct sdio_pkg *pkg; /* package structure */ +}; + +rt_align(SDIO_ALIGN_LEN) /* Ensure data alignment */ +static rt_uint8_t cache_buf[SDIO_BUFF_SIZE]; /* Buff caches allocated to SDIOs */ + +static struct rt_mmcsd_host *host; +static struct ht32_sdio_config sdio_cfg; + +static void sdio_delay(rt_uint32_t ms) +{ + while (ms > 0) + ms--; +} + +static rt_uint32_t ht32_sdio_clk_get(HT_SDIO_TypeDef *hw_sdio) +{ + return SDIO_CLOCK_FREQ; +} +/** + * @brief this function transfer data by dma. + * @param sdio rt_hw_sdio + * @param pkg sdio package + * @retval none + */ +static void rt_hw_sdio_transfer_by_dma(struct rt_hw_sdio *sdio, struct sdio_pkg *pkg) +{ + struct rt_mmcsd_data *data; + void *buff; + HT_SDIO_TypeDef *hw_sdio; + if ((RT_NULL == pkg) || (RT_NULL == sdio)) + { + LOG_E("rt_hw_sdio_transfer_by_dma invalid args"); + return; + } + + data = pkg->cmd->data; + if (RT_NULL == data) + { + LOG_E("rt_hw_sdio_transfer_by_dma invalid args"); + return; + } + + buff = pkg->buff; + if (RT_NULL == buff) + { + LOG_E("rt_hw_sdio_transfer_by_dma invalid args"); + return; + } + + hw_sdio = sdio->sdio_des.hw_sdio; + if (data->flags & DATA_DIR_WRITE) + { + LOG_D("SDIO write!"); + sdio->sdio_des.txconfig((rt_uint32_t *)buff, (rt_uint32_t *)&hw_sdio->DR, (data->blks * data->blksize)); + } + else if (data->flags & DATA_DIR_READ) + { + LOG_D("SDIO read!"); + sdio->sdio_des.rxconfig((rt_uint32_t *)&hw_sdio->DR, (rt_uint32_t *)buff, (data->blks * data->blksize)); + } +} +/** + * @brief this function send command. + * @param sdio rt_hw_sdio + * @param pkg sdio package + * @retval none + */ +static void rt_hw_sdio_send_command(struct rt_hw_sdio *sdio, struct sdio_pkg *pkg) +{ + rt_uint32_t status = 0; + struct rt_mmcsd_cmd *cmd = pkg->cmd; + struct rt_mmcsd_data *data = cmd->data; + HT_SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio; + + /* save pkg */ + sdio->pkg = pkg; + + LOG_D("CMD:%d ARG:0x%08x RES:%s%s%s%s%s%s%s%s%s rw:%c len:%d blksize:%d", + cmd->cmd_code, + cmd->arg, + resp_type(cmd) == RESP_NONE ? "NONE" : "", + resp_type(cmd) == RESP_R1 ? "R1" : "", + resp_type(cmd) == RESP_R1B ? "R1B" : "", + resp_type(cmd) == RESP_R2 ? "R2" : "", + resp_type(cmd) == RESP_R3 ? "R3" : "", + resp_type(cmd) == RESP_R4 ? "R4" : "", + resp_type(cmd) == RESP_R5 ? "R5" : "", + resp_type(cmd) == RESP_R6 ? "R6" : "", + resp_type(cmd) == RESP_R7 ? "R7" : "", + data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-', + data ? data->blks * data->blksize : 0, + data ? data->blksize : 0 + ); + + /* config cmd reg */ + pkg->sdio_cmd_str.SDIO_DatPresent = SDIO_Data_Present_No; + + /* config data reg */ + if (data != RT_NULL) + { + rt_uint32_t dir = 0; + dir = (data->flags & DATA_DIR_READ) ? SDIO_TransferDir_ToSDIO : SDIO_TransferDir_ToCard; + if (SDIO_TransferDir_ToSDIO == dir) /* read */ + SDIO_FlagConfig(SDIO_FLAG_BUF_OVERFLOW | SDIO_FLAG_DATA_CRCERR | SDIO_FLAG_DATA_TIMEOUT | SDIO_FLAG_TRANS_END, ENABLE); + else if (SDIO_TransferDir_ToCard == dir) /* write */ + SDIO_FlagConfig(SDIO_FLAG_BUF_UNDERFLOW | SDIO_FLAG_DATA_CRCERR | SDIO_FLAG_DATA_TIMEOUT | SDIO_FLAG_TRANS_END, ENABLE); + if (data->blksize > 2048) + LOG_E("Block length out of range!"); + pkg->sdio_dat_str.SDIO_DataBlockCount = data->blks; /* Specify the number of data blocks to be transferred 1~65535 */ + pkg->sdio_dat_str.SDIO_DataBlockSize = data->blksize; /* Specify the size of the data block to be transferred 1~2048 */ + pkg->sdio_dat_str.SDIO_DataTimeOut = HW_SDIO_DATATIMEOUT; /* Specify the data timeout period 0x1 ~ 0x00ffffff */ + pkg->sdio_dat_str.SDIO_TransferDir = dir; /* Specify the direction of data transmission r/w */ + if (data->blks > 1) + pkg->sdio_dat_str.SDIO_TransferMode = SDIO_MultiBlock_DMA_Transfer; /* multiblock transfer mode */ + else + pkg->sdio_dat_str.SDIO_TransferMode = SDIO_SingleBlock_DMA_Transfer; /* single-block transfer mode */ + SDIO_DataConfig(&pkg->sdio_dat_str); + + pkg->sdio_cmd_str.SDIO_DatPresent = SDIO_Data_Present_Yes; + + rt_hw_sdio_transfer_by_dma(sdio, pkg); + } + + /* Configuring Response Mode */ + if (resp_type(cmd) == RESP_NONE) + pkg->sdio_cmd_str.SDIO_Response = SDIO_Response_No; + else if (resp_type(cmd) == RESP_R2) + pkg->sdio_cmd_str.SDIO_Response = SDIO_Response_Long; + else + pkg->sdio_cmd_str.SDIO_Response = SDIO_Response_Short; + + if (resp_type(cmd) & (RESP_R1 | RESP_R6)) + pkg->sdio_cmd_str.SDIO_CmdIdxChk = SDIO_CmdIdxChk_Yes; + else + pkg->sdio_cmd_str.SDIO_CmdIdxChk = SDIO_Data_Present_No; + + if (resp_type(cmd) & (RESP_R3)) + pkg->sdio_cmd_str.SDIO_CmdCrcChk = SDIO_CmdCrcChk_No; + else + pkg->sdio_cmd_str.SDIO_CmdCrcChk = SDIO_CmdCrcChk_Yes; + /* send cmd */ + pkg->sdio_cmd_str.SDIO_Argument = cmd->arg; /* sdio Command Parameters */ + pkg->sdio_cmd_str.SDIO_CmdIndex = (cmd->cmd_code << 8); /* Index of sdio commands 0x01 ~ 0x40*/ + /* open irq */ + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, ENABLE); + SDIO_IntConfig(HW_SDIO_CMD_FLAG, ENABLE); + SDIO_SendCommand(&pkg->sdio_cmd_str); + /* wait completed */ + if (rt_event_recv(&sdio->cmd_event, 0xffffffff, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(5000), &status) != RT_EOK) + { + LOG_E("wait completed timeout"); + cmd->err = -RT_ETIMEOUT; + return; + } + SDIO_IntConfig(HW_SDIO_CMD_FLAG, DISABLE); + if (cmd->err != RT_EOK) + LOG_D("cmd err!"); + + /* waiting for data to be sent to completion */ + if (data != RT_NULL) + { + status = 0; + SDIO_IntConfig(SDIO_INT_BUF_OVERFLOW | SDIO_INT_DATA_CRCERR | SDIO_INT_DATA_TIMEOUT | SDIO_INT_TRANS_END, ENABLE); + if (rt_event_recv(&sdio->dat_event, 0xffffffff, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(5000), &status) != RT_EOK) + { + LOG_E("wait completed timeout"); + data->err = -RT_ETIMEOUT; + return; + } + SDIO_IntConfig(SDIO_INT_BUF_OVERFLOW | SDIO_INT_DATA_CRCERR | SDIO_INT_DATA_TIMEOUT | SDIO_INT_TRANS_END, DISABLE); + if (data->err != RT_EOK) + LOG_D("data err!"); + } + /* close irq, keep sdio irq */ + hw_sdio->IER = 0x00; + /* clear pkg */ + sdio->pkg = RT_NULL; +} +/** + * @brief this function send sdio request. + * @param sdio rt_hw_sdio + * @param req request + * @retval none + */ +static void rt_hw_sdio_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req) +{ + struct sdio_pkg pkg; + struct rt_hw_sdio *sdio = host->private_data; + struct rt_mmcsd_data *data; + + RT_HW_SDIO_LOCK(sdio); + /* Send commands and data */ + if (req->cmd != RT_NULL) + { + memset(&pkg, 0, sizeof(pkg)); + data = req->cmd->data; + pkg.cmd = req->cmd; + + if (data != RT_NULL) + { + rt_uint32_t size = data->blks * data->blksize; + RT_ASSERT(size <= SDIO_BUFF_SIZE); + pkg.buff = data->buf; + if ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1)) + { + pkg.buff = cache_buf; + if (data->flags & DATA_DIR_WRITE) + { + memcpy(cache_buf, data->buf, size); + } + } + } + rt_hw_sdio_send_command(sdio, &pkg); + if ((data != RT_NULL) && (data->flags & DATA_DIR_READ) && ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1))) + { + memcpy(data->buf, cache_buf, data->blksize * data->blks); + } + } + /* Send stop command */ + if (req->stop != RT_NULL) + { + memset(&pkg, 0, sizeof(pkg)); + pkg.cmd = req->stop; + rt_hw_sdio_send_command(sdio, &pkg); + } + RT_HW_SDIO_UNLOCK(sdio); + mmcsd_req_complete(sdio->host); +} +/** + * @brief this function config sdio. + * @param host rt_mmcsd_host + * @param io_cfg rt_mmcsd_io_cfg + * @retval none + */ +static void rt_hw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg) +{ + rt_uint32_t div, clk_src; + rt_uint32_t clk = io_cfg->clock; + struct rt_hw_sdio *sdio = host->private_data; + /* SDIO Clock Acquisition and Limiting */ + clk_src = sdio->sdio_des.clk_get(sdio->sdio_des.hw_sdio); + if (clk_src < 400 * 1000) + { + LOG_E("Chip clock frequency too low! fre:%d", clk_src); + return; + } + if (clk > host->freq_max) clk = host->freq_max; + if (clk > clk_src) + { + LOG_W("Setting rate is greater than clock source rate."); + clk = clk_src; + } + + LOG_D("clk:%d width:%s%s%s power:%s%s%s", + 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" : "" + ); + + RT_HW_SDIO_LOCK(sdio); + /* SDIO Clock Division Configuration */ + div = clk_src / clk; + if ((clk == 0) || (div == 0)) + { + div = 1; + } + else + { + if (div < 1) + { + div = 1; + } + else if (div > 0xff) + { + div = 0xff; + } + } + sdio_cfg.sdio_cfg.SDIO_ClockDiv = div; + if (div % 2) + sdio_cfg.sdio_cfg.SDIO_ClockPeriod = SDIO_Clock_LowPeriod_Longer; + else + sdio_cfg.sdio_cfg.SDIO_ClockPeriod = SDIO_Clock_LowPeriod_Shorter; + + /* Data bus mode configuration */ + if (io_cfg->bus_width == MMCSD_BUS_WIDTH_8) + { + LOG_E("8-bit data width not supported!"); + return; + } + else if (io_cfg->bus_width == MMCSD_BUS_WIDTH_4) + { + sdio_cfg.sdio_cfg.SDIO_BusWide = SDIO_BusWide_4b; + sdio_cfg.sdio_cfg.SDIO_BusMode = SDIO_BusMode_HighSpeed; + } + else + { + sdio_cfg.sdio_cfg.SDIO_BusWide = SDIO_BusWide_1b; + sdio_cfg.sdio_cfg.SDIO_BusMode = SDIO_BusMode_NormalSpeed; + } + /* Power Mode Configuration */ + switch (io_cfg->power_mode) + { + case MMCSD_POWER_OFF: + sdio_cfg.sdio_cfg.SDIO_ClockPowerSave = SDIO_Clock_PowerSave_Disable; + break; + case MMCSD_POWER_UP: + sdio_cfg.sdio_cfg.SDIO_ClockPowerSave = SDIO_Clock_PowerSave_StopHigh; + break; + case MMCSD_POWER_ON: + sdio_cfg.sdio_cfg.SDIO_ClockPowerSave = SDIO_Clock_PowerSave_StopLow; + break; + default: + LOG_W("unknown power_mode %d", io_cfg->power_mode); + break; + } + SDIO_Init(&sdio_cfg.sdio_cfg); + RT_HW_SDIO_UNLOCK(sdio); +} +/** + * @brief this function update sdio interrupt. + * @param host rt_mmcsd_host + * @param enable + * @retval none + */ +void rt_hw_sdio_irq_update(struct rt_mmcsd_host *host, rt_int32_t enable) +{ + if (enable) + { + LOG_D("enable sdio irq"); + NVIC_EnableIRQ(SDIO_IRQn); + } + else + { + LOG_D("disable sdio irq"); + NVIC_DisableIRQ(SDIO_IRQn); + } +} +/** + * @brief this function delect sdcard. + * @param host rt_mmcsd_host + * @retval 0x01 + */ +static rt_int32_t rt_hw_sd_delect(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 + */ +void rt_hw_sdio_irq_process(struct rt_mmcsd_host *host) +{ + rt_uint8_t cmd_flag = 0; + rt_uint8_t data_flag = 0; + struct rt_hw_sdio *sdio = host->private_data; + HT_SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio; + rt_uint32_t intstatus = hw_sdio->SR; + struct rt_mmcsd_cmd *cmd = sdio->pkg->cmd; + struct rt_mmcsd_data *data = cmd->data; + if (sdio->pkg == NULL) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(HW_SDIO_CMD_FLAG); + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(HW_SDIO_DATA_FLAG); + return; + } + /* Command Response Processing */ + if (cmd != NULL) + { + if (intstatus != 0x00000001) + sdio_delay(10000); + cmd->resp[0] = hw_sdio->RESP0; + cmd->resp[1] = hw_sdio->RESP1; + cmd->resp[2] = hw_sdio->RESP2; + cmd->resp[3] = hw_sdio->RESP3; + cmd->err = RT_EOK; + if (SDIO_GetFlagStatus(SDIO_FLAG_CMD_SEND)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_SEND); + cmd_flag = 1; + } + if (SDIO_GetFlagStatus(SDIO_FLAG_CMD_TIMEOUT)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_TIMEOUT); + RESET_CPSM(); + cmd->err = -RT_ETIMEOUT; + cmd_flag = 1; + } + if ((SDIO_GetFlagStatus(SDIO_FLAG_CMD_CRCERR)) && (resp_type(cmd) & (RESP_R3 | RESP_R4))) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_CRCERR); + cmd->err = RT_EOK; + cmd_flag = 1; + } + else if (SDIO_GetFlagStatus(SDIO_FLAG_CMD_CRCERR)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_CRCERR); + cmd->err = -RT_ERROR; + cmd_flag = 1; + } + if ((SDIO_GetFlagStatus(SDIO_FLAG_CMD_IDXERR)) && (resp_type(cmd) & (RESP_R1 | RESP_R6)) && (cmd->err == RT_EOK)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_IDXERR); + cmd->err = RT_EOK; + cmd_flag = 1; + } + else if (SDIO_GetFlagStatus(SDIO_FLAG_CMD_IDXERR)) + { + SDIO_FlagConfig(HW_SDIO_CMD_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_CMD_IDXERR); + cmd->err = -RT_ERROR; + cmd_flag = 1; + } + if (cmd_flag) + { + rt_event_send(&sdio->cmd_event, intstatus); + } + } + /* Data response processing */ + if (data != NULL) + { + data->err = RT_EOK; + if (SDIO_GetFlagStatus(SDIO_FLAG_TRANS_END)) + { + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_TRANS_END); + data_flag = 1; + } + + if (SDIO_GetFlagStatus(SDIO_FLAG_DATA_TIMEOUT)) + { + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_DATA_TIMEOUT); + data->err = -RT_ETIMEOUT; + data_flag = 1; + } + if (SDIO_GetFlagStatus(SDIO_FLAG_DATA_CRCERR)) + { + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_DATA_CRCERR); + data->err = -RT_ERROR; + data_flag = 1; + } + if (SDIO_GetFlagStatus(SDIO_FLAG_BUF_OVERFLOW)) + { + SDIO_FlagConfig(HW_SDIO_DATA_FLAG, DISABLE); + SDIO_ClearFlag(SDIO_FLAG_BUF_OVERFLOW); + data->err = -RT_ERROR; + data_flag = 1; + } + /* 如果操作完成 */ + if (data_flag) + { + rt_event_send(&sdio->dat_event, intstatus); /* 发送事件,通知操作完成 */ + } + } + + +} +static const struct rt_mmcsd_host_ops ops = +{ + .request = rt_hw_sdio_request, + .set_iocfg = rt_hw_sdio_iocfg, + .get_card_status = rt_hw_sd_delect, + .enable_sdio_irq = rt_hw_sdio_irq_update, +}; +/** + * @brief this function create mmcsd host. + * @param sdio_des at32_sdio_des + * @retval rt_mmcsd_host + */ +struct rt_mmcsd_host *sdio_host_create(struct ht32_sdio_des *sdio_des) +{ + struct rt_mmcsd_host *host; + struct rt_hw_sdio *sdio = RT_NULL; + /* effective parameter */ + if ((sdio_des == RT_NULL) || (sdio_des->txconfig == RT_NULL) || (sdio_des->rxconfig == RT_NULL)) + { + LOG_E("L:%d F:%s %s %s %s", + (sdio_des == RT_NULL ? "sdio_des is NULL" : ""), + (sdio_des ? (sdio_des->txconfig ? "txconfig is NULL" : "") : ""), + (sdio_des ? (sdio_des->rxconfig ? "rxconfig is NULL" : "") : "") + ); + return RT_NULL; + } + + sdio = rt_malloc(sizeof(struct rt_hw_sdio)); + if (sdio == RT_NULL) + { + LOG_E("L:%d F:%s malloc rt_hw_sdio fail"); + return RT_NULL; + } + rt_memset(sdio, 0, sizeof(struct rt_hw_sdio)); + + host = mmcsd_alloc_host(); + if (host == RT_NULL) + { + LOG_E("L:%d F:%s mmcsd alloc host fail"); + rt_free(sdio); + return RT_NULL; + } + + rt_memcpy(&sdio->sdio_des, sdio_des, sizeof(struct ht32_sdio_des)); + sdio->sdio_des.hw_sdio = (sdio_des->hw_sdio == RT_NULL ? (HT_SDIO_TypeDef *)SDIO_BASE_ADDRESS : sdio_des->hw_sdio); + sdio->sdio_des.clk_get = (sdio_des->clk_get == RT_NULL ? ht32_sdio_clk_get : sdio_des->clk_get); + /* Initialising events and mutexes */ + rt_event_init(&sdio->dat_event, "sdio", RT_IPC_FLAG_FIFO); + rt_event_init(&sdio->cmd_event, "sdio_cmd", RT_IPC_FLAG_FIFO); + rt_mutex_init(&sdio->mutex, "sdio", RT_IPC_FLAG_PRIO); + + /* set host defautl attributes */ + host->ops = &ops; + host->freq_min = 400 * 1000; + host->freq_max = SDIO_MAX_FREQ; + host->valid_ocr = 0X00FFFF80; +#ifndef SDIO_USING_1_BIT + host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ; +#else + host->flags = MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ; +#endif + host->max_seg_size = SDIO_BUFF_SIZE; + host->max_dma_segs = 1; + host->max_blk_size = 512; + host->max_blk_count = 512; + + /* link up host and sdio */ + sdio->host = host; + host->private_data = sdio; + + rt_hw_sdio_irq_update(host, 1); + + /* ready to change */ + mmcsd_change(host); + + return host; +} + +/** + * @brief this function configures the dmatx. + * @param src: pointer to the source buffer + * @param dst: pointer to the destination buffer + * @param buffer_size: size of tx buffer + * @retval none + */ +void sd_lowlevel_dmatx_config(uint32_t *src, uint32_t *dst, uint32_t buffer_size) +{ + PDMACH_InitTypeDef PDMACH_InitStruct; + /* Configure */ + PDMACH_InitStruct.PDMACH_SrcAddr = (u32)src; + PDMACH_InitStruct.PDMACH_DstAddr = (u32)dst; + PDMACH_InitStruct.PDMACH_AdrMod = SRC_ADR_LIN_INC | DST_ADR_FIX; + PDMACH_InitStruct.PDMACH_BlkCnt = buffer_size; + PDMACH_InitStruct.PDMACH_BlkLen = 1; + PDMACH_InitStruct.PDMACH_DataSize = WIDTH_32BIT; + PDMACH_InitStruct.PDMACH_Priority = H_PRIO; + PDMA_Config(PDMA_SDIO_TX, &PDMACH_InitStruct); + PDMA_IntConfig(PDMA_SDIO_TX, (PDMA_INT_GE | PDMA_INT_TC | PDMA_INT_TE), ENABLE); + NVIC_EnableIRQ(PDMACH7_IRQn); + PDMA_EnaCmd(PDMA_SDIO_TX, ENABLE); +} + +/** + * @brief this function configures the dmarx. + * @param src: pointer to the source buffer + * @param dst: pointer to the destination buffer + * @param buffer_size: size of rx buffer + * @retval none + */ +void sd_lowlevel_dmarx_config(uint32_t *src, uint32_t *dst, uint32_t buffer_size) +{ + PDMACH_InitTypeDef PDMACH_InitStruct; + /* Configure */ + PDMACH_InitStruct.PDMACH_SrcAddr = (u32)src; + PDMACH_InitStruct.PDMACH_DstAddr = (u32)dst; + PDMACH_InitStruct.PDMACH_AdrMod = SRC_ADR_FIX | DST_ADR_LIN_INC; + PDMACH_InitStruct.PDMACH_BlkCnt = buffer_size; + PDMACH_InitStruct.PDMACH_BlkLen = 1; + PDMACH_InitStruct.PDMACH_DataSize = WIDTH_32BIT; + PDMACH_InitStruct.PDMACH_Priority = H_PRIO; + PDMA_Config(PDMA_SDIO_RX, &PDMACH_InitStruct); + PDMA_IntConfig(PDMA_SDIO_RX, (PDMA_INT_GE | PDMA_INT_TC | PDMA_INT_TE), ENABLE); + NVIC_EnableIRQ(PDMACH6_IRQn); + PDMA_EnaCmd(PDMA_SDIO_RX, ENABLE); +} + + +/** + * @brief this function get at32 sdio clock. + * @param hw_sdio: at32_sdio + * @retval ahb frequency + */ +static rt_uint32_t ht32_sdio_clock_get(HT_SDIO_TypeDef *hw_sdio) +{ + return SystemCoreClock; +} +static rt_err_t dma_tx_config(rt_uint32_t *src, rt_uint32_t *dst, int size) +{ + sd_lowlevel_dmatx_config((uint32_t *)src, (uint32_t *)dst, size / 4); + return RT_EOK; +} +static rt_err_t dma_rx_config(rt_uint32_t *src, rt_uint32_t *dst, int size) +{ + sd_lowlevel_dmarx_config((uint32_t *)src, (uint32_t *)dst, size / 4); + return RT_EOK; +} + +int rt_hw_sdio_init(void) +{ + struct ht32_sdio_des sdio_des; + + ht32_sdio_gpio_init((void *)(HT_SDIO)); + sdio_des.clk_get = ht32_sdio_clock_get; + sdio_des.hw_sdio = (HT_SDIO_TypeDef *)HT_SDIO; + sdio_des.rxconfig = dma_rx_config; + sdio_des.txconfig = dma_tx_config; + host = sdio_host_create(&sdio_des); + if (host == RT_NULL) + { + LOG_E("host create fail"); + return -1; + } + return 0; +} + +INIT_DEVICE_EXPORT(rt_hw_sdio_init); + +/*********************************************************************************************************//** + * @brief This function handles PDMA_CH6 interrupt. + * @retval None + ************************************************************************************************************/ +void PDMA_CH6_IRQHandler(void) +{ + if (HT_PDMA->ISR1 & (PDMA_FLAG_TE << ((PDMA_CH6 - 6) * 5))) + { + LOG_E(" TE6"); + while (1); + } + + HT_PDMA->ISCR1 = PDMA_FLAG_TC << ((PDMA_CH6 - 6) * 5); + PDMA_EnaCmd(PDMA_SDIO_RX, DISABLE); +} + +/*********************************************************************************************************//** + * @brief This function handles PDMA_CH7 interrupt. + * @retval None + ************************************************************************************************************/ +void PDMA_CH7_IRQHandler(void) +{ + if (HT_PDMA->ISR1 & (PDMA_FLAG_TE << ((PDMA_CH7 - 6) * 5))) + { + LOG_E(" TE7"); + while (1); + } + + HT_PDMA->ISCR1 = PDMA_FLAG_TC << ((PDMA_CH7 - 6) * 5); + PDMA_EnaCmd(PDMA_SDIO_TX, DISABLE); +} + +/*********************************************************************************************************//** + * @brief This function handles SDIO interrupt. + * @retval None + ************************************************************************************************************/ +void SDIO_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + rt_hw_sdio_irq_process(host); + /* leave interrupt */ + rt_interrupt_leave(); +} + +void ht32_mmcsd_change(void) +{ + mmcsd_change(host); +} + +#endif /* BSP_USING_SDIO */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_sdio.h b/bsp/ht32/libraries/ht32_drivers/drv_sdio.h new file mode 100644 index 00000000000..a66c96ef235 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_sdio.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-11-06 QT-one first version + */ + +#ifndef __DRV_SDIO_H__ +#define __DRV_SDIO_H__ + +#include +#include + +#include +#include "drv_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SDIO_BASE_ADDRESS +#define SDIO_BASE_ADDRESS HT_SDIO +#endif + +#ifndef SDIO_CLOCK_FREQ +#define SDIO_CLOCK_FREQ (48U * 1000 * 1000) +#endif + +#ifndef SDIO_BUFF_SIZE +#define SDIO_BUFF_SIZE (4096) +#endif + +#ifndef SDIO_ALIGN_LEN +#define SDIO_ALIGN_LEN (32) +#endif + +#ifndef SDIO_MAX_FREQ +#define SDIO_MAX_FREQ (24 * 1000 * 1000) +#endif + +#define HW_SDIO_CMD_FLAG \ + (SDIO_INT_CMD_SEND | SDIO_FLAG_CMD_TIMEOUT | SDIO_FLAG_CMD_CRCERR | SDIO_FLAG_CMD_IDXERR) + +#define HW_SDIO_DATA_FLAG \ + (SDIO_FLAG_BUF_OVERFLOW | SDIO_FLAG_BUF_UNDERFLOW | SDIO_FLAG_DATA_CRCERR | SDIO_FLAG_DATA_TIMEOUT | SDIO_FLAG_TRANS_END) + +#define HW_SDIO_DATATIMEOUT (0x000FFFFF) + +void ht32_mmcsd_change(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_SDIO_H__ */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_usart.c b/bsp/ht32/libraries/ht32_drivers/drv_usart.c index bc19b0409e3..6616b5b8600 100644 --- a/bsp/ht32/libraries/ht32_drivers/drv_usart.c +++ b/bsp/ht32/libraries/ht32_drivers/drv_usart.c @@ -261,11 +261,11 @@ static rt_ssize_t ht32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t static const struct rt_uart_ops ht32_usart_ops = { - .configure = ht32_configure, - .control = ht32_control, - .putc = ht32_putc, - .getc = ht32_getc, - .dma_transmit = ht32_dma_transmit, + .configure = ht32_configure, + .control = ht32_control, + .putc = ht32_putc, + .getc = ht32_getc, + .dma_transmit = ht32_dma_transmit, }; int rt_hw_usart_init(void) diff --git a/bsp/ht32/libraries/ht32_drivers/drv_usbd.c b/bsp/ht32/libraries/ht32_drivers/drv_usbd.c new file mode 100644 index 00000000000..ecae47c3e6f --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_usbd.c @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-09 QT-one first version + */ + +#include "drv_usbd.h" + +#ifdef RT_USING_USB_DEVICE +#if !defined(BSP_USING_USBD) + #error "Please define at least one BSP_USING_USBD" +#endif + +#if defined(BSP_USING_USBD) + #include "usb_port.h" +#endif + +struct ht32_usbd +{ + char *name; + USBDCore_TypeDef *p_usbd_code; + IRQn_Type irq; +}; + +__ALIGN4 USBDCore_TypeDef p_usbd; +/* internal mount point */ +static struct ht32_usbd *p_usbd_instance = RT_NULL; + +/* Endpoint Function List */ +static struct ep_id endpoint_pool[] = +{ + {0x00, USB_EP_ATTR_CONTROL, USB_DIR_INOUT, 64, ID_ASSIGNED }, + {0x01, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, + {0x02, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, + {0x03, USB_EP_ATTR_INT, USB_DIR_IN, 64, ID_UNASSIGNED}, + {0x04, USB_EP_ATTR_INT, USB_DIR_OUT, 64, ID_UNASSIGNED}, + {0x05, USB_EP_ATTR_ISOC, USB_DIR_IN, 64, ID_UNASSIGNED}, + {0x06, USB_EP_ATTR_ISOC, USB_DIR_OUT, 64, ID_UNASSIGNED}, + {0x07, USB_EP_ATTR_TYPE_MASK, USB_DIR_MASK, 64, ID_UNASSIGNED}, +}; + +/* usbd Peripheral List */ +static struct ht32_usbd usbd_config[] = +{ +#ifdef BSP_USING_USBD + { + .name = BSP_USING_USBD_NAME, + .p_usbd_code = NULL, + .irq = USB_IRQn, + }, +#endif +}; + +/* Start of Frame (SOF) interrupt callbacks */ +void usbd_sof_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_sof_handler(udcd); +} +/* USB reset interrupt */ +void usbd_reset_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_reset_handler(udcd); +} + +/* USB Suspend (Disconnect) Interrupt */ +void usbd_suspend_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_disconnect_handler(udcd); +} + +/* USB recovery (reconnect) interrupt */ +void usbd_resume_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_connect_handler(udcd); +} + +/* USB endpoint 0 interrupt */ +void usbd_setup_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_setup_handler(udcd, (struct urequest *)&pCore->Device.Request); +} + +/* Endpoint 0 input interrupt£¨Can be classified as other endpoint input interrupt£© */ +void usbd_ep0_in_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_in_handler(udcd); +} + +/* Endpoint 0 output interrupt£¨Can be classified as other endpoint input interrupt£© */ +void usbd_ep0_out_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + pCore->Device.Transfer.sByteLength = pCore->Device.Request.wLength; + rt_usbd_ep0_out_handler(udcd, pCore->Device.Transfer.sByteLength); +} + +/* Other endpoint input interrupt */ +void usbd_ep_in_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + pCore->Device.Transfer.sByteLength = 0; + rt_usbd_ep_in_handler(udcd, EPTn | 0x80, pCore->Device.Transfer.sByteLength); +} + +/* Other Endpoint Output Interrupt */ +void usbd_ep_out_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep_out_handler(udcd, EPTn, pCore->ept_io->trans_len); +} + +/* Setting the address */ +static rt_err_t ht32_set_address(rt_uint8_t address) +{ + /* Setting the device address */ + p_usbd_instance->p_usbd_code->Info.CurrentStatus = USER_USB_STATE_ADDRESS; + API_USB_SET_ADDR(address); + return RT_EOK; +} +/* Configuration settings */ +static rt_err_t ht32_set_config(rt_uint8_t address) +{ + return RT_EOK; +} +/* endpoint pause */ +static rt_err_t ht32_ep_set_stall(rt_uint8_t address) +{ + if (0 == (address & 0x7f)) + API_USB_EPTn_SEND_STALL((USBD_EPTn_Enum)(address & 0x7f)); + else + API_USB_EPTn_SET_HALT((USBD_EPTn_Enum)(address & 0x7f)); + return RT_EOK; +} +/* Endpoint reboot*/ +static rt_err_t ht32_ep_clear_stall(rt_uint8_t address) +{ + if (0 != (address & 0x7f)) + { + API_USB_EPTn_CLR_HALT((USBD_EPTn_Enum)(address & 0x7f)); + API_USB_EPTn_CLR_DTG((USBD_EPTn_Enum)(address & 0x7f)); + } + return RT_EOK; +} +/* endpoint enable */ +static rt_err_t ht32_ep_enable(struct uendpoint *ep) +{ + /* Functions not found in the firmware library at the moment */ + RT_ASSERT(ep != RT_NULL); + RT_ASSERT(ep->ep_desc != RT_NULL); + usbd_ep_enable(p_usbd_instance->p_usbd_code, ep->ep_desc->bEndpointAddress); + return RT_EOK; +} +/* endpoint incapacity */ +static rt_err_t ht32_ep_disable(struct uendpoint *ep) +{ + /* Functions not found in the firmware library at the moment */ + RT_ASSERT(ep != RT_NULL); + RT_ASSERT(ep->ep_desc != RT_NULL); + usbd_ep_disable(p_usbd_instance->p_usbd_code, ep->ep_desc->bEndpointAddress); + return RT_EOK; +} +/* Endpoint Receive Data Preparation */ +static rt_ssize_t ht32_ep_read_prepare(rt_uint8_t address, void *buffer, rt_size_t size) +{ + USBDCore_EPTReadOUTData((USBD_EPTn_Enum)(address & 0x7f), (uint32_t *)buffer, size); + return size; +} +/* Endpoint reading data */ +static rt_ssize_t ht32_ep_read(rt_uint8_t address, void *buffer) +{ + /* Do not read data from this function */ + rt_size_t size = 0; + RT_ASSERT(buffer != RT_NULL); + return size; +} +/* Endpoint Write Data */ +static rt_ssize_t ht32_ep_write(rt_uint8_t address, void *buffer, rt_size_t size) +{ + /* Use this function to write data to a USB endpoint */ + return USBDCore_EPTWriteINData((USBD_EPTn_Enum)(address & 0x7f), (uint32_t *)buffer, size); +} +/* Endpoint 0 transmit status */ +static rt_err_t ht32_ep0_send_status(void) +{ + uint8_t Date = 0; + /* State of send endpoint 0 */ + API_USB_EPTn_WRITE_IN(USBD_EPT0, (u32*)&Date, 0); + return RT_EOK; +} +/* USB pause */ +static rt_err_t ht32_suspend(void) +{ + return RT_EOK; +} +/* USB awakens */ +static rt_err_t ht32_wakeup(void) +{ + return RT_EOK; +} + +/* USB device interface function */ +const static struct udcd_ops _udc_ops = +{ + .set_address = ht32_set_address, + .set_config = ht32_set_config, + .ep_set_stall = ht32_ep_set_stall, + .ep_clear_stall = ht32_ep_clear_stall, + .ep_enable = ht32_ep_enable, + .ep_disable = ht32_ep_disable, + .ep_read_prepare = ht32_ep_read_prepare, + .ep_read = ht32_ep_read, + .ep_write = ht32_ep_write, + .ep0_send_status = ht32_ep0_send_status, + .suspend = ht32_suspend, + .wakeup = ht32_wakeup, +}; + +static void usbd_mainroutine(void) +{ + USBDCore_MainRoutine(p_usbd_instance->p_usbd_code); +} +/* USB Device Initialisation Functions */ +static rt_err_t ht32_dcd_init(rt_device_t device) +{ + /* USB object and interface initialisation, and turning on USB interrupts */ + USB_Configuration(p_usbd_instance->p_usbd_code); + rt_thread_idle_sethook(usbd_mainroutine); + return RT_EOK; +} + +/* USB device registration function */ +int ht32_usbd_register(void) +{ + rt_size_t obj_num; + rt_err_t result = 0; + int index; + USBDCore_TypeDef *p_usbd_core = &p_usbd; + /* Calculate how many USB devices */ + obj_num = sizeof(usbd_config) / sizeof(struct ht32_usbd); + + for (index = 0; index < obj_num; index++) + { + /* Request a udcd object memory and clear it. */ + udcd_t udcd = (udcd_t)rt_malloc(sizeof(struct udcd)); + if (udcd == RT_NULL) + { + rt_kprintf("udcd malloc failed\r\n"); + return -RT_ERROR; + } + rt_memset((void *)udcd, 0, sizeof(struct udcd)); + + /* Assigning a value to the requested udcd object */ + udcd->parent.type = RT_Device_Class_USBDevice; + udcd->parent.init = ht32_dcd_init; + udcd->parent.user_data = p_usbd_core; + udcd->ops = &_udc_ops; + + p_usbd_core->pdata = udcd; + usbd_config[index].p_usbd_code = p_usbd_core; + + /* register endpoint infomation */ + udcd->ep_pool = endpoint_pool; + udcd->ep0.id = &endpoint_pool[0]; + + result = rt_device_register((rt_device_t)udcd, usbd_config[index].name, 0); + RT_ASSERT(result == RT_EOK); + + p_usbd_instance = &usbd_config[index]; + + result = rt_usb_device_init(); + RT_ASSERT(result == RT_EOK); + } + + return result; +} +INIT_DEVICE_EXPORT(ht32_usbd_register); + + +void USB_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + /* interrupt callback function */ + usbd_irq_handler(p_usbd_instance->p_usbd_code); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +#endif /* RT_USING_USB_DEVICE */ diff --git a/bsp/ht32/libraries/ht32_drivers/drv_usbd.h b/bsp/ht32/libraries/ht32_drivers/drv_usbd.h new file mode 100644 index 00000000000..9c2f652ba63 --- /dev/null +++ b/bsp/ht32/libraries/ht32_drivers/drv_usbd.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-09 QT-one first version + */ + +#ifndef __DRV_USBD_H__ +#define __DRV_USBD_H__ + +#include +#include +#include "drv_common.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_USBD_H__ */ diff --git a/bsp/ht32/libraries/usbd_library/SConscript b/bsp/ht32/libraries/usbd_library/SConscript new file mode 100644 index 00000000000..7c3921200b4 --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/SConscript @@ -0,0 +1,22 @@ +import rtconfig +from building import * + +# get current directory +cwd = GetCurrentDir() + +# add the general drivers. +src = Split(""" +""") + +# The set of source files associated with this SConscript file. +if GetDepend(['BSP_USING_USBD']): +# src += ['src/ht32_usbd_core.c'] +# src += ['src/ht32_usbd_int.c'] + src += ['src/usbd_code.c'] + src += ['src/usb_port.c'] + +path = [cwd + '/inc'] + +group = DefineGroup('usbd_library', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/ht32/libraries/usbd_library/checkout.py b/bsp/ht32/libraries/usbd_library/checkout.py new file mode 100644 index 00000000000..19fc0ca9fc4 --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/checkout.py @@ -0,0 +1,39 @@ +# 假设我们有一个名为'example.txt'的文件,我们想要修改它 +header_file_path = 'inc/ht32_usbd_core.h' +source_file_path = 'src/ht32_usbd_core.c' + +def modification(file_path): + # 打开文件 + with open(file_path, 'r+') as file: # 'r+'模式允许读写 + # 读取文件内容 + content = file.read() + print("文件打开成功!") + + # 假设我们要将所有的'old_string'替换为'new_string' + # updated_content = content.replace('old_string', 'new_string') + content = content.replace('USB_STATE_UNCONNECTED', 'USER_USB_STATE_UNCONNECTED') + content = content.replace('USB_STATE_ATTACHED', 'USER_USB_STATE_ATTACHED') + content = content.replace('USB_STATE_POWERED', 'USER_USB_STATE_POWERED') + content = content.replace('USB_STATE_SUSPENDED', 'USER_USB_STATE_SUSPENDED') + content = content.replace('USB_STATE_DEFAULT', 'USER_USB_STATE_DEFAULT') + content = content.replace('USB_STATE_ADDRESS', 'USER_USB_STATE_ADDRESS') + content = content.replace('USB_STATE_CONFIGURED', 'USER_USB_STATE_CONFIGURED') + + # 移动文件指针到文件开头,准备写入 + file.seek(0) + + # 写入更新后的内容 + file.write(content) + + # 截断文件,删除旧内容(如果更新后的内容比原内容短) + file.truncate() + + +# 文件现在已经被关闭,并且更改被保存 +if __name__ == '__main__': + modification(header_file_path) + print('头文件已修改!\r\n') + modification(source_file_path) + print('源文件已修改!\r\n') + print('请输入退出:') + diff --git a/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_core.h b/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_core.h new file mode 100644 index 00000000000..1ba2309d4f6 --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_core.h @@ -0,0 +1,437 @@ +/*********************************************************************************************************//** + * @file ht32_usbd_core.h + * @version $Rev:: 2555 $ + * @date $Date:: 2022-03-15 #$ + * @brief The header file of standard protocol related function for HT32 USB Device Library. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ +// <<< Use Configuration Wizard in Context Menu >>> + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __HT32_USBD_CORE_H +#define __HT32_USBD_CORE_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------------------------------------*/ + +/** @addtogroup HT32_USBD_Library + * @{ + */ + +/** @addtogroup USBDCore + * @{ + */ + + +/* Settings ------------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Settings USB Device Core settings + * @{ + */ +/* USBD Debug mode */ +// Enable USB Debug mode +// Dump USB Debug data +#ifndef USBDCORE_DEBUG + #define USBDCORE_DEBUG (0) /*!< Enable USB Debug mode */ + #define USBDCORE_DEBUG_DATA (0) /*!< Dump USB Debug data */ +#endif +/** + * @} + */ + +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Type USB Device Core exported types + * @{ + */ +/** + * @brief USB Device Request. + */ +typedef __PACKED_H struct +{ + uc8 bmRequestType; + uc8 bRequest; + uc8 wValueL; + uc8 wValueH; + uc16 wIndex; + uc16 wLength; +} __PACKED_F USBDCore_Request_TypeDef; + +/** + * @brief USB Descriptor. + */ +typedef struct +{ + uc8 *pDeviceDesc; /*!< Device Descriptor */ + uc8 *pConfnDesc; /*!< Configuration Descriptor */ + uc8 **ppStringDesc; /*!< String Descriptor */ + u32 uStringDescNumber; /*!< Count of String Descriptor */ +} USBDCore_Desc_TypeDef; + +/** + * @brief STALL, control IN or control OUT. + */ +typedef enum +{ + USB_ACTION_STALL = 0, + USB_ACTION_DATAIN = 1, + USB_ACTION_DATAOUT = 2, +} USBDCore_Action_Enum; + +/** + * @brief Call back function. + */ +typedef struct +{ + void (*func) (u32 uPara); /*!< Call back function pointer */ + u32 uPara; /*!< Parameter of call back function */ +} USBDCore_CallBack_TypeDef; + +/** + * @brief Parameter for control IN/OUT Transfer. + */ +typedef struct +{ + u8 uBuffer[2]; /*!< Temporary buffer */ + uc8 *pData; /*!< Pointer of control IN/OUT Data */ + s32 sByteLength; /*!< Total length for control IN/OUT Transfer */ + USBDCore_Action_Enum Action; /*!< STALL, control IN or control OUT */ + USBDCore_CallBack_TypeDef CallBack_OUT; /*!< Call back function pointer for Control OUT */ +} USBDCore_Transfer_TypeDef; + +/** + * @brief USB Device. + */ +typedef struct +{ + USBDCore_Request_TypeDef Request; /*!< USB Device Request */ + USBDCore_Desc_TypeDef Desc; /*!< USB Descriptor */ + USBDCore_Transfer_TypeDef Transfer; /*!< Parameter for control IN/OUT Transfer */ +} USBDCore_Device_TypeDef; + +/** + * @brief Bit access for CurrentFeature. + */ +typedef __PACKED_H struct _FEATURE_TYPEBIT +{ + unsigned bSelfPowered :1; /*!< Remote Wakeup feature */ + unsigned bRemoteWakeup :1; /*!< Self Powered */ +} __PACKED_F USBDCore_Feature_TypeBit; + +/** + * @brief For Set/ClearFeature and GetStatus request. + */ +typedef __PACKED_H union _FEATURE_TYPEDEF +{ + u8 uByte; /*!< Byte access for CurrentFeature */ + USBDCore_Feature_TypeBit Bits; /*!< Bit access for CurrentFeature */ +} __PACKED_F USBDCore_Feature_TypeDef; + +/** + * @brief Device State. + */ +typedef enum +{ + USER_USER_USB_STATE_UNCONNECTED = 0, + USER_USER_USB_STATE_ATTACHED = 1, + USER_USER_USB_STATE_POWERED = 2, + USER_USER_USB_STATE_SUSPENDED = 3, + USER_USER_USB_STATE_DEFAULT = 4, + USER_USER_USB_STATE_ADDRESS = 5, + USER_USER_USB_STATE_CONFIGURED = 6, +} USBDCore_Status_Enum; + +/** + * @brief USB Device information. + */ +typedef struct +{ + u8 uCurrentConfiguration; /*!< For Set/GetConfiguration request */ + u8 uCurrentInterface; /*!< For Set/GetInterface request */ + volatile USBDCore_Status_Enum CurrentStatus; /*!< Device State */ + USBDCore_Status_Enum LastStatus; /*!< Device State before SUSPEND */ + USBDCore_Feature_TypeDef CurrentFeature; /*!< For Set/ClearFeature and GetStatus request */ + u32 uIsDiscardClearFeature; /*!< Discard ClearFeature flag for Mass Storage */ +} USBDCore_Info_TypeDef; + +typedef void (*USBDCore_CallBackClass_Typedef) (USBDCore_Device_TypeDef *pDev); +typedef void (*USBDCore_CallBackVendor_Typedef) (USBDCore_Device_TypeDef *pDev); +typedef void (*USBDCore_CallBackEPTn_Typedef) (USBD_EPTn_Enum EPTn); + +/** + * @brief USB Class call back function. + */ +typedef struct +{ + USBDCore_CallBack_TypeDef CallBack_MainRoutine; /*!< Class main routine call back function */ + USBDCore_CallBack_TypeDef CallBack_Reset; /*!< Class RESET call back function */ + USBDCore_CallBack_TypeDef CallBack_StartOfFrame; /*!< Class SOF call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassGetDescriptor; /*!< Class Get Descriptor call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassSetInterface; /*!< Set Interface call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassGetInterface; /*!< Get Interface call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassRequest; /*!< Class Request call back function */ + USBDCore_CallBackVendor_Typedef CallBack_VendorRequest; /*!< Vendor Request call back function */ + USBDCore_CallBackEPTn_Typedef CallBack_EPTn[MAX_EP_NUM]; /*!< Endpoint n call back function */ +} USBDCore_Class_TypeDef; + +/** + * @brief USB Device Power related call back function. + */ +typedef struct +{ + USBDCore_CallBack_TypeDef CallBack_Suspend; +} USBDCore_Power_TypeDef; + +/** + * @brief Major structure of USB Library. + */ +typedef struct +{ + USBDCore_Device_TypeDef Device; /*!< USB Device */ + USBDCore_Info_TypeDef Info; /*!< USB Device information */ + USBDCore_Class_TypeDef Class; /*!< USB Class call back function */ + u32 *pDriver; /*!< USB Device Driver initialization structure */ + USBDCore_Power_TypeDef Power; /*!< USB Device Power related call back function */ + + void *pdata; /*!< USB User private pointer */ +} USBDCore_TypeDef; + +/*----------------------------------------------------------------------------------------------------------*/ +/* Variable architecture of USB Library */ +/*----------------------------------------------------------------------------------------------------------*/ +/* USBCore - USBDCore_TypeDef Major structure of USB Library */ +/* USBCore.Device - USBDCore_Device_TypeDef USB Device */ +/* USBCore.Device.Request - USBDCore_Request_TypeDef USB Device Request */ +/* USBCore.Device.Request.bmRequestType */ +/* USBCore.Device.Request.bRequest */ +/* USBCore.Device.Request.wValueL */ +/* USBCore.Device.Request.wValueH */ +/* USBCore.Device.Request.wIndex */ +/* USBCore.Device.Request.wLength */ +/* USBCore.Device.Desc - USBDCore_Desc_TypeDef USB Descriptor */ +/* USBCore.Device.Desc.pDeviceDesc Device Descriptor */ +/* USBCore.Device.Desc.pConfnDesc Configuration Descriptor */ +/* USBCore.Device.Desc.pStringDesc[DESC_NUM_STRING] String Descriptor */ +/* USBCore.Device.Desc.uStringDescNumber Count of String Descriptor */ +/* USBCore.Device.Transfer - USBDCore_Transfer_TypeDef Parameter for control IN/OUT Transfer */ +/* USBCore.Device.Transfer.uBuffer[2] Temporary buffer */ +/* USBCore.Device.Transfer.pData Pointer of control IN/OUT Data */ +/* USBCore.Device.Transfer.sByteLength Total length for control IN/OUT Transfer */ +/* USBCore.Device.Transfer.Action - USBDCore_Action_Enum STALL, control IN or control OUT */ +/* USBCore.Device.Transfer.CallBack_OUT.func(uPara) Call back function pointer for Control OUT */ +/* USBCore.Device.Transfer.CallBack_OUT.uPara Parameter of Control OUT call back function */ +/* */ +/* USBCore.Info - USBDCore_Info_TypeDef USB Device information */ +/* USBCore.Info.uCurrentConfiguration For Set/GetConfiguration request */ +/* USBCore.Info.uCurrentInterface For Set/GetInterface request */ +/* USBCore.Info.CurrentStatus - USBDCore_Status_Enum Device State */ +/* USBCore.Info.LastStatus - USBDCore_Status_Enum Device State before SUSPEND */ +/* USBCore.Info.CurrentFeature - USBDCore_Feature_TypeDef For Set/ClearFeature and GetStatus request */ +/* USBCore.Info.CurrentFeature.uByte Byte access for CurrentFeature */ +/* USBCore.Info.CurrentFeature.Bits.bRemoteWakeup Remote Wakeup feature */ +/* USBCore.Info.CurrentFeature.Bits.bSelfPowered Self Powered */ +/* USBCore.Info.uIsDiscardClearFeature Discard ClearFeature flag for Mass Storage */ +/* */ +/* USBCore.Class - USBDCore_Class_TypeDef USB Class call back function */ +/* USBCore.Class.CallBack_MainRoutine.func(uPara) Class main routine call back function */ +/* USBCore.Class.CallBack_MainRoutine.uPara Parameter of class main routine */ +/* USBCore.Class.CallBack_Reset.func(uPara) Class RESET call back function */ +/* USBCore.Class.CallBack_Reset.uPara Parameter of RESET call back function */ +/* USBCore.Class.CallBack_StartOfFrame.func(uPara) Class SOF call back function */ +/* USBCore.Class.CallBack_StartOfFrame.uPara Parameter of SOF call back function */ +/* USBCore.Class.CallBack_ClassGetDescriptor(pDev) Class Get Descriptor call back function */ +/* USBCore.Class.CallBack_ClassSetInterface(pDev) Set Interface call back function */ +/* USBCore.Class.CallBack_ClassGetInterface(pDev) Get Interface call back function */ +/* USBCore.Class.CallBack_ClassRequest(pDev) Class Request call back function */ +/* USBCore.Class.CallBack_EPTn[MAX_EP_NUM](EPTn) Endpoint n call back function */ +/* */ +/* USBCore.pDriver USB Device Driver initialization structure */ +/* */ +/* USBCore.Power - USBDCore_Power_TypeDef USB Device Power related call back function */ +/* USBCore.Power.CallBack_Suspend.func(uPara) System low power function for SUSPEND */ +/* USBCore.Power.CallBack_Suspend.uPara Parameter of system low power function */ +/*----------------------------------------------------------------------------------------------------------*/ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Constant USB Device Core exported constants + * @{ + */ + +/** @defgroup USBDCore_Descriptor Definitions for USB descriptor + * @{ + */ +#define DESC_TYPE_01_DEV (0x1) +#define DESC_TYPE_02_CONFN (0x2) +#define DESC_TYPE_03_STR (0x3) +#define DESC_TYPE_04_INF (0x4) +#define DESC_TYPE_05_EPT (0x5) +#define DESC_TYPE_06_DEV_QLF (0x6) +#define DESC_TYPE_08_INF_PWR (0x8) + +#define DESC_CLASS_00_BY_INF (0x00) +#define DESC_CLASS_01_AUDIO (0x01) +#define DESC_CLASS_02_CDC_CTRL (0x02) +#define DESC_CLASS_03_HID (0x03) +#define DESC_CLASS_05_PHY (0x05) +#define DESC_CLASS_06_STILL_IMG (0x06) +#define DESC_CLASS_07_PRINTER (0x07) +#define DESC_CLASS_08_MASS_STORAGE (0x08) +#define DESC_CLASS_09_HUB (0x09) +#define DESC_CLASS_0A_CDC_DATA (0x0A) +#define DESC_CLASS_0B_SMART_CARD (0x0B) +#define DESC_CLASS_0E_VIDEO (0x0E) +#define DESC_CLASS_0F_PHD (0x0F) +#define DESC_CLASS_FF_VENDOR (0xFF) + +#define DESC_LEN_DEV ((u32)(18)) +#define DESC_LEN_CONFN ((u32)(9)) +#define DESC_LEN_INF ((u32)(9)) +#define DESC_LEN_EPT ((u32)(7)) +/** + * @} + */ + +/** @defgroup USBDCore_Request Definitions for USB Request + * @{ + */ +#define REQ_DIR_00_H2D (0 << 7) +#define REQ_DIR_01_D2H (1 << 7) + +#define REQ_TYPE_00_STD (0 << 5) +#define REQ_TYPE_01_CLS (1 << 5) +#define REQ_TYPE_02_VND (2 << 5) + +#define REQ_REC_00_DEV (0) +#define REQ_REC_01_INF (1) +#define REQ_REC_02_EPT (2) +/** + * @} + */ + +/** + * @brief For USBDCore_EPTReadOUTData function. + */ +#define USB_DISCARD_OUT_DATA (0) + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Macro USB Device Core exported macros + * @{ + */ +#define __DBG_USBPrintf(...) +#define __DBG_USBDump(a, b) + +#if (USBDCORE_DEBUG == 1) + #ifndef RETARGET_IS_USB + extern u32 __DBG_USBCount; + #undef __DBG_USBPrintf + #define __DBG_USBPrintf printf + #if (USBDCORE_DEBUG_DATA == 1) + #undef __DBG_USBDump + void __DBG_USBDump(uc8 *memory, u32 len); + #endif + #endif +#endif + +/** + * @brief Convert Half-Word to Byte for descriptor. + */ +#define DESC_H2B(Val) ((u8)(Val & 0x00FF)), ((u8)((Val & 0xFF00) >> 8)) + +/** + * @brief Padding 0 automatically for String descriptor. + */ +#define DESC_CHAR(c) (c), (0) + +/** + * @brief Calculate String length for String descriptor. + */ +#define DESC_STRLEN(n) (n * 2 + 2) + +/** + * @brief Calculate power for Configuration descriptor. + */ +#define DESC_POWER(mA) (mA / 2) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Functions USB Device Core exported functions + * @{ + */ +#define USBDCore_DeInit API_USB_DEINIT +#define USBDCore_EPTReset API_USB_EPTn_RESET +#define USBDCore_EPTGetBufferLen API_USB_EPTn_GET_BUFFLEN +#define USBDCore_EPTGetTransferCount API_USB_EPTn_GET_CNT +#define USBDCore_EPTSetSTALL API_USB_EPTn_SET_HALT +#define USBDCore_EPTWaitSTALLSent API_USB_EPTn_WAIT_STALL_SENT +#define USBDCore_EPTClearDataToggle API_USB_EPTn_CLR_DTG + +#define USBDCore_EPTWriteINData API_USB_EPTn_WRITE_IN +#define USBDCore_EPTReadOUTData API_USB_EPTn_READ_OUT +#define USBDCore_EPTReadMemory API_USB_EPTn_READ_MEM + +void USBDCore_Init(USBDCore_TypeDef *pCore); +void USBDCore_IRQHandler(USBDCore_TypeDef *pCore); +void USBDCore_MainRoutine(USBDCore_TypeDef *pCore); +u32 USBDCore_IsSuspend(USBDCore_TypeDef *pCore); +u32 USBDCore_GetRemoteWakeUpFeature(USBDCore_TypeDef *pCore); +void USBDCore_TriggerRemoteWakeup(void); +USBDCore_Status_Enum USBDCore_GetStatus(void); + +void USBDCore_EPTReset(USBD_EPTn_Enum USBD_EPTn); +u32 USBDCore_EPTGetBufferLen(USBD_EPTn_Enum USBD_EPTn); +u32 USBDCore_EPTGetTransferCount(USBD_EPTn_Enum USBD_EPTn, USBD_TCR_Enum type); +void USBDCore_EPTSetSTALL(USBD_EPTn_Enum USBD_EPTn); +void USBDCore_EPTWaitSTALLSent(USBD_EPTn_Enum USBD_EPTn); +void USBDCore_EPTClearDataToggle(USBD_EPTn_Enum USBD_EPTn); + +u32 USBDCore_EPTWriteINData(USBD_EPTn_Enum USBD_EPTn, u32 *pFrom, u32 len); +u32 USBDCore_EPTReadOUTData(USBD_EPTn_Enum USBD_EPTn, u32 *pTo, u32 len); +u32 USBDCore_EPTReadMemory(USBD_EPTn_Enum USBD_EPTn, u32 *pTo, u32 len); +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __HT32_USBD_CORE_H -------------------------------------------------------------------------------*/ diff --git a/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_int.h b/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_int.h new file mode 100644 index 00000000000..87e4bd2ebdc --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/inc/ht32_usbd_int.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-11 QT-one first version + */ + +#ifndef __HT32_USBD_INT_H__ +#define __HT32_USBD_INT_H__ + +#include +#include +#include "drv_common.h" + +#include "ht32_usbd_core.h" + +#ifdef __cplusplus +extern "C" { +#endif + + + + + /* º¯ÊýÉùÃ÷ */ + void usbd_sof_callback(USBDCore_TypeDef *pCore); + void usbd_reset_callback(USBDCore_TypeDef *pCore); + void usbd_suspend_callback(USBDCore_TypeDef *pCore); + void usbd_resume_callback(USBDCore_TypeDef *pCore); + + void usbd_setup_callback(USBDCore_TypeDef *pCore); + void usbd_ep0_in_callback(USBDCore_TypeDef *pCore); + void usbd_ep0_out_callback(USBDCore_TypeDef *pCore); + + void usbd_ep_in_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn); + void usbd_ep_out_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn); + +// void USB_Configuration(USBDCore_TypeDef *pCore); + + + +#ifdef __cplusplus +} +#endif + +#endif /* __HT32_USBD_INT_H__ */ diff --git a/bsp/ht32/libraries/usbd_library/inc/usb_port.h b/bsp/ht32/libraries/usbd_library/inc/usb_port.h new file mode 100644 index 00000000000..de96b24b04a --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/inc/usb_port.h @@ -0,0 +1,29 @@ + +#ifndef _USB_PORT_H +#define _USB_PORT_H + +#include "ht32.h" +//#include "ht32_usbd_core.h" +#include "usbd_code.h" + + +#define HT32F_DVB_USBConnect() USBD_DPpullupCmd(ENABLE) +#define HT32F_DVB_USBDisConnect() USBD_DPpullupCmd(DISABLE) + + +/* º¯ÊýÉùÃ÷ */ +void usbd_sof_callback(USBDCore_TypeDef *pCore); +void usbd_reset_callback(USBDCore_TypeDef *pCore); +void usbd_suspend_callback(USBDCore_TypeDef *pCore); +void usbd_resume_callback(USBDCore_TypeDef *pCore); + +void usbd_setup_callback(USBDCore_TypeDef *pCore); +void usbd_ep0_in_callback(USBDCore_TypeDef *pCore); +void usbd_ep0_out_callback(USBDCore_TypeDef *pCore); + +void usbd_ep_in_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn); +void usbd_ep_out_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn); + +void USB_Configuration(USBDCore_TypeDef *pCore); + +#endif /* _USB_PORT_H */ diff --git a/bsp/ht32/libraries/usbd_library/inc/usbd_code.h b/bsp/ht32/libraries/usbd_library/inc/usbd_code.h new file mode 100644 index 00000000000..fe27279b89b --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/inc/usbd_code.h @@ -0,0 +1,434 @@ + + + +/* Define to prevent recursive inclusion -------------------------------------------------------------------*/ +#ifndef __USBD_CODE_H +#define __USBD_CODE_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------------------------------------*/ +#include "ht32.h" +/** @addtogroup HT32_USBD_Library + * @{ + */ + +/** @addtogroup USBDCore + * @{ + */ + + +/* Settings ------------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Settings USB Device Core settings + * @{ + */ +/* USBD Debug mode */ +// Enable USB Debug mode +// Dump USB Debug data +#ifndef USBDCORE_DEBUG + #define USBDCORE_DEBUG (0) /*!< Enable USB Debug mode */ + #define USBDCORE_DEBUG_DATA (0) /*!< Dump USB Debug data */ +#endif +/** + * @} + */ + +/* Exported types ------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Type USB Device Core exported types + * @{ + */ +/** + * @brief USB Device Request. + */ +typedef __PACKED_H struct +{ + uc8 bmRequestType; + uc8 bRequest; + uc8 wValueL; + uc8 wValueH; + uc16 wIndex; + uc16 wLength; +} __PACKED_F USBDCore_Request_TypeDef; + +/** + * @brief USB Descriptor. + */ +typedef struct +{ + uc8 *pDeviceDesc; /*!< Device Descriptor */ + uc8 *pConfnDesc; /*!< Configuration Descriptor */ + uc8 **ppStringDesc; /*!< String Descriptor */ + u32 uStringDescNumber; /*!< Count of String Descriptor */ +} USBDCore_Desc_TypeDef; + +/** + * @brief STALL, control IN or control OUT. + */ +typedef enum +{ + USB_ACTION_STALL = 0, + USB_ACTION_DATAIN = 1, + USB_ACTION_DATAOUT = 2, +} USBDCore_Action_Enum; + +/** + * @brief Call back function. + */ +typedef struct +{ + void (*func) (u32 uPara); /*!< Call back function pointer */ + u32 uPara; /*!< Parameter of call back function */ +} USBDCore_CallBack_TypeDef; + +/** + * @brief Parameter for control IN/OUT Transfer. + */ +typedef struct +{ + u8 uBuffer[2]; /*!< Temporary buffer */ + uc8 *pData; /*!< Pointer of control IN/OUT Data */ + s32 sByteLength; /*!< Total length for control IN/OUT Transfer */ + USBDCore_Action_Enum Action; /*!< STALL, control IN or control OUT */ + USBDCore_CallBack_TypeDef CallBack_OUT; /*!< Call back function pointer for Control OUT */ +} USBDCore_Transfer_TypeDef; + +/** + * @brief USB Device. + */ +typedef struct +{ + USBDCore_Request_TypeDef Request; /*!< USB Device Request */ + USBDCore_Desc_TypeDef Desc; /*!< USB Descriptor */ + USBDCore_Transfer_TypeDef Transfer; /*!< Parameter for control IN/OUT Transfer */ +} USBDCore_Device_TypeDef; + +/** + * @brief Bit access for CurrentFeature. + */ +typedef __PACKED_H struct _FEATURE_TYPEBIT +{ + unsigned bSelfPowered :1; /*!< Remote Wakeup feature */ + unsigned bRemoteWakeup :1; /*!< Self Powered */ +} __PACKED_F USBDCore_Feature_TypeBit; + +/** + * @brief For Set/ClearFeature and GetStatus request. + */ +typedef __PACKED_H union _FEATURE_TYPEDEF +{ + u8 uByte; /*!< Byte access for CurrentFeature */ + USBDCore_Feature_TypeBit Bits; /*!< Bit access for CurrentFeature */ +} __PACKED_F USBDCore_Feature_TypeDef; + +/** + * @brief Device State. + */ +typedef enum +{ + USER_USB_STATE_UNCONNECTED = 0, + USER_USB_STATE_ATTACHED = 1, + USER_USB_STATE_POWERED = 2, + USER_USB_STATE_SUSPENDED = 3, + USER_USB_STATE_DEFAULT = 4, + USER_USB_STATE_ADDRESS = 5, + USER_USB_STATE_CONFIGURED = 6, +} USBDCore_Status_Enum; + +/** + * @brief USB Device information. + */ +typedef struct +{ + u8 uCurrentConfiguration; /*!< For Set/GetConfiguration request */ + u8 uCurrentInterface; /*!< For Set/GetInterface request */ + volatile USBDCore_Status_Enum CurrentStatus; /*!< Device State */ + USBDCore_Status_Enum LastStatus; /*!< Device State before SUSPEND */ + USBDCore_Feature_TypeDef CurrentFeature; /*!< For Set/ClearFeature and GetStatus request */ + u32 uIsDiscardClearFeature; /*!< Discard ClearFeature flag for Mass Storage */ +} USBDCore_Info_TypeDef; + +typedef void (*USBDCore_CallBackClass_Typedef) (USBDCore_Device_TypeDef *pDev); +typedef void (*USBDCore_CallBackVendor_Typedef) (USBDCore_Device_TypeDef *pDev); +typedef void (*USBDCore_CallBackEPTn_Typedef) (USBD_EPTn_Enum EPTn); + +/** + * @brief USB Class call back function. + */ +typedef struct +{ + USBDCore_CallBack_TypeDef CallBack_MainRoutine; /*!< Class main routine call back function */ + USBDCore_CallBack_TypeDef CallBack_Reset; /*!< Class RESET call back function */ + USBDCore_CallBack_TypeDef CallBack_StartOfFrame; /*!< Class SOF call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassGetDescriptor; /*!< Class Get Descriptor call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassSetInterface; /*!< Set Interface call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassGetInterface; /*!< Get Interface call back function */ + USBDCore_CallBackClass_Typedef CallBack_ClassRequest; /*!< Class Request call back function */ + USBDCore_CallBackVendor_Typedef CallBack_VendorRequest; /*!< Vendor Request call back function */ + USBDCore_CallBackEPTn_Typedef CallBack_EPTn[MAX_EP_NUM]; /*!< Endpoint n call back function */ +} USBDCore_Class_TypeDef; + +/** + * @brief USB Device Power related call back function. + */ +typedef struct +{ + USBDCore_CallBack_TypeDef CallBack_Suspend; +} USBDCore_Power_TypeDef; + +/** + * @brief USB EP TypeDef. + */ +typedef struct +{ + uint16_t maxpacket; /*!< endpoint max packet*/ + uint16_t status; /*!< endpoint status */ + /* transmission buffer and count */ + uint16_t total_len; /*!< endpoint transmission total length */ + uint16_t trans_len; /*!< endpoint transmission length*/ + uint8_t *trans_buf; /*!< endpoint transmission buffer */ +} usb_ept_info; + + + +/** + * @brief Major structure of USB Library. + */ +typedef struct +{ + USBDCore_Device_TypeDef Device; /*!< USB Device */ + USBDCore_Info_TypeDef Info; /*!< USB Device information */ + USBDCore_Class_TypeDef Class; /*!< USB Class call back function */ + u32 *pDriver; /*!< USB Device Driver initialization structure */ + USBDCore_Power_TypeDef Power; /*!< USB Device Power related call back function */ + + usb_ept_info ept_io[8]; /*!< */ + void *pdata; /*!< USB User private pointer */ +} USBDCore_TypeDef; + +/*----------------------------------------------------------------------------------------------------------*/ +/* Variable architecture of USB Library */ +/*----------------------------------------------------------------------------------------------------------*/ +/* USBCore - USBDCore_TypeDef Major structure of USB Library */ +/* USBCore.Device - USBDCore_Device_TypeDef USB Device */ +/* USBCore.Device.Request - USBDCore_Request_TypeDef USB Device Request */ +/* USBCore.Device.Request.bmRequestType */ +/* USBCore.Device.Request.bRequest */ +/* USBCore.Device.Request.wValueL */ +/* USBCore.Device.Request.wValueH */ +/* USBCore.Device.Request.wIndex */ +/* USBCore.Device.Request.wLength */ +/* USBCore.Device.Desc - USBDCore_Desc_TypeDef USB Descriptor */ +/* USBCore.Device.Desc.pDeviceDesc Device Descriptor */ +/* USBCore.Device.Desc.pConfnDesc Configuration Descriptor */ +/* USBCore.Device.Desc.pStringDesc[DESC_NUM_STRING] String Descriptor */ +/* USBCore.Device.Desc.uStringDescNumber Count of String Descriptor */ +/* USBCore.Device.Transfer - USBDCore_Transfer_TypeDef Parameter for control IN/OUT Transfer */ +/* USBCore.Device.Transfer.uBuffer[2] Temporary buffer */ +/* USBCore.Device.Transfer.pData Pointer of control IN/OUT Data */ +/* USBCore.Device.Transfer.sByteLength Total length for control IN/OUT Transfer */ +/* USBCore.Device.Transfer.Action - USBDCore_Action_Enum STALL, control IN or control OUT */ +/* USBCore.Device.Transfer.CallBack_OUT.func(uPara) Call back function pointer for Control OUT */ +/* USBCore.Device.Transfer.CallBack_OUT.uPara Parameter of Control OUT call back function */ +/* */ +/* USBCore.Info - USBDCore_Info_TypeDef USB Device information */ +/* USBCore.Info.uCurrentConfiguration For Set/GetConfiguration request */ +/* USBCore.Info.uCurrentInterface For Set/GetInterface request */ +/* USBCore.Info.CurrentStatus - USBDCore_Status_Enum Device State */ +/* USBCore.Info.LastStatus - USBDCore_Status_Enum Device State before SUSPEND */ +/* USBCore.Info.CurrentFeature - USBDCore_Feature_TypeDef For Set/ClearFeature and GetStatus request */ +/* USBCore.Info.CurrentFeature.uByte Byte access for CurrentFeature */ +/* USBCore.Info.CurrentFeature.Bits.bRemoteWakeup Remote Wakeup feature */ +/* USBCore.Info.CurrentFeature.Bits.bSelfPowered Self Powered */ +/* USBCore.Info.uIsDiscardClearFeature Discard ClearFeature flag for Mass Storage */ +/* */ +/* USBCore.Class - USBDCore_Class_TypeDef USB Class call back function */ +/* USBCore.Class.CallBack_MainRoutine.func(uPara) Class main routine call back function */ +/* USBCore.Class.CallBack_MainRoutine.uPara Parameter of class main routine */ +/* USBCore.Class.CallBack_Reset.func(uPara) Class RESET call back function */ +/* USBCore.Class.CallBack_Reset.uPara Parameter of RESET call back function */ +/* USBCore.Class.CallBack_StartOfFrame.func(uPara) Class SOF call back function */ +/* USBCore.Class.CallBack_StartOfFrame.uPara Parameter of SOF call back function */ +/* USBCore.Class.CallBack_ClassGetDescriptor(pDev) Class Get Descriptor call back function */ +/* USBCore.Class.CallBack_ClassSetInterface(pDev) Set Interface call back function */ +/* USBCore.Class.CallBack_ClassGetInterface(pDev) Get Interface call back function */ +/* USBCore.Class.CallBack_ClassRequest(pDev) Class Request call back function */ +/* USBCore.Class.CallBack_EPTn[MAX_EP_NUM](EPTn) Endpoint n call back function */ +/* */ +/* USBCore.pDriver USB Device Driver initialization structure */ +/* */ +/* USBCore.Power - USBDCore_Power_TypeDef USB Device Power related call back function */ +/* USBCore.Power.CallBack_Suspend.func(uPara) System low power function for SUSPEND */ +/* USBCore.Power.CallBack_Suspend.uPara Parameter of system low power function */ +/*----------------------------------------------------------------------------------------------------------*/ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Constant USB Device Core exported constants + * @{ + */ + +/** @defgroup USBDCore_Descriptor Definitions for USB descriptor + * @{ + */ +#define DESC_TYPE_01_DEV (0x1) +#define DESC_TYPE_02_CONFN (0x2) +#define DESC_TYPE_03_STR (0x3) +#define DESC_TYPE_04_INF (0x4) +#define DESC_TYPE_05_EPT (0x5) +#define DESC_TYPE_06_DEV_QLF (0x6) +#define DESC_TYPE_08_INF_PWR (0x8) + +#define DESC_CLASS_00_BY_INF (0x00) +#define DESC_CLASS_01_AUDIO (0x01) +#define DESC_CLASS_02_CDC_CTRL (0x02) +#define DESC_CLASS_03_HID (0x03) +#define DESC_CLASS_05_PHY (0x05) +#define DESC_CLASS_06_STILL_IMG (0x06) +#define DESC_CLASS_07_PRINTER (0x07) +#define DESC_CLASS_08_MASS_STORAGE (0x08) +#define DESC_CLASS_09_HUB (0x09) +#define DESC_CLASS_0A_CDC_DATA (0x0A) +#define DESC_CLASS_0B_SMART_CARD (0x0B) +#define DESC_CLASS_0E_VIDEO (0x0E) +#define DESC_CLASS_0F_PHD (0x0F) +#define DESC_CLASS_FF_VENDOR (0xFF) + +#define DESC_LEN_DEV ((u32)(18)) +#define DESC_LEN_CONFN ((u32)(9)) +#define DESC_LEN_INF ((u32)(9)) +#define DESC_LEN_EPT ((u32)(7)) +/** + * @} + */ + +/** @defgroup USBDCore_Request Definitions for USB Request + * @{ + */ +#define REQ_DIR_00_H2D (0 << 7) +#define REQ_DIR_01_D2H (1 << 7) + +#define REQ_TYPE_00_STD (0 << 5) +#define REQ_TYPE_01_CLS (1 << 5) +#define REQ_TYPE_02_VND (2 << 5) + +#define REQ_REC_00_DEV (0) +#define REQ_REC_01_INF (1) +#define REQ_REC_02_EPT (2) +/** + * @} + */ + +/** + * @brief For USBDCore_EPTReadOUTData function. + */ +#define USB_DISCARD_OUT_DATA (0) + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Macro USB Device Core exported macros + * @{ + */ +#define __DBG_USBPrintf(...) +#define __DBG_USBDump(a, b) + +#if (USBDCORE_DEBUG == 1) + #ifndef RETARGET_IS_USB + extern u32 __DBG_USBCount; + #undef __DBG_USBPrintf + #define __DBG_USBPrintf printf + #if (USBDCORE_DEBUG_DATA == 1) + #undef __DBG_USBDump + void __DBG_USBDump(uc8 *memory, u32 len); + #endif + #endif +#endif + +/** + * @brief Convert Half-Word to Byte for descriptor. + */ +#define DESC_H2B(Val) ((u8)(Val & 0x00FF)), ((u8)((Val & 0xFF00) >> 8)) + +/** + * @brief Padding 0 automatically for String descriptor. + */ +#define DESC_CHAR(c) (c), (0) + +/** + * @brief Calculate String length for String descriptor. + */ +#define DESC_STRLEN(n) (n * 2 + 2) + +/** + * @brief Calculate power for Configuration descriptor. + */ +#define DESC_POWER(mA) (mA / 2) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Functions USB Device Core exported functions + * @{ + */ +#define USBDCore_DeInit API_USB_DEINIT +#define USBDCore_EPTReset API_USB_EPTn_RESET +#define USBDCore_EPTGetBufferLen API_USB_EPTn_GET_BUFFLEN +#define USBDCore_EPTGetTransferCount API_USB_EPTn_GET_CNT +#define USBDCore_EPTSetSTALL API_USB_EPTn_SET_HALT +#define USBDCore_EPTWaitSTALLSent API_USB_EPTn_WAIT_STALL_SENT +#define USBDCore_EPTClearDataToggle API_USB_EPTn_CLR_DTG + +#define USBDCore_EPTWriteINData API_USB_EPTn_WRITE_IN +#define USBDCore_EPTReadOUTData API_USB_EPTn_READ_OUT +#define USBDCore_EPTReadMemory API_USB_EPTn_READ_MEM + + +void usbd_irq_handler(USBDCore_TypeDef *pCore); +void USBDCore_Init(USBDCore_TypeDef *pCore); +void USBDCore_MainRoutine(USBDCore_TypeDef *pCore); + +void usbd_ep_enable(USBDCore_TypeDef *pCore, uint8_t ept_addr); +void usbd_ep_disable(USBDCore_TypeDef *pCore, uint8_t ept_addr); +void usbd_ept_recv(USBDCore_TypeDef *udev, uint8_t ept_addr, uint8_t *buffer, uint16_t len); +//u32 USBDCore_IsSuspend(USBDCore_TypeDef *pCore); +//u32 USBDCore_GetRemoteWakeUpFeature(USBDCore_TypeDef *pCore); +//void USBDCore_TriggerRemoteWakeup(void); +//USBDCore_Status_Enum USBDCore_GetStatus(void); + +void USBDCore_EPTReset(USBD_EPTn_Enum USBD_EPTn); +u32 USBDCore_EPTGetBufferLen(USBD_EPTn_Enum USBD_EPTn); +u32 USBDCore_EPTGetTransferCount(USBD_EPTn_Enum USBD_EPTn, USBD_TCR_Enum type); +void USBDCore_EPTSetSTALL(USBD_EPTn_Enum USBD_EPTn); +void USBDCore_EPTWaitSTALLSent(USBD_EPTn_Enum USBD_EPTn); +void USBDCore_EPTClearDataToggle(USBD_EPTn_Enum USBD_EPTn); + +u32 USBDCore_EPTWriteINData(USBD_EPTn_Enum USBD_EPTn, u32 *pFrom, u32 len); +u32 USBDCore_EPTReadOUTData(USBD_EPTn_Enum USBD_EPTn, u32 *pTo, u32 len); +u32 USBDCore_EPTReadMemory(USBD_EPTn_Enum USBD_EPTn, u32 *pTo, u32 len); +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CODE_H -------------------------------------------------------------------------------*/ + diff --git a/bsp/ht32/libraries/usbd_library/src/ht32_usbd_core.c b/bsp/ht32/libraries/usbd_library/src/ht32_usbd_core.c new file mode 100644 index 00000000000..e7a488ce2e0 --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/src/ht32_usbd_core.c @@ -0,0 +1,1069 @@ +/*********************************************************************************************************//** + * @file ht32_usbd_core.c + * @version $Rev:: 1684 $ + * @date $Date:: 2019-05-07 #$ + * @brief The standard protocol related function of HT32 USB Device Library. + ************************************************************************************************************* + * @attention + * + * Firmware Disclaimer Information + * + * 1. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, which is supplied by Holtek Semiconductor Inc., (hereinafter referred to as "HOLTEK") is the + * proprietary and confidential intellectual property of HOLTEK, and is protected by copyright law and + * other intellectual property laws. + * + * 2. The customer hereby acknowledges and agrees that the program technical documentation, including the + * code, is confidential information belonging to HOLTEK, and must not be disclosed to any third parties + * other than HOLTEK and the customer. + * + * 3. The program technical documentation, including the code, is provided "as is" and for customer reference + * only. After delivery by HOLTEK, the customer shall use the program technical documentation, including + * the code, at their own risk. HOLTEK disclaims any expressed, implied or statutory warranties, including + * the warranties of merchantability, satisfactory quality and fitness for a particular purpose. + * + *

Copyright (C) Holtek Semiconductor Inc. All rights reserved

+ ************************************************************************************************************/ + +/* Includes ------------------------------------------------------------------------------------------------*/ +#include "ht32.h" +#include "ht32_usbd_core.h" +#include "usb_port.h" + + +#ifdef USBD_VENDOR_SUPPORT + #include "ht32_usbd_vendor.c" +#endif + +/** @addtogroup HT32_USBD_Library HT32 USB Device Library + * @{ + */ + +/** @defgroup USBDCore USB Device Core + * @brief USB Device Core standard protocol related function + * @{ + */ + + +/* Private types -------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_TypesDefinitions USB Device Core private types definitions + * @{ + */ +typedef enum +{ + Device = 0, + Interface = 1, + Endpoint = 2, + Other = 3, +} USBDCore_Recipient_Enum; + +typedef enum +{ + ClearFeature = 0, + SetFeature = 1, +} USBDCore_SetClearFeature_Enum; +/** + * @} + */ + +/* Private constants ---------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_Define USB Device Core private definitions + * @{ + */ +/* USBD Debug mode */ +#if (USBDCORE_DEBUG == 1) + #ifdef RETARGET_IS_USB + #warning "USB debug mode can not work when retaget to USB Virtual COM. Turn off automatically." + #undef USBDCORE_DEBUG + #define USBDCORE_DEBUG 0 + #else + u32 __DBG_USBCount; + #warning "USB debug mode has been enabled which degrade the performance." + #warning "After the debug operation, please remember to turn off USB debug mode." + #endif +#endif + +/** @defgroup USBDCore_STD Definition for standard request + * @{ + */ +#define REQ_00_GET_STAT ((u16)(0 << 8)) +#define REQ_01_CLR_FETU ((u16)(1 << 8)) +#define REQ_03_SET_FETU ((u16)(3 << 8)) +#define REQ_05_SET_ADDR ((u16)(5 << 8)) +#define REQ_06_GET_DESC ((u16)(6 << 8)) +#define REQ_07_SET_DESC ((u16)(7 << 8)) +#define REQ_08_GET_CONF ((u16)(8 << 8)) +#define REQ_09_SET_CONF ((u16)(9 << 8)) +#define REQ_10_GET_INF ((u16)(10 << 8)) +#define REQ_11_SET_INF ((u16)(11 << 8)) +#define REQ_12_SYN_FRME ((u16)(12 << 8)) +/** + * @} + */ + +#define DESC_TYPE_01_DEV (0x1) +#define DESC_TYPE_02_CONFN (0x2) +#define DESC_TYPE_03_STR (0x3) +#define USB_NO_DATA (-1) /*!< For Device.Transfer.sByteLength */ +#define BMREQUEST_TYPE_MASK (0x6 << 4) /*!< bmRequestType[6:5] */ +#define USB_FEATURE_REMOTE_WAKEUP (1) + +#define MAX_CONTROL_OUT_SIZE (64) +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------------------------------------*/ +static void _USBDCore_PowerHandler(USBDCore_TypeDef *pCore); +static void _USBDCore_Reset(USBDCore_TypeDef *pCore); +static void _USBDCore_Resume(USBDCore_TypeDef *pCore); +static void _USBDCore_Suspend(USBDCore_TypeDef *pCore); +static void _USBDCore_Setup(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_Request(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_GetStatus(USBDCore_TypeDef *pCore, USBDCore_Recipient_Enum recipient); +static void _USBDCore_Standard_SetClearFeature(USBDCore_TypeDef *pCore, USBDCore_Recipient_Enum recipient, USBDCore_SetClearFeature_Enum type); +static void _USBDCore_Standard_SetAddress(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_GetDescriptor(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_GetConfiguration(USBDCore_TypeDef *pCore); +static void _USBDCore_Standard_SetConfiguration(USBDCore_TypeDef *pCore); +static void _USBDCore_ControlIN(USBDCore_TypeDef *pCore); +static void _USBDCore_ControlOUT(USBDCore_TypeDef *pCore); + +/* Private macro -------------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_Macro USB Device Core private macros + * @{ + */ +/** + * @brief Get self powered bit from Device descriptor + */ +#define _GET_SELFPOWERED_FROM_DESC() (((pCore->Device.Desc.pConfnDesc[7]) >> 6) & 0x01) +/** + * @} + */ + +/* Private variables ---------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_Variable USB Device Core private variables + * @{ + */ +USBDCore_TypeDef *pUSBCore; +/** + * @} + */ + + +/* Global Function -----------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Exported_Functions USB Device Core exported functions + * @{ + */ +/*********************************************************************************************************//** + * @brief USB Core initialization. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_Init(USBDCore_TypeDef *pCore) +{ + pUSBCore = pCore; + pCore->Info.CurrentStatus = USER_USER_USB_STATE_POWERED; + API_USB_INIT(pCore->pDriver); + __DBG_USBPrintf("\r\n%06ld \r\n", ++__DBG_USBCount); + return; +} + +/*********************************************************************************************************//** + * @brief USB Interrupt Service Routine. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_IRQHandler(USBDCore_TypeDef *pCore) +{ + u32 USBISRFlag = API_USB_GET_INT(); + u32 USBEPTISRFlag; + USBD_EPTn_Enum EPTn; + +#if (USBDCORE_DEBUG == 1) + u32 USBAddr = HT_USB->DEVAR; +#endif + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB SOF Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SOF_INT(USBISRFlag)) + { + __DBG_USBPrintf("%06ld SOF[%02d][%02lX]\r\n", ++__DBG_USBCount, pCore->Info.CurrentStatus, USBAddr); + if (pCore->Class.CallBack_StartOfFrame.func != NULL) + { + pCore->Class.CallBack_StartOfFrame.func(pCore->Class.CallBack_StartOfFrame.uPara); + } + + usbd_sof_callback(pCore); + + API_USB_CLR_SOF_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB SUSPEND Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SUSPEND_INT(USBISRFlag)) + { + __DBG_USBPrintf("%06ld SUSPEND[%02d]\r\n", ++__DBG_USBCount, pCore->Info.CurrentStatus); + API_USB_CLR_SUSPEND_INT(); + _USBDCore_Suspend(pCore); + +// usbd_suspend_callback(pCore); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB RESET Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_RESET_INT(USBISRFlag)) + { + if (API_USB_IS_FRES_INT(USBISRFlag)) + { + API_USB_CLR_FRES_INT(); + } + else + { + __DBG_USBPrintf("%06ld RESET[%02d][%02lX]\r\n", ++__DBG_USBCount, pCore->Info.CurrentStatus, USBAddr); + _USBDCore_Reset(pCore); + if (pCore->Class.CallBack_Reset.func != NULL) + { + pCore->Class.CallBack_Reset.func(pCore->Class.CallBack_Reset.uPara); + } + + usbd_reset_callback(pCore); + } + API_USB_CLR_RESET_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB RESUME Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_RESUME_INT(USBISRFlag)) + { + __DBG_USBPrintf("%06ld RESUME\r\n", ++__DBG_USBCount); + _USBDCore_Resume(pCore); + +// usbd_resume_callback(pCore); + + API_USB_CLR_RESUME_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB Endpoint 0 interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_EPTn_INT(USBISRFlag, USBD_EPT0)) + { + USBEPTISRFlag = API_USB_EPTn_GET_INT(USBD_EPT0); + + /*------------------------------------------------------------------------------------------------------*/ + /* Control SETUP Stage */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SETUP_INT(USBEPTISRFlag)) + { + API_USB_READ_SETUP(&(pCore->Device.Request)); /* Read SETUP Command data from USB Buffer*/ + + __DBG_USBPrintf("%06ld SETUP\t[08]\r\n", ++__DBG_USBCount); + __DBG_USBDump((uc8 *) & (pCore->Device.Request), 8); + +// _USBDCore_Setup(pCore); + + usbd_setup_callback(pCore); + + API_USB_CLR_SETUP_INT(); /* Clear SETUP Interrupt */ + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Control Endpoint 0 IN */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_EPTn_IS_IN_INT(USBEPTISRFlag)) + { + __DBG_USBPrintf("%06ld EP0IN\t[%02ld]", ++__DBG_USBCount, pCore->Device.Transfer.sByteLength); + +// _USBDCore_ControlIN(pCore); + + usbd_ep0_in_callback(pCore); + + API_USB_EPTn_CLR_IN_INT(USBD_EPT0); + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Control Endpoint 0 OUT */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_EPTn_IS_OUT_INT(USBEPTISRFlag)) + { + __DBG_USBPrintf("%06ld EP0OUT\t[%02ld]", ++__DBG_USBCount, pCore->Device.Transfer.sByteLength); + + /*----------------------------------------------------------------------------------------------------*/ + /* Clear interrupt flag before USBDCore_ControlOUT is meaning since USBDCore_ControlOUT clear NAKRX */ + /* bit which will cause another interrupt occur. */ + /*----------------------------------------------------------------------------------------------------*/ + API_USB_EPTn_CLR_OUT_INT(USBD_EPT0); +// _USBDCore_ControlOUT(pCore); + + usbd_ep0_out_callback(pCore); + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Clear Control Endpoint 0 global interrupt */ + /*------------------------------------------------------------------------------------------------------*/ + API_USB_CLR_EPTn_INT(USBD_EPT0); + + } /* if (API_USB_IS_EP_INT(USBISRFlag, USBD_EPT0)) */ + + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB Endpoint n call back function */ + /*--------------------------------------------------------------------------------------------------------*/ + while ((EPTn = API_USB_GET_EPT_NUM(API_USB_GET_INT())) != USBD_NOEPT) + { + USBEPTISRFlag = API_USB_EPTn_GET_INT((USBD_EPTn_Enum)EPTn); + + if (API_USB_EPTn_IS_INT(USBEPTISRFlag)) + { + API_USB_EPTn_CLR_INT(EPTn); + API_USB_CLR_EPTn_INT(EPTn); + + if (pCore->Class.CallBack_EPTn[EPTn] != NULL) + { + pCore->Class.CallBack_EPTn[EPTn](EPTn); + } + /* 在此处调用端点输入输出回调函数*/ + if (USBEPTISRFlag & IDTXIF) + { + /* 在此处调用端点输入函数 */ + usbd_ep_in_callback(pCore, (USBD_EPTn_Enum)EPTn); + } + else + { + /* 在此处调用端点输出函数 */ + usbd_ep_out_callback(pCore, (USBD_EPTn_Enum)EPTn); + } + + } + } /* while ((EPTn = API_USB_GET_EPTn_NUM(API_USB_GET_INT())) != USBD_NOEPT) */ + + return; +} + +/*********************************************************************************************************//** + * @brief USB Core Main Routine for application. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_MainRoutine(USBDCore_TypeDef *pCore) +{ + _USBDCore_PowerHandler(pCore); + + /*--------------------------------------------------------------------------------------------------------*/ + /* Class main routine call back function */ + /*--------------------------------------------------------------------------------------------------------*/ + if ((pCore->Class.CallBack_MainRoutine.func != NULL) && (pCore->Info.CurrentStatus == USER_USER_USB_STATE_CONFIGURED)) + { + pCore->Class.CallBack_MainRoutine.func(pCore->Class.CallBack_MainRoutine.uPara); + } + + return; +} + +/*********************************************************************************************************//** + * @brief Return Suspend status + * @param pCore: pointer of USB Device + * @retval TRUE or FALSE + ***********************************************************************************************************/ +u32 USBDCore_IsSuspend(USBDCore_TypeDef *pCore) +{ + return ((pCore->Info.CurrentStatus == USER_USER_USB_STATE_SUSPENDED) ? TRUE : FALSE); +} + +/*********************************************************************************************************//** + * @brief Return remote wake status which set by SET FEATURE standard command + * @param pCore: pointer of USB Device + * @retval TRUE or FALSE + ***********************************************************************************************************/ +u32 USBDCore_GetRemoteWakeUpFeature(USBDCore_TypeDef *pCore) +{ + return (pCore->Info.CurrentFeature.Bits.bRemoteWakeup); +} + +/*********************************************************************************************************//** + * @brief Turn on USB power and remote wakeup the Host + * @retval None + ***********************************************************************************************************/ +void USBDCore_TriggerRemoteWakeup(void) +{ + API_USB_POWER_ON(); /* Turn on USB Power */ + API_USB_REMOTE_WAKEUP(); /* Generate Remote Wakeup request to Host (RESUME) */ + return; +} + +/*********************************************************************************************************//** + * @brief Get USB Device status + * @retval USBDCore_Status_Enum + ***********************************************************************************************************/ +USBDCore_Status_Enum USBDCore_GetStatus(void) +{ + return pUSBCore->Info.CurrentStatus; +} + +/*********************************************************************************************************//** + * @brief Dump memory data for debug purpose. + * @param memory: buffer pointer to dump + * @param len: dump length + * @retval None + ***********************************************************************************************************/ +#if (USBDCORE_DEBUG == 1 && USBDCORE_DEBUG_DATA == 1) +void __DBG_USBDump(uc8 *memory, u32 len) +{ + u32 i; + for (i = 0; i < len; i++) + { + if (i % 8 == 0) + { + if (i != 0) + { + __DBG_USBPrintf("\r\n"); + } + __DBG_USBPrintf("\t\t"); + } + __DBG_USBPrintf("%02X ", *((u8 *)(memory + i))); + } + __DBG_USBPrintf("\r\n"); + + return; +} +#endif +/** + * @} + */ + +/* Private functions ---------------------------------------------------------------------------------------*/ +/** @defgroup USBDCore_Private_Function USB Device Core private functions + * @{ + */ +/*********************************************************************************************************//** + * @brief USB Core Power handler for application. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_PowerHandler(USBDCore_TypeDef *pCore) +{ + API_USB_POWER_UP(pCore->pDriver, pCore->Info.CurrentFeature.Bits.bSelfPowered); + + if (pCore->Info.CurrentStatus == USER_USER_USB_STATE_SUSPENDED) + { + /*------------------------------------------------------------------------------------------------------*/ + /* System Low Power call back function */ + /*------------------------------------------------------------------------------------------------------*/ + if (pCore->Power.CallBack_Suspend.func != NULL) + { + __DBG_USBPrintf("%06ld >LOWPOWER\r\n", ++__DBG_USBCount); + + pCore->Power.CallBack_Suspend.func(pCore->Power.CallBack_Suspend.uPara); + + __DBG_USBPrintf("%06ld pDriver; + + pCore->Device.Transfer.sByteLength = USB_NO_DATA; + pCore->Info.uCurrentConfiguration = 0; + pCore->Info.uCurrentInterface = 0; + pCore->Info.CurrentFeature.Bits.bRemoteWakeup = 0; + pCore->Info.CurrentStatus = USER_USER_USB_STATE_DEFAULT; + pCore->Info.uIsDiscardClearFeature = FALSE; + + API_USB_DEINIT(); + + API_USB_POWER_ON(); + + /* Endpoint 0 initialization */ + API_USB_EPTn_INIT(USBD_EPT0, pCore->pDriver); // To be modify, init from desc + + /* Enable USB interrupt */ + API_USB_ENABLE_INT(pDrv->uInterruptMask); + + return; +} + +/*********************************************************************************************************//** + * @brief USB Resume + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Resume(USBDCore_TypeDef *pCore) +{ + API_USB_POWER_ON(); + pCore->Info.CurrentStatus = pCore->Info.LastStatus; + return; +} + +/*********************************************************************************************************//** + * @brief USB Suspend + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Suspend(USBDCore_TypeDef *pCore) +{ + /*--------------------------------------------------------------------------------------------------------*/ + /* When Device has been suspended, Change CurrentStatus as SUSPEND and then USBDCore_PowerHandler will */ + /* turn off chip power. */ + /*--------------------------------------------------------------------------------------------------------*/ + if (pCore->Info.CurrentStatus >= USER_USER_USB_STATE_POWERED) + { + API_USB_POWER_OFF(); + pCore->Info.LastStatus = pCore->Info.CurrentStatus; + pCore->Info.CurrentStatus = USER_USER_USB_STATE_SUSPENDED; + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Setup Stage + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Setup(USBDCore_TypeDef *pCore) +{ + pCore->Device.Transfer.Action = USB_ACTION_STALL; + pCore->Device.Transfer.sByteLength = 0; + + switch (pCore->Device.Request.bmRequestType & BMREQUEST_TYPE_MASK) + { + /*------------------------------------------------------------------------------------------------------*/ + /* Standard requests */ + /*------------------------------------------------------------------------------------------------------*/ + case REQ_TYPE_00_STD: + { + _USBDCore_Standard_Request(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* Class requests */ + /*------------------------------------------------------------------------------------------------------*/ + case REQ_TYPE_01_CLS: + { + if (pCore->Class.CallBack_ClassRequest != NULL) + { + pCore->Class.CallBack_ClassRequest(&(pCore->Device)); + } + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* Vendor requests */ + /*------------------------------------------------------------------------------------------------------*/ + case REQ_TYPE_02_VND: + { + if (pCore->Class.CallBack_VendorRequest != NULL) + { + pCore->Class.CallBack_VendorRequest(&(pCore->Device)); + } + /* Add Vendor requests handler here.... */ +#ifdef USBD_VENDOR_SUPPORT + USBDVendor_Request(pCore); +#endif + break; + } + } /* switch (gUSBReq.bmRequestType.byte) */ + + switch (pCore->Device.Transfer.Action) + { + /*------------------------------------------------------------------------------------------------------*/ + /* Control IN */ + /*------------------------------------------------------------------------------------------------------*/ + case USB_ACTION_DATAIN: + { + /*----------------------------------------------------------------------------------------------------*/ + /* When the Control IN length is large than the Host required, transfer the length which specified */ + /* by SETUP Data Packet. */ + /*----------------------------------------------------------------------------------------------------*/ + if (pCore->Device.Transfer.sByteLength > pCore->Device.Request.wLength) + { + pCore->Device.Transfer.sByteLength = pCore->Device.Request.wLength; + } + __DBG_USBPrintf("%06ld EP0IN\t[%02ld]", __DBG_USBCount, pCore->Device.Transfer.sByteLength); + + _USBDCore_ControlIN(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* Control OUT */ + /*------------------------------------------------------------------------------------------------------*/ + case USB_ACTION_DATAOUT: + { + if (pCore->Device.Transfer.sByteLength == 0) + { + API_USB_EPTn_WRITE_IN(USBD_EPT0, (u32 *)0, 0); /* Prepare ZLP ack for Control OUT */ + } + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* STALL */ + /*------------------------------------------------------------------------------------------------------*/ + default: + { + __DBG_USBPrintf("%06ld EP0 STALL\r\n", __DBG_USBCount); + + API_USB_EPTn_SEND_STALL(USBD_EPT0); + break; + } + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Stand Request. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_Request(USBDCore_TypeDef *pCore) +{ + u16 USBCmd = *((u16 *)(&(pCore->Device.Request))); + + switch (USBCmd) + { + /*------------------------------------------------------------------------------------------------------*/ + /* | bRequest | Data transfer direction | Type | Recipient | Data */ + /*------------------------------------------------------------------------------------------------------*/ + + /*------------------------------------------------------------------------------------------------------*/ + /* | 00_Get Status | 80_Device-to-Host | 00_Standard Request | 0_Device | 0080h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_00_GET_STAT | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld GET DST\t[%02d]\r\n", __DBG_USBCount, pCore->Info.CurrentFeature.uByte); + _USBDCore_Standard_GetStatus(pCore, Device); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 00_Get Status | 80_Device-to-Host | 00_Standard Request | 1_Interface | 0081h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_00_GET_STAT | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_01_INF): + { + __DBG_USBPrintf("%06ld GET IST\t[%02d]\r\n", __DBG_USBCount, 0); + _USBDCore_Standard_GetStatus(pCore, Interface); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 00_Get Status | 80_Device-to-Host | 00_Standard Request | 2_Endpoint | 0082h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_00_GET_STAT | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_02_EPT): + { + __DBG_USBPrintf("%06ld GET EST\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wIndex); + _USBDCore_Standard_GetStatus(pCore, Endpoint); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 01_Clear Feature | 00_Host-to-Device | 00_Standard Request | 0_Device | 0100h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_01_CLR_FETU | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld CLR DFEA\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + _USBDCore_Standard_SetClearFeature(pCore, Device, ClearFeature); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 01_Clear Feature | 00_Host-to-Device | 00_Standard Request | 2_Endpoint | 0102h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_01_CLR_FETU | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_02_EPT): + { + __DBG_USBPrintf("%06ld CLR EFEA\t[0x%02x]\r\n", __DBG_USBCount, pCore->Device.Request.wIndex); + _USBDCore_Standard_SetClearFeature(pCore, Endpoint, ClearFeature); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 03_Set Feature | 00_Host-to-Device | 00_Standard Request | 0_Device | 0300h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_03_SET_FETU | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld SET DFEA\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + _USBDCore_Standard_SetClearFeature(pCore, Device, SetFeature); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 03_Set Feature | 00_Host-to-Device | 00_Standard Request | 2_Endpoint | 0302h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_03_SET_FETU | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_02_EPT): + { + __DBG_USBPrintf("%06ld SET EFEA\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wIndex); + _USBDCore_Standard_SetClearFeature(pCore, Endpoint, SetFeature); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 05_Set Address | 00_Host-to-Device | 00_Standard Request | 0_Device | 0500h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_05_SET_ADDR | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld SET ADDR\t[%02d]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + _USBDCore_Standard_SetAddress(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 06_Get Descriptor | 80_Device-to-Host | 00_Standard Request | 0_Device | 0680h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_06_GET_DESC | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld GET DDESC\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueH); + _USBDCore_Standard_GetDescriptor(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 06_Get Descriptor | 80_Device-to-Host | 00_Standard Request | 1_Interface | 0681h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_06_GET_DESC | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_01_INF): + { + __DBG_USBPrintf("%06ld GET IDESC\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueH); + if (pCore->Class.CallBack_ClassGetDescriptor != NULL) + { + pCore->Class.CallBack_ClassGetDescriptor((USBDCore_Device_TypeDef *) & (pCore->Device)); + } + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 08_Get Configuration | 80_Host-to-Device | 00_Standard Request | 0_Device | 0880h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_08_GET_CONF | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld GET CONF\t[%02X]\r\n", __DBG_USBCount, pCore->Info.uCurrentConfiguration); + _USBDCore_Standard_GetConfiguration(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 09_Set Configuration | 00_Host-to-Device | 00_Standard Request | 0_Device | 0900h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_09_SET_CONF | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_00_DEV): + { + __DBG_USBPrintf("%06ld SET CONF\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + _USBDCore_Standard_SetConfiguration(pCore); + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 11_Set Interface | 00_Host-to-Device | 00_Standard Request | 1_Interface | 0B01h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_11_SET_INF | REQ_DIR_00_H2D | REQ_TYPE_00_STD | REQ_REC_01_INF): + { + __DBG_USBPrintf("%06ld SET INF\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + if (pCore->Class.CallBack_ClassSetInterface != NULL) + { + pCore->Class.CallBack_ClassSetInterface((USBDCore_Device_TypeDef *) & (pCore->Device)); + } + break; + } + /*------------------------------------------------------------------------------------------------------*/ + /* | 10_Get Interface | 80_Device-to-Host | 00_Standard Request | 1_Interface | 0A81h */ + /*------------------------------------------------------------------------------------------------------*/ + case (REQ_10_GET_INF | REQ_DIR_01_D2H | REQ_TYPE_00_STD | REQ_REC_01_INF): + { + __DBG_USBPrintf("%06ld GET INF\t[%02X]\r\n", __DBG_USBCount, pCore->Device.Request.wValueL); + if (pCore->Class.CallBack_ClassGetInterface != NULL) + { + pCore->Class.CallBack_ClassGetInterface((USBDCore_Device_TypeDef *) & (pCore->Device)); + } + break; + } + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - GET_STATUS. + * @param pCore: pointer of USB Device + * @param recipient: Recipient + * @arg Device: 0 + * @arg Interface: 1 + * @arg Endpoint: 2 + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_GetStatus(USBDCore_TypeDef *pCore, USBDCore_Recipient_Enum recipient) +{ + pCore->Device.Transfer.uBuffer[1] = 0; + switch (recipient) + { + case Device: + { + pCore->Device.Transfer.uBuffer[0] = pCore->Info.CurrentFeature.uByte; + break; + } + case Interface: + { + pCore->Device.Transfer.uBuffer[0] = 0; + break; + } + case Endpoint: + { + pCore->Device.Transfer.uBuffer[0] = API_USB_EPTn_GET_HALT((USBD_EPTn_Enum)(pCore->Device.Request.wIndex & 0xF)); + break; + } + default: + { + return; + } + } + + pCore->Device.Transfer.pData = (uc8 *) & (pCore->Device.Transfer.uBuffer); + pCore->Device.Transfer.sByteLength = 2; + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - SET_FEATURE / CLEAR_FEATURE. + * @param pCore: pointer of USB Device + * @param recipient: Recipient + * @arg Device: 0 + * @arg Interface: 1 + * @arg Endpoint: 2 + * @param type: + * @arg ClearFeature: 0 + @arg SerFeature: 1 + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_SetClearFeature(USBDCore_TypeDef *pCore, + USBDCore_Recipient_Enum recipient, + USBDCore_SetClearFeature_Enum type) +{ + u32 i; + switch (recipient) + { + case Device: + { + if (pCore->Device.Request.wValueL == USB_FEATURE_REMOTE_WAKEUP) + { + pCore->Info.CurrentFeature.Bits.bRemoteWakeup = type; + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + } + break; + } + case Endpoint: + { + i = pCore->Device.Request.wIndex & 0xF; + if (i != 0) + { + if (type == ClearFeature) + { + if (pCore->Info.uIsDiscardClearFeature == FALSE) + { + API_USB_EPTn_CLR_HALT((USBD_EPTn_Enum)i); + API_USB_EPTn_CLR_DTG((USBD_EPTn_Enum)i); + } + } + else + { + API_USB_EPTn_SET_HALT((USBD_EPTn_Enum)i); + } + } + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + break; + } + default: + { + break; + } + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - SET_ADDRESS. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_SetAddress(USBDCore_TypeDef *pCore) +{ + API_USB_SET_ADDR(pCore->Device.Request.wValueL); + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + pCore->Info.CurrentStatus = USER_USER_USB_STATE_ADDRESS; + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - GET_DESCRIPTOR. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_GetDescriptor(USBDCore_TypeDef *pCore) +{ + u32 value = pCore->Device.Request.wValueH; + uc8 *pTemp; + + switch (value) + { + case DESC_TYPE_01_DEV: + { + pCore->Device.Transfer.pData = pCore->Device.Desc.pDeviceDesc; + pCore->Device.Transfer.sByteLength = *(pCore->Device.Desc.pDeviceDesc); + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + break; + } + case DESC_TYPE_02_CONFN: + { + pCore->Device.Transfer.pData = pCore->Device.Desc.pConfnDesc; + pCore->Device.Transfer.sByteLength = *(u16 *)((pCore->Device.Desc.pConfnDesc) + 2); + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + break; + } + case DESC_TYPE_03_STR: + { + value = pCore->Device.Request.wValueL; + if (value < pCore->Device.Desc.uStringDescNumber) + { + if (*(pCore->Device.Desc.ppStringDesc + value) != NULL) + { + pTemp = *(pCore->Device.Desc.ppStringDesc + value); + pCore->Device.Transfer.pData = (uc8 *)(pTemp); + pCore->Device.Transfer.sByteLength = *(pTemp); + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + } + } + break; + } + } + +#ifdef USBD_VENDOR_SUPPORT + USBDVendor_StandardGetDescriptor(pCore); +#endif + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - GET_CONFIGURATION. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_GetConfiguration(USBDCore_TypeDef *pCore) +{ + pCore->Device.Transfer.pData = &(pCore->Info.uCurrentConfiguration); + pCore->Device.Transfer.sByteLength = 1; + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + + return; +} + +/*********************************************************************************************************//** + * @brief USB Standard Request - SET_CONFIGURATION. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Standard_SetConfiguration(USBDCore_TypeDef *pCore) +{ + u32 i; + + pCore->Info.uCurrentConfiguration = pCore->Device.Request.wValueL; + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + + /* Endpoint n settings */ + for (i = 1; i < MAX_EP_NUM; i++) + { + API_USB_EPTn_INIT((USBD_EPTn_Enum)i, pCore->pDriver); // To be modify, init from desc + } + + pCore->Info.CurrentStatus = USER_USER_USB_STATE_CONFIGURED; + + return; +} + +/*********************************************************************************************************//** + * @brief USB Control IN transfer. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_ControlIN(USBDCore_TypeDef *pCore) +{ + s32 EP0INLen = API_USB_GET_CTRL_IN_LEN(); + u32 len; + + if (pCore->Device.Transfer.sByteLength != USB_NO_DATA && pCore->Device.Transfer.Action == USB_ACTION_DATAIN) + { + if (pCore->Device.Transfer.sByteLength >= EP0INLen) + { + len = EP0INLen; + pCore->Device.Transfer.sByteLength -= len; + } + else + { + len = pCore->Device.Transfer.sByteLength; + pCore->Device.Transfer.sByteLength = USB_NO_DATA; + pCore->Device.Transfer.Action = USB_ACTION_DATAOUT; + } + + __DBG_USBPrintf("[%02ld]\r\n", len); + __DBG_USBDump((uc8 *)pCore->Device.Transfer.pData, len); + + API_USB_EPTn_WRITE_IN(USBD_EPT0, (u32 *)pCore->Device.Transfer.pData, len); + pCore->Device.Transfer.pData = pCore->Device.Transfer.pData + len; + } + else + { + __DBG_USBPrintf("[-1]\r\n"); + } + + return; +} + +/*********************************************************************************************************//** + * @brief USB Control OUT transfer. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_ControlOUT(USBDCore_TypeDef *pCore) +{ + u32 len; + + if (pCore->Device.Transfer.sByteLength != USB_NO_DATA && pCore->Device.Transfer.Action == USB_ACTION_DATAOUT) + { + len = API_USB_EPTn_READ_OUT(USBD_EPT0, (u32 *)pCore->Device.Transfer.pData, MAX_CONTROL_OUT_SIZE); + + __DBG_USBPrintf("[%02ld]\r\n", len); + __DBG_USBDump((uc8 *)pCore->Device.Transfer.pData, len); + + pCore->Device.Transfer.pData = pCore->Device.Transfer.pData + len; + pCore->Device.Transfer.sByteLength -= len; + + if (pCore->Device.Transfer.sByteLength == 0) + { + pCore->Device.Transfer.Action = USB_ACTION_DATAIN; + if (pCore->Device.Transfer.CallBack_OUT.func != NULL) + { + pCore->Device.Transfer.CallBack_OUT.func(pCore->Device.Transfer.CallBack_OUT.uPara); + pCore->Device.Transfer.CallBack_OUT.func = NULL; + } + pCore->Device.Transfer.sByteLength = USB_NO_DATA; + API_USB_EPTn_WRITE_IN(USBD_EPT0, (u32 *)0, 0); + } + } + else + { + __DBG_USBPrintf("[-1]\r\n"); + } + + return; +} +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ diff --git a/bsp/ht32/libraries/usbd_library/src/ht32_usbd_int.c b/bsp/ht32/libraries/usbd_library/src/ht32_usbd_int.c new file mode 100644 index 00000000000..8999a00c521 --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/src/ht32_usbd_int.c @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-11 QT-one first version + */ + +#include "ht32_usbd_int.h" + +#ifdef RT_USING_USB_DEVICE +//#include "ht32_usbd_core.h" + + + +static void USBPLL_Configuration(void); +static void USBVRG_Configuration(void); +static void Suspend(u32 uPara); + + +static USBDCore_TypeDef *int_p_usbd_code; +static USBD_Driver_TypeDef gUSBDriver; +static u32 gIsLowPowerAllowed = TRUE; + +/* + 为了不破坏原本的usb_code文件中的USB中断回调函数 + 此处重构USB中断回调函数 + 除了重构USB的中断回调函数以外,还需要重写一些中断回调功能函数 +*/ +/* + RTT的USB中断回调过程如下 + USB中断函数 -> USB中断回调函数 -> USB相关功能回调函数 + -> RTT的USB相关功能回调函数 -> 结束USB中断 + + RTT的USB程序运行流程(RTT的USB线程运行流程) + USB线程阻塞等待USB获取到消息队列中的消息 + -> USB中断通过回调函数将接收到的消息传给USB的消息队列 + -> RTT的USB相关功能回调函数获取到USB中断的消息,并设置USB消息队列的状态 + -> USB退出中断,USB获取到消息后,线程阻塞被解除 + -> USB线程根据获取的状态执行对应的功能 + -> USB线程通过USB操作接口实现对应的功能 + +*/ +/* + 根据RTT的USB中断回调过程和RTT的USB线程执行过程 + 得出完成USB驱动需要实现的两个重要部分 + 1、USB线程实现功能所需要的调用到的USB操作接口函数 + 2、USB中断回调过程使用到的RTT的USB驱动的函数的相关衔接部分 + + 除了以上两个比较重要的功能外,还需要完成以下的一些必要部分 + 1、USB初始化函数 + 2、USB设备注册函数 + + 完成以上功能主要涉及到两个文件为: + 1、drv_usbd.c + 2、ht32_usbd_int.c + + 对两个文件的内容分配以及文件依赖如下: + drv_usbd.c + 主要负责实现USB的操作接口的实现 + 以及初始化函数和USB设备注册函数 + 由于自定义的USB内核挂载点在该文件中 + 所以USB的中断函数也会写在该文件中 + 依赖: + ht32_usbd_core.c + ht32_usbd_int.c + 以及RTT的相关文件 + + ht32_usbd_int.c + 主要负责实现USB中断回调以及回调函数 + 中和RTT的USB驱动函数相关衔接部分 + 该文件还会包含USB的初始配置函数以及 + USB的休眠与唤醒的相关函数 + 依赖: + ht32_usbd_core.c + 以及RTT的相关文件 +*/ + +/* 帧起始(SOF)中断回调 */ +void usbd_sof_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_sof_handler(udcd); +} +/* USB复位中断 */ +void usbd_reset_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_reset_handler(udcd); +} + +/* USB暂停(断开连接)中断 */ +void usbd_suspend_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_disconnect_handler(udcd); +} + +/* USB恢复(重新连接)中断 */ +void usbd_resume_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_connect_handler(udcd); +} + +/* USB端点0中断 */ +/* 端点0控制中断 */ +void usbd_setup_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_setup_handler(udcd, (struct urequest *)&pCore->Device.Request); +} + +/* 端点0输入中断(可以归入其他端点输入中断) */ +void usbd_ep0_in_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_in_handler(udcd); +} + +/* 端点0输出中断(可以归入其他端点输出中断) */ +void usbd_ep0_out_callback(USBDCore_TypeDef *pCore) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep0_out_handler(udcd, pCore->Device.Transfer.sByteLength); +} + +/* USB其他端点中断 */ +/* 其他端点输入中断 */ +void usbd_ep_in_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep_in_handler(udcd, EPTn | 0x80, pCore->Device.Transfer.sByteLength); +} + +/* 其他端点输出中断 */ +void usbd_ep_out_callback(USBDCore_TypeDef *pCore, USBD_EPTn_Enum EPTn) +{ + udcd_t udcd = (udcd_t)pCore->pdata; + rt_usbd_ep_out_handler(udcd, EPTn, pCore->Device.Transfer.sByteLength); +} + + + + +//rt_err_t rt_usbd_set_feature(udevice_t device, rt_uint16_t value, rt_uint16_t index); +//rt_err_t rt_usbd_clear_feature(udevice_t device, rt_uint16_t value, rt_uint16_t index); +//rt_err_t rt_usbd_ep_set_stall(udevice_t device, uep_t ep); +//rt_err_t rt_usbd_ep_clear_stall(udevice_t device, uep_t ep); +//rt_err_t rt_usbd_ep0_set_stall(udevice_t device); +//rt_err_t rt_usbd_ep0_clear_stall(udevice_t device); + + +/*********************************************************************************************************//** + * @brief Configure USB. + * @retval None + ***********************************************************************************************************/ +static void USB_Configuration(USBDCore_TypeDef *pCore) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + CKCUClock.Bit.USBD = 1; + CKCUClock.Bit.EXTI = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + int_p_usbd_code = pCore; + +#if (LIBCFG_CKCU_USB_PLL) + USBPLL_Configuration(); +#endif + +#if (LIBCFG_PWRCU_VREG) + USBVRG_Configuration(); /* Voltage of USB setting */ +#endif + + pCore->pDriver = (u32 *)&gUSBDriver; /* Initiate memory pointer of USB driver */ + pCore->Power.CallBack_Suspend.func = Suspend; /* Install suspend call back function into USB core */ + +// gUSBCore.pDriver = (u32 *)&gUSBDriver; /* Initiate memory pointer of USB driver */ +// gUSBCore.Power.CallBack_Suspend.func = Suspend; /* Install suspend call back function into USB core */ + //gUSBCore.Power.CallBack_Suspend.uPara = (u32)NULL; + + /* 描述符初始化 */ +// USBDDesc_Init(&pCore->Device.Desc); /* Initiate memory pointer of descriptor */ + /* USB类初始化 */ +// USBDClass_Init(&(pCore->Class)); /* Initiate USB Class layer */ + /* USB内核初始化 */ + USBDCore_Init(pCore); /* Initiate USB Core layer */ + + /* !!! NOTICE !!! + Must turn on if the USB clock source is from HSI (PLL clock Source) + */ +#if 0 + { + /* Turn on HSI auto trim function */ + CKCU_HSIAutoTrimClkConfig(CKCU_ATC_USB); + CKCU_HSIAutoTrimCmd(ENABLE); + } +#endif + + NVIC_EnableIRQ(USB_IRQn); /* Enable USB device interrupt */ +} + +#if (LIBCFG_CKCU_USB_PLL) +/*********************************************************************************************************//** + * @brief Configure USB PLL + * @retval None + ************************************************************************************************************/ +static void USBPLL_Configuration(void) +{ + { + /* USB PLL configuration */ + + /* !!! NOTICE !!! + Notice that the local variable (structure) did not have an initial value. + Please confirm that there are no missing members in the parameter settings below in this function. + */ + CKCU_PLLInitTypeDef PLLInit; + + PLLInit.ClockSource = CKCU_PLLSRC_HSE; // CKCU_PLLSRC_HSE or CKCU_PLLSRC_HSI +#if (LIBCFG_CKCU_USB_PLL_96M) + PLLInit.CFG = CKCU_USBPLL_8M_96M; +#else + PLLInit.CFG = CKCU_USBPLL_8M_48M; +#endif + PLLInit.BYPASSCmd = DISABLE; + CKCU_USBPLLInit(&PLLInit); + } + + CKCU_USBPLLCmd(ENABLE); + + while (CKCU_GetClockReadyStatus(CKCU_FLAG_USBPLLRDY) == RESET); + CKCU_USBClockConfig(CKCU_CKUSBPLL); +} +#endif + +#if (LIBCFG_PWRCU_VREG) +/*********************************************************************************************************//** + * @brief Configure USB Voltage + * @retval None + ************************************************************************************************************/ +static void USBVRG_Configuration(void) +{ + CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }}; + CKCUClock.Bit.BKP = 1; + CKCU_PeripClockConfig(CKCUClock, ENABLE); + + PWRCU_SetVREG(PWRCU_VREG_3V3); + + /* !!! NOTICE !!! + USB LDO should be enabled (PWRCU_VREG_ENABLE) if the MCU VDD > 3.6 V. + */ + PWRCU_VREGConfig(PWRCU_VREG_BYPASS); +} +#endif + +#define REMOTE_WAKEUP (0) +/*********************************************************************************************************//** + * @brief Suspend call back function which enter DeepSleep1 + * @param uPara: Parameter for Call back function + * @retval None + ***********************************************************************************************************/ +static void Suspend(u32 uPara) +{ +#if (REMOTE_WAKEUP == 1) + u32 IsRemoteWakeupAllowed; +#endif + + if (gIsLowPowerAllowed) + { + +#if (REMOTE_WAKEUP == 1) + /* Disable EXTI interrupt to prevent interrupt occurred after wakeup */ + EXTI_IntConfig(KEY1_BUTTON_EXTI_CHANNEL, DISABLE); + IsRemoteWakeupAllowed = USBDCore_GetRemoteWakeUpFeature(&gUSBCore); + + if (IsRemoteWakeupAllowed == TRUE) + { + /* Enable EXTI wake event and clear wakeup flag */ + EXTI_WakeupEventConfig(KEY1_BUTTON_EXTI_CHANNEL, EXTI_WAKEUP_LOW_LEVEL, ENABLE); + EXTI_ClearWakeupFlag(KEY1_BUTTON_EXTI_CHANNEL); + } +#endif + + __DBG_USBPrintf("%06ld >DEEPSLEEP\r\n", ++__DBG_USBCount); + + // Add your procedure here which disable related IO to reduce power consumption + // .................. + // + + if ((int_p_usbd_code->Info.CurrentStatus == USB_STATE_SUSPENDED) && ((HT_USB->CSR & 0xC0) == 0x40)) // D+ = 1, D- = 0 + { + /* For Bus powered device, you must enter DeepSleep1 when device has been suspended. For self-powered */ + /* device, you may decide to enter DeepSleep1 or not depended on your application. */ + + /* For the convenient during debugging and evaluation stage, the USBDCore_LowPower() is map to a null */ + /* function by default. In the real product, you must map this function to the low power function of */ + /* firmware library by setting USBDCORE_ENABLE_LOW_POWER as 1 (in the ht32fxxxx_usbdconf.h file). */ + USBDCore_LowPower(); + } + + // Add your procedure here which recovery related IO for application + // .................. + // + + __DBG_USBPrintf("%06ld 3.6 V. + */ + PWRCU_VREGConfig(PWRCU_VREG_BYPASS); +} +#endif + +#define REMOTE_WAKEUP (0) +/*********************************************************************************************************//** + * @brief Suspend call back function which enter DeepSleep1 + * @param uPara: Parameter for Call back function + * @retval None + ***********************************************************************************************************/ +static void Suspend(u32 uPara) +{ +#if (REMOTE_WAKEUP == 1) + u32 IsRemoteWakeupAllowed; +#endif + + if (gIsLowPowerAllowed) + { + +#if (REMOTE_WAKEUP == 1) + /* Disable EXTI interrupt to prevent interrupt occurred after wakeup */ + EXTI_IntConfig(KEY1_BUTTON_EXTI_CHANNEL, DISABLE); + IsRemoteWakeupAllowed = USBDCore_GetRemoteWakeUpFeature(&gUSBCore); + + if (IsRemoteWakeupAllowed == TRUE) + { + /* Enable EXTI wake event and clear wakeup flag */ + EXTI_WakeupEventConfig(KEY1_BUTTON_EXTI_CHANNEL, EXTI_WAKEUP_LOW_LEVEL, ENABLE); + EXTI_ClearWakeupFlag(KEY1_BUTTON_EXTI_CHANNEL); + } +#endif + + __DBG_USBPrintf("%06ld >DEEPSLEEP\r\n", ++__DBG_USBCount); + + // Add your procedure here which disable related IO to reduce power consumption + // .................. + // + + if ((gUSBCore->Info.CurrentStatus == USER_USB_STATE_SUSPENDED) && ((HT_USB->CSR & 0xC0) == 0x40)) // D+ = 1, D- = 0 + { + /* For Bus powered device, you must enter DeepSleep1 when device has been suspended. For self-powered */ + /* device, you may decide to enter DeepSleep1 or not depended on your application. */ + + /* For the convenient during debugging and evaluation stage, the USBDCore_LowPower() is map to a null */ + /* function by default. In the real product, you must map this function to the low power function of */ + /* firmware library by setting USBDCORE_ENABLE_LOW_POWER as 1 (in the ht32fxxxx_usbdconf.h file). */ + USBDCore_LowPower(); + } + + // Add your procedure here which recovery related IO for application + // .................. + // + + __DBG_USBPrintf("%06ld pDriver = (u32 *)&gUSBDriver; /* Initiate memory pointer of USB driver */ + gUSBCore->Power.CallBack_Suspend.func = Suspend; /* Install suspend call back function into USB core */ + +// USBDDesc_Init(&gUSBCore.Device.Desc); /* Initiate memory pointer of descriptor */ +// USBDClass_Init(&gUSBCore.Class); /* Initiate USB Class layer */ + USBDCore_Init(gUSBCore); /* Initiate USB Core layer */ + + NVIC_SetPriority(USB_IRQn,0); + NVIC_EnableIRQ(USB_IRQn); /* Enable USB device interrupt */ + + HT32F_DVB_USBConnect(); + +} + + + + + + + + diff --git a/bsp/ht32/libraries/usbd_library/src/usbd_code.c b/bsp/ht32/libraries/usbd_library/src/usbd_code.c new file mode 100644 index 00000000000..33040e57ebd --- /dev/null +++ b/bsp/ht32/libraries/usbd_library/src/usbd_code.c @@ -0,0 +1,327 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-07-09 QT-one first version + */ + +#include "usbd_code.h" +#include "usb_port.h" + +#include +#include +#include "drv_common.h" + +#if 1 + +#define USB_NO_DATA (-1) /*!< For Device.Transfer.sByteLength */ +/* Private function prototypes -----------------------------------------------------------------------------*/ +static void _USBDCore_Suspend(USBDCore_TypeDef *pCore); +static void _USBDCore_Reset(USBDCore_TypeDef *pCore); +static void _USBDCore_Resume(USBDCore_TypeDef *pCore); + +static void usbd_ept_init(USBDCore_TypeDef *udev); +/*********************************************************************************************************//** + * @brief USB Interrupt Service Routine. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void usbd_irq_handler(USBDCore_TypeDef *pCore) +{ + u32 USBISRFlag = API_USB_GET_INT(); + u32 USBEPTISRFlag; + USBD_EPTn_Enum EPTn; + +#if (USBDCORE_DEBUG == 1) + u32 USBAddr = HT_USB->DEVAR; +#endif + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB SOF Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SOF_INT(USBISRFlag)) + { + usbd_sof_callback(pCore); + API_USB_CLR_SOF_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB SUSPEND Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SUSPEND_INT(USBISRFlag)) + { + API_USB_CLR_SUSPEND_INT(); + usbd_suspend_callback(pCore); + _USBDCore_Suspend(pCore); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB RESET Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_RESET_INT(USBISRFlag)) + { + if (API_USB_IS_FRES_INT(USBISRFlag)) + { + API_USB_CLR_FRES_INT(); + } + else + { + usbd_reset_callback(pCore); + _USBDCore_Reset(pCore); + } + API_USB_CLR_RESET_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB RESUME Interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_RESUME_INT(USBISRFlag)) + { + usbd_resume_callback(pCore); + _USBDCore_Resume(pCore); + API_USB_CLR_RESUME_INT(); + } + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB Endpoint 0 interrupt */ + /*--------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_EPTn_INT(USBISRFlag, USBD_EPT0)) + { + USBEPTISRFlag = API_USB_EPTn_GET_INT(USBD_EPT0); + + /*------------------------------------------------------------------------------------------------------*/ + /* Control SETUP Stage */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_IS_SETUP_INT(USBEPTISRFlag)) + { + API_USB_READ_SETUP(&(pCore->Device.Request)); /* Read SETUP Command data from USB Buffer*/ + usbd_setup_callback(pCore); + API_USB_CLR_SETUP_INT(); /* Clear SETUP Interrupt */ + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Control Endpoint 0 IN */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_EPTn_IS_IN_INT(USBEPTISRFlag)) + { + usbd_ep0_in_callback(pCore); + API_USB_EPTn_CLR_IN_INT(USBD_EPT0); + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Control Endpoint 0 OUT */ + /*------------------------------------------------------------------------------------------------------*/ + if (API_USB_EPTn_IS_OUT_INT(USBEPTISRFlag)) + { + /*----------------------------------------------------------------------------------------------------*/ + /* Clear interrupt flag before USBDCore_ControlOUT is meaning since USBDCore_ControlOUT clear NAKRX */ + /* bit which will cause another interrupt occur. */ + /*----------------------------------------------------------------------------------------------------*/ + API_USB_EPTn_CLR_OUT_INT(USBD_EPT0); + usbd_ep0_out_callback(pCore); + } + + /*------------------------------------------------------------------------------------------------------*/ + /* Clear Control Endpoint 0 global interrupt */ + /*------------------------------------------------------------------------------------------------------*/ + API_USB_CLR_EPTn_INT(USBD_EPT0); + + } /* if (API_USB_IS_EP_INT(USBISRFlag, USBD_EPT0)) */ + + + /*--------------------------------------------------------------------------------------------------------*/ + /* USB Endpoint n call back function */ + /*--------------------------------------------------------------------------------------------------------*/ + while ((EPTn = API_USB_GET_EPT_NUM(API_USB_GET_INT())) != USBD_NOEPT) + { + USBEPTISRFlag = API_USB_EPTn_GET_INT((USBD_EPTn_Enum)EPTn); + + if (API_USB_EPTn_IS_INT(USBEPTISRFlag)) + { + API_USB_EPTn_CLR_INT(EPTn); + API_USB_CLR_EPTn_INT(EPTn); + + if (USBEPTISRFlag & IDTXIF) + { + usbd_ep_in_callback(pCore, (USBD_EPTn_Enum)EPTn); + } + else + { + usbd_ep_out_callback(pCore, (USBD_EPTn_Enum)EPTn); + } + + } + } /* while ((EPTn = API_USB_GET_EPTn_NUM(API_USB_GET_INT())) != USBD_NOEPT) */ + + return; +} +/*********************************************************************************************************//** + * @brief USB Core initialization. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_Init(USBDCore_TypeDef *pCore) +{ + pCore->Info.CurrentStatus = USER_USB_STATE_POWERED; + API_USB_INIT(pCore->pDriver); + + /* Endpoint information initialisation */ + usbd_ept_init(pCore); + + return; +} +/*********************************************************************************************************//** + * @brief USB Core Main Routine for application. + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +void USBDCore_MainRoutine(USBDCore_TypeDef *pCore) +{ + API_USB_POWER_UP(pCore->pDriver, pCore->Info.CurrentFeature.Bits.bSelfPowered); + + if (pCore->Info.CurrentStatus == USER_USB_STATE_SUSPENDED) + { + /*------------------------------------------------------------------------------------------------------*/ + /* System Low Power call back function */ + /*------------------------------------------------------------------------------------------------------*/ + if (pCore->Power.CallBack_Suspend.func != NULL) + { + __DBG_USBPrintf("%06ld >LOWPOWER\r\n", ++__DBG_USBCount); + + pCore->Power.CallBack_Suspend.func(pCore->Power.CallBack_Suspend.uPara); + + __DBG_USBPrintf("%06ld Info.CurrentStatus >= USER_USB_STATE_POWERED) + { + API_USB_POWER_OFF(); + pCore->Info.LastStatus = pCore->Info.CurrentStatus; + pCore->Info.CurrentStatus = USER_USB_STATE_SUSPENDED; + } + + return; +} +/*********************************************************************************************************//** + * @brief USB Reset + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Reset(USBDCore_TypeDef *pCore) +{ + USBD_Driver_TypeDef *pDrv = (USBD_Driver_TypeDef *)pCore->pDriver; + + pCore->Device.Transfer.sByteLength = USB_NO_DATA; + pCore->Info.uCurrentConfiguration = 0; + pCore->Info.uCurrentInterface = 0; + pCore->Info.CurrentFeature.Bits.bRemoteWakeup = 0; + pCore->Info.CurrentStatus = USER_USB_STATE_DEFAULT; + pCore->Info.uIsDiscardClearFeature = FALSE; + + API_USB_DEINIT(); + + API_USB_POWER_ON(); + + /* Endpoint 0 initialization */ + API_USB_EPTn_INIT(USBD_EPT0, pCore->pDriver); // To be modify, init from desc + + /* Enable USB interrupt */ + API_USB_ENABLE_INT(pDrv->uInterruptMask); + + return; +} +/*********************************************************************************************************//** + * @brief USB Resume + * @param pCore: pointer of USB Device + * @retval None + ***********************************************************************************************************/ +static void _USBDCore_Resume(USBDCore_TypeDef *pCore) +{ + API_USB_POWER_ON(); + pCore->Info.CurrentStatus = pCore->Info.LastStatus; + return; +} +/****************************************************************************************************************************/ +void usbd_ep_enable(USBDCore_TypeDef *pCore, uint8_t ept_addr) +{ + USBD_Driver_TypeDef *pDrv = (USBD_Driver_TypeDef *)pCore->pDriver; + pDrv->ept[ept_addr & 0x7f].CFGR.bits.EPEN = 1; + API_USB_EPTn_INIT((USBD_EPTn_Enum)(ept_addr & 0x7f), pCore->pDriver); // To be modify, init from desc +} +void usbd_ep_disable(USBDCore_TypeDef *pCore, uint8_t ept_addr) +{ + USBD_Driver_TypeDef *pDrv = (USBD_Driver_TypeDef *)pCore->pDriver; + pDrv->ept[ept_addr & 0x7f].CFGR.bits.EPEN = 0; + API_USB_EPTn_INIT((USBD_EPTn_Enum)(ept_addr & 0x7f), pCore->pDriver); // To be modify, init from desc +} + +static void usbd_ept_init(USBDCore_TypeDef *udev) +{ + uint8_t ept_num = 0; + usb_ept_info *ept_info; + for (ept_num = 0; ept_num < 8; ept_num++) + { + ept_info = &udev->ept_io[ept_num]; + + ept_info->maxpacket = 64; + + ept_info->status = 1; + + ept_info->total_len = 0; + ept_info->trans_len = 0; + ept_info->trans_buf = NULL; + } +} +/** + * @brief usb endpoint receive data + * @param udev: to the structure of usbd_core_type + * @param ept_addr: endpoint number + * @param buffer: receive data buffer + * @param len: receive data length + * @retval none + */ +void usbd_ept_recv(USBDCore_TypeDef *udev, uint8_t ept_addr, uint8_t *buffer, uint16_t len) +{ + /* get endpoint info struct and register */ + usb_ept_info *ept_info = &udev->ept_io[ept_addr & 0x7F]; + uint32_t trs_len = 0; + + /* set receive data buffer and length */ + ept_info->trans_buf = buffer; + ept_info->total_len = len; + ept_info->trans_len = 0; + + if (ept_info->total_len > ept_info->maxpacket) + { + trs_len = ept_info->maxpacket; + ept_info->total_len -= trs_len; + } + else + { + trs_len = len; + ept_info->total_len = 0; + } + + ept_info->trans_len = trs_len; + /* set rx status valid */ + ept_info->status = TRUE; +} + +#endif /* BSP_USING_USBD */ diff --git a/bsp/ht32/tools/sdk_dist.py b/bsp/ht32/tools/sdk_dist.py index 49b2c2872af..01540d7ec62 100644 --- a/bsp/ht32/tools/sdk_dist.py +++ b/bsp/ht32/tools/sdk_dist.py @@ -37,3 +37,27 @@ def dist_do_building(BSP_ROOT, dist_dir): bsp_update_kconfig_library(dist_dir) +def get_source(ic_model, file_path, system_path, base_path): + source_path = [] + files_list = [] + readafter = 0 + if not os.path.isfile(file_path): + return + + with open(file_path, 'r') as file: + # content = file.read() + for line in file: + if readafter == 2 and line.find('>') != -1: + break + if readafter == 2: + files_list.append(line.strip()) + if line.find(ic_model) != -1: + readafter = 1 + if readafter == 1 and line.find('<') != -1: + readafter = 2 + for line in files_list: + if line.find('system') != -1: + source_path.append(os.path.join(system_path, line.strip())) + else: + source_path.append(os.path.join(base_path, line.strip())) + return source_path From 0ae537e5313613df16a9cee98aa119b34516aafb Mon Sep 17 00:00:00 2001 From: zms123456 <85141075+zmshahaha@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:17:00 +0800 Subject: [PATCH 02/51] [components][dfs]separate dfs fs data structure ops (#9205) separate dfs fs data structure ops --- .../dfs/dfs_v2/filesystems/devfs/devtmpfs.c | 50 +++++++------------ .../dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c | 35 +++++-------- .../dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.h | 4 +- components/dfs/dfs_v2/include/dfs_vfs.h | 50 +++++++++++++++++++ 4 files changed, 83 insertions(+), 56 deletions(-) create mode 100644 components/dfs/dfs_v2/include/dfs_vfs.h diff --git a/components/dfs/dfs_v2/filesystems/devfs/devtmpfs.c b/components/dfs/dfs_v2/filesystems/devfs/devtmpfs.c index 3bea0c16dfa..82ab422529b 100644 --- a/components/dfs/dfs_v2/filesystems/devfs/devtmpfs.c +++ b/components/dfs/dfs_v2/filesystems/devfs/devtmpfs.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -34,10 +35,9 @@ struct devtmpfs_file char name[DIRENT_NAME_MAX]; /* file name */ rt_uint32_t type; /* file type */ - rt_list_t subdirs; /* file subdir list */ - rt_list_t sibling; /* file sibling list */ + struct dfs_vfs_node node; /* file node in the devtmpfs */ - struct devtmpfs_sb *sb; /* superblock ptr */ + struct devtmpfs_sb *sb; /* superblock ptr */ rt_uint32_t mode; char *link; @@ -48,7 +48,6 @@ struct devtmpfs_sb rt_uint32_t magic; /* TMPFS_MAGIC */ struct devtmpfs_file root; /* root dir */ rt_size_t df_size; /* df size */ - rt_list_t sibling; /* sb sibling list */ struct rt_spinlock lock; /* tmpfs lock */ }; @@ -111,15 +110,13 @@ static int _get_subdir(const char *path, char *name) #if 0 static int _free_subdir(struct devtmpfs_file *dfile) { - struct devtmpfs_file *file; - rt_list_t *list, *temp_list; + struct devtmpfs_file *file, *tmp; struct devtmpfs_sb *superblock; RT_ASSERT(dfile->type == TMPFS_TYPE_DIR); - rt_list_for_each_safe(list, temp_list, &dfile->subdirs) + dfs_vfs_for_each_subnode(file, tmp, dfile, node) { - file = rt_list_entry(list, struct devtmpfs_file, sibling); if (file->type == TMPFS_TYPE_DIR) { _free_subdir(file); @@ -134,7 +131,7 @@ static int _free_subdir(struct devtmpfs_file *dfile) RT_ASSERT(superblock); rt_spin_lock(&superblock->lock); - rt_list_remove(&(file->sibling)); + dfs_vfs_remove_node(&file->node); rt_spin_unlock(&superblock->lock); rt_free(file); @@ -152,14 +149,12 @@ static int devtmpfs_mount(struct dfs_mnt *mnt, unsigned long rwflag, const void { superblock->df_size = sizeof(struct devtmpfs_sb); superblock->magic = TMPFS_MAGIC; - rt_list_init(&superblock->sibling); superblock->root.name[0] = '/'; superblock->root.sb = superblock; superblock->root.type = TMPFS_TYPE_DIR; superblock->root.mode = S_IFDIR | (S_IRUSR | S_IRGRP | S_IROTH) | (S_IXUSR | S_IXGRP | S_IXOTH); - rt_list_init(&superblock->root.sibling); - rt_list_init(&superblock->root.subdirs); + dfs_vfs_init_node(&superblock->root.node); rt_spin_lock_init(&superblock->lock); @@ -193,8 +188,7 @@ static struct devtmpfs_file *devtmpfs_file_lookup(struct devtmpfs_sb *superblock { const char *subpath, *curpath, *filename = RT_NULL; char subdir_name[DIRENT_NAME_MAX]; - struct devtmpfs_file *file, *curfile; - rt_list_t *list; + struct devtmpfs_file *file, *curfile, *tmp; subpath = path; while (*subpath == '/' && *subpath) @@ -222,9 +216,8 @@ static struct devtmpfs_file *devtmpfs_file_lookup(struct devtmpfs_sb *superblock rt_spin_lock(&superblock->lock); - rt_list_for_each(list, &curfile->subdirs) + dfs_vfs_for_each_subnode(file, tmp, curfile, node) { - file = rt_list_entry(list, struct devtmpfs_file, sibling); if (filename) /* find file */ { if (rt_strcmp(file->name, filename) == 0) @@ -293,7 +286,9 @@ static int devtmpfs_stat(struct dfs_dentry *dentry, struct stat *st) static int devtmpfs_getdents(struct dfs_file *file, struct dirent *dirp, uint32_t count) { - struct devtmpfs_file *d_file; + rt_size_t index, end; + struct dirent *d; + struct devtmpfs_file *d_file, *n_file = RT_NULL, *tmp; struct devtmpfs_sb *superblock; RT_ASSERT(file); @@ -306,11 +301,6 @@ static int devtmpfs_getdents(struct dfs_file *file, struct dirent *dirp, uint32_ d_file = devtmpfs_file_lookup(superblock, file->dentry->pathname); if (d_file) { - rt_size_t index, end; - struct dirent *d; - struct devtmpfs_file *n_file; - rt_list_t *list; - /* make integer count */ count = (count / sizeof(struct dirent)); if (count == 0) @@ -322,12 +312,10 @@ static int devtmpfs_getdents(struct dfs_file *file, struct dirent *dirp, uint32_ index = 0; count = 0; - rt_list_for_each(list, &d_file->subdirs) + dfs_vfs_for_each_subnode(n_file, tmp, d_file, node) { if (index >= (rt_size_t)file->fpos) { - n_file = rt_list_entry(list, struct devtmpfs_file, sibling); - d = dirp + count; if (n_file->type == TMPFS_TYPE_FILE) { @@ -378,8 +366,7 @@ static int devtmpfs_symlink(struct dfs_dentry *parent_dentry, const char *target strncpy(l_file->name, linkpath, DIRENT_NAME_MAX - 1); - rt_list_init(&(l_file->subdirs)); - rt_list_init(&(l_file->sibling)); + dfs_vfs_init_node(&l_file->node); l_file->sb = superblock; l_file->type = TMPFS_TYPE_FILE; l_file->mode = p_file->mode; @@ -388,7 +375,7 @@ static int devtmpfs_symlink(struct dfs_dentry *parent_dentry, const char *target l_file->link = rt_strdup(target); rt_spin_lock(&superblock->lock); - rt_list_insert_after(&(p_file->subdirs), &(l_file->sibling)); + dfs_vfs_append_node(&p_file->node, &l_file->node); rt_spin_unlock(&superblock->lock); } } @@ -460,7 +447,7 @@ static int devtmpfs_unlink(struct dfs_dentry *dentry) } rt_spin_lock(&superblock->lock); - rt_list_remove(&(d_file->sibling)); + dfs_vfs_remove_node(&d_file->node); rt_spin_unlock(&superblock->lock); rt_free(d_file); @@ -537,8 +524,7 @@ static struct dfs_vnode *devtmpfs_create_vnode(struct dfs_dentry *dentry, int ty strncpy(d_file->name, file_name, DIRENT_NAME_MAX); - rt_list_init(&(d_file->subdirs)); - rt_list_init(&(d_file->sibling)); + dfs_vfs_init_node(&d_file->node); d_file->sb = superblock; vnode->nlink = 1; @@ -563,7 +549,7 @@ static struct dfs_vnode *devtmpfs_create_vnode(struct dfs_dentry *dentry, int ty d_file->mode = vnode->mode; rt_spin_lock(&superblock->lock); - rt_list_insert_after(&(p_file->subdirs), &(d_file->sibling)); + dfs_vfs_append_node(&p_file->node, &d_file->node); rt_spin_unlock(&superblock->lock); } diff --git a/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c b/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c index 1c2a5094756..c1ff4a122b0 100644 --- a/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c +++ b/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c @@ -99,15 +99,13 @@ static int _get_subdir(const char *path, char *name) static int _free_subdir(struct tmpfs_file *dfile) { - struct tmpfs_file *file; - rt_list_t *list, *temp_list; + struct tmpfs_file *file = RT_NULL, *tmp; struct tmpfs_sb *superblock; RT_ASSERT(dfile->type == TMPFS_TYPE_DIR); - rt_list_for_each_safe(list, temp_list, &dfile->subdirs) + dfs_vfs_for_each_subnode(file, tmp, dfile, node) { - file = rt_list_entry(list, struct tmpfs_file, sibling); if (file->type == TMPFS_TYPE_DIR) { _free_subdir(file); @@ -122,7 +120,7 @@ static int _free_subdir(struct tmpfs_file *dfile) RT_ASSERT(superblock != NULL); rt_spin_lock(&superblock->lock); - rt_list_remove(&(file->sibling)); + dfs_vfs_remove_node(&file->node); rt_spin_unlock(&superblock->lock); rt_free(file); @@ -141,13 +139,11 @@ static int dfs_tmpfs_mount(struct dfs_mnt *mnt, { superblock->df_size = sizeof(struct tmpfs_sb); superblock->magic = TMPFS_MAGIC; - rt_list_init(&superblock->sibling); superblock->root.name[0] = '/'; superblock->root.sb = superblock; superblock->root.type = TMPFS_TYPE_DIR; - rt_list_init(&superblock->root.sibling); - rt_list_init(&superblock->root.subdirs); + dfs_vfs_init_node(&superblock->root.node); rt_spin_lock_init(&superblock->lock); @@ -236,8 +232,7 @@ struct tmpfs_file *dfs_tmpfs_lookup(struct tmpfs_sb *superblock, { const char *subpath, *curpath, *filename = RT_NULL; char subdir_name[TMPFS_NAME_MAX]; - struct tmpfs_file *file, *curfile; - rt_list_t *list; + struct tmpfs_file *file, *curfile, *tmp; subpath = path; while (*subpath == '/' && *subpath) @@ -265,9 +260,8 @@ struct tmpfs_file *dfs_tmpfs_lookup(struct tmpfs_sb *superblock, rt_spin_lock(&superblock->lock); - rt_list_for_each(list, &curfile->subdirs) + dfs_vfs_for_each_subnode(file, tmp, curfile, node) { - file = rt_list_entry(list, struct tmpfs_file, sibling); if (filename) /* find file */ { if (rt_strcmp(file->name, filename) == 0) @@ -503,8 +497,7 @@ static int dfs_tmpfs_getdents(struct dfs_file *file, { rt_size_t index, end; struct dirent *d; - struct tmpfs_file *d_file, *n_file; - rt_list_t *list; + struct tmpfs_file *d_file, *n_file, *tmp; struct tmpfs_sb *superblock; d_file = (struct tmpfs_file *)file->vnode->data; @@ -527,9 +520,8 @@ static int dfs_tmpfs_getdents(struct dfs_file *file, index = 0; count = 0; - rt_list_for_each(list, &d_file->subdirs) + dfs_vfs_for_each_subnode(n_file, tmp, d_file, node) { - n_file = rt_list_entry(list, struct tmpfs_file, sibling); if (index >= (rt_size_t)file->fpos) { d = dirp + count; @@ -573,7 +565,7 @@ static int dfs_tmpfs_unlink(struct dfs_dentry *dentry) return -ENOENT; rt_spin_lock(&superblock->lock); - rt_list_remove(&(d_file->sibling)); + dfs_vfs_remove_node(&d_file->node); rt_spin_unlock(&superblock->lock); if (rt_atomic_load(&(dentry->ref_count)) == 1) @@ -631,13 +623,13 @@ static int dfs_tmpfs_rename(struct dfs_dentry *old_dentry, struct dfs_dentry *ne RT_ASSERT(p_file != NULL); rt_spin_lock(&superblock->lock); - rt_list_remove(&(d_file->sibling)); + dfs_vfs_remove_node(&d_file->node); rt_spin_unlock(&superblock->lock); strncpy(d_file->name, file_name, TMPFS_NAME_MAX); rt_spin_lock(&superblock->lock); - rt_list_insert_after(&(p_file->subdirs), &(d_file->sibling)); + dfs_vfs_append_node(&p_file->node, &d_file->node); rt_spin_unlock(&superblock->lock); rt_free(parent_path); @@ -745,8 +737,7 @@ static struct dfs_vnode *dfs_tmpfs_create_vnode(struct dfs_dentry *dentry, int t strncpy(d_file->name, file_name, TMPFS_NAME_MAX); - rt_list_init(&(d_file->subdirs)); - rt_list_init(&(d_file->sibling)); + dfs_vfs_init_node(&d_file->node); d_file->data = NULL; d_file->size = 0; d_file->sb = superblock; @@ -767,7 +758,7 @@ static struct dfs_vnode *dfs_tmpfs_create_vnode(struct dfs_dentry *dentry, int t #endif } rt_spin_lock(&superblock->lock); - rt_list_insert_after(&(p_file->subdirs), &(d_file->sibling)); + dfs_vfs_append_node(&p_file->node, &d_file->node); rt_spin_unlock(&superblock->lock); vnode->mnt = dentry->mnt; diff --git a/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.h b/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.h index 365f1e0d42c..8f822c6f780 100644 --- a/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.h +++ b/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.h @@ -12,6 +12,7 @@ #define __DFS_TMPFS_H__ #include +#include #define TMPFS_NAME_MAX 32 #define TMPFS_MAGIC 0x0B0B0B0B @@ -25,8 +26,7 @@ struct tmpfs_file { rt_uint32_t type; /* file type */ char name[TMPFS_NAME_MAX]; /* file name */ - rt_list_t subdirs; /* file subdir list */ - rt_list_t sibling; /* file sibling list */ + struct dfs_vfs_node node; /* file node in the tmpfs */ struct tmpfs_sb *sb; /* superblock ptr */ rt_uint8_t *data; /* file date ptr */ rt_size_t size; /* file size */ diff --git a/components/dfs/dfs_v2/include/dfs_vfs.h b/components/dfs/dfs_v2/include/dfs_vfs.h new file mode 100644 index 00000000000..36741920441 --- /dev/null +++ b/components/dfs/dfs_v2/include/dfs_vfs.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#ifndef __DFS_VFS_H__ +#define __DFS_VFS_H__ + +#include "dfs_file.h" +#include "dfs_fs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +struct dfs_vfs_node +{ + rt_list_t subnode; /* file subnode list */ + rt_list_t sibling; /* file sibling list */ +}; + +rt_inline void dfs_vfs_init_node(struct dfs_vfs_node *node) +{ + rt_list_init(&node->subnode); + rt_list_init(&node->sibling); +} + +rt_inline void dfs_vfs_append_node(struct dfs_vfs_node *dir, struct dfs_vfs_node *node) +{ + rt_list_insert_after(&(dir->subnode), &(node->sibling)); +} + +rt_inline void dfs_vfs_remove_node(struct dfs_vfs_node *node) +{ + rt_list_remove(&(node->sibling)); +} + +#define dfs_vfs_for_each_subnode(node, tmp, dir, member) \ + rt_list_for_each_entry_safe(node, tmp, &dir->member.subnode, member.sibling) + +#ifdef __cplusplus +} +#endif + +#endif /*__DFS_VFS_H__*/ From 4343d32df4c563a52d596e8b5558d90c6d5a9f39 Mon Sep 17 00:00:00 2001 From: zms123456 <85141075+zmshahaha@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:18:39 +0800 Subject: [PATCH 03/51] [components][fs]sync procfs (#9206) * add procfs * fix ref count check error --- components/dfs/Kconfig | 3 + .../dfs/dfs_v2/filesystems/procfs/README.md | 166 ++++ .../dfs/dfs_v2/filesystems/procfs/SConscript | 11 + .../dfs/dfs_v2/filesystems/procfs/proc.c | 733 ++++++++++++++++++ .../dfs/dfs_v2/filesystems/procfs/proc.h | 75 ++ .../dfs_v2/filesystems/procfs/proc_cmdline.c | 53 ++ .../dfs_v2/filesystems/procfs/proc_cpuinfo.c | 86 ++ .../dfs_v2/filesystems/procfs/proc_devices.c | 307 ++++++++ .../filesystems/procfs/proc_filesystems.c | 85 ++ .../dfs_v2/filesystems/procfs/proc_loadavg.c | 41 + .../dfs_v2/filesystems/procfs/proc_meminfo.c | 66 ++ .../dfs_v2/filesystems/procfs/proc_mounts.c | 101 +++ .../dfs/dfs_v2/filesystems/procfs/proc_net.c | 107 +++ .../filesystems/procfs/proc_partitions.c | 215 +++++ .../dfs/dfs_v2/filesystems/procfs/proc_pid.c | 449 +++++++++++ .../dfs/dfs_v2/filesystems/procfs/proc_self.c | 66 ++ .../dfs/dfs_v2/filesystems/procfs/proc_stat.c | 114 +++ .../dfs/dfs_v2/filesystems/procfs/proc_tty.c | 100 +++ .../dfs_v2/filesystems/procfs/proc_uptime.c | 38 + .../dfs_v2/filesystems/procfs/proc_version.c | 45 ++ .../dfs/dfs_v2/filesystems/procfs/procfs.c | 447 +++++++++++ .../dfs/dfs_v2/filesystems/procfs/procfs.h | 19 + 22 files changed, 3327 insertions(+) create mode 100644 components/dfs/dfs_v2/filesystems/procfs/README.md create mode 100644 components/dfs/dfs_v2/filesystems/procfs/SConscript create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc.h create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_cmdline.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_cpuinfo.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_devices.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_filesystems.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_loadavg.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_meminfo.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_mounts.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_net.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_partitions.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_pid.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_self.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_stat.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_tty.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_uptime.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/proc_version.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/procfs.c create mode 100644 components/dfs/dfs_v2/filesystems/procfs/procfs.h diff --git a/components/dfs/Kconfig b/components/dfs/Kconfig index 2c7ae22267f..9b2f1b40de8 100644 --- a/components/dfs/Kconfig +++ b/components/dfs/Kconfig @@ -185,6 +185,9 @@ if RT_USING_SMART bool "Using Pseudo-Teletype Filesystem (UNIX98 PTY)" depends on RT_USING_DFS_DEVFS default y + config RT_USING_DFS_PROCFS + bool "Enable proc file system" + default n endif config RT_USING_DFS_CROMFS diff --git a/components/dfs/dfs_v2/filesystems/procfs/README.md b/components/dfs/dfs_v2/filesystems/procfs/README.md new file mode 100644 index 00000000000..7ab01272910 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/README.md @@ -0,0 +1,166 @@ +# 进程文件系统 (procfs) + +## 数据结构 + +```c +struct proc_dentry +{ + rt_uint32_t mode; + rt_atomic_t ref_count; + + struct proc_dentry *parent; + struct dfs_vfs_node node; + + const struct dfs_file_ops *fops; + const struct proc_ops *ops; + + char *name; + void *data; +}; +``` + +```log +root { mode: S_IFDIR, ref_count: 1, parent: root, name: /, child->next: file1->node } + | + |—— file1 { mode: S_IFREG, ref_count: 1, parent: root, name: file1, node->next: link1->node } + |—— link1 { mode: S_IFLNK, ref_count: 1, parent: root, name: link1, data: fullpath, node->next: dir1->node } + |—— dir1 { mode: S_IFDIR, ref_count: 1, parent: root, name: dir1, node->next: file3->node, child->next: file2->node } + | | + | |—— dir2 { mode: S_IFDIR, ref_count: 1, parent: dir1, name: dir2, node->next: link2->node } + | |—— link2 { mode: S_IFLNK, ref_count: 1, parent: dir1, name: link2, data: fullpath, node->next: file2->node } + | |—— file2 { mode: S_IFREG, ref_count: 1, parent: dir1, name: file2 } + | + |—— file3 { mode: S_IFREG, ref_count: 1, parent: root, name: file3 } +``` + +## API 介绍 + +```c +struct proc_dentry *dfs_proc_find(const char *name); + +struct proc_dentry *proc_mkdir_data(const char *name, mode_t mode, struct proc_dentry *parent, + const struct dfs_file_ops *fops, void *data); +struct proc_dentry *proc_mkdir_mode(const char *name, mode_t mode, struct proc_dentry *parent); +struct proc_dentry *proc_mkdir(const char *name, struct proc_dentry *parent); + +struct proc_dentry *proc_create_data(const char *name, mode_t mode, struct proc_dentry *parent, + const struct dfs_file_ops *fops, void *data); + +struct proc_dentry *proc_symlink(const char *name, struct proc_dentry *parent, const char *dest); + +struct proc_dentry *proc_acquire(struct proc_dentry *dentry); +void proc_release(struct proc_dentry *dentry); + +void proc_remove(struct proc_dentry *dentry); +``` + +- dfs_proc_find + + 查找指定节点,并返回节点数据指针 + + | 入参 | 说明 | + | ---- | ---------------------------------------------------- | + | name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2” | + +- proc_mkdir_data + + 创建一个目录,并返回节点数据指针 + + | 入参 | 说明 | + | ------ | ------------------------------------------------------------ | + | name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”
从 parent 起始的完整路径 | + | mode | 权限配置 | + | parent | 指定创建目录的起始节点 | + | fops | 文件操作接口配置 | + | data | 私有数据 | + +- proc_mkdir_mode + + 创建一个目录,并返回节点数据指针 + + | 入参 | 说明 | + | ------ | ------------------------------------------------------------ | + | name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”
从 parent 起始的完整路径 | + | mode | 权限配置 | + | parent | 指定创建目录的起始节点 | + +- proc_mkdir + + 创建一个目录,并返回节点数据指针 + + | 入参 | 说明 | + | ---- | ------------------------------------------------------------ | + | name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”
从 parent 起始的完整路径 | + | mode | 权限配置 | + +- proc_create_data + + 创建一个文件,并返回节点数据指针 + + | 入参 | 说明 | + | ------ | ------------------------------------------------------------ | + | name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”
从 parent 起始的完整路径 | + | mode | 权限配置 | + | parent | 指定创建文件的起始节点 | + | fops | 文件操作接口配置 | + | data | 私有数据 | + +- proc_symlink + + 创建一个符号链接,并返回节点数据指针 + + | 入参 | 说明 | + | ------ | ------------------------------------------------------------ | + | name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”
从 parent 起始的完整路径 | + | parent | 指定创建文件的起始节点 | + | dest | 链接的目标文件完整路径 | + +- proc_acquire + + 引用一个节点,并返回节点数据指针 + + | 入参 | 说明 | + | ------ | -------------- | + | dentry | 需要引用的节点 | + +- proc_release + + 释放一个节点 + + | 入参 | 说明 | + | ------ | -------------- | + | dentry | 需要释放的节点 | + +- proc_remove + + 删除一个节点包含子节点 + + | 入参 | 说明 | + | ------ | -------------- | + | dentry | 需要删除的节点 | + +## msh 调试命令 + +- proc_dump + + 遍历打印指定节点含子节点的信息(名称、引用计数),比如 `proc_dump /dir1` 或者 `proc_dump` + +- proc_remove + + 删除指定节点含子节点,比如 `proc_remove /dir1` 或者 `proc_remove /file3` + +- proc_symlink + + 创建一个符号链接,`proc_symlink /link3 /mnt` + +- proc_echo + + 创建一个空文件,`proc_echo /file4` + +- proc_mkdir + + 创建一个空目录,`proc_mkdir /dir3` + +- proc_pid + + 创建一个 pid 目录,`proc_pid /101` diff --git a/components/dfs/dfs_v2/filesystems/procfs/SConscript b/components/dfs/dfs_v2/filesystems/procfs/SConscript new file mode 100644 index 00000000000..4af49a1b719 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/SConscript @@ -0,0 +1,11 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Filesystem', src, depend = ['RT_USING_DFS', 'RT_USING_DFS_PROCFS'], CPPPATH = CPPPATH) + +Return('group') diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc.c b/components/dfs/dfs_v2/filesystems/procfs/proc.c new file mode 100644 index 00000000000..0e0d2025da9 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc.c @@ -0,0 +1,733 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +/* + * This is the root in the proc tree.. + */ +static struct proc_dentry _proc_root = { + .mode = S_IFDIR | (S_IRUSR | S_IRGRP | S_IROTH) | (S_IXUSR | S_IXGRP | S_IXOTH), + .ref_count = 1, + + .parent = &_proc_root, + .node.sibling = RT_LIST_OBJECT_INIT(_proc_root.node.sibling), + .node.subnode = RT_LIST_OBJECT_INIT(_proc_root.node.subnode), + + .fops = RT_NULL, + + .name = "/", + .data = RT_NULL, +}; + +static int _proc_find(struct proc_dentry **parent, const char *name) +{ + struct proc_dentry *dentry = RT_NULL, *tmp; + + dfs_vfs_for_each_subnode(dentry, tmp, (*parent), node) + { + if (dentry == RT_NULL) + { + break; + } + + if (rt_strcmp(dentry->name, name) == 0) + { + *parent = dentry; + return 0; + } + } + + return -1; +} + +static int proc_find(struct proc_dentry **parent, const char **name, rt_bool_t force_lookup) +{ + int ret = 0; + char *tmp = RT_NULL; + + if (!(*parent)) + { + *parent = &_proc_root; + } + + tmp = rt_strdup(*name); + if (tmp) + { + char *begin = tmp, *end = RT_NULL; + if (*begin == '/') + { + begin++; + if (*begin == '\0') + { + rt_free(tmp); + *parent = proc_acquire(*parent); + return ret; + } + } + + while (1) + { + end = rt_strstr(begin, "/"); + if (end) + { + *end = '\0'; + ret = _proc_find(parent, begin); + if (ret < 0 || !S_ISDIR((*parent)->mode)) + { + *parent = RT_NULL; + ret = -1; + break; + } + begin = end + 1; + } + else if (force_lookup) + { + ret = _proc_find(parent, begin); + if (ret < 0) + { + if ((*parent)->ops && (*parent)->ops->lookup) + { + *parent = (*parent)->ops->lookup(*parent, begin); + if (*parent == RT_NULL) + { + ret = -1; + } + } + else + { + *parent = RT_NULL; + } + } + else + { + *parent = proc_acquire(*parent); + } + break; + } + else + { + *parent = proc_acquire(*parent); + break; + } + } + + *name = *name + (begin - tmp); + + rt_free(tmp); + } + + return ret; +} + +static void *single_start(struct dfs_seq_file *seq, off_t *index) +{ + return NULL + (*index == 0); +} + +static void *single_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + ++*index; + return NULL; +} + +static void single_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static int proc_open(struct dfs_file *file) +{ + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + if (entry->single_show) + { + struct dfs_seq_ops *seq_ops = (struct dfs_seq_ops *)rt_calloc(1, sizeof(struct dfs_seq_ops)); + if (seq_ops) + { + int ret = 0; + + seq_ops->start = single_start; + seq_ops->next = single_next; + seq_ops->stop = single_stop; + seq_ops->show = entry->single_show; + + ret = dfs_seq_open(file, seq_ops); + if (ret != 0) + { + rt_free(seq_ops); + } + return ret; + } + } + + return dfs_seq_open(file, entry->seq_ops); +} + +static int proc_close(struct dfs_file *file) +{ + struct dfs_seq_file *seq = file->data; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + if (seq && entry->single_show && seq->ops) + { + rt_free((void *)seq->ops); + seq->ops = RT_NULL; + } + + return dfs_seq_release(file); +} + +static const struct dfs_file_ops proc_file_ops = { + .open = proc_open, + .read = dfs_seq_read, + .lseek = dfs_seq_lseek, + .close = proc_close, +}; + +static struct proc_dentry *proc_create(struct proc_dentry **parent, const char *name, mode_t mode) +{ + int ret = 0; + struct proc_dentry *dentry = RT_NULL; + + ret = proc_find(parent, &name, 0); + if (ret >= 0) + { + dentry = *parent; + ret = proc_find(&dentry, &name, 1); + if (ret < 0) + { + dentry = rt_calloc(1, sizeof(struct proc_dentry)); + if (dentry) + { + dentry->mode = mode; + dentry->ref_count = 1; + dentry->name = rt_strdup(name); + dfs_vfs_init_node(&dentry->node); + } + } + else + { + proc_release(dentry); + dentry = RT_NULL; + } + } + + return dentry; +} + +/** + * @brief The dentry reference count is incremented by one + * + * @param dentry + * + * @return dentry + */ +struct proc_dentry *proc_acquire(struct proc_dentry *dentry) +{ + if (dentry) + { + dentry->ref_count += 1; + } + + return dentry; +} + +/** + * @brief The dentry reference count is minus one, or release + * + * @param dentry + * + * @return none + */ +void proc_release(struct proc_dentry *dentry) +{ + if (dentry) + { + if (dentry->ref_count == 1) + { + if (dentry->name) + { + rt_free(dentry->name); + } + + if (S_ISLNK(dentry->mode) && dentry->data) + { + rt_free(dentry->data); + } + + rt_free(dentry); + } + else + { + dentry->ref_count -= 1; + } + } +} + +static struct proc_dentry *proc_register(struct proc_dentry *parent, struct proc_dentry *child) +{ + child->parent = parent; + dfs_vfs_append_node(&parent->node, &child->node); + child->ref_count += 1; + child->pid = parent->pid; + + return child; +} + +/** + * @brief Make a dir + * + * @param name fullpath based on _proc_root or parent + * @param mode permission configuration + * @param parent can be empty + * @param fops + * @param data + * + * @return dentry + */ +struct proc_dentry *proc_mkdir_data(const char *name, mode_t mode, struct proc_dentry *parent, + const struct dfs_file_ops *fops, void *data) +{ + struct proc_dentry *dentry, *_parent = parent; + + if (mode == 0) + mode = (S_IRUSR | S_IRGRP | S_IROTH) | (S_IXUSR | S_IXGRP | S_IXOTH); + + dentry = proc_create(&_parent, name, S_IFDIR | mode); + if (dentry) + { + dentry->fops = fops; + dentry->data = data; + + dentry = proc_register(_parent, dentry); + } + proc_release(_parent); + + return dentry; +} + +/** + * @brief Make a dir + * + * @param name fullpath based on _proc_root or parent + * @param mode permission configuration + * @param parent can be empty + * + * @return dentry + */ +struct proc_dentry *proc_mkdir_mode(const char *name, mode_t mode, struct proc_dentry *parent) +{ + return proc_mkdir_data(name, mode, parent, NULL, NULL); +} + +/** + * @brief Make a dir + * + * @param name fullpath based on _proc_root or parent + * @param parent can be empty + * + * @return dentry + */ +struct proc_dentry *proc_mkdir(const char *name, struct proc_dentry *parent) +{ + return proc_mkdir_data(name, 0, parent, NULL, NULL); +} + +static struct proc_dentry *proc_create_reg(const char *name, mode_t mode, struct proc_dentry **parent) +{ + struct proc_dentry *dentry = RT_NULL; + + if ((mode & S_IFMT) == 0) + mode |= S_IFREG; + if ((mode & (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)) == 0) + mode |= S_IRUSR | S_IRGRP | S_IROTH; + + if (!S_ISREG(mode)) + { + *parent = RT_NULL; + return dentry; + } + + return proc_create(parent, name, mode); +} + +/** + * @brief Make a file + * + * @param name fullpath based on _proc_root or parent + * @param mode permission configuration + * @param parent can be empty + * @param fops + * @param data + * + * @return dentry + */ +struct proc_dentry *proc_create_data(const char *name, mode_t mode, struct proc_dentry *parent, + const struct dfs_file_ops *fops, void *data) +{ + struct proc_dentry *dentry, *_parent = parent; + + dentry = proc_create_reg(name, mode, &_parent); + if (dentry) + { + dentry->fops = fops ? fops : &proc_file_ops; + dentry->data = data; + + dentry = proc_register(_parent, dentry); + } + proc_release(_parent); + + return dentry; +} + +/** + * @brief Make a file + * + * @param name fullpath based on _proc_root or parent + * @param mode permission configuration + * @param parent can be empty + * @param show + * @param data + * + * @return dentry + */ +struct proc_dentry *proc_create_single_data(const char *name, mode_t mode, struct proc_dentry *parent, + int (*show)(struct dfs_seq_file *, void *), void *data) +{ + struct proc_dentry *dentry, *_parent = parent; + + dentry = proc_create_reg(name, mode, &_parent); + if (dentry) + { + dentry->fops = &proc_file_ops; + dentry->single_show = show; + dentry->data = data; + + dentry = proc_register(_parent, dentry); + } + proc_release(_parent); + + return dentry; +} + +/** + * @brief Make a symlink + * + * @param name fullpath based on _proc_root or parent + * @param parent can be empty + * @param dest link file fullpath + * + * @return dentry + */ +struct proc_dentry *proc_symlink(const char *name, struct proc_dentry *parent, const char *dest) +{ + struct proc_dentry *dentry, *_parent = parent; + + dentry = proc_create(&_parent, name, (S_IFLNK | (S_IRUSR | S_IRGRP | S_IROTH) + | (S_IWUSR | S_IWGRP | S_IWOTH) | (S_IXUSR | S_IXGRP | S_IXOTH))); + if (dentry) + { + dentry->data = (void *)rt_strdup(dest); + if (dentry->data) + { + dentry = proc_register(_parent, dentry); + } + else + { + proc_release(dentry); + dentry = NULL; + } + } + proc_release(_parent); + + return dentry; +} + +static void remove_proc_subtree(struct proc_dentry *dentry) +{ + struct proc_dentry *iter = RT_NULL, *iter_tmp, *tmp = RT_NULL; + + dfs_vfs_for_each_subnode(iter, iter_tmp, dentry, node) + { + if (iter == RT_NULL) + { + break; + } + + if (tmp) + { + proc_release(tmp); + tmp = RT_NULL; + } + + tmp = iter; + + if (S_ISDIR(dentry->mode)) + { + remove_proc_subtree(iter); + } + } + + if (tmp) + { + proc_release(tmp); + tmp = RT_NULL; + } +} + +/** + * @brief remove a dentry + * + * @param dentry + * + * @return none + */ +void proc_remove(struct proc_dentry *dentry) +{ + if (dentry && dentry != &_proc_root) + { + if (S_ISDIR(dentry->mode)) + { + remove_proc_subtree(dentry); + } + + dfs_vfs_remove_node(&dentry->node); + proc_release(dentry); + } +} + +/** + * @brief find dentry exist + * + * @param name fullpath based on _proc_root + * + * @return dentry + */ +struct proc_dentry *dfs_proc_find(const char *name) +{ + struct proc_dentry *dentry = RT_NULL; + + proc_find(&dentry, &name, 1); + + return dentry; +} + +/** + * @brief remove a dentry on parent + * + * @param name fullpath based on parent + * @param parent + * + * @return none + */ +void proc_remove_dentry(const char *name, struct proc_dentry *parent) +{ + struct proc_dentry *dentry = parent; + + if (proc_find(&dentry, &name, 1) >= 0) + { + proc_remove(dentry); + proc_release(dentry); + } +} + +#define _COLOR_RED "\033[31m" +#define _COLOR_GREEN "\033[32m" +#define _COLOR_BLUE "\033[34m" +#define _COLOR_CYAN "\033[36m" +#define _COLOR_WHITE "\033[37m" +#define _COLOR_NORMAL "\033[0m" + +static void dump_proc_subtree(struct proc_dentry *dentry, int tab) +{ + struct proc_dentry *iter = RT_NULL, *tmp; + + dfs_vfs_for_each_subnode(iter, tmp, dentry, node) + { + if (iter == RT_NULL) + { + break; + } + + for(int i = 0; i < tab; i ++) + { + rt_kprintf("%-4s", i + 1 >= tab ? "|-" : " "); + } + + if (S_ISDIR(iter->mode)) + { + rt_kprintf(_COLOR_BLUE "%-20s" _COLOR_NORMAL " %d\n", iter->name, iter->ref_count); + dump_proc_subtree(iter, tab + 1); + } + else if (S_ISLNK(iter->mode)) + { + rt_kprintf(_COLOR_CYAN "%-20s" _COLOR_NORMAL " %d\n", iter->name, iter->ref_count); + } + else + { + rt_kprintf("%-20s %d\n", iter->name, iter->ref_count); + } + } +} + +static void proc_dump(struct proc_dentry *dentry) +{ + if (dentry) + { + if (S_ISDIR(dentry->mode)) + { + rt_kprintf(_COLOR_BLUE "%-20s" _COLOR_NORMAL " %d\n", dentry->name, dentry->ref_count); + dump_proc_subtree(dentry, 1); + } + else if (S_ISLNK(dentry->mode)) + { + rt_kprintf(_COLOR_CYAN "%-20s" _COLOR_NORMAL " %d\n", dentry->name, dentry->ref_count); + } + else + { + rt_kprintf("%-20s %d\n", dentry->name, dentry->ref_count); + } + } +} + +static int msh_proc_dump(int argc, char** argv) +{ + const char *name = argc > 1 ? argv[1] : "/"; + struct proc_dentry *dentry = RT_NULL; + + int ret = proc_find(&dentry, &name, 1); + if (ret >= 0) + { + proc_dump(dentry); + } + proc_release(dentry); + + return 0; +} +MSH_CMD_EXPORT_ALIAS(msh_proc_dump, proc_dump, proc dump); + +static int msh_proc_remove(int argc, char** argv) +{ + if (argc > 1) + { + const char *name = argv[1]; + struct proc_dentry *dentry = RT_NULL; + + int ret = proc_find(&dentry, &name, 1); + if (ret >= 0) + { + if (dentry != &_proc_root) + { + proc_remove(dentry); + } + else + { + struct proc_dentry *iter = RT_NULL, *iter_tmp, *tmp = RT_NULL; + + dfs_vfs_for_each_subnode(iter, iter_tmp, dentry, node) + { + if (iter == RT_NULL) + { + break; + } + + if (tmp) + { + proc_remove(tmp); + } + + tmp = iter; + } + + if (tmp) + { + proc_remove(tmp); + } + } + } + proc_release(dentry); + } + else + { + rt_kprintf("proc_remove path\n"); + } + + return 0; +} +MSH_CMD_EXPORT_ALIAS(msh_proc_remove, proc_remove, proc remove); + +static int msh_proc_symlink(int argc, char** argv) +{ + if (argc > 2) + { + struct proc_dentry *entry = proc_symlink(argv[1], 0, argv[2]); + if (entry) + { + proc_release(entry); + } + } + else + { + rt_kprintf("proc_symlink path dest\n"); + } + + return 0; +} +MSH_CMD_EXPORT_ALIAS(msh_proc_symlink, proc_symlink, proc symlink); + +static int msh_proc_echo(int argc, char** argv) +{ + if (argc > 1) + { + for(int i = 1; i <= argc - 1; i ++) + { + struct proc_dentry *entry = proc_create_data(argv[i], 0, 0, 0, 0); + if (entry) + { + proc_release(entry); + } + } + } + else + { + rt_kprintf("proc_echo path\n"); + } + + return 0; +} +MSH_CMD_EXPORT_ALIAS(msh_proc_echo, proc_echo, proc echo); + +static int msh_proc_mkdir(int argc, char** argv) +{ + if (argc > 1) + { + for(int i = 1; i <= argc - 1; i ++) + { + struct proc_dentry *entry = proc_mkdir(argv[i], 0); + if (entry) + { + proc_release(entry); + } + } + } + else + { + rt_kprintf("proc_mkdir path\n"); + } + + return 0; +} +MSH_CMD_EXPORT_ALIAS(msh_proc_mkdir, proc_mkdir, proc mkdir); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc.h b/components/dfs/dfs_v2/filesystems/procfs/proc.h new file mode 100644 index 00000000000..e697860e22e --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#ifndef __PROC_H__ +#define __PROC_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +struct proc_dentry; + +struct proc_ops +{ + struct proc_dentry *(*lookup)(struct proc_dentry *parent, const char *name); + int (*readlink)(struct proc_dentry *dentry, char *buf, int len); +}; + +struct proc_dentry +{ + rt_uint32_t mode; + rt_atomic_t ref_count; + + struct proc_dentry *parent; + struct dfs_vfs_node node; + + const struct dfs_file_ops *fops; + const struct proc_ops *ops; + const struct dfs_seq_ops *seq_ops; + int (*single_show)(struct dfs_seq_file *seq, void *data); + + int pid; + + char *name; + void *data; +}; + +struct proc_dentry *dfs_proc_find(const char *name); + +struct proc_dentry *proc_mkdir_data(const char *name, mode_t mode, struct proc_dentry *parent, + const struct dfs_file_ops *fops, void *data); +struct proc_dentry *proc_mkdir_mode(const char *name, mode_t mode, struct proc_dentry *parent); +struct proc_dentry *proc_mkdir(const char *name, struct proc_dentry *parent); + +struct proc_dentry *proc_create_data(const char *name, mode_t mode, struct proc_dentry *parent, + const struct dfs_file_ops *fops, void *data); +struct proc_dentry *proc_create_single_data(const char *name, mode_t mode, struct proc_dentry *parent, + int (*show)(struct dfs_seq_file *, void *), void *data); + +struct proc_dentry *proc_symlink(const char *name, struct proc_dentry *parent, const char *dest); + +struct proc_dentry *proc_acquire(struct proc_dentry *dentry); +void proc_release(struct proc_dentry *dentry); + +void proc_remove(struct proc_dentry *dentry); +void proc_remove_dentry(const char *name, struct proc_dentry *parent); + +int proc_pid(int pid); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_cmdline.c b/components/dfs/dfs_v2/filesystems/procfs/proc_cmdline.c new file mode 100644 index 00000000000..5845b5ff883 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_cmdline.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include + +static char *__proc_cmdline = NULL; + +int proc_cmdline_save(const char *cmdline) +{ + if (__proc_cmdline) + { + free(__proc_cmdline); + __proc_cmdline = NULL; + } + + __proc_cmdline = strdup(cmdline); + + return 0; +} + +static int single_show(struct dfs_seq_file *seq, void *data) +{ + if (__proc_cmdline) + { + dfs_seq_puts(seq, __proc_cmdline); + } + + return 0; +} + +int proc_cmdline_init(void) +{ + struct proc_dentry *dentry = proc_create_single_data("cmdline", 0, NULL, single_show, NULL); + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_cmdline_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_cpuinfo.c b/components/dfs/dfs_v2/filesystems/procfs/proc_cpuinfo.c new file mode 100644 index 00000000000..6f498329928 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_cpuinfo.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include + +static void *seq_start(struct dfs_seq_file *seq, off_t *index) +{ + off_t i = *index; // seq->index + + return NULL + (i == 0); +} + +static void seq_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static void *seq_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + /* data: The return value of the start or next*/ + off_t i = *index + 1; // seq->index + + *index = i; + + return NULL; +} + +static int seq_show(struct dfs_seq_file *seq, void *data) +{ + /* data: The return value of the start or next*/ + dfs_seq_puts(seq, "rt_weak const struct dfs_seq_ops *cpuinfo_get_seq_ops(void)\n--need your own function--\n"); + + return 0; +} + +static const struct dfs_seq_ops seq_ops = { + .start = seq_start, + .stop = seq_stop, + .next = seq_next, + .show = seq_show, +}; + +rt_weak const struct dfs_seq_ops *cpuinfo_get_seq_ops(void) +{ + return &seq_ops; +} + +static int proc_open(struct dfs_file *file) +{ + return dfs_seq_open(file, cpuinfo_get_seq_ops()); +} + +static int proc_close(struct dfs_file *file) +{ + return dfs_seq_release(file); +} + +static const struct dfs_file_ops file_ops = { + .open = proc_open, + .read = dfs_seq_read, + .lseek = dfs_seq_lseek, + .close = proc_close, +}; + +int proc_cpuinfo_init(void) +{ + struct proc_dentry *dentry = proc_create_data("cpuinfo", 0, NULL, &file_ops, NULL); + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_cpuinfo_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_devices.c b/components/dfs/dfs_v2/filesystems/procfs/proc_devices.c new file mode 100644 index 00000000000..7bd07187d09 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_devices.c @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include +#include +#include +#include + + +#define LIST_FIND_OBJ_NR 8 + +struct device_show +{ + char *buf; + int size; + int len; + int index; +}; + +typedef struct +{ + rt_list_t *list; + rt_list_t **array; + rt_uint8_t type; + int nr; /* input: max nr, can't be 0 */ + int nr_out; /* out: got nr */ +} list_get_next_t; + +static void list_find_init(list_get_next_t *p, rt_uint8_t type, rt_list_t **array, int nr) +{ + struct rt_object_information *info; + rt_list_t *list; + + info = rt_object_get_information((enum rt_object_class_type)type); + list = &info->object_list; + + p->list = list; + p->type = type; + p->array = array; + p->nr = nr; + p->nr_out = 0; +} + +static rt_list_t *list_get_next(rt_list_t *current, list_get_next_t *arg) +{ + int first_flag = 0; + rt_base_t level; + rt_list_t *node, *list; + rt_list_t **array; + struct rt_object_information *info; + int nr; + + arg->nr_out = 0; + + if (!arg->nr || !arg->type) + { + return (rt_list_t *)RT_NULL; + } + + list = arg->list; + info = rt_list_entry(list, struct rt_object_information, object_list); + + if (!current) /* find first */ + { + node = list; + first_flag = 1; + } + else + { + node = current; + } + + level = rt_spin_lock_irqsave(&info->spinlock); + + if (!first_flag) + { + struct rt_object *obj; + /* The node in the list? */ + obj = rt_list_entry(node, struct rt_object, list); + if ((obj->type & ~RT_Object_Class_Static) != arg->type) + { + rt_spin_unlock_irqrestore(&info->spinlock, level); + return (rt_list_t *)RT_NULL; + } + } + + nr = 0; + array = arg->array; + while (1) + { + node = node->next; + + if (node == list) + { + node = (rt_list_t *)RT_NULL; + break; + } + nr++; + *array++ = node; + if (nr == arg->nr) + { + break; + } + } + + rt_spin_unlock_irqrestore(&info->spinlock, level); + arg->nr_out = nr; + return node; +} + +static char *const device_type_str[RT_Device_Class_Unknown] = +{ + "Character Device", + "Block Device", + "Network Interface", + "MTD Device", + "CAN Device", + "RTC", + "Sound Device", + "Graphic Device", + "I2C Bus", + "USB Slave Device", + "USB Host Bus", + "USB OTG Bus", + "SPI Bus", + "SPI Device", + "SDIO Bus", + "PM Pseudo Device", + "Pipe", + "Portal Device", + "Timer Device", + "Miscellaneous Device", + "Sensor Device", + "Touch Device", + "Phy Device", + "Security Device", + "WLAN Device", + "Pin Device", + "ADC Device", + "DAC Device", + "WDT Device", + "PWM Device", + "Bus Device", +}; + +static void save_info(struct device_show *dev, char *dev_name) +{ + char tmp[256] = {0}; + int len; + + dev->index ++; + + rt_snprintf(tmp, 256, "%d %s\n", dev->index, dev_name); + tmp[255] = 0; + + len = rt_strlen(tmp); + if (dev->size > dev->len + len) + { + strcat(dev->buf, tmp); + dev->len += len; + } + else + { + if (dev->buf == RT_NULL) + { + dev->buf = rt_calloc(1, 4096); + } + else + { + dev->buf = rt_realloc(dev->buf, dev->size + 4096); + } + if (dev->buf) + { + dev->size += 4096; + strcat(dev->buf, tmp); + dev->len += len; + } + } +} + +static void list_device(struct device_show *dev) +{ + rt_base_t level; + list_get_next_t find_arg; + struct rt_object_information *info; + rt_list_t *obj_list[LIST_FIND_OBJ_NR]; + rt_list_t *next = (rt_list_t *)RT_NULL; + + list_find_init(&find_arg, RT_Object_Class_Device, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); + info = rt_list_entry(find_arg.list, struct rt_object_information, object_list); + + do + { + next = list_get_next(next, &find_arg); + { + int i; + for (i = 0; i < find_arg.nr_out; i++) + { + struct rt_object *obj; + struct rt_device *device; + + obj = rt_list_entry(obj_list[i], struct rt_object, list); + level = rt_spin_lock_irqsave(&info->spinlock); + if ((obj->type & ~RT_Object_Class_Static) != find_arg.type) + { + rt_spin_unlock_irqrestore(&info->spinlock, level); + continue; + } + + rt_spin_unlock_irqrestore(&info->spinlock, level); + + device = (struct rt_device *)obj; + + if (device->type < RT_Device_Class_Unknown) + { + save_info(dev + device->type, device->parent.name); + } + } + } + } + while (next != (rt_list_t *)RT_NULL); +} + +static int show_info(struct dfs_seq_file *seq) +{ + struct device_show _show[RT_Device_Class_Unknown] = {0}; + + list_device(_show); + + for (int i = 0; i < RT_Device_Class_Unknown; i++) + { + if (_show[i].buf) + { + dfs_seq_printf(seq, "%s:\n", device_type_str[i]); + dfs_seq_write(seq, _show[i].buf, _show[i].len); + dfs_seq_putc(seq, '\n'); + + rt_free(_show[i].buf); + } + } + + return 0; +} + +static void *seq_start(struct dfs_seq_file *seq, off_t *index) +{ + off_t i = *index; // seq->index + + return NULL + (i == 0); +} + +static void seq_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static void *seq_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + /* data: The return value of the start or next*/ + off_t i = *index + 1; // seq->index + + *index = i; + + return NULL; +} + +static int seq_show(struct dfs_seq_file *seq, void *data) +{ + /* data: The return value of the start or next*/ + show_info(seq); + + return 0; +} + +static const struct dfs_seq_ops seq_ops = { + .start = seq_start, + .stop = seq_stop, + .next = seq_next, + .show = seq_show, +}; + +int proc_devices_init(void) +{ + struct proc_dentry *dentry = proc_create_data("devices", 0, NULL, NULL, NULL); + if (dentry) + { + dentry->seq_ops = &seq_ops; + } + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_devices_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_filesystems.c b/components/dfs/dfs_v2/filesystems/procfs/proc_filesystems.c new file mode 100644 index 00000000000..94e7a858d5a --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_filesystems.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include +#include + +static void *seq_start(struct dfs_seq_file *seq, off_t *index) +{ + off_t i = *index; // seq->index + struct dfs_filesystem_type *fs = dfs_filesystems(); + + if (fs) + { + while (i--) + { + fs = fs->next; + if (!fs) + { + break; + } + } + } + + return fs; +} + +static void seq_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static void *seq_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + /* data: The return value of the start or next*/ + off_t i = *index + 1; // seq->index + struct dfs_filesystem_type *fs = (struct dfs_filesystem_type *)data; + + *index = i; + + return fs->next; +} + +static int seq_show(struct dfs_seq_file *seq, void *data) +{ + /* data: The return value of the start or next*/ + struct dfs_filesystem_type *fs = (struct dfs_filesystem_type *)data; + + dfs_seq_printf(seq, "%-9s%s\n", (fs->fs_ops->flags == FS_NEED_DEVICE) ? "" : "nodev", fs->fs_ops->name); + + return 0; +} + +static const struct dfs_seq_ops seq_ops = { + .start = seq_start, + .stop = seq_stop, + .next = seq_next, + .show = seq_show, +}; + +int proc_filesystems_init(void) +{ + struct proc_dentry *dentry = proc_create_data("filesystems", 0, NULL, NULL, NULL); + if (dentry) + { + dentry->seq_ops = &seq_ops; + } + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_filesystems_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_loadavg.c b/components/dfs/dfs_v2/filesystems/procfs/proc_loadavg.c new file mode 100644 index 00000000000..6ce1bc487a7 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_loadavg.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include +#include + + +extern void rt_memory_info(rt_size_t *total, + rt_size_t *used, + rt_size_t *max_used); + +static int single_show(struct dfs_seq_file *seq, void *data) +{ + dfs_seq_printf(seq, "0.13 0.16 0.17 1/1035 380436\n"); + + return 0; +} + +int proc_loadavg_init(void) +{ + struct proc_dentry *dentry = proc_create_single_data("loadavg", 0, NULL, single_show, NULL); + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_loadavg_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_meminfo.c b/components/dfs/dfs_v2/filesystems/procfs/proc_meminfo.c new file mode 100644 index 00000000000..b6ae56288f4 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_meminfo.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include +#include + + +extern void rt_memory_info(rt_size_t *total, + rt_size_t *used, + rt_size_t *max_used); + +static int single_show(struct dfs_seq_file *seq, void *data) +{ + rt_size_t total, used, max_used, freed; + rt_size_t total_sum = 0; + rt_size_t total_freed = 0; + + rt_memory_info(&total, &used, &max_used); + total_sum = total_sum + total; + total_freed = total_freed + total - used; + + dfs_seq_printf(seq, "%-16s%8d KB\n", "MemMaxUsed:", max_used / 1024); + dfs_seq_printf(seq, "%-16s%8d KB\n", "MemAvailable:", (total - used) / 1024); + dfs_seq_printf(seq, "%-16s%8d KB\n", "Cached:", 0); + dfs_seq_printf(seq, "%-16s%8d KB\n", "SReclaimable:", 0); + + rt_page_get_info(&total, &freed); + total_sum = total_sum + total * RT_MM_PAGE_SIZE; + total_freed = total_freed + freed * RT_MM_PAGE_SIZE; + + dfs_seq_printf(seq, "%-16s%8d KB\n", "MemTotal:", total_sum / 1024); + dfs_seq_printf(seq, "%-16s%8d KB\n", "MemFree:", total_freed / 1024); + dfs_seq_printf(seq, "%-16s%8d KB\n", "LowPageTotal:", total * RT_MM_PAGE_SIZE / 1024); + dfs_seq_printf(seq, "%-16s%8d KB\n", "lowPageFree:", freed * RT_MM_PAGE_SIZE/ 1024); + + rt_page_high_get_info(&total, &freed); + + dfs_seq_printf(seq, "%-16s%8d KB\n", "HighPageTotal:", total * RT_MM_PAGE_SIZE / 1024); + dfs_seq_printf(seq, "%-16s%8d KB\n", "HighPageFree:", freed * RT_MM_PAGE_SIZE / 1024); + + return 0; +} + +int proc_meminfo_init(void) +{ + struct proc_dentry *dentry = proc_create_single_data("meminfo", 0, NULL, single_show, NULL); + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_meminfo_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_mounts.c b/components/dfs/dfs_v2/filesystems/procfs/proc_mounts.c new file mode 100644 index 00000000000..49a6ba99c6b --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_mounts.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include +#include + + +const char *mnt_flag(int flag) +{ + /*if (flag & MNT_READONLY) + { + return "ro"; + }*/ + + return "rw"; +} + +static struct dfs_mnt* mnt_show(struct dfs_mnt *mnt, void *parameter) +{ + struct dfs_seq_file *seq = (struct dfs_seq_file *)parameter; + + if (mnt) + { + if (mnt->dev_id) + { + dfs_seq_printf(seq, "%s %s %s %s 0 0\n", mnt->dev_id->parent.name, mnt->fullpath, + mnt->fs_ops->name, mnt_flag(mnt->flags)); + } + else + { + dfs_seq_printf(seq, "%s %s %s %s 0 0\n", mnt->fs_ops->name, mnt->fullpath, + mnt->fs_ops->name, mnt_flag(mnt->flags)); + } + } + + return RT_NULL; +} + +static void *seq_start(struct dfs_seq_file *seq, off_t *index) +{ + off_t i = *index; // seq->index + + return NULL + (i == 0); +} + +static void seq_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static void *seq_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + /* data: The return value of the start or next*/ + off_t i = *index + 1; // seq->index + + *index = i; + + return NULL; +} + +static int seq_show(struct dfs_seq_file *seq, void *data) +{ + /* data: The return value of the start or next*/ + dfs_mnt_foreach(mnt_show, seq); + + return 0; +} + +static const struct dfs_seq_ops seq_ops = { + .start = seq_start, + .stop = seq_stop, + .next = seq_next, + .show = seq_show, +}; + +int proc_mounts_init(void) +{ + struct proc_dentry *dentry = proc_create_data("mounts", 0, NULL, NULL, NULL); + if (dentry) + { + dentry->seq_ops = &seq_ops; + } + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_mounts_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_net.c b/components/dfs/dfs_v2/filesystems/procfs/proc_net.c new file mode 100644 index 00000000000..e2b38e0c8db --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_net.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include + +#ifdef RT_USING_LWIP +#include "lwip/opt.h" +#endif + +#if LWIP_ROUTE +extern int inet_route_foreach(void (*func)(const char *name, uint32_t ip_addr, uint32_t netmask, void *parameter), void *parameter); +#endif + +static void *seq_start(struct dfs_seq_file *seq, off_t *index) +{ + off_t i = *index; // seq->index + + return NULL + (i == 0); +} + +static void seq_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static void *seq_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + /* data: The return value of the start or next*/ + off_t i = *index + 1; // seq->index + + *index = i; + + return NULL; +} + +static void route_show(const char *name, uint32_t ip_addr, uint32_t netmask, void *parameter) +{ + struct dfs_seq_file *seq = (struct dfs_seq_file *)parameter; + /* "Iface\tDestination\tGateway " + "\tFlags\tRefCnt\tUse\tMetric\tMask\t\tMTU" + "\tWindow\tIRTT"); */ + /* "%63s%lx%lx%X%d%d%d%lx%d%d%d\n" */ + dfs_seq_printf(seq, "%s ", name); + dfs_seq_printf(seq, "%lx ", ip_addr); + dfs_seq_printf(seq, "%lx ", 0); + dfs_seq_printf(seq, "%X ", 1); + dfs_seq_printf(seq, "%d ", 0); + dfs_seq_printf(seq, "%d ", 0); + dfs_seq_printf(seq, "%d ", 0); + dfs_seq_printf(seq, "%lx ", netmask); + dfs_seq_printf(seq, "%d ", 0); + dfs_seq_printf(seq, "%d ", 0); + dfs_seq_printf(seq, "%d\n", 0); +} + +static int seq_show(struct dfs_seq_file *seq, void *data) +{ + /* data: The return value of the start or next*/ + dfs_seq_printf(seq, "\n"); +#if LWIP_ROUTE + inet_route_foreach(route_show, seq); +#endif + + return 0; +} + +static const struct dfs_seq_ops seq_ops = { + .start = seq_start, + .stop = seq_stop, + .next = seq_next, + .show = seq_show, +}; + +int proc_net_init(void) +{ + struct proc_dentry *dentry; + + dentry = proc_mkdir("net", NULL); + if (!dentry) + return -1; + + proc_release(dentry); + + dentry = proc_create_data("net/route", 0, NULL, NULL, NULL); + if (dentry) + { + dentry->seq_ops = &seq_ops; + } + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_net_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_partitions.c b/components/dfs/dfs_v2/filesystems/procfs/proc_partitions.c new file mode 100644 index 00000000000..1c7a48a3651 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_partitions.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include +#include +#include +#include + + +#define LIST_FIND_OBJ_NR 8 + +typedef struct +{ + rt_list_t *list; + rt_list_t **array; + rt_uint8_t type; + int nr; /* input: max nr, can't be 0 */ + int nr_out; /* out: got nr */ +} list_get_next_t; + +static void list_find_init(list_get_next_t *p, rt_uint8_t type, rt_list_t **array, int nr) +{ + struct rt_object_information *info; + rt_list_t *list; + + info = rt_object_get_information((enum rt_object_class_type)type); + list = &info->object_list; + + p->list = list; + p->type = type; + p->array = array; + p->nr = nr; + p->nr_out = 0; +} + +static rt_list_t *list_get_next(rt_list_t *current, list_get_next_t *arg) +{ + int first_flag = 0; + rt_base_t level; + rt_list_t *node, *list; + rt_list_t **array; + struct rt_object_information *info; + int nr; + + arg->nr_out = 0; + + if (!arg->nr || !arg->type) + { + return (rt_list_t *)RT_NULL; + } + + list = arg->list; + info = rt_list_entry(list, struct rt_object_information, object_list); + + if (!current) /* find first */ + { + node = list; + first_flag = 1; + } + else + { + node = current; + } + + level = rt_spin_lock_irqsave(&info->spinlock); + + if (!first_flag) + { + struct rt_object *obj; + /* The node in the list? */ + obj = rt_list_entry(node, struct rt_object, list); + if ((obj->type & ~RT_Object_Class_Static) != arg->type) + { + rt_spin_unlock_irqrestore(&info->spinlock, level); + return (rt_list_t *)RT_NULL; + } + } + + nr = 0; + array = arg->array; + while (1) + { + node = node->next; + + if (node == list) + { + node = (rt_list_t *)RT_NULL; + break; + } + nr++; + *array++ = node; + if (nr == arg->nr) + { + break; + } + } + + rt_spin_unlock_irqrestore(&info->spinlock, level); + arg->nr_out = nr; + return node; +} + +static int show_info(struct dfs_seq_file *seq) +{ + rt_base_t level; + list_get_next_t find_arg; + struct rt_object_information *info; + rt_list_t *obj_list[LIST_FIND_OBJ_NR]; + rt_list_t *next = (rt_list_t *)RT_NULL; + + list_find_init(&find_arg, RT_Object_Class_Device, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); + info = rt_list_entry(find_arg.list, struct rt_object_information, object_list); + + do + { + next = list_get_next(next, &find_arg); + { + int i; + for (i = 0; i < find_arg.nr_out; i++) + { + struct rt_object *obj; + struct rt_device *device; + + obj = rt_list_entry(obj_list[i], struct rt_object, list); + level = rt_spin_lock_irqsave(&info->spinlock); + if ((obj->type & ~RT_Object_Class_Static) != find_arg.type) + { + rt_spin_unlock_irqrestore(&info->spinlock, level); + continue; + } + + rt_spin_unlock_irqrestore(&info->spinlock, level); + + device = (struct rt_device *)obj; + + if (device->type == RT_Device_Class_Block) + { + struct rt_device_blk_geometry geometry = { 0 }; + + rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry); + + dfs_seq_printf(seq, "%4d %7d %14llu %s\n", 0, 0, + geometry.sector_count, device->parent.name); + } + } + } + } while (next != (rt_list_t *)RT_NULL); + + return 0; +} + +static void *seq_start(struct dfs_seq_file *seq, off_t *index) +{ + off_t i = *index; // seq->index + + return NULL + (i == 0); +} + +static void seq_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static void *seq_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + /* data: The return value of the start or next*/ + off_t i = *index + 1; // seq->index + + *index = i; + + return NULL; +} + +static int seq_show(struct dfs_seq_file *seq, void *data) +{ + dfs_seq_puts(seq, "major minor #blocks name\n\n"); + /* data: The return value of the start or next*/ + show_info(seq); + + return 0; +} + +static const struct dfs_seq_ops seq_ops = { + .start = seq_start, + .stop = seq_stop, + .next = seq_next, + .show = seq_show, +}; + +int proc_partitions_init(void) +{ + struct proc_dentry *dentry = proc_create_data("partitions", 0, NULL, NULL, NULL); + if (dentry) + { + dentry->seq_ops = &seq_ops; + } + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_partitions_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_pid.c b/components/dfs/dfs_v2/filesystems/procfs/proc_pid.c new file mode 100644 index 00000000000..a413f646c83 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_pid.c @@ -0,0 +1,449 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ +#define __RT_IPC_SOURCE__ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include "lwp_internal.h" +#include +#include "lwp_internal.h" + +#if defined(RT_USING_SMART) + +#include "lwp.h" +#include "lwp_pid.h" +#include + +struct pid_dentry +{ + const char *name; + mode_t mode; + const struct dfs_file_ops *fops; + const struct proc_ops *ops; + const struct dfs_seq_ops *seq_ops; + int (*single_show)(struct dfs_seq_file *seq, void *data); + void *data; +}; + +static char stat_transform(int __stat) +{ + switch (__stat) + { + case RT_THREAD_RUNNING: + return 'R'; + default: + return 'T'; + } +} + +static int stat_single_show(struct dfs_seq_file *seq, void *data) +{ + struct proc_dentry *dentry = (struct proc_dentry *)seq->file->vnode->data; + rt_list_t *list; + int mask = 0; + rt_thread_t thread; + rt_uint64_t user_time_lwp = 0; + rt_uint64_t system_time_lwp = 0; + int lwp_oncpu = RT_CPUS_NR; + int lwp_oncpu_ok = 0; + struct rt_lwp *lwp = RT_NULL; + char** argv = RT_NULL; + char *filename = RT_NULL; + char *dot = RT_NULL; + + lwp_pid_lock_take(); + + lwp = lwp_from_pid_locked(dentry->pid); + argv = lwp_get_command_line_args(lwp); + + if (lwp) + { + dfs_seq_printf(seq,"%d ",dentry->pid); + if (argv) + { + filename = strrchr(argv[0], '/'); + dot = strchr(argv[0], '.'); + + if (filename != NULL) + { + filename++; + } + else + { + filename = argv[0]; + } + + if (dot != NULL) + { + *dot = '\0'; + } + + if (filename != NULL) + { + dfs_seq_printf(seq,"(%s) ", filename); + } + else + { + dfs_seq_printf(seq,"(%s) ", argv[0]); + } + + lwp_free_command_line_args(argv); + } + else + { + dfs_seq_printf(seq,"(%s) ", ""); + } + + if (lwp->terminated) + { + dfs_seq_printf(seq,"%c ",'Z'); + } + else + { + list = lwp->t_grp.next; + while (list != &lwp->t_grp) + { + thread = rt_list_entry(list, struct rt_thread, sibling); + user_time_lwp = user_time_lwp + thread->user_time; + system_time_lwp = system_time_lwp + thread->system_time; + + #if RT_CPUS_NR > 1 + #define ONCPU(thread) RT_SCHED_CTX(thread).oncpu + #else + #define ONCPU(thread) 0 + #endif + if (lwp_oncpu_ok == 0) + { + lwp_oncpu = ONCPU(thread); + lwp_oncpu_ok = 1; + } + if (stat_transform(RT_SCHED_CTX(thread).stat) == 'R') + { + lwp_oncpu = ONCPU(thread); + mask = 1; + } + list = list->next; + } + + if (mask == 1) + { + dfs_seq_printf(seq,"%c ",'R'); + } + else + { + dfs_seq_printf(seq,"%c ",'S'); + } + } + lwp_pid_lock_release(); + + if (lwp->parent != NULL) + dfs_seq_printf(seq,"%d ",lwp->parent->pid); + else + dfs_seq_printf(seq,"0 "); + + dfs_seq_printf(seq, "1 1 0 -1 4194560 48245 133976064 732 425574 "); + dfs_seq_printf(seq,"%llu ",user_time_lwp);//utime + dfs_seq_printf(seq,"%llu ",system_time_lwp);//stime + dfs_seq_printf(seq, "1204291 518742 20 0 1 0 50 "); + dfs_seq_printf(seq, "%d ",rt_aspace_count_vsz(lwp->aspace));//VSZ + dfs_seq_printf(seq, "1422 18446744073709551615 "); + dfs_seq_printf(seq, "1 1 0 0 0 0 671173123 4096 1260 0 0 0 17 "); + dfs_seq_printf(seq, "%d ", lwp_oncpu);//CPU + dfs_seq_printf(seq, "0 0 0 0 0 0 0 0 0 0 0 0 0"); + dfs_seq_printf(seq,"\n"); + } + else + { + lwp_pid_lock_release(); + } + + return 0; +} + +static int cmdline_single_show(struct dfs_seq_file *seq, void *data) +{ + struct proc_dentry *dentry = (struct proc_dentry *)seq->file->vnode->data; + struct rt_lwp *lwp; + char** argv; + + lwp_pid_lock_take(); + lwp = lwp_from_pid_locked(dentry->pid); + argv = lwp_get_command_line_args(lwp); + lwp_pid_lock_release(); + + if (argv) + { + for (int i = 0; argv[i] != NULL; i++) + { + dfs_seq_printf(seq, "%s ", argv[i]); + } + dfs_seq_puts(seq, "\n"); + + lwp_free_command_line_args(argv); + } + else + { + dfs_seq_puts(seq, "error\n"); + } + + return 0; +} + +struct proc_dentry *proc_pid_fd_lookup(struct proc_dentry *parent, const char *name) +{ + struct proc_dentry *dentry = RT_NULL; + char num[DIRENT_NAME_MAX]; + struct rt_lwp *lwp; + struct dfs_fdtable *table; + + lwp_pid_lock_take(); + lwp = lwp_from_pid_locked(parent->pid); + table = lwp ? &lwp->fdt : RT_NULL; + lwp_pid_lock_release(); + + if (!table) + { + return RT_NULL; + } + + dfs_file_lock(); + for (int i = 0; i < table->maxfd; i++) + { + struct dfs_file *file = table->fds[i]; + if (file) + { + rt_snprintf(num, DIRENT_NAME_MAX, "%d", i); + if (rt_strcmp(num, name) == 0) + { + dentry = rt_calloc(1, sizeof(struct proc_dentry)); + if (dentry) + { + dentry->mode = (S_IFLNK | (S_IRUSR | S_IRGRP | S_IROTH) | (S_IWUSR | S_IWGRP | S_IWOTH) | (S_IXUSR | S_IXGRP | S_IXOTH)); + dentry->ref_count = 1; + dentry->name = rt_strdup(name); + dentry->data = (void *)dfs_dentry_full_path(file->dentry); + + if (dentry->data == RT_NULL) + { + //todo add vnode->data + if (file->vnode->type == FT_SOCKET) + dentry->data = (void *)rt_strdup("socket"); + else if (file->vnode->type == FT_USER) + dentry->data = (void *)rt_strdup("user"); + else if (file->vnode->type == FT_DEVICE) + dentry->data = (void *)rt_strdup("device"); + else + dentry->data = (void *)rt_strdup("unknown"); + } + + dentry->pid = parent->pid; + break; + } + } + } + } + dfs_file_unlock(); + + return dentry; +} + +int proc_pid_fd_getdents(struct dfs_file *file, struct dirent *dirp, uint32_t count) +{ + int ret = 0, index = 0; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + struct rt_lwp *lwp; + struct dfs_fdtable *table; + + lwp_pid_lock_take(); + lwp = lwp_from_pid_locked(entry->pid); + LWP_LOCK(lwp); + table = lwp ? &lwp->fdt : RT_NULL; + + if (!table->fds) + { + LWP_UNLOCK(lwp); + lwp_pid_lock_release(); + return 0; + } + + count = (count / sizeof(struct dirent)); + if (count == 0) + { + LWP_UNLOCK(lwp); + lwp_pid_lock_release(); + return -EINVAL; + } + + dfs_file_lock(); + for (int i = 0; i < table->maxfd; i++) + { + struct dfs_file *df = table->fds[i]; + if (df) + { + if (index >= file->fpos) + { + struct dirent *d = dirp + index - file->fpos; + + d->d_type = DT_SYMLINK; + d->d_reclen = (rt_uint16_t)sizeof(struct dirent); + rt_snprintf(d->d_name, DIRENT_NAME_MAX, "%d", i); + d->d_namlen = rt_strlen(d->d_name); + + ret++; + } + + index++; + if (index - file->fpos >= count) + { + break; + } + } + } + dfs_file_unlock(); + LWP_UNLOCK(lwp); + lwp_pid_lock_release(); + + if (ret > 0) + { + file->fpos = index; + ret = ret * sizeof(struct dirent); + } + + return ret; +} + +static const struct proc_ops proc_pid_fd_ops = { + .lookup = proc_pid_fd_lookup, +}; + +static const struct dfs_file_ops proc_pid_fd_fops = { + .getdents = proc_pid_fd_getdents, +}; + +int proc_pid_exe_readlink(struct proc_dentry *dentry, char *buf, int len) +{ + struct rt_lwp *lwp; + + lwp = lwp_self(); + len = rt_snprintf(buf, len, "%s", lwp ? lwp->exe_file : "null"); + + return len; +} + +static const struct proc_ops proc_pid_exe_ops = { + .readlink = proc_pid_exe_readlink, +}; + +int proc_pid_cwd_readlink(struct proc_dentry *dentry, char *buf, int len) +{ + struct rt_lwp *lwp; + + lwp = lwp_self(); + len = rt_snprintf(buf, len, "%s", lwp ? lwp->working_directory : "null"); + + return len; +} + +static const struct proc_ops proc_pid_cwd_ops = { + .readlink = proc_pid_cwd_readlink, +}; + +static struct pid_dentry pid_dentry_base[] = { + {"cmdline", S_IFREG | S_IRUSR | S_IRGRP | S_IROTH, 0, 0, 0, cmdline_single_show, 0}, + {"cwd", S_IFLNK | S_IRUSR | S_IXUSR, 0, &proc_pid_cwd_ops, 0, 0}, + {"exe", S_IFLNK | S_IRUSR | S_IXUSR, 0, &proc_pid_exe_ops, 0, 0}, + {"fd", S_IFDIR | S_IRUSR | S_IXUSR, &proc_pid_fd_fops, &proc_pid_fd_ops, 0, 0, 0}, + {"mounts", S_IFLNK | S_IRUSR | S_IXUSR, 0, 0, 0, 0, "/proc/mounts"}, + {"stat", S_IFREG | S_IRUSR | S_IRGRP | S_IROTH, 0, 0, 0, stat_single_show, 0}, +}; + +int proc_pid(int pid) +{ + char pid_str[64] = {0}; + struct proc_dentry *dentry; + + rt_snprintf(pid_str, 64, "%d", pid); + pid_str[63] = 0; + + dentry = proc_mkdir(pid_str, 0); + if (dentry) + { + struct proc_dentry *ent; + + dentry->pid = pid; + for (int j = 0; j < sizeof(pid_dentry_base) / sizeof(struct pid_dentry); j++) + { + if (S_ISDIR(pid_dentry_base[j].mode)) + { + ent = proc_mkdir_data(pid_dentry_base[j].name, pid_dentry_base[j].mode, dentry, + pid_dentry_base[j].fops, pid_dentry_base[j].data); + } + else if (S_ISLNK(pid_dentry_base[j].mode)) + { + if (pid_dentry_base[j].data == RT_NULL) + { + pid_dentry_base[j].data = "NULL"; + } + + ent = proc_symlink(pid_dentry_base[j].name, dentry, pid_dentry_base[j].data); + } + else + { + ent = proc_create_data(pid_dentry_base[j].name, pid_dentry_base[j].mode, dentry, + pid_dentry_base[j].fops, pid_dentry_base[j].data); + } + + if (ent) + { + if (pid_dentry_base[j].ops) + { + ent->ops = pid_dentry_base[j].ops; + } + + if (pid_dentry_base[j].seq_ops) + { + ent->seq_ops = pid_dentry_base[j].seq_ops; + } + + if (pid_dentry_base[j].single_show) + { + ent->single_show = pid_dentry_base[j].single_show; + } + + proc_release(ent); + } + } + proc_release(dentry); + } + + return 0; +} + +int msh_proc_pid(int argc, char **argv) +{ + if (argc > 1) + { + for (int i = 1; i <= argc - 1; i++) + { + proc_pid(atoi(argv[i])); + } + } + + return 0; +} +MSH_CMD_EXPORT_ALIAS(msh_proc_pid, proc_pid, proc pid); + +#endif diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_self.c b/components/dfs/dfs_v2/filesystems/procfs/proc_self.c new file mode 100644 index 00000000000..a1082ea1923 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_self.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include + +#if defined(RT_USING_SMART) + +#include + + +int proc_self_readlink(struct proc_dentry *dentry, char *buf, int len) +{ + struct rt_lwp *lwp = RT_NULL; + + lwp = lwp_self(); + if (lwp) + { + rt_snprintf(buf, len, "%d", lwp_to_pid(lwp)); + buf[len - 1] = 0; + return rt_strlen(buf); + } + else + { + rt_snprintf(buf, len, "null"); + buf[len - 1] = 0; + return rt_strlen(buf); + } + + return -1; +} + +static const struct proc_ops proc_pid_fd_ops = { + .readlink = proc_self_readlink, +}; + +int proc_self_init(void) +{ + struct proc_dentry *ent; + + ent = proc_symlink("self", NULL, "NULL"); + if (ent) + { + ent->ops = &proc_pid_fd_ops; + } + proc_release(ent); + + return 0; +} +INIT_ENV_EXPORT(proc_self_init); + +#endif diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_stat.c b/components/dfs/dfs_v2/filesystems/procfs/proc_stat.c new file mode 100644 index 00000000000..aeba99de513 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_stat.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include + + +static void *seq_start(struct dfs_seq_file *seq, off_t *index) +{ + off_t i = *index; // seq->index + + return NULL + (i == 0); +} + +static void seq_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static void *seq_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + /* data: The return value of the start or next*/ + off_t i = *index + 1; // seq->index + + *index = i; + + return NULL; +} + +static int seq_show(struct dfs_seq_file *seq, void *data) +{ + int i; + rt_cpu_t pcpu; + rt_uint64_t user_total = 0; + rt_uint64_t system_total = 0; + rt_uint64_t idle_total = 0; + + for (i = 0; i < RT_CPUS_NR; i++) + { + pcpu = rt_cpu_index(i); + user_total = user_total + pcpu->cpu_stat.user; + system_total = system_total + pcpu->cpu_stat.system; + idle_total = idle_total + pcpu->cpu_stat.idle; + } + dfs_seq_printf(seq, "cpu %llu 0 %llu %llu 0 0 0 0 0 0\n", user_total, system_total, idle_total); + + for (i = 0; i < RT_CPUS_NR; i++) + { + pcpu = rt_cpu_index(i); + dfs_seq_printf(seq, "cpu%d ",i); + dfs_seq_printf(seq, "%llu ",pcpu->cpu_stat.user);//user + dfs_seq_printf(seq, "0 ");//nice + dfs_seq_printf(seq, "%llu ",pcpu->cpu_stat.system);//system + dfs_seq_printf(seq, "%llu ",pcpu->cpu_stat.idle);//idle + dfs_seq_printf(seq, "0 ");//iowait + dfs_seq_printf(seq, "0 ");//irq + dfs_seq_printf(seq, "0 ");//softirq + dfs_seq_printf(seq, "0 0 0\n");//steal,guest,guest_nice + + } + + return 0; +} + +static const struct dfs_seq_ops seq_ops = { + .start = seq_start, + .stop = seq_stop, + .next = seq_next, + .show = seq_show, +}; + +rt_weak const struct dfs_seq_ops *stat_get_seq_ops(void) +{ + return &seq_ops; +} + +static int proc_open(struct dfs_file *file) +{ + return dfs_seq_open(file, stat_get_seq_ops()); +} + +static int proc_close(struct dfs_file *file) +{ + return dfs_seq_release(file); +} + +static const struct dfs_file_ops file_ops = { + .open = proc_open, + .read = dfs_seq_read, + .lseek = dfs_seq_lseek, + .close = proc_close, +}; + +int proc_stat_init(void) +{ + struct proc_dentry *dentry = proc_create_data("stat", 0, NULL, &file_ops, NULL); + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_stat_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_tty.c b/components/dfs/dfs_v2/filesystems/procfs/proc_tty.c new file mode 100644 index 00000000000..dc77e4cecb6 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_tty.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include + + +static void *seq_start(struct dfs_seq_file *seq, off_t *index) +{ + off_t i = *index; // seq->index + + return NULL + (i == 0); +} + +static void seq_stop(struct dfs_seq_file *seq, void *data) +{ +} + +static void *seq_next(struct dfs_seq_file *seq, void *data, off_t *index) +{ + /* data: The return value of the start or next*/ + off_t i = *index + 1; // seq->index + + *index = i; + + return NULL; +} + +static int seq_show(struct dfs_seq_file *seq, void *data) +{ + /* data: The return value of the start or next*/ + dfs_seq_puts(seq, "todo\n"); + + return 0; +} + +static const struct dfs_seq_ops seq_ops = { + .start = seq_start, + .stop = seq_stop, + .next = seq_next, + .show = seq_show, +}; + +void proc_tty_register_driver(void *driver) +{ + //todo +} + +void proc_tty_unregister_driver(void *driver) +{ + //todo +} + +int proc_tty_init(void) +{ + struct proc_dentry *dentry; + + dentry = proc_mkdir("tty", NULL); + if (!dentry) + return -1; + + proc_release(dentry); + + dentry = proc_mkdir("tty/ldisc", NULL); + proc_release(dentry); + + dentry = proc_mkdir_mode("tty/driver", S_IRUSR|S_IXUSR, NULL); + proc_release(dentry); + + dentry = proc_create_data("tty/ldiscs", 0, NULL, NULL, NULL); + if (dentry) + { + dentry->seq_ops = &seq_ops; + } + proc_release(dentry); + + dentry = proc_create_data("tty/drivers", 0, NULL, NULL, NULL); + if (dentry) + { + dentry->seq_ops = &seq_ops; + } + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_tty_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_uptime.c b/components/dfs/dfs_v2/filesystems/procfs/proc_uptime.c new file mode 100644 index 00000000000..f16ab72b667 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_uptime.c @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include + + +static int single_show(struct dfs_seq_file *seq, void *data) +{ + dfs_seq_printf(seq, "%lu.%02lu %lu.%02lu\n", + (unsigned long)rt_tick_get_millisecond() / 1000, (unsigned long)(rt_tick_get_millisecond() % 1000) / 100, + (unsigned long)rt_tick_get_millisecond() / 1000, (unsigned long)(rt_tick_get_millisecond() % 1000) / 100); + + return 0; +} + +int proc_uptime_init(void) +{ + struct proc_dentry *dentry = proc_create_single_data("uptime", 0, NULL, single_show, NULL); + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_uptime_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/proc_version.c b/components/dfs/dfs_v2/filesystems/procfs/proc_version.c new file mode 100644 index 00000000000..1ca803543ef --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/proc_version.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include "proc.h" +#include "procfs.h" + +#include +#include + +#include +#include + +#include + + +static int single_show(struct dfs_seq_file *seq, void *data) +{ + dfs_seq_puts(seq, "\n \\ | /\n"); +#ifdef RT_USING_SMART + dfs_seq_puts(seq, "- RT - Thread Smart Operating System\n"); +#else + dfs_seq_puts(seq, "- RT - Thread Operating System\n"); +#endif + dfs_seq_printf(seq, " / | \\ %d.%d.%d build %s %s\n", + (rt_int32_t)RT_VERSION_MAJOR, (rt_int32_t)RT_VERSION_MINOR, (rt_int32_t)RT_VERSION_PATCH, + __DATE__, __TIME__); + dfs_seq_puts(seq, " 2006 - 2022 Copyright by RT-Thread team\n"); + + return 0; +} + +int proc_version_init(void) +{ + struct proc_dentry *dentry = proc_create_single_data("version", 0, NULL, single_show, NULL); + proc_release(dentry); + + return 0; +} +INIT_ENV_EXPORT(proc_version_init); diff --git a/components/dfs/dfs_v2/filesystems/procfs/procfs.c b/components/dfs/dfs_v2/filesystems/procfs/procfs.c new file mode 100644 index 00000000000..c8b5c1477c7 --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/procfs.c @@ -0,0 +1,447 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "proc.h" +#include "procfs.h" + +#define PROC_DEBUG(...) //rt_kprintf + +static int dfs_procfs_open(struct dfs_file *file) +{ + rt_err_t ret = RT_EOK; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + + RT_ASSERT(file->ref_count > 0); + + // this file is opened and in an fdtable + if (file->ref_count > 1) + { + file->fpos = 0; + return ret; + } + + if (entry->fops && entry->fops->open) + { + ret = entry->fops->open(file); + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, file->dentry->pathname, ret); + + return ret; +} + +static int dfs_procfs_close(struct dfs_file *file) +{ + rt_err_t ret = RT_EOK; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + RT_ASSERT(file->vnode->ref_count > 0); + if (file->vnode->ref_count > 1) + { + return ret; + } + + if (entry && entry->fops && entry->fops->close) + { + ret = entry->fops->close(file); + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, file->dentry->pathname, ret); + + return ret; +} + +static ssize_t dfs_procfs_read(struct dfs_file *file, void *buf, size_t count, off_t *pos) +{ + ssize_t ret = -RT_ERROR; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + if (entry && entry->fops && entry->fops->read) + { + ret = entry->fops->read(file, buf, count, pos); + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, file->dentry->pathname, ret); + + return ret; +} + +static ssize_t dfs_procfs_write(struct dfs_file *file, const void *buf, size_t count, off_t *pos) +{ + ssize_t ret = -RT_ERROR; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + if (entry && entry->fops && entry->fops->write) + { + ret = entry->fops->write(file, buf, count, pos); + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, file->dentry->pathname, ret); + + return ret; +} + +static int dfs_procfs_ioctl(struct dfs_file *file, int cmd, void *args) +{ + int ret = -RT_ERROR; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + if (entry && entry->fops && entry->fops->ioctl) + { + ret = entry->fops->ioctl(file, cmd, args); + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, file->dentry->pathname, ret); + + return ret; +} + +static int dfs_procfs_getdents(struct dfs_file *file, struct dirent *dirp, uint32_t count) +{ + int ret = 0; + rt_uint32_t index = 0; + struct dirent *d; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + if (entry) + { + struct proc_dentry *iter = RT_NULL, *tmp; + + /* make integer count */ + count = (count / sizeof(struct dirent)); + if (count == 0) + { + return -EINVAL; + } + + dfs_vfs_for_each_subnode(iter, tmp, entry, node) + { + if (iter == RT_NULL) + { + break; + } + + if (index >= file->fpos) + { + d = dirp + index - file->fpos; + + if (S_ISDIR(entry->mode)) + { + d->d_type = DT_DIR; + } + else if (S_ISLNK(entry->mode)) + { + d->d_type = DT_SYMLINK; + } + else + { + d->d_type = DT_REG; + } + + d->d_namlen = rt_strlen(iter->name); + d->d_reclen = (rt_uint16_t)sizeof(struct dirent); + rt_strncpy(d->d_name, iter->name, rt_strlen(iter->name) + 1); + + ret ++; + } + + index++; + if (index - file->fpos >= count) + { + break; + } + } + + if (ret > 0) + { + file->fpos = index; + } + + if (entry->fops && entry->fops->getdents && ret < count) + { + int r; + + file->fpos -= index; + + r = entry->fops->getdents(file, dirp + ret, (count - ret) * sizeof(struct dirent)); + + ret = ret * sizeof(struct dirent); + + if (r > 0) + { + ret += r; + } + + file->fpos += index; + } + else + { + ret = ret * sizeof(struct dirent); + } + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, file->dentry->pathname, ret); + + return ret; +} + +static int dfs_procfs_poll(struct dfs_file *file, struct rt_pollreq *req) +{ + int ret = -RT_ERROR; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + if (entry && entry->fops && entry->fops->poll) + { + ret = entry->fops->poll(file, req); + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, file->dentry->pathname, ret); + + return ret; +} + +static int dfs_procfs_flush(struct dfs_file *file) +{ + int ret = -RT_ERROR; + struct proc_dentry *entry = (struct proc_dentry *)file->vnode->data; + + if (entry && entry->fops && entry->fops->flush) + { + ret = entry->fops->flush(file); + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, file->dentry->pathname, ret); + + return ret; +} + +static int dfs_procfs_mount(struct dfs_mnt *mnt, unsigned long rwflag, const void *data) +{ + RT_ASSERT(mnt != RT_NULL); + + return RT_EOK; +} + +static int dfs_procfs_umount(struct dfs_mnt *mnt) +{ + RT_ASSERT(mnt != RT_NULL); + + return RT_EOK; +} + +static int dfs_procfs_readlink(struct dfs_dentry *dentry, char *buf, int len) +{ + int ret = 0; + struct proc_dentry *entry = dfs_proc_find(dentry->pathname); + + if (entry) + { + if (S_ISLNK(entry->mode) && entry->data) + { + if (entry->ops && entry->ops->readlink) + { + ret = entry->ops->readlink(entry, buf, len); + } + else + { + rt_strncpy(buf, (const char *)entry->data, len); + buf[len - 1] = '\0'; + ret = rt_strlen(buf); + } + } + + proc_release(entry); + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, dentry->pathname, ret); + + return ret; +} + +static int dfs_procfs_unlink(struct dfs_dentry *dentry) +{ + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, dentry->pathname, -1); + return -RT_ERROR; +} + +static int dfs_procfs_stat(struct dfs_dentry *dentry, struct stat *st) +{ + int ret = RT_EOK; + struct dfs_vnode *vnode; + + if (dentry && dentry->vnode) + { + vnode = dentry->vnode; + + st->st_dev = (dev_t)(dentry->mnt->dev_id); + st->st_ino = (ino_t)dfs_dentry_full_path_crc32(dentry); + + st->st_gid = vnode->gid; + st->st_uid = vnode->uid; + st->st_mode = vnode->mode; + st->st_nlink = vnode->nlink; + st->st_size = vnode->size; + st->st_mtim.tv_nsec = vnode->mtime.tv_nsec; + st->st_mtim.tv_sec = vnode->mtime.tv_sec; + st->st_ctim.tv_nsec = vnode->ctime.tv_nsec; + st->st_ctim.tv_sec = vnode->ctime.tv_sec; + st->st_atim.tv_nsec = vnode->atime.tv_nsec; + st->st_atim.tv_sec = vnode->atime.tv_sec; + } + + PROC_DEBUG(" %s %d >> %s ret: %d\n", __func__, __LINE__, dentry->pathname, ret); + + return ret; +} + +static int dfs_procfs_statfs(struct dfs_mnt *mnt, struct statfs *buf) +{ + if (mnt && buf) + { + buf->f_bsize = 512; + buf->f_blocks = 2048 * 64; // 64M + buf->f_bfree = buf->f_blocks; + buf->f_bavail = buf->f_bfree; + } + + PROC_DEBUG(" %s %d\n", __func__, __LINE__); + + return RT_EOK; +} + +static struct dfs_vnode *dfs_procfs_lookup(struct dfs_dentry *dentry) +{ + struct dfs_vnode *vnode = RT_NULL; + struct proc_dentry *entry = dfs_proc_find(dentry->pathname); + + if (entry) + { + vnode = dfs_vnode_create(); + if (vnode) + { + vnode->nlink = 1; + vnode->size = 0; + if (S_ISDIR(entry->mode)) + { + vnode->mode = entry->mode; + vnode->type = FT_DIRECTORY; + } + else if (S_ISLNK(entry->mode)) + { + vnode->mode = entry->mode; + vnode->type = FT_SYMLINK; + } + else + { + vnode->mode = entry->mode; + vnode->type = FT_REGULAR; + } + + vnode->data = entry; + vnode->mnt = dentry->mnt; + } + + proc_release(entry); + } + + PROC_DEBUG(" %s %d >> %s\n", __func__, __LINE__, dentry->pathname); + + return vnode; +} + +static struct dfs_vnode *dfs_procfs_create_vnode(struct dfs_dentry *dentry, int type, mode_t mode) +{ + return RT_NULL; +} + +static int dfs_procfs_free_vnode(struct dfs_vnode *vnode) +{ + return 0; +} + +static const struct dfs_file_ops _procfs_fops = +{ + .open = dfs_procfs_open, + .close = dfs_procfs_close, + .lseek = generic_dfs_lseek, + .read = dfs_procfs_read, + .write = dfs_procfs_write, + .ioctl = dfs_procfs_ioctl, + .getdents = dfs_procfs_getdents, + .poll = dfs_procfs_poll, + .flush = dfs_procfs_flush, +}; + +static const struct dfs_filesystem_ops _procfs_ops = +{ + .name = "procfs", + + .default_fops = &_procfs_fops, + + .mount = dfs_procfs_mount, + .umount = dfs_procfs_umount, + .readlink = dfs_procfs_readlink, + .unlink = dfs_procfs_unlink, + .stat = dfs_procfs_stat, + .statfs = dfs_procfs_statfs, + .lookup = dfs_procfs_lookup, + .create_vnode = dfs_procfs_create_vnode, + .free_vnode = dfs_procfs_free_vnode, +}; + +static struct dfs_filesystem_type _procfs = +{ + .fs_ops = &_procfs_ops, +}; + +int dfs_procfs_init(void) +{ + /* register procfs file system */ + dfs_register(&_procfs); + + return 0; +} +INIT_COMPONENT_EXPORT(dfs_procfs_init); + +int proc_read_data(struct dfs_file *file, void *buf, size_t count, off_t *pos) +{ + if (file->fpos >= file->vnode->size) + { + return 0; + } + + if (file->data) + { + count = file->vnode->size - file->fpos >= count ? count : file->vnode->size - file->fpos; + rt_strncpy(buf, file->data + file->fpos, count); + + file->fpos += count; + *pos = file->fpos; + } + else + { + return 0; + } + + return count; +} diff --git a/components/dfs/dfs_v2/filesystems/procfs/procfs.h b/components/dfs/dfs_v2/filesystems/procfs/procfs.h new file mode 100644 index 00000000000..6e921ae300f --- /dev/null +++ b/components/dfs/dfs_v2/filesystems/procfs/procfs.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#ifndef __PROC_FS_H__ +#define __PROC_FS_H__ + +#include + +int dfs_procfs_init(void); + +int proc_read_data(struct dfs_file *file, void *buf, size_t count, off_t *pos); + +#endif From 4e370473c5f9c52c22310fd97598fc436e1b7856 Mon Sep 17 00:00:00 2001 From: zhuzhuzhu <945386260@qq.com> Date: Tue, 14 Jan 2025 14:21:04 +0800 Subject: [PATCH 04/51] fix cppcheck in lwp.c will fail if no define RT_USING_DFS (#9912) --- tools/ci/cpp_check.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/ci/cpp_check.py b/tools/ci/cpp_check.py index 8a4e05169ff..7f3ca5a4394 100644 --- a/tools/ci/cpp_check.py +++ b/tools/ci/cpp_check.py @@ -52,6 +52,10 @@ def check(self): logging.info("Start to static code analysis.") check_result = True for file in file_list_filtered: + macros = [] + if os.path.basename(file) == 'lwp.c': + macros.append('-DRT_USING_DFS') + result = subprocess.run( [ 'cppcheck', @@ -70,7 +74,7 @@ def check(self): '--error-exitcode=1', '--force', file - ], + ] + macros, stdout = subprocess.PIPE, stderr = subprocess.PIPE) logging.info(result.stdout.decode()) logging.info(result.stderr.decode()) From da6c62c2933988587c20bf87866b05a743172c96 Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Mon, 13 Jan 2025 20:41:55 -0500 Subject: [PATCH 05/51] [utest] fix twice operation of uassert --- components/utilities/utest/TC_uassert.c | 10 +++++ components/utilities/utest/utest_assert.h | 45 +++++++++++++++++++---- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/components/utilities/utest/TC_uassert.c b/components/utilities/utest/TC_uassert.c index 50d45270add..bb212c14d1e 100644 --- a/components/utilities/utest/TC_uassert.c +++ b/components/utilities/utest/TC_uassert.c @@ -32,6 +32,15 @@ static void TC_uassert_int_op(void) uassert_value_greater_equal(b, b); } +static void TC_uassert_float_op(void) +{ + float a = 5.0; + float b = 5.0; + + uassert_float_equal(a, b); + uassert_float_not_equal(a, b + 0.0002); +} + static void TC_uassert_ptr_op(void) { int a = 5; @@ -65,6 +74,7 @@ static void utest_do_tc(void) UTEST_UNIT_RUN(TC_uassert_true_false); UTEST_UNIT_RUN(TC_uassert_null_not_null); UTEST_UNIT_RUN(TC_uassert_int_op); + UTEST_UNIT_RUN(TC_uassert_float_op); UTEST_UNIT_RUN(TC_uassert_ptr_op); UTEST_UNIT_RUN(TC_uassert_str_op); UTEST_UNIT_RUN(TC_uassert_in_range); diff --git a/components/utilities/utest/utest_assert.h b/components/utilities/utest/utest_assert.h index 6d19660993d..86381f57cce 100644 --- a/components/utilities/utest/utest_assert.h +++ b/components/utilities/utest/utest_assert.h @@ -47,19 +47,50 @@ void utest_assert_buf(const char *a, const char *b, rt_size_t sz, rt_bool_t equa * @macro uassert_buf_not_equal if @a not equal to @b, not assert, means passing. buf type test. * @macro uassert_in_range if @value is in range of min and max, not assert, means passing. * @macro uassert_not_in_range if @value is not in range of min and max, not assert, means passing. - * -*/ + * @macro uassert_float_equal if @a equal to @b, not assert, means passing. Float type test. + * @macro uassert_float_not_equal if @a not equal to @b, not assert, means passing. Float type test. + * @macro uassert_value_less if @a less than @b, not assert, means passing. + * @macro uassert_value_less_equal if @a less than or equal to @b, not assert, means passing. + * @macro uassert_value_greater if @a greater than @b, not assert, means passing. + * @macro uassert_value_greater_equal if @a greater than or equal to @b, not assert, means passing. + * @macro uassert_ptr_equal if @a equal to @b, not assert, means passing. Pointer type test. + * @macro uassert_ptr_not_equal if @a not equal to @b, not assert, means passing. Pointer type test. + */ #define uassert_true(value) __utest_assert(value, "(" #value ") is false") #define uassert_false(value) __utest_assert(!(value), "(" #value ") is true") #define uassert_null(value) __utest_assert((const char *)(value) == RT_NULL, "(" #value ") is not null") #define uassert_not_null(value) __utest_assert((const char *)(value) != RT_NULL, "(" #value ") is null") -#define uassert_in_range(value, min, max) __utest_assert(((value >= min) && (value <= max)), "(" #value ") not in range("#min","#max")") -#define uassert_not_in_range(value, min, max) __utest_assert(!((value >= min) && (value <= max)), "(" #value ") in range("#min","#max")") - -#define uassert_float_equal(a, b) uassert_in_range(a, ((double)b - 0.0001), ((double)b + 0.0001)) -#define uassert_float_not_equal(a, b) uassert_not_in_range(a, ((double)b - 0.0001), ((double)b + 0.0001)) +#define uassert_in_range(value, min, max) \ + do { \ + double _value = (value); \ + double _min = (min); \ + double _max = (max); \ + __utest_assert((_value >= _min) && (_value <= _max), "(" #value ") not in range("#min","#max")"); \ + } while(0) + +#define uassert_not_in_range(value, min, max) \ + do { \ + double _value = (value); \ + double _min = (min); \ + double _max = (max); \ + __utest_assert((_value < _min) || (_value > _max), "(" #value ") in range("#min","#max")"); \ + } while(0) + +#define uassert_float_equal(a, b) \ + do { \ + double _a = (a); \ + double _b = (b); \ + uassert_in_range(_a, ((double)_b - 0.0001), ((double)_b + 0.0001)); \ + } while(0) + +#define uassert_float_not_equal(a, b) \ + do { \ + double _a = (a); \ + double _b = (b); \ + uassert_not_in_range(_a, ((double)_b - 0.0001), ((double)_b + 0.0001)); \ + } while(0) #define uassert_int_equal(a, b) __uassert_value_op(a, b, ==) #define uassert_int_not_equal(a, b) __uassert_value_op(a, b, !=) From 37908818a0a26977310c593989e9e27c93e4b4e7 Mon Sep 17 00:00:00 2001 From: DingDing Date: Wed, 15 Jan 2025 21:38:09 +0800 Subject: [PATCH 06/51] fix GPIO and SCI drivers for RZ series (#9908) fix gpio and sci drivers for RZ series --- bsp/renesas/ebf_qi_min_6m5/.config | 2 +- bsp/renesas/libraries/HAL_Drivers/drv_gpio.c | 53 +++++++++----------- bsp/renesas/libraries/HAL_Drivers/drv_sci.c | 4 ++ bsp/renesas/libraries/Kconfig | 22 ++++---- bsp/renesas/libraries/bsp-template/.config | 2 +- bsp/renesas/ra2l1-cpk/.config | 2 +- bsp/renesas/ra4m2-eco/.config | 2 +- bsp/renesas/ra6e2-fpb/.config | 2 +- bsp/renesas/ra6m3-ek/.config | 2 +- bsp/renesas/ra6m3-hmi-board/.config | 2 +- bsp/renesas/ra6m4-cpk/.config | 2 +- bsp/renesas/ra6m4-iot/.config | 2 +- bsp/renesas/ra8d1-ek/.config | 2 +- bsp/renesas/ra8d1-vision-board/.config | 2 +- bsp/renesas/ra8m1-ek/.config | 2 +- bsp/renesas/rzn2l_rsk/.config | 2 +- bsp/renesas/rzt2m_rsk/.config | 2 +- 17 files changed, 55 insertions(+), 52 deletions(-) diff --git a/bsp/renesas/ebf_qi_min_6m5/.config b/bsp/renesas/ebf_qi_min_6m5/.config index f9857851c2f..7a847706e7b 100644 --- a/bsp/renesas/ebf_qi_min_6m5/.config +++ b/bsp/renesas/ebf_qi_min_6m5/.config @@ -1019,7 +1019,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y # CONFIG_SOC_SERIES_R7FA6M3 is not set # CONFIG_SOC_SERIES_R7FA6M4 is not set # CONFIG_SOC_SERIES_R7FA2L1 is not set diff --git a/bsp/renesas/libraries/HAL_Drivers/drv_gpio.c b/bsp/renesas/libraries/HAL_Drivers/drv_gpio.c index 13dc033a4e3..374a0a6d4df 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drv_gpio.c +++ b/bsp/renesas/libraries/HAL_Drivers/drv_gpio.c @@ -7,6 +7,7 @@ * Date Author Notes * 2021-07-29 KyleChan first version * 2022-01-19 Sherman add PIN2IRQX_TABLE + * 2025-01-13 newflydd pin_get for RZ */ #include @@ -304,37 +305,31 @@ static rt_err_t ra_pin_dettach_irq(struct rt_device *device, rt_base_t pin) static rt_base_t ra_pin_get(const char *name) { - int pin_number = -1, port = -1, pin = -1; - - if (rt_strlen(name) != 4) - return -1; - - if ((name[0] == 'P' || name[0] == 'p')) +#ifdef SOC_FAMILY_RENESAS_RZ + /* RZ series: use "PXX_X" format, like "P01_1" */ + if ((rt_strlen(name) == 5) && + ((name[0] == 'P') || (name[0] == 'p')) && + (name[3] == '_') && + ('0' <= (int) name[1] && (int) name[1] <= '1') && + ('0' <= (int) name[2] && (int) name[2] <= '9') && + ('0' <= (int) name[4] && (int) name[4] <= '7')) { - if ('0' <= name[1] && name[1] <= '9') - { - port = (name[1] - '0') * 16 * 16; - if ('0' <= name[2] && name[2] <= '9' && '0' <= name[3] && name[3] <= '9') - { - pin = (name[2] - '0') * 10 + (name[3] - '0'); - pin_number = port + pin; - - return pin_number; - } - } - else if ('A' <= name[1] && name[1] <= 'Z') - { - port = (name[1] - '0' - 7) * 16 * 16; - if ('0' <= name[2] && name[2] <= '9' && '0' <= name[3] && name[3] <= '9') - { - pin = (name[2] - '0') * 10 + (name[3] - '0'); - pin_number = port + pin; - - return pin_number; - } - } + return (((int) name[1] - '0') * 10 + ((int) name[2] - '0')) * 0x100 + ((int) name[4] - '0'); + } + LOG_W("Invalid pin expression, use `PXX_X` format like `P01_1`"); +#else + /* RA series: use "PXXX" format, like "P101"*/ + if ((rt_strlen(name) == 4) && + (name[0] == 'P' || name[0] == 'p') && + (name[1] >= '0' && name[1] <= '9') && + (name[2] >= '0' && name[1] <= '9') && + (name[3] >= '0' && name[1] <= '9')) + { + return (name[1] - '0') * 0x100 + (name[2] - '0') * 10 + (name[3] - '0'); } - return -1; + LOG_W("Invalid pin expression, use `PXXX` format like `P101`"); +#endif + return -RT_ERROR; } const static struct rt_pin_ops _ra_pin_ops = diff --git a/bsp/renesas/libraries/HAL_Drivers/drv_sci.c b/bsp/renesas/libraries/HAL_Drivers/drv_sci.c index 93d31dd2e3f..1fec7550d49 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drv_sci.c +++ b/bsp/renesas/libraries/HAL_Drivers/drv_sci.c @@ -358,7 +358,11 @@ static int ra_uart_putc(struct rt_serial_device *serial, char c) sci_uart_instance_ctrl_t *p_ctrl = (sci_uart_instance_ctrl_t *)param->sci_ctrl; p_ctrl->p_reg->TDR = c; +#ifdef SOC_SERIES_R9A07G0 + while ((p_ctrl->p_reg->CSR_b.TEND) == 0); +#else while ((p_ctrl->p_reg->SSR_b.TEND) == 0); +#endif return RT_EOK; } diff --git a/bsp/renesas/libraries/Kconfig b/bsp/renesas/libraries/Kconfig index 8aad8b4fc58..3fc28972aa8 100644 --- a/bsp/renesas/libraries/Kconfig +++ b/bsp/renesas/libraries/Kconfig @@ -1,52 +1,56 @@ -config SOC_FAMILY_RENESAS +config SOC_FAMILY_RENESAS_RA + bool + default n + +config SOC_FAMILY_RENESAS_RZ bool default n config SOC_SERIES_R7FA6M3 bool select ARCH_ARM_CORTEX_M4 - select SOC_FAMILY_RENESAS + select SOC_FAMILY_RENESAS_RA default n config SOC_SERIES_R7FA6M4 bool select ARCH_ARM_CORTEX_M4 - select SOC_FAMILY_RENESAS + select SOC_FAMILY_RENESAS_RA default n config SOC_SERIES_R7FA2L1 bool select ARCH_ARM_CORTEX_M23 - select SOC_FAMILY_RENESAS + select SOC_FAMILY_RENESAS_RA default n config SOC_SERIES_R7FA6M5 bool select ARCH_ARM_CORTEX_M33 - select SOC_FAMILY_RENESAS + select SOC_FAMILY_RENESAS_RA default n config SOC_SERIES_R7FA4M2 bool select ARCH_ARM_CORTEX_M4 - select SOC_FAMILY_RENESAS + select SOC_FAMILY_RENESAS_RA default n config SOC_SERIES_R7FA8M85 bool select ARCH_ARM_CORTEX_M85 - select SOC_FAMILY_RENESAS + select SOC_FAMILY_RENESAS_RA default n config SOC_SERIES_R9A07G0 bool select ARCH_ARM_CORTEX_R52 - select SOC_FAMILY_RENESAS + select SOC_FAMILY_RENESAS_RZ default n config SOC_SERIES_R7FA6E2 bool select ARCH_ARM_CORTEX_M33 - select SOC_FAMILY_RENESAS + select SOC_FAMILY_RENESAS_RA default n \ No newline at end of file diff --git a/bsp/renesas/libraries/bsp-template/.config b/bsp/renesas/libraries/bsp-template/.config index 5907b309925..cbf525b8b7a 100644 --- a/bsp/renesas/libraries/bsp-template/.config +++ b/bsp/renesas/libraries/bsp-template/.config @@ -657,7 +657,7 @@ CONFIG_SOC_R7FA6M4AF=y # # On-chip Peripheral Drivers # -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y CONFIG_SOC_SERIES_R7FA6M4=y CONFIG_BSP_USING_GPIO=y # CONFIG_BSP_USING_ONCHIP_FLASH is not set diff --git a/bsp/renesas/ra2l1-cpk/.config b/bsp/renesas/ra2l1-cpk/.config index 980c8b29829..ebe2524e3b6 100644 --- a/bsp/renesas/ra2l1-cpk/.config +++ b/bsp/renesas/ra2l1-cpk/.config @@ -1035,7 +1035,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y # CONFIG_SOC_SERIES_R7FA6M3 is not set # CONFIG_SOC_SERIES_R7FA6M4 is not set CONFIG_SOC_SERIES_R7FA2L1=y diff --git a/bsp/renesas/ra4m2-eco/.config b/bsp/renesas/ra4m2-eco/.config index f14dd22fde9..5daf1c7f7af 100644 --- a/bsp/renesas/ra4m2-eco/.config +++ b/bsp/renesas/ra4m2-eco/.config @@ -1036,7 +1036,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y # CONFIG_SOC_SERIES_R7FA6M3 is not set # CONFIG_SOC_SERIES_R7FA6M4 is not set # CONFIG_SOC_SERIES_R7FA2L1 is not set diff --git a/bsp/renesas/ra6e2-fpb/.config b/bsp/renesas/ra6e2-fpb/.config index 4c0b5775ba9..fe980b065c6 100644 --- a/bsp/renesas/ra6e2-fpb/.config +++ b/bsp/renesas/ra6e2-fpb/.config @@ -1153,7 +1153,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Arduino libraries # end of RT-Thread online packages -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y CONFIG_SOC_SERIES_R7FA6E2=y # diff --git a/bsp/renesas/ra6m3-ek/.config b/bsp/renesas/ra6m3-ek/.config index f229aa8fc50..2f7745c475e 100644 --- a/bsp/renesas/ra6m3-ek/.config +++ b/bsp/renesas/ra6m3-ek/.config @@ -1021,7 +1021,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y CONFIG_SOC_SERIES_R7FA6M3=y # CONFIG_SOC_SERIES_R7FA6M4 is not set # CONFIG_SOC_SERIES_R7FA2L1 is not set diff --git a/bsp/renesas/ra6m3-hmi-board/.config b/bsp/renesas/ra6m3-hmi-board/.config index 8e4fd18258a..99f43743314 100644 --- a/bsp/renesas/ra6m3-hmi-board/.config +++ b/bsp/renesas/ra6m3-hmi-board/.config @@ -1271,7 +1271,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Arduino libraries # end of RT-Thread online packages -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y CONFIG_SOC_SERIES_R7FA6M3=y # diff --git a/bsp/renesas/ra6m4-cpk/.config b/bsp/renesas/ra6m4-cpk/.config index a0348aae9b6..e7ec3caa4b9 100644 --- a/bsp/renesas/ra6m4-cpk/.config +++ b/bsp/renesas/ra6m4-cpk/.config @@ -1027,7 +1027,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y # CONFIG_SOC_SERIES_R7FA6M3 is not set CONFIG_SOC_SERIES_R7FA6M4=y # CONFIG_SOC_SERIES_R7FA2L1 is not set diff --git a/bsp/renesas/ra6m4-iot/.config b/bsp/renesas/ra6m4-iot/.config index 5b5b9006da2..8ffe139504b 100644 --- a/bsp/renesas/ra6m4-iot/.config +++ b/bsp/renesas/ra6m4-iot/.config @@ -1021,7 +1021,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y # CONFIG_SOC_SERIES_R7FA6M3 is not set CONFIG_SOC_SERIES_R7FA6M4=y # CONFIG_SOC_SERIES_R7FA2L1 is not set diff --git a/bsp/renesas/ra8d1-ek/.config b/bsp/renesas/ra8d1-ek/.config index 260dee73f5e..9f7c7736081 100644 --- a/bsp/renesas/ra8d1-ek/.config +++ b/bsp/renesas/ra8d1-ek/.config @@ -1022,7 +1022,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y # CONFIG_SOC_SERIES_R7FA6M3 is not set # CONFIG_SOC_SERIES_R7FA6M4 is not set # CONFIG_SOC_SERIES_R7FA2L1 is not set diff --git a/bsp/renesas/ra8d1-vision-board/.config b/bsp/renesas/ra8d1-vision-board/.config index 6be24dfabcb..7407aa269c1 100644 --- a/bsp/renesas/ra8d1-vision-board/.config +++ b/bsp/renesas/ra8d1-vision-board/.config @@ -1057,7 +1057,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y # CONFIG_SOC_SERIES_R7FA6M3 is not set # CONFIG_SOC_SERIES_R7FA6M4 is not set # CONFIG_SOC_SERIES_R7FA2L1 is not set diff --git a/bsp/renesas/ra8m1-ek/.config b/bsp/renesas/ra8m1-ek/.config index 5937a4dbb9c..3d19aca83fa 100644 --- a/bsp/renesas/ra8m1-ek/.config +++ b/bsp/renesas/ra8m1-ek/.config @@ -1054,7 +1054,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RA=y # CONFIG_SOC_SERIES_R7FA6M3 is not set # CONFIG_SOC_SERIES_R7FA6M4 is not set # CONFIG_SOC_SERIES_R7FA2L1 is not set diff --git a/bsp/renesas/rzn2l_rsk/.config b/bsp/renesas/rzn2l_rsk/.config index 6f402d9bc83..fe7576d35f2 100644 --- a/bsp/renesas/rzn2l_rsk/.config +++ b/bsp/renesas/rzn2l_rsk/.config @@ -1151,7 +1151,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Arduino libraries # end of RT-Thread online packages -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RZ=y CONFIG_SOC_SERIES_R9A07G0=y # diff --git a/bsp/renesas/rzt2m_rsk/.config b/bsp/renesas/rzt2m_rsk/.config index fed1a4dea6e..7beaa50421b 100644 --- a/bsp/renesas/rzt2m_rsk/.config +++ b/bsp/renesas/rzt2m_rsk/.config @@ -1054,7 +1054,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Uncategorized # # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -CONFIG_SOC_FAMILY_RENESAS=y +CONFIG_SOC_FAMILY_RENESAS_RZ=y # CONFIG_SOC_SERIES_R7FA6M3 is not set # CONFIG_SOC_SERIES_R7FA6M4 is not set # CONFIG_SOC_SERIES_R7FA2L1 is not set From 95064ed44900815a9ef823bfbeb29768d9acb46a Mon Sep 17 00:00:00 2001 From: "kenneth.liu" Date: Fri, 3 Jan 2025 20:47:02 +0800 Subject: [PATCH 07/51] bsp: cvitek: fix bug in setting PLIC_PRIORITY[n] description: In the bsp/cvitek/c906_little/board/interrupt.c, There is an issue with setting the PLIC_PRIORITY[n]. analysis: PLIC_PRIORITY[n] each register corresponds to the priority of a hardware interrupt number. Solution: Each register is 4 bytes. Multiply the total number of IRQs by 4 instead of dividing by 4. Signed-off-by: Liu Gui --- bsp/cvitek/c906_little/board/interrupt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp/cvitek/c906_little/board/interrupt.c b/bsp/cvitek/c906_little/board/interrupt.c index 9a6625cf25f..49a23662118 100755 --- a/bsp/cvitek/c906_little/board/interrupt.c +++ b/bsp/cvitek/c906_little/board/interrupt.c @@ -63,7 +63,7 @@ void plic_init(void) { int i; - for (i = 0; i < IRQ_MAX_NR / 4; i = i + 4) + for (i = 0; i < IRQ_MAX_NR * 4; i = i + 4) { mmio_write_32(((uintptr_t) PLIC_PRIORITY0 + i), 0); } From 6cbb2c3ee59c8f46528df89225cf3aa235d46884 Mon Sep 17 00:00:00 2001 From: imcu Date: Tue, 26 Nov 2024 14:54:43 +0800 Subject: [PATCH 08/51] [bsp][cvitek] add cache opration functions for cache coherence By default, the small core enables D-Cache without ensuring cache coherence. Therefore, when using shared memory, inconsistencies can occur in the data read by the small core and the big core. Solution: Migrate cache-related functions from the official duo-buildroot-sdk library to implement cache-related operations in rthw.h. This allows you to either disable D-Cache or call the flush_dcache_range function before reading and after writing for synchronization. It is recommended to use the flush_dcache_range function, as disabling D-Cache can have a significant performance impact. Signed-off-by: zdtyuiop4444 --- bsp/cvitek/c906_little/Kconfig | 1 + bsp/cvitek/c906_little/board/cache.c | 70 ++++++++++++++++++++++++++++ bsp/cvitek/c906_little/board/cache.h | 54 +++++++++++++++++++++ bsp/cvitek/c906_little/rtconfig.h | 1 + 4 files changed, 126 insertions(+) create mode 100644 bsp/cvitek/c906_little/board/cache.c create mode 100644 bsp/cvitek/c906_little/board/cache.h diff --git a/bsp/cvitek/c906_little/Kconfig b/bsp/cvitek/c906_little/Kconfig index da699bf9bbb..e3af6c604aa 100755 --- a/bsp/cvitek/c906_little/Kconfig +++ b/bsp/cvitek/c906_little/Kconfig @@ -14,6 +14,7 @@ config BSP_USING_C906_LITTLE bool select ARCH_RISCV64 select ARCH_RISCV_FPU_D + select RT_USING_CACHE select RT_USING_COMPONENTS_INIT select RT_USING_USER_MAIN default y diff --git a/bsp/cvitek/c906_little/board/cache.c b/bsp/cvitek/c906_little/board/cache.c new file mode 100644 index 00000000000..8ca96365534 --- /dev/null +++ b/bsp/cvitek/c906_little/board/cache.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024/11/26 zdtyuiop4444 The first version + */ + +#include "cache.h" + +inline void rt_hw_cpu_dcache_enable(void) +{ + asm volatile("csrs mhcr, %0;" ::"rI"(0x2)); +} + +inline void rt_hw_cpu_dcache_disable(void) +{ + asm volatile("csrc mhcr, %0;" ::"rI"(0x2)); +} + +inline void inv_dcache_range(uintptr_t start, size_t size) { + CACHE_OP_RANGE(DCACHE_IPA_A0, start, size); +} + +inline void flush_dcache_range(uintptr_t start, size_t size) { + CACHE_OP_RANGE(DCACHE_CIPA_A0, start, size); +} + +inline void rt_hw_cpu_dcache_ops(int ops, void* addr, int size) +{ + switch (ops) + { + case RT_HW_CACHE_FLUSH: + flush_dcache_range(addr, size); + break; + case RT_HW_CACHE_INVALIDATE: + inv_dcache_range(addr, size); + break; + default: + break; + } +} + +inline void rt_hw_cpu_icache_enable(void) +{ + asm volatile("csrs mhcr, %0;" ::"rI"(0x1)); +} + +inline void rt_hw_cpu_icache_disable(void) +{ + asm volatile("csrc mhcr, %0;" ::"rI"(0x1)); +} + +inline void inv_icache_range(uintptr_t start, size_t size) { + CACHE_OP_RANGE(ICACHE_IPA_A0, start, size); +} + +inline void rt_hw_cpu_icache_ops(int ops, void* addr, int size) +{ + switch (ops) + { + case RT_HW_CACHE_INVALIDATE: + inv_icache_range(addr, size); + break; + default: + break; + } +} diff --git a/bsp/cvitek/c906_little/board/cache.h b/bsp/cvitek/c906_little/board/cache.h new file mode 100644 index 00000000000..b85b98545c8 --- /dev/null +++ b/bsp/cvitek/c906_little/board/cache.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024/11/26 zdtyuiop4444 The first version + */ + +#ifndef __CACHE_H__ +#define __CACHE_H__ + +#include + +#define L1_CACHE_BYTES 64 +#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) + +/* + * dcache.ipa rs1 (invalidate) + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | + * 0000001 01010 rs1 000 00000 0001011 + * + * dcache.cpa rs1 (clean) + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | + * 0000001 01001 rs1 000 00000 0001011 + * + * dcache.cipa rs1 (clean then invalidate) + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | + * 0000001 01011 rs1 000 00000 0001011 + * + * icache.ipa rs1 (invalidate) + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | + * 0000001 11000 rs1 000 00000 0001011 + * + * sync.s + * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | + * 0000000 11001 00000 000 00000 0001011 + */ + +#define DCACHE_IPA_A0 ".long 0x02a5000b" +#define DCACHE_CPA_A0 ".long 0x0295000b" +#define DCACHE_CIPA_A0 ".long 0x02b5000b" +#define ICACHE_IPA_A0 ".long 0x0385000b" + +#define SYNC_S ".long 0x0190000b" + +#define CACHE_OP_RANGE(OP, start, size) \ + register unsigned long i asm("a0") = start & ~(L1_CACHE_BYTES - 1); \ + for (; i < ALIGN(start + size, L1_CACHE_BYTES); i += L1_CACHE_BYTES) \ + __asm__ __volatile__(OP); \ + __asm__ __volatile__(SYNC_S) + +#endif /* __CACHE_H__ */ diff --git a/bsp/cvitek/c906_little/rtconfig.h b/bsp/cvitek/c906_little/rtconfig.h index 86ff0efbd7a..96203585be1 100755 --- a/bsp/cvitek/c906_little/rtconfig.h +++ b/bsp/cvitek/c906_little/rtconfig.h @@ -120,6 +120,7 @@ #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define ARCH_CPU_64BIT +#define RT_USING_CACHE #define ARCH_RISCV #define ARCH_RISCV_FPU #define ARCH_RISCV_FPU_D From d3841c3109f5d0a882e98396b95459da7989a326 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Thu, 16 Jan 2025 19:56:44 +0800 Subject: [PATCH 09/51] lwp: Kconfig: LWP_DEBUG default as n (#9921) LWP_DEBUG is debugging related, should be disabled by default. Signed-off-by: Chen Wang --- components/lwp/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/lwp/Kconfig b/components/lwp/Kconfig index 1d64e1c908e..8740fc34577 100644 --- a/components/lwp/Kconfig +++ b/components/lwp/Kconfig @@ -8,7 +8,7 @@ menuconfig RT_USING_LWP if RT_USING_LWP menuconfig LWP_DEBUG bool "Enable debugging features of LwP" - default y + default n if LWP_DEBUG config LWP_DEBUG_INIT From 2b82ab38a20728c8767f80bd10cc2b90da94ccd5 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Thu, 16 Jan 2025 22:33:55 +0800 Subject: [PATCH 10/51] bsp/cvitek: print arch info. during boot-up (#9919) Duo's CPU combination is more complicated: | BSP | B/L core| ISA | UART | | ------------- | ------- |---------------- |-------| | cv18xx_risc-v | Big | RISC-V C906 | UART0 | | c906-little | Littel | RISC-V C906 | UART1 | | cv18xx_aarch64| Big | ARM Cortex A53 | UART0 | Printing ISA and big and small core information during the boot process helps developers/testers determine the CPU and serial port corresponding to the current console. In addition, the RTT logo printing has already distinguished whether it is smart, so the bsp printing no longer distinguishes. Updated README to sync with this change. Signed-off-by: Chen Wang --- bsp/cvitek/README.md | 4 ++-- bsp/cvitek/c906_little/applications/main.c | 2 +- bsp/cvitek/cv18xx_aarch64/README.md | 4 ++-- bsp/cvitek/cv18xx_aarch64/applications/main.c | 2 +- bsp/cvitek/cv18xx_risc-v/applications/main.c | 6 +----- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/bsp/cvitek/README.md b/bsp/cvitek/README.md index fac15d3b176..864d54d43b2 100755 --- a/bsp/cvitek/README.md +++ b/bsp/cvitek/README.md @@ -284,7 +284,7 @@ lwIP-2.1.2 initialized! found part[0], begin: 1048576, size: 128.0MB found part[1], begin: 135266304, size: 28.707GB [I/app.filesystem] device 'sd1' is mounted to '/' as FAT -Hello RT-Smart! +Hello RISC-V/C906B ! msh />[E/sal.skt] not find network interface device by protocol family(1). [E/sal.skt] SAL socket protocol family input failed, return error -3. / # ls @@ -310,7 +310,7 @@ lwIP-2.1.2 initialized! found part[0], begin: 1048576, size: 128.0MB found part[1], begin: 135266304, size: 28.707GB [I/app.filesystem] device 'sd1' is mounted to '/' as EXT -Hello RT-Smart! +Hello RISC-V/C906B ! msh />[E/sal.skt] not find network interface device by protocol family(1). [E/sal.skt] SAL socket protocol family input failed, return error -3. / # ls diff --git a/bsp/cvitek/c906_little/applications/main.c b/bsp/cvitek/c906_little/applications/main.c index e1a0f57c9e1..df0a864d7b5 100755 --- a/bsp/cvitek/c906_little/applications/main.c +++ b/bsp/cvitek/c906_little/applications/main.c @@ -12,7 +12,7 @@ int main(void) { - rt_kprintf("Hello, RISC-V!\n"); + rt_kprintf("Hello, RISC-V/C906L !\n"); return 0; } diff --git a/bsp/cvitek/cv18xx_aarch64/README.md b/bsp/cvitek/cv18xx_aarch64/README.md index 591204d37cc..5fe11229f75 100644 --- a/bsp/cvitek/cv18xx_aarch64/README.md +++ b/bsp/cvitek/cv18xx_aarch64/README.md @@ -142,7 +142,7 @@ Starting kernel ... / | \ 5.2.0 build Dec 25 2024 14:16:49 2006 - 2024 Copyright by RT-Thread team [I/rtdm.mnt] File system initialization done -hello rt-thread! +Hello AARCH64 ! msh /> ``` @@ -184,7 +184,7 @@ Starting kernel ... 2006 - 2024 Copyright by RT-Thread team [I/drivers.serial] Using /dev/ttyS0 as default console [I/rtdm.mnt] File system initialization done -hello rt-thread! +Hello AARCH64 ! msh /> ``` diff --git a/bsp/cvitek/cv18xx_aarch64/applications/main.c b/bsp/cvitek/cv18xx_aarch64/applications/main.c index d7414cd58a4..3ab91e0cb7a 100644 --- a/bsp/cvitek/cv18xx_aarch64/applications/main.c +++ b/bsp/cvitek/cv18xx_aarch64/applications/main.c @@ -12,7 +12,7 @@ int main(void) { - rt_kprintf("hello rt-thread!\n"); + rt_kprintf("Hello AARCH64 !\n"); return 0; } diff --git a/bsp/cvitek/cv18xx_risc-v/applications/main.c b/bsp/cvitek/cv18xx_risc-v/applications/main.c index b2b04a83eae..458652d2728 100755 --- a/bsp/cvitek/cv18xx_risc-v/applications/main.c +++ b/bsp/cvitek/cv18xx_risc-v/applications/main.c @@ -22,11 +22,7 @@ int main(void) { -#ifdef RT_USING_SMART - rt_kprintf("Hello RT-Smart!\n"); -#else - rt_kprintf("Hello RISC-V!\n"); -#endif + rt_kprintf("Hello RISC-V/C906B !\n"); /* LED pin: C24 */ rt_uint16_t led = rt_pin_get(LED_PIN); From 4f40a740d287b80a93275675ea8fe93e11525898 Mon Sep 17 00:00:00 2001 From: hydevcode Date: Fri, 17 Jan 2025 21:16:29 +0800 Subject: [PATCH 11/51] [bsp/stm32] change the attach file of stm32f407-rt-spark to yml (#9926) --- .../.ci/attachconfig/ci.attachconfig.yml | 189 ++++++++++++++++++ .../attachconfig/kernel/klibc-stdlib.attach | 4 - .../attachconfig/kernel/klibc-tinysize.attach | 3 - .../kernel/klibc-vsnprintf-std.attach | 9 - .../.ci/attachconfig/nano.attach | 2 - .../online-packages/iot/at_devices.attach | 91 --------- .../online-packages/misc/misc.attach | 4 - .../online-packages/misc/vi.attach | 16 -- .../multimedia/lvgl/lvgl-v8.3-latest.attach | 5 - .../multimedia/lvgl/lvgl-v8.3.11.attach | 5 - .../multimedia/lvgl/lvgl-v8.4-latest.attach | 5 - .../system/enhanced-kservice.attach | 3 - .../online-packages/system/os-wrappers.attach | 2 - .../.ci/attachconfig/peripheral/aht21.attach | 1 - .../attachconfig/peripheral/ap3216c.attach | 1 - .../peripheral/ethernet_28j60.attach | 1 - .../peripheral/fal_easyflash.attach | 1 - .../attachconfig/peripheral/filesystem.attach | 2 - .../attachconfig/peripheral/icm20608.attach | 1 - .../attachconfig/peripheral/lcd_st7787.attach | 1 - .../attachconfig/peripheral/led_matrix.attach | 1 - .../.ci/attachconfig/peripheral/rs485.attach | 1 - .../.ci/attachconfig/peripheral/rw007.attach | 1 - .../peripheral/spi_flash_w25q64.attach | 1 - .../.ci/attachconfig/peripheral/sram.attach | 1 - .../attachconfig/peripheral/usb_mouse.attach | 1 - 26 files changed, 189 insertions(+), 163 deletions(-) create mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-stdlib.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-tinysize.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-vsnprintf-std.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/nano.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/iot/at_devices.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/misc/misc.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/misc/vi.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.3-latest.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.3.11.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.4-latest.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/system/enhanced-kservice.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/system/os-wrappers.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/aht21.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/ap3216c.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/ethernet_28j60.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/fal_easyflash.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/filesystem.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/icm20608.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/lcd_st7787.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/led_matrix.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/rs485.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/rw007.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/spi_flash_w25q64.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/sram.attach delete mode 100644 bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/usb_mouse.attach diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml new file mode 100644 index 00000000000..0ae089b8958 --- /dev/null +++ b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml @@ -0,0 +1,189 @@ +scons.args: &scons + scons_arg: + - '--strict' +# ------ kernel CI ------ +kernel.klibc-stdlib: + <<: *scons + kconfig: + - CONFIG_RT_KLIBC_USING_STDLIB=y + - CONFIG_RT_KLIBC_USING_STDLIB_MEMORY=y +kernel.klibc-tinysize: + <<: *scons + kconfig: + - CONFIG_RT_KLIBC_USING_TINY_SIZE=y +kernel.klibc-vsnprintf-std: + <<: *scons + kconfig: + - CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y + - CONFIG_RT_KLIBC_USING_PRINTF_LONGLONG=y + - CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y + - CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y + - CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y + - CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER=y + - CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS=y +# ------ online-packages CI ------ +online-packages.iot.at_devices: + <<: *scons + kconfig: + - CONFIG_PKG_USING_AT_DEVICE=y + # Quectel M26/MC20 + - CONFIG_AT_DEVICE_USING_M26=y + - CONFIG_AT_DEVICE_M26_INIT_ASYN=y + # Quectel EC20 + - CONFIG_AT_DEVICE_USING_EC20=y + - CONFIG_AT_DEVICE_EC20_INIT_ASYN=y + # Espressif ESP32 + - CONFIG_AT_DEVICE_USING_ESP32=y + - CONFIG_AT_DEVICE_ESP32_INIT_ASYN=y + # Espressif ESP8266 + - CONFIG_AT_DEVICE_USING_ESP8266=y + - CONFIG_AT_DEVICE_ESP8266_INIT_ASYN=y + # Realthread RW007 + - CONFIG_AT_DEVICE_USING_RW007=y + - CONFIG_AT_DEVICE_RW007_INIT_ASYN=y + # SIMCom SIM800C + - CONFIG_AT_DEVICE_USING_SIM800C=y + - CONFIG_AT_DEVICE_SIM800C_INIT_ASYN=y + # SIMCom SIM76XX + - CONFIG_AT_DEVICE_USING_SIM76XX=y + - CONFIG_AT_DEVICE_SIM76XX_INIT_ASYN=y + # Notion MW31 + - CONFIG_AT_DEVICE_USING_MW31=y + - CONFIG_AT_DEVICE_MW31_INIT_ASYN=y + # WinnerMicro W60X + - CONFIG_AT_DEVICE_USING_W60X=y + - CONFIG_AT_DEVICE_W60X_INIT_ASYN=y + # Ai-Think A9G + - CONFIG_AT_DEVICE_USING_A9G=y + - CONFIG_AT_DEVICE_A9G_INIT_ASYN=y + # Quectel BC26 + - CONFIG_AT_DEVICE_USING_BC26=y + - CONFIG_AT_DEVICE_BC26_INIT_ASYN=y + # luat Air720 + - CONFIG_AT_DEVICE_USING_AIR720=y + - CONFIG_AT_DEVICE_AIR720_INIT_ASYN=y + # Gosuncn ME3616 + - CONFIG_AT_DEVICE_USING_ME3616=y + - CONFIG_AT_DEVICE_ME3616_INIT_ASYN=y + # ChinaMobile M6315 + - CONFIG_AT_DEVICE_USING_M6315=y + - CONFIG_AT_DEVICE_M6315_INIT_ASYN=y + # Quectel BC28 + - CONFIG_AT_DEVICE_USING_BC28=y + - CONFIG_AT_DEVICE_BC28_INIT_ASYN=y + # Quectel EC200T/EC200S + - CONFIG_AT_DEVICE_USING_EC200X=y + - CONFIG_AT_DEVICE_EC200X_INIT_ASYN=y + # Neoway N21 + - CONFIG_AT_DEVICE_USING_N21=y + - CONFIG_AT_DEVICE_N21_INIT_ASYN=y + # Neoway N58 + - CONFIG_AT_DEVICE_USING_N58=y + - CONFIG_AT_DEVICE_N58_INIT_ASYN=y + # ChinaMobile M5311 + - CONFIG_AT_DEVICE_USING_M5311=y + - CONFIG_AT_DEVICE_M5311_INIT_ASYN=y + # Fibocom L610 + - CONFIG_AT_DEVICE_USING_L610=y + - CONFIG_AT_DEVICE_L610_INIT_ASYN=y + # Neoway N720 + - CONFIG_AT_DEVICE_USING_N720=y + - CONFIG_AT_DEVICE_N720_INIT_ASYN=y + # Gosuncn ML305 + - CONFIG_AT_DEVICE_USING_ML305=y + - CONFIG_AT_DEVICE_ML305_INIT_ASYN=y +online-packages.misc.misc: + <<: *scons + kconfig: + - CONFIG_PKG_USING_MULTIBUTTON=y +online-packages.misc.vi: + <<: *scons + kconfig: + - CONFIG_PKG_USING_VI=y + # - CONFIG_VI_ENABLE_8BIT=y + - CONFIG_VI_ENABLE_COLON=y + - CONFIG_VI_ENABLE_COLON_EXPAND=y + - CONFIG_VI_ENABLE_YANKMARK=y + - CONFIG_VI_ENABLE_SEARCH=y + - CONFIG_VI_ENABLE_DOT_CMD=y + - CONFIG_VI_ENABLE_READONLY=y + - CONFIG_VI_ENABLE_SETOPTS=y + - CONFIG_VI_ENABLE_SET=y + - CONFIG_VI_ENABLE_WIN_RESIZE=y + - CONFIG_VI_ENABLE_VI_ASK_TERMINAL=y + - CONFIG_VI_ENABLE_UNDO=y + - CONFIG_VI_ENABLE_UNDO_QUEUE=y + - CONFIG_VI_ENABLE_VERBOSE_STATUS=y +online-packages.multimedia.lvgl-v8.3-latest: + <<: *scons + kconfig: + - CONFIG_BSP_USING_LVGL=y + - CONFIG_BSP_USING_LVGL_DEMO=y + - CONFIG_PKG_LVGL_USING_V8_3_LATEST=y +online-packages.multimedia.lvgl-v8.3.11: + <<: *scons + kconfig: + - CONFIG_BSP_USING_LVGL=y + - CONFIG_BSP_USING_LVGL_DEMO=y + - CONFIG_PKG_LVGL_USING_V080311=y +online-packages.multimedia.lvgl-v8.4-latest: + <<: *scons + kconfig: + - CONFIG_BSP_USING_LVGL=y + - CONFIG_BSP_USING_LVGL_DEMO=y + - CONFIG_PKG_LVGL_USING_V8_4_LATEST=y +online-packages.system.enhanced-kservice: + <<: *scons + kconfig: + - CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE=y + - CONFIG_PKG_USING_RT_MEMCPY_CM=y +online-packages.system.os-wrappers: + <<: *scons + kconfig: + - CONFIG_PKG_USING_FREERTOS_WRAPPER=y +# ------ peripheral CI ------ +peripheral.aht21: + kconfig: + - CONFIG_BSP_USING_AHT21=y +peripheral.ap3216c: + kconfig: + - CONFIG_BSP_USING_AP3216C=y +peripheral.ethernet_28j60: + kconfig: + - CONFIG_BSP_USING_ENC28j60=y +peripheral.fal_easyflash: + kconfig: + - CONFIG_BSP_USING_EASYFLASH=y +peripheral.filesystem: + kconfig: + - CONFIG_BSP_USING_FS=y + - CONFIG_BSP_USING_FLASH_FATFS=y +peripheral.icm20608: + kconfig: + - CONFIG_BSP_USING_ICM20608=y +peripheral.lcd_st7787: + kconfig: + - CONFIG_BSP_USING_ONBOARD_LCD=y +peripheral.led_matrix: + kconfig: + - CONFIG_BSP_USING_ONBOARD_LED_MATRIX=y +peripheral.rs485: + kconfig: + - CONFIG_BSP_USING_RS485=y +peripheral.rw007: + kconfig: + - CONFIG_BSP_USING_RW007_WLAN=y +peripheral.spi_flash_w25q64: + kconfig: + - CONFIG_BSP_USING_SPI_FLASH=y +peripheral.sram: + kconfig: + - CONFIG_BSP_USING_SRAM=y +peripheral.usb_mouse: + kconfig: + - CONFIG_BSP_USING_USB_MOUSE=y +# ------ nano CI ------ +nano: + <<: *scons + kconfig: + - CONFIG_RT_USING_NANO=y \ No newline at end of file diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-stdlib.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-stdlib.attach deleted file mode 100644 index 92d7428b782..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-stdlib.attach +++ /dev/null @@ -1,4 +0,0 @@ -# scons: --strict - -CONFIG_RT_KLIBC_USING_STDLIB=y -CONFIG_RT_KLIBC_USING_STDLIB_MEMORY=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-tinysize.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-tinysize.attach deleted file mode 100644 index a0e4bddb24a..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-tinysize.attach +++ /dev/null @@ -1,3 +0,0 @@ -# scons: --strict - -CONFIG_RT_KLIBC_USING_TINY_SIZE=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-vsnprintf-std.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-vsnprintf-std.attach deleted file mode 100644 index 560367ef34e..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/kernel/klibc-vsnprintf-std.attach +++ /dev/null @@ -1,9 +0,0 @@ -# scons: --strict - -CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y -CONFIG_RT_KLIBC_USING_PRINTF_LONGLONG=y -CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y -CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y -CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y -CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER=y -CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/nano.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/nano.attach deleted file mode 100644 index f1ad05b2391..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/nano.attach +++ /dev/null @@ -1,2 +0,0 @@ -# scons: --strict -CONFIG_RT_USING_NANO=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/iot/at_devices.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/iot/at_devices.attach deleted file mode 100644 index 014a10cbc2c..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/iot/at_devices.attach +++ /dev/null @@ -1,91 +0,0 @@ -# scons: --strict - -CONFIG_PKG_USING_AT_DEVICE=y - -# Quectel M26/MC20 -CONFIG_AT_DEVICE_USING_M26=y -CONFIG_AT_DEVICE_M26_INIT_ASYN=y - -# Quectel EC20 -CONFIG_AT_DEVICE_USING_EC20=y -CONFIG_AT_DEVICE_EC20_INIT_ASYN=y - -# Espressif ESP32 -CONFIG_AT_DEVICE_USING_ESP32=y -CONFIG_AT_DEVICE_ESP32_INIT_ASYN=y - -# Espressif ESP8266 -CONFIG_AT_DEVICE_USING_ESP8266=y -CONFIG_AT_DEVICE_ESP8266_INIT_ASYN=y - -# Realthread RW007 -CONFIG_AT_DEVICE_USING_RW007=y -CONFIG_AT_DEVICE_RW007_INIT_ASYN=y - -# SIMCom SIM800C -CONFIG_AT_DEVICE_USING_SIM800C=y -CONFIG_AT_DEVICE_SIM800C_INIT_ASYN=y - -# SIMCom SIM76XX -CONFIG_AT_DEVICE_USING_SIM76XX=y -CONFIG_AT_DEVICE_SIM76XX_INIT_ASYN=y - -# Notion MW31 -CONFIG_AT_DEVICE_USING_MW31=y -CONFIG_AT_DEVICE_MW31_INIT_ASYN=y - -# WinnerMicro W60X -CONFIG_AT_DEVICE_USING_W60X=y -CONFIG_AT_DEVICE_W60X_INIT_ASYN=y - -# Ai-Think A9G -CONFIG_AT_DEVICE_USING_A9G=y -CONFIG_AT_DEVICE_A9G_INIT_ASYN=y - -# Quectel BC26 -CONFIG_AT_DEVICE_USING_BC26=y -CONFIG_AT_DEVICE_BC26_INIT_ASYN=y - -# luat Air720 -CONFIG_AT_DEVICE_USING_AIR720=y -CONFIG_AT_DEVICE_AIR720_INIT_ASYN=y - -# Gosuncn ME3616 -CONFIG_AT_DEVICE_USING_ME3616=y -CONFIG_AT_DEVICE_ME3616_INIT_ASYN=y - -# ChinaMobile M6315 -CONFIG_AT_DEVICE_USING_M6315=y -CONFIG_AT_DEVICE_M6315_INIT_ASYN=y - -# Quectel BC28 -CONFIG_AT_DEVICE_USING_BC28=y -CONFIG_AT_DEVICE_BC28_INIT_ASYN=y - -# Quectel EC200T/EC200S -CONFIG_AT_DEVICE_USING_EC200X=y -CONFIG_AT_DEVICE_EC200X_INIT_ASYN=y - -# Neoway N21 -CONFIG_AT_DEVICE_USING_N21=y -CONFIG_AT_DEVICE_N21_INIT_ASYN=y - -# Neoway N58 -CONFIG_AT_DEVICE_USING_N58=y -CONFIG_AT_DEVICE_N58_INIT_ASYN=y - -# ChinaMobile M5311 -CONFIG_AT_DEVICE_USING_M5311=y -CONFIG_AT_DEVICE_M5311_INIT_ASYN=y - -# Fibocom L610 -CONFIG_AT_DEVICE_USING_L610=y -CONFIG_AT_DEVICE_L610_INIT_ASYN=y - -# Neoway N720 -CONFIG_AT_DEVICE_USING_N720=y -CONFIG_AT_DEVICE_N720_INIT_ASYN=y - -# Gosuncn ML305 -CONFIG_AT_DEVICE_USING_ML305=y -CONFIG_AT_DEVICE_ML305_INIT_ASYN=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/misc/misc.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/misc/misc.attach deleted file mode 100644 index 10ca7940047..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/misc/misc.attach +++ /dev/null @@ -1,4 +0,0 @@ -# scons: --strict - -# MultiButton -CONFIG_PKG_USING_MULTIBUTTON=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/misc/vi.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/misc/vi.attach deleted file mode 100644 index 29acf55118f..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/misc/vi.attach +++ /dev/null @@ -1,16 +0,0 @@ -# scons: --strict -CONFIG_PKG_USING_VI=y -# CONFIG_VI_ENABLE_8BIT=y -CONFIG_VI_ENABLE_COLON=y -CONFIG_VI_ENABLE_COLON_EXPAND=y -CONFIG_VI_ENABLE_YANKMARK=y -CONFIG_VI_ENABLE_SEARCH=y -CONFIG_VI_ENABLE_DOT_CMD=y -CONFIG_VI_ENABLE_READONLY=y -CONFIG_VI_ENABLE_SETOPTS=y -CONFIG_VI_ENABLE_SET=y -CONFIG_VI_ENABLE_WIN_RESIZE=y -CONFIG_VI_ENABLE_VI_ASK_TERMINAL=y -CONFIG_VI_ENABLE_UNDO=y -CONFIG_VI_ENABLE_UNDO_QUEUE=y -CONFIG_VI_ENABLE_VERBOSE_STATUS=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.3-latest.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.3-latest.attach deleted file mode 100644 index a78c274465c..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.3-latest.attach +++ /dev/null @@ -1,5 +0,0 @@ -# scons: --strict - -CONFIG_BSP_USING_LVGL=y -CONFIG_BSP_USING_LVGL_DEMO=y -CONFIG_PKG_LVGL_USING_V8_3_LATEST=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.3.11.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.3.11.attach deleted file mode 100644 index e1305a8091d..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.3.11.attach +++ /dev/null @@ -1,5 +0,0 @@ -# scons: --strict - -CONFIG_BSP_USING_LVGL=y -CONFIG_BSP_USING_LVGL_DEMO=y -CONFIG_PKG_LVGL_USING_V080311=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.4-latest.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.4-latest.attach deleted file mode 100644 index 7179f1247ba..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/multimedia/lvgl/lvgl-v8.4-latest.attach +++ /dev/null @@ -1,5 +0,0 @@ -# scons: --strict - -CONFIG_BSP_USING_LVGL=y -CONFIG_BSP_USING_LVGL_DEMO=y -CONFIG_PKG_LVGL_USING_V8_4_LATEST=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/system/enhanced-kservice.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/system/enhanced-kservice.attach deleted file mode 100644 index 12a310f9ed5..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/system/enhanced-kservice.attach +++ /dev/null @@ -1,3 +0,0 @@ -# scons: --strict -CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE=y -CONFIG_PKG_USING_RT_MEMCPY_CM=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/system/os-wrappers.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/system/os-wrappers.attach deleted file mode 100644 index 216d8f1fef3..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/online-packages/system/os-wrappers.attach +++ /dev/null @@ -1,2 +0,0 @@ -# scons: --strict -CONFIG_PKG_USING_FREERTOS_WRAPPER=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/aht21.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/aht21.attach deleted file mode 100644 index e9269471b5c..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/aht21.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_AHT21=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/ap3216c.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/ap3216c.attach deleted file mode 100644 index b8da5bcfb3b..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/ap3216c.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_AP3216C=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/ethernet_28j60.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/ethernet_28j60.attach deleted file mode 100644 index 085b183d92d..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/ethernet_28j60.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_ENC28j60=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/fal_easyflash.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/fal_easyflash.attach deleted file mode 100644 index 70aac6f9746..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/fal_easyflash.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_EASYFLASH=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/filesystem.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/filesystem.attach deleted file mode 100644 index 72c479e8d05..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/filesystem.attach +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_BSP_USING_FS=y -CONFIG_BSP_USING_FLASH_FATFS=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/icm20608.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/icm20608.attach deleted file mode 100644 index 922671ca355..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/icm20608.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_ICM20608=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/lcd_st7787.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/lcd_st7787.attach deleted file mode 100644 index c4044805ae6..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/lcd_st7787.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_ONBOARD_LCD=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/led_matrix.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/led_matrix.attach deleted file mode 100644 index 7c184020222..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/led_matrix.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_ONBOARD_LED_MATRIX=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/rs485.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/rs485.attach deleted file mode 100644 index 144fb35d85d..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/rs485.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_RS485=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/rw007.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/rw007.attach deleted file mode 100644 index be96228ae15..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/rw007.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_RW007_WLAN=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/spi_flash_w25q64.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/spi_flash_w25q64.attach deleted file mode 100644 index a2a4b419932..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/spi_flash_w25q64.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_SPI_FLASH=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/sram.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/sram.attach deleted file mode 100644 index 516182d2b51..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/sram.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_SRAM=y diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/usb_mouse.attach b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/usb_mouse.attach deleted file mode 100644 index ad9c397d8bc..00000000000 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/peripheral/usb_mouse.attach +++ /dev/null @@ -1 +0,0 @@ -CONFIG_BSP_USING_USB_MOUSE=y From ab1f4381616bbc233904db9a5fb16fe7e42332ca Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Fri, 17 Jan 2025 15:18:37 +0800 Subject: [PATCH 12/51] bsp: cvitek: optimze build operations for aarch64 For bsp/cvitek, duo256m, the operation process is slightly different when building images for riscv and arm64. To improve the user experience, unify the building process and steps of the two as follows: - Enter c906_little and execute `scons` - Enter cv18xx_riscv/cv18xx_aarch64 and execute `scons` That's all. Finally, we can get `fip.bin` and `boot.sd` under `bsp/cvitek/output/milkv-duo256m`. Update the README.md accordingly. Signed-off-by: Chen Wang --- bsp/cvitek/cv18xx_aarch64/README.md | 24 +++++++++--------------- bsp/cvitek/cv18xx_aarch64/rtconfig.py | 2 +- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/bsp/cvitek/cv18xx_aarch64/README.md b/bsp/cvitek/cv18xx_aarch64/README.md index 5fe11229f75..e792c698da4 100644 --- a/bsp/cvitek/cv18xx_aarch64/README.md +++ b/bsp/cvitek/cv18xx_aarch64/README.md @@ -9,7 +9,6 @@ - [2.3.1. 开发板选择](#231-开发板选择) - [2.3.2. 开启 RT-Smart](#232-开启-rt-smart) - [2.3.3. 编译大核固件 `boot.sd`](#233-编译大核固件-bootsd) - - [2.3.4. 编译小核固件 `fip.bin`](#234-编译小核固件-fipbin) - [3. 运行](#3-运行) - [3.1. RT-Thread 标准版的例子](#31-rt-thread-标准版的例子) - [3.2. RT-Thread Smart 版的例子](#32-rt-thread-smart-版的例子) @@ -49,7 +48,11 @@ export RTT_EXEC_PATH=/opt/aarch64-linux-musleabi_for_x86_64-pc-linux-gnu/bin ## 2.3. 执行构建 -这里我们只需要构建 ARM 大核的 OS,进入 `bsp/cvitek/cv18xx_aarch64` 目录下(记为当前工作目录 `$CWD`),依次执行以下步骤: +首先确保 RISC-V 小核已经构建完成并生成了 `rtthread.bin` 和 `fip.bin`。Duo 256m 的小核是一个 RISC-V 的 core,对应的 bsp 是 `bsp/cvitek/c906_little`。具体构建的说明参考 [bsp cvitek 的 README.md 文件](../README.md)。 + +`fip.bin` 是一个打包后生成的 bin 文件,包含了 `fsbl`、`uboot` 以及小核的内核镜像文件 `rtthread.bin`。但注意 BSP `c906_little` 构建生成的 `fip.bin` 中的 `fsbl`、`uboot` 这些文件都是 RISC-V 的,所以我们并不能把 BSP `c906_little` 构建生成的 `fip.bin` 直接拿来用于引导启动 ARM 大核。我们这一步只是确保先基于 BSP `c906_little` 做出最新的小核版本 `rtthread.bin`。在下一步构建大核的过程中我们会重新打包更新并生成新的 `fip.bin`,而在重新打包过程中我们需要这个小核的 `rtthread.bin`。 + +这里我们主要关注如何构建 ARM 大核的 `rtthread.bin`。进入 `bsp/cvitek/cv18xx_aarch64` 目录下(记为当前工作目录 `$CWD`),依次执行以下步骤: ### 2.3.1. 开发板选择 @@ -74,20 +77,11 @@ RT-Thread Kernel ---> $ scons ``` -如果编译正确无误,在 $CWD 下会产生 `rtthread.elf`, `rtthread.bin` 文件。同时在 `$CWD/../output/milkv-duo256m/` 下生成 `boot.sd` 文件,`boot.sd` 中封装了 RT-Thread 的内核 `rtthread.bin`。 - -### 2.3.4. 编译小核固件 `fip.bin` - -`fip.bin`:这是一个打包后生成的 bin 文件,包含了 `fsbl`、`uboot` 以及小核的内核镜像文件 `rtthread.bin`。Duo 256m 的小核是一个 RISC-V 的 core,对应的 bsp 是 c906_little。具体构建的说明参考 [对应的 README 文件](../README.md)。但注意 BSP `c906_little` 构建生成的 `fip.bin` 中的 `fsbl`、`uboot` 这些文件都是 RISC-V 的,所以我们并不能把 BSP `c906_little` 构建生成的 `fip.bin` 直接拿来用。 +scons 会执行如下步骤的工作: -为此 BSP `cv18xx_aarch64` 下预先提供了 ARM 核上可以运行的 `fsbl`、`uboot` 等文件,在 `bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m` 下,可以用来打包生成 ARM 的 `fip.bin`。具体打包的脚本是 BSP `cv18xx_aarch64` 目录下的 `combine.sh`。 - -所以如果您需要使用最新的小核版本,可以先基于 BSP `c906_little` 做出 `rtthread.bin`,然后在 cv18xx_aarch64 目录下运行 `combine.sh` 即可生成 ARM 可用的 `fip.bin`。生成路径和 `boot.sd` 一样,在 `$CWD/../output/milkv-duo256m/` 下。 - -```shell -$ cd $CWD -$ ./combine.sh -``` +- 如果编译正确无误,在 `$CWD` 下会产生 `rtthread.bin` 文件。 +- 通过运行 `combine.sh`,利用 BSP `cv18xx_aarch64` 下预先提供的、可以在 ARM 核上运行的 `fsbl`、`uboot` 等文件,加上基于 BSP `c906_little` 做出的 `rtthread.bin`,重新打包生成可供 ARM 大核解析和运行的 `fip.bin`。`fip.bin` 会生成在 `$CWD/../output/milkv-duo256m/` 下。 +- 在 `$CWD/../output/milkv-duo256m/` 下生成 `boot.sd` 文件,`boot.sd` 中封装了 ARM 大核对应的 `rtthread.bin`。 如果您不关心小核的版本,BSP cv18xx_aarch64 也提供了一个 prebuild 的 `fip.bin`,在 `bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m` 下,直接烧录到 sd-card 中就可以使用。 diff --git a/bsp/cvitek/cv18xx_aarch64/rtconfig.py b/bsp/cvitek/cv18xx_aarch64/rtconfig.py index 54ea2201bb4..9ebc3491fa9 100644 --- a/bsp/cvitek/cv18xx_aarch64/rtconfig.py +++ b/bsp/cvitek/cv18xx_aarch64/rtconfig.py @@ -46,4 +46,4 @@ DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n' POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' POST_ACTION += OBJCPY + ' -O binary $TARGET Image \n' + SIZE + ' $TARGET \n' -POST_ACTION += 'cd .. && bash mksdimg.sh ' + os.getcwd() + ' Image \n' +POST_ACTION += './combine.sh && cd .. && bash mksdimg.sh ' + os.getcwd() + ' Image \n' From 77e95594db92ba4beac83b39e7b0920f0edd39cf Mon Sep 17 00:00:00 2001 From: Jamie <48308473+JamieTx@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:13:22 +0800 Subject: [PATCH 13/51] [BSP] add some bsp drivers for F448, F472 and add bsp test codes --- bsp/hc32/ev_hc32f448_lqfp80/.config | 280 +- bsp/hc32/ev_hc32f448_lqfp80/.cproject | 22 +- bsp/hc32/ev_hc32f448_lqfp80/.project | 10 + bsp/hc32/ev_hc32f448_lqfp80/README.md | 52 +- bsp/hc32/ev_hc32f448_lqfp80/SConstruct | 8 +- bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig | 37 +- bsp/hc32/ev_hc32f448_lqfp80/board/SConscript | 12 +- bsp/hc32/ev_hc32f448_lqfp80/board/board.c | 22 +- .../ev_hc32f448_lqfp80/board/board_config.c | 126 +- .../ev_hc32f448_lqfp80/board/board_config.h | 46 +- .../board/config/adc_config.h | 7 +- .../board/config/can_config.h | 381 +- .../board/config/dac_config.h | 12 +- .../board/config/dma_config.h | 10 + .../board/config/irq_config.h | 68 +- .../board/config/pulse_encoder_config.h | 436 +- .../board/config/pwm_tmr_config.h | 218 - .../board/config/qspi_config.h | 7 +- .../ev_hc32f448_lqfp80/board/drv_config.h | 3 +- .../ev_hc32f448_lqfp80/board/hc32f4xx_conf.h | 2 +- .../ev_hc32f448_lqfp80/board/ports/SConscript | 12 - .../board/ports/drv_spi_flash.c | 122 - .../board/ports/fal/SConscript | 20 - .../board/ports/fal/fal_flash_sfud_port.c | 85 - .../board/ports/{fal => }/fal_cfg.h | 0 .../ev_hc32f448_lqfp80/board/ports/tca9539.c | 320 - .../ev_hc32f448_lqfp80/board/ports/tca9539.h | 133 - .../board/ports/tca9539_port.h | 62 + .../jlink/ev_hc32f448_lqfp80 Debug.launch | 2 +- bsp/hc32/ev_hc32f448_lqfp80/project.ewd | 40 +- bsp/hc32/ev_hc32f448_lqfp80/project.ewp | 197 +- bsp/hc32/ev_hc32f448_lqfp80/project.uvoptx | 8 +- bsp/hc32/ev_hc32f448_lqfp80/project.uvprojx | 319 +- bsp/hc32/ev_hc32f448_lqfp80/rtconfig.h | 151 +- bsp/hc32/ev_hc32f448_lqfp80/template.uvoptx | 8 +- bsp/hc32/ev_hc32f448_lqfp80/template.uvprojx | 10 +- bsp/hc32/ev_hc32f460_lqfp100_v2/.config | 273 +- bsp/hc32/ev_hc32f460_lqfp100_v2/.cproject | 20 +- bsp/hc32/ev_hc32f460_lqfp100_v2/.project | 10 + bsp/hc32/ev_hc32f460_lqfp100_v2/README.md | 38 +- bsp/hc32/ev_hc32f460_lqfp100_v2/SConstruct | 8 +- .../applications/xtal32_fcm.c | 5 +- bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig | 80 +- .../ev_hc32f460_lqfp100_v2/board/SConscript | 9 +- bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c | 27 +- .../board/board_config.c | 77 +- .../board/board_config.h | 92 +- .../board/config/adc_config.h | 48 +- .../board/config/can_config.h | 42 +- .../board/config/dma_config.h | 18 + .../board/config/irq_config.h | 88 +- .../board/config/pm_config.h | 7 +- .../board/config/pulse_encoder_config.h | 126 +- .../board/config/tmr_capture_config.h | 69 + .../board/config/uart_config.h | 2 +- .../ev_hc32f460_lqfp100_v2/board/drv_config.h | 1 + .../board/hc32f4xx_conf.h | 2 +- .../board/ports/SConscript | 12 - .../board/ports/drv_spi_flash.c | 121 - .../board/ports/fal/SConscript | 20 - .../board/ports/fal/fal_flash_sfud_port.c | 84 - .../board/ports/{fal => }/fal_cfg.h | 0 .../jlink/ev_hc32f460_lqfp100_v2 Debug.launch | 2 +- bsp/hc32/ev_hc32f460_lqfp100_v2/project.ewd | 8 +- bsp/hc32/ev_hc32f460_lqfp100_v2/project.ewp | 228 +- .../ev_hc32f460_lqfp100_v2/project.uvoptx | 6 +- .../ev_hc32f460_lqfp100_v2/project.uvprojx | 364 +- bsp/hc32/ev_hc32f460_lqfp100_v2/rtconfig.h | 147 +- .../settings/project.dni | 2 +- .../ev_hc32f460_lqfp100_v2/template.uvoptx | 6 +- .../ev_hc32f460_lqfp100_v2/template.uvprojx | 4 +- bsp/hc32/ev_hc32f472_lqfp100/.config | 381 +- bsp/hc32/ev_hc32f472_lqfp100/.cproject | 224 + bsp/hc32/ev_hc32f472_lqfp100/.project | 78 + bsp/hc32/ev_hc32f472_lqfp100/README.md | 69 +- bsp/hc32/ev_hc32f472_lqfp100/SConstruct | 4 + bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig | 75 +- bsp/hc32/ev_hc32f472_lqfp100/board/SConscript | 1 + bsp/hc32/ev_hc32f472_lqfp100/board/board.c | 36 +- .../ev_hc32f472_lqfp100/board/board_config.c | 123 +- .../ev_hc32f472_lqfp100/board/board_config.h | 126 +- .../board/config/adc_config.h | 9 +- .../board/config/can_config.h | 18 +- .../board/config/dac_config.h | 18 + .../board/config/irq_config.h | 115 +- .../board/config/pulse_encoder_config.h | 404 +- .../board/config/pwm_tmr_config.h | 360 +- .../board/config/timer_config.h | 19 + .../board/config/usb_config/usb_app_conf.h | 97 + .../board/config/usb_config/usb_bsp.h | 42 + .../ev_hc32f472_lqfp100/board/drv_config.h | 3 +- .../ev_hc32f472_lqfp100/board/hc32f4xx_conf.h | 11 +- .../board/linker_scripts/link.ld | 36 +- .../ev_hc32f472_lqfp100/board/ports/fal_cfg.h | 2 +- .../jlink/ev_hc32f472_lqfp100 Debug.launch | 80 + bsp/hc32/ev_hc32f472_lqfp100/project.ewp | 185 +- bsp/hc32/ev_hc32f472_lqfp100/project.uvprojx | 299 +- bsp/hc32/ev_hc32f472_lqfp100/rtconfig.h | 169 +- bsp/hc32/ev_hc32f4a0_lqfp176/.config | 281 +- bsp/hc32/ev_hc32f4a0_lqfp176/.cproject | 22 +- bsp/hc32/ev_hc32f4a0_lqfp176/.project | 10 + bsp/hc32/ev_hc32f4a0_lqfp176/README.md | 4 +- bsp/hc32/ev_hc32f4a0_lqfp176/SConstruct | 8 +- bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig | 198 +- bsp/hc32/ev_hc32f4a0_lqfp176/board/SConscript | 12 +- bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c | 25 +- .../ev_hc32f4a0_lqfp176/board/board_config.c | 58 +- .../ev_hc32f4a0_lqfp176/board/board_config.h | 27 +- .../board/config/adc_config.h | 59 + .../board/config/dma_config.h | 27 + .../board/config/irq_config.h | 31 +- .../board/config/pm_config.h | 5 +- .../board/config/pulse_encoder_config.h | 40 +- .../board/config/tmr_capture_config.h | 69 + .../board/config/usb_config/usb_app_conf.h | 12 +- .../ev_hc32f4a0_lqfp176/board/drv_config.h | 1 + .../ev_hc32f4a0_lqfp176/board/hc32f4xx_conf.h | 2 +- .../board/ports/SConscript | 12 - .../board/ports/drv_spi_flash.c | 121 - .../board/ports/fal/SConscript | 20 - .../board/ports/fal/fal_flash_sfud_port.c | 84 - .../board/ports/{fal => }/fal_cfg.h | 0 .../board/ports/sdram_port.h | 2 - .../ev_hc32f4a0_lqfp176/board/ports/tca9539.c | 319 - .../board/ports/tca9539_port.h} | 76 +- .../jlink/ev_hc32f4a0_lqfp176 Debug.launch | 2 +- bsp/hc32/ev_hc32f4a0_lqfp176/project.ewd | 30 +- bsp/hc32/ev_hc32f4a0_lqfp176/project.ewp | 205 +- bsp/hc32/ev_hc32f4a0_lqfp176/project.uvoptx | 8 +- bsp/hc32/ev_hc32f4a0_lqfp176/project.uvprojx | 330 +- bsp/hc32/ev_hc32f4a0_lqfp176/rtconfig.h | 150 +- .../ev_hc32f4a0_lqfp176/settings/project.dni | 2 +- bsp/hc32/ev_hc32f4a0_lqfp176/template.uvoptx | 8 +- bsp/hc32/ev_hc32f4a0_lqfp176/template.uvprojx | 13 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/.config | 147 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/.cproject | 22 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/.project | 10 + bsp/hc32/lckfb-hc32f4a0-lqfp100/SConstruct | 8 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/board/Kconfig | 1 + .../lckfb-hc32f4a0-lqfp100/board/SConscript | 12 +- .../board/board_config.c | 2 +- .../board/config/irq_config.h | 13 +- .../board/config/pulse_encoder_config.h | 40 +- .../board/config/usb_config/usb_app_conf.h | 12 +- .../board/ports/SConscript | 12 - .../board/ports/drv_spi_flash.c | 121 - .../board/ports/fal/SConscript | 20 - .../board/ports/fal/fal_flash_sfud_port.c | 84 - .../board/ports/{fal => }/fal_cfg.h | 0 .../board/ports/tca9539.c | 319 - .../board/ports/tca9539_port.h} | 76 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/project.ewd | 12 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/project.ewp | 205 +- .../lckfb-hc32f4a0-lqfp100/project.uvoptx | 916 - .../lckfb-hc32f4a0-lqfp100/project.uvprojx | 1643 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/rtconfig.h | 74 +- bsp/hc32/libraries/hc32_drivers/SConscript | 10 +- bsp/hc32/libraries/hc32_drivers/drv_adc.c | 8 +- bsp/hc32/libraries/hc32_drivers/drv_adc.h | 1 - bsp/hc32/libraries/hc32_drivers/drv_can.c | 215 +- bsp/hc32/libraries/hc32_drivers/drv_common.c | 24 +- bsp/hc32/libraries/hc32_drivers/drv_common.h | 2 +- bsp/hc32/libraries/hc32_drivers/drv_crypto.c | 30 +- bsp/hc32/libraries/hc32_drivers/drv_dac.c | 49 +- .../hc32_drivers/drv_flash/drv_flash_f4.c | 25 +- bsp/hc32/libraries/hc32_drivers/drv_gpio.c | 83 + bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c | 40 +- bsp/hc32/libraries/hc32_drivers/drv_irq.c | 56 +- bsp/hc32/libraries/hc32_drivers/drv_mcan.c | 1228 + bsp/hc32/libraries/hc32_drivers/drv_mcan.h | 54 + bsp/hc32/libraries/hc32_drivers/drv_nand.c | 25 +- bsp/hc32/libraries/hc32_drivers/drv_pm.c | 18 +- bsp/hc32/libraries/hc32_drivers/drv_pm.h | 2 +- .../hc32_drivers/drv_pulse_encoder.c | 295 +- bsp/hc32/libraries/hc32_drivers/drv_pwm.c | 99 +- bsp/hc32/libraries/hc32_drivers/drv_qspi.c | 18 +- bsp/hc32/libraries/hc32_drivers/drv_rtc.c | 46 +- bsp/hc32/libraries/hc32_drivers/drv_sdram.c | 2 + .../libraries/hc32_drivers/drv_soft_i2c.c | 4 +- .../libraries/hc32_drivers/drv_soft_i2c.h | 1 - .../libraries/hc32_drivers/drv_tmr_capture.c | 475 + .../libraries/hc32_drivers/drv_tmr_capture.h | 44 + .../libraries/hc32_drivers/drv_usart_v2.c | 3 +- bsp/hc32/libraries/hc32_drivers/drv_usbd.c | 69 +- bsp/hc32/libraries/hc32_drivers/drv_usbd.h | 3 - bsp/hc32/libraries/hc32_drivers/drv_usbh.c | 55 +- bsp/hc32/libraries/hc32_drivers/drv_usbh.h | 3 - bsp/hc32/libraries/hc32_drivers/drv_wdt.c | 14 +- bsp/hc32/libraries/hc32_drivers/drv_wktm.c | 21 +- bsp/hc32/libraries/hc32_drivers/drv_wktm.h | 2 +- bsp/hc32/libraries/hc32f448_ddl/SConscript | 86 +- .../Device/HDSC/hc32f4xx/Include/hc32f448.h | 0 .../Device/HDSC/hc32f4xx/Include/hc32f4xx.h | 0 .../HDSC/hc32f4xx/Include/system_hc32f448.h | 0 .../Source/ARM/flashloader/HC32F448_128K.FLM | Bin .../Source/ARM/flashloader/HC32F448_256K.FLM | Bin .../Source/ARM/flashloader/HC32F448_RAM.FLM | Bin .../Source/ARM/flashloader/HC32F448_otp.FLM | Bin .../hc32f4xx/Source/ARM/flashloader/ram.ini | 0 .../HDSC/hc32f4xx/Source/ARM/sfr/HC32F448.SFR | Bin .../hc32f4xx/Source/ARM/startup_hc32f448.s | 0 .../hc32f4xx/Source/GCC/linker/HC32F448xA.ld | 0 .../hc32f4xx/Source/GCC/linker/HC32F448xC.ld | 0 .../hc32f4xx/Source/GCC/startup_hc32f448.S | 2 +- .../HDSC/hc32f4xx/Source/GCC/svd/HC32F448.svd | 0 .../Source/IAR}/flashloader/FlashHC32F448.mac | 0 .../Source/IAR}/flashloader/FlashHC32F448.out | Bin .../IAR/flashloader/FlashHC32F448_otp.flash | 10 + .../IAR}/flashloader/FlashHC32F448_otp.out | Bin .../IAR}/flashloader/FlashHC32F448_qspi.flash | 2 +- .../IAR}/flashloader/FlashHC32F448_qspi.out | Bin .../IAR/flashloader/FlashHC32F448xA.board | 16 + .../IAR/flashloader/FlashHC32F448xA.flash | 10 + .../IAR/flashloader/FlashHC32F448xC.board | 16 + .../IAR/flashloader/FlashHC32F448xC.flash | 10 + .../Source/IAR/linker/HC32F448_RAM.icf | 0 .../hc32f4xx/Source/IAR/linker/HC32F448xA.icf | 0 .../hc32f4xx/Source/IAR/linker/HC32F448xC.icf | 0 .../hc32f4xx/Source/IAR/startup_hc32f448.s | 0 .../HDSC/hc32f4xx/Source/IAR/svd/HC32F448.svd | 0 .../HDSC/hc32f4xx/Source/system_hc32f448.c | 0 .../cmsis/Include/arm_common_tables.h | 0 .../cmsis/Include/arm_const_structs.h | 0 .../cmsis/Include/arm_helium_utils.h | 0 .../{drivers => }/cmsis/Include/arm_math.h | 0 .../cmsis/Include/arm_mve_tables.h | 0 .../cmsis/Include/arm_vec_math.h | 0 .../cmsis/Include/cachel1_armv7.h | 0 .../{drivers => }/cmsis/Include/cmsis_armcc.h | 0 .../cmsis/Include/cmsis_armclang.h | 0 .../cmsis/Include/cmsis_armclang_ltm.h | 0 .../cmsis/Include/cmsis_compiler.h | 0 .../{drivers => }/cmsis/Include/cmsis_gcc.h | 0 .../cmsis/Include/cmsis_iccarm.h | 0 .../cmsis/Include/cmsis_version.h | 0 .../cmsis/Include/core_armv81mml.h | 0 .../cmsis/Include/core_armv8mbl.h | 0 .../cmsis/Include/core_armv8mml.h | 0 .../{drivers => }/cmsis/Include/core_cm0.h | 0 .../cmsis/Include/core_cm0plus.h | 0 .../{drivers => }/cmsis/Include/core_cm1.h | 0 .../{drivers => }/cmsis/Include/core_cm23.h | 0 .../{drivers => }/cmsis/Include/core_cm3.h | 0 .../{drivers => }/cmsis/Include/core_cm33.h | 0 .../{drivers => }/cmsis/Include/core_cm35p.h | 0 .../{drivers => }/cmsis/Include/core_cm4.h | 0 .../{drivers => }/cmsis/Include/core_cm55.h | 0 .../{drivers => }/cmsis/Include/core_cm7.h | 0 .../{drivers => }/cmsis/Include/core_sc000.h | 0 .../{drivers => }/cmsis/Include/core_sc300.h | 0 .../{drivers => }/cmsis/Include/mpu_armv7.h | 0 .../{drivers => }/cmsis/Include/mpu_armv8.h | 0 .../{drivers => }/cmsis/Include/pmu_armv8.h | 0 .../{drivers => }/cmsis/Include/tz_context.h | 0 .../flashloader/FlashHC32F448_otp.flash | 10 - .../config/flashloader/FlashHC32F448xA.board | 16 - .../config/flashloader/FlashHC32F448xA.flash | 10 - .../config/flashloader/FlashHC32F448xC.board | 16 - .../config/flashloader/FlashHC32F448xC.flash | 10 - .../drivers/bsp/components/24cxx/24cxx.c | 278 - .../drivers/bsp/components/24cxx/24cxx.h | 121 - .../drivers/bsp/components/gt9xx/gt9xx.c | 183 - .../drivers/bsp/components/gt9xx/gt9xx.h | 150 - .../drivers/bsp/components/nt35510/nt35510.c | 2078 - .../drivers/bsp/components/nt35510/nt35510.h | 202 - .../drivers/bsp/components/tca9539/tca9539.c | 337 - .../drivers/bsp/components/tca9539/tca9539.h | 193 - .../drivers/bsp/components/w25qxx/w25qxx.c | 596 - .../drivers/bsp/components/w25qxx/w25qxx.h | 199 - .../ev_hc32f448_lqfp80/ev_hc32f448_lqfp80.c | 672 - .../ev_hc32f448_lqfp80/ev_hc32f448_lqfp80.h | 249 - .../ev_hc32f448_lqfp80_24cxx.c | 290 - .../ev_hc32f448_lqfp80_24cxx.h | 126 - .../ev_hc32f448_lqfp80_bsp.h | 91 - .../ev_hc32f448_lqfp80_gt9xx.c | 261 - .../ev_hc32f448_lqfp80_gt9xx.h | 135 - .../ev_hc32f448_lqfp80_is61lv6416.c | 321 - .../ev_hc32f448_lqfp80_is61lv6416.h | 203 - .../ev_hc32f448_lqfp80_nt35510.c | 535 - .../ev_hc32f448_lqfp80_nt35510.h | 205 - .../ev_hc32f448_lqfp80_tca9539.c | 387 - .../ev_hc32f448_lqfp80_tca9539.h | 290 - .../ev_hc32f448_lqfp80_w25qxx.c | 324 - .../ev_hc32f448_lqfp80_w25qxx.h | 162 - .../Source/IAR/flashloader/FlashHC32F448.mac | 16 - .../Source/IAR/flashloader/FlashHC32F448.out | Bin 48368 -> 0 bytes .../IAR/flashloader/FlashHC32F448_otp.out | Bin 47664 -> 0 bytes .../hc32_ll_driver/inc/hc32_ll.h | 0 .../hc32_ll_driver/inc/hc32_ll_adc.h | 0 .../hc32_ll_driver/inc/hc32_ll_aes.h | 0 .../hc32_ll_driver/inc/hc32_ll_aos.h | 0 .../hc32_ll_driver/inc/hc32_ll_clk.h | 0 .../hc32_ll_driver/inc/hc32_ll_cmp.h | 0 .../hc32_ll_driver/inc/hc32_ll_crc.h | 0 .../hc32_ll_driver/inc/hc32_ll_ctc.h | 0 .../hc32_ll_driver/inc/hc32_ll_dac.h | 0 .../hc32_ll_driver/inc/hc32_ll_dbgc.h | 0 .../hc32_ll_driver/inc/hc32_ll_dcu.h | 0 .../hc32_ll_driver/inc/hc32_ll_def.h | 0 .../hc32_ll_driver/inc/hc32_ll_dma.h | 0 .../hc32_ll_driver/inc/hc32_ll_efm.h | 4 +- .../hc32_ll_driver/inc/hc32_ll_emb.h | 0 .../hc32_ll_driver/inc/hc32_ll_event_port.h | 0 .../hc32_ll_driver/inc/hc32_ll_fcg.h | 0 .../hc32_ll_driver/inc/hc32_ll_fcm.h | 0 .../hc32_ll_driver/inc/hc32_ll_gpio.h | 0 .../hc32_ll_driver/inc/hc32_ll_hash.h | 0 .../hc32_ll_driver/inc/hc32_ll_i2c.h | 0 .../hc32_ll_driver/inc/hc32_ll_icg.h | 0 .../hc32_ll_driver/inc/hc32_ll_interrupts.h | 0 .../hc32_ll_driver/inc/hc32_ll_keyscan.h | 0 .../hc32_ll_driver/inc/hc32_ll_mcan.h | 0 .../hc32_ll_driver/inc/hc32_ll_mpu.h | 0 .../hc32_ll_driver/inc/hc32_ll_pwc.h | 0 .../hc32_ll_driver/inc/hc32_ll_qspi.h | 0 .../hc32_ll_driver/inc/hc32_ll_rmu.h | 0 .../hc32_ll_driver/inc/hc32_ll_rtc.h | 0 .../hc32_ll_driver/inc/hc32_ll_smc.h | 0 .../hc32_ll_driver/inc/hc32_ll_spi.h | 0 .../hc32_ll_driver/inc/hc32_ll_sram.h | 0 .../hc32_ll_driver/inc/hc32_ll_swdt.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr0.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr4.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr6.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmra.h | 0 .../hc32_ll_driver/inc/hc32_ll_trng.h | 0 .../hc32_ll_driver/inc/hc32_ll_usart.h | 0 .../hc32_ll_driver/inc/hc32_ll_utility.h | 0 .../hc32_ll_driver/inc/hc32_ll_wdt.h | 0 .../hc32_ll_driver/src/hc32_ll.c | 0 .../hc32_ll_driver/src/hc32_ll_adc.c | 0 .../hc32_ll_driver/src/hc32_ll_aes.c | 0 .../hc32_ll_driver/src/hc32_ll_aos.c | 0 .../hc32_ll_driver/src/hc32_ll_clk.c | 0 .../hc32_ll_driver/src/hc32_ll_cmp.c | 0 .../hc32_ll_driver/src/hc32_ll_crc.c | 0 .../hc32_ll_driver/src/hc32_ll_ctc.c | 0 .../hc32_ll_driver/src/hc32_ll_dac.c | 0 .../hc32_ll_driver/src/hc32_ll_dbgc.c | 0 .../hc32_ll_driver/src/hc32_ll_dcu.c | 0 .../hc32_ll_driver/src/hc32_ll_dma.c | 0 .../hc32_ll_driver/src/hc32_ll_efm.c | 0 .../hc32_ll_driver/src/hc32_ll_emb.c | 0 .../hc32_ll_driver/src/hc32_ll_event_port.c | 0 .../hc32_ll_driver/src/hc32_ll_fcg.c | 0 .../hc32_ll_driver/src/hc32_ll_fcm.c | 0 .../hc32_ll_driver/src/hc32_ll_gpio.c | 0 .../hc32_ll_driver/src/hc32_ll_hash.c | 0 .../hc32_ll_driver/src/hc32_ll_i2c.c | 0 .../hc32_ll_driver/src/hc32_ll_icg.c | 0 .../hc32_ll_driver/src/hc32_ll_interrupts.c | 0 .../hc32_ll_driver/src/hc32_ll_keyscan.c | 0 .../hc32_ll_driver/src/hc32_ll_mcan.c | 0 .../hc32_ll_driver/src/hc32_ll_mpu.c | 0 .../hc32_ll_driver/src/hc32_ll_pwc.c | 0 .../hc32_ll_driver/src/hc32_ll_qspi.c | 0 .../hc32_ll_driver/src/hc32_ll_rmu.c | 0 .../hc32_ll_driver/src/hc32_ll_rtc.c | 0 .../hc32_ll_driver/src/hc32_ll_smc.c | 0 .../hc32_ll_driver/src/hc32_ll_spi.c | 0 .../hc32_ll_driver/src/hc32_ll_sram.c | 0 .../hc32_ll_driver/src/hc32_ll_swdt.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr0.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr4.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr6.c | 0 .../hc32_ll_driver/src/hc32_ll_tmra.c | 0 .../hc32_ll_driver/src/hc32_ll_trng.c | 0 .../hc32_ll_driver/src/hc32_ll_usart.c | 0 .../hc32_ll_driver/src/hc32_ll_utility.c | 0 .../hc32_ll_driver/src/hc32_ll_wdt.c | 0 bsp/hc32/libraries/hc32f460_ddl/README.txt | 4 - bsp/hc32/libraries/hc32f460_ddl/SConscript | 109 +- .../Device/HDSC/hc32f4xx/Include/hc32f460.h | 0 .../Device/HDSC/hc32f4xx/Include/hc32f4xx.h | 0 .../HDSC/hc32f4xx/Include/system_hc32f460.h | 0 .../Source/ARM/flashloader/HC32F460_256K.FLM | Bin .../Source/ARM/flashloader/HC32F460_512K.FLM | Bin .../Source/ARM/flashloader/HC32F460_RAM.FLM | Bin .../Source/ARM/flashloader/HC32F460_otp.FLM | Bin .../hc32f4xx/Source/ARM/flashloader/ram.ini | 0 .../HDSC/hc32f4xx/Source/ARM/sfr/HC32F460.SFR | Bin .../hc32f4xx/Source/ARM/startup_hc32f460.s | 0 .../hc32f4xx/Source/GCC/linker/HC32F460xC.ld | 0 .../hc32f4xx/Source/GCC/linker/HC32F460xE.ld | 0 .../hc32f4xx/Source/GCC/startup_hc32f460.S | 0 .../HDSC/hc32f4xx/Source/GCC/svd/HC32F460.svd | 0 .../Source/IAR}/flashloader/FlashHC32F460.mac | 0 .../Source/IAR/flashloader/FlashHC32F460.out | Bin .../IAR/flashloader/FlashHC32F460_otp.flash | 10 + .../IAR}/flashloader/FlashHC32F460_otp.mac | 0 .../IAR/flashloader/FlashHC32F460_otp.out | Bin .../IAR}/flashloader/FlashHC32F460_qspi.flash | 2 +- .../IAR}/flashloader/FlashHC32F460_qspi.out | Bin .../IAR/flashloader/FlashHC32F460xC.board | 16 + .../IAR/flashloader/FlashHC32F460xC.flash | 10 + .../IAR/flashloader/FlashHC32F460xE.board | 16 + .../IAR/flashloader/FlashHC32F460xE.flash | 10 + .../Source/IAR/linker/HC32F460_RAM.icf | 0 .../hc32f4xx/Source/IAR/linker/HC32F460xC.icf | 0 .../hc32f4xx/Source/IAR/linker/HC32F460xE.icf | 0 .../hc32f4xx/Source/IAR/startup_hc32f460.s | 0 .../HDSC/hc32f4xx/Source/IAR/svd/HC32F460.svd | 0 .../HDSC/hc32f4xx/Source/system_hc32f460.c | 0 .../cmsis/Include/arm_common_tables.h | 0 .../cmsis/Include/arm_const_structs.h | 0 .../cmsis/Include/arm_helium_utils.h | 0 .../{drivers => }/cmsis/Include/arm_math.h | 0 .../cmsis/Include/arm_mve_tables.h | 0 .../cmsis/Include/arm_vec_math.h | 0 .../cmsis/Include/cachel1_armv7.h | 0 .../{drivers => }/cmsis/Include/cmsis_armcc.h | 0 .../cmsis/Include/cmsis_armclang.h | 0 .../cmsis/Include/cmsis_armclang_ltm.h | 0 .../cmsis/Include/cmsis_compiler.h | 0 .../{drivers => }/cmsis/Include/cmsis_gcc.h | 0 .../cmsis/Include/cmsis_iccarm.h | 0 .../cmsis/Include/cmsis_version.h | 0 .../cmsis/Include/core_armv81mml.h | 0 .../cmsis/Include/core_armv8mbl.h | 0 .../cmsis/Include/core_armv8mml.h | 0 .../{drivers => }/cmsis/Include/core_cm0.h | 0 .../cmsis/Include/core_cm0plus.h | 0 .../{drivers => }/cmsis/Include/core_cm1.h | 0 .../{drivers => }/cmsis/Include/core_cm23.h | 0 .../{drivers => }/cmsis/Include/core_cm3.h | 0 .../{drivers => }/cmsis/Include/core_cm33.h | 0 .../{drivers => }/cmsis/Include/core_cm35p.h | 0 .../{drivers => }/cmsis/Include/core_cm4.h | 0 .../{drivers => }/cmsis/Include/core_cm55.h | 0 .../{drivers => }/cmsis/Include/core_cm7.h | 0 .../{drivers => }/cmsis/Include/core_sc000.h | 0 .../{drivers => }/cmsis/Include/core_sc300.h | 0 .../{drivers => }/cmsis/Include/mpu_armv7.h | 0 .../{drivers => }/cmsis/Include/mpu_armv8.h | 0 .../{drivers => }/cmsis/Include/pmu_armv8.h | 0 .../{drivers => }/cmsis/Include/tz_context.h | 0 .../config/flashloader/FlashHC32F460.out | Bin 26660 -> 0 bytes .../flashloader/FlashHC32F460_otp.flash | 10 - .../config/flashloader/FlashHC32F460_otp.out | Bin 23452 -> 0 bytes .../config/flashloader/FlashHC32F460xC.board | 16 - .../config/flashloader/FlashHC32F460xC.flash | 10 - .../config/flashloader/FlashHC32F460xE.board | 16 - .../config/flashloader/FlashHC32F460xE.flash | 10 - .../config/flashloader/HC32F460xC.board | 12 - .../config/flashloader/HC32F460xE.board | 12 - .../drivers/bsp/components/24cxx/24cxx.c | 255 - .../drivers/bsp/components/24cxx/24cxx.h | 112 - .../drivers/bsp/components/w25qxx/w25qxx.c | 567 - .../drivers/bsp/components/w25qxx/w25qxx.h | 190 - .../drivers/bsp/components/wm8731/wm8731.c | 375 - .../drivers/bsp/components/wm8731/wm8731.h | 218 - .../ev_hc32f460_lqfp100_v2.c | 780 - .../ev_hc32f460_lqfp100_v2.h | 322 - .../ev_hc32f460_lqfp100_v2_24cxx.c | 290 - .../ev_hc32f460_lqfp100_v2_24cxx.h | 126 - .../ev_hc32f460_lqfp100_v2_bsp.h | 80 - .../ev_hc32f460_lqfp100_v2_w25qxx.c | 341 - .../ev_hc32f460_lqfp100_v2_w25qxx.h | 171 - .../ev_hc32f460_lqfp100_v2_wm8731.c | 399 - .../ev_hc32f460_lqfp100_v2_wm8731.h | 219 - .../hc32f4xx/Source/ARM/sfr/HDSC_HC32F460.SFR | Bin 1625032 -> 0 bytes .../hc32f4xx/Source/GCC/svd/HDSC_HC32F460.svd | 53428 -------- .../Source/IAR/flashloader/FlashHC32F460.mac | 16 - .../IAR/flashloader/FlashHC32F460_otp.mac | 16 - .../hc32f4xx/Source/IAR/svd/HDSC_HC32F460.svd | 53428 -------- .../hc32_ll_driver/inc/hc32_ll.h | 0 .../hc32_ll_driver/inc/hc32_ll_adc.h | 0 .../hc32_ll_driver/inc/hc32_ll_aes.h | 0 .../hc32_ll_driver/inc/hc32_ll_aos.h | 0 .../hc32_ll_driver/inc/hc32_ll_can.h | 0 .../hc32_ll_driver/inc/hc32_ll_clk.h | 0 .../hc32_ll_driver/inc/hc32_ll_cmp.h | 0 .../hc32_ll_driver/inc/hc32_ll_crc.h | 0 .../hc32_ll_driver/inc/hc32_ll_dbgc.h | 0 .../hc32_ll_driver/inc/hc32_ll_dcu.h | 0 .../hc32_ll_driver/inc/hc32_ll_def.h | 0 .../hc32_ll_driver/inc/hc32_ll_dma.h | 0 .../hc32_ll_driver/inc/hc32_ll_efm.h | 4 +- .../hc32_ll_driver/inc/hc32_ll_emb.h | 0 .../hc32_ll_driver/inc/hc32_ll_event_port.h | 0 .../hc32_ll_driver/inc/hc32_ll_fcg.h | 0 .../hc32_ll_driver/inc/hc32_ll_fcm.h | 0 .../hc32_ll_driver/inc/hc32_ll_gpio.h | 0 .../hc32_ll_driver/inc/hc32_ll_hash.h | 0 .../hc32_ll_driver/inc/hc32_ll_i2c.h | 0 .../hc32_ll_driver/inc/hc32_ll_i2s.h | 0 .../hc32_ll_driver/inc/hc32_ll_icg.h | 0 .../hc32_ll_driver/inc/hc32_ll_interrupts.h | 0 .../hc32_ll_driver/inc/hc32_ll_keyscan.h | 0 .../hc32_ll_driver/inc/hc32_ll_mpu.h | 0 .../hc32_ll_driver/inc/hc32_ll_ots.h | 0 .../hc32_ll_driver/inc/hc32_ll_pwc.h | 0 .../hc32_ll_driver/inc/hc32_ll_qspi.h | 0 .../hc32_ll_driver/inc/hc32_ll_rmu.h | 0 .../hc32_ll_driver/inc/hc32_ll_rtc.h | 0 .../hc32_ll_driver/inc/hc32_ll_sdioc.h | 0 .../hc32_ll_driver/inc/hc32_ll_spi.h | 0 .../hc32_ll_driver/inc/hc32_ll_sram.h | 0 .../hc32_ll_driver/inc/hc32_ll_swdt.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr0.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr4.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr6.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmra.h | 0 .../hc32_ll_driver/inc/hc32_ll_trng.h | 0 .../hc32_ll_driver/inc/hc32_ll_usart.h | 0 .../hc32_ll_driver/inc/hc32_ll_usb.h | 0 .../hc32_ll_driver/inc/hc32_ll_utility.h | 0 .../hc32_ll_driver/inc/hc32_ll_wdt.h | 0 .../inc/hc32f460_ll_interrupts_share.h | 0 .../hc32_ll_driver/src/hc32_ll.c | 0 .../hc32_ll_driver/src/hc32_ll_adc.c | 0 .../hc32_ll_driver/src/hc32_ll_aes.c | 0 .../hc32_ll_driver/src/hc32_ll_aos.c | 0 .../hc32_ll_driver/src/hc32_ll_can.c | 0 .../hc32_ll_driver/src/hc32_ll_clk.c | 0 .../hc32_ll_driver/src/hc32_ll_cmp.c | 0 .../hc32_ll_driver/src/hc32_ll_crc.c | 0 .../hc32_ll_driver/src/hc32_ll_dbgc.c | 0 .../hc32_ll_driver/src/hc32_ll_dcu.c | 0 .../hc32_ll_driver/src/hc32_ll_dma.c | 0 .../hc32_ll_driver/src/hc32_ll_efm.c | 0 .../hc32_ll_driver/src/hc32_ll_emb.c | 0 .../hc32_ll_driver/src/hc32_ll_event_port.c | 0 .../hc32_ll_driver/src/hc32_ll_fcg.c | 0 .../hc32_ll_driver/src/hc32_ll_fcm.c | 0 .../hc32_ll_driver/src/hc32_ll_gpio.c | 0 .../hc32_ll_driver/src/hc32_ll_hash.c | 0 .../hc32_ll_driver/src/hc32_ll_i2c.c | 0 .../hc32_ll_driver/src/hc32_ll_i2s.c | 0 .../hc32_ll_driver/src/hc32_ll_icg.c | 0 .../hc32_ll_driver/src/hc32_ll_interrupts.c | 0 .../hc32_ll_driver/src/hc32_ll_keyscan.c | 0 .../hc32_ll_driver/src/hc32_ll_mpu.c | 0 .../hc32_ll_driver/src/hc32_ll_ots.c | 0 .../hc32_ll_driver/src/hc32_ll_pwc.c | 0 .../hc32_ll_driver/src/hc32_ll_qspi.c | 0 .../hc32_ll_driver/src/hc32_ll_rmu.c | 0 .../hc32_ll_driver/src/hc32_ll_rtc.c | 0 .../hc32_ll_driver/src/hc32_ll_sdioc.c | 0 .../hc32_ll_driver/src/hc32_ll_spi.c | 8 +- .../hc32_ll_driver/src/hc32_ll_sram.c | 0 .../hc32_ll_driver/src/hc32_ll_swdt.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr0.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr4.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr6.c | 0 .../hc32_ll_driver/src/hc32_ll_tmra.c | 0 .../hc32_ll_driver/src/hc32_ll_trng.c | 0 .../hc32_ll_driver/src/hc32_ll_usart.c | 0 .../hc32_ll_driver/src/hc32_ll_usb.c | 0 .../hc32_ll_driver/src/hc32_ll_utility.c | 0 .../hc32_ll_driver/src/hc32_ll_wdt.c | 0 .../src/hc32f460_ll_interrupts_share.c | 0 bsp/hc32/libraries/hc32f472_ddl/SConscript | 5 +- .../hc32f4xx/Source/GCC/linker/HC32F472xE.ld | 208 + .../hc32f4xx/Source/GCC/startup_hc32f472.S | 2 +- .../hc32_ll_driver/inc/hc32_ll_efm.h | 4 +- .../hc32_ll_driver/inc/hc32_ll_rtc.h | 1 + .../hc32_ll_driver/src/hc32_ll_rtc.c | 30 +- bsp/hc32/libraries/hc32f4a0_ddl/README.txt | 4 - bsp/hc32/libraries/hc32f4a0_ddl/SConscript | 101 +- .../Device/HDSC/hc32f4xx/Include/hc32f4a0.h | 0 .../Device/HDSC/hc32f4xx/Include/hc32f4xx.h | 0 .../HDSC/hc32f4xx/Include/system_hc32f4a0.h | 0 .../Source/ARM/flashloader/HC32F4A0_1M.FLM | Bin .../Source/ARM/flashloader/HC32F4A0_2M.FLM | Bin .../ARM/flashloader/HC32F4A0_512K_0.FLM | Bin .../ARM/flashloader/HC32F4A0_512K_1.FLM | Bin .../Source/ARM/flashloader/HC32F4A0_RAM.FLM | Bin .../Source/ARM/flashloader/HC32F4A0_otp.FLM | Bin .../hc32f4xx/Source/ARM/flashloader/ram.ini | 0 .../HDSC/hc32f4xx/Source/ARM/sfr/HC32F4A0.SFR | Bin .../hc32f4xx/Source/ARM/startup_hc32f4a0.s | 0 .../hc32f4xx/Source/GCC/linker/HC32F4A0xG.ld | 0 .../hc32f4xx/Source/GCC/linker/HC32F4A0xI.ld | 0 .../hc32f4xx/Source/GCC/startup_hc32f4a0.S | 0 .../HDSC/hc32f4xx/Source/GCC/svd/HC32F4A0.svd | 0 .../Source/IAR}/flashloader/FlashHC32F4A0.mac | 0 .../Source/IAR/flashloader/FlashHC32F4A0.out | Bin .../IAR/flashloader/FlashHC32F4A0_otp.flash | 10 + .../IAR/flashloader/FlashHC32F4A0_otp.out | Bin .../IAR}/flashloader/FlashHC32F4A0_qspi.flash | 2 +- .../IAR}/flashloader/FlashHC32F4A0_qspi.out | Bin .../IAR/flashloader/FlashHC32F4A0xG.board | 18 + .../IAR/flashloader/FlashHC32F4A0xG.flash | 10 + .../IAR/flashloader/FlashHC32F4A0xI.board | 18 + .../IAR/flashloader/FlashHC32F4A0xI.flash | 10 + .../Source/IAR/linker/HC32F4A0_RAM.icf | 0 .../hc32f4xx/Source/IAR/linker/HC32F4A0xG.icf | 0 .../hc32f4xx/Source/IAR/linker/HC32F4A0xI.icf | 0 .../hc32f4xx/Source/IAR/startup_hc32f4a0.s | 0 .../HDSC/hc32f4xx/Source/IAR/svd/HC32F4A0.svd | 0 .../HDSC/hc32f4xx/Source/system_hc32f4a0.c | 0 .../cmsis/Include/arm_common_tables.h | 0 .../cmsis/Include/arm_const_structs.h | 0 .../cmsis/Include/arm_helium_utils.h | 0 .../{drivers => }/cmsis/Include/arm_math.h | 0 .../cmsis/Include/arm_mve_tables.h | 0 .../cmsis/Include/arm_vec_math.h | 0 .../cmsis/Include/cachel1_armv7.h | 0 .../{drivers => }/cmsis/Include/cmsis_armcc.h | 0 .../cmsis/Include/cmsis_armclang.h | 0 .../cmsis/Include/cmsis_armclang_ltm.h | 0 .../cmsis/Include/cmsis_compiler.h | 0 .../{drivers => }/cmsis/Include/cmsis_gcc.h | 0 .../cmsis/Include/cmsis_iccarm.h | 0 .../cmsis/Include/cmsis_version.h | 0 .../cmsis/Include/core_armv81mml.h | 0 .../cmsis/Include/core_armv8mbl.h | 0 .../cmsis/Include/core_armv8mml.h | 0 .../{drivers => }/cmsis/Include/core_cm0.h | 0 .../cmsis/Include/core_cm0plus.h | 0 .../{drivers => }/cmsis/Include/core_cm1.h | 0 .../{drivers => }/cmsis/Include/core_cm23.h | 0 .../{drivers => }/cmsis/Include/core_cm3.h | 0 .../{drivers => }/cmsis/Include/core_cm33.h | 0 .../{drivers => }/cmsis/Include/core_cm35p.h | 0 .../{drivers => }/cmsis/Include/core_cm4.h | 0 .../{drivers => }/cmsis/Include/core_cm55.h | 0 .../{drivers => }/cmsis/Include/core_cm7.h | 0 .../{drivers => }/cmsis/Include/core_sc000.h | 0 .../{drivers => }/cmsis/Include/core_sc300.h | 0 .../{drivers => }/cmsis/Include/mpu_armv7.h | 0 .../{drivers => }/cmsis/Include/mpu_armv8.h | 0 .../{drivers => }/cmsis/Include/pmu_armv8.h | 0 .../{drivers => }/cmsis/Include/tz_context.h | 0 .../config/flashloader/FlashHC32F4A0.out | Bin 47100 -> 0 bytes .../flashloader/FlashHC32F4A0_otp.flash | 10 - .../config/flashloader/FlashHC32F4A0_otp.out | Bin 47280 -> 0 bytes .../config/flashloader/FlashHC32F4A0xG.board | 18 - .../config/flashloader/FlashHC32F4A0xG.flash | 10 - .../config/flashloader/FlashHC32F4A0xI.board | 18 - .../config/flashloader/FlashHC32F4A0xI.flash | 10 - .../config/flashloader/HC32F4A0xG.board | 18 - .../config/flashloader/HC32F4A0xI.board | 18 - .../drivers/bsp/components/24cxx/24cxx.c | 255 - .../drivers/bsp/components/24cxx/24cxx.h | 112 - .../drivers/bsp/components/gt9xx/gt9xx.c | 182 - .../drivers/bsp/components/gt9xx/gt9xx.h | 150 - .../drivers/bsp/components/nt35510/nt35510.c | 2033 - .../drivers/bsp/components/nt35510/nt35510.h | 202 - .../drivers/bsp/components/ov5640/ov5640.c | 404 - .../drivers/bsp/components/ov5640/ov5640.h | 147 - .../s29gl064n90tfi03/s29gl064n90tfi03.c | 454 - .../s29gl064n90tfi03/s29gl064n90tfi03.h | 153 - .../drivers/bsp/components/tca9539/tca9539.c | 335 - .../drivers/bsp/components/tca9539/tca9539.h | 184 - .../drivers/bsp/components/w25qxx/w25qxx.c | 567 - .../drivers/bsp/components/w25qxx/w25qxx.h | 190 - .../drivers/bsp/components/wm8731/wm8731.c | 375 - .../drivers/bsp/components/wm8731/wm8731.h | 218 - .../ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.c | 710 - .../ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.h | 271 - .../ev_hc32f4a0_lqfp176_24cxx.c | 291 - .../ev_hc32f4a0_lqfp176_24cxx.h | 125 - .../ev_hc32f4a0_lqfp176_bsp.h | 108 - .../ev_hc32f4a0_lqfp176_gt9xx.c | 261 - .../ev_hc32f4a0_lqfp176_gt9xx.h | 135 - .../ev_hc32f4a0_lqfp176_is42s16400j7tli.c | 422 - .../ev_hc32f4a0_lqfp176_is42s16400j7tli.h | 241 - .../ev_hc32f4a0_lqfp176_is62wv51216.c | 353 - .../ev_hc32f4a0_lqfp176_is62wv51216.h | 239 - .../ev_hc32f4a0_lqfp176_mt29f2g08ab.c | 571 - .../ev_hc32f4a0_lqfp176_mt29f2g08ab.h | 205 - .../ev_hc32f4a0_lqfp176_nt35510.c | 539 - .../ev_hc32f4a0_lqfp176_nt35510.h | 206 - .../ev_hc32f4a0_lqfp176_ov5640.c | 620 - .../ev_hc32f4a0_lqfp176_ov5640.h | 167 - .../ev_hc32f4a0_lqfp176_tca9539.c | 441 - .../ev_hc32f4a0_lqfp176_tca9539.h | 320 - .../ev_hc32f4a0_lqfp176_w25qxx.c | 336 - .../ev_hc32f4a0_lqfp176_w25qxx.h | 171 - .../ev_hc32f4a0_lqfp176_wm8731.c | 395 - .../ev_hc32f4a0_lqfp176_wm8731.h | 211 - .../hc32f4xx/Source/ARM/sfr/HDSC_HC32F4A0.SFR | Bin 3121534 -> 0 bytes .../hc32f4xx/Source/GCC/svd/HDSC_HC32F4A0.svd | 102653 --------------- .../Source/IAR/flashloader/FlashHC32F4A0.mac | 16 - .../hc32f4xx/Source/IAR/svd/HDSC_HC32F4A0.svd | 102653 --------------- .../hc32_ll_driver/inc/hc32_ll.h | 0 .../hc32_ll_driver/inc/hc32_ll_adc.h | 0 .../hc32_ll_driver/inc/hc32_ll_aes.h | 0 .../hc32_ll_driver/inc/hc32_ll_aos.h | 0 .../hc32_ll_driver/inc/hc32_ll_can.h | 0 .../hc32_ll_driver/inc/hc32_ll_clk.h | 0 .../hc32_ll_driver/inc/hc32_ll_cmp.h | 0 .../hc32_ll_driver/inc/hc32_ll_crc.h | 0 .../hc32_ll_driver/inc/hc32_ll_ctc.h | 0 .../hc32_ll_driver/inc/hc32_ll_dac.h | 0 .../hc32_ll_driver/inc/hc32_ll_dbgc.h | 0 .../hc32_ll_driver/inc/hc32_ll_dcu.h | 0 .../hc32_ll_driver/inc/hc32_ll_def.h | 0 .../hc32_ll_driver/inc/hc32_ll_dma.h | 0 .../hc32_ll_driver/inc/hc32_ll_dmc.h | 0 .../hc32_ll_driver/inc/hc32_ll_dvp.h | 0 .../hc32_ll_driver/inc/hc32_ll_efm.h | 4 +- .../hc32_ll_driver/inc/hc32_ll_emb.h | 0 .../hc32_ll_driver/inc/hc32_ll_eth.h | 0 .../hc32_ll_driver/inc/hc32_ll_event_port.h | 0 .../hc32_ll_driver/inc/hc32_ll_fcg.h | 0 .../hc32_ll_driver/inc/hc32_ll_fcm.h | 0 .../hc32_ll_driver/inc/hc32_ll_fmac.h | 0 .../hc32_ll_driver/inc/hc32_ll_gpio.h | 0 .../hc32_ll_driver/inc/hc32_ll_hash.h | 0 .../hc32_ll_driver/inc/hc32_ll_hrpwm.h | 0 .../hc32_ll_driver/inc/hc32_ll_i2c.h | 0 .../hc32_ll_driver/inc/hc32_ll_i2s.h | 0 .../hc32_ll_driver/inc/hc32_ll_icg.h | 0 .../hc32_ll_driver/inc/hc32_ll_interrupts.h | 0 .../hc32_ll_driver/inc/hc32_ll_keyscan.h | 0 .../hc32_ll_driver/inc/hc32_ll_mau.h | 0 .../hc32_ll_driver/inc/hc32_ll_mpu.h | 0 .../hc32_ll_driver/inc/hc32_ll_nfc.h | 0 .../hc32_ll_driver/inc/hc32_ll_ots.h | 0 .../hc32_ll_driver/inc/hc32_ll_pwc.h | 0 .../hc32_ll_driver/inc/hc32_ll_qspi.h | 0 .../hc32_ll_driver/inc/hc32_ll_rmu.h | 0 .../hc32_ll_driver/inc/hc32_ll_rtc.h | 0 .../hc32_ll_driver/inc/hc32_ll_sdioc.h | 0 .../hc32_ll_driver/inc/hc32_ll_smc.h | 0 .../hc32_ll_driver/inc/hc32_ll_spi.h | 0 .../hc32_ll_driver/inc/hc32_ll_sram.h | 0 .../hc32_ll_driver/inc/hc32_ll_swdt.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr0.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr2.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr4.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmr6.h | 0 .../hc32_ll_driver/inc/hc32_ll_tmra.h | 0 .../hc32_ll_driver/inc/hc32_ll_trng.h | 0 .../hc32_ll_driver/inc/hc32_ll_usart.h | 0 .../hc32_ll_driver/inc/hc32_ll_usb.h | 0 .../hc32_ll_driver/inc/hc32_ll_utility.h | 0 .../hc32_ll_driver/inc/hc32_ll_wdt.h | 0 .../inc/hc32f4a0_ll_interrupts_share.h | 0 .../hc32_ll_driver/src/hc32_ll.c | 0 .../hc32_ll_driver/src/hc32_ll_adc.c | 0 .../hc32_ll_driver/src/hc32_ll_aes.c | 0 .../hc32_ll_driver/src/hc32_ll_aos.c | 0 .../hc32_ll_driver/src/hc32_ll_can.c | 0 .../hc32_ll_driver/src/hc32_ll_clk.c | 0 .../hc32_ll_driver/src/hc32_ll_cmp.c | 0 .../hc32_ll_driver/src/hc32_ll_crc.c | 0 .../hc32_ll_driver/src/hc32_ll_ctc.c | 0 .../hc32_ll_driver/src/hc32_ll_dac.c | 0 .../hc32_ll_driver/src/hc32_ll_dbgc.c | 0 .../hc32_ll_driver/src/hc32_ll_dcu.c | 0 .../hc32_ll_driver/src/hc32_ll_dma.c | 0 .../hc32_ll_driver/src/hc32_ll_dmc.c | 0 .../hc32_ll_driver/src/hc32_ll_dvp.c | 0 .../hc32_ll_driver/src/hc32_ll_efm.c | 0 .../hc32_ll_driver/src/hc32_ll_emb.c | 0 .../hc32_ll_driver/src/hc32_ll_eth.c | 0 .../hc32_ll_driver/src/hc32_ll_event_port.c | 0 .../hc32_ll_driver/src/hc32_ll_fcg.c | 0 .../hc32_ll_driver/src/hc32_ll_fcm.c | 0 .../hc32_ll_driver/src/hc32_ll_fmac.c | 0 .../hc32_ll_driver/src/hc32_ll_gpio.c | 0 .../hc32_ll_driver/src/hc32_ll_hash.c | 0 .../hc32_ll_driver/src/hc32_ll_hrpwm.c | 0 .../hc32_ll_driver/src/hc32_ll_i2c.c | 0 .../hc32_ll_driver/src/hc32_ll_i2s.c | 0 .../hc32_ll_driver/src/hc32_ll_icg.c | 0 .../hc32_ll_driver/src/hc32_ll_interrupts.c | 0 .../hc32_ll_driver/src/hc32_ll_keyscan.c | 0 .../hc32_ll_driver/src/hc32_ll_mau.c | 0 .../hc32_ll_driver/src/hc32_ll_mpu.c | 0 .../hc32_ll_driver/src/hc32_ll_nfc.c | 0 .../hc32_ll_driver/src/hc32_ll_ots.c | 0 .../hc32_ll_driver/src/hc32_ll_pwc.c | 0 .../hc32_ll_driver/src/hc32_ll_qspi.c | 0 .../hc32_ll_driver/src/hc32_ll_rmu.c | 0 .../hc32_ll_driver/src/hc32_ll_rtc.c | 0 .../hc32_ll_driver/src/hc32_ll_sdioc.c | 0 .../hc32_ll_driver/src/hc32_ll_smc.c | 0 .../hc32_ll_driver/src/hc32_ll_spi.c | 8 +- .../hc32_ll_driver/src/hc32_ll_sram.c | 0 .../hc32_ll_driver/src/hc32_ll_swdt.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr0.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr2.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr4.c | 0 .../hc32_ll_driver/src/hc32_ll_tmr6.c | 0 .../hc32_ll_driver/src/hc32_ll_tmra.c | 0 .../hc32_ll_driver/src/hc32_ll_trng.c | 0 .../hc32_ll_driver/src/hc32_ll_usart.c | 0 .../hc32_ll_driver/src/hc32_ll_usb.c | 0 .../hc32_ll_driver/src/hc32_ll_utility.c | 0 .../hc32_ll_driver/src/hc32_ll_wdt.c | 0 .../src/hc32f4a0_ll_interrupts_share.c | 0 bsp/hc32/platform/sfud/SConscript | 2 +- bsp/hc32/platform/tca9539/SConscript | 2 +- bsp/hc32/tests/SConscript | 98 + bsp/hc32/tests/test_adc.c | 157 + bsp/hc32/tests/test_can.c | 421 + bsp/hc32/tests/test_crypto.c | 300 + bsp/hc32/tests/test_dac.c | 106 + bsp/hc32/tests/test_eth.c | 74 + bsp/hc32/tests/test_fal.c | 134 + bsp/hc32/tests/test_gpio.c | 77 + bsp/hc32/tests/test_hwtimer.c | 164 + bsp/hc32/tests/test_i2c.c | 275 + bsp/hc32/tests/test_nand.c | 283 + bsp/hc32/tests/test_pfc8563_i2c.c | 206 + bsp/hc32/tests/test_pm.c | 456 + bsp/hc32/tests/test_pulse_encoder.c | 218 + bsp/hc32/tests/test_pwm.c | 68 + bsp/hc32/tests/test_qspi.c | 571 + bsp/hc32/tests/test_rtc.c | 271 + bsp/hc32/tests/test_sdmmc.c | 159 + bsp/hc32/tests/test_sdram.c | 184 + bsp/hc32/tests/test_soft_i2c.c | 312 + bsp/hc32/tests/test_spi.c | 353 + bsp/hc32/tests/test_tmr_capture.c | 297 + bsp/hc32/tests/test_uart_v1.c | 276 + bsp/hc32/tests/test_uart_v2.c | 297 + bsp/hc32/tests/test_usbd.c | 332 + bsp/hc32/tests/test_usbh.c | 116 + bsp/hc32/tests/test_wdt.c | 125 + 815 files changed, 16638 insertions(+), 346608 deletions(-) delete mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/SConscript delete mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/drv_spi_flash.c delete mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/SConscript delete mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_flash_sfud_port.c rename bsp/hc32/ev_hc32f448_lqfp80/board/ports/{fal => }/fal_cfg.h (100%) delete mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.c delete mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.h create mode 100644 bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539_port.h create mode 100644 bsp/hc32/ev_hc32f460_lqfp100_v2/board/config/tmr_capture_config.h delete mode 100644 bsp/hc32/ev_hc32f460_lqfp100_v2/board/ports/SConscript delete mode 100644 bsp/hc32/ev_hc32f460_lqfp100_v2/board/ports/drv_spi_flash.c delete mode 100644 bsp/hc32/ev_hc32f460_lqfp100_v2/board/ports/fal/SConscript delete mode 100644 bsp/hc32/ev_hc32f460_lqfp100_v2/board/ports/fal/fal_flash_sfud_port.c rename bsp/hc32/ev_hc32f460_lqfp100_v2/board/ports/{fal => }/fal_cfg.h (100%) create mode 100644 bsp/hc32/ev_hc32f472_lqfp100/.cproject create mode 100644 bsp/hc32/ev_hc32f472_lqfp100/.project create mode 100644 bsp/hc32/ev_hc32f472_lqfp100/board/config/usb_config/usb_app_conf.h create mode 100644 bsp/hc32/ev_hc32f472_lqfp100/board/config/usb_config/usb_bsp.h create mode 100644 bsp/hc32/ev_hc32f472_lqfp100/jlink/ev_hc32f472_lqfp100 Debug.launch create mode 100644 bsp/hc32/ev_hc32f4a0_lqfp176/board/config/tmr_capture_config.h delete mode 100644 bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/SConscript delete mode 100644 bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/drv_spi_flash.c delete mode 100644 bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/fal/SConscript delete mode 100644 bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/fal/fal_flash_sfud_port.c rename bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/{fal => }/fal_cfg.h (100%) delete mode 100644 bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/tca9539.c rename bsp/hc32/{lckfb-hc32f4a0-lqfp100/board/ports/tca9539.h => ev_hc32f4a0_lqfp176/board/ports/tca9539_port.h} (54%) delete mode 100644 bsp/hc32/lckfb-hc32f4a0-lqfp100/board/ports/SConscript delete mode 100644 bsp/hc32/lckfb-hc32f4a0-lqfp100/board/ports/drv_spi_flash.c delete mode 100644 bsp/hc32/lckfb-hc32f4a0-lqfp100/board/ports/fal/SConscript delete mode 100644 bsp/hc32/lckfb-hc32f4a0-lqfp100/board/ports/fal/fal_flash_sfud_port.c rename bsp/hc32/lckfb-hc32f4a0-lqfp100/board/ports/{fal => }/fal_cfg.h (100%) delete mode 100644 bsp/hc32/lckfb-hc32f4a0-lqfp100/board/ports/tca9539.c rename bsp/hc32/{ev_hc32f4a0_lqfp176/board/ports/tca9539.h => lckfb-hc32f4a0-lqfp100/board/ports/tca9539_port.h} (54%) create mode 100644 bsp/hc32/libraries/hc32_drivers/drv_mcan.c create mode 100644 bsp/hc32/libraries/hc32_drivers/drv_mcan.h create mode 100644 bsp/hc32/libraries/hc32_drivers/drv_tmr_capture.c create mode 100644 bsp/hc32/libraries/hc32_drivers/drv_tmr_capture.h rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/hc32f448.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4xx.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/system_hc32f448.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F448_128K.FLM (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F448_256K.FLM (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F448_RAM.FLM (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F448_otp.FLM (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/ram.ini (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HC32F448.SFR (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f448.s (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F448xA.ld (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F448xC.ld (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f448.S (99%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HC32F448.svd (100%) rename bsp/hc32/libraries/hc32f448_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F448.mac (100%) rename bsp/hc32/libraries/hc32f448_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F448.out (100%) create mode 100644 bsp/hc32/libraries/hc32f448_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448_otp.flash rename bsp/hc32/libraries/hc32f448_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F448_otp.out (100%) rename bsp/hc32/libraries/hc32f448_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F448_qspi.flash (60%) rename bsp/hc32/libraries/hc32f448_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F448_qspi.out (100%) create mode 100644 bsp/hc32/libraries/hc32f448_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448xA.board create mode 100644 bsp/hc32/libraries/hc32f448_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448xA.flash create mode 100644 bsp/hc32/libraries/hc32f448_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448xC.board create mode 100644 bsp/hc32/libraries/hc32f448_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448xC.flash rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F448_RAM.icf (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F448xA.icf (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F448xC.icf (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f448.s (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HC32F448.svd (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f448.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/arm_common_tables.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/arm_const_structs.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/arm_helium_utils.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/arm_math.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/arm_mve_tables.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/arm_vec_math.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/cachel1_armv7.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/cmsis_armcc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/cmsis_armclang.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/cmsis_armclang_ltm.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/cmsis_compiler.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/cmsis_gcc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/cmsis_iccarm.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/cmsis_version.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_armv81mml.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_armv8mbl.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_armv8mml.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm0.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm0plus.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm1.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm23.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm3.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm33.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm35p.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm4.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm55.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_cm7.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_sc000.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/core_sc300.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/mpu_armv7.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/mpu_armv8.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/pmu_armv8.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/cmsis/Include/tz_context.h (100%) delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448_otp.flash delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448xA.board delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448xA.flash delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448xC.board delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/config/flashloader/FlashHC32F448xC.flash delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/24cxx/24cxx.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/24cxx/24cxx.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/gt9xx/gt9xx.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/gt9xx/gt9xx.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/nt35510/nt35510.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/nt35510/nt35510.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/tca9539/tca9539.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/tca9539/tca9539.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/w25qxx/w25qxx.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/components/w25qxx/w25qxx.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_24cxx.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_24cxx.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_bsp.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_gt9xx.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_gt9xx.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_is61lv6416.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_is61lv6416.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_nt35510.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_nt35510.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_tca9539.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_tca9539.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_w25qxx.c delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/bsp/ev_hc32f448_lqfp80/ev_hc32f448_lqfp80_w25qxx.h delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448.mac delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448.out delete mode 100644 bsp/hc32/libraries/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F448_otp.out rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_adc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_aes.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_aos.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_clk.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_cmp.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_crc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_ctc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dac.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dbgc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dcu.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_def.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dma.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_efm.h (99%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_emb.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_event_port.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_fcg.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_fcm.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_gpio.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_hash.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_i2c.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_icg.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_interrupts.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_keyscan.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_mcan.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_mpu.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_pwc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_qspi.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_rmu.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_rtc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_smc.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_spi.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_sram.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_swdt.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr0.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr4.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr6.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmra.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_trng.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_usart.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_utility.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_wdt.h (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_adc.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_aes.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_aos.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_clk.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_cmp.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_crc.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_ctc.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dac.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dbgc.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dcu.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dma.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_efm.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_emb.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_event_port.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_fcg.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_fcm.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_gpio.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_hash.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_i2c.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_icg.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_interrupts.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_keyscan.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_mcan.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_mpu.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_pwc.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_qspi.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_rmu.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_rtc.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_smc.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_spi.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_sram.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_swdt.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr0.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr4.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr6.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmra.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_trng.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_usart.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_utility.c (100%) rename bsp/hc32/libraries/hc32f448_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_wdt.c (100%) delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/README.txt rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/hc32f460.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4xx.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/system_hc32f460.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F460_256K.FLM (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F460_512K.FLM (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F460_RAM.FLM (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F460_otp.FLM (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/ram.ini (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HC32F460.SFR (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f460.s (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F460xC.ld (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F460xE.ld (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f460.S (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HC32F460.svd (100%) rename bsp/hc32/libraries/hc32f460_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F460.mac (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460.out (100%) create mode 100644 bsp/hc32/libraries/hc32f460_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460_otp.flash rename bsp/hc32/libraries/hc32f460_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F460_otp.mac (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460_otp.out (100%) rename bsp/hc32/libraries/hc32f460_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F460_qspi.flash (60%) rename bsp/hc32/libraries/hc32f460_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F460_qspi.out (100%) create mode 100644 bsp/hc32/libraries/hc32f460_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460xC.board create mode 100644 bsp/hc32/libraries/hc32f460_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460xC.flash create mode 100644 bsp/hc32/libraries/hc32f460_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460xE.board create mode 100644 bsp/hc32/libraries/hc32f460_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460xE.flash rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F460_RAM.icf (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F460xC.icf (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F460xE.icf (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f460.s (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HC32F460.svd (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f460.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/arm_common_tables.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/arm_const_structs.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/arm_helium_utils.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/arm_math.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/arm_mve_tables.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/arm_vec_math.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/cachel1_armv7.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/cmsis_armcc.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/cmsis_armclang.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/cmsis_armclang_ltm.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/cmsis_compiler.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/cmsis_gcc.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/cmsis_iccarm.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/cmsis_version.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_armv81mml.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_armv8mbl.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_armv8mml.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm0.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm0plus.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm1.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm23.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm3.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm33.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm35p.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm4.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm55.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_cm7.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_sc000.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/core_sc300.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/mpu_armv7.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/mpu_armv8.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/pmu_armv8.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/cmsis/Include/tz_context.h (100%) delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/FlashHC32F460.out delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/FlashHC32F460_otp.flash delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/FlashHC32F460_otp.out delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/FlashHC32F460xC.board delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/FlashHC32F460xC.flash delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/FlashHC32F460xE.board delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/FlashHC32F460xE.flash delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/HC32F460xC.board delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/config/flashloader/HC32F460xE.board delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/components/24cxx/24cxx.c delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/components/24cxx/24cxx.h delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/components/w25qxx/w25qxx.c delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/components/w25qxx/w25qxx.h delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/components/wm8731/wm8731.c delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/components/wm8731/wm8731.h delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2.c delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2.h delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2_24cxx.c delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2_24cxx.h delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2_bsp.h delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2_w25qxx.c delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2_w25qxx.h delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2_wm8731.c delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/bsp/ev_hc32f460_lqfp100_v2/ev_hc32f460_lqfp100_v2_wm8731.h delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HDSC_HC32F460.SFR delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HDSC_HC32F460.svd delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460.mac delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460_otp.mac delete mode 100644 bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HDSC_HC32F460.svd rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_adc.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_aes.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_aos.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_can.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_clk.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_cmp.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_crc.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dbgc.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dcu.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_def.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dma.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_efm.h (99%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_emb.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_event_port.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_fcg.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_fcm.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_gpio.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_hash.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_i2c.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_i2s.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_icg.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_interrupts.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_keyscan.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_mpu.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_ots.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_pwc.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_qspi.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_rmu.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_rtc.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_sdioc.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_spi.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_sram.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_swdt.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr0.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr4.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr6.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmra.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_trng.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_usart.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_usb.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_utility.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_wdt.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/inc/hc32f460_ll_interrupts_share.h (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_adc.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_aes.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_aos.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_can.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_clk.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_cmp.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_crc.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dbgc.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dcu.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dma.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_efm.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_emb.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_event_port.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_fcg.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_fcm.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_gpio.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_hash.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_i2c.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_i2s.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_icg.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_interrupts.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_keyscan.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_mpu.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_ots.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_pwc.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_qspi.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_rmu.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_rtc.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_sdioc.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_spi.c (99%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_sram.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_swdt.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr0.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr4.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr6.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmra.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_trng.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_usart.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_usb.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_utility.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_wdt.c (100%) rename bsp/hc32/libraries/hc32f460_ddl/{drivers => }/hc32_ll_driver/src/hc32f460_ll_interrupts_share.c (100%) create mode 100644 bsp/hc32/libraries/hc32f472_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F472xE.ld delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/README.txt rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4a0.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4xx.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Include/system_hc32f4a0.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_1M.FLM (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_2M.FLM (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_0.FLM (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_1.FLM (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_RAM.FLM (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_otp.FLM (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/ram.ini (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HC32F4A0.SFR (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f4a0.s (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xG.ld (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xI.ld (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f4a0.S (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HC32F4A0.svd (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F4A0.mac (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.out (100%) create mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.flash rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.out (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F4A0_qspi.flash (60%) rename bsp/hc32/libraries/hc32f4a0_ddl/{config => cmsis/Device/HDSC/hc32f4xx/Source/IAR}/flashloader/FlashHC32F4A0_qspi.out (100%) create mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xG.board create mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xG.flash create mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xI.board create mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xI.flash rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0_RAM.icf (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xG.icf (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xI.icf (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f4a0.s (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HC32F4A0.svd (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f4a0.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/arm_common_tables.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/arm_const_structs.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/arm_helium_utils.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/arm_math.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/arm_mve_tables.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/arm_vec_math.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/cachel1_armv7.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/cmsis_armcc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/cmsis_armclang.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/cmsis_armclang_ltm.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/cmsis_compiler.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/cmsis_gcc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/cmsis_iccarm.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/cmsis_version.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_armv81mml.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_armv8mbl.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_armv8mml.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm0.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm0plus.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm1.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm23.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm3.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm33.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm35p.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm4.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm55.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_cm7.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_sc000.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/core_sc300.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/mpu_armv7.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/mpu_armv8.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/pmu_armv8.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/cmsis/Include/tz_context.h (100%) delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0.out delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_otp.flash delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_otp.out delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xG.board delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xG.flash delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xI.board delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xI.flash delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/HC32F4A0xG.board delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/HC32F4A0xI.board delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/24cxx/24cxx.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/24cxx/24cxx.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/gt9xx/gt9xx.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/gt9xx/gt9xx.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/nt35510/nt35510.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/nt35510/nt35510.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/ov5640/ov5640.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/ov5640/ov5640.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/s29gl064n90tfi03/s29gl064n90tfi03.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/s29gl064n90tfi03/s29gl064n90tfi03.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/tca9539/tca9539.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/tca9539/tca9539.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/w25qxx/w25qxx.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/w25qxx/w25qxx.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/wm8731/wm8731.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/wm8731/wm8731.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_24cxx.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_24cxx.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_bsp.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_gt9xx.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_gt9xx.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is42s16400j7tli.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is42s16400j7tli.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is62wv51216.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is62wv51216.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_mt29f2g08ab.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_mt29f2g08ab.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_nt35510.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_nt35510.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_ov5640.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_ov5640.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_tca9539.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_tca9539.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_w25qxx.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_w25qxx.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_wm8731.c delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_wm8731.h delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HDSC_HC32F4A0.SFR delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HDSC_HC32F4A0.svd delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.mac delete mode 100644 bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HDSC_HC32F4A0.svd rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_adc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_aes.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_aos.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_can.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_clk.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_cmp.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_crc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_ctc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dac.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dbgc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dcu.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_def.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dma.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dmc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_dvp.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_efm.h (99%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_emb.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_eth.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_event_port.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_fcg.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_fcm.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_fmac.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_gpio.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_hash.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_hrpwm.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_i2c.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_i2s.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_icg.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_interrupts.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_keyscan.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_mau.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_mpu.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_nfc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_ots.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_pwc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_qspi.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_rmu.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_rtc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_sdioc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_smc.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_spi.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_sram.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_swdt.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr0.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr2.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr4.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmr6.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_tmra.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_trng.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_usart.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_usb.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_utility.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32_ll_wdt.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/inc/hc32f4a0_ll_interrupts_share.h (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_adc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_aes.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_aos.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_can.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_clk.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_cmp.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_crc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_ctc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dac.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dbgc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dcu.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dma.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dmc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_dvp.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_efm.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_emb.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_eth.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_event_port.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_fcg.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_fcm.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_fmac.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_gpio.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_hash.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_hrpwm.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_i2c.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_i2s.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_icg.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_interrupts.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_keyscan.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_mau.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_mpu.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_nfc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_ots.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_pwc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_qspi.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_rmu.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_rtc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_sdioc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_smc.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_spi.c (99%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_sram.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_swdt.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr0.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr2.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr4.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmr6.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_tmra.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_trng.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_usart.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_usb.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_utility.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32_ll_wdt.c (100%) rename bsp/hc32/libraries/hc32f4a0_ddl/{drivers => }/hc32_ll_driver/src/hc32f4a0_ll_interrupts_share.c (100%) create mode 100644 bsp/hc32/tests/SConscript create mode 100644 bsp/hc32/tests/test_adc.c create mode 100644 bsp/hc32/tests/test_can.c create mode 100644 bsp/hc32/tests/test_crypto.c create mode 100644 bsp/hc32/tests/test_dac.c create mode 100644 bsp/hc32/tests/test_eth.c create mode 100644 bsp/hc32/tests/test_fal.c create mode 100644 bsp/hc32/tests/test_gpio.c create mode 100644 bsp/hc32/tests/test_hwtimer.c create mode 100644 bsp/hc32/tests/test_i2c.c create mode 100644 bsp/hc32/tests/test_nand.c create mode 100644 bsp/hc32/tests/test_pfc8563_i2c.c create mode 100644 bsp/hc32/tests/test_pm.c create mode 100644 bsp/hc32/tests/test_pulse_encoder.c create mode 100644 bsp/hc32/tests/test_pwm.c create mode 100644 bsp/hc32/tests/test_qspi.c create mode 100644 bsp/hc32/tests/test_rtc.c create mode 100644 bsp/hc32/tests/test_sdmmc.c create mode 100644 bsp/hc32/tests/test_sdram.c create mode 100644 bsp/hc32/tests/test_soft_i2c.c create mode 100644 bsp/hc32/tests/test_spi.c create mode 100644 bsp/hc32/tests/test_tmr_capture.c create mode 100644 bsp/hc32/tests/test_uart_v1.c create mode 100644 bsp/hc32/tests/test_uart_v2.c create mode 100644 bsp/hc32/tests/test_usbd.c create mode 100644 bsp/hc32/tests/test_usbh.c create mode 100644 bsp/hc32/tests/test_wdt.c diff --git a/bsp/hc32/ev_hc32f448_lqfp80/.config b/bsp/hc32/ev_hc32f448_lqfp80/.config index d6c32cff916..8c7b664b6aa 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/.config +++ b/bsp/hc32/ev_hc32f448_lqfp80/.config @@ -1,15 +1,117 @@ + # -# Automatically generated file; DO NOT EDIT. -# RT-Thread Configuration +# RT-Thread Kernel # # -# RT-Thread Kernel +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + # +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set -# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_AMP is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_CPUS_NR=1 @@ -27,18 +129,20 @@ CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 CONFIG_IDLE_THREAD_STACK_SIZE=256 # CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set # -# kservice optimization +# kservice options # -# 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 +# end of kservice options + CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y CONFIG_RT_DEBUGING_COLOR=y CONFIG_RT_DEBUGING_CONTEXT=y # CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_CI_ACTION is not set # # Inter-Thread communication @@ -50,6 +154,7 @@ CONFIG_RT_USING_MAILBOX=y CONFIG_RT_USING_MESSAGEQUEUE=y # CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set # CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication # # Memory Management @@ -66,21 +171,21 @@ CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMTRACE is not set # CONFIG_RT_USING_HEAP_ISR is not set CONFIG_RT_USING_HEAP=y +# end of Memory Management + CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set # CONFIG_RT_USING_THREADSAFE_PRINTF is not set -# CONFIG_RT_USING_SCHED_THREAD_CTX is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" -CONFIG_RT_VER_NUM=0x50100 +CONFIG_RT_VER_NUM=0x50200 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 -# CONFIG_RT_USING_CACHE is not set +# end of RT-Thread Kernel + CONFIG_RT_USING_HW_ATOMIC=y -# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set -# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y @@ -115,12 +220,15 @@ CONFIG_FINSH_USING_OPTION_COMPLETION=y # DFS: device virtual file system # # CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + # CONFIG_RT_USING_FAL is not set # # Device Drivers # # CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_UNAMED_PIPE_NUMBER=64 CONFIG_RT_USING_SYSTEM_WORKQUEUE=y @@ -131,16 +239,24 @@ CONFIG_RT_USING_SERIAL_V1=y # CONFIG_RT_USING_SERIAL_V2 is not set CONFIG_RT_SERIAL_USING_DMA=y CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_CPUTIME is not set -# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_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_SOFT_I2C is not set # CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set # CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set # CONFIG_RT_USING_NULL is not set # CONFIG_RT_USING_ZERO is not set # CONFIG_RT_USING_RANDOM is not set # CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set @@ -153,21 +269,14 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_TOUCH is not set # CONFIG_RT_USING_LCD 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_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set # CONFIG_RT_USING_VIRTIO is not set CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_KTIME is not set # CONFIG_RT_USING_HWTIMER is not set - -# -# 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 +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers # # C/C++ and POSIX layer @@ -185,6 +294,8 @@ CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer # # POSIX (Portable Operating System Interface) layer @@ -206,7 +317,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # Socket is in the 'Network' category # +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + # CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer # # Network @@ -215,12 +330,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_NETDEV is not set # CONFIG_RT_USING_LWIP is not set # CONFIG_RT_USING_AT is not set +# end of Network # # Memory protection # # CONFIG_RT_USING_MEM_PROTECTION is not set # CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection # # Utilities @@ -232,12 +349,25 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RESOURCE_ID is not set # CONFIG_RT_USING_ADT is not set # CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + # CONFIG_RT_USING_VBUS is not set +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + # # RT-Thread Utestcases # # CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases # # RT-Thread online packages @@ -246,7 +376,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # 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 @@ -259,6 +388,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_WEBTERMINAL is not set # CONFIG_PKG_USING_FREEMODBUS is not set # CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set # # Wi-Fi @@ -268,27 +398,35 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # Marvell WiFi # # CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi # # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + # CONFIG_PKG_USING_RW007 is not set # # CYW43012 WiFi # # CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi # # BL808 WiFi # # CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi # # CYW43439 WiFi # # CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set @@ -311,6 +449,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set # CONFIG_PKG_USING_JOYLINK is not set # CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + # CONFIG_PKG_USING_NIMBLE is not set # CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set @@ -353,6 +493,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ZEPHYR_POLLING is not set # CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set # CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things # # security packages @@ -363,6 +505,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_TINYCRYPT is not set # CONFIG_PKG_USING_TFM is not set # CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages # # language packages @@ -378,18 +521,22 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_JSMN is not set # CONFIG_PKG_USING_AGILE_JSMN is not set # CONFIG_PKG_USING_PARSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format # # XML: Extensible Markup Language # # CONFIG_PKG_USING_SIMPLE_XML is not set # CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + # CONFIG_PKG_USING_LUATOS_SOC is not set # CONFIG_PKG_USING_LUA is not set # CONFIG_PKG_USING_JERRYSCRIPT is not set # CONFIG_PKG_USING_MICROPYTHON is not set # CONFIG_PKG_USING_PIKASCRIPT is not set # CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages # # multimedia packages @@ -401,12 +548,15 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_LVGL is not set # CONFIG_PKG_USING_LV_MUSIC_DEMO is not set # CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library # # u8g2: a monochrome graphic library # # CONFIG_PKG_USING_U8G2_OFFICIAL is not set # CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -427,6 +577,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_GUIENGINE is not set # CONFIG_PKG_USING_PERSIMMON is not set # CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages # # tools packages @@ -476,6 +627,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_VOFA_PLUS is not set # CONFIG_PKG_USING_RT_TRACE is not set # CONFIG_PKG_USING_ZDEBUG is not set +# end of tools packages # # system packages @@ -487,6 +639,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT_MEMCPY_CM is not set # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set # CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set # # acceleration: Assembly language or algorithmic acceleration packages @@ -494,6 +649,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QFPLIB_M0_FULL is not set # CONFIG_PKG_USING_QFPLIB_M0_TINY is not set # CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages # # CMSIS: ARM Cortex-M Microcontroller Software Interface Standard @@ -504,6 +660,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_CMSIS_NN is not set # CONFIG_PKG_USING_CMSIS_RTOS1 is not set # CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard # # Micrium: Micrium software products porting for RT-Thread @@ -514,6 +671,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_LITEOS_SDK is not set # CONFIG_PKG_USING_TZ_DATABASE is not set @@ -561,6 +720,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RTP is not set # CONFIG_PKG_USING_REB is not set # CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages # # peripheral libraries and drivers @@ -573,9 +733,27 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # STM32 HAL & SDK Drivers # -# CONFIG_PKG_USING_STM32L4XX_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set # CONFIG_PKG_USING_STM32WB55_SDK is not set # CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + # CONFIG_PKG_USING_BLUETRUM_SDK is not set # CONFIG_PKG_USING_EMBARC_BSP is not set # CONFIG_PKG_USING_ESP_IDF is not set @@ -585,9 +763,12 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_K210_SDK is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + # CONFIG_PKG_USING_NRF5X_SDK is not set # CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers # # sensors drivers @@ -657,6 +838,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers # # touch drivers @@ -671,6 +853,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_XPT2046_TOUCH is not set # CONFIG_PKG_USING_CST816X is not set # CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set @@ -743,6 +927,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_BT_MX01 is not set # CONFIG_PKG_USING_RGPOWER is not set # CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers # # AI packages @@ -757,15 +942,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set # CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages # # Signal Processing and Control Algorithm Packages # +# CONFIG_PKG_USING_APID is not set # CONFIG_PKG_USING_FIRE_PID_CURVE is not set # CONFIG_PKG_USING_QPID is not set # CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_DIGITALCTRL is not set # CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages # # miscellaneous packages @@ -774,6 +962,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # project laboratory # +# end of project laboratory # # samples: kernel and components samples @@ -782,6 +971,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples # # entertainment: terminal games and other interesting software packages @@ -798,6 +988,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_COWSAY is not set # CONFIG_PKG_USING_MORSE is not set # CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + # CONFIG_PKG_USING_LIBCSV is not set # CONFIG_PKG_USING_OPTPARSE is not set # CONFIG_PKG_USING_FASTLZ is not set @@ -831,6 +1023,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_SOEM is not set # CONFIG_PKG_USING_QPARAM is not set # CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages # # Arduino libraries @@ -846,6 +1039,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set # CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set # CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos # # Sensors @@ -985,6 +1179,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set # CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set # CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors # # Display @@ -996,6 +1192,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set # CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display # # Timing @@ -1004,6 +1201,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set # CONFIG_PKG_USING_ARDUINO_TICKER is not set # CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing # # Data Processing @@ -1011,6 +1209,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set # CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set # CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing # # Data Storage @@ -1021,6 +1221,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication # # Device Control @@ -1032,12 +1233,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set # CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control # # Other # # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other # # Signal IO @@ -1050,10 +1253,14 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set # CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO # # Uncategorized # +# end of Arduino libraries +# end of RT-Thread online packages + CONFIG_SOC_FAMILY_HC32=y CONFIG_SOC_SERIES_HC32F4=y @@ -1069,12 +1276,15 @@ CONFIG_BSP_USING_ON_CHIP_FLASH_CACHE=y CONFIG_BSP_USING_ON_CHIP_FLASH_ICODE_CACHE=y CONFIG_BSP_USING_ON_CHIP_FLASH_DCODE_CACHE=y CONFIG_BSP_USING_ON_CHIP_FLASH_ICODE_PREFETCH=y +# end of On-chip Drivers # # Onboard Peripheral Drivers # -# CONFIG_BSP_USING_TCA9539 is not set +CONFIG_BSP_USING_TCA9539=y # CONFIG_BSP_USING_SPI_FLASH is not set +CONFIG_BSP_USING_EXT_IO=y +# end of Onboard Peripheral Drivers # # On-chip Peripheral Drivers @@ -1083,18 +1293,24 @@ CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART=y # CONFIG_BSP_USING_UART1 is not set CONFIG_BSP_USING_UART2=y -CONFIG_BSP_UART2_RX_USING_DMA=y -CONFIG_BSP_UART2_TX_USING_DMA=y +# CONFIG_BSP_UART2_RX_USING_DMA is not set +# CONFIG_BSP_UART2_TX_USING_DMA 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_I2C is not set +CONFIG_BSP_USING_I2C=y +# CONFIG_BSP_USING_I2C1_SW is not set +CONFIG_BSP_USING_I2C_HW=y +CONFIG_BSP_USING_I2C1=y +# CONFIG_BSP_I2C1_TX_USING_DMA is not set +# CONFIG_BSP_I2C1_RX_USING_DMA is not set +# CONFIG_BSP_USING_I2C2 is not set # CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_DAC is not set -# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_MCAN is not set # CONFIG_BSP_USING_WDT_TMR is not set # CONFIG_BSP_USING_RTC is not set # CONFIG_BSP_USING_PM is not set @@ -1104,7 +1320,9 @@ CONFIG_BSP_UART2_TX_USING_DMA=y # CONFIG_BSP_USING_PULSE_ENCODER is not set # CONFIG_BSP_USING_HWTIMER is not set # CONFIG_BSP_USING_SENSOR is not set +# end of On-chip Peripheral Drivers # # Board extended module Drivers # +# end of Hardware Drivers Config diff --git a/bsp/hc32/ev_hc32f448_lqfp80/.cproject b/bsp/hc32/ev_hc32f448_lqfp80/.cproject index 5cfcd3d9d9f..f24a2c2e431 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/.cproject +++ b/bsp/hc32/ev_hc32f448_lqfp80/.cproject @@ -68,10 +68,14 @@ - - - + + + + + + + @@ -163,10 +167,14 @@ - - - + + + + + + + @@ -186,7 +194,7 @@ - + diff --git a/bsp/hc32/ev_hc32f448_lqfp80/.project b/bsp/hc32/ev_hc32f448_lqfp80/.project index d8904aee726..cb1c6b03b3a 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/.project +++ b/bsp/hc32/ev_hc32f448_lqfp80/.project @@ -64,5 +64,15 @@ 2 $%7BPARENT-1-PROJECT_LOC%7D/libraries + + rt-thread/bsp/hc32/platform + 2 + PARENT-1-PROJECT_LOC/platform + + + rt-thread/bsp/hc32/tests + 2 + PARENT-1-PROJECT_LOC/tests + diff --git a/bsp/hc32/ev_hc32f448_lqfp80/README.md b/bsp/hc32/ev_hc32f448_lqfp80/README.md index 8fb40187348..aedac9baecb 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/README.md +++ b/bsp/hc32/ev_hc32f448_lqfp80/README.md @@ -50,35 +50,43 @@ EV_F448_LQ80_Rev1.0 开发板常用 **板载资源** 如下: 本 BSP 目前对外设的支持情况如下: -| **板载外设** | **支持情况** | **备注** | -| :------------ | :-----------: | :-----------------------------------: | -| USB 转串口 | 支持 | 使用 UART2 | -| LED | 支持 | LED1~4 | - -| **片上外设** | **支持情况** | **备注** | -| :------------ | :-----------: | :-----------------------------------: | -| ADC | 支持 | ADC1: CH10, CH11,
ADC3: CH1 | -| CAN | 支持 | CAN1、CAN2 | -| GPIO | 支持 | PA0, PA1... PH2 ---> PIN: 0, 1...82 | -| I2C | 支持 | 软件模拟
硬件I2C1~2
I2C1支持EEPROM(BL24C256) | -| Hwtimer | 支持 | Hwtimer1~5 | -| SPI | 支持 | SPI1~3
SPI1支持W25Q | -| UART | 支持 | UART1~6
UART2为console使用 | - +| **板载外设** | **支持情况** | **备注** | +|:-------- |:--------:|:--------:| +| USB 转串口 | 支持 | 使用 UART2 | +| LED | 支持 | LED1~4 | + +| **片上外设** | **支持情况** | **备注** | +|:------------- |:--------:|:------------------------------------------:| +| Crypto | 支持 | AES, CRC, HASH, RNG, UID | +| DAC | 支持 | | +| ADC | 支持 | ADC1: CH10, CH11,
ADC3: CH1 | +| CAN | 支持 | CAN1、CAN2 | +| GPIO | 支持 | PA0, PA1... PH2 ---> PIN: 0, 1...82 | +| I2C | 支持 | 软件模拟
硬件I2C1~2
I2C1支持EEPROM(BL24C256) | +| PM | 支持 | | +| Lptimer | 支持 | | +| Hwtimer | 支持 | Hwtimer1~5 | +| Pulse_encoder | 支持 | | +| PWM | 支持 | | +| RTC | 支持 | 闹钟精度为1分钟 | +| WDT | 支持 | | +| I2C | 支持 | 软件、硬件 I2C | +| QSPI | 支持 | | +| SPI | 支持 | SPI1~3
SPI1支持W25Q | +| UART | 支持 | UART1~6
UART2为console使用 | ## 使用说明 使用说明分为如下两个章节: - 快速上手 - + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 - 进阶使用 - + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 - ### 快速上手 本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 @@ -120,9 +128,13 @@ msh > 4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 ## 注意事项 -无 + +| 板载外设 | 模式 | 注意事项 | +| ---- | ---- | ------------------------------------------------------------------------------------------------------ | +| USB | host | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | + ## 联系人信息 维护人: -- [小华半导体MCU](https://www.xhsc.com.cn),邮箱: \ No newline at end of file +- [小华半导体MCU](https://www.xhsc.com.cn),邮箱: \ No newline at end of file diff --git a/bsp/hc32/ev_hc32f448_lqfp80/SConstruct b/bsp/hc32/ev_hc32f448_lqfp80/SConstruct index ded3f4c66f5..a23677c9842 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/SConstruct +++ b/bsp/hc32/ev_hc32f448_lqfp80/SConstruct @@ -56,7 +56,13 @@ objs.extend(SConscript(os.path.join(libraries_path_prefix, hc32_library, 'SConsc # include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'hc32_drivers', 'SConscript'))) -objs.extend(SConscript(os.path.join(os.getcwd(), 'board', 'ports', 'SConscript'))) +# include platform +platform_path_prefix = os.path.dirname(SDK_ROOT) + '/platform' +objs.extend(SConscript(os.path.join(platform_path_prefix, 'SConscript'))) + +# include tests +test_path_prefix = os.path.dirname(SDK_ROOT) + '/tests' +objs.extend(SConscript(os.path.join(test_path_prefix, 'SConscript'))) # make a building DoBuilding(TARGET, objs) diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig b/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig index 5af9b90959f..b8b97d7c755 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig @@ -42,12 +42,17 @@ menu "Onboard Peripheral Drivers" select RT_USING_MTD_NOR default n + config BSP_USING_EXT_IO + bool + default y + endmenu menu "On-chip Peripheral Drivers" config BSP_USING_GPIO bool "Enable GPIO" select RT_USING_PIN + select BSP_USING_TCA9539 default y menuconfig BSP_USING_UART @@ -212,12 +217,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_I2C1_SW config BSP_I2C1_SCL_PIN int "i2c1 scl pin number" - range 1 176 - default 51 + range 1 80 + default 10 config BSP_I2C1_SDA_PIN int "I2C1 sda pin number" - range 1 176 - default 90 + range 1 80 + default 9 endif endif @@ -368,23 +373,20 @@ menu "On-chip Peripheral Drivers" config BSP_USING_DAC1 bool "using dac1" default n - config BSP_USING_DAC2 - bool "using dac2" - default n endif - menuconfig BSP_USING_CAN - bool "Enable CAN" + menuconfig BSP_USING_MCAN + bool "Enable MCAN" default n select RT_USING_CAN select RT_CAN_USING_HDR select BSP_USING_TCA9539 - if BSP_USING_CAN - config BSP_USING_CAN1 - bool "using can1" + if BSP_USING_MCAN + config BSP_USING_MCAN1 + bool "using mcan1" default n - config BSP_USING_CAN2 - bool "using can2" + config BSP_USING_MCAN2 + bool "using mcan2" default n endif @@ -418,10 +420,13 @@ menu "On-chip Peripheral Drivers" default BSP_RTC_USING_XTAL32 config BSP_RTC_USING_XTAL32 - bool "RTC USING XTAL32" + bool "RTC Using XTAL32" config BSP_RTC_USING_LRC - bool "RTC USING LRC" + bool "RTC Using LRC" + + config BSP_RTC_USING_XTAL_DIV + bool "RTC Using XTAL Division" endchoice endif diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/SConscript b/bsp/hc32/ev_hc32f448_lqfp80/board/SConscript index 2062a20a604..16b28817c8d 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/SConscript +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/SConscript @@ -12,12 +12,6 @@ board.c board_config.c ''') -if GetDepend(['BSP_USING_TCA9539']): - src += Glob('ports/tca9539.c') - -if GetDepend(['BSP_USING_SPI_FLASH']): - src += Glob('ports/drv_spi_flash.c') - path = [cwd] path += [cwd + '/ports'] path += [cwd + '/config'] @@ -25,11 +19,11 @@ path += [cwd + '/config'] startup_path_prefix = SDK_LIB if rtconfig.PLATFORM in ['gcc']: - src += [startup_path_prefix + '/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f448.S'] + src += [startup_path_prefix + '/hc32f448_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f448.S'] elif rtconfig.PLATFORM in ['armcc', 'armclang']: - src += [startup_path_prefix + '/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f448.s'] + src += [startup_path_prefix + '/hc32f448_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f448.s'] elif rtconfig.PLATFORM in ['iccarm']: - src += [startup_path_prefix + '/hc32f448_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f448.s'] + src += [startup_path_prefix + '/hc32f448_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f448.s'] CPPDEFINES = ['HC32F448', '__DEBUG'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board.c b/bsp/hc32/ev_hc32f448_lqfp80/board/board.c index 13dd21c5971..5e5aa64930c 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/board.c +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board.c @@ -7,6 +7,7 @@ * Change Logs: * Date Author Notes * 2024-02-20 CDT first version + * 2024-06-07 CDT Add XTAL divider config code for RTC */ #include "board.h" @@ -41,6 +42,9 @@ void SystemClock_Config(void) #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM) stc_clock_xtal32_init_t stcXtal32Init; #endif +#if defined(BSP_RTC_USING_XTAL_DIV) + stc_clock_xtaldiv_init_t stcXtaldivInit; +#endif /* PCLK0, HCLK Max 200MHz */ /* PCLK1, PCLK4 Max 100MHz */ @@ -87,17 +91,27 @@ void SystemClock_Config(void) stcXtal32Init.u8Filter = CLK_XTAL32_FILTER_RUN_MD; (void)CLK_Xtal32Init(&stcXtal32Init); #endif + +#if defined(BSP_RTC_USING_XTAL_DIV) + /* Xtal Div config */ + (void)CLK_XtalDivStructInit(&stcXtaldivInit); + /* 8000000Hz / 32768Hz = 0x7A12 / 0x80 */ + stcXtaldivInit.u32Num = 0x7A12UL; + stcXtaldivInit.u32Den = 0x80UL; + stcXtaldivInit.u32State = CLK_XTALDIV_ON; + (void)CLK_XtalDivInit(&stcXtaldivInit); +#endif } /** Peripheral Clock Configuration */ void PeripheralClock_Config(void) { -#if defined(BSP_USING_CAN1) - CLK_SetCANClockSrc(CLK_CAN1, CLK_CANCLK_SYSCLK_DIV6); +#if defined(BSP_USING_MCAN1) + CLK_SetCANClockSrc(CLK_MCAN1, CLK_MCANCLK_SYSCLK_DIV5); #endif -#if defined(BSP_USING_CAN2) - CLK_SetCANClockSrc(CLK_CAN2, CLK_CANCLK_SYSCLK_DIV6); +#if defined(BSP_USING_MCAN2) + CLK_SetCANClockSrc(CLK_MCAN2, CLK_MCANCLK_SYSCLK_DIV5); #endif #if defined(RT_USING_ADC) diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c index 486db6c828f..aa364c3ed27 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c @@ -11,7 +11,7 @@ #include #include "board_config.h" -#include "tca9539.h" +#include "tca9539_port.h" /** * The below functions will initialize HC32 board. @@ -130,7 +130,7 @@ rt_err_t rt_hw_board_dac_init(CM_DAC_TypeDef *DACx) switch ((rt_uint32_t)DACx) { #if defined(BSP_USING_DAC1) - case (rt_uint32_t)CM_DAC1: + case (rt_uint32_t)CM_DAC: (void)GPIO_Init(DAC1_CH1_PORT, DAC1_CH1_PIN, &stcGpioInit); (void)GPIO_Init(DAC1_CH2_PORT, DAC1_CH2_PIN, &stcGpioInit); break; @@ -144,34 +144,35 @@ rt_err_t rt_hw_board_dac_init(CM_DAC_TypeDef *DACx) } #endif + #if defined(RT_USING_CAN) void CanPhyEnable(void) { -#if defined(BSP_USING_CAN1) +#if defined(BSP_USING_MCAN1) TCA9539_WritePin(CAN1_STB_PORT, CAN1_STB_PIN, TCA9539_PIN_RESET); TCA9539_ConfigPin(CAN1_STB_PORT, CAN1_STB_PIN, TCA9539_DIR_OUT); #endif -#if defined(BSP_USING_CAN2) +#if defined(BSP_USING_MCAN2) TCA9539_WritePin(CAN2_STB_PORT, CAN2_STB_PIN, TCA9539_PIN_RESET); TCA9539_ConfigPin(CAN2_STB_PORT, CAN2_STB_PIN, TCA9539_DIR_OUT); #endif } -rt_err_t rt_hw_board_can_init(CM_CAN_TypeDef *CANx) +rt_err_t rt_hw_board_can_init(CM_MCAN_TypeDef *MCANx) { rt_err_t result = RT_EOK; - switch ((rt_uint32_t)CANx) + switch ((rt_uint32_t)MCANx) { -#if defined(BSP_USING_CAN1) - case (rt_uint32_t)CM_CAN1: - GPIO_SetFunc(CAN1_TX_PORT, CAN1_TX_PIN, CAN1_TX_PIN_FUNC); - GPIO_SetFunc(CAN1_RX_PORT, CAN1_RX_PIN, CAN1_RX_PIN_FUNC); +#if defined(BSP_USING_MCAN1) + case (rt_uint32_t)CM_MCAN1: + GPIO_SetFunc(MCAN1_TX_PORT, MCAN1_TX_PIN, MCAN1_TX_PIN_FUNC); + GPIO_SetFunc(MCAN1_RX_PORT, MCAN1_RX_PIN, MCAN1_RX_PIN_FUNC); break; #endif -#if defined(BSP_USING_CAN2) - case (rt_uint32_t)CM_CAN2: - GPIO_SetFunc(CAN2_TX_PORT, CAN2_TX_PIN, CAN2_TX_PIN_FUNC); - GPIO_SetFunc(CAN2_RX_PORT, CAN2_RX_PIN, CAN2_RX_PIN_FUNC); +#if defined(BSP_USING_MCAN2) + case (rt_uint32_t)CM_MCAN2: + GPIO_SetFunc(MCAN2_TX_PORT, MCAN2_TX_PIN, MCAN2_TX_PIN_FUNC); + GPIO_SetFunc(MCAN2_RX_PORT, MCAN2_RX_PIN, MCAN2_RX_PIN_FUNC); break; #endif default: @@ -183,7 +184,6 @@ rt_err_t rt_hw_board_can_init(CM_CAN_TypeDef *CANx) } #endif - #if defined (RT_USING_SPI) rt_err_t rt_hw_spi_board_init(CM_SPI_TypeDef *CM_SPIx) { @@ -333,103 +333,7 @@ rt_err_t rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef *TMR6x) #endif #ifdef RT_USING_PM -#define EFM_ERASE_TIME_MAX_IN_MILLISECOND (20) #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) - -static void _pm_sleep_common_init(rt_bool_t b_disable_unused_clk) -{ - CLK_Xtal32Cmd(ENABLE); - - rt_tick_t tick_start = rt_tick_get_millisecond(); - rt_err_t rt_stat = RT_EOK; - //wait flash idle - while (SET != EFM_GetStatus(EFM_FLAG_RDY)) - { - if (rt_tick_get_millisecond() - tick_start > EFM_ERASE_TIME_MAX_IN_MILLISECOND) - { - rt_stat = RT_ERROR; - break; - } - } - RT_ASSERT(rt_stat == RT_EOK); - - if (b_disable_unused_clk) - { - uint32_t cur_clk_src = READ_REG8_BIT(CM_CMU->CKSWR, CMU_CKSWR_CKSW); - - switch (cur_clk_src) - { - case CLK_SYSCLK_SRC_HRC: - CLK_PLLCmd(DISABLE); - CLK_MrcCmd(DISABLE); - CLK_LrcCmd(DISABLE); - CLK_XtalCmd(DISABLE); - PWC_LDO_Cmd(PWC_LDO_PLL, DISABLE); - break; - case CLK_SYSCLK_SRC_MRC: - CLK_PLLCmd(DISABLE); - CLK_HrcCmd(DISABLE); - CLK_LrcCmd(DISABLE); - CLK_XtalCmd(DISABLE); - PWC_LDO_Cmd(PWC_LDO_PLL | PWC_LDO_HRC, DISABLE); - - break; - case CLK_SYSCLK_SRC_XTAL: - CLK_PLLCmd(DISABLE); - CLK_HrcCmd(DISABLE); - CLK_MrcCmd(DISABLE); - CLK_LrcCmd(DISABLE); - PWC_LDO_Cmd(PWC_LDO_PLL | PWC_LDO_HRC, DISABLE); - - break; - case CLK_SYSCLK_SRC_XTAL32: - CLK_PLLCmd(DISABLE); - CLK_HrcCmd(DISABLE); - CLK_MrcCmd(DISABLE); - CLK_LrcCmd(DISABLE); - CLK_XtalCmd(DISABLE); - PWC_LDO_Cmd(PWC_LDO_PLL | PWC_LDO_HRC, DISABLE); - - break; - case CLK_SYSCLK_SRC_PLL: - if (CLK_PLL_SRC_XTAL == PLL_SRC) - { - CLK_HrcCmd(DISABLE); - } - else - { - CLK_XtalCmd(DISABLE); - } - CLK_MrcCmd(DISABLE); - CLK_LrcCmd(DISABLE); - PWC_LDO_Cmd(PWC_LDO_HRC, DISABLE); - - break; - default: - break; - } - } -} - -void rt_hw_board_pm_sleep_deep_init(void) -{ -#if (PM_SLEEP_DEEP_CFG_CLK == PWC_STOP_CLK_KEEP) - _pm_sleep_common_init(RT_TRUE); -#else - _pm_sleep_common_init(RT_FALSE); - CLK_PLLCmd(DISABLE); - CLK_HrcCmd(DISABLE); - CLK_LrcCmd(DISABLE); - CLK_XtalCmd(DISABLE); - PWC_LDO_Cmd(PWC_LDO_PLL | PWC_LDO_HRC, DISABLE); -#endif -} - -void rt_hw_board_pm_sleep_shutdown_init(void) -{ - _pm_sleep_common_init(RT_TRUE); -} - void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode) { switch (run_mode) diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h index 0469ffb0496..487e4f2f88e 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h @@ -78,17 +78,17 @@ /*********** ADC configure *********/ #if defined(BSP_USING_ADC1) - #define ADC1_CH_PORT (GPIO_PORT_C) + #define ADC1_CH_PORT (GPIO_PORT_C) /* Default ADC12_IN10 */ #define ADC1_CH_PIN (GPIO_PIN_00) #endif #if defined(BSP_USING_ADC2) - #define ADC2_CH_PORT (GPIO_PORT_C) - #define ADC2_CH_PIN (GPIO_PIN_01) + #define ADC2_CH_PORT (GPIO_PORT_A) /* Default ADC12_IN4 */ + #define ADC2_CH_PIN (GPIO_PIN_04) #endif #if defined(BSP_USING_ADC3) - #define ADC3_CH_PORT (GPIO_PORT_E) + #define ADC3_CH_PORT (GPIO_PORT_E) /* Default ADC3_IN1 */ #define ADC3_CH_PIN (GPIO_PIN_03) #endif @@ -101,24 +101,24 @@ #endif /*********** CAN configure *********/ -#if defined(BSP_USING_CAN1) - #define CAN1_TX_PORT (GPIO_PORT_C) - #define CAN1_TX_PIN (GPIO_PIN_12) - #define CAN1_TX_PIN_FUNC (GPIO_FUNC_56) - - #define CAN1_RX_PORT (GPIO_PORT_D) - #define CAN1_RX_PIN (GPIO_PIN_00) - #define CAN1_RX_PIN_FUNC (GPIO_FUNC_57) +#if defined(BSP_USING_MCAN1) + #define MCAN1_TX_PORT (GPIO_PORT_C) + #define MCAN1_TX_PIN (GPIO_PIN_12) + #define MCAN1_TX_PIN_FUNC (GPIO_FUNC_56) + + #define MCAN1_RX_PORT (GPIO_PORT_D) + #define MCAN1_RX_PIN (GPIO_PIN_00) + #define MCAN1_RX_PIN_FUNC (GPIO_FUNC_57) #endif -#if defined(BSP_USING_CAN2) - #define CAN2_TX_PORT (GPIO_PORT_H) - #define CAN2_TX_PIN (GPIO_PIN_02) - #define CAN2_TX_PIN_FUNC (GPIO_FUNC_56) +#if defined(BSP_USING_MCAN2) + #define MCAN2_TX_PORT (GPIO_PORT_H) + #define MCAN2_TX_PIN (GPIO_PIN_02) + #define MCAN2_TX_PIN_FUNC (GPIO_FUNC_56) - #define CAN2_RX_PORT (GPIO_PORT_E) - #define CAN2_RX_PIN (GPIO_PIN_04) - #define CAN2_RX_PIN_FUNC (GPIO_FUNC_57) + #define MCAN2_RX_PORT (GPIO_PORT_E) + #define MCAN2_RX_PIN (GPIO_PIN_04) + #define MCAN2_RX_PIN_FUNC (GPIO_FUNC_57) #endif /************************* SPI port ***********************/ @@ -296,11 +296,11 @@ #if defined(BSP_USING_TMR6_PULSE_ENCODER) #if defined(BSP_USING_PULSE_ENCODER_TMR6_1) - #define PULSE_ENCODER_TMR6_1_A_PORT (GPIO_PORT_A) - #define PULSE_ENCODER_TMR6_1_A_PIN (GPIO_PIN_08) + #define PULSE_ENCODER_TMR6_1_A_PORT (GPIO_PORT_B) + #define PULSE_ENCODER_TMR6_1_A_PIN (GPIO_PIN_05) #define PULSE_ENCODER_TMR6_1_A_PIN_FUNC (GPIO_FUNC_3) - #define PULSE_ENCODER_TMR6_1_B_PORT (GPIO_PORT_A) - #define PULSE_ENCODER_TMR6_1_B_PIN (GPIO_PIN_07) + #define PULSE_ENCODER_TMR6_1_B_PORT (GPIO_PORT_B) + #define PULSE_ENCODER_TMR6_1_B_PIN (GPIO_PIN_13) #define PULSE_ENCODER_TMR6_1_B_PIN_FUNC (GPIO_FUNC_3) #endif /* BSP_USING_PULSE_ENCODER_TMR6_1 */ #endif /* BSP_USING_TMR6_PULSE_ENCODER */ diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/adc_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/adc_config.h index 7fdc0d3e0fe..be6d4c6de34 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/adc_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/adc_config.h @@ -1,5 +1,4 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. * * SPDX-License-Identifier: Apache-2.0 @@ -32,7 +31,7 @@ extern "C" { .hard_trig_src = ADC_HARDTRIG_EVT0, \ .internal_trig0_comtrg0_enable = RT_FALSE, \ .internal_trig0_comtrg1_enable = RT_FALSE, \ - .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_A, \ + .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_B, \ .internal_trig1_comtrg0_enable = RT_FALSE, \ .internal_trig1_comtrg1_enable = RT_FALSE, \ .internal_trig1_sel = EVT_SRC_MAX, \ @@ -75,7 +74,7 @@ extern "C" { .hard_trig_src = ADC_HARDTRIG_EVT0, \ .internal_trig0_comtrg0_enable = RT_FALSE, \ .internal_trig0_comtrg1_enable = RT_FALSE, \ - .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_A, \ + .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_B, \ .internal_trig1_comtrg0_enable = RT_FALSE, \ .internal_trig1_comtrg1_enable = RT_FALSE, \ .internal_trig1_sel = EVT_SRC_MAX, \ @@ -118,7 +117,7 @@ extern "C" { .hard_trig_src = ADC_HARDTRIG_EVT0, \ .internal_trig0_comtrg0_enable = RT_FALSE, \ .internal_trig0_comtrg1_enable = RT_FALSE, \ - .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_A, \ + .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_B, \ .internal_trig1_comtrg0_enable = RT_FALSE, \ .internal_trig1_comtrg1_enable = RT_FALSE, \ .internal_trig1_sel = EVT_SRC_MAX, \ diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/can_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/can_config.h index eb25e856872..cd06fac8d17 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/can_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/can_config.h @@ -19,117 +19,352 @@ extern "C" { #endif -#ifdef BSP_USING_CAN1 -#define CAN1_CLOCK_SEL (CAN_CLOCK_SRC_40M) +/***********************************************************************************************/ +/***********************************************************************************************/ +// The arguments of RT command RT_CAN_CMD_SET_CANFD +#define MCAN_FD_CLASSICAL 0 /* CAN classical */ +#define MCAN_FD_ISO_FD_NO_BRS 1 /* ISO CAN FD without BRS */ +#define MCAN_FD_ISO_FD_BRS 2 /* ISO CAN FD with BRS */ +#define MCAN_FD_NON_ISO_FD_NO_BRS 3 /* non-ISO CAN FD without BRS */ +#define MCAN_FD_NON_ISO_FD_BRS 4 /* non-ISO CAN FD with BRS */ + +#define MCAN_FD_ARG_MIN MCAN_FD_ISO_FD_NO_BRS +#define MCAN_FD_ARG_MAX MCAN_FD_NON_ISO_FD_BRS + +/* The default configuration for MCANs. Users can modify the configurations based on the application. + For the message RAM: + 1. MCAN1 and MCAN2 share 2048 bytes message RAM + 2. User can modify the definitions of filter number, Rx FIFO number, Tx FIFO number. + 3. MCAN has two configurable Receive FIFOs, Rx FIFO0 and Rx FIFO1. There use Rx FIFO0 only by default. + If only one FIFO is needed, use Rx FIFO0. If Rx FIFO1 is needed, define it's macro between 1 and 64, + and pay attention the total size of meesage RAM that to be allocated. +*/ + #ifdef RT_CAN_USING_CANFD -#define CAN1_CANFD_MODE (CAN_FD_MD_ISO) +#define MCAN_FD_SEL MCAN_FD_ISO_FD_BRS +#define MCAN_TOTAL_FILTER_NUM (26U) +#define MCAN_STD_FILTER_NUM (13U) /* Each standard filter element size is 4 bytes */ +#define MCAN_EXT_FILTER_NUM (13U) /* Each extended filter element size is 8 bytes */ +#define MCAN_TX_FIFO_NUM (6U) +#define MCAN_RX_FIFO_NUM (6U) +#define MCAN_DATA_FIELD_SIZE (MCAN_DATA_SIZE_64BYTE) /* Each FIFO element size is 64+8 bytes */ +#else +#define MCAN_FD_SEL MCAN_FD_CLASSICAL +#define MCAN_TOTAL_FILTER_NUM (32U) +#define MCAN_STD_FILTER_NUM (16U) /* Each standard filter element size is 4 bytes */ +#define MCAN_EXT_FILTER_NUM (16U) /* Each extended filter element size is 8 bytes */ +#define MCAN_TX_FIFO_NUM (26U) +#define MCAN_RX_FIFO_NUM (26U) +#define MCAN_DATA_FIELD_SIZE (MCAN_DATA_SIZE_8BYTE) /* Each FIFO element size is 8+8 bytes */ #endif -#define CAN1_NAME ("can1") -#ifndef CAN1_INIT_PARAMS -#define CAN1_INIT_PARAMS \ + +#ifdef BSP_USING_MCAN1 +#define MCAN1_NAME ("can1") +#define MCAN1_WORK_MODE (RT_CAN_MODE_NORMAL) +#define MCAN1_TX_PRIV_MODE RT_CAN_MODE_NOPRIV /* RT_CAN_MODE_NOPRIV: Tx FIFO mode; RT_CAN_MODE_PRIV: Tx priority mode */ + +#define MCAN1_FD_SEL MCAN_FD_SEL + +#define MCAN1_STD_FILTER_NUM MCAN_STD_FILTER_NUM +#define MCAN1_EXT_FILTER_NUM MCAN_EXT_FILTER_NUM + +#define MCAN1_RX_FIFO0_NUM MCAN_RX_FIFO_NUM +#define MCAN1_RX_FIFO0_DATA_FIELD_SIZE MCAN_DATA_FIELD_SIZE + +#define MCAN1_TX_FIFO_NUM MCAN_TX_FIFO_NUM +#define MCAN1_TX_FIFO_DATA_FIELD_SIZE MCAN_DATA_FIELD_SIZE +#define MCAN1_TX_NOTIFICATION_BUF ((1UL << MCAN1_TX_FIFO_NUM) - 1U) +#endif /* BSP_USING_MCAN1 */ + +#ifdef BSP_USING_MCAN2 +#define MCAN2_NAME ("can2") +#define MCAN2_WORK_MODE (RT_CAN_MODE_NORMAL) +#define MCAN2_TX_PRIV_MODE RT_CAN_MODE_NOPRIV /* RT_CAN_MODE_NOPRIV: Tx FIFO mode; RT_CAN_MODE_PRIV: Tx priority mode */ + +#define MCAN2_FD_SEL MCAN_FD_SEL +#define MCAN2_STD_FILTER_NUM MCAN_STD_FILTER_NUM +#define MCAN2_EXT_FILTER_NUM MCAN_EXT_FILTER_NUM + +#define MCAN2_RX_FIFO0_NUM MCAN_RX_FIFO_NUM +#define MCAN2_RX_FIFO0_DATA_FIELD_SIZE MCAN_DATA_FIELD_SIZE + +#define MCAN2_TX_FIFO_NUM MCAN_TX_FIFO_NUM +#define MCAN2_TX_FIFO_DATA_FIELD_SIZE MCAN_DATA_FIELD_SIZE +#define MCAN2_TX_NOTIFICATION_BUF ((1UL << MCAN2_TX_FIFO_NUM) - 1U) +#endif /* BSP_USING_MCAN2 */ + +/***********************************************************************************************/ +/***********************************************************************************************/ + +/* + Bit rate configuration examples for CAN FD. + Nominal bit rate for CAN FD arbitration phase and data bit rate for CAN FD data phase. + BitRate(bps) = MCANClock(Hz) / (Prescaler * (TimeSeg1 + TimeSeg2)) + SamplePoint(%) = TimeSeg1 / (TimeSeg1 + TimeSeg2) + eg. + BitRate(bps) = 40000000(Hz) / (2 * (16 + 4)) = 1000000 = 1M(bps) + SamplePoint(%) = 16 / (16 + 4) = 80% + The following bit rate configurations are based on the max MCAN Clock(40MHz). + NOTE: + 1. It is better to limit u32NominalPrescaler and u32DataPrescaler between 1 and 2. + 1. The unit of u32SspOffset is MCANClock. + 2. For the corresponding function of u32TdcFilter, please refer to the reference manual for details(TDCR.TDCF). + The u32TdcFilter can be get from PSR.TDCV. +*/ +#define MCAN_FD_CFG_500K_1M \ { \ - .name = CAN1_NAME, \ - .single_trans_mode = RT_FALSE \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 64, \ + .u32NominalTimeSeg2 = 16, \ + .u32NominalSyncJumpWidth = 16, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 32, \ + .u32DataTimeSeg2 = 8, \ + .u32DataSyncJumpWidth = 8, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 32, \ + .u32TdcFilter = 32 + 1, \ } -#endif /* CAN1_INIT_PARAMS */ -#endif /* BSP_USING_CAN1 */ -#ifdef BSP_USING_CAN2 -#define CAN2_CLOCK_SEL (CAN_CLOCK_SRC_40M) -#ifdef RT_CAN_USING_CANFD -#define CAN2_CANFD_MODE (CAN_FD_MD_ISO) -#endif -#define CAN2_NAME ("can2") -#ifndef CAN2_INIT_PARAMS -#define CAN2_INIT_PARAMS \ +#define MCAN_FD_CFG_500K_2M \ { \ - .name = CAN2_NAME, \ - .single_trans_mode = RT_FALSE \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 64, \ + .u32NominalTimeSeg2 = 16, \ + .u32NominalSyncJumpWidth = 16, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 16, \ + .u32DataTimeSeg2 = 4, \ + .u32DataSyncJumpWidth = 4, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 16, \ + .u32TdcFilter = 16 + 1, \ } -#endif /* CAN2_INIT_PARAMS */ -#endif /* BSP_USING_CAN2 */ -/* Bit time config - Restrictions: u32TimeSeg1 >= u32TimeSeg2 + 1, u32TimeSeg2 >= u32SJW. +#define MCAN_FD_CFG_500K_4M \ + { \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 64, \ + .u32NominalTimeSeg2 = 16, \ + .u32NominalSyncJumpWidth = 16, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 8, \ + .u32DataTimeSeg2 = 2, \ + .u32DataSyncJumpWidth = 2, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 8, \ + .u32TdcFilter = 8 + 1, \ + } - Baudrate = CANClock/(u32Prescaler*(u32TimeSeg1 + u32TimeSeg2)) - TQ = u32Prescaler / CANClock. - Bit time = (u32TimeSeg2 + u32TimeSeg2) x TQ. +#define MCAN_FD_CFG_500K_5M \ + { \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 64, \ + .u32NominalTimeSeg2 = 16, \ + .u32NominalSyncJumpWidth = 16, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 6, \ + .u32DataTimeSeg2 = 2, \ + .u32DataSyncJumpWidth = 2, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 6, \ + .u32TdcFilter = 6 + 1, \ + } - The following bit time configures are based on CAN Clock 40M +#define MCAN_FD_CFG_500K_8M \ + { \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 64, \ + .u32NominalTimeSeg2 = 16, \ + .u32NominalSyncJumpWidth = 16, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 4, \ + .u32DataTimeSeg2 = 1, \ + .u32DataSyncJumpWidth = 1, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 4, \ + .u32TdcFilter = 4 + 1, \ + } + +#define MCAN_FD_CFG_1M_1M \ + { \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 32, \ + .u32DataTimeSeg2 = 8, \ + .u32DataSyncJumpWidth = 8, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 2*32, \ + .u32TdcFilter = 2*32 + 1, \ + } + +#define MCAN_FD_CFG_1M_2M \ + { \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 16, \ + .u32DataTimeSeg2 = 4, \ + .u32DataSyncJumpWidth = 4, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 16, \ + .u32TdcFilter = 16 + 1, \ + } + +#define MCAN_FD_CFG_1M_4M \ + { \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 8, \ + .u32DataTimeSeg2 = 2, \ + .u32DataSyncJumpWidth = 2, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 8, \ + .u32TdcFilter = 8 + 1, \ + } + +#define MCAN_FD_CFG_1M_5M \ + { \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 64, \ + .u32NominalTimeSeg2 = 16, \ + .u32NominalSyncJumpWidth = 16, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 6, \ + .u32DataTimeSeg2 = 2, \ + .u32DataSyncJumpWidth = 2, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 6, \ + .u32TdcFilter = 6 + 1, \ + } + +#define MCAN_FD_CFG_1M_8M \ + { \ + .u32NominalPrescaler = 1, \ + .u32NominalTimeSeg1 = 64, \ + .u32NominalTimeSeg2 = 16, \ + .u32NominalSyncJumpWidth = 16, \ + .u32DataPrescaler = 1, \ + .u32DataTimeSeg1 = 4, \ + .u32DataTimeSeg2 = 1, \ + .u32DataSyncJumpWidth = 1, \ + .u32TDC = MCAN_FD_TDC_ENABLE, \ + .u32SspOffset = 4, \ + .u32TdcFilter = 4 + 1, \ + } + +/* + Bit rate configuration examples for classical CAN. + BitRate(bps) = MCANClock(Hz) / (u32NominalPrescaler * (u32NominalTimeSeg1 + u32NominalTimeSeg2)) + SamplePoint(%) = u32NominalTimeSeg1 / (u32NominalTimeSeg1 + u32NominalTimeSeg2) + eg. + BitRate(bps) = 40000000(Hz) / (2 * (16 + 4)) = 1000000 = 1M(bps) + SamplePoint(%) = 16 / (16 + 4) = 80% + The following bit rate configurations are based on the max MCAN Clock(40MHz). */ -#define CAN_BIT_TIME_CONFIG_1M_BAUD \ +#define MCAN_CC_CFG_1M \ { \ - .u32Prescaler = 2, \ - .u32TimeSeg1 = 16, \ - .u32TimeSeg2 = 4, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 2, \ + .u32NominalTimeSeg1 = 16, \ + .u32NominalTimeSeg2 = 4, \ + .u32NominalSyncJumpWidth = 4, \ } -#define CAN_BIT_TIME_CONFIG_800K_BAUD \ +#define MCAN_CC_CFG_800K \ { \ - .u32Prescaler = 2, \ - .u32TimeSeg1 = 20, \ - .u32TimeSeg2 = 5, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 2, \ + .u32NominalTimeSeg1 = 20, \ + .u32NominalTimeSeg2 = 5, \ + .u32NominalSyncJumpWidth = 5, \ } -#define CAN_BIT_TIME_CONFIG_500K_BAUD \ +#define MCAN_CC_CFG_500K \ { \ - .u32Prescaler = 4, \ - .u32TimeSeg1 = 16, \ - .u32TimeSeg2 = 4, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 4, \ + .u32NominalTimeSeg1 = 16, \ + .u32NominalTimeSeg2 = 4, \ + .u32NominalSyncJumpWidth = 4, \ } -#define CAN_BIT_TIME_CONFIG_250K_BAUD \ +#define MCAN_CC_CFG_250K \ { \ - .u32Prescaler = 8, \ - .u32TimeSeg1 = 16, \ - .u32TimeSeg2 = 4, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 4, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ } -#define CAN_BIT_TIME_CONFIG_125K_BAUD \ +#define MCAN_CC_CFG_125K \ { \ - .u32Prescaler = 16, \ - .u32TimeSeg1 = 16, \ - .u32TimeSeg2 = 4, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 8, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ } -#define CAN_BIT_TIME_CONFIG_100K_BAUD \ +#define MCAN_CC_CFG_100K \ { \ - .u32Prescaler = 20, \ - .u32TimeSeg1 = 16, \ - .u32TimeSeg2 = 4, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 10, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ } -#define CAN_BIT_TIME_CONFIG_50K_BAUD \ +#define MCAN_CC_CFG_50K \ { \ - .u32Prescaler = 40, \ - .u32TimeSeg1 = 16, \ - .u32TimeSeg2 = 4, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 20, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ } -#define CAN_BIT_TIME_CONFIG_20K_BAUD \ +#define MCAN_CC_CFG_20K \ { \ - .u32Prescaler = 100, \ - .u32TimeSeg1 = 16, \ - .u32TimeSeg2 = 4, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 50, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ } -#define CAN_BIT_TIME_CONFIG_10K_BAUD \ +#define MCAN_CC_CFG_10K \ { \ - .u32Prescaler = 200, \ - .u32TimeSeg1 = 16, \ - .u32TimeSeg2 = 4, \ - .u32SJW = 4 \ + .u32NominalPrescaler = 100, \ + .u32NominalTimeSeg1 = 32, \ + .u32NominalTimeSeg2 = 8, \ + .u32NominalSyncJumpWidth = 8, \ } +#ifdef RT_CAN_USING_CANFD +#define MCAN1_BAUD_RATE_CFG MCAN_FD_CFG_1M_4M +#define MCAN1_NOMINAL_BAUD_RATE MCANFD_NOMINAL_BAUD_1M +#define MCAN1_DATA_BAUD_RATE MCANFD_DATA_BAUD_4M + +#define MCAN2_BAUD_RATE_CFG MCAN_FD_CFG_1M_4M +#define MCAN2_NOMINAL_BAUD_RATE MCANFD_NOMINAL_BAUD_1M +#define MCAN2_DATA_BAUD_RATE MCANFD_DATA_BAUD_4M + +#else +#define MCAN1_BAUD_RATE_CFG MCAN_CC_CFG_1M +#define MCAN1_NOMINAL_BAUD_RATE CAN1MBaud +#define MCAN1_DATA_BAUD_RATE 0 + +#define MCAN2_BAUD_RATE_CFG MCAN_CC_CFG_1M +#define MCAN2_NOMINAL_BAUD_RATE CAN1MBaud +#define MCAN2_DATA_BAUD_RATE 0 + +#endif /* #ifdef RT_CAN_USING_CANFD */ + +/***********************************************************************************************/ +/***********************************************************************************************/ + #ifdef __cplusplus } #endif diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/dac_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/dac_config.h index 10de0c1734c..119d3da9a77 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/dac_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/dac_config.h @@ -1,6 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team - * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. * * SPDX-License-Identifier: Apache-2.0 * @@ -27,15 +26,6 @@ extern "C" { #endif /* DAC1_INIT_PARAMS */ #endif /* BSP_USING_DAC1 */ -#ifdef BSP_USING_DAC2 -#ifndef DAC2_INIT_PARAMS -#define DAC2_INIT_PARAMS \ - { \ - .name = "dac2", \ - } -#endif /* DAC2_INIT_PARAMS */ -#endif /* BSP_USING_DAC2 */ - #ifdef __cplusplus } #endif diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/dma_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/dma_config.h index 6a84329063e..b5202f3eb93 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/dma_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/dma_config.h @@ -193,6 +193,16 @@ extern "C" { #define UART1_RX_DMA_IRQn BSP_DMA2_CH0_IRQ_NUM #define UART1_RX_DMA_INT_PRIO BSP_DMA2_CH0_IRQ_PRIO #define UART1_RX_DMA_INT_SRC INT_SRC_DMA2_TC0 + +#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_INSTANCE) +#define QSPI_DMA_INSTANCE CM_DMA2 +#define QSPI_DMA_CHANNEL DMA_CH0 +#define QSPI_DMA_CLOCK (PWC_FCG0_DMA2 | PWC_FCG0_AOS) +#define QSPI_DMA_TRIG_SELECT AOS_DMA2_0 +#define QSPI_DMA_TRANS_FLAG DMA_FLAG_TC_CH0 +#define QSPI_DMA_IRQn BSP_DMA2_CH0_IRQ_NUM +#define QSPI_DMA_INT_PRIO BSP_DMA2_CH0_IRQ_PRIO +#define QSPI_DMA_INT_SRC INT_SRC_DMA2_TC0 #endif /* DMA2 ch1 */ diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h index 90d8d4f7ad9..e1d962ab910 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h @@ -158,6 +158,11 @@ extern "C" { #define BSP_SPI3_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif +#if defined (BSP_USING_QSPI) +#define BSP_QSPI_ERR_IRQ_NUM QSPI_IRQn +#define BSP_QSPI_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif /* BSP_USING_QSPI */ + #if defined(BSP_USING_TMRA_1) #define BSP_USING_TMRA_1_IRQ_NUM TMRA_1_OVF_UDF_IRQn #define BSP_USING_TMRA_1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT @@ -183,16 +188,71 @@ extern "C" { #define BSP_USING_TMRA_5_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_TMRA_5 */ -#if defined(BSP_USING_CAN1) -#define BSP_CAN1_IRQ_NUM MCAN1_INT0_IRQn -#define BSP_CAN1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT -#endif/* BSP_USING_CAN1 */ +#if defined(BSP_USING_MCAN1) +#define BSP_MCAN1_INT0_IRQ_NUM MCAN1_INT0_IRQn +#define BSP_MCAN1_INT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT + +#define BSP_MCAN1_INT1_IRQ_NUM MCAN1_INT1_IRQn +#define BSP_MCAN1_INT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_MCAN1 */ + +#if defined(BSP_USING_MCAN2) +#define BSP_MCAN2_INT0_IRQ_NUM MCAN2_INT0_IRQn +#define BSP_MCAN2_INT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT + +#define BSP_MCAN2_INT1_IRQ_NUM MCAN2_INT1_IRQn +#define BSP_MCAN2_INT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_MCAN2 */ #if defined(RT_USING_ALARM) #define BSP_RTC_ALARM_IRQ_NUM RTC_IRQn #define BSP_RTC_ALARM_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* RT_USING_ALARM */ +#if defined(BSP_USING_PULSE_ENCODER_TMRA_1) +#define BSP_PULSE_ENCODER_TMRA_1_OVF_IRQ_NUM TMRA_1_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_1_OVF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#define BSP_PULSE_ENCODER_TMRA_1_UDF_IRQ_NUM TMRA_1_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_1_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_PULSE_ENCODER_TMRA_1 */ +#if defined(BSP_USING_PULSE_ENCODER_TMRA_2) +#define BSP_PULSE_ENCODER_TMRA_2_OVF_IRQ_NUM TMRA_2_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_2_OVF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#define BSP_PULSE_ENCODER_TMRA_2_UDF_IRQ_NUM TMRA_2_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_2_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_PULSE_ENCODER_TMRA_2 */ +#if defined(BSP_USING_PULSE_ENCODER_TMRA_3) +#define BSP_PULSE_ENCODER_TMRA_3_OVF_IRQ_NUM TMRA_3_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_3_OVF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#define BSP_PULSE_ENCODER_TMRA_3_UDF_IRQ_NUM TMRA_3_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_3_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_PULSE_ENCODER_TMRA_3 */ +#if defined(BSP_USING_PULSE_ENCODER_TMRA_4) +#define BSP_PULSE_ENCODER_TMRA_4_OVF_IRQ_NUM TMRA_4_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_4_OVF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#define BSP_PULSE_ENCODER_TMRA_4_UDF_IRQ_NUM TMRA_4_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_4_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_PULSE_ENCODER_TMRA_4 */ +#if defined(BSP_USING_PULSE_ENCODER_TMRA_5) +#define BSP_PULSE_ENCODER_TMRA_5_OVF_IRQ_NUM TMRA_5_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_5_OVF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#define BSP_PULSE_ENCODER_TMRA_5_UDF_IRQ_NUM TMRA_5_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMRA_5_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_PULSE_ENCODER_TMRA_5 */ + +#if defined(BSP_USING_PULSE_ENCODER_TMR6_1) +#define BSP_PULSE_ENCODER_TMR6_1_OVF_IRQ_NUM TMR6_1_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMR6_1_OVF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#define BSP_PULSE_ENCODER_TMR6_1_UDF_IRQ_NUM TMR6_1_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMR6_1_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_PULSE_ENCODER_TMR6_1 */ +#if defined(BSP_USING_PULSE_ENCODER_TMR6_2) +#define BSP_PULSE_ENCODER_TMR6_2_OVF_IRQ_NUM TMR6_2_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMR6_2_OVF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#define BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_NUM TMR6_2_OVF_UDF_IRQn +#define BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT +#endif/* BSP_USING_PULSE_ENCODER_TMR6_2 */ + #ifdef __cplusplus } #endif diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/pulse_encoder_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pulse_encoder_config.h index 47a947c6ab8..7b6c2696b65 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/pulse_encoder_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pulse_encoder_config.h @@ -25,7 +25,7 @@ extern "C" { #define PULSE_ENCODER_TMRA_1_CONFIG \ { \ .tmr_handler = CM_TMRA_1, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_1, \ + .u32PeriphClock = FCG2_PERIPH_TMRA_1, \ .hw_count = \ { \ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ @@ -33,12 +33,12 @@ extern "C" { }, \ .isr = \ { \ - .enIntSrc_OVF = INT_SRC_TMRA_1_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_1_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_1_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_1_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_1_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_1_UDF_IRQ_PRIO, \ + .enIntSrc_Ovf = INT_SRC_TMRA_1_OVF, \ + .enIRQn_Ovf = BSP_PULSE_ENCODER_TMRA_1_OVF_IRQ_NUM, \ + .u8Int_Prio_Ovf = BSP_PULSE_ENCODER_TMRA_1_OVF_IRQ_PRIO, \ + .enIntSrc_Udf = INT_SRC_TMRA_1_UDF, \ + .enIRQn_Udf = BSP_PULSE_ENCODER_TMRA_1_UDF_IRQ_NUM, \ + .u8Int_Prio_Udf = BSP_PULSE_ENCODER_TMRA_1_UDF_IRQ_PRIO, \ }, \ .u32PeriodValue = 1000UL, \ .name = "pulse_a1" \ @@ -51,7 +51,7 @@ extern "C" { #define PULSE_ENCODER_TMRA_2_CONFIG \ { \ .tmr_handler = CM_TMRA_2, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_2, \ + .u32PeriphClock = FCG2_PERIPH_TMRA_2, \ .hw_count = \ { \ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ @@ -59,12 +59,12 @@ extern "C" { }, \ .isr = \ { \ - .enIntSrc_OVF = INT_SRC_TMRA_2_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_2_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_2_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_2_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_2_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_2_UDF_IRQ_PRIO, \ + .enIntSrc_Ovf = INT_SRC_TMRA_2_OVF, \ + .enIRQn_Ovf = BSP_PULSE_ENCODER_TMRA_2_OVF_IRQ_NUM, \ + .u8Int_Prio_Ovf = BSP_PULSE_ENCODER_TMRA_2_OVF_IRQ_PRIO, \ + .enIntSrc_Udf = INT_SRC_TMRA_2_UDF, \ + .enIRQn_Udf = BSP_PULSE_ENCODER_TMRA_2_UDF_IRQ_NUM, \ + .u8Int_Prio_Udf = BSP_PULSE_ENCODER_TMRA_2_UDF_IRQ_PRIO, \ }, \ .u32PeriodValue = 1000UL, \ .name = "pulse_a2" \ @@ -77,7 +77,7 @@ extern "C" { #define PULSE_ENCODER_TMRA_3_CONFIG \ { \ .tmr_handler = CM_TMRA_3, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_3, \ + .u32PeriphClock = FCG2_PERIPH_TMRA_3, \ .hw_count = \ { \ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ @@ -85,12 +85,12 @@ extern "C" { }, \ .isr = \ { \ - .enIntSrc_OVF = INT_SRC_TMRA_3_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_3_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_3_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_3_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_3_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_3_UDF_IRQ_PRIO, \ + .enIntSrc_Ovf = INT_SRC_TMRA_3_OVF, \ + .enIRQn_Ovf = BSP_PULSE_ENCODER_TMRA_3_OVF_IRQ_NUM, \ + .u8Int_Prio_Ovf = BSP_PULSE_ENCODER_TMRA_3_OVF_IRQ_PRIO, \ + .enIntSrc_Udf = INT_SRC_TMRA_3_UDF, \ + .enIRQn_Udf = BSP_PULSE_ENCODER_TMRA_3_UDF_IRQ_NUM, \ + .u8Int_Prio_Udf = BSP_PULSE_ENCODER_TMRA_3_UDF_IRQ_PRIO, \ }, \ .u32PeriodValue = 1000UL, \ .name = "pulse_a3" \ @@ -103,7 +103,7 @@ extern "C" { #define PULSE_ENCODER_TMRA_4_CONFIG \ { \ .tmr_handler = CM_TMRA_4, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_4, \ + .u32PeriphClock = FCG2_PERIPH_TMRA_4, \ .hw_count = \ { \ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ @@ -111,12 +111,12 @@ extern "C" { }, \ .isr = \ { \ - .enIntSrc_OVF = INT_SRC_TMRA_4_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_4_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_4_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_4_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_4_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_4_UDF_IRQ_PRIO, \ + .enIntSrc_Ovf = INT_SRC_TMRA_4_OVF, \ + .enIRQn_Ovf = BSP_PULSE_ENCODER_TMRA_4_OVF_IRQ_NUM, \ + .u8Int_Prio_Ovf = BSP_PULSE_ENCODER_TMRA_4_OVF_IRQ_PRIO, \ + .enIntSrc_Udf = INT_SRC_TMRA_4_UDF, \ + .enIRQn_Udf = BSP_PULSE_ENCODER_TMRA_4_UDF_IRQ_NUM, \ + .u8Int_Prio_Udf = BSP_PULSE_ENCODER_TMRA_4_UDF_IRQ_PRIO, \ }, \ .u32PeriodValue = 1000UL, \ .name = "pulse_a4" \ @@ -129,7 +129,7 @@ extern "C" { #define PULSE_ENCODER_TMRA_5_CONFIG \ { \ .tmr_handler = CM_TMRA_5, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_5, \ + .u32PeriphClock = FCG2_PERIPH_TMRA_5, \ .hw_count = \ { \ .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ @@ -137,12 +137,12 @@ extern "C" { }, \ .isr = \ { \ - .enIntSrc_OVF = INT_SRC_TMRA_5_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_5_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_5_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_5_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_5_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_5_UDF_IRQ_PRIO, \ + .enIntSrc_Ovf = INT_SRC_TMRA_5_OVF, \ + .enIRQn_Ovf = BSP_PULSE_ENCODER_TMRA_5_OVF_IRQ_NUM, \ + .u8Int_Prio_Ovf = BSP_PULSE_ENCODER_TMRA_5_OVF_IRQ_PRIO, \ + .enIntSrc_Udf = INT_SRC_TMRA_5_UDF, \ + .enIRQn_Udf = BSP_PULSE_ENCODER_TMRA_5_UDF_IRQ_NUM, \ + .u8Int_Prio_Udf = BSP_PULSE_ENCODER_TMRA_5_UDF_IRQ_PRIO, \ }, \ .u32PeriodValue = 1000UL, \ .name = "pulse_a5" \ @@ -150,194 +150,12 @@ extern "C" { #endif /* PULSE_ENCODER_TMRA_5_CONFIG */ #endif /* BSP_USING_PULSE_ENCODER_TMRA_5 */ -#ifdef BSP_USING_PULSE_ENCODER_TMRA_6 -#ifndef PULSE_ENCODER_TMRA_6_CONFIG -#define PULSE_ENCODER_TMRA_6_CONFIG \ - { \ - .tmr_handler = CM_TMRA_6, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_6, \ - .hw_count = \ - { \ - .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ - .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMRA_6_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_6_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_6_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_6_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_6_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_6_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_a6" \ - } -#endif /* PULSE_ENCODER_TMRA_6_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMRA_6 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMRA_7 -#ifndef PULSE_ENCODER_TMRA_7_CONFIG -#define PULSE_ENCODER_TMRA_7_CONFIG \ - { \ - .tmr_handler = CM_TMRA_7, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_7, \ - .hw_count = \ - { \ - .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ - .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMRA_7_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_7_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_7_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_7_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_7_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_7_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_a7" \ - } -#endif /* PULSE_ENCODER_TMRA_7_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMRA_7 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMRA_8 -#ifndef PULSE_ENCODER_TMRA_8_CONFIG -#define PULSE_ENCODER_TMRA_8_CONFIG \ - { \ - .tmr_handler = CM_TMRA_8, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_8, \ - .hw_count = \ - { \ - .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ - .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMRA_8_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_8_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_8_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_8_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_8_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_8_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_a8" \ - } -#endif /* PULSE_ENCODER_TMRA_8_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMRA_8 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMRA_9 -#ifndef PULSE_ENCODER_TMRA_9_CONFIG -#define PULSE_ENCODER_TMRA_9_CONFIG \ - { \ - .tmr_handler = CM_TMRA_9, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_9, \ - .hw_count = \ - { \ - .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ - .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMRA_9_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_9_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_9_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_9_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_9_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_9_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_a9" \ - } -#endif /* PULSE_ENCODER_TMRA_9_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMRA_9 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMRA_10 -#ifndef PULSE_ENCODER_TMRA_10_CONFIG -#define PULSE_ENCODER_TMRA_10_CONFIG \ - { \ - .tmr_handler = CM_TMRA_10, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_10, \ - .hw_count = \ - { \ - .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ - .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMRA_10_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_10_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_10_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_10_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_10_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_10_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_a10" \ - } -#endif /* PULSE_ENCODER_TMRA_10_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMRA_10 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMRA_11 -#ifndef PULSE_ENCODER_TMRA_11_CONFIG -#define PULSE_ENCODER_TMRA_11_CONFIG \ - { \ - .tmr_handler = CM_TMRA_11, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_11, \ - .hw_count = \ - { \ - .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ - .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMRA_11_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_11_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_11_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_11_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_11_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_11_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_a11" \ - } -#endif /* PULSE_ENCODER_TMRA_11_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMRA_11 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMRA_12 -#ifndef PULSE_ENCODER_TMRA_12_CONFIG -#define PULSE_ENCODER_TMRA_12_CONFIG \ - { \ - .tmr_handler = CM_TMRA_12, \ - .u32Fcg2Periph = FCG2_PERIPH_TMRA_12, \ - .hw_count = \ - { \ - .u16CountUpCond = TMRA_CNT_UP_COND_CLKA_HIGH_CLKB_RISING, \ - .u16CountDownCond = TMRA_CNT_DOWN_COND_CLKB_HIGH_CLKA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMRA_12_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMRA_12_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMRA_12_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMRA_12_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMRA_12_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMRA_12_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_a12" \ - } -#endif /* PULSE_ENCODER_TMRA_12_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMRA_12 */ - #ifdef BSP_USING_PULSE_ENCODER_TMR6_1 #ifndef PULSE_ENCODER_TMR6_1_CONFIG #define PULSE_ENCODER_TMR6_1_CONFIG \ { \ .tmr_handler = CM_TMR6_1, \ - .u32Fcg2Periph = FCG2_PERIPH_TMR6_1, \ + .u32PeriphClock = FCG2_PERIPH_TMR6_1, \ .hw_count = \ { \ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \ @@ -345,12 +163,12 @@ extern "C" { }, \ .isr = \ { \ - .enIntSrc_OVF = INT_SRC_TMR6_1_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_1_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_1_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMR6_1_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_1_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_1_UDF_IRQ_PRIO, \ + .enIntSrc_Ovf = INT_SRC_TMR6_1_OVF, \ + .enIRQn_Ovf = BSP_PULSE_ENCODER_TMR6_1_OVF_IRQ_NUM, \ + .u8Int_Prio_Ovf = BSP_PULSE_ENCODER_TMR6_1_OVF_IRQ_PRIO, \ + .enIntSrc_Udf = INT_SRC_TMR6_1_UDF, \ + .enIRQn_Udf = BSP_PULSE_ENCODER_TMR6_1_UDF_IRQ_NUM, \ + .u8Int_Prio_Udf = BSP_PULSE_ENCODER_TMR6_1_UDF_IRQ_PRIO, \ }, \ .u32PeriodValue = 1000UL, \ .name = "pulse_61" \ @@ -363,7 +181,7 @@ extern "C" { #define PULSE_ENCODER_TMR6_2_CONFIG \ { \ .tmr_handler = CM_TMR6_2, \ - .u32Fcg2Periph = FCG2_PERIPH_TMR6_2, \ + .u32PeriphClock = FCG2_PERIPH_TMR6_2, \ .hw_count = \ { \ .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \ @@ -371,12 +189,12 @@ extern "C" { }, \ .isr = \ { \ - .enIntSrc_OVF = INT_SRC_TMR6_2_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_2_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_2_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMR6_2_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_PRIO, \ + .enIntSrc_Ovf = INT_SRC_TMR6_2_OVF, \ + .enIRQn_Ovf = BSP_PULSE_ENCODER_TMR6_2_OVF_IRQ_NUM, \ + .u8Int_Prio_Ovf = BSP_PULSE_ENCODER_TMR6_2_OVF_IRQ_PRIO, \ + .enIntSrc_Udf = INT_SRC_TMR6_2_UDF, \ + .enIRQn_Udf = BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_NUM, \ + .u8Int_Prio_Udf = BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_PRIO, \ }, \ .u32PeriodValue = 1000UL, \ .name = "pulse_62" \ @@ -384,162 +202,6 @@ extern "C" { #endif /* PULSE_ENCODER_TMR6_2_CONFIG */ #endif /* BSP_USING_PULSE_ENCODER_TMR6_2 */ -#ifdef BSP_USING_PULSE_ENCODER_TMR6_3 -#ifndef PULSE_ENCODER_TMR6_3_CONFIG -#define PULSE_ENCODER_TMR6_3_CONFIG \ - { \ - .tmr_handler = CM_TMR6_3, \ - .u32Fcg2Periph = FCG2_PERIPH_TMR6_3, \ - .hw_count = \ - { \ - .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \ - .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMR6_3_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_3_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_3_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMR6_3_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_3_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_3_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_63" \ - } -#endif /* PULSE_ENCODER_TMR6_3_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMR6_3 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMR6_4 -#ifndef PULSE_ENCODER_TMR6_4_CONFIG -#define PULSE_ENCODER_TMR6_4_CONFIG \ - { \ - .tmr_handler = CM_TMR6_4, \ - .u32Fcg2Periph = FCG2_PERIPH_TMR6_4, \ - .hw_count = \ - { \ - .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \ - .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMR6_4_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_4_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_4_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMR6_4_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_4_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_4_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_64" \ - } -#endif /* PULSE_ENCODER_TMR6_4_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMR6_4 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMR6_5 -#ifndef PULSE_ENCODER_TMR6_5_CONFIG -#define PULSE_ENCODER_TMR6_5_CONFIG \ - { \ - .tmr_handler = CM_TMR6_5, \ - .u32Fcg2Periph = FCG2_PERIPH_TMR6_5, \ - .hw_count = \ - { \ - .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \ - .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMR6_5_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_5_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_5_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMR6_5_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_5_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_5_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_65" \ - } -#endif /* PULSE_ENCODER_TMR6_5_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMR6_5 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMR6_6 -#ifndef PULSE_ENCODER_TMR6_6_CONFIG -#define PULSE_ENCODER_TMR6_6_CONFIG \ - { \ - .tmr_handler = CM_TMR6_6, \ - .u32Fcg2Periph = FCG2_PERIPH_TMR6_6, \ - .hw_count = \ - { \ - .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \ - .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMR6_6_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_6_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_6_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMR6_6_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_6_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_6_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_66" \ - } -#endif /* PULSE_ENCODER_TMR6_6_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMR6_6 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMR6_7 -#ifndef PULSE_ENCODER_TMR6_7_CONFIG -#define PULSE_ENCODER_TMR6_7_CONFIG \ - { \ - .tmr_handler = CM_TMR6_7, \ - .u32Fcg2Periph = FCG2_PERIPH_TMR6_7, \ - .hw_count = \ - { \ - .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \ - .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMR6_7_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_7_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_7_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMR6_7_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_7_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_7_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_67" \ - } -#endif /* PULSE_ENCODER_TMR6_7_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMR6_7 */ - -#ifdef BSP_USING_PULSE_ENCODER_TMR6_8 -#ifndef PULSE_ENCODER_TMR6_8_CONFIG -#define PULSE_ENCODER_TMR6_8_CONFIG \ - { \ - .tmr_handler = CM_TMR6_8, \ - .u32Fcg2Periph = FCG2_PERIPH_TMR6_8, \ - .hw_count = \ - { \ - .u32CountUpCond = TMR6_CNT_UP_COND_PWMA_HIGH_PWMB_RISING, \ - .u32CountDownCond = TMR6_CNT_DOWN_COND_PWMB_HIGH_PWMA_RISING, \ - }, \ - .isr = \ - { \ - .enIntSrc_OVF = INT_SRC_TMR6_8_OVF, \ - .enIRQn_OVF = BSP_PULSE_ENCODER_TMR6_8_OVF_IRQ_NUM, \ - .u8Int_Prio_OVF = BSP_PULSE_ENCODER_TMR6_8_OVF_IRQ_PRIO, \ - .enIntSrc_UDF = INT_SRC_TMR6_8_UDF, \ - .enIRQn_UDF = BSP_PULSE_ENCODER_TMR6_8_UDF_IRQ_NUM, \ - .u8Int_Prio_UDF = BSP_PULSE_ENCODER_TMR6_8_UDF_IRQ_PRIO, \ - }, \ - .u32PeriodValue = 1000UL, \ - .name = "pulse_68" \ - } -#endif /* PULSE_ENCODER_TMR6_8_CONFIG */ -#endif /* BSP_USING_PULSE_ENCODER_TMR6_8 */ - #endif /* RT_USING_PULSE_ENCODER */ #endif /* __PULSE_ENCODER_CONFIG_H__ */ diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/pwm_tmr_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pwm_tmr_config.h index f20d64d50d5..4b2bc716f82 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/pwm_tmr_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/pwm_tmr_config.h @@ -174,224 +174,6 @@ extern "C" { } #endif /* PWM_TMRA_5_CONFIG */ #endif /* BSP_USING_PWM_TMRA_5 */ - -#ifdef BSP_USING_PWM_TMRA_6 -#ifndef PWM_TMRA_6_CONFIG -#define PWM_TMRA_6_CONFIG \ - { \ - .name = "pwm_a6", \ - .instance = CM_TMRA_6, \ - .channel = 0, \ - .stcTmraInit = \ - { \ - .u8CountSrc = TMRA_CNT_SRC_SW, \ - .u32PeriodValue = 0xFFFF, \ - .sw_count = \ - { \ - .u8ClockDiv = TMRA_CLK_DIV1, \ - .u8CountMode = TMRA_MD_SAWTOOTH, \ - .u8CountDir = TMRA_DIR_DOWN, \ - }, \ - .u8CountReload = TMRA_CNT_RELOAD_ENABLE\ - }, \ - .stcPwmInit = \ - { \ - .u32CompareValue = 0x0000, \ - .u16StartPolarity = TMRA_PWM_LOW, \ - .u16StopPolarity = TMRA_PWM_LOW, \ - .u16CompareMatchPolarity = TMRA_PWM_HIGH, \ - .u16PeriodMatchPolarity = TMRA_PWM_LOW, \ - }, \ - } -#endif /* PWM_TMRA_6_CONFIG */ -#endif /* BSP_USING_PWM_TMRA_6 */ - -#ifdef BSP_USING_PWM_TMRA_7 -#ifndef PWM_TMRA_7_CONFIG -#define PWM_TMRA_7_CONFIG \ - { \ - .name = "pwm_a7", \ - .instance = CM_TMRA_7, \ - .channel = 0, \ - .stcTmraInit = \ - { \ - .u8CountSrc = TMRA_CNT_SRC_SW, \ - .u32PeriodValue = 0xFFFF, \ - .sw_count = \ - { \ - .u8ClockDiv = TMRA_CLK_DIV1, \ - .u8CountMode = TMRA_MD_SAWTOOTH, \ - .u8CountDir = TMRA_DIR_DOWN, \ - }, \ - .u8CountReload = TMRA_CNT_RELOAD_ENABLE\ - }, \ - .stcPwmInit = \ - { \ - .u32CompareValue = 0x0000, \ - .u16StartPolarity = TMRA_PWM_LOW, \ - .u16StopPolarity = TMRA_PWM_LOW, \ - .u16CompareMatchPolarity = TMRA_PWM_HIGH, \ - .u16PeriodMatchPolarity = TMRA_PWM_LOW, \ - }, \ - } -#endif /* PWM_TMRA_7_CONFIG */ -#endif /* BSP_USING_PWM_TMRA_7 */ - -#ifdef BSP_USING_PWM_TMRA_8 -#ifndef PWM_TMRA_8_CONFIG -#define PWM_TMRA_8_CONFIG \ - { \ - .name = "pwm_a8", \ - .instance = CM_TMRA_8, \ - .channel = 0, \ - .stcTmraInit = \ - { \ - .u8CountSrc = TMRA_CNT_SRC_SW, \ - .u32PeriodValue = 0xFFFF, \ - .sw_count = \ - { \ - .u8ClockDiv = TMRA_CLK_DIV1, \ - .u8CountMode = TMRA_MD_SAWTOOTH, \ - .u8CountDir = TMRA_DIR_DOWN, \ - }, \ - .u8CountReload = TMRA_CNT_RELOAD_ENABLE\ - }, \ - .stcPwmInit = \ - { \ - .u32CompareValue = 0x0000, \ - .u16StartPolarity = TMRA_PWM_LOW, \ - .u16StopPolarity = TMRA_PWM_LOW, \ - .u16CompareMatchPolarity = TMRA_PWM_HIGH, \ - .u16PeriodMatchPolarity = TMRA_PWM_LOW, \ - }, \ - } -#endif /* PWM_TMRA_8_CONFIG */ -#endif /* BSP_USING_PWM_TMRA_8 */ - -#ifdef BSP_USING_PWM_TMRA_9 -#ifndef PWM_TMRA_9_CONFIG -#define PWM_TMRA_9_CONFIG \ - { \ - .name = "pwm_a9", \ - .instance = CM_TMRA_9, \ - .channel = 0, \ - .stcTmraInit = \ - { \ - .u8CountSrc = TMRA_CNT_SRC_SW, \ - .u32PeriodValue = 0xFFFF, \ - .sw_count = \ - { \ - .u8ClockDiv = TMRA_CLK_DIV1, \ - .u8CountMode = TMRA_MD_SAWTOOTH, \ - .u8CountDir = TMRA_DIR_DOWN, \ - }, \ - .u8CountReload = TMRA_CNT_RELOAD_ENABLE\ - }, \ - .stcPwmInit = \ - { \ - .u32CompareValue = 0x0000, \ - .u16StartPolarity = TMRA_PWM_LOW, \ - .u16StopPolarity = TMRA_PWM_LOW, \ - .u16CompareMatchPolarity = TMRA_PWM_HIGH, \ - .u16PeriodMatchPolarity = TMRA_PWM_LOW, \ - }, \ - } -#endif /* PWM_TMRA_9_CONFIG */ -#endif /* BSP_USING_PWM_TMRA_9 */ - -#ifdef BSP_USING_PWM_TMRA_10 -#ifndef PWM_TMRA_10_CONFIG -#define PWM_TMRA_10_CONFIG \ - { \ - .name = "pwm_a10", \ - .instance = CM_TMRA_10, \ - .channel = 0, \ - .stcTmraInit = \ - { \ - .u8CountSrc = TMRA_CNT_SRC_SW, \ - .u32PeriodValue = 0xFFFF, \ - .sw_count = \ - { \ - .u8ClockDiv = TMRA_CLK_DIV1, \ - .u8CountMode = TMRA_MD_SAWTOOTH, \ - .u8CountDir = TMRA_DIR_DOWN, \ - }, \ - .u8CountReload = TMRA_CNT_RELOAD_ENABLE\ - }, \ - .stcPwmInit = \ - { \ - .u32CompareValue = 0x0000, \ - .u16StartPolarity = TMRA_PWM_LOW, \ - .u16StopPolarity = TMRA_PWM_LOW, \ - .u16CompareMatchPolarity = TMRA_PWM_HIGH, \ - .u16PeriodMatchPolarity = TMRA_PWM_LOW, \ - }, \ - } -#endif /* PWM_TMRA_10_CONFIG */ -#endif /* BSP_USING_PWM_TMRA_10 */ - -#ifdef BSP_USING_PWM_TMRA_11 -#ifndef PWM_TMRA_11_CONFIG -#define PWM_TMRA_11_CONFIG \ - { \ - .name = "pwm_a11", \ - .instance = CM_TMRA_11, \ - .channel = 0, \ - .stcTmraInit = \ - { \ - .u8CountSrc = TMRA_CNT_SRC_SW, \ - .u32PeriodValue = 0xFFFF, \ - .sw_count = \ - { \ - .u8ClockDiv = TMRA_CLK_DIV1, \ - .u8CountMode = TMRA_MD_SAWTOOTH, \ - .u8CountDir = TMRA_DIR_DOWN, \ - }, \ - .u8CountReload = TMRA_CNT_RELOAD_ENABLE\ - }, \ - .stcPwmInit = \ - { \ - .u32CompareValue = 0x0000, \ - .u16StartPolarity = TMRA_PWM_LOW, \ - .u16StopPolarity = TMRA_PWM_LOW, \ - .u16CompareMatchPolarity = TMRA_PWM_HIGH, \ - .u16PeriodMatchPolarity = TMRA_PWM_LOW, \ - }, \ - } -#endif /* PWM_TMRA_11_CONFIG */ -#endif /* BSP_USING_PWM_TMRA_11 */ - -#ifdef BSP_USING_PWM_TMRA_12 -#ifndef PWM_TMRA_12_CONFIG -#define PWM_TMRA_12_CONFIG \ - { \ - .name = "pwm_a12", \ - .instance = CM_TMRA_12, \ - .channel = 0, \ - .stcTmraInit = \ - { \ - .u8CountSrc = TMRA_CNT_SRC_SW, \ - .u32PeriodValue = 0xFFFF, \ - .sw_count = \ - { \ - .u8ClockDiv = TMRA_CLK_DIV1, \ - .u8CountMode = TMRA_MD_SAWTOOTH, \ - .u8CountDir = TMRA_DIR_DOWN, \ - }, \ - .u8CountReload = TMRA_CNT_RELOAD_ENABLE\ - }, \ - .stcPwmInit = \ - { \ - .u32CompareValue = 0x0000, \ - .u16StartPolarity = TMRA_PWM_LOW, \ - .u16StopPolarity = TMRA_PWM_LOW, \ - .u16CompareMatchPolarity = TMRA_PWM_HIGH, \ - .u16PeriodMatchPolarity = TMRA_PWM_LOW, \ - }, \ - } -#endif /* PWM_TMRA_12_CONFIG */ -#endif /* BSP_USING_PWM_TMRA_12 */ - #endif /* BSP_USING_PWM_TMRA */ #ifdef BSP_USING_PWM_TMR4 diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/qspi_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/qspi_config.h index f9df3687d2e..0283f1ee530 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/qspi_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/qspi_config.h @@ -65,8 +65,13 @@ extern "C" { } \ } #endif /* QSPI_DMA_CONFIG */ + +/* unit: half-word, DMA data width of QSPI transmitting is 16bit */ +#ifndef QSPI_DMA_TX_BUFSIZE +#define QSPI_DMA_TX_BUFSIZE 256 +#endif /* QSPI_DMA_TX_BUFSIZE */ #endif /* BSP_QSPI_USING_DMA */ -#endif /* BSP_USING_SPI1 */ +#endif /* BSP_USING_QSPI */ #ifdef __cplusplus } diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h index 64b5b592daa..d250b654a47 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h @@ -1,6 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team - * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. * * SPDX-License-Identifier: Apache-2.0 * diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/hc32f4xx_conf.h b/bsp/hc32/ev_hc32f448_lqfp80/board/hc32f4xx_conf.h index 438f04eaee0..d6986cf429e 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/hc32f4xx_conf.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/hc32f4xx_conf.h @@ -103,7 +103,7 @@ extern "C" * @note If there is no supported BSP board or the BSP function is not used, * the value needs to be set to 0U. */ -#define BSP_EV_HC32F4XX (BSP_EV_HC32F448_LQFP80) +#define BSP_EV_HC32F4XX (0U) /** * @brief This is the list of BSP components to be used. diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/SConscript b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/SConscript deleted file mode 100644 index 3c57bc9c6db..00000000000 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/SConscript +++ /dev/null @@ -1,12 +0,0 @@ -import os -from building import * - -objs = [] -cwd = GetCurrentDir() - -list = os.listdir(cwd) -for item in list: - if os.path.isfile(os.path.join(cwd, item, 'SConscript')): - objs = objs + SConscript(os.path.join(item, 'SConscript')) - -Return('objs') diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/drv_spi_flash.c b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/drv_spi_flash.c deleted file mode 100644 index f8e6d15ccc5..00000000000 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/drv_spi_flash.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2024-02-20 CDT first version - */ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef BSP_USING_SPI_FLASH - -#include "dev_spi_flash.h" -#ifdef RT_USING_SFUD - #include "dev_spi_flash_sfud.h" -#endif - -#define SPI_BUS_NAME "spi1" -#define SPI_FLASH_DEVICE_NAME "spi10" -#define SPI_FLASH_CHIP "w25q64" -#define SPI_FLASH_SS_PIN GET_PIN(C, 7) -/* Partition Name */ -#define FS_PARTITION_NAME "filesystem" - -#ifdef RT_USING_SFUD -static void rt_hw_spi_flash_reset(char *spi_dev_name) -{ - struct rt_spi_device *spi_dev_w25; - rt_uint8_t w25_en_reset = 0x66; - rt_uint8_t w25_reset_dev = 0x99; - - spi_dev_w25 = (struct rt_spi_device *)rt_device_find(spi_dev_name); - if (!spi_dev_w25) - { - rt_kprintf("Can't find %s device!\n", spi_dev_name); - } - else - { - rt_spi_send(spi_dev_w25, &w25_en_reset, 1U); - rt_spi_send(spi_dev_w25, &w25_reset_dev, 1U); - DDL_DelayMS(1U); - rt_kprintf("Reset ext flash!\n"); - } -} - -static int rt_hw_spi_flash_with_sfud_init(void) -{ - rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_FLASH_DEVICE_NAME, SPI_FLASH_SS_PIN); - - if (RT_NULL == rt_sfud_flash_probe(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME)) - { - rt_hw_spi_flash_reset(SPI_FLASH_DEVICE_NAME); - if (RT_NULL == rt_sfud_flash_probe(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME)) - { - return -RT_ERROR; - } - } - - return RT_EOK; -} -INIT_COMPONENT_EXPORT(rt_hw_spi_flash_with_sfud_init); - -static int rt_hw_fs_init(void) -{ - struct rt_device *mtd_dev = RT_NULL; - - /* 初始化 fal */ - fal_init(); - /* 生成 mtd 设备 */ - mtd_dev = fal_mtd_nor_device_create(FS_PARTITION_NAME); - if (!mtd_dev) - { - LOG_E("Can't create a mtd device on '%s' partition.", FS_PARTITION_NAME); - return -RT_ERROR; - } - else - { - /* 挂载 littlefs */ - if (RT_EOK == dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0)) - { - LOG_I("Filesystem initialized!"); - return RT_EOK; - } - else - { - /* 格式化文件系统 */ - if (RT_EOK == dfs_mkfs("lfs", FS_PARTITION_NAME)) - { - /* 挂载 littlefs */ - if (RT_EOK == dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0)) - { - LOG_I("Filesystem initialized!"); - return RT_EOK; - } - else - { - LOG_E("Failed to initialize filesystem!"); - return -RT_ERROR; - } - } - else - { - LOG_E("Failed to Format fs!"); - return -RT_ERROR; - } - } - } -} -INIT_APP_EXPORT(rt_hw_fs_init); - -#endif /* RT_USING_SFUD */ - -#endif /* BSP_USING_SPI_FLASH */ diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/SConscript b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/SConscript deleted file mode 100644 index cee47c2d7e2..00000000000 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/SConscript +++ /dev/null @@ -1,20 +0,0 @@ - -from building import * -import rtconfig - -cwd = GetCurrentDir() - -src = [] - -src += Glob('*.c') -CPPPATH = [cwd] -LOCAL_CFLAGS = '' - -if rtconfig.PLATFORM in ['gcc', 'armclang']: - LOCAL_CFLAGS += ' -std=c99' -elif rtconfig.PLATFORM in ['armcc']: - LOCAL_CFLAGS += ' --c99' - -group = DefineGroup('FAL', src, depend = ['RT_USING_FAL'], CPPPATH = CPPPATH, LOCAL_CFLAGS = LOCAL_CFLAGS) - -Return('group') diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_flash_sfud_port.c b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_flash_sfud_port.c deleted file mode 100644 index 0b65e3f8a7d..00000000000 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_flash_sfud_port.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2024-02-20 CDT first version - */ - -#include - -#include -#ifdef RT_USING_SFUD - #include -#endif - -#ifndef FAL_USING_NOR_FLASH_DEV_NAME - #define FAL_USING_NOR_FLASH_DEV_NAME "w25q64" -#endif - -static int init(void); -static int read(long offset, rt_uint8_t *buf, rt_size_t size); -static int write(long offset, const rt_uint8_t *buf, rt_size_t size); -static int erase(long offset, rt_size_t size); - -static sfud_flash_t sfud_dev = NULL; -struct fal_flash_dev ext_nor_flash0 = -{ - .name = FAL_USING_NOR_FLASH_DEV_NAME, - .addr = 0, - .len = 8 * 1024 * 1024, - .blk_size = 4096, - .ops = {init, read, write, erase}, - .write_gran = 1 -}; - -static int init(void) -{ - /* RT-Thread RTOS platform */ - sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME); - if (NULL == sfud_dev) - { - return -1; - } - /* update the flash chip information */ - ext_nor_flash0.blk_size = sfud_dev->chip.erase_gran; - ext_nor_flash0.len = sfud_dev->chip.capacity; - - return 0; -} - -static int read(long offset, rt_uint8_t *buf, rt_size_t size) -{ - RT_ASSERT(sfud_dev); - RT_ASSERT(sfud_dev->init_ok); - sfud_read(sfud_dev, ext_nor_flash0.addr + offset, size, buf); - - return size; -} - -static int write(long offset, const rt_uint8_t *buf, rt_size_t size) -{ - RT_ASSERT(sfud_dev); - RT_ASSERT(sfud_dev->init_ok); - if (sfud_write(sfud_dev, ext_nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS) - { - return -1; - } - - return size; -} - -static int erase(long offset, rt_size_t size) -{ - RT_ASSERT(sfud_dev); - RT_ASSERT(sfud_dev->init_ok); - if (sfud_erase(sfud_dev, ext_nor_flash0.addr + offset, size) != SFUD_SUCCESS) - { - return -1; - } - - return size; -} diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_cfg.h b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal_cfg.h similarity index 100% rename from bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal/fal_cfg.h rename to bsp/hc32/ev_hc32f448_lqfp80/board/ports/fal_cfg.h diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.c b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.c deleted file mode 100644 index 40f9a91a98e..00000000000 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.c +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2024-02-20 CDT first version - */ - -#include -#include -#include - -#ifdef BSP_USING_TCA9539 - -#include "tca9539.h" - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/* Define for TCA9539 */ -#define BSP_TCA9539_I2C_BUS_NAME "i2c1" -#define BSP_TCA9539_DEV_ADDR (0x74U) - -#define TCA9539_RST_PIN (32) /* PB15 */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -static struct rt_i2c_bus_device *i2c_bus = RT_NULL; - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @brief BSP TCA9539 write data. - * @param [in] bus: Pointer to the i2c bus device. - * @param [in] reg: Register to be written. - * @param [in] data: The pointer to the buffer contains the data to be written. - * @param [in] len: Buffer size in byte. - * @retval rt_err_t: - * - RT_EOK - * - -RT_ERROR - */ -static rt_err_t BSP_TCA9539_I2C_Write(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data, rt_uint16_t len) -{ - struct rt_i2c_msg msgs; - rt_uint8_t buf[6]; - - buf[0] = reg; - if (len > 0) - { - if (len < 6) - { - rt_memcpy(buf + 1, data, len); - } - else - { - return -RT_ERROR; - } - } - msgs.addr = BSP_TCA9539_DEV_ADDR; - msgs.flags = RT_I2C_WR; - msgs.buf = buf; - msgs.len = len + 1; - if (rt_i2c_transfer(bus, &msgs, 1) == 1) - { - return RT_EOK; - } - else - { - return -RT_ERROR; - } -} - -/** - * @brief BSP TCA9539 Read data. - * @param [in] bus: Pointer to the i2c bus device. - * @param [in] reg: Register to be read. - * @param [out] data: The pointer to the buffer contains the data to be read. - * @param [in] len: Buffer size in byte. - * @retval rt_err_t: - * - RT_EOK - * - -RT_ERROR - */ -static rt_err_t BSP_TCA9539_I2C_Read(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data, rt_uint16_t len) -{ - struct rt_i2c_msg msgs; - - if (RT_EOK != BSP_TCA9539_I2C_Write(bus, reg, RT_NULL, 0)) - { - return -RT_ERROR; - } - msgs.addr = BSP_TCA9539_DEV_ADDR; - msgs.flags = RT_I2C_RD; - msgs.buf = data; - msgs.len = len; - if (rt_i2c_transfer(bus, &msgs, 1) == 1) - { - return RT_EOK; - } - else - { - return -RT_ERROR; - } -} - - -/** - * @brief Reset TCA9539. - * @param [in] None - * @retval None - */ -static void TCA9539_Reset(void) -{ - rt_pin_mode(TCA9539_RST_PIN, PIN_MODE_OUTPUT); - /* Reset the device */ - rt_pin_write(TCA9539_RST_PIN, PIN_LOW); - rt_thread_mdelay(3U); - rt_pin_write(TCA9539_RST_PIN, PIN_HIGH); -} - -/** - * @brief Write TCA9539 pin output value. - * @param [in] u8Port Port number. - * This parameter can be one of the following values: - * @arg @ref TCA9539_Port_Definition - * @param [in] u8Pin Pin number. - * This parameter can be one or any combination of the following values: - * @arg @ref TCA9539_Pin_Definition - * @param [in] u8PinState Pin state to be written. - * This parameter can be one of the following values: - * @arg @ref TCA9539_Pin_State_Definition - * @retval rt_err_t: - * - RT_ERROR - * - RT_EOK - */ -rt_err_t TCA9539_WritePin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState) -{ - uint8_t u8TempData[2]; - - u8TempData[0] = u8Port + TCA9539_REG_OUTPUT_PORT0; - if (RT_EOK != BSP_TCA9539_I2C_Read(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - if (0U == u8PinState) - { - u8TempData[1] &= (uint8_t)(~u8Pin); - } - else - { - u8TempData[1] |= u8Pin; - } - if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - - return RT_EOK; -} - -/** - * @brief Read TCA9539 pin input value. - * @param [in] u8Port Port number. - * This parameter can be one of the following values: - * @arg @ref TCA9539_Port_Definition - * @param [in] u8Pin Pin number. - * This parameter can be one or any combination of the following values: - * @arg @ref TCA9539_Pin_Definition - * @param [in] u8PinState Pin state to be written. - * This parameter can be one of the following values: - * @arg @ref TCA9539_Pin_State_Definition - * @retval rt_err_t: - * - RT_ERROR - * - RT_EOK - */ -rt_err_t TCA9539_ReadPin(uint8_t u8Port, uint8_t u8Pin, uint8_t *pu8PinState) -{ - uint8_t u8TempData[2]; - - u8TempData[0] = u8Port + TCA9539_REG_INPUT_PORT0; - if (RT_EOK != BSP_TCA9539_I2C_Read(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - if (0U != (u8TempData[1] & u8Pin)) - { - *pu8PinState = TCA9539_PIN_SET; - } - else - { - *pu8PinState = TCA9539_PIN_RESET; - } - - return RT_EOK; -} - -/** - * @brief Toggle TCA9539 pin output value. - * @param [in] u8Port Port number. - * This parameter can be one of the following values: - * @arg @ref TCA9539_Port_Definition - * @param [in] u8Pin Pin number. - * This parameter can be one or any combination of the following values: - * @arg @ref TCA9539_Pin_Definition - * @retval rt_err_t: - * - -RT_ERROR - * - RT_EOK - */ -rt_err_t TCA9539_TogglePin(uint8_t u8Port, uint8_t u8Pin) -{ - uint8_t u8TempData[2]; - - u8TempData[0] = u8Port + TCA9539_REG_OUTPUT_PORT0; - if (RT_EOK != BSP_TCA9539_I2C_Read(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - u8TempData[1] ^= u8Pin; - if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - - return RT_EOK; -} - -/** - * @brief Configuration TCA9539 pin. - * @param [in] u8Port Port number. - * This parameter can be one of the following values: - * @arg @ref TCA9539_Port_Definition - * @param [in] u8Pin Pin number. - * This parameter can be one or any combination of the following values: - * @arg @ref TCA9539_Pin_Definition - * @param [in] u8Dir Pin output direction. - * This parameter can be one of the following values: - * @arg @ref TCA9539_Direction_Definition - * @retval rt_err_t: - * - -RT_ERROR - * - RT_EOK - */ -rt_err_t TCA9539_ConfigPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8Dir) -{ - uint8_t u8TempData[2]; - - u8TempData[0] = u8Port + TCA9539_REG_CONFIG_PORT0; - if (RT_EOK != BSP_TCA9539_I2C_Read(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - if (TCA9539_DIR_OUT == u8Dir) - { - u8TempData[1] &= (uint8_t)(~u8Pin); - } - else - { - u8TempData[1] |= u8Pin; - } - if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - - return RT_EOK; -} - -/** - * @brief Initialize TCA9539. - * @param [in] None - * @retval rt_err_t: - * - -RT_ERROR - * - RT_EOK - */ -int TCA9539_Init(void) -{ - char name[RT_NAME_MAX]; - uint8_t u8TempData[2]; - - TCA9539_Reset(); - rt_strncpy(name, BSP_TCA9539_I2C_BUS_NAME, RT_NAME_MAX); - i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); - if (i2c_bus == RT_NULL) - { - rt_kprintf("can't find %s device!\n", BSP_TCA9539_I2C_BUS_NAME); - return -RT_ERROR; - } - /* All Pins are input as default */ - u8TempData[0] = TCA9539_REG_CONFIG_PORT0; - u8TempData[1] = 0xFFU; - if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - u8TempData[0] = TCA9539_REG_CONFIG_PORT1; - if (RT_EOK != BSP_TCA9539_I2C_Write(i2c_bus, u8TempData[0], &u8TempData[1], 1U)) - { - return -RT_ERROR; - } - - return RT_EOK; -} -INIT_PREV_EXPORT(TCA9539_Init); - -#endif /* BSP_USING_TCA9539 */ diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.h b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.h deleted file mode 100644 index 097f3a0675a..00000000000 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2024-02-20 CDT first version - */ - -#ifndef __TCA9539_H__ -#define __TCA9539_H__ - -#include - -/** - * @defgroup TCA9539_REGISTER_Definition TCA9539 Register Definition - * @{ - */ -#define TCA9539_REG_INPUT_PORT0 (0x00U) -#define TCA9539_REG_INPUT_PORT1 (0x01U) -#define TCA9539_REG_OUTPUT_PORT0 (0x02U) -#define TCA9539_REG_OUTPUT_PORT1 (0x03U) -#define TCA9539_REG_INVERT_PORT0 (0x04U) -#define TCA9539_REG_INVERT_PORT1 (0x05U) -#define TCA9539_REG_CONFIG_PORT0 (0x06U) -#define TCA9539_REG_CONFIG_PORT1 (0x07U) -/** - * @} - */ - -/** - * @defgroup TCA9539_Port_Definition TCA9539 Port Definition - * @{ - */ -#define TCA9539_IO_PORT0 (0x00U) -#define TCA9539_IO_PORT1 (0x01U) -/** - * @} - */ - -/** - * @defgroup TCA9539_Pin_Definition TCA9539 Pin Definition - * @{ - */ -#define TCA9539_IO_PIN0 (0x01U) -#define TCA9539_IO_PIN1 (0x02U) -#define TCA9539_IO_PIN2 (0x04U) -#define TCA9539_IO_PIN3 (0x08U) -#define TCA9539_IO_PIN4 (0x10U) -#define TCA9539_IO_PIN5 (0x20U) -#define TCA9539_IO_PIN6 (0x40U) -#define TCA9539_IO_PIN7 (0x80U) -#define TCA9539_IO_PIN_ALL (0xFFU) -/** - * @} - */ - -/** - * @defgroup TCA9539_Direction_Definition TCA9539 Direction Definition - * @{ - */ -#define TCA9539_DIR_OUT (0x00U) -#define TCA9539_DIR_IN (0x01U) -/** - * @} - */ - -/** - * @defgroup TCA9539_Pin_State_Definition TCA9539 Pin State Definition - * @{ - */ -#define TCA9539_PIN_RESET (0x00U) -#define TCA9539_PIN_SET (0x01U) -/** - * @} - */ - -/** - * @defgroup HC32F448_EV_IO_Function_Sel Expand IO function definition - * @{ - */ -#define EIO_SCI_CD (TCA9539_IO_PIN1) /* Smart card detect, input */ -#define EIO_TOUCH_INT (TCA9539_IO_PIN2) /* Touch screen interrupt, input */ -#define EIO_TOUCH_CTRST (TCA9539_IO_PIN5) /* 'Reset' for Cap touch panel, output */ -#define EIO_LCD_RST (TCA9539_IO_PIN6) /* LCD panel reset, output */ -#define EIO_LCD_BKL (TCA9539_IO_PIN7) /* LCD panel back light, output */ - -#define EIO_LIN_SLEEP (TCA9539_IO_PIN1) /* LIN PHY sleep, output */ -#define EIO_CAN1_STB (TCA9539_IO_PIN2) /* CAN1 PHY standby, output */ -#define EIO_CAN2_STB (TCA9539_IO_PIN3) /* CAN2 PHY standby, output */ -#define EIO_LED_RED (TCA9539_IO_PIN5) /* Red LED, output */ -#define EIO_LED_YELLOW (TCA9539_IO_PIN6) /* Yellow LED, output */ -#define EIO_LED_BLUE (TCA9539_IO_PIN7) /* Blue LED, output */ -/** - * @} - */ - -/** - * @defgroup BSP_LED_PortPin_Sel BSP LED port/pin definition - * @{ - */ -#define LED_PORT (TCA9539_IO_PORT1) -#define LED_RED_PORT (TCA9539_IO_PORT1) -#define LED_RED_PIN (EIO_LED_RED) -#define LED_YELLOW_PORT (TCA9539_IO_PORT1) -#define LED_YELLOW_PIN (EIO_LED_YELLOW) -#define LED_BLUE_PORT (TCA9539_IO_PORT1) -#define LED_BLUE_PIN (EIO_LED_BLUE) -/** - * @} - */ - -/** - * @defgroup BSP CAN PHY STB port/pin definition - * @{ - */ -#define CAN1_STB_PORT (TCA9539_IO_PORT1) -#define CAN1_STB_PIN (EIO_CAN1_STB) -#define CAN2_STB_PORT (TCA9539_IO_PORT1) -#define CAN2_STB_PIN (EIO_CAN2_STB) -/** - * @} - */ - -int TCA9539_Init(void); -rt_err_t TCA9539_WritePin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState); -rt_err_t TCA9539_ReadPin(uint8_t u8Port, uint8_t u8Pin, uint8_t *pu8PinState); -rt_err_t TCA9539_TogglePin(uint8_t u8Port, uint8_t u8Pin); -rt_err_t TCA9539_ConfigPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8Dir); - -#endif diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539_port.h b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539_port.h new file mode 100644 index 00000000000..7a4608548ca --- /dev/null +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/ports/tca9539_port.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-04-28 CDT first version + */ + +#ifndef __TCA9539_PORT_H__ +#define __TCA9539_PORT_H__ + +#include "tca9539.h" + +/** + * @defgroup HC32F448_EV_IO_Function_Sel Expand IO function definition + * @{ + */ +#define EIO_SCI_CD (TCA9539_IO_PIN1) /* Smart card detect, input */ +#define EIO_TOUCH_INT (TCA9539_IO_PIN2) /* Touch screen interrupt, input */ +#define EIO_TOUCH_CTRST (TCA9539_IO_PIN5) /* 'Reset' for Cap touch panel, output */ +#define EIO_LCD_RST (TCA9539_IO_PIN6) /* LCD panel reset, output */ +#define EIO_LCD_BKL (TCA9539_IO_PIN7) /* LCD panel back light, output */ + +#define EIO_LIN_SLEEP (TCA9539_IO_PIN1) /* LIN PHY sleep, output */ +#define EIO_CAN1_STB (TCA9539_IO_PIN2) /* CAN1 PHY standby, output */ +#define EIO_CAN2_STB (TCA9539_IO_PIN3) /* CAN2 PHY standby, output */ +#define EIO_LED_RED (TCA9539_IO_PIN5) /* Red LED, output */ +#define EIO_LED_YELLOW (TCA9539_IO_PIN6) /* Yellow LED, output */ +#define EIO_LED_BLUE (TCA9539_IO_PIN7) /* Blue LED, output */ +/** + * @} + */ + +/** + * @defgroup BSP_LED_PortPin_Sel BSP LED port/pin definition + * @{ + */ +#define LED_RED_PORT (TCA9539_IO_PORT1) +#define LED_RED_PIN (EIO_LED_RED) +#define LED_YELLOW_PORT (TCA9539_IO_PORT1) +#define LED_YELLOW_PIN (EIO_LED_YELLOW) +#define LED_BLUE_PORT (TCA9539_IO_PORT1) +#define LED_BLUE_PIN (EIO_LED_BLUE) +/** + * @} + */ + +/** + * @defgroup BSP CAN PHY STB port/pin definition + * @{ + */ +#define CAN1_STB_PORT (TCA9539_IO_PORT1) +#define CAN1_STB_PIN (EIO_CAN1_STB) +#define CAN2_STB_PORT (TCA9539_IO_PORT1) +#define CAN2_STB_PIN (EIO_CAN2_STB) +/** + * @} + */ + +#endif diff --git a/bsp/hc32/ev_hc32f448_lqfp80/jlink/ev_hc32f448_lqfp80 Debug.launch b/bsp/hc32/ev_hc32f448_lqfp80/jlink/ev_hc32f448_lqfp80 Debug.launch index 92132f82c49..d55ce7cf5b8 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/jlink/ev_hc32f448_lqfp80 Debug.launch +++ b/bsp/hc32/ev_hc32f448_lqfp80/jlink/ev_hc32f448_lqfp80 Debug.launch @@ -41,7 +41,7 @@ - + diff --git a/bsp/hc32/ev_hc32f448_lqfp80/project.ewd b/bsp/hc32/ev_hc32f448_lqfp80/project.ewd index 8831d77db8e..7380d22af8c 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/project.ewd +++ b/bsp/hc32/ev_hc32f448_lqfp80/project.ewd @@ -44,7 +44,7 @@
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 - - HDSC - HDSC - HDSC_HC32F460 - ARMCM4 - 1.0 - - CM4 - r0p1 - little - true - true - 4 - false - - 8 - 32 - 32 - read-write - 0x0 - 0x0 - - - ADC1 - desc ADC - 0x40040000 - - 0x0 - 0xD0 - - - - STR - desc STR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - STRT - desc STRT - 0 - 0 - read-write - - - - - CR0 - desc CR0 - 0x2 - 16 - read-write - 0x0 - 0x7F3 - - - MS - desc MS - 1 - 0 - read-write - - - ACCSEL - desc ACCSEL - 5 - 4 - read-write - - - CLREN - desc CLREN - 6 - 6 - read-write - - - DFMT - desc DFMT - 7 - 7 - read-write - - - AVCNT - desc AVCNT - 10 - 8 - read-write - - - - - CR1 - desc CR1 - 0x4 - 16 - read-write - 0x0 - 0x4 - - - RSCHSEL - desc RSCHSEL - 2 - 2 - read-write - - - - - TRGSR - desc TRGSR - 0xA - 16 - read-write - 0x0 - 0x8383 - - - TRGSELA - desc TRGSELA - 1 - 0 - read-write - - - TRGENA - desc TRGENA - 7 - 7 - read-write - - - TRGSELB - desc TRGSELB - 9 - 8 - read-write - - - TRGENB - desc TRGENB - 15 - 15 - read-write - - - - - CHSELRA - desc CHSELRA - 0xC - 32 - read-write - 0x0 - 0x1FFFF - - - CHSELA - desc CHSELA - 16 - 0 - read-write - - - - - CHSELRB - desc CHSELRB - 0x10 - 32 - read-write - 0x0 - 0x1FFFF - - - CHSELB - desc CHSELB - 16 - 0 - read-write - - - - - AVCHSELR - desc AVCHSELR - 0x14 - 32 - read-write - 0x0 - 0x1FFFF - - - AVCHSEL - desc AVCHSEL - 16 - 0 - read-write - - - - - SSTR0 - desc SSTR0 - 0x20 - 8 - read-write - 0xB - 0xFF - - - SSTR1 - desc SSTR1 - 0x21 - 8 - read-write - 0xB - 0xFF - - - SSTR2 - desc SSTR2 - 0x22 - 8 - read-write - 0xB - 0xFF - - - SSTR3 - desc SSTR3 - 0x23 - 8 - read-write - 0xB - 0xFF - - - SSTR4 - desc SSTR4 - 0x24 - 8 - read-write - 0xB - 0xFF - - - SSTR5 - desc SSTR5 - 0x25 - 8 - read-write - 0xB - 0xFF - - - SSTR6 - desc SSTR6 - 0x26 - 8 - read-write - 0xB - 0xFF - - - SSTR7 - desc SSTR7 - 0x27 - 8 - read-write - 0xB - 0xFF - - - SSTR8 - desc SSTR8 - 0x28 - 8 - read-write - 0xB - 0xFF - - - SSTR9 - desc SSTR9 - 0x29 - 8 - read-write - 0xB - 0xFF - - - SSTR10 - desc SSTR10 - 0x2A - 8 - read-write - 0xB - 0xFF - - - SSTR11 - desc SSTR11 - 0x2B - 8 - read-write - 0xB - 0xFF - - - SSTR12 - desc SSTR12 - 0x2C - 8 - read-write - 0xB - 0xFF - - - SSTR13 - desc SSTR13 - 0x2D - 8 - read-write - 0xB - 0xFF - - - SSTR14 - desc SSTR14 - 0x2E - 8 - read-write - 0xB - 0xFF - - - SSTR15 - desc SSTR15 - 0x2F - 8 - read-write - 0xB - 0xFF - - - SSTRL - desc SSTRL - 0x30 - 8 - read-write - 0xB - 0xFF - - - CHMUXR0 - desc CHMUXR0 - 0x38 - 16 - read-write - 0x3210 - 0xFFFF - - - CH00MUX - desc CH00MUX - 3 - 0 - read-write - - - CH01MUX - desc CH01MUX - 7 - 4 - read-write - - - CH02MUX - desc CH02MUX - 11 - 8 - read-write - - - CH03MUX - desc CH03MUX - 15 - 12 - read-write - - - - - CHMUXR1 - desc CHMUXR1 - 0x3A - 16 - read-write - 0x7654 - 0xFFFF - - - CH04MUX - desc CH04MUX - 3 - 0 - read-write - - - CH05MUX - desc CH05MUX - 7 - 4 - read-write - - - CH06MUX - desc CH06MUX - 11 - 8 - read-write - - - CH07MUX - desc CH07MUX - 15 - 12 - read-write - - - - - CHMUXR2 - desc CHMUXR2 - 0x3C - 16 - read-write - 0xBA98 - 0xFFFF - - - CH08MUX - desc CH08MUX - 3 - 0 - read-write - - - CH09MUX - desc CH09MUX - 7 - 4 - read-write - - - CH10MUX - desc CH10MUX - 11 - 8 - read-write - - - CH11MUX - desc CH11MUX - 15 - 12 - read-write - - - - - CHMUXR3 - desc CHMUXR3 - 0x3E - 16 - read-write - 0xFEDC - 0xFFFF - - - CH12MUX - desc CH12MUX - 3 - 0 - read-write - - - CH13MUX - desc CH13MUX - 7 - 4 - read-write - - - CH14MUX - desc CH14MUX - 11 - 8 - read-write - - - CH15MUX - desc CH15MUX - 15 - 12 - read-write - - - - - ISR - desc ISR - 0x46 - 8 - read-write - 0x0 - 0x3 - - - EOCAF - desc EOCAF - 0 - 0 - read-write - - - EOCBF - desc EOCBF - 1 - 1 - read-write - - - - - ICR - desc ICR - 0x47 - 8 - read-write - 0x0 - 0x3 - - - EOCAIEN - desc EOCAIEN - 0 - 0 - read-write - - - EOCBIEN - desc EOCBIEN - 1 - 1 - read-write - - - - - SYNCCR - desc SYNCCR - 0x4C - 16 - read-write - 0xC00 - 0xFF71 - - - SYNCEN - desc SYNCEN - 0 - 0 - read-write - - - SYNCMD - desc SYNCMD - 6 - 4 - read-write - - - SYNCDLY - desc SYNCDLY - 15 - 8 - read-write - - - - - DR0 - desc DR0 - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - DR1 - desc DR1 - 0x52 - 16 - read-only - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x54 - 16 - read-only - 0x0 - 0xFFFF - - - DR3 - desc DR3 - 0x56 - 16 - read-only - 0x0 - 0xFFFF - - - DR4 - desc DR4 - 0x58 - 16 - read-only - 0x0 - 0xFFFF - - - DR5 - desc DR5 - 0x5A - 16 - read-only - 0x0 - 0xFFFF - - - DR6 - desc DR6 - 0x5C - 16 - read-only - 0x0 - 0xFFFF - - - DR7 - desc DR7 - 0x5E - 16 - read-only - 0x0 - 0xFFFF - - - DR8 - desc DR8 - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - DR9 - desc DR9 - 0x62 - 16 - read-only - 0x0 - 0xFFFF - - - DR10 - desc DR10 - 0x64 - 16 - read-only - 0x0 - 0xFFFF - - - DR11 - desc DR11 - 0x66 - 16 - read-only - 0x0 - 0xFFFF - - - DR12 - desc DR12 - 0x68 - 16 - read-only - 0x0 - 0xFFFF - - - DR13 - desc DR13 - 0x6A - 16 - read-only - 0x0 - 0xFFFF - - - DR14 - desc DR14 - 0x6C - 16 - read-only - 0x0 - 0xFFFF - - - DR15 - desc DR15 - 0x6E - 16 - read-only - 0x0 - 0xFFFF - - - DR16 - desc DR16 - 0x70 - 16 - read-only - 0x0 - 0xFFFF - - - AWDCR - desc AWDCR - 0xA0 - 16 - read-write - 0x0 - 0x1D1 - - - AWDEN - desc AWDEN - 0 - 0 - read-write - - - AWDMD - desc AWDMD - 4 - 4 - read-write - - - AWDSS - desc AWDSS - 7 - 6 - read-write - - - AWDIEN - desc AWDIEN - 8 - 8 - read-write - - - - - AWDDR0 - desc AWDDR0 - 0xA4 - 16 - read-write - 0x0 - 0xFFFF - - - AWDDR1 - desc AWDDR1 - 0xA6 - 16 - read-write - 0x0 - 0xFFFF - - - AWDCHSR - desc AWDCHSR - 0xAC - 32 - read-write - 0x0 - 0x1FFFF - - - AWDCH - desc AWDCH - 16 - 0 - read-write - - - - - AWDSR - desc AWDSR - 0xB0 - 32 - read-write - 0x0 - 0x1FFFF - - - AWDF - desc AWDF - 16 - 0 - read-write - - - - - PGACR - desc PGACR - 0xC0 - 16 - read-write - 0x0 - 0xF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - - - PGAGSR - desc PGAGSR - 0xC2 - 16 - read-write - 0x0 - 0xF - - - GAIN - desc GAIN - 3 - 0 - read-write - - - - - PGAINSR0 - desc PGAINSR0 - 0xCC - 16 - read-write - 0x0 - 0x1FF - - - PGAINSEL - desc PGAINSEL - 8 - 0 - read-write - - - - - PGAINSR1 - desc PGAINSR1 - 0xCE - 16 - read-write - 0x0 - 0x1 - - - PGAVSSEN - desc PGAVSSEN - 0 - 0 - read-write - - - - - - - ADC2 - desc ADC - 0x40040400 - - 0x0 - 0xD0 - - - - AES - desc AES - 0x40008000 - - 0x0 - 0x30 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x3 - - - START - desc START - 0 - 0 - read-write - - - MODE - desc MODE - 1 - 1 - read-write - - - - - DR0 - desc DR0 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR2 - desc DR2 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR3 - desc DR3 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR0 - desc KR0 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR1 - desc KR1 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR2 - desc KR2 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR3 - desc KR3 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - AOS - desc AOS - 0x40010800 - - 0x0 - 0x174 - - - - INTSFTTRG - desc INTSFTTRG - 0x0 - 32 - write-only - 0x0 - 0x1 - - - STRG - desc STRG - 0 - 0 - write-only - - - - - DCU_TRGSEL1 - desc DCU_TRGSEL1 - 0x4 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL2 - desc DCU_TRGSEL2 - 0x8 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL3 - desc DCU_TRGSEL3 - 0xC - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL4 - desc DCU_TRGSEL4 - 0x10 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL0 - desc DMA1_TRGSEL0 - 0x14 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL1 - desc DMA1_TRGSEL1 - 0x18 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL2 - desc DMA1_TRGSEL2 - 0x1C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL3 - desc DMA1_TRGSEL3 - 0x20 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL0 - desc DMA2_TRGSEL0 - 0x24 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL1 - desc DMA2_TRGSEL1 - 0x28 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL2 - desc DMA2_TRGSEL2 - 0x2C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL3 - desc DMA2_TRGSEL3 - 0x30 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA_TRGSELRC - desc DMA_TRGSELRC - 0x34 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR0 - desc TMR6_HTSSR0 - 0x38 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR1 - desc TMR6_HTSSR1 - 0x3C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR0_HTSSR - desc TMR0_HTSSR - 0x40 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - PEVNTTRGSR12 - desc PEVNTTRGSR12 - 0x44 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - PEVNTTRGSR34 - desc PEVNTTRGSR34 - 0x48 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR0 - desc TMRA_HTSSR0 - 0x4C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR1 - desc TMRA_HTSSR1 - 0x50 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - OTS_TRG - desc OTS_TRG - 0x54 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC1_ITRGSELR0 - desc ADC1_ITRGSELR0 - 0x58 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC1_ITRGSELR1 - desc ADC1_ITRGSELR1 - 0x5C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC2_ITRGSELR0 - desc ADC2_ITRGSELR0 - 0x60 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC2_ITRGSELR1 - desc ADC2_ITRGSELR1 - 0x64 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - COMTRG1 - desc COMTRG1 - 0x68 - 32 - read-write - 0x1FF - 0x1FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - - - COMTRG2 - desc COMTRG2 - 0x6C - 32 - read-write - 0x1FF - 0x1FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - - - PEVNTDIRR1 - desc PEVNTDIRR1 - 0x100 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR00 - desc PDIR00 - 0 - 0 - read-write - - - PDIR01 - desc PDIR01 - 1 - 1 - read-write - - - PDIR02 - desc PDIR02 - 2 - 2 - read-write - - - PDIR03 - desc PDIR03 - 3 - 3 - read-write - - - PDIR04 - desc PDIR04 - 4 - 4 - read-write - - - PDIR05 - desc PDIR05 - 5 - 5 - read-write - - - PDIR06 - desc PDIR06 - 6 - 6 - read-write - - - PDIR07 - desc PDIR07 - 7 - 7 - read-write - - - PDIR08 - desc PDIR08 - 8 - 8 - read-write - - - PDIR09 - desc PDIR09 - 9 - 9 - read-write - - - PDIR10 - desc PDIR10 - 10 - 10 - read-write - - - PDIR11 - desc PDIR11 - 11 - 11 - read-write - - - PDIR12 - desc PDIR12 - 12 - 12 - read-write - - - PDIR13 - desc PDIR13 - 13 - 13 - read-write - - - PDIR14 - desc PDIR14 - 14 - 14 - read-write - - - PDIR15 - desc PDIR15 - 15 - 15 - read-write - - - - - PEVNTIDR1 - desc PEVNTIDR1 - 0x104 - 32 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PEVNTODR1 - desc PEVNTODR1 - 0x108 - 32 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - PEVNTORR1 - desc PEVNTORR1 - 0x10C - 32 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - PEVNTOSR1 - desc PEVNTOSR1 - 0x110 - 32 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PEVNTRISR1 - desc PEVNTRISR1 - 0x114 - 32 - read-write - 0x0 - 0xFFFF - - - RIS00 - desc RIS00 - 0 - 0 - read-write - - - RIS01 - desc RIS01 - 1 - 1 - read-write - - - RIS02 - desc RIS02 - 2 - 2 - read-write - - - RIS03 - desc RIS03 - 3 - 3 - read-write - - - RIS04 - desc RIS04 - 4 - 4 - read-write - - - RIS05 - desc RIS05 - 5 - 5 - read-write - - - RIS06 - desc RIS06 - 6 - 6 - read-write - - - RIS07 - desc RIS07 - 7 - 7 - read-write - - - RIS08 - desc RIS08 - 8 - 8 - read-write - - - RIS09 - desc RIS09 - 9 - 9 - read-write - - - RIS10 - desc RIS10 - 10 - 10 - read-write - - - RIS11 - desc RIS11 - 11 - 11 - read-write - - - RIS12 - desc RIS12 - 12 - 12 - read-write - - - RIS13 - desc RIS13 - 13 - 13 - read-write - - - RIS14 - desc RIS14 - 14 - 14 - read-write - - - RIS15 - desc RIS15 - 15 - 15 - read-write - - - - - PEVNTFAL1 - desc PEVNTFAL1 - 0x118 - 32 - read-write - 0x0 - 0xFFFF - - - FAL00 - desc FAL00 - 0 - 0 - read-write - - - FAL01 - desc FAL01 - 1 - 1 - read-write - - - FAL02 - desc FAL02 - 2 - 2 - read-write - - - FAL03 - desc FAL03 - 3 - 3 - read-write - - - FAL04 - desc FAL04 - 4 - 4 - read-write - - - FAL05 - desc FAL05 - 5 - 5 - read-write - - - FAL06 - desc FAL06 - 6 - 6 - read-write - - - FAL07 - desc FAL07 - 7 - 7 - read-write - - - FAL08 - desc FAL08 - 8 - 8 - read-write - - - FAL09 - desc FAL09 - 9 - 9 - read-write - - - FAL10 - desc FAL10 - 10 - 10 - read-write - - - FAL11 - desc FAL11 - 11 - 11 - read-write - - - FAL12 - desc FAL12 - 12 - 12 - read-write - - - FAL13 - desc FAL13 - 13 - 13 - read-write - - - FAL14 - desc FAL14 - 14 - 14 - read-write - - - FAL15 - desc FAL15 - 15 - 15 - read-write - - - - - PEVNTDIRR2 - desc PEVNTDIRR2 - 0x11C - 32 - read-write - 0x0 - 0xFFFF - - - PDIR00 - desc PDIR00 - 0 - 0 - read-write - - - PDIR01 - desc PDIR01 - 1 - 1 - read-write - - - PDIR02 - desc PDIR02 - 2 - 2 - read-write - - - PDIR03 - desc PDIR03 - 3 - 3 - read-write - - - PDIR04 - desc PDIR04 - 4 - 4 - read-write - - - PDIR05 - desc PDIR05 - 5 - 5 - read-write - - - PDIR06 - desc PDIR06 - 6 - 6 - read-write - - - PDIR07 - desc PDIR07 - 7 - 7 - read-write - - - PDIR08 - desc PDIR08 - 8 - 8 - read-write - - - PDIR09 - desc PDIR09 - 9 - 9 - read-write - - - PDIR10 - desc PDIR10 - 10 - 10 - read-write - - - PDIR11 - desc PDIR11 - 11 - 11 - read-write - - - PDIR12 - desc PDIR12 - 12 - 12 - read-write - - - PDIR13 - desc PDIR13 - 13 - 13 - read-write - - - PDIR14 - desc PDIR14 - 14 - 14 - read-write - - - PDIR15 - desc PDIR15 - 15 - 15 - read-write - - - - - PEVNTIDR2 - desc PEVNTIDR2 - 0x120 - 32 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PEVNTODR2 - desc PEVNTODR2 - 0x124 - 32 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - PEVNTORR2 - desc PEVNTORR2 - 0x128 - 32 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - PEVNTOSR2 - desc PEVNTOSR2 - 0x12C - 32 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PEVNTRISR2 - desc PEVNTRISR2 - 0x130 - 32 - read-write - 0x0 - 0xFFFF - - - RIS00 - desc RIS00 - 0 - 0 - read-write - - - RIS01 - desc RIS01 - 1 - 1 - read-write - - - RIS02 - desc RIS02 - 2 - 2 - read-write - - - RIS03 - desc RIS03 - 3 - 3 - read-write - - - RIS04 - desc RIS04 - 4 - 4 - read-write - - - RIS05 - desc RIS05 - 5 - 5 - read-write - - - RIS06 - desc RIS06 - 6 - 6 - read-write - - - RIS07 - desc RIS07 - 7 - 7 - read-write - - - RIS08 - desc RIS08 - 8 - 8 - read-write - - - RIS09 - desc RIS09 - 9 - 9 - read-write - - - RIS10 - desc RIS10 - 10 - 10 - read-write - - - RIS11 - desc RIS11 - 11 - 11 - read-write - - - RIS12 - desc RIS12 - 12 - 12 - read-write - - - RIS13 - desc RIS13 - 13 - 13 - read-write - - - RIS14 - desc RIS14 - 14 - 14 - read-write - - - RIS15 - desc RIS15 - 15 - 15 - read-write - - - - - PEVNTFAL2 - desc PEVNTFAL2 - 0x134 - 32 - read-write - 0x0 - 0xFFFF - - - FAL00 - desc FAL00 - 0 - 0 - read-write - - - FAL01 - desc FAL01 - 1 - 1 - read-write - - - FAL02 - desc FAL02 - 2 - 2 - read-write - - - FAL03 - desc FAL03 - 3 - 3 - read-write - - - FAL04 - desc FAL04 - 4 - 4 - read-write - - - FAL05 - desc FAL05 - 5 - 5 - read-write - - - FAL06 - desc FAL06 - 6 - 6 - read-write - - - FAL07 - desc FAL07 - 7 - 7 - read-write - - - FAL08 - desc FAL08 - 8 - 8 - read-write - - - FAL09 - desc FAL09 - 9 - 9 - read-write - - - FAL10 - desc FAL10 - 10 - 10 - read-write - - - FAL11 - desc FAL11 - 11 - 11 - read-write - - - FAL12 - desc FAL12 - 12 - 12 - read-write - - - FAL13 - desc FAL13 - 13 - 13 - read-write - - - FAL14 - desc FAL14 - 14 - 14 - read-write - - - FAL15 - desc FAL15 - 15 - 15 - read-write - - - - - PEVNTDIRR3 - desc PEVNTDIRR3 - 0x138 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR00 - desc PDIR00 - 0 - 0 - read-write - - - PDIR01 - desc PDIR01 - 1 - 1 - read-write - - - PDIR02 - desc PDIR02 - 2 - 2 - read-write - - - PDIR03 - desc PDIR03 - 3 - 3 - read-write - - - PDIR04 - desc PDIR04 - 4 - 4 - read-write - - - PDIR05 - desc PDIR05 - 5 - 5 - read-write - - - PDIR06 - desc PDIR06 - 6 - 6 - read-write - - - PDIR07 - desc PDIR07 - 7 - 7 - read-write - - - PDIR08 - desc PDIR08 - 8 - 8 - read-write - - - PDIR09 - desc PDIR09 - 9 - 9 - read-write - - - PDIR10 - desc PDIR10 - 10 - 10 - read-write - - - PDIR11 - desc PDIR11 - 11 - 11 - read-write - - - PDIR12 - desc PDIR12 - 12 - 12 - read-write - - - PDIR13 - desc PDIR13 - 13 - 13 - read-write - - - PDIR14 - desc PDIR14 - 14 - 14 - read-write - - - PDIR15 - desc PDIR15 - 15 - 15 - read-write - - - - - PEVNTIDR3 - desc PEVNTIDR3 - 0x13C - 32 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PEVNTODR3 - desc PEVNTODR3 - 0x140 - 32 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - PEVNTORR3 - desc PEVNTORR3 - 0x144 - 32 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - PEVNTOSR3 - desc PEVNTOSR3 - 0x148 - 32 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PEVNTRISR3 - desc PEVNTRISR3 - 0x14C - 32 - read-write - 0x0 - 0xFFFF - - - RIS00 - desc RIS00 - 0 - 0 - read-write - - - RIS01 - desc RIS01 - 1 - 1 - read-write - - - RIS02 - desc RIS02 - 2 - 2 - read-write - - - RIS03 - desc RIS03 - 3 - 3 - read-write - - - RIS04 - desc RIS04 - 4 - 4 - read-write - - - RIS05 - desc RIS05 - 5 - 5 - read-write - - - RIS06 - desc RIS06 - 6 - 6 - read-write - - - RIS07 - desc RIS07 - 7 - 7 - read-write - - - RIS08 - desc RIS08 - 8 - 8 - read-write - - - RIS09 - desc RIS09 - 9 - 9 - read-write - - - RIS10 - desc RIS10 - 10 - 10 - read-write - - - RIS11 - desc RIS11 - 11 - 11 - read-write - - - RIS12 - desc RIS12 - 12 - 12 - read-write - - - RIS13 - desc RIS13 - 13 - 13 - read-write - - - RIS14 - desc RIS14 - 14 - 14 - read-write - - - RIS15 - desc RIS15 - 15 - 15 - read-write - - - - - PEVNTFAL3 - desc PEVNTFAL3 - 0x150 - 32 - read-write - 0x0 - 0xFFFF - - - FAL00 - desc FAL00 - 0 - 0 - read-write - - - FAL01 - desc FAL01 - 1 - 1 - read-write - - - FAL02 - desc FAL02 - 2 - 2 - read-write - - - FAL03 - desc FAL03 - 3 - 3 - read-write - - - FAL04 - desc FAL04 - 4 - 4 - read-write - - - FAL05 - desc FAL05 - 5 - 5 - read-write - - - FAL06 - desc FAL06 - 6 - 6 - read-write - - - FAL07 - desc FAL07 - 7 - 7 - read-write - - - FAL08 - desc FAL08 - 8 - 8 - read-write - - - FAL09 - desc FAL09 - 9 - 9 - read-write - - - FAL10 - desc FAL10 - 10 - 10 - read-write - - - FAL11 - desc FAL11 - 11 - 11 - read-write - - - FAL12 - desc FAL12 - 12 - 12 - read-write - - - FAL13 - desc FAL13 - 13 - 13 - read-write - - - FAL14 - desc FAL14 - 14 - 14 - read-write - - - FAL15 - desc FAL15 - 15 - 15 - read-write - - - - - PEVNTDIRR4 - desc PEVNTDIRR4 - 0x154 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR00 - desc PDIR00 - 0 - 0 - read-write - - - PDIR01 - desc PDIR01 - 1 - 1 - read-write - - - PDIR02 - desc PDIR02 - 2 - 2 - read-write - - - PDIR03 - desc PDIR03 - 3 - 3 - read-write - - - PDIR04 - desc PDIR04 - 4 - 4 - read-write - - - PDIR05 - desc PDIR05 - 5 - 5 - read-write - - - PDIR06 - desc PDIR06 - 6 - 6 - read-write - - - PDIR07 - desc PDIR07 - 7 - 7 - read-write - - - PDIR08 - desc PDIR08 - 8 - 8 - read-write - - - PDIR09 - desc PDIR09 - 9 - 9 - read-write - - - PDIR10 - desc PDIR10 - 10 - 10 - read-write - - - PDIR11 - desc PDIR11 - 11 - 11 - read-write - - - PDIR12 - desc PDIR12 - 12 - 12 - read-write - - - PDIR13 - desc PDIR13 - 13 - 13 - read-write - - - PDIR14 - desc PDIR14 - 14 - 14 - read-write - - - PDIR15 - desc PDIR15 - 15 - 15 - read-write - - - - - PEVNTIDR4 - desc PEVNTIDR4 - 0x158 - 32 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PEVNTODR4 - desc PEVNTODR4 - 0x15C - 32 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - PEVNTORR4 - desc PEVNTORR4 - 0x160 - 32 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - PEVNTOSR4 - desc PEVNTOSR4 - 0x164 - 32 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PEVNTRISR4 - desc PEVNTRISR4 - 0x168 - 32 - read-write - 0x0 - 0xFFFF - - - RIS00 - desc RIS00 - 0 - 0 - read-write - - - RIS01 - desc RIS01 - 1 - 1 - read-write - - - RIS02 - desc RIS02 - 2 - 2 - read-write - - - RIS03 - desc RIS03 - 3 - 3 - read-write - - - RIS04 - desc RIS04 - 4 - 4 - read-write - - - RIS05 - desc RIS05 - 5 - 5 - read-write - - - RIS06 - desc RIS06 - 6 - 6 - read-write - - - RIS07 - desc RIS07 - 7 - 7 - read-write - - - RIS08 - desc RIS08 - 8 - 8 - read-write - - - RIS09 - desc RIS09 - 9 - 9 - read-write - - - RIS10 - desc RIS10 - 10 - 10 - read-write - - - RIS11 - desc RIS11 - 11 - 11 - read-write - - - RIS12 - desc RIS12 - 12 - 12 - read-write - - - RIS13 - desc RIS13 - 13 - 13 - read-write - - - RIS14 - desc RIS14 - 14 - 14 - read-write - - - RIS15 - desc RIS15 - 15 - 15 - read-write - - - - - PEVNTFAL4 - desc PEVNTFAL4 - 0x16C - 32 - read-write - 0x0 - 0xFFFF - - - FAL00 - desc FAL00 - 0 - 0 - read-write - - - FAL01 - desc FAL01 - 1 - 1 - read-write - - - FAL02 - desc FAL02 - 2 - 2 - read-write - - - FAL03 - desc FAL03 - 3 - 3 - read-write - - - FAL04 - desc FAL04 - 4 - 4 - read-write - - - FAL05 - desc FAL05 - 5 - 5 - read-write - - - FAL06 - desc FAL06 - 6 - 6 - read-write - - - FAL07 - desc FAL07 - 7 - 7 - read-write - - - FAL08 - desc FAL08 - 8 - 8 - read-write - - - FAL09 - desc FAL09 - 9 - 9 - read-write - - - FAL10 - desc FAL10 - 10 - 10 - read-write - - - FAL11 - desc FAL11 - 11 - 11 - read-write - - - FAL12 - desc FAL12 - 12 - 12 - read-write - - - FAL13 - desc FAL13 - 13 - 13 - read-write - - - FAL14 - desc FAL14 - 14 - 14 - read-write - - - FAL15 - desc FAL15 - 15 - 15 - read-write - - - - - PEVNTNFCR - desc PEVNTNFCR - 0x170 - 32 - read-write - 0x0 - 0x7070707 - - - NFEN1 - desc NFEN1 - 0 - 0 - read-write - - - DIVS1 - desc DIVS1 - 2 - 1 - read-write - - - NFEN2 - desc NFEN2 - 8 - 8 - read-write - - - DIVS2 - desc DIVS2 - 10 - 9 - read-write - - - NFEN3 - desc NFEN3 - 16 - 16 - read-write - - - DIVS3 - desc DIVS3 - 18 - 17 - read-write - - - NFEN4 - desc NFEN4 - 24 - 24 - read-write - - - DIVS4 - desc DIVS4 - 26 - 25 - read-write - - - - - - - CAN - desc CAN - 0x40070400 - - 0x0 - 0xCA - - - - RBUF - desc RBUF - 0x0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - TBUF - desc TBUF - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CFG_STAT - desc CFG_STAT - 0xA0 - 8 - read-write - 0x80 - 0xFF - - - BUSOFF - desc BUSOFF - 0 - 0 - read-write - - - TACTIVE - desc TACTIVE - 1 - 1 - read-only - - - RACTIVE - desc RACTIVE - 2 - 2 - read-only - - - TSSS - desc TSSS - 3 - 3 - read-write - - - TPSS - desc TPSS - 4 - 4 - read-write - - - LBMI - desc LBMI - 5 - 5 - read-write - - - LBME - desc LBME - 6 - 6 - read-write - - - RESET - desc RESET - 7 - 7 - read-write - - - - - TCMD - desc TCMD - 0xA1 - 8 - read-write - 0x0 - 0xDF - - - TSA - desc TSA - 0 - 0 - read-write - - - TSALL - desc TSALL - 1 - 1 - read-write - - - TSONE - desc TSONE - 2 - 2 - read-write - - - TPA - desc TPA - 3 - 3 - read-write - - - TPE - desc TPE - 4 - 4 - read-write - - - LOM - desc LOM - 6 - 6 - read-write - - - TBSEL - desc TBSEL - 7 - 7 - read-write - - - - - TCTRL - desc TCTRL - 0xA2 - 8 - read-write - 0x90 - 0x73 - - - TSSTAT - desc TSSTAT - 1 - 0 - read-only - - - TTTBM - desc TTTBM - 4 - 4 - read-write - - - TSMODE - desc TSMODE - 5 - 5 - read-write - - - TSNEXT - desc TSNEXT - 6 - 6 - read-write - - - - - RCTRL - desc RCTRL - 0xA3 - 8 - read-write - 0x0 - 0xFB - - - RSTAT - desc RSTAT - 1 - 0 - read-only - - - RBALL - desc RBALL - 3 - 3 - read-write - - - RREL - desc RREL - 4 - 4 - read-write - - - ROV - desc ROV - 5 - 5 - read-only - - - ROM - desc ROM - 6 - 6 - read-write - - - SACK - desc SACK - 7 - 7 - read-write - - - - - RTIE - desc RTIE - 0xA4 - 8 - read-write - 0xFE - 0xFF - - - TSFF - desc TSFF - 0 - 0 - read-only - - - EIE - desc EIE - 1 - 1 - read-write - - - TSIE - desc TSIE - 2 - 2 - read-write - - - TPIE - desc TPIE - 3 - 3 - read-write - - - RAFIE - desc RAFIE - 4 - 4 - read-write - - - RFIE - desc RFIE - 5 - 5 - read-write - - - ROIE - desc ROIE - 6 - 6 - read-write - - - RIE - desc RIE - 7 - 7 - read-write - - - - - RTIF - desc RTIF - 0xA5 - 8 - read-write - 0x0 - 0xFF - - - AIF - desc AIF - 0 - 0 - read-write - - - EIF - desc EIF - 1 - 1 - read-write - - - TSIF - desc TSIF - 2 - 2 - read-write - - - TPIF - desc TPIF - 3 - 3 - read-write - - - RAFIF - desc RAFIF - 4 - 4 - read-write - - - RFIF - desc RFIF - 5 - 5 - read-write - - - ROIF - desc ROIF - 6 - 6 - read-write - - - RIF - desc RIF - 7 - 7 - read-write - - - - - ERRINT - desc ERRINT - 0xA6 - 8 - read-write - 0x0 - 0xFF - - - BEIF - desc BEIF - 0 - 0 - read-write - - - BEIE - desc BEIE - 1 - 1 - read-write - - - ALIF - desc ALIF - 2 - 2 - read-write - - - ALIE - desc ALIE - 3 - 3 - read-write - - - EPIF - desc EPIF - 4 - 4 - read-write - - - EPIE - desc EPIE - 5 - 5 - read-write - - - EPASS - desc EPASS - 6 - 6 - read-only - - - EWARN - desc EWARN - 7 - 7 - read-only - - - - - LIMIT - desc LIMIT - 0xA7 - 8 - read-write - 0x1B - 0xFF - - - EWL - desc EWL - 3 - 0 - read-write - - - AFWL - desc AFWL - 7 - 4 - read-write - - - - - SBT - desc SBT - 0xA8 - 32 - read-write - 0x1020203 - 0xFF7F7FFF - - - S_SEG_1 - desc S_SEG_1 - 7 - 0 - read-write - - - S_SEG_2 - desc S_SEG_2 - 14 - 8 - read-write - - - S_SJW - desc S_SJW - 22 - 16 - read-write - - - S_PRESC - desc S_PRESC - 31 - 24 - read-write - - - - - EALCAP - desc EALCAP - 0xB0 - 8 - read-only - 0x0 - 0xFF - - - ALC - desc ALC - 4 - 0 - read-only - - - KOER - desc KOER - 7 - 5 - read-only - - - - - RECNT - desc RECNT - 0xB2 - 8 - read-write - 0x0 - 0xFF - - - TECNT - desc TECNT - 0xB3 - 8 - read-write - 0x0 - 0xFF - - - ACFCTRL - desc ACFCTRL - 0xB4 - 8 - read-write - 0x0 - 0x2F - - - ACFADR - desc ACFADR - 3 - 0 - read-write - - - SELMASK - desc SELMASK - 5 - 5 - read-write - - - - - ACFEN - desc ACFEN - 0xB6 - 8 - read-write - 0x1 - 0xFF - - - AE_1 - desc AE_1 - 0 - 0 - read-write - - - AE_2 - desc AE_2 - 1 - 1 - read-write - - - AE_3 - desc AE_3 - 2 - 2 - read-write - - - AE_4 - desc AE_4 - 3 - 3 - read-write - - - AE_5 - desc AE_5 - 4 - 4 - read-write - - - AE_6 - desc AE_6 - 5 - 5 - read-write - - - AE_7 - desc AE_7 - 6 - 6 - read-write - - - AE_8 - desc AE_8 - 7 - 7 - read-write - - - - - ACF - desc ACF - 0xB8 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - ACODEORAMASK - desc ACODEORAMASK - 28 - 0 - read-write - - - AIDE - desc AIDE - 29 - 29 - read-write - - - AIDEE - desc AIDEE - 30 - 30 - read-write - - - - - TBSLOT - desc TBSLOT - 0xBE - 8 - read-write - 0x0 - 0xFF - - - TBPTR - desc TBPTR - 5 - 0 - read-write - - - TBF - desc TBF - 6 - 6 - read-write - - - TBE - desc TBE - 7 - 7 - read-write - - - - - TTCFG - desc TTCFG - 0xBF - 8 - read-write - 0x90 - 0xFF - - - TTEN - desc TTEN - 0 - 0 - read-write - - - T_PRESC - desc T_PRESC - 2 - 1 - read-write - - - TTIF - desc TTIF - 3 - 3 - read-write - - - TTIE - desc TTIE - 4 - 4 - read-write - - - TEIF - desc TEIF - 5 - 5 - read-write - - - WTIF - desc WTIF - 6 - 6 - read-write - - - WTIE - desc WTIE - 7 - 7 - read-write - - - - - REF_MSG - desc REF_MSG - 0xC0 - 32 - read-write - 0x0 - 0x9FFFFFFF - - - REF_ID - desc REF_ID - 28 - 0 - read-write - - - REF_IDE - desc REF_IDE - 31 - 31 - read-write - - - - - TRG_CFG - desc TRG_CFG - 0xC4 - 16 - read-write - 0x0 - 0xF73F - - - TTPTR - desc TTPTR - 5 - 0 - read-write - - - TTYPE - desc TTYPE - 10 - 8 - read-write - - - TEW - desc TEW - 15 - 12 - read-write - - - - - TT_TRIG - desc TT_TRIG - 0xC6 - 16 - read-write - 0x0 - 0xFFFF - - - TT_WTRIG - desc TT_WTRIG - 0xC8 - 16 - read-write - 0xFFFF - 0xFFFF - - - - - CMP1 - desc CMP - 0x4004A000 - - 0x0 - 0xA - - - - CTRL - desc CTRL - 0x0 - 16 - read-write - 0x0 - 0xF1E7 - - - FLTSL - desc FLTSL - 2 - 0 - read-write - - - EDGSL - desc EDGSL - 6 - 5 - read-write - - - IEN - desc IEN - 7 - 7 - read-write - - - CVSEN - desc CVSEN - 8 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - INV - desc INV - 13 - 13 - read-write - - - CMPOE - desc CMPOE - 14 - 14 - read-write - - - CMPON - desc CMPON - 15 - 15 - read-write - - - - - VLTSEL - desc VLTSEL - 0x2 - 16 - read-write - 0x0 - 0x7F0F - - - RVSL - desc RVSL - 3 - 0 - read-write - - - CVSL - desc CVSL - 11 - 8 - read-write - - - C4SL - desc C4SL - 14 - 12 - read-write - - - - - OUTMON - desc OUTMON - 0x4 - 16 - read-only - 0x0 - 0xF01 - - - OMON - desc OMON - 0 - 0 - read-only - - - CVST - desc CVST - 11 - 8 - read-only - - - - - CVSSTB - desc CVSSTB - 0x6 - 16 - read-write - 0x5 - 0xF - - - STB - desc STB - 3 - 0 - read-write - - - - - CVSPRD - desc CVSPRD - 0x8 - 16 - read-write - 0xF - 0xFF - - - PRD - desc PRD - 7 - 0 - read-write - - - - - - - CMP2 - desc CMP - 0x4004A010 - - 0x0 - 0xA - - - - CMP3 - desc CMP - 0x4004A020 - - 0x0 - 0xA - - - - CMPCR - desc CMPCR - 0x4004A000 - CMP1 - - 0x0 - 0x10E - - - - DADR1 - desc DADR1 - 0x100 - 16 - read-write - 0x0 - 0xFF - - - DATA - desc DATA - 7 - 0 - read-write - - - - - DADR2 - desc DADR2 - 0x102 - 16 - read-write - 0x0 - 0xFF - - - DATA - desc DATA - 7 - 0 - read-write - - - - - DACR - desc DACR - 0x108 - 16 - read-write - 0x0 - 0x3 - - - DA1EN - desc DA1EN - 0 - 0 - read-write - - - DA2EN - desc DA2EN - 1 - 1 - read-write - - - - - RVADC - desc RVADC - 0x10C - 16 - read-write - 0x0 - 0x13 - - - DA1SW - desc DA1SW - 0 - 0 - read-write - - - DA2SW - desc DA2SW - 1 - 1 - read-write - - - VREFSW - desc VREFSW - 4 - 4 - read-write - - - WPRT - desc WPRT - 15 - 8 - read-write - - - - - - - CMU - desc CMU - 0x40054000 - - 0x0 - 0x42A - - - - PERICKSEL - desc PERICKSEL - 0x10 - 16 - read-write - 0x0 - 0xF - - - PERICKSEL - desc PERICKSEL - 3 - 0 - read-write - - - - - I2SCKSEL - desc I2SCKSEL - 0x12 - 16 - read-write - 0xBBBB - 0xFFFF - - - I2S1CKSEL - desc I2S1CKSEL - 3 - 0 - read-write - - - I2S2CKSEL - desc I2S2CKSEL - 7 - 4 - read-write - - - I2S3CKSEL - desc I2S3CKSEL - 11 - 8 - read-write - - - I2S4CKSEL - desc I2S4CKSEL - 15 - 12 - read-write - - - - - SCFGR - desc SCFGR - 0x20 - 32 - read-write - 0x0 - 0x7777777 - - - PCLK0S - desc PCLK0S - 2 - 0 - read-write - - - PCLK1S - desc PCLK1S - 6 - 4 - read-write - - - PCLK2S - desc PCLK2S - 10 - 8 - read-write - - - PCLK3S - desc PCLK3S - 14 - 12 - read-write - - - PCLK4S - desc PCLK4S - 18 - 16 - read-write - - - EXCKS - desc EXCKS - 22 - 20 - read-write - - - HCLKS - desc HCLKS - 26 - 24 - read-write - - - - - USBCKCFGR - desc USBCKCFGR - 0x24 - 8 - read-write - 0x40 - 0xF0 - - - USBCKS - desc USBCKS - 7 - 4 - read-write - - - - - CKSWR - desc CKSWR - 0x26 - 8 - read-write - 0x1 - 0x7 - - - CKSW - desc CKSW - 2 - 0 - read-write - - - - - PLLCR - desc PLLCR - 0x2A - 8 - read-write - 0x1 - 0x1 - - - MPLLOFF - desc MPLLOFF - 0 - 0 - read-write - - - - - UPLLCR - desc UPLLCR - 0x2E - 8 - read-write - 0x1 - 0x1 - - - UPLLOFF - desc UPLLOFF - 0 - 0 - read-write - - - - - XTALCR - desc XTALCR - 0x32 - 8 - read-write - 0x1 - 0x1 - - - XTALSTP - desc XTALSTP - 0 - 0 - read-write - - - - - HRCCR - desc HRCCR - 0x36 - 8 - read-write - 0x1 - 0x1 - - - HRCSTP - desc HRCSTP - 0 - 0 - read-write - - - - - MRCCR - desc MRCCR - 0x38 - 8 - read-write - 0x80 - 0x1 - - - MRCSTP - desc MRCSTP - 0 - 0 - read-write - - - - - OSCSTBSR - desc OSCSTBSR - 0x3C - 8 - read-write - 0x0 - 0x69 - - - HRCSTBF - desc HRCSTBF - 0 - 0 - read-write - - - XTALSTBF - desc XTALSTBF - 3 - 3 - read-write - - - MPLLSTBF - desc MPLLSTBF - 5 - 5 - read-write - - - UPLLSTBF - desc UPLLSTBF - 6 - 6 - read-write - - - - - MCOCFGR1 - desc MCOCFGR1 - 0x3D - 8 - read-write - 0x0 - 0xFF - - - MCOSEL - desc MCOSEL - 3 - 0 - read-write - - - MCODIV - desc MCODIV - 6 - 4 - read-write - - - MCOEN - desc MCOEN - 7 - 7 - read-write - - - - - MCOCFGR2 - desc MCOCFGR2 - 0x3E - 8 - read-write - 0x0 - 0xFF - - - MCOSEL - desc MCOSEL - 3 - 0 - read-write - - - MCODIV - desc MCODIV - 6 - 4 - read-write - - - MCOEN - desc MCOEN - 7 - 7 - read-write - - - - - TPIUCKCFGR - desc TPIUCKCFGR - 0x3F - 8 - read-write - 0x0 - 0x83 - - - TPIUCKS - desc TPIUCKS - 1 - 0 - read-write - - - TPIUCKOE - desc TPIUCKOE - 7 - 7 - read-write - - - - - XTALSTDCR - desc XTALSTDCR - 0x40 - 8 - read-write - 0x0 - 0x87 - - - XTALSTDIE - desc XTALSTDIE - 0 - 0 - read-write - - - XTALSTDRE - desc XTALSTDRE - 1 - 1 - read-write - - - XTALSTDRIS - desc XTALSTDRIS - 2 - 2 - read-write - - - XTALSTDE - desc XTALSTDE - 7 - 7 - read-write - - - - - XTALSTDSR - desc XTALSTDSR - 0x41 - 8 - read-write - 0x0 - 0x1 - - - XTALSTDF - desc XTALSTDF - 0 - 0 - read-write - - - - - MRCTRM - desc MRCTRM - 0x61 - 8 - read-write - 0x0 - 0xFF - - - HRCTRM - desc HRCTRM - 0x62 - 8 - read-write - 0x0 - 0xFF - - - XTALSTBCR - desc XTALSTBCR - 0xA2 - 8 - read-write - 0x5 - 0xF - - - XTALSTB - desc XTALSTB - 3 - 0 - read-write - - - - - PLLCFGR - desc PLLCFGR - 0x100 - 32 - read-write - 0x11101300 - 0xFFF1FF9F - - - MPLLM - desc MPLLM - 4 - 0 - read-write - - - PLLSRC - desc PLLSRC - 7 - 7 - read-write - - - MPLLN - desc MPLLN - 16 - 8 - read-write - - - MPLLR - desc MPLLR - 23 - 20 - read-write - - - MPLLQ - desc MPLLQ - 27 - 24 - read-write - - - MPLLP - desc MPLLP - 31 - 28 - read-write - - - - - UPLLCFGR - desc UPLLCFGR - 0x104 - 32 - read-write - 0x11101300 - 0xFFF1FF1F - - - UPLLM - desc UPLLM - 4 - 0 - read-write - - - UPLLN - desc UPLLN - 16 - 8 - read-write - - - UPLLR - desc UPLLR - 23 - 20 - read-write - - - UPLLQ - desc UPLLQ - 27 - 24 - read-write - - - UPLLP - desc UPLLP - 31 - 28 - read-write - - - - - XTALCFGR - desc XTALCFGR - 0x410 - 8 - read-write - 0x80 - 0xF0 - - - XTALDRV - desc XTALDRV - 5 - 4 - read-write - - - XTALMS - desc XTALMS - 6 - 6 - read-write - - - SUPDRV - desc SUPDRV - 7 - 7 - read-write - - - - - XTAL32CR - desc XTAL32CR - 0x420 - 8 - read-write - 0x0 - 0x1 - - - XTAL32STP - desc XTAL32STP - 0 - 0 - read-write - - - - - XTAL32CFGR - desc XTAL32CFGR - 0x421 - 8 - read-write - 0x0 - 0x7 - - - XTAL32DRV - desc XTAL32DRV - 2 - 0 - read-write - - - - - XTAL32NFR - desc XTAL32NFR - 0x425 - 8 - read-write - 0x0 - 0x3 - - - XTAL32NF - desc XTAL32NF - 1 - 0 - read-write - - - - - LRCCR - desc LRCCR - 0x427 - 8 - read-write - 0x0 - 0x1 - - - LRCSTP - desc LRCSTP - 0 - 0 - read-write - - - - - LRCTRM - desc LRCTRM - 0x429 - 8 - read-write - 0x0 - 0xFF - - - - - CRC - desc CRC - 0x40008C00 - - 0x0 - 0x100 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x1C - 0x1E - - - CR - desc CR - 1 - 1 - read-write - - - REFIN - desc REFIN - 2 - 2 - read-write - - - REFOUT - desc REFOUT - 3 - 3 - read-write - - - XOROUT - desc XOROUT - 4 - 4 - read-write - - - - - RESLT - desc RESLT - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CRC_REG - desc CRC_REG - 15 - 0 - read-write - - - CRCFLAG_16 - desc CRCFLAG_16 - 16 - 16 - read-only - - - - - FLG - desc FLG - 0xC - 32 - read-only - 0x1 - 0x1 - - - CRCFLAG_32 - desc CRCFLAG_32 - 0 - 0 - read-only - - - - - DAT0 - desc DAT0 - 0x80 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT1 - desc DAT1 - 0x84 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT2 - desc DAT2 - 0x88 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT3 - desc DAT3 - 0x8C - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT4 - desc DAT4 - 0x90 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT5 - desc DAT5 - 0x94 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT6 - desc DAT6 - 0x98 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT7 - desc DAT7 - 0x9C - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT8 - desc DAT8 - 0xA0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT9 - desc DAT9 - 0xA4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT10 - desc DAT10 - 0xA8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT11 - desc DAT11 - 0xAC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT12 - desc DAT12 - 0xB0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT13 - desc DAT13 - 0xB4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT14 - desc DAT14 - 0xB8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT15 - desc DAT15 - 0xBC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT16 - desc DAT16 - 0xC0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT17 - desc DAT17 - 0xC4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT18 - desc DAT18 - 0xC8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT19 - desc DAT19 - 0xCC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT20 - desc DAT20 - 0xD0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT21 - desc DAT21 - 0xD4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT22 - desc DAT22 - 0xD8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT23 - desc DAT23 - 0xDC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT24 - desc DAT24 - 0xE0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT25 - desc DAT25 - 0xE4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT26 - desc DAT26 - 0xE8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT27 - desc DAT27 - 0xEC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT28 - desc DAT28 - 0xF0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT29 - desc DAT29 - 0xF4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT30 - desc DAT30 - 0xF8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT31 - desc DAT31 - 0xFC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - - - DBGC - desc DBGC - 0xE0042000 - - 0x0 - 0x28 - - - - AUTHID0 - desc AUTHID0 - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - AUTHID1 - desc AUTHID1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - AUTHID2 - desc AUTHID2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RESV0 - desc RESV0 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MCUSTAT - desc MCUSTAT - 0x10 - 32 - read-write - 0x0 - 0x30F - - - AUTH - desc AUTH - 0 - 0 - read-write - - - REMVLOCK - desc REMVLOCK - 1 - 1 - read-write - - - SAFTYLOCK1 - desc SAFTYLOCK1 - 2 - 2 - read-write - - - SAFTYLOCK2 - desc SAFTYLOCK2 - 3 - 3 - read-write - - - CPUSTOP - desc CPUSTOP - 8 - 8 - read-write - - - CPUSLEEP - desc CPUSLEEP - 9 - 9 - read-write - - - - - MCUCTL - desc MCUCTL - 0x14 - 32 - read-write - 0x0 - 0x103 - - - EDBGRQ - desc EDBGRQ - 0 - 0 - read-write - - - RESTART - desc RESTART - 1 - 1 - read-write - - - DIRQ - desc DIRQ - 8 - 8 - read-write - - - - - FMCCTL - desc FMCCTL - 0x18 - 32 - read-write - 0x0 - 0x7 - - - ERASEREQ - desc ERASEREQ - 0 - 0 - read-write - - - ERASEACK - desc ERASEACK - 1 - 1 - read-write - - - ERASEERR - desc ERASEERR - 2 - 2 - read-write - - - - - MCUDBGSTAT - desc MCUDBGSTAT - 0x1C - 32 - read-write - 0x0 - 0x3 - - - CDBGPWRUPREQ - desc CDBGPWRUPREQ - 0 - 0 - read-write - - - CDBGPWRUPACK - desc CDBGPWRUPACK - 1 - 1 - read-write - - - - - MCUSTPCTL - desc MCUSTPCTL - 0x20 - 32 - read-write - 0x3 - 0xFFF0C03F - - - SWDTSTP - desc SWDTSTP - 0 - 0 - read-write - - - WDTSTP - desc WDTSTP - 1 - 1 - read-write - - - RTCSTP - desc RTCSTP - 2 - 2 - read-write - - - PVD0STP - desc PVD0STP - 3 - 3 - read-write - - - PVD1STP - desc PVD1STP - 4 - 4 - read-write - - - PVD2STP - desc PVD2STP - 5 - 5 - read-write - - - TMR01STP - desc TMR01STP - 14 - 14 - read-write - - - TMR02STP - desc TMR02STP - 15 - 15 - read-write - - - TMR41STP - desc TMR41STP - 20 - 20 - read-write - - - TMR42STP - desc TMR42STP - 21 - 21 - read-write - - - TMR43STP - desc TMR43STP - 22 - 22 - read-write - - - TM61STP - desc TM61STP - 23 - 23 - read-write - - - TM62STP - desc TM62STP - 24 - 24 - read-write - - - TMR63STP - desc TMR63STP - 25 - 25 - read-write - - - TMRA1STP - desc TMRA1STP - 26 - 26 - read-write - - - TMRA2STP - desc TMRA2STP - 27 - 27 - read-write - - - TMRA3STP - desc TMRA3STP - 28 - 28 - read-write - - - TMRA4STP - desc TMRA4STP - 29 - 29 - read-write - - - TMRA5STP - desc TMRA5STP - 30 - 30 - read-write - - - TMRA6STP - desc TMRA6STP - 31 - 31 - read-write - - - - - MCUTRACECTL - desc MCUTRACECTL - 0x24 - 32 - read-write - 0x0 - 0x7 - - - TRACEMODE - desc TRACEMODE - 1 - 0 - read-write - - - TRACEIOEN - desc TRACEIOEN - 2 - 2 - read-write - - - - - - - DCU1 - desc DCU - 0x40052000 - - 0x0 - 0x1C - - - - CTL - desc CTL - 0x0 - 32 - read-write - 0x80000000 - 0x8000011F - - - MODE - desc MODE - 2 - 0 - read-write - - - DATASIZE - desc DATASIZE - 4 - 3 - read-write - - - COMP_TRG - desc COMP_TRG - 8 - 8 - read-write - - - INTEN - desc INTEN - 31 - 31 - read-write - - - - - FLAG - desc FLAG - 0x4 - 32 - read-only - 0x0 - 0x7F - - - FLAG_OP - desc FLAG_OP - 0 - 0 - read-only - - - FLAG_LS2 - desc FLAG_LS2 - 1 - 1 - read-only - - - FLAG_EQ2 - desc FLAG_EQ2 - 2 - 2 - read-only - - - FLAG_GT2 - desc FLAG_GT2 - 3 - 3 - read-only - - - FLAG_LS1 - desc FLAG_LS1 - 4 - 4 - read-only - - - FLAG_EQ1 - desc FLAG_EQ1 - 5 - 5 - read-only - - - FLAG_GT1 - desc FLAG_GT1 - 6 - 6 - read-only - - - - - DATA0 - desc DATA0 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA1 - desc DATA1 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA2 - desc DATA2 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FLAGCLR - desc FLAGCLR - 0x14 - 32 - write-only - 0x0 - 0x7F - - - CLR_OP - desc CLR_OP - 0 - 0 - write-only - - - CLR_LS2 - desc CLR_LS2 - 1 - 1 - write-only - - - CLR_EQ2 - desc CLR_EQ2 - 2 - 2 - write-only - - - CLR_GT2 - desc CLR_GT2 - 3 - 3 - write-only - - - CLR_LS1 - desc CLR_LS1 - 4 - 4 - write-only - - - CLR_EQ1 - desc CLR_EQ1 - 5 - 5 - write-only - - - CLR_GT1 - desc CLR_GT1 - 6 - 6 - write-only - - - - - INTSEL - desc INTSEL - 0x18 - 32 - read-write - 0x0 - 0x1FF - - - INT_OP - desc INT_OP - 0 - 0 - read-write - - - INT_LS2 - desc INT_LS2 - 1 - 1 - read-write - - - INT_EQ2 - desc INT_EQ2 - 2 - 2 - read-write - - - INT_GT2 - desc INT_GT2 - 3 - 3 - read-write - - - INT_LS1 - desc INT_LS1 - 4 - 4 - read-write - - - INT_EQ1 - desc INT_EQ1 - 5 - 5 - read-write - - - INT_GT1 - desc INT_GT1 - 6 - 6 - read-write - - - INT_WIN - desc INT_WIN - 8 - 7 - read-write - - - - - - - DCU2 - desc DCU - 0x40052400 - - 0x0 - 0x1C - - - - DCU3 - desc DCU - 0x40052800 - - 0x0 - 0x1C - - - - DCU4 - desc DCU - 0x40052C00 - - 0x0 - 0x1C - - - - DMA1 - desc DMA - 0x40053000 - - 0x0 - 0x120 - - - - EN - desc EN - 0x0 - 32 - read-write - 0x0 - 0x1 - - - EN - desc EN - 0 - 0 - read-write - - - - - INTSTAT0 - desc INTSTAT0 - 0x4 - 32 - read-only - 0x0 - 0xF000F - - - TRNERR - desc TRNERR - 3 - 0 - read-only - - - REQERR - desc REQERR - 19 - 16 - read-only - - - - - INTSTAT1 - desc INTSTAT1 - 0x8 - 32 - read-only - 0x0 - 0xF000F - - - TC - desc TC - 3 - 0 - read-only - - - BTC - desc BTC - 19 - 16 - read-only - - - - - INTMASK0 - desc INTMASK0 - 0xC - 32 - read-write - 0x0 - 0xF000F - - - MSKTRNERR - desc MSKTRNERR - 3 - 0 - read-write - - - MSKREQERR - desc MSKREQERR - 19 - 16 - read-write - - - - - INTMASK1 - desc INTMASK1 - 0x10 - 32 - read-write - 0x0 - 0xF000F - - - MSKTC - desc MSKTC - 3 - 0 - read-write - - - MSKBTC - desc MSKBTC - 19 - 16 - read-write - - - - - INTCLR0 - desc INTCLR0 - 0x14 - 32 - write-only - 0x0 - 0xF000F - - - CLRTRNERR - desc CLRTRNERR - 3 - 0 - write-only - - - CLRREQERR - desc CLRREQERR - 19 - 16 - write-only - - - - - INTCLR1 - desc INTCLR1 - 0x18 - 32 - write-only - 0x0 - 0xF000F - - - CLRTC - desc CLRTC - 3 - 0 - write-only - - - CLRBTC - desc CLRBTC - 19 - 16 - write-only - - - - - CHEN - desc CHEN - 0x1C - 32 - read-write - 0x0 - 0xF - - - CHEN - desc CHEN - 3 - 0 - read-write - - - - - REQSTAT - desc REQSTAT - 0x20 - 32 - read-only - 0x0 - 0x800F - - - CHREQ - desc CHREQ - 3 - 0 - read-only - - - RCFGREQ - desc RCFGREQ - 15 - 15 - read-only - - - - - CHSTAT - desc CHSTAT - 0x24 - 32 - read-only - 0x0 - 0xF0003 - - - DMAACT - desc DMAACT - 0 - 0 - read-only - - - RCFGACT - desc RCFGACT - 1 - 1 - read-only - - - CHACT - desc CHACT - 19 - 16 - read-only - - - - - RCFGCTL - desc RCFGCTL - 0x2C - 32 - read-write - 0x0 - 0x3F0F03 - - - RCFGEN - desc RCFGEN - 0 - 0 - read-write - - - RCFGLLP - desc RCFGLLP - 1 - 1 - read-write - - - RCFGCHS - desc RCFGCHS - 11 - 8 - read-write - - - SARMD - desc SARMD - 17 - 16 - read-write - - - DARMD - desc DARMD - 19 - 18 - read-write - - - CNTMD - desc CNTMD - 21 - 20 - read-write - - - - - SAR0 - desc SAR0 - 0x40 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR0 - desc DAR0 - 0x44 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL0 - desc DTCTL0 - 0x48 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT0 - desc RPT0 - 0x4C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB0 - desc RPTB0 - 0x4C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL0 - desc SNSEQCTL0 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB0 - desc SNSEQCTLB0 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL0 - desc DNSEQCTL0 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB0 - desc DNSEQCTLB0 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP0 - desc LLP0 - 0x58 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL0 - desc CHCTL0 - 0x5C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR0 - desc MONSAR0 - 0x60 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR0 - desc MONDAR0 - 0x64 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL0 - desc MONDTCTL0 - 0x68 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT0 - desc MONRPT0 - 0x6C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL0 - desc MONSNSEQCTL0 - 0x70 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL0 - desc MONDNSEQCTL0 - 0x74 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR1 - desc SAR1 - 0x80 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR1 - desc DAR1 - 0x84 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL1 - desc DTCTL1 - 0x88 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT1 - desc RPT1 - 0x8C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB1 - desc RPTB1 - 0x8C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL1 - desc SNSEQCTL1 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB1 - desc SNSEQCTLB1 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL1 - desc DNSEQCTL1 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB1 - desc DNSEQCTLB1 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP1 - desc LLP1 - 0x98 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL1 - desc CHCTL1 - 0x9C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR1 - desc MONSAR1 - 0xA0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR1 - desc MONDAR1 - 0xA4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL1 - desc MONDTCTL1 - 0xA8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT1 - desc MONRPT1 - 0xAC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL1 - desc MONSNSEQCTL1 - 0xB0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL1 - desc MONDNSEQCTL1 - 0xB4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR2 - desc SAR2 - 0xC0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR2 - desc DAR2 - 0xC4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL2 - desc DTCTL2 - 0xC8 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT2 - desc RPT2 - 0xCC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB2 - desc RPTB2 - 0xCC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL2 - desc SNSEQCTL2 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB2 - desc SNSEQCTLB2 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL2 - desc DNSEQCTL2 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB2 - desc DNSEQCTLB2 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP2 - desc LLP2 - 0xD8 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL2 - desc CHCTL2 - 0xDC - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR2 - desc MONSAR2 - 0xE0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR2 - desc MONDAR2 - 0xE4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL2 - desc MONDTCTL2 - 0xE8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT2 - desc MONRPT2 - 0xEC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL2 - desc MONSNSEQCTL2 - 0xF0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL2 - desc MONDNSEQCTL2 - 0xF4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR3 - desc SAR3 - 0x100 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR3 - desc DAR3 - 0x104 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL3 - desc DTCTL3 - 0x108 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT3 - desc RPT3 - 0x10C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB3 - desc RPTB3 - 0x10C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL3 - desc SNSEQCTL3 - 0x110 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB3 - desc SNSEQCTLB3 - 0x110 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL3 - desc DNSEQCTL3 - 0x114 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB3 - desc DNSEQCTLB3 - 0x114 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP3 - desc LLP3 - 0x118 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL3 - desc CHCTL3 - 0x11C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR3 - desc MONSAR3 - 0x120 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR3 - desc MONDAR3 - 0x124 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL3 - desc MONDTCTL3 - 0x128 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT3 - desc MONRPT3 - 0x12C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL3 - desc MONSNSEQCTL3 - 0x130 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL3 - desc MONDNSEQCTL3 - 0x134 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - - - DMA2 - desc DMA - 0x40053400 - - 0x0 - 0x120 - - - - EFM - desc EFM - 0x40010400 - - 0x0 - 0x208 - - - - FAPRT - desc FAPRT - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - FAPRT - desc FAPRT - 15 - 0 - read-write - - - - - FSTP - desc FSTP - 0x4 - 32 - read-write - 0x0 - 0x1 - - - FSTP - desc FSTP - 0 - 0 - read-write - - - - - FRMC - desc FRMC - 0x8 - 32 - read-write - 0x0 - 0x10101F1 - - - SLPMD - desc SLPMD - 0 - 0 - read-write - - - FLWT - desc FLWT - 7 - 4 - read-write - - - LVM - desc LVM - 8 - 8 - read-write - - - CACHE - desc CACHE - 16 - 16 - read-write - - - CRST - desc CRST - 24 - 24 - read-write - - - - - FWMC - desc FWMC - 0xC - 32 - read-write - 0x0 - 0x171 - - - PEMODE - desc PEMODE - 0 - 0 - read-write - - - PEMOD - desc PEMOD - 6 - 4 - read-write - - - BUSHLDCTL - desc BUSHLDCTL - 8 - 8 - read-write - - - - - FSR - desc FSR - 0x10 - 32 - read-only - 0x100 - 0x13F - - - PEWERR - desc PEWERR - 0 - 0 - read-only - - - PEPRTERR - desc PEPRTERR - 1 - 1 - read-only - - - PGSZERR - desc PGSZERR - 2 - 2 - read-only - - - PGMISMTCH - desc PGMISMTCH - 3 - 3 - read-only - - - OPTEND - desc OPTEND - 4 - 4 - read-only - - - COLERR - desc COLERR - 5 - 5 - read-only - - - RDY - desc RDY - 8 - 8 - read-only - - - - - FSCLR - desc FSCLR - 0x14 - 32 - read-write - 0x0 - 0x3F - - - PEWERRCLR - desc PEWERRCLR - 0 - 0 - read-write - - - PEPRTERRCLR - desc PEPRTERRCLR - 1 - 1 - read-write - - - PGSZERRCLR - desc PGSZERRCLR - 2 - 2 - read-write - - - PGMISMTCHCLR - desc PGMISMTCHCLR - 3 - 3 - read-write - - - OPTENDCLR - desc OPTENDCLR - 4 - 4 - read-write - - - COLERRCLR - desc COLERRCLR - 5 - 5 - read-write - - - - - FITE - desc FITE - 0x18 - 32 - read-write - 0x0 - 0x7 - - - PEERRITE - desc PEERRITE - 0 - 0 - read-write - - - OPTENDITE - desc OPTENDITE - 1 - 1 - read-write - - - COLERRITE - desc COLERRITE - 2 - 2 - read-write - - - - - FSWP - desc FSWP - 0x1C - 32 - read-only - 0x1 - 0x1 - - - FSWP - desc FSWP - 0 - 0 - read-only - - - - - FPMTSW - desc FPMTSW - 0x20 - 32 - read-write - 0x0 - 0x7FFFF - - - FPMTSW - desc FPMTSW - 18 - 0 - read-write - - - - - FPMTEW - desc FPMTEW - 0x24 - 32 - read-write - 0x0 - 0x7FFFF - - - FPMTEW - desc FPMTEW - 18 - 0 - read-write - - - - - UQID0 - desc UQID0 - 0x50 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - UQID1 - desc UQID1 - 0x54 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - UQID2 - desc UQID2 - 0x58 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MMF_REMPRT - desc MMF_REMPRT - 0x100 - 32 - read-write - 0x0 - 0xFFFF - - - REMPRT - desc REMPRT - 15 - 0 - read-write - - - - - MMF_REMCR0 - desc MMF_REMCR0 - 0x104 - 32 - read-write - 0x0 - 0x9FFFF01F - - - RMSIZE - desc RMSIZE - 4 - 0 - read-write - - - RMTADDR - desc RMTADDR - 28 - 12 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - MMF_REMCR1 - desc MMF_REMCR1 - 0x108 - 32 - read-write - 0x0 - 0x9FFFF01F - - - RMSIZE - desc RMSIZE - 4 - 0 - read-write - - - RMTADDR - desc RMTADDR - 28 - 12 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - - - EMB0 - desc EMB - 0x40017C00 - - 0x0 - 0x18 - - - - CTL - desc CTL - 0x0 - 32 - read-write - 0x0 - 0xF00001EF - - - PORTINEN - desc PORTINEN - 0 - 0 - read-write - - - CMPEN0 - desc CMPEN0 - 1 - 1 - read-write - - - CMPEN1 - desc CMPEN1 - 2 - 2 - read-write - - - CMPEN2 - desc CMPEN2 - 3 - 3 - read-write - - - OSCSTPEN - desc OSCSTPEN - 5 - 5 - read-write - - - PWMSEN0 - desc PWMSEN0 - 6 - 6 - read-write - - - PWMSEN1 - desc PWMSEN1 - 7 - 7 - read-write - - - PWMSEN2 - desc PWMSEN2 - 8 - 8 - read-write - - - NFSEL - desc NFSEL - 29 - 28 - read-write - - - NFEN - desc NFEN - 30 - 30 - read-write - - - INVSEL - desc INVSEL - 31 - 31 - read-write - - - - - PWMLV - desc PWMLV - 0x4 - 32 - read-write - 0x0 - 0x7 - - - PWMLV0 - desc PWMLV0 - 0 - 0 - read-write - - - PWMLV1 - desc PWMLV1 - 1 - 1 - read-write - - - PWMLV2 - desc PWMLV2 - 2 - 2 - read-write - - - - - SOE - desc SOE - 0x8 - 32 - read-write - 0x0 - 0x1 - - - SOE - desc SOE - 0 - 0 - read-write - - - - - STAT - desc STAT - 0xC - 32 - read-only - 0x0 - 0x3F - - - PORTINF - desc PORTINF - 0 - 0 - read-only - - - PWMSF - desc PWMSF - 1 - 1 - read-only - - - CMPF - desc CMPF - 2 - 2 - read-only - - - OSF - desc OSF - 3 - 3 - read-only - - - PORTINST - desc PORTINST - 4 - 4 - read-only - - - PWMST - desc PWMST - 5 - 5 - read-only - - - - - STATCLR - desc STATCLR - 0x10 - 32 - write-only - 0x0 - 0xF - - - PORTINFCLR - desc PORTINFCLR - 0 - 0 - write-only - - - PWMSFCLR - desc PWMSFCLR - 1 - 1 - write-only - - - CMPFCLR - desc CMPFCLR - 2 - 2 - write-only - - - OSFCLR - desc OSFCLR - 3 - 3 - write-only - - - - - INTEN - desc INTEN - 0x14 - 32 - read-write - 0x0 - 0xF - - - PORTINTEN - desc PORTINTEN - 0 - 0 - read-write - - - PWMINTEN - desc PWMINTEN - 1 - 1 - read-write - - - CMPINTEN - desc CMPINTEN - 2 - 2 - read-write - - - OSINTEN - desc OSINTEN - 3 - 3 - read-write - - - - - - - EMB1 - desc EMB - 0x40017C20 - - 0x0 - 0x18 - - - - EMB2 - desc EMB - 0x40017C40 - - 0x0 - 0x18 - - - - EMB3 - desc EMB - 0x40017C60 - - 0x0 - 0x18 - - - - FCM - desc FCM - 0x40048400 - - 0x0 - 0x24 - - - - LVR - desc LVR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - LVR - desc LVR - 15 - 0 - read-write - - - - - UVR - desc UVR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - UVR - desc UVR - 15 - 0 - read-write - - - - - CNTR - desc CNTR - 0x8 - 32 - read-only - 0x0 - 0xFFFF - - - CNTR - desc CNTR - 15 - 0 - read-only - - - - - STR - desc STR - 0xC - 32 - read-write - 0x0 - 0x1 - - - START - desc START - 0 - 0 - read-write - - - - - MCCR - desc MCCR - 0x10 - 32 - read-write - 0x0 - 0xF3 - - - MDIVS - desc MDIVS - 1 - 0 - read-write - - - MCKS - desc MCKS - 7 - 4 - read-write - - - - - RCCR - desc RCCR - 0x14 - 32 - read-write - 0x0 - 0xB3FB - - - RDIVS - desc RDIVS - 1 - 0 - read-write - - - RCKS - desc RCKS - 6 - 3 - read-write - - - INEXS - desc INEXS - 7 - 7 - read-write - - - DNFS - desc DNFS - 9 - 8 - read-write - - - EDGES - desc EDGES - 13 - 12 - read-write - - - EXREFE - desc EXREFE - 15 - 15 - read-write - - - - - RIER - desc RIER - 0x18 - 32 - read-write - 0x0 - 0x97 - - - ERRIE - desc ERRIE - 0 - 0 - read-write - - - MENDIE - desc MENDIE - 1 - 1 - read-write - - - OVFIE - desc OVFIE - 2 - 2 - read-write - - - ERRINTRS - desc ERRINTRS - 4 - 4 - read-write - - - ERRE - desc ERRE - 7 - 7 - read-write - - - - - SR - desc SR - 0x1C - 32 - read-only - 0x0 - 0x7 - - - ERRF - desc ERRF - 0 - 0 - read-only - - - MENDF - desc MENDF - 1 - 1 - read-only - - - OVF - desc OVF - 2 - 2 - read-only - - - - - CLR - desc CLR - 0x20 - 32 - write-only - 0x0 - 0x7 - - - ERRFCLR - desc ERRFCLR - 0 - 0 - write-only - - - MENDFCLR - desc MENDFCLR - 1 - 1 - write-only - - - OVFCLR - desc OVFCLR - 2 - 2 - write-only - - - - - - - GPIO - desc GPIO - 0x40053800 - - 0x0 - 0x54C - - - - PIDRA - desc PIDRA - 0x0 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRA - desc PODRA - 0x4 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERA - desc POERA - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRA - desc POSRA - 0x8 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRA - desc PORRA - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRA - desc POTRA - 0xC - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRB - desc PIDRB - 0x10 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRB - desc PODRB - 0x14 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERB - desc POERB - 0x16 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRB - desc POSRB - 0x18 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRB - desc PORRB - 0x1A - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRB - desc POTRB - 0x1C - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRC - desc PIDRC - 0x20 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRC - desc PODRC - 0x24 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERC - desc POERC - 0x26 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRC - desc POSRC - 0x28 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRC - desc PORRC - 0x2A - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRC - desc POTRC - 0x2C - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRD - desc PIDRD - 0x30 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRD - desc PODRD - 0x34 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERD - desc POERD - 0x36 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRD - desc POSRD - 0x38 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRD - desc PORRD - 0x3A - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRD - desc POTRD - 0x3C - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRE - desc PIDRE - 0x40 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRE - desc PODRE - 0x44 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERE - desc POERE - 0x46 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRE - desc POSRE - 0x48 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRE - desc PORRE - 0x4A - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRE - desc POTRE - 0x4C - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRH - desc PIDRH - 0x50 - 16 - read-only - 0x0 - 0x7 - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - - - PODRH - desc PODRH - 0x54 - 16 - read-write - 0x0 - 0x7 - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - - - POERH - desc POERH - 0x56 - 16 - read-write - 0x0 - 0x7 - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - - - POSRH - desc POSRH - 0x58 - 16 - read-write - 0x0 - 0x7 - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - - - PORRH - desc PORRH - 0x5A - 16 - read-write - 0x0 - 0x7 - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - - - POTRH - desc POTRH - 0x5C - 16 - read-write - 0x0 - 0x7 - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - - - PSPCR - desc PSPCR - 0x3F4 - 16 - read-write - 0x0 - 0x1F - - - SPFE - desc SPFE - 4 - 0 - read-write - - - - - PCCR - desc PCCR - 0x3F8 - 16 - read-write - 0x0 - 0xC00F - - - BFSEL - desc BFSEL - 3 - 0 - read-write - - - RDWT - desc RDWT - 15 - 14 - read-write - - - - - PINAER - desc PINAER - 0x3FA - 16 - read-write - 0x0 - 0x3F - - - PINAE - desc PINAE - 5 - 0 - read-write - - - - - PWPR - desc PWPR - 0x3FC - 16 - read-write - 0x0 - 0xFF01 - - - WE - desc WE - 0 - 0 - read-write - - - WP - desc WP - 15 - 8 - write-only - - - - - PCRA0 - desc PCRA0 - 0x400 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA0 - desc PFSRA0 - 0x402 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA1 - desc PCRA1 - 0x404 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA1 - desc PFSRA1 - 0x406 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA2 - desc PCRA2 - 0x408 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA2 - desc PFSRA2 - 0x40A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA3 - desc PCRA3 - 0x40C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA3 - desc PFSRA3 - 0x40E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA4 - desc PCRA4 - 0x410 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA4 - desc PFSRA4 - 0x412 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA5 - desc PCRA5 - 0x414 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA5 - desc PFSRA5 - 0x416 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA6 - desc PCRA6 - 0x418 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA6 - desc PFSRA6 - 0x41A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA7 - desc PCRA7 - 0x41C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA7 - desc PFSRA7 - 0x41E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA8 - desc PCRA8 - 0x420 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA8 - desc PFSRA8 - 0x422 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA9 - desc PCRA9 - 0x424 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA9 - desc PFSRA9 - 0x426 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA10 - desc PCRA10 - 0x428 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA10 - desc PFSRA10 - 0x42A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA11 - desc PCRA11 - 0x42C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA11 - desc PFSRA11 - 0x42E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA12 - desc PCRA12 - 0x430 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA12 - desc PFSRA12 - 0x432 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA13 - desc PCRA13 - 0x434 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA13 - desc PFSRA13 - 0x436 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA14 - desc PCRA14 - 0x438 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA14 - desc PFSRA14 - 0x43A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA15 - desc PCRA15 - 0x43C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA15 - desc PFSRA15 - 0x43E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB0 - desc PCRB0 - 0x440 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB0 - desc PFSRB0 - 0x442 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB1 - desc PCRB1 - 0x444 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB1 - desc PFSRB1 - 0x446 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB2 - desc PCRB2 - 0x448 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB2 - desc PFSRB2 - 0x44A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB3 - desc PCRB3 - 0x44C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB3 - desc PFSRB3 - 0x44E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB4 - desc PCRB4 - 0x450 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB4 - desc PFSRB4 - 0x452 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB5 - desc PCRB5 - 0x454 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB5 - desc PFSRB5 - 0x456 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB6 - desc PCRB6 - 0x458 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB6 - desc PFSRB6 - 0x45A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB7 - desc PCRB7 - 0x45C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB7 - desc PFSRB7 - 0x45E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB8 - desc PCRB8 - 0x460 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB8 - desc PFSRB8 - 0x462 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB9 - desc PCRB9 - 0x464 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB9 - desc PFSRB9 - 0x466 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB10 - desc PCRB10 - 0x468 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB10 - desc PFSRB10 - 0x46A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB11 - desc PCRB11 - 0x46C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB11 - desc PFSRB11 - 0x46E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB12 - desc PCRB12 - 0x470 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB12 - desc PFSRB12 - 0x472 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB13 - desc PCRB13 - 0x474 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB13 - desc PFSRB13 - 0x476 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB14 - desc PCRB14 - 0x478 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB14 - desc PFSRB14 - 0x47A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB15 - desc PCRB15 - 0x47C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB15 - desc PFSRB15 - 0x47E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC0 - desc PCRC0 - 0x480 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC0 - desc PFSRC0 - 0x482 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC1 - desc PCRC1 - 0x484 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC1 - desc PFSRC1 - 0x486 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC2 - desc PCRC2 - 0x488 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC2 - desc PFSRC2 - 0x48A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC3 - desc PCRC3 - 0x48C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC3 - desc PFSRC3 - 0x48E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC4 - desc PCRC4 - 0x490 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC4 - desc PFSRC4 - 0x492 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC5 - desc PCRC5 - 0x494 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC5 - desc PFSRC5 - 0x496 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC6 - desc PCRC6 - 0x498 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC6 - desc PFSRC6 - 0x49A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC7 - desc PCRC7 - 0x49C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC7 - desc PFSRC7 - 0x49E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC8 - desc PCRC8 - 0x4A0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC8 - desc PFSRC8 - 0x4A2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC9 - desc PCRC9 - 0x4A4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC9 - desc PFSRC9 - 0x4A6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC10 - desc PCRC10 - 0x4A8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC10 - desc PFSRC10 - 0x4AA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC11 - desc PCRC11 - 0x4AC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC11 - desc PFSRC11 - 0x4AE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC12 - desc PCRC12 - 0x4B0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC12 - desc PFSRC12 - 0x4B2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC13 - desc PCRC13 - 0x4B4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC13 - desc PFSRC13 - 0x4B6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC14 - desc PCRC14 - 0x4B8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC14 - desc PFSRC14 - 0x4BA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC15 - desc PCRC15 - 0x4BC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC15 - desc PFSRC15 - 0x4BE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD0 - desc PCRD0 - 0x4C0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD0 - desc PFSRD0 - 0x4C2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD1 - desc PCRD1 - 0x4C4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD1 - desc PFSRD1 - 0x4C6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD2 - desc PCRD2 - 0x4C8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD2 - desc PFSRD2 - 0x4CA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD3 - desc PCRD3 - 0x4CC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD3 - desc PFSRD3 - 0x4CE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD4 - desc PCRD4 - 0x4D0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD4 - desc PFSRD4 - 0x4D2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD5 - desc PCRD5 - 0x4D4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD5 - desc PFSRD5 - 0x4D6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD6 - desc PCRD6 - 0x4D8 - 16 - read-write - 0x8100 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD6 - desc PFSRD6 - 0x4DA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD7 - desc PCRD7 - 0x4DC - 16 - read-write - 0x8100 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD7 - desc PFSRD7 - 0x4DE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD8 - desc PCRD8 - 0x4E0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD8 - desc PFSRD8 - 0x4E2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD9 - desc PCRD9 - 0x4E4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD9 - desc PFSRD9 - 0x4E6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD10 - desc PCRD10 - 0x4E8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD10 - desc PFSRD10 - 0x4EA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD11 - desc PCRD11 - 0x4EC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD11 - desc PFSRD11 - 0x4EE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD12 - desc PCRD12 - 0x4F0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD12 - desc PFSRD12 - 0x4F2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD13 - desc PCRD13 - 0x4F4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD13 - desc PFSRD13 - 0x4F6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD14 - desc PCRD14 - 0x4F8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD14 - desc PFSRD14 - 0x4FA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD15 - desc PCRD15 - 0x4FC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD15 - desc PFSRD15 - 0x4FE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE0 - desc PCRE0 - 0x500 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE0 - desc PFSRE0 - 0x502 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE1 - desc PCRE1 - 0x504 - 16 - read-write - 0x40 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE1 - desc PFSRE1 - 0x506 - 16 - read-write - 0xD - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE2 - desc PCRE2 - 0x508 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE2 - desc PFSRE2 - 0x50A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE3 - desc PCRE3 - 0x50C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE3 - desc PFSRE3 - 0x50E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE4 - desc PCRE4 - 0x510 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE4 - desc PFSRE4 - 0x512 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE5 - desc PCRE5 - 0x514 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE5 - desc PFSRE5 - 0x516 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE6 - desc PCRE6 - 0x518 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE6 - desc PFSRE6 - 0x51A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE7 - desc PCRE7 - 0x51C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE7 - desc PFSRE7 - 0x51E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE8 - desc PCRE8 - 0x520 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE8 - desc PFSRE8 - 0x522 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE9 - desc PCRE9 - 0x524 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE9 - desc PFSRE9 - 0x526 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE10 - desc PCRE10 - 0x528 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE10 - desc PFSRE10 - 0x52A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE11 - desc PCRE11 - 0x52C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE11 - desc PFSRE11 - 0x52E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE12 - desc PCRE12 - 0x530 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE12 - desc PFSRE12 - 0x532 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE13 - desc PCRE13 - 0x534 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE13 - desc PFSRE13 - 0x536 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE14 - desc PCRE14 - 0x538 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE14 - desc PFSRE14 - 0x53A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE15 - desc PCRE15 - 0x53C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE15 - desc PFSRE15 - 0x53E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH0 - desc PCRH0 - 0x540 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH0 - desc PFSRH0 - 0x542 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH1 - desc PCRH1 - 0x544 - 16 - read-write - 0x40 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH1 - desc PFSRH1 - 0x546 - 16 - read-write - 0xD - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH2 - desc PCRH2 - 0x548 - 16 - read-write - 0x50 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH2 - desc PFSRH2 - 0x54A - 16 - read-write - 0xD - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - - - HASH - desc HASH - 0x40008400 - - 0x0 - 0x80 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x3 - - - START - desc START - 0 - 0 - read-write - - - FST_GRP - desc FST_GRP - 1 - 1 - read-write - - - - - HR7 - desc HR7 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR6 - desc HR6 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR5 - desc HR5 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR4 - desc HR4 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR3 - desc HR3 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR2 - desc HR2 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR1 - desc HR1 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR0 - desc HR0 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR15 - desc DR15 - 0x40 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR14 - desc DR14 - 0x44 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR13 - desc DR13 - 0x48 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR12 - desc DR12 - 0x4C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR11 - desc DR11 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR10 - desc DR10 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR9 - desc DR9 - 0x58 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR8 - desc DR8 - 0x5C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR7 - desc DR7 - 0x60 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR6 - desc DR6 - 0x64 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR5 - desc DR5 - 0x68 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR4 - desc DR4 - 0x6C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR3 - desc DR3 - 0x70 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR2 - desc DR2 - 0x74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x78 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR0 - desc DR0 - 0x7C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - I2C1 - desc I2C - 0x4004E000 - - 0x0 - 0x34 - - - - CR1 - desc CR1 - 0x0 - 32 - read-write - 0x40 - 0x87DF - - - PE - desc PE - 0 - 0 - read-write - - - SMBUS - desc SMBUS - 1 - 1 - read-write - - - SMBALRTEN - desc SMBALRTEN - 2 - 2 - read-write - - - SMBDEFAULTEN - desc SMBDEFAULTEN - 3 - 3 - read-write - - - SMBHOSTEN - desc SMBHOSTEN - 4 - 4 - read-write - - - GCEN - desc GCEN - 6 - 6 - read-write - - - RESTART - desc RESTART - 7 - 7 - read-write - - - START - desc START - 8 - 8 - read-write - - - STOP - desc STOP - 9 - 9 - read-write - - - ACK - desc ACK - 10 - 10 - read-write - - - SWRST - desc SWRST - 15 - 15 - read-write - - - - - CR2 - desc CR2 - 0x4 - 32 - read-write - 0x0 - 0xF052DF - - - STARTIE - desc STARTIE - 0 - 0 - read-write - - - SLADDR0IE - desc SLADDR0IE - 1 - 1 - read-write - - - SLADDR1IE - desc SLADDR1IE - 2 - 2 - read-write - - - TENDIE - desc TENDIE - 3 - 3 - read-write - - - STOPIE - desc STOPIE - 4 - 4 - read-write - - - RFULLIE - desc RFULLIE - 6 - 6 - read-write - - - TEMPTYIE - desc TEMPTYIE - 7 - 7 - read-write - - - ARLOIE - desc ARLOIE - 9 - 9 - read-write - - - NACKIE - desc NACKIE - 12 - 12 - read-write - - - TMOUTIE - desc TMOUTIE - 14 - 14 - read-write - - - GENCALLIE - desc GENCALLIE - 20 - 20 - read-write - - - SMBDEFAULTIE - desc SMBDEFAULTIE - 21 - 21 - read-write - - - SMBHOSTIE - desc SMBHOSTIE - 22 - 22 - read-write - - - SMBALRTIE - desc SMBALRTIE - 23 - 23 - read-write - - - - - CR3 - desc CR3 - 0x8 - 32 - read-write - 0x6 - 0x87 - - - TMOUTEN - desc TMOUTEN - 0 - 0 - read-write - - - LTMOUT - desc LTMOUT - 1 - 1 - read-write - - - HTMOUT - desc HTMOUT - 2 - 2 - read-write - - - FACKEN - desc FACKEN - 7 - 7 - read-write - - - - - CR4 - desc CR4 - 0xC - 32 - read-write - 0x300307 - 0x400 - - - BUSWAIT - desc BUSWAIT - 10 - 10 - read-write - - - - - SLR0 - desc SLR0 - 0x10 - 32 - read-write - 0x1000 - 0x93FF - - - SLADDR0 - desc SLADDR0 - 9 - 0 - read-write - - - SLADDR0EN - desc SLADDR0EN - 12 - 12 - read-write - - - ADDRMOD0 - desc ADDRMOD0 - 15 - 15 - read-write - - - - - SLR1 - desc SLR1 - 0x14 - 32 - read-write - 0x0 - 0x93FF - - - SLADDR1 - desc SLADDR1 - 9 - 0 - read-write - - - SLADDR1EN - desc SLADDR1EN - 12 - 12 - read-write - - - ADDRMOD1 - desc ADDRMOD1 - 15 - 15 - read-write - - - - - SLTR - desc SLTR - 0x18 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - TOUTLOW - desc TOUTLOW - 15 - 0 - read-write - - - TOUTHIGH - desc TOUTHIGH - 31 - 16 - read-write - - - - - SR - desc SR - 0x1C - 32 - read-write - 0x0 - 0xF756DF - - - STARTF - desc STARTF - 0 - 0 - read-write - - - SLADDR0F - desc SLADDR0F - 1 - 1 - read-write - - - SLADDR1F - desc SLADDR1F - 2 - 2 - read-write - - - TENDF - desc TENDF - 3 - 3 - read-write - - - STOPF - desc STOPF - 4 - 4 - read-write - - - RFULLF - desc RFULLF - 6 - 6 - read-write - - - TEMPTYF - desc TEMPTYF - 7 - 7 - read-write - - - ARLOF - desc ARLOF - 9 - 9 - read-write - - - ACKRF - desc ACKRF - 10 - 10 - read-write - - - NACKF - desc NACKF - 12 - 12 - read-write - - - TMOUTF - desc TMOUTF - 14 - 14 - read-write - - - MSL - desc MSL - 16 - 16 - read-write - - - BUSY - desc BUSY - 17 - 17 - read-write - - - TRA - desc TRA - 18 - 18 - read-write - - - GENCALLF - desc GENCALLF - 20 - 20 - read-write - - - SMBDEFAULTF - desc SMBDEFAULTF - 21 - 21 - read-write - - - SMBHOSTF - desc SMBHOSTF - 22 - 22 - read-write - - - SMBALRTF - desc SMBALRTF - 23 - 23 - read-write - - - - - CLR - desc CLR - 0x20 - 32 - write-only - 0x0 - 0xF052DF - - - STARTFCLR - desc STARTFCLR - 0 - 0 - write-only - - - SLADDR0FCLR - desc SLADDR0FCLR - 1 - 1 - write-only - - - SLADDR1FCLR - desc SLADDR1FCLR - 2 - 2 - write-only - - - TENDFCLR - desc TENDFCLR - 3 - 3 - write-only - - - STOPFCLR - desc STOPFCLR - 4 - 4 - write-only - - - RFULLFCLR - desc RFULLFCLR - 6 - 6 - write-only - - - TEMPTYFCLR - desc TEMPTYFCLR - 7 - 7 - write-only - - - ARLOFCLR - desc ARLOFCLR - 9 - 9 - write-only - - - NACKFCLR - desc NACKFCLR - 12 - 12 - write-only - - - TMOUTFCLR - desc TMOUTFCLR - 14 - 14 - write-only - - - GENCALLFCLR - desc GENCALLFCLR - 20 - 20 - write-only - - - SMBDEFAULTFCLR - desc SMBDEFAULTFCLR - 21 - 21 - write-only - - - SMBHOSTFCLR - desc SMBHOSTFCLR - 22 - 22 - write-only - - - SMBALRTFCLR - desc SMBALRTFCLR - 23 - 23 - write-only - - - - - DTR - desc DTR - 0x24 - 8 - write-only - 0xFF - 0xFF - - - DT - desc DT - 7 - 0 - write-only - - - - - DRR - desc DRR - 0x28 - 8 - read-only - 0x0 - 0xFF - - - DR - desc DR - 7 - 0 - read-only - - - - - CCR - desc CCR - 0x2C - 32 - read-write - 0x1F1F - 0x71F1F - - - SLOWW - desc SLOWW - 4 - 0 - read-write - - - SHIGHW - desc SHIGHW - 12 - 8 - read-write - - - FREQ - desc FREQ - 18 - 16 - read-write - - - - - FLTR - desc FLTR - 0x30 - 32 - read-write - 0x10 - 0x33 - - - DNF - desc DNF - 1 - 0 - read-write - - - DNFEN - desc DNFEN - 4 - 4 - read-write - - - ANFEN - desc ANFEN - 5 - 5 - read-write - - - - - - - I2C2 - desc I2C - 0x4004E400 - - 0x0 - 0x34 - - - - I2C3 - desc I2C - 0x4004E800 - - 0x0 - 0x34 - - - - I2S1 - desc I2S - 0x4001E000 - - 0x0 - 0x1C - - - - CTRL - desc CTRL - 0x0 - 32 - read-write - 0x2200 - 0xFF77FF - - - TXE - desc TXE - 0 - 0 - read-write - - - TXIE - desc TXIE - 1 - 1 - read-write - - - RXE - desc RXE - 2 - 2 - read-write - - - RXIE - desc RXIE - 3 - 3 - read-write - - - EIE - desc EIE - 4 - 4 - read-write - - - WMS - desc WMS - 5 - 5 - read-write - - - ODD - desc ODD - 6 - 6 - read-write - - - MCKOE - desc MCKOE - 7 - 7 - read-write - - - TXBIRQWL - desc TXBIRQWL - 10 - 8 - read-write - - - RXBIRQWL - desc RXBIRQWL - 14 - 12 - read-write - - - FIFOR - desc FIFOR - 16 - 16 - read-write - - - CODECRC - desc CODECRC - 17 - 17 - read-write - - - I2SPLLSEL - desc I2SPLLSEL - 18 - 18 - read-write - - - SDOE - desc SDOE - 19 - 19 - read-write - - - LRCKOE - desc LRCKOE - 20 - 20 - read-write - - - CKOE - desc CKOE - 21 - 21 - read-write - - - DUPLEX - desc DUPLEX - 22 - 22 - read-write - - - CLKSEL - desc CLKSEL - 23 - 23 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-only - 0x14 - 0x3F - - - TXBA - desc TXBA - 0 - 0 - read-only - - - RXBA - desc RXBA - 1 - 1 - read-only - - - TXBE - desc TXBE - 2 - 2 - read-only - - - TXBF - desc TXBF - 3 - 3 - read-only - - - RXBE - desc RXBE - 4 - 4 - read-only - - - RXBF - desc RXBF - 5 - 5 - read-only - - - - - ER - desc ER - 0x8 - 32 - read-write - 0x0 - 0x3 - - - TXERR - desc TXERR - 0 - 0 - read-write - - - RXERR - desc RXERR - 1 - 1 - read-write - - - - - CFGR - desc CFGR - 0xC - 32 - read-write - 0x0 - 0x3F - - - I2SSTD - desc I2SSTD - 1 - 0 - read-write - - - DATLEN - desc DATLEN - 3 - 2 - read-write - - - CHLEN - desc CHLEN - 4 - 4 - read-write - - - PCMSYNC - desc PCMSYNC - 5 - 5 - read-write - - - - - TXBUF - desc TXBUF - 0x10 - 32 - write-only - 0x0 - 0xFFFFFFFF - - - RXBUF - desc RXBUF - 0x14 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - PR - desc PR - 0x18 - 32 - read-write - 0x2 - 0xFF - - - I2SDIV - desc I2SDIV - 7 - 0 - read-write - - - - - - - I2S2 - desc I2S - 0x4001E400 - - 0x0 - 0x1C - - - - I2S3 - desc I2S - 0x40022000 - - 0x0 - 0x1C - - - - I2S4 - desc I2S - 0x40022400 - - 0x0 - 0x1C - - - - ICG - desc ICG - 0x00000400 - - 0x0 - 0x20 - - - - ICG0 - desc ICG0 - 0x0 - 32 - read-only - 0xFFFFFFFF - 0x1FFF1FFF - - - SWDTAUTS - desc SWDTAUTS - 0 - 0 - read-only - - - SWDTITS - desc SWDTITS - 1 - 1 - read-only - - - SWDTPERI - desc SWDTPERI - 3 - 2 - read-only - - - SWDTCKS - desc SWDTCKS - 7 - 4 - read-only - - - SWDTWDPT - desc SWDTWDPT - 11 - 8 - read-only - - - SWDTSLPOFF - desc SWDTSLPOFF - 12 - 12 - read-only - - - WDTAUTS - desc WDTAUTS - 16 - 16 - read-only - - - WDTITS - desc WDTITS - 17 - 17 - read-only - - - WDTPERI - desc WDTPERI - 19 - 18 - read-only - - - WDTCKS - desc WDTCKS - 23 - 20 - read-only - - - WDTWDPT - desc WDTWDPT - 27 - 24 - read-only - - - WDTSLPOFF - desc WDTSLPOFF - 28 - 28 - read-only - - - - - ICG1 - desc ICG1 - 0x4 - 32 - read-only - 0xFFFFFFFF - 0xFC070101 - - - HRCFREQSEL - desc HRCFREQSEL - 0 - 0 - read-only - - - HRCSTOP - desc HRCSTOP - 8 - 8 - read-only - - - BOR_LEV - desc BOR_LEV - 17 - 16 - read-only - - - BORDIS - desc BORDIS - 18 - 18 - read-only - - - SMPCLK - desc SMPCLK - 27 - 26 - read-only - - - NMITRG - desc NMITRG - 28 - 28 - read-only - - - NMIEN - desc NMIEN - 29 - 29 - read-only - - - NFEN - desc NFEN - 30 - 30 - read-only - - - NMIICGEN - desc NMIICGEN - 31 - 31 - read-only - - - - - ICG2 - desc ICG2 - 0x8 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG3 - desc ICG3 - 0xC - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG4 - desc ICG4 - 0x10 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG5 - desc ICG5 - 0x14 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG6 - desc ICG6 - 0x18 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG7 - desc ICG7 - 0x1C - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - - - INTC - desc INTC - 0x40051000 - - 0x0 - 0x2A8 - - - - NMICR - desc NMICR - 0x0 - 32 - read-write - 0x0 - 0xB1 - - - NMITRG - desc NMITRG - 0 - 0 - read-write - - - NSMPCLK - desc NSMPCLK - 5 - 4 - read-write - - - NFEN - desc NFEN - 7 - 7 - read-write - - - - - NMIENR - desc NMIENR - 0x4 - 32 - read-write - 0x0 - 0xF2F - - - NMIENR - desc NMIENR - 0 - 0 - read-write - - - SWDTENR - desc SWDTENR - 1 - 1 - read-write - - - PVD1ENR - desc PVD1ENR - 2 - 2 - read-write - - - PVD2ENR - desc PVD2ENR - 3 - 3 - read-write - - - XTALSTPENR - desc XTALSTPENR - 5 - 5 - read-write - - - REPENR - desc REPENR - 8 - 8 - read-write - - - RECCENR - desc RECCENR - 9 - 9 - read-write - - - BUSMENR - desc BUSMENR - 10 - 10 - read-write - - - WDTENR - desc WDTENR - 11 - 11 - read-write - - - - - NMIFR - desc NMIFR - 0x8 - 32 - read-write - 0x0 - 0xF2F - - - NMIFR - desc NMIFR - 0 - 0 - read-write - - - SWDTFR - desc SWDTFR - 1 - 1 - read-write - - - PVD1FR - desc PVD1FR - 2 - 2 - read-write - - - PVD2FR - desc PVD2FR - 3 - 3 - read-write - - - XTALSTPFR - desc XTALSTPFR - 5 - 5 - read-write - - - REPFR - desc REPFR - 8 - 8 - read-write - - - RECCFR - desc RECCFR - 9 - 9 - read-write - - - BUSMFR - desc BUSMFR - 10 - 10 - read-write - - - WDTFR - desc WDTFR - 11 - 11 - read-write - - - - - NMICFR - desc NMICFR - 0xC - 32 - read-write - 0x0 - 0xF2F - - - NMICFR - desc NMICFR - 0 - 0 - read-write - - - SWDTCFR - desc SWDTCFR - 1 - 1 - read-write - - - PVD1CFR - desc PVD1CFR - 2 - 2 - read-write - - - PVD2CFR - desc PVD2CFR - 3 - 3 - read-write - - - XTALSTPCFR - desc XTALSTPCFR - 5 - 5 - read-write - - - REPCFR - desc REPCFR - 8 - 8 - read-write - - - RECCCFR - desc RECCCFR - 9 - 9 - read-write - - - BUSMCFR - desc BUSMCFR - 10 - 10 - read-write - - - WDTCFR - desc WDTCFR - 11 - 11 - read-write - - - - - EIRQCR0 - desc EIRQCR0 - 0x10 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR1 - desc EIRQCR1 - 0x14 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR2 - desc EIRQCR2 - 0x18 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR3 - desc EIRQCR3 - 0x1C - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR4 - desc EIRQCR4 - 0x20 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR5 - desc EIRQCR5 - 0x24 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR6 - desc EIRQCR6 - 0x28 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR7 - desc EIRQCR7 - 0x2C - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR8 - desc EIRQCR8 - 0x30 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR9 - desc EIRQCR9 - 0x34 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR10 - desc EIRQCR10 - 0x38 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR11 - desc EIRQCR11 - 0x3C - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR12 - desc EIRQCR12 - 0x40 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR13 - desc EIRQCR13 - 0x44 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR14 - desc EIRQCR14 - 0x48 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR15 - desc EIRQCR15 - 0x4C - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - WUPEN - desc WUPEN - 0x50 - 32 - read-write - 0x0 - 0x2FFFFFF - - - EIRQWUEN - desc EIRQWUEN - 15 - 0 - read-write - - - SWDTWUEN - desc SWDTWUEN - 16 - 16 - read-write - - - PVD1WUEN - desc PVD1WUEN - 17 - 17 - read-write - - - PVD2WUEN - desc PVD2WUEN - 18 - 18 - read-write - - - CMPI0WUEN - desc CMPI0WUEN - 19 - 19 - read-write - - - WKTMWUEN - desc WKTMWUEN - 20 - 20 - read-write - - - RTCALMWUEN - desc RTCALMWUEN - 21 - 21 - read-write - - - RTCPRDWUEN - desc RTCPRDWUEN - 22 - 22 - read-write - - - TMR0WUEN - desc TMR0WUEN - 23 - 23 - read-write - - - RXWUEN - desc RXWUEN - 25 - 25 - read-write - - - - - EIRQFR - desc EIRQFR - 0x54 - 32 - read-write - 0x0 - 0xFFFF - - - EIRQFR0 - desc EIRQFR0 - 0 - 0 - read-write - - - EIRQFR1 - desc EIRQFR1 - 1 - 1 - read-write - - - EIRQFR2 - desc EIRQFR2 - 2 - 2 - read-write - - - EIRQFR3 - desc EIRQFR3 - 3 - 3 - read-write - - - EIRQFR4 - desc EIRQFR4 - 4 - 4 - read-write - - - EIRQFR5 - desc EIRQFR5 - 5 - 5 - read-write - - - EIRQFR6 - desc EIRQFR6 - 6 - 6 - read-write - - - EIRQFR7 - desc EIRQFR7 - 7 - 7 - read-write - - - EIRQFR8 - desc EIRQFR8 - 8 - 8 - read-write - - - EIRQFR9 - desc EIRQFR9 - 9 - 9 - read-write - - - EIRQFR10 - desc EIRQFR10 - 10 - 10 - read-write - - - EIRQFR11 - desc EIRQFR11 - 11 - 11 - read-write - - - EIRQFR12 - desc EIRQFR12 - 12 - 12 - read-write - - - EIRQFR13 - desc EIRQFR13 - 13 - 13 - read-write - - - EIRQFR14 - desc EIRQFR14 - 14 - 14 - read-write - - - EIRQFR15 - desc EIRQFR15 - 15 - 15 - read-write - - - - - EIRQCFR - desc EIRQCFR - 0x58 - 32 - read-write - 0x0 - 0xFFFF - - - EIRQCFR0 - desc EIRQCFR0 - 0 - 0 - read-write - - - EIRQCFR1 - desc EIRQCFR1 - 1 - 1 - read-write - - - EIRQCFR2 - desc EIRQCFR2 - 2 - 2 - read-write - - - EIRQCFR3 - desc EIRQCFR3 - 3 - 3 - read-write - - - EIRQCFR4 - desc EIRQCFR4 - 4 - 4 - read-write - - - EIRQCFR5 - desc EIRQCFR5 - 5 - 5 - read-write - - - EIRQCFR6 - desc EIRQCFR6 - 6 - 6 - read-write - - - EIRQCFR7 - desc EIRQCFR7 - 7 - 7 - read-write - - - EIRQCFR8 - desc EIRQCFR8 - 8 - 8 - read-write - - - EIRQCFR9 - desc EIRQCFR9 - 9 - 9 - read-write - - - EIRQCFR10 - desc EIRQCFR10 - 10 - 10 - read-write - - - EIRQCFR11 - desc EIRQCFR11 - 11 - 11 - read-write - - - EIRQCFR12 - desc EIRQCFR12 - 12 - 12 - read-write - - - EIRQCFR13 - desc EIRQCFR13 - 13 - 13 - read-write - - - EIRQCFR14 - desc EIRQCFR14 - 14 - 14 - read-write - - - EIRQCFR15 - desc EIRQCFR15 - 15 - 15 - read-write - - - - - SEL0 - desc SEL0 - 0x5C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL1 - desc SEL1 - 0x60 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL2 - desc SEL2 - 0x64 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL3 - desc SEL3 - 0x68 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL4 - desc SEL4 - 0x6C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL5 - desc SEL5 - 0x70 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL6 - desc SEL6 - 0x74 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL7 - desc SEL7 - 0x78 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL8 - desc SEL8 - 0x7C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL9 - desc SEL9 - 0x80 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL10 - desc SEL10 - 0x84 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL11 - desc SEL11 - 0x88 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL12 - desc SEL12 - 0x8C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL13 - desc SEL13 - 0x90 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL14 - desc SEL14 - 0x94 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL15 - desc SEL15 - 0x98 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL16 - desc SEL16 - 0x9C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL17 - desc SEL17 - 0xA0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL18 - desc SEL18 - 0xA4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL19 - desc SEL19 - 0xA8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL20 - desc SEL20 - 0xAC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL21 - desc SEL21 - 0xB0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL22 - desc SEL22 - 0xB4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL23 - desc SEL23 - 0xB8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL24 - desc SEL24 - 0xBC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL25 - desc SEL25 - 0xC0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL26 - desc SEL26 - 0xC4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL27 - desc SEL27 - 0xC8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL28 - desc SEL28 - 0xCC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL29 - desc SEL29 - 0xD0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL30 - desc SEL30 - 0xD4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL31 - desc SEL31 - 0xD8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL32 - desc SEL32 - 0xDC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL33 - desc SEL33 - 0xE0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL34 - desc SEL34 - 0xE4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL35 - desc SEL35 - 0xE8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL36 - desc SEL36 - 0xEC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL37 - desc SEL37 - 0xF0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL38 - desc SEL38 - 0xF4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL39 - desc SEL39 - 0xF8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL40 - desc SEL40 - 0xFC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL41 - desc SEL41 - 0x100 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL42 - desc SEL42 - 0x104 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL43 - desc SEL43 - 0x108 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL44 - desc SEL44 - 0x10C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL45 - desc SEL45 - 0x110 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL46 - desc SEL46 - 0x114 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL47 - desc SEL47 - 0x118 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL48 - desc SEL48 - 0x11C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL49 - desc SEL49 - 0x120 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL50 - desc SEL50 - 0x124 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL51 - desc SEL51 - 0x128 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL52 - desc SEL52 - 0x12C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL53 - desc SEL53 - 0x130 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL54 - desc SEL54 - 0x134 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL55 - desc SEL55 - 0x138 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL56 - desc SEL56 - 0x13C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL57 - desc SEL57 - 0x140 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL58 - desc SEL58 - 0x144 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL59 - desc SEL59 - 0x148 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL60 - desc SEL60 - 0x14C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL61 - desc SEL61 - 0x150 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL62 - desc SEL62 - 0x154 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL63 - desc SEL63 - 0x158 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL64 - desc SEL64 - 0x15C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL65 - desc SEL65 - 0x160 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL66 - desc SEL66 - 0x164 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL67 - desc SEL67 - 0x168 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL68 - desc SEL68 - 0x16C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL69 - desc SEL69 - 0x170 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL70 - desc SEL70 - 0x174 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL71 - desc SEL71 - 0x178 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL72 - desc SEL72 - 0x17C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL73 - desc SEL73 - 0x180 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL74 - desc SEL74 - 0x184 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL75 - desc SEL75 - 0x188 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL76 - desc SEL76 - 0x18C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL77 - desc SEL77 - 0x190 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL78 - desc SEL78 - 0x194 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL79 - desc SEL79 - 0x198 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL80 - desc SEL80 - 0x19C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL81 - desc SEL81 - 0x1A0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL82 - desc SEL82 - 0x1A4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL83 - desc SEL83 - 0x1A8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL84 - desc SEL84 - 0x1AC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL85 - desc SEL85 - 0x1B0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL86 - desc SEL86 - 0x1B4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL87 - desc SEL87 - 0x1B8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL88 - desc SEL88 - 0x1BC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL89 - desc SEL89 - 0x1C0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL90 - desc SEL90 - 0x1C4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL91 - desc SEL91 - 0x1C8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL92 - desc SEL92 - 0x1CC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL93 - desc SEL93 - 0x1D0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL94 - desc SEL94 - 0x1D4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL95 - desc SEL95 - 0x1D8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL96 - desc SEL96 - 0x1DC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL97 - desc SEL97 - 0x1E0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL98 - desc SEL98 - 0x1E4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL99 - desc SEL99 - 0x1E8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL100 - desc SEL100 - 0x1EC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL101 - desc SEL101 - 0x1F0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL102 - desc SEL102 - 0x1F4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL103 - desc SEL103 - 0x1F8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL104 - desc SEL104 - 0x1FC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL105 - desc SEL105 - 0x200 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL106 - desc SEL106 - 0x204 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL107 - desc SEL107 - 0x208 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL108 - desc SEL108 - 0x20C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL109 - desc SEL109 - 0x210 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL110 - desc SEL110 - 0x214 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL111 - desc SEL111 - 0x218 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL112 - desc SEL112 - 0x21C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL113 - desc SEL113 - 0x220 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL114 - desc SEL114 - 0x224 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL115 - desc SEL115 - 0x228 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL116 - desc SEL116 - 0x22C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL117 - desc SEL117 - 0x230 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL118 - desc SEL118 - 0x234 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL119 - desc SEL119 - 0x238 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL120 - desc SEL120 - 0x23C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL121 - desc SEL121 - 0x240 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL122 - desc SEL122 - 0x244 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL123 - desc SEL123 - 0x248 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL124 - desc SEL124 - 0x24C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL125 - desc SEL125 - 0x250 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL126 - desc SEL126 - 0x254 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL127 - desc SEL127 - 0x258 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - VSSEL128 - desc VSSEL128 - 0x25C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL129 - desc VSSEL129 - 0x260 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL130 - desc VSSEL130 - 0x264 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL131 - desc VSSEL131 - 0x268 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL132 - desc VSSEL132 - 0x26C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL133 - desc VSSEL133 - 0x270 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL134 - desc VSSEL134 - 0x274 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL135 - desc VSSEL135 - 0x278 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL136 - desc VSSEL136 - 0x27C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL137 - desc VSSEL137 - 0x280 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL138 - desc VSSEL138 - 0x284 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL139 - desc VSSEL139 - 0x288 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL140 - desc VSSEL140 - 0x28C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL141 - desc VSSEL141 - 0x290 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL142 - desc VSSEL142 - 0x294 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL143 - desc VSSEL143 - 0x298 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - SWIER - desc SWIER - 0x29C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SWIE0 - desc SWIE0 - 0 - 0 - read-write - - - SWIE1 - desc SWIE1 - 1 - 1 - read-write - - - SWIE2 - desc SWIE2 - 2 - 2 - read-write - - - SWIE3 - desc SWIE3 - 3 - 3 - read-write - - - SWIE4 - desc SWIE4 - 4 - 4 - read-write - - - SWIE5 - desc SWIE5 - 5 - 5 - read-write - - - SWIE6 - desc SWIE6 - 6 - 6 - read-write - - - SWIE7 - desc SWIE7 - 7 - 7 - read-write - - - SWIE8 - desc SWIE8 - 8 - 8 - read-write - - - SWIE9 - desc SWIE9 - 9 - 9 - read-write - - - SWIE10 - desc SWIE10 - 10 - 10 - read-write - - - SWIE11 - desc SWIE11 - 11 - 11 - read-write - - - SWIE12 - desc SWIE12 - 12 - 12 - read-write - - - SWIE13 - desc SWIE13 - 13 - 13 - read-write - - - SWIE14 - desc SWIE14 - 14 - 14 - read-write - - - SWIE15 - desc SWIE15 - 15 - 15 - read-write - - - SWIE16 - desc SWIE16 - 16 - 16 - read-write - - - SWIE17 - desc SWIE17 - 17 - 17 - read-write - - - SWIE18 - desc SWIE18 - 18 - 18 - read-write - - - SWIE19 - desc SWIE19 - 19 - 19 - read-write - - - SWIE20 - desc SWIE20 - 20 - 20 - read-write - - - SWIE21 - desc SWIE21 - 21 - 21 - read-write - - - SWIE22 - desc SWIE22 - 22 - 22 - read-write - - - SWIE23 - desc SWIE23 - 23 - 23 - read-write - - - SWIE24 - desc SWIE24 - 24 - 24 - read-write - - - SWIE25 - desc SWIE25 - 25 - 25 - read-write - - - SWIE26 - desc SWIE26 - 26 - 26 - read-write - - - SWIE27 - desc SWIE27 - 27 - 27 - read-write - - - SWIE28 - desc SWIE28 - 28 - 28 - read-write - - - SWIE29 - desc SWIE29 - 29 - 29 - read-write - - - SWIE30 - desc SWIE30 - 30 - 30 - read-write - - - SWIE31 - desc SWIE31 - 31 - 31 - read-write - - - - - EVTER - desc EVTER - 0x2A0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - EVTE0 - desc EVTE0 - 0 - 0 - read-write - - - EVTE1 - desc EVTE1 - 1 - 1 - read-write - - - EVTE2 - desc EVTE2 - 2 - 2 - read-write - - - EVTE3 - desc EVTE3 - 3 - 3 - read-write - - - EVTE4 - desc EVTE4 - 4 - 4 - read-write - - - EVTE5 - desc EVTE5 - 5 - 5 - read-write - - - EVTE6 - desc EVTE6 - 6 - 6 - read-write - - - EVTE7 - desc EVTE7 - 7 - 7 - read-write - - - EVTE8 - desc EVTE8 - 8 - 8 - read-write - - - EVTE9 - desc EVTE9 - 9 - 9 - read-write - - - EVTE10 - desc EVTE10 - 10 - 10 - read-write - - - EVTE11 - desc EVTE11 - 11 - 11 - read-write - - - EVTE12 - desc EVTE12 - 12 - 12 - read-write - - - EVTE13 - desc EVTE13 - 13 - 13 - read-write - - - EVTE14 - desc EVTE14 - 14 - 14 - read-write - - - EVTE15 - desc EVTE15 - 15 - 15 - read-write - - - EVTE16 - desc EVTE16 - 16 - 16 - read-write - - - EVTE17 - desc EVTE17 - 17 - 17 - read-write - - - EVTE18 - desc EVTE18 - 18 - 18 - read-write - - - EVTE19 - desc EVTE19 - 19 - 19 - read-write - - - EVTE20 - desc EVTE20 - 20 - 20 - read-write - - - EVTE21 - desc EVTE21 - 21 - 21 - read-write - - - EVTE22 - desc EVTE22 - 22 - 22 - read-write - - - EVTE23 - desc EVTE23 - 23 - 23 - read-write - - - EVTE24 - desc EVTE24 - 24 - 24 - read-write - - - EVTE25 - desc EVTE25 - 25 - 25 - read-write - - - EVTE26 - desc EVTE26 - 26 - 26 - read-write - - - EVTE27 - desc EVTE27 - 27 - 27 - read-write - - - EVTE28 - desc EVTE28 - 28 - 28 - read-write - - - EVTE29 - desc EVTE29 - 29 - 29 - read-write - - - EVTE30 - desc EVTE30 - 30 - 30 - read-write - - - EVTE31 - desc EVTE31 - 31 - 31 - read-write - - - - - IER - desc IER - 0x2A4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - IER0 - desc IER0 - 0 - 0 - read-write - - - IER1 - desc IER1 - 1 - 1 - read-write - - - IER2 - desc IER2 - 2 - 2 - read-write - - - IER3 - desc IER3 - 3 - 3 - read-write - - - IER4 - desc IER4 - 4 - 4 - read-write - - - IER5 - desc IER5 - 5 - 5 - read-write - - - IER6 - desc IER6 - 6 - 6 - read-write - - - IER7 - desc IER7 - 7 - 7 - read-write - - - IER8 - desc IER8 - 8 - 8 - read-write - - - IER9 - desc IER9 - 9 - 9 - read-write - - - IER10 - desc IER10 - 10 - 10 - read-write - - - IER11 - desc IER11 - 11 - 11 - read-write - - - IER12 - desc IER12 - 12 - 12 - read-write - - - IER13 - desc IER13 - 13 - 13 - read-write - - - IER14 - desc IER14 - 14 - 14 - read-write - - - IER15 - desc IER15 - 15 - 15 - read-write - - - IER16 - desc IER16 - 16 - 16 - read-write - - - IER17 - desc IER17 - 17 - 17 - read-write - - - IER18 - desc IER18 - 18 - 18 - read-write - - - IER19 - desc IER19 - 19 - 19 - read-write - - - IER20 - desc IER20 - 20 - 20 - read-write - - - IER21 - desc IER21 - 21 - 21 - read-write - - - IER22 - desc IER22 - 22 - 22 - read-write - - - IER23 - desc IER23 - 23 - 23 - read-write - - - IER24 - desc IER24 - 24 - 24 - read-write - - - IER25 - desc IER25 - 25 - 25 - read-write - - - IER26 - desc IER26 - 26 - 26 - read-write - - - IER27 - desc IER27 - 27 - 27 - read-write - - - IER28 - desc IER28 - 28 - 28 - read-write - - - IER29 - desc IER29 - 29 - 29 - read-write - - - IER30 - desc IER30 - 30 - 30 - read-write - - - IER31 - desc IER31 - 31 - 31 - read-write - - - - - - - KEYSCAN - desc KEYSCAN - 0x40050C00 - - 0x0 - 0xC - - - - SCR - desc SCR - 0x0 - 32 - read-write - 0x0 - 0xFF37FFFF - - - KEYINSEL - desc KEYINSEL - 15 - 0 - read-write - - - KEYOUTSEL - desc KEYOUTSEL - 18 - 16 - read-write - - - CKSEL - desc CKSEL - 21 - 20 - read-write - - - T_LLEVEL - desc T_LLEVEL - 28 - 24 - read-write - - - T_HIZ - desc T_HIZ - 31 - 29 - read-write - - - - - SER - desc SER - 0x4 - 32 - read-write - 0x0 - 0x1 - - - SEN - desc SEN - 0 - 0 - read-write - - - - - SSR - desc SSR - 0x8 - 32 - read-write - 0x0 - 0x7 - - - INDEX - desc INDEX - 2 - 0 - read-write - - - - - - - MPU - desc MPU - 0x40050000 - - 0x0 - 0x4020 - - - - RGD0 - desc RGD0 - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD1 - desc RGD1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD2 - desc RGD2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD3 - desc RGD3 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD4 - desc RGD4 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD5 - desc RGD5 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD6 - desc RGD6 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD7 - desc RGD7 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD8 - desc RGD8 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD9 - desc RGD9 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD10 - desc RGD10 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD11 - desc RGD11 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD12 - desc RGD12 - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD13 - desc RGD13 - 0x34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD14 - desc RGD14 - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD15 - desc RGD15 - 0x3C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGCR0 - desc RGCR0 - 0x40 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR1 - desc RGCR1 - 0x44 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR2 - desc RGCR2 - 0x48 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR3 - desc RGCR3 - 0x4C - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR4 - desc RGCR4 - 0x50 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR5 - desc RGCR5 - 0x54 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR6 - desc RGCR6 - 0x58 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR7 - desc RGCR7 - 0x5C - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR8 - desc RGCR8 - 0x60 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR9 - desc RGCR9 - 0x64 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR10 - desc RGCR10 - 0x68 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR11 - desc RGCR11 - 0x6C - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR12 - desc RGCR12 - 0x70 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR13 - desc RGCR13 - 0x74 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR14 - desc RGCR14 - 0x78 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR15 - desc RGCR15 - 0x7C - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - CR - desc CR - 0x80 - 32 - read-write - 0x0 - 0x8F8F8F - - - SMPU2BRP - desc SMPU2BRP - 0 - 0 - read-write - - - SMPU2BWP - desc SMPU2BWP - 1 - 1 - read-write - - - SMPU2ACT - desc SMPU2ACT - 3 - 2 - read-write - - - SMPU2E - desc SMPU2E - 7 - 7 - read-write - - - SMPU1BRP - desc SMPU1BRP - 8 - 8 - read-write - - - SMPU1BWP - desc SMPU1BWP - 9 - 9 - read-write - - - SMPU1ACT - desc SMPU1ACT - 11 - 10 - read-write - - - SMPU1E - desc SMPU1E - 15 - 15 - read-write - - - FMPUBRP - desc FMPUBRP - 16 - 16 - read-write - - - FMPUBWP - desc FMPUBWP - 17 - 17 - read-write - - - FMPUACT - desc FMPUACT - 19 - 18 - read-write - - - FMPUE - desc FMPUE - 23 - 23 - read-write - - - - - SR - desc SR - 0x84 - 32 - read-only - 0x0 - 0x10101 - - - SMPU2EAF - desc SMPU2EAF - 0 - 0 - read-only - - - SMPU1EAF - desc SMPU1EAF - 8 - 8 - read-only - - - FMPUEAF - desc FMPUEAF - 16 - 16 - read-only - - - - - ECLR - desc ECLR - 0x88 - 32 - write-only - 0x0 - 0x10101 - - - SMPU2ECLR - desc SMPU2ECLR - 0 - 0 - write-only - - - SMPU1ECLR - desc SMPU1ECLR - 8 - 8 - write-only - - - FMPUECLR - desc FMPUECLR - 16 - 16 - write-only - - - - - WP - desc WP - 0x8C - 32 - read-write - 0x0 - 0xFFFF - - - MPUWE - desc MPUWE - 0 - 0 - read-write - - - WKEY - desc WKEY - 15 - 1 - write-only - - - - - IPPR - desc IPPR - 0x401C - 32 - read-write - 0x0 - 0xBFFFF3FF - - - AESRDP - desc AESRDP - 0 - 0 - read-write - - - AESWRP - desc AESWRP - 1 - 1 - read-write - - - HASHRDP - desc HASHRDP - 2 - 2 - read-write - - - HASHWRP - desc HASHWRP - 3 - 3 - read-write - - - TRNGRDP - desc TRNGRDP - 4 - 4 - read-write - - - TRNGWRP - desc TRNGWRP - 5 - 5 - read-write - - - CRCRDP - desc CRCRDP - 6 - 6 - read-write - - - CRCWRP - desc CRCWRP - 7 - 7 - read-write - - - EFMRDP - desc EFMRDP - 8 - 8 - read-write - - - EFMWRP - desc EFMWRP - 9 - 9 - read-write - - - WDTRDP - desc WDTRDP - 12 - 12 - read-write - - - WDTWRP - desc WDTWRP - 13 - 13 - read-write - - - SWDTRDP - desc SWDTRDP - 14 - 14 - read-write - - - SWDTWRP - desc SWDTWRP - 15 - 15 - read-write - - - BKSRAMRDP - desc BKSRAMRDP - 16 - 16 - read-write - - - BKSRAMWRP - desc BKSRAMWRP - 17 - 17 - read-write - - - RTCRDP - desc RTCRDP - 18 - 18 - read-write - - - RTCWRP - desc RTCWRP - 19 - 19 - read-write - - - DMPURDP - desc DMPURDP - 20 - 20 - read-write - - - DMPUWRP - desc DMPUWRP - 21 - 21 - read-write - - - SRAMCRDP - desc SRAMCRDP - 22 - 22 - read-write - - - SRAMCWRP - desc SRAMCWRP - 23 - 23 - read-write - - - INTCRDP - desc INTCRDP - 24 - 24 - read-write - - - INTCWRP - desc INTCWRP - 25 - 25 - read-write - - - SYSCRDP - desc SYSCRDP - 26 - 26 - read-write - - - SYSCWRP - desc SYSCWRP - 27 - 27 - read-write - - - MSTPRDP - desc MSTPRDP - 28 - 28 - read-write - - - MSTPWRP - desc MSTPWRP - 29 - 29 - read-write - - - BUSERRE - desc BUSERRE - 31 - 31 - read-write - - - - - - - OTS - desc OTS - 0x4004A400 - - 0x0 - 0xC - - - - CTL - desc CTL - 0x0 - 16 - read-write - 0x0 - 0xF - - - OTSST - desc OTSST - 0 - 0 - read-write - - - OTSCK - desc OTSCK - 1 - 1 - read-write - - - OTSIE - desc OTSIE - 2 - 2 - read-write - - - TSSTP - desc TSSTP - 3 - 3 - read-write - - - - - DR1 - desc DR1 - 0x2 - 16 - read-write - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x4 - 16 - read-write - 0x0 - 0xFFFF - - - ECR - desc ECR - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - LPR - desc LPR - 0x8 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - TSOFS - desc TSOFS - 7 - 0 - read-only - - - TSSLP - desc TSSLP - 31 - 8 - read-only - - - - - - - PERIC - desc PERIC - 0x40055400 - - 0x0 - 0x8 - - - - USBFS_SYCTLREG - desc USBFS_SYCTLREG - 0x0 - 32 - read-write - 0x0 - 0x3 - - - DFB - desc DFB - 0 - 0 - read-write - - - SOFEN - desc SOFEN - 1 - 1 - read-write - - - - - SDIOC_SYCTLREG - desc SDIOC_SYCTLREG - 0x4 - 32 - read-write - 0x0 - 0xA - - - SELMMC1 - desc SELMMC1 - 1 - 1 - read-write - - - SELMMC2 - desc SELMMC2 - 3 - 3 - read-write - - - - - - - PWC - desc PWC - 0x40048000 - - 0x0 - 0xC42C - - - - FCG0 - desc FCG0 - 0x0 - 32 - read-write - 0xFFFFFAEE - 0x8FF3C511 - - - SRAMH - desc SRAMH - 0 - 0 - read-write - - - SRAM12 - desc SRAM12 - 4 - 4 - read-write - - - SRAM3 - desc SRAM3 - 8 - 8 - read-write - - - SRAMRET - desc SRAMRET - 10 - 10 - read-write - - - DMA1 - desc DMA1 - 14 - 14 - read-write - - - DMA2 - desc DMA2 - 15 - 15 - read-write - - - FCM - desc FCM - 16 - 16 - read-write - - - AOS - desc AOS - 17 - 17 - read-write - - - AES - desc AES - 20 - 20 - read-write - - - HASH - desc HASH - 21 - 21 - read-write - - - TRNG - desc TRNG - 22 - 22 - read-write - - - CRC - desc CRC - 23 - 23 - read-write - - - DCU1 - desc DCU1 - 24 - 24 - read-write - - - DCU2 - desc DCU2 - 25 - 25 - read-write - - - DCU3 - desc DCU3 - 26 - 26 - read-write - - - DCU4 - desc DCU4 - 27 - 27 - read-write - - - KEY - desc KEY - 31 - 31 - read-write - - - - - FCG1 - desc FCG1 - 0x4 - 32 - read-write - 0xFFFFFFFF - 0xF0FFD79 - - - CAN - desc CAN - 0 - 0 - read-write - - - QSPI - desc QSPI - 3 - 3 - read-write - - - I2C1 - desc I2C1 - 4 - 4 - read-write - - - I2C2 - desc I2C2 - 5 - 5 - read-write - - - I2C3 - desc I2C3 - 6 - 6 - read-write - - - USBFS - desc USBFS - 8 - 8 - read-write - - - SDIOC1 - desc SDIOC1 - 10 - 10 - read-write - - - SDIOC2 - desc SDIOC2 - 11 - 11 - read-write - - - I2S1 - desc I2S1 - 12 - 12 - read-write - - - I2S2 - desc I2S2 - 13 - 13 - read-write - - - I2S3 - desc I2S3 - 14 - 14 - read-write - - - I2S4 - desc I2S4 - 15 - 15 - read-write - - - SPI1 - desc SPI1 - 16 - 16 - read-write - - - SPI2 - desc SPI2 - 17 - 17 - read-write - - - SPI3 - desc SPI3 - 18 - 18 - read-write - - - SPI4 - desc SPI4 - 19 - 19 - read-write - - - USART1 - desc USART1 - 24 - 24 - read-write - - - USART2 - desc USART2 - 25 - 25 - read-write - - - USART3 - desc USART3 - 26 - 26 - read-write - - - USART4 - desc USART4 - 27 - 27 - read-write - - - - - FCG2 - desc FCG2 - 0x8 - 32 - read-write - 0xFFFFFFFF - 0x787FF - - - TIMER0_1 - desc TIMER0_1 - 0 - 0 - read-write - - - TIMER0_2 - desc TIMER0_2 - 1 - 1 - read-write - - - TIMERA_1 - desc TIMERA_1 - 2 - 2 - read-write - - - TIMERA_2 - desc TIMERA_2 - 3 - 3 - read-write - - - TIMERA_3 - desc TIMERA_3 - 4 - 4 - read-write - - - TIMERA_4 - desc TIMERA_4 - 5 - 5 - read-write - - - TIMERA_5 - desc TIMERA_5 - 6 - 6 - read-write - - - TIMERA_6 - desc TIMERA_6 - 7 - 7 - read-write - - - TIMER4_1 - desc TIMER4_1 - 8 - 8 - read-write - - - TIMER4_2 - desc TIMER4_2 - 9 - 9 - read-write - - - TIMER4_3 - desc TIMER4_3 - 10 - 10 - read-write - - - EMB - desc EMB - 15 - 15 - read-write - - - TIMER6_1 - desc TIMER6_1 - 16 - 16 - read-write - - - TIMER6_2 - desc TIMER6_2 - 17 - 17 - read-write - - - TIMER6_3 - desc TIMER6_3 - 18 - 18 - read-write - - - - - FCG3 - desc FCG3 - 0xC - 32 - read-write - 0xFFFFFFFF - 0x1103 - - - ADC1 - desc ADC1 - 0 - 0 - read-write - - - ADC2 - desc ADC2 - 1 - 1 - read-write - - - CMP - desc CMP - 8 - 8 - read-write - - - OTS - desc OTS - 12 - 12 - read-write - - - - - FCG0PC - desc FCG0PC - 0x10 - 32 - read-write - 0x0 - 0xFFFF0001 - - - PRT0 - desc PRT0 - 0 - 0 - read-write - - - FCG0PCWE - desc FCG0PCWE - 31 - 16 - write-only - - - - - WKTCR - desc WKTCR - 0x4400 - 16 - read-write - 0x0 - 0xFFFF - - - WKTMCMP - desc WKTMCMP - 11 - 0 - read-write - - - WKOVF - desc WKOVF - 12 - 12 - read-write - - - WKCKS - desc WKCKS - 14 - 13 - read-write - - - WKTCE - desc WKTCE - 15 - 15 - read-write - - - - - STPMCR - desc STPMCR - 0xC00C - 16 - read-write - 0x4000 - 0x8003 - - - FLNWT - desc FLNWT - 0 - 0 - read-write - - - CKSMRC - desc CKSMRC - 1 - 1 - read-write - - - STOP - desc STOP - 15 - 15 - read-write - - - - - RAMPC0 - desc RAMPC0 - 0xC014 - 32 - read-write - 0x0 - 0x1FF - - - RAMPDC0 - desc RAMPDC0 - 0 - 0 - read-write - - - RAMPDC1 - desc RAMPDC1 - 1 - 1 - read-write - - - RAMPDC2 - desc RAMPDC2 - 2 - 2 - read-write - - - RAMPDC3 - desc RAMPDC3 - 3 - 3 - read-write - - - RAMPDC4 - desc RAMPDC4 - 4 - 4 - read-write - - - RAMPDC5 - desc RAMPDC5 - 5 - 5 - read-write - - - RAMPDC6 - desc RAMPDC6 - 6 - 6 - read-write - - - RAMPDC7 - desc RAMPDC7 - 7 - 7 - read-write - - - RAMPDC8 - desc RAMPDC8 - 8 - 8 - read-write - - - - - RAMOPM - desc RAMOPM - 0xC018 - 16 - read-write - 0x8043 - 0xFFFF - - - PVDICR - desc PVDICR - 0xC0E0 - 8 - read-write - 0x0 - 0x11 - - - PVD1NMIS - desc PVD1NMIS - 0 - 0 - read-write - - - PVD2NMIS - desc PVD2NMIS - 4 - 4 - read-write - - - - - PVDDSR - desc PVDDSR - 0xC0E1 - 8 - read-write - 0x11 - 0x33 - - - PVD1MON - desc PVD1MON - 0 - 0 - read-write - - - PVD1DETFLG - desc PVD1DETFLG - 1 - 1 - read-write - - - PVD2MON - desc PVD2MON - 4 - 4 - read-write - - - PVD2DETFLG - desc PVD2DETFLG - 5 - 5 - read-write - - - - - FPRC - desc FPRC - 0xC3FE - 16 - read-write - 0x0 - 0xFF0F - - - FPRCB0 - desc FPRCB0 - 0 - 0 - read-write - - - FPRCB1 - desc FPRCB1 - 1 - 1 - read-write - - - FPRCB2 - desc FPRCB2 - 2 - 2 - read-write - - - FPRCB3 - desc FPRCB3 - 3 - 3 - read-write - - - FPRCWE - desc FPRCWE - 15 - 8 - read-write - - - - - PWRC0 - desc PWRC0 - 0xC400 - 8 - read-write - 0x0 - 0xBF - - - PDMDS - desc PDMDS - 1 - 0 - read-write - - - VVDRSD - desc VVDRSD - 2 - 2 - read-write - - - RETRAMSD - desc RETRAMSD - 3 - 3 - read-write - - - IORTN - desc IORTN - 5 - 4 - read-write - - - PWDN - desc PWDN - 7 - 7 - read-write - - - - - PWRC1 - desc PWRC1 - 0xC401 - 8 - read-write - 0x0 - 0xC3 - - - VPLLSD - desc VPLLSD - 0 - 0 - read-write - - - VHRCSD - desc VHRCSD - 1 - 1 - read-write - - - STPDAS - desc STPDAS - 7 - 6 - read-write - - - - - PWRC2 - desc PWRC2 - 0xC402 - 8 - read-write - 0xFF - 0x3F - - - DDAS - desc DDAS - 3 - 0 - read-write - - - DVS - desc DVS - 5 - 4 - read-write - - - - - PWRC3 - desc PWRC3 - 0xC403 - 8 - read-write - 0x7 - 0x4 - - - PDTS - desc PDTS - 2 - 2 - read-write - - - - - PDWKE0 - desc PDWKE0 - 0xC404 - 8 - read-write - 0x0 - 0xFF - - - WKE00 - desc WKE00 - 0 - 0 - read-write - - - WKE01 - desc WKE01 - 1 - 1 - read-write - - - WKE02 - desc WKE02 - 2 - 2 - read-write - - - WKE03 - desc WKE03 - 3 - 3 - read-write - - - WKE10 - desc WKE10 - 4 - 4 - read-write - - - WKE11 - desc WKE11 - 5 - 5 - read-write - - - WKE12 - desc WKE12 - 6 - 6 - read-write - - - WKE13 - desc WKE13 - 7 - 7 - read-write - - - - - PDWKE1 - desc PDWKE1 - 0xC405 - 8 - read-write - 0x0 - 0xFF - - - WKE20 - desc WKE20 - 0 - 0 - read-write - - - WKE21 - desc WKE21 - 1 - 1 - read-write - - - WKE22 - desc WKE22 - 2 - 2 - read-write - - - WKE23 - desc WKE23 - 3 - 3 - read-write - - - WKE30 - desc WKE30 - 4 - 4 - read-write - - - WKE31 - desc WKE31 - 5 - 5 - read-write - - - WKE32 - desc WKE32 - 6 - 6 - read-write - - - WKE33 - desc WKE33 - 7 - 7 - read-write - - - - - PDWKE2 - desc PDWKE2 - 0xC406 - 8 - read-write - 0x0 - 0xB7 - - - VD1WKE - desc VD1WKE - 0 - 0 - read-write - - - VD2WKE - desc VD2WKE - 1 - 1 - read-write - - - NMIWKE - desc NMIWKE - 2 - 2 - read-write - - - RTCPRDWKE - desc RTCPRDWKE - 4 - 4 - read-write - - - RTCALMWKE - desc RTCALMWKE - 5 - 5 - read-write - - - WKTMWKE - desc WKTMWKE - 7 - 7 - read-write - - - - - PDWKES - desc PDWKES - 0xC407 - 8 - read-write - 0x0 - 0x7F - - - WK0EGS - desc WK0EGS - 0 - 0 - read-write - - - WK1EGS - desc WK1EGS - 1 - 1 - read-write - - - WK2EGS - desc WK2EGS - 2 - 2 - read-write - - - WK3EGS - desc WK3EGS - 3 - 3 - read-write - - - VD1EGS - desc VD1EGS - 4 - 4 - read-write - - - VD2EGS - desc VD2EGS - 5 - 5 - read-write - - - NMIEGS - desc NMIEGS - 6 - 6 - read-write - - - - - PDWKF0 - desc PDWKF0 - 0xC408 - 8 - read-write - 0x0 - 0x7F - - - PTWK0F - desc PTWK0F - 0 - 0 - read-write - - - PTWK1F - desc PTWK1F - 1 - 1 - read-write - - - PTWK2F - desc PTWK2F - 2 - 2 - read-write - - - PTWK3F - desc PTWK3F - 3 - 3 - read-write - - - VD1WKF - desc VD1WKF - 4 - 4 - read-write - - - VD2WKF - desc VD2WKF - 5 - 5 - read-write - - - NMIWKF - desc NMIWKF - 6 - 6 - read-write - - - - - PDWKF1 - desc PDWKF1 - 0xC409 - 8 - read-write - 0x0 - 0xB8 - - - RTCPRDWKF - desc RTCPRDWKF - 4 - 4 - read-write - - - RTCALMWKF - desc RTCALMWKF - 5 - 5 - read-write - - - WKTMWKF - desc WKTMWKF - 7 - 7 - read-write - - - - - PWCMR - desc PWCMR - 0xC40A - 8 - read-write - 0x0 - 0x80 - - - ADBUFE - desc ADBUFE - 7 - 7 - read-write - - - - - MDSWCR - desc MDSWCR - 0xC40F - 8 - read-write - 0x0 - 0xFF - - - PVDCR0 - desc PVDCR0 - 0xC412 - 8 - read-write - 0x0 - 0x61 - - - EXVCCINEN - desc EXVCCINEN - 0 - 0 - read-write - - - PVD1EN - desc PVD1EN - 5 - 5 - read-write - - - PVD2EN - desc PVD2EN - 6 - 6 - read-write - - - - - PVDCR1 - desc PVDCR1 - 0xC413 - 8 - read-write - 0x0 - 0x77 - - - PVD1IRE - desc PVD1IRE - 0 - 0 - read-write - - - PVD1IRS - desc PVD1IRS - 1 - 1 - read-write - - - PVD1CMPOE - desc PVD1CMPOE - 2 - 2 - read-write - - - PVD2IRE - desc PVD2IRE - 4 - 4 - read-write - - - PVD2IRS - desc PVD2IRS - 5 - 5 - read-write - - - PVD2CMPOE - desc PVD2CMPOE - 6 - 6 - read-write - - - - - PVDFCR - desc PVDFCR - 0xC414 - 8 - read-write - 0x11 - 0x77 - - - PVD1NFDIS - desc PVD1NFDIS - 0 - 0 - read-write - - - PVD1NFCKS - desc PVD1NFCKS - 2 - 1 - read-write - - - PVD2NFDIS - desc PVD2NFDIS - 4 - 4 - read-write - - - PVD2NFCKS - desc PVD2NFCKS - 6 - 5 - read-write - - - - - PVDLCR - desc PVDLCR - 0xC415 - 8 - read-write - 0x0 - 0x77 - - - PVD1LVL - desc PVD1LVL - 2 - 0 - read-write - - - PVD2LVL - desc PVD2LVL - 6 - 4 - read-write - - - - - XTAL32CS - desc XTAL32CS - 0xC42B - 8 - read-write - 0x2 - 0x80 - - - CSDIS - desc CSDIS - 7 - 7 - read-write - - - - - - - QSPI - desc QSPI - 0x9C000000 - - 0x0 - 0x808 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x3F0000 - 0x3F3FFF - - - MDSEL - desc MDSEL - 2 - 0 - read-write - - - PFE - desc PFE - 3 - 3 - read-write - - - PFSAE - desc PFSAE - 4 - 4 - read-write - - - DCOME - desc DCOME - 5 - 5 - read-write - - - XIPE - desc XIPE - 6 - 6 - read-write - - - SPIMD3 - desc SPIMD3 - 7 - 7 - read-write - - - IPRSL - desc IPRSL - 9 - 8 - read-write - - - APRSL - desc APRSL - 11 - 10 - read-write - - - DPRSL - desc DPRSL - 13 - 12 - read-write - - - DIV - desc DIV - 21 - 16 - read-write - - - - - CSCR - desc CSCR - 0x4 - 32 - read-write - 0xF - 0x3F - - - SSHW - desc SSHW - 3 - 0 - read-write - - - SSNW - desc SSNW - 5 - 4 - read-write - - - - - FCR - desc FCR - 0x8 - 32 - read-write - 0x80B3 - 0x8F77 - - - AWSL - desc AWSL - 1 - 0 - read-write - - - FOUR_BIC - desc FOUR_BIC - 2 - 2 - read-write - - - SSNHD - desc SSNHD - 4 - 4 - read-write - - - SSNLD - desc SSNLD - 5 - 5 - read-write - - - WPOL - desc WPOL - 6 - 6 - read-write - - - DMCYCN - desc DMCYCN - 11 - 8 - read-write - - - DUTY - desc DUTY - 15 - 15 - read-write - - - - - SR - desc SR - 0xC - 32 - read-write - 0x8000 - 0xDFC1 - - - BUSY - desc BUSY - 0 - 0 - read-write - - - XIPF - desc XIPF - 6 - 6 - read-write - - - RAER - desc RAER - 7 - 7 - read-write - - - PFNUM - desc PFNUM - 12 - 8 - read-write - - - PFFUL - desc PFFUL - 14 - 14 - read-write - - - PFAN - desc PFAN - 15 - 15 - read-write - - - - - DCOM - desc DCOM - 0x10 - 32 - read-write - 0x0 - 0xFF - - - DCOM - desc DCOM - 7 - 0 - read-write - - - - - CCMD - desc CCMD - 0x14 - 32 - read-write - 0x0 - 0xFF - - - RIC - desc RIC - 7 - 0 - read-write - - - - - XCMD - desc XCMD - 0x18 - 32 - read-write - 0xFF - 0xFF - - - XIPMC - desc XIPMC - 7 - 0 - read-write - - - - - SR2 - desc SR2 - 0x24 - 32 - write-only - 0x0 - 0x80 - - - RAERCLR - desc RAERCLR - 7 - 7 - write-only - - - - - EXAR - desc EXAR - 0x804 - 32 - read-write - 0x0 - 0xFC000000 - - - EXADR - desc EXADR - 31 - 26 - read-write - - - - - - - RMU - desc RMU - 0x400540C0 - - 0x0 - 0x2 - - - - RSTF0 - desc RSTF0 - 0x0 - 16 - read-write - 0x2 - 0xFFFF - - - PORF - desc PORF - 0 - 0 - read-write - - - PINRF - desc PINRF - 1 - 1 - read-write - - - BORF - desc BORF - 2 - 2 - read-write - - - PVD1RF - desc PVD1RF - 3 - 3 - read-write - - - PVD2RF - desc PVD2RF - 4 - 4 - read-write - - - WDRF - desc WDRF - 5 - 5 - read-write - - - SWDRF - desc SWDRF - 6 - 6 - read-write - - - PDRF - desc PDRF - 7 - 7 - read-write - - - SWRF - desc SWRF - 8 - 8 - read-write - - - MPUERF - desc MPUERF - 9 - 9 - read-write - - - RAPERF - desc RAPERF - 10 - 10 - read-write - - - RAECRF - desc RAECRF - 11 - 11 - read-write - - - CKFERF - desc CKFERF - 12 - 12 - read-write - - - XTALERF - desc XTALERF - 13 - 13 - read-write - - - MULTIRF - desc MULTIRF - 14 - 14 - read-write - - - CLRF - desc CLRF - 15 - 15 - read-write - - - - - - - RTC - desc RTC - 0x4004C000 - - 0x0 - 0x40 - - - - CR0 - desc CR0 - 0x0 - 8 - read-write - 0x0 - 0x1 - - - RESET - desc RESET - 0 - 0 - read-write - - - - - CR1 - desc CR1 - 0x4 - 8 - read-write - 0x0 - 0xFF - - - PRDS - desc PRDS - 2 - 0 - read-write - - - AMPM - desc AMPM - 3 - 3 - read-write - - - ALMFCLR - desc ALMFCLR - 4 - 4 - read-write - - - ONEHZOE - desc ONEHZOE - 5 - 5 - read-write - - - ONEHZSEL - desc ONEHZSEL - 6 - 6 - read-write - - - START - desc START - 7 - 7 - read-write - - - - - CR2 - desc CR2 - 0x8 - 8 - read-write - 0x0 - 0xEB - - - RWREQ - desc RWREQ - 0 - 0 - read-write - - - RWEN - desc RWEN - 1 - 1 - read-write - - - ALMF - desc ALMF - 3 - 3 - read-write - - - PRDIE - desc PRDIE - 5 - 5 - read-write - - - ALMIE - desc ALMIE - 6 - 6 - read-write - - - ALME - desc ALME - 7 - 7 - read-write - - - - - CR3 - desc CR3 - 0xC - 8 - read-write - 0x0 - 0x90 - - - LRCEN - desc LRCEN - 4 - 4 - read-write - - - RCKSEL - desc RCKSEL - 7 - 7 - read-write - - - - - SEC - desc SEC - 0x10 - 8 - read-write - 0x0 - 0x7F - - - SECU - desc SECU - 3 - 0 - read-write - - - SECD - desc SECD - 6 - 4 - read-write - - - - - MIN - desc MIN - 0x14 - 8 - read-write - 0x0 - 0x7F - - - MINU - desc MINU - 3 - 0 - read-write - - - MIND - desc MIND - 6 - 4 - read-write - - - - - HOUR - desc HOUR - 0x18 - 8 - read-write - 0x12 - 0x3F - - - HOURU - desc HOURU - 3 - 0 - read-write - - - HOURD - desc HOURD - 5 - 4 - read-write - - - - - WEEK - desc WEEK - 0x1C - 8 - read-write - 0x0 - 0x7 - - - WEEK - desc WEEK - 2 - 0 - read-write - - - - - DAY - desc DAY - 0x20 - 8 - read-write - 0x0 - 0x3F - - - DAYU - desc DAYU - 3 - 0 - read-write - - - DAYD - desc DAYD - 5 - 4 - read-write - - - - - MON - desc MON - 0x24 - 8 - read-write - 0x0 - 0x1F - - - MON - desc MON - 4 - 0 - read-write - - - - - YEAR - desc YEAR - 0x28 - 8 - read-write - 0x0 - 0xFF - - - YEARU - desc YEARU - 3 - 0 - read-write - - - YEARD - desc YEARD - 7 - 4 - read-write - - - - - ALMMIN - desc ALMMIN - 0x2C - 8 - read-write - 0x12 - 0x7F - - - ALMMINU - desc ALMMINU - 3 - 0 - read-write - - - ALMMIND - desc ALMMIND - 6 - 4 - read-write - - - - - ALMHOUR - desc ALMHOUR - 0x30 - 8 - read-write - 0x0 - 0x3F - - - ALMHOURU - desc ALMHOURU - 3 - 0 - read-write - - - ALMHOURD - desc ALMHOURD - 5 - 4 - read-write - - - - - ALMWEEK - desc ALMWEEK - 0x34 - 8 - read-write - 0x0 - 0x7F - - - ALMWEEK - desc ALMWEEK - 6 - 0 - read-write - - - - - ERRCRH - desc ERRCRH - 0x38 - 8 - read-write - 0x0 - 0x81 - - - COMP8 - desc COMP8 - 0 - 0 - read-write - - - COMPEN - desc COMPEN - 7 - 7 - read-write - - - - - ERRCRL - desc ERRCRL - 0x3C - 8 - read-write - 0x20 - 0xFF - - - COMP - desc COMP - 7 - 0 - read-write - - - - - - - SDIOC1 - desc SDIOC - 0x4006FC00 - - 0x0 - 0x54 - - - - BLKSIZE - desc BLKSIZE - 0x4 - 16 - read-write - 0x0 - 0xFFF - - - TBS - desc TBS - 11 - 0 - read-write - - - - - BLKCNT - desc BLKCNT - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - ARG0 - desc ARG0 - 0x8 - 16 - read-write - 0x0 - 0xFFFF - - - ARG1 - desc ARG1 - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - TRANSMODE - desc TRANSMODE - 0xC - 16 - read-write - 0x0 - 0x3E - - - BCE - desc BCE - 1 - 1 - read-write - - - ATCEN - desc ATCEN - 3 - 2 - read-write - - - DDIR - desc DDIR - 4 - 4 - read-write - - - MULB - desc MULB - 5 - 5 - read-write - - - - - CMD - desc CMD - 0xE - 16 - read-write - 0x0 - 0x3FFB - - - RESTYP - desc RESTYP - 1 - 0 - read-write - - - CCE - desc CCE - 3 - 3 - read-write - - - ICE - desc ICE - 4 - 4 - read-write - - - DAT - desc DAT - 5 - 5 - read-write - - - TYP - desc TYP - 7 - 6 - read-write - - - IDX - desc IDX - 13 - 8 - read-write - - - - - RESP0 - desc RESP0 - 0x10 - 16 - read-only - 0x0 - 0xFFFF - - - RESP1 - desc RESP1 - 0x12 - 16 - read-only - 0x0 - 0xFFFF - - - RESP2 - desc RESP2 - 0x14 - 16 - read-only - 0x0 - 0xFFFF - - - RESP3 - desc RESP3 - 0x16 - 16 - read-only - 0x0 - 0xFFFF - - - RESP4 - desc RESP4 - 0x18 - 16 - read-only - 0x0 - 0xFFFF - - - RESP5 - desc RESP5 - 0x1A - 16 - read-only - 0x0 - 0xFFFF - - - RESP6 - desc RESP6 - 0x1C - 16 - read-only - 0x0 - 0xFFFF - - - RESP7 - desc RESP7 - 0x1E - 16 - read-only - 0x0 - 0xFFFF - - - BUF0 - desc BUF0 - 0x20 - 16 - read-write - 0x0 - 0xFFFF - - - BUF1 - desc BUF1 - 0x22 - 16 - read-write - 0x0 - 0xFFFF - - - PSTAT - desc PSTAT - 0x24 - 32 - read-only - 0x0 - 0x1FF0F07 - - - CIC - desc CIC - 0 - 0 - read-only - - - CID - desc CID - 1 - 1 - read-only - - - DA - desc DA - 2 - 2 - read-only - - - WTA - desc WTA - 8 - 8 - read-only - - - RTA - desc RTA - 9 - 9 - read-only - - - BWE - desc BWE - 10 - 10 - read-only - - - BRE - desc BRE - 11 - 11 - read-only - - - CIN - desc CIN - 16 - 16 - read-only - - - CSS - desc CSS - 17 - 17 - read-only - - - CDL - desc CDL - 18 - 18 - read-only - - - WPL - desc WPL - 19 - 19 - read-only - - - DATL - desc DATL - 23 - 20 - read-only - - - CMDL - desc CMDL - 24 - 24 - read-only - - - - - HOSTCON - desc HOSTCON - 0x28 - 8 - read-write - 0x0 - 0xE6 - - - DW - desc DW - 1 - 1 - read-write - - - HSEN - desc HSEN - 2 - 2 - read-write - - - EXDW - desc EXDW - 5 - 5 - read-write - - - CDTL - desc CDTL - 6 - 6 - read-write - - - CDSS - desc CDSS - 7 - 7 - read-write - - - - - PWRCON - desc PWRCON - 0x29 - 8 - read-write - 0x0 - 0x1 - - - PWON - desc PWON - 0 - 0 - read-write - - - - - BLKGPCON - desc BLKGPCON - 0x2A - 8 - read-write - 0x0 - 0xF - - - SABGR - desc SABGR - 0 - 0 - read-write - - - CR - desc CR - 1 - 1 - read-write - - - RWC - desc RWC - 2 - 2 - read-write - - - IABG - desc IABG - 3 - 3 - read-write - - - - - CLKCON - desc CLKCON - 0x2C - 16 - read-write - 0x2 - 0xFF05 - - - ICE - desc ICE - 0 - 0 - read-write - - - CE - desc CE - 2 - 2 - read-write - - - FS - desc FS - 15 - 8 - read-write - - - - - TOUTCON - desc TOUTCON - 0x2E - 8 - read-write - 0x0 - 0xF - - - DTO - desc DTO - 3 - 0 - read-write - - - - - SFTRST - desc SFTRST - 0x2F - 8 - read-write - 0x0 - 0x7 - - - RSTA - desc RSTA - 0 - 0 - read-write - - - RSTC - desc RSTC - 1 - 1 - read-write - - - RSTD - desc RSTD - 2 - 2 - read-write - - - - - NORINTST - desc NORINTST - 0x30 - 16 - read-write - 0x0 - 0x81F7 - - - CC - desc CC - 0 - 0 - read-write - - - TC - desc TC - 1 - 1 - read-write - - - BGE - desc BGE - 2 - 2 - read-write - - - BWR - desc BWR - 4 - 4 - read-write - - - BRR - desc BRR - 5 - 5 - read-write - - - CIST - desc CIST - 6 - 6 - read-write - - - CRM - desc CRM - 7 - 7 - read-write - - - CINT - desc CINT - 8 - 8 - read-only - - - EI - desc EI - 15 - 15 - read-only - - - - - ERRINTST - desc ERRINTST - 0x32 - 16 - read-write - 0x0 - 0x17F - - - CTOE - desc CTOE - 0 - 0 - read-write - - - CCE - desc CCE - 1 - 1 - read-write - - - CEBE - desc CEBE - 2 - 2 - read-write - - - CIE - desc CIE - 3 - 3 - read-write - - - DTOE - desc DTOE - 4 - 4 - read-write - - - DCE - desc DCE - 5 - 5 - read-write - - - DEBE - desc DEBE - 6 - 6 - read-write - - - ACE - desc ACE - 8 - 8 - read-write - - - - - NORINTSTEN - desc NORINTSTEN - 0x34 - 16 - read-write - 0x0 - 0x1F7 - - - CCEN - desc CCEN - 0 - 0 - read-write - - - TCEN - desc TCEN - 1 - 1 - read-write - - - BGEEN - desc BGEEN - 2 - 2 - read-write - - - BWREN - desc BWREN - 4 - 4 - read-write - - - BRREN - desc BRREN - 5 - 5 - read-write - - - CISTEN - desc CISTEN - 6 - 6 - read-write - - - CRMEN - desc CRMEN - 7 - 7 - read-write - - - CINTEN - desc CINTEN - 8 - 8 - read-write - - - - - ERRINTSTEN - desc ERRINTSTEN - 0x36 - 16 - read-write - 0x0 - 0x17F - - - CTOEEN - desc CTOEEN - 0 - 0 - read-write - - - CCEEN - desc CCEEN - 1 - 1 - read-write - - - CEBEEN - desc CEBEEN - 2 - 2 - read-write - - - CIEEN - desc CIEEN - 3 - 3 - read-write - - - DTOEEN - desc DTOEEN - 4 - 4 - read-write - - - DCEEN - desc DCEEN - 5 - 5 - read-write - - - DEBEEN - desc DEBEEN - 6 - 6 - read-write - - - ACEEN - desc ACEEN - 8 - 8 - read-write - - - - - NORINTSGEN - desc NORINTSGEN - 0x38 - 16 - read-write - 0x0 - 0x1F7 - - - CCSEN - desc CCSEN - 0 - 0 - read-write - - - TCSEN - desc TCSEN - 1 - 1 - read-write - - - BGESEN - desc BGESEN - 2 - 2 - read-write - - - BWRSEN - desc BWRSEN - 4 - 4 - read-write - - - BRRSEN - desc BRRSEN - 5 - 5 - read-write - - - CISTSEN - desc CISTSEN - 6 - 6 - read-write - - - CRMSEN - desc CRMSEN - 7 - 7 - read-write - - - CINTSEN - desc CINTSEN - 8 - 8 - read-write - - - - - ERRINTSGEN - desc ERRINTSGEN - 0x3A - 16 - read-write - 0x0 - 0x17F - - - CTOESEN - desc CTOESEN - 0 - 0 - read-write - - - CCESEN - desc CCESEN - 1 - 1 - read-write - - - CEBESEN - desc CEBESEN - 2 - 2 - read-write - - - CIESEN - desc CIESEN - 3 - 3 - read-write - - - DTOESEN - desc DTOESEN - 4 - 4 - read-write - - - DCESEN - desc DCESEN - 5 - 5 - read-write - - - DEBESEN - desc DEBESEN - 6 - 6 - read-write - - - ACESEN - desc ACESEN - 8 - 8 - read-write - - - - - ATCERRST - desc ATCERRST - 0x3C - 16 - read-only - 0x0 - 0x9F - - - NE - desc NE - 0 - 0 - read-only - - - TOE - desc TOE - 1 - 1 - read-only - - - CE - desc CE - 2 - 2 - read-only - - - EBE - desc EBE - 3 - 3 - read-only - - - IE - desc IE - 4 - 4 - read-only - - - CMDE - desc CMDE - 7 - 7 - read-only - - - - - FEA - desc FEA - 0x50 - 16 - write-only - 0x0 - 0x9F - - - FNE - desc FNE - 0 - 0 - write-only - - - FTOE - desc FTOE - 1 - 1 - write-only - - - FCE - desc FCE - 2 - 2 - write-only - - - FEBE - desc FEBE - 3 - 3 - write-only - - - FIE - desc FIE - 4 - 4 - write-only - - - FCMDE - desc FCMDE - 7 - 7 - write-only - - - - - FEE - desc FEE - 0x52 - 16 - write-only - 0x0 - 0x17F - - - FCTOE - desc FCTOE - 0 - 0 - write-only - - - FCCE - desc FCCE - 1 - 1 - write-only - - - FCEBE - desc FCEBE - 2 - 2 - write-only - - - FCIE - desc FCIE - 3 - 3 - write-only - - - FDTOE - desc FDTOE - 4 - 4 - write-only - - - FDCE - desc FDCE - 5 - 5 - write-only - - - FDEBE - desc FDEBE - 6 - 6 - write-only - - - FACE - desc FACE - 8 - 8 - write-only - - - - - - - SDIOC2 - desc SDIOC - 0x40070000 - - 0x0 - 0x54 - - - - SPI1 - desc SPI - 0x4001C000 - - 0x0 - 0x1C - - - - DR - desc DR - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CR1 - desc CR1 - 0x4 - 32 - read-write - 0x0 - 0xFFFB - - - SPIMDS - desc SPIMDS - 0 - 0 - read-write - - - TXMDS - desc TXMDS - 1 - 1 - read-write - - - MSTR - desc MSTR - 3 - 3 - read-write - - - SPLPBK - desc SPLPBK - 4 - 4 - read-write - - - SPLPBK2 - desc SPLPBK2 - 5 - 5 - read-write - - - SPE - desc SPE - 6 - 6 - read-write - - - CSUSPE - desc CSUSPE - 7 - 7 - read-write - - - EIE - desc EIE - 8 - 8 - read-write - - - TXIE - desc TXIE - 9 - 9 - read-write - - - RXIE - desc RXIE - 10 - 10 - read-write - - - IDIE - desc IDIE - 11 - 11 - read-write - - - MODFE - desc MODFE - 12 - 12 - read-write - - - PATE - desc PATE - 13 - 13 - read-write - - - PAOE - desc PAOE - 14 - 14 - read-write - - - PAE - desc PAE - 15 - 15 - read-write - - - - - CFG1 - desc CFG1 - 0xC - 32 - read-write - 0x10 - 0x77700F43 - - - FTHLV - desc FTHLV - 1 - 0 - read-write - - - SPRDTD - desc SPRDTD - 6 - 6 - read-write - - - SS0PV - desc SS0PV - 8 - 8 - read-write - - - SS1PV - desc SS1PV - 9 - 9 - read-write - - - SS2PV - desc SS2PV - 10 - 10 - read-write - - - SS3PV - desc SS3PV - 11 - 11 - read-write - - - MSSI - desc MSSI - 22 - 20 - read-write - - - MSSDL - desc MSSDL - 26 - 24 - read-write - - - MIDI - desc MIDI - 30 - 28 - read-write - - - - - SR - desc SR - 0x14 - 32 - read-write - 0x20 - 0xBF - - - OVRERF - desc OVRERF - 0 - 0 - read-write - - - IDLNF - desc IDLNF - 1 - 1 - read-only - - - MODFERF - desc MODFERF - 2 - 2 - read-write - - - PERF - desc PERF - 3 - 3 - read-write - - - UDRERF - desc UDRERF - 4 - 4 - read-write - - - TDEF - desc TDEF - 5 - 5 - read-write - - - RDFF - desc RDFF - 7 - 7 - read-write - - - - - CFG2 - desc CFG2 - 0x18 - 32 - read-write - 0xF1D - 0xFFFF - - - CPHA - desc CPHA - 0 - 0 - read-write - - - CPOL - desc CPOL - 1 - 1 - read-write - - - MBR - desc MBR - 4 - 2 - read-write - - - SSA - desc SSA - 7 - 5 - read-write - - - DSIZE - desc DSIZE - 11 - 8 - read-write - - - LSBF - desc LSBF - 12 - 12 - read-write - - - MIDIE - desc MIDIE - 13 - 13 - read-write - - - MSSDLE - desc MSSDLE - 14 - 14 - read-write - - - MSSIE - desc MSSIE - 15 - 15 - read-write - - - - - - - SPI2 - desc SPI - 0x4001C400 - - 0x0 - 0x1C - - - - SPI3 - desc SPI - 0x40020000 - - 0x0 - 0x1C - - - - SPI4 - desc SPI - 0x40020400 - - 0x0 - 0x1C - - - - SRAMC - desc SRAMC - 0x40050800 - - 0x0 - 0x14 - - - - WTCR - desc WTCR - 0x0 - 32 - read-write - 0x0 - 0x77777777 - - - SRAM12_RWT - desc SRAM12_RWT - 2 - 0 - read-write - - - SRAM12_WWT - desc SRAM12_WWT - 6 - 4 - read-write - - - SRAM3_RWT - desc SRAM3_RWT - 10 - 8 - read-write - - - SRAM3_WWT - desc SRAM3_WWT - 14 - 12 - read-write - - - SRAMH_RWT - desc SRAMH_RWT - 18 - 16 - read-write - - - SRAMH_WWT - desc SRAMH_WWT - 22 - 20 - read-write - - - SRAMR_RWT - desc SRAMR_RWT - 26 - 24 - read-write - - - SRAMR_WWT - desc SRAMR_WWT - 30 - 28 - read-write - - - - - WTPR - desc WTPR - 0x4 - 32 - read-write - 0x0 - 0xFF - - - WTPRC - desc WTPRC - 0 - 0 - read-write - - - WTPRKW - desc WTPRKW - 7 - 1 - read-write - - - - - CKCR - desc CKCR - 0x8 - 32 - read-write - 0x0 - 0x3010001 - - - PYOAD - desc PYOAD - 0 - 0 - read-write - - - ECCOAD - desc ECCOAD - 16 - 16 - read-write - - - ECCMOD - desc ECCMOD - 25 - 24 - read-write - - - - - CKPR - desc CKPR - 0xC - 32 - read-write - 0x0 - 0xFF - - - CKPRC - desc CKPRC - 0 - 0 - read-write - - - CKPRKW - desc CKPRKW - 7 - 1 - read-write - - - - - CKSR - desc CKSR - 0x10 - 32 - read-write - 0x0 - 0x1F - - - SRAM3_1ERR - desc SRAM3_1ERR - 0 - 0 - read-write - - - SRAM3_2ERR - desc SRAM3_2ERR - 1 - 1 - read-write - - - SRAM12_PYERR - desc SRAM12_PYERR - 2 - 2 - read-write - - - SRAMH_PYERR - desc SRAMH_PYERR - 3 - 3 - read-write - - - SRAMR_PYERR - desc SRAMR_PYERR - 4 - 4 - read-write - - - - - - - SWDT - desc SWDT - 0x40049400 - - 0x0 - 0xC - - - - SR - desc SR - 0x4 - 32 - read-write - 0x0 - 0x3FFFF - - - CNT - desc CNT - 15 - 0 - read-only - - - UDF - desc UDF - 16 - 16 - read-write - - - REF - desc REF - 17 - 17 - read-write - - - - - RR - desc RR - 0x8 - 32 - read-write - 0x0 - 0xFFFF - - - RF - desc RF - 15 - 0 - read-write - - - - - - - TMR01 - desc TMR0 - 0x40024000 - - 0x0 - 0x18 - - - - CNTAR - desc CNTAR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - CNTA - desc CNTA - 15 - 0 - read-write - - - - - CNTBR - desc CNTBR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - CNTB - desc CNTB - 15 - 0 - read-write - - - - - CMPAR - desc CMPAR - 0x8 - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPA - desc CMPA - 15 - 0 - read-write - - - - - CMPBR - desc CMPBR - 0xC - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPB - desc CMPB - 15 - 0 - read-write - - - - - BCONR - desc BCONR - 0x10 - 32 - read-write - 0x0 - 0xF7F7F7F7 - - - CSTA - desc CSTA - 0 - 0 - read-write - - - CAPMDA - desc CAPMDA - 1 - 1 - read-write - - - INTENA - desc INTENA - 2 - 2 - read-write - - - CKDIVA - desc CKDIVA - 7 - 4 - read-write - - - SYNSA - desc SYNSA - 8 - 8 - read-write - - - SYNCLKA - desc SYNCLKA - 9 - 9 - read-write - - - ASYNCLKA - desc ASYNCLKA - 10 - 10 - read-write - - - HSTAA - desc HSTAA - 12 - 12 - read-write - - - HSTPA - desc HSTPA - 13 - 13 - read-write - - - HCLEA - desc HCLEA - 14 - 14 - read-write - - - HICPA - desc HICPA - 15 - 15 - read-write - - - CSTB - desc CSTB - 16 - 16 - read-write - - - CAPMDB - desc CAPMDB - 17 - 17 - read-write - - - INTENB - desc INTENB - 18 - 18 - read-write - - - CKDIVB - desc CKDIVB - 23 - 20 - read-write - - - SYNSB - desc SYNSB - 24 - 24 - read-write - - - SYNCLKB - desc SYNCLKB - 25 - 25 - read-write - - - ASYNCLKB - desc ASYNCLKB - 26 - 26 - read-write - - - HSTAB - desc HSTAB - 28 - 28 - read-write - - - HSTPB - desc HSTPB - 29 - 29 - read-write - - - HCLEB - desc HCLEB - 30 - 30 - read-write - - - HICPB - desc HICPB - 31 - 31 - read-write - - - - - STFLR - desc STFLR - 0x14 - 32 - read-write - 0x0 - 0x10001 - - - CMFA - desc CMFA - 0 - 0 - read-write - - - CMFB - desc CMFB - 16 - 16 - read-write - - - - - - - TMR02 - desc TMR0 - 0x40024400 - - 0x0 - 0x18 - - - - TMR41 - desc TMR4 - 0x40017000 - - 0x0 - 0xF2 - - - - OCCRUH - desc OCCRUH - 0x2 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRUL - desc OCCRUL - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRVH - desc OCCRVH - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - OCCRVL - desc OCCRVL - 0xE - 16 - read-write - 0x0 - 0xFFFF - - - OCCRWH - desc OCCRWH - 0x12 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRWL - desc OCCRWL - 0x16 - 16 - read-write - 0x0 - 0xFFFF - - - OCSRU - desc OCSRU - 0x18 - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERU - desc OCERU - 0x1A - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCSRV - desc OCSRV - 0x1C - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERV - desc OCERV - 0x1E - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCSRW - desc OCSRW - 0x20 - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERW - desc OCERW - 0x22 - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCMRHUH - desc OCMRHUH - 0x24 - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLUL - desc OCMRLUL - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - OCMRHVH - desc OCMRHVH - 0x2C - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLVL - desc OCMRLVL - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - OCMRHWH - desc OCMRHWH - 0x34 - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLWL - desc OCMRLWL - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - CPSR - desc CPSR - 0x42 - 16 - read-write - 0xFFFF - 0xFFFF - - - CNTR - desc CNTR - 0x46 - 16 - read-write - 0x0 - 0xFFFF - - - CCSR - desc CCSR - 0x48 - 16 - read-write - 0x40 - 0xE3FF - - - CKDIV - desc CKDIV - 3 - 0 - read-write - - - CLEAR - desc CLEAR - 4 - 4 - read-write - - - MODE - desc MODE - 5 - 5 - read-write - - - STOP - desc STOP - 6 - 6 - read-write - - - BUFEN - desc BUFEN - 7 - 7 - read-write - - - IRQPEN - desc IRQPEN - 8 - 8 - read-write - - - IRQPF - desc IRQPF - 9 - 9 - read-write - - - IRQZEN - desc IRQZEN - 13 - 13 - read-write - - - IRQZF - desc IRQZF - 14 - 14 - read-write - - - ECKEN - desc ECKEN - 15 - 15 - read-write - - - - - CVPR - desc CVPR - 0x4A - 16 - read-write - 0x0 - 0xFFFF - - - ZIM - desc ZIM - 3 - 0 - read-write - - - PIM - desc PIM - 7 - 4 - read-write - - - ZIC - desc ZIC - 11 - 8 - read-only - - - PIC - desc PIC - 15 - 12 - read-only - - - - - PFSRU - desc PFSRU - 0x82 - 16 - read-write - 0x0 - 0xFFFF - - - PDARU - desc PDARU - 0x84 - 16 - read-write - 0x0 - 0xFFFF - - - PDBRU - desc PDBRU - 0x86 - 16 - read-write - 0x0 - 0xFFFF - - - PFSRV - desc PFSRV - 0x8A - 16 - read-write - 0x0 - 0xFFFF - - - PDARV - desc PDARV - 0x8C - 16 - read-write - 0x0 - 0xFFFF - - - PDBRV - desc PDBRV - 0x8E - 16 - read-write - 0x0 - 0xFFFF - - - PFSRW - desc PFSRW - 0x92 - 16 - read-write - 0x0 - 0xFFFF - - - PDARW - desc PDARW - 0x94 - 16 - read-write - 0x0 - 0xFFFF - - - PDBRW - desc PDBRW - 0x96 - 16 - read-write - 0x0 - 0xFFFF - - - POCRU - desc POCRU - 0x98 - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - POCRV - desc POCRV - 0x9C - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - POCRW - desc POCRW - 0xA0 - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - RCSR - desc RCSR - 0xA4 - 16 - read-write - 0x0 - 0xFFF7 - - - RTIDU - desc RTIDU - 0 - 0 - read-write - - - RTIDV - desc RTIDV - 1 - 1 - read-write - - - RTIDW - desc RTIDW - 2 - 2 - read-write - - - RTIFU - desc RTIFU - 4 - 4 - read-only - - - RTICU - desc RTICU - 5 - 5 - read-write - - - RTEU - desc RTEU - 6 - 6 - read-write - - - RTSU - desc RTSU - 7 - 7 - read-write - - - RTIFV - desc RTIFV - 8 - 8 - read-only - - - RTICV - desc RTICV - 9 - 9 - read-write - - - RTEV - desc RTEV - 10 - 10 - read-write - - - RTSV - desc RTSV - 11 - 11 - read-write - - - RTIFW - desc RTIFW - 12 - 12 - read-only - - - RTICW - desc RTICW - 13 - 13 - read-write - - - RTEW - desc RTEW - 14 - 14 - read-write - - - RTSW - desc RTSW - 15 - 15 - read-write - - - - - SCCRUH - desc SCCRUH - 0xB2 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRUL - desc SCCRUL - 0xB6 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRVH - desc SCCRVH - 0xBA - 16 - read-write - 0x0 - 0xFFFF - - - SCCRVL - desc SCCRVL - 0xBE - 16 - read-write - 0x0 - 0xFFFF - - - SCCRWH - desc SCCRWH - 0xC2 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRWL - desc SCCRWL - 0xC6 - 16 - read-write - 0x0 - 0xFFFF - - - SCSRUH - desc SCSRUH - 0xC8 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRUH - desc SCMRUH - 0xCA - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRUL - desc SCSRUL - 0xCC - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRUL - desc SCMRUL - 0xCE - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRVH - desc SCSRVH - 0xD0 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRVH - desc SCMRVH - 0xD2 - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRVL - desc SCSRVL - 0xD4 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRVL - desc SCMRVL - 0xD6 - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRWH - desc SCSRWH - 0xD8 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRWH - desc SCMRWH - 0xDA - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRWL - desc SCSRWL - 0xDC - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRWL - desc SCMRWL - 0xDE - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - ECSR - desc ECSR - 0xF0 - 16 - read-write - 0x0 - 0x80 - - - HOLD - desc HOLD - 7 - 7 - read-write - - - - - - - TMR42 - desc TMR4 - 0x40024800 - - 0x0 - 0xF2 - - - - TMR43 - desc TMR4 - 0x40024C00 - - 0x0 - 0xF2 - - - - TMR4CR - desc TMR4CR - 0x40055408 - - 0x0 - 0xC - - - - ECER1 - desc ECER1 - 0x0 - 32 - read-write - 0x0 - 0x3 - - - EMBVAL - desc EMBVAL - 1 - 0 - read-write - - - - - ECER2 - desc ECER2 - 0x4 - 32 - read-write - 0x0 - 0x3 - - - EMBVAL - desc EMBVAL - 1 - 0 - read-write - - - - - ECER3 - desc ECER3 - 0x8 - 32 - read-write - 0x0 - 0x3 - - - EMBVAL - desc EMBVAL - 1 - 0 - read-write - - - - - - - TMR61 - desc TMR6 - 0x40018000 - - 0x0 - 0x90 - - - - CNTER - desc CNTER - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - CNT - desc CNT - 15 - 0 - read-write - - - - - PERAR - desc PERAR - 0x4 - 32 - read-write - 0xFFFF - 0xFFFF - - - PERA - desc PERA - 15 - 0 - read-write - - - - - PERBR - desc PERBR - 0x8 - 32 - read-write - 0xFFFF - 0xFFFF - - - PERB - desc PERB - 15 - 0 - read-write - - - - - PERCR - desc PERCR - 0xC - 32 - read-write - 0xFFFF - 0xFFFF - - - PERC - desc PERC - 15 - 0 - read-write - - - - - GCMAR - desc GCMAR - 0x10 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMA - desc GCMA - 15 - 0 - read-write - - - - - GCMBR - desc GCMBR - 0x14 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMB - desc GCMB - 15 - 0 - read-write - - - - - GCMCR - desc GCMCR - 0x18 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMC - desc GCMC - 15 - 0 - read-write - - - - - GCMDR - desc GCMDR - 0x1C - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMD - desc GCMD - 15 - 0 - read-write - - - - - GCMER - desc GCMER - 0x20 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCME - desc GCME - 15 - 0 - read-write - - - - - GCMFR - desc GCMFR - 0x24 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMF - desc GCMF - 15 - 0 - read-write - - - - - SCMAR - desc SCMAR - 0x28 - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMA - desc SCMA - 15 - 0 - read-write - - - - - SCMBR - desc SCMBR - 0x2C - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMB - desc SCMB - 15 - 0 - read-write - - - - - SCMCR - desc SCMCR - 0x30 - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMC - desc SCMC - 15 - 0 - read-write - - - - - SCMDR - desc SCMDR - 0x34 - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMD - desc SCMD - 15 - 0 - read-write - - - - - SCMER - desc SCMER - 0x38 - 32 - read-write - 0xFFFF - 0xFFFF - - - SCME - desc SCME - 15 - 0 - read-write - - - - - SCMFR - desc SCMFR - 0x3C - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMF - desc SCMF - 15 - 0 - read-write - - - - - DTUAR - desc DTUAR - 0x40 - 32 - read-write - 0xFFFF - 0xFFFF - - - DTUA - desc DTUA - 15 - 0 - read-write - - - - - DTDAR - desc DTDAR - 0x44 - 32 - read-write - 0xFFFF - 0xFFFF - - - DTDA - desc DTDA - 15 - 0 - read-write - - - - - DTUBR - desc DTUBR - 0x48 - 32 - read-write - 0xFFFF - 0xFFFF - - - DTUB - desc DTUB - 15 - 0 - read-write - - - - - DTDBR - desc DTDBR - 0x4C - 32 - read-write - 0xFFFF - 0xFFFF - - - DTDB - desc DTDB - 15 - 0 - read-write - - - - - GCONR - desc GCONR - 0x50 - 32 - read-write - 0x100 - 0xF017F - - - START - desc START - 0 - 0 - read-write - - - MODE - desc MODE - 3 - 1 - read-write - - - CKDIV - desc CKDIV - 6 - 4 - read-write - - - DIR - desc DIR - 8 - 8 - read-write - - - ZMSKREV - desc ZMSKREV - 16 - 16 - read-write - - - ZMSKPOS - desc ZMSKPOS - 17 - 17 - read-write - - - ZMSKVAL - desc ZMSKVAL - 19 - 18 - read-write - - - - - ICONR - desc ICONR - 0x54 - 32 - read-write - 0x0 - 0xF01FF - - - INTENA - desc INTENA - 0 - 0 - read-write - - - INTENB - desc INTENB - 1 - 1 - read-write - - - INTENC - desc INTENC - 2 - 2 - read-write - - - INTEND - desc INTEND - 3 - 3 - read-write - - - INTENE - desc INTENE - 4 - 4 - read-write - - - INTENF - desc INTENF - 5 - 5 - read-write - - - INTENOVF - desc INTENOVF - 6 - 6 - read-write - - - INTENUDF - desc INTENUDF - 7 - 7 - read-write - - - INTENDTE - desc INTENDTE - 8 - 8 - read-write - - - INTENSAU - desc INTENSAU - 16 - 16 - read-write - - - INTENSAD - desc INTENSAD - 17 - 17 - read-write - - - INTENSBU - desc INTENSBU - 18 - 18 - read-write - - - INTENSBD - desc INTENSBD - 19 - 19 - read-write - - - - - PCONR - desc PCONR - 0x58 - 32 - read-write - 0x0 - 0x19FF19FF - - - CAPMDA - desc CAPMDA - 0 - 0 - read-write - - - STACA - desc STACA - 1 - 1 - read-write - - - STPCA - desc STPCA - 2 - 2 - read-write - - - STASTPSA - desc STASTPSA - 3 - 3 - read-write - - - CMPCA - desc CMPCA - 5 - 4 - read-write - - - PERCA - desc PERCA - 7 - 6 - read-write - - - OUTENA - desc OUTENA - 8 - 8 - read-write - - - EMBVALA - desc EMBVALA - 12 - 11 - read-write - - - CAPMDB - desc CAPMDB - 16 - 16 - read-write - - - STACB - desc STACB - 17 - 17 - read-write - - - STPCB - desc STPCB - 18 - 18 - read-write - - - STASTPSB - desc STASTPSB - 19 - 19 - read-write - - - CMPCB - desc CMPCB - 21 - 20 - read-write - - - PERCB - desc PERCB - 23 - 22 - read-write - - - OUTENB - desc OUTENB - 24 - 24 - read-write - - - EMBVALB - desc EMBVALB - 28 - 27 - read-write - - - - - BCONR - desc BCONR - 0x5C - 32 - read-write - 0x0 - 0x3333030F - - - BENA - desc BENA - 0 - 0 - read-write - - - BSEA - desc BSEA - 1 - 1 - read-write - - - BENB - desc BENB - 2 - 2 - read-write - - - BSEB - desc BSEB - 3 - 3 - read-write - - - BENP - desc BENP - 8 - 8 - read-write - - - BSEP - desc BSEP - 9 - 9 - read-write - - - BENSPA - desc BENSPA - 16 - 16 - read-write - - - BSESPA - desc BSESPA - 17 - 17 - read-write - - - BTRUSPA - desc BTRUSPA - 20 - 20 - read-write - - - BTRDSPA - desc BTRDSPA - 21 - 21 - read-write - - - BENSPB - desc BENSPB - 24 - 24 - read-write - - - BSESPB - desc BSESPB - 25 - 25 - read-write - - - BTRUSPB - desc BTRUSPB - 28 - 28 - read-write - - - BTRDSPB - desc BTRDSPB - 29 - 29 - read-write - - - - - DCONR - desc DCONR - 0x60 - 32 - read-write - 0x0 - 0x131 - - - DTCEN - desc DTCEN - 0 - 0 - read-write - - - DTBENU - desc DTBENU - 4 - 4 - read-write - - - DTBEND - desc DTBEND - 5 - 5 - read-write - - - SEPA - desc SEPA - 8 - 8 - read-write - - - - - FCONR - desc FCONR - 0x68 - 32 - read-write - 0x0 - 0x770077 - - - NOFIENGA - desc NOFIENGA - 0 - 0 - read-write - - - NOFICKGA - desc NOFICKGA - 2 - 1 - read-write - - - NOFIENGB - desc NOFIENGB - 4 - 4 - read-write - - - NOFICKGB - desc NOFICKGB - 6 - 5 - read-write - - - NOFIENTA - desc NOFIENTA - 16 - 16 - read-write - - - NOFICKTA - desc NOFICKTA - 18 - 17 - read-write - - - NOFIENTB - desc NOFIENTB - 20 - 20 - read-write - - - NOFICKTB - desc NOFICKTB - 22 - 21 - read-write - - - - - VPERR - desc VPERR - 0x6C - 32 - read-write - 0x0 - 0x1F0300 - - - SPPERIA - desc SPPERIA - 8 - 8 - read-write - - - SPPERIB - desc SPPERIB - 9 - 9 - read-write - - - PCNTE - desc PCNTE - 17 - 16 - read-write - - - PCNTS - desc PCNTS - 20 - 18 - read-write - - - - - STFLR - desc STFLR - 0x70 - 32 - read-write - 0x80000000 - 0x80E01FFF - - - CMAF - desc CMAF - 0 - 0 - read-write - - - CMBF - desc CMBF - 1 - 1 - read-write - - - CMCF - desc CMCF - 2 - 2 - read-write - - - CMDF - desc CMDF - 3 - 3 - read-write - - - CMEF - desc CMEF - 4 - 4 - read-write - - - CMFF - desc CMFF - 5 - 5 - read-write - - - OVFF - desc OVFF - 6 - 6 - read-write - - - UDFF - desc UDFF - 7 - 7 - read-write - - - DTEF - desc DTEF - 8 - 8 - read-only - - - CMSAUF - desc CMSAUF - 9 - 9 - read-write - - - CMSADF - desc CMSADF - 10 - 10 - read-write - - - CMSBUF - desc CMSBUF - 11 - 11 - read-write - - - CMSBDF - desc CMSBDF - 12 - 12 - read-write - - - VPERNUM - desc VPERNUM - 23 - 21 - read-only - - - DIRF - desc DIRF - 31 - 31 - read-only - - - - - HSTAR - desc HSTAR - 0x74 - 32 - read-write - 0x0 - 0x80000FF3 - - - HSTA0 - desc HSTA0 - 0 - 0 - read-write - - - HSTA1 - desc HSTA1 - 1 - 1 - read-write - - - HSTA4 - desc HSTA4 - 4 - 4 - read-write - - - HSTA5 - desc HSTA5 - 5 - 5 - read-write - - - HSTA6 - desc HSTA6 - 6 - 6 - read-write - - - HSTA7 - desc HSTA7 - 7 - 7 - read-write - - - HSTA8 - desc HSTA8 - 8 - 8 - read-write - - - HSTA9 - desc HSTA9 - 9 - 9 - read-write - - - HSTA10 - desc HSTA10 - 10 - 10 - read-write - - - HSTA11 - desc HSTA11 - 11 - 11 - read-write - - - STAS - desc STAS - 31 - 31 - read-write - - - - - HSTPR - desc HSTPR - 0x78 - 32 - read-write - 0x0 - 0x80000FF3 - - - HSTP0 - desc HSTP0 - 0 - 0 - read-write - - - HSTP1 - desc HSTP1 - 1 - 1 - read-write - - - HSTP4 - desc HSTP4 - 4 - 4 - read-write - - - HSTP5 - desc HSTP5 - 5 - 5 - read-write - - - HSTP6 - desc HSTP6 - 6 - 6 - read-write - - - HSTP7 - desc HSTP7 - 7 - 7 - read-write - - - HSTP8 - desc HSTP8 - 8 - 8 - read-write - - - HSTP9 - desc HSTP9 - 9 - 9 - read-write - - - HSTP10 - desc HSTP10 - 10 - 10 - read-write - - - HSTP11 - desc HSTP11 - 11 - 11 - read-write - - - STPS - desc STPS - 31 - 31 - read-write - - - - - HCLRR - desc HCLRR - 0x7C - 32 - read-write - 0x0 - 0x80000FF3 - - - HCLE0 - desc HCLE0 - 0 - 0 - read-write - - - HCLE1 - desc HCLE1 - 1 - 1 - read-write - - - HCLE4 - desc HCLE4 - 4 - 4 - read-write - - - HCLE5 - desc HCLE5 - 5 - 5 - read-write - - - HCLE6 - desc HCLE6 - 6 - 6 - read-write - - - HCLE7 - desc HCLE7 - 7 - 7 - read-write - - - HCLE8 - desc HCLE8 - 8 - 8 - read-write - - - HCLE9 - desc HCLE9 - 9 - 9 - read-write - - - HCLE10 - desc HCLE10 - 10 - 10 - read-write - - - HCLE11 - desc HCLE11 - 11 - 11 - read-write - - - CLES - desc CLES - 31 - 31 - read-write - - - - - HCPAR - desc HCPAR - 0x80 - 32 - read-write - 0x0 - 0xFF3 - - - HCPA0 - desc HCPA0 - 0 - 0 - read-write - - - HCPA1 - desc HCPA1 - 1 - 1 - read-write - - - HCPA4 - desc HCPA4 - 4 - 4 - read-write - - - HCPA5 - desc HCPA5 - 5 - 5 - read-write - - - HCPA6 - desc HCPA6 - 6 - 6 - read-write - - - HCPA7 - desc HCPA7 - 7 - 7 - read-write - - - HCPA8 - desc HCPA8 - 8 - 8 - read-write - - - HCPA9 - desc HCPA9 - 9 - 9 - read-write - - - HCPA10 - desc HCPA10 - 10 - 10 - read-write - - - HCPA11 - desc HCPA11 - 11 - 11 - read-write - - - - - HCPBR - desc HCPBR - 0x84 - 32 - read-write - 0x0 - 0xFF3 - - - HCPB0 - desc HCPB0 - 0 - 0 - read-write - - - HCPB1 - desc HCPB1 - 1 - 1 - read-write - - - HCPB4 - desc HCPB4 - 4 - 4 - read-write - - - HCPB5 - desc HCPB5 - 5 - 5 - read-write - - - HCPB6 - desc HCPB6 - 6 - 6 - read-write - - - HCPB7 - desc HCPB7 - 7 - 7 - read-write - - - HCPB8 - desc HCPB8 - 8 - 8 - read-write - - - HCPB9 - desc HCPB9 - 9 - 9 - read-write - - - HCPB10 - desc HCPB10 - 10 - 10 - read-write - - - HCPB11 - desc HCPB11 - 11 - 11 - read-write - - - - - HCUPR - desc HCUPR - 0x88 - 32 - read-write - 0x0 - 0x30FFF - - - HCUP0 - desc HCUP0 - 0 - 0 - read-write - - - HCUP1 - desc HCUP1 - 1 - 1 - read-write - - - HCUP2 - desc HCUP2 - 2 - 2 - read-write - - - HCUP3 - desc HCUP3 - 3 - 3 - read-write - - - HCUP4 - desc HCUP4 - 4 - 4 - read-write - - - HCUP5 - desc HCUP5 - 5 - 5 - read-write - - - HCUP6 - desc HCUP6 - 6 - 6 - read-write - - - HCUP7 - desc HCUP7 - 7 - 7 - read-write - - - HCUP8 - desc HCUP8 - 8 - 8 - read-write - - - HCUP9 - desc HCUP9 - 9 - 9 - read-write - - - HCUP10 - desc HCUP10 - 10 - 10 - read-write - - - HCUP11 - desc HCUP11 - 11 - 11 - read-write - - - HCUP16 - desc HCUP16 - 16 - 16 - read-write - - - HCUP17 - desc HCUP17 - 17 - 17 - read-write - - - - - HCDOR - desc HCDOR - 0x8C - 32 - read-write - 0x0 - 0x30FFF - - - HCDO0 - desc HCDO0 - 0 - 0 - read-write - - - HCDO1 - desc HCDO1 - 1 - 1 - read-write - - - HCDO2 - desc HCDO2 - 2 - 2 - read-write - - - HCDO3 - desc HCDO3 - 3 - 3 - read-write - - - HCDO4 - desc HCDO4 - 4 - 4 - read-write - - - HCDO5 - desc HCDO5 - 5 - 5 - read-write - - - HCDO6 - desc HCDO6 - 6 - 6 - read-write - - - HCDO7 - desc HCDO7 - 7 - 7 - read-write - - - HCDO8 - desc HCDO8 - 8 - 8 - read-write - - - HCDO9 - desc HCDO9 - 9 - 9 - read-write - - - HCDO10 - desc HCDO10 - 10 - 10 - read-write - - - HCDO11 - desc HCDO11 - 11 - 11 - read-write - - - HCDO16 - desc HCDO16 - 16 - 16 - read-write - - - HCDO17 - desc HCDO17 - 17 - 17 - read-write - - - - - - - TMR62 - desc TMR6 - 0x40018400 - - 0x0 - 0x90 - - - - TMR63 - desc TMR6 - 0x40018800 - - 0x0 - 0x90 - - - - TMR6CR - desc TMR6CR - 0x40018000 - TMR61 - - 0x0 - 0x400 - - - - SSTAR - desc SSTAR - 0x3F4 - 32 - read-write - 0x0 - 0x7 - - - SSTA1 - desc SSTA1 - 0 - 0 - read-write - - - SSTA2 - desc SSTA2 - 1 - 1 - read-write - - - SSTA3 - desc SSTA3 - 2 - 2 - read-write - - - - - SSTPR - desc SSTPR - 0x3F8 - 32 - read-write - 0x0 - 0x7 - - - SSTP1 - desc SSTP1 - 0 - 0 - read-write - - - SSTP2 - desc SSTP2 - 1 - 1 - read-write - - - SSTP3 - desc SSTP3 - 2 - 2 - read-write - - - - - SCLRR - desc SCLRR - 0x3FC - 32 - read-write - 0x0 - 0x7 - - - SCLE1 - desc SCLE1 - 0 - 0 - read-write - - - SCLE2 - desc SCLE2 - 1 - 1 - read-write - - - SCLE3 - desc SCLE3 - 2 - 2 - read-write - - - - - - - TMRA1 - desc TMRA - 0x40015000 - - 0x0 - 0x160 - - - - CNTER - desc CNTER - 0x0 - 16 - read-write - 0x0 - 0xFFFF - - - CNT - desc CNT - 15 - 0 - read-write - - - - - PERAR - desc PERAR - 0x4 - 16 - read-write - 0xFFFF - 0xFFFF - - - PER - desc PER - 15 - 0 - read-write - - - - - CMPAR1 - desc CMPAR1 - 0x40 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR2 - desc CMPAR2 - 0x44 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR3 - desc CMPAR3 - 0x48 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR4 - desc CMPAR4 - 0x4C - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR5 - desc CMPAR5 - 0x50 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR6 - desc CMPAR6 - 0x54 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR7 - desc CMPAR7 - 0x58 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR8 - desc CMPAR8 - 0x5C - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - BCSTR - desc BCSTR - 0x80 - 16 - read-write - 0x2 - 0xF0FF - - - START - desc START - 0 - 0 - read-write - - - DIR - desc DIR - 1 - 1 - read-write - - - MODE - desc MODE - 2 - 2 - read-write - - - SYNST - desc SYNST - 3 - 3 - read-write - - - CKDIV - desc CKDIV - 7 - 4 - read-write - - - ITENOVF - desc ITENOVF - 12 - 12 - read-write - - - ITENUDF - desc ITENUDF - 13 - 13 - read-write - - - OVFF - desc OVFF - 14 - 14 - read-write - - - UDFF - desc UDFF - 15 - 15 - read-write - - - - - HCONR - desc HCONR - 0x84 - 16 - read-write - 0x0 - 0xF777 - - - HSTA0 - desc HSTA0 - 0 - 0 - read-write - - - HSTA1 - desc HSTA1 - 1 - 1 - read-write - - - HSTA2 - desc HSTA2 - 2 - 2 - read-write - - - HSTP0 - desc HSTP0 - 4 - 4 - read-write - - - HSTP1 - desc HSTP1 - 5 - 5 - read-write - - - HSTP2 - desc HSTP2 - 6 - 6 - read-write - - - HCLE0 - desc HCLE0 - 8 - 8 - read-write - - - HCLE1 - desc HCLE1 - 9 - 9 - read-write - - - HCLE2 - desc HCLE2 - 10 - 10 - read-write - - - HCLE3 - desc HCLE3 - 12 - 12 - read-write - - - HCLE4 - desc HCLE4 - 13 - 13 - read-write - - - HCLE5 - desc HCLE5 - 14 - 14 - read-write - - - HCLE6 - desc HCLE6 - 15 - 15 - read-write - - - - - HCUPR - desc HCUPR - 0x88 - 16 - read-write - 0x0 - 0x1FFF - - - HCUP0 - desc HCUP0 - 0 - 0 - read-write - - - HCUP1 - desc HCUP1 - 1 - 1 - read-write - - - HCUP2 - desc HCUP2 - 2 - 2 - read-write - - - HCUP3 - desc HCUP3 - 3 - 3 - read-write - - - HCUP4 - desc HCUP4 - 4 - 4 - read-write - - - HCUP5 - desc HCUP5 - 5 - 5 - read-write - - - HCUP6 - desc HCUP6 - 6 - 6 - read-write - - - HCUP7 - desc HCUP7 - 7 - 7 - read-write - - - HCUP8 - desc HCUP8 - 8 - 8 - read-write - - - HCUP9 - desc HCUP9 - 9 - 9 - read-write - - - HCUP10 - desc HCUP10 - 10 - 10 - read-write - - - HCUP11 - desc HCUP11 - 11 - 11 - read-write - - - HCUP12 - desc HCUP12 - 12 - 12 - read-write - - - - - HCDOR - desc HCDOR - 0x8C - 16 - read-write - 0x0 - 0x1FFF - - - HCDO0 - desc HCDO0 - 0 - 0 - read-write - - - HCDO1 - desc HCDO1 - 1 - 1 - read-write - - - HCDO2 - desc HCDO2 - 2 - 2 - read-write - - - HCDO3 - desc HCDO3 - 3 - 3 - read-write - - - HCDO4 - desc HCDO4 - 4 - 4 - read-write - - - HCDO5 - desc HCDO5 - 5 - 5 - read-write - - - HCDO6 - desc HCDO6 - 6 - 6 - read-write - - - HCDO7 - desc HCDO7 - 7 - 7 - read-write - - - HCDO8 - desc HCDO8 - 8 - 8 - read-write - - - HCDO9 - desc HCDO9 - 9 - 9 - read-write - - - HCDO10 - desc HCDO10 - 10 - 10 - read-write - - - HCDO11 - desc HCDO11 - 11 - 11 - read-write - - - HCDO12 - desc HCDO12 - 12 - 12 - read-write - - - - - ICONR - desc ICONR - 0x90 - 16 - read-write - 0x0 - 0xFF - - - ITEN1 - desc ITEN1 - 0 - 0 - read-write - - - ITEN2 - desc ITEN2 - 1 - 1 - read-write - - - ITEN3 - desc ITEN3 - 2 - 2 - read-write - - - ITEN4 - desc ITEN4 - 3 - 3 - read-write - - - ITEN5 - desc ITEN5 - 4 - 4 - read-write - - - ITEN6 - desc ITEN6 - 5 - 5 - read-write - - - ITEN7 - desc ITEN7 - 6 - 6 - read-write - - - ITEN8 - desc ITEN8 - 7 - 7 - read-write - - - - - ECONR - desc ECONR - 0x94 - 16 - read-write - 0x0 - 0xFF - - - ETEN1 - desc ETEN1 - 0 - 0 - read-write - - - ETEN2 - desc ETEN2 - 1 - 1 - read-write - - - ETEN3 - desc ETEN3 - 2 - 2 - read-write - - - ETEN4 - desc ETEN4 - 3 - 3 - read-write - - - ETEN5 - desc ETEN5 - 4 - 4 - read-write - - - ETEN6 - desc ETEN6 - 5 - 5 - read-write - - - ETEN7 - desc ETEN7 - 6 - 6 - read-write - - - ETEN8 - desc ETEN8 - 7 - 7 - read-write - - - - - FCONR - desc FCONR - 0x98 - 16 - read-write - 0x0 - 0x7707 - - - NOFIENTG - desc NOFIENTG - 0 - 0 - read-write - - - NOFICKTG - desc NOFICKTG - 2 - 1 - read-write - - - NOFIENCA - desc NOFIENCA - 8 - 8 - read-write - - - NOFICKCA - desc NOFICKCA - 10 - 9 - read-write - - - NOFIENCB - desc NOFIENCB - 12 - 12 - read-write - - - NOFICKCB - desc NOFICKCB - 14 - 13 - read-write - - - - - STFLR - desc STFLR - 0x9C - 16 - read-write - 0x0 - 0xFF - - - CMPF1 - desc CMPF1 - 0 - 0 - read-write - - - CMPF2 - desc CMPF2 - 1 - 1 - read-write - - - CMPF3 - desc CMPF3 - 2 - 2 - read-write - - - CMPF4 - desc CMPF4 - 3 - 3 - read-write - - - CMPF5 - desc CMPF5 - 4 - 4 - read-write - - - CMPF6 - desc CMPF6 - 5 - 5 - read-write - - - CMPF7 - desc CMPF7 - 6 - 6 - read-write - - - CMPF8 - desc CMPF8 - 7 - 7 - read-write - - - - - BCONR1 - desc BCONR1 - 0xC0 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - BCONR2 - desc BCONR2 - 0xC8 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - BCONR3 - desc BCONR3 - 0xD0 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - BCONR4 - desc BCONR4 - 0xD8 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - CCONR1 - desc CCONR1 - 0x100 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR2 - desc CCONR2 - 0x104 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR3 - desc CCONR3 - 0x108 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR4 - desc CCONR4 - 0x10C - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR5 - desc CCONR5 - 0x110 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR6 - desc CCONR6 - 0x114 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR7 - desc CCONR7 - 0x118 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR8 - desc CCONR8 - 0x11C - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - PCONR1 - desc PCONR1 - 0x140 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR2 - desc PCONR2 - 0x144 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR3 - desc PCONR3 - 0x148 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR4 - desc PCONR4 - 0x14C - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR5 - desc PCONR5 - 0x150 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR6 - desc PCONR6 - 0x154 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR7 - desc PCONR7 - 0x158 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR8 - desc PCONR8 - 0x15C - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - - - TMRA2 - desc TMRA - 0x40015400 - - 0x0 - 0x160 - - - - TMRA3 - desc TMRA - 0x40015800 - - 0x0 - 0x160 - - - - TMRA4 - desc TMRA - 0x40015C00 - - 0x0 - 0x160 - - - - TMRA5 - desc TMRA - 0x40016000 - - 0x0 - 0x160 - - - - TMRA6 - desc TMRA - 0x40016400 - - 0x0 - 0x160 - - - - TRNG - desc TRNG - 0x40041000 - - 0x0 - 0x14 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x3 - - - EN - desc EN - 0 - 0 - read-write - - - RUN - desc RUN - 1 - 1 - read-write - - - - - MR - desc MR - 0x4 - 32 - read-write - 0x12 - 0x1D - - - LOAD - desc LOAD - 0 - 0 - read-write - - - CNT - desc CNT - 4 - 2 - read-write - - - - - DR0 - desc DR0 - 0xC - 32 - read-only - 0x8000000 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x10 - 32 - read-only - 0x8000200 - 0xFFFFFFFF - - - - - USART1 - desc USART - 0x4001D000 - - 0x0 - 0x1C - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x101EB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - RTOF - desc RTOF - 8 - 8 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFFFF - 0xFF7F - - - DIV_FRACTION - desc DIV_FRACTION - 6 - 0 - read-write - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xF11B96FF - - - RTOE - desc RTOE - 0 - 0 - read-write - - - RTOIE - desc RTOIE - 1 - 1 - read-write - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - write-only - - - CFE - desc CFE - 17 - 17 - write-only - - - CORE - desc CORE - 19 - 19 - write-only - - - CRTOF - desc CRTOF - 20 - 20 - write-only - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - FBME - desc FBME - 29 - 29 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x0 - 0x3801 - - - MPE - desc MPE - 0 - 0 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0xE00220 - - - SCEN - desc SCEN - 5 - 5 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - BCN - desc BCN - 23 - 21 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0x3 - - - PSC - desc PSC - 1 - 0 - read-write - - - - - - - USART2 - desc USART - 0x4001D400 - - 0x0 - 0x1C - - - - USART3 - desc USART - 0x40021000 - - 0x0 - 0x1C - - - - USART4 - desc USART - 0x40021400 - - 0x0 - 0x1C - - - - USBFS - desc USBFS - 0x400C0000 - - 0x0 - 0xE04 - - - - GVBUSCFG - desc GVBUSCFG - 0x0 - 32 - read-write - 0x0 - 0xC0 - - - VBUSOVEN - desc VBUSOVEN - 6 - 6 - read-write - - - VBUSVAL - desc VBUSVAL - 7 - 7 - read-write - - - - - GAHBCFG - desc GAHBCFG - 0x8 - 32 - read-write - 0x0 - 0x1BF - - - GINTMSK - desc GINTMSK - 0 - 0 - read-write - - - HBSTLEN - desc HBSTLEN - 4 - 1 - read-write - - - DMAEN - desc DMAEN - 5 - 5 - read-write - - - TXFELVL - desc TXFELVL - 7 - 7 - read-write - - - PTXFELVL - desc PTXFELVL - 8 - 8 - read-write - - - - - GUSBCFG - desc GUSBCFG - 0xC - 32 - read-write - 0xA00 - 0x60003C47 - - - TOCAL - desc TOCAL - 2 - 0 - read-write - - - PHYSEL - desc PHYSEL - 6 - 6 - read-write - - - TRDT - desc TRDT - 13 - 10 - read-write - - - FHMOD - desc FHMOD - 29 - 29 - read-write - - - FDMOD - desc FDMOD - 30 - 30 - read-write - - - - - GRSTCTL - desc GRSTCTL - 0x10 - 32 - read-write - 0x80000000 - 0xC00007F7 - - - CSRST - desc CSRST - 0 - 0 - read-write - - - HSRST - desc HSRST - 1 - 1 - read-write - - - FCRST - desc FCRST - 2 - 2 - read-write - - - RXFFLSH - desc RXFFLSH - 4 - 4 - read-write - - - TXFFLSH - desc TXFFLSH - 5 - 5 - read-write - - - TXFNUM - desc TXFNUM - 10 - 6 - read-write - - - DMAREQ - desc DMAREQ - 30 - 30 - read-only - - - AHBIDL - desc AHBIDL - 31 - 31 - read-only - - - - - GINTSTS - desc GINTSTS - 0x14 - 32 - read-only - 0x14000020 - 0xF77CFCFB - - - CMOD - desc CMOD - 0 - 0 - read-only - - - MMIS - desc MMIS - 1 - 1 - read-write - - - SOF - desc SOF - 3 - 3 - read-write - - - RXFNE - desc RXFNE - 4 - 4 - read-only - - - NPTXFE - desc NPTXFE - 5 - 5 - read-only - - - GINAKEFF - desc GINAKEFF - 6 - 6 - read-only - - - GONAKEFF - desc GONAKEFF - 7 - 7 - read-only - - - ESUSP - desc ESUSP - 10 - 10 - read-write - - - USBSUSP - desc USBSUSP - 11 - 11 - read-write - - - USBRST - desc USBRST - 12 - 12 - read-write - - - ENUMDNE - desc ENUMDNE - 13 - 13 - read-write - - - ISOODRP - desc ISOODRP - 14 - 14 - read-write - - - EOPF - desc EOPF - 15 - 15 - read-write - - - IEPINT - desc IEPINT - 18 - 18 - read-only - - - OEPINT - desc OEPINT - 19 - 19 - read-only - - - IISOIXFR - desc IISOIXFR - 20 - 20 - read-write - - - IPXFR_INCOMPISOOUT - desc IPXFR_INCOMPISOOUT - 21 - 21 - read-write - - - DATAFSUSP - desc DATAFSUSP - 22 - 22 - read-write - - - HPRTINT - desc HPRTINT - 24 - 24 - read-only - - - HCINT - desc HCINT - 25 - 25 - read-only - - - PTXFE - desc PTXFE - 26 - 26 - read-only - - - CIDSCHG - desc CIDSCHG - 28 - 28 - read-write - - - DISCINT - desc DISCINT - 29 - 29 - read-write - - - VBUSVINT - desc VBUSVINT - 30 - 30 - read-write - - - WKUINT - desc WKUINT - 31 - 31 - read-write - - - - - GINTMSK - desc GINTMSK - 0x18 - 32 - read-write - 0x0 - 0xF77CFCFA - - - MMISM - desc MMISM - 1 - 1 - read-write - - - SOFM - desc SOFM - 3 - 3 - read-write - - - RXFNEM - desc RXFNEM - 4 - 4 - read-write - - - NPTXFEM - desc NPTXFEM - 5 - 5 - read-write - - - GINAKEFFM - desc GINAKEFFM - 6 - 6 - read-write - - - GONAKEFFM - desc GONAKEFFM - 7 - 7 - read-write - - - ESUSPM - desc ESUSPM - 10 - 10 - read-write - - - USBSUSPM - desc USBSUSPM - 11 - 11 - read-write - - - USBRSTM - desc USBRSTM - 12 - 12 - read-write - - - ENUMDNEM - desc ENUMDNEM - 13 - 13 - read-write - - - ISOODRPM - desc ISOODRPM - 14 - 14 - read-write - - - EOPFM - desc EOPFM - 15 - 15 - read-write - - - IEPIM - desc IEPIM - 18 - 18 - read-write - - - OEPIM - desc OEPIM - 19 - 19 - read-write - - - IISOIXFRM - desc IISOIXFRM - 20 - 20 - read-write - - - IPXFRM_INCOMPISOOUTM - desc IPXFRM_INCOMPISOOUTM - 21 - 21 - read-write - - - DATAFSUSPM - desc DATAFSUSPM - 22 - 22 - read-write - - - HPRTIM - desc HPRTIM - 24 - 24 - read-write - - - HCIM - desc HCIM - 25 - 25 - read-write - - - PTXFEM - desc PTXFEM - 26 - 26 - read-write - - - CIDSCHGM - desc CIDSCHGM - 28 - 28 - read-write - - - DISCIM - desc DISCIM - 29 - 29 - read-write - - - VBUSVIM - desc VBUSVIM - 30 - 30 - read-write - - - WKUIM - desc WKUIM - 31 - 31 - read-write - - - - - GRXSTSR - desc GRXSTSR - 0x1C - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXSTSP - desc GRXSTSP - 0x20 - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXFSIZ - desc GRXFSIZ - 0x24 - 32 - read-write - 0x140 - 0x7FF - - - RXFD - desc RXFD - 10 - 0 - read-write - - - - - HNPTXFSIZ - desc HNPTXFSIZ - 0x28 - 32 - read-write - 0x2000140 - 0xFFFFFFFF - - - NPTXFSA - desc NPTXFSA - 15 - 0 - read-write - - - NPTXFD - desc NPTXFD - 31 - 16 - read-write - - - - - HNPTXSTS - desc HNPTXSTS - 0x2C - 32 - read-only - 0x80100 - 0x7FFFFFFF - - - NPTXFSAV - desc NPTXFSAV - 15 - 0 - read-only - - - NPTQXSAV - desc NPTQXSAV - 23 - 16 - read-only - - - NPTXQTOP - desc NPTXQTOP - 30 - 24 - read-only - - - - - CID - desc CID - 0x3C - 32 - read-write - 0x12345678 - 0xFFFFFFFF - - - HPTXFSIZ - desc HPTXFSIZ - 0x100 - 32 - read-write - 0x1400280 - 0x7FF0FFF - - - PTXSA - desc PTXSA - 11 - 0 - read-write - - - PTXFD - desc PTXFD - 26 - 16 - read-write - - - - - DIEPTXF1 - desc DIEPTXF1 - 0x104 - 32 - read-write - 0x1000240 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - DIEPTXF2 - desc DIEPTXF2 - 0x108 - 32 - read-write - 0x1000340 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - DIEPTXF3 - desc DIEPTXF3 - 0x10C - 32 - read-write - 0x1000440 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - DIEPTXF4 - desc DIEPTXF4 - 0x110 - 32 - read-write - 0x1000540 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - DIEPTXF5 - desc DIEPTXF5 - 0x114 - 32 - read-write - 0x1000640 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - HCFG - desc HCFG - 0x400 - 32 - read-write - 0x200000 - 0x7 - - - FSLSPCS - desc FSLSPCS - 1 - 0 - read-write - - - FSLSS - desc FSLSS - 2 - 2 - read-write - - - - - HFIR - desc HFIR - 0x404 - 32 - read-write - 0xEA60 - 0xFFFF - - - FRIVL - desc FRIVL - 15 - 0 - read-write - - - - - HFNUM - desc HFNUM - 0x408 - 32 - read-only - 0x3FFF - 0xFFFFFFFF - - - FRNUM - desc FRNUM - 15 - 0 - read-only - - - FTREM - desc FTREM - 31 - 16 - read-only - - - - - HPTXSTS - desc HPTXSTS - 0x410 - 32 - read-only - 0x80100 - 0xFFFFFFFF - - - PTXFSAVL - desc PTXFSAVL - 15 - 0 - read-only - - - PTXQSAV - desc PTXQSAV - 23 - 16 - read-only - - - PTXQTOP - desc PTXQTOP - 31 - 24 - read-only - - - - - HAINT - desc HAINT - 0x414 - 32 - read-only - 0x0 - 0xFFF - - - HAINT - desc HAINT - 11 - 0 - read-only - - - - - HAINTMSK - desc HAINTMSK - 0x418 - 32 - read-write - 0x0 - 0xFFF - - - HAINTM - desc HAINTM - 11 - 0 - read-write - - - - - HPRT - desc HPRT - 0x440 - 32 - read-only - 0x0 - 0x61DCF - - - PCSTS - desc PCSTS - 0 - 0 - read-only - - - PCDET - desc PCDET - 1 - 1 - read-write - - - PENA - desc PENA - 2 - 2 - read-write - - - PENCHNG - desc PENCHNG - 3 - 3 - read-write - - - PRES - desc PRES - 6 - 6 - read-write - - - PSUSP - desc PSUSP - 7 - 7 - read-write - - - PRST - desc PRST - 8 - 8 - read-write - - - PLSTS - desc PLSTS - 11 - 10 - read-only - - - PWPR - desc PWPR - 12 - 12 - read-write - - - PSPD - desc PSPD - 18 - 17 - read-only - - - - - HCCHAR0 - desc HCCHAR0 - 0x500 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT0 - desc HCINT0 - 0x508 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK0 - desc HCINTMSK0 - 0x50C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ0 - desc HCTSIZ0 - 0x510 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA0 - desc HCDMA0 - 0x514 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR1 - desc HCCHAR1 - 0x520 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT1 - desc HCINT1 - 0x528 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK1 - desc HCINTMSK1 - 0x52C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ1 - desc HCTSIZ1 - 0x530 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA1 - desc HCDMA1 - 0x534 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR2 - desc HCCHAR2 - 0x540 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT2 - desc HCINT2 - 0x548 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK2 - desc HCINTMSK2 - 0x54C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ2 - desc HCTSIZ2 - 0x550 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA2 - desc HCDMA2 - 0x554 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR3 - desc HCCHAR3 - 0x560 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT3 - desc HCINT3 - 0x568 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK3 - desc HCINTMSK3 - 0x56C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ3 - desc HCTSIZ3 - 0x570 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA3 - desc HCDMA3 - 0x574 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR4 - desc HCCHAR4 - 0x580 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT4 - desc HCINT4 - 0x588 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK4 - desc HCINTMSK4 - 0x58C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ4 - desc HCTSIZ4 - 0x590 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA4 - desc HCDMA4 - 0x594 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR5 - desc HCCHAR5 - 0x5A0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT5 - desc HCINT5 - 0x5A8 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK5 - desc HCINTMSK5 - 0x5AC - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ5 - desc HCTSIZ5 - 0x5B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA5 - desc HCDMA5 - 0x5B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR6 - desc HCCHAR6 - 0x5C0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT6 - desc HCINT6 - 0x5C8 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK6 - desc HCINTMSK6 - 0x5CC - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ6 - desc HCTSIZ6 - 0x5D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA6 - desc HCDMA6 - 0x5D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR7 - desc HCCHAR7 - 0x5E0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT7 - desc HCINT7 - 0x5E8 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK7 - desc HCINTMSK7 - 0x5EC - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ7 - desc HCTSIZ7 - 0x5F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA7 - desc HCDMA7 - 0x5F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR8 - desc HCCHAR8 - 0x600 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT8 - desc HCINT8 - 0x608 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK8 - desc HCINTMSK8 - 0x60C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ8 - desc HCTSIZ8 - 0x610 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA8 - desc HCDMA8 - 0x614 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR9 - desc HCCHAR9 - 0x620 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT9 - desc HCINT9 - 0x628 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK9 - desc HCINTMSK9 - 0x62C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ9 - desc HCTSIZ9 - 0x630 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA9 - desc HCDMA9 - 0x634 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR10 - desc HCCHAR10 - 0x640 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT10 - desc HCINT10 - 0x648 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK10 - desc HCINTMSK10 - 0x64C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ10 - desc HCTSIZ10 - 0x650 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA10 - desc HCDMA10 - 0x654 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR11 - desc HCCHAR11 - 0x660 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT11 - desc HCINT11 - 0x668 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK11 - desc HCINTMSK11 - 0x66C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ11 - desc HCTSIZ11 - 0x670 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA11 - desc HCDMA11 - 0x674 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DCFG - desc DCFG - 0x800 - 32 - read-write - 0x8200000 - 0x1FF7 - - - DSPD - desc DSPD - 1 - 0 - read-write - - - NZLSOHSK - desc NZLSOHSK - 2 - 2 - read-write - - - DAD - desc DAD - 10 - 4 - read-write - - - PFIVL - desc PFIVL - 12 - 11 - read-write - - - - - DCTL - desc DCTL - 0x804 - 32 - read-write - 0x2 - 0xF8F - - - RWUSIG - desc RWUSIG - 0 - 0 - read-write - - - SDIS - desc SDIS - 1 - 1 - read-write - - - GINSTS - desc GINSTS - 2 - 2 - read-only - - - GONSTS - desc GONSTS - 3 - 3 - read-only - - - SGINAK - desc SGINAK - 7 - 7 - write-only - - - CGINAK - desc CGINAK - 8 - 8 - write-only - - - SGONAK - desc SGONAK - 9 - 9 - write-only - - - CGONAK - desc CGONAK - 10 - 10 - write-only - - - POPRGDNE - desc POPRGDNE - 11 - 11 - read-write - - - - - DSTS - desc DSTS - 0x808 - 32 - read-only - 0x2 - 0x3FFF0F - - - SUSPSTS - desc SUSPSTS - 0 - 0 - read-only - - - ENUMSPD - desc ENUMSPD - 2 - 1 - read-only - - - EERR - desc EERR - 3 - 3 - read-only - - - FNSOF - desc FNSOF - 21 - 8 - read-only - - - - - DIEPMSK - desc DIEPMSK - 0x810 - 32 - read-write - 0x0 - 0x7B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - TOM - desc TOM - 3 - 3 - read-write - - - ITTXFEMSK - desc ITTXFEMSK - 4 - 4 - read-write - - - INEPNMM - desc INEPNMM - 5 - 5 - read-write - - - INEPNEM - desc INEPNEM - 6 - 6 - read-write - - - - - DOEPMSK - desc DOEPMSK - 0x814 - 32 - read-write - 0x0 - 0x1B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - STUPM - desc STUPM - 3 - 3 - read-write - - - OTEPDM - desc OTEPDM - 4 - 4 - read-write - - - - - DAINT - desc DAINT - 0x818 - 32 - read-write - 0x0 - 0x3F003F - - - IEPINT - desc IEPINT - 5 - 0 - read-write - - - OEPINT - desc OEPINT - 21 - 16 - read-write - - - - - DAINTMSK - desc DAINTMSK - 0x81C - 32 - read-write - 0x0 - 0x3F003F - - - IEPINTM - desc IEPINTM - 5 - 0 - read-write - - - OEPINTM - desc OEPINTM - 21 - 16 - read-write - - - - - DIEPEMPMSK - desc DIEPEMPMSK - 0x834 - 32 - read-write - 0x0 - 0x3F - - - INEPTXFEM - desc INEPTXFEM - 5 - 0 - read-write - - - - - DIEPCTL0 - desc DIEPCTL0 - 0x900 - 32 - read-write - 0x8000 - 0xCFEE8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT0 - desc DIEPINT0 - 0x908 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ0 - desc DIEPTSIZ0 - 0x910 - 32 - read-write - 0x0 - 0x18007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 20 - 19 - read-write - - - - - DIEPDMA0 - desc DIEPDMA0 - 0x914 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS0 - desc DTXFSTS0 - 0x918 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL1 - desc DIEPCTL1 - 0x920 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT1 - desc DIEPINT1 - 0x928 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ1 - desc DIEPTSIZ1 - 0x930 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA1 - desc DIEPDMA1 - 0x934 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS1 - desc DTXFSTS1 - 0x938 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL2 - desc DIEPCTL2 - 0x940 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT2 - desc DIEPINT2 - 0x948 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ2 - desc DIEPTSIZ2 - 0x950 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA2 - desc DIEPDMA2 - 0x954 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS2 - desc DTXFSTS2 - 0x958 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL3 - desc DIEPCTL3 - 0x960 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT3 - desc DIEPINT3 - 0x968 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ3 - desc DIEPTSIZ3 - 0x970 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA3 - desc DIEPDMA3 - 0x974 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS3 - desc DTXFSTS3 - 0x978 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL4 - desc DIEPCTL4 - 0x980 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT4 - desc DIEPINT4 - 0x988 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ4 - desc DIEPTSIZ4 - 0x990 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA4 - desc DIEPDMA4 - 0x994 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS4 - desc DTXFSTS4 - 0x998 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL5 - desc DIEPCTL5 - 0x9A0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT5 - desc DIEPINT5 - 0x9A8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ5 - desc DIEPTSIZ5 - 0x9B0 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA5 - desc DIEPDMA5 - 0x9B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS5 - desc DTXFSTS5 - 0x9B8 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DOEPCTL0 - desc DOEPCTL0 - 0xB00 - 32 - read-write - 0x8000 - 0xCC3E8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT0 - desc DOEPINT0 - 0xB08 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ0 - desc DOEPTSIZ0 - 0xB10 - 32 - read-write - 0x0 - 0x6008007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 19 - 19 - read-write - - - STUPCNT - desc STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA0 - desc DOEPDMA0 - 0xB14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL1 - desc DOEPCTL1 - 0xB20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT1 - desc DOEPINT1 - 0xB28 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ1 - desc DOEPTSIZ1 - 0xB30 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA1 - desc DOEPDMA1 - 0xB34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL2 - desc DOEPCTL2 - 0xB40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT2 - desc DOEPINT2 - 0xB48 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ2 - desc DOEPTSIZ2 - 0xB50 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA2 - desc DOEPDMA2 - 0xB54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL3 - desc DOEPCTL3 - 0xB60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT3 - desc DOEPINT3 - 0xB68 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ3 - desc DOEPTSIZ3 - 0xB70 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA3 - desc DOEPDMA3 - 0xB74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL4 - desc DOEPCTL4 - 0xB80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT4 - desc DOEPINT4 - 0xB88 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ4 - desc DOEPTSIZ4 - 0xB90 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA4 - desc DOEPDMA4 - 0xB94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL5 - desc DOEPCTL5 - 0xBA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT5 - desc DOEPINT5 - 0xBA8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ5 - desc DOEPTSIZ5 - 0xBB0 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA5 - desc DOEPDMA5 - 0xBB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - GCCTL - desc GCCTL - 0xE00 - 32 - read-write - 0x0 - 0x3 - - - STPPCLK - desc STPPCLK - 0 - 0 - read-write - - - GATEHCLK - desc GATEHCLK - 1 - 1 - read-write - - - - - - - WDT - desc WDT - 0x40049000 - - 0x0 - 0xC - - - - CR - desc CR - 0x0 - 32 - read-write - 0x80010FF3 - 0x80010FF3 - - - PERI - desc PERI - 1 - 0 - read-write - - - CKS - desc CKS - 7 - 4 - read-write - - - WDPT - desc WDPT - 11 - 8 - read-write - - - SLPOFF - desc SLPOFF - 16 - 16 - read-write - - - ITS - desc ITS - 31 - 31 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-write - 0x0 - 0x3FFFF - - - CNT - desc CNT - 15 - 0 - read-only - - - UDF - desc UDF - 16 - 16 - read-write - - - REF - desc REF - 17 - 17 - read-write - - - - - RR - desc RR - 0x8 - 32 - read-write - 0x0 - 0xFFFF - - - RF - desc RF - 15 - 0 - read-write - - - - - - - diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460.mac b/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460.mac deleted file mode 100644 index e30bd40aa2e..00000000000 --- a/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460.mac +++ /dev/null @@ -1,16 +0,0 @@ -setup() -{ - ; -} - -execUserPreload() -{ - __message "----- Prepare hardware for Flashloader -----\n"; - setup(); -} -execUserFlashInit() // Called by debugger before loading flash loader in RAM. -{ - __message "----- Prepare hardware for Flashloader -----\n"; - setup(); -} - diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460_otp.mac b/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460_otp.mac deleted file mode 100644 index e30bd40aa2e..00000000000 --- a/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F460_otp.mac +++ /dev/null @@ -1,16 +0,0 @@ -setup() -{ - ; -} - -execUserPreload() -{ - __message "----- Prepare hardware for Flashloader -----\n"; - setup(); -} -execUserFlashInit() // Called by debugger before loading flash loader in RAM. -{ - __message "----- Prepare hardware for Flashloader -----\n"; - setup(); -} - diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HDSC_HC32F460.svd b/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HDSC_HC32F460.svd deleted file mode 100644 index 03dbb3b098d..00000000000 --- a/bsp/hc32/libraries/hc32f460_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HDSC_HC32F460.svd +++ /dev/null @@ -1,53428 +0,0 @@ - - - HDSC - HDSC - HDSC_HC32F460 - ARMCM4 - 1.0 - - CM4 - r0p1 - little - true - true - 4 - false - - 8 - 32 - 32 - read-write - 0x0 - 0x0 - - - ADC1 - desc ADC - 0x40040000 - - 0x0 - 0xD0 - - - - STR - desc STR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - STRT - desc STRT - 0 - 0 - read-write - - - - - CR0 - desc CR0 - 0x2 - 16 - read-write - 0x0 - 0x7F3 - - - MS - desc MS - 1 - 0 - read-write - - - ACCSEL - desc ACCSEL - 5 - 4 - read-write - - - CLREN - desc CLREN - 6 - 6 - read-write - - - DFMT - desc DFMT - 7 - 7 - read-write - - - AVCNT - desc AVCNT - 10 - 8 - read-write - - - - - CR1 - desc CR1 - 0x4 - 16 - read-write - 0x0 - 0x4 - - - RSCHSEL - desc RSCHSEL - 2 - 2 - read-write - - - - - TRGSR - desc TRGSR - 0xA - 16 - read-write - 0x0 - 0x8383 - - - TRGSELA - desc TRGSELA - 1 - 0 - read-write - - - TRGENA - desc TRGENA - 7 - 7 - read-write - - - TRGSELB - desc TRGSELB - 9 - 8 - read-write - - - TRGENB - desc TRGENB - 15 - 15 - read-write - - - - - CHSELRA - desc CHSELRA - 0xC - 32 - read-write - 0x0 - 0x1FFFF - - - CHSELA - desc CHSELA - 16 - 0 - read-write - - - - - CHSELRB - desc CHSELRB - 0x10 - 32 - read-write - 0x0 - 0x1FFFF - - - CHSELB - desc CHSELB - 16 - 0 - read-write - - - - - AVCHSELR - desc AVCHSELR - 0x14 - 32 - read-write - 0x0 - 0x1FFFF - - - AVCHSEL - desc AVCHSEL - 16 - 0 - read-write - - - - - SSTR0 - desc SSTR0 - 0x20 - 8 - read-write - 0xB - 0xFF - - - SSTR1 - desc SSTR1 - 0x21 - 8 - read-write - 0xB - 0xFF - - - SSTR2 - desc SSTR2 - 0x22 - 8 - read-write - 0xB - 0xFF - - - SSTR3 - desc SSTR3 - 0x23 - 8 - read-write - 0xB - 0xFF - - - SSTR4 - desc SSTR4 - 0x24 - 8 - read-write - 0xB - 0xFF - - - SSTR5 - desc SSTR5 - 0x25 - 8 - read-write - 0xB - 0xFF - - - SSTR6 - desc SSTR6 - 0x26 - 8 - read-write - 0xB - 0xFF - - - SSTR7 - desc SSTR7 - 0x27 - 8 - read-write - 0xB - 0xFF - - - SSTR8 - desc SSTR8 - 0x28 - 8 - read-write - 0xB - 0xFF - - - SSTR9 - desc SSTR9 - 0x29 - 8 - read-write - 0xB - 0xFF - - - SSTR10 - desc SSTR10 - 0x2A - 8 - read-write - 0xB - 0xFF - - - SSTR11 - desc SSTR11 - 0x2B - 8 - read-write - 0xB - 0xFF - - - SSTR12 - desc SSTR12 - 0x2C - 8 - read-write - 0xB - 0xFF - - - SSTR13 - desc SSTR13 - 0x2D - 8 - read-write - 0xB - 0xFF - - - SSTR14 - desc SSTR14 - 0x2E - 8 - read-write - 0xB - 0xFF - - - SSTR15 - desc SSTR15 - 0x2F - 8 - read-write - 0xB - 0xFF - - - SSTRL - desc SSTRL - 0x30 - 8 - read-write - 0xB - 0xFF - - - CHMUXR0 - desc CHMUXR0 - 0x38 - 16 - read-write - 0x3210 - 0xFFFF - - - CH00MUX - desc CH00MUX - 3 - 0 - read-write - - - CH01MUX - desc CH01MUX - 7 - 4 - read-write - - - CH02MUX - desc CH02MUX - 11 - 8 - read-write - - - CH03MUX - desc CH03MUX - 15 - 12 - read-write - - - - - CHMUXR1 - desc CHMUXR1 - 0x3A - 16 - read-write - 0x7654 - 0xFFFF - - - CH04MUX - desc CH04MUX - 3 - 0 - read-write - - - CH05MUX - desc CH05MUX - 7 - 4 - read-write - - - CH06MUX - desc CH06MUX - 11 - 8 - read-write - - - CH07MUX - desc CH07MUX - 15 - 12 - read-write - - - - - CHMUXR2 - desc CHMUXR2 - 0x3C - 16 - read-write - 0xBA98 - 0xFFFF - - - CH08MUX - desc CH08MUX - 3 - 0 - read-write - - - CH09MUX - desc CH09MUX - 7 - 4 - read-write - - - CH10MUX - desc CH10MUX - 11 - 8 - read-write - - - CH11MUX - desc CH11MUX - 15 - 12 - read-write - - - - - CHMUXR3 - desc CHMUXR3 - 0x3E - 16 - read-write - 0xFEDC - 0xFFFF - - - CH12MUX - desc CH12MUX - 3 - 0 - read-write - - - CH13MUX - desc CH13MUX - 7 - 4 - read-write - - - CH14MUX - desc CH14MUX - 11 - 8 - read-write - - - CH15MUX - desc CH15MUX - 15 - 12 - read-write - - - - - ISR - desc ISR - 0x46 - 8 - read-write - 0x0 - 0x3 - - - EOCAF - desc EOCAF - 0 - 0 - read-write - - - EOCBF - desc EOCBF - 1 - 1 - read-write - - - - - ICR - desc ICR - 0x47 - 8 - read-write - 0x0 - 0x3 - - - EOCAIEN - desc EOCAIEN - 0 - 0 - read-write - - - EOCBIEN - desc EOCBIEN - 1 - 1 - read-write - - - - - SYNCCR - desc SYNCCR - 0x4C - 16 - read-write - 0xC00 - 0xFF71 - - - SYNCEN - desc SYNCEN - 0 - 0 - read-write - - - SYNCMD - desc SYNCMD - 6 - 4 - read-write - - - SYNCDLY - desc SYNCDLY - 15 - 8 - read-write - - - - - DR0 - desc DR0 - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - DR1 - desc DR1 - 0x52 - 16 - read-only - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x54 - 16 - read-only - 0x0 - 0xFFFF - - - DR3 - desc DR3 - 0x56 - 16 - read-only - 0x0 - 0xFFFF - - - DR4 - desc DR4 - 0x58 - 16 - read-only - 0x0 - 0xFFFF - - - DR5 - desc DR5 - 0x5A - 16 - read-only - 0x0 - 0xFFFF - - - DR6 - desc DR6 - 0x5C - 16 - read-only - 0x0 - 0xFFFF - - - DR7 - desc DR7 - 0x5E - 16 - read-only - 0x0 - 0xFFFF - - - DR8 - desc DR8 - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - DR9 - desc DR9 - 0x62 - 16 - read-only - 0x0 - 0xFFFF - - - DR10 - desc DR10 - 0x64 - 16 - read-only - 0x0 - 0xFFFF - - - DR11 - desc DR11 - 0x66 - 16 - read-only - 0x0 - 0xFFFF - - - DR12 - desc DR12 - 0x68 - 16 - read-only - 0x0 - 0xFFFF - - - DR13 - desc DR13 - 0x6A - 16 - read-only - 0x0 - 0xFFFF - - - DR14 - desc DR14 - 0x6C - 16 - read-only - 0x0 - 0xFFFF - - - DR15 - desc DR15 - 0x6E - 16 - read-only - 0x0 - 0xFFFF - - - DR16 - desc DR16 - 0x70 - 16 - read-only - 0x0 - 0xFFFF - - - AWDCR - desc AWDCR - 0xA0 - 16 - read-write - 0x0 - 0x1D1 - - - AWDEN - desc AWDEN - 0 - 0 - read-write - - - AWDMD - desc AWDMD - 4 - 4 - read-write - - - AWDSS - desc AWDSS - 7 - 6 - read-write - - - AWDIEN - desc AWDIEN - 8 - 8 - read-write - - - - - AWDDR0 - desc AWDDR0 - 0xA4 - 16 - read-write - 0x0 - 0xFFFF - - - AWDDR1 - desc AWDDR1 - 0xA6 - 16 - read-write - 0x0 - 0xFFFF - - - AWDCHSR - desc AWDCHSR - 0xAC - 32 - read-write - 0x0 - 0x1FFFF - - - AWDCH - desc AWDCH - 16 - 0 - read-write - - - - - AWDSR - desc AWDSR - 0xB0 - 32 - read-write - 0x0 - 0x1FFFF - - - AWDF - desc AWDF - 16 - 0 - read-write - - - - - PGACR - desc PGACR - 0xC0 - 16 - read-write - 0x0 - 0xF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - - - PGAGSR - desc PGAGSR - 0xC2 - 16 - read-write - 0x0 - 0xF - - - GAIN - desc GAIN - 3 - 0 - read-write - - - - - PGAINSR0 - desc PGAINSR0 - 0xCC - 16 - read-write - 0x0 - 0x1FF - - - PGAINSEL - desc PGAINSEL - 8 - 0 - read-write - - - - - PGAINSR1 - desc PGAINSR1 - 0xCE - 16 - read-write - 0x0 - 0x1 - - - PGAVSSEN - desc PGAVSSEN - 0 - 0 - read-write - - - - - - - ADC2 - desc ADC - 0x40040400 - - 0x0 - 0xD0 - - - - AES - desc AES - 0x40008000 - - 0x0 - 0x30 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x3 - - - START - desc START - 0 - 0 - read-write - - - MODE - desc MODE - 1 - 1 - read-write - - - - - DR0 - desc DR0 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR2 - desc DR2 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR3 - desc DR3 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR0 - desc KR0 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR1 - desc KR1 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR2 - desc KR2 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR3 - desc KR3 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - AOS - desc AOS - 0x40010800 - - 0x0 - 0x174 - - - - INTSFTTRG - desc INTSFTTRG - 0x0 - 32 - write-only - 0x0 - 0x1 - - - STRG - desc STRG - 0 - 0 - write-only - - - - - DCU_TRGSEL1 - desc DCU_TRGSEL1 - 0x4 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL2 - desc DCU_TRGSEL2 - 0x8 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL3 - desc DCU_TRGSEL3 - 0xC - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL4 - desc DCU_TRGSEL4 - 0x10 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL0 - desc DMA1_TRGSEL0 - 0x14 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL1 - desc DMA1_TRGSEL1 - 0x18 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL2 - desc DMA1_TRGSEL2 - 0x1C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL3 - desc DMA1_TRGSEL3 - 0x20 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL0 - desc DMA2_TRGSEL0 - 0x24 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL1 - desc DMA2_TRGSEL1 - 0x28 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL2 - desc DMA2_TRGSEL2 - 0x2C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL3 - desc DMA2_TRGSEL3 - 0x30 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA_TRGSELRC - desc DMA_TRGSELRC - 0x34 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR0 - desc TMR6_HTSSR0 - 0x38 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR1 - desc TMR6_HTSSR1 - 0x3C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR0_HTSSR - desc TMR0_HTSSR - 0x40 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - PEVNTTRGSR12 - desc PEVNTTRGSR12 - 0x44 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - PEVNTTRGSR34 - desc PEVNTTRGSR34 - 0x48 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR0 - desc TMRA_HTSSR0 - 0x4C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR1 - desc TMRA_HTSSR1 - 0x50 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - OTS_TRG - desc OTS_TRG - 0x54 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC1_ITRGSELR0 - desc ADC1_ITRGSELR0 - 0x58 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC1_ITRGSELR1 - desc ADC1_ITRGSELR1 - 0x5C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC2_ITRGSELR0 - desc ADC2_ITRGSELR0 - 0x60 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC2_ITRGSELR1 - desc ADC2_ITRGSELR1 - 0x64 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - COMTRG1 - desc COMTRG1 - 0x68 - 32 - read-write - 0x1FF - 0x1FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - - - COMTRG2 - desc COMTRG2 - 0x6C - 32 - read-write - 0x1FF - 0x1FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - - - PEVNTDIRR1 - desc PEVNTDIRR1 - 0x100 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR00 - desc PDIR00 - 0 - 0 - read-write - - - PDIR01 - desc PDIR01 - 1 - 1 - read-write - - - PDIR02 - desc PDIR02 - 2 - 2 - read-write - - - PDIR03 - desc PDIR03 - 3 - 3 - read-write - - - PDIR04 - desc PDIR04 - 4 - 4 - read-write - - - PDIR05 - desc PDIR05 - 5 - 5 - read-write - - - PDIR06 - desc PDIR06 - 6 - 6 - read-write - - - PDIR07 - desc PDIR07 - 7 - 7 - read-write - - - PDIR08 - desc PDIR08 - 8 - 8 - read-write - - - PDIR09 - desc PDIR09 - 9 - 9 - read-write - - - PDIR10 - desc PDIR10 - 10 - 10 - read-write - - - PDIR11 - desc PDIR11 - 11 - 11 - read-write - - - PDIR12 - desc PDIR12 - 12 - 12 - read-write - - - PDIR13 - desc PDIR13 - 13 - 13 - read-write - - - PDIR14 - desc PDIR14 - 14 - 14 - read-write - - - PDIR15 - desc PDIR15 - 15 - 15 - read-write - - - - - PEVNTIDR1 - desc PEVNTIDR1 - 0x104 - 32 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PEVNTODR1 - desc PEVNTODR1 - 0x108 - 32 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - PEVNTORR1 - desc PEVNTORR1 - 0x10C - 32 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - PEVNTOSR1 - desc PEVNTOSR1 - 0x110 - 32 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PEVNTRISR1 - desc PEVNTRISR1 - 0x114 - 32 - read-write - 0x0 - 0xFFFF - - - RIS00 - desc RIS00 - 0 - 0 - read-write - - - RIS01 - desc RIS01 - 1 - 1 - read-write - - - RIS02 - desc RIS02 - 2 - 2 - read-write - - - RIS03 - desc RIS03 - 3 - 3 - read-write - - - RIS04 - desc RIS04 - 4 - 4 - read-write - - - RIS05 - desc RIS05 - 5 - 5 - read-write - - - RIS06 - desc RIS06 - 6 - 6 - read-write - - - RIS07 - desc RIS07 - 7 - 7 - read-write - - - RIS08 - desc RIS08 - 8 - 8 - read-write - - - RIS09 - desc RIS09 - 9 - 9 - read-write - - - RIS10 - desc RIS10 - 10 - 10 - read-write - - - RIS11 - desc RIS11 - 11 - 11 - read-write - - - RIS12 - desc RIS12 - 12 - 12 - read-write - - - RIS13 - desc RIS13 - 13 - 13 - read-write - - - RIS14 - desc RIS14 - 14 - 14 - read-write - - - RIS15 - desc RIS15 - 15 - 15 - read-write - - - - - PEVNTFAL1 - desc PEVNTFAL1 - 0x118 - 32 - read-write - 0x0 - 0xFFFF - - - FAL00 - desc FAL00 - 0 - 0 - read-write - - - FAL01 - desc FAL01 - 1 - 1 - read-write - - - FAL02 - desc FAL02 - 2 - 2 - read-write - - - FAL03 - desc FAL03 - 3 - 3 - read-write - - - FAL04 - desc FAL04 - 4 - 4 - read-write - - - FAL05 - desc FAL05 - 5 - 5 - read-write - - - FAL06 - desc FAL06 - 6 - 6 - read-write - - - FAL07 - desc FAL07 - 7 - 7 - read-write - - - FAL08 - desc FAL08 - 8 - 8 - read-write - - - FAL09 - desc FAL09 - 9 - 9 - read-write - - - FAL10 - desc FAL10 - 10 - 10 - read-write - - - FAL11 - desc FAL11 - 11 - 11 - read-write - - - FAL12 - desc FAL12 - 12 - 12 - read-write - - - FAL13 - desc FAL13 - 13 - 13 - read-write - - - FAL14 - desc FAL14 - 14 - 14 - read-write - - - FAL15 - desc FAL15 - 15 - 15 - read-write - - - - - PEVNTDIRR2 - desc PEVNTDIRR2 - 0x11C - 32 - read-write - 0x0 - 0xFFFF - - - PDIR00 - desc PDIR00 - 0 - 0 - read-write - - - PDIR01 - desc PDIR01 - 1 - 1 - read-write - - - PDIR02 - desc PDIR02 - 2 - 2 - read-write - - - PDIR03 - desc PDIR03 - 3 - 3 - read-write - - - PDIR04 - desc PDIR04 - 4 - 4 - read-write - - - PDIR05 - desc PDIR05 - 5 - 5 - read-write - - - PDIR06 - desc PDIR06 - 6 - 6 - read-write - - - PDIR07 - desc PDIR07 - 7 - 7 - read-write - - - PDIR08 - desc PDIR08 - 8 - 8 - read-write - - - PDIR09 - desc PDIR09 - 9 - 9 - read-write - - - PDIR10 - desc PDIR10 - 10 - 10 - read-write - - - PDIR11 - desc PDIR11 - 11 - 11 - read-write - - - PDIR12 - desc PDIR12 - 12 - 12 - read-write - - - PDIR13 - desc PDIR13 - 13 - 13 - read-write - - - PDIR14 - desc PDIR14 - 14 - 14 - read-write - - - PDIR15 - desc PDIR15 - 15 - 15 - read-write - - - - - PEVNTIDR2 - desc PEVNTIDR2 - 0x120 - 32 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PEVNTODR2 - desc PEVNTODR2 - 0x124 - 32 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - PEVNTORR2 - desc PEVNTORR2 - 0x128 - 32 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - PEVNTOSR2 - desc PEVNTOSR2 - 0x12C - 32 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PEVNTRISR2 - desc PEVNTRISR2 - 0x130 - 32 - read-write - 0x0 - 0xFFFF - - - RIS00 - desc RIS00 - 0 - 0 - read-write - - - RIS01 - desc RIS01 - 1 - 1 - read-write - - - RIS02 - desc RIS02 - 2 - 2 - read-write - - - RIS03 - desc RIS03 - 3 - 3 - read-write - - - RIS04 - desc RIS04 - 4 - 4 - read-write - - - RIS05 - desc RIS05 - 5 - 5 - read-write - - - RIS06 - desc RIS06 - 6 - 6 - read-write - - - RIS07 - desc RIS07 - 7 - 7 - read-write - - - RIS08 - desc RIS08 - 8 - 8 - read-write - - - RIS09 - desc RIS09 - 9 - 9 - read-write - - - RIS10 - desc RIS10 - 10 - 10 - read-write - - - RIS11 - desc RIS11 - 11 - 11 - read-write - - - RIS12 - desc RIS12 - 12 - 12 - read-write - - - RIS13 - desc RIS13 - 13 - 13 - read-write - - - RIS14 - desc RIS14 - 14 - 14 - read-write - - - RIS15 - desc RIS15 - 15 - 15 - read-write - - - - - PEVNTFAL2 - desc PEVNTFAL2 - 0x134 - 32 - read-write - 0x0 - 0xFFFF - - - FAL00 - desc FAL00 - 0 - 0 - read-write - - - FAL01 - desc FAL01 - 1 - 1 - read-write - - - FAL02 - desc FAL02 - 2 - 2 - read-write - - - FAL03 - desc FAL03 - 3 - 3 - read-write - - - FAL04 - desc FAL04 - 4 - 4 - read-write - - - FAL05 - desc FAL05 - 5 - 5 - read-write - - - FAL06 - desc FAL06 - 6 - 6 - read-write - - - FAL07 - desc FAL07 - 7 - 7 - read-write - - - FAL08 - desc FAL08 - 8 - 8 - read-write - - - FAL09 - desc FAL09 - 9 - 9 - read-write - - - FAL10 - desc FAL10 - 10 - 10 - read-write - - - FAL11 - desc FAL11 - 11 - 11 - read-write - - - FAL12 - desc FAL12 - 12 - 12 - read-write - - - FAL13 - desc FAL13 - 13 - 13 - read-write - - - FAL14 - desc FAL14 - 14 - 14 - read-write - - - FAL15 - desc FAL15 - 15 - 15 - read-write - - - - - PEVNTDIRR3 - desc PEVNTDIRR3 - 0x138 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR00 - desc PDIR00 - 0 - 0 - read-write - - - PDIR01 - desc PDIR01 - 1 - 1 - read-write - - - PDIR02 - desc PDIR02 - 2 - 2 - read-write - - - PDIR03 - desc PDIR03 - 3 - 3 - read-write - - - PDIR04 - desc PDIR04 - 4 - 4 - read-write - - - PDIR05 - desc PDIR05 - 5 - 5 - read-write - - - PDIR06 - desc PDIR06 - 6 - 6 - read-write - - - PDIR07 - desc PDIR07 - 7 - 7 - read-write - - - PDIR08 - desc PDIR08 - 8 - 8 - read-write - - - PDIR09 - desc PDIR09 - 9 - 9 - read-write - - - PDIR10 - desc PDIR10 - 10 - 10 - read-write - - - PDIR11 - desc PDIR11 - 11 - 11 - read-write - - - PDIR12 - desc PDIR12 - 12 - 12 - read-write - - - PDIR13 - desc PDIR13 - 13 - 13 - read-write - - - PDIR14 - desc PDIR14 - 14 - 14 - read-write - - - PDIR15 - desc PDIR15 - 15 - 15 - read-write - - - - - PEVNTIDR3 - desc PEVNTIDR3 - 0x13C - 32 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PEVNTODR3 - desc PEVNTODR3 - 0x140 - 32 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - PEVNTORR3 - desc PEVNTORR3 - 0x144 - 32 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - PEVNTOSR3 - desc PEVNTOSR3 - 0x148 - 32 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PEVNTRISR3 - desc PEVNTRISR3 - 0x14C - 32 - read-write - 0x0 - 0xFFFF - - - RIS00 - desc RIS00 - 0 - 0 - read-write - - - RIS01 - desc RIS01 - 1 - 1 - read-write - - - RIS02 - desc RIS02 - 2 - 2 - read-write - - - RIS03 - desc RIS03 - 3 - 3 - read-write - - - RIS04 - desc RIS04 - 4 - 4 - read-write - - - RIS05 - desc RIS05 - 5 - 5 - read-write - - - RIS06 - desc RIS06 - 6 - 6 - read-write - - - RIS07 - desc RIS07 - 7 - 7 - read-write - - - RIS08 - desc RIS08 - 8 - 8 - read-write - - - RIS09 - desc RIS09 - 9 - 9 - read-write - - - RIS10 - desc RIS10 - 10 - 10 - read-write - - - RIS11 - desc RIS11 - 11 - 11 - read-write - - - RIS12 - desc RIS12 - 12 - 12 - read-write - - - RIS13 - desc RIS13 - 13 - 13 - read-write - - - RIS14 - desc RIS14 - 14 - 14 - read-write - - - RIS15 - desc RIS15 - 15 - 15 - read-write - - - - - PEVNTFAL3 - desc PEVNTFAL3 - 0x150 - 32 - read-write - 0x0 - 0xFFFF - - - FAL00 - desc FAL00 - 0 - 0 - read-write - - - FAL01 - desc FAL01 - 1 - 1 - read-write - - - FAL02 - desc FAL02 - 2 - 2 - read-write - - - FAL03 - desc FAL03 - 3 - 3 - read-write - - - FAL04 - desc FAL04 - 4 - 4 - read-write - - - FAL05 - desc FAL05 - 5 - 5 - read-write - - - FAL06 - desc FAL06 - 6 - 6 - read-write - - - FAL07 - desc FAL07 - 7 - 7 - read-write - - - FAL08 - desc FAL08 - 8 - 8 - read-write - - - FAL09 - desc FAL09 - 9 - 9 - read-write - - - FAL10 - desc FAL10 - 10 - 10 - read-write - - - FAL11 - desc FAL11 - 11 - 11 - read-write - - - FAL12 - desc FAL12 - 12 - 12 - read-write - - - FAL13 - desc FAL13 - 13 - 13 - read-write - - - FAL14 - desc FAL14 - 14 - 14 - read-write - - - FAL15 - desc FAL15 - 15 - 15 - read-write - - - - - PEVNTDIRR4 - desc PEVNTDIRR4 - 0x154 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR00 - desc PDIR00 - 0 - 0 - read-write - - - PDIR01 - desc PDIR01 - 1 - 1 - read-write - - - PDIR02 - desc PDIR02 - 2 - 2 - read-write - - - PDIR03 - desc PDIR03 - 3 - 3 - read-write - - - PDIR04 - desc PDIR04 - 4 - 4 - read-write - - - PDIR05 - desc PDIR05 - 5 - 5 - read-write - - - PDIR06 - desc PDIR06 - 6 - 6 - read-write - - - PDIR07 - desc PDIR07 - 7 - 7 - read-write - - - PDIR08 - desc PDIR08 - 8 - 8 - read-write - - - PDIR09 - desc PDIR09 - 9 - 9 - read-write - - - PDIR10 - desc PDIR10 - 10 - 10 - read-write - - - PDIR11 - desc PDIR11 - 11 - 11 - read-write - - - PDIR12 - desc PDIR12 - 12 - 12 - read-write - - - PDIR13 - desc PDIR13 - 13 - 13 - read-write - - - PDIR14 - desc PDIR14 - 14 - 14 - read-write - - - PDIR15 - desc PDIR15 - 15 - 15 - read-write - - - - - PEVNTIDR4 - desc PEVNTIDR4 - 0x158 - 32 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PEVNTODR4 - desc PEVNTODR4 - 0x15C - 32 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - PEVNTORR4 - desc PEVNTORR4 - 0x160 - 32 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - PEVNTOSR4 - desc PEVNTOSR4 - 0x164 - 32 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PEVNTRISR4 - desc PEVNTRISR4 - 0x168 - 32 - read-write - 0x0 - 0xFFFF - - - RIS00 - desc RIS00 - 0 - 0 - read-write - - - RIS01 - desc RIS01 - 1 - 1 - read-write - - - RIS02 - desc RIS02 - 2 - 2 - read-write - - - RIS03 - desc RIS03 - 3 - 3 - read-write - - - RIS04 - desc RIS04 - 4 - 4 - read-write - - - RIS05 - desc RIS05 - 5 - 5 - read-write - - - RIS06 - desc RIS06 - 6 - 6 - read-write - - - RIS07 - desc RIS07 - 7 - 7 - read-write - - - RIS08 - desc RIS08 - 8 - 8 - read-write - - - RIS09 - desc RIS09 - 9 - 9 - read-write - - - RIS10 - desc RIS10 - 10 - 10 - read-write - - - RIS11 - desc RIS11 - 11 - 11 - read-write - - - RIS12 - desc RIS12 - 12 - 12 - read-write - - - RIS13 - desc RIS13 - 13 - 13 - read-write - - - RIS14 - desc RIS14 - 14 - 14 - read-write - - - RIS15 - desc RIS15 - 15 - 15 - read-write - - - - - PEVNTFAL4 - desc PEVNTFAL4 - 0x16C - 32 - read-write - 0x0 - 0xFFFF - - - FAL00 - desc FAL00 - 0 - 0 - read-write - - - FAL01 - desc FAL01 - 1 - 1 - read-write - - - FAL02 - desc FAL02 - 2 - 2 - read-write - - - FAL03 - desc FAL03 - 3 - 3 - read-write - - - FAL04 - desc FAL04 - 4 - 4 - read-write - - - FAL05 - desc FAL05 - 5 - 5 - read-write - - - FAL06 - desc FAL06 - 6 - 6 - read-write - - - FAL07 - desc FAL07 - 7 - 7 - read-write - - - FAL08 - desc FAL08 - 8 - 8 - read-write - - - FAL09 - desc FAL09 - 9 - 9 - read-write - - - FAL10 - desc FAL10 - 10 - 10 - read-write - - - FAL11 - desc FAL11 - 11 - 11 - read-write - - - FAL12 - desc FAL12 - 12 - 12 - read-write - - - FAL13 - desc FAL13 - 13 - 13 - read-write - - - FAL14 - desc FAL14 - 14 - 14 - read-write - - - FAL15 - desc FAL15 - 15 - 15 - read-write - - - - - PEVNTNFCR - desc PEVNTNFCR - 0x170 - 32 - read-write - 0x0 - 0x7070707 - - - NFEN1 - desc NFEN1 - 0 - 0 - read-write - - - DIVS1 - desc DIVS1 - 2 - 1 - read-write - - - NFEN2 - desc NFEN2 - 8 - 8 - read-write - - - DIVS2 - desc DIVS2 - 10 - 9 - read-write - - - NFEN3 - desc NFEN3 - 16 - 16 - read-write - - - DIVS3 - desc DIVS3 - 18 - 17 - read-write - - - NFEN4 - desc NFEN4 - 24 - 24 - read-write - - - DIVS4 - desc DIVS4 - 26 - 25 - read-write - - - - - - - CAN - desc CAN - 0x40070400 - - 0x0 - 0xCA - - - - RBUF - desc RBUF - 0x0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - TBUF - desc TBUF - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CFG_STAT - desc CFG_STAT - 0xA0 - 8 - read-write - 0x80 - 0xFF - - - BUSOFF - desc BUSOFF - 0 - 0 - read-write - - - TACTIVE - desc TACTIVE - 1 - 1 - read-only - - - RACTIVE - desc RACTIVE - 2 - 2 - read-only - - - TSSS - desc TSSS - 3 - 3 - read-write - - - TPSS - desc TPSS - 4 - 4 - read-write - - - LBMI - desc LBMI - 5 - 5 - read-write - - - LBME - desc LBME - 6 - 6 - read-write - - - RESET - desc RESET - 7 - 7 - read-write - - - - - TCMD - desc TCMD - 0xA1 - 8 - read-write - 0x0 - 0xDF - - - TSA - desc TSA - 0 - 0 - read-write - - - TSALL - desc TSALL - 1 - 1 - read-write - - - TSONE - desc TSONE - 2 - 2 - read-write - - - TPA - desc TPA - 3 - 3 - read-write - - - TPE - desc TPE - 4 - 4 - read-write - - - LOM - desc LOM - 6 - 6 - read-write - - - TBSEL - desc TBSEL - 7 - 7 - read-write - - - - - TCTRL - desc TCTRL - 0xA2 - 8 - read-write - 0x90 - 0x73 - - - TSSTAT - desc TSSTAT - 1 - 0 - read-only - - - TTTBM - desc TTTBM - 4 - 4 - read-write - - - TSMODE - desc TSMODE - 5 - 5 - read-write - - - TSNEXT - desc TSNEXT - 6 - 6 - read-write - - - - - RCTRL - desc RCTRL - 0xA3 - 8 - read-write - 0x0 - 0xFB - - - RSTAT - desc RSTAT - 1 - 0 - read-only - - - RBALL - desc RBALL - 3 - 3 - read-write - - - RREL - desc RREL - 4 - 4 - read-write - - - ROV - desc ROV - 5 - 5 - read-only - - - ROM - desc ROM - 6 - 6 - read-write - - - SACK - desc SACK - 7 - 7 - read-write - - - - - RTIE - desc RTIE - 0xA4 - 8 - read-write - 0xFE - 0xFF - - - TSFF - desc TSFF - 0 - 0 - read-only - - - EIE - desc EIE - 1 - 1 - read-write - - - TSIE - desc TSIE - 2 - 2 - read-write - - - TPIE - desc TPIE - 3 - 3 - read-write - - - RAFIE - desc RAFIE - 4 - 4 - read-write - - - RFIE - desc RFIE - 5 - 5 - read-write - - - ROIE - desc ROIE - 6 - 6 - read-write - - - RIE - desc RIE - 7 - 7 - read-write - - - - - RTIF - desc RTIF - 0xA5 - 8 - read-write - 0x0 - 0xFF - - - AIF - desc AIF - 0 - 0 - read-write - - - EIF - desc EIF - 1 - 1 - read-write - - - TSIF - desc TSIF - 2 - 2 - read-write - - - TPIF - desc TPIF - 3 - 3 - read-write - - - RAFIF - desc RAFIF - 4 - 4 - read-write - - - RFIF - desc RFIF - 5 - 5 - read-write - - - ROIF - desc ROIF - 6 - 6 - read-write - - - RIF - desc RIF - 7 - 7 - read-write - - - - - ERRINT - desc ERRINT - 0xA6 - 8 - read-write - 0x0 - 0xFF - - - BEIF - desc BEIF - 0 - 0 - read-write - - - BEIE - desc BEIE - 1 - 1 - read-write - - - ALIF - desc ALIF - 2 - 2 - read-write - - - ALIE - desc ALIE - 3 - 3 - read-write - - - EPIF - desc EPIF - 4 - 4 - read-write - - - EPIE - desc EPIE - 5 - 5 - read-write - - - EPASS - desc EPASS - 6 - 6 - read-only - - - EWARN - desc EWARN - 7 - 7 - read-only - - - - - LIMIT - desc LIMIT - 0xA7 - 8 - read-write - 0x1B - 0xFF - - - EWL - desc EWL - 3 - 0 - read-write - - - AFWL - desc AFWL - 7 - 4 - read-write - - - - - SBT - desc SBT - 0xA8 - 32 - read-write - 0x1020203 - 0xFF7F7FFF - - - S_SEG_1 - desc S_SEG_1 - 7 - 0 - read-write - - - S_SEG_2 - desc S_SEG_2 - 14 - 8 - read-write - - - S_SJW - desc S_SJW - 22 - 16 - read-write - - - S_PRESC - desc S_PRESC - 31 - 24 - read-write - - - - - EALCAP - desc EALCAP - 0xB0 - 8 - read-only - 0x0 - 0xFF - - - ALC - desc ALC - 4 - 0 - read-only - - - KOER - desc KOER - 7 - 5 - read-only - - - - - RECNT - desc RECNT - 0xB2 - 8 - read-write - 0x0 - 0xFF - - - TECNT - desc TECNT - 0xB3 - 8 - read-write - 0x0 - 0xFF - - - ACFCTRL - desc ACFCTRL - 0xB4 - 8 - read-write - 0x0 - 0x2F - - - ACFADR - desc ACFADR - 3 - 0 - read-write - - - SELMASK - desc SELMASK - 5 - 5 - read-write - - - - - ACFEN - desc ACFEN - 0xB6 - 8 - read-write - 0x1 - 0xFF - - - AE_1 - desc AE_1 - 0 - 0 - read-write - - - AE_2 - desc AE_2 - 1 - 1 - read-write - - - AE_3 - desc AE_3 - 2 - 2 - read-write - - - AE_4 - desc AE_4 - 3 - 3 - read-write - - - AE_5 - desc AE_5 - 4 - 4 - read-write - - - AE_6 - desc AE_6 - 5 - 5 - read-write - - - AE_7 - desc AE_7 - 6 - 6 - read-write - - - AE_8 - desc AE_8 - 7 - 7 - read-write - - - - - ACF - desc ACF - 0xB8 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - ACODEORAMASK - desc ACODEORAMASK - 28 - 0 - read-write - - - AIDE - desc AIDE - 29 - 29 - read-write - - - AIDEE - desc AIDEE - 30 - 30 - read-write - - - - - TBSLOT - desc TBSLOT - 0xBE - 8 - read-write - 0x0 - 0xFF - - - TBPTR - desc TBPTR - 5 - 0 - read-write - - - TBF - desc TBF - 6 - 6 - read-write - - - TBE - desc TBE - 7 - 7 - read-write - - - - - TTCFG - desc TTCFG - 0xBF - 8 - read-write - 0x90 - 0xFF - - - TTEN - desc TTEN - 0 - 0 - read-write - - - T_PRESC - desc T_PRESC - 2 - 1 - read-write - - - TTIF - desc TTIF - 3 - 3 - read-write - - - TTIE - desc TTIE - 4 - 4 - read-write - - - TEIF - desc TEIF - 5 - 5 - read-write - - - WTIF - desc WTIF - 6 - 6 - read-write - - - WTIE - desc WTIE - 7 - 7 - read-write - - - - - REF_MSG - desc REF_MSG - 0xC0 - 32 - read-write - 0x0 - 0x9FFFFFFF - - - REF_ID - desc REF_ID - 28 - 0 - read-write - - - REF_IDE - desc REF_IDE - 31 - 31 - read-write - - - - - TRG_CFG - desc TRG_CFG - 0xC4 - 16 - read-write - 0x0 - 0xF73F - - - TTPTR - desc TTPTR - 5 - 0 - read-write - - - TTYPE - desc TTYPE - 10 - 8 - read-write - - - TEW - desc TEW - 15 - 12 - read-write - - - - - TT_TRIG - desc TT_TRIG - 0xC6 - 16 - read-write - 0x0 - 0xFFFF - - - TT_WTRIG - desc TT_WTRIG - 0xC8 - 16 - read-write - 0xFFFF - 0xFFFF - - - - - CMP1 - desc CMP - 0x4004A000 - - 0x0 - 0xA - - - - CTRL - desc CTRL - 0x0 - 16 - read-write - 0x0 - 0xF1E7 - - - FLTSL - desc FLTSL - 2 - 0 - read-write - - - EDGSL - desc EDGSL - 6 - 5 - read-write - - - IEN - desc IEN - 7 - 7 - read-write - - - CVSEN - desc CVSEN - 8 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - INV - desc INV - 13 - 13 - read-write - - - CMPOE - desc CMPOE - 14 - 14 - read-write - - - CMPON - desc CMPON - 15 - 15 - read-write - - - - - VLTSEL - desc VLTSEL - 0x2 - 16 - read-write - 0x0 - 0x7F0F - - - RVSL - desc RVSL - 3 - 0 - read-write - - - CVSL - desc CVSL - 11 - 8 - read-write - - - C4SL - desc C4SL - 14 - 12 - read-write - - - - - OUTMON - desc OUTMON - 0x4 - 16 - read-only - 0x0 - 0xF01 - - - OMON - desc OMON - 0 - 0 - read-only - - - CVST - desc CVST - 11 - 8 - read-only - - - - - CVSSTB - desc CVSSTB - 0x6 - 16 - read-write - 0x5 - 0xF - - - STB - desc STB - 3 - 0 - read-write - - - - - CVSPRD - desc CVSPRD - 0x8 - 16 - read-write - 0xF - 0xFF - - - PRD - desc PRD - 7 - 0 - read-write - - - - - - - CMP2 - desc CMP - 0x4004A010 - - 0x0 - 0xA - - - - CMP3 - desc CMP - 0x4004A020 - - 0x0 - 0xA - - - - CMPCR - desc CMPCR - 0x4004A000 - CMP1 - - 0x0 - 0x10E - - - - DADR1 - desc DADR1 - 0x100 - 16 - read-write - 0x0 - 0xFF - - - DATA - desc DATA - 7 - 0 - read-write - - - - - DADR2 - desc DADR2 - 0x102 - 16 - read-write - 0x0 - 0xFF - - - DATA - desc DATA - 7 - 0 - read-write - - - - - DACR - desc DACR - 0x108 - 16 - read-write - 0x0 - 0x3 - - - DA1EN - desc DA1EN - 0 - 0 - read-write - - - DA2EN - desc DA2EN - 1 - 1 - read-write - - - - - RVADC - desc RVADC - 0x10C - 16 - read-write - 0x0 - 0x13 - - - DA1SW - desc DA1SW - 0 - 0 - read-write - - - DA2SW - desc DA2SW - 1 - 1 - read-write - - - VREFSW - desc VREFSW - 4 - 4 - read-write - - - WPRT - desc WPRT - 15 - 8 - read-write - - - - - - - CMU - desc CMU - 0x40054000 - - 0x0 - 0x42A - - - - PERICKSEL - desc PERICKSEL - 0x10 - 16 - read-write - 0x0 - 0xF - - - PERICKSEL - desc PERICKSEL - 3 - 0 - read-write - - - - - I2SCKSEL - desc I2SCKSEL - 0x12 - 16 - read-write - 0xBBBB - 0xFFFF - - - I2S1CKSEL - desc I2S1CKSEL - 3 - 0 - read-write - - - I2S2CKSEL - desc I2S2CKSEL - 7 - 4 - read-write - - - I2S3CKSEL - desc I2S3CKSEL - 11 - 8 - read-write - - - I2S4CKSEL - desc I2S4CKSEL - 15 - 12 - read-write - - - - - SCFGR - desc SCFGR - 0x20 - 32 - read-write - 0x0 - 0x7777777 - - - PCLK0S - desc PCLK0S - 2 - 0 - read-write - - - PCLK1S - desc PCLK1S - 6 - 4 - read-write - - - PCLK2S - desc PCLK2S - 10 - 8 - read-write - - - PCLK3S - desc PCLK3S - 14 - 12 - read-write - - - PCLK4S - desc PCLK4S - 18 - 16 - read-write - - - EXCKS - desc EXCKS - 22 - 20 - read-write - - - HCLKS - desc HCLKS - 26 - 24 - read-write - - - - - USBCKCFGR - desc USBCKCFGR - 0x24 - 8 - read-write - 0x40 - 0xF0 - - - USBCKS - desc USBCKS - 7 - 4 - read-write - - - - - CKSWR - desc CKSWR - 0x26 - 8 - read-write - 0x1 - 0x7 - - - CKSW - desc CKSW - 2 - 0 - read-write - - - - - PLLCR - desc PLLCR - 0x2A - 8 - read-write - 0x1 - 0x1 - - - MPLLOFF - desc MPLLOFF - 0 - 0 - read-write - - - - - UPLLCR - desc UPLLCR - 0x2E - 8 - read-write - 0x1 - 0x1 - - - UPLLOFF - desc UPLLOFF - 0 - 0 - read-write - - - - - XTALCR - desc XTALCR - 0x32 - 8 - read-write - 0x1 - 0x1 - - - XTALSTP - desc XTALSTP - 0 - 0 - read-write - - - - - HRCCR - desc HRCCR - 0x36 - 8 - read-write - 0x1 - 0x1 - - - HRCSTP - desc HRCSTP - 0 - 0 - read-write - - - - - MRCCR - desc MRCCR - 0x38 - 8 - read-write - 0x80 - 0x1 - - - MRCSTP - desc MRCSTP - 0 - 0 - read-write - - - - - OSCSTBSR - desc OSCSTBSR - 0x3C - 8 - read-write - 0x0 - 0x69 - - - HRCSTBF - desc HRCSTBF - 0 - 0 - read-write - - - XTALSTBF - desc XTALSTBF - 3 - 3 - read-write - - - MPLLSTBF - desc MPLLSTBF - 5 - 5 - read-write - - - UPLLSTBF - desc UPLLSTBF - 6 - 6 - read-write - - - - - MCOCFGR1 - desc MCOCFGR1 - 0x3D - 8 - read-write - 0x0 - 0xFF - - - MCOSEL - desc MCOSEL - 3 - 0 - read-write - - - MCODIV - desc MCODIV - 6 - 4 - read-write - - - MCOEN - desc MCOEN - 7 - 7 - read-write - - - - - MCOCFGR2 - desc MCOCFGR2 - 0x3E - 8 - read-write - 0x0 - 0xFF - - - MCOSEL - desc MCOSEL - 3 - 0 - read-write - - - MCODIV - desc MCODIV - 6 - 4 - read-write - - - MCOEN - desc MCOEN - 7 - 7 - read-write - - - - - TPIUCKCFGR - desc TPIUCKCFGR - 0x3F - 8 - read-write - 0x0 - 0x83 - - - TPIUCKS - desc TPIUCKS - 1 - 0 - read-write - - - TPIUCKOE - desc TPIUCKOE - 7 - 7 - read-write - - - - - XTALSTDCR - desc XTALSTDCR - 0x40 - 8 - read-write - 0x0 - 0x87 - - - XTALSTDIE - desc XTALSTDIE - 0 - 0 - read-write - - - XTALSTDRE - desc XTALSTDRE - 1 - 1 - read-write - - - XTALSTDRIS - desc XTALSTDRIS - 2 - 2 - read-write - - - XTALSTDE - desc XTALSTDE - 7 - 7 - read-write - - - - - XTALSTDSR - desc XTALSTDSR - 0x41 - 8 - read-write - 0x0 - 0x1 - - - XTALSTDF - desc XTALSTDF - 0 - 0 - read-write - - - - - MRCTRM - desc MRCTRM - 0x61 - 8 - read-write - 0x0 - 0xFF - - - HRCTRM - desc HRCTRM - 0x62 - 8 - read-write - 0x0 - 0xFF - - - XTALSTBCR - desc XTALSTBCR - 0xA2 - 8 - read-write - 0x5 - 0xF - - - XTALSTB - desc XTALSTB - 3 - 0 - read-write - - - - - PLLCFGR - desc PLLCFGR - 0x100 - 32 - read-write - 0x11101300 - 0xFFF1FF9F - - - MPLLM - desc MPLLM - 4 - 0 - read-write - - - PLLSRC - desc PLLSRC - 7 - 7 - read-write - - - MPLLN - desc MPLLN - 16 - 8 - read-write - - - MPLLR - desc MPLLR - 23 - 20 - read-write - - - MPLLQ - desc MPLLQ - 27 - 24 - read-write - - - MPLLP - desc MPLLP - 31 - 28 - read-write - - - - - UPLLCFGR - desc UPLLCFGR - 0x104 - 32 - read-write - 0x11101300 - 0xFFF1FF1F - - - UPLLM - desc UPLLM - 4 - 0 - read-write - - - UPLLN - desc UPLLN - 16 - 8 - read-write - - - UPLLR - desc UPLLR - 23 - 20 - read-write - - - UPLLQ - desc UPLLQ - 27 - 24 - read-write - - - UPLLP - desc UPLLP - 31 - 28 - read-write - - - - - XTALCFGR - desc XTALCFGR - 0x410 - 8 - read-write - 0x80 - 0xF0 - - - XTALDRV - desc XTALDRV - 5 - 4 - read-write - - - XTALMS - desc XTALMS - 6 - 6 - read-write - - - SUPDRV - desc SUPDRV - 7 - 7 - read-write - - - - - XTAL32CR - desc XTAL32CR - 0x420 - 8 - read-write - 0x0 - 0x1 - - - XTAL32STP - desc XTAL32STP - 0 - 0 - read-write - - - - - XTAL32CFGR - desc XTAL32CFGR - 0x421 - 8 - read-write - 0x0 - 0x7 - - - XTAL32DRV - desc XTAL32DRV - 2 - 0 - read-write - - - - - XTAL32NFR - desc XTAL32NFR - 0x425 - 8 - read-write - 0x0 - 0x3 - - - XTAL32NF - desc XTAL32NF - 1 - 0 - read-write - - - - - LRCCR - desc LRCCR - 0x427 - 8 - read-write - 0x0 - 0x1 - - - LRCSTP - desc LRCSTP - 0 - 0 - read-write - - - - - LRCTRM - desc LRCTRM - 0x429 - 8 - read-write - 0x0 - 0xFF - - - - - CRC - desc CRC - 0x40008C00 - - 0x0 - 0x100 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x1C - 0x1E - - - CR - desc CR - 1 - 1 - read-write - - - REFIN - desc REFIN - 2 - 2 - read-write - - - REFOUT - desc REFOUT - 3 - 3 - read-write - - - XOROUT - desc XOROUT - 4 - 4 - read-write - - - - - RESLT - desc RESLT - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CRC_REG - desc CRC_REG - 15 - 0 - read-write - - - CRCFLAG_16 - desc CRCFLAG_16 - 16 - 16 - read-only - - - - - FLG - desc FLG - 0xC - 32 - read-only - 0x1 - 0x1 - - - CRCFLAG_32 - desc CRCFLAG_32 - 0 - 0 - read-only - - - - - DAT0 - desc DAT0 - 0x80 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT1 - desc DAT1 - 0x84 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT2 - desc DAT2 - 0x88 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT3 - desc DAT3 - 0x8C - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT4 - desc DAT4 - 0x90 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT5 - desc DAT5 - 0x94 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT6 - desc DAT6 - 0x98 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT7 - desc DAT7 - 0x9C - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT8 - desc DAT8 - 0xA0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT9 - desc DAT9 - 0xA4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT10 - desc DAT10 - 0xA8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT11 - desc DAT11 - 0xAC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT12 - desc DAT12 - 0xB0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT13 - desc DAT13 - 0xB4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT14 - desc DAT14 - 0xB8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT15 - desc DAT15 - 0xBC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT16 - desc DAT16 - 0xC0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT17 - desc DAT17 - 0xC4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT18 - desc DAT18 - 0xC8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT19 - desc DAT19 - 0xCC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT20 - desc DAT20 - 0xD0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT21 - desc DAT21 - 0xD4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT22 - desc DAT22 - 0xD8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT23 - desc DAT23 - 0xDC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT24 - desc DAT24 - 0xE0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT25 - desc DAT25 - 0xE4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT26 - desc DAT26 - 0xE8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT27 - desc DAT27 - 0xEC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT28 - desc DAT28 - 0xF0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT29 - desc DAT29 - 0xF4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT30 - desc DAT30 - 0xF8 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DAT31 - desc DAT31 - 0xFC - 32 - read-only - 0x0 - 0xFFFFFFFF - - - - - DBGC - desc DBGC - 0xE0042000 - - 0x0 - 0x28 - - - - AUTHID0 - desc AUTHID0 - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - AUTHID1 - desc AUTHID1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - AUTHID2 - desc AUTHID2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RESV0 - desc RESV0 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MCUSTAT - desc MCUSTAT - 0x10 - 32 - read-write - 0x0 - 0x30F - - - AUTH - desc AUTH - 0 - 0 - read-write - - - REMVLOCK - desc REMVLOCK - 1 - 1 - read-write - - - SAFTYLOCK1 - desc SAFTYLOCK1 - 2 - 2 - read-write - - - SAFTYLOCK2 - desc SAFTYLOCK2 - 3 - 3 - read-write - - - CPUSTOP - desc CPUSTOP - 8 - 8 - read-write - - - CPUSLEEP - desc CPUSLEEP - 9 - 9 - read-write - - - - - MCUCTL - desc MCUCTL - 0x14 - 32 - read-write - 0x0 - 0x103 - - - EDBGRQ - desc EDBGRQ - 0 - 0 - read-write - - - RESTART - desc RESTART - 1 - 1 - read-write - - - DIRQ - desc DIRQ - 8 - 8 - read-write - - - - - FMCCTL - desc FMCCTL - 0x18 - 32 - read-write - 0x0 - 0x7 - - - ERASEREQ - desc ERASEREQ - 0 - 0 - read-write - - - ERASEACK - desc ERASEACK - 1 - 1 - read-write - - - ERASEERR - desc ERASEERR - 2 - 2 - read-write - - - - - MCUDBGSTAT - desc MCUDBGSTAT - 0x1C - 32 - read-write - 0x0 - 0x3 - - - CDBGPWRUPREQ - desc CDBGPWRUPREQ - 0 - 0 - read-write - - - CDBGPWRUPACK - desc CDBGPWRUPACK - 1 - 1 - read-write - - - - - MCUSTPCTL - desc MCUSTPCTL - 0x20 - 32 - read-write - 0x3 - 0xFFF0C03F - - - SWDTSTP - desc SWDTSTP - 0 - 0 - read-write - - - WDTSTP - desc WDTSTP - 1 - 1 - read-write - - - RTCSTP - desc RTCSTP - 2 - 2 - read-write - - - PVD0STP - desc PVD0STP - 3 - 3 - read-write - - - PVD1STP - desc PVD1STP - 4 - 4 - read-write - - - PVD2STP - desc PVD2STP - 5 - 5 - read-write - - - TMR01STP - desc TMR01STP - 14 - 14 - read-write - - - TMR02STP - desc TMR02STP - 15 - 15 - read-write - - - TMR41STP - desc TMR41STP - 20 - 20 - read-write - - - TMR42STP - desc TMR42STP - 21 - 21 - read-write - - - TMR43STP - desc TMR43STP - 22 - 22 - read-write - - - TM61STP - desc TM61STP - 23 - 23 - read-write - - - TM62STP - desc TM62STP - 24 - 24 - read-write - - - TMR63STP - desc TMR63STP - 25 - 25 - read-write - - - TMRA1STP - desc TMRA1STP - 26 - 26 - read-write - - - TMRA2STP - desc TMRA2STP - 27 - 27 - read-write - - - TMRA3STP - desc TMRA3STP - 28 - 28 - read-write - - - TMRA4STP - desc TMRA4STP - 29 - 29 - read-write - - - TMRA5STP - desc TMRA5STP - 30 - 30 - read-write - - - TMRA6STP - desc TMRA6STP - 31 - 31 - read-write - - - - - MCUTRACECTL - desc MCUTRACECTL - 0x24 - 32 - read-write - 0x0 - 0x7 - - - TRACEMODE - desc TRACEMODE - 1 - 0 - read-write - - - TRACEIOEN - desc TRACEIOEN - 2 - 2 - read-write - - - - - - - DCU1 - desc DCU - 0x40052000 - - 0x0 - 0x1C - - - - CTL - desc CTL - 0x0 - 32 - read-write - 0x80000000 - 0x8000011F - - - MODE - desc MODE - 2 - 0 - read-write - - - DATASIZE - desc DATASIZE - 4 - 3 - read-write - - - COMP_TRG - desc COMP_TRG - 8 - 8 - read-write - - - INTEN - desc INTEN - 31 - 31 - read-write - - - - - FLAG - desc FLAG - 0x4 - 32 - read-only - 0x0 - 0x7F - - - FLAG_OP - desc FLAG_OP - 0 - 0 - read-only - - - FLAG_LS2 - desc FLAG_LS2 - 1 - 1 - read-only - - - FLAG_EQ2 - desc FLAG_EQ2 - 2 - 2 - read-only - - - FLAG_GT2 - desc FLAG_GT2 - 3 - 3 - read-only - - - FLAG_LS1 - desc FLAG_LS1 - 4 - 4 - read-only - - - FLAG_EQ1 - desc FLAG_EQ1 - 5 - 5 - read-only - - - FLAG_GT1 - desc FLAG_GT1 - 6 - 6 - read-only - - - - - DATA0 - desc DATA0 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA1 - desc DATA1 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA2 - desc DATA2 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FLAGCLR - desc FLAGCLR - 0x14 - 32 - write-only - 0x0 - 0x7F - - - CLR_OP - desc CLR_OP - 0 - 0 - write-only - - - CLR_LS2 - desc CLR_LS2 - 1 - 1 - write-only - - - CLR_EQ2 - desc CLR_EQ2 - 2 - 2 - write-only - - - CLR_GT2 - desc CLR_GT2 - 3 - 3 - write-only - - - CLR_LS1 - desc CLR_LS1 - 4 - 4 - write-only - - - CLR_EQ1 - desc CLR_EQ1 - 5 - 5 - write-only - - - CLR_GT1 - desc CLR_GT1 - 6 - 6 - write-only - - - - - INTSEL - desc INTSEL - 0x18 - 32 - read-write - 0x0 - 0x1FF - - - INT_OP - desc INT_OP - 0 - 0 - read-write - - - INT_LS2 - desc INT_LS2 - 1 - 1 - read-write - - - INT_EQ2 - desc INT_EQ2 - 2 - 2 - read-write - - - INT_GT2 - desc INT_GT2 - 3 - 3 - read-write - - - INT_LS1 - desc INT_LS1 - 4 - 4 - read-write - - - INT_EQ1 - desc INT_EQ1 - 5 - 5 - read-write - - - INT_GT1 - desc INT_GT1 - 6 - 6 - read-write - - - INT_WIN - desc INT_WIN - 8 - 7 - read-write - - - - - - - DCU2 - desc DCU - 0x40052400 - - 0x0 - 0x1C - - - - DCU3 - desc DCU - 0x40052800 - - 0x0 - 0x1C - - - - DCU4 - desc DCU - 0x40052C00 - - 0x0 - 0x1C - - - - DMA1 - desc DMA - 0x40053000 - - 0x0 - 0x120 - - - - EN - desc EN - 0x0 - 32 - read-write - 0x0 - 0x1 - - - EN - desc EN - 0 - 0 - read-write - - - - - INTSTAT0 - desc INTSTAT0 - 0x4 - 32 - read-only - 0x0 - 0xF000F - - - TRNERR - desc TRNERR - 3 - 0 - read-only - - - REQERR - desc REQERR - 19 - 16 - read-only - - - - - INTSTAT1 - desc INTSTAT1 - 0x8 - 32 - read-only - 0x0 - 0xF000F - - - TC - desc TC - 3 - 0 - read-only - - - BTC - desc BTC - 19 - 16 - read-only - - - - - INTMASK0 - desc INTMASK0 - 0xC - 32 - read-write - 0x0 - 0xF000F - - - MSKTRNERR - desc MSKTRNERR - 3 - 0 - read-write - - - MSKREQERR - desc MSKREQERR - 19 - 16 - read-write - - - - - INTMASK1 - desc INTMASK1 - 0x10 - 32 - read-write - 0x0 - 0xF000F - - - MSKTC - desc MSKTC - 3 - 0 - read-write - - - MSKBTC - desc MSKBTC - 19 - 16 - read-write - - - - - INTCLR0 - desc INTCLR0 - 0x14 - 32 - write-only - 0x0 - 0xF000F - - - CLRTRNERR - desc CLRTRNERR - 3 - 0 - write-only - - - CLRREQERR - desc CLRREQERR - 19 - 16 - write-only - - - - - INTCLR1 - desc INTCLR1 - 0x18 - 32 - write-only - 0x0 - 0xF000F - - - CLRTC - desc CLRTC - 3 - 0 - write-only - - - CLRBTC - desc CLRBTC - 19 - 16 - write-only - - - - - CHEN - desc CHEN - 0x1C - 32 - read-write - 0x0 - 0xF - - - CHEN - desc CHEN - 3 - 0 - read-write - - - - - REQSTAT - desc REQSTAT - 0x20 - 32 - read-only - 0x0 - 0x800F - - - CHREQ - desc CHREQ - 3 - 0 - read-only - - - RCFGREQ - desc RCFGREQ - 15 - 15 - read-only - - - - - CHSTAT - desc CHSTAT - 0x24 - 32 - read-only - 0x0 - 0xF0003 - - - DMAACT - desc DMAACT - 0 - 0 - read-only - - - RCFGACT - desc RCFGACT - 1 - 1 - read-only - - - CHACT - desc CHACT - 19 - 16 - read-only - - - - - RCFGCTL - desc RCFGCTL - 0x2C - 32 - read-write - 0x0 - 0x3F0F03 - - - RCFGEN - desc RCFGEN - 0 - 0 - read-write - - - RCFGLLP - desc RCFGLLP - 1 - 1 - read-write - - - RCFGCHS - desc RCFGCHS - 11 - 8 - read-write - - - SARMD - desc SARMD - 17 - 16 - read-write - - - DARMD - desc DARMD - 19 - 18 - read-write - - - CNTMD - desc CNTMD - 21 - 20 - read-write - - - - - SAR0 - desc SAR0 - 0x40 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR0 - desc DAR0 - 0x44 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL0 - desc DTCTL0 - 0x48 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT0 - desc RPT0 - 0x4C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB0 - desc RPTB0 - 0x4C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL0 - desc SNSEQCTL0 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB0 - desc SNSEQCTLB0 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL0 - desc DNSEQCTL0 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB0 - desc DNSEQCTLB0 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP0 - desc LLP0 - 0x58 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL0 - desc CHCTL0 - 0x5C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR0 - desc MONSAR0 - 0x60 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR0 - desc MONDAR0 - 0x64 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL0 - desc MONDTCTL0 - 0x68 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT0 - desc MONRPT0 - 0x6C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL0 - desc MONSNSEQCTL0 - 0x70 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL0 - desc MONDNSEQCTL0 - 0x74 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR1 - desc SAR1 - 0x80 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR1 - desc DAR1 - 0x84 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL1 - desc DTCTL1 - 0x88 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT1 - desc RPT1 - 0x8C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB1 - desc RPTB1 - 0x8C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL1 - desc SNSEQCTL1 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB1 - desc SNSEQCTLB1 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL1 - desc DNSEQCTL1 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB1 - desc DNSEQCTLB1 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP1 - desc LLP1 - 0x98 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL1 - desc CHCTL1 - 0x9C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR1 - desc MONSAR1 - 0xA0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR1 - desc MONDAR1 - 0xA4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL1 - desc MONDTCTL1 - 0xA8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT1 - desc MONRPT1 - 0xAC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL1 - desc MONSNSEQCTL1 - 0xB0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL1 - desc MONDNSEQCTL1 - 0xB4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR2 - desc SAR2 - 0xC0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR2 - desc DAR2 - 0xC4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL2 - desc DTCTL2 - 0xC8 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT2 - desc RPT2 - 0xCC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB2 - desc RPTB2 - 0xCC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL2 - desc SNSEQCTL2 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB2 - desc SNSEQCTLB2 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL2 - desc DNSEQCTL2 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB2 - desc DNSEQCTLB2 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP2 - desc LLP2 - 0xD8 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL2 - desc CHCTL2 - 0xDC - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR2 - desc MONSAR2 - 0xE0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR2 - desc MONDAR2 - 0xE4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL2 - desc MONDTCTL2 - 0xE8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT2 - desc MONRPT2 - 0xEC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL2 - desc MONSNSEQCTL2 - 0xF0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL2 - desc MONDNSEQCTL2 - 0xF4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR3 - desc SAR3 - 0x100 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR3 - desc DAR3 - 0x104 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL3 - desc DTCTL3 - 0x108 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT3 - desc RPT3 - 0x10C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB3 - desc RPTB3 - 0x10C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL3 - desc SNSEQCTL3 - 0x110 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB3 - desc SNSEQCTLB3 - 0x110 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL3 - desc DNSEQCTL3 - 0x114 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB3 - desc DNSEQCTLB3 - 0x114 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP3 - desc LLP3 - 0x118 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL3 - desc CHCTL3 - 0x11C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR3 - desc MONSAR3 - 0x120 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR3 - desc MONDAR3 - 0x124 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL3 - desc MONDTCTL3 - 0x128 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT3 - desc MONRPT3 - 0x12C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL3 - desc MONSNSEQCTL3 - 0x130 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL3 - desc MONDNSEQCTL3 - 0x134 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - - - DMA2 - desc DMA - 0x40053400 - - 0x0 - 0x120 - - - - EFM - desc EFM - 0x40010400 - - 0x0 - 0x208 - - - - FAPRT - desc FAPRT - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - FAPRT - desc FAPRT - 15 - 0 - read-write - - - - - FSTP - desc FSTP - 0x4 - 32 - read-write - 0x0 - 0x1 - - - FSTP - desc FSTP - 0 - 0 - read-write - - - - - FRMC - desc FRMC - 0x8 - 32 - read-write - 0x0 - 0x10101F1 - - - SLPMD - desc SLPMD - 0 - 0 - read-write - - - FLWT - desc FLWT - 7 - 4 - read-write - - - LVM - desc LVM - 8 - 8 - read-write - - - CACHE - desc CACHE - 16 - 16 - read-write - - - CRST - desc CRST - 24 - 24 - read-write - - - - - FWMC - desc FWMC - 0xC - 32 - read-write - 0x0 - 0x171 - - - PEMODE - desc PEMODE - 0 - 0 - read-write - - - PEMOD - desc PEMOD - 6 - 4 - read-write - - - BUSHLDCTL - desc BUSHLDCTL - 8 - 8 - read-write - - - - - FSR - desc FSR - 0x10 - 32 - read-only - 0x100 - 0x13F - - - PEWERR - desc PEWERR - 0 - 0 - read-only - - - PEPRTERR - desc PEPRTERR - 1 - 1 - read-only - - - PGSZERR - desc PGSZERR - 2 - 2 - read-only - - - PGMISMTCH - desc PGMISMTCH - 3 - 3 - read-only - - - OPTEND - desc OPTEND - 4 - 4 - read-only - - - COLERR - desc COLERR - 5 - 5 - read-only - - - RDY - desc RDY - 8 - 8 - read-only - - - - - FSCLR - desc FSCLR - 0x14 - 32 - read-write - 0x0 - 0x3F - - - PEWERRCLR - desc PEWERRCLR - 0 - 0 - read-write - - - PEPRTERRCLR - desc PEPRTERRCLR - 1 - 1 - read-write - - - PGSZERRCLR - desc PGSZERRCLR - 2 - 2 - read-write - - - PGMISMTCHCLR - desc PGMISMTCHCLR - 3 - 3 - read-write - - - OPTENDCLR - desc OPTENDCLR - 4 - 4 - read-write - - - COLERRCLR - desc COLERRCLR - 5 - 5 - read-write - - - - - FITE - desc FITE - 0x18 - 32 - read-write - 0x0 - 0x7 - - - PEERRITE - desc PEERRITE - 0 - 0 - read-write - - - OPTENDITE - desc OPTENDITE - 1 - 1 - read-write - - - COLERRITE - desc COLERRITE - 2 - 2 - read-write - - - - - FSWP - desc FSWP - 0x1C - 32 - read-only - 0x1 - 0x1 - - - FSWP - desc FSWP - 0 - 0 - read-only - - - - - FPMTSW - desc FPMTSW - 0x20 - 32 - read-write - 0x0 - 0x7FFFF - - - FPMTSW - desc FPMTSW - 18 - 0 - read-write - - - - - FPMTEW - desc FPMTEW - 0x24 - 32 - read-write - 0x0 - 0x7FFFF - - - FPMTEW - desc FPMTEW - 18 - 0 - read-write - - - - - UQID0 - desc UQID0 - 0x50 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - UQID1 - desc UQID1 - 0x54 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - UQID2 - desc UQID2 - 0x58 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MMF_REMPRT - desc MMF_REMPRT - 0x100 - 32 - read-write - 0x0 - 0xFFFF - - - REMPRT - desc REMPRT - 15 - 0 - read-write - - - - - MMF_REMCR0 - desc MMF_REMCR0 - 0x104 - 32 - read-write - 0x0 - 0x9FFFF01F - - - RMSIZE - desc RMSIZE - 4 - 0 - read-write - - - RMTADDR - desc RMTADDR - 28 - 12 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - MMF_REMCR1 - desc MMF_REMCR1 - 0x108 - 32 - read-write - 0x0 - 0x9FFFF01F - - - RMSIZE - desc RMSIZE - 4 - 0 - read-write - - - RMTADDR - desc RMTADDR - 28 - 12 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - - - EMB0 - desc EMB - 0x40017C00 - - 0x0 - 0x18 - - - - CTL - desc CTL - 0x0 - 32 - read-write - 0x0 - 0xF00001EF - - - PORTINEN - desc PORTINEN - 0 - 0 - read-write - - - CMPEN0 - desc CMPEN0 - 1 - 1 - read-write - - - CMPEN1 - desc CMPEN1 - 2 - 2 - read-write - - - CMPEN2 - desc CMPEN2 - 3 - 3 - read-write - - - OSCSTPEN - desc OSCSTPEN - 5 - 5 - read-write - - - PWMSEN0 - desc PWMSEN0 - 6 - 6 - read-write - - - PWMSEN1 - desc PWMSEN1 - 7 - 7 - read-write - - - PWMSEN2 - desc PWMSEN2 - 8 - 8 - read-write - - - NFSEL - desc NFSEL - 29 - 28 - read-write - - - NFEN - desc NFEN - 30 - 30 - read-write - - - INVSEL - desc INVSEL - 31 - 31 - read-write - - - - - PWMLV - desc PWMLV - 0x4 - 32 - read-write - 0x0 - 0x7 - - - PWMLV0 - desc PWMLV0 - 0 - 0 - read-write - - - PWMLV1 - desc PWMLV1 - 1 - 1 - read-write - - - PWMLV2 - desc PWMLV2 - 2 - 2 - read-write - - - - - SOE - desc SOE - 0x8 - 32 - read-write - 0x0 - 0x1 - - - SOE - desc SOE - 0 - 0 - read-write - - - - - STAT - desc STAT - 0xC - 32 - read-only - 0x0 - 0x3F - - - PORTINF - desc PORTINF - 0 - 0 - read-only - - - PWMSF - desc PWMSF - 1 - 1 - read-only - - - CMPF - desc CMPF - 2 - 2 - read-only - - - OSF - desc OSF - 3 - 3 - read-only - - - PORTINST - desc PORTINST - 4 - 4 - read-only - - - PWMST - desc PWMST - 5 - 5 - read-only - - - - - STATCLR - desc STATCLR - 0x10 - 32 - write-only - 0x0 - 0xF - - - PORTINFCLR - desc PORTINFCLR - 0 - 0 - write-only - - - PWMSFCLR - desc PWMSFCLR - 1 - 1 - write-only - - - CMPFCLR - desc CMPFCLR - 2 - 2 - write-only - - - OSFCLR - desc OSFCLR - 3 - 3 - write-only - - - - - INTEN - desc INTEN - 0x14 - 32 - read-write - 0x0 - 0xF - - - PORTINTEN - desc PORTINTEN - 0 - 0 - read-write - - - PWMINTEN - desc PWMINTEN - 1 - 1 - read-write - - - CMPINTEN - desc CMPINTEN - 2 - 2 - read-write - - - OSINTEN - desc OSINTEN - 3 - 3 - read-write - - - - - - - EMB1 - desc EMB - 0x40017C20 - - 0x0 - 0x18 - - - - EMB2 - desc EMB - 0x40017C40 - - 0x0 - 0x18 - - - - EMB3 - desc EMB - 0x40017C60 - - 0x0 - 0x18 - - - - FCM - desc FCM - 0x40048400 - - 0x0 - 0x24 - - - - LVR - desc LVR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - LVR - desc LVR - 15 - 0 - read-write - - - - - UVR - desc UVR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - UVR - desc UVR - 15 - 0 - read-write - - - - - CNTR - desc CNTR - 0x8 - 32 - read-only - 0x0 - 0xFFFF - - - CNTR - desc CNTR - 15 - 0 - read-only - - - - - STR - desc STR - 0xC - 32 - read-write - 0x0 - 0x1 - - - START - desc START - 0 - 0 - read-write - - - - - MCCR - desc MCCR - 0x10 - 32 - read-write - 0x0 - 0xF3 - - - MDIVS - desc MDIVS - 1 - 0 - read-write - - - MCKS - desc MCKS - 7 - 4 - read-write - - - - - RCCR - desc RCCR - 0x14 - 32 - read-write - 0x0 - 0xB3FB - - - RDIVS - desc RDIVS - 1 - 0 - read-write - - - RCKS - desc RCKS - 6 - 3 - read-write - - - INEXS - desc INEXS - 7 - 7 - read-write - - - DNFS - desc DNFS - 9 - 8 - read-write - - - EDGES - desc EDGES - 13 - 12 - read-write - - - EXREFE - desc EXREFE - 15 - 15 - read-write - - - - - RIER - desc RIER - 0x18 - 32 - read-write - 0x0 - 0x97 - - - ERRIE - desc ERRIE - 0 - 0 - read-write - - - MENDIE - desc MENDIE - 1 - 1 - read-write - - - OVFIE - desc OVFIE - 2 - 2 - read-write - - - ERRINTRS - desc ERRINTRS - 4 - 4 - read-write - - - ERRE - desc ERRE - 7 - 7 - read-write - - - - - SR - desc SR - 0x1C - 32 - read-only - 0x0 - 0x7 - - - ERRF - desc ERRF - 0 - 0 - read-only - - - MENDF - desc MENDF - 1 - 1 - read-only - - - OVF - desc OVF - 2 - 2 - read-only - - - - - CLR - desc CLR - 0x20 - 32 - write-only - 0x0 - 0x7 - - - ERRFCLR - desc ERRFCLR - 0 - 0 - write-only - - - MENDFCLR - desc MENDFCLR - 1 - 1 - write-only - - - OVFCLR - desc OVFCLR - 2 - 2 - write-only - - - - - - - GPIO - desc GPIO - 0x40053800 - - 0x0 - 0x54C - - - - PIDRA - desc PIDRA - 0x0 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRA - desc PODRA - 0x4 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERA - desc POERA - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRA - desc POSRA - 0x8 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRA - desc PORRA - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRA - desc POTRA - 0xC - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRB - desc PIDRB - 0x10 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRB - desc PODRB - 0x14 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERB - desc POERB - 0x16 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRB - desc POSRB - 0x18 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRB - desc PORRB - 0x1A - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRB - desc POTRB - 0x1C - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRC - desc PIDRC - 0x20 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRC - desc PODRC - 0x24 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERC - desc POERC - 0x26 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRC - desc POSRC - 0x28 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRC - desc PORRC - 0x2A - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRC - desc POTRC - 0x2C - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRD - desc PIDRD - 0x30 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRD - desc PODRD - 0x34 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERD - desc POERD - 0x36 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRD - desc POSRD - 0x38 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRD - desc PORRD - 0x3A - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRD - desc POTRD - 0x3C - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRE - desc PIDRE - 0x40 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRE - desc PODRE - 0x44 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERE - desc POERE - 0x46 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRE - desc POSRE - 0x48 - 16 - read-write - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - POS03 - desc POS03 - 3 - 3 - read-write - - - POS04 - desc POS04 - 4 - 4 - read-write - - - POS05 - desc POS05 - 5 - 5 - read-write - - - POS06 - desc POS06 - 6 - 6 - read-write - - - POS07 - desc POS07 - 7 - 7 - read-write - - - POS08 - desc POS08 - 8 - 8 - read-write - - - POS09 - desc POS09 - 9 - 9 - read-write - - - POS10 - desc POS10 - 10 - 10 - read-write - - - POS11 - desc POS11 - 11 - 11 - read-write - - - POS12 - desc POS12 - 12 - 12 - read-write - - - POS13 - desc POS13 - 13 - 13 - read-write - - - POS14 - desc POS14 - 14 - 14 - read-write - - - POS15 - desc POS15 - 15 - 15 - read-write - - - - - PORRE - desc PORRE - 0x4A - 16 - read-write - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - POR03 - desc POR03 - 3 - 3 - read-write - - - POR04 - desc POR04 - 4 - 4 - read-write - - - POR05 - desc POR05 - 5 - 5 - read-write - - - POR06 - desc POR06 - 6 - 6 - read-write - - - POR07 - desc POR07 - 7 - 7 - read-write - - - POR08 - desc POR08 - 8 - 8 - read-write - - - POR09 - desc POR09 - 9 - 9 - read-write - - - POR10 - desc POR10 - 10 - 10 - read-write - - - POR11 - desc POR11 - 11 - 11 - read-write - - - POR12 - desc POR12 - 12 - 12 - read-write - - - POR13 - desc POR13 - 13 - 13 - read-write - - - POR14 - desc POR14 - 14 - 14 - read-write - - - POR15 - desc POR15 - 15 - 15 - read-write - - - - - POTRE - desc POTRE - 0x4C - 16 - read-write - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - POT03 - desc POT03 - 3 - 3 - read-write - - - POT04 - desc POT04 - 4 - 4 - read-write - - - POT05 - desc POT05 - 5 - 5 - read-write - - - POT06 - desc POT06 - 6 - 6 - read-write - - - POT07 - desc POT07 - 7 - 7 - read-write - - - POT08 - desc POT08 - 8 - 8 - read-write - - - POT09 - desc POT09 - 9 - 9 - read-write - - - POT10 - desc POT10 - 10 - 10 - read-write - - - POT11 - desc POT11 - 11 - 11 - read-write - - - POT12 - desc POT12 - 12 - 12 - read-write - - - POT13 - desc POT13 - 13 - 13 - read-write - - - POT14 - desc POT14 - 14 - 14 - read-write - - - POT15 - desc POT15 - 15 - 15 - read-write - - - - - PIDRH - desc PIDRH - 0x50 - 16 - read-only - 0x0 - 0x7 - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - - - PODRH - desc PODRH - 0x54 - 16 - read-write - 0x0 - 0x7 - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - - - POERH - desc POERH - 0x56 - 16 - read-write - 0x0 - 0x7 - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - - - POSRH - desc POSRH - 0x58 - 16 - read-write - 0x0 - 0x7 - - - POS00 - desc POS00 - 0 - 0 - read-write - - - POS01 - desc POS01 - 1 - 1 - read-write - - - POS02 - desc POS02 - 2 - 2 - read-write - - - - - PORRH - desc PORRH - 0x5A - 16 - read-write - 0x0 - 0x7 - - - POR00 - desc POR00 - 0 - 0 - read-write - - - POR01 - desc POR01 - 1 - 1 - read-write - - - POR02 - desc POR02 - 2 - 2 - read-write - - - - - POTRH - desc POTRH - 0x5C - 16 - read-write - 0x0 - 0x7 - - - POT00 - desc POT00 - 0 - 0 - read-write - - - POT01 - desc POT01 - 1 - 1 - read-write - - - POT02 - desc POT02 - 2 - 2 - read-write - - - - - PSPCR - desc PSPCR - 0x3F4 - 16 - read-write - 0x0 - 0x1F - - - SPFE - desc SPFE - 4 - 0 - read-write - - - - - PCCR - desc PCCR - 0x3F8 - 16 - read-write - 0x0 - 0xC00F - - - BFSEL - desc BFSEL - 3 - 0 - read-write - - - RDWT - desc RDWT - 15 - 14 - read-write - - - - - PINAER - desc PINAER - 0x3FA - 16 - read-write - 0x0 - 0x3F - - - PINAE - desc PINAE - 5 - 0 - read-write - - - - - PWPR - desc PWPR - 0x3FC - 16 - read-write - 0x0 - 0xFF01 - - - WE - desc WE - 0 - 0 - read-write - - - WP - desc WP - 15 - 8 - write-only - - - - - PCRA0 - desc PCRA0 - 0x400 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA0 - desc PFSRA0 - 0x402 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA1 - desc PCRA1 - 0x404 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA1 - desc PFSRA1 - 0x406 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA2 - desc PCRA2 - 0x408 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA2 - desc PFSRA2 - 0x40A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA3 - desc PCRA3 - 0x40C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA3 - desc PFSRA3 - 0x40E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA4 - desc PCRA4 - 0x410 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA4 - desc PFSRA4 - 0x412 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA5 - desc PCRA5 - 0x414 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA5 - desc PFSRA5 - 0x416 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA6 - desc PCRA6 - 0x418 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA6 - desc PFSRA6 - 0x41A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA7 - desc PCRA7 - 0x41C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA7 - desc PFSRA7 - 0x41E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA8 - desc PCRA8 - 0x420 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA8 - desc PFSRA8 - 0x422 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA9 - desc PCRA9 - 0x424 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA9 - desc PFSRA9 - 0x426 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA10 - desc PCRA10 - 0x428 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA10 - desc PFSRA10 - 0x42A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA11 - desc PCRA11 - 0x42C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA11 - desc PFSRA11 - 0x42E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA12 - desc PCRA12 - 0x430 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA12 - desc PFSRA12 - 0x432 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA13 - desc PCRA13 - 0x434 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA13 - desc PFSRA13 - 0x436 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA14 - desc PCRA14 - 0x438 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA14 - desc PFSRA14 - 0x43A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA15 - desc PCRA15 - 0x43C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA15 - desc PFSRA15 - 0x43E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB0 - desc PCRB0 - 0x440 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB0 - desc PFSRB0 - 0x442 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB1 - desc PCRB1 - 0x444 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB1 - desc PFSRB1 - 0x446 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB2 - desc PCRB2 - 0x448 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB2 - desc PFSRB2 - 0x44A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB3 - desc PCRB3 - 0x44C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB3 - desc PFSRB3 - 0x44E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB4 - desc PCRB4 - 0x450 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB4 - desc PFSRB4 - 0x452 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB5 - desc PCRB5 - 0x454 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB5 - desc PFSRB5 - 0x456 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB6 - desc PCRB6 - 0x458 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB6 - desc PFSRB6 - 0x45A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB7 - desc PCRB7 - 0x45C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB7 - desc PFSRB7 - 0x45E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB8 - desc PCRB8 - 0x460 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB8 - desc PFSRB8 - 0x462 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB9 - desc PCRB9 - 0x464 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB9 - desc PFSRB9 - 0x466 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB10 - desc PCRB10 - 0x468 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB10 - desc PFSRB10 - 0x46A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB11 - desc PCRB11 - 0x46C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB11 - desc PFSRB11 - 0x46E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB12 - desc PCRB12 - 0x470 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB12 - desc PFSRB12 - 0x472 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB13 - desc PCRB13 - 0x474 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB13 - desc PFSRB13 - 0x476 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB14 - desc PCRB14 - 0x478 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB14 - desc PFSRB14 - 0x47A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB15 - desc PCRB15 - 0x47C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB15 - desc PFSRB15 - 0x47E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC0 - desc PCRC0 - 0x480 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC0 - desc PFSRC0 - 0x482 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC1 - desc PCRC1 - 0x484 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC1 - desc PFSRC1 - 0x486 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC2 - desc PCRC2 - 0x488 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC2 - desc PFSRC2 - 0x48A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC3 - desc PCRC3 - 0x48C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC3 - desc PFSRC3 - 0x48E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC4 - desc PCRC4 - 0x490 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC4 - desc PFSRC4 - 0x492 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC5 - desc PCRC5 - 0x494 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC5 - desc PFSRC5 - 0x496 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC6 - desc PCRC6 - 0x498 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC6 - desc PFSRC6 - 0x49A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC7 - desc PCRC7 - 0x49C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC7 - desc PFSRC7 - 0x49E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC8 - desc PCRC8 - 0x4A0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC8 - desc PFSRC8 - 0x4A2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC9 - desc PCRC9 - 0x4A4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC9 - desc PFSRC9 - 0x4A6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC10 - desc PCRC10 - 0x4A8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC10 - desc PFSRC10 - 0x4AA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC11 - desc PCRC11 - 0x4AC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC11 - desc PFSRC11 - 0x4AE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC12 - desc PCRC12 - 0x4B0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC12 - desc PFSRC12 - 0x4B2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC13 - desc PCRC13 - 0x4B4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC13 - desc PFSRC13 - 0x4B6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC14 - desc PCRC14 - 0x4B8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC14 - desc PFSRC14 - 0x4BA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC15 - desc PCRC15 - 0x4BC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC15 - desc PFSRC15 - 0x4BE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD0 - desc PCRD0 - 0x4C0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD0 - desc PFSRD0 - 0x4C2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD1 - desc PCRD1 - 0x4C4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD1 - desc PFSRD1 - 0x4C6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD2 - desc PCRD2 - 0x4C8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD2 - desc PFSRD2 - 0x4CA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD3 - desc PCRD3 - 0x4CC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD3 - desc PFSRD3 - 0x4CE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD4 - desc PCRD4 - 0x4D0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD4 - desc PFSRD4 - 0x4D2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD5 - desc PCRD5 - 0x4D4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD5 - desc PFSRD5 - 0x4D6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD6 - desc PCRD6 - 0x4D8 - 16 - read-write - 0x8100 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD6 - desc PFSRD6 - 0x4DA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD7 - desc PCRD7 - 0x4DC - 16 - read-write - 0x8100 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD7 - desc PFSRD7 - 0x4DE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD8 - desc PCRD8 - 0x4E0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD8 - desc PFSRD8 - 0x4E2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD9 - desc PCRD9 - 0x4E4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD9 - desc PFSRD9 - 0x4E6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD10 - desc PCRD10 - 0x4E8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD10 - desc PFSRD10 - 0x4EA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD11 - desc PCRD11 - 0x4EC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD11 - desc PFSRD11 - 0x4EE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD12 - desc PCRD12 - 0x4F0 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD12 - desc PFSRD12 - 0x4F2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD13 - desc PCRD13 - 0x4F4 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD13 - desc PFSRD13 - 0x4F6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD14 - desc PCRD14 - 0x4F8 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD14 - desc PFSRD14 - 0x4FA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD15 - desc PCRD15 - 0x4FC - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD15 - desc PFSRD15 - 0x4FE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE0 - desc PCRE0 - 0x500 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE0 - desc PFSRE0 - 0x502 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE1 - desc PCRE1 - 0x504 - 16 - read-write - 0x40 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE1 - desc PFSRE1 - 0x506 - 16 - read-write - 0xD - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE2 - desc PCRE2 - 0x508 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE2 - desc PFSRE2 - 0x50A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE3 - desc PCRE3 - 0x50C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE3 - desc PFSRE3 - 0x50E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE4 - desc PCRE4 - 0x510 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE4 - desc PFSRE4 - 0x512 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE5 - desc PCRE5 - 0x514 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE5 - desc PFSRE5 - 0x516 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE6 - desc PCRE6 - 0x518 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE6 - desc PFSRE6 - 0x51A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE7 - desc PCRE7 - 0x51C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE7 - desc PFSRE7 - 0x51E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE8 - desc PCRE8 - 0x520 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE8 - desc PFSRE8 - 0x522 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE9 - desc PCRE9 - 0x524 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE9 - desc PFSRE9 - 0x526 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE10 - desc PCRE10 - 0x528 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE10 - desc PFSRE10 - 0x52A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE11 - desc PCRE11 - 0x52C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE11 - desc PFSRE11 - 0x52E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE12 - desc PCRE12 - 0x530 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE12 - desc PFSRE12 - 0x532 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE13 - desc PCRE13 - 0x534 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE13 - desc PFSRE13 - 0x536 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE14 - desc PCRE14 - 0x538 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE14 - desc PFSRE14 - 0x53A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE15 - desc PCRE15 - 0x53C - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE15 - desc PFSRE15 - 0x53E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH0 - desc PCRH0 - 0x540 - 16 - read-write - 0x0 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH0 - desc PFSRH0 - 0x542 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH1 - desc PCRH1 - 0x544 - 16 - read-write - 0x40 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH1 - desc PFSRH1 - 0x546 - 16 - read-write - 0xD - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH2 - desc PCRH2 - 0x548 - 16 - read-write - 0x50 - 0xD377 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH2 - desc PFSRH2 - 0x54A - 16 - read-write - 0xD - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - - - HASH - desc HASH - 0x40008400 - - 0x0 - 0x80 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x3 - - - START - desc START - 0 - 0 - read-write - - - FST_GRP - desc FST_GRP - 1 - 1 - read-write - - - - - HR7 - desc HR7 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR6 - desc HR6 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR5 - desc HR5 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR4 - desc HR4 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR3 - desc HR3 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR2 - desc HR2 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR1 - desc HR1 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR0 - desc HR0 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR15 - desc DR15 - 0x40 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR14 - desc DR14 - 0x44 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR13 - desc DR13 - 0x48 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR12 - desc DR12 - 0x4C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR11 - desc DR11 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR10 - desc DR10 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR9 - desc DR9 - 0x58 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR8 - desc DR8 - 0x5C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR7 - desc DR7 - 0x60 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR6 - desc DR6 - 0x64 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR5 - desc DR5 - 0x68 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR4 - desc DR4 - 0x6C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR3 - desc DR3 - 0x70 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR2 - desc DR2 - 0x74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x78 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR0 - desc DR0 - 0x7C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - I2C1 - desc I2C - 0x4004E000 - - 0x0 - 0x34 - - - - CR1 - desc CR1 - 0x0 - 32 - read-write - 0x40 - 0x87DF - - - PE - desc PE - 0 - 0 - read-write - - - SMBUS - desc SMBUS - 1 - 1 - read-write - - - SMBALRTEN - desc SMBALRTEN - 2 - 2 - read-write - - - SMBDEFAULTEN - desc SMBDEFAULTEN - 3 - 3 - read-write - - - SMBHOSTEN - desc SMBHOSTEN - 4 - 4 - read-write - - - GCEN - desc GCEN - 6 - 6 - read-write - - - RESTART - desc RESTART - 7 - 7 - read-write - - - START - desc START - 8 - 8 - read-write - - - STOP - desc STOP - 9 - 9 - read-write - - - ACK - desc ACK - 10 - 10 - read-write - - - SWRST - desc SWRST - 15 - 15 - read-write - - - - - CR2 - desc CR2 - 0x4 - 32 - read-write - 0x0 - 0xF052DF - - - STARTIE - desc STARTIE - 0 - 0 - read-write - - - SLADDR0IE - desc SLADDR0IE - 1 - 1 - read-write - - - SLADDR1IE - desc SLADDR1IE - 2 - 2 - read-write - - - TENDIE - desc TENDIE - 3 - 3 - read-write - - - STOPIE - desc STOPIE - 4 - 4 - read-write - - - RFULLIE - desc RFULLIE - 6 - 6 - read-write - - - TEMPTYIE - desc TEMPTYIE - 7 - 7 - read-write - - - ARLOIE - desc ARLOIE - 9 - 9 - read-write - - - NACKIE - desc NACKIE - 12 - 12 - read-write - - - TMOUTIE - desc TMOUTIE - 14 - 14 - read-write - - - GENCALLIE - desc GENCALLIE - 20 - 20 - read-write - - - SMBDEFAULTIE - desc SMBDEFAULTIE - 21 - 21 - read-write - - - SMBHOSTIE - desc SMBHOSTIE - 22 - 22 - read-write - - - SMBALRTIE - desc SMBALRTIE - 23 - 23 - read-write - - - - - CR3 - desc CR3 - 0x8 - 32 - read-write - 0x6 - 0x87 - - - TMOUTEN - desc TMOUTEN - 0 - 0 - read-write - - - LTMOUT - desc LTMOUT - 1 - 1 - read-write - - - HTMOUT - desc HTMOUT - 2 - 2 - read-write - - - FACKEN - desc FACKEN - 7 - 7 - read-write - - - - - CR4 - desc CR4 - 0xC - 32 - read-write - 0x300307 - 0x400 - - - BUSWAIT - desc BUSWAIT - 10 - 10 - read-write - - - - - SLR0 - desc SLR0 - 0x10 - 32 - read-write - 0x1000 - 0x93FF - - - SLADDR0 - desc SLADDR0 - 9 - 0 - read-write - - - SLADDR0EN - desc SLADDR0EN - 12 - 12 - read-write - - - ADDRMOD0 - desc ADDRMOD0 - 15 - 15 - read-write - - - - - SLR1 - desc SLR1 - 0x14 - 32 - read-write - 0x0 - 0x93FF - - - SLADDR1 - desc SLADDR1 - 9 - 0 - read-write - - - SLADDR1EN - desc SLADDR1EN - 12 - 12 - read-write - - - ADDRMOD1 - desc ADDRMOD1 - 15 - 15 - read-write - - - - - SLTR - desc SLTR - 0x18 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - TOUTLOW - desc TOUTLOW - 15 - 0 - read-write - - - TOUTHIGH - desc TOUTHIGH - 31 - 16 - read-write - - - - - SR - desc SR - 0x1C - 32 - read-write - 0x0 - 0xF756DF - - - STARTF - desc STARTF - 0 - 0 - read-write - - - SLADDR0F - desc SLADDR0F - 1 - 1 - read-write - - - SLADDR1F - desc SLADDR1F - 2 - 2 - read-write - - - TENDF - desc TENDF - 3 - 3 - read-write - - - STOPF - desc STOPF - 4 - 4 - read-write - - - RFULLF - desc RFULLF - 6 - 6 - read-write - - - TEMPTYF - desc TEMPTYF - 7 - 7 - read-write - - - ARLOF - desc ARLOF - 9 - 9 - read-write - - - ACKRF - desc ACKRF - 10 - 10 - read-write - - - NACKF - desc NACKF - 12 - 12 - read-write - - - TMOUTF - desc TMOUTF - 14 - 14 - read-write - - - MSL - desc MSL - 16 - 16 - read-write - - - BUSY - desc BUSY - 17 - 17 - read-write - - - TRA - desc TRA - 18 - 18 - read-write - - - GENCALLF - desc GENCALLF - 20 - 20 - read-write - - - SMBDEFAULTF - desc SMBDEFAULTF - 21 - 21 - read-write - - - SMBHOSTF - desc SMBHOSTF - 22 - 22 - read-write - - - SMBALRTF - desc SMBALRTF - 23 - 23 - read-write - - - - - CLR - desc CLR - 0x20 - 32 - write-only - 0x0 - 0xF052DF - - - STARTFCLR - desc STARTFCLR - 0 - 0 - write-only - - - SLADDR0FCLR - desc SLADDR0FCLR - 1 - 1 - write-only - - - SLADDR1FCLR - desc SLADDR1FCLR - 2 - 2 - write-only - - - TENDFCLR - desc TENDFCLR - 3 - 3 - write-only - - - STOPFCLR - desc STOPFCLR - 4 - 4 - write-only - - - RFULLFCLR - desc RFULLFCLR - 6 - 6 - write-only - - - TEMPTYFCLR - desc TEMPTYFCLR - 7 - 7 - write-only - - - ARLOFCLR - desc ARLOFCLR - 9 - 9 - write-only - - - NACKFCLR - desc NACKFCLR - 12 - 12 - write-only - - - TMOUTFCLR - desc TMOUTFCLR - 14 - 14 - write-only - - - GENCALLFCLR - desc GENCALLFCLR - 20 - 20 - write-only - - - SMBDEFAULTFCLR - desc SMBDEFAULTFCLR - 21 - 21 - write-only - - - SMBHOSTFCLR - desc SMBHOSTFCLR - 22 - 22 - write-only - - - SMBALRTFCLR - desc SMBALRTFCLR - 23 - 23 - write-only - - - - - DTR - desc DTR - 0x24 - 8 - write-only - 0xFF - 0xFF - - - DT - desc DT - 7 - 0 - write-only - - - - - DRR - desc DRR - 0x28 - 8 - read-only - 0x0 - 0xFF - - - DR - desc DR - 7 - 0 - read-only - - - - - CCR - desc CCR - 0x2C - 32 - read-write - 0x1F1F - 0x71F1F - - - SLOWW - desc SLOWW - 4 - 0 - read-write - - - SHIGHW - desc SHIGHW - 12 - 8 - read-write - - - FREQ - desc FREQ - 18 - 16 - read-write - - - - - FLTR - desc FLTR - 0x30 - 32 - read-write - 0x10 - 0x33 - - - DNF - desc DNF - 1 - 0 - read-write - - - DNFEN - desc DNFEN - 4 - 4 - read-write - - - ANFEN - desc ANFEN - 5 - 5 - read-write - - - - - - - I2C2 - desc I2C - 0x4004E400 - - 0x0 - 0x34 - - - - I2C3 - desc I2C - 0x4004E800 - - 0x0 - 0x34 - - - - I2S1 - desc I2S - 0x4001E000 - - 0x0 - 0x1C - - - - CTRL - desc CTRL - 0x0 - 32 - read-write - 0x2200 - 0xFF77FF - - - TXE - desc TXE - 0 - 0 - read-write - - - TXIE - desc TXIE - 1 - 1 - read-write - - - RXE - desc RXE - 2 - 2 - read-write - - - RXIE - desc RXIE - 3 - 3 - read-write - - - EIE - desc EIE - 4 - 4 - read-write - - - WMS - desc WMS - 5 - 5 - read-write - - - ODD - desc ODD - 6 - 6 - read-write - - - MCKOE - desc MCKOE - 7 - 7 - read-write - - - TXBIRQWL - desc TXBIRQWL - 10 - 8 - read-write - - - RXBIRQWL - desc RXBIRQWL - 14 - 12 - read-write - - - FIFOR - desc FIFOR - 16 - 16 - read-write - - - CODECRC - desc CODECRC - 17 - 17 - read-write - - - I2SPLLSEL - desc I2SPLLSEL - 18 - 18 - read-write - - - SDOE - desc SDOE - 19 - 19 - read-write - - - LRCKOE - desc LRCKOE - 20 - 20 - read-write - - - CKOE - desc CKOE - 21 - 21 - read-write - - - DUPLEX - desc DUPLEX - 22 - 22 - read-write - - - CLKSEL - desc CLKSEL - 23 - 23 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-only - 0x14 - 0x3F - - - TXBA - desc TXBA - 0 - 0 - read-only - - - RXBA - desc RXBA - 1 - 1 - read-only - - - TXBE - desc TXBE - 2 - 2 - read-only - - - TXBF - desc TXBF - 3 - 3 - read-only - - - RXBE - desc RXBE - 4 - 4 - read-only - - - RXBF - desc RXBF - 5 - 5 - read-only - - - - - ER - desc ER - 0x8 - 32 - read-write - 0x0 - 0x3 - - - TXERR - desc TXERR - 0 - 0 - read-write - - - RXERR - desc RXERR - 1 - 1 - read-write - - - - - CFGR - desc CFGR - 0xC - 32 - read-write - 0x0 - 0x3F - - - I2SSTD - desc I2SSTD - 1 - 0 - read-write - - - DATLEN - desc DATLEN - 3 - 2 - read-write - - - CHLEN - desc CHLEN - 4 - 4 - read-write - - - PCMSYNC - desc PCMSYNC - 5 - 5 - read-write - - - - - TXBUF - desc TXBUF - 0x10 - 32 - write-only - 0x0 - 0xFFFFFFFF - - - RXBUF - desc RXBUF - 0x14 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - PR - desc PR - 0x18 - 32 - read-write - 0x2 - 0xFF - - - I2SDIV - desc I2SDIV - 7 - 0 - read-write - - - - - - - I2S2 - desc I2S - 0x4001E400 - - 0x0 - 0x1C - - - - I2S3 - desc I2S - 0x40022000 - - 0x0 - 0x1C - - - - I2S4 - desc I2S - 0x40022400 - - 0x0 - 0x1C - - - - ICG - desc ICG - 0x00000400 - - 0x0 - 0x20 - - - - ICG0 - desc ICG0 - 0x0 - 32 - read-only - 0xFFFFFFFF - 0x1FFF1FFF - - - SWDTAUTS - desc SWDTAUTS - 0 - 0 - read-only - - - SWDTITS - desc SWDTITS - 1 - 1 - read-only - - - SWDTPERI - desc SWDTPERI - 3 - 2 - read-only - - - SWDTCKS - desc SWDTCKS - 7 - 4 - read-only - - - SWDTWDPT - desc SWDTWDPT - 11 - 8 - read-only - - - SWDTSLPOFF - desc SWDTSLPOFF - 12 - 12 - read-only - - - WDTAUTS - desc WDTAUTS - 16 - 16 - read-only - - - WDTITS - desc WDTITS - 17 - 17 - read-only - - - WDTPERI - desc WDTPERI - 19 - 18 - read-only - - - WDTCKS - desc WDTCKS - 23 - 20 - read-only - - - WDTWDPT - desc WDTWDPT - 27 - 24 - read-only - - - WDTSLPOFF - desc WDTSLPOFF - 28 - 28 - read-only - - - - - ICG1 - desc ICG1 - 0x4 - 32 - read-only - 0xFFFFFFFF - 0xFC070101 - - - HRCFREQSEL - desc HRCFREQSEL - 0 - 0 - read-only - - - HRCSTOP - desc HRCSTOP - 8 - 8 - read-only - - - BOR_LEV - desc BOR_LEV - 17 - 16 - read-only - - - BORDIS - desc BORDIS - 18 - 18 - read-only - - - SMPCLK - desc SMPCLK - 27 - 26 - read-only - - - NMITRG - desc NMITRG - 28 - 28 - read-only - - - NMIEN - desc NMIEN - 29 - 29 - read-only - - - NFEN - desc NFEN - 30 - 30 - read-only - - - NMIICGEN - desc NMIICGEN - 31 - 31 - read-only - - - - - ICG2 - desc ICG2 - 0x8 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG3 - desc ICG3 - 0xC - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG4 - desc ICG4 - 0x10 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG5 - desc ICG5 - 0x14 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG6 - desc ICG6 - 0x18 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - ICG7 - desc ICG7 - 0x1C - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - - - INTC - desc INTC - 0x40051000 - - 0x0 - 0x2A8 - - - - NMICR - desc NMICR - 0x0 - 32 - read-write - 0x0 - 0xB1 - - - NMITRG - desc NMITRG - 0 - 0 - read-write - - - NSMPCLK - desc NSMPCLK - 5 - 4 - read-write - - - NFEN - desc NFEN - 7 - 7 - read-write - - - - - NMIENR - desc NMIENR - 0x4 - 32 - read-write - 0x0 - 0xF2F - - - NMIENR - desc NMIENR - 0 - 0 - read-write - - - SWDTENR - desc SWDTENR - 1 - 1 - read-write - - - PVD1ENR - desc PVD1ENR - 2 - 2 - read-write - - - PVD2ENR - desc PVD2ENR - 3 - 3 - read-write - - - XTALSTPENR - desc XTALSTPENR - 5 - 5 - read-write - - - REPENR - desc REPENR - 8 - 8 - read-write - - - RECCENR - desc RECCENR - 9 - 9 - read-write - - - BUSMENR - desc BUSMENR - 10 - 10 - read-write - - - WDTENR - desc WDTENR - 11 - 11 - read-write - - - - - NMIFR - desc NMIFR - 0x8 - 32 - read-write - 0x0 - 0xF2F - - - NMIFR - desc NMIFR - 0 - 0 - read-write - - - SWDTFR - desc SWDTFR - 1 - 1 - read-write - - - PVD1FR - desc PVD1FR - 2 - 2 - read-write - - - PVD2FR - desc PVD2FR - 3 - 3 - read-write - - - XTALSTPFR - desc XTALSTPFR - 5 - 5 - read-write - - - REPFR - desc REPFR - 8 - 8 - read-write - - - RECCFR - desc RECCFR - 9 - 9 - read-write - - - BUSMFR - desc BUSMFR - 10 - 10 - read-write - - - WDTFR - desc WDTFR - 11 - 11 - read-write - - - - - NMICFR - desc NMICFR - 0xC - 32 - read-write - 0x0 - 0xF2F - - - NMICFR - desc NMICFR - 0 - 0 - read-write - - - SWDTCFR - desc SWDTCFR - 1 - 1 - read-write - - - PVD1CFR - desc PVD1CFR - 2 - 2 - read-write - - - PVD2CFR - desc PVD2CFR - 3 - 3 - read-write - - - XTALSTPCFR - desc XTALSTPCFR - 5 - 5 - read-write - - - REPCFR - desc REPCFR - 8 - 8 - read-write - - - RECCCFR - desc RECCCFR - 9 - 9 - read-write - - - BUSMCFR - desc BUSMCFR - 10 - 10 - read-write - - - WDTCFR - desc WDTCFR - 11 - 11 - read-write - - - - - EIRQCR0 - desc EIRQCR0 - 0x10 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR1 - desc EIRQCR1 - 0x14 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR2 - desc EIRQCR2 - 0x18 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR3 - desc EIRQCR3 - 0x1C - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR4 - desc EIRQCR4 - 0x20 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR5 - desc EIRQCR5 - 0x24 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR6 - desc EIRQCR6 - 0x28 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR7 - desc EIRQCR7 - 0x2C - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR8 - desc EIRQCR8 - 0x30 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR9 - desc EIRQCR9 - 0x34 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR10 - desc EIRQCR10 - 0x38 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR11 - desc EIRQCR11 - 0x3C - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR12 - desc EIRQCR12 - 0x40 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR13 - desc EIRQCR13 - 0x44 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR14 - desc EIRQCR14 - 0x48 - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - EIRQCR15 - desc EIRQCR15 - 0x4C - 32 - read-write - 0x0 - 0xB3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - - - WUPEN - desc WUPEN - 0x50 - 32 - read-write - 0x0 - 0x2FFFFFF - - - EIRQWUEN - desc EIRQWUEN - 15 - 0 - read-write - - - SWDTWUEN - desc SWDTWUEN - 16 - 16 - read-write - - - PVD1WUEN - desc PVD1WUEN - 17 - 17 - read-write - - - PVD2WUEN - desc PVD2WUEN - 18 - 18 - read-write - - - CMPI0WUEN - desc CMPI0WUEN - 19 - 19 - read-write - - - WKTMWUEN - desc WKTMWUEN - 20 - 20 - read-write - - - RTCALMWUEN - desc RTCALMWUEN - 21 - 21 - read-write - - - RTCPRDWUEN - desc RTCPRDWUEN - 22 - 22 - read-write - - - TMR0WUEN - desc TMR0WUEN - 23 - 23 - read-write - - - RXWUEN - desc RXWUEN - 25 - 25 - read-write - - - - - EIRQFR - desc EIRQFR - 0x54 - 32 - read-write - 0x0 - 0xFFFF - - - EIRQFR0 - desc EIRQFR0 - 0 - 0 - read-write - - - EIRQFR1 - desc EIRQFR1 - 1 - 1 - read-write - - - EIRQFR2 - desc EIRQFR2 - 2 - 2 - read-write - - - EIRQFR3 - desc EIRQFR3 - 3 - 3 - read-write - - - EIRQFR4 - desc EIRQFR4 - 4 - 4 - read-write - - - EIRQFR5 - desc EIRQFR5 - 5 - 5 - read-write - - - EIRQFR6 - desc EIRQFR6 - 6 - 6 - read-write - - - EIRQFR7 - desc EIRQFR7 - 7 - 7 - read-write - - - EIRQFR8 - desc EIRQFR8 - 8 - 8 - read-write - - - EIRQFR9 - desc EIRQFR9 - 9 - 9 - read-write - - - EIRQFR10 - desc EIRQFR10 - 10 - 10 - read-write - - - EIRQFR11 - desc EIRQFR11 - 11 - 11 - read-write - - - EIRQFR12 - desc EIRQFR12 - 12 - 12 - read-write - - - EIRQFR13 - desc EIRQFR13 - 13 - 13 - read-write - - - EIRQFR14 - desc EIRQFR14 - 14 - 14 - read-write - - - EIRQFR15 - desc EIRQFR15 - 15 - 15 - read-write - - - - - EIRQCFR - desc EIRQCFR - 0x58 - 32 - read-write - 0x0 - 0xFFFF - - - EIRQCFR0 - desc EIRQCFR0 - 0 - 0 - read-write - - - EIRQCFR1 - desc EIRQCFR1 - 1 - 1 - read-write - - - EIRQCFR2 - desc EIRQCFR2 - 2 - 2 - read-write - - - EIRQCFR3 - desc EIRQCFR3 - 3 - 3 - read-write - - - EIRQCFR4 - desc EIRQCFR4 - 4 - 4 - read-write - - - EIRQCFR5 - desc EIRQCFR5 - 5 - 5 - read-write - - - EIRQCFR6 - desc EIRQCFR6 - 6 - 6 - read-write - - - EIRQCFR7 - desc EIRQCFR7 - 7 - 7 - read-write - - - EIRQCFR8 - desc EIRQCFR8 - 8 - 8 - read-write - - - EIRQCFR9 - desc EIRQCFR9 - 9 - 9 - read-write - - - EIRQCFR10 - desc EIRQCFR10 - 10 - 10 - read-write - - - EIRQCFR11 - desc EIRQCFR11 - 11 - 11 - read-write - - - EIRQCFR12 - desc EIRQCFR12 - 12 - 12 - read-write - - - EIRQCFR13 - desc EIRQCFR13 - 13 - 13 - read-write - - - EIRQCFR14 - desc EIRQCFR14 - 14 - 14 - read-write - - - EIRQCFR15 - desc EIRQCFR15 - 15 - 15 - read-write - - - - - SEL0 - desc SEL0 - 0x5C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL1 - desc SEL1 - 0x60 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL2 - desc SEL2 - 0x64 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL3 - desc SEL3 - 0x68 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL4 - desc SEL4 - 0x6C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL5 - desc SEL5 - 0x70 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL6 - desc SEL6 - 0x74 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL7 - desc SEL7 - 0x78 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL8 - desc SEL8 - 0x7C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL9 - desc SEL9 - 0x80 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL10 - desc SEL10 - 0x84 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL11 - desc SEL11 - 0x88 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL12 - desc SEL12 - 0x8C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL13 - desc SEL13 - 0x90 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL14 - desc SEL14 - 0x94 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL15 - desc SEL15 - 0x98 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL16 - desc SEL16 - 0x9C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL17 - desc SEL17 - 0xA0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL18 - desc SEL18 - 0xA4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL19 - desc SEL19 - 0xA8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL20 - desc SEL20 - 0xAC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL21 - desc SEL21 - 0xB0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL22 - desc SEL22 - 0xB4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL23 - desc SEL23 - 0xB8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL24 - desc SEL24 - 0xBC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL25 - desc SEL25 - 0xC0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL26 - desc SEL26 - 0xC4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL27 - desc SEL27 - 0xC8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL28 - desc SEL28 - 0xCC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL29 - desc SEL29 - 0xD0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL30 - desc SEL30 - 0xD4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL31 - desc SEL31 - 0xD8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL32 - desc SEL32 - 0xDC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL33 - desc SEL33 - 0xE0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL34 - desc SEL34 - 0xE4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL35 - desc SEL35 - 0xE8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL36 - desc SEL36 - 0xEC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL37 - desc SEL37 - 0xF0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL38 - desc SEL38 - 0xF4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL39 - desc SEL39 - 0xF8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL40 - desc SEL40 - 0xFC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL41 - desc SEL41 - 0x100 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL42 - desc SEL42 - 0x104 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL43 - desc SEL43 - 0x108 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL44 - desc SEL44 - 0x10C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL45 - desc SEL45 - 0x110 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL46 - desc SEL46 - 0x114 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL47 - desc SEL47 - 0x118 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL48 - desc SEL48 - 0x11C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL49 - desc SEL49 - 0x120 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL50 - desc SEL50 - 0x124 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL51 - desc SEL51 - 0x128 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL52 - desc SEL52 - 0x12C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL53 - desc SEL53 - 0x130 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL54 - desc SEL54 - 0x134 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL55 - desc SEL55 - 0x138 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL56 - desc SEL56 - 0x13C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL57 - desc SEL57 - 0x140 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL58 - desc SEL58 - 0x144 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL59 - desc SEL59 - 0x148 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL60 - desc SEL60 - 0x14C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL61 - desc SEL61 - 0x150 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL62 - desc SEL62 - 0x154 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL63 - desc SEL63 - 0x158 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL64 - desc SEL64 - 0x15C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL65 - desc SEL65 - 0x160 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL66 - desc SEL66 - 0x164 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL67 - desc SEL67 - 0x168 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL68 - desc SEL68 - 0x16C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL69 - desc SEL69 - 0x170 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL70 - desc SEL70 - 0x174 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL71 - desc SEL71 - 0x178 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL72 - desc SEL72 - 0x17C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL73 - desc SEL73 - 0x180 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL74 - desc SEL74 - 0x184 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL75 - desc SEL75 - 0x188 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL76 - desc SEL76 - 0x18C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL77 - desc SEL77 - 0x190 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL78 - desc SEL78 - 0x194 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL79 - desc SEL79 - 0x198 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL80 - desc SEL80 - 0x19C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL81 - desc SEL81 - 0x1A0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL82 - desc SEL82 - 0x1A4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL83 - desc SEL83 - 0x1A8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL84 - desc SEL84 - 0x1AC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL85 - desc SEL85 - 0x1B0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL86 - desc SEL86 - 0x1B4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL87 - desc SEL87 - 0x1B8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL88 - desc SEL88 - 0x1BC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL89 - desc SEL89 - 0x1C0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL90 - desc SEL90 - 0x1C4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL91 - desc SEL91 - 0x1C8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL92 - desc SEL92 - 0x1CC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL93 - desc SEL93 - 0x1D0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL94 - desc SEL94 - 0x1D4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL95 - desc SEL95 - 0x1D8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL96 - desc SEL96 - 0x1DC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL97 - desc SEL97 - 0x1E0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL98 - desc SEL98 - 0x1E4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL99 - desc SEL99 - 0x1E8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL100 - desc SEL100 - 0x1EC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL101 - desc SEL101 - 0x1F0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL102 - desc SEL102 - 0x1F4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL103 - desc SEL103 - 0x1F8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL104 - desc SEL104 - 0x1FC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL105 - desc SEL105 - 0x200 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL106 - desc SEL106 - 0x204 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL107 - desc SEL107 - 0x208 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL108 - desc SEL108 - 0x20C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL109 - desc SEL109 - 0x210 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL110 - desc SEL110 - 0x214 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL111 - desc SEL111 - 0x218 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL112 - desc SEL112 - 0x21C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL113 - desc SEL113 - 0x220 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL114 - desc SEL114 - 0x224 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL115 - desc SEL115 - 0x228 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL116 - desc SEL116 - 0x22C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL117 - desc SEL117 - 0x230 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL118 - desc SEL118 - 0x234 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL119 - desc SEL119 - 0x238 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL120 - desc SEL120 - 0x23C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL121 - desc SEL121 - 0x240 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL122 - desc SEL122 - 0x244 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL123 - desc SEL123 - 0x248 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL124 - desc SEL124 - 0x24C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL125 - desc SEL125 - 0x250 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL126 - desc SEL126 - 0x254 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL127 - desc SEL127 - 0x258 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - VSSEL128 - desc VSSEL128 - 0x25C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL129 - desc VSSEL129 - 0x260 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL130 - desc VSSEL130 - 0x264 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL131 - desc VSSEL131 - 0x268 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL132 - desc VSSEL132 - 0x26C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL133 - desc VSSEL133 - 0x270 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL134 - desc VSSEL134 - 0x274 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL135 - desc VSSEL135 - 0x278 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL136 - desc VSSEL136 - 0x27C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL137 - desc VSSEL137 - 0x280 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL138 - desc VSSEL138 - 0x284 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL139 - desc VSSEL139 - 0x288 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL140 - desc VSSEL140 - 0x28C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL141 - desc VSSEL141 - 0x290 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL142 - desc VSSEL142 - 0x294 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL143 - desc VSSEL143 - 0x298 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - SWIER - desc SWIER - 0x29C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SWIE0 - desc SWIE0 - 0 - 0 - read-write - - - SWIE1 - desc SWIE1 - 1 - 1 - read-write - - - SWIE2 - desc SWIE2 - 2 - 2 - read-write - - - SWIE3 - desc SWIE3 - 3 - 3 - read-write - - - SWIE4 - desc SWIE4 - 4 - 4 - read-write - - - SWIE5 - desc SWIE5 - 5 - 5 - read-write - - - SWIE6 - desc SWIE6 - 6 - 6 - read-write - - - SWIE7 - desc SWIE7 - 7 - 7 - read-write - - - SWIE8 - desc SWIE8 - 8 - 8 - read-write - - - SWIE9 - desc SWIE9 - 9 - 9 - read-write - - - SWIE10 - desc SWIE10 - 10 - 10 - read-write - - - SWIE11 - desc SWIE11 - 11 - 11 - read-write - - - SWIE12 - desc SWIE12 - 12 - 12 - read-write - - - SWIE13 - desc SWIE13 - 13 - 13 - read-write - - - SWIE14 - desc SWIE14 - 14 - 14 - read-write - - - SWIE15 - desc SWIE15 - 15 - 15 - read-write - - - SWIE16 - desc SWIE16 - 16 - 16 - read-write - - - SWIE17 - desc SWIE17 - 17 - 17 - read-write - - - SWIE18 - desc SWIE18 - 18 - 18 - read-write - - - SWIE19 - desc SWIE19 - 19 - 19 - read-write - - - SWIE20 - desc SWIE20 - 20 - 20 - read-write - - - SWIE21 - desc SWIE21 - 21 - 21 - read-write - - - SWIE22 - desc SWIE22 - 22 - 22 - read-write - - - SWIE23 - desc SWIE23 - 23 - 23 - read-write - - - SWIE24 - desc SWIE24 - 24 - 24 - read-write - - - SWIE25 - desc SWIE25 - 25 - 25 - read-write - - - SWIE26 - desc SWIE26 - 26 - 26 - read-write - - - SWIE27 - desc SWIE27 - 27 - 27 - read-write - - - SWIE28 - desc SWIE28 - 28 - 28 - read-write - - - SWIE29 - desc SWIE29 - 29 - 29 - read-write - - - SWIE30 - desc SWIE30 - 30 - 30 - read-write - - - SWIE31 - desc SWIE31 - 31 - 31 - read-write - - - - - EVTER - desc EVTER - 0x2A0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - EVTE0 - desc EVTE0 - 0 - 0 - read-write - - - EVTE1 - desc EVTE1 - 1 - 1 - read-write - - - EVTE2 - desc EVTE2 - 2 - 2 - read-write - - - EVTE3 - desc EVTE3 - 3 - 3 - read-write - - - EVTE4 - desc EVTE4 - 4 - 4 - read-write - - - EVTE5 - desc EVTE5 - 5 - 5 - read-write - - - EVTE6 - desc EVTE6 - 6 - 6 - read-write - - - EVTE7 - desc EVTE7 - 7 - 7 - read-write - - - EVTE8 - desc EVTE8 - 8 - 8 - read-write - - - EVTE9 - desc EVTE9 - 9 - 9 - read-write - - - EVTE10 - desc EVTE10 - 10 - 10 - read-write - - - EVTE11 - desc EVTE11 - 11 - 11 - read-write - - - EVTE12 - desc EVTE12 - 12 - 12 - read-write - - - EVTE13 - desc EVTE13 - 13 - 13 - read-write - - - EVTE14 - desc EVTE14 - 14 - 14 - read-write - - - EVTE15 - desc EVTE15 - 15 - 15 - read-write - - - EVTE16 - desc EVTE16 - 16 - 16 - read-write - - - EVTE17 - desc EVTE17 - 17 - 17 - read-write - - - EVTE18 - desc EVTE18 - 18 - 18 - read-write - - - EVTE19 - desc EVTE19 - 19 - 19 - read-write - - - EVTE20 - desc EVTE20 - 20 - 20 - read-write - - - EVTE21 - desc EVTE21 - 21 - 21 - read-write - - - EVTE22 - desc EVTE22 - 22 - 22 - read-write - - - EVTE23 - desc EVTE23 - 23 - 23 - read-write - - - EVTE24 - desc EVTE24 - 24 - 24 - read-write - - - EVTE25 - desc EVTE25 - 25 - 25 - read-write - - - EVTE26 - desc EVTE26 - 26 - 26 - read-write - - - EVTE27 - desc EVTE27 - 27 - 27 - read-write - - - EVTE28 - desc EVTE28 - 28 - 28 - read-write - - - EVTE29 - desc EVTE29 - 29 - 29 - read-write - - - EVTE30 - desc EVTE30 - 30 - 30 - read-write - - - EVTE31 - desc EVTE31 - 31 - 31 - read-write - - - - - IER - desc IER - 0x2A4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - IER0 - desc IER0 - 0 - 0 - read-write - - - IER1 - desc IER1 - 1 - 1 - read-write - - - IER2 - desc IER2 - 2 - 2 - read-write - - - IER3 - desc IER3 - 3 - 3 - read-write - - - IER4 - desc IER4 - 4 - 4 - read-write - - - IER5 - desc IER5 - 5 - 5 - read-write - - - IER6 - desc IER6 - 6 - 6 - read-write - - - IER7 - desc IER7 - 7 - 7 - read-write - - - IER8 - desc IER8 - 8 - 8 - read-write - - - IER9 - desc IER9 - 9 - 9 - read-write - - - IER10 - desc IER10 - 10 - 10 - read-write - - - IER11 - desc IER11 - 11 - 11 - read-write - - - IER12 - desc IER12 - 12 - 12 - read-write - - - IER13 - desc IER13 - 13 - 13 - read-write - - - IER14 - desc IER14 - 14 - 14 - read-write - - - IER15 - desc IER15 - 15 - 15 - read-write - - - IER16 - desc IER16 - 16 - 16 - read-write - - - IER17 - desc IER17 - 17 - 17 - read-write - - - IER18 - desc IER18 - 18 - 18 - read-write - - - IER19 - desc IER19 - 19 - 19 - read-write - - - IER20 - desc IER20 - 20 - 20 - read-write - - - IER21 - desc IER21 - 21 - 21 - read-write - - - IER22 - desc IER22 - 22 - 22 - read-write - - - IER23 - desc IER23 - 23 - 23 - read-write - - - IER24 - desc IER24 - 24 - 24 - read-write - - - IER25 - desc IER25 - 25 - 25 - read-write - - - IER26 - desc IER26 - 26 - 26 - read-write - - - IER27 - desc IER27 - 27 - 27 - read-write - - - IER28 - desc IER28 - 28 - 28 - read-write - - - IER29 - desc IER29 - 29 - 29 - read-write - - - IER30 - desc IER30 - 30 - 30 - read-write - - - IER31 - desc IER31 - 31 - 31 - read-write - - - - - - - KEYSCAN - desc KEYSCAN - 0x40050C00 - - 0x0 - 0xC - - - - SCR - desc SCR - 0x0 - 32 - read-write - 0x0 - 0xFF37FFFF - - - KEYINSEL - desc KEYINSEL - 15 - 0 - read-write - - - KEYOUTSEL - desc KEYOUTSEL - 18 - 16 - read-write - - - CKSEL - desc CKSEL - 21 - 20 - read-write - - - T_LLEVEL - desc T_LLEVEL - 28 - 24 - read-write - - - T_HIZ - desc T_HIZ - 31 - 29 - read-write - - - - - SER - desc SER - 0x4 - 32 - read-write - 0x0 - 0x1 - - - SEN - desc SEN - 0 - 0 - read-write - - - - - SSR - desc SSR - 0x8 - 32 - read-write - 0x0 - 0x7 - - - INDEX - desc INDEX - 2 - 0 - read-write - - - - - - - MPU - desc MPU - 0x40050000 - - 0x0 - 0x4020 - - - - RGD0 - desc RGD0 - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD1 - desc RGD1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD2 - desc RGD2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD3 - desc RGD3 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD4 - desc RGD4 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD5 - desc RGD5 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD6 - desc RGD6 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD7 - desc RGD7 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD8 - desc RGD8 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD9 - desc RGD9 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD10 - desc RGD10 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD11 - desc RGD11 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD12 - desc RGD12 - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD13 - desc RGD13 - 0x34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD14 - desc RGD14 - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD15 - desc RGD15 - 0x3C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGCR0 - desc RGCR0 - 0x40 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR1 - desc RGCR1 - 0x44 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR2 - desc RGCR2 - 0x48 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR3 - desc RGCR3 - 0x4C - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR4 - desc RGCR4 - 0x50 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR5 - desc RGCR5 - 0x54 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR6 - desc RGCR6 - 0x58 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR7 - desc RGCR7 - 0x5C - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR8 - desc RGCR8 - 0x60 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR9 - desc RGCR9 - 0x64 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR10 - desc RGCR10 - 0x68 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR11 - desc RGCR11 - 0x6C - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR12 - desc RGCR12 - 0x70 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR13 - desc RGCR13 - 0x74 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR14 - desc RGCR14 - 0x78 - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - RGCR15 - desc RGCR15 - 0x7C - 32 - read-write - 0x0 - 0x838383 - - - S2RGRP - desc S2RGRP - 0 - 0 - read-write - - - S2RGWP - desc S2RGWP - 1 - 1 - read-write - - - S2RGE - desc S2RGE - 7 - 7 - read-write - - - S1RGRP - desc S1RGRP - 8 - 8 - read-write - - - S1RGWP - desc S1RGWP - 9 - 9 - read-write - - - S1RGE - desc S1RGE - 15 - 15 - read-write - - - FRGRP - desc FRGRP - 16 - 16 - read-write - - - FRGWP - desc FRGWP - 17 - 17 - read-write - - - FRGE - desc FRGE - 23 - 23 - read-write - - - - - CR - desc CR - 0x80 - 32 - read-write - 0x0 - 0x8F8F8F - - - SMPU2BRP - desc SMPU2BRP - 0 - 0 - read-write - - - SMPU2BWP - desc SMPU2BWP - 1 - 1 - read-write - - - SMPU2ACT - desc SMPU2ACT - 3 - 2 - read-write - - - SMPU2E - desc SMPU2E - 7 - 7 - read-write - - - SMPU1BRP - desc SMPU1BRP - 8 - 8 - read-write - - - SMPU1BWP - desc SMPU1BWP - 9 - 9 - read-write - - - SMPU1ACT - desc SMPU1ACT - 11 - 10 - read-write - - - SMPU1E - desc SMPU1E - 15 - 15 - read-write - - - FMPUBRP - desc FMPUBRP - 16 - 16 - read-write - - - FMPUBWP - desc FMPUBWP - 17 - 17 - read-write - - - FMPUACT - desc FMPUACT - 19 - 18 - read-write - - - FMPUE - desc FMPUE - 23 - 23 - read-write - - - - - SR - desc SR - 0x84 - 32 - read-only - 0x0 - 0x10101 - - - SMPU2EAF - desc SMPU2EAF - 0 - 0 - read-only - - - SMPU1EAF - desc SMPU1EAF - 8 - 8 - read-only - - - FMPUEAF - desc FMPUEAF - 16 - 16 - read-only - - - - - ECLR - desc ECLR - 0x88 - 32 - write-only - 0x0 - 0x10101 - - - SMPU2ECLR - desc SMPU2ECLR - 0 - 0 - write-only - - - SMPU1ECLR - desc SMPU1ECLR - 8 - 8 - write-only - - - FMPUECLR - desc FMPUECLR - 16 - 16 - write-only - - - - - WP - desc WP - 0x8C - 32 - read-write - 0x0 - 0xFFFF - - - MPUWE - desc MPUWE - 0 - 0 - read-write - - - WKEY - desc WKEY - 15 - 1 - write-only - - - - - IPPR - desc IPPR - 0x401C - 32 - read-write - 0x0 - 0xBFFFF3FF - - - AESRDP - desc AESRDP - 0 - 0 - read-write - - - AESWRP - desc AESWRP - 1 - 1 - read-write - - - HASHRDP - desc HASHRDP - 2 - 2 - read-write - - - HASHWRP - desc HASHWRP - 3 - 3 - read-write - - - TRNGRDP - desc TRNGRDP - 4 - 4 - read-write - - - TRNGWRP - desc TRNGWRP - 5 - 5 - read-write - - - CRCRDP - desc CRCRDP - 6 - 6 - read-write - - - CRCWRP - desc CRCWRP - 7 - 7 - read-write - - - EFMRDP - desc EFMRDP - 8 - 8 - read-write - - - EFMWRP - desc EFMWRP - 9 - 9 - read-write - - - WDTRDP - desc WDTRDP - 12 - 12 - read-write - - - WDTWRP - desc WDTWRP - 13 - 13 - read-write - - - SWDTRDP - desc SWDTRDP - 14 - 14 - read-write - - - SWDTWRP - desc SWDTWRP - 15 - 15 - read-write - - - BKSRAMRDP - desc BKSRAMRDP - 16 - 16 - read-write - - - BKSRAMWRP - desc BKSRAMWRP - 17 - 17 - read-write - - - RTCRDP - desc RTCRDP - 18 - 18 - read-write - - - RTCWRP - desc RTCWRP - 19 - 19 - read-write - - - DMPURDP - desc DMPURDP - 20 - 20 - read-write - - - DMPUWRP - desc DMPUWRP - 21 - 21 - read-write - - - SRAMCRDP - desc SRAMCRDP - 22 - 22 - read-write - - - SRAMCWRP - desc SRAMCWRP - 23 - 23 - read-write - - - INTCRDP - desc INTCRDP - 24 - 24 - read-write - - - INTCWRP - desc INTCWRP - 25 - 25 - read-write - - - SYSCRDP - desc SYSCRDP - 26 - 26 - read-write - - - SYSCWRP - desc SYSCWRP - 27 - 27 - read-write - - - MSTPRDP - desc MSTPRDP - 28 - 28 - read-write - - - MSTPWRP - desc MSTPWRP - 29 - 29 - read-write - - - BUSERRE - desc BUSERRE - 31 - 31 - read-write - - - - - - - OTS - desc OTS - 0x4004A400 - - 0x0 - 0xC - - - - CTL - desc CTL - 0x0 - 16 - read-write - 0x0 - 0xF - - - OTSST - desc OTSST - 0 - 0 - read-write - - - OTSCK - desc OTSCK - 1 - 1 - read-write - - - OTSIE - desc OTSIE - 2 - 2 - read-write - - - TSSTP - desc TSSTP - 3 - 3 - read-write - - - - - DR1 - desc DR1 - 0x2 - 16 - read-write - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x4 - 16 - read-write - 0x0 - 0xFFFF - - - ECR - desc ECR - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - LPR - desc LPR - 0x8 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - TSOFS - desc TSOFS - 7 - 0 - read-only - - - TSSLP - desc TSSLP - 31 - 8 - read-only - - - - - - - PERIC - desc PERIC - 0x40055400 - - 0x0 - 0x8 - - - - USBFS_SYCTLREG - desc USBFS_SYCTLREG - 0x0 - 32 - read-write - 0x0 - 0x3 - - - DFB - desc DFB - 0 - 0 - read-write - - - SOFEN - desc SOFEN - 1 - 1 - read-write - - - - - SDIOC_SYCTLREG - desc SDIOC_SYCTLREG - 0x4 - 32 - read-write - 0x0 - 0xA - - - SELMMC1 - desc SELMMC1 - 1 - 1 - read-write - - - SELMMC2 - desc SELMMC2 - 3 - 3 - read-write - - - - - - - PWC - desc PWC - 0x40048000 - - 0x0 - 0xC42C - - - - FCG0 - desc FCG0 - 0x0 - 32 - read-write - 0xFFFFFAEE - 0x8FF3C511 - - - SRAMH - desc SRAMH - 0 - 0 - read-write - - - SRAM12 - desc SRAM12 - 4 - 4 - read-write - - - SRAM3 - desc SRAM3 - 8 - 8 - read-write - - - SRAMRET - desc SRAMRET - 10 - 10 - read-write - - - DMA1 - desc DMA1 - 14 - 14 - read-write - - - DMA2 - desc DMA2 - 15 - 15 - read-write - - - FCM - desc FCM - 16 - 16 - read-write - - - AOS - desc AOS - 17 - 17 - read-write - - - AES - desc AES - 20 - 20 - read-write - - - HASH - desc HASH - 21 - 21 - read-write - - - TRNG - desc TRNG - 22 - 22 - read-write - - - CRC - desc CRC - 23 - 23 - read-write - - - DCU1 - desc DCU1 - 24 - 24 - read-write - - - DCU2 - desc DCU2 - 25 - 25 - read-write - - - DCU3 - desc DCU3 - 26 - 26 - read-write - - - DCU4 - desc DCU4 - 27 - 27 - read-write - - - KEY - desc KEY - 31 - 31 - read-write - - - - - FCG1 - desc FCG1 - 0x4 - 32 - read-write - 0xFFFFFFFF - 0xF0FFD79 - - - CAN - desc CAN - 0 - 0 - read-write - - - QSPI - desc QSPI - 3 - 3 - read-write - - - I2C1 - desc I2C1 - 4 - 4 - read-write - - - I2C2 - desc I2C2 - 5 - 5 - read-write - - - I2C3 - desc I2C3 - 6 - 6 - read-write - - - USBFS - desc USBFS - 8 - 8 - read-write - - - SDIOC1 - desc SDIOC1 - 10 - 10 - read-write - - - SDIOC2 - desc SDIOC2 - 11 - 11 - read-write - - - I2S1 - desc I2S1 - 12 - 12 - read-write - - - I2S2 - desc I2S2 - 13 - 13 - read-write - - - I2S3 - desc I2S3 - 14 - 14 - read-write - - - I2S4 - desc I2S4 - 15 - 15 - read-write - - - SPI1 - desc SPI1 - 16 - 16 - read-write - - - SPI2 - desc SPI2 - 17 - 17 - read-write - - - SPI3 - desc SPI3 - 18 - 18 - read-write - - - SPI4 - desc SPI4 - 19 - 19 - read-write - - - USART1 - desc USART1 - 24 - 24 - read-write - - - USART2 - desc USART2 - 25 - 25 - read-write - - - USART3 - desc USART3 - 26 - 26 - read-write - - - USART4 - desc USART4 - 27 - 27 - read-write - - - - - FCG2 - desc FCG2 - 0x8 - 32 - read-write - 0xFFFFFFFF - 0x787FF - - - TIMER0_1 - desc TIMER0_1 - 0 - 0 - read-write - - - TIMER0_2 - desc TIMER0_2 - 1 - 1 - read-write - - - TIMERA_1 - desc TIMERA_1 - 2 - 2 - read-write - - - TIMERA_2 - desc TIMERA_2 - 3 - 3 - read-write - - - TIMERA_3 - desc TIMERA_3 - 4 - 4 - read-write - - - TIMERA_4 - desc TIMERA_4 - 5 - 5 - read-write - - - TIMERA_5 - desc TIMERA_5 - 6 - 6 - read-write - - - TIMERA_6 - desc TIMERA_6 - 7 - 7 - read-write - - - TIMER4_1 - desc TIMER4_1 - 8 - 8 - read-write - - - TIMER4_2 - desc TIMER4_2 - 9 - 9 - read-write - - - TIMER4_3 - desc TIMER4_3 - 10 - 10 - read-write - - - EMB - desc EMB - 15 - 15 - read-write - - - TIMER6_1 - desc TIMER6_1 - 16 - 16 - read-write - - - TIMER6_2 - desc TIMER6_2 - 17 - 17 - read-write - - - TIMER6_3 - desc TIMER6_3 - 18 - 18 - read-write - - - - - FCG3 - desc FCG3 - 0xC - 32 - read-write - 0xFFFFFFFF - 0x1103 - - - ADC1 - desc ADC1 - 0 - 0 - read-write - - - ADC2 - desc ADC2 - 1 - 1 - read-write - - - CMP - desc CMP - 8 - 8 - read-write - - - OTS - desc OTS - 12 - 12 - read-write - - - - - FCG0PC - desc FCG0PC - 0x10 - 32 - read-write - 0x0 - 0xFFFF0001 - - - PRT0 - desc PRT0 - 0 - 0 - read-write - - - FCG0PCWE - desc FCG0PCWE - 31 - 16 - write-only - - - - - WKTCR - desc WKTCR - 0x4400 - 16 - read-write - 0x0 - 0xFFFF - - - WKTMCMP - desc WKTMCMP - 11 - 0 - read-write - - - WKOVF - desc WKOVF - 12 - 12 - read-write - - - WKCKS - desc WKCKS - 14 - 13 - read-write - - - WKTCE - desc WKTCE - 15 - 15 - read-write - - - - - STPMCR - desc STPMCR - 0xC00C - 16 - read-write - 0x4000 - 0x8003 - - - FLNWT - desc FLNWT - 0 - 0 - read-write - - - CKSMRC - desc CKSMRC - 1 - 1 - read-write - - - STOP - desc STOP - 15 - 15 - read-write - - - - - RAMPC0 - desc RAMPC0 - 0xC014 - 32 - read-write - 0x0 - 0x1FF - - - RAMPDC0 - desc RAMPDC0 - 0 - 0 - read-write - - - RAMPDC1 - desc RAMPDC1 - 1 - 1 - read-write - - - RAMPDC2 - desc RAMPDC2 - 2 - 2 - read-write - - - RAMPDC3 - desc RAMPDC3 - 3 - 3 - read-write - - - RAMPDC4 - desc RAMPDC4 - 4 - 4 - read-write - - - RAMPDC5 - desc RAMPDC5 - 5 - 5 - read-write - - - RAMPDC6 - desc RAMPDC6 - 6 - 6 - read-write - - - RAMPDC7 - desc RAMPDC7 - 7 - 7 - read-write - - - RAMPDC8 - desc RAMPDC8 - 8 - 8 - read-write - - - - - RAMOPM - desc RAMOPM - 0xC018 - 16 - read-write - 0x8043 - 0xFFFF - - - PVDICR - desc PVDICR - 0xC0E0 - 8 - read-write - 0x0 - 0x11 - - - PVD1NMIS - desc PVD1NMIS - 0 - 0 - read-write - - - PVD2NMIS - desc PVD2NMIS - 4 - 4 - read-write - - - - - PVDDSR - desc PVDDSR - 0xC0E1 - 8 - read-write - 0x11 - 0x33 - - - PVD1MON - desc PVD1MON - 0 - 0 - read-write - - - PVD1DETFLG - desc PVD1DETFLG - 1 - 1 - read-write - - - PVD2MON - desc PVD2MON - 4 - 4 - read-write - - - PVD2DETFLG - desc PVD2DETFLG - 5 - 5 - read-write - - - - - FPRC - desc FPRC - 0xC3FE - 16 - read-write - 0x0 - 0xFF0F - - - FPRCB0 - desc FPRCB0 - 0 - 0 - read-write - - - FPRCB1 - desc FPRCB1 - 1 - 1 - read-write - - - FPRCB2 - desc FPRCB2 - 2 - 2 - read-write - - - FPRCB3 - desc FPRCB3 - 3 - 3 - read-write - - - FPRCWE - desc FPRCWE - 15 - 8 - read-write - - - - - PWRC0 - desc PWRC0 - 0xC400 - 8 - read-write - 0x0 - 0xBF - - - PDMDS - desc PDMDS - 1 - 0 - read-write - - - VVDRSD - desc VVDRSD - 2 - 2 - read-write - - - RETRAMSD - desc RETRAMSD - 3 - 3 - read-write - - - IORTN - desc IORTN - 5 - 4 - read-write - - - PWDN - desc PWDN - 7 - 7 - read-write - - - - - PWRC1 - desc PWRC1 - 0xC401 - 8 - read-write - 0x0 - 0xC3 - - - VPLLSD - desc VPLLSD - 0 - 0 - read-write - - - VHRCSD - desc VHRCSD - 1 - 1 - read-write - - - STPDAS - desc STPDAS - 7 - 6 - read-write - - - - - PWRC2 - desc PWRC2 - 0xC402 - 8 - read-write - 0xFF - 0x3F - - - DDAS - desc DDAS - 3 - 0 - read-write - - - DVS - desc DVS - 5 - 4 - read-write - - - - - PWRC3 - desc PWRC3 - 0xC403 - 8 - read-write - 0x7 - 0x4 - - - PDTS - desc PDTS - 2 - 2 - read-write - - - - - PDWKE0 - desc PDWKE0 - 0xC404 - 8 - read-write - 0x0 - 0xFF - - - WKE00 - desc WKE00 - 0 - 0 - read-write - - - WKE01 - desc WKE01 - 1 - 1 - read-write - - - WKE02 - desc WKE02 - 2 - 2 - read-write - - - WKE03 - desc WKE03 - 3 - 3 - read-write - - - WKE10 - desc WKE10 - 4 - 4 - read-write - - - WKE11 - desc WKE11 - 5 - 5 - read-write - - - WKE12 - desc WKE12 - 6 - 6 - read-write - - - WKE13 - desc WKE13 - 7 - 7 - read-write - - - - - PDWKE1 - desc PDWKE1 - 0xC405 - 8 - read-write - 0x0 - 0xFF - - - WKE20 - desc WKE20 - 0 - 0 - read-write - - - WKE21 - desc WKE21 - 1 - 1 - read-write - - - WKE22 - desc WKE22 - 2 - 2 - read-write - - - WKE23 - desc WKE23 - 3 - 3 - read-write - - - WKE30 - desc WKE30 - 4 - 4 - read-write - - - WKE31 - desc WKE31 - 5 - 5 - read-write - - - WKE32 - desc WKE32 - 6 - 6 - read-write - - - WKE33 - desc WKE33 - 7 - 7 - read-write - - - - - PDWKE2 - desc PDWKE2 - 0xC406 - 8 - read-write - 0x0 - 0xB7 - - - VD1WKE - desc VD1WKE - 0 - 0 - read-write - - - VD2WKE - desc VD2WKE - 1 - 1 - read-write - - - NMIWKE - desc NMIWKE - 2 - 2 - read-write - - - RTCPRDWKE - desc RTCPRDWKE - 4 - 4 - read-write - - - RTCALMWKE - desc RTCALMWKE - 5 - 5 - read-write - - - WKTMWKE - desc WKTMWKE - 7 - 7 - read-write - - - - - PDWKES - desc PDWKES - 0xC407 - 8 - read-write - 0x0 - 0x7F - - - WK0EGS - desc WK0EGS - 0 - 0 - read-write - - - WK1EGS - desc WK1EGS - 1 - 1 - read-write - - - WK2EGS - desc WK2EGS - 2 - 2 - read-write - - - WK3EGS - desc WK3EGS - 3 - 3 - read-write - - - VD1EGS - desc VD1EGS - 4 - 4 - read-write - - - VD2EGS - desc VD2EGS - 5 - 5 - read-write - - - NMIEGS - desc NMIEGS - 6 - 6 - read-write - - - - - PDWKF0 - desc PDWKF0 - 0xC408 - 8 - read-write - 0x0 - 0x7F - - - PTWK0F - desc PTWK0F - 0 - 0 - read-write - - - PTWK1F - desc PTWK1F - 1 - 1 - read-write - - - PTWK2F - desc PTWK2F - 2 - 2 - read-write - - - PTWK3F - desc PTWK3F - 3 - 3 - read-write - - - VD1WKF - desc VD1WKF - 4 - 4 - read-write - - - VD2WKF - desc VD2WKF - 5 - 5 - read-write - - - NMIWKF - desc NMIWKF - 6 - 6 - read-write - - - - - PDWKF1 - desc PDWKF1 - 0xC409 - 8 - read-write - 0x0 - 0xB8 - - - RTCPRDWKF - desc RTCPRDWKF - 4 - 4 - read-write - - - RTCALMWKF - desc RTCALMWKF - 5 - 5 - read-write - - - WKTMWKF - desc WKTMWKF - 7 - 7 - read-write - - - - - PWCMR - desc PWCMR - 0xC40A - 8 - read-write - 0x0 - 0x80 - - - ADBUFE - desc ADBUFE - 7 - 7 - read-write - - - - - MDSWCR - desc MDSWCR - 0xC40F - 8 - read-write - 0x0 - 0xFF - - - PVDCR0 - desc PVDCR0 - 0xC412 - 8 - read-write - 0x0 - 0x61 - - - EXVCCINEN - desc EXVCCINEN - 0 - 0 - read-write - - - PVD1EN - desc PVD1EN - 5 - 5 - read-write - - - PVD2EN - desc PVD2EN - 6 - 6 - read-write - - - - - PVDCR1 - desc PVDCR1 - 0xC413 - 8 - read-write - 0x0 - 0x77 - - - PVD1IRE - desc PVD1IRE - 0 - 0 - read-write - - - PVD1IRS - desc PVD1IRS - 1 - 1 - read-write - - - PVD1CMPOE - desc PVD1CMPOE - 2 - 2 - read-write - - - PVD2IRE - desc PVD2IRE - 4 - 4 - read-write - - - PVD2IRS - desc PVD2IRS - 5 - 5 - read-write - - - PVD2CMPOE - desc PVD2CMPOE - 6 - 6 - read-write - - - - - PVDFCR - desc PVDFCR - 0xC414 - 8 - read-write - 0x11 - 0x77 - - - PVD1NFDIS - desc PVD1NFDIS - 0 - 0 - read-write - - - PVD1NFCKS - desc PVD1NFCKS - 2 - 1 - read-write - - - PVD2NFDIS - desc PVD2NFDIS - 4 - 4 - read-write - - - PVD2NFCKS - desc PVD2NFCKS - 6 - 5 - read-write - - - - - PVDLCR - desc PVDLCR - 0xC415 - 8 - read-write - 0x0 - 0x77 - - - PVD1LVL - desc PVD1LVL - 2 - 0 - read-write - - - PVD2LVL - desc PVD2LVL - 6 - 4 - read-write - - - - - XTAL32CS - desc XTAL32CS - 0xC42B - 8 - read-write - 0x2 - 0x80 - - - CSDIS - desc CSDIS - 7 - 7 - read-write - - - - - - - QSPI - desc QSPI - 0x9C000000 - - 0x0 - 0x808 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x3F0000 - 0x3F3FFF - - - MDSEL - desc MDSEL - 2 - 0 - read-write - - - PFE - desc PFE - 3 - 3 - read-write - - - PFSAE - desc PFSAE - 4 - 4 - read-write - - - DCOME - desc DCOME - 5 - 5 - read-write - - - XIPE - desc XIPE - 6 - 6 - read-write - - - SPIMD3 - desc SPIMD3 - 7 - 7 - read-write - - - IPRSL - desc IPRSL - 9 - 8 - read-write - - - APRSL - desc APRSL - 11 - 10 - read-write - - - DPRSL - desc DPRSL - 13 - 12 - read-write - - - DIV - desc DIV - 21 - 16 - read-write - - - - - CSCR - desc CSCR - 0x4 - 32 - read-write - 0xF - 0x3F - - - SSHW - desc SSHW - 3 - 0 - read-write - - - SSNW - desc SSNW - 5 - 4 - read-write - - - - - FCR - desc FCR - 0x8 - 32 - read-write - 0x80B3 - 0x8F77 - - - AWSL - desc AWSL - 1 - 0 - read-write - - - FOUR_BIC - desc FOUR_BIC - 2 - 2 - read-write - - - SSNHD - desc SSNHD - 4 - 4 - read-write - - - SSNLD - desc SSNLD - 5 - 5 - read-write - - - WPOL - desc WPOL - 6 - 6 - read-write - - - DMCYCN - desc DMCYCN - 11 - 8 - read-write - - - DUTY - desc DUTY - 15 - 15 - read-write - - - - - SR - desc SR - 0xC - 32 - read-write - 0x8000 - 0xDFC1 - - - BUSY - desc BUSY - 0 - 0 - read-write - - - XIPF - desc XIPF - 6 - 6 - read-write - - - RAER - desc RAER - 7 - 7 - read-write - - - PFNUM - desc PFNUM - 12 - 8 - read-write - - - PFFUL - desc PFFUL - 14 - 14 - read-write - - - PFAN - desc PFAN - 15 - 15 - read-write - - - - - DCOM - desc DCOM - 0x10 - 32 - read-write - 0x0 - 0xFF - - - DCOM - desc DCOM - 7 - 0 - read-write - - - - - CCMD - desc CCMD - 0x14 - 32 - read-write - 0x0 - 0xFF - - - RIC - desc RIC - 7 - 0 - read-write - - - - - XCMD - desc XCMD - 0x18 - 32 - read-write - 0xFF - 0xFF - - - XIPMC - desc XIPMC - 7 - 0 - read-write - - - - - SR2 - desc SR2 - 0x24 - 32 - write-only - 0x0 - 0x80 - - - RAERCLR - desc RAERCLR - 7 - 7 - write-only - - - - - EXAR - desc EXAR - 0x804 - 32 - read-write - 0x0 - 0xFC000000 - - - EXADR - desc EXADR - 31 - 26 - read-write - - - - - - - RMU - desc RMU - 0x400540C0 - - 0x0 - 0x2 - - - - RSTF0 - desc RSTF0 - 0x0 - 16 - read-write - 0x2 - 0xFFFF - - - PORF - desc PORF - 0 - 0 - read-write - - - PINRF - desc PINRF - 1 - 1 - read-write - - - BORF - desc BORF - 2 - 2 - read-write - - - PVD1RF - desc PVD1RF - 3 - 3 - read-write - - - PVD2RF - desc PVD2RF - 4 - 4 - read-write - - - WDRF - desc WDRF - 5 - 5 - read-write - - - SWDRF - desc SWDRF - 6 - 6 - read-write - - - PDRF - desc PDRF - 7 - 7 - read-write - - - SWRF - desc SWRF - 8 - 8 - read-write - - - MPUERF - desc MPUERF - 9 - 9 - read-write - - - RAPERF - desc RAPERF - 10 - 10 - read-write - - - RAECRF - desc RAECRF - 11 - 11 - read-write - - - CKFERF - desc CKFERF - 12 - 12 - read-write - - - XTALERF - desc XTALERF - 13 - 13 - read-write - - - MULTIRF - desc MULTIRF - 14 - 14 - read-write - - - CLRF - desc CLRF - 15 - 15 - read-write - - - - - - - RTC - desc RTC - 0x4004C000 - - 0x0 - 0x40 - - - - CR0 - desc CR0 - 0x0 - 8 - read-write - 0x0 - 0x1 - - - RESET - desc RESET - 0 - 0 - read-write - - - - - CR1 - desc CR1 - 0x4 - 8 - read-write - 0x0 - 0xFF - - - PRDS - desc PRDS - 2 - 0 - read-write - - - AMPM - desc AMPM - 3 - 3 - read-write - - - ALMFCLR - desc ALMFCLR - 4 - 4 - read-write - - - ONEHZOE - desc ONEHZOE - 5 - 5 - read-write - - - ONEHZSEL - desc ONEHZSEL - 6 - 6 - read-write - - - START - desc START - 7 - 7 - read-write - - - - - CR2 - desc CR2 - 0x8 - 8 - read-write - 0x0 - 0xEB - - - RWREQ - desc RWREQ - 0 - 0 - read-write - - - RWEN - desc RWEN - 1 - 1 - read-write - - - ALMF - desc ALMF - 3 - 3 - read-write - - - PRDIE - desc PRDIE - 5 - 5 - read-write - - - ALMIE - desc ALMIE - 6 - 6 - read-write - - - ALME - desc ALME - 7 - 7 - read-write - - - - - CR3 - desc CR3 - 0xC - 8 - read-write - 0x0 - 0x90 - - - LRCEN - desc LRCEN - 4 - 4 - read-write - - - RCKSEL - desc RCKSEL - 7 - 7 - read-write - - - - - SEC - desc SEC - 0x10 - 8 - read-write - 0x0 - 0x7F - - - SECU - desc SECU - 3 - 0 - read-write - - - SECD - desc SECD - 6 - 4 - read-write - - - - - MIN - desc MIN - 0x14 - 8 - read-write - 0x0 - 0x7F - - - MINU - desc MINU - 3 - 0 - read-write - - - MIND - desc MIND - 6 - 4 - read-write - - - - - HOUR - desc HOUR - 0x18 - 8 - read-write - 0x12 - 0x3F - - - HOURU - desc HOURU - 3 - 0 - read-write - - - HOURD - desc HOURD - 5 - 4 - read-write - - - - - WEEK - desc WEEK - 0x1C - 8 - read-write - 0x0 - 0x7 - - - WEEK - desc WEEK - 2 - 0 - read-write - - - - - DAY - desc DAY - 0x20 - 8 - read-write - 0x0 - 0x3F - - - DAYU - desc DAYU - 3 - 0 - read-write - - - DAYD - desc DAYD - 5 - 4 - read-write - - - - - MON - desc MON - 0x24 - 8 - read-write - 0x0 - 0x1F - - - MON - desc MON - 4 - 0 - read-write - - - - - YEAR - desc YEAR - 0x28 - 8 - read-write - 0x0 - 0xFF - - - YEARU - desc YEARU - 3 - 0 - read-write - - - YEARD - desc YEARD - 7 - 4 - read-write - - - - - ALMMIN - desc ALMMIN - 0x2C - 8 - read-write - 0x12 - 0x7F - - - ALMMINU - desc ALMMINU - 3 - 0 - read-write - - - ALMMIND - desc ALMMIND - 6 - 4 - read-write - - - - - ALMHOUR - desc ALMHOUR - 0x30 - 8 - read-write - 0x0 - 0x3F - - - ALMHOURU - desc ALMHOURU - 3 - 0 - read-write - - - ALMHOURD - desc ALMHOURD - 5 - 4 - read-write - - - - - ALMWEEK - desc ALMWEEK - 0x34 - 8 - read-write - 0x0 - 0x7F - - - ALMWEEK - desc ALMWEEK - 6 - 0 - read-write - - - - - ERRCRH - desc ERRCRH - 0x38 - 8 - read-write - 0x0 - 0x81 - - - COMP8 - desc COMP8 - 0 - 0 - read-write - - - COMPEN - desc COMPEN - 7 - 7 - read-write - - - - - ERRCRL - desc ERRCRL - 0x3C - 8 - read-write - 0x20 - 0xFF - - - COMP - desc COMP - 7 - 0 - read-write - - - - - - - SDIOC1 - desc SDIOC - 0x4006FC00 - - 0x0 - 0x54 - - - - BLKSIZE - desc BLKSIZE - 0x4 - 16 - read-write - 0x0 - 0xFFF - - - TBS - desc TBS - 11 - 0 - read-write - - - - - BLKCNT - desc BLKCNT - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - ARG0 - desc ARG0 - 0x8 - 16 - read-write - 0x0 - 0xFFFF - - - ARG1 - desc ARG1 - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - TRANSMODE - desc TRANSMODE - 0xC - 16 - read-write - 0x0 - 0x3E - - - BCE - desc BCE - 1 - 1 - read-write - - - ATCEN - desc ATCEN - 3 - 2 - read-write - - - DDIR - desc DDIR - 4 - 4 - read-write - - - MULB - desc MULB - 5 - 5 - read-write - - - - - CMD - desc CMD - 0xE - 16 - read-write - 0x0 - 0x3FFB - - - RESTYP - desc RESTYP - 1 - 0 - read-write - - - CCE - desc CCE - 3 - 3 - read-write - - - ICE - desc ICE - 4 - 4 - read-write - - - DAT - desc DAT - 5 - 5 - read-write - - - TYP - desc TYP - 7 - 6 - read-write - - - IDX - desc IDX - 13 - 8 - read-write - - - - - RESP0 - desc RESP0 - 0x10 - 16 - read-only - 0x0 - 0xFFFF - - - RESP1 - desc RESP1 - 0x12 - 16 - read-only - 0x0 - 0xFFFF - - - RESP2 - desc RESP2 - 0x14 - 16 - read-only - 0x0 - 0xFFFF - - - RESP3 - desc RESP3 - 0x16 - 16 - read-only - 0x0 - 0xFFFF - - - RESP4 - desc RESP4 - 0x18 - 16 - read-only - 0x0 - 0xFFFF - - - RESP5 - desc RESP5 - 0x1A - 16 - read-only - 0x0 - 0xFFFF - - - RESP6 - desc RESP6 - 0x1C - 16 - read-only - 0x0 - 0xFFFF - - - RESP7 - desc RESP7 - 0x1E - 16 - read-only - 0x0 - 0xFFFF - - - BUF0 - desc BUF0 - 0x20 - 16 - read-write - 0x0 - 0xFFFF - - - BUF1 - desc BUF1 - 0x22 - 16 - read-write - 0x0 - 0xFFFF - - - PSTAT - desc PSTAT - 0x24 - 32 - read-only - 0x0 - 0x1FF0F07 - - - CIC - desc CIC - 0 - 0 - read-only - - - CID - desc CID - 1 - 1 - read-only - - - DA - desc DA - 2 - 2 - read-only - - - WTA - desc WTA - 8 - 8 - read-only - - - RTA - desc RTA - 9 - 9 - read-only - - - BWE - desc BWE - 10 - 10 - read-only - - - BRE - desc BRE - 11 - 11 - read-only - - - CIN - desc CIN - 16 - 16 - read-only - - - CSS - desc CSS - 17 - 17 - read-only - - - CDL - desc CDL - 18 - 18 - read-only - - - WPL - desc WPL - 19 - 19 - read-only - - - DATL - desc DATL - 23 - 20 - read-only - - - CMDL - desc CMDL - 24 - 24 - read-only - - - - - HOSTCON - desc HOSTCON - 0x28 - 8 - read-write - 0x0 - 0xE6 - - - DW - desc DW - 1 - 1 - read-write - - - HSEN - desc HSEN - 2 - 2 - read-write - - - EXDW - desc EXDW - 5 - 5 - read-write - - - CDTL - desc CDTL - 6 - 6 - read-write - - - CDSS - desc CDSS - 7 - 7 - read-write - - - - - PWRCON - desc PWRCON - 0x29 - 8 - read-write - 0x0 - 0x1 - - - PWON - desc PWON - 0 - 0 - read-write - - - - - BLKGPCON - desc BLKGPCON - 0x2A - 8 - read-write - 0x0 - 0xF - - - SABGR - desc SABGR - 0 - 0 - read-write - - - CR - desc CR - 1 - 1 - read-write - - - RWC - desc RWC - 2 - 2 - read-write - - - IABG - desc IABG - 3 - 3 - read-write - - - - - CLKCON - desc CLKCON - 0x2C - 16 - read-write - 0x2 - 0xFF05 - - - ICE - desc ICE - 0 - 0 - read-write - - - CE - desc CE - 2 - 2 - read-write - - - FS - desc FS - 15 - 8 - read-write - - - - - TOUTCON - desc TOUTCON - 0x2E - 8 - read-write - 0x0 - 0xF - - - DTO - desc DTO - 3 - 0 - read-write - - - - - SFTRST - desc SFTRST - 0x2F - 8 - read-write - 0x0 - 0x7 - - - RSTA - desc RSTA - 0 - 0 - read-write - - - RSTC - desc RSTC - 1 - 1 - read-write - - - RSTD - desc RSTD - 2 - 2 - read-write - - - - - NORINTST - desc NORINTST - 0x30 - 16 - read-write - 0x0 - 0x81F7 - - - CC - desc CC - 0 - 0 - read-write - - - TC - desc TC - 1 - 1 - read-write - - - BGE - desc BGE - 2 - 2 - read-write - - - BWR - desc BWR - 4 - 4 - read-write - - - BRR - desc BRR - 5 - 5 - read-write - - - CIST - desc CIST - 6 - 6 - read-write - - - CRM - desc CRM - 7 - 7 - read-write - - - CINT - desc CINT - 8 - 8 - read-only - - - EI - desc EI - 15 - 15 - read-only - - - - - ERRINTST - desc ERRINTST - 0x32 - 16 - read-write - 0x0 - 0x17F - - - CTOE - desc CTOE - 0 - 0 - read-write - - - CCE - desc CCE - 1 - 1 - read-write - - - CEBE - desc CEBE - 2 - 2 - read-write - - - CIE - desc CIE - 3 - 3 - read-write - - - DTOE - desc DTOE - 4 - 4 - read-write - - - DCE - desc DCE - 5 - 5 - read-write - - - DEBE - desc DEBE - 6 - 6 - read-write - - - ACE - desc ACE - 8 - 8 - read-write - - - - - NORINTSTEN - desc NORINTSTEN - 0x34 - 16 - read-write - 0x0 - 0x1F7 - - - CCEN - desc CCEN - 0 - 0 - read-write - - - TCEN - desc TCEN - 1 - 1 - read-write - - - BGEEN - desc BGEEN - 2 - 2 - read-write - - - BWREN - desc BWREN - 4 - 4 - read-write - - - BRREN - desc BRREN - 5 - 5 - read-write - - - CISTEN - desc CISTEN - 6 - 6 - read-write - - - CRMEN - desc CRMEN - 7 - 7 - read-write - - - CINTEN - desc CINTEN - 8 - 8 - read-write - - - - - ERRINTSTEN - desc ERRINTSTEN - 0x36 - 16 - read-write - 0x0 - 0x17F - - - CTOEEN - desc CTOEEN - 0 - 0 - read-write - - - CCEEN - desc CCEEN - 1 - 1 - read-write - - - CEBEEN - desc CEBEEN - 2 - 2 - read-write - - - CIEEN - desc CIEEN - 3 - 3 - read-write - - - DTOEEN - desc DTOEEN - 4 - 4 - read-write - - - DCEEN - desc DCEEN - 5 - 5 - read-write - - - DEBEEN - desc DEBEEN - 6 - 6 - read-write - - - ACEEN - desc ACEEN - 8 - 8 - read-write - - - - - NORINTSGEN - desc NORINTSGEN - 0x38 - 16 - read-write - 0x0 - 0x1F7 - - - CCSEN - desc CCSEN - 0 - 0 - read-write - - - TCSEN - desc TCSEN - 1 - 1 - read-write - - - BGESEN - desc BGESEN - 2 - 2 - read-write - - - BWRSEN - desc BWRSEN - 4 - 4 - read-write - - - BRRSEN - desc BRRSEN - 5 - 5 - read-write - - - CISTSEN - desc CISTSEN - 6 - 6 - read-write - - - CRMSEN - desc CRMSEN - 7 - 7 - read-write - - - CINTSEN - desc CINTSEN - 8 - 8 - read-write - - - - - ERRINTSGEN - desc ERRINTSGEN - 0x3A - 16 - read-write - 0x0 - 0x17F - - - CTOESEN - desc CTOESEN - 0 - 0 - read-write - - - CCESEN - desc CCESEN - 1 - 1 - read-write - - - CEBESEN - desc CEBESEN - 2 - 2 - read-write - - - CIESEN - desc CIESEN - 3 - 3 - read-write - - - DTOESEN - desc DTOESEN - 4 - 4 - read-write - - - DCESEN - desc DCESEN - 5 - 5 - read-write - - - DEBESEN - desc DEBESEN - 6 - 6 - read-write - - - ACESEN - desc ACESEN - 8 - 8 - read-write - - - - - ATCERRST - desc ATCERRST - 0x3C - 16 - read-only - 0x0 - 0x9F - - - NE - desc NE - 0 - 0 - read-only - - - TOE - desc TOE - 1 - 1 - read-only - - - CE - desc CE - 2 - 2 - read-only - - - EBE - desc EBE - 3 - 3 - read-only - - - IE - desc IE - 4 - 4 - read-only - - - CMDE - desc CMDE - 7 - 7 - read-only - - - - - FEA - desc FEA - 0x50 - 16 - write-only - 0x0 - 0x9F - - - FNE - desc FNE - 0 - 0 - write-only - - - FTOE - desc FTOE - 1 - 1 - write-only - - - FCE - desc FCE - 2 - 2 - write-only - - - FEBE - desc FEBE - 3 - 3 - write-only - - - FIE - desc FIE - 4 - 4 - write-only - - - FCMDE - desc FCMDE - 7 - 7 - write-only - - - - - FEE - desc FEE - 0x52 - 16 - write-only - 0x0 - 0x17F - - - FCTOE - desc FCTOE - 0 - 0 - write-only - - - FCCE - desc FCCE - 1 - 1 - write-only - - - FCEBE - desc FCEBE - 2 - 2 - write-only - - - FCIE - desc FCIE - 3 - 3 - write-only - - - FDTOE - desc FDTOE - 4 - 4 - write-only - - - FDCE - desc FDCE - 5 - 5 - write-only - - - FDEBE - desc FDEBE - 6 - 6 - write-only - - - FACE - desc FACE - 8 - 8 - write-only - - - - - - - SDIOC2 - desc SDIOC - 0x40070000 - - 0x0 - 0x54 - - - - SPI1 - desc SPI - 0x4001C000 - - 0x0 - 0x1C - - - - DR - desc DR - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CR1 - desc CR1 - 0x4 - 32 - read-write - 0x0 - 0xFFFB - - - SPIMDS - desc SPIMDS - 0 - 0 - read-write - - - TXMDS - desc TXMDS - 1 - 1 - read-write - - - MSTR - desc MSTR - 3 - 3 - read-write - - - SPLPBK - desc SPLPBK - 4 - 4 - read-write - - - SPLPBK2 - desc SPLPBK2 - 5 - 5 - read-write - - - SPE - desc SPE - 6 - 6 - read-write - - - CSUSPE - desc CSUSPE - 7 - 7 - read-write - - - EIE - desc EIE - 8 - 8 - read-write - - - TXIE - desc TXIE - 9 - 9 - read-write - - - RXIE - desc RXIE - 10 - 10 - read-write - - - IDIE - desc IDIE - 11 - 11 - read-write - - - MODFE - desc MODFE - 12 - 12 - read-write - - - PATE - desc PATE - 13 - 13 - read-write - - - PAOE - desc PAOE - 14 - 14 - read-write - - - PAE - desc PAE - 15 - 15 - read-write - - - - - CFG1 - desc CFG1 - 0xC - 32 - read-write - 0x10 - 0x77700F43 - - - FTHLV - desc FTHLV - 1 - 0 - read-write - - - SPRDTD - desc SPRDTD - 6 - 6 - read-write - - - SS0PV - desc SS0PV - 8 - 8 - read-write - - - SS1PV - desc SS1PV - 9 - 9 - read-write - - - SS2PV - desc SS2PV - 10 - 10 - read-write - - - SS3PV - desc SS3PV - 11 - 11 - read-write - - - MSSI - desc MSSI - 22 - 20 - read-write - - - MSSDL - desc MSSDL - 26 - 24 - read-write - - - MIDI - desc MIDI - 30 - 28 - read-write - - - - - SR - desc SR - 0x14 - 32 - read-write - 0x20 - 0xBF - - - OVRERF - desc OVRERF - 0 - 0 - read-write - - - IDLNF - desc IDLNF - 1 - 1 - read-only - - - MODFERF - desc MODFERF - 2 - 2 - read-write - - - PERF - desc PERF - 3 - 3 - read-write - - - UDRERF - desc UDRERF - 4 - 4 - read-write - - - TDEF - desc TDEF - 5 - 5 - read-write - - - RDFF - desc RDFF - 7 - 7 - read-write - - - - - CFG2 - desc CFG2 - 0x18 - 32 - read-write - 0xF1D - 0xFFFF - - - CPHA - desc CPHA - 0 - 0 - read-write - - - CPOL - desc CPOL - 1 - 1 - read-write - - - MBR - desc MBR - 4 - 2 - read-write - - - SSA - desc SSA - 7 - 5 - read-write - - - DSIZE - desc DSIZE - 11 - 8 - read-write - - - LSBF - desc LSBF - 12 - 12 - read-write - - - MIDIE - desc MIDIE - 13 - 13 - read-write - - - MSSDLE - desc MSSDLE - 14 - 14 - read-write - - - MSSIE - desc MSSIE - 15 - 15 - read-write - - - - - - - SPI2 - desc SPI - 0x4001C400 - - 0x0 - 0x1C - - - - SPI3 - desc SPI - 0x40020000 - - 0x0 - 0x1C - - - - SPI4 - desc SPI - 0x40020400 - - 0x0 - 0x1C - - - - SRAMC - desc SRAMC - 0x40050800 - - 0x0 - 0x14 - - - - WTCR - desc WTCR - 0x0 - 32 - read-write - 0x0 - 0x77777777 - - - SRAM12_RWT - desc SRAM12_RWT - 2 - 0 - read-write - - - SRAM12_WWT - desc SRAM12_WWT - 6 - 4 - read-write - - - SRAM3_RWT - desc SRAM3_RWT - 10 - 8 - read-write - - - SRAM3_WWT - desc SRAM3_WWT - 14 - 12 - read-write - - - SRAMH_RWT - desc SRAMH_RWT - 18 - 16 - read-write - - - SRAMH_WWT - desc SRAMH_WWT - 22 - 20 - read-write - - - SRAMR_RWT - desc SRAMR_RWT - 26 - 24 - read-write - - - SRAMR_WWT - desc SRAMR_WWT - 30 - 28 - read-write - - - - - WTPR - desc WTPR - 0x4 - 32 - read-write - 0x0 - 0xFF - - - WTPRC - desc WTPRC - 0 - 0 - read-write - - - WTPRKW - desc WTPRKW - 7 - 1 - read-write - - - - - CKCR - desc CKCR - 0x8 - 32 - read-write - 0x0 - 0x3010001 - - - PYOAD - desc PYOAD - 0 - 0 - read-write - - - ECCOAD - desc ECCOAD - 16 - 16 - read-write - - - ECCMOD - desc ECCMOD - 25 - 24 - read-write - - - - - CKPR - desc CKPR - 0xC - 32 - read-write - 0x0 - 0xFF - - - CKPRC - desc CKPRC - 0 - 0 - read-write - - - CKPRKW - desc CKPRKW - 7 - 1 - read-write - - - - - CKSR - desc CKSR - 0x10 - 32 - read-write - 0x0 - 0x1F - - - SRAM3_1ERR - desc SRAM3_1ERR - 0 - 0 - read-write - - - SRAM3_2ERR - desc SRAM3_2ERR - 1 - 1 - read-write - - - SRAM12_PYERR - desc SRAM12_PYERR - 2 - 2 - read-write - - - SRAMH_PYERR - desc SRAMH_PYERR - 3 - 3 - read-write - - - SRAMR_PYERR - desc SRAMR_PYERR - 4 - 4 - read-write - - - - - - - SWDT - desc SWDT - 0x40049400 - - 0x0 - 0xC - - - - SR - desc SR - 0x4 - 32 - read-write - 0x0 - 0x3FFFF - - - CNT - desc CNT - 15 - 0 - read-only - - - UDF - desc UDF - 16 - 16 - read-write - - - REF - desc REF - 17 - 17 - read-write - - - - - RR - desc RR - 0x8 - 32 - read-write - 0x0 - 0xFFFF - - - RF - desc RF - 15 - 0 - read-write - - - - - - - TMR01 - desc TMR0 - 0x40024000 - - 0x0 - 0x18 - - - - CNTAR - desc CNTAR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - CNTA - desc CNTA - 15 - 0 - read-write - - - - - CNTBR - desc CNTBR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - CNTB - desc CNTB - 15 - 0 - read-write - - - - - CMPAR - desc CMPAR - 0x8 - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPA - desc CMPA - 15 - 0 - read-write - - - - - CMPBR - desc CMPBR - 0xC - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPB - desc CMPB - 15 - 0 - read-write - - - - - BCONR - desc BCONR - 0x10 - 32 - read-write - 0x0 - 0xF7F7F7F7 - - - CSTA - desc CSTA - 0 - 0 - read-write - - - CAPMDA - desc CAPMDA - 1 - 1 - read-write - - - INTENA - desc INTENA - 2 - 2 - read-write - - - CKDIVA - desc CKDIVA - 7 - 4 - read-write - - - SYNSA - desc SYNSA - 8 - 8 - read-write - - - SYNCLKA - desc SYNCLKA - 9 - 9 - read-write - - - ASYNCLKA - desc ASYNCLKA - 10 - 10 - read-write - - - HSTAA - desc HSTAA - 12 - 12 - read-write - - - HSTPA - desc HSTPA - 13 - 13 - read-write - - - HCLEA - desc HCLEA - 14 - 14 - read-write - - - HICPA - desc HICPA - 15 - 15 - read-write - - - CSTB - desc CSTB - 16 - 16 - read-write - - - CAPMDB - desc CAPMDB - 17 - 17 - read-write - - - INTENB - desc INTENB - 18 - 18 - read-write - - - CKDIVB - desc CKDIVB - 23 - 20 - read-write - - - SYNSB - desc SYNSB - 24 - 24 - read-write - - - SYNCLKB - desc SYNCLKB - 25 - 25 - read-write - - - ASYNCLKB - desc ASYNCLKB - 26 - 26 - read-write - - - HSTAB - desc HSTAB - 28 - 28 - read-write - - - HSTPB - desc HSTPB - 29 - 29 - read-write - - - HCLEB - desc HCLEB - 30 - 30 - read-write - - - HICPB - desc HICPB - 31 - 31 - read-write - - - - - STFLR - desc STFLR - 0x14 - 32 - read-write - 0x0 - 0x10001 - - - CMFA - desc CMFA - 0 - 0 - read-write - - - CMFB - desc CMFB - 16 - 16 - read-write - - - - - - - TMR02 - desc TMR0 - 0x40024400 - - 0x0 - 0x18 - - - - TMR41 - desc TMR4 - 0x40017000 - - 0x0 - 0xF2 - - - - OCCRUH - desc OCCRUH - 0x2 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRUL - desc OCCRUL - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRVH - desc OCCRVH - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - OCCRVL - desc OCCRVL - 0xE - 16 - read-write - 0x0 - 0xFFFF - - - OCCRWH - desc OCCRWH - 0x12 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRWL - desc OCCRWL - 0x16 - 16 - read-write - 0x0 - 0xFFFF - - - OCSRU - desc OCSRU - 0x18 - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERU - desc OCERU - 0x1A - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCSRV - desc OCSRV - 0x1C - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERV - desc OCERV - 0x1E - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCSRW - desc OCSRW - 0x20 - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERW - desc OCERW - 0x22 - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCMRHUH - desc OCMRHUH - 0x24 - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLUL - desc OCMRLUL - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - OCMRHVH - desc OCMRHVH - 0x2C - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLVL - desc OCMRLVL - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - OCMRHWH - desc OCMRHWH - 0x34 - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLWL - desc OCMRLWL - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - CPSR - desc CPSR - 0x42 - 16 - read-write - 0xFFFF - 0xFFFF - - - CNTR - desc CNTR - 0x46 - 16 - read-write - 0x0 - 0xFFFF - - - CCSR - desc CCSR - 0x48 - 16 - read-write - 0x40 - 0xE3FF - - - CKDIV - desc CKDIV - 3 - 0 - read-write - - - CLEAR - desc CLEAR - 4 - 4 - read-write - - - MODE - desc MODE - 5 - 5 - read-write - - - STOP - desc STOP - 6 - 6 - read-write - - - BUFEN - desc BUFEN - 7 - 7 - read-write - - - IRQPEN - desc IRQPEN - 8 - 8 - read-write - - - IRQPF - desc IRQPF - 9 - 9 - read-write - - - IRQZEN - desc IRQZEN - 13 - 13 - read-write - - - IRQZF - desc IRQZF - 14 - 14 - read-write - - - ECKEN - desc ECKEN - 15 - 15 - read-write - - - - - CVPR - desc CVPR - 0x4A - 16 - read-write - 0x0 - 0xFFFF - - - ZIM - desc ZIM - 3 - 0 - read-write - - - PIM - desc PIM - 7 - 4 - read-write - - - ZIC - desc ZIC - 11 - 8 - read-only - - - PIC - desc PIC - 15 - 12 - read-only - - - - - PFSRU - desc PFSRU - 0x82 - 16 - read-write - 0x0 - 0xFFFF - - - PDARU - desc PDARU - 0x84 - 16 - read-write - 0x0 - 0xFFFF - - - PDBRU - desc PDBRU - 0x86 - 16 - read-write - 0x0 - 0xFFFF - - - PFSRV - desc PFSRV - 0x8A - 16 - read-write - 0x0 - 0xFFFF - - - PDARV - desc PDARV - 0x8C - 16 - read-write - 0x0 - 0xFFFF - - - PDBRV - desc PDBRV - 0x8E - 16 - read-write - 0x0 - 0xFFFF - - - PFSRW - desc PFSRW - 0x92 - 16 - read-write - 0x0 - 0xFFFF - - - PDARW - desc PDARW - 0x94 - 16 - read-write - 0x0 - 0xFFFF - - - PDBRW - desc PDBRW - 0x96 - 16 - read-write - 0x0 - 0xFFFF - - - POCRU - desc POCRU - 0x98 - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - POCRV - desc POCRV - 0x9C - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - POCRW - desc POCRW - 0xA0 - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - RCSR - desc RCSR - 0xA4 - 16 - read-write - 0x0 - 0xFFF7 - - - RTIDU - desc RTIDU - 0 - 0 - read-write - - - RTIDV - desc RTIDV - 1 - 1 - read-write - - - RTIDW - desc RTIDW - 2 - 2 - read-write - - - RTIFU - desc RTIFU - 4 - 4 - read-only - - - RTICU - desc RTICU - 5 - 5 - read-write - - - RTEU - desc RTEU - 6 - 6 - read-write - - - RTSU - desc RTSU - 7 - 7 - read-write - - - RTIFV - desc RTIFV - 8 - 8 - read-only - - - RTICV - desc RTICV - 9 - 9 - read-write - - - RTEV - desc RTEV - 10 - 10 - read-write - - - RTSV - desc RTSV - 11 - 11 - read-write - - - RTIFW - desc RTIFW - 12 - 12 - read-only - - - RTICW - desc RTICW - 13 - 13 - read-write - - - RTEW - desc RTEW - 14 - 14 - read-write - - - RTSW - desc RTSW - 15 - 15 - read-write - - - - - SCCRUH - desc SCCRUH - 0xB2 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRUL - desc SCCRUL - 0xB6 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRVH - desc SCCRVH - 0xBA - 16 - read-write - 0x0 - 0xFFFF - - - SCCRVL - desc SCCRVL - 0xBE - 16 - read-write - 0x0 - 0xFFFF - - - SCCRWH - desc SCCRWH - 0xC2 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRWL - desc SCCRWL - 0xC6 - 16 - read-write - 0x0 - 0xFFFF - - - SCSRUH - desc SCSRUH - 0xC8 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRUH - desc SCMRUH - 0xCA - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRUL - desc SCSRUL - 0xCC - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRUL - desc SCMRUL - 0xCE - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRVH - desc SCSRVH - 0xD0 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRVH - desc SCMRVH - 0xD2 - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRVL - desc SCSRVL - 0xD4 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRVL - desc SCMRVL - 0xD6 - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRWH - desc SCSRWH - 0xD8 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRWH - desc SCMRWH - 0xDA - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRWL - desc SCSRWL - 0xDC - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRWL - desc SCMRWL - 0xDE - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - ECSR - desc ECSR - 0xF0 - 16 - read-write - 0x0 - 0x80 - - - HOLD - desc HOLD - 7 - 7 - read-write - - - - - - - TMR42 - desc TMR4 - 0x40024800 - - 0x0 - 0xF2 - - - - TMR43 - desc TMR4 - 0x40024C00 - - 0x0 - 0xF2 - - - - TMR4CR - desc TMR4CR - 0x40055408 - - 0x0 - 0xC - - - - ECER1 - desc ECER1 - 0x0 - 32 - read-write - 0x0 - 0x3 - - - EMBVAL - desc EMBVAL - 1 - 0 - read-write - - - - - ECER2 - desc ECER2 - 0x4 - 32 - read-write - 0x0 - 0x3 - - - EMBVAL - desc EMBVAL - 1 - 0 - read-write - - - - - ECER3 - desc ECER3 - 0x8 - 32 - read-write - 0x0 - 0x3 - - - EMBVAL - desc EMBVAL - 1 - 0 - read-write - - - - - - - TMR61 - desc TMR6 - 0x40018000 - - 0x0 - 0x90 - - - - CNTER - desc CNTER - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - CNT - desc CNT - 15 - 0 - read-write - - - - - PERAR - desc PERAR - 0x4 - 32 - read-write - 0xFFFF - 0xFFFF - - - PERA - desc PERA - 15 - 0 - read-write - - - - - PERBR - desc PERBR - 0x8 - 32 - read-write - 0xFFFF - 0xFFFF - - - PERB - desc PERB - 15 - 0 - read-write - - - - - PERCR - desc PERCR - 0xC - 32 - read-write - 0xFFFF - 0xFFFF - - - PERC - desc PERC - 15 - 0 - read-write - - - - - GCMAR - desc GCMAR - 0x10 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMA - desc GCMA - 15 - 0 - read-write - - - - - GCMBR - desc GCMBR - 0x14 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMB - desc GCMB - 15 - 0 - read-write - - - - - GCMCR - desc GCMCR - 0x18 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMC - desc GCMC - 15 - 0 - read-write - - - - - GCMDR - desc GCMDR - 0x1C - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMD - desc GCMD - 15 - 0 - read-write - - - - - GCMER - desc GCMER - 0x20 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCME - desc GCME - 15 - 0 - read-write - - - - - GCMFR - desc GCMFR - 0x24 - 32 - read-write - 0xFFFF - 0xFFFF - - - GCMF - desc GCMF - 15 - 0 - read-write - - - - - SCMAR - desc SCMAR - 0x28 - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMA - desc SCMA - 15 - 0 - read-write - - - - - SCMBR - desc SCMBR - 0x2C - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMB - desc SCMB - 15 - 0 - read-write - - - - - SCMCR - desc SCMCR - 0x30 - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMC - desc SCMC - 15 - 0 - read-write - - - - - SCMDR - desc SCMDR - 0x34 - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMD - desc SCMD - 15 - 0 - read-write - - - - - SCMER - desc SCMER - 0x38 - 32 - read-write - 0xFFFF - 0xFFFF - - - SCME - desc SCME - 15 - 0 - read-write - - - - - SCMFR - desc SCMFR - 0x3C - 32 - read-write - 0xFFFF - 0xFFFF - - - SCMF - desc SCMF - 15 - 0 - read-write - - - - - DTUAR - desc DTUAR - 0x40 - 32 - read-write - 0xFFFF - 0xFFFF - - - DTUA - desc DTUA - 15 - 0 - read-write - - - - - DTDAR - desc DTDAR - 0x44 - 32 - read-write - 0xFFFF - 0xFFFF - - - DTDA - desc DTDA - 15 - 0 - read-write - - - - - DTUBR - desc DTUBR - 0x48 - 32 - read-write - 0xFFFF - 0xFFFF - - - DTUB - desc DTUB - 15 - 0 - read-write - - - - - DTDBR - desc DTDBR - 0x4C - 32 - read-write - 0xFFFF - 0xFFFF - - - DTDB - desc DTDB - 15 - 0 - read-write - - - - - GCONR - desc GCONR - 0x50 - 32 - read-write - 0x100 - 0xF017F - - - START - desc START - 0 - 0 - read-write - - - MODE - desc MODE - 3 - 1 - read-write - - - CKDIV - desc CKDIV - 6 - 4 - read-write - - - DIR - desc DIR - 8 - 8 - read-write - - - ZMSKREV - desc ZMSKREV - 16 - 16 - read-write - - - ZMSKPOS - desc ZMSKPOS - 17 - 17 - read-write - - - ZMSKVAL - desc ZMSKVAL - 19 - 18 - read-write - - - - - ICONR - desc ICONR - 0x54 - 32 - read-write - 0x0 - 0xF01FF - - - INTENA - desc INTENA - 0 - 0 - read-write - - - INTENB - desc INTENB - 1 - 1 - read-write - - - INTENC - desc INTENC - 2 - 2 - read-write - - - INTEND - desc INTEND - 3 - 3 - read-write - - - INTENE - desc INTENE - 4 - 4 - read-write - - - INTENF - desc INTENF - 5 - 5 - read-write - - - INTENOVF - desc INTENOVF - 6 - 6 - read-write - - - INTENUDF - desc INTENUDF - 7 - 7 - read-write - - - INTENDTE - desc INTENDTE - 8 - 8 - read-write - - - INTENSAU - desc INTENSAU - 16 - 16 - read-write - - - INTENSAD - desc INTENSAD - 17 - 17 - read-write - - - INTENSBU - desc INTENSBU - 18 - 18 - read-write - - - INTENSBD - desc INTENSBD - 19 - 19 - read-write - - - - - PCONR - desc PCONR - 0x58 - 32 - read-write - 0x0 - 0x19FF19FF - - - CAPMDA - desc CAPMDA - 0 - 0 - read-write - - - STACA - desc STACA - 1 - 1 - read-write - - - STPCA - desc STPCA - 2 - 2 - read-write - - - STASTPSA - desc STASTPSA - 3 - 3 - read-write - - - CMPCA - desc CMPCA - 5 - 4 - read-write - - - PERCA - desc PERCA - 7 - 6 - read-write - - - OUTENA - desc OUTENA - 8 - 8 - read-write - - - EMBVALA - desc EMBVALA - 12 - 11 - read-write - - - CAPMDB - desc CAPMDB - 16 - 16 - read-write - - - STACB - desc STACB - 17 - 17 - read-write - - - STPCB - desc STPCB - 18 - 18 - read-write - - - STASTPSB - desc STASTPSB - 19 - 19 - read-write - - - CMPCB - desc CMPCB - 21 - 20 - read-write - - - PERCB - desc PERCB - 23 - 22 - read-write - - - OUTENB - desc OUTENB - 24 - 24 - read-write - - - EMBVALB - desc EMBVALB - 28 - 27 - read-write - - - - - BCONR - desc BCONR - 0x5C - 32 - read-write - 0x0 - 0x3333030F - - - BENA - desc BENA - 0 - 0 - read-write - - - BSEA - desc BSEA - 1 - 1 - read-write - - - BENB - desc BENB - 2 - 2 - read-write - - - BSEB - desc BSEB - 3 - 3 - read-write - - - BENP - desc BENP - 8 - 8 - read-write - - - BSEP - desc BSEP - 9 - 9 - read-write - - - BENSPA - desc BENSPA - 16 - 16 - read-write - - - BSESPA - desc BSESPA - 17 - 17 - read-write - - - BTRUSPA - desc BTRUSPA - 20 - 20 - read-write - - - BTRDSPA - desc BTRDSPA - 21 - 21 - read-write - - - BENSPB - desc BENSPB - 24 - 24 - read-write - - - BSESPB - desc BSESPB - 25 - 25 - read-write - - - BTRUSPB - desc BTRUSPB - 28 - 28 - read-write - - - BTRDSPB - desc BTRDSPB - 29 - 29 - read-write - - - - - DCONR - desc DCONR - 0x60 - 32 - read-write - 0x0 - 0x131 - - - DTCEN - desc DTCEN - 0 - 0 - read-write - - - DTBENU - desc DTBENU - 4 - 4 - read-write - - - DTBEND - desc DTBEND - 5 - 5 - read-write - - - SEPA - desc SEPA - 8 - 8 - read-write - - - - - FCONR - desc FCONR - 0x68 - 32 - read-write - 0x0 - 0x770077 - - - NOFIENGA - desc NOFIENGA - 0 - 0 - read-write - - - NOFICKGA - desc NOFICKGA - 2 - 1 - read-write - - - NOFIENGB - desc NOFIENGB - 4 - 4 - read-write - - - NOFICKGB - desc NOFICKGB - 6 - 5 - read-write - - - NOFIENTA - desc NOFIENTA - 16 - 16 - read-write - - - NOFICKTA - desc NOFICKTA - 18 - 17 - read-write - - - NOFIENTB - desc NOFIENTB - 20 - 20 - read-write - - - NOFICKTB - desc NOFICKTB - 22 - 21 - read-write - - - - - VPERR - desc VPERR - 0x6C - 32 - read-write - 0x0 - 0x1F0300 - - - SPPERIA - desc SPPERIA - 8 - 8 - read-write - - - SPPERIB - desc SPPERIB - 9 - 9 - read-write - - - PCNTE - desc PCNTE - 17 - 16 - read-write - - - PCNTS - desc PCNTS - 20 - 18 - read-write - - - - - STFLR - desc STFLR - 0x70 - 32 - read-write - 0x80000000 - 0x80E01FFF - - - CMAF - desc CMAF - 0 - 0 - read-write - - - CMBF - desc CMBF - 1 - 1 - read-write - - - CMCF - desc CMCF - 2 - 2 - read-write - - - CMDF - desc CMDF - 3 - 3 - read-write - - - CMEF - desc CMEF - 4 - 4 - read-write - - - CMFF - desc CMFF - 5 - 5 - read-write - - - OVFF - desc OVFF - 6 - 6 - read-write - - - UDFF - desc UDFF - 7 - 7 - read-write - - - DTEF - desc DTEF - 8 - 8 - read-only - - - CMSAUF - desc CMSAUF - 9 - 9 - read-write - - - CMSADF - desc CMSADF - 10 - 10 - read-write - - - CMSBUF - desc CMSBUF - 11 - 11 - read-write - - - CMSBDF - desc CMSBDF - 12 - 12 - read-write - - - VPERNUM - desc VPERNUM - 23 - 21 - read-only - - - DIRF - desc DIRF - 31 - 31 - read-only - - - - - HSTAR - desc HSTAR - 0x74 - 32 - read-write - 0x0 - 0x80000FF3 - - - HSTA0 - desc HSTA0 - 0 - 0 - read-write - - - HSTA1 - desc HSTA1 - 1 - 1 - read-write - - - HSTA4 - desc HSTA4 - 4 - 4 - read-write - - - HSTA5 - desc HSTA5 - 5 - 5 - read-write - - - HSTA6 - desc HSTA6 - 6 - 6 - read-write - - - HSTA7 - desc HSTA7 - 7 - 7 - read-write - - - HSTA8 - desc HSTA8 - 8 - 8 - read-write - - - HSTA9 - desc HSTA9 - 9 - 9 - read-write - - - HSTA10 - desc HSTA10 - 10 - 10 - read-write - - - HSTA11 - desc HSTA11 - 11 - 11 - read-write - - - STAS - desc STAS - 31 - 31 - read-write - - - - - HSTPR - desc HSTPR - 0x78 - 32 - read-write - 0x0 - 0x80000FF3 - - - HSTP0 - desc HSTP0 - 0 - 0 - read-write - - - HSTP1 - desc HSTP1 - 1 - 1 - read-write - - - HSTP4 - desc HSTP4 - 4 - 4 - read-write - - - HSTP5 - desc HSTP5 - 5 - 5 - read-write - - - HSTP6 - desc HSTP6 - 6 - 6 - read-write - - - HSTP7 - desc HSTP7 - 7 - 7 - read-write - - - HSTP8 - desc HSTP8 - 8 - 8 - read-write - - - HSTP9 - desc HSTP9 - 9 - 9 - read-write - - - HSTP10 - desc HSTP10 - 10 - 10 - read-write - - - HSTP11 - desc HSTP11 - 11 - 11 - read-write - - - STPS - desc STPS - 31 - 31 - read-write - - - - - HCLRR - desc HCLRR - 0x7C - 32 - read-write - 0x0 - 0x80000FF3 - - - HCLE0 - desc HCLE0 - 0 - 0 - read-write - - - HCLE1 - desc HCLE1 - 1 - 1 - read-write - - - HCLE4 - desc HCLE4 - 4 - 4 - read-write - - - HCLE5 - desc HCLE5 - 5 - 5 - read-write - - - HCLE6 - desc HCLE6 - 6 - 6 - read-write - - - HCLE7 - desc HCLE7 - 7 - 7 - read-write - - - HCLE8 - desc HCLE8 - 8 - 8 - read-write - - - HCLE9 - desc HCLE9 - 9 - 9 - read-write - - - HCLE10 - desc HCLE10 - 10 - 10 - read-write - - - HCLE11 - desc HCLE11 - 11 - 11 - read-write - - - CLES - desc CLES - 31 - 31 - read-write - - - - - HCPAR - desc HCPAR - 0x80 - 32 - read-write - 0x0 - 0xFF3 - - - HCPA0 - desc HCPA0 - 0 - 0 - read-write - - - HCPA1 - desc HCPA1 - 1 - 1 - read-write - - - HCPA4 - desc HCPA4 - 4 - 4 - read-write - - - HCPA5 - desc HCPA5 - 5 - 5 - read-write - - - HCPA6 - desc HCPA6 - 6 - 6 - read-write - - - HCPA7 - desc HCPA7 - 7 - 7 - read-write - - - HCPA8 - desc HCPA8 - 8 - 8 - read-write - - - HCPA9 - desc HCPA9 - 9 - 9 - read-write - - - HCPA10 - desc HCPA10 - 10 - 10 - read-write - - - HCPA11 - desc HCPA11 - 11 - 11 - read-write - - - - - HCPBR - desc HCPBR - 0x84 - 32 - read-write - 0x0 - 0xFF3 - - - HCPB0 - desc HCPB0 - 0 - 0 - read-write - - - HCPB1 - desc HCPB1 - 1 - 1 - read-write - - - HCPB4 - desc HCPB4 - 4 - 4 - read-write - - - HCPB5 - desc HCPB5 - 5 - 5 - read-write - - - HCPB6 - desc HCPB6 - 6 - 6 - read-write - - - HCPB7 - desc HCPB7 - 7 - 7 - read-write - - - HCPB8 - desc HCPB8 - 8 - 8 - read-write - - - HCPB9 - desc HCPB9 - 9 - 9 - read-write - - - HCPB10 - desc HCPB10 - 10 - 10 - read-write - - - HCPB11 - desc HCPB11 - 11 - 11 - read-write - - - - - HCUPR - desc HCUPR - 0x88 - 32 - read-write - 0x0 - 0x30FFF - - - HCUP0 - desc HCUP0 - 0 - 0 - read-write - - - HCUP1 - desc HCUP1 - 1 - 1 - read-write - - - HCUP2 - desc HCUP2 - 2 - 2 - read-write - - - HCUP3 - desc HCUP3 - 3 - 3 - read-write - - - HCUP4 - desc HCUP4 - 4 - 4 - read-write - - - HCUP5 - desc HCUP5 - 5 - 5 - read-write - - - HCUP6 - desc HCUP6 - 6 - 6 - read-write - - - HCUP7 - desc HCUP7 - 7 - 7 - read-write - - - HCUP8 - desc HCUP8 - 8 - 8 - read-write - - - HCUP9 - desc HCUP9 - 9 - 9 - read-write - - - HCUP10 - desc HCUP10 - 10 - 10 - read-write - - - HCUP11 - desc HCUP11 - 11 - 11 - read-write - - - HCUP16 - desc HCUP16 - 16 - 16 - read-write - - - HCUP17 - desc HCUP17 - 17 - 17 - read-write - - - - - HCDOR - desc HCDOR - 0x8C - 32 - read-write - 0x0 - 0x30FFF - - - HCDO0 - desc HCDO0 - 0 - 0 - read-write - - - HCDO1 - desc HCDO1 - 1 - 1 - read-write - - - HCDO2 - desc HCDO2 - 2 - 2 - read-write - - - HCDO3 - desc HCDO3 - 3 - 3 - read-write - - - HCDO4 - desc HCDO4 - 4 - 4 - read-write - - - HCDO5 - desc HCDO5 - 5 - 5 - read-write - - - HCDO6 - desc HCDO6 - 6 - 6 - read-write - - - HCDO7 - desc HCDO7 - 7 - 7 - read-write - - - HCDO8 - desc HCDO8 - 8 - 8 - read-write - - - HCDO9 - desc HCDO9 - 9 - 9 - read-write - - - HCDO10 - desc HCDO10 - 10 - 10 - read-write - - - HCDO11 - desc HCDO11 - 11 - 11 - read-write - - - HCDO16 - desc HCDO16 - 16 - 16 - read-write - - - HCDO17 - desc HCDO17 - 17 - 17 - read-write - - - - - - - TMR62 - desc TMR6 - 0x40018400 - - 0x0 - 0x90 - - - - TMR63 - desc TMR6 - 0x40018800 - - 0x0 - 0x90 - - - - TMR6CR - desc TMR6CR - 0x40018000 - TMR61 - - 0x0 - 0x400 - - - - SSTAR - desc SSTAR - 0x3F4 - 32 - read-write - 0x0 - 0x7 - - - SSTA1 - desc SSTA1 - 0 - 0 - read-write - - - SSTA2 - desc SSTA2 - 1 - 1 - read-write - - - SSTA3 - desc SSTA3 - 2 - 2 - read-write - - - - - SSTPR - desc SSTPR - 0x3F8 - 32 - read-write - 0x0 - 0x7 - - - SSTP1 - desc SSTP1 - 0 - 0 - read-write - - - SSTP2 - desc SSTP2 - 1 - 1 - read-write - - - SSTP3 - desc SSTP3 - 2 - 2 - read-write - - - - - SCLRR - desc SCLRR - 0x3FC - 32 - read-write - 0x0 - 0x7 - - - SCLE1 - desc SCLE1 - 0 - 0 - read-write - - - SCLE2 - desc SCLE2 - 1 - 1 - read-write - - - SCLE3 - desc SCLE3 - 2 - 2 - read-write - - - - - - - TMRA1 - desc TMRA - 0x40015000 - - 0x0 - 0x160 - - - - CNTER - desc CNTER - 0x0 - 16 - read-write - 0x0 - 0xFFFF - - - CNT - desc CNT - 15 - 0 - read-write - - - - - PERAR - desc PERAR - 0x4 - 16 - read-write - 0xFFFF - 0xFFFF - - - PER - desc PER - 15 - 0 - read-write - - - - - CMPAR1 - desc CMPAR1 - 0x40 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR2 - desc CMPAR2 - 0x44 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR3 - desc CMPAR3 - 0x48 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR4 - desc CMPAR4 - 0x4C - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR5 - desc CMPAR5 - 0x50 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR6 - desc CMPAR6 - 0x54 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR7 - desc CMPAR7 - 0x58 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR8 - desc CMPAR8 - 0x5C - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - BCSTR - desc BCSTR - 0x80 - 16 - read-write - 0x2 - 0xF0FF - - - START - desc START - 0 - 0 - read-write - - - DIR - desc DIR - 1 - 1 - read-write - - - MODE - desc MODE - 2 - 2 - read-write - - - SYNST - desc SYNST - 3 - 3 - read-write - - - CKDIV - desc CKDIV - 7 - 4 - read-write - - - ITENOVF - desc ITENOVF - 12 - 12 - read-write - - - ITENUDF - desc ITENUDF - 13 - 13 - read-write - - - OVFF - desc OVFF - 14 - 14 - read-write - - - UDFF - desc UDFF - 15 - 15 - read-write - - - - - HCONR - desc HCONR - 0x84 - 16 - read-write - 0x0 - 0xF777 - - - HSTA0 - desc HSTA0 - 0 - 0 - read-write - - - HSTA1 - desc HSTA1 - 1 - 1 - read-write - - - HSTA2 - desc HSTA2 - 2 - 2 - read-write - - - HSTP0 - desc HSTP0 - 4 - 4 - read-write - - - HSTP1 - desc HSTP1 - 5 - 5 - read-write - - - HSTP2 - desc HSTP2 - 6 - 6 - read-write - - - HCLE0 - desc HCLE0 - 8 - 8 - read-write - - - HCLE1 - desc HCLE1 - 9 - 9 - read-write - - - HCLE2 - desc HCLE2 - 10 - 10 - read-write - - - HCLE3 - desc HCLE3 - 12 - 12 - read-write - - - HCLE4 - desc HCLE4 - 13 - 13 - read-write - - - HCLE5 - desc HCLE5 - 14 - 14 - read-write - - - HCLE6 - desc HCLE6 - 15 - 15 - read-write - - - - - HCUPR - desc HCUPR - 0x88 - 16 - read-write - 0x0 - 0x1FFF - - - HCUP0 - desc HCUP0 - 0 - 0 - read-write - - - HCUP1 - desc HCUP1 - 1 - 1 - read-write - - - HCUP2 - desc HCUP2 - 2 - 2 - read-write - - - HCUP3 - desc HCUP3 - 3 - 3 - read-write - - - HCUP4 - desc HCUP4 - 4 - 4 - read-write - - - HCUP5 - desc HCUP5 - 5 - 5 - read-write - - - HCUP6 - desc HCUP6 - 6 - 6 - read-write - - - HCUP7 - desc HCUP7 - 7 - 7 - read-write - - - HCUP8 - desc HCUP8 - 8 - 8 - read-write - - - HCUP9 - desc HCUP9 - 9 - 9 - read-write - - - HCUP10 - desc HCUP10 - 10 - 10 - read-write - - - HCUP11 - desc HCUP11 - 11 - 11 - read-write - - - HCUP12 - desc HCUP12 - 12 - 12 - read-write - - - - - HCDOR - desc HCDOR - 0x8C - 16 - read-write - 0x0 - 0x1FFF - - - HCDO0 - desc HCDO0 - 0 - 0 - read-write - - - HCDO1 - desc HCDO1 - 1 - 1 - read-write - - - HCDO2 - desc HCDO2 - 2 - 2 - read-write - - - HCDO3 - desc HCDO3 - 3 - 3 - read-write - - - HCDO4 - desc HCDO4 - 4 - 4 - read-write - - - HCDO5 - desc HCDO5 - 5 - 5 - read-write - - - HCDO6 - desc HCDO6 - 6 - 6 - read-write - - - HCDO7 - desc HCDO7 - 7 - 7 - read-write - - - HCDO8 - desc HCDO8 - 8 - 8 - read-write - - - HCDO9 - desc HCDO9 - 9 - 9 - read-write - - - HCDO10 - desc HCDO10 - 10 - 10 - read-write - - - HCDO11 - desc HCDO11 - 11 - 11 - read-write - - - HCDO12 - desc HCDO12 - 12 - 12 - read-write - - - - - ICONR - desc ICONR - 0x90 - 16 - read-write - 0x0 - 0xFF - - - ITEN1 - desc ITEN1 - 0 - 0 - read-write - - - ITEN2 - desc ITEN2 - 1 - 1 - read-write - - - ITEN3 - desc ITEN3 - 2 - 2 - read-write - - - ITEN4 - desc ITEN4 - 3 - 3 - read-write - - - ITEN5 - desc ITEN5 - 4 - 4 - read-write - - - ITEN6 - desc ITEN6 - 5 - 5 - read-write - - - ITEN7 - desc ITEN7 - 6 - 6 - read-write - - - ITEN8 - desc ITEN8 - 7 - 7 - read-write - - - - - ECONR - desc ECONR - 0x94 - 16 - read-write - 0x0 - 0xFF - - - ETEN1 - desc ETEN1 - 0 - 0 - read-write - - - ETEN2 - desc ETEN2 - 1 - 1 - read-write - - - ETEN3 - desc ETEN3 - 2 - 2 - read-write - - - ETEN4 - desc ETEN4 - 3 - 3 - read-write - - - ETEN5 - desc ETEN5 - 4 - 4 - read-write - - - ETEN6 - desc ETEN6 - 5 - 5 - read-write - - - ETEN7 - desc ETEN7 - 6 - 6 - read-write - - - ETEN8 - desc ETEN8 - 7 - 7 - read-write - - - - - FCONR - desc FCONR - 0x98 - 16 - read-write - 0x0 - 0x7707 - - - NOFIENTG - desc NOFIENTG - 0 - 0 - read-write - - - NOFICKTG - desc NOFICKTG - 2 - 1 - read-write - - - NOFIENCA - desc NOFIENCA - 8 - 8 - read-write - - - NOFICKCA - desc NOFICKCA - 10 - 9 - read-write - - - NOFIENCB - desc NOFIENCB - 12 - 12 - read-write - - - NOFICKCB - desc NOFICKCB - 14 - 13 - read-write - - - - - STFLR - desc STFLR - 0x9C - 16 - read-write - 0x0 - 0xFF - - - CMPF1 - desc CMPF1 - 0 - 0 - read-write - - - CMPF2 - desc CMPF2 - 1 - 1 - read-write - - - CMPF3 - desc CMPF3 - 2 - 2 - read-write - - - CMPF4 - desc CMPF4 - 3 - 3 - read-write - - - CMPF5 - desc CMPF5 - 4 - 4 - read-write - - - CMPF6 - desc CMPF6 - 5 - 5 - read-write - - - CMPF7 - desc CMPF7 - 6 - 6 - read-write - - - CMPF8 - desc CMPF8 - 7 - 7 - read-write - - - - - BCONR1 - desc BCONR1 - 0xC0 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - BCONR2 - desc BCONR2 - 0xC8 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - BCONR3 - desc BCONR3 - 0xD0 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - BCONR4 - desc BCONR4 - 0xD8 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - CCONR1 - desc CCONR1 - 0x100 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR2 - desc CCONR2 - 0x104 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR3 - desc CCONR3 - 0x108 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR4 - desc CCONR4 - 0x10C - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR5 - desc CCONR5 - 0x110 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR6 - desc CCONR6 - 0x114 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR7 - desc CCONR7 - 0x118 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR8 - desc CCONR8 - 0x11C - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - PCONR1 - desc PCONR1 - 0x140 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR2 - desc PCONR2 - 0x144 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR3 - desc PCONR3 - 0x148 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR4 - desc PCONR4 - 0x14C - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR5 - desc PCONR5 - 0x150 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR6 - desc PCONR6 - 0x154 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR7 - desc PCONR7 - 0x158 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR8 - desc PCONR8 - 0x15C - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - - - TMRA2 - desc TMRA - 0x40015400 - - 0x0 - 0x160 - - - - TMRA3 - desc TMRA - 0x40015800 - - 0x0 - 0x160 - - - - TMRA4 - desc TMRA - 0x40015C00 - - 0x0 - 0x160 - - - - TMRA5 - desc TMRA - 0x40016000 - - 0x0 - 0x160 - - - - TMRA6 - desc TMRA - 0x40016400 - - 0x0 - 0x160 - - - - TRNG - desc TRNG - 0x40041000 - - 0x0 - 0x14 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x3 - - - EN - desc EN - 0 - 0 - read-write - - - RUN - desc RUN - 1 - 1 - read-write - - - - - MR - desc MR - 0x4 - 32 - read-write - 0x12 - 0x1D - - - LOAD - desc LOAD - 0 - 0 - read-write - - - CNT - desc CNT - 4 - 2 - read-write - - - - - DR0 - desc DR0 - 0xC - 32 - read-only - 0x8000000 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x10 - 32 - read-only - 0x8000200 - 0xFFFFFFFF - - - - - USART1 - desc USART - 0x4001D000 - - 0x0 - 0x1C - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x101EB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - RTOF - desc RTOF - 8 - 8 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFFFF - 0xFF7F - - - DIV_FRACTION - desc DIV_FRACTION - 6 - 0 - read-write - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xF11B96FF - - - RTOE - desc RTOE - 0 - 0 - read-write - - - RTOIE - desc RTOIE - 1 - 1 - read-write - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - write-only - - - CFE - desc CFE - 17 - 17 - write-only - - - CORE - desc CORE - 19 - 19 - write-only - - - CRTOF - desc CRTOF - 20 - 20 - write-only - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - FBME - desc FBME - 29 - 29 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x0 - 0x3801 - - - MPE - desc MPE - 0 - 0 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0xE00220 - - - SCEN - desc SCEN - 5 - 5 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - BCN - desc BCN - 23 - 21 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0x3 - - - PSC - desc PSC - 1 - 0 - read-write - - - - - - - USART2 - desc USART - 0x4001D400 - - 0x0 - 0x1C - - - - USART3 - desc USART - 0x40021000 - - 0x0 - 0x1C - - - - USART4 - desc USART - 0x40021400 - - 0x0 - 0x1C - - - - USBFS - desc USBFS - 0x400C0000 - - 0x0 - 0xE04 - - - - GVBUSCFG - desc GVBUSCFG - 0x0 - 32 - read-write - 0x0 - 0xC0 - - - VBUSOVEN - desc VBUSOVEN - 6 - 6 - read-write - - - VBUSVAL - desc VBUSVAL - 7 - 7 - read-write - - - - - GAHBCFG - desc GAHBCFG - 0x8 - 32 - read-write - 0x0 - 0x1BF - - - GINTMSK - desc GINTMSK - 0 - 0 - read-write - - - HBSTLEN - desc HBSTLEN - 4 - 1 - read-write - - - DMAEN - desc DMAEN - 5 - 5 - read-write - - - TXFELVL - desc TXFELVL - 7 - 7 - read-write - - - PTXFELVL - desc PTXFELVL - 8 - 8 - read-write - - - - - GUSBCFG - desc GUSBCFG - 0xC - 32 - read-write - 0xA00 - 0x60003C47 - - - TOCAL - desc TOCAL - 2 - 0 - read-write - - - PHYSEL - desc PHYSEL - 6 - 6 - read-write - - - TRDT - desc TRDT - 13 - 10 - read-write - - - FHMOD - desc FHMOD - 29 - 29 - read-write - - - FDMOD - desc FDMOD - 30 - 30 - read-write - - - - - GRSTCTL - desc GRSTCTL - 0x10 - 32 - read-write - 0x80000000 - 0xC00007F7 - - - CSRST - desc CSRST - 0 - 0 - read-write - - - HSRST - desc HSRST - 1 - 1 - read-write - - - FCRST - desc FCRST - 2 - 2 - read-write - - - RXFFLSH - desc RXFFLSH - 4 - 4 - read-write - - - TXFFLSH - desc TXFFLSH - 5 - 5 - read-write - - - TXFNUM - desc TXFNUM - 10 - 6 - read-write - - - DMAREQ - desc DMAREQ - 30 - 30 - read-only - - - AHBIDL - desc AHBIDL - 31 - 31 - read-only - - - - - GINTSTS - desc GINTSTS - 0x14 - 32 - read-only - 0x14000020 - 0xF77CFCFB - - - CMOD - desc CMOD - 0 - 0 - read-only - - - MMIS - desc MMIS - 1 - 1 - read-write - - - SOF - desc SOF - 3 - 3 - read-write - - - RXFNE - desc RXFNE - 4 - 4 - read-only - - - NPTXFE - desc NPTXFE - 5 - 5 - read-only - - - GINAKEFF - desc GINAKEFF - 6 - 6 - read-only - - - GONAKEFF - desc GONAKEFF - 7 - 7 - read-only - - - ESUSP - desc ESUSP - 10 - 10 - read-write - - - USBSUSP - desc USBSUSP - 11 - 11 - read-write - - - USBRST - desc USBRST - 12 - 12 - read-write - - - ENUMDNE - desc ENUMDNE - 13 - 13 - read-write - - - ISOODRP - desc ISOODRP - 14 - 14 - read-write - - - EOPF - desc EOPF - 15 - 15 - read-write - - - IEPINT - desc IEPINT - 18 - 18 - read-only - - - OEPINT - desc OEPINT - 19 - 19 - read-only - - - IISOIXFR - desc IISOIXFR - 20 - 20 - read-write - - - IPXFR_INCOMPISOOUT - desc IPXFR_INCOMPISOOUT - 21 - 21 - read-write - - - DATAFSUSP - desc DATAFSUSP - 22 - 22 - read-write - - - HPRTINT - desc HPRTINT - 24 - 24 - read-only - - - HCINT - desc HCINT - 25 - 25 - read-only - - - PTXFE - desc PTXFE - 26 - 26 - read-only - - - CIDSCHG - desc CIDSCHG - 28 - 28 - read-write - - - DISCINT - desc DISCINT - 29 - 29 - read-write - - - VBUSVINT - desc VBUSVINT - 30 - 30 - read-write - - - WKUINT - desc WKUINT - 31 - 31 - read-write - - - - - GINTMSK - desc GINTMSK - 0x18 - 32 - read-write - 0x0 - 0xF77CFCFA - - - MMISM - desc MMISM - 1 - 1 - read-write - - - SOFM - desc SOFM - 3 - 3 - read-write - - - RXFNEM - desc RXFNEM - 4 - 4 - read-write - - - NPTXFEM - desc NPTXFEM - 5 - 5 - read-write - - - GINAKEFFM - desc GINAKEFFM - 6 - 6 - read-write - - - GONAKEFFM - desc GONAKEFFM - 7 - 7 - read-write - - - ESUSPM - desc ESUSPM - 10 - 10 - read-write - - - USBSUSPM - desc USBSUSPM - 11 - 11 - read-write - - - USBRSTM - desc USBRSTM - 12 - 12 - read-write - - - ENUMDNEM - desc ENUMDNEM - 13 - 13 - read-write - - - ISOODRPM - desc ISOODRPM - 14 - 14 - read-write - - - EOPFM - desc EOPFM - 15 - 15 - read-write - - - IEPIM - desc IEPIM - 18 - 18 - read-write - - - OEPIM - desc OEPIM - 19 - 19 - read-write - - - IISOIXFRM - desc IISOIXFRM - 20 - 20 - read-write - - - IPXFRM_INCOMPISOOUTM - desc IPXFRM_INCOMPISOOUTM - 21 - 21 - read-write - - - DATAFSUSPM - desc DATAFSUSPM - 22 - 22 - read-write - - - HPRTIM - desc HPRTIM - 24 - 24 - read-write - - - HCIM - desc HCIM - 25 - 25 - read-write - - - PTXFEM - desc PTXFEM - 26 - 26 - read-write - - - CIDSCHGM - desc CIDSCHGM - 28 - 28 - read-write - - - DISCIM - desc DISCIM - 29 - 29 - read-write - - - VBUSVIM - desc VBUSVIM - 30 - 30 - read-write - - - WKUIM - desc WKUIM - 31 - 31 - read-write - - - - - GRXSTSR - desc GRXSTSR - 0x1C - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXSTSP - desc GRXSTSP - 0x20 - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXFSIZ - desc GRXFSIZ - 0x24 - 32 - read-write - 0x140 - 0x7FF - - - RXFD - desc RXFD - 10 - 0 - read-write - - - - - HNPTXFSIZ - desc HNPTXFSIZ - 0x28 - 32 - read-write - 0x2000140 - 0xFFFFFFFF - - - NPTXFSA - desc NPTXFSA - 15 - 0 - read-write - - - NPTXFD - desc NPTXFD - 31 - 16 - read-write - - - - - HNPTXSTS - desc HNPTXSTS - 0x2C - 32 - read-only - 0x80100 - 0x7FFFFFFF - - - NPTXFSAV - desc NPTXFSAV - 15 - 0 - read-only - - - NPTQXSAV - desc NPTQXSAV - 23 - 16 - read-only - - - NPTXQTOP - desc NPTXQTOP - 30 - 24 - read-only - - - - - CID - desc CID - 0x3C - 32 - read-write - 0x12345678 - 0xFFFFFFFF - - - HPTXFSIZ - desc HPTXFSIZ - 0x100 - 32 - read-write - 0x1400280 - 0x7FF0FFF - - - PTXSA - desc PTXSA - 11 - 0 - read-write - - - PTXFD - desc PTXFD - 26 - 16 - read-write - - - - - DIEPTXF1 - desc DIEPTXF1 - 0x104 - 32 - read-write - 0x1000240 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - DIEPTXF2 - desc DIEPTXF2 - 0x108 - 32 - read-write - 0x1000340 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - DIEPTXF3 - desc DIEPTXF3 - 0x10C - 32 - read-write - 0x1000440 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - DIEPTXF4 - desc DIEPTXF4 - 0x110 - 32 - read-write - 0x1000540 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - DIEPTXF5 - desc DIEPTXF5 - 0x114 - 32 - read-write - 0x1000640 - 0x3FF0FFF - - - INEPTXSA - desc INEPTXSA - 11 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 25 - 16 - read-write - - - - - HCFG - desc HCFG - 0x400 - 32 - read-write - 0x200000 - 0x7 - - - FSLSPCS - desc FSLSPCS - 1 - 0 - read-write - - - FSLSS - desc FSLSS - 2 - 2 - read-write - - - - - HFIR - desc HFIR - 0x404 - 32 - read-write - 0xEA60 - 0xFFFF - - - FRIVL - desc FRIVL - 15 - 0 - read-write - - - - - HFNUM - desc HFNUM - 0x408 - 32 - read-only - 0x3FFF - 0xFFFFFFFF - - - FRNUM - desc FRNUM - 15 - 0 - read-only - - - FTREM - desc FTREM - 31 - 16 - read-only - - - - - HPTXSTS - desc HPTXSTS - 0x410 - 32 - read-only - 0x80100 - 0xFFFFFFFF - - - PTXFSAVL - desc PTXFSAVL - 15 - 0 - read-only - - - PTXQSAV - desc PTXQSAV - 23 - 16 - read-only - - - PTXQTOP - desc PTXQTOP - 31 - 24 - read-only - - - - - HAINT - desc HAINT - 0x414 - 32 - read-only - 0x0 - 0xFFF - - - HAINT - desc HAINT - 11 - 0 - read-only - - - - - HAINTMSK - desc HAINTMSK - 0x418 - 32 - read-write - 0x0 - 0xFFF - - - HAINTM - desc HAINTM - 11 - 0 - read-write - - - - - HPRT - desc HPRT - 0x440 - 32 - read-only - 0x0 - 0x61DCF - - - PCSTS - desc PCSTS - 0 - 0 - read-only - - - PCDET - desc PCDET - 1 - 1 - read-write - - - PENA - desc PENA - 2 - 2 - read-write - - - PENCHNG - desc PENCHNG - 3 - 3 - read-write - - - PRES - desc PRES - 6 - 6 - read-write - - - PSUSP - desc PSUSP - 7 - 7 - read-write - - - PRST - desc PRST - 8 - 8 - read-write - - - PLSTS - desc PLSTS - 11 - 10 - read-only - - - PWPR - desc PWPR - 12 - 12 - read-write - - - PSPD - desc PSPD - 18 - 17 - read-only - - - - - HCCHAR0 - desc HCCHAR0 - 0x500 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT0 - desc HCINT0 - 0x508 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK0 - desc HCINTMSK0 - 0x50C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ0 - desc HCTSIZ0 - 0x510 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA0 - desc HCDMA0 - 0x514 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR1 - desc HCCHAR1 - 0x520 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT1 - desc HCINT1 - 0x528 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK1 - desc HCINTMSK1 - 0x52C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ1 - desc HCTSIZ1 - 0x530 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA1 - desc HCDMA1 - 0x534 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR2 - desc HCCHAR2 - 0x540 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT2 - desc HCINT2 - 0x548 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK2 - desc HCINTMSK2 - 0x54C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ2 - desc HCTSIZ2 - 0x550 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA2 - desc HCDMA2 - 0x554 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR3 - desc HCCHAR3 - 0x560 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT3 - desc HCINT3 - 0x568 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK3 - desc HCINTMSK3 - 0x56C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ3 - desc HCTSIZ3 - 0x570 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA3 - desc HCDMA3 - 0x574 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR4 - desc HCCHAR4 - 0x580 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT4 - desc HCINT4 - 0x588 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK4 - desc HCINTMSK4 - 0x58C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ4 - desc HCTSIZ4 - 0x590 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA4 - desc HCDMA4 - 0x594 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR5 - desc HCCHAR5 - 0x5A0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT5 - desc HCINT5 - 0x5A8 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK5 - desc HCINTMSK5 - 0x5AC - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ5 - desc HCTSIZ5 - 0x5B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA5 - desc HCDMA5 - 0x5B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR6 - desc HCCHAR6 - 0x5C0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT6 - desc HCINT6 - 0x5C8 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK6 - desc HCINTMSK6 - 0x5CC - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ6 - desc HCTSIZ6 - 0x5D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA6 - desc HCDMA6 - 0x5D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR7 - desc HCCHAR7 - 0x5E0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT7 - desc HCINT7 - 0x5E8 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK7 - desc HCINTMSK7 - 0x5EC - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ7 - desc HCTSIZ7 - 0x5F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA7 - desc HCDMA7 - 0x5F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR8 - desc HCCHAR8 - 0x600 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT8 - desc HCINT8 - 0x608 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK8 - desc HCINTMSK8 - 0x60C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ8 - desc HCTSIZ8 - 0x610 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA8 - desc HCDMA8 - 0x614 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR9 - desc HCCHAR9 - 0x620 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT9 - desc HCINT9 - 0x628 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK9 - desc HCINTMSK9 - 0x62C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ9 - desc HCTSIZ9 - 0x630 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA9 - desc HCDMA9 - 0x634 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR10 - desc HCCHAR10 - 0x640 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT10 - desc HCINT10 - 0x648 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK10 - desc HCINTMSK10 - 0x64C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ10 - desc HCTSIZ10 - 0x650 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA10 - desc HCDMA10 - 0x654 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR11 - desc HCCHAR11 - 0x660 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT11 - desc HCINT11 - 0x668 - 32 - read-write - 0x0 - 0x7BB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK11 - desc HCINTMSK11 - 0x66C - 32 - read-write - 0x0 - 0x7BB - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ11 - desc HCTSIZ11 - 0x670 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA11 - desc HCDMA11 - 0x674 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DCFG - desc DCFG - 0x800 - 32 - read-write - 0x8200000 - 0x1FF7 - - - DSPD - desc DSPD - 1 - 0 - read-write - - - NZLSOHSK - desc NZLSOHSK - 2 - 2 - read-write - - - DAD - desc DAD - 10 - 4 - read-write - - - PFIVL - desc PFIVL - 12 - 11 - read-write - - - - - DCTL - desc DCTL - 0x804 - 32 - read-write - 0x2 - 0xF8F - - - RWUSIG - desc RWUSIG - 0 - 0 - read-write - - - SDIS - desc SDIS - 1 - 1 - read-write - - - GINSTS - desc GINSTS - 2 - 2 - read-only - - - GONSTS - desc GONSTS - 3 - 3 - read-only - - - SGINAK - desc SGINAK - 7 - 7 - write-only - - - CGINAK - desc CGINAK - 8 - 8 - write-only - - - SGONAK - desc SGONAK - 9 - 9 - write-only - - - CGONAK - desc CGONAK - 10 - 10 - write-only - - - POPRGDNE - desc POPRGDNE - 11 - 11 - read-write - - - - - DSTS - desc DSTS - 0x808 - 32 - read-only - 0x2 - 0x3FFF0F - - - SUSPSTS - desc SUSPSTS - 0 - 0 - read-only - - - ENUMSPD - desc ENUMSPD - 2 - 1 - read-only - - - EERR - desc EERR - 3 - 3 - read-only - - - FNSOF - desc FNSOF - 21 - 8 - read-only - - - - - DIEPMSK - desc DIEPMSK - 0x810 - 32 - read-write - 0x0 - 0x7B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - TOM - desc TOM - 3 - 3 - read-write - - - ITTXFEMSK - desc ITTXFEMSK - 4 - 4 - read-write - - - INEPNMM - desc INEPNMM - 5 - 5 - read-write - - - INEPNEM - desc INEPNEM - 6 - 6 - read-write - - - - - DOEPMSK - desc DOEPMSK - 0x814 - 32 - read-write - 0x0 - 0x1B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - STUPM - desc STUPM - 3 - 3 - read-write - - - OTEPDM - desc OTEPDM - 4 - 4 - read-write - - - - - DAINT - desc DAINT - 0x818 - 32 - read-write - 0x0 - 0x3F003F - - - IEPINT - desc IEPINT - 5 - 0 - read-write - - - OEPINT - desc OEPINT - 21 - 16 - read-write - - - - - DAINTMSK - desc DAINTMSK - 0x81C - 32 - read-write - 0x0 - 0x3F003F - - - IEPINTM - desc IEPINTM - 5 - 0 - read-write - - - OEPINTM - desc OEPINTM - 21 - 16 - read-write - - - - - DIEPEMPMSK - desc DIEPEMPMSK - 0x834 - 32 - read-write - 0x0 - 0x3F - - - INEPTXFEM - desc INEPTXFEM - 5 - 0 - read-write - - - - - DIEPCTL0 - desc DIEPCTL0 - 0x900 - 32 - read-write - 0x8000 - 0xCFEE8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT0 - desc DIEPINT0 - 0x908 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ0 - desc DIEPTSIZ0 - 0x910 - 32 - read-write - 0x0 - 0x18007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 20 - 19 - read-write - - - - - DIEPDMA0 - desc DIEPDMA0 - 0x914 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS0 - desc DTXFSTS0 - 0x918 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL1 - desc DIEPCTL1 - 0x920 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT1 - desc DIEPINT1 - 0x928 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ1 - desc DIEPTSIZ1 - 0x930 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA1 - desc DIEPDMA1 - 0x934 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS1 - desc DTXFSTS1 - 0x938 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL2 - desc DIEPCTL2 - 0x940 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT2 - desc DIEPINT2 - 0x948 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ2 - desc DIEPTSIZ2 - 0x950 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA2 - desc DIEPDMA2 - 0x954 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS2 - desc DTXFSTS2 - 0x958 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL3 - desc DIEPCTL3 - 0x960 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT3 - desc DIEPINT3 - 0x968 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ3 - desc DIEPTSIZ3 - 0x970 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA3 - desc DIEPDMA3 - 0x974 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS3 - desc DTXFSTS3 - 0x978 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL4 - desc DIEPCTL4 - 0x980 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT4 - desc DIEPINT4 - 0x988 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ4 - desc DIEPTSIZ4 - 0x990 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA4 - desc DIEPDMA4 - 0x994 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS4 - desc DTXFSTS4 - 0x998 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL5 - desc DIEPCTL5 - 0x9A0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT5 - desc DIEPINT5 - 0x9A8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ5 - desc DIEPTSIZ5 - 0x9B0 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DIEPDMA5 - desc DIEPDMA5 - 0x9B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS5 - desc DTXFSTS5 - 0x9B8 - 32 - read-only - 0x100 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DOEPCTL0 - desc DOEPCTL0 - 0xB00 - 32 - read-write - 0x8000 - 0xCC3E8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT0 - desc DOEPINT0 - 0xB08 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ0 - desc DOEPTSIZ0 - 0xB10 - 32 - read-write - 0x0 - 0x6008007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 19 - 19 - read-write - - - STUPCNT - desc STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA0 - desc DOEPDMA0 - 0xB14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL1 - desc DOEPCTL1 - 0xB20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT1 - desc DOEPINT1 - 0xB28 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ1 - desc DOEPTSIZ1 - 0xB30 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA1 - desc DOEPDMA1 - 0xB34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL2 - desc DOEPCTL2 - 0xB40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT2 - desc DOEPINT2 - 0xB48 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ2 - desc DOEPTSIZ2 - 0xB50 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA2 - desc DOEPDMA2 - 0xB54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL3 - desc DOEPCTL3 - 0xB60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT3 - desc DOEPINT3 - 0xB68 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ3 - desc DOEPTSIZ3 - 0xB70 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA3 - desc DOEPDMA3 - 0xB74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL4 - desc DOEPCTL4 - 0xB80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT4 - desc DOEPINT4 - 0xB88 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ4 - desc DOEPTSIZ4 - 0xB90 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA4 - desc DOEPDMA4 - 0xB94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL5 - desc DOEPCTL5 - 0xBA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT5 - desc DOEPINT5 - 0xBA8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ5 - desc DOEPTSIZ5 - 0xBB0 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - - - DOEPDMA5 - desc DOEPDMA5 - 0xBB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - GCCTL - desc GCCTL - 0xE00 - 32 - read-write - 0x0 - 0x3 - - - STPPCLK - desc STPPCLK - 0 - 0 - read-write - - - GATEHCLK - desc GATEHCLK - 1 - 1 - read-write - - - - - - - WDT - desc WDT - 0x40049000 - - 0x0 - 0xC - - - - CR - desc CR - 0x0 - 32 - read-write - 0x80010FF3 - 0x80010FF3 - - - PERI - desc PERI - 1 - 0 - read-write - - - CKS - desc CKS - 7 - 4 - read-write - - - WDPT - desc WDPT - 11 - 8 - read-write - - - SLPOFF - desc SLPOFF - 16 - 16 - read-write - - - ITS - desc ITS - 31 - 31 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-write - 0x0 - 0x3FFFF - - - CNT - desc CNT - 15 - 0 - read-only - - - UDF - desc UDF - 16 - 16 - read-write - - - REF - desc REF - 17 - 17 - read-write - - - - - RR - desc RR - 0x8 - 32 - read-write - 0x0 - 0xFFFF - - - RF - desc RF - 15 - 0 - read-write - - - - - - - diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_adc.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_adc.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_adc.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_adc.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aes.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_aes.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aes.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_aes.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aos.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_aos.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aos.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_aos.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_can.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_can.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_can.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_can.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_clk.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_clk.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_clk.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_clk.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_cmp.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_cmp.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_cmp.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_cmp.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_crc.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_crc.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_crc.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_crc.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dbgc.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_dbgc.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dbgc.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_dbgc.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dcu.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_dcu.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dcu.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_dcu.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_def.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_def.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_def.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_def.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dma.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_dma.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dma.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_dma.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_efm.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_efm.h similarity index 99% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_efm.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_efm.h index 1ac04e17b46..f2dc1c1cbb2 100644 --- a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_efm.h +++ b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_efm.h @@ -216,7 +216,7 @@ typedef struct { * @defgroup EFM_Sector_Size EFM Sector Size * @{ */ -#define SECTOR_SIZE (0x2000UL) +#define EFM_SECTOR_SIZE (0x2000UL) /** * @} @@ -226,7 +226,7 @@ typedef struct { * @defgroup EFM_Sector_Address EFM Sector Address * @{ */ -#define EFM_SECTOR_ADDR(x) (uint32_t)(SECTOR_SIZE * (x)) +#define EFM_SECTOR_ADDR(x) (uint32_t)(EFM_SECTOR_SIZE * (x)) /** * @} */ diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_emb.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_emb.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_emb.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_emb.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_event_port.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_event_port.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_event_port.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_event_port.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcg.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_fcg.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcg.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_fcg.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcm.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_fcm.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcm.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_fcm.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_gpio.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_gpio.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_gpio.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_gpio.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_hash.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_hash.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_hash.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_hash.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2c.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_i2c.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2c.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_i2c.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2s.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_i2s.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2s.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_i2s.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_icg.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_icg.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_icg.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_icg.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_interrupts.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_interrupts.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_interrupts.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_interrupts.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_keyscan.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_keyscan.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_keyscan.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_keyscan.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_mpu.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_mpu.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_mpu.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_mpu.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_ots.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_ots.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_ots.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_ots.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_pwc.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_pwc.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_pwc.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_pwc.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_qspi.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_qspi.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_qspi.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_qspi.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rmu.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_rmu.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rmu.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_rmu.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rtc.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_rtc.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rtc.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_rtc.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sdioc.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_sdioc.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sdioc.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_sdioc.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_spi.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_spi.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_spi.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_spi.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sram.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_sram.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sram.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_sram.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_swdt.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_swdt.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_swdt.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_swdt.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr0.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_tmr0.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr0.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_tmr0.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr4.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_tmr4.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr4.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_tmr4.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr6.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_tmr6.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr6.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_tmr6.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmra.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_tmra.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmra.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_tmra.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_trng.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_trng.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_trng.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_trng.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usart.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_usart.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usart.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_usart.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usb.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_usb.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usb.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_usb.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_utility.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_utility.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_utility.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_utility.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_wdt.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_wdt.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32_ll_wdt.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32_ll_wdt.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32f460_ll_interrupts_share.h b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32f460_ll_interrupts_share.h similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/inc/hc32f460_ll_interrupts_share.h rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/inc/hc32f460_ll_interrupts_share.h diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_adc.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_adc.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_adc.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_adc.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_aes.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_aes.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_aes.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_aes.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_aos.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_aos.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_aos.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_aos.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_can.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_can.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_can.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_can.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_clk.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_clk.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_clk.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_clk.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_cmp.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_cmp.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_cmp.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_cmp.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_crc.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_crc.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_crc.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_crc.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_dbgc.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_dbgc.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_dbgc.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_dbgc.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_dcu.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_dcu.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_dcu.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_dcu.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_dma.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_dma.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_dma.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_dma.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_efm.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_efm.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_efm.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_efm.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_emb.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_emb.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_emb.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_emb.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_event_port.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_event_port.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_event_port.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_event_port.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcg.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_fcg.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcg.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_fcg.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcm.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_fcm.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcm.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_fcm.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_gpio.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_gpio.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_gpio.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_gpio.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_hash.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_hash.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_hash.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_hash.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2c.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_i2c.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2c.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_i2c.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2s.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_i2s.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2s.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_i2s.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_icg.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_icg.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_icg.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_icg.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_interrupts.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_interrupts.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_interrupts.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_interrupts.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_keyscan.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_keyscan.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_keyscan.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_keyscan.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_mpu.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_mpu.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_mpu.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_mpu.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_ots.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_ots.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_ots.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_ots.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_pwc.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_pwc.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_pwc.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_pwc.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_qspi.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_qspi.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_qspi.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_qspi.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_rmu.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_rmu.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_rmu.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_rmu.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_rtc.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_rtc.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_rtc.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_rtc.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_sdioc.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_sdioc.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_sdioc.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_sdioc.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_spi.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_spi.c similarity index 99% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_spi.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_spi.c index 41c7b6ebc25..c07a71c0c75 100644 --- a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_spi.c +++ b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_spi.c @@ -315,10 +315,10 @@ static int32_t SPI_TxRx(CM_SPI_TypeDef *SPIx, const void *pvTxBuf, void *pvRxBuf int32_t i32Ret = LL_OK; uint32_t u32Tmp; __UNUSED __IO uint32_t u32Read; - __IO uint32_t u32FrameCnt; - uint32_t u32FrameNum = READ_REG32_BIT(SPIx->CFG1, SPI_CFG1_FTHLV) + 1UL; __IO uint32_t u32TxAllow = 1U; uint32_t u32MSMode; + __IO uint32_t u32FrameCnt; + uint32_t u32FrameNum = READ_REG32_BIT(SPIx->CFG1, SPI_CFG1_FTHLV) + 1UL; DDL_ASSERT(0UL == (u32Len % u32FrameNum)); u32MSMode = READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR); @@ -399,7 +399,7 @@ static int32_t SPI_TxRx(CM_SPI_TypeDef *SPIx, const void *pvTxBuf, void *pvRxBuf u32Count++; } - if ((SPI_CR1_MSTR == READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR)) && (i32Ret == LL_OK)) { + if ((SPI_MASTER == READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR)) && (i32Ret == LL_OK)) { i32Ret = SPI_WaitStatus(SPIx, SPI_FLAG_IDLE, 0UL, u32Timeout); } @@ -451,7 +451,7 @@ static int32_t SPI_Tx(CM_SPI_TypeDef *SPIx, const void *pvTxBuf, uint32_t u32Len } } - if ((SPI_CR1_MSTR == READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR)) && (i32Ret == LL_OK)) { + if ((SPI_MASTER == READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR)) && (i32Ret == LL_OK)) { i32Ret = SPI_WaitStatus(SPIx, SPI_FLAG_IDLE, 0UL, u32Timeout); } diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_sram.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_sram.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_sram.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_sram.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_swdt.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_swdt.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_swdt.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_swdt.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr0.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_tmr0.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr0.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_tmr0.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr4.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_tmr4.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr4.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_tmr4.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr6.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_tmr6.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr6.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_tmr6.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmra.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_tmra.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmra.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_tmra.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_trng.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_trng.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_trng.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_trng.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_usart.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_usart.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_usart.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_usart.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_usb.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_usb.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_usb.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_usb.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_utility.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_utility.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_utility.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_utility.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_wdt.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_wdt.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32_ll_wdt.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32_ll_wdt.c diff --git a/bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32f460_ll_interrupts_share.c b/bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32f460_ll_interrupts_share.c similarity index 100% rename from bsp/hc32/libraries/hc32f460_ddl/drivers/hc32_ll_driver/src/hc32f460_ll_interrupts_share.c rename to bsp/hc32/libraries/hc32f460_ddl/hc32_ll_driver/src/hc32f460_ll_interrupts_share.c diff --git a/bsp/hc32/libraries/hc32f472_ddl/SConscript b/bsp/hc32/libraries/hc32f472_ddl/SConscript index d46fc97ec98..5537ecf4aaf 100644 --- a/bsp/hc32/libraries/hc32f472_ddl/SConscript +++ b/bsp/hc32/libraries/hc32f472_ddl/SConscript @@ -37,7 +37,7 @@ if GetDepend(['RT_USING_QSPI']): src += ['hc32_ll_driver/src/hc32_ll_qspi.c'] if GetDepend(['RT_USING_CAN']): - src += ['hc32_ll_driver/src/hc32_ll_mcan.c'] + src += ['hc32_ll_driver/src/hc32_ll_can.c'] if GetDepend(['RT_USING_ADC']): src += ['hc32_ll_driver/src/hc32_ll_adc.c'] @@ -84,6 +84,9 @@ if GetDepend(['RT_HWCRYPTO_USING_SHA2']): if GetDepend(['BSP_RTC_USING_XTAL32']) or GetDepend(['RT_USING_PM']): src += ['hc32_ll_driver/src/hc32_ll_fcm.c'] +if GetDepend(['BSP_USING_USBD']) or GetDepend(['BSP_USING_USBH']): + src += ['hc32_ll_driver/src/hc32_ll_usb.c'] + path = [ cwd + '/cmsis/Device/HDSC/hc32f4xx/Include', cwd + '/cmsis/Include', diff --git a/bsp/hc32/libraries/hc32f472_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F472xE.ld b/bsp/hc32/libraries/hc32f472_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F472xE.ld new file mode 100644 index 00000000000..f820dcb48d4 --- /dev/null +++ b/bsp/hc32/libraries/hc32f472_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F472xE.ld @@ -0,0 +1,208 @@ +/****************************************************************************** + * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. + * + * This software component is licensed by XHSC under BSD 3-Clause license + * (the "License"); You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + */ +/*****************************************************************************/ +/* File HC32F472xC.ld */ +/* Abstract Linker script for HC32F472 Device with */ +/* 256KByte FLASH, 68KByte RAM */ +/* Version V1.0 */ +/* Date 2022-06-30 */ +/*****************************************************************************/ + +/* Custom defines, according to section 7.7 of the user manual. + Take OTP sector 16 for example. */ +__OTP_DATA_START = 0x03000000; +__OTP_DATA_SIZE = 2048; +__OTP_LOCK_START = 0x03001840; +__OTP_LOCK_SIZE = 4; + +/* Use contiguous memory regions for simple. */ +MEMORY +{ + FLASH (rx): ORIGIN = 0x00000000, LENGTH = 256K + OTP_DATA (rx): ORIGIN = __OTP_DATA_START, LENGTH = __OTP_DATA_SIZE + OTP_LOCK (rx): ORIGIN = __OTP_LOCK_START, LENGTH = __OTP_LOCK_SIZE + RAM (rwx): ORIGIN = 0x1FFF8000, LENGTH = 64K + RAMB (rwx): ORIGIN = 0x200F0000, LENGTH = 4K +} + +ENTRY(Reset_Handler) + +SECTIONS +{ + .vectors : + { + . = ALIGN(4); + KEEP(*(.vectors)) + . = ALIGN(4); + } >FLASH + + .icg_sec 0x00000400 : + { + KEEP(*(.icg_sec)) + } >FLASH + + .text : + { + . = ALIGN(4); + *(.text) + *(.text*) + *(.glue_7) + *(.glue_7t) + *(.eh_frame) + + KEEP(*(.init)) + KEEP(*(.fini)) + . = ALIGN(4); + } >FLASH + + .rodata : + { + . = ALIGN(4); + *(.rodata) + *(.rodata*) + . = ALIGN(4); + } >FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } >FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } >FLASH + __exidx_end = .; + + .preinit_array : + { + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + + .init_array : + { + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + + .fini_array : + { + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + __etext = ALIGN(4); + + .otp_data_sec : + { + KEEP(*(.otp_data_sec)) + } >OTP_DATA + + .otp_lock_sec : + { + KEEP(*(.otp_lock_sec)) + } >OTP_LOCK + + .data : AT (__etext) + { + . = ALIGN(4); + __data_start__ = .; + *(vtable) + *(.data) + *(.data*) + . = ALIGN(4); + *(.ramfunc) + *(.ramfunc*) + . = ALIGN(4); + __data_end__ = .; + } >RAM + + __etext_ramb = __etext + ALIGN (SIZEOF(.data), 4); + .ramb_data : AT (__etext_ramb) + { + . = ALIGN(4); + __data_start_ramb__ = .; + *(.ramb_data) + *(.ramb_data*) + . = ALIGN(4); + __data_end_ramb__ = .; + } >RAMB + + .bss : + { + . = ALIGN(4); + _sbss = .; + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + _ebss = .; + __bss_end__ = _ebss; + } >RAM + + .ramb_bss : + { + . = ALIGN(4); + __bss_start_ramb__ = .; + *(.ramb_bss) + *(.ramb_bss*) + . = ALIGN(4); + __bss_end_ramb__ = .; + } >RAMB + + .heap_stack (COPY) : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + PROVIDE(_end = .); + *(.heap*) + . = ALIGN(8); + __HeapLimit = .; + + __StackLimit = .; + *(.stack*) + . = ALIGN(8); + __StackTop = .; + } >RAM + + /DISCARD/ : + { + libc.a (*) + libm.a (*) + libgcc.a (*) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } + + PROVIDE(_stack = __StackTop); + PROVIDE(_Min_Heap_Size = __HeapLimit - __HeapBase); + PROVIDE(_Min_Stack_Size = __StackTop - __StackLimit); + + __RamEnd = ORIGIN(RAM) + LENGTH(RAM); + ASSERT(__StackTop <= __RamEnd, "region RAM overflowed with stack") +} diff --git a/bsp/hc32/libraries/hc32f472_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f472.S b/bsp/hc32/libraries/hc32f472_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f472.S index 2cb451db7aa..d6f5122fb06 100644 --- a/bsp/hc32/libraries/hc32f472_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f472.S +++ b/bsp/hc32/libraries/hc32f472_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f472.S @@ -386,7 +386,7 @@ ClearLoop1: /* Call the clock system initialization function. */ bl SystemInit /* Call the application's entry point. */ - bl main + bl entry bx lr .size Reset_Handler, . - Reset_Handler /* diff --git a/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/inc/hc32_ll_efm.h b/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/inc/hc32_ll_efm.h index 57a48756457..569c5c599da 100644 --- a/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/inc/hc32_ll_efm.h +++ b/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/inc/hc32_ll_efm.h @@ -243,7 +243,7 @@ typedef struct { * @defgroup EFM_Sector_Size EFM Sector Size * @{ */ -#define SECTOR_SIZE (0x2000UL) +#define EFM_SECTOR_SIZE (0x2000UL) /** * @} */ @@ -252,7 +252,7 @@ typedef struct { * @defgroup EFM_Sector_Address EFM Sector Address * @{ */ -#define EFM_SECTOR_ADDR(x) (uint32_t)(SECTOR_SIZE * (x)) +#define EFM_SECTOR_ADDR(x) (uint32_t)(EFM_SECTOR_SIZE * (x)) /** * @} */ diff --git a/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/inc/hc32_ll_rtc.h b/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/inc/hc32_ll_rtc.h index c12b2cdc3ff..ad709c60381 100644 --- a/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/inc/hc32_ll_rtc.h +++ b/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/inc/hc32_ll_rtc.h @@ -158,6 +158,7 @@ typedef struct { #define RTC_CLK_SRC_LRC (RTC_CR3_RCKSEL | RTC_CR3_LRCEN) /*!< RTC LRC Clock */ #define RTC_CLK_SRC_XTAL_DIV (RTC_CR3_RCKSEL | PWC_PWRC6_RTCCKSEL_0) /*!< XTAL Fractional Divider */ #define RTC_CLK_SRC_EXTCLK (RTC_CR3_RCKSEL | PWC_PWRC6_RTCCKSEL_1) /*!< External Clock */ +#define RTC_CLK_SRC_EXTCLK_1 (RTC_CR3_RCKSEL | PWC_PWRC6_RTCCKSEL) /*!< External Clock */ /** * @} */ diff --git a/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/src/hc32_ll_rtc.c b/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/src/hc32_ll_rtc.c index a359d9d647b..a8bc7be95dc 100644 --- a/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/src/hc32_ll_rtc.c +++ b/bsp/hc32/libraries/hc32f472_ddl/hc32_ll_driver/src/hc32_ll_rtc.c @@ -52,6 +52,9 @@ * @{ */ +/* RTC CR2 & TPSR flag mask */ +#define RTC_CR2_FLAG_MASK (RTC_CR2_ALMF | RTC_CR2_PRDF) + /* RTC software reset timeout(ms) */ #define RTC_SW_RST_TIMEOUT (100UL) /* RTC mode switch timeout(ms) */ @@ -69,6 +72,7 @@ ( ((x) == RTC_CLK_SRC_XTAL32) || \ ((x) == RTC_CLK_SRC_LRC) || \ ((x) == RTC_CLK_SRC_EXTCLK) || \ + ((x) == RTC_CLK_SRC_EXTCLK_1) || \ ((x) == RTC_CLK_SRC_XTAL_DIV)) #define IS_RTC_HOUR_FMT(x) \ @@ -275,7 +279,7 @@ int32_t RTC_EnterRwMode(void) /* Mode switch when RTC is running */ if (0UL != READ_REG32(bCM_RTC->CR1_b.START)) { if (1UL != READ_REG32(bCM_RTC->CR2_b.RWEN)) { - WRITE_REG32(bCM_RTC->CR2_b.RWREQ, SET); + SET_REG8_BIT(CM_RTC->CR2, RTC_CR2_RWREQ | RTC_CR2_FLAG_MASK); /* Waiting for RWEN bit set */ u32Count = RTC_MD_SWITCH_TIMEOUT * (HCLK_VALUE / 20000UL); while (1UL != READ_REG32(bCM_RTC->CR2_b.RWEN)) { @@ -306,7 +310,7 @@ int32_t RTC_ExitRwMode(void) /* Mode switch when RTC is running */ if (0UL != READ_REG32(bCM_RTC->CR1_b.START)) { if (0UL != READ_REG32(bCM_RTC->CR2_b.RWEN)) { - WRITE_REG32(bCM_RTC->CR2_b.RWREQ, RESET); + MODIFY_REG8(CM_RTC->CR2, (RTC_CR2_RWREQ | RTC_CR2_FLAG_MASK), ~RTC_CR2_RWREQ); /* Waiting for RWEN bit reset */ u32Count = RTC_MD_SWITCH_TIMEOUT * (HCLK_VALUE / 20000UL); while (0UL != READ_REG32(bCM_RTC->CR2_b.RWEN)) { @@ -336,7 +340,7 @@ int32_t RTC_ConfirmLPMCond(void) /* Check RTC work status */ if (0UL != READ_REG32(bCM_RTC->CR1_b.START)) { - WRITE_REG32(bCM_RTC->CR2_b.RWREQ, SET); + SET_REG8_BIT(CM_RTC->CR2, RTC_CR2_RWREQ | RTC_CR2_FLAG_MASK); /* Waiting for RTC RWEN bit set */ u32Count = RTC_MD_SWITCH_TIMEOUT * (HCLK_VALUE / 20000UL); while (1UL != READ_REG32(bCM_RTC->CR2_b.RWEN)) { @@ -348,7 +352,7 @@ int32_t RTC_ConfirmLPMCond(void) } if (LL_OK == i32Ret) { - WRITE_REG32(bCM_RTC->CR2_b.RWREQ, RESET); + MODIFY_REG8(CM_RTC->CR2, (RTC_CR2_RWREQ | RTC_CR2_FLAG_MASK), ~RTC_CR2_RWREQ); /* Waiting for RTC RWEN bit reset */ u32Count = RTC_MD_SWITCH_TIMEOUT * (HCLK_VALUE / 20000UL); while (0UL != READ_REG32(bCM_RTC->CR2_b.RWEN)) { @@ -389,15 +393,15 @@ void RTC_SetIntPeriod(uint8_t u8Period) u32IntSta = READ_REG32(bCM_RTC->CR2_b.PRDIE); /* Disable period interrupt when START=1 and clear period flag after write */ if ((0UL != u32IntSta) && (0UL != u32RtcSta)) { - WRITE_REG32(bCM_RTC->CR2_b.PRDIE, RESET); + MODIFY_REG8(CM_RTC->CR2, (RTC_CR2_PRDIE | RTC_CR2_FLAG_MASK), ~RTC_CR2_PRDIE); } /* RTC CR1 Configuration */ MODIFY_REG8(CM_RTC->CR1, RTC_CR1_PRDS, u8Period); - WRITE_REG32(bCM_RTC->CR2_b.PRDF, RESET); + MODIFY_REG8(CM_RTC->CR2, RTC_CR2_FLAG_MASK, ~RTC_CR2_PRDF); if ((0UL != u32IntSta) && (0UL != u32RtcSta)) { - WRITE_REG32(bCM_RTC->CR2_b.PRDIE, SET); + SET_REG8_BIT(CM_RTC->CR2, RTC_CR2_PRDIE | RTC_CR2_FLAG_MASK); } } @@ -849,7 +853,11 @@ void RTC_AlarmCmd(en_functional_state_t enNewState) /* Check parameters */ DDL_ASSERT(IS_FUNCTIONAL_STATE(enNewState)); - WRITE_REG32(bCM_RTC->CR2_b.ALME, enNewState); + if (enNewState == ENABLE) { + SET_REG8_BIT(CM_RTC->CR2, RTC_CR2_ALME | RTC_CR2_FLAG_MASK); + } else { + MODIFY_REG8(CM_RTC->CR2, (RTC_CR2_ALME | RTC_CR2_FLAG_MASK), ~RTC_CR2_ALME); + } } /** @@ -871,9 +879,9 @@ void RTC_IntCmd(uint32_t u32IntType, en_functional_state_t enNewState) u32IntTemp = u32IntType & 0x0000FFUL; if (0UL != u32IntTemp) { if (DISABLE != enNewState) { - SET_REG8_BIT(CM_RTC->CR2, u32IntTemp); + SET_REG8_BIT(CM_RTC->CR2, u32IntTemp | RTC_CR2_FLAG_MASK); } else { - CLR_REG8_BIT(CM_RTC->CR2, u32IntTemp); + MODIFY_REG8(CM_RTC->CR2, (u32IntTemp | RTC_CR2_FLAG_MASK), ~u32IntTemp); } } @@ -922,7 +930,7 @@ void RTC_ClearStatus(uint32_t u32Flag) u8FlagTemp = (uint8_t)(u32Flag & 0xFFU); if (0U != u8FlagTemp) { - CLR_REG8_BIT(CM_RTC->CR2, u8FlagTemp); + MODIFY_REG8(CM_RTC->CR2, RTC_CR2_FLAG_MASK, ~u8FlagTemp); } } diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/README.txt b/bsp/hc32/libraries/hc32f4a0_ddl/README.txt deleted file mode 100644 index 3fd6873191c..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -version date comment - 2.0.0 - Mar 31, 2022 Initial release. -EOF diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/SConscript b/bsp/hc32/libraries/hc32f4a0_ddl/SConscript index b628617512c..770f08341b2 100644 --- a/bsp/hc32/libraries/hc32f4a0_ddl/SConscript +++ b/bsp/hc32/libraries/hc32f4a0_ddl/SConscript @@ -7,104 +7,107 @@ cwd = GetCurrentDir() # The set of source files associated with this SConscript file. src = Split(''' -drivers/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f4a0.c -drivers/hc32_ll_driver/src/hc32_ll.c -drivers/hc32_ll_driver/src/hc32_ll_aos.c -drivers/hc32_ll_driver/src/hc32_ll_clk.c -drivers/hc32_ll_driver/src/hc32_ll_dma.c -drivers/hc32_ll_driver/src/hc32_ll_efm.c -drivers/hc32_ll_driver/src/hc32_ll_fcg.c -drivers/hc32_ll_driver/src/hc32_ll_gpio.c -drivers/hc32_ll_driver/src/hc32_ll_icg.c -drivers/hc32_ll_driver/src/hc32_ll_interrupts.c -drivers/hc32_ll_driver/src/hc32_ll_pwc.c -drivers/hc32_ll_driver/src/hc32_ll_rmu.c -drivers/hc32_ll_driver/src/hc32_ll_sram.c -drivers/hc32_ll_driver/src/hc32_ll_utility.c -drivers/hc32_ll_driver/src/hc32f4a0_ll_interrupts_share.c +cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f4a0.c +hc32_ll_driver/src/hc32_ll.c +hc32_ll_driver/src/hc32_ll_aos.c +hc32_ll_driver/src/hc32_ll_clk.c +hc32_ll_driver/src/hc32_ll_dma.c +hc32_ll_driver/src/hc32_ll_efm.c +hc32_ll_driver/src/hc32_ll_fcg.c +hc32_ll_driver/src/hc32_ll_gpio.c +hc32_ll_driver/src/hc32_ll_icg.c +hc32_ll_driver/src/hc32_ll_interrupts.c +hc32_ll_driver/src/hc32_ll_pwc.c +hc32_ll_driver/src/hc32_ll_rmu.c +hc32_ll_driver/src/hc32_ll_sram.c +hc32_ll_driver/src/hc32_ll_utility.c +hc32_ll_driver/src/hc32f4a0_ll_interrupts_share.c ''') if GetDepend(['BSP_USING_NAND']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_nfc.c'] + src += ['hc32_ll_driver/src/hc32_ll_nfc.c'] if GetDepend(['BSP_USING_SDRAM']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_dmc.c'] + src += ['hc32_ll_driver/src/hc32_ll_dmc.c'] if GetDepend(['RT_USING_SERIAL']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_usart.c'] - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmr0.c'] + src += ['hc32_ll_driver/src/hc32_ll_usart.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmr0.c'] if GetDepend(['RT_USING_I2C']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_i2c.c'] + src += ['hc32_ll_driver/src/hc32_ll_i2c.c'] if GetDepend(['RT_USING_SPI']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_spi.c'] + src += ['hc32_ll_driver/src/hc32_ll_spi.c'] if GetDepend(['RT_USING_QSPI']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_qspi.c'] + src += ['hc32_ll_driver/src/hc32_ll_qspi.c'] if GetDepend(['RT_USING_CAN']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_can.c'] + src += ['hc32_ll_driver/src/hc32_ll_can.c'] if GetDepend(['BSP_USING_ETH']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_eth.c'] + src += ['hc32_ll_driver/src/hc32_ll_eth.c'] if GetDepend(['RT_USING_ADC']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_adc.c'] + src += ['hc32_ll_driver/src/hc32_ll_adc.c'] if GetDepend(['RT_USING_DAC']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_dac.c'] + src += ['hc32_ll_driver/src/hc32_ll_dac.c'] if GetDepend(['RT_USING_RTC']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_rtc.c'] + src += ['hc32_ll_driver/src/hc32_ll_rtc.c'] if GetDepend(['RT_USING_WDT']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_swdt.c'] - src += ['drivers/hc32_ll_driver/src/hc32_ll_wdt.c'] + src += ['hc32_ll_driver/src/hc32_ll_swdt.c'] + src += ['hc32_ll_driver/src/hc32_ll_wdt.c'] if GetDepend(['RT_USING_SDIO']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_sdioc.c'] + src += ['hc32_ll_driver/src/hc32_ll_sdioc.c'] if GetDepend(['RT_USING_ON_CHIP_FLASH']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_efm.c'] + src += ['hc32_ll_driver/src/hc32_ll_efm.c'] if GetDepend(['RT_USING_HWTIMER']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmr2.c'] - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmr4.c'] - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmr6.c'] - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmra.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmr2.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmr4.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmr6.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmra.c'] if GetDepend(['RT_USING_PULSE_ENCODER']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmr6.c'] - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmra.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmr6.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmra.c'] if GetDepend(['RT_USING_PWM']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmr4.c'] - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmr6.c'] - src += ['drivers/hc32_ll_driver/src/hc32_ll_tmra.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmr4.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmr6.c'] + src += ['hc32_ll_driver/src/hc32_ll_tmra.c'] + +if GetDepend(['RT_USING_INPUT_CAPTURE']): + src += ['hc32_ll_driver/src/hc32_ll_tmr6.c'] if GetDepend(['RT_HWCRYPTO_USING_RNG']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_trng.c'] + src += ['hc32_ll_driver/src/hc32_ll_trng.c'] if GetDepend(['RT_HWCRYPTO_USING_CRC']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_crc.c'] + src += ['hc32_ll_driver/src/hc32_ll_crc.c'] if GetDepend(['RT_HWCRYPTO_USING_AES']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_aes.c'] + src += ['hc32_ll_driver/src/hc32_ll_aes.c'] if GetDepend(['RT_HWCRYPTO_USING_SHA2']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_hash.c'] + src += ['hc32_ll_driver/src/hc32_ll_hash.c'] if GetDepend(['BSP_USING_USBD']) or GetDepend(['BSP_USING_USBH']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_usb.c'] + src += ['hc32_ll_driver/src/hc32_ll_usb.c'] if GetDepend(['BSP_RTC_USING_XTAL32']) or GetDepend(['RT_USING_PM']): - src += ['drivers/hc32_ll_driver/src/hc32_ll_fcm.c'] + src += ['hc32_ll_driver/src/hc32_ll_fcm.c'] path = [ - cwd + '/drivers/cmsis/Device/HDSC/hc32f4xx/Include', - cwd + '/drivers/cmsis/Include', - cwd + '/drivers/hc32_ll_driver/inc',] + cwd + '/cmsis/Device/HDSC/hc32f4xx/Include', + cwd + '/cmsis/Include', + cwd + '/hc32_ll_driver/inc',] CPPDEFINES = ['USE_DDL_DRIVER'] diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4a0.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4a0.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4a0.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4a0.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4xx.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4xx.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4xx.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Include/hc32f4xx.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/system_hc32f4a0.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Include/system_hc32f4a0.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Include/system_hc32f4a0.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Include/system_hc32f4a0.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_1M.FLM b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_1M.FLM similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_1M.FLM rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_1M.FLM diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_2M.FLM b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_2M.FLM similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_2M.FLM rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_2M.FLM diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_0.FLM b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_0.FLM similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_0.FLM rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_0.FLM diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_1.FLM b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_1.FLM similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_1.FLM rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_512K_1.FLM diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_RAM.FLM b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_RAM.FLM similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_RAM.FLM rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_RAM.FLM diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_otp.FLM b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_otp.FLM similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_otp.FLM rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/HC32F4A0_otp.FLM diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/ram.ini b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/ram.ini similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/ram.ini rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/flashloader/ram.ini diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HC32F4A0.SFR b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HC32F4A0.SFR similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HC32F4A0.SFR rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HC32F4A0.SFR diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f4a0.s b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f4a0.s similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f4a0.s rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/ARM/startup_hc32f4a0.s diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xG.ld b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xG.ld similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xG.ld rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xG.ld diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xI.ld b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xI.ld similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xI.ld rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/linker/HC32F4A0xI.ld diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f4a0.S b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f4a0.S similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f4a0.S rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/startup_hc32f4a0.S diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HC32F4A0.svd b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HC32F4A0.svd similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HC32F4A0.svd rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/GCC/svd/HC32F4A0.svd diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0.mac b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.mac similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0.mac rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.mac diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.out b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.out similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.out rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.out diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.flash b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.flash new file mode 100644 index 00000000000..898240cdbee --- /dev/null +++ b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.flash @@ -0,0 +1,10 @@ + + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0_otp.out + 4 + 1 0x1800 + 0x03000000 + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.mac + 0 + diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.out b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.out similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.out rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_otp.out diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_qspi.flash b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_qspi.flash similarity index 60% rename from bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_qspi.flash rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_qspi.flash index 300fef50bd8..3a24a074c6d 100644 --- a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_qspi.flash +++ b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_qspi.flash @@ -1,7 +1,7 @@ - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_qspi.out + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0_qspi.out 256 2048 0x1000 0x98000000 diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_qspi.out b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_qspi.out similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_qspi.out rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0_qspi.out diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xG.board b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xG.board new file mode 100644 index 00000000000..6ca41c2d6c0 --- /dev/null +++ b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xG.board @@ -0,0 +1,18 @@ + + + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0xG.flash + CODE 0x0 0xFFFFF + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0_otp.flash + CODE 0x03000000 0x030017FF + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0_qspi.flash + CODE 0x98000000 0x987FFFFF + + + + diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xG.flash b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xG.flash new file mode 100644 index 00000000000..f0e4609cf52 --- /dev/null +++ b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xG.flash @@ -0,0 +1,10 @@ + + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.out + 4 + 128 0x2000 + 0x00000000 + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.mac + 0 + diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xI.board b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xI.board new file mode 100644 index 00000000000..7013227a5ef --- /dev/null +++ b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xI.board @@ -0,0 +1,18 @@ + + + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0xI.flash + CODE 0x0 0x1FFFFF + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0_otp.flash + CODE 0x03000000 0x030017FF + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0_qspi.flash + CODE 0x98000000 0x987FFFFF + + + + diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xI.flash b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xI.flash new file mode 100644 index 00000000000..2b138d18aeb --- /dev/null +++ b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0xI.flash @@ -0,0 +1,10 @@ + + + + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.out + 4 + 256 0x2000 + 0x00000000 + $PROJ_DIR$\..\libraries\hc32f4a0_ddl\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.mac + 0 + diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0_RAM.icf b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0_RAM.icf similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0_RAM.icf rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0_RAM.icf diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xG.icf b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xG.icf similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xG.icf rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xG.icf diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xI.icf b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xI.icf similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xI.icf rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/linker/HC32F4A0xI.icf diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f4a0.s b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f4a0.s similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f4a0.s rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/startup_hc32f4a0.s diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HC32F4A0.svd b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HC32F4A0.svd similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HC32F4A0.svd rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HC32F4A0.svd diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f4a0.c b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f4a0.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f4a0.c rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Device/HDSC/hc32f4xx/Source/system_hc32f4a0.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_common_tables.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_common_tables.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_common_tables.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_common_tables.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_const_structs.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_const_structs.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_const_structs.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_const_structs.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_helium_utils.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_helium_utils.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_helium_utils.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_helium_utils.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_math.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_math.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_math.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_math.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_mve_tables.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_mve_tables.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_mve_tables.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_mve_tables.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_vec_math.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_vec_math.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/arm_vec_math.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/arm_vec_math.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cachel1_armv7.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cachel1_armv7.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cachel1_armv7.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cachel1_armv7.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_armcc.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_armcc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_armcc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_armcc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_armclang.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_armclang.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_armclang.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_armclang.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_armclang_ltm.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_armclang_ltm.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_armclang_ltm.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_armclang_ltm.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_compiler.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_compiler.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_compiler.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_compiler.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_gcc.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_gcc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_gcc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_gcc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_iccarm.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_iccarm.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_iccarm.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_iccarm.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_version.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_version.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/cmsis_version.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/cmsis_version.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_armv81mml.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_armv81mml.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_armv81mml.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_armv81mml.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_armv8mbl.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_armv8mbl.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_armv8mbl.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_armv8mbl.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_armv8mml.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_armv8mml.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_armv8mml.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_armv8mml.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm0.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm0.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm0.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm0.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm0plus.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm0plus.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm0plus.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm0plus.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm1.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm1.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm1.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm1.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm23.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm23.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm23.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm23.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm3.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm3.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm3.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm3.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm33.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm33.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm33.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm33.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm35p.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm35p.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm35p.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm35p.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm4.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm4.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm4.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm4.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm55.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm55.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm55.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm55.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm7.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm7.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_cm7.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_cm7.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_sc000.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_sc000.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_sc000.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_sc000.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_sc300.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_sc300.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/core_sc300.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/core_sc300.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/mpu_armv7.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/mpu_armv7.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/mpu_armv7.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/mpu_armv7.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/mpu_armv8.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/mpu_armv8.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/mpu_armv8.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/mpu_armv8.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/pmu_armv8.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/pmu_armv8.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/pmu_armv8.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/pmu_armv8.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/tz_context.h b/bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/tz_context.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Include/tz_context.h rename to bsp/hc32/libraries/hc32f4a0_ddl/cmsis/Include/tz_context.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0.out b/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0.out deleted file mode 100644 index f4a726caf984f5e6fdf36d546e59dc31ff670271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47100 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 Z^|U0BO~`oxIAps|kzN2_k~qQl{{V4w^-KT& diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_otp.flash b/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_otp.flash deleted file mode 100644 index c53fb237ff5..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_otp.flash +++ /dev/null @@ -1,10 +0,0 @@ - - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\drivers\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0_otp.out - 4 - 1 0x1800 - 0x03000000 - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\drivers\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.mac - 0 - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_otp.out b/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0_otp.out deleted file mode 100644 index 47da8bd591fe66d8b07193a112340034e72698b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47280 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 ftGugFPfOw~;)>|Bb0)IguSmCpkNO - - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0xG.flash - CODE 0x0 0xFFFFF - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_otp.flash - CODE 0x03000000 0x030017FF - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_qspi.flash - CODE 0x98000000 0x987FFFFF - - - - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xG.flash b/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xG.flash deleted file mode 100644 index d6b902bd6fc..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xG.flash +++ /dev/null @@ -1,10 +0,0 @@ - - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\drivers\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.out - 4 - 128 0x2000 - 0x00000000 - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\drivers\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.mac - 0 - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xI.board b/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xI.board deleted file mode 100644 index 975988a4693..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xI.board +++ /dev/null @@ -1,18 +0,0 @@ - - - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0xI.flash - CODE 0x0 0x1FFFFF - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_otp.flash - CODE 0x03000000 0x030017FF - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_qspi.flash - CODE 0x98000000 0x987FFFFF - - - - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xI.flash b/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xI.flash deleted file mode 100644 index c706527593e..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/FlashHC32F4A0xI.flash +++ /dev/null @@ -1,10 +0,0 @@ - - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\drivers\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.out - 4 - 256 0x2000 - 0x00000000 - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\drivers\cmsis\Device\HDSC\hc32f4xx\Source\IAR\flashloader\FlashHC32F4A0.mac - 0 - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/HC32F4A0xG.board b/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/HC32F4A0xG.board deleted file mode 100644 index 35e75b17dab..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/HC32F4A0xG.board +++ /dev/null @@ -1,18 +0,0 @@ - - - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0xG.flash - CODE 0x0 0xFFFFF - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_otp.flash - CODE 0x03000000 0x030017FF - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_qspi.flash - CODE 0x98000000 0x987FFFFF - - - - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/HC32F4A0xI.board b/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/HC32F4A0xI.board deleted file mode 100644 index 975988a4693..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/config/flashloader/HC32F4A0xI.board +++ /dev/null @@ -1,18 +0,0 @@ - - - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0xI.flash - CODE 0x0 0x1FFFFF - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_otp.flash - CODE 0x03000000 0x030017FF - - - $PROJ_DIR$\..\libraries\hc32f4a0_ddl\config\flashloader\FlashHC32F4A0_qspi.flash - CODE 0x98000000 0x987FFFFF - - - - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/24cxx/24cxx.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/24cxx/24cxx.c deleted file mode 100644 index b8a6a0474ff..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/24cxx/24cxx.c +++ /dev/null @@ -1,255 +0,0 @@ -/** - ******************************************************************************* - * @file 24cxx.c - * @brief This midware file provides firmware functions to 24cxx EEPROM. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "24cxx.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @defgroup 24CXX EEPROM Driver for 24CXX - * @{ - */ - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -#define EE_24CXX_WAIT_TIMEOUT (0x20000UL) - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -static uint32_t u32PageSize; -static uint32_t u32Capacity; - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ - -/** - * @defgroup 24CXX_Global_Functions 24CXX Global Functions - * @{ - */ - -/** - * @brief Initializes I2C for 24CXX. - * @param [in] pstc24cxxLL Pointer to a @ref stc_24cxx_ll_t structure. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t EE_24CXX_Init(const stc_24cxx_ll_t *pstc24cxxLL) -{ - int32_t i32Ret; - if ((pstc24cxxLL == NULL) || (pstc24cxxLL->u32PageSize == 0U) || (pstc24cxxLL->u32Capacity == 0U)) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - u32PageSize = pstc24cxxLL->u32PageSize; - u32Capacity = pstc24cxxLL->u32Capacity; - i32Ret = pstc24cxxLL->Init(); - } - return i32Ret; -} - -/** - * @brief De-Initializes I2C for 24CXX. - * @param [in] pstc24cxxLL Pointer to a @ref stc_24cxx_ll_t structure. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t EE_24CXX_DeInit(const stc_24cxx_ll_t *pstc24cxxLL) -{ - int32_t i32Ret = LL_OK; - if (pstc24cxxLL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - pstc24cxxLL->DeInit(); - } - return i32Ret; -} - -/** - * @brief 24CXX read data. - * @param [in] pstc24cxxLL Pointer to a @ref stc_24cxx_ll_t structure. - * @param [in] u16Addr: The start address of the data to be read. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be stored. - * @param [in] u32Len: Buffer size in byte. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -int32_t EE_24CXX_Read(const stc_24cxx_ll_t *pstc24cxxLL, uint16_t u16Addr, uint8_t *pu8Buf, uint32_t u32Len) -{ - int32_t i32Ret; - - if ((u16Addr + u32Len) > u32Capacity) { - i32Ret = LL_ERR; - } else { - i32Ret = pstc24cxxLL->Read(u16Addr, pu8Buf, u32Len); - } - return i32Ret; -} - -/** - * @brief 24CXX write data. - * @param [in] pstc24cxxLL Pointer to a @ref stc_24cxx_ll_t structure. - * @param [in] u16Addr: The start address of the data to be write. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be write. - * @param [in] u32Len: Buffer size in byte. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -int32_t EE_24CXX_Write(const stc_24cxx_ll_t *pstc24cxxLL, uint16_t u16Addr, const uint8_t *pu8Buf, uint32_t u32Len) -{ - uint32_t u32PageNum; - uint8_t u8SingleNumStart; - uint8_t u8SingleNumEnd; - uint32_t u32NumRemainTemp = u32Len; - uint32_t u32WriteOffset = 0UL; - uint16_t u16WriteAddrTemp = u16Addr; - int32_t i32Ret = LL_OK; - uint32_t i; - - if (((u16Addr + u32Len) > u32Capacity) || (u32PageSize == 0U)) { - return LL_ERR; - } - - /* If start write address is align with page size */ - if (0U == (u16WriteAddrTemp % u32PageSize)) { - /* If Write number is less than page size */ - if (u32Len < u32PageSize) { - u8SingleNumStart = (uint8_t)u32Len; - } else { - /* If Write number is more than page size */ - u8SingleNumStart = 0U; - } - u32NumRemainTemp -= (uint32_t)u8SingleNumStart; - } else { - /* If start write address is not align with page size */ - u8SingleNumStart = (uint8_t)(u32PageSize - (u16WriteAddrTemp % u32PageSize)); - if ((uint32_t)u8SingleNumStart > u32Len) { - u8SingleNumStart = (uint8_t)u32Len; - } - u32NumRemainTemp -= (uint32_t)u8SingleNumStart; - } - - u32PageNum = u32NumRemainTemp / u32PageSize; - u8SingleNumEnd = (uint8_t)(u32NumRemainTemp % u32PageSize); - - if (0UL != u8SingleNumStart) { - i32Ret = pstc24cxxLL->WritePage(u16WriteAddrTemp, &pu8Buf[u32WriteOffset], (uint32_t)u8SingleNumStart); - /* Delay about 5ms for EEPROM */ - pstc24cxxLL->Delay(5000U); - u16WriteAddrTemp += u8SingleNumStart; - u32WriteOffset += (uint32_t)u8SingleNumStart; - } - - if (LL_OK == i32Ret) { - if (0UL != u32PageNum) { - for (i = 0UL; i < u32PageNum; i++) { - i32Ret = pstc24cxxLL->WritePage(u16WriteAddrTemp, &pu8Buf[u32WriteOffset], u32PageSize); - /* Delay about 5ms for EEPROM */ - pstc24cxxLL->Delay(5000U); - u16WriteAddrTemp += (uint16_t)u32PageSize; - u32WriteOffset += u32PageSize; - if (LL_OK != i32Ret) { - break; - } - } - } - - if (LL_OK == i32Ret) { - if (0UL != u8SingleNumEnd) { - i32Ret = pstc24cxxLL->WritePage(u16WriteAddrTemp, &pu8Buf[u32WriteOffset], (uint32_t)u8SingleNumEnd); - /* Delay about 5ms for EEPROM */ - pstc24cxxLL->Delay(5000U); - } - } - } - return i32Ret; -} - -/** - * @brief 24CXX wait idle. - * @param [in] pstc24cxxLL Pointer to a @ref stc_24cxx_ll_t structure. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR_TIMEOUT: Failed - */ -int32_t EE_24CXX_WaitIdle(const stc_24cxx_ll_t *pstc24cxxLL) -{ - int32_t i32Ret = LL_OK; - volatile uint32_t u32Tmp = 0UL; - while (LL_OK != pstc24cxxLL->GetStatus()) { - if (EE_24CXX_WAIT_TIMEOUT == u32Tmp++) { - i32Ret = LL_ERR_TIMEOUT; - break; - } - } - return i32Ret; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/24cxx/24cxx.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/24cxx/24cxx.h deleted file mode 100644 index e4ad6a8cf43..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/24cxx/24cxx.h +++ /dev/null @@ -1,112 +0,0 @@ -/** - ******************************************************************************* - * @file 24cxx.h - * @brief This file provides firmware functions to 24CXX EEPROM. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __24CXX_H__ -#define __24CXX_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_def.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @addtogroup 24CXX - * @{ - */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ -/** - * @brief 24CXX low layer structure definition - */ -typedef struct { - /* Properties */ - uint32_t u32PageSize; - uint32_t u32Capacity; - /* Methods */ - void (*Delay)(uint32_t); - int32_t (*Init)(void); - void (*DeInit)(void); - int32_t (*WritePage)(uint16_t u16Addr, const uint8_t *pu8Buf, uint32_t u32Len); - int32_t (*Read)(uint16_t u16Addr, uint8_t *pu8Buf, uint32_t u32Len); - int32_t (*GetStatus)(void); -} stc_24cxx_ll_t; - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup 24CXX_Global_Functions 24CXX Global Functions - * @{ - */ -int32_t EE_24CXX_Init(const stc_24cxx_ll_t *pstc24cxxLL); -int32_t EE_24CXX_DeInit(const stc_24cxx_ll_t *pstc24cxxLL); -int32_t EE_24CXX_Read(const stc_24cxx_ll_t *pstc24cxxLL, uint16_t u16Addr, uint8_t *pu8Buf, uint32_t u32Len); -int32_t EE_24CXX_Write(const stc_24cxx_ll_t *pstc24cxxLL, uint16_t u16Addr, const uint8_t *pu8Buf, uint32_t u32Len); -int32_t EE_24CXX_WaitIdle(const stc_24cxx_ll_t *pstc24cxxLL); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __24CXX_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/gt9xx/gt9xx.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/gt9xx/gt9xx.c deleted file mode 100644 index ee9d6914e31..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/gt9xx/gt9xx.c +++ /dev/null @@ -1,182 +0,0 @@ -/** - ******************************************************************************* - * @file gt9xx.c - * @brief This file provides firmware functions for Touch Pad GT9XX. - @verbatim - Change Logs: - Date Author Notes - 2022-12-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "gt9xx.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @defgroup GT9XX Touch Pad GT9XX - * @{ - */ - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ - -/** - * @defgroup GT9XX_Global_Functions GT9XX Global Functions - * @{ - */ - -/** - * @brief Read register on touch pad register. - * @param [in] pstcGt9xxLL Pointer to a @ref stc_gt9xx_ll_t structure - * @param [in] u16Reg Register to be read - * @param [out] pu8RegValue The buffer for reading - * @param [in] u32Len The buffer size for bytes - * @retval None - */ -void GT9XX_REG_Read(const stc_gt9xx_ll_t *pstcGt9xxLL, uint16_t u16Reg, uint8_t *pu8RegValue, uint32_t u32Len) -{ - uint8_t au8RegAddr[2]; - - if ((NULL != pstcGt9xxLL) && (NULL != pstcGt9xxLL->Read)) { - au8RegAddr[0] = (uint8_t)((u16Reg & 0xFF00U) >> 8); - au8RegAddr[1] = (uint8_t)(u16Reg & 0x00FFU); - (void)pstcGt9xxLL->Read(au8RegAddr, ARRAY_SZ(au8RegAddr), pu8RegValue, u32Len); - } -} - -/** - * @brief Write register on touch pad register. - * @param [in] pstcGt9xxLL Pointer to a @ref stc_gt9xx_ll_t structure - * @param [in] u16Reg Register to be write - * @param [in] pu8RegValue The buffer for writing - * @param [in] u32Len The buffer size for bytes - * @retval None - */ -void GT9XX_REG_Write(const stc_gt9xx_ll_t *pstcGt9xxLL, uint16_t u16Reg, const uint8_t *pu8RegValue, uint32_t u32Len) -{ - uint8_t au8RegAddr[2]; - - if ((NULL != pstcGt9xxLL) && (NULL != pstcGt9xxLL->Write)) { - au8RegAddr[0] = (uint8_t)((u16Reg & 0xFF00U) >> 8); - au8RegAddr[1] = (uint8_t)(u16Reg & 0x00FFU); - (void)pstcGt9xxLL->Write(au8RegAddr, ARRAY_SZ(au8RegAddr), pu8RegValue, u32Len); - } -} - -/** - * @brief Reset GT9XX. - * @param [in] pstcGt9xxLL Pointer to a @ref stc_gt9xx_ll_t structure. - * @retval None - */ -void GT9XX_SoftReset(const stc_gt9xx_ll_t *pstcGt9xxLL) -{ - uint8_t u8RegValue = 0x02U; - - GT9XX_REG_Write(pstcGt9xxLL, GT9XX_COMMAND, &u8RegValue, 1UL); -} - -/** - * @brief Read GT9XX touch status. - * @param [in] pstcGt9xxLL Pointer to a @ref stc_gt9xx_ll_t structure. - * @retval Touch status - */ -uint8_t GT9XX_ReadTouchStatus(const stc_gt9xx_ll_t *pstcGt9xxLL) -{ - uint8_t u8Status = 0U; - - GT9XX_REG_Read(pstcGt9xxLL, GT9XX_TOUCH_STATUS, &u8Status, 1UL); - return u8Status; -} - -/** - * @brief Read GT9XX ID. - * @param [in] pstcGt9xxLL Pointer to a @ref stc_gt9xx_ll_t structure. - * @param [out] pu8IDValue The buffer for reading ID - * @param [in] u32Len The buffer size for bytes - * @retval None - */ -void GT9XX_ReadProductID(const stc_gt9xx_ll_t *pstcGt9xxLL, uint8_t *pu8IDValue, uint32_t u32Len) -{ - GT9XX_REG_Read(pstcGt9xxLL, GT9XX_PRODUCT_ID, pu8IDValue, u32Len); -} - -/** - * @brief Read GT9XX point. - * @param [in] pstcGt9xxLL Pointer to a @ref stc_gt9xx_ll_t structure. - * @param [in] u16Point Touch pad point - * @param [out] pu16X Point x coordinate - * @param [out] pu16Y Point y coordinate - * @retval None - */ -void GT9XX_GetXY(const stc_gt9xx_ll_t *pstcGt9xxLL, uint16_t u16Point, uint16_t *pu16X, uint16_t *pu16Y) -{ - uint8_t au8Tmp[4]; - - if ((pu16X != NULL) && (pu16Y != NULL)) { - GT9XX_REG_Read(pstcGt9xxLL, u16Point, au8Tmp, 4UL); - (*pu16X) = (uint16_t)au8Tmp[0] | ((uint16_t)au8Tmp[1] << 8); - (*pu16Y) = (uint16_t)au8Tmp[2] | ((uint16_t)au8Tmp[3] << 8); - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/gt9xx/gt9xx.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/gt9xx/gt9xx.h deleted file mode 100644 index 83a4792ad43..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/gt9xx/gt9xx.h +++ /dev/null @@ -1,150 +0,0 @@ -/** - ******************************************************************************* - * @file gt9XX.h - * @brief This file contains all the functions prototypes of the touch pad GT9XX - * driver library. - @verbatim - Change Logs: - Date Author Notes - 2022-12-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __GT9XX_H__ -#define __GT9XX_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_def.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @addtogroup GT9XX - * @{ - */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ -/** - * @defgroup GT9XX_Global_Types GT9XX Global Types - * @{ - */ - -/** - * @brief GT9XX low layer structure definition - */ -typedef struct { - /* Methods */ - void (*Init)(void); - void (*Read)(const uint8_t *pu8Reg, uint8_t u8RegLen, uint8_t *pu8Buf, uint32_t u32Len); - void (*Write)(const uint8_t *pu8Reg, uint8_t u8RegLen, const uint8_t *pu8Buf, uint32_t u32Len); -} stc_gt9xx_ll_t; - -/** - * @} - */ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup GT9XX_Global_Macros GT9XX Global Macros - * @{ - */ -/** - * @defgroup GT9XX_Local_Macros GT9XX Local Macros - * @{ - */ -#define GT9XX_COMMAND (0x8040U) -#define GT9XX_CONFIG (0x8047U) - -#define GT9XX_CHECK_SUM (0X80FF) - -#define GT9XX_PRODUCT_ID (0x8140U) -#define GT9XX_TOUCH_STATUS (0x814EU) - -#define GT9XX_POINT1 (0x8150U) -#define GT9XX_POINT2 (0x8158U) -#define GT9XX_POINT3 (0X8160U) -#define GT9XX_POINT4 (0X8168U) -#define GT9XX_POINT5 (0X8170U) -#define GT9XX_POINT6 (0X8178U) -#define GT9XX_POINT7 (0X8180U) -#define GT9XX_POINT8 (0X8188U) -#define GT9XX_POINT9 (0X8190U) -#define GT9XX_POINT10 (0X8198U) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup GT9XX_Global_Functions - * @{ - */ -void GT9XX_REG_Read(const stc_gt9xx_ll_t *pstcGt9xxLL, uint16_t u16Reg, uint8_t *pu8RegValue, uint32_t u32Len); -void GT9XX_REG_Write(const stc_gt9xx_ll_t *pstcGt9xxLL, uint16_t u16Reg, const uint8_t *pu8RegValue, uint32_t u32Len); -void GT9XX_SoftReset(const stc_gt9xx_ll_t *pstcGt9xxLL); -uint8_t GT9XX_ReadTouchStatus(const stc_gt9xx_ll_t *pstcGt9xxLL); -void GT9XX_ReadProductID(const stc_gt9xx_ll_t *pstcGt9xxLL, uint8_t *pu8IDValue, uint32_t u32Len); -void GT9XX_GetXY(const stc_gt9xx_ll_t *pstcGt9xxLL, uint16_t u16Point, uint16_t *pu16X, uint16_t *pu16Y); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GT9XX_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/nt35510/nt35510.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/nt35510/nt35510.c deleted file mode 100644 index e1af42215c1..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/nt35510/nt35510.c +++ /dev/null @@ -1,2033 +0,0 @@ -/** - ******************************************************************************* - * @file nt35510.c - * @brief This file provides firmware functions for LCD NT35510. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2022-12-31 CDT Compliant LCD drive IC: NT35310 - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "nt35510.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @defgroup NT35510 LCD NT35510 - * @{ - */ - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ -/** - * @defgroup NT35510_Local_Types NT35510 Local Types - * @{ - */ - -/** - * @brief LCD Device Structure Definition - */ -typedef struct { - uint16_t u16Dir; /*!< Direction: 0, Vertical; 1, Horizontal */ - uint16_t u16ID; /*!< LCD ID */ - uint16_t u16Width; /*!< LCD Width */ - uint16_t u16Height; /*!< LCD Heigth */ - uint16_t u16WRamCmd; /*!< Start to write GRAM */ - uint16_t u16SetXCmd; /*!< Set X axis */ - uint16_t u16SetYCmd; /*!< Set Y axis */ -} stc_lcd_device_t; - -/** - * @} - */ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/** - * @defgroup NT35510_Local_Macros NT35510 Local Macros - * @{ - */ - -/* LCD Scan Direction */ -#define LCD_SCAN_DIR (LCD_SCAN_DIR_L2R_U2D) - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/** - * @defgroup NT35510_Local_Variables NT35510 Local Variables - * @{ - */ -static stc_lcd_device_t m_stcLcdDevice; -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ - -/** - * @defgroup NT35510_Local_Functions NT35510 Local Functions - * @{ - */ - -/** - * @brief LCD delay - * @param [in] u32Delay: Delay in ms - * @retval None - */ -static void LCD_Delay(uint32_t u32Delay) -{ - volatile uint32_t i; - const uint32_t u32Cyc = 24000UL; - - while (u32Delay-- > 0UL) { - i = u32Cyc; - while (i-- > 0UL) { - ; - } - } -} - -/** - * @brief Configure LCD NT35310 - * @param [in] pstcLCD: LCD controller - * @retval None - */ -static void LCD_NT35310_Config(stc_lcd_controller_t *pstcLCD) -{ - NT35510_WriteReg(pstcLCD, 0xED); - NT35510_WriteData(pstcLCD, 0x01); - NT35510_WriteData(pstcLCD, 0xFE); - - NT35510_WriteReg(pstcLCD, 0xEE); - NT35510_WriteData(pstcLCD, 0xDE); - NT35510_WriteData(pstcLCD, 0x21); - - NT35510_WriteReg(pstcLCD, 0xF1); - NT35510_WriteData(pstcLCD, 0x01); - NT35510_WriteReg(pstcLCD, 0xDF); - NT35510_WriteData(pstcLCD, 0x10); - - //VCOMvoltage// - NT35510_WriteReg(pstcLCD, 0xC4); - NT35510_WriteData(pstcLCD, 0x8F); - - NT35510_WriteReg(pstcLCD, 0xC6); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xE2); - NT35510_WriteData(pstcLCD, 0xE2); - NT35510_WriteData(pstcLCD, 0xE2); - NT35510_WriteReg(pstcLCD, 0xBF); - NT35510_WriteData(pstcLCD, 0xAA); - - NT35510_WriteReg(pstcLCD, 0xB0); - NT35510_WriteData(pstcLCD, 0x0D); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x0D); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x11); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x19); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x21); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x2D); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x3D); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x5D); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x5D); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xB1); - NT35510_WriteData(pstcLCD, 0x80); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x8B); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x96); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xB2); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x02); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x03); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xB3); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xB4); - NT35510_WriteData(pstcLCD, 0x8B); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x96); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA1); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xB5); - NT35510_WriteData(pstcLCD, 0x02); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x03); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x04); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xB6); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xB7); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x3F); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x5E); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x64); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x8C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xAC); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xDC); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x70); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x90); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xEB); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xDC); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xB8); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xBA); - NT35510_WriteData(pstcLCD, 0x24); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC1); - NT35510_WriteData(pstcLCD, 0x20); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x54); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xFF); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC2); - NT35510_WriteData(pstcLCD, 0x0A); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x04); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC3); - NT35510_WriteData(pstcLCD, 0x3C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x3A); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x39); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x37); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x3C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x36); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x32); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x2F); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x2C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x29); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x26); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x24); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x24); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x23); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x3C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x36); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x32); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x2F); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x2C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x29); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x26); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x24); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x24); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x23); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC4); - NT35510_WriteData(pstcLCD, 0x62); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x05); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x84); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xF0); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x18); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA4); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x18); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x50); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x0C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x17); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x95); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xF3); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xE6); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC5); - NT35510_WriteData(pstcLCD, 0x32); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x44); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x65); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x76); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x88); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC6); - NT35510_WriteData(pstcLCD, 0x20); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x17); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x01); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC7); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC8); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xC9); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xE0); - NT35510_WriteData(pstcLCD, 0x16); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x1C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x21); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x36); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x46); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x52); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x64); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x7A); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x8B); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x99); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA8); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xB9); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xC4); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xCA); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD2); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD9); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xE0); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xF3); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xE1); - NT35510_WriteData(pstcLCD, 0x16); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x1C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x22); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x36); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x45); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x52); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x64); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x7A); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x8B); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x99); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA8); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xB9); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xC4); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xCA); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD2); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD8); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xE0); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xF3); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xE2); - NT35510_WriteData(pstcLCD, 0x05); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x0B); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x1B); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x34); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x44); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x4F); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x61); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x79); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x88); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x97); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA6); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xB7); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xC2); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xC7); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD1); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD6); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xDD); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xF3); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteReg(pstcLCD, 0xE3); - NT35510_WriteData(pstcLCD, 0x05); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x1C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x33); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x44); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x50); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x62); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x78); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x88); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x97); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA6); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xB7); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xC2); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xC7); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD1); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD5); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xDD); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xF3); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xE4); - NT35510_WriteData(pstcLCD, 0x01); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x01); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x02); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x2A); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x3C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x4B); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x5D); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x74); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x84); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x93); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA2); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xB3); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xBE); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xC4); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xCD); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD3); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xDD); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xF3); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteReg(pstcLCD, 0xE5); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x02); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x29); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x3C); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x4B); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x5D); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x74); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x84); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x93); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xA2); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xB3); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xBE); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xC4); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xCD); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xD3); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xDC); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xF3); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xE6); - NT35510_WriteData(pstcLCD, 0x11); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x34); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x56); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x76); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x77); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x66); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x88); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x99); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xBB); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x99); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x66); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x55); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x55); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x45); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x43); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x44); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xE7); - NT35510_WriteData(pstcLCD, 0x32); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x55); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x76); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x66); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x67); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x67); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x87); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x99); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xBB); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x99); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x77); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x44); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x56); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x23); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x33); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x45); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xE8); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x99); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x87); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x88); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x77); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x66); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x88); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xAA); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xBB); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x99); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x66); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x55); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x55); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x44); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x44); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x55); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xE9); - NT35510_WriteData(pstcLCD, 0xAA); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0xAA); - - NT35510_WriteReg(pstcLCD, 0xCF); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xF0); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x50); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xF3); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0xF9); - NT35510_WriteData(pstcLCD, 0x06); - NT35510_WriteData(pstcLCD, 0x10); - NT35510_WriteData(pstcLCD, 0x29); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0x3A); - NT35510_WriteData(pstcLCD, 0x55); - - NT35510_WriteReg(pstcLCD, 0x11); - LCD_Delay(100); - NT35510_WriteReg(pstcLCD, 0x29); - NT35510_WriteReg(pstcLCD, 0x35); - NT35510_WriteData(pstcLCD, 0x00); - - NT35510_WriteReg(pstcLCD, 0x51); - NT35510_WriteData(pstcLCD, 0xFF); - NT35510_WriteReg(pstcLCD, 0x53); - NT35510_WriteData(pstcLCD, 0x2C); - NT35510_WriteReg(pstcLCD, 0x55); - NT35510_WriteData(pstcLCD, 0x82); - NT35510_WriteReg(pstcLCD, 0x2c); -} - -/** - * @brief Configure LCD NT35510 - * @param [in] pstcLCD: LCD controller - * @retval None - */ -static void LCD_NT35510_Config(stc_lcd_controller_t *pstcLCD) -{ - /* Config LCD */ - NT35510_WriteRegData(pstcLCD, 0xF000U, 0x55U); - NT35510_WriteRegData(pstcLCD, 0xF001U, 0xAAU); - NT35510_WriteRegData(pstcLCD, 0xF002U, 0x52U); - NT35510_WriteRegData(pstcLCD, 0xF003U, 0x08U); - NT35510_WriteRegData(pstcLCD, 0xF004U, 0x01U); - /* AVDD Set AVDD 5.2V */ - NT35510_WriteRegData(pstcLCD, 0xB000U, 0x0DU); - NT35510_WriteRegData(pstcLCD, 0xB001U, 0x0DU); - NT35510_WriteRegData(pstcLCD, 0xB002U, 0x0DU); - /* AVDD ratio */ - NT35510_WriteRegData(pstcLCD, 0xB600U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xB601U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xB602U, 0x34U); - /* AVEE -5.2V */ - NT35510_WriteRegData(pstcLCD, 0xB100U, 0x0DU); - NT35510_WriteRegData(pstcLCD, 0xB101U, 0x0DU); - NT35510_WriteRegData(pstcLCD, 0xB102U, 0x0DU); - /* AVEE ratio */ - NT35510_WriteRegData(pstcLCD, 0xB700U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xB701U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xB702U, 0x34U); - /* VCL -2.5V */ - NT35510_WriteRegData(pstcLCD, 0xB200U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xB201U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xB202U, 0x00U); - /* VCL ratio */ - NT35510_WriteRegData(pstcLCD, 0xB800U, 0x24U); - NT35510_WriteRegData(pstcLCD, 0xB801U, 0x24U); - NT35510_WriteRegData(pstcLCD, 0xB802U, 0x24U); - /* VGH 15V (Free pump) */ - NT35510_WriteRegData(pstcLCD, 0xBF00U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xB300U, 0x0FU); - NT35510_WriteRegData(pstcLCD, 0xB301U, 0x0FU); - NT35510_WriteRegData(pstcLCD, 0xB302U, 0x0FU); - /* VGH ratio */ - NT35510_WriteRegData(pstcLCD, 0xB900U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xB901U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xB902U, 0x34U); - /* VGL_REG -10V */ - NT35510_WriteRegData(pstcLCD, 0xB500U, 0x08U); - NT35510_WriteRegData(pstcLCD, 0xB501U, 0x08U); - NT35510_WriteRegData(pstcLCD, 0xB502U, 0x08U); - NT35510_WriteRegData(pstcLCD, 0xC200U, 0x03U); - /* VGLX ratio */ - NT35510_WriteRegData(pstcLCD, 0xBA00U, 0x24U); - NT35510_WriteRegData(pstcLCD, 0xBA01U, 0x24U); - NT35510_WriteRegData(pstcLCD, 0xBA02U, 0x24U); - /* VGMP/VGSP 4.5V/0V */ - NT35510_WriteRegData(pstcLCD, 0xBC00U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xBC01U, 0x78U); - NT35510_WriteRegData(pstcLCD, 0xBC02U, 0x00U); - /* VGMN/VGSN -4.5V/0V */ - NT35510_WriteRegData(pstcLCD, 0xBD00U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xBD01U, 0x78U); - NT35510_WriteRegData(pstcLCD, 0xBD02U, 0x00U); - /* VCOM */ - NT35510_WriteRegData(pstcLCD, 0xBE00U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xBE01U, 0x64U); - /* Gamma Setting */ - NT35510_WriteRegData(pstcLCD, 0xD100U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD101U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD102U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD103U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD104U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD105U, 0x3AU); - NT35510_WriteRegData(pstcLCD, 0xD106U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD107U, 0x4AU); - NT35510_WriteRegData(pstcLCD, 0xD108U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD109U, 0x5CU); - NT35510_WriteRegData(pstcLCD, 0xD10AU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD10BU, 0x81U); - NT35510_WriteRegData(pstcLCD, 0xD10CU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD10DU, 0xA6U); - NT35510_WriteRegData(pstcLCD, 0xD10EU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD10FU, 0xE5U); - NT35510_WriteRegData(pstcLCD, 0xD110U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD111U, 0x13U); - NT35510_WriteRegData(pstcLCD, 0xD112U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD113U, 0x54U); - NT35510_WriteRegData(pstcLCD, 0xD114U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD115U, 0x82U); - NT35510_WriteRegData(pstcLCD, 0xD116U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD117U, 0xCAU); - NT35510_WriteRegData(pstcLCD, 0xD118U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD119U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD11AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD11BU, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD11CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD11DU, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD11EU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD11FU, 0x67U); - NT35510_WriteRegData(pstcLCD, 0xD120U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD121U, 0x84U); - NT35510_WriteRegData(pstcLCD, 0xD122U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD123U, 0xA4U); - NT35510_WriteRegData(pstcLCD, 0xD124U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD125U, 0xB7U); - NT35510_WriteRegData(pstcLCD, 0xD126U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD127U, 0xCFU); - NT35510_WriteRegData(pstcLCD, 0xD128U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD129U, 0xDEU); - NT35510_WriteRegData(pstcLCD, 0xD12AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD12BU, 0xF2U); - NT35510_WriteRegData(pstcLCD, 0xD12CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD12DU, 0xFEU); - NT35510_WriteRegData(pstcLCD, 0xD12EU, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD12FU, 0x10U); - NT35510_WriteRegData(pstcLCD, 0xD130U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD131U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD132U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD133U, 0x6DU); - NT35510_WriteRegData(pstcLCD, 0xD200U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD201U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD202U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD203U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD204U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD205U, 0x3AU); - NT35510_WriteRegData(pstcLCD, 0xD206U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD207U, 0x4AU); - NT35510_WriteRegData(pstcLCD, 0xD208U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD209U, 0x5CU); - NT35510_WriteRegData(pstcLCD, 0xD20AU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD20BU, 0x81U); - NT35510_WriteRegData(pstcLCD, 0xD20CU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD20DU, 0xA6U); - NT35510_WriteRegData(pstcLCD, 0xD20EU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD20FU, 0xE5U); - NT35510_WriteRegData(pstcLCD, 0xD210U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD211U, 0x13U); - NT35510_WriteRegData(pstcLCD, 0xD212U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD213U, 0x54U); - NT35510_WriteRegData(pstcLCD, 0xD214U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD215U, 0x82U); - NT35510_WriteRegData(pstcLCD, 0xD216U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD217U, 0xCAU); - NT35510_WriteRegData(pstcLCD, 0xD218U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD219U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD21AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD21BU, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD21CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD21DU, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD21EU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD21FU, 0x67U); - NT35510_WriteRegData(pstcLCD, 0xD220U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD221U, 0x84U); - NT35510_WriteRegData(pstcLCD, 0xD222U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD223U, 0xA4U); - NT35510_WriteRegData(pstcLCD, 0xD224U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD225U, 0xB7U); - NT35510_WriteRegData(pstcLCD, 0xD226U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD227U, 0xCFU); - NT35510_WriteRegData(pstcLCD, 0xD228U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD229U, 0xDEU); - NT35510_WriteRegData(pstcLCD, 0xD22AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD22BU, 0xF2U); - NT35510_WriteRegData(pstcLCD, 0xD22CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD22DU, 0xFEU); - NT35510_WriteRegData(pstcLCD, 0xD22EU, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD22FU, 0x10U); - NT35510_WriteRegData(pstcLCD, 0xD230U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD231U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD232U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD233U, 0x6DU); - NT35510_WriteRegData(pstcLCD, 0xD300U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD301U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD302U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD303U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD304U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD305U, 0x3AU); - NT35510_WriteRegData(pstcLCD, 0xD306U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD307U, 0x4AU); - NT35510_WriteRegData(pstcLCD, 0xD308U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD309U, 0x5CU); - NT35510_WriteRegData(pstcLCD, 0xD30AU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD30BU, 0x81U); - NT35510_WriteRegData(pstcLCD, 0xD30CU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD30DU, 0xA6U); - NT35510_WriteRegData(pstcLCD, 0xD30EU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD30FU, 0xE5U); - NT35510_WriteRegData(pstcLCD, 0xD310U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD311U, 0x13U); - NT35510_WriteRegData(pstcLCD, 0xD312U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD313U, 0x54U); - NT35510_WriteRegData(pstcLCD, 0xD314U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD315U, 0x82U); - NT35510_WriteRegData(pstcLCD, 0xD316U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD317U, 0xCAU); - NT35510_WriteRegData(pstcLCD, 0xD318U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD319U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD31AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD31BU, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD31CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD31DU, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD31EU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD31FU, 0x67U); - NT35510_WriteRegData(pstcLCD, 0xD320U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD321U, 0x84U); - NT35510_WriteRegData(pstcLCD, 0xD322U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD323U, 0xA4U); - NT35510_WriteRegData(pstcLCD, 0xD324U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD325U, 0xB7U); - NT35510_WriteRegData(pstcLCD, 0xD326U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD327U, 0xCFU); - NT35510_WriteRegData(pstcLCD, 0xD328U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD329U, 0xDEU); - NT35510_WriteRegData(pstcLCD, 0xD32AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD32BU, 0xF2U); - NT35510_WriteRegData(pstcLCD, 0xD32CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD32DU, 0xFEU); - NT35510_WriteRegData(pstcLCD, 0xD32EU, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD32FU, 0x10U); - NT35510_WriteRegData(pstcLCD, 0xD330U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD331U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD332U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD333U, 0x6DU); - NT35510_WriteRegData(pstcLCD, 0xD400U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD401U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD402U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD403U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD404U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD405U, 0x3AU); - NT35510_WriteRegData(pstcLCD, 0xD406U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD407U, 0x4AU); - NT35510_WriteRegData(pstcLCD, 0xD408U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD409U, 0x5CU); - NT35510_WriteRegData(pstcLCD, 0xD40AU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD40BU, 0x81U); - NT35510_WriteRegData(pstcLCD, 0xD40CU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD40DU, 0xA6U); - NT35510_WriteRegData(pstcLCD, 0xD40EU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD40FU, 0xE5U); - NT35510_WriteRegData(pstcLCD, 0xD410U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD411U, 0x13U); - NT35510_WriteRegData(pstcLCD, 0xD412U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD413U, 0x54U); - NT35510_WriteRegData(pstcLCD, 0xD414U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD415U, 0x82U); - NT35510_WriteRegData(pstcLCD, 0xD416U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD417U, 0xCAU); - NT35510_WriteRegData(pstcLCD, 0xD418U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD419U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD41AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD41BU, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD41CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD41DU, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD41EU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD41FU, 0x67U); - NT35510_WriteRegData(pstcLCD, 0xD420U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD421U, 0x84U); - NT35510_WriteRegData(pstcLCD, 0xD422U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD423U, 0xA4U); - NT35510_WriteRegData(pstcLCD, 0xD424U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD425U, 0xB7U); - NT35510_WriteRegData(pstcLCD, 0xD426U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD427U, 0xCFU); - NT35510_WriteRegData(pstcLCD, 0xD428U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD429U, 0xDEU); - NT35510_WriteRegData(pstcLCD, 0xD42AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD42BU, 0xF2U); - NT35510_WriteRegData(pstcLCD, 0xD42CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD42DU, 0xFEU); - NT35510_WriteRegData(pstcLCD, 0xD42EU, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD42FU, 0x10U); - NT35510_WriteRegData(pstcLCD, 0xD430U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD431U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD432U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD433U, 0x6DU); - NT35510_WriteRegData(pstcLCD, 0xD500U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD501U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD502U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD503U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD504U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD505U, 0x3AU); - NT35510_WriteRegData(pstcLCD, 0xD506U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD507U, 0x4AU); - NT35510_WriteRegData(pstcLCD, 0xD508U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD509U, 0x5CU); - NT35510_WriteRegData(pstcLCD, 0xD50AU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD50BU, 0x81U); - NT35510_WriteRegData(pstcLCD, 0xD50CU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD50DU, 0xA6U); - NT35510_WriteRegData(pstcLCD, 0xD50EU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD50FU, 0xE5U); - NT35510_WriteRegData(pstcLCD, 0xD510U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD511U, 0x13U); - NT35510_WriteRegData(pstcLCD, 0xD512U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD513U, 0x54U); - NT35510_WriteRegData(pstcLCD, 0xD514U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD515U, 0x82U); - NT35510_WriteRegData(pstcLCD, 0xD516U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD517U, 0xCAU); - NT35510_WriteRegData(pstcLCD, 0xD518U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD519U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD51AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD51BU, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD51CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD51DU, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD51EU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD51FU, 0x67U); - NT35510_WriteRegData(pstcLCD, 0xD520U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD521U, 0x84U); - NT35510_WriteRegData(pstcLCD, 0xD522U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD523U, 0xA4U); - NT35510_WriteRegData(pstcLCD, 0xD524U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD525U, 0xB7U); - NT35510_WriteRegData(pstcLCD, 0xD526U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD527U, 0xCFU); - NT35510_WriteRegData(pstcLCD, 0xD528U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD529U, 0xDEU); - NT35510_WriteRegData(pstcLCD, 0xD52AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD52BU, 0xF2U); - NT35510_WriteRegData(pstcLCD, 0xD52CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD52DU, 0xFEU); - NT35510_WriteRegData(pstcLCD, 0xD52EU, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD52FU, 0x10U); - NT35510_WriteRegData(pstcLCD, 0xD530U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD531U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD532U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD533U, 0x6DU); - NT35510_WriteRegData(pstcLCD, 0xD600U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD601U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD602U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD603U, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD604U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD605U, 0x3AU); - NT35510_WriteRegData(pstcLCD, 0xD606U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD607U, 0x4AU); - NT35510_WriteRegData(pstcLCD, 0xD608U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD609U, 0x5CU); - NT35510_WriteRegData(pstcLCD, 0xD60AU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD60BU, 0x81U); - NT35510_WriteRegData(pstcLCD, 0xD60CU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD60DU, 0xA6U); - NT35510_WriteRegData(pstcLCD, 0xD60EU, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD60FU, 0xE5U); - NT35510_WriteRegData(pstcLCD, 0xD610U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD611U, 0x13U); - NT35510_WriteRegData(pstcLCD, 0xD612U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD613U, 0x54U); - NT35510_WriteRegData(pstcLCD, 0xD614U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD615U, 0x82U); - NT35510_WriteRegData(pstcLCD, 0xD616U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD617U, 0xCAU); - NT35510_WriteRegData(pstcLCD, 0xD618U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD619U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xD61AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD61BU, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xD61CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD61DU, 0x34U); - NT35510_WriteRegData(pstcLCD, 0xD61EU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD61FU, 0x67U); - NT35510_WriteRegData(pstcLCD, 0xD620U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD621U, 0x84U); - NT35510_WriteRegData(pstcLCD, 0xD622U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD623U, 0xA4U); - NT35510_WriteRegData(pstcLCD, 0xD624U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD625U, 0xB7U); - NT35510_WriteRegData(pstcLCD, 0xD626U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD627U, 0xCFU); - NT35510_WriteRegData(pstcLCD, 0xD628U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD629U, 0xDEU); - NT35510_WriteRegData(pstcLCD, 0xD62AU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD62BU, 0xF2U); - NT35510_WriteRegData(pstcLCD, 0xD62CU, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xD62DU, 0xFEU); - NT35510_WriteRegData(pstcLCD, 0xD62EU, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD62FU, 0x10U); - NT35510_WriteRegData(pstcLCD, 0xD630U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD631U, 0x33U); - NT35510_WriteRegData(pstcLCD, 0xD632U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xD633U, 0x6DU); - /* LV2 Page 0 enable */ - NT35510_WriteRegData(pstcLCD, 0xF000U, 0x55U); - NT35510_WriteRegData(pstcLCD, 0xF001U, 0xAAU); - NT35510_WriteRegData(pstcLCD, 0xF002U, 0x52U); - NT35510_WriteRegData(pstcLCD, 0xF003U, 0x08U); - NT35510_WriteRegData(pstcLCD, 0xF004U, 0x00U); - /* Display control */ - NT35510_WriteRegData(pstcLCD, 0xB100U, 0xCCU); - NT35510_WriteRegData(pstcLCD, 0xB101U, 0x00U); - /* Source hold time */ - NT35510_WriteRegData(pstcLCD, 0xB600U, 0x05U); - /* Gate EQ control */ - NT35510_WriteRegData(pstcLCD, 0xB700U, 0x70U); - NT35510_WriteRegData(pstcLCD, 0xB701U, 0x70U); - /* Source EQ control (Mode 2) */ - NT35510_WriteRegData(pstcLCD, 0xB800U, 0x01U); - NT35510_WriteRegData(pstcLCD, 0xB801U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xB802U, 0x03U); - NT35510_WriteRegData(pstcLCD, 0xB803U, 0x03U); - /* Inversion mode (2-dot) */ - NT35510_WriteRegData(pstcLCD, 0xBC00U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xBC01U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0xBC02U, 0x00U); - /* Timing control 4H w/ 4-delay */ - NT35510_WriteRegData(pstcLCD, 0xC900U, 0xD0U); - NT35510_WriteRegData(pstcLCD, 0xC901U, 0x02U); - NT35510_WriteRegData(pstcLCD, 0xC902U, 0x50U); - NT35510_WriteRegData(pstcLCD, 0xC903U, 0x50U); - NT35510_WriteRegData(pstcLCD, 0xC904U, 0x50U); - NT35510_WriteRegData(pstcLCD, 0x3500U, 0x00U); - NT35510_WriteRegData(pstcLCD, 0x3A00U, 0x55U); /* 16-bit/pixel */ - NT35510_WriteReg(pstcLCD, 0x1100U); - LCD_Delay(120UL); - NT35510_WriteReg(pstcLCD, 0x2900U); -} - -/** - * @} - */ - -/** - * @defgroup NT35510_Global_Functions NT35510 Global Functions - * @{ - */ - -/** - * @brief Initialize LCD device. - * @param [in] pstcLCD: LCD controller - * @retval None - */ -void NT35510_Init(stc_lcd_controller_t *pstcLCD) -{ - uint16_t u16ID; - - /* NOP */ - NT35510_WriteRegData(pstcLCD, 0x0000U, 0x00U); - - /* Read ID */ - u16ID = NT35510_ReadID(pstcLCD); - - if (0x5310U == u16ID) { - LCD_NT35310_Config(pstcLCD); - m_stcLcdDevice.u16Width = 320U; - m_stcLcdDevice.u16Height = 480U; - m_stcLcdDevice.u16WRamCmd = 0x2CU; - m_stcLcdDevice.u16SetXCmd = 0x2AU; - m_stcLcdDevice.u16SetYCmd = 0x2BU; - } else if (0x5510U == u16ID) { - LCD_NT35510_Config(pstcLCD); - m_stcLcdDevice.u16Width = 480U; - m_stcLcdDevice.u16Height = 800U; - m_stcLcdDevice.u16WRamCmd = 0x2C00U; - m_stcLcdDevice.u16SetXCmd = 0x2A00U; - m_stcLcdDevice.u16SetYCmd = 0x2B00U; - } else { - /* Unsupported LCD */ - } - - m_stcLcdDevice.u16ID = u16ID; - - NT35510_SetDisplayDir(pstcLCD, LCD_DISPLAY_VERTICAL); - - /* Set cursor */ - NT35510_SetCursor(pstcLCD, 0U, 0U); - - /* Prepare to write to LCD RAM */ - NT35510_PrepareWriteRAM(pstcLCD); -} - -/** - * @brief Write data on LCD data register. - * @param [in] pstcLCD: LCD controller @ref stc_lcd_controller_t structure. - * @param [in] u16Data: Data to be written - * @retval None - */ -void NT35510_WriteData(stc_lcd_controller_t *pstcLCD, uint16_t u16Data) -{ - pstcLCD->u16RAM = u16Data; -} - -/** - * @brief Write register on LCD register. - * @param [in] pstcLCD: LCD controller @ref stc_lcd_controller_t structure. - * @param [in] u16Reg: Address of the selected register. - * @retval None - */ -void NT35510_WriteReg(stc_lcd_controller_t *pstcLCD, uint16_t u16Reg) -{ - pstcLCD->u16REG = u16Reg; -} - -/** - * @brief Read data from LCD data register. - * @param [in] pstcLCD: LCD controller @ref stc_lcd_controller_t structure. - * @retval Read data. - */ -uint16_t NT35510_ReadData(stc_lcd_controller_t *pstcLCD) -{ - return pstcLCD->u16RAM; -} - -/** - * @brief Write to the selected LCD register. - * @param [in] pstcLCD: LCD controller @ref stc_lcd_controller_t structure. - * @param [in] u16Reg: Address of the selected register. - * @param [in] u16Data: Data to be written - * @retval None - */ -void NT35510_WriteRegData(stc_lcd_controller_t *pstcLCD, uint16_t u16Reg, uint16_t u16Data) -{ - /* Write 16-bit index */ - pstcLCD->u16REG = u16Reg; - - /* Write 16-bit Reg */ - pstcLCD->u16RAM = u16Data; -} - -/** - * @brief Read the selected LCD register. - * @param [in] pstcLCD: LCD controller @ref stc_lcd_controller_t structure. - * @param [in] u16Reg: Address of the selected register. - * @retval Register value - */ -uint16_t NT35510_ReadRegData(stc_lcd_controller_t *pstcLCD, uint16_t u16Reg) -{ - /* Write 16-bit index*/ - pstcLCD->u16REG = u16Reg; - - return pstcLCD->u16RAM; -} - -/** - * @brief Read LCD ID. - * @param [in] pstcLCD: LCD controller @ref stc_lcd_controller_t structure. - * @retval LCD Register Value. - */ -uint16_t NT35510_ReadID(stc_lcd_controller_t *pstcLCD) -{ - uint16_t u16ID; - - /* Try to read ID: 0x9341 */ - NT35510_WriteReg(pstcLCD, 0xD3U); - (void)NT35510_ReadData(pstcLCD); /* dummy read */ - (void)NT35510_ReadData(pstcLCD); /* read: 0x00 */ - u16ID = NT35510_ReadData(pstcLCD) << 8; /* read: 0x93 */ - u16ID |= NT35510_ReadData(pstcLCD); /* read: 0x41 */ - if (u16ID != 0x9341U) { - /* Try to read ID: 0x8552 */ - NT35510_WriteReg(pstcLCD, 0x04U); - (void)NT35510_ReadData(pstcLCD); /* dummy read */ - (void)NT35510_ReadData(pstcLCD); /* read: 0x85 */ - u16ID = NT35510_ReadData(pstcLCD) << 8; /* read: 0x85 */ - u16ID |= NT35510_ReadData(pstcLCD); /* read: 0x41 */ - if (u16ID == 0x8552U) { - u16ID = 0x7789U; /* ID convert to: 0x7789 */ - } else { - /* Try to read ID: 0x5310 (NT35310) */ - NT35510_WriteReg(pstcLCD, 0xD4U); - (void)NT35510_ReadData(pstcLCD); /* dummy read */ - (void)NT35510_ReadData(pstcLCD); /* read: 0x01 */ - u16ID = NT35510_ReadData(pstcLCD) << 8; /* read: 0x53 */ - u16ID |= NT35510_ReadData(pstcLCD); /* read: 0x10 */ - if (u16ID != 0x5310U) { - /* Try to read ID: 0x008000 (NT35510) */ - NT35510_WriteReg(pstcLCD, 0xDA00); - (void)NT35510_ReadData(pstcLCD); /* read 0xDA00: 0x0000 */ - NT35510_WriteReg(pstcLCD, 0xDB00U); - u16ID = NT35510_ReadData(pstcLCD) << 8; /* read 0xDB00: 0x0080 */ - NT35510_WriteReg(pstcLCD, 0xDC00U); - u16ID |= NT35510_ReadData(pstcLCD); /* read 0xDC00: 0x0000 */ - /* Read ID: ID=008000H (5510H) */ - if (u16ID == 0x008000UL) { - u16ID = 0x5510U; /* ID convert to: 0x5510 */ - } else { - u16ID = 0U; /* Unsupported LCD */ - } - } - } - } - - return u16ID; -} - -/** - * @brief Enable the Display. - * @param [in] pstcLCD: LCD controller - * @retval None - */ -void NT35510_DisplayOn(stc_lcd_controller_t *pstcLCD) -{ - if (m_stcLcdDevice.u16ID == 0x5510U) { - NT35510_WriteReg(pstcLCD, 0x2900U); /* 5510 */ - } else { - NT35510_WriteReg(pstcLCD, 0x29U); /* 9341/5310/1963/7789 */ - } -} - -/** - * @brief Disable the Display. - * @param [in] pstcLCD: LCD controller - * @retval None - */ -void NT35510_DisplayOff(stc_lcd_controller_t *pstcLCD) -{ - if (m_stcLcdDevice.u16ID == 0x5510U) { - NT35510_WriteReg(pstcLCD, 0x2800U); /* 5510 */ - } else { - NT35510_WriteReg(pstcLCD, 0x28U); /* 9341/5310/1963/7789 */ - } -} - -/** - * @brief Get LCD PIXEL WIDTH. - * @param None - * @retval LCD PIXEL WIDTH. - */ -uint16_t NT35510_GetPixelWidth(void) -{ - return m_stcLcdDevice.u16Width; -} - -/** - * @brief Get LCD PIXEL HEIGHT. - * @param None - * @retval LCD PIXEL HEIGHT. - */ -uint16_t NT35510_GetPixelHeight(void) -{ - return m_stcLcdDevice.u16Height; -} - -/** - * @brief Set scan direction. - * @param [in] pstcLCD: LCD controller - * @param [in] u16Dir: Scan direction - * This parameter can be one of the following values: - * @arg LCD_SCAN_DIR_L2R_U2D: From left to right && from up to down - * @arg LCD_SCAN_DIR_L2R_D2U: From left to right && from down to up - * @arg LCD_SCAN_DIR_R2L_U2D: From right to left && from up to down - * @arg LCD_SCAN_DIR_R2L_D2U: From right to left && from down to up - * @arg LCD_SCAN_DIR_U2D_L2R: From up to down && from left to right - * @arg LCD_SCAN_DIR_U2D_R2L: From up to down && from right to left - * @arg LCD_SCAN_DIR_D2U_L2R: From down to up && from left to right - * @arg LCD_SCAN_DIR_D2U_R2L: From down to up && from right to left - * @retval None - */ -void NT35510_SetScanDir(stc_lcd_controller_t *pstcLCD, uint16_t u16Dir) -{ - uint16_t u16Temp; - uint16_t dirreg; - uint16_t regval = 0U; - - /* when display dir is VERTICAL, 1963 IC change scan-direction, other IC don't change - when display dir is HORIZONTAL, 1963 IC don't change scan-direction, other IC change */ - if (((0U == m_stcLcdDevice.u16Dir) && (m_stcLcdDevice.u16ID == 0x1963U)) || \ - ((1U == m_stcLcdDevice.u16Dir) && (m_stcLcdDevice.u16ID != 0x1963U))) { - if (0U == u16Dir) { - u16Dir = 6U; - } else if (1U == u16Dir) { - u16Dir = 7U; - } else if (2U == u16Dir) { - u16Dir = 4U; - } else if (3UL == u16Dir) { - u16Dir = 5U; - } else if (4U == u16Dir) { - u16Dir = 1U; - } else if (5U == u16Dir) { - u16Dir = 0U; - } else if (6U == u16Dir) { - u16Dir = 3U; - } else if (7U == u16Dir) { - u16Dir = 2U; - } else { - u16Dir = 6U; - } - } - - switch (u16Dir) { - case LCD_SCAN_DIR_L2R_U2D: - regval |= ((0U << 7) | (0U << 6) | (0U << 5)); - break; - case LCD_SCAN_DIR_L2R_D2U: - regval |= ((1U << 7) | (0U << 6) | (0U << 5)); - break; - case LCD_SCAN_DIR_R2L_U2D: - regval |= ((0U << 7) | (1U << 6) | (0U << 5)); - break; - case LCD_SCAN_DIR_R2L_D2U: - regval |= ((1U << 7) | (1U << 6) | (0U << 5)); - break; - case LCD_SCAN_DIR_U2D_L2R: - regval |= ((0U << 7) | (0U << 6) | (1U << 5)); - break; - case LCD_SCAN_DIR_U2D_R2L: - regval |= ((0U << 7) | (1U << 6) | (1U << 5)); - break; - case LCD_SCAN_DIR_D2U_L2R: - regval |= ((1U << 7) | (0U << 6) | (1U << 5)); - break; - case LCD_SCAN_DIR_D2U_R2L: - regval |= ((1U << 7) | (1U << 6) | (1U << 5)); - break; - default: - break; - } - - if (0x5510U == m_stcLcdDevice.u16ID) { - dirreg = 0x3600U; - } else { - dirreg = 0x36U; - } - - /* 0x9341 & 0x7789 set BGR bit */ - if ((0x9341U == m_stcLcdDevice.u16ID) || (0x7789U == m_stcLcdDevice.u16ID)) { - regval |= 0x08U; - } - - NT35510_WriteRegData(pstcLCD, dirreg, regval); - - /* 1963 don't handle coordinate */ - if (m_stcLcdDevice.u16ID != 0x1963U) { - if ((regval & 0x20U) > 0U) { - /* swap X,Y */ - if (m_stcLcdDevice.u16Width < m_stcLcdDevice.u16Height) { - u16Temp = m_stcLcdDevice.u16Width; - m_stcLcdDevice.u16Width = m_stcLcdDevice.u16Height; - m_stcLcdDevice.u16Height = u16Temp; - } - } else { - /* swap X,Y */ - if (m_stcLcdDevice.u16Width > m_stcLcdDevice.u16Height) { - u16Temp = m_stcLcdDevice.u16Width; - m_stcLcdDevice.u16Width = m_stcLcdDevice.u16Height; - m_stcLcdDevice.u16Height = u16Temp; - } - } - } - - /* Set display window size */ - if (0x5510U == m_stcLcdDevice.u16ID) { - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetXCmd); - NT35510_WriteData(pstcLCD, 0U); - - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetXCmd + 1U); - NT35510_WriteData(pstcLCD, 0U); - - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetXCmd + 2U); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Width - 1U) >> 8U); - - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetXCmd + 3U); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Width - 1U) & 0xFFU); - - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetYCmd); - NT35510_WriteData(pstcLCD, 0U); - - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetYCmd + 1U); - NT35510_WriteData(pstcLCD, 0U); - - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetYCmd + 2U); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Height - 1U) >> 8U); - - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetYCmd + 3U); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Height - 1U) & 0xFFU); - } else { - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetYCmd); - NT35510_WriteData(pstcLCD, 0U); - NT35510_WriteData(pstcLCD, 0U); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Width - 1U) >> 8); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Width - 1U) & 0xFFU); - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetYCmd); - NT35510_WriteData(pstcLCD, 0U); - NT35510_WriteData(pstcLCD, 0U); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Height - 1U) >> 8); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Height - 1U) & 0xFFU); - } -} - -/** - * @brief Set screen direction. - * @param [in] pstcLCD: LCD controller - * @param [in] u16Dir: Screen direction - * This parameter can be one of the following values: - * @arg LCD_DISPLAY_VERTICAL: LCD vertical display - * @arg LCD_DISPLAY_HORIZONTAL: LCD horizontal display - * @retval None - */ -void NT35510_SetDisplayDir(stc_lcd_controller_t *pstcLCD, uint16_t u16Dir) -{ - if (LCD_DISPLAY_VERTICAL == u16Dir) { /* Vertical */ - if (0x1963U == m_stcLcdDevice.u16ID) { - m_stcLcdDevice.u16WRamCmd = 0x2CU; - m_stcLcdDevice.u16SetXCmd = 0x2BU; - m_stcLcdDevice.u16SetYCmd = 0x2AU; - m_stcLcdDevice.u16Width = 480U; - m_stcLcdDevice.u16Height = 800U; - } else if (0x5510U == m_stcLcdDevice.u16ID) { - /* NT35510 */ - m_stcLcdDevice.u16WRamCmd = 0x2C00U; - m_stcLcdDevice.u16SetXCmd = 0x2A00U; - m_stcLcdDevice.u16SetYCmd = 0x2B00U; - m_stcLcdDevice.u16Width = 480U; - m_stcLcdDevice.u16Height = 800U; - } else { - /* NT35310 / 9341 / 5310 / 7789 etc */ - m_stcLcdDevice.u16WRamCmd = 0x2CU; - m_stcLcdDevice.u16SetXCmd = 0x2AU; - m_stcLcdDevice.u16SetYCmd = 0x2BU; - if (0x5310U == m_stcLcdDevice.u16ID) { - /* NT35310 */ - m_stcLcdDevice.u16Width = 320U; - m_stcLcdDevice.u16Height = 480U; - } else { - m_stcLcdDevice.u16Width = 240U; - m_stcLcdDevice.u16Height = 320U; - } - } - } else { /* Horizontal */ - if (0x1963U == m_stcLcdDevice.u16ID) { - m_stcLcdDevice.u16WRamCmd = 0x2CU; - m_stcLcdDevice.u16SetXCmd = 0x2AU; - m_stcLcdDevice.u16SetYCmd = 0x2BU; - m_stcLcdDevice.u16Width = 800U; - m_stcLcdDevice.u16Height = 480U; - } else if (0x5510U == m_stcLcdDevice.u16ID) { - /* NT35510 */ - m_stcLcdDevice.u16WRamCmd = 0x2C00U; - m_stcLcdDevice.u16SetXCmd = 0x2A00U; - m_stcLcdDevice.u16SetYCmd = 0x2B00U; - m_stcLcdDevice.u16Width = 800U; - m_stcLcdDevice.u16Height = 480U; - } else { - /* NT35310 / 9341 / 5310 / 7789 etc */ - m_stcLcdDevice.u16WRamCmd = 0x2CU; - m_stcLcdDevice.u16SetXCmd = 0x2AU; - m_stcLcdDevice.u16SetYCmd = 0x2BU; - if (0x5310U == m_stcLcdDevice.u16ID) { - /* NT35310 */ - m_stcLcdDevice.u16Width = 480U; - m_stcLcdDevice.u16Height = 320U; - } else { - m_stcLcdDevice.u16Width = 320U; - m_stcLcdDevice.u16Height = 240U; - } - } - } - - m_stcLcdDevice.u16Dir = u16Dir; - NT35510_SetScanDir(pstcLCD, LCD_SCAN_DIR); -} - -/** - * @brief Prepare to write LCD RAM. - * @param [in] pstcLCD: LCD controller - * @retval None - */ -void NT35510_PrepareWriteRAM(stc_lcd_controller_t *pstcLCD) -{ - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16WRamCmd); -} - -/** - * @brief Set screen backlight. - * @param [in] pstcLCD: LCD controller - * @param [in] u8PWM: PWM level - This parameter can be a value between Min_Data = 0 and Max_Data = 100 - * @retval None - */ -void NT35510_SetBackLight(stc_lcd_controller_t *pstcLCD, uint8_t u8PWM) -{ - float32_t f32PWM = ((float32_t)u8PWM * 2.55F); - - NT35510_WriteReg(pstcLCD, 0xBEU); - NT35510_WriteData(pstcLCD, 0x05U); - NT35510_WriteData(pstcLCD, (uint16_t)f32PWM); - NT35510_WriteData(pstcLCD, 0x01U); - NT35510_WriteData(pstcLCD, 0xFFU); - NT35510_WriteData(pstcLCD, 0x00U); - NT35510_WriteData(pstcLCD, 0x00U); -} - -/** - * @brief Set Cursor position. - * @param [in] pstcLCD: LCD controller - * @param u16Xpos: Specifies the X position. - * @param u16Ypos: Specifies the Y position. - * @retval None - */ -void NT35510_SetCursor(stc_lcd_controller_t *pstcLCD, uint16_t u16Xpos, uint16_t u16Ypos) -{ - if (0x1963U == m_stcLcdDevice.u16ID) { - /* Convert X coordinate */ - if (m_stcLcdDevice.u16Dir == 0U) { - u16Xpos = m_stcLcdDevice.u16Width - 1U - u16Xpos; - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetXCmd); - NT35510_WriteData(pstcLCD, 0U); - NT35510_WriteData(pstcLCD, 0U); - NT35510_WriteData(pstcLCD, u16Xpos >> 8); - NT35510_WriteData(pstcLCD, u16Xpos & 0xFFU); - } else { - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetXCmd); - NT35510_WriteData(pstcLCD, u16Xpos >> 8); - NT35510_WriteData(pstcLCD, u16Xpos & 0xFFU); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Width - 1U) >> 8); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Width - 1U) & 0xFFU); - } - - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetYCmd); - NT35510_WriteData(pstcLCD, u16Ypos >> 8); - NT35510_WriteData(pstcLCD, u16Ypos & 0xFFU); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Height - 1U) >> 8); - NT35510_WriteData(pstcLCD, (m_stcLcdDevice.u16Height - 1U) & 0xFFU); - } else if (0x5510U == m_stcLcdDevice.u16ID) { - NT35510_WriteRegData(pstcLCD, m_stcLcdDevice.u16SetXCmd, (u16Xpos >> 8U)); - NT35510_WriteRegData(pstcLCD, (m_stcLcdDevice.u16SetXCmd + 1U), (u16Xpos & 0xFFU)); - NT35510_WriteRegData(pstcLCD, m_stcLcdDevice.u16SetYCmd, (u16Ypos >> 8U)); - NT35510_WriteRegData(pstcLCD, (m_stcLcdDevice.u16SetYCmd + 1U), (u16Ypos & 0xFFU)); - } else { /* NT35310 / 9341 / 5310 / 7789 etc */ - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetXCmd); - NT35510_WriteData(pstcLCD, (u16Xpos >> 8)); - NT35510_WriteData(pstcLCD, (u16Xpos & 0xFFU)); - NT35510_WriteReg(pstcLCD, m_stcLcdDevice.u16SetYCmd); - NT35510_WriteData(pstcLCD, (u16Ypos >> 8)); - NT35510_WriteData(pstcLCD, (u16Ypos & 0xFFU)); - } -} - -/** - * @brief Write pixel. - * @param [in] pstcLCD: LCD controller - * @param u16Xpos: Specifies the X position. - * @param u16Ypos: Specifies the Y position. - * @param u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void NT35510_WritePixel(stc_lcd_controller_t *pstcLCD, uint16_t u16Xpos, uint16_t u16Ypos, uint16_t u16RGBCode) -{ - /* Set cursor */ - NT35510_SetCursor(pstcLCD, u16Xpos, u16Ypos); - - /* Prepare to write to LCD RAM */ - NT35510_PrepareWriteRAM(pstcLCD); - - NT35510_WriteData(pstcLCD, u16RGBCode); -} - -/** - * @brief Draw line. - * @param [in] pstcLCD: LCD controller - * @param u16X1: Specifies the X position 1. - * @param u16X2: Specifies the X position 2. - * @param u16Y1: Specifies the Y position 1. - * @param u16Y2: Specifies the Y position 2. - * @param u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void NT35510_DrawLine(stc_lcd_controller_t *pstcLCD, uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16RGBCode) -{ - int16_t t; - int16_t xerr = 0; - int16_t yerr = 0; - int16_t delta_x; - int16_t delta_y; - int16_t distance; - int16_t incx; - int16_t incy; - int16_t Row; - int16_t Col; - - Row = (int16_t)u16X1; - Col = (int16_t)u16Y1; - delta_x = ((int16_t)u16X2 - (int16_t)u16X1); /* calc delta X, Y*/ - delta_y = ((int16_t)u16Y2 - (int16_t)u16Y1); - - if (delta_x > 0) { - incx = 1; /* forward u8Direction */ - } else if (delta_x == 0) { - incx = 0; /* vertical line */ - } else { - incx = -1; /* reverse direction */ - delta_x = -delta_x; - } - - if (delta_y > 0) { - incy = 1; /* downward direction */ - } else if (delta_y == 0) { - incy = 0; /* horizontal line */ - } else { - incy = -1; /* upward direction */ - delta_y = -delta_y; - } - - if (delta_x > delta_y) { - distance = delta_x; /* set axis */ - } else { - distance = delta_y; - } - - for (t = 0; t <= (distance + 1); t++) { - NT35510_WritePixel(pstcLCD, (uint16_t)Row, (uint16_t)Col, u16RGBCode); /* draw pixel */ - - xerr += delta_x ; - yerr += delta_y ; - - if (xerr > distance) { - xerr -= distance; - Row += incx; - } - - if (yerr > distance) { - yerr -= distance; - Col += incy; - } - } -} - -/** - * @brief Draw a circle. - * @param [in] pstcLCD: LCD controller - * @param [in] u16Xpos: X position - * @param [in] u16Ypos: Y position - * @param [in] u16Radius: Circle radius - * @param u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void NT35510_DrawCircle(stc_lcd_controller_t *pstcLCD, uint16_t u16Xpos, uint16_t u16Ypos, - uint16_t u16Radius, uint16_t u16RGBCode) -{ - int32_t decision; /* Decision Variable */ - uint32_t current_x; /* Current X Value */ - uint32_t current_y; /* Current Y Value */ - - decision = 3 - ((int32_t)u16Radius * 2); - current_x = 0U; - current_y = u16Radius; - - while (current_x <= current_y) { - NT35510_WritePixel(pstcLCD, (u16Xpos + (uint16_t)current_x), (u16Ypos - (uint16_t)current_y), u16RGBCode); - NT35510_WritePixel(pstcLCD, (u16Xpos + (uint16_t)current_y), (u16Ypos - (uint16_t)current_x), u16RGBCode); - NT35510_WritePixel(pstcLCD, (u16Xpos + (uint16_t)current_y), (u16Ypos + (uint16_t)current_x), u16RGBCode); - NT35510_WritePixel(pstcLCD, (u16Xpos + (uint16_t)current_x), (u16Ypos + (uint16_t)current_y), u16RGBCode); - NT35510_WritePixel(pstcLCD, (u16Xpos - (uint16_t)current_x), (u16Ypos + (uint16_t)current_y), u16RGBCode); - NT35510_WritePixel(pstcLCD, (u16Xpos - (uint16_t)current_y), (u16Ypos + (uint16_t)current_x), u16RGBCode); - NT35510_WritePixel(pstcLCD, (u16Xpos - (uint16_t)current_x), (u16Ypos - (uint16_t)current_y), u16RGBCode); - NT35510_WritePixel(pstcLCD, (u16Xpos - (uint16_t)current_y), (u16Ypos - (uint16_t)current_x), u16RGBCode); - current_x++; - /* Bresenham algorithm */ - if (decision < 0) { - decision += ((4 * (int32_t)current_x) + 6); - } else { - decision += (10 + (4 * ((int32_t)current_x - (int32_t)current_y))); - current_y--; - } - } -} - -/** - * @brief Fill a triangle (between 3 points). - * @param [in] pstcLCD: LCD controller - * @param [in] u16X1: Point 1 X position - * @param [in] u16Y1: Point 1 Y position - * @param [in] u16X2: Point 2 X position - * @param [in] u16Y2: Point 2 Y position - * @param [in] u16X3: Point 3 X position - * @param [in] u16Y3: Point 3 Y position - * @param u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void NT35510_FillTriangle(stc_lcd_controller_t *pstcLCD, uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16X3, uint16_t u16Y3, uint16_t u16RGBCode) -{ - uint16_t deltax; - uint16_t deltay; - int16_t xoff; - int16_t yoff; - int16_t xinc1; - int16_t xinc2; - int16_t yinc1; - int16_t yinc2; - uint16_t den; - uint16_t num; - uint16_t numadd; - uint16_t numpixels; - uint16_t curpixel; - - xoff = (int16_t)u16X1; /* Start x off at the first pixel */ - yoff = (int16_t)u16Y1; /* Start y off at the first pixel */ - - /* The difference between the x's */ - if (u16X2 > u16X1) { - deltax = (u16X2 - u16X1); - } else { - deltax = (u16X1 - u16X2); - } - - /* The difference between the y's */ - if (u16Y2 > u16Y1) { - deltay = (u16Y2 - u16Y1); - } else { - deltay = (u16Y1 - u16Y2); - } - - if (u16X2 >= u16X1) { - /* The x-values are increasing */ - xinc1 = 1; - xinc2 = 1; - } else { - /* The x-values are decreasing */ - xinc1 = -1; - xinc2 = -1; - } - - if (u16Y2 >= u16Y1) { - /* The y-values are increasing */ - yinc1 = 1; - yinc2 = 1; - } else { - /* The y-values are decreasing */ - yinc1 = -1; - yinc2 = -1; - } - - /* There is at least one x-value for every y-value */ - if (deltax >= deltay) { - xinc1 = 0; /* Don't change the x when numerator >= denominator */ - yinc2 = 0; /* Don't change the y for every iteration */ - den = deltax; - num = (deltax / 2U); - numadd = deltay; - numpixels = deltax; /* There are more x-values than y-values */ - } else { - /* There is at least one y-value for every x-value */ - xinc2 = 0; /* Don't change the x for every iteration */ - yinc1 = 0; /* Don't change the y when numerator >= denominator */ - den = deltay; - num = (deltay / 2U); - numadd = deltax; - numpixels = deltay; /* There are more y-values than x-values */ - } - - for (curpixel = 0U; curpixel <= numpixels; curpixel++) { - NT35510_DrawLine(pstcLCD, (uint16_t)xoff, (uint16_t)yoff, u16X3, u16Y3, u16RGBCode); - - num += numadd; /* Increase the numerator by the top of the fraction */ - - /* Check if numerator >= denominator */ - if (num >= den) { - num -= den; /* Calculate the new numerator value */ - xoff += xinc1; /* Change the x as appropriate */ - yoff += yinc1; /* Change the y as appropriate */ - } - xoff += xinc2; /* Change the x as appropriate */ - yoff += yinc2; /* Change the y as appropriate */ - } -} - -/** - * @brief Draw rectangle. - * @param [in] pstcLCD: LCD controller - * @param [in] u16X1: Point 1 X position - * @param [in] u16Y1: Point 1 Y position - * @param [in] u16X2: Point 2 X position - * @param [in] u16Y2: Point 2 Y position - * @param u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void NT35510_DrawRectangle(stc_lcd_controller_t *pstcLCD, uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16RGBCode) -{ - NT35510_DrawLine(pstcLCD, u16X1, u16Y1, u16X2, u16Y1, u16RGBCode); - NT35510_DrawLine(pstcLCD, u16X1, u16Y1, u16X1, u16Y2, u16RGBCode); - NT35510_DrawLine(pstcLCD, u16X1, u16Y2, u16X2, u16Y2, u16RGBCode); - NT35510_DrawLine(pstcLCD, u16X2, u16Y1, u16X2, u16Y2, u16RGBCode); -} - -/** - * @brief Clear screen. - * @param [in] pstcLCD: LCD controller - * @param u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void NT35510_Clear(stc_lcd_controller_t *pstcLCD, uint16_t u16RGBCode) -{ - uint32_t i; - uint32_t u32TotalPoint; - - /* Set cursor */ - NT35510_SetCursor(pstcLCD, 0U, 0U); - - /* Prepare to write to LCD RAM */ - NT35510_PrepareWriteRAM(pstcLCD); - - u32TotalPoint = (uint32_t)m_stcLcdDevice.u16Width * (uint32_t)m_stcLcdDevice.u16Height; - - for (i = 0UL; i < u32TotalPoint; i++) { - NT35510_WriteData(pstcLCD, u16RGBCode); - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/nt35510/nt35510.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/nt35510/nt35510.h deleted file mode 100644 index f07c31dad1e..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/nt35510/nt35510.h +++ /dev/null @@ -1,202 +0,0 @@ -/** - ******************************************************************************* - * @file nt35510.h - * @brief This file contains all the functions prototypes of the LCD NT35510 - * driver library. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2023-05-31 CDT Optimize function arguments - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __NT35510_H__ -#define __NT35510_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_def.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @addtogroup NT35510 - * @{ - */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ -/** - * @defgroup NT35510_Global_Types NT35510 Global Types - * @{ - */ - -/** - * @brief LCD Device Controller Structure Definition - */ -typedef struct { - volatile uint16_t u16REG; - volatile uint16_t u16RAM; -} stc_lcd_controller_t; - -/** - * @} - */ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup NT35510_Global_Macros NT35510 Global Macros - * @{ - */ - -/** - * @defgroup LCD_Scan_Direction LCD Scan Direction - * @{ - */ -#define LCD_SCAN_DIR_L2R_U2D (0U) /* From left to right && from up to down */ -#define LCD_SCAN_DIR_L2R_D2U (1U) /* From left to right && from down to up */ -#define LCD_SCAN_DIR_R2L_U2D (2U) /* From right to left && from up to down */ -#define LCD_SCAN_DIR_R2L_D2U (3U) /* From right to left && from down to up */ -#define LCD_SCAN_DIR_U2D_L2R (4U) /* From up to down && from left to right */ -#define LCD_SCAN_DIR_U2D_R2L (5U) /* From up to down && from right to left */ -#define LCD_SCAN_DIR_D2U_L2R (6U) /* From down to up && from left to right */ -#define LCD_SCAN_DIR_D2U_R2L (7U) /* From down to up && from right to left */ -/** - * @} - */ - -/** - * @defgroup LCD_Display_Direction LCD Display Direction - * @{ - */ -#define LCD_DISPLAY_VERTICAL (0x0000U) -#define LCD_DISPLAY_HORIZONTAL (0x0001U) -/** - * @} - */ - -/** - * @defgroup LCD_Color LCD Color - * @{ - */ -#define LCD_COLOR_WHITE (0xFFFFU) -#define LCD_COLOR_BLACK (0x0000U) -#define LCD_COLOR_BLUE (0x001FU) -#define LCD_COLOR_BRED (0xF81FU) -#define LCD_COLOR_GRED (0xFFE0U) -#define LCD_COLOR_GBLUE (0x07FFU) -#define LCD_COLOR_RED (0xF800U) -#define LCD_COLOR_MAGENTA (0xF81FU) -#define LCD_COLOR_GREEN (0x07E0U) -#define LCD_COLOR_CYAN (0x7FFFU) -#define LCD_COLOR_YELLOW (0xFFE0U) -#define LCD_COLOR_BROWN (0xBC40U) -#define LCD_COLOR_BRRED (0xFC07U) -#define LCD_COLOR_GRAY (0x8430U) - -#define LCD_COLOR_DARKBLUE (0x01CFU) -#define LCD_COLOR_LIGHTBLUE (0x7D7CU) -#define LCD_COLOR_GRAYBLUE (0x5458U) - -#define LCD_COLOR_LIGHTGREEN (0x841FU) -#define LCD_COLOR_LIGHTGRAY (0xEF5BU) -#define LCD_COLOR_LGRAY (0xC618U) -#define LCD_COLOR_LGRAYBLUE (0xA651U) -#define LCD_COLOR_LBBLUE (0x2B12U) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup NT35510_Global_Functions - * @{ - */ -void NT35510_Init(stc_lcd_controller_t *pstcLCD); -void NT35510_WriteData(stc_lcd_controller_t *pstcLCD, uint16_t u16Data); -void NT35510_WriteReg(stc_lcd_controller_t *pstcLCD, uint16_t u16Reg); -uint16_t NT35510_ReadData(stc_lcd_controller_t *pstcLCD); -void NT35510_WriteRegData(stc_lcd_controller_t *pstcLCD, uint16_t u16Reg, uint16_t u16Data); -uint16_t NT35510_ReadRegData(stc_lcd_controller_t *pstcLCD, uint16_t u16Reg); -uint16_t NT35510_ReadID(stc_lcd_controller_t *pstcLCD); -void NT35510_DisplayOn(stc_lcd_controller_t *pstcLCD); -void NT35510_DisplayOff(stc_lcd_controller_t *pstcLCD); -uint16_t NT35510_GetPixelWidth(void); -uint16_t NT35510_GetPixelHeight(void); -void NT35510_SetScanDir(stc_lcd_controller_t *pstcLCD, uint16_t u16Dir); -void NT35510_SetDisplayDir(stc_lcd_controller_t *pstcLCD, uint16_t u16Dir); -void NT35510_PrepareWriteRAM(stc_lcd_controller_t *pstcLCD); -void NT35510_SetBackLight(stc_lcd_controller_t *pstcLCD, uint8_t u8PWM); -void NT35510_SetCursor(stc_lcd_controller_t *pstcLCD, uint16_t u16Xpos, uint16_t u16Ypos); -void NT35510_WritePixel(stc_lcd_controller_t *pstcLCD, uint16_t u16Xpos, uint16_t u16Ypos, uint16_t u16RGBCode); -void NT35510_DrawLine(stc_lcd_controller_t *pstcLCD, uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16RGBCode); -void NT35510_DrawCircle(stc_lcd_controller_t *pstcLCD, uint16_t u16Xpos, uint16_t u16Ypos, - uint16_t u16Radius, uint16_t u16RGBCode); -void NT35510_FillTriangle(stc_lcd_controller_t *pstcLCD, uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16X3, uint16_t u16Y3, uint16_t u16RGBCode); -void NT35510_DrawRectangle(stc_lcd_controller_t *pstcLCD, uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16RGBCode); -void NT35510_Clear(stc_lcd_controller_t *pstcLCD, uint16_t u16RGBCode); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __NT35510_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/ov5640/ov5640.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/ov5640/ov5640.c deleted file mode 100644 index ce6dbd2c5ee..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/ov5640/ov5640.c +++ /dev/null @@ -1,404 +0,0 @@ -/** - ******************************************************************************* - * @file ov5640.c - * @brief This file provides firmware functions for camera OV5640. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "ov5640.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @defgroup OV5640 Camera OV5640 - * @{ - */ - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup OV5640_Local_Macros OV5640 Local Macros - * @{ - */ - -/** - * @defgroup OV5640_Chip_ID_Address OV5640 Chip ID Address - * @{ - */ -#define OV5640_CHIPIDH (0x300AU) -#define OV5640_CHIPIDL (0x300BU) -/** - * @} - */ - -#define OV5640_ID (0x5640U) - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ -/** - * @addtogroup OV5640_Local_Functions - * @{ - */ -static void OV5640_I2C_Delay(const stc_ov5640_ll_t *pstcOv5640LL, uint32_t u32Delay); -static void OV5640_I2C_Init(const stc_ov5640_ll_t *pstcOv5640LL); -static void OV5640_I2C_Read(const stc_ov5640_ll_t *pstcOv5640LL, uint16_t u16Reg, - uint8_t au8RegValue[], uint32_t u32Len); -static void OV5640_I2C_Write(const stc_ov5640_ll_t *pstcOv5640LL, uint16_t u16Reg, - const uint8_t au8RegValue[], uint32_t u32Len); -/** - * @} - */ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup OV5640_Global_Functions OV5640 Global Functions - * @{ - */ -/** - * @brief Initialize OV5640. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure. - * @param [in] astcOv5640RegTable Pointer to a @ref stc_ov5640_reg_value_t structure. - * @param [in] u32ArraySize Register table array size. - * @retval int32_t: - * - LL_OK: Initialize successfully - * - LL_ERR: Camera ID error - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t OV5640_Init(const stc_ov5640_ll_t *pstcOv5640LL, - const stc_ov5640_reg_value_t astcOv5640RegTable[], uint32_t u32ArraySize) -{ - uint32_t i; - uint8_t u8RegValue; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != pstcOv5640LL) && (NULL != astcOv5640RegTable) && (0UL != u32ArraySize)) { - OV5640_I2C_Init(pstcOv5640LL); - - /* 0x5640 */ - if (OV5640_ID == OV5640_ReadID(pstcOv5640LL)) { - u8RegValue = 0x11U; - OV5640_I2C_Read(pstcOv5640LL, 0x3103U, &u8RegValue, 1UL); - - u8RegValue = 0x82U; - OV5640_I2C_Write(pstcOv5640LL, 0x3008U, &u8RegValue, 1UL); - - OV5640_I2C_Delay(pstcOv5640LL, 100UL); - - for (i = 0UL; i < u32ArraySize; i++) { - OV5640_I2C_Write(pstcOv5640LL, astcOv5640RegTable[i].u16RegAddr, \ - &astcOv5640RegTable[i].u8RegValue, 1UL); - } - - i32Ret = LL_OK; - } else { - i32Ret = LL_ERR; - } - } - - return i32Ret; -} - -/** - * @brief Set OV5640 RGB565 mode. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure. - * @param [in] astcModeRegTable Pointer to a @ref stc_ov5640_reg_value_t structure. - * @param [in] u32ArraySize Register table array size. - * @retval int32_t: - * - LL_OK: Set successfully - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t OV5640_RGB565_Mode(const stc_ov5640_ll_t *pstcOv5640LL, - const stc_ov5640_reg_value_t astcModeRegTable[], uint32_t u32ArraySize) -{ - uint32_t i; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != pstcOv5640LL) && (NULL != astcModeRegTable) && (0UL != u32ArraySize)) { - for (i = 0UL; i < u32ArraySize; i++) { - OV5640_I2C_Write(pstcOv5640LL, astcModeRegTable[i].u16RegAddr, \ - &astcModeRegTable[i].u8RegValue, 1UL); - } - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @brief Read OV5640 ID. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure. - * @retval OV5640 ID. - */ -uint16_t OV5640_ReadID(const stc_ov5640_ll_t *pstcOv5640LL) -{ - uint8_t au8ID[2]; - - OV5640_I2C_Read(pstcOv5640LL, OV5640_CHIPIDL, &au8ID[0], 1UL); - OV5640_I2C_Read(pstcOv5640LL, OV5640_CHIPIDH, &au8ID[1], 1UL); - - return (uint16_t)(((uint16_t)au8ID[1] << 8) | (uint16_t)au8ID[0]); -} - -/** - * @brief Control OV5640 light. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure. - * @param [in] u8Switch Light on/off - * This parameter can be one of the following values: - * @arg OV5640_LIGHT_ON: Light on - * @arg OV5640_LIGHT_OFF: Light off - * @retval int32_t: - * - LL_OK: Set successfully - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t OV5640_LightControl(const stc_ov5640_ll_t *pstcOv5640LL, uint8_t u8Switch) -{ - uint8_t u8RegValue; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (NULL != pstcOv5640LL) { - u8RegValue = 0x02U; - OV5640_I2C_Write(pstcOv5640LL, 0x3016U, &u8RegValue, 1UL); - OV5640_I2C_Write(pstcOv5640LL, 0x301CU, &u8RegValue, 1UL); - - if (OV5640_LIGHT_OFF == u8Switch) { - u8RegValue = 0x00U; - } - OV5640_I2C_Write(pstcOv5640LL, 0x3019U, &u8RegValue, 1UL); - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @brief Set OV5640 out size. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure. - * @param [in] u16X: Window X offset - * @param [in] u16Y Window Y offset - * @param [in] u16Width Window width - * @param [in] u16Height Window height - * @retval int32_t: - * - LL_OK: Set successfully - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t OV5640_SetOutSize(const stc_ov5640_ll_t *pstcOv5640LL, uint16_t u16X, uint16_t u16Y, - uint16_t u16Width, uint16_t u16Height) -{ - uint16_t u16RegValue; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (NULL != pstcOv5640LL) { - u16RegValue = 0x03U; - OV5640_I2C_Write(pstcOv5640LL, 0x3212U, (uint8_t *)(&u16RegValue), 1UL); /*start group 3 */ - - u16RegValue = u16Width >> 8U; - OV5640_I2C_Write(pstcOv5640LL, 0x3808U, (uint8_t *)(&u16RegValue), 1UL); - - u16RegValue = u16Width & 0xFFU; - OV5640_I2C_Write(pstcOv5640LL, 0x3809U, (uint8_t *)(&u16RegValue), 1UL); - - u16RegValue = u16Height >> 8U; - OV5640_I2C_Write(pstcOv5640LL, 0x380AU, (uint8_t *)(&u16RegValue), 1UL); - - u16RegValue = u16Height & 0xFFU; - OV5640_I2C_Write(pstcOv5640LL, 0x380BU, (uint8_t *)(&u16RegValue), 1UL); - - u16RegValue = u16X >> 8U; - OV5640_I2C_Write(pstcOv5640LL, 0x3810U, (uint8_t *)(&u16RegValue), 1UL); - - u16RegValue = u16X & 0xFFU; - OV5640_I2C_Write(pstcOv5640LL, 0x3811U, (uint8_t *)(&u16RegValue), 1UL); - - u16RegValue = u16Y >> 8U; - OV5640_I2C_Write(pstcOv5640LL, 0x3812U, (uint8_t *)(&u16RegValue), 1UL); - - u16RegValue = u16Y & 0xFFU; - OV5640_I2C_Write(pstcOv5640LL, 0x3813U, (uint8_t *)(&u16RegValue), 1UL); - - u16RegValue = 0x13U; - OV5640_I2C_Write(pstcOv5640LL, 0x3212U, (uint8_t *)(&u16RegValue), 1UL); /* end group 3 */ - - u16RegValue = 0xA3U; - OV5640_I2C_Write(pstcOv5640LL, 0x3212U, (uint8_t *)(&u16RegValue), 1UL); /* launch group 3 */ - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @brief Set OV5640 test pattern. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure. - * @param [in] u8Mode Test mode - * @retval int32_t: - * - LL_OK: Set successfully - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t OV5640_TestPattern(const stc_ov5640_ll_t *pstcOv5640LL, uint8_t u8Mode) -{ - uint8_t u8RegValue; - uint16_t u16RegAddr; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (NULL != pstcOv5640LL) { - switch (u8Mode) { - case 0: - u8RegValue = 0x00U; - break; - case 1: - u8RegValue = 0x80U; - break; - case 2: - u8RegValue = 0x82U; - break; - default: - u8RegValue = 0x00U; - break; - } - - u16RegAddr = 0x503DU; - OV5640_I2C_Write(pstcOv5640LL, u16RegAddr, &u8RegValue, 1UL); - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @} - */ - - -/** - * @defgroup OV5640_Local_Functions OV5640 Local Functions - * @{ - */ - -/** - * @brief OV5640 I2C delay. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure - * @param [in] u32Delay Register to be read - * @retval None - */ -static void OV5640_I2C_Delay(const stc_ov5640_ll_t *pstcOv5640LL, uint32_t u32Delay) -{ - if ((NULL != pstcOv5640LL) && (NULL != pstcOv5640LL->Delay)) { - pstcOv5640LL->Delay(u32Delay); - } -} - -/** - * @brief OV5640 I2C initialize. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure - * @retval None - */ -static void OV5640_I2C_Init(const stc_ov5640_ll_t *pstcOv5640LL) -{ - if ((NULL != pstcOv5640LL) && (NULL != pstcOv5640LL->Init)) { - (void)pstcOv5640LL->Init(); - } -} - -/** - * @brief Read register on Camera register. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure - * @param [in] u16Reg Register to be read - * @param [out] au8RegValue The buffer for reading - * @param [in] u32Len The buffer size for bytes - * @retval None - */ -static void OV5640_I2C_Read(const stc_ov5640_ll_t *pstcOv5640LL, uint16_t u16Reg, - uint8_t au8RegValue[], uint32_t u32Len) -{ - uint8_t au8RegAddr[2]; - - if ((NULL != pstcOv5640LL) && (NULL != pstcOv5640LL->Read)) { - au8RegAddr[0] = (uint8_t)((u16Reg & 0xFF00U) >> 8); - au8RegAddr[1] = (uint8_t)(u16Reg & 0x00FFU); - (void)pstcOv5640LL->Read(au8RegAddr, ARRAY_SZ(au8RegAddr), au8RegValue, u32Len); - } -} - -/** - * @brief Write register on Camera register. - * @param [in] pstcOv5640LL Pointer to a @ref stc_ov5640_ll_t structure - * @param [in] u16Reg Register to be write - * @param [in] au8RegValue The buffer for writing - * @param [in] u32Len The buffer size for bytes - * @retval None - */ -static void OV5640_I2C_Write(const stc_ov5640_ll_t *pstcOv5640LL, uint16_t u16Reg, - const uint8_t au8RegValue[], uint32_t u32Len) -{ - uint8_t au8RegAddr[2]; - - if ((NULL != pstcOv5640LL) && (NULL != pstcOv5640LL->Write)) { - au8RegAddr[0] = (uint8_t)((u16Reg & 0xFF00U) >> 8); - au8RegAddr[1] = (uint8_t)(u16Reg & 0x00FFU); - (void)pstcOv5640LL->Write(au8RegAddr, ARRAY_SZ(au8RegAddr), au8RegValue, u32Len); - } -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/ov5640/ov5640.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/ov5640/ov5640.h deleted file mode 100644 index d22ec4a03cc..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/ov5640/ov5640.h +++ /dev/null @@ -1,147 +0,0 @@ -/** - ******************************************************************************* - * @file ov5640.h - * @brief This file contains all the functions prototypes of the camera OV5640 - * driver library. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __OV5640_H__ -#define __OV5640_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_def.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @addtogroup OV5640 - * @{ - */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ -/** - * @defgroup OV5640_Global_Types OV5640 Global Types - * @{ - */ - -/** - * @brief OV5640 low layer structure definition - */ -typedef struct { - /* Methods */ - void (*Delay)(uint32_t u32Delay); - void (*Init)(void); - void (*Write)(const uint8_t au8Reg[], uint8_t u8RegLen, const uint8_t au8Buf[], uint32_t u32RegLen); - void (*Read)(const uint8_t au8Reg[], uint8_t u8RegLen, uint8_t au8Buf[], uint32_t u32RegLen); -} stc_ov5640_ll_t; - -/** - * @brief OV5640 low layer structure definition - */ -typedef struct { - uint16_t u16RegAddr; - uint8_t u8RegValue; -} stc_ov5640_reg_value_t; - -/** - * @} - */ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup OV5640_Global_Macros OV5640 Global Macros - * @{ - */ - -/** - * @defgroup OV5640_Light_Control OV5640 Light Control - * @{ - */ -#define OV5640_LIGHT_ON (1U) -#define OV5640_LIGHT_OFF (0U) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup OV5640_Global_Functions - * @{ - */ -int32_t OV5640_Init(const stc_ov5640_ll_t *pstcOv5640LL, - const stc_ov5640_reg_value_t astcOv5640RegTable[], uint32_t u32ArraySize); -int32_t OV5640_RGB565_Mode(const stc_ov5640_ll_t *pstcOv5640LL, - const stc_ov5640_reg_value_t astcModeRegTable[], uint32_t u32ArraySize); -uint16_t OV5640_ReadID(const stc_ov5640_ll_t *pstcOv5640LL); -int32_t OV5640_LightControl(const stc_ov5640_ll_t *pstcOv5640LL, uint8_t u8Switch); -int32_t OV5640_SetOutSize(const stc_ov5640_ll_t *pstcOv5640LL, uint16_t u16X, uint16_t u16Y, - uint16_t u16Width, uint16_t u16Height); -int32_t OV5640_TestPattern(const stc_ov5640_ll_t *pstcOv5640LL, uint8_t u8Mode); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __OV5640_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/s29gl064n90tfi03/s29gl064n90tfi03.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/s29gl064n90tfi03/s29gl064n90tfi03.c deleted file mode 100644 index b84083e8869..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/s29gl064n90tfi03/s29gl064n90tfi03.c +++ /dev/null @@ -1,454 +0,0 @@ -/** - ******************************************************************************* - * @file s29gl064n90tfi03.c - * @brief This midware file provides firmware functions to manage the NOR Flash - * component library for s29gl064n90tfi03. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include -#include "s29gl064n90tfi03.h" -#include "hc32_ll_utility.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @defgroup S29GL064N90TFI03 NOR Flash S29GL064N90TFI03 - * @{ - */ - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup S29GL064N90TFI03_Local_Macros S29GL064N90TFI03 Local Macros - * @{ - */ - -/** - * @defgroup EXMC_SMC_Check_Parameters_Validity EXMC_SMC Check Parameters Validity - * @{ - */ -#define IS_NOR_MEMORY_WIDTH(x) \ -( ((x) == NOR_MEMORY_WIDTH_16BIT) || \ - ((x) == NOR_MEMORY_WIDTH_32BIT)) -/** - * @} - */ - -/** - * @defgroup Norflash_Device_Command Norflash Device Command - * @{ - */ -/* Constants to define address to set to write a command */ -#define NOR_CMD_ADDR_FIRST (0x0555U) -#define NOR_CMD_ADDR_FIRST_CFI (0x0055U) -#define NOR_CMD_ADDR_SECOND (0x02AAU) -#define NOR_CMD_ADDR_THIRD (0x0555U) -#define NOR_CMD_ADDR_FOURTH (0x0555U) -#define NOR_CMD_ADDR_FIFTH (0x02AAU) -#define NOR_CMD_ADDR_SIXTH (0x0555U) - -/* Constants to define data to program a command */ -#define NOR_CMD_DATA_READ_RESET (0x00F0U) -#define NOR_CMD_DATA_FIRST (0x00AAU) -#define NOR_CMD_DATA_SECOND (0x0055U) -#define NOR_CMD_DATA_AUTO_SELECT (0x0090U) -#define NOR_CMD_DATA_PROGRAM (0x00A0U) -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD (0x0080U) -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH (0x00AAU) -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH (0x0055U) -#define NOR_CMD_DATA_CHIP_ERASE (0x0010U) -#define NOR_CMD_DATA_CFI (0x0098U) - -#define NOR_CMD_DATA_BLOCK_ERASE (0x30U) - -#define NOR_CMD_DATA_WRITE_TO_BUF_PGM (0x25U) -#define NOR_CMD_DATA_WRITE_TO_BUF_PGM_CONFIRM (0x29U) - -/* Mask on NOR Flash status register */ -#define NOR_MASK_STATUS_DQ5 (0x0020U) -#define NOR_MASK_STATUS_DQ6 (0x0040U) - -/* NOR Flash device IDs addresses */ -#define DEVICE_MANUFACTURER_ID_ADDR (0x0000U) -#define DEVICE_ID1_ADDR (0x0001U) -#define DEVICE_ID2_ADDR (0x000EU) -#define DEVICE_ID3_ADDR (0x000FU) - -/* NOR Flash CFI IDs addresses */ -#define DEVICE_CFI1_ADDR (0x0061U) -#define DEVICE_CFI2_ADDR (0x0062U) -#define DEVICE_CFI3_ADDR (0x0063U) -#define DEVICE_CFI4_ADDR (0x0064U) -/** - * @} - */ - -/** - * @brief SMC device memory address shifting. - * @param [in] mem_base_addr Memory base address - * @param [in] mem_width Memory width - * @param [in] addr Memory address - * @retval SMC device shifted address value - */ -#define NOR_ADDR_SHIFT(mem_base_addr, mem_width, addr) \ -( ((NOR_MEMORY_WIDTH_16BIT == (mem_width))? (((mem_base_addr) + ((addr) << 1UL))):\ - (((mem_base_addr) + ((addr) << 2UL))))) - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup S29GL064N90TFI03_Global_Functions S29GL064N90TFI03 Global Functions - * @{ - */ - -/** - * @brief Reset the NOR memory to Read mode - * @param [in] u32MemoryBaseAddr S29GL064 base address - * @retval None - */ -void S29GL064_Reset(uint32_t u32MemoryBaseAddr) -{ - RW_MEM16(u32MemoryBaseAddr) = NOR_CMD_DATA_READ_RESET; -} - -/** - * @brief Returns the NOR operation status - * @param [in] u32MemoryBaseAddr S29GL064 base address - * @param [in] u32Timeout: Timeout duration - * @retval int32_t: - * - LL_OK: NOR flash status is normal. - * - LL_ERR: NOR flash status is abnormal. - * - LL_ERR_BUSY: NOR flash status is busy. - * - LL_ERR_TIMEOUT: Get NOR flash status timeout. - */ -int32_t S29GL064_GetStatus(uint32_t u32MemoryBaseAddr, uint32_t u32Timeout) -{ - uint16_t u16TmpStatus1; - uint16_t u16TmpStatus2; - uint32_t u32To = 0U; - int32_t i32Ret = LL_ERR_BUSY; - - while (i32Ret == LL_ERR_BUSY) { - /* Read NOR status register (DQ6 and DQ5) */ - u16TmpStatus1 = RW_MEM16(u32MemoryBaseAddr); - u16TmpStatus2 = RW_MEM16(u32MemoryBaseAddr); - - /* If DQ6 did not toggle between the two reads then return Ok */ - if ((u16TmpStatus1 & NOR_MASK_STATUS_DQ6) == (u16TmpStatus2 & NOR_MASK_STATUS_DQ6)) { - i32Ret = LL_OK; - } else { - if ((u16TmpStatus1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5) { - i32Ret = LL_ERR_BUSY; - } - - u16TmpStatus1 = RW_MEM16(u32MemoryBaseAddr); - u16TmpStatus2 = RW_MEM16(u32MemoryBaseAddr); - - /* If DQ6 did not toggle between the two reads then return Ok */ - if ((u16TmpStatus1 & NOR_MASK_STATUS_DQ6) == (u16TmpStatus2 & NOR_MASK_STATUS_DQ6)) { - i32Ret = LL_OK; - } else if ((u16TmpStatus1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5) { - i32Ret = LL_ERR; - } else { /* Do nothing */ - } - } - - /* Check for the Timeout */ - if (u32To++ > u32Timeout) { - i32Ret = LL_ERR_TIMEOUT; - } - } - - return i32Ret; -} - -/** - * @brief Read NOR flash IDs - * @param [in] u32MemoryBaseAddr S29GL064 base address - * @param [in] u32MemoryWidth Memory width - * @param [out] au16Id ID buffer - * @param [in] u32Len Number ID to read - * @retval int32_t: - * - LL_OK: Read successfully. - * - LL_ERR_INVD_PARAM: The pointer au16Id value is NULL or u32Len value is 0. - */ -int32_t S29GL064_ReadId(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth, uint16_t au16Id[], uint32_t u32Len) -{ - uint32_t u32TmpLen; - uint16_t au16TmpId[4]; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != au16Id) && (u32Len > 0UL)) { - DDL_ASSERT(IS_NOR_MEMORY_WIDTH(u32MemoryWidth)); - - /* Send read ID command */ - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FIRST)) = NOR_CMD_DATA_FIRST; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_SECOND)) = NOR_CMD_DATA_SECOND; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_THIRD)) = NOR_CMD_DATA_AUTO_SELECT; - - /* Read the NOR IDs */ - au16TmpId[0] = RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, DEVICE_MANUFACTURER_ID_ADDR)); - au16TmpId[1] = RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, DEVICE_ID1_ADDR)); - au16TmpId[2] = RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, DEVICE_ID2_ADDR)); - au16TmpId[3] = RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, DEVICE_ID3_ADDR)); - - u32TmpLen = (u32Len < 4UL) ? u32Len : 4UL; - (void)memcpy(au16Id, au16TmpId, (u32TmpLen << 1UL)); - - RW_MEM16(u32MemoryBaseAddr) = NOR_CMD_DATA_READ_RESET; - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @brief Read NOR flash CFI IDs - * @param [in] u32MemoryBaseAddr S29GL064 base address - * @param [in] u32MemoryWidth Memory width - * @param [out] au16Id ID buffer - * @param [in] u32Len Number ID to read - * @retval int32_t: - * - LL_OK: Read successfully. - * - LL_ERR_INVD_PARAM: The pointer au16Id value is NULL or u32Len value is 0. - */ -int32_t S29GL064_ReadCfiId(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth, uint16_t au16Id[], uint32_t u32Len) -{ - uint32_t u32TmpLen; - uint16_t au16TmpId[4]; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != au16Id) && (u32Len > 0UL)) { - DDL_ASSERT(IS_NOR_MEMORY_WIDTH(u32MemoryWidth)); - - /* Send read CFI query command */ - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FIRST_CFI)) = NOR_CMD_DATA_CFI; - - /* read the NOR CFI information */ - au16TmpId[0] = RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, DEVICE_CFI1_ADDR)); - au16TmpId[1] = RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, DEVICE_CFI2_ADDR)); - au16TmpId[2] = RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, DEVICE_CFI3_ADDR)); - au16TmpId[3] = RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, DEVICE_CFI4_ADDR)); - - u32TmpLen = (u32Len < 4UL) ? u32Len : 4UL; - (void)memcpy(au16Id, au16TmpId, (u32TmpLen << 1U)); - - RW_MEM16(u32MemoryBaseAddr) = NOR_CMD_DATA_READ_RESET; - i32Ret = LL_OK; - } - - return i32Ret; -} - - -/** - * @brief Erase the entire NOR chip. - * @param [in] u32MemoryBaseAddr S29GL064 base address - * @param [in] u32MemoryWidth Memory width - * @retval None - */ -void S29GL064_EraseChip(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth) -{ - DDL_ASSERT(IS_NOR_MEMORY_WIDTH(u32MemoryWidth)); - - /* Send NOR chip erase command sequence */ - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FIRST)) = NOR_CMD_DATA_FIRST; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_SECOND)) = NOR_CMD_DATA_SECOND; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_THIRD)) = NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FOURTH)) = NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FIFTH)) = NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_SIXTH)) = NOR_CMD_DATA_CHIP_ERASE; -} - -/** - * @brief Erase the specified block of the NOR memory - * @param [in] u32MemoryBaseAddr S29GL064 base address - * @param [in] u32MemoryWidth Memory width - * @param [in] u32SectorAddr Sector address - * @retval None - */ -void S29GL064_EraseSector(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth, uint32_t u32SectorAddr) -{ - DDL_ASSERT(IS_NOR_MEMORY_WIDTH(u32MemoryWidth)); - - /* Send block erase command sequence */ - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FIRST)) = NOR_CMD_DATA_FIRST; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_SECOND)) = NOR_CMD_DATA_SECOND; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_THIRD)) = NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FOURTH)) = NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FIFTH)) = NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH; - - RW_MEM16(u32SectorAddr) = NOR_CMD_DATA_BLOCK_ERASE; -} - -/** - * @brief Read memory for half-word. - * @param [in] u32ReadAddr Memory address to read - * @retval Data of the specified address - */ -uint16_t S29GL064_Read(uint32_t u32ReadAddr) -{ - return RW_MEM16(u32ReadAddr); -} - -/** - * @brief Read memory for half-word. - * @param [in] u32ReadAddr Memory address to read - * @param [out] au16Data Data buffer for reading - * @param [in] u32NumHalfwords Number half-word to write - * @retval int32_t: - * - LL_OK: Read successfully. - * - LL_ERR_INVD_PARAM: The pointer au16Data value is NULL or u32NumHalfwords value is 0. - */ -int32_t S29GL064_ReadBuffer(uint32_t u32ReadAddr, uint16_t au16Data[], uint32_t u32NumHalfwords) -{ - uint32_t i; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((au16Data != NULL) && (u32NumHalfwords > 0UL)) { - for (i = 0UL; i < u32NumHalfwords; i++) { - au16Data[i] = RW_MEM16(u32ReadAddr); - u32ReadAddr += 2UL; - } - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @brief Write memory for half-word. - * @param [in] u32MemoryBaseAddr S29GL064 base address - * @param [in] u32MemoryWidth Memory width - * @param [in] u32ProgramAddr Memory address to write - * @param [in] u16Data Data to write - * @retval None - */ -void S29GL064_Program(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth, uint32_t u32ProgramAddr, uint16_t u16Data) -{ - DDL_ASSERT(IS_NOR_MEMORY_WIDTH(u32MemoryWidth)); - - /* Send program data command */ - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FIRST)) = NOR_CMD_DATA_FIRST; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_SECOND)) = NOR_CMD_DATA_SECOND; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_THIRD)) = NOR_CMD_DATA_PROGRAM; - - /* Write the data */ - RW_MEM16(u32ProgramAddr) = u16Data; -} - -/** - * @brief Write memory(using Program Buffer to Flash command) for half-word. - * @param [in] u32MemoryBaseAddr S29GL064 base address - * @param [in] u32MemoryWidth Memory width - * @param [in] u32ProgramAddr Memory address to write - * @param [in] au16Data Data buffer to write - * @param [in] u32NumHalfwords Number half-word to write - * @retval int32_t: - * - LL_OK: Program successfully. - * - LL_ERR_INVD_PARAM: The pointer au16Data value is NULL or u32NumHalfwords value is 0. - */ -int32_t S29GL064_ProgramBuffer(uint32_t u32MemoryBaseAddr, - uint32_t u32MemoryWidth, - uint32_t u32ProgramAddr, - const uint16_t au16Data[], - uint32_t u32NumHalfwords) -{ - uint32_t i; - uint32_t u32CurAddr; - uint32_t u32EndAddr; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != au16Data) && (u32NumHalfwords > 0UL)) { - DDL_ASSERT(IS_NOR_MEMORY_WIDTH(u32MemoryWidth)); - DDL_ASSERT(IS_ADDR_ALIGN(u32ProgramAddr, 16UL)); - - u32EndAddr = u32ProgramAddr + (u32NumHalfwords << 1UL) - 1UL; - - /* Issue unlock command sequence */ - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_FIRST)) = NOR_CMD_DATA_FIRST; - RW_MEM16(NOR_ADDR_SHIFT(u32MemoryBaseAddr, u32MemoryWidth, NOR_CMD_ADDR_SECOND)) = NOR_CMD_DATA_SECOND; - - /* Write Buffer Load Command */ - RW_MEM16(u32ProgramAddr) = NOR_CMD_DATA_WRITE_TO_BUF_PGM; - RW_MEM16(u32ProgramAddr) = (uint16_t)(u32NumHalfwords - 1UL); - - /* Load Data into NOR Buffer */ - i = 0UL; - for (u32CurAddr = u32ProgramAddr; u32CurAddr <= u32EndAddr; u32CurAddr += 2UL) { - RW_MEM16(u32CurAddr) = au16Data[i++]; - } - - RW_MEM16(u32ProgramAddr) = NOR_CMD_DATA_WRITE_TO_BUF_PGM_CONFIRM; - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/s29gl064n90tfi03/s29gl064n90tfi03.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/s29gl064n90tfi03/s29gl064n90tfi03.h deleted file mode 100644 index d1a6056073b..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/s29gl064n90tfi03/s29gl064n90tfi03.h +++ /dev/null @@ -1,153 +0,0 @@ -/** - ******************************************************************************* - * @file s29gl064n90tfi03.h - * @brief This file contains all the functions prototypes of the NOR Flash - * component library for s29gl064n90tfi03. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __S29GL064N90TFI03_H__ -#define __S29GL064N90TFI03_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_def.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @addtogroup S29GL064N90TFI03 - * @{ - */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup S29GL064N90TFI03_Global_Macros S29GL064N90TFI03 Global Macros - * @{ - */ - -/** - * @defgroup S29GL064N90TFI03_ID_Information S29GL064N90TFI03 ID Information - * @{ - */ -#define S29GL064_MANUFACTURER_ID (0x0001U) -#define S29GL064_DEVICE_ID1 (0x227EU) -#define S29GL064_DEVICE_ID2 (0x2210U) -#define S29GL064_DEVICE_ID3 (0x2201U) -/** - * @} - */ - -/** - * @defgroup S29GL064N90TFI03_Memory_Size S29GL064N90TFI03 Memory Size - * @{ - */ -#define S29GL064_DEVICE_SECTORS (128UL) -#define S29GL064_BYTES_PER_SECTOR (64UL * 1024UL) -#define S29GL064_SIZE (S29GL064_DEVICE_SECTORS * S29GL064_BYTES_PER_SECTOR) /* 8MBytes*/ - -#define S29GL064_BYTES_PER_BUF_PGM (32UL) -/** - * @} - */ - -/** - * @defgroup NOR_Flash_Memory_Width NOR Flash Memory Width - * @{ - */ -#define NOR_MEMORY_WIDTH_16BIT (0UL) -#define NOR_MEMORY_WIDTH_32BIT (1UL) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup S29GL064N90TFI03_Global_Functions S29GL064N90TFI03 Global Functions - * @{ - */ -void S29GL064_Reset(uint32_t u32MemoryBaseAddr); -int32_t S29GL064_GetStatus(uint32_t u32MemoryBaseAddr, uint32_t u32Timeout); -int32_t S29GL064_ReadId(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth, uint16_t au16Id[], uint32_t u32Len); -int32_t S29GL064_ReadCfiId(uint32_t u32MemoryBaseAddr, - uint32_t u32MemoryWidth, - uint16_t au16Id[], - uint32_t u32Len); -void S29GL064_EraseChip(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth); -void S29GL064_EraseSector(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth, uint32_t u32SectorAddr); -uint16_t S29GL064_Read(uint32_t u32ReadAddr); -int32_t S29GL064_ReadBuffer(uint32_t u32ReadAddr, uint16_t au16Data[], uint32_t u32NumHalfwords); -void S29GL064_Program(uint32_t u32MemoryBaseAddr, uint32_t u32MemoryWidth, uint32_t u32ProgramAddr, uint16_t u16Data); -int32_t S29GL064_ProgramBuffer(uint32_t u32MemoryBaseAddr, - uint32_t u32MemoryWidth, - uint32_t u32ProgramAddr, - const uint16_t au16Data[], - uint32_t u32NumHalfwords); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __S29GL064N90TFI03_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/tca9539/tca9539.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/tca9539/tca9539.c deleted file mode 100644 index 9f63efb3790..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/tca9539/tca9539.c +++ /dev/null @@ -1,335 +0,0 @@ -/** - ******************************************************************************* - * @file tca9539.c - * @brief This file provides firmware functions for IO expand IC TCA9539. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "tca9539.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @defgroup TCA9539 IO Expand IC TCA9539 - * @{ - */ - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup TCA9539_Global_Functions TCA9539 Global Functions - * @{ - */ - -/** - * @brief Initialize TCA9539. - * @param [in] pstcTca9539LL Pointer to a @ref stc_tca9539_ll_t structure. - * @retval int32_t: - * - LL_OK: Initialize success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t TCA9539_Init(const stc_tca9539_ll_t *pstcTca9539LL) -{ - int32_t i32Ret = LL_OK; - uint8_t u8TempData[2]; - - if (pstcTca9539LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - pstcTca9539LL->Reset(); - pstcTca9539LL->Init(); - /* All Pins are input as default */ - u8TempData[1] = 0xFFU; - u8TempData[0] = TCA9539_REG_CONFIG_PORT0; - pstcTca9539LL->Write(&u8TempData[0], &u8TempData[1], 1U); - u8TempData[0] = TCA9539_REG_CONFIG_PORT1; - pstcTca9539LL->Write(&u8TempData[0], &u8TempData[1], 1U); - } - - return i32Ret; -} - -/** - * @brief Initialize TCA9539 interrupt. - * @param [in] pstcTca9539LL Pointer to a @ref stc_tca9539_ll_t structure. - * @retval int32_t: - * - LL_OK: Initialize success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t TCA9539_IntInit(const stc_tca9539_ll_t *pstcTca9539LL) -{ - int32_t i32Ret = LL_OK; - - if (pstcTca9539LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - pstcTca9539LL->IntInit(); - } - - return i32Ret; -} - -/** - * @brief Reset TCA9539. - * @param [in] pstcTca9539LL Pointer to a @ref stc_tca9539_ll_t structure. - * @retval int32_t: - * - LL_OK: Reset success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t TCA9539_Reset(const stc_tca9539_ll_t *pstcTca9539LL) -{ - int32_t i32Ret = LL_OK; - - if (pstcTca9539LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - pstcTca9539LL->Reset(); - } - - return i32Ret; -} - -/** - * @brief Write TCA9539 pin output value. - * @param [in] pstcTca9539LL Pointer to a @ref stc_tca9539_ll_t structure. - * @param [in] u8Port Port number. - * This parameter can be one of the following values: - * @arg TCA9539_IO_PORT0 - * @arg TCA9539_IO_PORT1 - * @param [in] u8Pin Pin number. - * This parameter can be one of the following values: - * @arg TCA9539_IO_PIN0 - * @arg TCA9539_IO_PIN1 - * @arg TCA9539_IO_PIN2 - * @arg TCA9539_IO_PIN3 - * @arg TCA9539_IO_PIN4 - * @arg TCA9539_IO_PIN5 - * @arg TCA9539_IO_PIN6 - * @arg TCA9539_IO_PIN7 - * @arg TCA9539_IO_PIN_ALL: All of the above - * @param [in] u8PinState Pin state to be written. - * This parameter can be one of the following values: - * @arg TCA9539_PIN_RESET - * @arg TCA9539_PIN_SET - * @retval int32_t: - * - LL_OK: Operation success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t TCA9539_WritePin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState) -{ - int32_t i32Ret = LL_OK; - uint8_t u8TempData[2]; - - if (pstcTca9539LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - u8TempData[0] = u8Port + TCA9539_REG_OUTPUT_PORT0; - pstcTca9539LL->Read(&u8TempData[0], &u8TempData[1], 1U); - if (0U == u8PinState) { - u8TempData[1] &= (uint8_t)(~u8Pin); - } else { - u8TempData[1] |= u8Pin; - } - pstcTca9539LL->Write(&u8TempData[0], &u8TempData[1], 1U); - } - - return i32Ret; -} - -/** - * @brief Read TCA9539 pin input value. - * @param [in] pstcTca9539LL Pointer to a @ref stc_tca9539_ll_t structure. - * @param [in] u8Port Port number. - * This parameter can be one of the following values: - * @arg TCA9539_IO_PORT0 - * @arg TCA9539_IO_PORT1 - * @param [in] u8Pin Pin number. - * This parameter can be one of the following values: - * @arg TCA9539_IO_PIN0 - * @arg TCA9539_IO_PIN1 - * @arg TCA9539_IO_PIN2 - * @arg TCA9539_IO_PIN3 - * @arg TCA9539_IO_PIN4 - * @arg TCA9539_IO_PIN5 - * @arg TCA9539_IO_PIN6 - * @arg TCA9539_IO_PIN7 - * @arg TCA9539_IO_PIN_ALL: All of the above - * @param [out] pu8PinState Pin state to be read. - * This parameter can be one of the following values: - * @arg TCA9539_PIN_RESET - * @arg TCA9539_PIN_SET - * @retval int32_t: - * - LL_OK: Operation success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t TCA9539_ReadPin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin, uint8_t *pu8PinState) -{ - int32_t i32Ret = LL_OK; - uint8_t u8TempData[2]; - - if (pstcTca9539LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - u8TempData[0] = u8Port + TCA9539_REG_INPUT_PORT0; - pstcTca9539LL->Read(&u8TempData[0], &u8TempData[1], 1U); - if (0U != (u8TempData[1] & u8Pin)) { - *pu8PinState = TCA9539_PIN_SET; - } else { - *pu8PinState = TCA9539_PIN_RESET; - } - } - - return i32Ret; -} - -/** - * @brief Toggle TCA9539 pin output value. - * @param [in] pstcTca9539LL Pointer to a @ref stc_tca9539_ll_t structure. - * @param [in] u8Port Port number. - * This parameter can be one of the following values: - * @arg TCA9539_IO_PORT0 - * @arg TCA9539_IO_PORT1 - * @param [in] u8Pin Pin number. - * This parameter can be one of the following values: - * @arg TCA9539_IO_PIN0 - * @arg TCA9539_IO_PIN1 - * @arg TCA9539_IO_PIN2 - * @arg TCA9539_IO_PIN3 - * @arg TCA9539_IO_PIN4 - * @arg TCA9539_IO_PIN5 - * @arg TCA9539_IO_PIN6 - * @arg TCA9539_IO_PIN7 - * @arg TCA9539_IO_PIN_ALL: All of the above - * @retval int32_t: - * - LL_OK: Operation success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t TCA9539_TogglePin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin) -{ - int32_t i32Ret = LL_OK; - uint8_t u8TempData[2]; - - if (pstcTca9539LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - u8TempData[0] = u8Port + TCA9539_REG_OUTPUT_PORT0; - pstcTca9539LL->Read(&u8TempData[0], &u8TempData[1], 1U); - u8TempData[1] ^= u8Pin; - pstcTca9539LL->Write(&u8TempData[0], &u8TempData[1], 1U); - } - - return i32Ret; -} - -/** - * @brief Configuration TCA9539 pin. - * @param [in] pstcTca9539LL Pointer to a @ref stc_tca9539_ll_t structure. - * @param [in] u8Port Port number. - * This parameter can be one of the following values: - * @arg TCA9539_IO_PORT0 - * @arg TCA9539_IO_PORT1 - * @param [in] u8Pin Pin number. - * This parameter can be one of the following values: - * @arg TCA9539_IO_PIN0 - * @arg TCA9539_IO_PIN1 - * @arg TCA9539_IO_PIN2 - * @arg TCA9539_IO_PIN3 - * @arg TCA9539_IO_PIN4 - * @arg TCA9539_IO_PIN5 - * @arg TCA9539_IO_PIN6 - * @arg TCA9539_IO_PIN7 - * @arg TCA9539_IO_PIN_ALL: All of the above - * @param [in] u8Dir Pin output direction. - * This parameter can be one of the following values: - * @arg TCA9539_DIR_OUT - * @arg TCA9539_DIR_IN - * @retval int32_t: - * - LL_OK: Operation success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t TCA9539_ConfigPin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin, uint8_t u8Dir) -{ - int32_t i32Ret = LL_OK; - uint8_t u8TempData[2]; - - if (pstcTca9539LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - u8TempData[0] = u8Port + TCA9539_REG_CONFIG_PORT0; - pstcTca9539LL->Read(&u8TempData[0], &u8TempData[1], 1U); - if (TCA9539_DIR_OUT == u8Dir) { - u8TempData[1] &= (uint8_t)(~u8Pin); - } else { - u8TempData[1] |= u8Pin; - } - pstcTca9539LL->Write(&u8TempData[0], &u8TempData[1], 1U); - } - - return i32Ret; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/tca9539/tca9539.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/tca9539/tca9539.h deleted file mode 100644 index c409eb3e6d4..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/tca9539/tca9539.h +++ /dev/null @@ -1,184 +0,0 @@ -/** - ******************************************************************************* - * @file tca9539.h - * @brief This file contains all the functions prototypes of the TCA9539 driver - * library. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __TCA9539_H__ -#define __TCA9539_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_def.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @addtogroup TCA9539 - * @{ - */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ -/** - * @brief TCA9539 low layer structure definition - */ -typedef struct { - /* Methods */ - void (*Init)(void); - void (*Write)(const uint8_t *, const uint8_t *, uint32_t); - void (*Read)(const uint8_t *, uint8_t *, uint32_t); - void (*Reset)(void); - void (*IntInit)(void); -} stc_tca9539_ll_t; - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup TCA9539_Global_Macros TCA9539 Global Macros - * @{ - */ - -/** - * @defgroup TCA9539_REGISTER_Definition TCA9539 Register Definition - * @{ - */ -#define TCA9539_REG_INPUT_PORT0 (0x00U) -#define TCA9539_REG_INPUT_PORT1 (0x01U) -#define TCA9539_REG_OUTPUT_PORT0 (0x02U) -#define TCA9539_REG_OUTPUT_PORT1 (0x03U) -#define TCA9539_REG_INVERT_PORT0 (0x04U) -#define TCA9539_REG_INVERT_PORT1 (0x05U) -#define TCA9539_REG_CONFIG_PORT0 (0x06U) -#define TCA9539_REG_CONFIG_PORT1 (0x07U) -/** - * @} - */ - -/** - * @defgroup TCA9539_Port_Definition TCA9539 Port Definition - * @{ - */ -#define TCA9539_IO_PORT0 (0x00U) -#define TCA9539_IO_PORT1 (0x01U) -/** - * @} - */ - -/** - * @defgroup TCA9539_Pin_Definition TCA9539 Pin Definition - * @{ - */ -#define TCA9539_IO_PIN0 (0x01U) -#define TCA9539_IO_PIN1 (0x02U) -#define TCA9539_IO_PIN2 (0x04U) -#define TCA9539_IO_PIN3 (0x08U) -#define TCA9539_IO_PIN4 (0x10U) -#define TCA9539_IO_PIN5 (0x20U) -#define TCA9539_IO_PIN6 (0x40U) -#define TCA9539_IO_PIN7 (0x80U) -#define TCA9539_IO_PIN_ALL (0xFFU) -/** - * @} - */ - -/** - * @defgroup TCA9539_Direction_Definition TCA9539 Direction Definition - * @{ - */ -#define TCA9539_DIR_OUT (0x00U) -#define TCA9539_DIR_IN (0x01U) -/** - * @} - */ - -/** - * @defgroup TCA9539_Pin_State_Definition TCA9539 Pin State Definition - * @{ - */ -#define TCA9539_PIN_RESET (0x00U) -#define TCA9539_PIN_SET (0x01U) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @defgroup TCA9539_Global_Functions TCA9539 Global Functions - * @{ - */ -int32_t TCA9539_Init(const stc_tca9539_ll_t *pstcTca9539LL); -int32_t TCA9539_IntInit(const stc_tca9539_ll_t *pstcTca9539LL); -int32_t TCA9539_Reset(const stc_tca9539_ll_t *pstcTca9539LL); - -int32_t TCA9539_WritePin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState); -int32_t TCA9539_ReadPin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin, uint8_t *pu8PinState); -int32_t TCA9539_TogglePin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin); -int32_t TCA9539_ConfigPin(const stc_tca9539_ll_t *pstcTca9539LL, uint8_t u8Port, uint8_t u8Pin, uint8_t u8Dir); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __TCA9539_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/w25qxx/w25qxx.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/w25qxx/w25qxx.c deleted file mode 100644 index 29a47470866..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/w25qxx/w25qxx.c +++ /dev/null @@ -1,567 +0,0 @@ -/** - ******************************************************************************* - * @file w25qxx.c - * @brief This midware file provides firmware functions to W25QXX group spi flash. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "w25qxx.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @defgroup W25QXX Flash Driver for W25QXX - * @{ - */ - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup W25QXX_Local_Macros W25QXX Local Macros - * @{ - */ -#define W25QXX_FLAG_BUSY (1UL << 0U) -#define W25QXX_FLAG_WEL (1UL << 1U) /*!< Write Enable Latch */ -#define W25QXX_FLAG_SUSPEND (1UL << 15U) /*!< Write Enable Latch */ - -#define LOAD_CMD(a, cmd, addr) do { \ - (a)[0U] = (cmd); \ - (a)[1U] = (uint8_t)((addr) >> 16U); \ - (a)[2U] = (uint8_t)((addr) >> 8U); \ - (a)[3U] = (uint8_t)(addr); \ - } while (0U) - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @addtogroup W25QXX_Local_Functions W25QXX Local Functions - * @{ - */ - -/** - * @brief W25QXX write command. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u8Cmd Command of W25QXX. - * @param [in] pu8CmdData Pointer to a buffer that contains the data following the command. - * @param [in] u32CmdDataLen The length of the command data in bytes. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -static int32_t W25QXX_WriteCmd(const stc_w25qxx_ll_t *pstcW25qxxLL, \ - uint8_t u8Cmd, const uint8_t *pu8CmdData, uint32_t u32CmdDataLen) -{ - int32_t i32Ret; - - pstcW25qxxLL->Active(); - i32Ret = pstcW25qxxLL->Trans(&u8Cmd, 1U); - if ((i32Ret == LL_OK) && (pu8CmdData != NULL) && (u32CmdDataLen > 0UL)) { - i32Ret = pstcW25qxxLL->Trans(pu8CmdData, u32CmdDataLen); - } - pstcW25qxxLL->Inactive(); - - return i32Ret; -} - -/** - * @brief W25QXX read command. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u8Cmd Command of W25QXX. - * @param [in] pu8CmdData Pointer to a buffer that contains the data following the command. - * @param [in] u32CmdDataLen The length of the command data in bytes. - * @param [in] pu8Info The information of the command. - * @param [in] u8InfoLen The length of the information. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -static int32_t W25QXX_ReadCmd(const stc_w25qxx_ll_t *pstcW25qxxLL, \ - uint8_t u8Cmd, uint8_t *pu8CmdData, uint32_t u32CmdDataLen, - uint8_t *pu8Info, uint8_t u8InfoLen) -{ - int32_t i32Ret; - - pstcW25qxxLL->Active(); - i32Ret = pstcW25qxxLL->Trans(&u8Cmd, 1U); - if ((i32Ret == LL_OK) && (pu8CmdData != NULL) && (u32CmdDataLen > 0UL)) { - i32Ret = pstcW25qxxLL->Trans(pu8CmdData, u32CmdDataLen); - } - if ((i32Ret == LL_OK) && (pu8Info != NULL) && (u8InfoLen > 0UL)) { - i32Ret = pstcW25qxxLL->Receive(pu8Info, (uint32_t)u8InfoLen); - } - pstcW25qxxLL->Inactive(); - - return i32Ret; -} - -/** - * @brief W25QXX write data. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u8Cmd Command of W25QXX. - * @param [in] u32Addr The start address of the data to be written. - * @param [in] pu8Data The data to be written. - * @param [in] u32DataLen The length of the data in bytes. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -static int32_t W25QXX_Wt(const stc_w25qxx_ll_t *pstcW25qxxLL, \ - uint8_t u8Cmd, uint32_t u32Addr, \ - const uint8_t *pu8Data, uint32_t u32DataLen) -{ - uint8_t au8Cmd[4U]; - int32_t i32Ret; - - LOAD_CMD(au8Cmd, u8Cmd, u32Addr); - - pstcW25qxxLL->Active(); - i32Ret = pstcW25qxxLL->Trans(au8Cmd, 4U); - if ((i32Ret == LL_OK) && (pu8Data != NULL) && (u32DataLen > 0UL)) { - i32Ret = pstcW25qxxLL->Trans(pu8Data, u32DataLen); - } - pstcW25qxxLL->Inactive(); - - return i32Ret; -} - -/** - * @brief W25QXX read data. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u8Cmd Command of W25QXX. - * @param [in] u32Addr The start address of the data to be written. - * @param [in] pu8Data The data to be stored. - * @param [in] u32DataLen The length of the data in bytes. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -static int32_t W25QXX_Rd(const stc_w25qxx_ll_t *pstcW25qxxLL, \ - uint8_t u8Cmd, uint32_t u32Addr, \ - uint8_t *pu8Data, uint32_t u32DataLen) -{ - uint8_t au8Cmd[4U]; - int32_t i32Ret; - - LOAD_CMD(au8Cmd, u8Cmd, u32Addr); - - pstcW25qxxLL->Active(); - i32Ret = pstcW25qxxLL->Trans(au8Cmd, 4U); - if (i32Ret == LL_OK) { - i32Ret = pstcW25qxxLL->Receive(pu8Data, u32DataLen); - } - pstcW25qxxLL->Inactive(); - - return i32Ret; -} - -/** - * @brief W25QXX Write enable. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -static int32_t W25QXX_WriteEnable(const stc_w25qxx_ll_t *pstcW25qxxLL) -{ - return W25QXX_WriteCmd(pstcW25qxxLL, W25QXX_WRITE_ENABLE, NULL, 0U); -} - -/** - * @brief W25QXX Write disable. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -static int32_t W25QXX_WriteDisable(const stc_w25qxx_ll_t *pstcW25qxxLL) -{ - return W25QXX_WriteCmd(pstcW25qxxLL, W25QXX_WRITE_DISABLE, NULL, 0U); -} - -/** - * @brief Wait for processing done. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout or W25QXX timeout. - */ -static int32_t W25QXX_WaitProcessDone(const stc_w25qxx_ll_t *pstcW25qxxLL) -{ - uint8_t u8Status; - int32_t i32Ret = LL_ERR_TIMEOUT; - volatile uint32_t u32Timecount = W25QXX_TIMEOUT; - - while (u32Timecount-- != 0UL) { - i32Ret = W25QXX_ReadStatus(pstcW25qxxLL, W25QXX_READ_STATUS_REGISTER_1, &u8Status); - if ((i32Ret == LL_OK) && ((u8Status & W25QXX_FLAG_BUSY) == 0U)) { - break; - } - } - - return i32Ret; -} - -/** - * @} - */ - -/** - * @defgroup W25QXX_Global_Functions W25QXX Global Functions - * @{ - */ -/** - * @brief Initializes W25QXX. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t W25QXX_Init(const stc_w25qxx_ll_t *pstcW25qxxLL) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (pstcW25qxxLL != NULL) { - pstcW25qxxLL->Init(); - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @brief De-Initialize W25QXX. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t W25QXX_DeInit(const stc_w25qxx_ll_t *pstcW25qxxLL) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (pstcW25qxxLL != NULL) { - pstcW25qxxLL->DeInit(); - i32Ret = LL_OK; - } - - return i32Ret; -} - -/** - * @brief Read manufacturer device ID. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [out] pu16ID Pointer to an address to store the device ID. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -int32_t W25QXX_GetManDeviceId(const stc_w25qxx_ll_t *pstcW25qxxLL, uint16_t *pu16ID) -{ - uint8_t au8TempId[2U]; - uint8_t au8Dummy[3U] = {0U}; - uint16_t u16ManID; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((pstcW25qxxLL != NULL) && (pu16ID != NULL)) { - i32Ret = W25QXX_ReadCmd(pstcW25qxxLL, W25QXX_MANUFACTURER_DEVICE_ID, au8Dummy, 3U, au8TempId, 2U); - if (i32Ret == LL_OK) { - u16ManID = (uint16_t)au8TempId[0U] << 8U; - u16ManID |= au8TempId[1U]; - *pu16ID = u16ManID; - } - } - - return i32Ret; -} - -/** - * @brief Read unique ID. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [out] pu8UniqueId Pointer to a buffer the 64 bit unique ID to be stored. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -int32_t W25QXX_GetUniqueId(const stc_w25qxx_ll_t *pstcW25qxxLL, uint8_t *pu8UniqueId) -{ - uint8_t au8Dummy[4U] = {0U}; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((pstcW25qxxLL != NULL) && (pu8UniqueId != NULL)) { - i32Ret = W25QXX_ReadCmd(pstcW25qxxLL, W25QXX_READ_UNIQUE_ID, au8Dummy, 4U, pu8UniqueId, 8U); - } - - return i32Ret; -} - -/** - * @brief Read status register. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u8SrRdCmd Command of reading status register. - * @arg W25QXX_READ_STATUS_REGISTER_1: Read status register 1. - * @arg W25QXX_READ_STATUS_REGISTER_2: Read status register 2. - * @arg W25QXX_READ_STATUS_REGISTER_3: Read status register 3. - * @param [out] pu8Status Pointer to an address the status value to be stored. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -int32_t W25QXX_ReadStatus(const stc_w25qxx_ll_t *pstcW25qxxLL, uint8_t u8SrRdCmd, uint8_t *pu8Status) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((pstcW25qxxLL != NULL) && (pu8Status != NULL)) { - i32Ret = W25QXX_ReadCmd(pstcW25qxxLL, u8SrRdCmd, NULL, 0U, pu8Status, 1U); - } - - return i32Ret; -} - -/** - * @brief Write status register. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u8SrWtCmd Command of writting status register. - * @arg W25QXX_WRITE_STATUS_REGISTER_1: Write status register 1. - * @arg W25QXX_WRITE_STATUS_REGISTER_2: Write status register 2. - * @arg W25QXX_WRITE_STATUS_REGISTER_3: Write status register 3. - * @param [in] u8Value 8bit value of the specified status register. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -int32_t W25QXX_WriteStatus(const stc_w25qxx_ll_t *pstcW25qxxLL, uint8_t u8SrWtCmd, uint8_t u8Value) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (pstcW25qxxLL != NULL) { - i32Ret = W25QXX_WriteCmd(pstcW25qxxLL, u8SrWtCmd, &u8Value, 1U); - } - - return i32Ret; -} - -/** - * @brief Power down. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -int32_t W25QXX_PowerDown(const stc_w25qxx_ll_t *pstcW25qxxLL) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (pstcW25qxxLL != NULL) { - i32Ret = W25QXX_WriteCmd(pstcW25qxxLL, W25QXX_POWER_DOWN, NULL, 0U); - if (i32Ret == LL_OK) { - pstcW25qxxLL->Delay(1U); - } - } - - return i32Ret; -} - -/** - * @brief Release power down. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -int32_t W25QXX_ReleasePowerDown(const stc_w25qxx_ll_t *pstcW25qxxLL) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (pstcW25qxxLL != NULL) { - i32Ret = W25QXX_WriteCmd(pstcW25qxxLL, W25QXX_RELEASE_POWER_DOWN_ID, NULL, 0U); - if (i32Ret == LL_OK) { - pstcW25qxxLL->Delay(1U); - } - } - - return i32Ret; -} - -/** - * @brief Ease chip. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout or W25QXX timeout. - */ -int32_t W25QXX_EraseChip(const stc_w25qxx_ll_t *pstcW25qxxLL) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (pstcW25qxxLL != NULL) { - i32Ret = W25QXX_WriteEnable(pstcW25qxxLL); - if (i32Ret == LL_OK) { - i32Ret = W25QXX_WaitProcessDone(pstcW25qxxLL); - } - if (i32Ret == LL_OK) { - i32Ret = W25QXX_WriteCmd(pstcW25qxxLL, W25QXX_CHIP_ERASE, NULL, 0U); - } - if (i32Ret == LL_OK) { - i32Ret = W25QXX_WaitProcessDone(pstcW25qxxLL); - } - } - - return i32Ret; -} - -/** - * @brief Ease sector. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u32Addr Any address of the specified sector. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout or W25QXX timeout. - */ -int32_t W25QXX_EraseSector(const stc_w25qxx_ll_t *pstcW25qxxLL, uint32_t u32Addr) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if (pstcW25qxxLL != NULL) { - i32Ret = W25QXX_WriteEnable(pstcW25qxxLL); - if (i32Ret == LL_OK) { - i32Ret = W25QXX_WaitProcessDone(pstcW25qxxLL); - } - if (i32Ret == LL_OK) { - i32Ret = W25QXX_Wt(pstcW25qxxLL, W25QXX_SECTOR_ERASE, u32Addr, NULL, 0U); - } - if (i32Ret == LL_OK) { - i32Ret = W25QXX_WaitProcessDone(pstcW25qxxLL); - } - if (i32Ret == LL_OK) { - i32Ret = W25QXX_WriteDisable(pstcW25qxxLL); - } - } - - return i32Ret; -} - -/** - * @brief W25QXX read data. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u32Addr The start address of the data to be read. - * @param [in] pu8ReadBuf The pointer to the buffer contains the data to be stored. - * @param [in] u32NumByteToRead Buffer size in bytes. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout. - */ -int32_t W25QXX_ReadData(const stc_w25qxx_ll_t *pstcW25qxxLL, uint32_t u32Addr, \ - uint8_t *pu8ReadBuf, uint32_t u32NumByteToRead) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((pstcW25qxxLL != NULL) && (pu8ReadBuf != NULL) && (u32NumByteToRead != 0UL)) { - i32Ret = W25QXX_Rd(pstcW25qxxLL, W25QXX_READ_DATA, u32Addr, pu8ReadBuf, u32NumByteToRead); - } - - return i32Ret; -} - -/** - * @brief W25QXX page program. - * @param [in] pstcW25qxxLL Pointer to a @ref stc_w25qxx_ll_t structure. - * @param [in] u32Addr Start address of the page. - * @param [in] pu8Data Pointer to a buffer that contains the data to be written. - * @param [in] u32NumByteToProgram Size of the buffer. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout or W25QXX timeout. - */ -int32_t W25QXX_PageProgram(const stc_w25qxx_ll_t *pstcW25qxxLL, uint32_t u32Addr, \ - const uint8_t *pu8Data, uint32_t u32NumByteToProgram) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((pstcW25qxxLL != NULL) && (pu8Data != NULL) && (u32NumByteToProgram != 0UL)) { - i32Ret = W25QXX_WriteEnable(pstcW25qxxLL); - if (i32Ret == LL_OK) { - i32Ret = W25QXX_Wt(pstcW25qxxLL, W25QXX_PAGE_PROGRAM, u32Addr, pu8Data, u32NumByteToProgram); - } - if (i32Ret == LL_OK) { - i32Ret = W25QXX_WaitProcessDone(pstcW25qxxLL); - } - } - - return i32Ret; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/w25qxx/w25qxx.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/w25qxx/w25qxx.h deleted file mode 100644 index 57acf1621c4..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/w25qxx/w25qxx.h +++ /dev/null @@ -1,190 +0,0 @@ -/** - ******************************************************************************* - * @file w25qxx.h - * @brief This file provides firmware functions to W25QXX group spi flash. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __W25QXX_H__ -#define __W25QXX_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_def.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @addtogroup W25QXX - * @{ - */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ -/** - * @brief W25QXX low layer structure definition - */ -typedef struct { - void (*Delay)(uint32_t); - void (*Init)(void); - void (*DeInit)(void); - void (*Active)(void); - void (*Inactive)(void); - int32_t (*Trans)(const uint8_t *, uint32_t); - int32_t (*Receive)(uint8_t *, uint32_t); -} stc_w25qxx_ll_t; - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup W25QXX_Global_Macros W25QXX Global Macros - * @{ - */ - -/** - * @defgroup W25QXX_ID W25QXX ID - * @{ - */ -#define W25Q80 (0xEF13U) -#define W25Q16 (0xEF14U) -#define W25Q32 (0xEF15U) -#define W25Q64 (0xEF16U) -#define W25Q128 (0xEF17U) -/** - * @} - */ - -/** - * @defgroup W25QXX_Command W25QXX Command - * @{ - */ -#define W25QXX_WRITE_ENABLE (0x06U) -#define W25QXX_VOLATILE_SR_WRITE_ENABLE (0x50U) -#define W25QXX_WRITE_DISABLE (0x04U) -#define W25QXX_RELEASE_POWER_DOWN_ID (0xABU) -#define W25QXX_MANUFACTURER_DEVICE_ID (0x90U) -#define W25QXX_JEDEC_ID (0x9FU) -#define W25QXX_READ_UNIQUE_ID (0x4BU) -#define W25QXX_READ_DATA (0x03U) -#define W25QXX_FAST_READ (0x0BU) -#define W25QXX_PAGE_PROGRAM (0x02U) -#define W25QXX_SECTOR_ERASE (0x20U) -#define W25QXX_BLOCK_ERASE_32KB (0x52U) -#define W25QXX_BLOCK_ERASE_64KB (0xD8U) -#define W25QXX_CHIP_ERASE (0xC7U) -#define W25QXX_READ_STATUS_REGISTER_1 (0x05U) -#define W25QXX_WRITE_STATUS_REGISTER_1 (0x01U) -#define W25QXX_READ_STATUS_REGISTER_2 (0x35U) -#define W25QXX_WRITE_STATUS_REGISTER_2 (0x31U) -#define W25QXX_READ_STATUS_REGISTER_3 (0x15U) -#define W25QXX_WRITE_STATUS_REGISTER_3 (0x11U) -#define W25QXX_READ_SFDP_REGISTER (0x5AU) -#define W25QXX_ERASE_SECURITY_REGISTER (0x44U) -#define W25QXX_PROGRAM_SECURITY_REGISTER (0x42U) -#define W25QXX_READ_SECURITY_REGISTER (0x48U) -#define W25QXX_GLOBAL_BLOCK_LOCK (0x7EU) -#define W25QXX_GLOBAL_BLOCK_UNLOCK (0x98U) -#define W25QXX_READ_BLOCK_LOCK (0x3DU) -#define W25QXX_INDIVIDUAL_BLOCK_LOCK (0x36U) -#define W25QXX_INDIVIDUAL_BLOCK_UNLOCK (0x39U) -#define W25QXX_ERASE_PROGRAM_SUSPEND (0x75U) -#define W25QXX_ERASE_PROGRAM_RESUME (0x7AU) -#define W25QXX_POWER_DOWN (0xB9U) -#define W25QXX_ENABLE_RESET (0x66U) -#define W25QXX_RESET_DEVICE (0x99U) -/** - * @} - */ - -/** - * @defgroup W25QXX_Timeout_Value W25QXX Timeout Value - * @{ - */ -#define W25QXX_TIMEOUT (100000UL) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup W25QXX_Global_Functions W25QXX Global Functions - * @{ - */ - -int32_t W25QXX_Init(const stc_w25qxx_ll_t *pstcW25qxxLL); -int32_t W25QXX_DeInit(const stc_w25qxx_ll_t *pstcW25qxxLL); -int32_t W25QXX_GetManDeviceId(const stc_w25qxx_ll_t *pstcW25qxxLL, uint16_t *pu16ID); -int32_t W25QXX_GetUniqueId(const stc_w25qxx_ll_t *pstcW25qxxLL, uint8_t *pu8UniqueId); -int32_t W25QXX_ReadStatus(const stc_w25qxx_ll_t *pstcW25qxxLL, uint8_t u8SrRdCmd, uint8_t *pu8Status); -int32_t W25QXX_WriteStatus(const stc_w25qxx_ll_t *pstcW25qxxLL, uint8_t u8SrWtCmd, uint8_t u8Value); -int32_t W25QXX_PowerDown(const stc_w25qxx_ll_t *pstcW25qxxLL); -int32_t W25QXX_ReleasePowerDown(const stc_w25qxx_ll_t *pstcW25qxxLL); -int32_t W25QXX_EraseChip(const stc_w25qxx_ll_t *pstcW25qxxLL); -int32_t W25QXX_EraseSector(const stc_w25qxx_ll_t *pstcW25qxxLL, uint32_t u32Addr); -int32_t W25QXX_ReadData(const stc_w25qxx_ll_t *pstcW25qxxLL, uint32_t u32Addr, uint8_t *pu8ReadBuf, uint32_t u32NumByteToRead); -int32_t W25QXX_PageProgram(const stc_w25qxx_ll_t *pstcW25qxxLL, uint32_t u32Addr, const uint8_t *pu8Data, uint32_t u32NumByteToProgram); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __W25QXX_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/wm8731/wm8731.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/wm8731/wm8731.c deleted file mode 100644 index 4cff44797fe..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/wm8731/wm8731.c +++ /dev/null @@ -1,375 +0,0 @@ -/** - ******************************************************************************* - * @file wm8731.c - * @brief This midware file provides firmware functions to manage the codec - * component library for wm8731. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "wm8731.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @defgroup WM8731 Codec WM8731 - * @{ - */ - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup WM8731_Local_Macros WM8731 Local Macros - * @{ - */ - -/* WM8731 volume convert */ -#define WM8731_INPUT_VOL_CONV(__VOL__) (((__VOL__) >= 100U) ? 31U : ((uint8_t)((((uint32_t)__VOL__) * 31U) / 100U))) -#define WM8731_OUTPUT_VOL_CONV(__VOL__) (((__VOL__) >= 100U) ? 80U : ((uint8_t)((((uint32_t)__VOL__) * 80U) / 100U))) - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -static uint8_t u8InputDevice = 0U; -static uint8_t u8OutputDevice = 0U; - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup WM8731_Global_Functions WM8731 Global Functions - * @{ - */ - -/** - * @brief Reset WM8731. - * @param [in] pstcWm8731LL Pointer to a @ref stc_wm8731_ll_t structure - * @retval int32_t: - * - LL_OK: Reset success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t WM8731_Reset(const stc_wm8731_ll_t *pstcWm8731LL) -{ - int32_t i32Ret = LL_OK; - uint8_t u8WriteData[2]; - - if (pstcWm8731LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - /* Writing 00000000 to register resets device */ - u8WriteData[0] = WM8731_R15_RST; - u8WriteData[1] = 0U; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - u8InputDevice = 0U; - u8OutputDevice = 0U; - } - - return i32Ret; -} - -/** - * @brief Initialize WM8731. - * @param [in] pstcWm8731LL Pointer to a @ref stc_wm8731_ll_t structure. - * @param [in] pstcWm8731Init Pointer to a @ref stc_wm8731_init_t structure - * @retval int32_t: - * - LL_OK: Initialize success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t WM8731_Init(const stc_wm8731_ll_t *pstcWm8731LL, const stc_wm8731_init_t *pstcWm8731Init) -{ - int32_t i32Ret = LL_OK; - uint16_t u16AudioPath; - uint16_t u16PowerControl; - uint8_t u8WriteData[2]; - - if ((pstcWm8731LL == NULL) || (NULL == pstcWm8731Init)) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - /* Initialize the control interface of the codec */ - pstcWm8731LL->Init(); - /* Writing 00000000 to register resets device */ - u8WriteData[0] = WM8731_R15_RST; - u8WriteData[1] = 0U; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - pstcWm8731LL->Delay(50U); - - u8InputDevice = pstcWm8731Init->u8InputDevice; - u8OutputDevice = pstcWm8731Init->u8OutputDevice; - /* Path Configurations for input */ - if (WM8731_INPUT_DEVICE_NONE != u8InputDevice) { - switch (u8InputDevice) { - case WM8731_INPUT_DEVICE_MICROPHONE: - u16AudioPath = 0x05U; - u16PowerControl = 0x01U; - break; - case WM8731_INPUT_DEVICE_LINE: - u16AudioPath = 0x02U; - u16PowerControl = 0x02U; - break; - default: - /* Invalid input device */ - u16AudioPath = 0x02U; - u16PowerControl = 0x07U; - break; - } - } else { - u16AudioPath = 0x02U; - u16PowerControl = 0x07U; - } - - u16AudioPath |= pstcWm8731Init->u8OutputSrc; - /* Path Configurations for output */ - if (WM8731_OUTPUT_DEVICE_NONE != u8OutputDevice) { - switch (u8OutputDevice) { - case WM8731_OUTPUT_DEVICE_LINE: - case WM8731_OUTPUT_DEVICE_HEADPHONE: - case WM8731_OUTPUT_DEVICE_BOTH: - break; - default: - u16PowerControl |= 0x08U; - break; - } - } else { - u16PowerControl |= 0x08U; - } - /* Power down control */ - u8WriteData[0] = WM8731_R6_PWR_DOWN; - u8WriteData[1] = (uint8_t)(u16PowerControl | 0x10U); - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - /* Analogue audio path control */ - u8WriteData[0] = WM8731_R4_ANA_AUDIO_PATH; - u8WriteData[1] = (uint8_t)u16AudioPath; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - /* Set audio frequency and volume */ - (void)WM8731_SetAudioFreq(pstcWm8731LL, pstcWm8731Init->u32AudioFreq); - (void)WM8731_SetVolume(pstcWm8731LL, pstcWm8731Init->u8Volume); - /* Configure digital audio interface format, Slave mode */ - u8WriteData[0] = WM8731_R7_DIG_AUDIO_IF; - u8WriteData[1] = pstcWm8731Init->u8DataForamt | pstcWm8731Init->u8DataWidth; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - - /* Active Control */ - u8WriteData[0] = WM8731_R9_ACT; - u8WriteData[1] = 0x01U; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - /* Enable the DAC signal path */ - u8WriteData[0] = WM8731_R6_PWR_DOWN; - u8WriteData[1] = (uint8_t)u16PowerControl; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - } - - return i32Ret; -} - -/** - * @brief Start the audio codec play. - * @param [in] pstcWm8731LL Pointer to a @ref stc_wm8731_ll_t structure. - * @retval int32_t: - * - LL_OK: Operation success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t WM8731_Play(const stc_wm8731_ll_t *pstcWm8731LL) -{ - int32_t i32Ret = LL_OK; - uint8_t u8WriteData[2]; - - /* Unmute the output */ - if (pstcWm8731LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - if (WM8731_OUTPUT_DEVICE_NONE != u8OutputDevice) { - /* Disable DAC soft mute */ - u8WriteData[0] = WM8731_R5_DIG_AUDIO_PATH; - u8WriteData[1] = 0x00U; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - } - } - - return i32Ret; -} - -/** - * @brief Stop the audio codec play. - * @param [in] pstcWm8731LL Pointer to a @ref stc_wm8731_ll_t structure. - * @retval int32_t: - * - LL_OK: Operation success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t WM8731_Stop(const stc_wm8731_ll_t *pstcWm8731LL) -{ - int32_t i32Ret = LL_OK; - uint8_t u8WriteData[2]; - - /* Mute the output */ - if (pstcWm8731LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - if (WM8731_INPUT_DEVICE_NONE != u8OutputDevice) { - /* Enable DAC soft mute */ - u8WriteData[0] = WM8731_R5_DIG_AUDIO_PATH; - u8WriteData[1] = 0x08U; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - } - } - - return i32Ret; -} - -/** - * @brief Set the new audio frequency. - * @param [in] pstcWm8731LL Pointer to a @ref stc_wm8731_ll_t structure. - * @param [in] u32Freq The audio frequency - * This parameter can be one of the following values: - * @arg WM8731_AUDIO_FREQ_8K - * @arg WM8731_AUDIO_FREQ_32K - * @arg WM8731_AUDIO_FREQ_48K - * @arg WM8731_AUDIO_FREQ_96K - * @retval int32_t: - * - LL_OK: Operation success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t WM8731_SetAudioFreq(const stc_wm8731_ll_t *pstcWm8731LL, uint32_t u32Freq) -{ - int32_t i32Ret = LL_OK; - uint8_t u8WriteData[2]; - - if (pstcWm8731LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - /* Base Over-Sampling Rate = 256fs */ - switch (u32Freq) { - case WM8731_AUDIO_FREQ_8K: - u8WriteData[1] = 0x0CU; - break; - case WM8731_AUDIO_FREQ_32K: - u8WriteData[1] = 0x18U; - break; - case WM8731_AUDIO_FREQ_48K: - u8WriteData[1] = 0x00U; - break; - case WM8731_AUDIO_FREQ_96K: - u8WriteData[1] = 0x1CU; - break; - default: - /* Sample Rate = 48 (KHz) */ - u8WriteData[1] = 0x18U; - break; - } - u8WriteData[0] = WM8731_R8_SPL; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - } - - return i32Ret; -} - -/** - * @brief Set the codec volume level. - * @param [in] pstcWm8731LL Pointer to a @ref stc_wm8731_ll_t structure. - * @param [in] u8Volume The codec volume level - * This parameter can be a value between Min_Data = 0 and Max_Data = 100 - * @retval int32_t: - * - LL_OK: Operation success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t WM8731_SetVolume(const stc_wm8731_ll_t *pstcWm8731LL, uint8_t u8Volume) -{ - int32_t i32Ret = LL_OK; - uint8_t u8ConvVolume; - uint8_t u8WriteData[2]; - - if (pstcWm8731LL == NULL) { - i32Ret = LL_ERR_INVD_PARAM; - } else { - /* Input volume */ - if (WM8731_INPUT_DEVICE_LINE == u8InputDevice) { - u8ConvVolume = WM8731_INPUT_VOL_CONV(u8Volume); - /* Mute line input */ - if (0U == u8ConvVolume) { - u8WriteData[1] = 0x80U; - } else { - u8WriteData[1] = u8ConvVolume; - } - u8WriteData[0] = WM8731_R0_LEFT_LINE_IN; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - u8WriteData[0] = WM8731_R1_RIGHT_LINE_IN; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - } - - /* Output volume */ - if (WM8731_OUTPUT_DEVICE_HEADPHONE == (u8OutputDevice & WM8731_OUTPUT_DEVICE_HEADPHONE)) { - u8ConvVolume = WM8731_OUTPUT_VOL_CONV(u8Volume) + 0x2FU; - if (u8ConvVolume > 0x2FU) { - u8WriteData[1] = u8ConvVolume; - } else { - /* Mute headphone output */ - u8WriteData[1] = 0x00U; - } - u8WriteData[0] = WM8731_R2_LEFT_HP_OUT; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - u8WriteData[0] = WM8731_R3_RIGHT_HP_OUT; - pstcWm8731LL->Write(&u8WriteData[0], &u8WriteData[1], 1U); - } - } - - return i32Ret; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/wm8731/wm8731.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/wm8731/wm8731.h deleted file mode 100644 index 41bb2bc91f6..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/components/wm8731/wm8731.h +++ /dev/null @@ -1,218 +0,0 @@ -/** - ******************************************************************************* - * @file wm8731.h - * @brief This file contains all the functions prototypes of the codec component - * library for wm8731. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __WM8731_H__ -#define __WM8731_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_def.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup Components - * @{ - */ - -/** - * @addtogroup WM8731 - * @{ - */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ -/** - * @brief WM8731 Init structure definition - */ -typedef struct { - uint8_t u8InputDevice; /*!< Specifies the intput device. - This parameter can be a value of @ref WM8731_Input_Device */ - uint8_t u8OutputDevice; /*!< Specifies the output device. - This parameter can be a value of @ref WM8731_Output_Device */ - uint8_t u8OutputSrc; /*!< Specifies the data source for the output. - This parameter can be a value of @ref WM8731_Output_Source */ - uint32_t u32AudioFreq; /*!< Specifies the audio frequency of the communication. - This parameter can be a value of @ref WM8731_Audio_Frequency */ - uint8_t u8Volume; /*!< Specifies the volume of input and output. - This parameter can be a value between Min_Data = 0 and Max_Data = 100 */ - uint8_t u8DataForamt; /*!< Specifies the data format of the communication. - This parameter can be a value of @ref WM8731_Data_Format */ - uint8_t u8DataWidth; /*!< Specifies the data width of the communication. - This parameter can be a value of @ref WM8731_Data_Width */ -} stc_wm8731_init_t; - -/** - * @brief WM8731 low layer structure definition - */ -typedef struct { - /* Methods */ - void (*Delay)(uint32_t); - void (*Init)(void); - void (*Write)(const uint8_t *, const uint8_t *, uint32_t); - void (*Read)(const uint8_t *, uint8_t *, uint32_t); -} stc_wm8731_ll_t; - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup WM8731_Register WM8731 Register - * @{ - */ -#define WM8731_R0_LEFT_LINE_IN (0x00U) /* Left Line In */ -#define WM8731_R1_RIGHT_LINE_IN (0x02U) /* Right Line In */ -#define WM8731_R2_LEFT_HP_OUT (0x04U) /* Left Headphone Out */ -#define WM8731_R3_RIGHT_HP_OUT (0x06U) /* Right Headphone Out */ -#define WM8731_R4_ANA_AUDIO_PATH (0x08U) /* Analogue Audio Path Control */ -#define WM8731_R5_DIG_AUDIO_PATH (0x0AU) /* Digital Audio Path Control */ -#define WM8731_R6_PWR_DOWN (0x0CU) /* Power Down Control */ -#define WM8731_R7_DIG_AUDIO_IF (0x0EU) /* Digital Audio Interface Format */ -#define WM8731_R8_SPL (0x10U) /* Sampling Control */ -#define WM8731_R9_ACT (0x12U) /* Active Control */ -#define WM8731_R15_RST (0x1EU) /* Reset Register */ -/** - * @} - */ - -/** - * @defgroup WM8731_Input_Device WM8731 Input Device - * @{ - */ -#define WM8731_INPUT_DEVICE_NONE (0x00U) -#define WM8731_INPUT_DEVICE_MICROPHONE (0x01U) -#define WM8731_INPUT_DEVICE_LINE (0x02U) -/** - * @} - */ - -/** - * @defgroup WM8731_Output_Device WM8731 Output Device - * @{ - */ -#define WM8731_OUTPUT_DEVICE_NONE (0x00U) -#define WM8731_OUTPUT_DEVICE_LINE (0x01U) -#define WM8731_OUTPUT_DEVICE_HEADPHONE (0x02U) -#define WM8731_OUTPUT_DEVICE_BOTH (0x03U) -/** - * @} - */ - -/** - * @defgroup WM8731_Output_Source WM8731 Output Source - * @{ - */ -#define WM8731_OUTPUT_SRC_LINE (0x08U) /* From Line(BYPASS) inputs */ -#define WM8731_OUTPUT_SRC_DAC (0x10U) /* From DAC(DACSEL) input */ -#define WM8731_OUTPUT_SRC_MICROPHONE (0x20U) /* From Microphone(SIDETONE) input */ -/** - * @} - */ - -/** - * @defgroup WM8731_Audio_Frequency WM8731 Audio Frequency - * @{ - */ -#define WM8731_AUDIO_FREQ_8K (8000UL) -#define WM8731_AUDIO_FREQ_32K (32000UL) -#define WM8731_AUDIO_FREQ_48K (48000UL) -#define WM8731_AUDIO_FREQ_96K (96000UL) -/** - * @} - */ - -/** - * @defgroup WM8731_Data_Format WM8731 Data Format - * @{ - */ -#define WM8731_DATA_FORMAT_LSB (0x00U) /* Right Justified Mode */ -#define WM8731_DATA_FORMAT_MSB (0x01U) /* Left Justified Mode */ -#define WM8731_DATA_FORMAT_PHILLIPS (0x02U) /* I2S Mode */ -#define WM8731_DATA_FORMAT_DSP (0x03U) /* DSP/PCM Mode */ -/** - * @} - */ - -/** - * @defgroup WM8731_Data_Width WM8731 Data Width - * @{ - */ -#define WM8731_DATA_WIDTH_16BIT (0x00U) -#define WM8731_DATA_WIDTH_20BIT (0x04U) -#define WM8731_DATA_WIDTH_24BIT (0x08U) -#define WM8731_DATA_WIDTH_32BIT (0x0CU) -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup WM8731_Global_Functions WM8731 Global Functions - * @{ - */ -int32_t WM8731_Reset(const stc_wm8731_ll_t *pstcWm8731LL); -int32_t WM8731_Init(const stc_wm8731_ll_t *pstcWm8731LL, const stc_wm8731_init_t *pstcWm8731Init); -int32_t WM8731_Play(const stc_wm8731_ll_t *pstcWm8731LL); -int32_t WM8731_Stop(const stc_wm8731_ll_t *pstcWm8731LL); -int32_t WM8731_SetAudioFreq(const stc_wm8731_ll_t *pstcWm8731LL, uint32_t u32Freq); -int32_t WM8731_SetVolume(const stc_wm8731_ll_t *pstcWm8731LL, uint8_t u8Volume); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __WM8731_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.c deleted file mode 100644 index 237a8a6448d..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.c +++ /dev/null @@ -1,710 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176.c - * @brief This file provides firmware functions for EV_HC32F4A0_LQFP176 BSP - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2022-10-31 CDT Add configuration of XTAL IO as analog function - 2023-05-31 CDT Fix some typo: KYESCAN -> KEYSCAN - 2023-09-30 CDT Add API BSP_XTAL32_Init() - Optimize function BSP_I2C_Init() - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "ev_hc32f4a0_lqfp176.h" -#include "ev_hc32f4a0_lqfp176_bsp.h" - -/** - * @defgroup BSP BSP - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176 EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_BASE EV_HC32F4A0_LQFP176 Base - * @{ - */ - -#if (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/** - * @defgroup EV_HC32F4A0_LQFP176_Local_Types EV_HC32F4A0_LQFP176 Local Types - * @{ - */ -typedef struct { - uint8_t port; - uint16_t pin; -} BSP_Port_Pin; - -typedef struct { - uint8_t port; - uint16_t pin; - uint32_t ch; - en_int_src_t int_src; - IRQn_Type irq; - func_ptr_t callback; -} BSP_KeyIn_Config; -/** - * @} - */ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_Local_Functions - * @{ - */ -static void BSP_KEY_ROW0_IrqCallback(void); -static void BSP_KEY_ROW1_IrqCallback(void); -static void BSP_KEY_ROW2_IrqCallback(void); -static void BSP_KEY_ROW_Init(void); -static void BSP_KEY_COL_Init(void); -/** - * @} - */ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -/** -* @defgroup EV_HC32F4A0_LQFP176_Local_Variables EV_HC32F4A0_LQFP176 Local Variables -* @{ -*/ -static const BSP_Port_Pin BSP_KEYOUT_PORT_PIN[BSP_KEY_COL_NUM] = { - {BSP_KEYOUT0_PORT, BSP_KEYOUT0_PIN}, - {BSP_KEYOUT1_PORT, BSP_KEYOUT1_PIN}, - {BSP_KEYOUT2_PORT, BSP_KEYOUT2_PIN} -}; - -static const BSP_KeyIn_Config BSP_KEYIN_PORT_PIN[BSP_KEY_ROW_NUM + BSP_KEY_INDEPENDENT_NUM] = { - {BSP_KEYIN0_PORT, BSP_KEYIN0_PIN, BSP_KEY_ROW0_EXTINT, BSP_KEY_ROW0_INT_SRC, BSP_KEY_ROW0_IRQn, BSP_KEY_ROW0_IrqCallback}, - {BSP_KEYIN1_PORT, BSP_KEYIN1_PIN, BSP_KEY_ROW1_EXTINT, BSP_KEY_ROW1_INT_SRC, BSP_KEY_ROW1_IRQn, BSP_KEY_ROW1_IrqCallback}, - {BSP_KEYIN2_PORT, BSP_KEYIN2_PIN, BSP_KEY_ROW2_EXTINT, BSP_KEY_ROW2_INT_SRC, BSP_KEY_ROW2_IRQn, BSP_KEY_ROW2_IrqCallback}, - - {BSP_KEY_KEY10_PORT, BSP_KEY_KEY10_PIN, BSP_KEY_KEY10_EXTINT, BSP_KEY_KEY10_INT_SRC, BSP_KEY_KEY10_IRQn, BSP_KEY_KEY10_IrqHandler}, -}; - -static uint32_t m_u32GlobalKey = 0UL; -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_Global_Functions EV_HC32F4A0_LQFP176 Global Functions - * @{ - */ - -#if (LL_I2C_ENABLE == DDL_ON) -/** - * @brief BSP I2C initialize - * @param [in] I2Cx Pointer to I2C instance register base. - * This parameter can be a value of the following: - * @arg CM_I2Cx: I2C instance register base. - * @retval int32_t: - * - LL_OK: Configure success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t BSP_I2C_Init(CM_I2C_TypeDef *I2Cx) -{ - int32_t i32Ret; - float32_t fErr; - stc_i2c_init_t stcI2cInit; - uint32_t I2cSrcClk; - uint32_t I2cClkDiv; - uint32_t I2cClkDivReg; - - I2cSrcClk = I2C_SRC_CLK; - I2cClkDiv = I2cSrcClk / BSP_I2C_BAUDRATE / I2C_WIDTH_MAX_IMME; - for (I2cClkDivReg = I2C_CLK_DIV1; I2cClkDivReg <= I2C_CLK_DIV128; I2cClkDivReg++) { - if (I2cClkDiv < (1UL << I2cClkDivReg)) { - break; - } - } - - I2C_DeInit(I2Cx); - (void)I2C_StructInit(&stcI2cInit); - stcI2cInit.u32Baudrate = BSP_I2C_BAUDRATE; - stcI2cInit.u32SclTime = 400UL * I2cSrcClk / 1000000000UL; /* SCL time is about 400nS in EVB board */ - stcI2cInit.u32ClockDiv = I2cClkDivReg; - i32Ret = I2C_Init(I2Cx, &stcI2cInit, &fErr); - - if (LL_OK == i32Ret) { - I2C_BusWaitCmd(I2Cx, ENABLE); - I2C_Cmd(I2Cx, ENABLE); - } - - return i32Ret; -} - -/** - * @brief BSP I2C De-initialize - * @param [in] I2Cx Pointer to I2C instance register base. - * This parameter can be a value of the following: - * @arg CM_I2Cx: I2C instance register base. - * @retval None - */ -void BSP_I2C_DeInit(CM_I2C_TypeDef *I2Cx) -{ - I2C_DeInit(I2Cx); -} - -/** - * @brief BSP I2C write. - * @param [in] I2Cx Pointer to I2C instance register base. - * This parameter can be a value of the following: - * @arg CM_I2Cx: I2C instance register base. - * @param [in] u16DevAddr: Device address. - * @param [in] pu8Reg: Pointer to the register address or memory address. - * @param [in] u8RegLen: Length of register address or memory address. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be write. - * @param [in] u32Len: Buffer size in byte. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -int32_t BSP_I2C_Write(CM_I2C_TypeDef *I2Cx, uint16_t u16DevAddr, const uint8_t *pu8Reg, uint8_t u8RegLen, const uint8_t *pu8Buf, uint32_t u32Len) -{ - int32_t i32Ret; - - I2C_SWResetCmd(I2Cx, ENABLE); - I2C_SWResetCmd(I2Cx, DISABLE); - i32Ret = I2C_Start(I2Cx, BSP_I2C_TIMEOUT); - if (LL_OK == i32Ret) { - i32Ret = I2C_TransAddr(I2Cx, u16DevAddr, I2C_DIR_TX, BSP_I2C_TIMEOUT); - - if (LL_OK == i32Ret) { - i32Ret = I2C_TransData(I2Cx, pu8Reg, u8RegLen, BSP_I2C_TIMEOUT); - if (LL_OK == i32Ret) { - i32Ret = I2C_TransData(I2Cx, pu8Buf, u32Len, BSP_I2C_TIMEOUT); - } - } - } - (void)I2C_Stop(I2Cx, BSP_I2C_TIMEOUT); - return i32Ret; -} - -/** - * @brief BSP I2C read. - * @param [in] I2Cx Pointer to I2C instance register base. - * This parameter can be a value of the following: - * @arg CM_I2Cx: I2C instance register base. - * @param [in] u16DevAddr: Device address. - * @param [in] pu8Reg: Pointer to the register address or memory address. - * @param [in] u8RegLen: Length of register address or memory address. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be read. - * @param [in] u32Len: Buffer size in byte. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -int32_t BSP_I2C_Read(CM_I2C_TypeDef *I2Cx, uint16_t u16DevAddr, const uint8_t *pu8Reg, uint8_t u8RegLen, uint8_t *pu8Buf, uint32_t u32Len) -{ - int32_t i32Ret; - I2C_SWResetCmd(I2Cx, ENABLE); - I2C_SWResetCmd(I2Cx, DISABLE); - i32Ret = I2C_Start(I2Cx, BSP_I2C_TIMEOUT); - if (LL_OK == i32Ret) { - i32Ret = I2C_TransAddr(I2Cx, u16DevAddr, I2C_DIR_TX, BSP_I2C_TIMEOUT); - - if (LL_OK == i32Ret) { - i32Ret = I2C_TransData(I2Cx, pu8Reg, u8RegLen, BSP_I2C_TIMEOUT); - if (LL_OK == i32Ret) { - i32Ret = I2C_Restart(I2Cx, BSP_I2C_TIMEOUT); - if (LL_OK == i32Ret) { - if (1UL == u32Len) { - I2C_AckConfig(I2Cx, I2C_NACK); - } - - i32Ret = I2C_TransAddr(I2Cx, u16DevAddr, I2C_DIR_RX, BSP_I2C_TIMEOUT); - if (LL_OK == i32Ret) { - i32Ret = I2C_MasterReceiveDataAndStop(I2Cx, pu8Buf, u32Len, BSP_I2C_TIMEOUT); - } - I2C_AckConfig(I2Cx, I2C_ACK); - } - } - } - } - - if (LL_OK != i32Ret) { - (void)I2C_Stop(I2Cx, BSP_I2C_TIMEOUT); - } - - return i32Ret; -} - -/** - * @brief BSP 24CXX status get. - * @param [in] I2Cx Pointer to I2C instance register base. - * This parameter can be a value of the following: - * @arg CM_I2Cx: I2C instance register base. - * @param [in] u16DevAddr: Device address. - * @retval int32_t: - * - LL_OK: Idle - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -int32_t BSP_I2C_GetDevStatus(CM_I2C_TypeDef *I2Cx, uint16_t u16DevAddr) -{ - int32_t i32Ret; - - i32Ret = I2C_Start(I2Cx, BSP_I2C_TIMEOUT); - if (LL_OK == i32Ret) { - i32Ret = I2C_TransAddr(I2Cx, u16DevAddr, I2C_DIR_TX, BSP_I2C_TIMEOUT); - - if (LL_OK == i32Ret) { - if (SET == I2C_GetStatus(I2Cx, I2C_FLAG_ACKR)) { - i32Ret = LL_ERR; - } - } - } - (void)I2C_Stop(I2Cx, BSP_I2C_TIMEOUT); - return i32Ret; -} -#endif /* LL_I2C_ENABLE */ - -/** - * @brief BSP clock initialize. - * SET board system clock to PLLH@240MHz - * Flash: 5 wait - * SRAM_HS: 1 wait - * SRAM1_2_3_4_B: 2 wait - * PCLK0: 240MHz - * PCLK1: 120MHz - * PCLK2: 60MHz - * PCLK3: 60MHz - * PCLK4: 120MHz - * EXCLK: 120MHz - * HCLK: 240MHz - * @param None - * @retval None - */ -__WEAKDEF void BSP_CLK_Init(void) -{ - stc_clock_xtal_init_t stcXtalInit; - stc_clock_pll_init_t stcPLLHInit; - - /* PCLK0, HCLK Max 240MHz */ - /* PCLK1, PCLK4 Max 120MHz */ - /* PCLK2, PCLK3 Max 60MHz */ - /* EX BUS Max 120MHz */ - CLK_SetClockDiv(CLK_BUS_CLK_ALL, \ - (CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | CLK_PCLK2_DIV4 | \ - CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2 | CLK_EXCLK_DIV2 | \ - CLK_HCLK_DIV1)); - - GPIO_AnalogCmd(BSP_XTAL_PORT, BSP_XTAL_IN_PIN | BSP_XTAL_OUT_PIN, ENABLE); - (void)CLK_XtalStructInit(&stcXtalInit); - /* Config Xtal and enable Xtal */ - stcXtalInit.u8Mode = CLK_XTAL_MD_OSC; - stcXtalInit.u8Drv = CLK_XTAL_DRV_ULOW; - stcXtalInit.u8State = CLK_XTAL_ON; - stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS; - (void)CLK_XtalInit(&stcXtalInit); - - (void)CLK_PLLStructInit(&stcPLLHInit); - /* VCO = (8/1)*120 = 960MHz*/ - stcPLLHInit.u8PLLState = CLK_PLL_ON; - stcPLLHInit.PLLCFGR = 0UL; - stcPLLHInit.PLLCFGR_f.PLLM = 1UL - 1UL; - stcPLLHInit.PLLCFGR_f.PLLN = 120UL - 1UL; - stcPLLHInit.PLLCFGR_f.PLLP = 4UL - 1UL; - stcPLLHInit.PLLCFGR_f.PLLQ = 4UL - 1UL; - stcPLLHInit.PLLCFGR_f.PLLR = 4UL - 1UL; - stcPLLHInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL; - (void)CLK_PLLInit(&stcPLLHInit); - - /* Highspeed SRAM set to 0 Read/Write wait cycle */ - SRAM_SetWaitCycle(SRAM_SRAMH, SRAM_WAIT_CYCLE0, SRAM_WAIT_CYCLE0); - - /* SRAM1_2_3_4_backup set to 1 Read/Write wait cycle */ - SRAM_SetWaitCycle((SRAM_SRAM123 | SRAM_SRAM4 | SRAM_SRAMB), SRAM_WAIT_CYCLE1, SRAM_WAIT_CYCLE1); - - /* 0-wait @ 40MHz */ - (void)EFM_SetWaitCycle(EFM_WAIT_CYCLE5); - - /* 4 cycles for 200 ~ 250MHz */ - GPIO_SetReadWaitCycle(GPIO_RD_WAIT4); - - CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL); -} - -/** - * @brief BSP Xtal32 initialize. - * @param None - * @retval int32_t: - * - LL_OK: XTAL32 enable successfully - * - LL_ERR_TIMEOUT: XTAL32 enable timeout. - */ -__WEAKDEF int32_t BSP_XTAL32_Init(void) -{ - stc_clock_xtal32_init_t stcXtal32Init; - stc_fcm_init_t stcFcmInit; - uint32_t u32TimeOut = 0UL; - uint32_t u32Time = HCLK_VALUE / 5UL; - - if (CLK_XTAL32_ON == READ_REG8(CM_CMU->XTAL32CR)) { - /* Disable xtal32 */ - (void)CLK_Xtal32Cmd(DISABLE); - /* Wait 5 * xtal32 cycle */ - DDL_DelayUS(160U); - } - - /* Xtal32 config */ - (void)CLK_Xtal32StructInit(&stcXtal32Init); - stcXtal32Init.u8State = CLK_XTAL32_ON; - stcXtal32Init.u8Drv = CLK_XTAL32_DRV_MID; - stcXtal32Init.u8Filter = CLK_XTAL32_FILTER_ALL_MD; - GPIO_AnalogCmd(BSP_XTAL32_PORT, BSP_XTAL32_IN_PIN | BSP_XTAL32_OUT_PIN, ENABLE); - (void)CLK_Xtal32Init(&stcXtal32Init); - - /* FCM config */ - FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_FCM, ENABLE); - (void)FCM_StructInit(&stcFcmInit); - stcFcmInit.u32RefClock = FCM_REF_CLK_MRC; - stcFcmInit.u32RefClockDiv = FCM_REF_CLK_DIV8192; - stcFcmInit.u32RefClockEdge = FCM_REF_CLK_RISING; - stcFcmInit.u32TargetClock = FCM_TARGET_CLK_XTAL32; - stcFcmInit.u32TargetClockDiv = FCM_TARGET_CLK_DIV1; - stcFcmInit.u16LowerLimit = (uint16_t)((XTAL32_VALUE / (MRC_VALUE / 8192U)) * 96UL / 100UL); - stcFcmInit.u16UpperLimit = (uint16_t)((XTAL32_VALUE / (MRC_VALUE / 8192U)) * 104UL / 100UL); - (void)FCM_Init(&stcFcmInit); - /* Enable FCM, to ensure xtal32 stable */ - FCM_Cmd(ENABLE); - for (;;) { - if (SET == FCM_GetStatus(FCM_FLAG_END)) { - FCM_ClearStatus(FCM_FLAG_END); - if ((SET == FCM_GetStatus(FCM_FLAG_ERR)) || (SET == FCM_GetStatus(FCM_FLAG_OVF))) { - FCM_ClearStatus(FCM_FLAG_ERR | FCM_FLAG_OVF); - } else { - (void)FCM_DeInit(); - FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_FCM, DISABLE); - return LL_OK; - } - } - u32TimeOut++; - if (u32TimeOut > u32Time) { - (void)FCM_DeInit(); - FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_FCM, DISABLE); - return LL_ERR_TIMEOUT; - } - } -} - -#if (LL_PRINT_ENABLE == DDL_ON) -/** - * @brief BSP printf device, clock and port pre-initialize. - * @param [in] vpDevice Pointer to print device - * @param [in] u32Baudrate Print device communication baudrate - * @retval int32_t: - * - LL_OK: Initialize successfully. - * - LL_ERR: Initialize unsuccessfully. - * - LL_ERR_INVD_PARAM: The u32Baudrate value is 0. - */ -int32_t BSP_PRINTF_Preinit(void *vpDevice, uint32_t u32Baudrate) -{ - uint32_t u32Div; - float32_t f32Error; - stc_usart_uart_init_t stcUartInit; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - (void)vpDevice; - - if (0UL != u32Baudrate) { - /* Set TX port function */ - GPIO_SetFunc(BSP_PRINTF_PORT, BSP_PRINTF_PIN, BSP_PRINTF_PORT_FUNC); - - /* Enable clock */ - FCG_Fcg3PeriphClockCmd(BSP_PRINTF_DEVICE_FCG, ENABLE); - - /* Configure UART */ - (void)USART_UART_StructInit(&stcUartInit); - stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_8BIT; - (void)USART_UART_Init(BSP_PRINTF_DEVICE, &stcUartInit, NULL); - - for (u32Div = 0UL; u32Div <= USART_CLK_DIV64; u32Div++) { - USART_SetClockDiv(BSP_PRINTF_DEVICE, u32Div); - i32Ret = USART_SetBaudrate(BSP_PRINTF_DEVICE, u32Baudrate, &f32Error); - if ((LL_OK == i32Ret) && \ - ((-BSP_PRINTF_BAUDRATE_ERR_MAX <= f32Error) && (f32Error <= BSP_PRINTF_BAUDRATE_ERR_MAX))) { - USART_FuncCmd(BSP_PRINTF_DEVICE, USART_TX, ENABLE); - break; - } else { - i32Ret = LL_ERR; - } - } - } - - return i32Ret; -} -#endif - -/** - * @brief BSP key initialize - * @param None - * @retval None - */ -void BSP_KEY_Init(void) -{ - uint8_t i; - - BSP_KEY_ROW_Init(); - BSP_KEY_COL_Init(); - /* Clear all KEYIN interrupt flag before enable */ - for (i = 0U; i < BSP_KEY_ROW_NUM + BSP_KEY_INDEPENDENT_NUM; i++) { - EXTINT_ClearExtIntStatus(BSP_KEYIN_PORT_PIN[i].ch); - } - KEYSCAN_Cmd(ENABLE); -} - -/** - * @brief Get BSP key status - * @param [in] u32Key chose one macro from below - * @arg BSP_KEY_1 - * @arg BSP_KEY_2 - * @arg BSP_KEY_3 - * @arg BSP_KEY_4 - * @arg BSP_KEY_5 - * @arg BSP_KEY_6 - * @arg BSP_KEY_7 - * @arg BSP_KEY_8 - * @arg BSP_KEY_9 - * @arg BSP_KEY_10 - * @retval An @ref en_flag_status_t enumeration type value. - * - SET, Key pressed. - * - RESET, Key released. - */ -en_flag_status_t BSP_KEY_GetStatus(uint32_t u32Key) -{ - en_flag_status_t enStatus = RESET; - if (0UL != (m_u32GlobalKey & u32Key)) { - enStatus = SET; - m_u32GlobalKey &= ~u32Key; - } else { - } - return enStatus; -} - -/** - * @brief BSP Key10 callback function - * @param None - * @retval None - */ -__WEAKDEF void BSP_KEY_KEY10_IrqHandler(void) -{ - m_u32GlobalKey |= BSP_KEY_10; - while (PIN_RESET == GPIO_ReadInputPins(BSP_KEY_KEY10_PORT, BSP_KEY_KEY10_PIN)) { - } - EXTINT_ClearExtIntStatus(BSP_KEY_KEY10_EXTINT); -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_Local_Functions EV_HC32F4A0_LQFP176 Local Functions - * @{ - */ - -/** - * @brief EXTINT Ch.8 as BSP Key row 0 callback function - * @param None - * @retval None - */ -static void BSP_KEY_ROW0_IrqCallback(void) -{ - uint8_t u8Idx = (uint8_t)KEYSCAN_GetKeyoutIdx(); - if (SET == EXTINT_GetExtIntStatus(BSP_KEYIN_PORT_PIN[0].ch)) { - for (;;) { - if (PIN_RESET == GPIO_ReadInputPins(BSP_KEYIN_PORT_PIN[0].port, BSP_KEYIN_PORT_PIN[0].pin)) { - m_u32GlobalKey |= (0x01UL) << u8Idx; - } else { - /* clear int request flag after KEY released */ - EXTINT_ClearExtIntStatus(BSP_KEYIN_PORT_PIN[0].ch); - break; - } - } - } -} - -/** - * @brief EXTINT Ch.3 as BSP Key row 1 callback function - * @param None - * @retval None - */ -static void BSP_KEY_ROW1_IrqCallback(void) -{ - uint8_t u8Idx = (uint8_t)KEYSCAN_GetKeyoutIdx(); - if (SET == EXTINT_GetExtIntStatus(BSP_KEYIN_PORT_PIN[1].ch)) { - for (;;) { - if (PIN_RESET == GPIO_ReadInputPins(BSP_KEYIN_PORT_PIN[1].port, BSP_KEYIN_PORT_PIN[1].pin)) { - m_u32GlobalKey |= (0x10UL) << u8Idx; - } else { - /* clear int request flag after KEY released */ - EXTINT_ClearExtIntStatus(BSP_KEYIN_PORT_PIN[1].ch); - break; - } - } - } -} - -/** - * @brief EXTINT Ch.7 as KEYSCAN row 2 callback function - * @param None - * @retval None - */ -static void BSP_KEY_ROW2_IrqCallback(void) -{ - uint8_t u8Idx = (uint8_t)KEYSCAN_GetKeyoutIdx(); - if (SET == EXTINT_GetExtIntStatus(BSP_KEYIN_PORT_PIN[2].ch)) { - for (;;) { - if (PIN_RESET == GPIO_ReadInputPins(BSP_KEYIN_PORT_PIN[2].port, BSP_KEYIN_PORT_PIN[2].pin)) { - m_u32GlobalKey |= (0x100UL) << u8Idx; - } else { - /* clear int request flag after KEY released */ - EXTINT_ClearExtIntStatus(BSP_KEYIN_PORT_PIN[2].ch); - break; - } - } - } -} - -/** - * @brief BSP key row initialize - * @param None - * @retval None - */ -static void BSP_KEY_ROW_Init(void) -{ - uint8_t i; - stc_extint_init_t stcExtIntInit; - stc_irq_signin_config_t stcIrqSignConfig; - stc_gpio_init_t stcGpioInit; - - /* configuration structure initialization */ - (void)GPIO_StructInit(&stcGpioInit); - - /* GPIO config */ - stcGpioInit.u16ExtInt = PIN_EXTINT_ON; - stcGpioInit.u16PullUp = PIN_PU_ON; - for (i = 0U; i < BSP_KEY_ROW_NUM + BSP_KEY_INDEPENDENT_NUM; i++) { - (void)GPIO_Init(BSP_KEYIN_PORT_PIN[i].port, BSP_KEYIN_PORT_PIN[i].pin, &stcGpioInit); - } - - /* Extint config */ - (void)EXTINT_StructInit(&stcExtIntInit); - stcExtIntInit.u32Edge = EXTINT_TRIG_FALLING; - for (i = 0U; i < BSP_KEY_ROW_NUM + BSP_KEY_INDEPENDENT_NUM; i++) { - (void)EXTINT_Init(BSP_KEYIN_PORT_PIN[i].ch, &stcExtIntInit); - } - - /* IRQ sign-in */ - for (i = 0U; i < BSP_KEY_ROW_NUM + BSP_KEY_INDEPENDENT_NUM; i++) { - stcIrqSignConfig.enIntSrc = BSP_KEYIN_PORT_PIN[i].int_src; - stcIrqSignConfig.enIRQn = BSP_KEYIN_PORT_PIN[i].irq; - stcIrqSignConfig.pfnCallback = BSP_KEYIN_PORT_PIN[i].callback; - (void)INTC_IrqSignIn(&stcIrqSignConfig); - - /* NVIC config */ - NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn); - NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT); - NVIC_EnableIRQ(stcIrqSignConfig.enIRQn); - } -} - -/** - * @brief BSP key column initialize - * @param None - * @retval None - */ -static void BSP_KEY_COL_Init(void) -{ - uint8_t i; - stc_gpio_init_t stcGpioInit; - stc_keyscan_init_t stcKeyscanInit; - - /* configuration structure initialization */ - (void)GPIO_StructInit(&stcGpioInit); - - /* Set corresponding pins to KEYSCAN function */ - for (i = 0U; i < BSP_KEY_COL_NUM; i++) { - (void)GPIO_Init(BSP_KEYOUT_PORT_PIN[i].port, BSP_KEYOUT_PORT_PIN[i].pin, &stcGpioInit); - GPIO_SetFunc(BSP_KEYOUT_PORT_PIN[i].port, BSP_KEYOUT_PORT_PIN[i].pin, GPIO_FUNC_8); - } - - /* enable KEYSCAN module source clock */ - FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_KEY, ENABLE); - - /* ENABLE LRC for scan clock */ - (void)CLK_LrcCmd(ENABLE); - - /* KEYSCAN config */ - (void)KEYSCAN_StructInit(&stcKeyscanInit); - stcKeyscanInit.u32HizCycle = KEYSCAN_HIZ_CYCLE_4; - stcKeyscanInit.u32LowCycle = KEYSCAN_LOW_CYCLE_512; - stcKeyscanInit.u32KeyClock = KEYSCAN_CLK_LRC; - stcKeyscanInit.u32KeyOut = BSP_KEYOUT_SELECT; - stcKeyscanInit.u32KeyIn = BSP_KEYIN_SELECT; - (void)KEYSCAN_Init(&stcKeyscanInit); -} - -/** - * @} - */ - -#endif /* BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.h deleted file mode 100644 index 57b87c8feac..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176.h +++ /dev/null @@ -1,271 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176.h - * @brief This file contains all the functions prototypes of the - * EV_HC32F4A0_LQFP176 BSP driver library. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2022-10-31 CDT Add XTAL/XTAL32 IO define - 2023-01-15 CDT Re-define macro: BSP_KEY_KEY10_WAKEUP - 2023-09-30 CDT Add include file named hc32_ll_fcm.h and add declaration of BSP_XTAL32_Init() - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_H__ -#define __EV_HC32F4A0_LQFP176_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_aos.h" -#include "hc32_ll_clk.h" -#include "hc32_ll_dma.h" -#include "hc32_ll_efm.h" -#include "hc32_ll_fcg.h" -#include "hc32_ll_fcm.h" -#include "hc32_ll_gpio.h" -#include "hc32_ll_i2c.h" -#include "hc32_ll_i2s.h" -#include "hc32_ll_interrupts.h" -#include "hc32_ll_keyscan.h" -#include "hc32_ll_pwc.h" -#include "hc32_ll_spi.h" -#include "hc32_ll_sram.h" -#include "hc32_ll_usart.h" -#include "hc32_ll_utility.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_BASE - * @{ - */ - -#if (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_Global_Macros EV_HC32F4A0_LQFP176 Global Macros - * @{ - */ - -/** - * @defgroup BSP_I2C_Configuration BSP I2C Configuration - * @{ - */ -#define BSP_I2C_BAUDRATE (100000UL) -#define BSP_I2C_TIMEOUT (0x40000U) -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_KEY_Sel EV_HC32F4A0_LQFP176 Key definition - * @{ - */ -#define BSP_KEY_1 (0x0001UL) /*!< BSP KEY 1 */ -#define BSP_KEY_2 (0x0002UL) /*!< BSP KEY 2 */ -#define BSP_KEY_3 (0x0004UL) /*!< BSP KEY 3 */ -#define BSP_KEY_4 (0x0010UL) /*!< BSP KEY 4 */ -#define BSP_KEY_5 (0x0020UL) /*!< BSP KEY 5 */ -#define BSP_KEY_6 (0x0040UL) /*!< BSP KEY 6 */ -#define BSP_KEY_7 (0x0100UL) /*!< BSP KEY 7 */ -#define BSP_KEY_8 (0x0200UL) /*!< BSP KEY 8 */ -#define BSP_KEY_9 (0x0400UL) /*!< BSP KEY 9 */ -#define BSP_KEY_10 (0x0800UL) /*!< BSP KEY 10. Independent key. */ -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_KEY_Number EV_HC32F4A0_LQFP176 KEY Number - * @{ - */ -#define BSP_KEY_ROW_NUM (3U) -#define BSP_KEY_COL_NUM (3U) -#define BSP_KEY_INDEPENDENT_NUM (1U) -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_KEY_PortPin EV_HC32F4A0_LQFP176 KEY port/pin definition - * @{ - */ -#define BSP_KEY_KEY10_PORT (GPIO_PORT_A) -#define BSP_KEY_KEY10_PIN (GPIO_PIN_00) -#define BSP_KEY_KEY10_EXTINT (EXTINT_CH00) -#define BSP_KEY_KEY10_INT_SRC (INT_SRC_PORT_EIRQ0) -#define BSP_KEY_KEY10_IRQn (INT025_IRQn) -#define BSP_KEY_KEY10_WAKEUP (INTC_STOP_WKUP_EXTINT_CH0) -#define BSP_KEY_KEY10_EVT (EVT_SRC_PORT_EIRQ0) - -#define BSP_KEYOUT0_PORT (GPIO_PORT_C) -#define BSP_KEYOUT0_PIN (GPIO_PIN_11) -#define BSP_KEYOUT1_PORT (GPIO_PORT_C) -#define BSP_KEYOUT1_PIN (GPIO_PIN_08) -#define BSP_KEYOUT2_PORT (GPIO_PORT_A) -#define BSP_KEYOUT2_PIN (GPIO_PIN_06) - -#define BSP_KEYIN0_PORT (GPIO_PORT_I) -#define BSP_KEYIN0_PIN (GPIO_PIN_08) -#define BSP_KEY_ROW0_EXTINT (EXTINT_CH08) -#define BSP_KEY_ROW0_INT_SRC (INT_SRC_PORT_EIRQ8) -#define BSP_KEY_ROW0_IRQn (INT029_IRQn) - -#define BSP_KEYIN1_PORT (GPIO_PORT_I) -#define BSP_KEYIN1_PIN (GPIO_PIN_03) -#define BSP_KEY_ROW1_EXTINT (EXTINT_CH03) -#define BSP_KEY_ROW1_INT_SRC (INT_SRC_PORT_EIRQ3) -#define BSP_KEY_ROW1_IRQn (INT030_IRQn) - -#define BSP_KEYIN2_PORT (GPIO_PORT_H) -#define BSP_KEYIN2_PIN (GPIO_PIN_07) -#define BSP_KEY_ROW2_EXTINT (EXTINT_CH07) -#define BSP_KEY_ROW2_INT_SRC (INT_SRC_PORT_EIRQ7) -#define BSP_KEY_ROW2_IRQn (INT031_IRQn) -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_KEYSCAN_CONFIG EV_HC32F4A0_LQFP176 KEYSCAN Configure definition - * @{ - */ -#define BSP_KEYOUT_SELECT (KEYSCAN_OUT_0T2) -#define BSP_KEYIN_SELECT (KEYSCAN_IN_3 | KEYSCAN_IN_7 | KEYSCAN_IN_8) -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_PRINT_CONFIG EV_HC32F4A0_LQFP176 PRINT Configure definition - * @{ - */ -#define BSP_PRINTF_DEVICE (CM_USART1) -#define BSP_PRINTF_DEVICE_FCG (FCG3_PERIPH_USART1) - -#define BSP_PRINTF_BAUDRATE (115200UL) -#define BSP_PRINTF_BAUDRATE_ERR_MAX (0.025F) - -#define BSP_PRINTF_PORT (GPIO_PORT_H) -#define BSP_PRINTF_PIN (GPIO_PIN_15) -#define BSP_PRINTF_PORT_FUNC (GPIO_FUNC_32) -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_XTAL_CONFIG EV_HC32F4A0_LQFP176 XTAL Configure definition - * @{ - */ -#define BSP_XTAL_PORT (GPIO_PORT_H) -#define BSP_XTAL_IN_PIN (GPIO_PIN_01) -#define BSP_XTAL_OUT_PIN (GPIO_PIN_00) -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_XTAL32_CONFIG EV_HC32F4A0_LQFP176 XTAL32 Configure definition - * @{ - */ -#define BSP_XTAL32_PORT (GPIO_PORT_C) -#define BSP_XTAL32_IN_PIN (GPIO_PIN_15) -#define BSP_XTAL32_OUT_PIN (GPIO_PIN_14) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_Global_Functions - * @{ - */ -int32_t BSP_XTAL32_Init(void); -void BSP_CLK_Init(void); - -void BSP_KEY_Init(void); -en_flag_status_t BSP_KEY_GetStatus(uint32_t u32Key); - -#if (LL_PRINT_ENABLE == DDL_ON) -int32_t BSP_PRINTF_Preinit(void *vpDevice, uint32_t u32Baudrate); -#endif - -/* It can't get the status of the KEYx by calling BSP_KEY_GetStatus when you re-implement BSP_KEY_KEYx_IrqHandler. */ -void BSP_KEY_KEY10_IrqHandler(void); - -#if (LL_I2C_ENABLE == DDL_ON) -int32_t BSP_I2C_Init(CM_I2C_TypeDef *I2Cx); -void BSP_I2C_DeInit(CM_I2C_TypeDef *I2Cx); -int32_t BSP_I2C_Write(CM_I2C_TypeDef *I2Cx, uint16_t u16DevAddr, const uint8_t *pu8Reg, uint8_t u8RegLen, const uint8_t *pu8Buf, uint32_t u32Len); -int32_t BSP_I2C_Read(CM_I2C_TypeDef *I2Cx, uint16_t u16DevAddr, const uint8_t *pu8Reg, uint8_t u8RegLen, uint8_t *pu8Buf, uint32_t u32Len); -int32_t BSP_I2C_GetDevStatus(CM_I2C_TypeDef *I2Cx, uint16_t u16DevAddr); -#endif /* LL_I2C_ENABLE */ - -/** - * @} - */ - -#endif /* BSP_EV_HC32F4A0_LQFP176 */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_24cxx.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_24cxx.c deleted file mode 100644 index c716e089261..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_24cxx.c +++ /dev/null @@ -1,291 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_24cxx.c - * @brief This file provides firmware functions for EEPROM 24CXX. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "ev_hc32f4a0_lqfp176_24cxx.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_24CXX EV_HC32F4A0_LQFP176 24CXX - * @{ - */ - -#if ((BSP_24CXX_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_24CXX_Local_Functions - * @{ - */ -static int32_t BSP_24CXX_I2C_Init(void); -static void BSP_24CXX_I2C_DeInit(void); -static int32_t BSP_24CXX_I2C_WritePage(uint16_t u16Addr, const uint8_t *pu8Buf, uint32_t u32Len); -static int32_t BSP_24CXX_I2C_Read(uint16_t u16Addr, uint8_t *pu8Buf, uint32_t u32Len); -static int32_t BSP_24CXX_I2C_GetStatus(void); -/** - * @} - */ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_24CXX_Local_Variables EV_HC32F4A0_LQFP176 24CXX Local Variables - * @{ - */ -static stc_24cxx_ll_t m_stc24cxxLL = { - .u32PageSize = EE_24CXX_PAGE_SIZE, - .u32Capacity = EE_24CXX_CAPACITY, - .Delay = DDL_DelayUS, - .Init = BSP_24CXX_I2C_Init, - .DeInit = BSP_24CXX_I2C_DeInit, - .WritePage = BSP_24CXX_I2C_WritePage, - .Read = BSP_24CXX_I2C_Read, - .GetStatus = BSP_24CXX_I2C_GetStatus -}; -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ - -/** - * @defgroup EV_HC32F4A0_LQFP176_24CXX_Local_Functions EV_HC32F4A0_LQFP176 24CXX Local Functions - * @{ - */ - -/** - * @brief Initializes I2C for 24CXX. - * @param None - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -static int32_t BSP_24CXX_I2C_Init(void) -{ - stc_gpio_init_t stcGpioInit; - /* Configuration I2C GPIO */ - (void)GPIO_StructInit(&stcGpioInit); - (void)GPIO_Init(BSP_24CXX_I2C_SCL_PORT, BSP_24CXX_I2C_SCL_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_24CXX_I2C_SDA_PORT, BSP_24CXX_I2C_SDA_PIN, &stcGpioInit); - GPIO_SetFunc(BSP_24CXX_I2C_SCL_PORT, BSP_24CXX_I2C_SCL_PIN, BSP_24CXX_I2C_SCL_FUNC); - GPIO_SetFunc(BSP_24CXX_I2C_SDA_PORT, BSP_24CXX_I2C_SDA_PIN, BSP_24CXX_I2C_SDA_FUNC); - /* Enable I2C Peripheral*/ - FCG_Fcg1PeriphClockCmd(BSP_24CXX_I2C_FCG, ENABLE); - return BSP_I2C_Init(BSP_24CXX_I2C_UNIT); -} - -/** - * @brief De-Initializes I2C for 24CXX. - * @param None - * @retval None - */ -static void BSP_24CXX_I2C_DeInit(void) -{ - /* Initialize I2C port*/ - GPIO_SetFunc(BSP_24CXX_I2C_SCL_PORT, BSP_24CXX_I2C_SCL_PIN, GPIO_FUNC_0); - GPIO_SetFunc(BSP_24CXX_I2C_SDA_PORT, BSP_24CXX_I2C_SDA_PIN, GPIO_FUNC_0); - I2C_DeInit(BSP_24CXX_I2C_UNIT); -} - -/** - * @brief BSP 24CXX write page data. - * @param [in] u16Addr: The start address of the data to be write. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be write. - * @param [in] u32Len: Buffer size in byte. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - * @note This function don't check if the data write is within one page - */ -static int32_t BSP_24CXX_I2C_WritePage(uint16_t u16Addr, const uint8_t *pu8Buf, uint32_t u32Len) -{ - uint16_t u16MemAddrTemp; -#if (EE_24CXX_MEM_ADDR_LEN == 1U) - u16MemAddrTemp = u16Addr; -#else - u16MemAddrTemp = (uint16_t)((((uint32_t)u16Addr >> 8) & 0xFFUL) + (((uint32_t)u16Addr << 8) & 0xFF00UL)); -#endif - return BSP_I2C_Write(BSP_24CXX_I2C_UNIT, EE_24CXX_DEV_ADDR, (const uint8_t *)&u16MemAddrTemp, EE_24CXX_MEM_ADDR_LEN, pu8Buf, u32Len); -} - -/** - * @brief BSP 24CXX Read data. - * @param [in] u16Addr: The start address of the data to be read. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be read. - * @param [in] u32Len: Buffer size in byte. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -static int32_t BSP_24CXX_I2C_Read(uint16_t u16Addr, uint8_t *pu8Buf, uint32_t u32Len) -{ - uint16_t u16MemAddrTemp; -#if (EE_24CXX_MEM_ADDR_LEN == 1U) - u16MemAddrTemp = u16Addr; -#else - u16MemAddrTemp = (uint16_t)((((uint32_t)u16Addr >> 8) & 0xFFUL) + (((uint32_t)u16Addr << 8) & 0xFF00UL)); -#endif - return BSP_I2C_Read(BSP_24CXX_I2C_UNIT, EE_24CXX_DEV_ADDR, (const uint8_t *)&u16MemAddrTemp, EE_24CXX_MEM_ADDR_LEN, pu8Buf, u32Len); -} - -/** - * @brief BSP 24CXX status get. - * @param None - * @retval int32_t: - * - LL_OK: Idle - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -static int32_t BSP_24CXX_I2C_GetStatus(void) -{ - return BSP_I2C_GetDevStatus(BSP_24CXX_I2C_UNIT, EE_24CXX_DEV_ADDR); -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_24CXX_Global_Functions EV_HC32F4A0_LQFP176 24CXX Global Functions - * @{ - */ - -/** - * @brief BSP Initializes I2C for 24CXX. - * @param None - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t BSP_24CXX_Init(void) -{ - return EE_24CXX_Init(&m_stc24cxxLL); -} - -/** - * @brief BSP De-Initializes I2C for 24CXX. - * @param None - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR_INVD_PARAM: Invalid parameter - */ -int32_t BSP_24CXX_DeInit(void) -{ - return EE_24CXX_DeInit(&m_stc24cxxLL); -} - -/** - * @brief BSP 24CXX write data. - * @param [in] u16Addr: The start address of the data to be write. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be write. - * @param [in] u32Len: Buffer size in byte. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -int32_t BSP_24CXX_Write(uint16_t u16Addr, const uint8_t *pu8Buf, uint32_t u32Len) -{ - return EE_24CXX_Write(&m_stc24cxxLL, u16Addr, pu8Buf, u32Len); -} - -/** - * @brief 24CXX read data. - * @param [in] u16Addr: The start address of the data to be read. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be stored. - * @param [in] u32Len: Buffer size in byte. - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR: Receive NACK - * - LL_ERR_TIMEOUT: Timeout - * - LL_ERR_INVD_PARAM: pu8Buf is NULL - */ -int32_t BSP_24CXX_Read(uint16_t u16Addr, uint8_t *pu8Buf, uint32_t u32Len) -{ - return EE_24CXX_Read(&m_stc24cxxLL, u16Addr, pu8Buf, u32Len); -} - -/** - * @brief 24CXX wait idle. - * @param None - * @retval int32_t: - * - LL_OK: Success - * - LL_ERR_TIMEOUT: Failed - */ -int32_t BSP_24CXX_WaitIdle(void) -{ - return EE_24CXX_WaitIdle(&m_stc24cxxLL); -} - -/** - * @} - */ - -#endif /* (BSP_24CXX_ENABLE && BSP_EV_HC32F4A0_LQFP176) */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_24cxx.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_24cxx.h deleted file mode 100644 index 95ea1d42c63..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_24cxx.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_24cxx.h - * @brief This file contains all the functions prototypes of the - ev_hc32f4a0_lqfp176_24cxx driver library. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_24CXX_H__ -#define __EV_HC32F4A0_LQFP176_24CXX_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "24cxx.h" -#include "ev_hc32f4a0_lqfp176.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_24CXX - * @{ - */ -#if ((BSP_24CXX_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_24CXX_Global_Macros EV_HC32F4A0_LQFP176 24CXX Global Macros - * @{ - */ -/* I2C unit define */ -#define BSP_24CXX_I2C_UNIT (CM_I2C1) -#define BSP_24CXX_I2C_FCG (FCG1_PERIPH_I2C1) - -/* Define port and pin for SDA and SCL */ -#define BSP_24CXX_I2C_SCL_PORT (GPIO_PORT_D) -#define BSP_24CXX_I2C_SCL_PIN (GPIO_PIN_03) -#define BSP_24CXX_I2C_SDA_PORT (GPIO_PORT_F) -#define BSP_24CXX_I2C_SDA_PIN (GPIO_PIN_10) -#define BSP_24CXX_I2C_SCL_FUNC (GPIO_FUNC_49) -#define BSP_24CXX_I2C_SDA_FUNC (GPIO_FUNC_48) - -/* Define for EEPROM AT24C02 */ -#define EE_24CXX_DEV_ADDR (0x50U) -#define EE_24CXX_MEM_ADDR_LEN (1U) -#define EE_24CXX_PAGE_SIZE (8U) -#define EE_24CXX_CAPACITY (256U) -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_24CXX_Global_Functions - * @{ - */ -int32_t BSP_24CXX_Init(void); -int32_t BSP_24CXX_DeInit(void); -int32_t BSP_24CXX_Write(uint16_t u16Addr, const uint8_t *pu8Buf, uint32_t u32Len); -int32_t BSP_24CXX_Read(uint16_t u16Addr, uint8_t *pu8Buf, uint32_t u32Len); -int32_t BSP_24CXX_WaitIdle(void); -/** - * @} - */ - -#endif /* (BSP_24CXX_ENABLE && BSP_EV_HC32F4A0_LQFP176)*/ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_24CXX_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_bsp.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_bsp.h deleted file mode 100644 index 76f7c0a8e08..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_bsp.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_bsp.h - * @brief This file contains all the header file of the EV_HC32F4A0_LQFP176 - * BSP driver library. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -#ifndef __EV_HC32F4A0_LQFP176_BSP__ -#define __EV_HC32F4A0_LQFP176_BSP__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -/** - * @brief Include BSP board's header file - */ -#if (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX) -#include "ev_hc32f4a0_lqfp176.h" -#endif /* BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @brief Include BSP device component's header file - */ -#if (BSP_24CXX_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_24cxx.h" -#endif /* BSP_24CXX_ENABLE */ - -#if (BSP_GT9XX_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_gt9xx.h" -#endif /* BSP_GT9XX_ENABLE */ - -#if (BSP_IS42S16400J7TLI_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_is42s16400j7tli.h" -#endif /* BSP_IS42S16400J7TLI_ENABLE */ - -#if (BSP_IS62WV51216_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_is62wv51216.h" -#endif /* BSP_IS62WV51216_ENABLE */ - -#if (BSP_MT29F2G08AB_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_mt29f2g08ab.h" -#endif /* BSP_MT29F2G08AB_ENABLE */ - -#if (BSP_NT35510_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_nt35510.h" -#endif /* BSP_NT35510_ENABLE */ - -#if (BSP_OV5640_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_ov5640.h" -#endif /* BSP_OV5640_ENABLE */ - -#if (BSP_TCA9539_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_tca9539.h" -#endif /* BSP_TCA9539_ENABLE */ - -#if (BSP_W25QXX_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_w25qxx.h" -#endif /* BSP_W25QXX_ENABLE */ - -#if (BSP_WM8731_ENABLE == DDL_ON) -#include "ev_hc32f4a0_lqfp176_wm8731.h" -#endif /* BSP_WM8731_ENABLE */ - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_BSP__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_gt9xx.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_gt9xx.c deleted file mode 100644 index 4ba7705f1be..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_gt9xx.c +++ /dev/null @@ -1,261 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_gt9xx.c - * @brief This file provides firmware functions of the touch pad gt9xx driver - * library for the board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2023-01-15 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include -#include "ev_hc32f4a0_lqfp176_gt9xx.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_GT9XX EV_HC32F4A0_LQFP176 GT9XX - * @{ - */ - -#if ((BSP_GT9XX_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_GT9XX_Local_Functions - * @{ - */ -static void BSP_GT9XX_I2C_Init(void); -static void BSP_GT9XX_I2C_Read(const uint8_t au8Reg[], uint8_t u8RegLen, uint8_t *pu8Buf, uint32_t u32Len); -static void BSP_GT9XX_I2C_Write(const uint8_t au8Reg[], uint8_t u8RegLen, const uint8_t *pu8Buf, uint32_t u32Len); -/** - * @} - */ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/** - * @defgroup EV_HC32F4A0_LQFP176_GT9XX_Local_Variables EV_HC32F4A0_LQFP176 GT9XX Local Variables - * @{ - */ -const static stc_gt9xx_ll_t m_stcGt9xxLL = { - .Init = BSP_GT9XX_I2C_Init, - .Read = BSP_GT9XX_I2C_Read, - .Write = BSP_GT9XX_I2C_Write, -}; -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_GT9XX_Local_Functions EV_HC32F4A0_LQFP176 GT9XX Local Functions - * @{ - */ - -/** - * @brief Initializes I2C for GT9XX. - * @param None - * @retval None - */ -static void BSP_GT9XX_I2C_Init(void) -{ - stc_gpio_init_t stcGpioInit; - - /* Configuration I2C GPIO */ - (void)GPIO_StructInit(&stcGpioInit); - (void)GPIO_Init(BSP_GT9XX_I2C_SCL_PORT, BSP_GT9XX_I2C_SCL_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_GT9XX_I2C_SCL_PORT, BSP_GT9XX_I2C_SCL_PIN, &stcGpioInit); - - /* Initialize I2C port*/ - GPIO_SetFunc(BSP_GT9XX_I2C_SCL_PORT, BSP_GT9XX_I2C_SCL_PIN, BSP_GT9XX_I2C_SCL_FUNC); - GPIO_SetFunc(BSP_GT9XX_I2C_SDA_PORT, BSP_GT9XX_I2C_SDA_PIN, BSP_GT9XX_I2C_SDA_FUNC); - - /* Enable I2C Peripheral*/ - FCG_Fcg0PeriphClockCmd(BSP_GT9XX_I2C_FCG, ENABLE); - - (void)BSP_I2C_Init(BSP_GT9XX_I2C_UNIT); -} - -/** - * @brief BSP GT9XX I2C read. - * @param [in] pu8Reg: Pointer to the register address. - * @param [in] u8RegLen: Length of register address. - * @param [out] pu8Buf: The pointer to the buffer contains the data to be read. - * @param [in] u32Len: Buffer size in byte. - * @retval None - */ -static void BSP_GT9XX_I2C_Read(const uint8_t *pu8Reg, uint8_t u8RegLen, uint8_t *pu8Buf, uint32_t u32Len) -{ - (void)BSP_I2C_Read(BSP_GT9XX_I2C_UNIT, BSP_GT9XX_I2C_ADDR, pu8Reg, u8RegLen, pu8Buf, u32Len); -} - -/** - * @brief BSP GT9XX I2C write. - * @param [in] pu8Reg: Pointer to the register address. - * @param [in] u8RegLen: Length of register address. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be read. - * @param [in] u32Len: Buffer size in byte. - * @retval None - */ -static void BSP_GT9XX_I2C_Write(const uint8_t *pu8Reg, uint8_t u8RegLen, const uint8_t *pu8Buf, uint32_t u32Len) -{ - (void)BSP_I2C_Write(BSP_GT9XX_I2C_UNIT, BSP_GT9XX_I2C_ADDR, pu8Reg, u8RegLen, pu8Buf, u32Len); -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_GT9XX_Global_Functions EV_HC32F4A0_LQFP176 GT9XX Global Functions - * @{ - */ - -/** - * @brief GT9XX device initialize. - * @param None - * @retval None - */ -void BSP_GT9XX_Init(void) -{ - char acTmp[4]; - BSP_GT9XX_I2C_Init(); - - BSP_GT9XX_ReadProductID((uint8_t *)acTmp, 4UL); - if (((acTmp[0] == '9') && (acTmp[1] == '1') && (acTmp[2] == '1')) || \ - ((acTmp[0] == '9') && (acTmp[1] == '1') && (acTmp[2] == '7') && (acTmp[3] == 'S'))) { - BSP_GT9XX_SoftReset(); - } else { - DDL_Printf("Unsupoort touch driver IC"); - } -} - -/** - * @brief Reset GT9XX. - * @param None - * @retval None - */ -void BSP_GT9XX_SoftReset(void) -{ - GT9XX_SoftReset(&m_stcGt9xxLL); -} - -/** - * @brief Read GT9XX touch status. - * @param None - * @retval Touch status - */ -uint8_t BSP_GT9XX_ReadTouchStatus(void) -{ - return GT9XX_ReadTouchStatus(&m_stcGt9xxLL); -} - -/** - * @brief Read GT9XX ID. - * @param [out] pu8IDValue The buffer for reading ID - * @param [in] u32Len The buffer size for bytes - * @retval None - */ -void BSP_GT9XX_ReadProductID(uint8_t *pu8IDValue, uint32_t u32Len) -{ - GT9XX_ReadProductID(&m_stcGt9xxLL, pu8IDValue, u32Len); -} - -/** - * @brief Read GT9XX point. - * @param [in] u16Point Touch pad point - * @param [out] pu16X Point x coordinate - * @param [out] pu16Y Point y coordinate - * @retval None - */ -void BSP_GT9XX_GetXY(uint16_t u16Point, uint16_t *pu16X, uint16_t *pu16Y) -{ - GT9XX_GetXY(&m_stcGt9xxLL, u16Point, pu16X, pu16Y); -} - -/** - * @brief Read register on touch pad register. - * @param [in] u16Reg Register to be read - * @param [out] pu8RegValue The buffer for reading - * @param [in] u32Len The buffer size for bytes - * @retval None - */ -void BSP_GT9XX_REG_Read(uint16_t u16Reg, uint8_t *pu8RegValue, uint32_t u32Len) -{ - GT9XX_REG_Read(&m_stcGt9xxLL, u16Reg, pu8RegValue, u32Len); -} - -/** - * @brief Write register on touch pad register. - * @param [in] u16Reg Register to be write - * @param [in] pu8RegValue The buffer for writing - * @param [in] u32Len The buffer size for bytes - * @retval None - */ -void BSP_GT9XX_REG_Write(uint16_t u16Reg, const uint8_t *pu8RegValue, uint32_t u32Len) -{ - GT9XX_REG_Write(&m_stcGt9xxLL, u16Reg, pu8RegValue, u32Len); -} - -/** - * @} - */ - -#endif /* BSP_GT9XX_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_gt9xx.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_gt9xx.h deleted file mode 100644 index c47c847eebc..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_gt9xx.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_gt9xx.h - * @brief This file contains all the functions prototypes of the touch pad gt9xx - * driver library for the board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2023-01-15 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_GT9XX_H__ -#define __EV_HC32F4A0_LQFP176_GT9XX_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "gt9xx.h" -#include "ev_hc32f4a0_lqfp176.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_GT9XX - * @{ - */ -#if ((BSP_GT9XX_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_GT9XX_Global_Macros EV_HC32F4A0_LQFP176 GT9XX Global Macros - * @{ - */ - -/** - * @defgroup GT9XX_I2C_Interface GT9XX I2C Interface - * @{ - */ -/* GT9XX I2C device address: 0x5D or 0x14 */ -#define BSP_GT9XX_I2C_ADDR (0x14U) - -/* I2C unit */ -#define BSP_GT9XX_I2C_UNIT (CM_I2C1) -#define BSP_GT9XX_I2C_FCG (FCG1_PERIPH_I2C1) - -/* SDA and SCL pin define */ -#define BSP_GT9XX_I2C_SCL_PORT (GPIO_PORT_D) -#define BSP_GT9XX_I2C_SCL_PIN (GPIO_PIN_03) -#define BSP_GT9XX_I2C_SCL_FUNC (GPIO_FUNC_49) - -#define BSP_GT9XX_I2C_SDA_PORT (GPIO_PORT_F) -#define BSP_GT9XX_I2C_SDA_PIN (GPIO_PIN_10) -#define BSP_GT9XX_I2C_SDA_FUNC (GPIO_FUNC_48) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_GT9XX_Global_Functions - * @{ - */ -void BSP_GT9XX_Init(void); -void BSP_GT9XX_SoftReset(void); -uint8_t BSP_GT9XX_ReadTouchStatus(void); -void BSP_GT9XX_ReadProductID(uint8_t *pu8IDValue, uint32_t u32Len); -void BSP_GT9XX_GetXY(uint16_t u16Point, uint16_t *pu16X, uint16_t *pu16Y); -void BSP_GT9XX_REG_Read(uint16_t u16Reg, uint8_t *pu8RegValue, uint32_t u32Len); -void BSP_GT9XX_REG_Write(uint16_t u16Reg, const uint8_t *pu8RegValue, uint32_t u32Len); -/** - * @} - */ - -#endif /* BSP_GT9XX_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_OV5640_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is42s16400j7tli.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is42s16400j7tli.c deleted file mode 100644 index 2660d846032..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is42s16400j7tli.c +++ /dev/null @@ -1,422 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_is42s16400j7tli.c - * @brief This file provides configure functions for is42s16400j7tli of the - * board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2022-10-31 CDT Add timing comments - 2023-09-30 CDT Modify DMC timing for EXCLK frequency 60MHz -> 30MHz - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_fcg.h" -#include "ev_hc32f4a0_lqfp176_is42s16400j7tli.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_IS42S16400J7TLI EV_HC32F4A0_LQFP176 IS42S16400J7TLI - * @{ - */ - -#if ((BSP_IS42S16400J7TLI_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_IS42S16400J7TLI_Local_Macros EV_HC32F4A0_LQFP176 IS42S16400J7TLI Local Macros - * @{ - */ - -/** - * @defgroup DMC_Max_Timeout DMC Max Timeout - * @{ - */ -#define DMC_MAX_TIMEOUT (0x100000UL) -/** - * @} - */ - -/** - * @defgroup IS42S16400J7TLI_Mode_Register_Field IS42S16400J7TLI Mode Register Field - * @{ - */ -/* IS42S16400J7TLI burst length definition */ -#define IS42S16400J7TLI_MR_BURST_1BEAT (0UL) -#define IS42S16400J7TLI_MR_BURST_2BEAT (1UL) -#define IS42S16400J7TLI_MR_BURST_4BEAT (2UL) -#define IS42S16400J7TLI_MR_BURST_8BEAT (3UL) -#define IS42S16400J7TLI_MR_BURST_LEN_FULLPAGE (7UL) - -/* IS42S16400J7TLI burst type definition */ -#define IS42S16400J7TLI_MR_BURST_TYPE_SEQUENTIAL (0UL) -#define IS42S16400J7TLI_MR_BURST_TYPE_INTERLEAVED (1UL << 3) - -/* IS42S16400J7TLI CAS latency definition */ -#define IS42S16400J7TLI_MR_CAS_LATENCY_2 (2UL << 4) -#define IS42S16400J7TLI_MR_CAS_LATENCY_3 (3UL << 4) - -/* IS42S16400J7TLI write burst mode definition */ -#define IS42S16400J7TLI_MR_WRITEBURST_PROGRAMMED (0UL) -#define IS42S16400J7TLI_MR_WRITEBURST_SINGLE (1UL << 9) - -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_IS42S16400J7TLI_Local_Functions - * @{ - */ -static void BSP_DMC_PortInit(void); -static void BSP_SDRAM_InitSequence(uint32_t u32Chip, uint32_t u32Bank, uint32_t u32MdRegValue); -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_IS42S16400J7TLI_Global_Functions EV_HC32F4A0_LQFP176 IS42S16400J7TLI Global Functions - * @{ - */ - -/** - * @brief Initialize DMC for IS42S16400J7TLI. - * @param None - * @retval int32_t: - * - LL_OK: Initialize successfully. - * - LL_ERR: Initialize unsuccessfully. - */ -int32_t BSP_IS42S16400J7TLI_Init(void) -{ - __IO uint32_t u32To = 0UL; - uint32_t u32MdRegValue; - int32_t i32Ret = LL_OK; - stc_exmc_dmc_init_t stcDmcInit; - stc_exmc_dmc_chip_config_t stcCsConfig; - - /* Initialization DMC port.*/ - BSP_DMC_PortInit(); - - /* Enable DMC clock */ - FCG_Fcg3PeriphClockCmd(FCG3_PERIPH_DMC, ENABLE); - - /* Enable DMC. */ - EXMC_DMC_Cmd(ENABLE); - - /* Configure DMC width && refresh period & chip & timing. */ - (void)EXMC_DMC_StructInit(&stcDmcInit); - stcDmcInit.u32RefreshPeriod = 450UL; - stcDmcInit.u32ColumnBitsNumber = EXMC_DMC_COLUMN_BITS_NUM8; - stcDmcInit.u32RowBitsNumber = EXMC_DMC_ROW_BITS_NUM12; - stcDmcInit.u32MemBurst = EXMC_DMC_BURST_1BEAT; - stcDmcInit.u32AutoRefreshChips = EXMC_DMC_AUTO_REFRESH_2CHIPS; - - /* EXCLK bus frequency@30MHz: 3.3V */ - stcDmcInit.stcTimingConfig.u8CASL = 2U; - stcDmcInit.stcTimingConfig.u8DQSS = 0U; - stcDmcInit.stcTimingConfig.u8MRD = 2U; /* tMRD: 2CLK */ - stcDmcInit.stcTimingConfig.u8RAS = 2U; /* tRAS: min=42ns */ - stcDmcInit.stcTimingConfig.u8RC = 2U; /* tRC: min=63ns */ - stcDmcInit.stcTimingConfig.u8RCD_B = 3U; /* tRCD: min=15ns */ - stcDmcInit.stcTimingConfig.u8RCD_P = 0U; - stcDmcInit.stcTimingConfig.u8RFC_B = 2U; /* tRFC: min=63ns */ - stcDmcInit.stcTimingConfig.u8RFC_P = 0U; - stcDmcInit.stcTimingConfig.u8RP_B = 1U; /* tRP: min=15ns */ - stcDmcInit.stcTimingConfig.u8RP_P = 0U; - stcDmcInit.stcTimingConfig.u8RRD = 1U; /* tRRD: min=14ns */ - stcDmcInit.stcTimingConfig.u8WR = 2U; /* tWR: 2CLK */ - stcDmcInit.stcTimingConfig.u8WTR = 1U; - stcDmcInit.stcTimingConfig.u8XP = 1U; - stcDmcInit.stcTimingConfig.u8XSR = 3U; /* tXSR: min=70ns */ - stcDmcInit.stcTimingConfig.u8ESR = 3U; - (void)EXMC_DMC_Init(&stcDmcInit); - - /* Configure DMC address space. */ - stcCsConfig.u32AddrMask = BSP_IS42S16400J7TLI_ADDR_MASK; - stcCsConfig.u32AddrMatch = BSP_IS42S16400J7TLI_ADDR_MATCH; - stcCsConfig.u32AddrDecodeMode = EXMC_DMC_CS_DECODE_ROWBANKCOL; - (void)EXMC_DMC_ChipConfig(BSP_IS42S16400J7TLI_CHIP, &stcCsConfig); - - /* SDRAM initialization sequence. */ - u32MdRegValue = (IS42S16400J7TLI_MR_BURST_TYPE_SEQUENTIAL | IS42S16400J7TLI_MR_WRITEBURST_PROGRAMMED); - if (2U == stcDmcInit.stcTimingConfig.u8CASL) { - u32MdRegValue |= IS42S16400J7TLI_MR_CAS_LATENCY_2; - } else { - u32MdRegValue |= IS42S16400J7TLI_MR_CAS_LATENCY_3; - } - - if (EXMC_DMC_BURST_1BEAT == stcDmcInit.u32MemBurst) { - u32MdRegValue |= IS42S16400J7TLI_MR_BURST_1BEAT; - } else if (EXMC_DMC_BURST_2BEAT == stcDmcInit.u32MemBurst) { - u32MdRegValue |= IS42S16400J7TLI_MR_BURST_2BEAT; - } else if (EXMC_DMC_BURST_4BEAT == stcDmcInit.u32MemBurst) { - u32MdRegValue |= IS42S16400J7TLI_MR_BURST_4BEAT; - } else { - u32MdRegValue |= IS42S16400J7TLI_MR_BURST_8BEAT; - } - - BSP_SDRAM_InitSequence(BSP_IS42S16400J7TLI_CHIP, BSP_IS42S16400J7TLI_BANK, u32MdRegValue); - - /* Switch state from configure to ready */ - EXMC_DMC_SetState(EXMC_DMC_CTRL_STATE_GO); - EXMC_DMC_SetState(EXMC_DMC_CTRL_STATE_WAKEUP); - EXMC_DMC_SetState(EXMC_DMC_CTRL_STATE_GO); - - /* Check status */ - while (EXMC_DMC_CURR_STATUS_RDY != EXMC_DMC_GetStatus()) { - if (u32To > DMC_MAX_TIMEOUT) { - i32Ret = LL_ERR; - break; - } - u32To++; - } - - return i32Ret; -} - -/** - * @brief Get memory information. - * @param [out] pu32MemoryStartAddr The pointer for memory start address - * @param [out] pu32MemoryByteSize The pointer for memory size(unit: Byte) - * @retval None - */ -void BSP_IS42S16400J7TLI_GetMemInfo(uint32_t *pu32MemoryStartAddr, uint32_t *pu32MemoryByteSize) -{ - if (NULL != pu32MemoryStartAddr) { - *pu32MemoryStartAddr = BSP_IS42S16400J7TLI_START_ADDR; - } - - if (NULL != pu32MemoryByteSize) { - *pu32MemoryByteSize = BSP_IS42S16400J7TLI_SIZE; - } -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_IS42S16400J7TLI_Local_Functions EV_HC32F4A0_LQFP176 IS42S16400J7TLI Local Functions - * @{ - */ - -/** - * @brief Initialize DMC port. - * @param None - * @retval None - */ -static void BSP_DMC_PortInit(void) -{ - stc_gpio_init_t stcGpioInit; - - /************************* Set pin drive capacity *************************/ - (void)GPIO_StructInit(&stcGpioInit); - stcGpioInit.u16PinDrv = PIN_HIGH_DRV; - - /* DMC_CKE */ - (void)GPIO_Init(BSP_IS42S16400J7TLI_CKE_PORT, BSP_IS42S16400J7TLI_CKE_PIN, &stcGpioInit); - - /* DMC_CLK */ - (void)GPIO_Init(BSP_IS42S16400J7TLI_CLK_PORT, BSP_IS42S16400J7TLI_CLK_PIN, &stcGpioInit); - - /* DMC_LDQM && DMC_UDQM */ - (void)GPIO_Init(BSP_IS42S16400J7TLI_DQM0_PORT, BSP_IS42S16400J7TLI_DQM0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DQM1_PORT, BSP_IS42S16400J7TLI_DQM1_PIN, &stcGpioInit); - - /* DMC_BA[0:1] */ - (void)GPIO_Init(BSP_IS42S16400J7TLI_BA0_PORT, BSP_IS42S16400J7TLI_BA0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_BA1_PORT, BSP_IS42S16400J7TLI_BA1_PIN, &stcGpioInit); - - /* DMC_CAS && DMC_RAS */ - (void)GPIO_Init(BSP_IS42S16400J7TLI_CAS_PORT, BSP_IS42S16400J7TLI_CAS_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_RAS_PORT, BSP_IS42S16400J7TLI_RAS_PIN, &stcGpioInit); - - /* DMC_WE */ - (void)GPIO_Init(BSP_IS42S16400J7TLI_WE_PORT, BSP_IS42S16400J7TLI_WE_PIN, &stcGpioInit); - - /* DMC_DATA[0:15] */ - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA0_PORT, BSP_IS42S16400J7TLI_DATA0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA1_PORT, BSP_IS42S16400J7TLI_DATA1_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA2_PORT, BSP_IS42S16400J7TLI_DATA2_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA3_PORT, BSP_IS42S16400J7TLI_DATA3_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA4_PORT, BSP_IS42S16400J7TLI_DATA4_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA5_PORT, BSP_IS42S16400J7TLI_DATA5_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA6_PORT, BSP_IS42S16400J7TLI_DATA6_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA7_PORT, BSP_IS42S16400J7TLI_DATA7_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA8_PORT, BSP_IS42S16400J7TLI_DATA8_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA9_PORT, BSP_IS42S16400J7TLI_DATA9_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA10_PORT, BSP_IS42S16400J7TLI_DATA10_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA11_PORT, BSP_IS42S16400J7TLI_DATA11_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA12_PORT, BSP_IS42S16400J7TLI_DATA12_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA13_PORT, BSP_IS42S16400J7TLI_DATA13_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA14_PORT, BSP_IS42S16400J7TLI_DATA14_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_DATA15_PORT, BSP_IS42S16400J7TLI_DATA15_PIN, &stcGpioInit); - - /* DMC_ADD[0:11]*/ - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD0_PORT, BSP_IS42S16400J7TLI_ADD0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD1_PORT, BSP_IS42S16400J7TLI_ADD1_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD2_PORT, BSP_IS42S16400J7TLI_ADD2_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD3_PORT, BSP_IS42S16400J7TLI_ADD3_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD4_PORT, BSP_IS42S16400J7TLI_ADD4_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD5_PORT, BSP_IS42S16400J7TLI_ADD5_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD6_PORT, BSP_IS42S16400J7TLI_ADD6_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD7_PORT, BSP_IS42S16400J7TLI_ADD7_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD8_PORT, BSP_IS42S16400J7TLI_ADD8_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD9_PORT, BSP_IS42S16400J7TLI_ADD9_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD10_PORT, BSP_IS42S16400J7TLI_ADD10_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS42S16400J7TLI_ADD11_PORT, BSP_IS42S16400J7TLI_ADD11_PIN, &stcGpioInit); - - /************************** Set EXMC pin function *************************/ - /* DMC_CKE */ - GPIO_SetFunc(BSP_IS42S16400J7TLI_CKE_PORT, BSP_IS42S16400J7TLI_CKE_PIN, GPIO_FUNC_12); - - /* DMC_CLK */ - GPIO_SetFunc(BSP_IS42S16400J7TLI_CLK_PORT, BSP_IS42S16400J7TLI_CLK_PIN, GPIO_FUNC_12); - - /* DMC_LDQM && DMC_UDQM */ - GPIO_SetFunc(BSP_IS42S16400J7TLI_DQM0_PORT, BSP_IS42S16400J7TLI_DQM0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DQM1_PORT, BSP_IS42S16400J7TLI_DQM1_PIN, GPIO_FUNC_12); - - /* DMC_BA[0:1] */ - GPIO_SetFunc(BSP_IS42S16400J7TLI_BA0_PORT, BSP_IS42S16400J7TLI_BA0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_BA1_PORT, BSP_IS42S16400J7TLI_BA1_PIN, GPIO_FUNC_12); - - /* DMC_CS */ - GPIO_SetFunc(BSP_IS42S16400J7TLI_CS1_PORT, BSP_IS42S16400J7TLI_CS1_PIN, GPIO_FUNC_12); - - /* DMC_CAS && DMC_RAS */ - GPIO_SetFunc(BSP_IS42S16400J7TLI_CAS_PORT, BSP_IS42S16400J7TLI_CAS_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_RAS_PORT, BSP_IS42S16400J7TLI_RAS_PIN, GPIO_FUNC_12); - - /* DMC_WE */ - GPIO_SetFunc(BSP_IS42S16400J7TLI_WE_PORT, BSP_IS42S16400J7TLI_WE_PIN, GPIO_FUNC_12); - - /* DMC_DATA[0:15] */ - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA0_PORT, BSP_IS42S16400J7TLI_DATA0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA1_PORT, BSP_IS42S16400J7TLI_DATA1_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA2_PORT, BSP_IS42S16400J7TLI_DATA2_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA3_PORT, BSP_IS42S16400J7TLI_DATA3_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA4_PORT, BSP_IS42S16400J7TLI_DATA4_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA5_PORT, BSP_IS42S16400J7TLI_DATA5_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA6_PORT, BSP_IS42S16400J7TLI_DATA6_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA7_PORT, BSP_IS42S16400J7TLI_DATA7_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA8_PORT, BSP_IS42S16400J7TLI_DATA8_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA9_PORT, BSP_IS42S16400J7TLI_DATA9_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA10_PORT, BSP_IS42S16400J7TLI_DATA10_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA11_PORT, BSP_IS42S16400J7TLI_DATA11_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA12_PORT, BSP_IS42S16400J7TLI_DATA12_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA13_PORT, BSP_IS42S16400J7TLI_DATA13_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA14_PORT, BSP_IS42S16400J7TLI_DATA14_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_DATA15_PORT, BSP_IS42S16400J7TLI_DATA15_PIN, GPIO_FUNC_12); - - /* DMC_ADD[0:11]*/ - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD0_PORT, BSP_IS42S16400J7TLI_ADD0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD1_PORT, BSP_IS42S16400J7TLI_ADD1_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD2_PORT, BSP_IS42S16400J7TLI_ADD2_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD3_PORT, BSP_IS42S16400J7TLI_ADD3_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD4_PORT, BSP_IS42S16400J7TLI_ADD4_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD5_PORT, BSP_IS42S16400J7TLI_ADD5_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD6_PORT, BSP_IS42S16400J7TLI_ADD6_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD7_PORT, BSP_IS42S16400J7TLI_ADD7_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD8_PORT, BSP_IS42S16400J7TLI_ADD8_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD9_PORT, BSP_IS42S16400J7TLI_ADD9_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD10_PORT, BSP_IS42S16400J7TLI_ADD10_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS42S16400J7TLI_ADD11_PORT, BSP_IS42S16400J7TLI_ADD11_PIN, GPIO_FUNC_12); -} - -/** - * @brief SDRAM IS42S16400J7TLI initialization sequence. - * @param [in] u32Chip The command chip number. - * This parameter can be one of the following values: - * @arg EXMC_DMC_CHIP0: Chip 0 - * @arg EXMC_DMC_CHIP1: Chip 1 - * @arg EXMC_DMC_CHIP2: Chip 2 - * @arg EXMC_DMC_CHIP3: Chip 3 - * @param [in] u32Bank The command bank. - * This parameter can be one of the following values: - * @arg EXMC_DMC_BANK0: Bank 0 - * @arg EXMC_DMC_BANK1: Bank 1 - * @arg EXMC_DMC_BANK2: Bank 2 - * @arg EXMC_DMC_BANK3: Bank 3 - * @param [in] u32MdRegValue The SDRAM mode register value - * @retval None - */ -static void BSP_SDRAM_InitSequence(uint32_t u32Chip, uint32_t u32Bank, uint32_t u32MdRegValue) -{ - /* SDRAM initialization sequence: - CMD NOP->PrechargeAll->AutoRefresh->AutoRefresh->MdRegConfig->NOP */ - (void)EXMC_DMC_SetCommand(u32Chip, u32Bank, EXMC_DMC_CMD_NOP, 0UL); - (void)EXMC_DMC_SetCommand(u32Chip, u32Bank, EXMC_DMC_CMD_PRECHARGE_ALL, 0UL); - (void)EXMC_DMC_SetCommand(u32Chip, u32Bank, EXMC_DMC_CMD_AUTO_REFRESH, 0UL); - (void)EXMC_DMC_SetCommand(u32Chip, u32Bank, EXMC_DMC_CMD_AUTO_REFRESH, 0UL); - (void)EXMC_DMC_SetCommand(u32Chip, u32Bank, EXMC_DMC_CMD_MDREG_CONFIG, u32MdRegValue); - (void)EXMC_DMC_SetCommand(u32Chip, u32Bank, EXMC_DMC_CMD_NOP, 0UL); -} - -/** - * @} - */ - -#endif /* BSP_IS42S16400J7TLI_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is42s16400j7tli.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is42s16400j7tli.h deleted file mode 100644 index ff9cdfe7f24..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is42s16400j7tli.h +++ /dev/null @@ -1,241 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_is42s16400j7tli.h - * @brief This file contains all the functions prototypes for is42s16400j7tli of - * the board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_IS42S16400J7TLI_H__ -#define __EV_HC32F4A0_LQFP176_IS42S16400J7TLI_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_gpio.h" -#include "hc32_ll_dmc.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_IS42S16400J7TLI - * @{ - */ - -#if ((BSP_IS42S16400J7TLI_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_IS42S16400J7TLI_Global_Macros EV_HC32F4A0_LQFP176 IS42S16400J7TLI Global Macros - * @{ - */ - -/** - * @defgroup IS42S16400J7TLI_Map_DMC_Chip IS42S16400J7TLI Map DMC Chip - * @{ - */ -#define BSP_IS42S16400J7TLI_CHIP (EXMC_DMC_CHIP1) -#define BSP_IS42S16400J7TLI_BANK (EXMC_DMC_BANK0) -/** - * @} - */ - -/** - * @defgroup IS42S16400J7TLI_Map_Address_Space IS42S16400J7TLI Map Address Space - * @{ - */ -#define BSP_IS42S16400J7TLI_ADDR_MATCH (0x80UL) -#define BSP_IS42S16400J7TLI_ADDR_MASK (EXMC_DMC_ADDR_MASK_16MB) -/** - * @} - */ - -/** - * @defgroup IS42S16400J7TLI_Memory_Size IS42S16400J7TLI Memory Size - * @{ - */ -#define BSP_IS42S16400J7TLI_SIZE (8UL * 1024UL * 1024UL) /* 8MBytes*/ -/** - * @} - */ - -/** - * @defgroup SDRAM_Address_Space SDRAM Address Space - * @note SDRAM address:[0x80000000, 0x807FFFFF] and SDRAM size: 8M bytes - * @{ - */ -#define BSP_IS42S16400J7TLI_START_ADDR (EXMC_DMC_GetChipStartAddr(BSP_IS42S16400J7TLI_CHIP)) -#define BSP_IS42S16400J7TLI_END_ADDR (BSP_IS42S16400J7TLI_START_ADDR + BSP_IS42S16400J7TLI_SIZE - 1UL) -/** - * @} - */ - -/** - * @defgroup DMC_Interface_Pin DMC Interface Pin - * @{ - */ -#define BSP_IS42S16400J7TLI_CKE_PORT (GPIO_PORT_C) /* PC03 - EXMC_ALE */ -#define BSP_IS42S16400J7TLI_CKE_PIN (GPIO_PIN_03) - -#define BSP_IS42S16400J7TLI_CLK_PORT (GPIO_PORT_G) /* PD03 - EXMC_CLK */ -#define BSP_IS42S16400J7TLI_CLK_PIN (GPIO_PIN_08) - -#define BSP_IS42S16400J7TLI_DQM0_PORT (GPIO_PORT_E) /* PE00 - EXMC_CE4 */ -#define BSP_IS42S16400J7TLI_DQM0_PIN (GPIO_PIN_00) -#define BSP_IS42S16400J7TLI_DQM1_PORT (GPIO_PORT_E) /* PE01 - EXMC_CE5 */ -#define BSP_IS42S16400J7TLI_DQM1_PIN (GPIO_PIN_01) - -#define BSP_IS42S16400J7TLI_BA0_PORT (GPIO_PORT_D) /* PD11 - EXMC_ADD16 */ -#define BSP_IS42S16400J7TLI_BA0_PIN (GPIO_PIN_11) -#define BSP_IS42S16400J7TLI_BA1_PORT (GPIO_PORT_D) /* PD12 - EXMC_ADD17 */ -#define BSP_IS42S16400J7TLI_BA1_PIN (GPIO_PIN_12) - -#define BSP_IS42S16400J7TLI_CS1_PORT (GPIO_PORT_G) /* PG09 - EXMC_CE1 */ -#define BSP_IS42S16400J7TLI_CS1_PIN (GPIO_PIN_09) - -#define BSP_IS42S16400J7TLI_RAS_PORT (GPIO_PORT_F) /* PF11 - EXMC_OE */ -#define BSP_IS42S16400J7TLI_RAS_PIN (GPIO_PIN_11) - -#define BSP_IS42S16400J7TLI_CAS_PORT (GPIO_PORT_G) /* PG15 - EXMC_BAA */ -#define BSP_IS42S16400J7TLI_CAS_PIN (GPIO_PIN_15) - -#define BSP_IS42S16400J7TLI_WE_PORT (GPIO_PORT_C) /* PC00 - EXMC_WE */ -#define BSP_IS42S16400J7TLI_WE_PIN (GPIO_PIN_00) - -#define BSP_IS42S16400J7TLI_ADD0_PORT (GPIO_PORT_F) /* PF00 - EXMC_ADD0 */ -#define BSP_IS42S16400J7TLI_ADD0_PIN (GPIO_PIN_00) -#define BSP_IS42S16400J7TLI_ADD1_PORT (GPIO_PORT_F) /* PF01 - EXMC_ADD1 */ -#define BSP_IS42S16400J7TLI_ADD1_PIN (GPIO_PIN_01) -#define BSP_IS42S16400J7TLI_ADD2_PORT (GPIO_PORT_F) /* PF02 - EXMC_ADD2 */ -#define BSP_IS42S16400J7TLI_ADD2_PIN (GPIO_PIN_02) -#define BSP_IS42S16400J7TLI_ADD3_PORT (GPIO_PORT_F) /* PF03 - EXMC_ADD3 */ -#define BSP_IS42S16400J7TLI_ADD3_PIN (GPIO_PIN_03) -#define BSP_IS42S16400J7TLI_ADD4_PORT (GPIO_PORT_F) /* PF04 - EXMC_ADD4 */ -#define BSP_IS42S16400J7TLI_ADD4_PIN (GPIO_PIN_04) -#define BSP_IS42S16400J7TLI_ADD5_PORT (GPIO_PORT_F) /* PF05 - EXMC_ADD5 */ -#define BSP_IS42S16400J7TLI_ADD5_PIN (GPIO_PIN_05) -#define BSP_IS42S16400J7TLI_ADD6_PORT (GPIO_PORT_F) /* PF12 - EXMC_ADD6 */ -#define BSP_IS42S16400J7TLI_ADD6_PIN (GPIO_PIN_12) -#define BSP_IS42S16400J7TLI_ADD7_PORT (GPIO_PORT_F) /* PF13 - EXMC_ADD7 */ -#define BSP_IS42S16400J7TLI_ADD7_PIN (GPIO_PIN_13) -#define BSP_IS42S16400J7TLI_ADD8_PORT (GPIO_PORT_F) /* PF14 - EXMC_ADD8 */ -#define BSP_IS42S16400J7TLI_ADD8_PIN (GPIO_PIN_14) -#define BSP_IS42S16400J7TLI_ADD9_PORT (GPIO_PORT_F) /* PF15 - EXMC_ADD9 */ -#define BSP_IS42S16400J7TLI_ADD9_PIN (GPIO_PIN_15) -#define BSP_IS42S16400J7TLI_ADD10_PORT (GPIO_PORT_G) /* PG00 - EXMC_ADD10 */ -#define BSP_IS42S16400J7TLI_ADD10_PIN (GPIO_PIN_00) -#define BSP_IS42S16400J7TLI_ADD11_PORT (GPIO_PORT_G) /* PG01 - EXMC_ADD11 */ -#define BSP_IS42S16400J7TLI_ADD11_PIN (GPIO_PIN_01) - -#define BSP_IS42S16400J7TLI_DATA0_PORT (GPIO_PORT_D) /* PD14 - EXMC_DATA0 */ -#define BSP_IS42S16400J7TLI_DATA0_PIN (GPIO_PIN_14) -#define BSP_IS42S16400J7TLI_DATA1_PORT (GPIO_PORT_D) /* PD15 - EXMC_DATA1 */ -#define BSP_IS42S16400J7TLI_DATA1_PIN (GPIO_PIN_15) -#define BSP_IS42S16400J7TLI_DATA2_PORT (GPIO_PORT_D) /* PD00 - EXMC_DATA2 */ -#define BSP_IS42S16400J7TLI_DATA2_PIN (GPIO_PIN_00) -#define BSP_IS42S16400J7TLI_DATA3_PORT (GPIO_PORT_D) /* PD01 - EXMC_DATA3 */ -#define BSP_IS42S16400J7TLI_DATA3_PIN (GPIO_PIN_01) -#define BSP_IS42S16400J7TLI_DATA4_PORT (GPIO_PORT_E) /* PE07 - EXMC_DATA4 */ -#define BSP_IS42S16400J7TLI_DATA4_PIN (GPIO_PIN_07) -#define BSP_IS42S16400J7TLI_DATA5_PORT (GPIO_PORT_E) /* PE08 - EXMC_DATA5 */ -#define BSP_IS42S16400J7TLI_DATA5_PIN (GPIO_PIN_08) -#define BSP_IS42S16400J7TLI_DATA6_PORT (GPIO_PORT_E) /* PE09 - EXMC_DATA6 */ -#define BSP_IS42S16400J7TLI_DATA6_PIN (GPIO_PIN_09) -#define BSP_IS42S16400J7TLI_DATA7_PORT (GPIO_PORT_E) /* PE10 - EXMC_DATA7 */ -#define BSP_IS42S16400J7TLI_DATA7_PIN (GPIO_PIN_10) -#define BSP_IS42S16400J7TLI_DATA8_PORT (GPIO_PORT_E) /* PE11 - EXMC_DATA8 */ -#define BSP_IS42S16400J7TLI_DATA8_PIN (GPIO_PIN_11) -#define BSP_IS42S16400J7TLI_DATA9_PORT (GPIO_PORT_E) /* PE12 - EXMC_DATA9 */ -#define BSP_IS42S16400J7TLI_DATA9_PIN (GPIO_PIN_12) -#define BSP_IS42S16400J7TLI_DATA10_PORT (GPIO_PORT_E) /* PE13 - EXMC_DATA10 */ -#define BSP_IS42S16400J7TLI_DATA10_PIN (GPIO_PIN_13) -#define BSP_IS42S16400J7TLI_DATA11_PORT (GPIO_PORT_E) /* PE14 - EXMC_DATA11 */ -#define BSP_IS42S16400J7TLI_DATA11_PIN (GPIO_PIN_14) -#define BSP_IS42S16400J7TLI_DATA12_PORT (GPIO_PORT_E) /* PE15 - EXMC_DATA12 */ -#define BSP_IS42S16400J7TLI_DATA12_PIN (GPIO_PIN_15) -#define BSP_IS42S16400J7TLI_DATA13_PORT (GPIO_PORT_D) /* PD08 - EXMC_DATA13 */ -#define BSP_IS42S16400J7TLI_DATA13_PIN (GPIO_PIN_08) -#define BSP_IS42S16400J7TLI_DATA14_PORT (GPIO_PORT_D) /* PD09 - EXMC_DATA14 */ -#define BSP_IS42S16400J7TLI_DATA14_PIN (GPIO_PIN_09) -#define BSP_IS42S16400J7TLI_DATA15_PORT (GPIO_PORT_D) /* PD10 - EXMC_DATA15 */ -#define BSP_IS42S16400J7TLI_DATA15_PIN (GPIO_PIN_10) -/** - * @} - */ -/** - * @} - */ - - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** -* @addtogroup EV_HC32F4A0_LQFP176_IS42S16400J7TLI_Global_Functions -* @{ -*/ -int32_t BSP_IS42S16400J7TLI_Init(void); -void BSP_IS42S16400J7TLI_GetMemInfo(uint32_t *pu32MemoryStartAddr, uint32_t *pu32MemoryByteSize); -/** - * @} - */ - -#endif /* BSP_IS42S16400J7TLI_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_IS42S16400J7TLI_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is62wv51216.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is62wv51216.c deleted file mode 100644 index 33c33fc2a44..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is62wv51216.c +++ /dev/null @@ -1,353 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_is62wv51216.c - * @brief This file provides configure functions for is62wv51216 of the board - * EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2022-10-31 CDT Add timing comments - 2023-09-30 CDT Modify SMC timing parameter: EXCLK 60MHz -> 30MHz - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include - -#include "hc32_ll_fcg.h" -#include "ev_hc32f4a0_lqfp176_is62wv51216.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_IS62WV51216 EV_HC32F4A0_LQFP176 IS62WV51216 - * @{ - */ - -#if ((DDL_ON == BSP_IS62WV51216_ENABLE) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_IS62WV51216_Local_Macros EV_HC32F4A0_LQFP176 IS62WV51216 Local Macros - * @{ - */ - -/** - * @defgroup SMC_Max_Timeout SMC Max Timeout - * @{ - */ -#define SMC_MAX_TIMEOUT (0x100000UL) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_IS62WV51216_Local_Functions - * @{ - */ -static void BSP_SMC_PortInit(void); -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_IS62WV51216_Global_Functions EV_HC32F4A0_LQFP176 IS62WV51216 Global Functions - * @{ - */ - -/** - * @brief Initialize SMC for IS62WV51216. - * @param None - * @retval int32_t: - * - LL_OK: Initialize successfully. - * - LL_ERR: Initialize unsuccessfully. - */ -int32_t BSP_IS62WV51216_Init(void) -{ - __IO uint32_t u32To = 0UL; - int32_t i32Ret = LL_OK; - stc_exmc_smc_init_t stcSmcInit; - stc_exmc_smc_chip_config_t stcChipConfig; - stc_exmc_smc_timing_config_t stcTimingConfig; - en_flag_status_t enChipStatus = RESET; - en_flag_status_t enTimingStatus = RESET; - - /* Initialize SMC port. */ - BSP_SMC_PortInit(); - - /* Enable SMC clock */ - FCG_Fcg3PeriphClockCmd(FCG3_PERIPH_SMC, ENABLE); - - /* Enable SMC. */ - EXMC_SMC_Cmd(ENABLE); - - EXMC_SMC_ExitLowPower(); - - while (EXMC_SMC_READY != EXMC_SMC_GetStatus()) { - if (u32To > SMC_MAX_TIMEOUT) { - i32Ret = LL_ERR; - break; - } - u32To++; - } - - if (LL_OK == i32Ret) { - /* Configure SMC width && CS &chip & timing. */ - (void)EXMC_SMC_StructInit(&stcSmcInit); - stcSmcInit.stcChipConfig.u32ReadMode = EXMC_SMC_READ_ASYNC; - stcSmcInit.stcChipConfig.u32ReadBurstLen = EXMC_SMC_READ_BURST_1BEAT; - stcSmcInit.stcChipConfig.u32WriteMode = EXMC_SMC_WRITE_ASYNC; - stcSmcInit.stcChipConfig.u32WriteBurstLen = EXMC_SMC_WRITE_BURST_1BEAT; - stcSmcInit.stcChipConfig.u32MemoryWidth = EXMC_SMC_MEMORY_WIDTH_16BIT; - stcSmcInit.stcChipConfig.u32BAA = EXMC_SMC_BAA_PORT_DISABLE; - stcSmcInit.stcChipConfig.u32ADV = EXMC_SMC_ADV_PORT_DISABLE; - stcSmcInit.stcChipConfig.u32BLS = EXMC_SMC_BLS_SYNC_CS; - stcSmcInit.stcChipConfig.u32AddrMatch = BSP_IS62WV51216_MATCH_ADDR; - stcSmcInit.stcChipConfig.u32AddrMask = BSP_IS62WV51216_MASK_ADDR; - - /* EXCLK bus frequency@30MHz: 3.3V */ - stcSmcInit.stcTimingConfig.u8RC = 4U; /* tRC: min=55ns */ - stcSmcInit.stcTimingConfig.u8WC = 4U; /* tWC: min=55ns */ - stcSmcInit.stcTimingConfig.u8CEOE = 1U; - stcSmcInit.stcTimingConfig.u8WP = 2U; /* tWP: min=40ns */ - stcSmcInit.stcTimingConfig.u8PC = 1U; - stcSmcInit.stcTimingConfig.u8TR = 1U; - (void)EXMC_SMC_Init(BSP_IS62WV51216_CHIP, &stcSmcInit); - - /* Set command: updateregs */ - EXMC_SMC_SetCommand(BSP_IS62WV51216_CHIP, EXMC_SMC_CMD_UPDATEREGS, 0UL, 0UL); - - /* Check timing status */ - u32To = 0UL; - while ((enChipStatus != SET) || (enTimingStatus != SET)) { - (void)EXMC_SMC_GetTimingConfig(BSP_IS62WV51216_CHIP, &stcTimingConfig); - if (0 == memcmp(&stcTimingConfig, &stcSmcInit.stcTimingConfig, sizeof(stcTimingConfig))) { - enTimingStatus = SET; - } - - (void)EXMC_SMC_GetChipConfig(BSP_IS62WV51216_CHIP, &stcChipConfig); - if (0 == memcmp(&stcChipConfig, &stcSmcInit.stcChipConfig, sizeof(stcChipConfig))) { - enChipStatus = SET; - } - - if (u32To > SMC_MAX_TIMEOUT) { - i32Ret = LL_ERR; - break; - } - u32To++; - } - } - - return i32Ret; -} - -/** - * @brief Get memory information. - * @param [out] pu32MemoryStartAddr Pointer to memory start address - * @param [out] pu32MemoryByteSize Pointer to memory size(unit: Byte) - * @retval None - */ -void BSP_IS62WV51216_GetMemInfo(uint32_t *pu32MemoryStartAddr, uint32_t *pu32MemoryByteSize) -{ - if (NULL != pu32MemoryStartAddr) { - *pu32MemoryStartAddr = BSP_IS62WV51216_START_ADDR; - } - - if (NULL != pu32MemoryByteSize) { - *pu32MemoryByteSize = BSP_IS62WV51216_SIZE; - } -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_IS62WV51216_Local_Functions EV_HC32F4A0_LQFP176 IS62WV51216 Local Functions - * @{ - */ - -/** - * @brief Initialize SMC port. - * @param None - * @retval None - */ -static void BSP_SMC_PortInit(void) -{ - stc_gpio_init_t stcGpioInit; - - /************************* Set pin drive capacity *************************/ - (void)GPIO_StructInit(&stcGpioInit); - stcGpioInit.u16PinDrv = PIN_HIGH_DRV; - - /* SMC_CS */ - (void)GPIO_Init(BSP_IS62WV51216_CS_PORT, BSP_IS62WV51216_CS_PIN, &stcGpioInit); - - /* SMC_WE */ - (void)GPIO_Init(BSP_IS62WV51216_WE_PORT, BSP_IS62WV51216_WE_PIN, &stcGpioInit); - - /* SMC_BLS[0:1] */ - (void)GPIO_Init(BSP_IS62WV51216_BLS0_PORT, BSP_IS62WV51216_BLS0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_BLS1_PORT, BSP_IS62WV51216_BLS1_PIN, &stcGpioInit); - - /* SMC_OE */ - (void)GPIO_Init(BSP_IS62WV51216_OE_PORT, BSP_IS62WV51216_OE_PIN, &stcGpioInit); - - /* SMC_DATA[0:15] */ - (void)GPIO_Init(BSP_IS62WV51216_DATA0_PORT, BSP_IS62WV51216_DATA0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA1_PORT, BSP_IS62WV51216_DATA1_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA2_PORT, BSP_IS62WV51216_DATA2_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA3_PORT, BSP_IS62WV51216_DATA3_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA4_PORT, BSP_IS62WV51216_DATA4_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA5_PORT, BSP_IS62WV51216_DATA5_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA6_PORT, BSP_IS62WV51216_DATA6_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA7_PORT, BSP_IS62WV51216_DATA7_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA8_PORT, BSP_IS62WV51216_DATA8_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA9_PORT, BSP_IS62WV51216_DATA9_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA10_PORT, BSP_IS62WV51216_DATA10_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA11_PORT, BSP_IS62WV51216_DATA11_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA12_PORT, BSP_IS62WV51216_DATA12_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA13_PORT, BSP_IS62WV51216_DATA13_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA14_PORT, BSP_IS62WV51216_DATA14_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_DATA15_PORT, BSP_IS62WV51216_DATA15_PIN, &stcGpioInit); - - /* SMC_ADD[0:18]*/ - (void)GPIO_Init(BSP_IS62WV51216_ADD0_PORT, BSP_IS62WV51216_ADD0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD1_PORT, BSP_IS62WV51216_ADD1_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD2_PORT, BSP_IS62WV51216_ADD2_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD3_PORT, BSP_IS62WV51216_ADD3_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD4_PORT, BSP_IS62WV51216_ADD4_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD5_PORT, BSP_IS62WV51216_ADD5_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD6_PORT, BSP_IS62WV51216_ADD6_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD7_PORT, BSP_IS62WV51216_ADD7_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD8_PORT, BSP_IS62WV51216_ADD8_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD9_PORT, BSP_IS62WV51216_ADD9_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD10_PORT, BSP_IS62WV51216_ADD10_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD11_PORT, BSP_IS62WV51216_ADD11_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD12_PORT, BSP_IS62WV51216_ADD12_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD13_PORT, BSP_IS62WV51216_ADD13_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD14_PORT, BSP_IS62WV51216_ADD14_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD15_PORT, BSP_IS62WV51216_ADD15_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD16_PORT, BSP_IS62WV51216_ADD16_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD17_PORT, BSP_IS62WV51216_ADD17_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_IS62WV51216_ADD18_PORT, BSP_IS62WV51216_ADD18_PIN, &stcGpioInit); - - /************************** Set EXMC pin function *************************/ - /* SMC_CS */ - GPIO_SetFunc(BSP_IS62WV51216_CS_PORT, BSP_IS62WV51216_CS_PIN, GPIO_FUNC_12); - - /* SMC_WE */ - GPIO_SetFunc(BSP_IS62WV51216_WE_PORT, BSP_IS62WV51216_WE_PIN, GPIO_FUNC_12); - - /* SMC_BLS[0:1] */ - GPIO_SetFunc(BSP_IS62WV51216_BLS0_PORT, BSP_IS62WV51216_BLS0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_BLS1_PORT, BSP_IS62WV51216_BLS1_PIN, GPIO_FUNC_12); - - /* SMC_OE */ - GPIO_SetFunc(BSP_IS62WV51216_OE_PORT, BSP_IS62WV51216_OE_PIN, GPIO_FUNC_12); - - /* SMC_DATA[0:15] */ - GPIO_SetFunc(BSP_IS62WV51216_DATA0_PORT, BSP_IS62WV51216_DATA0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA1_PORT, BSP_IS62WV51216_DATA1_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA2_PORT, BSP_IS62WV51216_DATA2_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA3_PORT, BSP_IS62WV51216_DATA3_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA4_PORT, BSP_IS62WV51216_DATA4_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA5_PORT, BSP_IS62WV51216_DATA5_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA6_PORT, BSP_IS62WV51216_DATA6_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA7_PORT, BSP_IS62WV51216_DATA7_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA8_PORT, BSP_IS62WV51216_DATA8_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA9_PORT, BSP_IS62WV51216_DATA9_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA10_PORT, BSP_IS62WV51216_DATA10_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA11_PORT, BSP_IS62WV51216_DATA11_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA12_PORT, BSP_IS62WV51216_DATA12_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA13_PORT, BSP_IS62WV51216_DATA13_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA14_PORT, BSP_IS62WV51216_DATA14_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_DATA15_PORT, BSP_IS62WV51216_DATA15_PIN, GPIO_FUNC_12); - - /* SMC_ADD[0:18]*/ - GPIO_SetFunc(BSP_IS62WV51216_ADD0_PORT, BSP_IS62WV51216_ADD0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD1_PORT, BSP_IS62WV51216_ADD1_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD2_PORT, BSP_IS62WV51216_ADD2_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD3_PORT, BSP_IS62WV51216_ADD3_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD4_PORT, BSP_IS62WV51216_ADD4_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD5_PORT, BSP_IS62WV51216_ADD5_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD6_PORT, BSP_IS62WV51216_ADD6_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD7_PORT, BSP_IS62WV51216_ADD7_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD8_PORT, BSP_IS62WV51216_ADD8_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD9_PORT, BSP_IS62WV51216_ADD9_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD10_PORT, BSP_IS62WV51216_ADD10_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD11_PORT, BSP_IS62WV51216_ADD11_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD12_PORT, BSP_IS62WV51216_ADD12_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD13_PORT, BSP_IS62WV51216_ADD13_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD14_PORT, BSP_IS62WV51216_ADD14_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD15_PORT, BSP_IS62WV51216_ADD15_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD16_PORT, BSP_IS62WV51216_ADD16_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD17_PORT, BSP_IS62WV51216_ADD17_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_IS62WV51216_ADD18_PORT, BSP_IS62WV51216_ADD18_PIN, GPIO_FUNC_12); -} - -/** - * @} - */ - -#endif /* BSP_IS62WV51216_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is62wv51216.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is62wv51216.h deleted file mode 100644 index 8dcc9b7e48d..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_is62wv51216.h +++ /dev/null @@ -1,239 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_is62wv51216.h - * @brief This file contains all the functions prototypes for is62wv51216 of the - * board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_IS62WV51216_H__ -#define __EV_HC32F4A0_LQFP176_IS62WV51216_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_gpio.h" -#include "hc32_ll_smc.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_IS62WV51216 - * @{ - */ -#if ((BSP_IS62WV51216_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_IS62WV51216_Global_Macros EV_HC32F4A0_LQFP176 IS62WV51216 Global Macros - * @{ - */ - -/** - * @defgroup IS62WV51216_Map_SMC_Chip IS62WV51216 Map SMC Chip - * @{ - */ -#define BSP_IS62WV51216_CHIP (EXMC_SMC_CHIP2) -/** - * @} - */ - -/** - * @defgroup IS62WV51216_SMC_Address_Space IS62WV51216 SMC Address Space - * @{ - */ -#define BSP_IS62WV51216_MATCH_ADDR (0x70UL) -#define BSP_IS62WV51216_MASK_ADDR (EXMC_SMC_ADDR_MASK_16MB) -/** - * @} - */ - -/** - * @defgroup IS62WV51216_Memory_Size IS62WV51216 Memory Size - * @{ - */ -#define BSP_IS62WV51216_SIZE (1UL * 1024UL * 1024UL) /* 1MBytes*/ -/** - * @} - */ - -/** - * @defgroup IS62WV51216_SRAM_Address_Space IS62WV51216 SRAM Address Space - * @note SRAM address:[0x60000000, 0x600FFFFF] & SRAM size: 1M bytes - * @{ - */ -#define BSP_IS62WV51216_START_ADDR (EXMC_SMC_GetChipStartAddr(BSP_IS62WV51216_CHIP)) -#define BSP_IS62WV51216_END_ADDR (BSP_IS62WV51216_START_ADDR + BSP_IS62WV51216_SIZE - 1UL) -/** - * @} - */ - -/** - * @defgroup SMC_Interface_Pin EXMC_SMC Interface Pin - * @{ - */ -#define BSP_IS62WV51216_CS_PORT (GPIO_PORT_G) /* PG10 - EXMC_CE2 */ -#define BSP_IS62WV51216_CS_PIN (GPIO_PIN_10) - -#define BSP_IS62WV51216_WE_PORT (GPIO_PORT_C) /* PC00 - EXMC_WE */ -#define BSP_IS62WV51216_WE_PIN (GPIO_PIN_00) - -#define BSP_IS62WV51216_BLS0_PORT (GPIO_PORT_E) /* PE00 - EXMC_CE4 */ -#define BSP_IS62WV51216_BLS0_PIN (GPIO_PIN_00) -#define BSP_IS62WV51216_BLS1_PORT (GPIO_PORT_E) /* PE01 - EXMC_CE5 */ -#define BSP_IS62WV51216_BLS1_PIN (GPIO_PIN_01) - -#define BSP_IS62WV51216_OE_PORT (GPIO_PORT_F) /* PF11 - EXMC_OE */ -#define BSP_IS62WV51216_OE_PIN (GPIO_PIN_11) - -#define BSP_IS62WV51216_ADD0_PORT (GPIO_PORT_F) /* PF00 - EXMC_ADD0 */ -#define BSP_IS62WV51216_ADD0_PIN (GPIO_PIN_00) -#define BSP_IS62WV51216_ADD1_PORT (GPIO_PORT_F) /* PF01 - EXMC_ADD1 */ -#define BSP_IS62WV51216_ADD1_PIN (GPIO_PIN_01) -#define BSP_IS62WV51216_ADD2_PORT (GPIO_PORT_F) /* PF02 - EXMC_ADD2 */ -#define BSP_IS62WV51216_ADD2_PIN (GPIO_PIN_02) -#define BSP_IS62WV51216_ADD3_PORT (GPIO_PORT_F) /* PF03 - EXMC_ADD3 */ -#define BSP_IS62WV51216_ADD3_PIN (GPIO_PIN_03) -#define BSP_IS62WV51216_ADD4_PORT (GPIO_PORT_F) /* PF04 - EXMC_ADD4 */ -#define BSP_IS62WV51216_ADD4_PIN (GPIO_PIN_04) -#define BSP_IS62WV51216_ADD5_PORT (GPIO_PORT_F) /* PF05 - EXMC_ADD5 */ -#define BSP_IS62WV51216_ADD5_PIN (GPIO_PIN_05) -#define BSP_IS62WV51216_ADD6_PORT (GPIO_PORT_F) /* PF12 - EXMC_ADD6 */ -#define BSP_IS62WV51216_ADD6_PIN (GPIO_PIN_12) -#define BSP_IS62WV51216_ADD7_PORT (GPIO_PORT_F) /* PF13 - EXMC_ADD7 */ -#define BSP_IS62WV51216_ADD7_PIN (GPIO_PIN_13) -#define BSP_IS62WV51216_ADD8_PORT (GPIO_PORT_F) /* PF14 - EXMC_ADD8 */ -#define BSP_IS62WV51216_ADD8_PIN (GPIO_PIN_14) -#define BSP_IS62WV51216_ADD9_PORT (GPIO_PORT_F) /* PF15 - EXMC_ADD9 */ -#define BSP_IS62WV51216_ADD9_PIN (GPIO_PIN_15) -#define BSP_IS62WV51216_ADD10_PORT (GPIO_PORT_G) /* PG00 - EXMC_ADD10 */ -#define BSP_IS62WV51216_ADD10_PIN (GPIO_PIN_00) -#define BSP_IS62WV51216_ADD11_PORT (GPIO_PORT_G) /* PG01 - EXMC_ADD11 */ -#define BSP_IS62WV51216_ADD11_PIN (GPIO_PIN_01) -#define BSP_IS62WV51216_ADD12_PORT (GPIO_PORT_G) /* PG02 - EXMC_ADD12 */ -#define BSP_IS62WV51216_ADD12_PIN (GPIO_PIN_02) -#define BSP_IS62WV51216_ADD13_PORT (GPIO_PORT_G) /* PG03 - EXMC_ADD13 */ -#define BSP_IS62WV51216_ADD13_PIN (GPIO_PIN_03) -#define BSP_IS62WV51216_ADD14_PORT (GPIO_PORT_G) /* PG04 - EXMC_ADD14 */ -#define BSP_IS62WV51216_ADD14_PIN (GPIO_PIN_04) -#define BSP_IS62WV51216_ADD15_PORT (GPIO_PORT_G) /* PG05 - EXMC_ADD15 */ -#define BSP_IS62WV51216_ADD15_PIN (GPIO_PIN_05) -#define BSP_IS62WV51216_ADD16_PORT (GPIO_PORT_D) /* PD11 - EXMC_ADD16 */ -#define BSP_IS62WV51216_ADD16_PIN (GPIO_PIN_11) -#define BSP_IS62WV51216_ADD17_PORT (GPIO_PORT_D) /* PD12 - EXMC_ADD17 */ -#define BSP_IS62WV51216_ADD17_PIN (GPIO_PIN_12) -#define BSP_IS62WV51216_ADD18_PORT (GPIO_PORT_D) /* PD13 - EXMC_ADD18 */ -#define BSP_IS62WV51216_ADD18_PIN (GPIO_PIN_13) - -#define BSP_IS62WV51216_DATA0_PORT (GPIO_PORT_D) /* PD14 - EXMC_DATA0 */ -#define BSP_IS62WV51216_DATA0_PIN (GPIO_PIN_14) -#define BSP_IS62WV51216_DATA1_PORT (GPIO_PORT_D) /* PD15 - EXMC_DATA1 */ -#define BSP_IS62WV51216_DATA1_PIN (GPIO_PIN_15) -#define BSP_IS62WV51216_DATA2_PORT (GPIO_PORT_D) /* PD00 - EXMC_DATA2 */ -#define BSP_IS62WV51216_DATA2_PIN (GPIO_PIN_00) -#define BSP_IS62WV51216_DATA3_PORT (GPIO_PORT_D) /* PD01 - EXMC_DATA3 */ -#define BSP_IS62WV51216_DATA3_PIN (GPIO_PIN_01) -#define BSP_IS62WV51216_DATA4_PORT (GPIO_PORT_E) /* PE07 - EXMC_DATA4 */ -#define BSP_IS62WV51216_DATA4_PIN (GPIO_PIN_07) -#define BSP_IS62WV51216_DATA5_PORT (GPIO_PORT_E) /* PE08 - EXMC_DATA5 */ -#define BSP_IS62WV51216_DATA5_PIN (GPIO_PIN_08) -#define BSP_IS62WV51216_DATA6_PORT (GPIO_PORT_E) /* PE09 - EXMC_DATA6 */ -#define BSP_IS62WV51216_DATA6_PIN (GPIO_PIN_09) -#define BSP_IS62WV51216_DATA7_PORT (GPIO_PORT_E) /* PE10 - EXMC_DATA7 */ -#define BSP_IS62WV51216_DATA7_PIN (GPIO_PIN_10) -#define BSP_IS62WV51216_DATA8_PORT (GPIO_PORT_E) /* PE11 - EXMC_DATA8 */ -#define BSP_IS62WV51216_DATA8_PIN (GPIO_PIN_11) -#define BSP_IS62WV51216_DATA9_PORT (GPIO_PORT_E) /* PE12 - EXMC_DATA9 */ -#define BSP_IS62WV51216_DATA9_PIN (GPIO_PIN_12) -#define BSP_IS62WV51216_DATA10_PORT (GPIO_PORT_E) /* PE13 - EXMC_DATA10 */ -#define BSP_IS62WV51216_DATA10_PIN (GPIO_PIN_13) -#define BSP_IS62WV51216_DATA11_PORT (GPIO_PORT_E) /* PE14 - EXMC_DATA11 */ -#define BSP_IS62WV51216_DATA11_PIN (GPIO_PIN_14) -#define BSP_IS62WV51216_DATA12_PORT (GPIO_PORT_E) /* PE15 - EXMC_DATA12 */ -#define BSP_IS62WV51216_DATA12_PIN (GPIO_PIN_15) -#define BSP_IS62WV51216_DATA13_PORT (GPIO_PORT_D) /* PD08 - EXMC_DATA13 */ -#define BSP_IS62WV51216_DATA13_PIN (GPIO_PIN_08) -#define BSP_IS62WV51216_DATA14_PORT (GPIO_PORT_D) /* PD09 - EXMC_DATA14 */ -#define BSP_IS62WV51216_DATA14_PIN (GPIO_PIN_09) -#define BSP_IS62WV51216_DATA15_PORT (GPIO_PORT_D) /* PD10 - EXMC_DATA15 */ -#define BSP_IS62WV51216_DATA15_PIN (GPIO_PIN_10) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_IS62WV51216_Global_Functions - * @{ - */ -int32_t BSP_IS62WV51216_Init(void); -void BSP_IS62WV51216_GetMemInfo(uint32_t *pu32MemoryStartAddr, uint32_t *pu32MemoryByteSize); -/** - * @} - */ - -#endif /* BSP_IS62WV51216_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_IS62WV51216_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_mt29f2g08ab.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_mt29f2g08ab.c deleted file mode 100644 index 212d77574bb..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_mt29f2g08ab.c +++ /dev/null @@ -1,571 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_mt29f2g08ab.c - * @brief This file provides configure functions for mt29f2g08ab of the board - * EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2022-10-31 CDT Optimize timing parameters - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_fcg.h" -#include "ev_hc32f4a0_lqfp176_mt29f2g08ab.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_MT29F2G08AB EV_HC32F4A0_LQFP176 MT29F2G08AB - * @{ - */ - -#if ((BSP_MT29F2G08AB_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_MT29F2G08AB_Local_Macros EV_HC32F4A0_LQFP176 MT29F2G08AB Local Macros - * @{ - */ - -/** - * @defgroup EV_EXMC_NFC_Operation_Timeout EXMC_NFC Operation Timeout - * @{ - */ -#define BSP_NFC_ERASE_TIMEOUT (2000000UL) -#define BSP_NFC_READ_TIMEOUT (2000000UL) -#define BSP_NFC_READ_HWECC_TIMEOUT (9000000UL) -#define BSP_NFC_WRITE_TIMEOUT (2000000UL) -#define BSP_NFC_WRITE_HWECC_TIMEOUT (2000000UL) -#define BSP_NFC_RESET_TIMEOUT (2000000UL) -/** - * @} - */ - -/** - * @defgroup MT29F2G08AB_Map_NFC_Bank MT29F2G08AB Map NFC Bank - * @{ - */ -#define BSP_MT29F2G08AB_BYTES_PER_PAGE (EXMC_NFC_PAGE_SIZE_2KBYTE) -#define BSP_MT29F2G08AB_CAPACITY_BITS (EXMC_NFC_BANK_CAPACITY_2GBIT) -/** - * @} - */ - -/** - * @defgroup MT29F2G08AB_Status_Register_Field MT29F2G08AB Status Register Field - * @{ - */ -/* MT29F2G08AB Status Register: bit0-FAIL */ -#define BSP_MT29F2G08AB_SR_FAIL (1UL << 0) - -/* MT29F2G08AB Status Register: bit6-RDY */ -#define BSP_MT29F2G08AB_SR_READY (1UL << 6) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_MT29F2G08AB_Local_Functions EV_HC32F4A0_LQFP176 MT29F2G08AB Local Functions - * @{ - */ - -/** - * @brief Initialize NFC port. - * @param None - * @retval None - */ -static void BSP_NFC_PortInit(void) -{ - stc_gpio_init_t stcGpioInit; - - /************************* Set pin drive capacity *************************/ - (void)GPIO_StructInit(&stcGpioInit); - stcGpioInit.u16PinDrv = PIN_HIGH_DRV; - - /* NFC_CE */ - (void)GPIO_Init(BSP_MT29F2G08AB_CE_PORT, BSP_MT29F2G08AB_CE_PIN, &stcGpioInit); - - /* NFC_RE */ - (void)GPIO_Init(BSP_MT29F2G08AB_RE_PORT, BSP_MT29F2G08AB_RE_PIN, &stcGpioInit); - - /* NFC_WE */ - (void)GPIO_Init(BSP_MT29F2G08AB_WE_PORT, BSP_MT29F2G08AB_WE_PIN, &stcGpioInit); - - /* NFC_CLE */ - (void)GPIO_Init(BSP_MT29F2G08AB_CLE_PORT, BSP_MT29F2G08AB_CLE_PIN, &stcGpioInit); - - /* NFC_ALE */ - (void)GPIO_Init(BSP_MT29F2G08AB_ALE_PORT, BSP_MT29F2G08AB_ALE_PIN, &stcGpioInit); - - /* NFC_WP */ - (void)GPIO_Init(BSP_MT29F2G08AB_WP_PORT, BSP_MT29F2G08AB_WP_PIN, &stcGpioInit); - GPIO_SetPins(BSP_MT29F2G08AB_WP_PORT, BSP_MT29F2G08AB_WP_PIN); - - /* NFC_DATA[0:7] */ - (void)GPIO_Init(BSP_MT29F2G08AB_DATA0_PORT, BSP_MT29F2G08AB_DATA0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_MT29F2G08AB_DATA1_PORT, BSP_MT29F2G08AB_DATA1_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_MT29F2G08AB_DATA2_PORT, BSP_MT29F2G08AB_DATA2_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_MT29F2G08AB_DATA3_PORT, BSP_MT29F2G08AB_DATA3_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_MT29F2G08AB_DATA4_PORT, BSP_MT29F2G08AB_DATA4_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_MT29F2G08AB_DATA5_PORT, BSP_MT29F2G08AB_DATA5_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_MT29F2G08AB_DATA6_PORT, BSP_MT29F2G08AB_DATA6_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_MT29F2G08AB_DATA7_PORT, BSP_MT29F2G08AB_DATA7_PIN, &stcGpioInit); - - /* NFC_RB */ - (void)GPIO_Init(BSP_MT29F2G08AB_RB_PORT, BSP_MT29F2G08AB_RB_PIN, &stcGpioInit); - - /************************** Set EXMC pin function *************************/ - /* NFC_CE */ - GPIO_SetFunc(BSP_MT29F2G08AB_CE_PORT, BSP_MT29F2G08AB_CE_PIN, GPIO_FUNC_12); - - /* NFC_RE */ - GPIO_SetFunc(BSP_MT29F2G08AB_RE_PORT, BSP_MT29F2G08AB_RE_PIN, GPIO_FUNC_12); - - /* NFC_WE */ - GPIO_SetFunc(BSP_MT29F2G08AB_WE_PORT, BSP_MT29F2G08AB_WE_PIN, GPIO_FUNC_12); - - /* NFC_CLE */ - GPIO_SetFunc(BSP_MT29F2G08AB_CLE_PORT, BSP_MT29F2G08AB_CLE_PIN, GPIO_FUNC_12); - - /* NFC_ALE */ - GPIO_SetFunc(BSP_MT29F2G08AB_ALE_PORT, BSP_MT29F2G08AB_ALE_PIN, GPIO_FUNC_12); - - /* NFC_WP */ - GPIO_SetFunc(BSP_MT29F2G08AB_WP_PORT, BSP_MT29F2G08AB_WP_PIN, GPIO_FUNC_12); - - /* NFC_RB */ - GPIO_SetFunc(BSP_MT29F2G08AB_RB_PORT, BSP_MT29F2G08AB_RB_PIN, GPIO_FUNC_12); - - /* NFC_DATA[0:7] */ - GPIO_SetFunc(BSP_MT29F2G08AB_DATA0_PORT, BSP_MT29F2G08AB_DATA0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_MT29F2G08AB_DATA1_PORT, BSP_MT29F2G08AB_DATA1_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_MT29F2G08AB_DATA2_PORT, BSP_MT29F2G08AB_DATA2_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_MT29F2G08AB_DATA3_PORT, BSP_MT29F2G08AB_DATA3_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_MT29F2G08AB_DATA4_PORT, BSP_MT29F2G08AB_DATA4_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_MT29F2G08AB_DATA5_PORT, BSP_MT29F2G08AB_DATA5_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_MT29F2G08AB_DATA6_PORT, BSP_MT29F2G08AB_DATA6_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_MT29F2G08AB_DATA7_PORT, BSP_MT29F2G08AB_DATA7_PIN, GPIO_FUNC_12); -} - -/** - * @brief Get status. - * @param [in] u32Bank The specified bank - * This parameter can be one of the macros group @ref EXMC_NFC_Bank - * @arg EXMC_NFC_BANK0: NFC device bank 0 - * @arg EXMC_NFC_BANK1: NFC device bank 1 - * @arg EXMC_NFC_BANK2: NFC device bank 2 - * @arg EXMC_NFC_BANK3: NFC device bank 3 - * @arg EXMC_NFC_BANK4: NFC device bank 4 - * @arg EXMC_NFC_BANK5: NFC device bank 5 - * @arg EXMC_NFC_BANK6: NFC device bank 6 - * @arg EXMC_NFC_BANK7: NFC device bank 7 - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - LL_OK: No errors occurred. - * - LL_ERR: Status error. - * - LL_ERR_TIMEOUT: Get timeout. - */ -static int32_t MT29F2G08AB_GetStatus(uint32_t u32Bank, uint32_t u32Timeout) -{ - uint32_t u32To = 0UL; - uint32_t u32Status = 0UL; - int32_t i32Ret = LL_OK; - - do { - /* Block checking flag if timeout value is EXMC_NFC_MAX_TIMEOUT */ - if ((u32To++ > u32Timeout) && (u32Timeout < EXMC_NFC_MAX_TIMEOUT)) { - i32Ret = LL_ERR_TIMEOUT; - break; - } - - u32Status = EXMC_NFC_ReadStatus(u32Bank); - } while (0UL == (u32Status & BSP_MT29F2G08AB_SR_READY)); - - if (LL_ERR_TIMEOUT != i32Ret) { - if (0UL != (u32Status & BSP_MT29F2G08AB_SR_FAIL)) { - i32Ret = LL_ERR; - } - } - - return i32Ret; -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_MT29F2G08AB_Global_Functions EV_HC32F4A0_LQFP176 MT29F2G08AB Global Functions - * @{ - */ - -/** - * @brief Initialize Flash. - * @param None - * @retval int32_t: - * - LL_OK: Initialize successfully. - * - LL_ERR: Initialize unsuccessfully. - */ -int32_t BSP_MT29F2G08AB_Init(void) -{ - int32_t i32Ret = LL_ERR; - stc_exmc_nfc_init_t stcNfcInit; - - /* Initialize NFC port.*/ - BSP_NFC_PortInit(); - - /* Enable NFC module clk */ - FCG_Fcg3PeriphClockCmd(FCG3_PERIPH_NFC, ENABLE); - - /* Enable NFC. */ - EXMC_NFC_Cmd(ENABLE); - - /* Configure NFC width && refresh period & chip & timing. */ - stcNfcInit.u32OpenPage = EXMC_NFC_OPEN_PAGE_DISABLE; - stcNfcInit.stcBaseConfig.u32CapacitySize = EXMC_NFC_BANK_CAPACITY_2GBIT; - stcNfcInit.stcBaseConfig.u32MemoryWidth = EXMC_NFC_MEMORY_WIDTH_8BIT; - stcNfcInit.stcBaseConfig.u32BankNum = EXMC_NFC_1BANK; - stcNfcInit.stcBaseConfig.u32PageSize = EXMC_NFC_PAGE_SIZE_2KBYTE; - stcNfcInit.stcBaseConfig.u32WriteProtect = EXMC_NFC_WR_PROTECT_DISABLE; - stcNfcInit.stcBaseConfig.u32EccMode = EXMC_NFC_1BIT_ECC; - stcNfcInit.stcBaseConfig.u32RowAddrCycle = EXMC_NFC_3_ROW_ADDR_CYCLE; - stcNfcInit.stcBaseConfig.u8SpareSizeForUserData = 0U; - - /* EXCLK frequency @60MHz: 3.3V */ - stcNfcInit.stcTimingReg0.u32TS = 1UL; /* ALE/CLE/CE setup time: min=10ns */ - stcNfcInit.stcTimingReg0.u32TWP = 1UL; /* WE# pulse width: min=10ns */ - stcNfcInit.stcTimingReg0.u32TRP = 2UL; /* RE# pulse width: min=10ns - and EXMC t_data_s: min=24ns */ - stcNfcInit.stcTimingReg0.u32TH = 1UL; /* ALE/CLE/CE hold time min=5ns */ - - stcNfcInit.stcTimingReg1.u32TWH = 1UL; /* WE# pulse width HIGH: min=10ns */ - stcNfcInit.stcTimingReg1.u32TRH = 1UL; /* RE# pulse width HIGH: min=7ns */ - stcNfcInit.stcTimingReg1.u32TRR = 2UL; /* Ready to RE# LOW: min=20ns */ - stcNfcInit.stcTimingReg1.u32TWB = 1UL; /* WE# HIGH to busy: max=100ns */ - - stcNfcInit.stcTimingReg2.u32TCCS = 5UL; - stcNfcInit.stcTimingReg2.u32TWTR = 4UL; /* WE# HIGH to RE# LOW: min=60ns */ - stcNfcInit.stcTimingReg2.u32TRTW = 7UL; /* RE# HIGH to WE# LOW: min=100ns */ - stcNfcInit.stcTimingReg2.u32TADL = 5UL; /* ALE to data start: min=70ns */ - if (LL_OK == EXMC_NFC_Init(&stcNfcInit)) { - /* Reset NFC device. */ - if (LL_OK == EXMC_NFC_Reset(BSP_MT29F2G08AB_BANK, BSP_NFC_RESET_TIMEOUT)) { - i32Ret = LL_OK; - } - } - - return i32Ret; -} - -/** - * @brief Read ID. - * @param [in] u32IdAddr The ID address - * @param [in] au8DevId The ID buffer - * @param [in] u32NumBytes The number of bytes to read - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - LL_OK: No errors occurred. - * - LL_ERR_TIMEOUT: Read timeout. - * - LL_ERR_INVD_PARAM: The pointer au8DevId value is NULL or u8NumBytes value is 0. - */ -int32_t BSP_MT29F2G08AB_ReadId(uint32_t u32IdAddr, uint8_t au8DevId[], uint32_t u32NumBytes, uint32_t u32Timeout) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != au8DevId) && (u32NumBytes > 0UL)) { - i32Ret = EXMC_NFC_ReadId(BSP_MT29F2G08AB_BANK, u32IdAddr, au8DevId, u32NumBytes, u32Timeout); - } - - return i32Ret; -} - -/** - * @brief Erase block. - * @param [in] u32BlockRowAddr The specified block row address - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - LL_OK: No errors occurred. - * - LL_ERR: Nand flash status is abnormal. - * - LL_ERR_TIMEOUT: Erase timeout. - */ -int32_t BSP_MT29F2G08AB_EraseBlock(uint32_t u32BlockRowAddr, uint32_t u32Timeout) -{ - int32_t i32Ret; - - i32Ret = EXMC_NFC_EraseBlock(BSP_MT29F2G08AB_BANK, u32BlockRowAddr, u32Timeout); - if (LL_OK == i32Ret) { - i32Ret = MT29F2G08AB_GetStatus(BSP_MT29F2G08AB_BANK, u32Timeout); - } - - return i32Ret; -} - -/** - * @brief Read page. - * @param [in] u32Page The specified page - * @param [out] pu8Data The buffer for reading - * @param [in] u32NumBytes The buffer size for bytes - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - LL_OK: No errors occurred. - * - LL_ERR: Nand flash status is abnormal. - * - LL_ERR_TIMEOUT: Read timeout. - * - LL_ERR_INVD_PARAM: If one of following cases matches: - * - u32Page value is out of range. - * - The pointer pu8Data value is NULL. - * - u32NumBytes value is out of range. - */ -int32_t BSP_MT29F2G08AB_ReadPage(uint32_t u32Page, uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != pu8Data) && \ - (u32Page < BSP_MT29F2G08AB_DEVICE_PAGES) && \ - ((u32NumBytes > 0UL) && (u32NumBytes <= BSP_MT29F2G08AB_PAGE_SIZE_WITH_SPARE))) { - i32Ret = EXMC_NFC_ReadPageMeta(BSP_MT29F2G08AB_BANK, u32Page, pu8Data, u32NumBytes, u32Timeout); - if (LL_OK == i32Ret) { - i32Ret = MT29F2G08AB_GetStatus(BSP_MT29F2G08AB_BANK, u32Timeout); - } - } - - return i32Ret; -} - -/** - * @brief Write page. - * @param [in] u32Page The specified page - * @param [in] pu8Data The buffer for writing - * @param [in] u32NumBytes The buffer size for bytes - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - LL_OK: No errors occurred. - * - LL_ERR: Nand flash status is abnormal. - * - LL_ERR_TIMEOUT: Read timeout. - * - LL_ERR_INVD_PARAM: If one of following cases matches: - * - u32Page value is out of range. - * - The pointer pu8Data value is NULL. - * - u32NumBytes value is out of range. - */ -int32_t BSP_MT29F2G08AB_WritePage(uint32_t u32Page, const uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != pu8Data) && \ - (u32Page < BSP_MT29F2G08AB_DEVICE_PAGES) && \ - ((u32NumBytes > 0UL) && (u32NumBytes <= BSP_MT29F2G08AB_PAGE_SIZE_WITH_SPARE))) { - i32Ret = EXMC_NFC_WritePageMeta(BSP_MT29F2G08AB_BANK, u32Page, pu8Data, u32NumBytes, u32Timeout); - if (LL_OK == i32Ret) { - i32Ret = MT29F2G08AB_GetStatus(BSP_MT29F2G08AB_BANK, u32Timeout); - } - } - - return i32Ret; -} - -/** - * @brief Read page with hardware ECC 1Bit. - * @param [in] u32Page The specified page - * @param [out] pu8Data The buffer for reading - * @param [in] u32NumBytes The buffer size for bytes - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - LL_OK: No errors occurred. - * - LL_ERR: Nand flash status is abnormal. - * - LL_ERR_TIMEOUT: Read timeout. - * - LL_ERR_INVD_PARAM: If one of following cases matches: - * - u32Page value is out of range. - * - The pointer pu8Data value is NULL. - * - u32NumBytes value is out of range. - */ -int32_t BSP_MT29F2G08AB_1BitEccReadPage(uint32_t u32Page, uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != pu8Data) && \ - (u32Page < BSP_MT29F2G08AB_DEVICE_PAGES) && \ - ((u32NumBytes > 0UL) && (u32NumBytes <= BSP_MT29F2G08AB_PAGE_SIZE_WITH_SPARE))) { - EXMC_NFC_SetEccMode(EXMC_NFC_1BIT_ECC); - i32Ret = EXMC_NFC_ReadPageHwEcc(BSP_MT29F2G08AB_BANK, u32Page, pu8Data, u32NumBytes, u32Timeout); - if (LL_OK == i32Ret) { - i32Ret = MT29F2G08AB_GetStatus(BSP_MT29F2G08AB_BANK, u32Timeout); - } - } - - return i32Ret; -} - -/** - * @brief Write page with hardware ECC 1Bit. - * @param [in] u32Page The specified page - * @param [in] pu8Data The buffer for writing - * @param [in] u32NumBytes The buffer size for bytes - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - LL_OK: No errors occurred. - * - LL_ERR: Nand flash status is abnormal. - * - LL_ERR_TIMEOUT: Read timeout. - * - LL_ERR_INVD_PARAM: If one of following cases matches: - * - u32Page value is out of range. - * - The pointer pu8Data value is NULL. - * - u32NumBytes value is out of range. - */ -int32_t BSP_MT29F2G08AB_1BitEccWritePage(uint32_t u32Page, const uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != pu8Data) && \ - (u32Page < BSP_MT29F2G08AB_DEVICE_PAGES) && \ - ((u32NumBytes > 0UL) && (u32NumBytes <= BSP_MT29F2G08AB_PAGE_SIZE_WITH_SPARE))) { - EXMC_NFC_SetEccMode(EXMC_NFC_1BIT_ECC); - i32Ret = EXMC_NFC_WritePageHwEcc(BSP_MT29F2G08AB_BANK, u32Page, pu8Data, u32NumBytes, u32Timeout); - if (LL_OK == i32Ret) { - i32Ret = MT29F2G08AB_GetStatus(BSP_MT29F2G08AB_BANK, u32Timeout); - } - } - - return i32Ret; -} - -/** - * @brief Read page with hardware ECC 4Bit. - * @param [in] u32Page The specified page - * @param [out] pu8Data The buffer for reading - * @param [in] u32NumBytes The buffer size for bytes - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - ECC status ECC status if return value non-negative numbers. - * - LL_ERR: Nand flash status is abnormal. - * - LL_ERR_TIMEOUT: Read timeout. - * - LL_ERR_INVD_PARAM: If one of following cases matches: - * - u32Page value is out of range. - * - The pointer pu8Data value is NULL. - * - u32NumBytes value is out of range. - */ -int32_t BSP_MT29F2G08AB_4BitEccReadPage(uint32_t u32Page, uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout) -{ - uint16_t u16EccStatus; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != pu8Data) && \ - (u32Page < BSP_MT29F2G08AB_DEVICE_PAGES) && \ - ((u32NumBytes > 0UL) && (u32NumBytes <= BSP_MT29F2G08AB_PAGE_SIZE_WITH_SPARE))) { - EXMC_NFC_SetEccMode(EXMC_NFC_4BIT_ECC); - i32Ret = EXMC_NFC_ReadPageHwEcc(BSP_MT29F2G08AB_BANK, u32Page, pu8Data, u32NumBytes, u32Timeout); - if (LL_OK == i32Ret) { - u16EccStatus = EXMC_NFC_Get4BitEccErrSection(); - i32Ret = MT29F2G08AB_GetStatus(BSP_MT29F2G08AB_BANK, u32Timeout); - if (LL_OK == i32Ret) { - i32Ret = (int32_t)u16EccStatus; - } - } - } - - return i32Ret; -} - -/** - * @brief Write page with hardware ECC 4Bit. - * @param [in] u32Page The specified page - * @param [in] pu8Data The buffer for writing - * @param [in] u32NumBytes The buffer size for bytes - * @param [in] u32Timeout The operation timeout value - * @retval int32_t: - * - LL_OK: No errors occurred. - * - LL_ERR: Nand flash status is abnormal. - * - LL_ERR_TIMEOUT: Read timeout. - * - LL_ERR_INVD_PARAM: If one of following cases matches: - * - u32Page value is out of range. - * - The pointer pu8Data value is NULL. - * - u32NumBytes value is out of range. - */ -int32_t BSP_MT29F2G08AB_4BitEccWritePage(uint32_t u32Page, const uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout) -{ - int32_t i32Ret = LL_ERR_INVD_PARAM; - - if ((NULL != pu8Data) && \ - (u32Page < BSP_MT29F2G08AB_DEVICE_PAGES) && \ - ((u32NumBytes > 0UL) && (u32NumBytes <= BSP_MT29F2G08AB_PAGE_SIZE_WITH_SPARE))) { - EXMC_NFC_SetEccMode(EXMC_NFC_4BIT_ECC); - i32Ret = EXMC_NFC_WritePageHwEcc(BSP_MT29F2G08AB_BANK, u32Page, pu8Data, u32NumBytes, u32Timeout); - if (LL_OK == i32Ret) { - i32Ret = MT29F2G08AB_GetStatus(BSP_MT29F2G08AB_BANK, u32Timeout); - } - } - - return i32Ret; -} - -/** - * @} - */ - -#endif /* BSP_MT29F2G08AB_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_mt29f2g08ab.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_mt29f2g08ab.h deleted file mode 100644 index 72d710fca11..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_mt29f2g08ab.h +++ /dev/null @@ -1,205 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_mt29f2g08ab.h - * @brief This file contains all the functions prototypes for mt29f2g08ab of the - * board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_MT29F2G08AB_H__ -#define __EV_HC32F4A0_LQFP176_MT29F2G08AB_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "hc32_ll_gpio.h" -#include "hc32_ll_nfc.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_MT29F2G08AB - * @{ - */ - -#if ((BSP_MT29F2G08AB_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_MT29F2G08AB_Global_Macros EV_HC32F4A0_LQFP176 MT29F2G08AB Global Macros - * @{ - */ - -/** - * @defgroup MT29F2G08AB_Map_NFC_Chip MT29F2G08AB Map NFC Chip - * @{ - */ -#define BSP_MT29F2G08AB_BANK (EXMC_NFC_BANK0) -/** - * @} - */ - -/** - * @defgroup NFC_Interface_Pin NF Interface Pin - * @{ - */ -#define BSP_MT29F2G08AB_CE_PORT (GPIO_PORT_C) /* PC02 - EXMC_CE0 */ -#define BSP_MT29F2G08AB_CE_PIN (GPIO_PIN_02) - -#define BSP_MT29F2G08AB_RE_PORT (GPIO_PORT_F) /* PF11 - EXMC_OE */ -#define BSP_MT29F2G08AB_RE_PIN (GPIO_PIN_11) - -#define BSP_MT29F2G08AB_WE_PORT (GPIO_PORT_C) /* PC00 - EXMC_WE */ -#define BSP_MT29F2G08AB_WE_PIN (GPIO_PIN_00) - -#define BSP_MT29F2G08AB_CLE_PORT (GPIO_PORT_I) /* PI12 - EXMC_CLE */ -#define BSP_MT29F2G08AB_CLE_PIN (GPIO_PIN_12) - -#define BSP_MT29F2G08AB_ALE_PORT (GPIO_PORT_C) /* PC03 - EXMC_ALE */ -#define BSP_MT29F2G08AB_ALE_PIN (GPIO_PIN_03) - -#define BSP_MT29F2G08AB_WP_PORT (GPIO_PORT_G) /* PG15 - EXMC_BAA */ -#define BSP_MT29F2G08AB_WP_PIN (GPIO_PIN_15) - -#define BSP_MT29F2G08AB_RB_PORT (GPIO_PORT_G) /* PG06 - EXMC_RB0 */ -#define BSP_MT29F2G08AB_RB_PIN (GPIO_PIN_06) - -#define BSP_MT29F2G08AB_DATA0_PORT (GPIO_PORT_D) /* PD14 - EXMC_DATA0 */ -#define BSP_MT29F2G08AB_DATA0_PIN (GPIO_PIN_14) -#define BSP_MT29F2G08AB_DATA1_PORT (GPIO_PORT_D) /* PD15 - EXMC_DATA1 */ -#define BSP_MT29F2G08AB_DATA1_PIN (GPIO_PIN_15) -#define BSP_MT29F2G08AB_DATA2_PORT (GPIO_PORT_D) /* PD0 - EXMC_DATA2 */ -#define BSP_MT29F2G08AB_DATA2_PIN (GPIO_PIN_00) -#define BSP_MT29F2G08AB_DATA3_PORT (GPIO_PORT_D) /* PD1 - EXMC_DATA3 */ -#define BSP_MT29F2G08AB_DATA3_PIN (GPIO_PIN_01) -#define BSP_MT29F2G08AB_DATA4_PORT (GPIO_PORT_E) /* PE7 - EXMC_DATA4 */ -#define BSP_MT29F2G08AB_DATA4_PIN (GPIO_PIN_07) -#define BSP_MT29F2G08AB_DATA5_PORT (GPIO_PORT_E) /* PE8 - EXMC_DATA5 */ -#define BSP_MT29F2G08AB_DATA5_PIN (GPIO_PIN_08) -#define BSP_MT29F2G08AB_DATA6_PORT (GPIO_PORT_E) /* PE9 - EXMC_DATA6 */ -#define BSP_MT29F2G08AB_DATA6_PIN (GPIO_PIN_09) -#define BSP_MT29F2G08AB_DATA7_PORT (GPIO_PORT_E) /* PE10 - EXMC_DATA7 */ -#define BSP_MT29F2G08AB_DATA7_PIN (GPIO_PIN_10) -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_MT29F2G08AB_Device_Size MT29F2G08AB Device Size - * @{ - */ -#define BSP_MT29F2G08AB_PAGE_SIZE_WITHOUT_SPARE (2048UL) -#define BSP_MT29F2G08AB_SPARE_AREA_SIZE (64UL) -#define BSP_MT29F2G08AB_PAGE_SIZE_WITH_SPARE (BSP_MT29F2G08AB_PAGE_SIZE_WITHOUT_SPARE + BSP_MT29F2G08AB_SPARE_AREA_SIZE) - -#define BSP_MT29F2G08AB_PAGES_PER_BLOCK (64UL) -#define BSP_MT29F2G08AB_BLOCKS_PER_PLANE (1024UL) -#define BSP_MT29F2G08AB_PLANE_PER_DEVICE (2UL) -#define BSP_MT29F2G08AB_DEVICE_PAGES (BSP_MT29F2G08AB_PLANE_PER_DEVICE * BSP_MT29F2G08AB_BLOCKS_PER_PLANE * \ - BSP_MT29F2G08AB_PAGES_PER_BLOCK) - -#define BSP_MT29F2G08AB_PAGE_1BIT_ECC_VALUE_SIZE \ -( (BSP_MT29F2G08AB_PAGE_SIZE_WITHOUT_SPARE / EXMC_NFC_ECC_CALCULATE_BLOCK_BYTE) * EXMC_NFC_1BIT_ECC_VALUE_BYTE) -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_MT29F2G08AB_ID_Information MT29F2G08AB ID Information - * @{ - */ -#define BSP_MT29F2G08ABAEA_MANUFACTURER_ID (0x2CU) -#define BSP_MT29F2G08ABAEA_DEVICE_ID1 (0xDAU) -#define BSP_MT29F2G08ABAEA_DEVICE_ID2 (0x90U) -#define BSP_MT29F2G08ABAEA_DEVICE_ID3 (0x95U) -/** - * @} - */ -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** -* @addtogroup EV_HC32F4A0_LQFP176_MT29F2G08AB_Global_Functions -* @{ -*/ -int32_t BSP_MT29F2G08AB_Init(void); -int32_t BSP_MT29F2G08AB_ReadId(uint32_t u32IdAddr, uint8_t au8DevId[], uint32_t u32NumBytes, uint32_t u32Timeout); -int32_t BSP_MT29F2G08AB_EraseBlock(uint32_t u32BlockRowAddr, uint32_t u32Timeout); -int32_t BSP_MT29F2G08AB_ReadPage(uint32_t u32Page, uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout); -int32_t BSP_MT29F2G08AB_WritePage(uint32_t u32Page, const uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout); -int32_t BSP_MT29F2G08AB_1BitEccReadPage(uint32_t u32Page, uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout); -int32_t BSP_MT29F2G08AB_1BitEccWritePage(uint32_t u32Page, const uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout); -int32_t BSP_MT29F2G08AB_4BitEccReadPage(uint32_t u32Page, uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout); -int32_t BSP_MT29F2G08AB_4BitEccWritePage(uint32_t u32Page, const uint8_t *pu8Data, - uint32_t u32NumBytes, uint32_t u32Timeout); -/** - * @} - */ -#endif /* BSP_MT29F2G08AB_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_MT29F2G08AB_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_nt35510.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_nt35510.c deleted file mode 100644 index 39fafc658e6..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_nt35510.c +++ /dev/null @@ -1,539 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_nt35510.c - * @brief This file provides firmware functions of the LCD nt35510 driver - * library for the board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2023-01-15 CDT Optimize function arguments - 2023-09-30 CDT Modify SMC timing parameter: EXCLK 60MHz -> 30MHz - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include -#include "nt35510.h" -#include "hc32_ll_smc.h" -#include "ev_hc32f4a0_lqfp176.h" -#include "ev_hc32f4a0_lqfp176_nt35510.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_NT35510 EV_HC32F4A0_LQFP176 NT35510 - * @{ - */ - -#if ((BSP_NT35510_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_NT35510_Local_Macros EV_HC32F4A0_LQFP176 NT35510 Local Macros - * @{ - */ - -/** - * @defgroup SMC_Max_Timeout SMC Max Timeout - * @{ - */ -#define SMC_MAX_TIMEOUT (0x100000UL) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_NT35510_Local_Variables EV_HC32F4A0_LQFP176 NT35510 Local Variables - * @{ - */ -static stc_lcd_controller_t *LCD = ((stc_lcd_controller_t *)BSP_NT35510_BASE); -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ - -/** - * @defgroup EV_HC32F4A0_LQFP176_NT35510_Local_Functions EV_HC32F4A0_LQFP176 NT35510 Local Functions - * @{ - */ - -/** - * @brief Initializes LCD gpio. - */ -static void LCD_Port_Init(void) -{ - stc_gpio_init_t stcGpioInit; - - (void)GPIO_StructInit(&stcGpioInit); - stcGpioInit.u16PinDrv = PIN_HIGH_DRV; - - /* LCD_CS */ - (void)GPIO_Init(BSP_NT35510_CS_PORT, BSP_NT35510_CS_PIN, &stcGpioInit); - - /* LCD_WE */ - (void)GPIO_Init(BSP_NT35510_WE_PORT, BSP_NT35510_WE_PIN, &stcGpioInit); - - /* LCD_OE */ - (void)GPIO_Init(BSP_NT35510_OE_PORT, BSP_NT35510_OE_PIN, &stcGpioInit); - - /* SMC_DATA[0:15] */ - (void)GPIO_Init(BSP_NT35510_DATA0_PORT, BSP_NT35510_DATA0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA1_PORT, BSP_NT35510_DATA1_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA2_PORT, BSP_NT35510_DATA2_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA3_PORT, BSP_NT35510_DATA3_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA4_PORT, BSP_NT35510_DATA4_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA5_PORT, BSP_NT35510_DATA5_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA6_PORT, BSP_NT35510_DATA6_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA7_PORT, BSP_NT35510_DATA7_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA8_PORT, BSP_NT35510_DATA8_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA9_PORT, BSP_NT35510_DATA9_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA10_PORT, BSP_NT35510_DATA10_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA11_PORT, BSP_NT35510_DATA11_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA12_PORT, BSP_NT35510_DATA12_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA13_PORT, BSP_NT35510_DATA13_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA14_PORT, BSP_NT35510_DATA14_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_NT35510_DATA15_PORT, BSP_NT35510_DATA15_PIN, &stcGpioInit); - - (void)GPIO_Init(BSP_NT35510_RS_PORT, BSP_NT35510_RS_PIN, &stcGpioInit); - - /* LCD_DATA[0:15] */ - GPIO_SetFunc(BSP_NT35510_DATA0_PORT, BSP_NT35510_DATA0_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA1_PORT, BSP_NT35510_DATA1_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA2_PORT, BSP_NT35510_DATA2_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA3_PORT, BSP_NT35510_DATA3_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA4_PORT, BSP_NT35510_DATA4_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA5_PORT, BSP_NT35510_DATA5_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA6_PORT, BSP_NT35510_DATA6_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA7_PORT, BSP_NT35510_DATA7_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA8_PORT, BSP_NT35510_DATA8_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA9_PORT, BSP_NT35510_DATA9_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA10_PORT, BSP_NT35510_DATA10_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA11_PORT, BSP_NT35510_DATA11_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA12_PORT, BSP_NT35510_DATA12_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA13_PORT, BSP_NT35510_DATA13_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA14_PORT, BSP_NT35510_DATA14_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_DATA15_PORT, BSP_NT35510_DATA15_PIN, GPIO_FUNC_12); - - GPIO_SetFunc(BSP_NT35510_CS_PORT, BSP_NT35510_CS_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_RS_PORT, BSP_NT35510_RS_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_WE_PORT, BSP_NT35510_WE_PIN, GPIO_FUNC_12); - GPIO_SetFunc(BSP_NT35510_OE_PORT, BSP_NT35510_OE_PIN, GPIO_FUNC_12); -} - -/** - * @brief Initializes LCD low level. - * @param None - * @retval int32_t: - * - LL_OK: Initialize successfully. - * - LL_ERR: Initialize unsuccessfully. - */ -static int32_t LCD_SMC_Init(void) -{ - __IO uint32_t u32To = 0UL; - int32_t i32Ret = LL_OK; - stc_exmc_smc_init_t stcSmcInit; - stc_exmc_smc_chip_config_t stcChipConfig; - stc_exmc_smc_timing_config_t stcTimingConfig; - en_flag_status_t enChipStatus = RESET; - en_flag_status_t enTimingStatus = RESET; - - LCD_Port_Init(); - - /* Enable SMC clock */ - FCG_Fcg3PeriphClockCmd(FCG3_PERIPH_SMC, ENABLE); - - /* Enable SMC. */ - EXMC_SMC_Cmd(ENABLE); - - EXMC_SMC_ExitLowPower(); - - while (EXMC_SMC_READY != EXMC_SMC_GetStatus()) { - if (u32To > SMC_MAX_TIMEOUT) { - i32Ret = LL_ERR; - break; - } - u32To++; - } - - if (LL_OK == i32Ret) { - /* Configure SMC width && CS &chip & timing. */ - (void)EXMC_SMC_StructInit(&stcSmcInit); - stcSmcInit.stcChipConfig.u32AddrMatch = BSP_NT35510_MATCH_ADDR; - stcSmcInit.stcChipConfig.u32AddrMask = BSP_NT35510_MASK_ADDR; - stcSmcInit.stcChipConfig.u32MemoryWidth = EXMC_SMC_MEMORY_WIDTH_16BIT; - stcSmcInit.stcChipConfig.u32BAA = EXMC_SMC_BAA_PORT_DISABLE; - stcSmcInit.stcChipConfig.u32ADV = EXMC_SMC_ADV_PORT_DISABLE; - stcSmcInit.stcChipConfig.u32BLS = EXMC_SMC_BLS_SYNC_CS; - stcSmcInit.stcChipConfig.u32ReadBurstLen = EXMC_SMC_READ_BURST_4BEAT; - stcSmcInit.stcChipConfig.u32WriteBurstLen = EXMC_SMC_WRITE_BURST_4BEAT; - stcSmcInit.stcChipConfig.u32ReadMode = EXMC_SMC_READ_SYNC; - stcSmcInit.stcChipConfig.u32WriteMode = EXMC_SMC_WRITE_SYNC; - - /* EXCLK bus frequency@30MHz: 3.3V */ - stcSmcInit.stcTimingConfig.u8RC = 12U; /* tRCFM: min=400ns, tRDHFM: min=250ns, tRDLFM: min=150ns */ - stcSmcInit.stcTimingConfig.u8WC = 2U; /* tWC: min=33ns, tWRH: min=15ns, tWRL: min=15ns */ - stcSmcInit.stcTimingConfig.u8CEOE = 7U; - stcSmcInit.stcTimingConfig.u8WP = 1U; /* tWRL: min=15ns */ - stcSmcInit.stcTimingConfig.u8PC = 4U; - stcSmcInit.stcTimingConfig.u8TR = 1U; - (void)EXMC_SMC_Init(BSP_NT35510_CHIP, &stcSmcInit); - - /* Set command: updateregs */ - EXMC_SMC_SetCommand(BSP_NT35510_CHIP, EXMC_SMC_CMD_UPDATEREGS, 0UL, 0UL); - - /* Check timing status */ - u32To = 0UL; - while ((enChipStatus != SET) || (enTimingStatus != SET)) { - (void)EXMC_SMC_GetTimingConfig(BSP_NT35510_CHIP, &stcTimingConfig); - if (0 == memcmp(&stcTimingConfig, &stcSmcInit.stcTimingConfig, sizeof(stcTimingConfig))) { - enTimingStatus = SET; - } - - (void)EXMC_SMC_GetChipConfig(BSP_NT35510_CHIP, &stcChipConfig); - if (0 == memcmp(&stcChipConfig, &stcSmcInit.stcChipConfig, sizeof(stcChipConfig))) { - enChipStatus = SET; - } - - if (u32To > SMC_MAX_TIMEOUT) { - i32Ret = LL_ERR; - break; - } - u32To++; - } - } - - return i32Ret; -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_NT35510_Global_Functions EV_HC32F4A0_LQFP176 NT35510 Global Functions - * @{ - */ - -/** - * @brief LCD device initialize. - * @param None - * @retval None - */ -void BSP_NT35510_Init(void) -{ - (void)LCD_SMC_Init(); - - NT35510_Init(LCD); -} - -/** - * @brief Read LCD ID. - * @param None - * @retval ID. - */ -uint32_t BSP_NT35510_ReadID(void) -{ - return NT35510_ReadID(LCD); -} - -/** - * @brief Enables the Display. - * @param None - * @retval None - */ -void BSP_NT35510_DisplayOn(void) -{ - NT35510_DisplayOn(LCD); -} - -/** - * @brief Disables the Display. - * @param None - * @retval None - */ -void BSP_NT35510_DisplayOff(void) -{ - NT35510_DisplayOff(LCD); -} - -/** - * @brief Get LCD PIXEL WIDTH. - * @param None - * @retval LCD PIXEL WIDTH. - */ -uint16_t BSP_NT35510_GetPixelWidth(void) -{ - return NT35510_GetPixelWidth(); -} - -/** - * @brief Get LCD PIXEL HEIGHT. - * @param None - * @retval LCD PIXEL HEIGHT. - */ -uint16_t BSP_NT35510_GetPixelHeight(void) -{ - return NT35510_GetPixelHeight(); -} - -/** - * @brief Write data on LCD data register. - * @param [in] u16Data: Data to be written - * @retval None - */ -void BSP_NT35510_WriteData(uint16_t u16Data) -{ - NT35510_WriteData(LCD, u16Data); -} - -/** - * @brief Write register on LCD register. - * @param [in] u16Reg: Address of the selected register. - * @retval None - */ -void BSP_NT35510_WriteReg(uint16_t u16Reg) -{ - NT35510_WriteReg(LCD, u16Reg); -} - -/** - * @brief Read data from LCD data register. - * @param None - * @retval Read data. - */ -uint16_t BSP_NT35510_ReadData(void) -{ - return NT35510_ReadData(LCD); -} - -/** - * @brief Write to the selected LCD register. - * @param [in] u16Reg: Address of the selected register. - * @param [in] u16Data: Data to be written - * @retval None - */ -void BSP_NT35510_WriteRegData(uint16_t u16Reg, uint16_t u16Data) -{ - NT35510_WriteRegData(LCD, u16Reg, u16Data); -} - -/** - * @brief Read the selected LCD register. - * @param [in] u16Reg: Address of the selected register. - * @retval Register value - */ -uint16_t BSP_NT35510_ReadRegData(uint16_t u16Reg) -{ - return NT35510_ReadRegData(LCD, u16Reg); -} - -/** - * @brief Set scan direction. - * @param [in] u16Dir: Scan direction - * This parameter can be one of the following values: - * @arg LCD_SCAN_DIR_L2R_U2D: From left to right && from up to down - * @arg LCD_SCAN_DIR_L2R_D2U: From left to right && from down to up - * @arg LCD_SCAN_DIR_R2L_U2D: From right to left && from up to down - * @arg LCD_SCAN_DIR_R2L_D2U: From right to left && from down to up - * @arg LCD_SCAN_DIR_U2D_L2R: From up to down && from left to right - * @arg LCD_SCAN_DIR_U2D_R2L: From up to down && from right to left - * @arg LCD_SCAN_DIR_D2U_L2R: From down to up && from left to right - * @arg LCD_SCAN_DIR_D2U_R2L: From down to up && from right to left - * @retval None - */ -void BSP_NT35510_SetScanDir(uint16_t u16Dir) -{ - NT35510_SetScanDir(LCD, u16Dir); -} - -/** - * @brief Set screen direction. - * @param [in] u16Dir: Screen direction - * This parameter can be one of the following values: - * @arg LCD_DISPLAY_VERTICAL: LCD vertical display - * @arg LCD_DISPLAY_HORIZONTAL: LCD horizontal display - * @retval None - */ -void BSP_NT35510_SetDisplayDir(uint16_t u16Dir) -{ - NT35510_SetDisplayDir(LCD, u16Dir); -} - -/** - * @brief Prepare to write LCD RAM. - * @param None - */ -void BSP_NT35510_PrepareWriteRAM(void) -{ - NT35510_PrepareWriteRAM(LCD); -} - -/** - * @brief Set screen backlight. - * @param [in] u8PWM: PWM level - This parameter can be a value between Min_Data = 0 and Max_Data = 100 - * @retval None - */ -void BSP_NT35510_SetBackLight(uint8_t u8PWM) -{ - NT35510_SetBackLight(LCD, u8PWM); -} - -/** - * @brief Set Cursor position. - * @param u16Xpos: Specifies the X position. - * @param u16Ypos: Specifies the Y position. - * @retval None - */ -void BSP_NT35510_SetCursor(uint16_t u16Xpos, uint16_t u16Ypos) -{ - NT35510_SetCursor(LCD, u16Xpos, u16Ypos); -} - -/** - * @brief Write pixel. - * @param u16Xpos: Specifies the X position. - * @param u16Ypos: Specifies the Y position. - * @param [in] u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void BSP_NT35510_WritePixel(uint16_t u16Xpos, uint16_t u16Ypos, uint16_t u16RGBCode) -{ - NT35510_WritePixel(LCD, u16Xpos, u16Ypos, u16RGBCode); -} - -/** - * @brief Write line. - * @param u16X1: Specifies the X position 1. - * @param u16X2: Specifies the X position 2. - * @param u16Y1: Specifies the Y position 1. - * @param u16Y2: Specifies the Y position 2. - * @param [in] u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void BSP_NT35510_DrawLine(uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16RGBCode) -{ - NT35510_DrawLine(LCD, u16X1, u16Y1, u16X2, u16Y2, u16RGBCode); -} - -/** - * @brief Draws a circle. - * @param [in] u16Xpos: X position - * @param [in] u16Ypos: Y position - * @param [in] u16Radius: Circle radius - * @param [in] u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void BSP_NT35510_DrawCircle(uint16_t u16Xpos, uint16_t u16Ypos, uint16_t u16Radius, uint16_t u16RGBCode) -{ - NT35510_DrawCircle(LCD, u16Xpos, u16Ypos, u16Radius, u16RGBCode); -} - -/** - * @brief Fills a triangle (between 3 points). - * @param [in] u16X1: Point 1 X position - * @param [in] u16Y1: Point 1 Y position - * @param [in] u16X2: Point 2 X position - * @param [in] u16Y2: Point 2 Y position - * @param [in] u16X3: Point 3 X position - * @param [in] u16Y3: Point 3 Y position - * @param [in] u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void BSP_NT35510_FillTriangle(uint16_t u16X1, uint16_t u16Y1, uint16_t u16X2, uint16_t u16Y2, uint16_t u16X3, - uint16_t u16Y3, uint16_t u16RGBCode) -{ - NT35510_FillTriangle(LCD, u16X1, u16Y1, u16X2, u16Y2, u16X3, u16Y3, u16RGBCode); -} - -/** - * @brief Draw rectangle. - * @param [in] u16X1: Point 1 X position - * @param [in] u16Y1: Point 1 Y position - * @param [in] u16X2: Point 2 X position - * @param [in] u16Y2: Point 2 Y position - * @param [in] u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void BSP_NT35510_DrawRectangle(uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16RGBCode) -{ - NT35510_DrawRectangle(LCD, u16X1, u16Y1, u16X2, u16Y2, u16RGBCode); -} - -/** - * @brief Clear screen. - * @param [in] u16RGBCode: The RGB pixel color in RGB565 format - * @retval None - */ -void BSP_NT35510_Clear(uint16_t u16RGBCode) -{ - NT35510_Clear(LCD, u16RGBCode); -} - -/** - * @} - */ - -#endif /* BSP_NT35510_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_nt35510.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_nt35510.h deleted file mode 100644 index 9fd5c147434..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_nt35510.h +++ /dev/null @@ -1,206 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_nt35510.h - * @brief This file contains all the functions prototypes of the LCD nt35510 - * driver library for the board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2023-01-15 CDT Update function arguments - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_NT35510_H__ -#define __EV_HC32F4A0_LQFP176_NT35510_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "nt35510.h" -#include "hc32_ll_gpio.h" -#include "hc32_ll_smc.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_NT35510 - * @{ - */ -#if ((DDL_ON == BSP_NT35510_ENABLE) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_NT35510_Global_Macros EV_HC32F4A0_LQFP176 NT35510 Global Macros - * @{ - */ - -/** - * @defgroup LCD_Map_SMC_Chip LCD Map SMC Chip - * @{ - */ -#define BSP_NT35510_CHIP (EXMC_SMC_CHIP3) -/** - * @} - */ - -/** - * @defgroup LCD_SMC_Address_Space LCD SMC Address Space - * @{ - */ -#define BSP_NT35510_MATCH_ADDR (0x60UL) -#define BSP_NT35510_MASK_ADDR (EXMC_SMC_ADDR_MASK_16MB) -/** - * @} - */ - -/** - * @defgroup LCD_Interface_Pin LCD Interface Pin - * @{ - */ -#define BSP_NT35510_CS_PORT (GPIO_PORT_G) /* PG10 - EXMC_CE2 */ -#define BSP_NT35510_CS_PIN (GPIO_PIN_12) - -#define BSP_NT35510_WE_PORT (GPIO_PORT_C) /* PC00 - EXMC_WE */ -#define BSP_NT35510_WE_PIN (GPIO_PIN_00) - -#define BSP_NT35510_OE_PORT (GPIO_PORT_F) /* PF11 - EXMC_OE */ -#define BSP_NT35510_OE_PIN (GPIO_PIN_11) - -#define BSP_NT35510_RS_PORT (GPIO_PORT_G) /* PG02 - EXMC_ADD12 for LCD_RS */ -#define BSP_NT35510_RS_PIN (GPIO_PIN_02) - -#define BSP_NT35510_DATA0_PORT (GPIO_PORT_D) /* PD14 - EXMC_DATA0 */ -#define BSP_NT35510_DATA0_PIN (GPIO_PIN_14) -#define BSP_NT35510_DATA1_PORT (GPIO_PORT_D) /* PD15 - EXMC_DATA1 */ -#define BSP_NT35510_DATA1_PIN (GPIO_PIN_15) -#define BSP_NT35510_DATA2_PORT (GPIO_PORT_D) /* PD00 - EXMC_DATA2 */ -#define BSP_NT35510_DATA2_PIN (GPIO_PIN_00) -#define BSP_NT35510_DATA3_PORT (GPIO_PORT_D) /* PD01 - EXMC_DATA3 */ -#define BSP_NT35510_DATA3_PIN (GPIO_PIN_01) -#define BSP_NT35510_DATA4_PORT (GPIO_PORT_E) /* PE07 - EXMC_DATA4 */ -#define BSP_NT35510_DATA4_PIN (GPIO_PIN_07) -#define BSP_NT35510_DATA5_PORT (GPIO_PORT_E) /* PE08 - EXMC_DATA5 */ -#define BSP_NT35510_DATA5_PIN (GPIO_PIN_08) -#define BSP_NT35510_DATA6_PORT (GPIO_PORT_E) /* PE09 - EXMC_DATA6 */ -#define BSP_NT35510_DATA6_PIN (GPIO_PIN_09) -#define BSP_NT35510_DATA7_PORT (GPIO_PORT_E) /* PE10 - EXMC_DATA7 */ -#define BSP_NT35510_DATA7_PIN (GPIO_PIN_10) -#define BSP_NT35510_DATA8_PORT (GPIO_PORT_E) /* PE11 - EXMC_DATA8 */ -#define BSP_NT35510_DATA8_PIN (GPIO_PIN_11) -#define BSP_NT35510_DATA9_PORT (GPIO_PORT_E) /* PE12 - EXMC_DATA9 */ -#define BSP_NT35510_DATA9_PIN (GPIO_PIN_12) -#define BSP_NT35510_DATA10_PORT (GPIO_PORT_E) /* PE13 - EXMC_DATA10 */ -#define BSP_NT35510_DATA10_PIN (GPIO_PIN_13) -#define BSP_NT35510_DATA11_PORT (GPIO_PORT_E) /* PE14 - EXMC_DATA11 */ -#define BSP_NT35510_DATA11_PIN (GPIO_PIN_14) -#define BSP_NT35510_DATA12_PORT (GPIO_PORT_E) /* PE15 - EXMC_DATA12 */ -#define BSP_NT35510_DATA12_PIN (GPIO_PIN_15) -#define BSP_NT35510_DATA13_PORT (GPIO_PORT_D) /* PD08 - EXMC_DATA13 */ -#define BSP_NT35510_DATA13_PIN (GPIO_PIN_08) -#define BSP_NT35510_DATA14_PORT (GPIO_PORT_D) /* PD09 - EXMC_DATA14 */ -#define BSP_NT35510_DATA14_PIN (GPIO_PIN_09) -#define BSP_NT35510_DATA15_PORT (GPIO_PORT_D) /* PD10 - EXMC_DATA15 */ -#define BSP_NT35510_DATA15_PIN (GPIO_PIN_10) -/** - * @} - */ - -/* Use EXMC CS3, A12 as the RS signal */ -#define BSP_NT35510_BASE (0x60000000UL | ((1UL << 13U) - 2UL)) - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_NT35510_Global_Functions - * @{ - */ -void BSP_NT35510_Init(void); -uint32_t BSP_NT35510_ReadID(void); -void BSP_NT35510_DisplayOn(void); -void BSP_NT35510_DisplayOff(void); -uint16_t BSP_NT35510_GetPixelWidth(void); -uint16_t BSP_NT35510_GetPixelHeight(void); -void BSP_NT35510_WriteData(uint16_t u16Data); -void BSP_NT35510_WriteReg(uint16_t u16Reg); -uint16_t BSP_NT35510_ReadData(void); -void BSP_NT35510_WriteRegData(uint16_t u16Reg, uint16_t u16Data); -uint16_t BSP_NT35510_ReadRegData(uint16_t u16Reg); -void BSP_NT35510_SetScanDir(uint16_t u16Dir); -void BSP_NT35510_SetDisplayDir(uint16_t u16Dir); -void BSP_NT35510_PrepareWriteRAM(void); -void BSP_NT35510_SetBackLight(uint8_t u8PWM); -void BSP_NT35510_SetCursor(uint16_t u16Xpos, uint16_t u16Ypos); -void BSP_NT35510_WritePixel(uint16_t u16Xpos, uint16_t u16Ypos, uint16_t u16RGBCode); -void BSP_NT35510_DrawLine(uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16RGBCode); -void BSP_NT35510_DrawCircle(uint16_t u16Xpos, uint16_t u16Ypos, uint16_t u16Radius, uint16_t u16RGBCode); -void BSP_NT35510_FillTriangle(uint16_t u16X1, uint16_t u16Y1, uint16_t u16X2, uint16_t u16Y2, - uint16_t u16X3, uint16_t u16Y3, uint16_t u16RGBCode); -void BSP_NT35510_DrawRectangle(uint16_t u16X1, uint16_t u16Y1, - uint16_t u16X2, uint16_t u16Y2, uint16_t u16RGBCode); -void BSP_NT35510_Clear(uint16_t u16RGBCode); -/** - * @} - */ - -#endif /* BSP_NT35510_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_NT35510_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_ov5640.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_ov5640.c deleted file mode 100644 index 14df4daecca..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_ov5640.c +++ /dev/null @@ -1,620 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_ov5640.c - * @brief This file provides firmware functions of the camera ov5640 driver - * library for the board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2023-09-30 CDT Optimize comments - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "ov5640.h" -#include "ev_hc32f4a0_lqfp176_ov5640.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_OV5640 EV_HC32F4A0_LQFP176 OV5640 - * @{ - */ - -#if ((BSP_OV5640_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_OV5640_Local_Functions - * @{ - */ -static void CAM_Port_Init(void); - -static void BSP_OV5640_I2C_Delay(uint32_t u32Delay); -static void BSP_OV5640_I2C_Init(void); -static void BSP_OV5640_I2C_Write(const uint8_t au8Reg[], uint8_t u8RegLen, const uint8_t au8Buf[], uint32_t u32Len); -static void BSP_OV5640_I2C_Read(const uint8_t au8Reg[], uint8_t u8RegLen, uint8_t au8Buf[], uint32_t u32Len); -/** - * @} - */ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ - -/** - * @defgroup EV_HC32F4A0_LQFP176_OV5640_Local_Variables EV_HC32F4A0_LQFP176 OV5640 Local Variables - * @{ - */ -const static stc_ov5640_ll_t m_stcOv5640LL = { - .Delay = BSP_OV5640_I2C_Delay, - .Init = BSP_OV5640_I2C_Init, - .Write = BSP_OV5640_I2C_Write, - .Read = BSP_OV5640_I2C_Read, -}; - -static const stc_ov5640_reg_value_t m_astcOv5640InitRegTable[] = { - /* input clock: 24Mhz, PCLK: 11.4Mhz */ - {0x3008, 0x42}, /* b7:software reset <> b6:software power down <> b5~b0:reserved */ - {0x3017, 0xFF}, /* b7:FREX <> b6:VSYNC <> b5:HREF <> b4:PCLK <> b3~0:D[9:6] output enable */ - {0x3018, 0xFF}, /* b7~2:D[5:0] <> b1~0:GPIO[1:0] output enable */ - {0x3034, 0x1A}, /* b7:reserved <> b6~b4:PLL charge pump control <> b3~b0:MIPI bit mode */ - {0x3037, 0x13}, /* b7~b5:reserved <> b4:PLL root bypass or divider/2 - b3~b0:PLL pre-divider 1\1\2\3\4\1.5\6\2.5\8\1\1\1\1\1\1\1 */ - - /* SCCB control */ - {0x3103, 0x03}, /* b1:system clock from PAD or PLL <> b7~b2&&b0:reserved */ - {0x3108, 0x01}, /* b7~b6:reserved <> b5~b4:PCLK <> b3~b2:SCLK2x <> b1~b0:SCLK root divider 1/2/4/8 */ - - {0x3630, 0x36}, - {0x3631, 0x0E}, - {0x3632, 0xE2}, - {0x3633, 0x12}, - {0x3621, 0xE0}, - {0x3704, 0xA0}, - {0x3703, 0x5A}, - {0x3715, 0x78}, - {0x3717, 0x01}, - {0x370B, 0x60}, - {0x3705, 0x1A}, - {0x3905, 0x02}, - {0x3906, 0x10}, - {0x3901, 0x0A}, - {0x3731, 0x12}, - {0x3600, 0x08}, /* VCM control */ - {0x3601, 0x33}, /* VCM control */ - {0x302D, 0x60}, /* system control */ - {0x3620, 0x52}, - {0x371B, 0x20}, - {0x471C, 0x50}, - - /* auto gain control(AGC) */ - {0x3A13, 0x43}, /* b7:reserved <> b6:pre-gain enable <> b5~b0:pre-gain value=1.047x */ - {0x3A18, 0x00}, /* b7~b2:reserved <> b1~b0:gain ceiling[9:8] */ - {0x3A19, 0xF8}, /* b7~b0:gain ceiling[7:0]=15.5x */ - - {0x3635, 0x13}, - {0x3636, 0x03}, - {0x3634, 0x40}, - {0x3622, 0x01}, - - /* 50/60Hz detection */ - {0x3C01, 0x34}, /* b7:band manual or auto <> b6:band begin reset <> b5:sum auto mode <> - b4:band count enable <> b3~b0:band counter threshold */ - {0x3C04, 0x28}, /* b7~b0:threshold low sum */ - {0x3C05, 0x98}, /* b7~b0:threshold high sum */ - {0x3C06, 0x00}, /* b7~b0:light meter 1 threshold[15:8] */ - {0x3C07, 0x08}, /* b7~b0:light meter 1 threshold[7:0] */ - {0x3C08, 0x00}, /* b7~b0:light meter 2 threshold[15:8] */ - {0x3C09, 0x1C}, /* b7~b0:light meter 2 threshold[7:0] */ - {0x3C0A, 0x9C}, /* b7~b0:sample number[15:8] */ - {0x3C0B, 0x40}, /* b7~b0:sample number[7:0] */ - - /* image windowing */ - {0x3810, 0x00}, /* b7~b4:reserved <> b3~b0:Timing Hoffset[11:8] */ - {0x3811, 0x10}, /* b7~b0:Timing Hoffset[7:0] */ - {0x3812, 0x00}, /* b7~b3:reserved <> b2~b0:Timing Voffset[10:8] */ - {0x3708, 0x64}, - - /* black level calibration(BLC) */ - {0x4001, 0x02}, /* b7~b6:reserved <> b5~b0:BLC start line */ - {0x4005, 0x1A}, /* b7~b2:reserved <> b1:BLC update always or normal freeze <> b0:reserved */ - - /* system control:DVP enable */ - {0x3000, 0x00}, /* b7~b0:blocks reset control reset or enable */ - {0x3004, 0xFF}, /* b7~b0:blocks clock control enable or disable */ - {0x300E, 0x58}, /* b7~b3:MIPI about(MIPI power down) <> b2:MIPI/DVP select <> b1~b0:reserved */ - {0x302E, 0x00}, - - /* format control */ - {0x4300, 0x30}, /* YUV422,YUYV */ - {0x501F, 0x00}, /* YUV 422 */ - {0x440E, 0x00}, /* JPEG control */ - - /* image sensor processor (ISP) */ - {0x5000, 0xA7}, /* b7:lenc on <> b5:raw gamma on <> b2:BPC on <> b1:WPC on <> b0:CIP on */ - - /* auto exposure control (AEC) */ - {0x3A0F, 0x30}, /* b7~b0:stable range in high */ - {0x3A10, 0x28}, /* b7~b0:stable range in low */ - {0x3A1B, 0x30}, /* b7~b0:stable range out high */ - {0x3A1E, 0x26}, /* b7~b0:stable range out low */ - {0x3A11, 0x60}, /* b7~b0:fast zone high */ - {0x3A1F, 0x14}, /* b7~b0:fast zone low */ - - /* lens correction (LENC) */ - {0x5800, 0x23}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5801, 0x14}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5802, 0x0F}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5803, 0x0F}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5804, 0x12}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5805, 0x26}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5806, 0x0C}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5807, 0x08}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5808, 0x05}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5809, 0x05}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x580A, 0x08}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x580B, 0x0D}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x580C, 0x08}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x580D, 0x03}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x580E, 0x00}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x580F, 0x00}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5810, 0x03}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5811, 0x09}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5812, 0x07}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5813, 0x03}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5814, 0x00}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5815, 0x01}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5816, 0x03}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5817, 0x08}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5818, 0x0D}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5819, 0x08}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x581A, 0x05}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x581B, 0x06}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x581C, 0x08}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x581D, 0x0E}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x581E, 0x29}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x581F, 0x17}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5820, 0x11}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5821, 0x11}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5822, 0x15}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5823, 0x28}, /* b7~b6:reserved <> b5~b0:green matrix */ - {0x5824, 0x46}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5825, 0x26}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5826, 0x08}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5827, 0x26}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5828, 0x64}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5829, 0x26}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x582A, 0x24}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x582B, 0x22}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x582C, 0x24}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x582D, 0x24}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x582E, 0x06}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x582F, 0x22}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5830, 0x40}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5831, 0x42}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5832, 0x24}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5833, 0x26}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5834, 0x24}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5835, 0x22}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5836, 0x22}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5837, 0x26}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5838, 0x44}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x5839, 0x24}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x583A, 0x26}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x583B, 0x28}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x583C, 0x42}, /* b7~b4:blue matrix <> b3~b0:red matrix */ - {0x583D, 0xCE}, /* b7~b4:lenc b offset <> b3~b0:lenc r offset */ - - /* auto white balance(AWB) */ - {0x5180, 0xFF}, /* b7~b0:AWB B block */ - {0x5181, 0xF2}, /* b7~b6:step local <> b5~b4:step fast <> b3:slop 8x <> b2:slop 4x <> b1:one zone <> b0:AVG all */ - {0x5182, 0x00}, /* b7~b4:max local counter <> b3~b0:max fast counter */ - {0x5183, 0x14}, /* b7:AWB simple or advanced <> b6:YUV enable <> b5:AWB preset <> b4:AWB SIMF <> b3~b2:AWB win */ - {0x5184, 0x25}, /* b7~b6:count area <> b5:G enable <> b4~b2:count limit <> b1~b0:count threshold */ - {0x5185, 0x24}, /* b7~b4:stable range unstable <> b3~b0:stable range stable */ - {0x5186, 0x09}, /* about advance */ - {0x5187, 0x09}, /* about advance */ - {0x5188, 0x09}, /* about advance */ - {0x5189, 0x75}, /* about advance */ - {0x518A, 0x54}, /* about advance */ - {0x518C, 0xE0}, /* about advance */ - {0x518C, 0xB2}, /* about advance */ - {0x518D, 0x42}, /* about advance */ - {0x518E, 0x3D}, /* about advance */ - {0x518F, 0x56}, /* about advance */ - {0x5190, 0x46}, /* about advance */ - {0x5191, 0xF8}, /* b7~b0:AWB top limit */ - {0x5192, 0x04}, /* b7~b0:AWB bottom limit */ - {0x5193, 0x70}, /* b7~b0:red limit */ - {0x5194, 0xF0}, /* b7~b0:green limit */ - {0x5195, 0xF0}, /* b7~b0:blue limit */ - {0x5196, 0x03}, /* b7~b6:reserved <> b5:AWB freeze <> b4:reserved <> - b3~b2:simple select <> b1:fast enable <> b0:AWB bias stat */ - {0x5197, 0x01}, /* b7~b0:local limit */ - {0x5198, 0x04}, - {0x5199, 0x12}, - {0x519A, 0x04}, - {0x519B, 0x00}, - {0x519C, 0x06}, - {0x519D, 0x82}, - {0x519E, 0x38}, /* b7~b4:reserved <> b3:local limit select <> b2:simple stable select <> b1~b0:reserved */ - - /* raw gamma(GMA) */ - {0x5480, 0x01}, /* b7~b2:reserved <> b1:YSLP15 manual enable <> b0:gamma bias plus on */ - {0x5481, 0x08}, /* b7~b0:Y yst */ - {0x5482, 0x14}, /* b7~b0:Y yst */ - {0x5483, 0x28}, /* b7~b0:Y yst */ - {0x5484, 0x51}, /* b7~b0:Y yst */ - {0x5485, 0x65}, /* b7~b0:Y yst */ - {0x5486, 0x71}, /* b7~b0:Y yst */ - {0x5487, 0x7D}, /* b7~b0:Y yst */ - {0x5488, 0x87}, /* b7~b0:Y yst */ - {0x5489, 0x91}, /* b7~b0:Y yst */ - {0x548A, 0x9A}, /* b7~b0:Y yst */ - {0x548B, 0xAA}, /* b7~b0:Y yst */ - {0x548C, 0xB8}, /* b7~b0:Y yst */ - {0x548D, 0xCD}, /* b7~b0:Y yst */ - {0x548E, 0xDD}, /* b7~b0:Y yst */ - {0x548F, 0xEA}, /* b7~b0:Y yst */ - {0x5490, 0x1D}, /* b7~b0:Y yst */ - - /* color matrix(CMX) */ - {0x5381, 0x1E}, /* b7~b0:CMX1 for Y */ - {0x5382, 0x5B}, /* b7~b0:CMX2 for Y */ - {0x5383, 0x08}, /* b7~b0:CMX3 for Y */ - {0x5384, 0x0A}, /* b7~b0:CMX4 for U */ - {0x5385, 0x7E}, /* b7~b0:CMX5 for U */ - {0x5386, 0x88}, /* b7~b0:CMX6 for U */ - {0x5387, 0x7C}, /* b7~b0:CMX7 for V */ - {0x5388, 0x6C}, /* b7~b0:CMX8 for V */ - {0x5389, 0x10}, /* b7~b0:CMX9 for V */ - {0x538A, 0x01}, /* b7~b1:reserved <> b0:CMX9 sign */ - {0x538B, 0x98}, /* b7~b0:CMX8~1 sign */ - - /* special digital effects (SDE):(UV adjust) */ - {0x5580, 0x06}, /* b7:fixed Y enable <> b6:negative enable <> b5:gray enable <> b4:dixed V enable - b3:fixed U enable <> b2:contrast enable <> b1:saturation enable <> b0:hue enable */ - {0x5583, 0x40}, /* b7~b0:max value for UV adjust */ - {0x5584, 0x10}, /* b7~b0:min value for UV adjust */ - {0x5589, 0x10}, /* b7~b0:UV adjust threshold 1 valid */ - {0x558A, 0x00}, /* b7~b1:reserved <> b0:UV adjust threshold 2 valid */ - {0x558B, 0xF8}, /* b7~b0:UV adjust threshold 2 valid */ - {0x501D, 0x40}, /* enable manual offset of contrast */ - - /* color interpolation (CIP) */ - {0x5300, 0x08}, /* b7~b0:CIP sharpen MT threshold 1 */ - {0x5301, 0x30}, /* b7~b0:CIP sharpen MT threshold 2 */ - {0x5302, 0x10}, /* b7~b0:CIP sharpen MT offset 1 */ - {0x5303, 0x00}, /* b7~b0:CIP sharpen MT offset 2 */ - {0x5304, 0x08}, /* b7~b0:CIP DNS threshold 1 */ - {0x5305, 0x30}, /* b7~b0:CIP DNS threshold 2 */ - {0x5306, 0x08}, /* b7~b0:CIP DNS offset 1 */ - {0x5307, 0x16}, /* b7~b0:CIP DNS offset 2 */ - - {0x5309, 0x08}, /* b7~b0:CIP sharpen TH threshold 1 */ - {0x530A, 0x30}, /* b7~b0:CIP sharpen TH threshold 2 */ - {0x530B, 0x04}, /* b7~b0:CIP sharpen TH offset 1 */ - {0x530D, 0x06}, /* b7~b0:CIP sharpen TH offset 2 */ - {0x5025, 0x00}, - - /* system control:wake up from standby */ - {0x3008, 0x02}, /* b7:software reset <> b6:software power down <> b5~b0:reserved */ - - /* DVP control */ - {0x4740, 0x21}, /* b7~b6:reserved <> b5:PCLK polarity H/L <> b4:reserved <> b3:gate PCLK under VSYNC <> - b2:gate PCLK under HREF <> b1:HREF polarity H/L <> b0:VSYNC polarity H/L */ - - {0x4740, 0x21}, -}; - -/* RGB565 mode: frame-rate 8fps, max-out: 1528*900 */ -static const stc_ov5640_reg_value_t m_astcOv5640Rgb565RegTable[] = { - {0x4300, 0x6F}, - {0x501F, 0x01}, - /* input clock: 24Mhz, PCLK: 11.4Mhz */ - {0x3035, 0x41}, /* b7~b4:system clock divider slow down all clocks - b3~b0:scale divider for MIPI PCLK/SERCLK can be slowed down */ - - {0x3036, 0x39}, /* b7~b0:PLL multiplier - a0: 64M NG - 9c: 62M OK - 98: 60M OK - 90: 58M OK */ - {0x3C07, 0x07}, /* lightmeter 1 threshold[7:0] */ - - /* timing control */ - {0x3820, 0x46}, /* b7~b3:reserved <> b2:ISP vflip <> b1:sensor vflip <> b0:reserved */ - {0x3821, 0x00}, /* b7~b6:reserved <> b5:JPEG enable <> b4~b3:reserved <> - b2:ISP mirror <> b1:sensor mirror <> b0:horizontal binning enable */ - {0x3814, 0x31}, /* b7~b4:horizontal odd subsample increment <> b3~b0:even */ - {0x3815, 0x31}, /* b7~b4:vertical odd subsample increment <> b3~b0:even */ - {0x3800, 0x00}, /* b7~b4:reserved <> b3~b0:X address start[11:8] */ - {0x3801, 0x00}, /* b7~b0:X address start[7:0] */ - {0x3802, 0x00}, /* b7~b4:reserved <> b3~b0:Y address start[11:8] */ - {0x3803, 0x00}, /* b7~b0:Y address start[7:0] */ - {0x3804, 0x0A}, /* b7~b4:reserved <> b3~b0:X address end[11:8] */ - {0x3805, 0x3F}, /* b7~b0:X address end[7:0] */ - {0x3806, 0x06}, /* b7~b3:reserved <> b2~b0:Y address end[10:8] */ - {0x3807, 0xA9}, /* b7~b0:Y address end[7:0] */ - {0x3808, 0x05}, /* DVPHO */ - {0x3809, 0x00}, /* DVPHO */ - {0x380A, 0x02}, /* DVPVO */ - {0x380B, 0xD0}, /* DVPVO */ - {0x380C, 0x05}, /* HTS */ - {0x380D, 0xF8}, /* HTS */ - {0x380E, 0x03}, /* VTS */ - {0x380F, 0x84}, /* VTS */ - {0x3813, 0x04}, /* timing V offset */ - {0x3618, 0x00}, - {0x3612, 0x29}, - {0x3709, 0x52}, - {0x370C, 0x03}, - {0x3A02, 0x02}, /* 60Hz max exposure */ - {0x3A03, 0xE0}, /* 60Hz max exposure */ - - {0x3A14, 0x02}, /* 50Hz max exposure */ - {0x3A15, 0xE0}, /* 50Hz max exposure */ - {0x4004, 0x02}, /* BLC line number */ - {0x3002, 0x1C}, /* reset JFIFO, SFIFO, JPG */ - {0x3006, 0xC3}, /* disable clock of JPEG2x, JPEG */ - {0x4713, 0x03}, /* JPEG mode 3 */ - {0x4407, 0x04}, /* Quantization scale */ - {0x460B, 0x37}, - {0x460C, 0x20}, - {0x4837, 0x16}, /* MIPI global timing */ - {0x3824, 0x04}, /* PCLK manual divider */ - {0x5001, 0xA3}, /* SDE on, scale on, UV average off, color matrix on, AWB on */ - {0x3503, 0x00}, /* AEC/AGC on */ -}; - -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ - -/** - * @defgroup EV_HC32F4A0_LQFP176_OV5640_Local_Functions EV_HC32F4A0_LQFP176 OV5640 Local Functions - * @{ - */ - -/** - * @brief Initializes Camera gpio. - * @param None - * @retval None - */ -static void CAM_Port_Init(void) -{ - stc_gpio_init_t stcGpioInit; - - (void)GPIO_StructInit(&stcGpioInit); - stcGpioInit.u16PinInputType = PIN_IN_TYPE_CMOS; - - /* DVP_PIXCLK */ - (void)GPIO_Init(BSP_OV5640_DVP_PIXCLK_PORT, BSP_OV5640_DVP_PIXCLK_PIN, &stcGpioInit); - - /* DVP_HSYNC */ - (void)GPIO_Init(BSP_OV5640_DVP_HSYNC_PORT, BSP_OV5640_DVP_HSYNC_PIN, &stcGpioInit); - - /* DVP_VSYNC */ - (void)GPIO_Init(BSP_OV5640_DVP_VSYNC_PORT, BSP_OV5640_DVP_VSYNC_PIN, &stcGpioInit); - - /* DVP_DATA[0:7] */ - (void)GPIO_Init(BSP_OV5640_DVP_DATA0_PORT, BSP_OV5640_DVP_DATA0_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_OV5640_DVP_DATA1_PORT, BSP_OV5640_DVP_DATA1_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_OV5640_DVP_DATA2_PORT, BSP_OV5640_DVP_DATA2_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_OV5640_DVP_DATA3_PORT, BSP_OV5640_DVP_DATA3_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_OV5640_DVP_DATA4_PORT, BSP_OV5640_DVP_DATA4_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_OV5640_DVP_DATA5_PORT, BSP_OV5640_DVP_DATA5_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_OV5640_DVP_DATA6_PORT, BSP_OV5640_DVP_DATA6_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_OV5640_DVP_DATA7_PORT, BSP_OV5640_DVP_DATA7_PIN, &stcGpioInit); - - /* DVP_DATA[0:7] */ - GPIO_SetFunc(BSP_OV5640_DVP_DATA0_PORT, BSP_OV5640_DVP_DATA0_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_DATA1_PORT, BSP_OV5640_DVP_DATA1_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_DATA2_PORT, BSP_OV5640_DVP_DATA2_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_DATA3_PORT, BSP_OV5640_DVP_DATA3_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_DATA4_PORT, BSP_OV5640_DVP_DATA4_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_DATA5_PORT, BSP_OV5640_DVP_DATA5_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_DATA6_PORT, BSP_OV5640_DVP_DATA6_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_DATA7_PORT, BSP_OV5640_DVP_DATA7_PIN, GPIO_FUNC_13); - - GPIO_SetFunc(BSP_OV5640_DVP_PIXCLK_PORT, BSP_OV5640_DVP_PIXCLK_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_HSYNC_PORT, BSP_OV5640_DVP_HSYNC_PIN, GPIO_FUNC_13); - GPIO_SetFunc(BSP_OV5640_DVP_VSYNC_PORT, BSP_OV5640_DVP_VSYNC_PIN, GPIO_FUNC_13); -} - -/** - * @brief Delay function, delay ms approximately - * @param [in] u32Delay ms - * @retval None - */ -static void BSP_OV5640_I2C_Delay(uint32_t u32Delay) -{ - DDL_DelayMS(u32Delay); -} - -/** - * @brief Initializes I2C for OV5640. - * @param None - * @retval None - */ -static void BSP_OV5640_I2C_Init(void) -{ - stc_gpio_init_t stcGpioInit; - - /* Configuration I2C GPIO */ - (void)GPIO_StructInit(&stcGpioInit); - (void)GPIO_Init(BSP_OV5640_I2C_SCL_PORT, BSP_OV5640_I2C_SCL_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_OV5640_I2C_SCL_PORT, BSP_OV5640_I2C_SCL_PIN, &stcGpioInit); - - /* Initialize I2C port*/ - GPIO_SetFunc(BSP_OV5640_I2C_SCL_PORT, BSP_OV5640_I2C_SCL_PIN, BSP_OV5640_I2C_SCL_FUNC); - GPIO_SetFunc(BSP_OV5640_I2C_SDA_PORT, BSP_OV5640_I2C_SDA_PIN, BSP_OV5640_I2C_SDA_FUNC); - - /* Enable I2C Peripheral*/ - FCG_Fcg0PeriphClockCmd(BSP_OV5640_I2C_FCG, ENABLE); - - (void)BSP_I2C_Init(BSP_OV5640_I2C_UNIT); -} - -/** - * @brief BSP OV5640 I2C write. - * @param [in] au8Reg: Pointer to the register address. - * @param [in] u8RegLen: Length of register address. - * @param [in] au8Buf: The pointer to the buffer contains the data to be read. - * @param [in] u32Len: Buffer size in byte. - * @retval None - */ -static void BSP_OV5640_I2C_Write(const uint8_t au8Reg[], uint8_t u8RegLen, const uint8_t au8Buf[], uint32_t u32Len) -{ - (void)BSP_I2C_Write(BSP_OV5640_I2C_UNIT, BSP_OV5640_I2C_ADDR, au8Reg, u8RegLen, au8Buf, u32Len); -} - -/** - * @brief BSP OV5640 I2C read. - * @param [in] au8Reg: Pointer to the register address. - * @param [in] u8RegLen: Length of register address. - * @param [out] au8Buf: The pointer to the buffer contains the data to be read. - * @param [in] u32Len: Buffer size in byte. - * @retval None - */ -static void BSP_OV5640_I2C_Read(const uint8_t au8Reg[], uint8_t u8RegLen, uint8_t au8Buf[], uint32_t u32Len) -{ - (void)BSP_I2C_Read(BSP_OV5640_I2C_UNIT, BSP_OV5640_I2C_ADDR, au8Reg, u8RegLen, au8Buf, u32Len); -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_OV5640_Global_Functions EV_HC32F4A0_LQFP176 OV5640 Global Functions - * @{ - */ - -/** - * @brief Initialize OV5640. - * @param None - * @retval None - */ -void BSP_OV5640_Init(void) -{ - CAM_Port_Init(); - - (void)OV5640_Init(&m_stcOv5640LL, m_astcOv5640InitRegTable, ARRAY_SZ(m_astcOv5640InitRegTable)); -} - -/** - * @brief Set OV5640 RGB565 mode. - * @param None - * @retval None. - */ -void BSP_OV5640_RGB565_Mode(void) -{ - (void)OV5640_RGB565_Mode(&m_stcOv5640LL, m_astcOv5640Rgb565RegTable, ARRAY_SZ(m_astcOv5640Rgb565RegTable)); -} - -/** - * @brief Read OV5640 ID. - * @param None - * @retval OV5640 ID. - */ -uint16_t BSP_OV5640_ReadID(void) -{ - return OV5640_ReadID(&m_stcOv5640LL); -} - -/** - * @brief Control OV5640 light. - * @param [in] u8Switch Light on/off - * This parameter can be one of the following values: - * @arg OV5640_LIGHT_ON: Light on - * @arg OV5640_LIGHT_OFF: Light off - * @retval None - */ -void BSP_OV5640_LightControl(uint8_t u8Switch) -{ - (void)OV5640_LightControl(&m_stcOv5640LL, u8Switch); -} - -/** - * @brief Set OV5640 out size. - * @param [in] u16X: Window X offset - * @param [in] u16Y Window Y offset - * @param [in] u16Width Window width - * @param [in] u16Height Window height - * @retval None - */ -void BSP_OV5640_SetOutSize(uint16_t u16X, uint16_t u16Y, uint16_t u16Width, uint16_t u16Height) -{ - (void)OV5640_SetOutSize(&m_stcOv5640LL, u16X, u16Y, u16Width, u16Height); -} - -/** - * @brief Set OV5640 test pattern. - * @param [in] u8Mode: Test mode - * @retval None - */ -void BSP_OV5640_TestPattern(uint8_t u8Mode) -{ - (void)OV5640_TestPattern(&m_stcOv5640LL, u8Mode); -} -/** - * @} - */ - -#endif /* BSP_OV5640_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_ov5640.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_ov5640.h deleted file mode 100644 index 3f6a954c7fa..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_ov5640.h +++ /dev/null @@ -1,167 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_ov5640.h - * @brief This file contains all the functions prototypes of the camera ov5640 - * driver library for the board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_OV5640_H__ -#define __EV_HC32F4A0_LQFP176_OV5640_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "ev_hc32f4a0_lqfp176.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_OV5640 - * @{ - */ - -#if ((DDL_ON == BSP_OV5640_ENABLE) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_OV5640_Global_Macros EV_HC32F4A0_LQFP176 OV5640 Global Macros - * @{ - */ - -/** - * @defgroup DVP_Interface_Pin DVP Interface Pin - * @{ - */ -#define BSP_OV5640_DVP_PIXCLK_PORT (GPIO_PORT_F) /* PF09 - DVP_PIXCLK */ -#define BSP_OV5640_DVP_PIXCLK_PIN (GPIO_PIN_09) - -#define BSP_OV5640_DVP_HSYNC_PORT (GPIO_PORT_H) /* PH08 - DVP_HSYNC */ -#define BSP_OV5640_DVP_HSYNC_PIN (GPIO_PIN_08) /* Line sync */ - -#define BSP_OV5640_DVP_VSYNC_PORT (GPIO_PORT_I) /* PI05 - DVP_VSYNC */ -#define BSP_OV5640_DVP_VSYNC_PIN (GPIO_PIN_05) /* Frame sync */ - -#define BSP_OV5640_DVP_DATA0_PORT (GPIO_PORT_H) /* PH09 - DVP_DATA0 */ -#define BSP_OV5640_DVP_DATA0_PIN (GPIO_PIN_09) -#define BSP_OV5640_DVP_DATA1_PORT (GPIO_PORT_H) /* PH10 - DVP_DATA1 */ -#define BSP_OV5640_DVP_DATA1_PIN (GPIO_PIN_10) -#define BSP_OV5640_DVP_DATA2_PORT (GPIO_PORT_H) /* PH11 - DVP_DATA2 */ -#define BSP_OV5640_DVP_DATA2_PIN (GPIO_PIN_11) -#define BSP_OV5640_DVP_DATA3_PORT (GPIO_PORT_H) /* PH12 - DVP_DATA3 */ -#define BSP_OV5640_DVP_DATA3_PIN (GPIO_PIN_12) -#define BSP_OV5640_DVP_DATA4_PORT (GPIO_PORT_H) /* PH14 - DVP_DATA4 */ -#define BSP_OV5640_DVP_DATA4_PIN (GPIO_PIN_14) -#define BSP_OV5640_DVP_DATA5_PORT (GPIO_PORT_I) /* PI04 - DVP_DATA5 */ -#define BSP_OV5640_DVP_DATA5_PIN (GPIO_PIN_04) -#define BSP_OV5640_DVP_DATA6_PORT (GPIO_PORT_I) /* PI06 - DVP_DATA6 */ -#define BSP_OV5640_DVP_DATA6_PIN (GPIO_PIN_06) -#define BSP_OV5640_DVP_DATA7_PORT (GPIO_PORT_I) /* PI07 - DVP_DATA7 */ -#define BSP_OV5640_DVP_DATA7_PIN (GPIO_PIN_07) -/** - * @} - */ - -/** - * @defgroup OV5640_I2C_Interface OV5640 I2C Interface - * @{ - */ -/* OV5640 I2C device address */ -#define BSP_OV5640_I2C_ADDR (0x3CU) - -/* I2C unit */ -#define BSP_OV5640_I2C_UNIT (CM_I2C1) -#define BSP_OV5640_I2C_FCG (FCG1_PERIPH_I2C1) - -/* SDA and SCL pin define */ -#define BSP_OV5640_I2C_SCL_PORT (GPIO_PORT_D) -#define BSP_OV5640_I2C_SCL_PIN (GPIO_PIN_03) -#define BSP_OV5640_I2C_SCL_FUNC (GPIO_FUNC_49) - -#define BSP_OV5640_I2C_SDA_PORT (GPIO_PORT_F) -#define BSP_OV5640_I2C_SDA_PIN (GPIO_PIN_10) -#define BSP_OV5640_I2C_SDA_FUNC (GPIO_FUNC_48) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_OV5640_Global_Functions - * @{ - */ -void BSP_OV5640_Init(void); -void BSP_OV5640_RGB565_Mode(void); -uint16_t BSP_OV5640_ReadID(void); -void BSP_OV5640_LightControl(uint8_t u8Switch); -void BSP_OV5640_SetOutSize(uint16_t u16X, uint16_t u16Y, uint16_t u16Width, uint16_t u16Height); -void BSP_OV5640_TestPattern(uint8_t u8Mode); -/** - * @} - */ - -#endif /* BSP_OV5640_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_OV5640_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_tca9539.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_tca9539.c deleted file mode 100644 index c5122de69b5..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_tca9539.c +++ /dev/null @@ -1,441 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_tca9539.c - * @brief This file provides firmware functions for IO expand IC TCA9539. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2023-09-30 CDT Change Reset control pin from NMOS to CMOS output cause of "EV_F4A0_LQ176_Rev1.0"'s modification - Rename local variables: stcTca9539Config -> m_stcTca9539Config - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "ev_hc32f4a0_lqfp176_tca9539.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_TCA9539 EV_HC32F4A0_LQFP176 TCA9539 - * @{ - */ - -#if ((BSP_TCA9539_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_TCA9539_Local_Variables EV_HC32F4A0_LQFP176 TCA9539 Local Variables - * @{ - */ -static stc_tca9539_ll_t m_stcTca9539Config = {0}; -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_TCA9539_Local_Functions EV_HC32F4A0_LQFP176 TCA9539 Local Functions - * @{ - */ - -/** - * @brief BSP TCA9539 reset. - * @param None - * @retval None - */ -static void BSP_TCA9539_Reset(void) -{ - stc_gpio_init_t stcGpioInit; - - /* Set to low before output enable */ - GPIO_ResetPins(EIO_RST_PORT, EIO_RST_PIN); - (void)GPIO_StructInit(&stcGpioInit); - /* SET to output */ - stcGpioInit.u16PinDir = PIN_DIR_OUT; - (void)GPIO_Init(EIO_RST_PORT, EIO_RST_PIN, &stcGpioInit); - /* Reset the device */ - DDL_DelayMS(3UL); - GPIO_SetPins(EIO_RST_PORT, EIO_RST_PIN); -} - -/** - * @brief Initializes I2C for TCA9539. - * @param None - * @retval None - */ -static void BSP_TCA9539_I2C_Init(void) -{ - stc_gpio_init_t stcGpioInit; - /* Configuration I2C GPIO */ - (void)GPIO_StructInit(&stcGpioInit); - (void)GPIO_Init(BSP_TCA9539_I2C_SCL_PORT, BSP_TCA9539_I2C_SCL_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_TCA9539_I2C_SDA_PORT, BSP_TCA9539_I2C_SDA_PIN, &stcGpioInit); - GPIO_SetFunc(BSP_TCA9539_I2C_SCL_PORT, BSP_TCA9539_I2C_SCL_PIN, BSP_TCA9539_I2C_SCL_FUNC); - GPIO_SetFunc(BSP_TCA9539_I2C_SDA_PORT, BSP_TCA9539_I2C_SDA_PIN, BSP_TCA9539_I2C_SDA_FUNC); - /* Enable I2C Peripheral*/ - FCG_Fcg1PeriphClockCmd(BSP_TCA9539_I2C_FCG, ENABLE); - (void)BSP_I2C_Init(BSP_TCA9539_I2C_UNIT); -} - -/** - * @brief BSP TCA9539 write data. - * @param [in] pu8Reg: Register to be written. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be written. - * @param [in] u32Len: Buffer size in byte. - * @retval None - */ -static void BSP_TCA9539_I2C_Write(const uint8_t *pu8Reg, const uint8_t *pu8Buf, uint32_t u32Len) -{ - (void)BSP_I2C_Write(BSP_TCA9539_I2C_UNIT, BSP_TCA9539_DEV_ADDR, pu8Reg, BSP_TCA9539_REG_ADDR_LEN, pu8Buf, u32Len); -} - -/** - * @brief BSP TCA9539 Read data. - * @param [in] pu8Reg: Register to be read. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be read. - * @param [in] u32Len: Buffer size in byte. - * @retval None - */ -static void BSP_TCA9539_I2C_Read(const uint8_t *pu8Reg, uint8_t *pu8Buf, uint32_t u32Len) -{ - (void)BSP_I2C_Read(BSP_TCA9539_I2C_UNIT, BSP_TCA9539_DEV_ADDR, pu8Reg, BSP_TCA9539_REG_ADDR_LEN, pu8Buf, u32Len); -} -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_TCA9539_Global_Functions EV_HC32F4A0_LQFP176 TCA9539 Global Functions - * @{ - */ - -/** - * @brief Expand IO initialize. - * @param None - * @retval None - */ -void BSP_IO_Init(void) -{ - /* Configuration the low layer of TCA9539 */ - m_stcTca9539Config.Init = BSP_TCA9539_I2C_Init; - m_stcTca9539Config.Write = BSP_TCA9539_I2C_Write; - m_stcTca9539Config.Read = BSP_TCA9539_I2C_Read; - m_stcTca9539Config.Reset = BSP_TCA9539_Reset; - m_stcTca9539Config.IntInit = NULL; - /* Configuration the TCA9539 */ - (void)TCA9539_Init(&m_stcTca9539Config); -} - -/** - * @brief Expand IO interrupt initialize. - * @param None - * @retval None - */ -void BSP_IO_IntInit(void) -{ - (void)TCA9539_IntInit(&m_stcTca9539Config); -} - -/** - * @brief Set EIO port pin output value - * @param [in] u8Port Port number @ref HC32F4A0_EV_IO_Port_Definition. - * @param [in] u8Pin Pin number @ref HC32F4A0_EV_IO_Function_Sel. - * @param [in] u8PinState Pin state @ref HC32F4A0_EV_IO_Pin_State_Definition. - * @retval None - */ -void BSP_IO_WritePortPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState) -{ - (void)TCA9539_WritePin(&m_stcTca9539Config, u8Port, u8Pin, u8PinState); -} - -/** - * @brief Get EIO port pin input value - * @param [in] u8Port Port number @ref HC32F4A0_EV_IO_Port_Definition. - * @param [in] u8Pin Pin number @ref HC32F4A0_EV_IO_Function_Sel. - * @retval Pin state - */ -uint8_t BSP_IO_ReadPortPin(uint8_t u8Port, uint8_t u8Pin) -{ - uint8_t u8Value; - - (void)TCA9539_ReadPin(&m_stcTca9539Config, u8Port, u8Pin, &u8Value); - return u8Value; -} - -/** - * @brief Toggle EIO port pin - * @param [in] u8Port Port number @ref HC32F4A0_EV_IO_Port_Definition. - * @param [in] u8Pin Pin number @ref HC32F4A0_EV_IO_Function_Sel. - * @retval None - */ -void BSP_IO_TogglePortPin(uint8_t u8Port, uint8_t u8Pin) -{ - (void)TCA9539_TogglePin(&m_stcTca9539Config, u8Port, u8Pin); -} - -/** - * @brief Config EIO port pin direction - * @param [in] u8Port Port number @ref HC32F4A0_EV_IO_Port_Definition. - * @param [in] u8Pin Pin number @ref HC32F4A0_EV_IO_Function_Sel. - * @param [in] u8Dir Pin direction @ref HC32F4A0_EV_IO_Direction_Definition. - * @retval None - */ -void BSP_IO_ConfigPortPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8Dir) -{ - (void)TCA9539_ConfigPin(&m_stcTca9539Config, u8Port, u8Pin, u8Dir); -} - -/** - * @brief CAM initialize. - * @param None - * @retval None - */ -void BSP_CAM_IO_Init(void) -{ - /* Init camera and touch panel control IO before direction setting */ - BSP_IO_WritePortPin(CAM_PORT, (CAM_RST_PIN | CAM_STB_PIN), EIO_PIN_RESET); - /* CAM pins set to output */ - BSP_IO_ConfigPortPin(CAM_PORT, (CAM_RST_PIN | CAM_STB_PIN), EIO_DIR_OUT); -} - -/** - * @brief CAM reset pin config. - * @param [in] u8Cmd - * @arg EIO_PIN_SET - * @arg EIO_PIN_RESET - * @retval None - */ -void BSP_CAM_RSTCmd(uint8_t u8Cmd) -{ - BSP_IO_WritePortPin(CAM_PORT, CAM_RST_PIN, u8Cmd); -} - -/** - * @brief CAM standby pin config. - * @param [in] u8Cmd - * @arg EIO_PIN_SET - * @arg EIO_PIN_RESET - * @retval None - */ -void BSP_CAM_STBCmd(uint8_t u8Cmd) -{ - BSP_IO_WritePortPin(CAM_PORT, CAM_STB_PIN, u8Cmd); -} - -/** - * @brief CAN PYH STB pin initialization. - * @param None - * @retval None - */ -void BSP_CAN_STB_IO_Init(void) -{ - /* SET STB pin high before output */ - BSP_IO_WritePortPin(CAN_STB_PORT, CAN_STB_PIN, EIO_PIN_SET); - /* STB pin set to output */ - BSP_IO_ConfigPortPin(CAN_STB_PORT, CAN_STB_PIN, EIO_DIR_OUT); -} - -/** - * @brief CAN PYH STB pin control - * @param [in] u8Cmd - * @arg EIO_PIN_SET - * @arg EIO_PIN_RESET - * @retval None - */ -void BSP_CAN_STBCmd(uint8_t u8Cmd) -{ - BSP_IO_WritePortPin(CAN_STB_PORT, CAN_STB_PIN, u8Cmd); -} - -/** - * @brief Cap panel reset pin config. - * @param [in] u8Cmd - * @arg EIO_PIN_SET - * @arg EIO_PIN_RESET - * @retval None - */ -void BSP_CT_RSTCmd(uint8_t u8Cmd) -{ - BSP_IO_ConfigPortPin(LCD_CTRST_PORT, LCD_CTRST_PIN, EIO_DIR_OUT); - BSP_IO_WritePortPin(LCD_CTRST_PORT, LCD_CTRST_PIN, u8Cmd); - BSP_IO_ConfigPortPin(LCD_CTRST_PORT, LCD_CTRST_PIN, EIO_DIR_IN); -} - -/** - * @brief LCD ctrl IO initialize. - * @param None - * @retval None - */ -void BSP_LCD_IO_Init(void) -{ - /* Init LCD backlight IO */ - GPIO_OutputCmd(LCD_BKL_PORT, LCD_BKL_PIN, ENABLE); - - /* Init LCD control IO before direction setting */ - BSP_IO_WritePortPin(LCD_RST_PORT, LCD_RST_PIN, EIO_PIN_SET); - - /* LCD panel control IO set to output */ - BSP_IO_ConfigPortPin(LCD_RST_PORT, LCD_RST_PIN, EIO_DIR_OUT); - - /* Init touch panel control IO before direction setting */ - BSP_IO_WritePortPin(LCD_CTRST_PORT, LCD_CTRST_PIN, EIO_PIN_RESET); - BSP_IO_WritePortPin(LCD_CTINT_PORT, LCD_CTINT_PIN, EIO_PIN_RESET); - - BSP_IO_ConfigPortPin(LCD_CTRST_PORT, LCD_CTRST_PIN, EIO_DIR_OUT); - BSP_IO_ConfigPortPin(LCD_CTINT_PORT, LCD_CTINT_PIN, EIO_DIR_OUT); - DDL_DelayMS(100UL); - - BSP_IO_WritePortPin(LCD_CTINT_PORT, LCD_CTINT_PIN, EIO_PIN_SET); - DDL_DelayMS(100UL); - - BSP_IO_WritePortPin(LCD_CTRST_PORT, LCD_CTRST_PIN, EIO_PIN_SET); - DDL_DelayMS(10UL); - - BSP_IO_WritePortPin(LCD_CTINT_PORT, LCD_CTINT_PIN, EIO_PIN_RESET); - DDL_DelayMS(100UL); - - BSP_IO_ConfigPortPin(LCD_CTRST_PORT, LCD_CTRST_PIN, EIO_DIR_IN); - BSP_IO_ConfigPortPin(LCD_CTINT_PORT, LCD_CTINT_PIN, EIO_DIR_IN); -} - -/** - * @brief LCD reset pin config. - * @param [in] u8Cmd - * @arg EIO_PIN_SET - * @arg EIO_PIN_RESET - * @retval None - */ -void BSP_LCD_RSTCmd(uint8_t u8Cmd) -{ - BSP_IO_WritePortPin(LCD_RST_PORT, LCD_RST_PIN, u8Cmd); -} - -/** - * @brief LCD backlight pin config. - * @param [in] u8Cmd - * @arg EIO_PIN_SET - * @arg EIO_PIN_RESET - * @retval None - */ -void BSP_LCD_BKLCmd(uint8_t u8Cmd) -{ - if (EIO_PIN_SET == u8Cmd) { - GPIO_SetPins(LCD_BKL_PORT, LCD_BKL_PIN); - } else { - GPIO_ResetPins(LCD_BKL_PORT, LCD_BKL_PIN); - } -} - -/** - * @brief LED initialize. - * @param None - * @retval None - */ -void BSP_LED_Init(void) -{ - /* Turn off LED before output */ - BSP_IO_WritePortPin(LED_PORT, (LED_RED_PIN | LED_YELLOW_PIN | LED_BLUE_PIN), LED_OFF); - /* LED pins set to output */ - BSP_IO_ConfigPortPin(LED_PORT, (LED_RED_PIN | LED_YELLOW_PIN | LED_BLUE_PIN), EIO_DIR_OUT); -} - -/** - * @brief Turn on LEDs. - * @param [in] u8Led LED - * @arg LED_RED - * @arg LED_YELLOW - * @arg LED_BLUE - * @retval None - */ -void BSP_LED_On(uint8_t u8Led) -{ - BSP_IO_WritePortPin(LED_PORT, u8Led, LED_ON); -} - -/** - * @brief Turn off LEDs. - * @param [in] u8Led LED - * @arg LED_RED - * @arg LED_YELLOW - * @arg LED_BLUE - * @retval None - */ -void BSP_LED_Off(uint8_t u8Led) -{ - BSP_IO_WritePortPin(LED_PORT, u8Led, LED_OFF); -} - -/** - * @brief Toggle LEDs. - * @param [in] u8Led LED - * @arg LED_RED - * @arg LED_YELLOW - * @arg LED_BLUE - * @retval None - */ -void BSP_LED_Toggle(uint8_t u8Led) -{ - BSP_IO_TogglePortPin(LED_PORT, u8Led); -} - -/** - * @} - */ - -#endif /* BSP_TCA9539_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_tca9539.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_tca9539.h deleted file mode 100644 index 25ea530b66c..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_tca9539.h +++ /dev/null @@ -1,320 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_tca9539.h - * @brief This file contains all the functions prototypes of the - * ev_hc32f4a0_lqfp176_tca9539 driver library. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2023-01-15 CDT Add macro-define:LIN & smartcard - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_TCA9539_H__ -#define __EV_HC32F4A0_LQFP176_TCA9539_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "tca9539.h" -#include "ev_hc32f4a0_lqfp176.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_TCA9539 - * @{ - */ - -#if ((BSP_TCA9539_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/** - * @defgroup EV_HC32F4A0_LQFP176_TCA9539_Global_Macros EV_HC32F4A0_LQFP176 TCA9539 Global Macros - * @{ - */ -/** - * @defgroup BSP_TCA9539_I2C_Configure BSP TCA9539 I2C Configure - * @{ - */ -#define EIO_RST_PORT (GPIO_PORT_C) -#define EIO_RST_PIN (GPIO_PIN_13) - -/* I2C unit define */ -#define BSP_TCA9539_I2C_UNIT (CM_I2C1) -#define BSP_TCA9539_I2C_FCG (FCG1_PERIPH_I2C1) - -/* Define port and pin for SDA and SCL */ -#define BSP_TCA9539_I2C_SCL_PORT (GPIO_PORT_D) -#define BSP_TCA9539_I2C_SCL_PIN (GPIO_PIN_03) -#define BSP_TCA9539_I2C_SDA_PORT (GPIO_PORT_F) -#define BSP_TCA9539_I2C_SDA_PIN (GPIO_PIN_10) -#define BSP_TCA9539_I2C_SCL_FUNC (GPIO_FUNC_49) -#define BSP_TCA9539_I2C_SDA_FUNC (GPIO_FUNC_48) - -/* Define for TCA9539 */ -#define BSP_TCA9539_DEV_ADDR (0x74U) -#define BSP_TCA9539_REG_ADDR_LEN (1U) -/** - * @} - */ - -/** - * @defgroup HC32F4A0_EV_IO_Exported_Constants IO Exported Constants - * @{ - */ - -/** - * @defgroup HC32F4A0_EV_IO_Port_Definition HC32F4A0_EV_IO Port Definition - * @{ - */ -#define EIO_PORT0 (TCA9539_IO_PORT0) -#define EIO_PORT1 (TCA9539_IO_PORT1) -/** - * @} - */ - -/** - * @defgroup HC32F4A0_EV_IO_Direction_Definition HC32F4A0_EV_IO Direction Definition - * @{ - */ -#define EIO_DIR_OUT (TCA9539_DIR_OUT) -#define EIO_DIR_IN (TCA9539_DIR_IN) -/** - * @} - */ - -/** - * @defgroup HC32F4A0_EV_IO_Pin_State_Definition HC32F4A0_EV_IO Pin State Definition - * @{ - */ -#define EIO_PIN_RESET (TCA9539_PIN_RESET) -#define EIO_PIN_SET (TCA9539_PIN_SET) -/** - * @} - */ - -/** - * @defgroup HC32F4A0_EV_IO_Function_Sel Expand IO function definition - * @{ - */ -#define EIO_USBFS_OC (TCA9539_IO_PIN0) /* USBFS over-current, input */ -#define EIO_USBHS_OC (TCA9539_IO_PIN1) /* USBHS over-current, input */ -#define EIO_SDIC1_CD (TCA9539_IO_PIN2) /* SDIC1 card detect, input */ -#define EIO_SCI_CD (TCA9539_IO_PIN3) /* Smart card detect, input */ -#define EIO_TOUCH_INT (TCA9539_IO_PIN4) /* Touch screen interrupt, input */ -#define EIO_LIN_SLEEP (TCA9539_IO_PIN5) /* LIN PHY sleep, output */ -#define EIO_RTCS_CTRST (TCA9539_IO_PIN6) /* 'CS' for Resistor touch panel or 'Reset' for Cap touch panel, output */ -#define EIO_LCD_RST (TCA9539_IO_PIN7) /* LCD panel reset, output */ - -#define EIO_CAM_RST (TCA9539_IO_PIN0) /* Camera module reset, output */ -#define EIO_CAM_STB (TCA9539_IO_PIN1) /* Camera module standby, output */ -#define EIO_USB3300_RST (TCA9539_IO_PIN2) /* USBHS PHY USB3300 reset, output */ -#define EIO_ETH_RST (TCA9539_IO_PIN3) /* ETH PHY reset, output */ -#define EIO_CAN_STB (TCA9539_IO_PIN4) /* CAN PHY standby, output */ -#define EIO_LED_RED (TCA9539_IO_PIN5) /* Red LED, output */ -#define EIO_LED_YELLOW (TCA9539_IO_PIN6) /* Yellow LED, output */ -#define EIO_LED_BLUE (TCA9539_IO_PIN7) /* Blue LED, output */ -/** - * @} - */ - -/** - * @defgroup BSP_CAM_PortPin_Sel BSP Camera port/pin definition - * @{ - */ -#define CAM_PORT (EIO_PORT1) -#define CAM_RST_PORT (EIO_PORT1) -#define CAM_RST_PIN (EIO_CAM_RST) -#define CAM_STB_PORT (EIO_PORT1) -#define CAM_STB_PIN (EIO_CAM_STB) -/** - * @} - */ - -/** - * @defgroup BSP_CAN_PortPin_Sel BSP CAN PHY STB port/pin definition - * @{ - */ -#define CAN_STB_PORT (EIO_PORT1) -#define CAN_STB_PIN (EIO_CAN_STB) -/** - * @} - */ - -/** - * @defgroup BSP_LCD_PortPin_Sel BSP LCD panel port/pin definition - * @{ - */ -#define LCD_RST_PORT (EIO_PORT0) -#define LCD_RST_PIN (EIO_LCD_RST) -#define LCD_RTCS_PORT (EIO_PORT0) -#define LCD_RTCS_PIN (EIO_RTCS_CTRST) -#define LCD_CTRST_PORT (EIO_PORT0) -#define LCD_CTRST_PIN (EIO_RTCS_CTRST) -#define LCD_CTINT_PORT (EIO_PORT0) -#define LCD_CTINT_PIN (EIO_TOUCH_INT) -#define LCD_BKL_PORT (GPIO_PORT_I) -#define LCD_BKL_PIN (GPIO_PIN_00) -/** - * @} - */ - -/** - * @defgroup BSP_LED_PortPin_Sel BSP LED port/pin definition - * @{ - */ -#define LED_PORT (EIO_PORT1) -#define LED_RED_PORT (EIO_PORT1) -#define LED_RED_PIN (EIO_LED_RED) -#define LED_YELLOW_PORT (EIO_PORT1) -#define LED_YELLOW_PIN (EIO_LED_YELLOW) -#define LED_BLUE_PORT (EIO_PORT1) -#define LED_BLUE_PIN (EIO_LED_BLUE) -/** - * @} - */ - -/** - * @defgroup BSP_LED_Sel BSP LED definition - * @{ - */ -#define LED_RED (EIO_LED_RED) -#define LED_YELLOW (EIO_LED_YELLOW) -#define LED_BLUE (EIO_LED_BLUE) -#define LED_ALL (LED_RED | LED_YELLOW | LED_BLUE) -/** - * @} - */ - -/** - * @defgroup BSP_LED_OnOff_Sel BSP LED ON/OFF definition - * @{ - */ -#define LED_OFF (EIO_PIN_RESET) -#define LED_ON (EIO_PIN_SET) -/** - * @} - */ - -/** - * @defgroup BSP_LIN_PHY_PortPin_Sel BSP LIN phy port/pin definition - * @{ - */ -#define LIN_SLEEP_PORT (EIO_PORT0) -#define LIN_SLEEP_PIN (EIO_LIN_SLEEP) -/** - * @} - */ - -/** - * @defgroup BSP_Smartcard_PortPin_Sel BSP smartcard port/pin definition - * @{ - */ -#define SMARTCARD_CD_PORT (EIO_PORT0) -#define SMARTCARD_CD_PIN (EIO_SCI_CD) -/** - * @} - */ -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_TCA9539_Global_Functions - * @{ - */ -void BSP_IO_Init(void); -void BSP_IO_IntInit(void); - -void BSP_IO_WritePortPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8PinState); -void BSP_IO_ConfigPortPin(uint8_t u8Port, uint8_t u8Pin, uint8_t u8Dir); -uint8_t BSP_IO_ReadPortPin(uint8_t u8Port, uint8_t u8Pin); -void BSP_IO_TogglePortPin(uint8_t u8Port, uint8_t u8Pin); - -void BSP_CAM_IO_Init(void); -void BSP_CAM_RSTCmd(uint8_t u8Cmd); -void BSP_CAM_STBCmd(uint8_t u8Cmd); - -void BSP_CAN_STB_IO_Init(void); -void BSP_CAN_STBCmd(uint8_t u8Cmd); - -void BSP_CT_RSTCmd(uint8_t u8Cmd); - -void BSP_LCD_IO_Init(void); -void BSP_LCD_RSTCmd(uint8_t u8Cmd); -void BSP_LCD_BKLCmd(uint8_t u8Cmd); - -void BSP_LED_Init(void); -void BSP_LED_On(uint8_t u8Led); -void BSP_LED_Off(uint8_t u8Led); -void BSP_LED_Toggle(uint8_t u8Led); - -/** - * @} - */ - -#endif /* BSP_TCA9539_ENABLE && BSP_EV_HC32F4A0_LQFP176 */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_TCA9539__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_w25qxx.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_w25qxx.c deleted file mode 100644 index c5316bac945..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_w25qxx.c +++ /dev/null @@ -1,336 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_w25qxx.c - * @brief This file provides firmware functions for QSPI/SPI NOR W25QXX. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2022-10-31 CDT Initialize CS state - 2023-09-30 CDT Modify the IO properties of SPI - Modify for MISRAC2012 - Modify SPI clock divide factor from DIV4 to DIV64 - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "ev_hc32f4a0_lqfp176_w25qxx.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_W25QXX EV_HC32F4A0_LQFP176 W25QXX - * @{ - */ - -#if ((BSP_W25QXX_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ -static void BSP_SPI_Init(void); -static void BSP_SPI_DeInit(void); -static void BSP_SPI_Active(void); -static void BSP_SPI_Inactive(void); -static int32_t BSP_SPI_Trans(const uint8_t *pu8TxBuf, uint32_t u32Size); -static int32_t BSP_SPI_Receive(uint8_t *pu8RxBuf, uint32_t u32Size); - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_W25QXX_Local_Variables EV_HC32F4A0_LQFP176 W25QXX Local Variables - * @{ - */ -static stc_w25qxx_ll_t m_stcW25qxxLL = { - .Delay = DDL_DelayMS, - .Init = BSP_SPI_Init, - .DeInit = BSP_SPI_DeInit, - .Active = BSP_SPI_Active, - .Inactive = BSP_SPI_Inactive, - .Trans = BSP_SPI_Trans, - .Receive = BSP_SPI_Receive, -}; -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_W25QXX_Local_Functions EV_HC32F4A0_LQFP176 W25QXX Local Functions - * @{ - */ - -/** - * @brief SPI CS active. - * @param None - * @retval None - */ -static void BSP_SPI_Active(void) -{ - BSP_SPI_CS_ACTIVE(); -} - -/** - * @brief SPI CS inactive. - * @param None - * @retval None - */ -static void BSP_SPI_Inactive(void) -{ - BSP_SPI_CS_INACTIVE(); -} - -/** - * @brief Initializes the BSP SPI interface. - * @param None - * @retval None - */ -static void BSP_SPI_Init(void) -{ - stc_gpio_init_t stcGpioInit; - stc_spi_init_t stcSpiInit; - stc_spi_delay_t stcSpiDelayCfg; - - (void)GPIO_StructInit(&stcGpioInit); - stcGpioInit.u16PinDrv = PIN_HIGH_DRV; - stcGpioInit.u16PinInputType = PIN_IN_TYPE_CMOS; - (void)GPIO_Init(BSP_SPI_CS_PORT, BSP_SPI_CS_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_SPI_SCK_PORT, BSP_SPI_SCK_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_SPI_MOSI_PORT, BSP_SPI_MOSI_PIN, &stcGpioInit); - stcGpioInit.u16PinDir = PIN_DIR_OUT; - stcGpioInit.u16PinState = PIN_STAT_SET; - (void)GPIO_Init(BSP_SPI_CS_PORT, BSP_SPI_CS_PIN, &stcGpioInit); - - GPIO_SetFunc(BSP_SPI_SCK_PORT, BSP_SPI_SCK_PIN, BSP_SPI_SCK_PIN_FUNC); - GPIO_SetFunc(BSP_SPI_MOSI_PORT, BSP_SPI_MOSI_PIN, BSP_SPI_MOSI_PIN_FUNC); - GPIO_SetFunc(BSP_SPI_MISO_PORT, BSP_SPI_MISO_PIN, BSP_SPI_MISO_PIN_FUNC); - - /* Clear initialize structure */ - (void)SPI_StructInit(&stcSpiInit); - (void)SPI_DelayStructInit(&stcSpiDelayCfg); - - /* Configure peripheral clock */ - FCG_Fcg1PeriphClockCmd(BSP_SPI_PERIPH_CLK, ENABLE); - - /* SPI De-initialize */ - (void)SPI_DeInit(BSP_SPI_UNIT); - /* Configuration SPI structure */ - stcSpiInit.u32WireMode = SPI_3_WIRE; - stcSpiInit.u32TransMode = SPI_FULL_DUPLEX; - stcSpiInit.u32MasterSlave = SPI_MASTER; - stcSpiInit.u32ModeFaultDetect = SPI_MD_FAULT_DETECT_DISABLE; - stcSpiInit.u32Parity = SPI_PARITY_INVD; - stcSpiInit.u32SpiMode = SPI_MD_0; - stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV64; - stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT; - stcSpiInit.u32FirstBit = SPI_FIRST_MSB; - (void)SPI_Init(BSP_SPI_UNIT, &stcSpiInit); - - stcSpiDelayCfg.u32IntervalDelay = SPI_INTERVAL_TIME_8SCK; - stcSpiDelayCfg.u32ReleaseDelay = SPI_RELEASE_TIME_8SCK; - stcSpiDelayCfg.u32SetupDelay = SPI_SETUP_TIME_1SCK; - (void)SPI_DelayTimeConfig(BSP_SPI_UNIT, &stcSpiDelayCfg); - SPI_Cmd(BSP_SPI_UNIT, ENABLE); -} - -/** - * @brief De-Initialize the BSP SPI interface. - * @param None - * @retval None - */ -static void BSP_SPI_DeInit(void) -{ - /* SPI De-initialize */ - (void)SPI_DeInit(BSP_SPI_UNIT); -} - -/** - * @brief BSP SPI transmit data. - * @param [in] pu8TxBuf The data buffer that to be transmitted. - * @param [in] u32Size Number of data bytes to be transmitted. - * @retval int32_t: - * - LL_OK: Data transmission successful. - * - LL_ERR_TIMEOUT: Data transmission timeout. - */ -static int32_t BSP_SPI_Trans(const uint8_t *pu8TxBuf, uint32_t u32Size) -{ - return SPI_Trans(BSP_SPI_UNIT, pu8TxBuf, u32Size, BSP_SPI_TIMEOUT); -} - -/** - * @brief BSP SPI receive data. - * @param [in] pu8RxBuf The buffer that received data to be stored. - * @param [in] u32Size Number of data bytes to be received. - * @retval int32_t: - * - LL_OK: Data receive successful. - * - LL_ERR_TIMEOUT: Data receive timeout. - */ -static int32_t BSP_SPI_Receive(uint8_t *pu8RxBuf, uint32_t u32Size) -{ - return SPI_Receive(BSP_SPI_UNIT, pu8RxBuf, u32Size, BSP_SPI_TIMEOUT); -} - -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_W25QXX_Global_Functions EV_HC32F4A0_LQFP176 W25QXX Global Functions - * @{ - */ - -/** - * @brief Initializes BSP W25QXX. - * @param None - * @retval None - */ -void BSP_W25QXX_Init(void) -{ - (void)W25QXX_Init(&m_stcW25qxxLL); -} - -/** - * @brief De-Initializes BSP W25QXX. - * @param None - * @retval None - */ -void BSP_W25QXX_DeInit(void) -{ - (void)W25QXX_DeInit(&m_stcW25qxxLL); -} - -/** - * @brief Writes an amount of data to W25QXX via SPI interface. - * @param [in] u32Addr Write start address. - * @param [in] pu8Data Pointer to data to be written. - * @param [in] u32NumByteToWrite Size of data to write. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout or W25QXX timeout. - */ -int32_t BSP_W25QXX_Write(uint32_t u32Addr, const uint8_t *pu8Data, uint32_t u32NumByteToWrite) -{ - uint32_t u32TempSize; - uint32_t u32AddrOfst = 0UL; - int32_t i32Ret = LL_ERR_INVD_PARAM; - - DDL_ASSERT((u32Addr + u32NumByteToWrite) <= W25Q64_MAX_ADDR); - - if ((pu8Data != NULL) && (u32NumByteToWrite > 0UL)) { - while (u32NumByteToWrite != 0UL) { - if (u32NumByteToWrite >= W25Q64_PAGE_SIZE) { - u32TempSize = W25Q64_PAGE_SIZE; - } else { - u32TempSize = u32NumByteToWrite; - } - - i32Ret = W25QXX_PageProgram(&m_stcW25qxxLL, u32Addr, (const uint8_t *)&pu8Data[u32AddrOfst], u32TempSize); - if (i32Ret != LL_OK) { - break; - } - u32NumByteToWrite -= u32TempSize; - u32AddrOfst += u32TempSize; - u32Addr += u32TempSize; - } - } - - return i32Ret; -} - -/** - * @brief Reads an amount of data to W25QXX via SPI interface. - * @param [in] u32Addr Read start address. - * @param [in] pu8Data Pointer to data to be read. - * @param [in] u32NumByteToRead Size of data to read. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_INVD_PARAM: Invalid parameter. - * - LL_ERR_TIMEOUT: SPI timeout or W25QXX timeout. - */ -int32_t BSP_W25QXX_Read(uint32_t u32Addr, uint8_t *pu8Data, uint32_t u32NumByteToRead) -{ - DDL_ASSERT((u32Addr + u32NumByteToRead) <= W25Q64_MAX_ADDR); - return W25QXX_ReadData(&m_stcW25qxxLL, u32Addr, pu8Data, u32NumByteToRead); -} - -/** - * @brief Erases specified sector of W25QXX. - * @param [in] u32Addr Any address of the specified sector. - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout or W25QXX timeout. - */ -int32_t BSP_W25QXX_EraseSector(uint32_t u32Addr) -{ - DDL_ASSERT(u32Addr < W25Q64_MAX_ADDR); - return W25QXX_EraseSector(&m_stcW25qxxLL, u32Addr); -} - -/** - * @brief Erases W25QXX whole chip. - * @param None - * @retval int32_t: - * - LL_OK: No error occurred. - * - LL_ERR_TIMEOUT: SPI timeout or W25QXX timeout. - */ -int32_t BSP_W25QXX_EraseChip(void) -{ - return W25QXX_EraseChip(&m_stcW25qxxLL); -} - -/** - * @} - */ - -#endif /* (BSP_W25QXX_ENABLE && BSP_EV_HC32F4A0_LQFP176) */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_w25qxx.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_w25qxx.h deleted file mode 100644 index ce77ab49df4..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_w25qxx.h +++ /dev/null @@ -1,171 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_w25qxx.h - * @brief This file contains all the functions prototypes of the - ev_hc32f4a0_lqfp176_w25qxx driver library. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2023-09-30 CDT Modify 'BSP_SPI_TIMEOUT' to HCLK_VALUE - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_W25QXX_H__ -#define __EV_HC32F4A0_LQFP176_W25QXX_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "w25qxx.h" -#include "ev_hc32f4a0_lqfp176.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_W25QXX - * @{ - */ - -#if ((BSP_W25QXX_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_W25QXX_Global_Macros EV_HC32F4A0_LQFP176 W25QXX Global Macros - * @{ - */ - -/** - * @defgroup BSP_SPI_Port BSP SPI Port - * @{ - */ -#define BSP_SPI_CS_PORT (GPIO_PORT_C) -#define BSP_SPI_CS_PIN (GPIO_PIN_07) -#define BSP_SPI_CS_ACTIVE() GPIO_ResetPins(BSP_SPI_CS_PORT, BSP_SPI_CS_PIN) -#define BSP_SPI_CS_INACTIVE() GPIO_SetPins(BSP_SPI_CS_PORT, BSP_SPI_CS_PIN) - -#define BSP_SPI_SCK_PORT (GPIO_PORT_C) -#define BSP_SPI_SCK_PIN (GPIO_PIN_06) -#define BSP_SPI_SCK_PIN_FUNC (GPIO_FUNC_40) /*!< SPI1 SCK */ - -#define BSP_SPI_MOSI_PORT (GPIO_PORT_B) /*!< W25Qxx IO0 */ -#define BSP_SPI_MOSI_PIN (GPIO_PIN_13) -#define BSP_SPI_MOSI_PIN_FUNC (GPIO_FUNC_41) /*!< SPI1 MOSI */ - -#define BSP_SPI_MISO_PORT (GPIO_PORT_B) /*!< W25Qxx IO1 */ -#define BSP_SPI_MISO_PIN (GPIO_PIN_12) -#define BSP_SPI_MISO_PIN_FUNC (GPIO_FUNC_42) /*!< SPI1 MISO */ -/** - * @} - */ - -/** - * @defgroup W25Qxx_SPI_Instance W25Qxx SPI Instance - * @{ - */ -#define BSP_SPI_UNIT CM_SPI1 -#define BSP_SPI_PERIPH_CLK FCG1_PERIPH_SPI1 -/** - * @} - */ - -/** - * @defgroup W25Qxx_SPI_Timeout W25Qxx SPI Timeout - * @{ - */ -#define BSP_SPI_TIMEOUT (HCLK_VALUE) -/** - * @} - */ - -/** - * @defgroup W25Q64_Size W25Q64 Size - * @{ - */ -#define W25Q64_PAGE_SIZE (256UL) -#define W25Q64_SECTOR_SIZE (1024UL * 4UL) -#define W25Q64_BLOCK_SIZE (1024UL * 64UL) -#define W25Q64_PAGE_PER_SECTOR (W25Q64_SECTOR_SIZE / W25Q64_PAGE_SIZE) -#define W25Q64_MAX_ADDR (0x800000UL) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_W25QXX_Global_Functions - * @{ - */ - -void BSP_W25QXX_Init(void); -void BSP_W25QXX_DeInit(void); -int32_t BSP_W25QXX_Write(uint32_t u32Addr, const uint8_t *pu8Data, uint32_t u32NumByteToWrite); -int32_t BSP_W25QXX_Read(uint32_t u32Addr, uint8_t *pu8Data, uint32_t u32NumByteToRead); -int32_t BSP_W25QXX_EraseSector(uint32_t u32Addr); -int32_t BSP_W25QXX_EraseChip(void); - -/** - * @} - */ - -#endif /* (BSP_W25QXX_ENABLE && BSP_EV_HC32F4A0_LQFP176) */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_W25QXX_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_wm8731.c b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_wm8731.c deleted file mode 100644 index df838d7ec4d..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_wm8731.c +++ /dev/null @@ -1,395 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_wm8731.c - * @brief This file provides configure functions for wm8731 of the board - * EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - 2023-09-30 CDT Rename local variables: stcWm8731Config -> m_stcWm8731Config - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "ev_hc32f4a0_lqfp176_wm8731.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_WM8731 EV_HC32F4A0_LQFP176 WM8731 - * @{ - */ - -#if ((BSP_WM8731_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Local type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Local pre-processor symbols/macros ('#define') - ******************************************************************************/ - -/******************************************************************************* - * Global variable definitions (declared in header file with 'extern') - ******************************************************************************/ - -/******************************************************************************* - * Local function prototypes ('static') - ******************************************************************************/ - -/******************************************************************************* - * Local variable definitions ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_WM8731_Local_Variables EV_HC32F4A0_LQFP176 WM8731 Local Variables - * @{ - */ -static stc_wm8731_ll_t m_stcWm8731Config = {0}; -/** - * @} - */ - -/******************************************************************************* - * Function implementation - global ('extern') and local ('static') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_WM8731_Local_Functions EV_HC32F4A0_LQFP176 WM8731 Local Functions - * @{ - */ - -/** - * @brief Initializes I2C for WM8731. - * @param None - * @retval None - */ -static void BSP_WM8731_I2C_Init(void) -{ - stc_gpio_init_t stcGpioInit; - - /* Configuration I2C GPIO */ - (void)GPIO_StructInit(&stcGpioInit); - (void)GPIO_Init(BSP_WM8731_I2C_SCL_PORT, BSP_WM8731_I2C_SCL_PIN, &stcGpioInit); - (void)GPIO_Init(BSP_WM8731_I2C_SDA_PORT, BSP_WM8731_I2C_SDA_PIN, &stcGpioInit); - GPIO_SetFunc(BSP_WM8731_I2C_SCL_PORT, BSP_WM8731_I2C_SCL_PIN, BSP_WM8731_I2C_SCL_FUNC); - GPIO_SetFunc(BSP_WM8731_I2C_SDA_PORT, BSP_WM8731_I2C_SDA_PIN, BSP_WM8731_I2C_SDA_FUNC); - /* Enable I2C Peripheral*/ - FCG_Fcg1PeriphClockCmd(BSP_WM8731_I2C_FCG, ENABLE); - (void)BSP_I2C_Init(BSP_WM8731_I2C_UNIT); -} - -/** - * @brief BSP WM8731 write data. - * @param [in] pu8Reg: The register value to be write. - * @param [in] pu8Buf: The pointer to the buffer contains the data to be write. - * @param [in] u32Len: Buffer size in byte. - * @retval None - */ -static void BSP_WM8731_I2C_Write(const uint8_t *pu8Reg, const uint8_t *pu8Buf, uint32_t u32Len) -{ - (void)BSP_I2C_Write(BSP_WM8731_I2C_UNIT, BSP_WM8731_DEV_ADDR, pu8Reg, BSP_WM8731_REG_ADDR_LEN, pu8Buf, u32Len); -} -/** - * @} - */ - -/** - * @defgroup EV_HC32F4A0_LQFP176_WM8731_Global_Functions EV_HC32F4A0_LQFP176 WM8731 Global Functions - * @{ - */ -/** - * @brief De-initialize the WM8731. - * @retval None - */ -void BSP_WM8731_DeInit(void) -{ - (void)WM8731_Reset(&m_stcWm8731Config); - BSP_I2S_DeInit(); - /* Reset the low layer of WM8731 */ - m_stcWm8731Config.Delay = NULL; - m_stcWm8731Config.Init = NULL; - m_stcWm8731Config.Write = NULL; - m_stcWm8731Config.Read = NULL; -} - -/** - * @brief Initialize the WM8731. - * @param u8InputDevice: Specifies the input device. - * This parameter can be one of the following values: - * @arg WM8731_INPUT_DEVICE_NONE: No device input - * @arg WM8731_INPUT_DEVICE_MICROPHONE: Microphone input - * @arg WM8731_INPUT_DEVICE_LINE: Line in intput - * @param u8OutputDevice: Specifies the output device. - * This parameter can be one of the following values: - * @arg WM8731_OUTPUT_DEVICE_NONE: No device output - * @arg WM8731_OUTPUT_DEVICE_LINE: Line in output - * @arg WM8731_OUTPUT_DEVICE_HEADPHONE: Headphone output - * @arg WM8731_OUTPUT_DEVICE_BOTH: Line in and Headphone output - * @param u8Volume: Specifies the volume of input and output, Range is 0 to 100. - * @param u32AudioFreq: Specifies the audio frequency of the communication. - * This parameter can be one of the following values: - * @arg WM8731_AUDIO_FREQ_8K: 8K - * @arg WM8731_AUDIO_FREQ_32K: 32K - * @arg WM8731_AUDIO_FREQ_48K: 48K - * @arg WM8731_AUDIO_FREQ_96K: 96K - * @param u8DataWidth: Specifies the data width. - * This parameter can be one of the following values: - * @arg WM8731_DATA_WIDTH_16BIT: 16Bits - * @arg WM8731_DATA_WIDTH_20BIT: 20Bits - * @arg WM8731_DATA_WIDTH_24BIT: 24Bits - * @arg WM8731_DATA_WIDTH_32BIT: 32Bits - * @retval None - */ -int32_t BSP_WM8731_Init(uint8_t u8InputDevice, uint8_t u8OutputDevice, - uint8_t u8Volume, uint32_t u32AudioFreq, uint8_t u8DataWidth) -{ - stc_wm8731_init_t stcWm8731Init; - - /* Configuration the low layer of WM8731 */ - m_stcWm8731Config.Delay = DDL_DelayMS; - m_stcWm8731Config.Init = BSP_WM8731_I2C_Init; - m_stcWm8731Config.Write = BSP_WM8731_I2C_Write; - m_stcWm8731Config.Read = NULL; - /* Configuration the WM8731 */ - stcWm8731Init.u8InputDevice = u8InputDevice; - stcWm8731Init.u8OutputDevice = u8OutputDevice; - stcWm8731Init.u8OutputSrc = WM8731_OUTPUT_SRC_DAC; - stcWm8731Init.u32AudioFreq = u32AudioFreq; - stcWm8731Init.u8Volume = u8Volume; - stcWm8731Init.u8DataForamt = WM8731_DATA_FORMAT_PHILLIPS; - stcWm8731Init.u8DataWidth = u8DataWidth; - (void)WM8731_Init(&m_stcWm8731Config, &stcWm8731Init); - /* Play audio */ - (void)WM8731_Play(&m_stcWm8731Config); - /* Init I2S */ - return BSP_I2S_Init(u32AudioFreq); -} - -/** - * @brief Starts playing audio. - * @param pu32WriteBuf: Pointer to the playing buffer. - * @param u16Size: Size of the audio data. - * @retval None - */ -void BSP_WM8731_Play(uint32_t *pu32WriteBuf, uint16_t u16Size) -{ - (void)DMA_SetSrcAddr(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SD_CH, (uint32_t)pu32WriteBuf); - (void)DMA_SetTransCount(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SD_CH, u16Size); - (void)DMA_ChCmd(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SD_CH, ENABLE); - DMA_TransCompleteIntCmd(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SD_INT_CH, ENABLE); - if (RESET != I2S_GetStatus(BSP_WM8731_I2S_UNIT, I2S_FLAG_TX_ERR)) { - I2S_ClearStatus(BSP_WM8731_I2S_UNIT, I2S_FLAG_TX_ERR); - } - I2S_SetTransFIFOLevel(BSP_WM8731_I2S_UNIT, I2S_TRANS_LVL3); - I2S_FuncCmd(BSP_WM8731_I2S_UNIT, I2S_FUNC_TX, ENABLE); -} - -/** - * @brief Starts audio recording. - * @param pu32ReadBuf: Pointer to the recorded buffer. - * @param u16Size: Size of the recorded buffer. - * @retval None - */ -void BSP_WM8731_Record(uint32_t *pu32ReadBuf, uint16_t u16Size) -{ - (void)DMA_SetDestAddr(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SDIN_CH, (uint32_t)pu32ReadBuf); - (void)DMA_SetTransCount(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SDIN_CH, u16Size); - (void)DMA_ChCmd(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SDIN_CH, ENABLE); - DMA_TransCompleteIntCmd(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SDIN_INT_CH, ENABLE); - if (RESET != I2S_GetStatus(BSP_WM8731_I2S_UNIT, I2S_FLAG_RX_ERR)) { - I2S_ClearStatus(BSP_WM8731_I2S_UNIT, I2S_FLAG_RX_ERR); - } - I2S_SetReceiveFIFOLevel(BSP_WM8731_I2S_UNIT, I2S_RECEIVE_LVL3); - I2S_FuncCmd(BSP_WM8731_I2S_UNIT, I2S_FUNC_RX, ENABLE); -} - -/** - * @brief Stops audio playing and recording. - * @param None - * @retval None - */ -void BSP_WM8731_Stop(void) -{ - DMA_TransCompleteIntCmd(BSP_WM8731_DMA_UNIT, (BSP_WM8731_DMA_SD_INT_CH | BSP_WM8731_DMA_SDIN_INT_CH), DISABLE); - (void)DMA_ChCmd(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SD_CH, DISABLE); - (void)DMA_ChCmd(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SDIN_CH, DISABLE); - DMA_ClearTransCompleteStatus(BSP_WM8731_DMA_UNIT, (BSP_WM8731_DMA_SD_INT_CH | BSP_WM8731_DMA_SDIN_INT_CH)); - I2S_SetReceiveFIFOLevel(BSP_WM8731_I2S_UNIT, I2S_RECEIVE_LVL4); - I2S_SetTransFIFOLevel(BSP_WM8731_I2S_UNIT, I2S_TRANS_LVL4); - I2S_FuncCmd(BSP_WM8731_I2S_UNIT, (I2S_FUNC_RX | I2S_FUNC_TX), DISABLE); - I2S_SWReset(BSP_WM8731_I2S_UNIT, I2S_RST_TYPE_FIFO); -} - -/** - * @brief Update the audio frequency. - * @param u32AudioFreq: Audio frequency used to play the audio. - * @retval None - */ -void BSP_WM8731_SetFreq(uint32_t u32AudioFreq) -{ - (void)WM8731_SetAudioFreq(&m_stcWm8731Config, u32AudioFreq); - (void)I2S_SetAudioFreq(BSP_WM8731_I2S_UNIT, u32AudioFreq); -} - -/** - * @brief Set the audio volume level. - * @param u8Volume: Volume level, Range is 0 to 100. - * @retval None - */ -void BSP_WM8731_SetVolume(uint8_t u8Volume) -{ - (void)WM8731_SetVolume(&m_stcWm8731Config, u8Volume); -} - -/** - * @brief The DMA full Transfer complete. - * @param None - * @retval None - */ -__WEAKDEF void BSP_WM8731_TransCompleteCallBack(void) -{ - /* This function should be implemented by the user application. */ -} - -/** - * @brief The DMA receive buffer is filled. - * @param None - * @retval None - */ -__WEAKDEF void BSP_WM8731_ReceiveCompleteCallBack(void) -{ - /* This function should be implemented by the user application. */ -} - -/** - * @brief De-Initializes the I2S and DMA for the board. - * @param None - * @retval None - */ -__WEAKDEF void BSP_I2S_DeInit(void) -{ - DMA_TransCompleteIntCmd(BSP_WM8731_DMA_UNIT, (BSP_WM8731_DMA_SD_INT_CH | BSP_WM8731_DMA_SDIN_INT_CH), DISABLE); - (void)DMA_ChCmd(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SD_CH, DISABLE); - (void)DMA_ChCmd(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SDIN_CH, DISABLE); - I2S_FuncCmd(BSP_WM8731_I2S_UNIT, I2S_FUNC_RX | I2S_FUNC_TX, DISABLE); - I2S_SWReset(BSP_WM8731_I2S_UNIT, I2S_RST_TYPE_ALL); -} - -/** - * @brief Initializes the I2S and DMA for the board. - * @param [in] u32AudioFreq The audio frequency - * @retval int32_t: - * - LL_OK: Initializes success - * - LL_ERR_UNINIT: Initializes DMA failed - */ -__WEAKDEF int32_t BSP_I2S_Init(uint32_t u32AudioFreq) -{ - stc_dma_init_t stcDmaInit; - stc_irq_signin_config_t stcIrqSignConfig; - stc_i2s_init_t stcI2sInit; - - /* I2S pins configuration */ - GPIO_SetFunc(BSP_WM8731_I2S_CK_PORT, BSP_WM8731_I2S_CK_PIN, BSP_WM8731_I2S_CK_FUNC); - GPIO_SetFunc(BSP_WM8731_I2S_WS_PORT, BSP_WM8731_I2S_WS_PIN, BSP_WM8731_I2S_WS_FUNC); - GPIO_SetFunc(BSP_WM8731_I2S_SD_PORT, BSP_WM8731_I2S_SD_PIN, BSP_WM8731_I2S_SD_FUNC); - GPIO_SetFunc(BSP_WM8731_I2S_SDIN_PORT, BSP_WM8731_I2S_SDIN_PIN, BSP_WM8731_I2S_SDIN_FUNC); - GPIO_SetFunc(BSP_WM8731_I2S_EXCK_PORT, BSP_WM8731_I2S_EXCK_PIN, BSP_WM8731_I2S_EXCK_FUNC); - - /* I2S DMA configuration */ - FCG_Fcg0PeriphClockCmd(BSP_WM8731_DMA_CLK, ENABLE); - (void)DMA_StructInit(&stcDmaInit); - stcDmaInit.u32IntEn = DMA_INT_ENABLE; - stcDmaInit.u32BlockSize = BSP_WM8731_DMA_BLK_SIZE; - stcDmaInit.u32TransCount = BSP_WM8731_DMA_BLK_LEN; - stcDmaInit.u32DataWidth = DMA_DATAWIDTH_32BIT; - /* Configure I2S DMA transfer */ - stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC; - stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX; - stcDmaInit.u32DestAddr = (uint32_t)(&BSP_WM8731_I2S_UNIT->TXBUF); - if (LL_OK != DMA_Init(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SD_CH, &stcDmaInit)) { - return LL_ERR_UNINIT; - } - AOS_SetTriggerEventSrc(BSP_WM8731_DMA_SD_TRIG_CH, BSP_WM8731_I2S_SD_EVT_SRC); - /* Configure I2S DMA receive */ - stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_FIX; - stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_INC; - stcDmaInit.u32SrcAddr = (uint32_t)(&BSP_WM8731_I2S_UNIT->RXBUF); - if (LL_OK != DMA_Init(BSP_WM8731_DMA_UNIT, BSP_WM8731_DMA_SDIN_CH, &stcDmaInit)) { - return LL_ERR_UNINIT; - } - AOS_SetTriggerEventSrc(BSP_WM8731_DMA_SDIN_TRIG_CH, BSP_WM8731_I2S_SDIN_EVT_SRC); - /* DMA transfer NVIC configure */ - stcIrqSignConfig.enIntSrc = BSP_WM8731_DMA_SD_INT_SRC; - stcIrqSignConfig.enIRQn = BSP_WM8731_DMA_SD_IRQ; - stcIrqSignConfig.pfnCallback = &BSP_WM8731_TransCompleteCallBack; - (void)INTC_IrqSignIn(&stcIrqSignConfig); - NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn); - NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT); - NVIC_EnableIRQ(stcIrqSignConfig.enIRQn); - /* DMA receive NVIC configure */ - stcIrqSignConfig.enIntSrc = BSP_WM8731_DMA_SDIN_INT_SRC; - stcIrqSignConfig.enIRQn = BSP_WM8731_DMA_SDIN_IRQ; - stcIrqSignConfig.pfnCallback = &BSP_WM8731_ReceiveCompleteCallBack; - (void)INTC_IrqSignIn(&stcIrqSignConfig); - NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn); - NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT); - NVIC_EnableIRQ(stcIrqSignConfig.enIRQn); - /* Enable DMA channel */ - DMA_Cmd(BSP_WM8731_DMA_UNIT, ENABLE); - - /* I2S configuration */ - FCG_Fcg1PeriphClockCmd(BSP_WM8731_I2S_CLK, ENABLE); - (void)I2S_StructInit(&stcI2sInit); - stcI2sInit.u32ClockSrc = I2S_CLK_SRC_EXT; - stcI2sInit.u32Mode = I2S_MD_MASTER; - stcI2sInit.u32Protocol = I2S_PROTOCOL_PHILLIPS; - stcI2sInit.u32TransMode = I2S_TRANS_MD_FULL_DUPLEX; - stcI2sInit.u32AudioFreq = u32AudioFreq; - stcI2sInit.u32ChWidth = I2S_CH_LEN_32BIT; - stcI2sInit.u32DataWidth = I2S_DATA_LEN_32BIT; - stcI2sInit.u32TransFIFOLevel = I2S_TRANS_LVL4; - stcI2sInit.u32ReceiveFIFOLevel = I2S_RECEIVE_LVL4; - return I2S_Init(BSP_WM8731_I2S_UNIT, &stcI2sInit); -} - -/** - * @} - */ - -#endif /* (BSP_WM8731_ENABLE && BSP_EV_HC32F4A0_LQFP176) */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/****************************************************************************** - * EOF (not truncated) - *****************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_wm8731.h b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_wm8731.h deleted file mode 100644 index 470b1c3904b..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/bsp/ev_hc32f4a0_lqfp176/ev_hc32f4a0_lqfp176_wm8731.h +++ /dev/null @@ -1,211 +0,0 @@ -/** - ******************************************************************************* - * @file ev_hc32f4a0_lqfp176_wm8731.h - * @brief This file contains all the functions prototypes for wm8731 of the - * board EV_HC32F4A0_LQFP176. - @verbatim - Change Logs: - Date Author Notes - 2022-03-31 CDT First version - @endverbatim - ******************************************************************************* - * Copyright (C) 2022-2023, Xiaohua Semiconductor Co., Ltd. All rights reserved. - * - * This software component is licensed by XHSC under BSD 3-Clause license - * (the "License"); You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ -#ifndef __EV_HC32F4A0_LQFP176_WM8731_H__ -#define __EV_HC32F4A0_LQFP176_WM8731_H__ - -/* C binding of definitions if building with C++ compiler */ -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************************************************************************* - * Include files - ******************************************************************************/ -#include "wm8731.h" -#include "ev_hc32f4a0_lqfp176.h" - -/** - * @addtogroup BSP - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176 - * @{ - */ - -/** - * @addtogroup EV_HC32F4A0_LQFP176_WM8731 - * @{ - */ - -#if ((BSP_WM8731_ENABLE == DDL_ON) && (BSP_EV_HC32F4A0_LQFP176 == BSP_EV_HC32F4XX)) - -/******************************************************************************* - * Global type definitions ('typedef') - ******************************************************************************/ - -/******************************************************************************* - * Global pre-processor symbols/macros ('#define') - ******************************************************************************/ -/** - * @defgroup EV_HC32F4A0_LQFP176_WM8731_Global_Macros EV_HC32F4A0_LQFP176 WM8731 Global Macros - * @{ - */ - -/* WM8731 device address */ -#define BSP_WM8731_DEV_ADDR (0x1AU) -#define BSP_WM8731_REG_ADDR_LEN (1U) - -/** - * @defgroup BSP_WM8731_I2C_Configure BSP WM8731 I2C Configure - * @{ - */ -/* I2C configuration define */ -#define BSP_WM8731_I2C_UNIT (CM_I2C1) -#define BSP_WM8731_I2C_FCG (FCG1_PERIPH_I2C1) - -/* SCL = PD3 */ -#define BSP_WM8731_I2C_SCL_PORT (GPIO_PORT_D) -#define BSP_WM8731_I2C_SCL_PIN (GPIO_PIN_03) -#define BSP_WM8731_I2C_SCL_FUNC (GPIO_FUNC_49) -/* SDA = PF10 */ -#define BSP_WM8731_I2C_SDA_PORT (GPIO_PORT_F) -#define BSP_WM8731_I2C_SDA_PIN (GPIO_PIN_10) -#define BSP_WM8731_I2C_SDA_FUNC (GPIO_FUNC_48) -/** - * @} - */ - -/** - * @defgroup BSP_WM8731_DMA_Configure BSP WM8731 DMA Configure - * @{ - */ -/* I2S DMA configuration define */ -#define BSP_WM8731_DMA_UNIT (CM_DMA1) -#define BSP_WM8731_DMA_CLK (FCG0_PERIPH_DMA1 | FCG0_PERIPH_AOS) - -#define BSP_WM8731_DMA_SD_CH (DMA_CH0) -#define BSP_WM8731_DMA_SD_INT_CH (DMA_INT_TC_CH0) -#define BSP_WM8731_DMA_SD_TRIG_CH (AOS_DMA1_0) -#define BSP_WM8731_DMA_SD_INT_SRC (INT_SRC_DMA1_TC0) -#define BSP_WM8731_DMA_SD_IRQ (INT006_IRQn) - -#define BSP_WM8731_DMA_SDIN_CH (DMA_CH1) -#define BSP_WM8731_DMA_SDIN_INT_CH (DMA_INT_TC_CH1) -#define BSP_WM8731_DMA_SDIN_TRIG_CH (AOS_DMA1_1) -#define BSP_WM8731_DMA_SDIN_INT_SRC (INT_SRC_DMA1_TC1) -#define BSP_WM8731_DMA_SDIN_IRQ (INT007_IRQn) -/** - * @} - */ - -/** - * @defgroup BSP_WM8731_I2S_Configure BSP WM8731 I2S Configure - * @{ - */ -/* I2S configuration define */ -#define BSP_WM8731_I2S_UNIT (CM_I2S1) -#define BSP_WM8731_I2S_CLK (FCG1_PERIPH_I2S1) -#define BSP_WM8731_I2S_CLK_CH (CLK_I2S1) -#define BSP_WM8731_I2S_CLK_SRC (CLK_PERIPHCLK_PCLK) -#define BSP_WM8731_I2S_SD_EVT_SRC (EVT_SRC_I2S1_TXIRQOUT) -#define BSP_WM8731_I2S_SDIN_EVT_SRC (EVT_SRC_I2S1_RXIRQOUT) -/* CK = PF6 */ -#define BSP_WM8731_I2S_CK_PORT (GPIO_PORT_F) -#define BSP_WM8731_I2S_CK_PIN (GPIO_PIN_06) -#define BSP_WM8731_I2S_CK_FUNC (GPIO_FUNC_54) -/* WS = PF8 */ -#define BSP_WM8731_I2S_WS_PORT (GPIO_PORT_F) -#define BSP_WM8731_I2S_WS_PIN (GPIO_PIN_08) -#define BSP_WM8731_I2S_WS_FUNC (GPIO_FUNC_55) -/* SD = PF7 */ -#define BSP_WM8731_I2S_SD_PORT (GPIO_PORT_F) -#define BSP_WM8731_I2S_SD_PIN (GPIO_PIN_07) -#define BSP_WM8731_I2S_SD_FUNC (GPIO_FUNC_56) -/* SDIN = PI2 */ -#define BSP_WM8731_I2S_SDIN_PORT (GPIO_PORT_I) -#define BSP_WM8731_I2S_SDIN_PIN (GPIO_PIN_02) -#define BSP_WM8731_I2S_SDIN_FUNC (GPIO_FUNC_17) -/* EXCK = PG7 */ -#define BSP_WM8731_I2S_EXCK_PORT (GPIO_PORT_G) -#define BSP_WM8731_I2S_EXCK_PIN (GPIO_PIN_07) -#define BSP_WM8731_I2S_EXCK_FUNC (GPIO_FUNC_17) -/* MCK = PA5 */ -#define BSP_WM8731_I2S_MCK_PORT (GPIO_PORT_A) -#define BSP_WM8731_I2S_MCK_PIN (GPIO_PIN_05) -#define BSP_WM8731_I2S_MCK_FUNC (GPIO_FUNC_17) - -/* The data size for transfer and receive */ -#define BSP_WM8731_DMA_BLK_SIZE (1U) -#define BSP_WM8731_DMA_BLK_LEN (512U) -/** - * @} - */ - -/** - * @} - */ - -/******************************************************************************* - * Global variable definitions ('extern') - ******************************************************************************/ - -/******************************************************************************* - Global function prototypes (definition in C source) - ******************************************************************************/ -/** - * @addtogroup EV_HC32F4A0_LQFP176_WM8731_Global_Functions - * @{ - */ -void BSP_WM8731_DeInit(void); -int32_t BSP_WM8731_Init(uint8_t u8InputDevice, uint8_t u8OutputDevice, - uint8_t u8Volume, uint32_t u32AudioFreq, uint8_t u8DataWidth); -void BSP_WM8731_Play(uint32_t *pu32WriteBuf, uint16_t u16Size); -void BSP_WM8731_Record(uint32_t *pu32ReadBuf, uint16_t u16Size); -void BSP_WM8731_Stop(void); -void BSP_WM8731_SetFreq(uint32_t u32AudioFreq); -void BSP_WM8731_SetVolume(uint8_t u8Volume); - -/* User has to implement these functions in his code if they are needed */ -void BSP_WM8731_TransCompleteCallBack(void); -void BSP_WM8731_ReceiveCompleteCallBack(void); -void BSP_I2S_DeInit(void); -int32_t BSP_I2S_Init(uint32_t u32AudioFreq); - -/** - * @} - */ - -#endif /* (BSP_WM8731_ENABLE && BSP_EV_HC32F4A0_LQFP176) */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __EV_HC32F4A0_LQFP176_WM8731_H__ */ - -/******************************************************************************* - * EOF (not truncated) - ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HDSC_HC32F4A0.SFR b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/ARM/sfr/HDSC_HC32F4A0.SFR deleted file mode 100644 index 31dd19b3c24c9de678d35df3d22fc25a3385c707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3121534 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 N&oL5Wg&#L$78KVJ3>Pc^ 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

MT_c)e*SPg+>RUs< z?-_>d@{yfgA5?{dt1wZ8byZkjg$-5MScOeh*j$AzRVY`XQiW<2e#~Omc;Y(Au0`ZG zIPYeQU5_x?HKKUfHHBld>tk8$8gWQ=O`(|V`b93gMi?KvrjQ(V{hwTRjbJ`@O@TS= z`fQ6`r%n)uT~iZ8u;HPCn;RZ>O&U5AgdQ&+yRKKEQH5p|T2*LQ;pr^w8qe}hWY

^fzi?zeOUF5K9 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�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 - - HDSC - HDSC - HDSC_HC32F4A0 - ARMCM4 - 1.0 - - CM4 - r0p1 - little - true - true - 4 - false - - 8 - 32 - 32 - read-write - 0x0 - 0x0 - - - ADC1 - desc ADC1 - 0x40040000 - - 0x0 - 0xC5 - - - - STR - desc STR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - STRT - desc STRT - 0 - 0 - read-write - - - - - CR0 - desc CR0 - 0x2 - 16 - read-write - 0x0 - 0x7F3 - - - MS - desc MS - 1 - 0 - read-write - - - ACCSEL - desc ACCSEL - 5 - 4 - read-write - - - CLREN - desc CLREN - 6 - 6 - read-write - - - DFMT - desc DFMT - 7 - 7 - read-write - - - AVCNT - desc AVCNT - 10 - 8 - read-write - - - - - CR1 - desc CR1 - 0x4 - 16 - read-write - 0x0 - 0x4 - - - RSCHSEL - desc RSCHSEL - 2 - 2 - read-write - - - - - TRGSR - desc TRGSR - 0xA - 16 - read-write - 0x0 - 0x8383 - - - TRGSELA - desc TRGSELA - 1 - 0 - read-write - - - TRGENA - desc TRGENA - 7 - 7 - read-write - - - TRGSELB - desc TRGSELB - 9 - 8 - read-write - - - TRGENB - desc TRGENB - 15 - 15 - read-write - - - - - CHSELRA - desc CHSELRA - 0xC - 32 - read-write - 0x0 - 0xFFFF - - - CHSELA - desc CHSELA - 15 - 0 - read-write - - - - - CHSELRB - desc CHSELRB - 0x10 - 32 - read-write - 0x0 - 0xFFFF - - - CHSELB - desc CHSELB - 15 - 0 - read-write - - - - - AVCHSELR - desc AVCHSELR - 0x14 - 32 - read-write - 0x0 - 0xFFFF - - - AVCHSEL - desc AVCHSEL - 15 - 0 - read-write - - - - - EXCHSELR - desc EXCHSELR - 0x18 - 8 - read-write - 0x0 - 0x1 - - - EXCHSEL - desc EXCHSEL - 0 - 0 - read-write - - - - - SHCR - desc SHCR - 0x1A - 16 - read-write - 0x18 - 0x7FF - - - SHSST - desc SHSST - 7 - 0 - read-write - - - SHSEL - desc SHSEL - 10 - 8 - read-write - - - - - SSTR0 - desc SSTR0 - 0x20 - 8 - read-write - 0xB - 0xFF - - - SSTR1 - desc SSTR1 - 0x21 - 8 - read-write - 0xB - 0xFF - - - SSTR2 - desc SSTR2 - 0x22 - 8 - read-write - 0xB - 0xFF - - - SSTR3 - desc SSTR3 - 0x23 - 8 - read-write - 0xB - 0xFF - - - SSTR4 - desc SSTR4 - 0x24 - 8 - read-write - 0xB - 0xFF - - - SSTR5 - desc SSTR5 - 0x25 - 8 - read-write - 0xB - 0xFF - - - SSTR6 - desc SSTR6 - 0x26 - 8 - read-write - 0xB - 0xFF - - - SSTR7 - desc SSTR7 - 0x27 - 8 - read-write - 0xB - 0xFF - - - SSTR8 - desc SSTR8 - 0x28 - 8 - read-write - 0xB - 0xFF - - - SSTR9 - desc SSTR9 - 0x29 - 8 - read-write - 0xB - 0xFF - - - SSTR10 - desc SSTR10 - 0x2A - 8 - read-write - 0xB - 0xFF - - - SSTR11 - desc SSTR11 - 0x2B - 8 - read-write - 0xB - 0xFF - - - SSTR12 - desc SSTR12 - 0x2C - 8 - read-write - 0xB - 0xFF - - - SSTR13 - desc SSTR13 - 0x2D - 8 - read-write - 0xB - 0xFF - - - SSTR14 - desc SSTR14 - 0x2E - 8 - read-write - 0xB - 0xFF - - - SSTR15 - desc SSTR15 - 0x2F - 8 - read-write - 0xB - 0xFF - - - SSTRL - desc SSTRL - 0x30 - 8 - read-write - 0xB - 0xFF - - - CHMUXR0 - desc CHMUXR0 - 0x38 - 16 - read-write - 0x3210 - 0xFFFF - - - CH00MUX - desc CH00MUX - 3 - 0 - read-write - - - CH01MUX - desc CH01MUX - 7 - 4 - read-write - - - CH02MUX - desc CH02MUX - 11 - 8 - read-write - - - CH03MUX - desc CH03MUX - 15 - 12 - read-write - - - - - CHMUXR1 - desc CHMUXR1 - 0x3A - 16 - read-write - 0x7654 - 0xFFFF - - - CH04MUX - desc CH04MUX - 3 - 0 - read-write - - - CH05MUX - desc CH05MUX - 7 - 4 - read-write - - - CH06MUX - desc CH06MUX - 11 - 8 - read-write - - - CH07MUX - desc CH07MUX - 15 - 12 - read-write - - - - - CHMUXR2 - desc CHMUXR2 - 0x3C - 16 - read-write - 0xBA98 - 0xFFFF - - - CH08MUX - desc CH08MUX - 3 - 0 - read-write - - - CH09MUX - desc CH09MUX - 7 - 4 - read-write - - - CH10MUX - desc CH10MUX - 11 - 8 - read-write - - - CH11MUX - desc CH11MUX - 15 - 12 - read-write - - - - - CHMUXR3 - desc CHMUXR3 - 0x3E - 16 - read-write - 0xFEDC - 0xFFFF - - - CH12MUX - desc CH12MUX - 3 - 0 - read-write - - - CH13MUX - desc CH13MUX - 7 - 4 - read-write - - - CH14MUX - desc CH14MUX - 11 - 8 - read-write - - - CH15MUX - desc CH15MUX - 15 - 12 - read-write - - - - - ISR - desc ISR - 0x44 - 8 - read-only - 0x0 - 0x13 - - - EOCAF - desc EOCAF - 0 - 0 - read-only - - - EOCBF - desc EOCBF - 1 - 1 - read-only - - - SASTPDF - desc SASTPDF - 4 - 4 - read-only - - - - - ICR - desc ICR - 0x45 - 8 - read-write - 0x3 - 0x3 - - - EOCAIEN - desc EOCAIEN - 0 - 0 - read-write - - - EOCBIEN - desc EOCBIEN - 1 - 1 - read-write - - - - - ISCLRR - desc ISCLRR - 0x46 - 8 - read-write - 0x0 - 0x13 - - - CLREOCAF - desc CLREOCAF - 0 - 0 - read-write - - - CLREOCBF - desc CLREOCBF - 1 - 1 - read-write - - - CLRSASTPDF - desc CLRSASTPDF - 4 - 4 - read-write - - - - - SYNCCR - desc SYNCCR - 0x4C - 16 - read-write - 0xC00 - 0xFF71 - - - SYNCEN - desc SYNCEN - 0 - 0 - read-write - - - SYNCMD - desc SYNCMD - 6 - 4 - read-write - - - SYNCDLY - desc SYNCDLY - 15 - 8 - read-write - - - - - DR0 - desc DR0 - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - DR1 - desc DR1 - 0x52 - 16 - read-only - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x54 - 16 - read-only - 0x0 - 0xFFFF - - - DR3 - desc DR3 - 0x56 - 16 - read-only - 0x0 - 0xFFFF - - - DR4 - desc DR4 - 0x58 - 16 - read-only - 0x0 - 0xFFFF - - - DR5 - desc DR5 - 0x5A - 16 - read-only - 0x0 - 0xFFFF - - - DR6 - desc DR6 - 0x5C - 16 - read-only - 0x0 - 0xFFFF - - - DR7 - desc DR7 - 0x5E - 16 - read-only - 0x0 - 0xFFFF - - - DR8 - desc DR8 - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - DR9 - desc DR9 - 0x62 - 16 - read-only - 0x0 - 0xFFFF - - - DR10 - desc DR10 - 0x64 - 16 - read-only - 0x0 - 0xFFFF - - - DR11 - desc DR11 - 0x66 - 16 - read-only - 0x0 - 0xFFFF - - - DR12 - desc DR12 - 0x68 - 16 - read-only - 0x0 - 0xFFFF - - - DR13 - desc DR13 - 0x6A - 16 - read-only - 0x0 - 0xFFFF - - - DR14 - desc DR14 - 0x6C - 16 - read-only - 0x0 - 0xFFFF - - - DR15 - desc DR15 - 0x6E - 16 - read-only - 0x0 - 0xFFFF - - - AWDCR - desc AWDCR - 0xA0 - 16 - read-write - 0x0 - 0x377 - - - AWD0EN - desc AWD0EN - 0 - 0 - read-write - - - AWD0IEN - desc AWD0IEN - 1 - 1 - read-write - - - AWD0MD - desc AWD0MD - 2 - 2 - read-write - - - AWD1EN - desc AWD1EN - 4 - 4 - read-write - - - AWD1IEN - desc AWD1IEN - 5 - 5 - read-write - - - AWD1MD - desc AWD1MD - 6 - 6 - read-write - - - AWDCM - desc AWDCM - 9 - 8 - read-write - - - - - AWDSR - desc AWDSR - 0xA2 - 8 - read-only - 0x0 - 0x13 - - - AWD0F - desc AWD0F - 0 - 0 - read-only - - - AWD1F - desc AWD1F - 1 - 1 - read-only - - - AWDCMF - desc AWDCMF - 4 - 4 - read-only - - - - - AWDSCLRR - desc AWDSCLRR - 0xA3 - 8 - write-only - 0x0 - 0x13 - - - CLRAWD0F - desc CLRAWD0F - 0 - 0 - write-only - - - CLRAWD1F - desc CLRAWD1F - 1 - 1 - write-only - - - CLRAWDCMF - desc CLRAWDCMF - 4 - 4 - write-only - - - - - AWD0DR0 - desc AWD0DR0 - 0xA4 - 16 - read-write - 0x0 - 0xFFFF - - - AWD0DR1 - desc AWD0DR1 - 0xA6 - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD0CHSR - desc AWD0CHSR - 0xA8 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - AWD1DR0 - desc AWD1DR0 - 0xAC - 16 - read-write - 0x0 - 0xFFFF - - - AWD1DR1 - desc AWD1DR1 - 0xAE - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD1CHSR - desc AWD1CHSR - 0xB0 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - PGACR1 - desc PGACR1 - 0xC0 - 8 - read-write - 0x0 - 0xFF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - PGAGAIN - desc PGAGAIN - 7 - 4 - read-write - - - - - PGACR2 - desc PGACR2 - 0xC1 - 8 - read-write - 0x0 - 0xFF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - PGAGAIN - desc PGAGAIN - 7 - 4 - read-write - - - - - PGACR3 - desc PGACR3 - 0xC2 - 8 - read-write - 0x0 - 0xFF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - PGAGAIN - desc PGAGAIN - 7 - 4 - read-write - - - - - PGAVSSENR - desc PGAVSSENR - 0xC4 - 8 - read-write - 0x0 - 0x7 - - - PGAVSSEN - desc PGAVSSEN - 2 - 0 - read-write - - - - - - - ADC2 - desc ADC2 - 0x40040400 - - 0x0 - 0xC5 - - - - STR - desc STR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - STRT - desc STRT - 0 - 0 - read-write - - - - - CR0 - desc CR0 - 0x2 - 16 - read-write - 0x0 - 0x7F3 - - - MS - desc MS - 1 - 0 - read-write - - - ACCSEL - desc ACCSEL - 5 - 4 - read-write - - - CLREN - desc CLREN - 6 - 6 - read-write - - - DFMT - desc DFMT - 7 - 7 - read-write - - - AVCNT - desc AVCNT - 10 - 8 - read-write - - - - - CR1 - desc CR1 - 0x4 - 16 - read-write - 0x0 - 0x4 - - - RSCHSEL - desc RSCHSEL - 2 - 2 - read-write - - - - - TRGSR - desc TRGSR - 0xA - 16 - read-write - 0x0 - 0x8383 - - - TRGSELA - desc TRGSELA - 1 - 0 - read-write - - - TRGENA - desc TRGENA - 7 - 7 - read-write - - - TRGSELB - desc TRGSELB - 9 - 8 - read-write - - - TRGENB - desc TRGENB - 15 - 15 - read-write - - - - - CHSELRA - desc CHSELRA - 0xC - 32 - read-write - 0x0 - 0xFFFF - - - CHSELA - desc CHSELA - 15 - 0 - read-write - - - - - CHSELRB - desc CHSELRB - 0x10 - 32 - read-write - 0x0 - 0xFFFF - - - CHSELB - desc CHSELB - 15 - 0 - read-write - - - - - AVCHSELR - desc AVCHSELR - 0x14 - 32 - read-write - 0x0 - 0xFFFF - - - AVCHSEL - desc AVCHSEL - 15 - 0 - read-write - - - - - EXCHSELR - desc EXCHSELR - 0x18 - 8 - read-write - 0x0 - 0x1 - - - EXCHSEL - desc EXCHSEL - 0 - 0 - read-write - - - - - SSTR0 - desc SSTR0 - 0x20 - 8 - read-write - 0xB - 0xFF - - - SSTR1 - desc SSTR1 - 0x21 - 8 - read-write - 0xB - 0xFF - - - SSTR2 - desc SSTR2 - 0x22 - 8 - read-write - 0xB - 0xFF - - - SSTR3 - desc SSTR3 - 0x23 - 8 - read-write - 0xB - 0xFF - - - SSTR4 - desc SSTR4 - 0x24 - 8 - read-write - 0xB - 0xFF - - - SSTR5 - desc SSTR5 - 0x25 - 8 - read-write - 0xB - 0xFF - - - SSTR6 - desc SSTR6 - 0x26 - 8 - read-write - 0xB - 0xFF - - - SSTR7 - desc SSTR7 - 0x27 - 8 - read-write - 0xB - 0xFF - - - SSTR8 - desc SSTR8 - 0x28 - 8 - read-write - 0xB - 0xFF - - - SSTR9 - desc SSTR9 - 0x29 - 8 - read-write - 0xB - 0xFF - - - SSTR10 - desc SSTR10 - 0x2A - 8 - read-write - 0xB - 0xFF - - - SSTR11 - desc SSTR11 - 0x2B - 8 - read-write - 0xB - 0xFF - - - SSTR12 - desc SSTR12 - 0x2C - 8 - read-write - 0xB - 0xFF - - - SSTR13 - desc SSTR13 - 0x2D - 8 - read-write - 0xB - 0xFF - - - SSTR14 - desc SSTR14 - 0x2E - 8 - read-write - 0xB - 0xFF - - - SSTR15 - desc SSTR15 - 0x2F - 8 - read-write - 0xB - 0xFF - - - SSTRL - desc SSTRL - 0x30 - 8 - read-write - 0xB - 0xFF - - - CHMUXR0 - desc CHMUXR0 - 0x38 - 16 - read-write - 0x3210 - 0xFFFF - - - CH00MUX - desc CH00MUX - 3 - 0 - read-write - - - CH01MUX - desc CH01MUX - 7 - 4 - read-write - - - CH02MUX - desc CH02MUX - 11 - 8 - read-write - - - CH03MUX - desc CH03MUX - 15 - 12 - read-write - - - - - CHMUXR1 - desc CHMUXR1 - 0x3A - 16 - read-write - 0x7654 - 0xFFFF - - - CH04MUX - desc CH04MUX - 3 - 0 - read-write - - - CH05MUX - desc CH05MUX - 7 - 4 - read-write - - - CH06MUX - desc CH06MUX - 11 - 8 - read-write - - - CH07MUX - desc CH07MUX - 15 - 12 - read-write - - - - - CHMUXR2 - desc CHMUXR2 - 0x3C - 16 - read-write - 0xBA98 - 0xFFFF - - - CH08MUX - desc CH08MUX - 3 - 0 - read-write - - - CH09MUX - desc CH09MUX - 7 - 4 - read-write - - - CH10MUX - desc CH10MUX - 11 - 8 - read-write - - - CH11MUX - desc CH11MUX - 15 - 12 - read-write - - - - - CHMUXR3 - desc CHMUXR3 - 0x3E - 16 - read-write - 0xFEDC - 0xFFFF - - - CH12MUX - desc CH12MUX - 3 - 0 - read-write - - - CH13MUX - desc CH13MUX - 7 - 4 - read-write - - - CH14MUX - desc CH14MUX - 11 - 8 - read-write - - - CH15MUX - desc CH15MUX - 15 - 12 - read-write - - - - - ISR - desc ISR - 0x44 - 8 - read-only - 0x0 - 0x13 - - - EOCAF - desc EOCAF - 0 - 0 - read-only - - - EOCBF - desc EOCBF - 1 - 1 - read-only - - - SASTPDF - desc SASTPDF - 4 - 4 - read-only - - - - - ICR - desc ICR - 0x45 - 8 - read-write - 0x3 - 0x3 - - - EOCAIEN - desc EOCAIEN - 0 - 0 - read-write - - - EOCBIEN - desc EOCBIEN - 1 - 1 - read-write - - - - - ISCLRR - desc ISCLRR - 0x46 - 8 - write-only - 0x0 - 0x13 - - - CLREOCAF - desc CLREOCAF - 0 - 0 - write-only - - - CLREOCBF - desc CLREOCBF - 1 - 1 - write-only - - - CLRSASTPDF - desc CLRSASTPDF - 4 - 4 - write-only - - - - - DR0 - desc DR0 - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - DR1 - desc DR1 - 0x52 - 16 - read-only - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x54 - 16 - read-only - 0x0 - 0xFFFF - - - DR3 - desc DR3 - 0x56 - 16 - read-only - 0x0 - 0xFFFF - - - DR4 - desc DR4 - 0x58 - 16 - read-only - 0x0 - 0xFFFF - - - DR5 - desc DR5 - 0x5A - 16 - read-only - 0x0 - 0xFFFF - - - DR6 - desc DR6 - 0x5C - 16 - read-only - 0x0 - 0xFFFF - - - DR7 - desc DR7 - 0x5E - 16 - read-only - 0x0 - 0xFFFF - - - DR8 - desc DR8 - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - DR9 - desc DR9 - 0x62 - 16 - read-only - 0x0 - 0xFFFF - - - DR10 - desc DR10 - 0x64 - 16 - read-only - 0x0 - 0xFFFF - - - DR11 - desc DR11 - 0x66 - 16 - read-only - 0x0 - 0xFFFF - - - DR12 - desc DR12 - 0x68 - 16 - read-only - 0x0 - 0xFFFF - - - DR13 - desc DR13 - 0x6A - 16 - read-only - 0x0 - 0xFFFF - - - DR14 - desc DR14 - 0x6C - 16 - read-only - 0x0 - 0xFFFF - - - DR15 - desc DR15 - 0x6E - 16 - read-only - 0x0 - 0xFFFF - - - AWDCR - desc AWDCR - 0xA0 - 16 - read-write - 0x0 - 0x377 - - - AWD0EN - desc AWD0EN - 0 - 0 - read-write - - - AWD0IEN - desc AWD0IEN - 1 - 1 - read-write - - - AWD0MD - desc AWD0MD - 2 - 2 - read-write - - - AWD1EN - desc AWD1EN - 4 - 4 - read-write - - - AWD1IEN - desc AWD1IEN - 5 - 5 - read-write - - - AWD1MD - desc AWD1MD - 6 - 6 - read-write - - - AWDCM - desc AWDCM - 9 - 8 - read-write - - - - - AWDSR - desc AWDSR - 0xA2 - 8 - read-only - 0x0 - 0x13 - - - AWD0F - desc AWD0F - 0 - 0 - read-only - - - AWD1F - desc AWD1F - 1 - 1 - read-only - - - AWDCMF - desc AWDCMF - 4 - 4 - read-only - - - - - AWDSCLRR - desc AWDSCLRR - 0xA3 - 8 - write-only - 0x0 - 0x13 - - - CLRAWD0F - desc CLRAWD0F - 0 - 0 - write-only - - - CLRAWD1F - desc CLRAWD1F - 1 - 1 - write-only - - - CLRAWDCMF - desc CLRAWDCMF - 4 - 4 - write-only - - - - - AWD0DR0 - desc AWD0DR0 - 0xA4 - 16 - read-write - 0x0 - 0xFFFF - - - AWD0DR1 - desc AWD0DR1 - 0xA6 - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD0CHSR - desc AWD0CHSR - 0xA8 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - AWD1DR0 - desc AWD1DR0 - 0xAC - 16 - read-write - 0x0 - 0xFFFF - - - AWD1DR1 - desc AWD1DR1 - 0xAE - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD1CHSR - desc AWD1CHSR - 0xB0 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - PGACR1 - desc PGACR1 - 0xC0 - 8 - read-write - 0x0 - 0xFF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - PGAGAIN - desc PGAGAIN - 7 - 4 - read-write - - - - - PGAVSSENR - desc PGAVSSENR - 0xC4 - 8 - read-write - 0x0 - 0x1 - - - PGAVSSEN - desc PGAVSSEN - 0 - 0 - read-write - - - - - - - ADC3 - desc ADC3 - 0x40040800 - - 0x0 - 0xB1 - - - - STR - desc STR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - STRT - desc STRT - 0 - 0 - read-write - - - - - CR0 - desc CR0 - 0x2 - 16 - read-write - 0x0 - 0x7F3 - - - MS - desc MS - 1 - 0 - read-write - - - ACCSEL - desc ACCSEL - 5 - 4 - read-write - - - CLREN - desc CLREN - 6 - 6 - read-write - - - DFMT - desc DFMT - 7 - 7 - read-write - - - AVCNT - desc AVCNT - 10 - 8 - read-write - - - - - CR1 - desc CR1 - 0x4 - 16 - read-write - 0x0 - 0x4 - - - RSCHSEL - desc RSCHSEL - 2 - 2 - read-write - - - - - TRGSR - desc TRGSR - 0xA - 16 - read-write - 0x0 - 0x8383 - - - TRGSELA - desc TRGSELA - 1 - 0 - read-write - - - TRGENA - desc TRGENA - 7 - 7 - read-write - - - TRGSELB - desc TRGSELB - 9 - 8 - read-write - - - TRGENB - desc TRGENB - 15 - 15 - read-write - - - - - CHSELRA - desc CHSELRA - 0xC - 32 - read-write - 0x0 - 0xFFFFF - - - CHSELA - desc CHSELA - 19 - 0 - read-write - - - - - CHSELRB - desc CHSELRB - 0x10 - 32 - read-write - 0x0 - 0xFFFFF - - - CHSELB - desc CHSELB - 19 - 0 - read-write - - - - - AVCHSELR - desc AVCHSELR - 0x14 - 32 - read-write - 0x0 - 0xFFFFF - - - AVCHSEL - desc AVCHSEL - 19 - 0 - read-write - - - - - EXCHSELR - desc EXCHSELR - 0x18 - 8 - read-write - 0x0 - 0x1 - - - EXCHSEL - desc EXCHSEL - 0 - 0 - read-write - - - - - SSTR0 - desc SSTR0 - 0x20 - 8 - read-write - 0xB - 0xFF - - - SSTR1 - desc SSTR1 - 0x21 - 8 - read-write - 0xB - 0xFF - - - SSTR2 - desc SSTR2 - 0x22 - 8 - read-write - 0xB - 0xFF - - - SSTR3 - desc SSTR3 - 0x23 - 8 - read-write - 0xB - 0xFF - - - SSTR4 - desc SSTR4 - 0x24 - 8 - read-write - 0xB - 0xFF - - - SSTR5 - desc SSTR5 - 0x25 - 8 - read-write - 0xB - 0xFF - - - SSTR6 - desc SSTR6 - 0x26 - 8 - read-write - 0xB - 0xFF - - - SSTR7 - desc SSTR7 - 0x27 - 8 - read-write - 0xB - 0xFF - - - SSTR8 - desc SSTR8 - 0x28 - 8 - read-write - 0xB - 0xFF - - - SSTR9 - desc SSTR9 - 0x29 - 8 - read-write - 0xB - 0xFF - - - SSTR10 - desc SSTR10 - 0x2A - 8 - read-write - 0xB - 0xFF - - - SSTR11 - desc SSTR11 - 0x2B - 8 - read-write - 0xB - 0xFF - - - SSTR12 - desc SSTR12 - 0x2C - 8 - read-write - 0xB - 0xFF - - - SSTR13 - desc SSTR13 - 0x2D - 8 - read-write - 0xB - 0xFF - - - SSTR14 - desc SSTR14 - 0x2E - 8 - read-write - 0xB - 0xFF - - - SSTR15 - desc SSTR15 - 0x2F - 8 - read-write - 0xB - 0xFF - - - SSTRL - desc SSTRL - 0x30 - 8 - read-write - 0xB - 0xFF - - - CHMUXR0 - desc CHMUXR0 - 0x38 - 16 - read-write - 0x3210 - 0xFFFF - - - CH00MUX - desc CH00MUX - 3 - 0 - read-write - - - CH01MUX - desc CH01MUX - 7 - 4 - read-write - - - CH02MUX - desc CH02MUX - 11 - 8 - read-write - - - CH03MUX - desc CH03MUX - 15 - 12 - read-write - - - - - CHMUXR1 - desc CHMUXR1 - 0x3A - 16 - read-write - 0x7654 - 0xFFFF - - - CH04MUX - desc CH04MUX - 3 - 0 - read-write - - - CH05MUX - desc CH05MUX - 7 - 4 - read-write - - - CH06MUX - desc CH06MUX - 11 - 8 - read-write - - - CH07MUX - desc CH07MUX - 15 - 12 - read-write - - - - - CHMUXR2 - desc CHMUXR2 - 0x3C - 16 - read-write - 0xBA98 - 0xFFFF - - - CH08MUX - desc CH08MUX - 3 - 0 - read-write - - - CH09MUX - desc CH09MUX - 7 - 4 - read-write - - - CH10MUX - desc CH10MUX - 11 - 8 - read-write - - - CH11MUX - desc CH11MUX - 15 - 12 - read-write - - - - - CHMUXR3 - desc CHMUXR3 - 0x3E - 16 - read-write - 0xFEDC - 0xFFFF - - - CH12MUX - desc CH12MUX - 3 - 0 - read-write - - - CH13MUX - desc CH13MUX - 7 - 4 - read-write - - - CH14MUX - desc CH14MUX - 11 - 8 - read-write - - - CH15MUX - desc CH15MUX - 15 - 12 - read-write - - - - - ISR - desc ISR - 0x44 - 8 - read-only - 0x0 - 0x13 - - - EOCAF - desc EOCAF - 0 - 0 - read-only - - - EOCBF - desc EOCBF - 1 - 1 - read-only - - - SASTPDF - desc SASTPDF - 4 - 4 - read-only - - - - - ICR - desc ICR - 0x45 - 8 - read-write - 0x3 - 0x3 - - - EOCAIEN - desc EOCAIEN - 0 - 0 - read-write - - - EOCBIEN - desc EOCBIEN - 1 - 1 - read-write - - - - - ISCLRR - desc ISCLRR - 0x46 - 8 - write-only - 0x0 - 0x13 - - - CLREOCAF - desc CLREOCAF - 0 - 0 - write-only - - - CLREOCBF - desc CLREOCBF - 1 - 1 - write-only - - - CLRSASTPDF - desc CLRSASTPDF - 4 - 4 - write-only - - - - - DR0 - desc DR0 - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - DR1 - desc DR1 - 0x52 - 16 - read-only - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x54 - 16 - read-only - 0x0 - 0xFFFF - - - DR3 - desc DR3 - 0x56 - 16 - read-only - 0x0 - 0xFFFF - - - DR4 - desc DR4 - 0x58 - 16 - read-only - 0x0 - 0xFFFF - - - DR5 - desc DR5 - 0x5A - 16 - read-only - 0x0 - 0xFFFF - - - DR6 - desc DR6 - 0x5C - 16 - read-only - 0x0 - 0xFFFF - - - DR7 - desc DR7 - 0x5E - 16 - read-only - 0x0 - 0xFFFF - - - DR8 - desc DR8 - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - DR9 - desc DR9 - 0x62 - 16 - read-only - 0x0 - 0xFFFF - - - DR10 - desc DR10 - 0x64 - 16 - read-only - 0x0 - 0xFFFF - - - DR11 - desc DR11 - 0x66 - 16 - read-only - 0x0 - 0xFFFF - - - DR12 - desc DR12 - 0x68 - 16 - read-only - 0x0 - 0xFFFF - - - DR13 - desc DR13 - 0x6A - 16 - read-only - 0x0 - 0xFFFF - - - DR14 - desc DR14 - 0x6C - 16 - read-only - 0x0 - 0xFFFF - - - DR15 - desc DR15 - 0x6E - 16 - read-only - 0x0 - 0xFFFF - - - DR16 - desc DR16 - 0x70 - 16 - read-only - 0x0 - 0xFFFF - - - DR17 - desc DR17 - 0x72 - 16 - read-only - 0x0 - 0xFFFF - - - DR18 - desc DR18 - 0x74 - 16 - read-only - 0x0 - 0xFFFF - - - DR19 - desc DR19 - 0x76 - 16 - read-only - 0x0 - 0xFFFF - - - AWDCR - desc AWDCR - 0xA0 - 16 - read-write - 0x0 - 0x377 - - - AWD0EN - desc AWD0EN - 0 - 0 - read-write - - - AWD0IEN - desc AWD0IEN - 1 - 1 - read-write - - - AWD0MD - desc AWD0MD - 2 - 2 - read-write - - - AWD1EN - desc AWD1EN - 4 - 4 - read-write - - - AWD1IEN - desc AWD1IEN - 5 - 5 - read-write - - - AWD1MD - desc AWD1MD - 6 - 6 - read-write - - - AWDCM - desc AWDCM - 9 - 8 - read-write - - - - - AWDSR - desc AWDSR - 0xA2 - 8 - read-only - 0x0 - 0x13 - - - AWD0F - desc AWD0F - 0 - 0 - read-only - - - AWD1F - desc AWD1F - 1 - 1 - read-only - - - AWDCMF - desc AWDCMF - 4 - 4 - read-only - - - - - AWDSCLRR - desc AWDSCLRR - 0xA3 - 8 - write-only - 0x0 - 0x13 - - - CLRAWD0F - desc CLRAWD0F - 0 - 0 - write-only - - - CLRAWD1F - desc CLRAWD1F - 1 - 1 - write-only - - - CLRAWDCMF - desc CLRAWDCMF - 4 - 4 - write-only - - - - - AWD0DR0 - desc AWD0DR0 - 0xA4 - 16 - read-write - 0x0 - 0xFFFF - - - AWD0DR1 - desc AWD0DR1 - 0xA6 - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD0CHSR - desc AWD0CHSR - 0xA8 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - AWD1DR0 - desc AWD1DR0 - 0xAC - 16 - read-write - 0x0 - 0xFFFF - - - AWD1DR1 - desc AWD1DR1 - 0xAE - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD1CHSR - desc AWD1CHSR - 0xB0 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - - - AES - desc AES - 0x40008000 - - 0x0 - 0x40 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x1B - - - START - desc START - 0 - 0 - read-write - - - MODE - desc MODE - 1 - 1 - read-write - - - KEYSIZE - desc KEYSIZE - 4 - 3 - read-write - - - - - DR0 - desc DR0 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR2 - desc DR2 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR3 - desc DR3 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR0 - desc KR0 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR1 - desc KR1 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR2 - desc KR2 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR3 - desc KR3 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR4 - desc KR4 - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR5 - desc KR5 - 0x34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR6 - desc KR6 - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR7 - desc KR7 - 0x3C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - AOS - desc AOS - 0x40010800 - - 0x0 - 0x174 - - - - INTSFTTRG - desc INTSFTTRG - 0x0 - 32 - write-only - 0x0 - 0x1 - - - STRG - desc STRG - 0 - 0 - write-only - - - - - DCU_TRGSEL1 - desc DCU_TRGSEL1 - 0x4 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL2 - desc DCU_TRGSEL2 - 0x8 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL3 - desc DCU_TRGSEL3 - 0xC - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL4 - desc DCU_TRGSEL4 - 0x10 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL0 - desc DMA1_TRGSEL0 - 0x14 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL1 - desc DMA1_TRGSEL1 - 0x18 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL2 - desc DMA1_TRGSEL2 - 0x1C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL3 - desc DMA1_TRGSEL3 - 0x20 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL4 - desc DMA1_TRGSEL4 - 0x24 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL5 - desc DMA1_TRGSEL5 - 0x28 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL6 - desc DMA1_TRGSEL6 - 0x2C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL7 - desc DMA1_TRGSEL7 - 0x30 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL0 - desc DMA2_TRGSEL0 - 0x34 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL1 - desc DMA2_TRGSEL1 - 0x38 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL2 - desc DMA2_TRGSEL2 - 0x3C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL3 - desc DMA2_TRGSEL3 - 0x40 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL4 - desc DMA2_TRGSEL4 - 0x44 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL5 - desc DMA2_TRGSEL5 - 0x48 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL6 - desc DMA2_TRGSEL6 - 0x4C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL7 - desc DMA2_TRGSEL7 - 0x50 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA_TRGSELRC - desc DMA_TRGSELRC - 0x54 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR0 - desc TMR6_HTSSR0 - 0x58 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR1 - desc TMR6_HTSSR1 - 0x5C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR2 - desc TMR6_HTSSR2 - 0x60 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR3 - desc TMR6_HTSSR3 - 0x64 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - PEVNTTRGSR12 - desc PEVNTTRGSR12 - 0x68 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - PEVNTTRGSR34 - desc PEVNTTRGSR34 - 0x6C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR0_HTSSR - desc TMR0_HTSSR - 0x70 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR2_HTSSR - desc TMR2_HTSSR - 0x74 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - HASH_ITRGSELA - desc HASH_ITRGSELA - 0x78 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - HASH_ITRGSELB - desc HASH_ITRGSELB - 0x7C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR0 - desc TMRA_HTSSR0 - 0x80 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR1 - desc TMRA_HTSSR1 - 0x84 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR2 - desc TMRA_HTSSR2 - 0x88 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR3 - desc TMRA_HTSSR3 - 0x8C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - OTS_TRG - desc OTS_TRG - 0x90 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC1_ITRGSELR0 - desc ADC1_ITRGSELR0 - 0x94 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC1_ITRGSELR1 - desc ADC1_ITRGSELR1 - 0x98 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC2_ITRGSELR0 - desc ADC2_ITRGSELR0 - 0x9C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC2_ITRGSELR1 - desc ADC2_ITRGSELR1 - 0xA0 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC3_ITRGSELR0 - desc ADC3_ITRGSELR0 - 0xA4 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC3_ITRGSELR1 - desc ADC3_ITRGSELR1 - 0xA8 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - COMTRG1 - desc COMTRG1 - 0xAC - 32 - read-write - 0x1FF - 0x1FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - - - COMTRG2 - desc COMTRG2 - 0xB0 - 32 - read-write - 0x1FF - 0x1FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - - - PEVNTDIRR1 - desc PEVNTDIRR1 - 0x100 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR - desc PDIR - 15 - 0 - read-write - - - - - PEVNTIDR1 - desc PEVNTIDR1 - 0x104 - 32 - read-only - 0x0 - 0xFFFF - - - PIN - desc PIN - 15 - 0 - read-only - - - - - PEVNTODR1 - desc PEVNTODR1 - 0x108 - 32 - read-write - 0x0 - 0xFFFF - - - POUT - desc POUT - 15 - 0 - read-write - - - - - PEVNTORR1 - desc PEVNTORR1 - 0x10C - 32 - read-write - 0x0 - 0xFFFF - - - POR - desc POR - 15 - 0 - read-write - - - - - PEVNTOSR1 - desc PEVNTOSR1 - 0x110 - 32 - read-write - 0x0 - 0xFFFF - - - POS - desc POS - 15 - 0 - read-write - - - - - PEVNTRISR1 - desc PEVNTRISR1 - 0x114 - 32 - read-write - 0x0 - 0xFFFF - - - RIS - desc RIS - 15 - 0 - read-write - - - - - PEVNTFAL1 - desc PEVNTFAL1 - 0x118 - 32 - read-write - 0x0 - 0xFFFF - - - FAL - desc FAL - 15 - 0 - read-write - - - - - PEVNTDIRR2 - desc PEVNTDIRR2 - 0x11C - 32 - read-write - 0x0 - 0xFFFF - - - PDIR - desc PDIR - 15 - 0 - read-write - - - - - PEVNTIDR2 - desc PEVNTIDR2 - 0x120 - 32 - read-only - 0x0 - 0xFFFF - - - PIN - desc PIN - 15 - 0 - read-only - - - - - PEVNTODR2 - desc PEVNTODR2 - 0x124 - 32 - read-write - 0x0 - 0xFFFF - - - POUT - desc POUT - 15 - 0 - read-write - - - - - PEVNTORR2 - desc PEVNTORR2 - 0x128 - 32 - read-write - 0x0 - 0xFFFF - - - POR - desc POR - 15 - 0 - read-write - - - - - PEVNTOSR2 - desc PEVNTOSR2 - 0x12C - 32 - read-write - 0x0 - 0xFFFF - - - POS - desc POS - 15 - 0 - read-write - - - - - PEVNTRISR2 - desc PEVNTRISR2 - 0x130 - 32 - read-write - 0x0 - 0xFFFF - - - RIS - desc RIS - 15 - 0 - read-write - - - - - PEVNTFAL2 - desc PEVNTFAL2 - 0x134 - 32 - read-write - 0x0 - 0xFFFF - - - FAL - desc FAL - 15 - 0 - read-write - - - - - PEVNTDIRR3 - desc PEVNTDIRR3 - 0x138 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR - desc PDIR - 15 - 0 - read-write - - - - - PEVNTIDR3 - desc PEVNTIDR3 - 0x13C - 32 - read-only - 0x0 - 0xFFFF - - - PIN - desc PIN - 15 - 0 - read-only - - - - - PEVNTODR3 - desc PEVNTODR3 - 0x140 - 32 - read-write - 0x0 - 0xFFFF - - - POUT - desc POUT - 15 - 0 - read-write - - - - - PEVNTORR3 - desc PEVNTORR3 - 0x144 - 32 - read-write - 0x0 - 0xFFFF - - - POR - desc POR - 15 - 0 - read-write - - - - - PEVNTOSR3 - desc PEVNTOSR3 - 0x148 - 32 - read-write - 0x0 - 0xFFFF - - - POS - desc POS - 15 - 0 - read-write - - - - - PEVNTRISR3 - desc PEVNTRISR3 - 0x14C - 32 - read-write - 0x0 - 0xFFFF - - - RIS - desc RIS - 15 - 0 - read-write - - - - - PEVNTFAL3 - desc PEVNTFAL3 - 0x150 - 32 - read-write - 0x0 - 0xFFFF - - - FAL - desc FAL - 15 - 0 - read-write - - - - - PEVNTDIRR4 - desc PEVNTDIRR4 - 0x154 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR - desc PDIR - 15 - 0 - read-write - - - - - PEVNTIDR4 - desc PEVNTIDR4 - 0x158 - 32 - read-only - 0x0 - 0xFFFF - - - PIN - desc PIN - 15 - 0 - read-only - - - - - PEVNTODR4 - desc PEVNTODR4 - 0x15C - 32 - read-write - 0x0 - 0xFFFF - - - POUT - desc POUT - 15 - 0 - read-write - - - - - PEVNTORR4 - desc PEVNTORR4 - 0x160 - 32 - read-write - 0x0 - 0xFFFF - - - POR - desc POR - 15 - 0 - read-write - - - - - PEVNTOSR4 - desc PEVNTOSR4 - 0x164 - 32 - read-write - 0x0 - 0xFFFF - - - POS - desc POS - 15 - 0 - read-write - - - - - PEVNTRISR4 - desc PEVNTRISR4 - 0x168 - 32 - read-write - 0x0 - 0xFFFF - - - RIS - desc RIS - 15 - 0 - read-write - - - - - PEVNTFAL4 - desc PEVNTFAL4 - 0x16C - 32 - read-write - 0x0 - 0xFFFF - - - FAL - desc FAL - 15 - 0 - read-write - - - - - PEVNTNFCR - desc PEVNTNFCR - 0x170 - 32 - read-write - 0x0 - 0x7070707 - - - NFEN1 - desc NFEN1 - 0 - 0 - read-write - - - DIVS1 - desc DIVS1 - 2 - 1 - read-write - - - NFEN2 - desc NFEN2 - 8 - 8 - read-write - - - DIVS2 - desc DIVS2 - 10 - 9 - read-write - - - NFEN3 - desc NFEN3 - 16 - 16 - read-write - - - DIVS3 - desc DIVS3 - 18 - 17 - read-write - - - NFEN4 - desc NFEN4 - 24 - 24 - read-write - - - DIVS4 - desc DIVS4 - 26 - 25 - read-write - - - - - - - CAN1 - desc CAN - 0x40009000 - - 0x0 - 0xCA - - - - RBUF - desc RBUF - 0x0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - TBUF - desc TBUF - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CFG_STAT - desc CFG_STAT - 0xA0 - 8 - read-write - 0x80 - 0xFF - - - BUSOFF - desc BUSOFF - 0 - 0 - read-write - - - TACTIVE - desc TACTIVE - 1 - 1 - read-only - - - RACTIVE - desc RACTIVE - 2 - 2 - read-only - - - TSSS - desc TSSS - 3 - 3 - read-write - - - TPSS - desc TPSS - 4 - 4 - read-write - - - LBMI - desc LBMI - 5 - 5 - read-write - - - LBME - desc LBME - 6 - 6 - read-write - - - RESET - desc RESET - 7 - 7 - read-write - - - - - TCMD - desc TCMD - 0xA1 - 8 - read-write - 0x0 - 0xDF - - - TSA - desc TSA - 0 - 0 - read-write - - - TSALL - desc TSALL - 1 - 1 - read-write - - - TSONE - desc TSONE - 2 - 2 - read-write - - - TPA - desc TPA - 3 - 3 - read-write - - - TPE - desc TPE - 4 - 4 - read-write - - - LOM - desc LOM - 6 - 6 - read-write - - - TBSEL - desc TBSEL - 7 - 7 - read-write - - - - - TCTRL - desc TCTRL - 0xA2 - 8 - read-write - 0x90 - 0xF3 - - - TSSTAT - desc TSSTAT - 1 - 0 - read-only - - - TTTBM - desc TTTBM - 4 - 4 - read-write - - - TSMODE - desc TSMODE - 5 - 5 - read-write - - - TSNEXT - desc TSNEXT - 6 - 6 - read-write - - - FD_ISO - desc FD_ISO - 7 - 7 - read-write - - - - - RCTRL - desc RCTRL - 0xA3 - 8 - read-write - 0x0 - 0xFB - - - RSTAT - desc RSTAT - 1 - 0 - read-only - - - RBALL - desc RBALL - 3 - 3 - read-write - - - RREL - desc RREL - 4 - 4 - read-write - - - ROV - desc ROV - 5 - 5 - read-only - - - ROM - desc ROM - 6 - 6 - read-write - - - SACK - desc SACK - 7 - 7 - read-write - - - - - RTIE - desc RTIE - 0xA4 - 8 - read-write - 0xFE - 0xFF - - - TSFF - desc TSFF - 0 - 0 - read-only - - - EIE - desc EIE - 1 - 1 - read-write - - - TSIE - desc TSIE - 2 - 2 - read-write - - - TPIE - desc TPIE - 3 - 3 - read-write - - - RAFIE - desc RAFIE - 4 - 4 - read-write - - - RFIE - desc RFIE - 5 - 5 - read-write - - - ROIE - desc ROIE - 6 - 6 - read-write - - - RIE - desc RIE - 7 - 7 - read-write - - - - - RTIF - desc RTIF - 0xA5 - 8 - read-write - 0x0 - 0xFF - - - AIF - desc AIF - 0 - 0 - read-write - - - EIF - desc EIF - 1 - 1 - read-write - - - TSIF - desc TSIF - 2 - 2 - read-write - - - TPIF - desc TPIF - 3 - 3 - read-write - - - RAFIF - desc RAFIF - 4 - 4 - read-write - - - RFIF - desc RFIF - 5 - 5 - read-write - - - ROIF - desc ROIF - 6 - 6 - read-write - - - RIF - desc RIF - 7 - 7 - read-write - - - - - ERRINT - desc ERRINT - 0xA6 - 8 - read-write - 0x0 - 0xFF - - - BEIF - desc BEIF - 0 - 0 - read-write - - - BEIE - desc BEIE - 1 - 1 - read-write - - - ALIF - desc ALIF - 2 - 2 - read-write - - - ALIE - desc ALIE - 3 - 3 - read-write - - - EPIF - desc EPIF - 4 - 4 - read-write - - - EPIE - desc EPIE - 5 - 5 - read-write - - - EPASS - desc EPASS - 6 - 6 - read-only - - - EWARN - desc EWARN - 7 - 7 - read-only - - - - - LIMIT - desc LIMIT - 0xA7 - 8 - read-write - 0x1B - 0xFF - - - EWL - desc EWL - 3 - 0 - read-write - - - AFWL - desc AFWL - 7 - 4 - read-write - - - - - SBT - desc SBT - 0xA8 - 32 - read-write - 0x1020203 - 0xFF7F7FFF - - - S_SEG_1 - desc S_SEG_1 - 7 - 0 - read-write - - - S_SEG_2 - desc S_SEG_2 - 14 - 8 - read-write - - - S_SJW - desc S_SJW - 22 - 16 - read-write - - - S_PRESC - desc S_PRESC - 31 - 24 - read-write - - - - - FBT - desc FBT - 0xAC - 32 - read-write - 0x1020203 - 0xFF0F0F1F - - - F_SEG_1 - desc F_SEG_1 - 4 - 0 - read-write - - - F_SEG_2 - desc F_SEG_2 - 11 - 8 - read-write - - - F_SJW - desc F_SJW - 19 - 16 - read-write - - - F_PRESC - desc F_PRESC - 31 - 24 - read-write - - - - - EALCAP - desc EALCAP - 0xB0 - 8 - read-only - 0x0 - 0xFF - - - ALC - desc ALC - 4 - 0 - read-only - - - KOER - desc KOER - 7 - 5 - read-only - - - - - TDC - desc TDC - 0xB1 - 8 - read-write - 0x0 - 0xFF - - - SSPOFF - desc SSPOFF - 6 - 0 - read-write - - - TDCEN - desc TDCEN - 7 - 7 - read-write - - - - - RECNT - desc RECNT - 0xB2 - 8 - read-write - 0x0 - 0xFF - - - TECNT - desc TECNT - 0xB3 - 8 - read-write - 0x0 - 0xFF - - - ACFCTRL - desc ACFCTRL - 0xB4 - 8 - read-write - 0x0 - 0x2F - - - ACFADR - desc ACFADR - 3 - 0 - read-write - - - SELMASK - desc SELMASK - 5 - 5 - read-write - - - - - ACFEN - desc ACFEN - 0xB6 - 16 - read-write - 0x1 - 0xFFFF - - - AE_1 - desc AE_1 - 0 - 0 - read-write - - - AE_2 - desc AE_2 - 1 - 1 - read-write - - - AE_3 - desc AE_3 - 2 - 2 - read-write - - - AE_4 - desc AE_4 - 3 - 3 - read-write - - - AE_5 - desc AE_5 - 4 - 4 - read-write - - - AE_6 - desc AE_6 - 5 - 5 - read-write - - - AE_7 - desc AE_7 - 6 - 6 - read-write - - - AE_8 - desc AE_8 - 7 - 7 - read-write - - - AE_9 - desc AE_9 - 8 - 8 - read-write - - - AE_10 - desc AE_10 - 9 - 9 - read-write - - - AE_11 - desc AE_11 - 10 - 10 - read-write - - - AE_12 - desc AE_12 - 11 - 11 - read-write - - - AE_13 - desc AE_13 - 12 - 12 - read-write - - - AE_14 - desc AE_14 - 13 - 13 - read-write - - - AE_15 - desc AE_15 - 14 - 14 - read-write - - - AE_16 - desc AE_16 - 15 - 15 - read-write - - - - - ACF - desc ACF - 0xB8 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - ACODEORAMASK - desc ACODEORAMASK - 28 - 0 - read-write - - - AIDE - desc AIDE - 29 - 29 - read-write - - - AIDEE - desc AIDEE - 30 - 30 - read-write - - - - - TBSLOT - desc TBSLOT - 0xBE - 8 - read-write - 0x0 - 0xFF - - - TBPTR - desc TBPTR - 5 - 0 - read-write - - - TBF - desc TBF - 6 - 6 - read-write - - - TBE - desc TBE - 7 - 7 - read-write - - - - - TTCFG - desc TTCFG - 0xBF - 8 - read-write - 0x90 - 0xFF - - - TTEN - desc TTEN - 0 - 0 - read-write - - - T_PRESC - desc T_PRESC - 2 - 1 - read-write - - - TTIF - desc TTIF - 3 - 3 - read-write - - - TTIE - desc TTIE - 4 - 4 - read-write - - - TEIF - desc TEIF - 5 - 5 - read-write - - - WTIF - desc WTIF - 6 - 6 - read-write - - - WTIE - desc WTIE - 7 - 7 - read-write - - - - - REF_MSG - desc REF_MSG - 0xC0 - 32 - read-write - 0x0 - 0x9FFFFFFF - - - REF_ID - desc REF_ID - 28 - 0 - read-write - - - REF_IDE - desc REF_IDE - 31 - 31 - read-write - - - - - TRG_CFG - desc TRG_CFG - 0xC4 - 16 - read-write - 0x0 - 0xF73F - - - TTPTR - desc TTPTR - 5 - 0 - read-write - - - TTYPE - desc TTYPE - 10 - 8 - read-write - - - TEW - desc TEW - 15 - 12 - read-write - - - - - TT_TRIG - desc TT_TRIG - 0xC6 - 16 - read-write - 0x0 - 0xFFFF - - - TT_WTRIG - desc TT_WTRIG - 0xC8 - 16 - read-write - 0xFFFF - 0xFFFF - - - - - CAN2 - desc CAN - 0x40078000 - - 0x0 - 0xCA - - - - CMP1 - desc CMP - 0x4004A000 - - 0x0 - 0xA - - - - MDR - desc MDR - 0x0 - 8 - read-write - 0x0 - 0x83 - - - CENB - desc CENB - 0 - 0 - read-write - - - CWDE - desc CWDE - 1 - 1 - read-write - - - CMON - desc CMON - 7 - 7 - read-only - - - - - FIR - desc FIR - 0x1 - 8 - read-write - 0x0 - 0x73 - - - FCKS - desc FCKS - 1 - 0 - read-write - - - EDGS - desc EDGS - 5 - 4 - read-write - - - CIEN - desc CIEN - 6 - 6 - read-write - - - - - OCR - desc OCR - 0x2 - 8 - read-write - 0x0 - 0x1F - - - COEN - desc COEN - 0 - 0 - read-write - - - COPS - desc COPS - 1 - 1 - read-write - - - CPOE - desc CPOE - 2 - 2 - read-write - - - TWOE - desc TWOE - 3 - 3 - read-write - - - TWOL - desc TWOL - 4 - 4 - read-write - - - - - PMSR - desc PMSR - 0x3 - 8 - read-write - 0x0 - 0xFF - - - RVSL - desc RVSL - 3 - 0 - read-write - - - CVSL - desc CVSL - 7 - 4 - read-write - - - - - TWSR - desc TWSR - 0x4 - 16 - read-write - 0x0 - 0xFFFF - - - CTWS0 - desc CTWS0 - 0 - 0 - read-write - - - CTWS1 - desc CTWS1 - 1 - 1 - read-write - - - CTWS2 - desc CTWS2 - 2 - 2 - read-write - - - CTWS3 - desc CTWS3 - 3 - 3 - read-write - - - CTWS4 - desc CTWS4 - 4 - 4 - read-write - - - CTWS5 - desc CTWS5 - 5 - 5 - read-write - - - CTWS6 - desc CTWS6 - 6 - 6 - read-write - - - CTWS7 - desc CTWS7 - 7 - 7 - read-write - - - CTWS8 - desc CTWS8 - 8 - 8 - read-write - - - CTWS9 - desc CTWS9 - 9 - 9 - read-write - - - CTWS10 - desc CTWS10 - 10 - 10 - read-write - - - CTWS11 - desc CTWS11 - 11 - 11 - read-write - - - CTWS12 - desc CTWS12 - 12 - 12 - read-write - - - CTWS13 - desc CTWS13 - 13 - 13 - read-write - - - CTWS14 - desc CTWS14 - 14 - 14 - read-write - - - CTWS15 - desc CTWS15 - 15 - 15 - read-write - - - - - TWPR - desc TWPR - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - CTWP0 - desc CTWP0 - 0 - 0 - read-write - - - CTWP1 - desc CTWP1 - 1 - 1 - read-write - - - CTWP2 - desc CTWP2 - 2 - 2 - read-write - - - CTWP3 - desc CTWP3 - 3 - 3 - read-write - - - CTWP4 - desc CTWP4 - 4 - 4 - read-write - - - CTWP5 - desc CTWP5 - 5 - 5 - read-write - - - CTWP6 - desc CTWP6 - 6 - 6 - read-write - - - CTWP7 - desc CTWP7 - 7 - 7 - read-write - - - CTWP8 - desc CTWP8 - 8 - 8 - read-write - - - CTWP9 - desc CTWP9 - 9 - 9 - read-write - - - CTWP10 - desc CTWP10 - 10 - 10 - read-write - - - CTWP11 - desc CTWP11 - 11 - 11 - read-write - - - CTWP12 - desc CTWP12 - 12 - 12 - read-write - - - CTWP13 - desc CTWP13 - 13 - 13 - read-write - - - CTWP14 - desc CTWP14 - 14 - 14 - read-write - - - CTWP15 - desc CTWP15 - 15 - 15 - read-write - - - - - VISR - desc VISR - 0x8 - 16 - read-write - 0x0 - 0x37 - - - P2SL - desc P2SL - 2 - 0 - read-write - - - P3SL - desc P3SL - 5 - 4 - read-write - - - - - - - CMP2 - desc CMP - 0x4004A010 - - 0x0 - 0xA - - - - CMP3 - desc CMP - 0x4004A400 - - 0x0 - 0xA - - - - CMP4 - desc CMP - 0x4004A410 - - 0x0 - 0xA - - - - CMU - desc CMU - 0x4004C400 - - 0x0 - 0x7D08 - - - - XTAL32CR - desc XTAL32CR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - XTAL32STP - desc XTAL32STP - 0 - 0 - read-write - - - - - XTAL32CFGR - desc XTAL32CFGR - 0x4 - 8 - read-write - 0x0 - 0x7 - - - XTAL32DRV - desc XTAL32DRV - 2 - 0 - read-write - - - XTAL32IE - desc XTAL32IE - 3 - 3 - read-write - - - - - XTAL32NFR - desc XTAL32NFR - 0x14 - 8 - read-write - 0x0 - 0x3 - - - XTAL32NF - desc XTAL32NF - 1 - 0 - read-write - - - - - LRCCR - desc LRCCR - 0x1C - 8 - read-write - 0x0 - 0x1 - - - LRCSTP - desc LRCSTP - 0 - 0 - read-write - - - - - RTCLRCCR - desc RTCLRCCR - 0x20 - 8 - read-write - 0x0 - 0x1 - - - RTCLRCSTP - desc RTCLRCSTP - 0 - 0 - read-write - - - - - LRCTRM - desc LRCTRM - 0x24 - 8 - read-write - 0x0 - 0xFF - - - RTCLRCTRM - desc RTCLRCTRM - 0x2C - 8 - read-write - 0x0 - 0xFF - - - XTALCFGR - desc XTALCFGR - 0x878 - 8 - read-write - 0x80 - 0x70 - - - XTALDRV - desc XTALDRV - 5 - 4 - read-write - - - XTALMS - desc XTALMS - 6 - 6 - read-write - - - - - PERICKSEL - desc PERICKSEL - 0x7C10 - 16 - read-write - 0x0 - 0xF - - - PERICKSEL - desc PERICKSEL - 3 - 0 - read-write - - - - - I2SCKSEL - desc I2SCKSEL - 0x7C12 - 16 - read-write - 0xBBBB - 0xFFFF - - - I2S1CKSEL - desc I2S1CKSEL - 3 - 0 - read-write - - - I2S2CKSEL - desc I2S2CKSEL - 7 - 4 - read-write - - - I2S3CKSEL - desc I2S3CKSEL - 11 - 8 - read-write - - - I2S4CKSEL - desc I2S4CKSEL - 15 - 12 - read-write - - - - - CANCKCFGR - desc CANCKCFGR - 0x7C18 - 8 - read-write - 0xDD - 0xFF - - - CAN1CKS - desc CAN1CKS - 3 - 0 - read-write - - - CAN2CKS - desc CAN2CKS - 7 - 4 - read-write - - - - - SCFGR - desc SCFGR - 0x7C20 - 32 - read-write - 0x0 - 0x7777777 - - - PCLK0S - desc PCLK0S - 2 - 0 - read-write - - - PCLK1S - desc PCLK1S - 6 - 4 - read-write - - - PCLK2S - desc PCLK2S - 10 - 8 - read-write - - - PCLK3S - desc PCLK3S - 14 - 12 - read-write - - - PCLK4S - desc PCLK4S - 18 - 16 - read-write - - - EXCKS - desc EXCKS - 22 - 20 - read-write - - - HCLKS - desc HCLKS - 26 - 24 - read-write - - - - - USBCKCFGR - desc USBCKCFGR - 0x7C24 - 8 - read-write - 0x40 - 0xF0 - - - USBCKS - desc USBCKS - 7 - 4 - read-write - - - - - CKSWR - desc CKSWR - 0x7C26 - 8 - read-write - 0x1 - 0x7 - - - CKSW - desc CKSW - 2 - 0 - read-write - - - - - PLLHCR - desc PLLHCR - 0x7C2A - 8 - read-write - 0x1 - 0x1 - - - PLLHOFF - desc PLLHOFF - 0 - 0 - read-write - - - - - PLLACR - desc PLLACR - 0x7C2E - 8 - read-write - 0x1 - 0x1 - - - PLLAOFF - desc PLLAOFF - 0 - 0 - read-write - - - - - XTALCR - desc XTALCR - 0x7C32 - 8 - read-write - 0x1 - 0x1 - - - XTALSTP - desc XTALSTP - 0 - 0 - read-write - - - - - HRCCR - desc HRCCR - 0x7C36 - 8 - read-write - 0x1 - 0x1 - - - HRCSTP - desc HRCSTP - 0 - 0 - read-write - - - - - MRCCR - desc MRCCR - 0x7C38 - 8 - read-write - 0x80 - 0x1 - - - MRCSTP - desc MRCSTP - 0 - 0 - read-write - - - - - OSCSTBSR - desc OSCSTBSR - 0x7C3C - 8 - read-write - 0x0 - 0xE9 - - - HRCSTBF - desc HRCSTBF - 0 - 0 - read-write - - - XTALSTBF - desc XTALSTBF - 3 - 3 - read-write - - - PLLHSTBF - desc PLLHSTBF - 5 - 5 - read-write - - - PLLASTBF - desc PLLASTBF - 6 - 6 - read-write - - - - - MCOCFGR1 - desc MCOCFGR1 - 0x7C3D - 8 - read-write - 0x0 - 0xFF - - - MCOSEL - desc MCOSEL - 3 - 0 - read-write - - - MCODIV - desc MCODIV - 6 - 4 - read-write - - - MCOEN - desc MCOEN - 7 - 7 - read-write - - - - - MCOCFGR2 - desc MCOCFGR2 - 0x7C3E - 8 - read-write - 0x0 - 0xFF - - - MCOSEL - desc MCOSEL - 3 - 0 - read-write - - - MCODIV - desc MCODIV - 6 - 4 - read-write - - - MCOEN - desc MCOEN - 7 - 7 - read-write - - - - - TPIUCKCFGR - desc TPIUCKCFGR - 0x7C3F - 8 - read-write - 0x0 - 0x83 - - - TPIUCKS - desc TPIUCKS - 1 - 0 - read-write - - - TPIUCKOE - desc TPIUCKOE - 7 - 7 - read-write - - - - - XTALSTDCR - desc XTALSTDCR - 0x7C40 - 8 - read-write - 0x0 - 0x87 - - - XTALSTDIE - desc XTALSTDIE - 0 - 0 - read-write - - - XTALSTDRE - desc XTALSTDRE - 1 - 1 - read-write - - - XTALSTDRIS - desc XTALSTDRIS - 2 - 2 - read-write - - - XTALSTDE - desc XTALSTDE - 7 - 7 - read-write - - - - - XTALSTDSR - desc XTALSTDSR - 0x7C41 - 8 - read-write - 0x0 - 0x1 - - - XTALSTDF - desc XTALSTDF - 0 - 0 - read-write - - - - - MRCTRM - desc MRCTRM - 0x7C61 - 8 - read-write - 0x0 - 0xFF - - - HRCTRM - desc HRCTRM - 0x7C62 - 8 - read-write - 0x0 - 0xFF - - - XTALSTBCR - desc XTALSTBCR - 0x7CA2 - 8 - read-write - 0x5 - 0xF - - - XTALSTB - desc XTALSTB - 3 - 0 - read-write - - - - - PLLHCFGR - desc PLLHCFGR - 0x7D00 - 32 - read-write - 0x11101300 - 0xFFF1FF9F - - - PLLHM - desc PLLHM - 1 - 0 - read-write - - - PLLSRC - desc PLLSRC - 7 - 7 - read-write - - - PLLHN - desc PLLHN - 15 - 8 - read-write - - - PLLHR - desc PLLHR - 23 - 20 - read-write - - - PLLHQ - desc PLLHQ - 27 - 24 - read-write - - - PLLHP - desc PLLHP - 31 - 28 - read-write - - - - - PLLACFGR - desc PLLACFGR - 0x7D04 - 32 - read-write - 0x11101300 - 0xFFF1FF1F - - - PLLAM - desc PLLAM - 4 - 0 - read-write - - - PLLAN - desc PLLAN - 16 - 8 - read-write - - - PLLAR - desc PLLAR - 23 - 20 - read-write - - - PLLAQ - desc PLLAQ - 27 - 24 - read-write - - - PLLAP - desc PLLAP - 31 - 28 - read-write - - - - - - - CRC - desc CRC - 0x40008C00 - - 0x0 - 0x100 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x1 - 0x3 - - - CR - desc CR - 0 - 0 - read-write - - - FLAG - desc FLAG - 1 - 1 - read-only - - - - - RESLT - desc RESLT - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT0 - desc DAT0 - 0x80 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT1 - desc DAT1 - 0x84 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT2 - desc DAT2 - 0x88 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT3 - desc DAT3 - 0x8C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT4 - desc DAT4 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT5 - desc DAT5 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT6 - desc DAT6 - 0x98 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT7 - desc DAT7 - 0x9C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT8 - desc DAT8 - 0xA0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT9 - desc DAT9 - 0xA4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT10 - desc DAT10 - 0xA8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT11 - desc DAT11 - 0xAC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT12 - desc DAT12 - 0xB0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT13 - desc DAT13 - 0xB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT14 - desc DAT14 - 0xB8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT15 - desc DAT15 - 0xBC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT16 - desc DAT16 - 0xC0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT17 - desc DAT17 - 0xC4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT18 - desc DAT18 - 0xC8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT19 - desc DAT19 - 0xCC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT20 - desc DAT20 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT21 - desc DAT21 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT22 - desc DAT22 - 0xD8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT23 - desc DAT23 - 0xDC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT24 - desc DAT24 - 0xE0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT25 - desc DAT25 - 0xE4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT26 - desc DAT26 - 0xE8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT27 - desc DAT27 - 0xEC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT28 - desc DAT28 - 0xF0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT29 - desc DAT29 - 0xF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT30 - desc DAT30 - 0xF8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT31 - desc DAT31 - 0xFC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - CTC - desc CTC - 0x40049C00 - - 0x0 - 0xC - - - - CR1 - desc CR1 - 0x0 - 32 - read-write - 0x0 - 0x3F00F7 - - - REFPSC - desc REFPSC - 2 - 0 - read-write - - - REFCKS - desc REFCKS - 5 - 4 - read-write - - - ERRIE - desc ERRIE - 6 - 6 - read-write - - - CTCEN - desc CTCEN - 7 - 7 - read-write - - - TRMVAL - desc TRMVAL - 21 - 16 - read-write - - - - - CR2 - desc CR2 - 0x4 - 32 - read-write - 0x0 - 0xFFFF00FF - - - OFSVAL - desc OFSVAL - 7 - 0 - read-write - - - RLDVAL - desc RLDVAL - 31 - 16 - read-write - - - - - STR - desc STR - 0x8 - 32 - read-only - 0x0 - 0xF - - - TRIMOK - desc TRIMOK - 0 - 0 - read-only - - - TRMOVF - desc TRMOVF - 1 - 1 - read-only - - - TRMUDF - desc TRMUDF - 2 - 2 - read-only - - - CTCBSY - desc CTCBSY - 3 - 3 - read-only - - - - - - - DAC1 - desc DAC - 0x40041000 - - 0x0 - 0x1E - - - - DADR1 - desc DADR1 - 0x0 - 16 - read-write - 0x0 - 0xFFFF - - - DADR2 - desc DADR2 - 0x2 - 16 - read-write - 0x0 - 0xFFFF - - - DACR - desc DACR - 0x4 - 16 - read-write - 0x0 - 0x1F07 - - - DAEN - desc DAEN - 0 - 0 - read-write - - - DA1EN - desc DA1EN - 1 - 1 - read-write - - - DA2EN - desc DA2EN - 2 - 2 - read-write - - - ALIGN - desc ALIGN - 8 - 8 - read-write - - - DAAMP1 - desc DAAMP1 - 9 - 9 - read-write - - - DAAMP2 - desc DAAMP2 - 10 - 10 - read-write - - - EXTDSL1 - desc EXTDSL1 - 11 - 11 - read-write - - - EXTDSL2 - desc EXTDSL2 - 12 - 12 - read-write - - - - - DAADPCR - desc DAADPCR - 0x6 - 16 - read-write - 0x0 - 0x8307 - - - ADPSL1 - desc ADPSL1 - 0 - 0 - read-write - - - ADPSL2 - desc ADPSL2 - 1 - 1 - read-write - - - ADPSL3 - desc ADPSL3 - 2 - 2 - read-write - - - DA1SF - desc DA1SF - 8 - 8 - read-only - - - DA2SF - desc DA2SF - 9 - 9 - read-only - - - ADPEN - desc ADPEN - 15 - 15 - read-write - - - - - DAOCR - desc DAOCR - 0x1C - 16 - read-write - 0x0 - 0xC000 - - - DAODIS1 - desc DAODIS1 - 14 - 14 - read-write - - - DAODIS2 - desc DAODIS2 - 15 - 15 - read-write - - - - - - - DAC2 - desc DAC - 0x40041400 - - 0x0 - 0x1E - - - - DBGC - desc DBGC - 0xE0042000 - - 0x0 - 0x2C - - - - AUTHID0 - desc AUTHID0 - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - AUTHID1 - desc AUTHID1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - AUTHID2 - desc AUTHID2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RESV0 - desc RESV0 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MCUSTAT - desc MCUSTAT - 0x10 - 32 - read-write - 0x0 - 0x30F - - - AUTH - desc AUTH - 0 - 0 - read-write - - - REMVLOCK - desc REMVLOCK - 1 - 1 - read-write - - - SAFTYLOCK1 - desc SAFTYLOCK1 - 2 - 2 - read-write - - - SAFTYLOCK2 - desc SAFTYLOCK2 - 3 - 3 - read-write - - - CPUSTOP - desc CPUSTOP - 8 - 8 - read-write - - - CPUSLEEP - desc CPUSLEEP - 9 - 9 - read-write - - - - - MCUCTL - desc MCUCTL - 0x14 - 32 - read-write - 0x0 - 0x103 - - - EDBGRQ - desc EDBGRQ - 0 - 0 - read-write - - - RESTART - desc RESTART - 1 - 1 - read-write - - - DIRQ - desc DIRQ - 8 - 8 - read-write - - - - - FMCCTL - desc FMCCTL - 0x18 - 32 - read-write - 0x0 - 0x7 - - - ERASEREQ - desc ERASEREQ - 0 - 0 - read-write - - - ERASEACK - desc ERASEACK - 1 - 1 - read-write - - - ERASEERR - desc ERASEERR - 2 - 2 - read-write - - - - - MCUDBGCSTAT - desc MCUDBGCSTAT - 0x1C - 32 - read-write - 0x0 - 0x3 - - - CDBGPWRUPREQ - desc CDBGPWRUPREQ - 0 - 0 - read-write - - - CDBGPWRUPACK - desc CDBGPWRUPACK - 1 - 1 - read-write - - - - - MCUSTPCTL - desc MCUSTPCTL - 0x20 - 32 - read-write - 0x3B - 0x7FFFFF - - - SWDTSTP - desc SWDTSTP - 0 - 0 - read-write - - - WDTSTP - desc WDTSTP - 1 - 1 - read-write - - - RTCSTP - desc RTCSTP - 2 - 2 - read-write - - - PVD0STP - desc PVD0STP - 3 - 3 - read-write - - - PVD1STP - desc PVD1STP - 4 - 4 - read-write - - - PVD2STP - desc PVD2STP - 5 - 5 - read-write - - - M06STP - desc M06STP - 6 - 6 - read-write - - - M07STP - desc M07STP - 7 - 7 - read-write - - - M08STP - desc M08STP - 8 - 8 - read-write - - - M09STP - desc M09STP - 9 - 9 - read-write - - - M10STP - desc M10STP - 10 - 10 - read-write - - - M11STP - desc M11STP - 11 - 11 - read-write - - - M12STP - desc M12STP - 12 - 12 - read-write - - - M13STP - desc M13STP - 13 - 13 - read-write - - - M14STP - desc M14STP - 14 - 14 - read-write - - - M15STP - desc M15STP - 15 - 15 - read-write - - - M16STP - desc M16STP - 16 - 16 - read-write - - - M17STP - desc M17STP - 17 - 17 - read-write - - - M18STP - desc M18STP - 18 - 18 - read-write - - - M19STP - desc M19STP - 19 - 19 - read-write - - - M20STP - desc M20STP - 20 - 20 - read-write - - - M21STP - desc M21STP - 21 - 21 - read-write - - - M22STP - desc M22STP - 22 - 22 - read-write - - - - - MCUTRACECTL - desc MCUTRACECTL - 0x24 - 32 - read-write - 0x0 - 0x7 - - - TRACEMODE - desc TRACEMODE - 1 - 0 - read-write - - - TRACEIOEN - desc TRACEIOEN - 2 - 2 - read-write - - - - - MCUSTPCTL2 - desc MCUSTPCTL2 - 0x28 - 32 - read-write - 0x0 - 0xFFF - - - M32STP - desc M32STP - 0 - 0 - read-write - - - M33STP - desc M33STP - 1 - 1 - read-write - - - M34STP - desc M34STP - 2 - 2 - read-write - - - M35STP - desc M35STP - 3 - 3 - read-write - - - M36STP - desc M36STP - 4 - 4 - read-write - - - M37STP - desc M37STP - 5 - 5 - read-write - - - M38STP - desc M38STP - 6 - 6 - read-write - - - M39STP - desc M39STP - 7 - 7 - read-write - - - M40STP - desc M40STP - 8 - 8 - read-write - - - M41STP - desc M41STP - 9 - 9 - read-write - - - M42STP - desc M42STP - 10 - 10 - read-write - - - M43STP - desc M43STP - 11 - 11 - read-write - - - - - - - DCU1 - desc DCU - 0x40056000 - - 0x0 - 0x1C - - - - CTL - desc CTL - 0x0 - 32 - read-write - 0x80000000 - 0x8000013F - - - MODE - desc MODE - 3 - 0 - read-write - - - DATASIZE - desc DATASIZE - 5 - 4 - read-write - - - COMP_TRG - desc COMP_TRG - 8 - 8 - read-write - - - INTEN - desc INTEN - 31 - 31 - read-write - - - - - FLAG - desc FLAG - 0x4 - 32 - read-only - 0x0 - 0xE7F - - - FLAG_OP - desc FLAG_OP - 0 - 0 - read-only - - - FLAG_LS2 - desc FLAG_LS2 - 1 - 1 - read-only - - - FLAG_EQ2 - desc FLAG_EQ2 - 2 - 2 - read-only - - - FLAG_GT2 - desc FLAG_GT2 - 3 - 3 - read-only - - - FLAG_LS1 - desc FLAG_LS1 - 4 - 4 - read-only - - - FLAG_EQ1 - desc FLAG_EQ1 - 5 - 5 - read-only - - - FLAG_GT1 - desc FLAG_GT1 - 6 - 6 - read-only - - - FLAG_RLD - desc FLAG_RLD - 9 - 9 - read-only - - - FLAG_BTM - desc FLAG_BTM - 10 - 10 - read-only - - - FLAG_TOP - desc FLAG_TOP - 11 - 11 - read-only - - - - - DATA0 - desc DATA0 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA1 - desc DATA1 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA2 - desc DATA2 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FLAGCLR - desc FLAGCLR - 0x14 - 32 - write-only - 0x0 - 0xE7F - - - CLR_OP - desc CLR_OP - 0 - 0 - write-only - - - CLR_LS2 - desc CLR_LS2 - 1 - 1 - write-only - - - CLR_EQ2 - desc CLR_EQ2 - 2 - 2 - write-only - - - CLR_GT2 - desc CLR_GT2 - 3 - 3 - write-only - - - CLR_LS1 - desc CLR_LS1 - 4 - 4 - write-only - - - CLR_EQ1 - desc CLR_EQ1 - 5 - 5 - write-only - - - CLR_GT1 - desc CLR_GT1 - 6 - 6 - write-only - - - CLR_RLD - desc CLR_RLD - 9 - 9 - read-write - - - CLR_BTM - desc CLR_BTM - 10 - 10 - read-write - - - CLR_TOP - desc CLR_TOP - 11 - 11 - read-write - - - - - INTSEL - desc INTSEL - 0x18 - 32 - read-write - 0x0 - 0xFFF - - - INT_OP - desc INT_OP - 0 - 0 - read-write - - - INT_LS2 - desc INT_LS2 - 1 - 1 - read-write - - - INT_EQ2 - desc INT_EQ2 - 2 - 2 - read-write - - - INT_GT2 - desc INT_GT2 - 3 - 3 - read-write - - - INT_LS1 - desc INT_LS1 - 4 - 4 - read-write - - - INT_EQ1 - desc INT_EQ1 - 5 - 5 - read-write - - - INT_GT1 - desc INT_GT1 - 6 - 6 - read-write - - - INT_WIN - desc INT_WIN - 8 - 7 - read-write - - - INT_RLD - desc INT_RLD - 9 - 9 - read-write - - - INT_BTM - desc INT_BTM - 10 - 10 - read-write - - - INT_TOP - desc INT_TOP - 11 - 11 - read-write - - - - - - - DCU2 - desc DCU - 0x40056400 - - 0x0 - 0x1C - - - - DCU3 - desc DCU - 0x40056800 - - 0x0 - 0x1C - - - - DCU4 - desc DCU - 0x40056C00 - - 0x0 - 0x1C - - - - DCU5 - desc DCU - 0x40057000 - - 0x0 - 0x1C - - - - CTL - desc CTL - 0x0 - 32 - read-write - 0x80000000 - 0x8000013F - - - MODE - desc MODE - 3 - 0 - read-write - - - DATASIZE - desc DATASIZE - 5 - 4 - read-write - - - COMP_TRG - desc COMP_TRG - 8 - 8 - read-write - - - INTEN - desc INTEN - 31 - 31 - read-write - - - - - FLAG - desc FLAG - 0x4 - 32 - read-only - 0x0 - 0x7F - - - FLAG_OP - desc FLAG_OP - 0 - 0 - read-only - - - FLAG_LS2 - desc FLAG_LS2 - 1 - 1 - read-only - - - FLAG_EQ2 - desc FLAG_EQ2 - 2 - 2 - read-only - - - FLAG_GT2 - desc FLAG_GT2 - 3 - 3 - read-only - - - FLAG_LS1 - desc FLAG_LS1 - 4 - 4 - read-only - - - FLAG_EQ1 - desc FLAG_EQ1 - 5 - 5 - read-only - - - FLAG_GT1 - desc FLAG_GT1 - 6 - 6 - read-only - - - - - DATA0 - desc DATA0 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA1 - desc DATA1 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA2 - desc DATA2 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FLAGCLR - desc FLAGCLR - 0x14 - 32 - write-only - 0x0 - 0x7F - - - CLR_OP - desc CLR_OP - 0 - 0 - write-only - - - CLR_LS2 - desc CLR_LS2 - 1 - 1 - write-only - - - CLR_EQ2 - desc CLR_EQ2 - 2 - 2 - write-only - - - CLR_GT2 - desc CLR_GT2 - 3 - 3 - write-only - - - CLR_LS1 - desc CLR_LS1 - 4 - 4 - write-only - - - CLR_EQ1 - desc CLR_EQ1 - 5 - 5 - write-only - - - CLR_GT1 - desc CLR_GT1 - 6 - 6 - write-only - - - - - INTSEL - desc INTSEL - 0x18 - 32 - read-write - 0x0 - 0x1FF - - - INT_OP - desc INT_OP - 0 - 0 - read-write - - - INT_LS2 - desc INT_LS2 - 1 - 1 - read-write - - - INT_EQ2 - desc INT_EQ2 - 2 - 2 - read-write - - - INT_GT2 - desc INT_GT2 - 3 - 3 - read-write - - - INT_LS1 - desc INT_LS1 - 4 - 4 - read-write - - - INT_EQ1 - desc INT_EQ1 - 5 - 5 - read-write - - - INT_GT1 - desc INT_GT1 - 6 - 6 - read-write - - - INT_WIN - desc INT_WIN - 8 - 7 - read-write - - - - - - - DCU6 - desc DCU - 0x40057400 - - 0x0 - 0x1C - - - - DCU7 - desc DCU - 0x40057800 - - 0x0 - 0x1C - - - - DCU8 - desc DCU - 0x40057C00 - - 0x0 - 0x1C - - - - DMA1 - desc DMA - 0x40053000 - - 0x0 - 0x238 - - - - EN - desc EN - 0x0 - 32 - read-write - 0x0 - 0x1 - - - EN - desc EN - 0 - 0 - read-write - - - - - INTSTAT0 - desc INTSTAT0 - 0x4 - 32 - read-only - 0x0 - 0xFF00FF - - - TRNERR - desc TRNERR - 7 - 0 - read-only - - - REQERR - desc REQERR - 23 - 16 - read-only - - - - - INTSTAT1 - desc INTSTAT1 - 0x8 - 32 - read-only - 0x0 - 0xFF00FF - - - TC - desc TC - 7 - 0 - read-only - - - BTC - desc BTC - 23 - 16 - read-only - - - - - INTMASK0 - desc INTMASK0 - 0xC - 32 - read-write - 0x0 - 0xFF00FF - - - MSKTRNERR - desc MSKTRNERR - 7 - 0 - read-write - - - MSKREQERR - desc MSKREQERR - 23 - 16 - read-write - - - - - INTMASK1 - desc INTMASK1 - 0x10 - 32 - read-write - 0x0 - 0xFF00FF - - - MSKTC - desc MSKTC - 7 - 0 - read-write - - - MSKBTC - desc MSKBTC - 23 - 16 - read-write - - - - - INTCLR0 - desc INTCLR0 - 0x14 - 32 - read-write - 0x0 - 0xFF00FF - - - CLRTRNERR - desc CLRTRNERR - 7 - 0 - read-write - - - CLRREQERR - desc CLRREQERR - 23 - 16 - read-write - - - - - INTCLR1 - desc INTCLR1 - 0x18 - 32 - read-write - 0x0 - 0xFF00FF - - - CLRTC - desc CLRTC - 7 - 0 - read-write - - - CLRBTC - desc CLRBTC - 23 - 16 - read-write - - - - - CHEN - desc CHEN - 0x1C - 32 - read-write - 0x0 - 0xFF - - - CHEN - desc CHEN - 7 - 0 - read-write - - - - - REQSTAT - desc REQSTAT - 0x20 - 32 - read-only - 0x0 - 0x80FF - - - CHREQ - desc CHREQ - 7 - 0 - read-only - - - RCFGREQ - desc RCFGREQ - 15 - 15 - read-only - - - - - CHSTAT - desc CHSTAT - 0x24 - 32 - read-only - 0x0 - 0xFF0003 - - - DMAACT - desc DMAACT - 0 - 0 - read-only - - - RCFGACT - desc RCFGACT - 1 - 1 - read-only - - - CHACT - desc CHACT - 23 - 16 - read-only - - - - - RCFGCTL - desc RCFGCTL - 0x2C - 32 - read-write - 0x0 - 0x3F0F03 - - - RCFGEN - desc RCFGEN - 0 - 0 - read-write - - - RCFGLLP - desc RCFGLLP - 1 - 1 - read-write - - - RCFGCHS - desc RCFGCHS - 11 - 8 - read-write - - - SARMD - desc SARMD - 17 - 16 - read-write - - - DARMD - desc DARMD - 19 - 18 - read-write - - - CNTMD - desc CNTMD - 21 - 20 - read-write - - - - - CHENCLR - desc CHENCLR - 0x34 - 32 - read-write - 0x0 - 0xFF - - - CHENCLR - desc CHENCLR - 7 - 0 - read-write - - - - - SAR0 - desc SAR0 - 0x40 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR0 - desc DAR0 - 0x44 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL0 - desc DTCTL0 - 0x48 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT0 - desc RPT0 - 0x4C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB0 - desc RPTB0 - 0x4C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL0 - desc SNSEQCTL0 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB0 - desc SNSEQCTLB0 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL0 - desc DNSEQCTL0 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB0 - desc DNSEQCTLB0 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP0 - desc LLP0 - 0x58 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL0 - desc CHCTL0 - 0x5C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR0 - desc MONSAR0 - 0x60 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR0 - desc MONDAR0 - 0x64 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL0 - desc MONDTCTL0 - 0x68 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT0 - desc MONRPT0 - 0x6C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL0 - desc MONSNSEQCTL0 - 0x70 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL0 - desc MONDNSEQCTL0 - 0x74 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR1 - desc SAR1 - 0x80 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR1 - desc DAR1 - 0x84 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL1 - desc DTCTL1 - 0x88 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT1 - desc RPT1 - 0x8C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB1 - desc RPTB1 - 0x8C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL1 - desc SNSEQCTL1 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB1 - desc SNSEQCTLB1 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL1 - desc DNSEQCTL1 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB1 - desc DNSEQCTLB1 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP1 - desc LLP1 - 0x98 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL1 - desc CHCTL1 - 0x9C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR1 - desc MONSAR1 - 0xA0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR1 - desc MONDAR1 - 0xA4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL1 - desc MONDTCTL1 - 0xA8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT1 - desc MONRPT1 - 0xAC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL1 - desc MONSNSEQCTL1 - 0xB0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL1 - desc MONDNSEQCTL1 - 0xB4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR2 - desc SAR2 - 0xC0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR2 - desc DAR2 - 0xC4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL2 - desc DTCTL2 - 0xC8 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT2 - desc RPT2 - 0xCC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB2 - desc RPTB2 - 0xCC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL2 - desc SNSEQCTL2 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB2 - desc SNSEQCTLB2 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL2 - desc DNSEQCTL2 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB2 - desc DNSEQCTLB2 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP2 - desc LLP2 - 0xD8 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL2 - desc CHCTL2 - 0xDC - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR2 - desc MONSAR2 - 0xE0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR2 - desc MONDAR2 - 0xE4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL2 - desc MONDTCTL2 - 0xE8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT2 - desc MONRPT2 - 0xEC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL2 - desc MONSNSEQCTL2 - 0xF0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL2 - desc MONDNSEQCTL2 - 0xF4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR3 - desc SAR3 - 0x100 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR3 - desc DAR3 - 0x104 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL3 - desc DTCTL3 - 0x108 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT3 - desc RPT3 - 0x10C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB3 - desc RPTB3 - 0x10C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL3 - desc SNSEQCTL3 - 0x110 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB3 - desc SNSEQCTLB3 - 0x110 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL3 - desc DNSEQCTL3 - 0x114 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB3 - desc DNSEQCTLB3 - 0x114 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP3 - desc LLP3 - 0x118 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL3 - desc CHCTL3 - 0x11C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR3 - desc MONSAR3 - 0x120 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR3 - desc MONDAR3 - 0x124 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL3 - desc MONDTCTL3 - 0x128 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT3 - desc MONRPT3 - 0x12C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL3 - desc MONSNSEQCTL3 - 0x130 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL3 - desc MONDNSEQCTL3 - 0x134 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR4 - desc SAR4 - 0x140 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR4 - desc DAR4 - 0x144 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL4 - desc DTCTL4 - 0x148 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT4 - desc RPT4 - 0x14C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB4 - desc RPTB4 - 0x14C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL4 - desc SNSEQCTL4 - 0x150 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB4 - desc SNSEQCTLB4 - 0x150 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL4 - desc DNSEQCTL4 - 0x154 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB4 - desc DNSEQCTLB4 - 0x154 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP4 - desc LLP4 - 0x158 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL4 - desc CHCTL4 - 0x15C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR4 - desc MONSAR4 - 0x160 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR4 - desc MONDAR4 - 0x164 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL4 - desc MONDTCTL4 - 0x168 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT4 - desc MONRPT4 - 0x16C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL4 - desc MONSNSEQCTL4 - 0x170 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL4 - desc MONDNSEQCTL4 - 0x174 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR5 - desc SAR5 - 0x180 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR5 - desc DAR5 - 0x184 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL5 - desc DTCTL5 - 0x188 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT5 - desc RPT5 - 0x18C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB5 - desc RPTB5 - 0x18C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL5 - desc SNSEQCTL5 - 0x190 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB5 - desc SNSEQCTLB5 - 0x190 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL5 - desc DNSEQCTL5 - 0x194 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB5 - desc DNSEQCTLB5 - 0x194 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP5 - desc LLP5 - 0x198 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL5 - desc CHCTL5 - 0x19C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR5 - desc MONSAR5 - 0x1A0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR5 - desc MONDAR5 - 0x1A4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL5 - desc MONDTCTL5 - 0x1A8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT5 - desc MONRPT5 - 0x1AC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL5 - desc MONSNSEQCTL5 - 0x1B0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL5 - desc MONDNSEQCTL5 - 0x1B4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR6 - desc SAR6 - 0x1C0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR6 - desc DAR6 - 0x1C4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL6 - desc DTCTL6 - 0x1C8 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT6 - desc RPT6 - 0x1CC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB6 - desc RPTB6 - 0x1CC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL6 - desc SNSEQCTL6 - 0x1D0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB6 - desc SNSEQCTLB6 - 0x1D0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL6 - desc DNSEQCTL6 - 0x1D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB6 - desc DNSEQCTLB6 - 0x1D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP6 - desc LLP6 - 0x1D8 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL6 - desc CHCTL6 - 0x1DC - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR6 - desc MONSAR6 - 0x1E0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR6 - desc MONDAR6 - 0x1E4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL6 - desc MONDTCTL6 - 0x1E8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT6 - desc MONRPT6 - 0x1EC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL6 - desc MONSNSEQCTL6 - 0x1F0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL6 - desc MONDNSEQCTL6 - 0x1F4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR7 - desc SAR7 - 0x200 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR7 - desc DAR7 - 0x204 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL7 - desc DTCTL7 - 0x208 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT7 - desc RPT7 - 0x20C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB7 - desc RPTB7 - 0x20C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL7 - desc SNSEQCTL7 - 0x210 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB7 - desc SNSEQCTLB7 - 0x210 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL7 - desc DNSEQCTL7 - 0x214 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB7 - desc DNSEQCTLB7 - 0x214 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP7 - desc LLP7 - 0x218 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL7 - desc CHCTL7 - 0x21C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR7 - desc MONSAR7 - 0x220 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR7 - desc MONDAR7 - 0x224 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL7 - desc MONDTCTL7 - 0x228 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT7 - desc MONRPT7 - 0x22C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL7 - desc MONSNSEQCTL7 - 0x230 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL7 - desc MONDNSEQCTL7 - 0x234 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - - - DMA2 - desc DMA - 0x40053400 - - 0x0 - 0x238 - - - - DMC - desc DMC - 0x88000400 - - 0x0 - 0x304 - - - - STSR - desc STSR - 0x0 - 32 - read-only - 0x700 - 0xF - - - STATUS - desc STATUS - 1 - 0 - read-only - - - MEMW - desc MEMW - 3 - 2 - read-only - - - - - STCR - desc STCR - 0x4 - 32 - write-only - 0x0 - 0x7 - - - STCTL - desc STCTL - 2 - 0 - write-only - - - - - CMDR - desc CMDR - 0x8 - 32 - write-only - 0x0 - 0x13F3FFF - - - CMDADD - desc CMDADD - 13 - 0 - write-only - - - CMDBA - desc CMDBA - 17 - 16 - write-only - - - CMD - desc CMD - 19 - 18 - write-only - - - CMDCHIP - desc CMDCHIP - 21 - 20 - write-only - - - - - CPCR - desc CPCR - 0xC - 32 - read-write - 0x20040 - 0x307FFF7 - - - COLBS - desc COLBS - 2 - 0 - read-write - - - ROWBS - desc ROWBS - 6 - 4 - read-write - - - APBS - desc APBS - 7 - 7 - read-write - - - CKEDIS - desc CKEDIS - 8 - 8 - read-write - - - CKSTOP - desc CKSTOP - 9 - 9 - read-write - - - CKEDISPRD - desc CKEDISPRD - 15 - 10 - read-write - - - BURST - desc BURST - 18 - 16 - read-write - - - ACTCP - desc ACTCP - 25 - 24 - read-write - - - - - RFTR - desc RFTR - 0x10 - 32 - read-write - 0xA60 - 0x7FFF - - - REFPRD - desc REFPRD - 14 - 0 - read-write - - - - - TMCR_T_CASL - desc TMCR_T_CASL - 0x14 - 32 - read-write - 0x3 - 0x7 - - - T_CASL - desc T_CASL - 2 - 0 - read-write - - - - - TMCR_T_DQSS - desc TMCR_T_DQSS - 0x18 - 32 - read-write - 0x1 - 0x3 - - - T_DQSS - desc T_DQSS - 1 - 0 - read-write - - - - - TMCR_T_MRD - desc TMCR_T_MRD - 0x1C - 32 - read-write - 0x2 - 0x7F - - - T_MRD - desc T_MRD - 6 - 0 - read-write - - - - - TMCR_T_RAS - desc TMCR_T_RAS - 0x20 - 32 - read-write - 0x7 - 0xF - - - T_RAS - desc T_RAS - 3 - 0 - read-write - - - - - TMCR_T_RC - desc TMCR_T_RC - 0x24 - 32 - read-write - 0xB - 0xF - - - T_RC - desc T_RC - 3 - 0 - read-write - - - - - TMCR_T_RCD - desc TMCR_T_RCD - 0x28 - 32 - read-write - 0x35 - 0x77 - - - T_RCD_B - desc T_RCD_B - 2 - 0 - read-write - - - T_RCD_P - desc T_RCD_P - 6 - 4 - read-write - - - - - TMCR_T_RFC - desc TMCR_T_RFC - 0x2C - 32 - read-write - 0x1012 - 0x1F1F - - - T_RFC_B - desc T_RFC_B - 4 - 0 - read-write - - - T_RFC_P - desc T_RFC_P - 12 - 8 - read-write - - - - - TMCR_T_RP - desc TMCR_T_RP - 0x30 - 32 - read-write - 0x35 - 0x77 - - - T_RP_B - desc T_RP_B - 2 - 0 - read-write - - - T_RP_P - desc T_RP_P - 6 - 4 - read-write - - - - - TMCR_T_RRD - desc TMCR_T_RRD - 0x34 - 32 - read-write - 0x2 - 0xF - - - T_RRD - desc T_RRD - 3 - 0 - read-write - - - - - TMCR_T_WR - desc TMCR_T_WR - 0x38 - 32 - read-write - 0x3 - 0x7 - - - T_WR - desc T_WR - 2 - 0 - read-write - - - - - TMCR_T_WTR - desc TMCR_T_WTR - 0x3C - 32 - read-write - 0x2 - 0x7 - - - T_WTR - desc T_WTR - 2 - 0 - read-write - - - - - TMCR_T_XP - desc TMCR_T_XP - 0x40 - 32 - read-write - 0x1 - 0xFF - - - T_XP - desc T_XP - 7 - 0 - read-write - - - - - TMCR_T_XSR - desc TMCR_T_XSR - 0x44 - 32 - read-write - 0xA - 0xFF - - - T_XSR - desc T_XSR - 7 - 0 - read-write - - - - - TMCR_T_ESR - desc TMCR_T_ESR - 0x48 - 32 - read-write - 0x14 - 0xFF - - - T_ESR - desc T_ESR - 7 - 0 - read-write - - - - - CSCR0 - desc CSCR0 - 0x200 - 32 - read-write - 0xFF00 - 0x101FFFF - - - ADDMSK - desc ADDMSK - 7 - 0 - read-write - - - ADDMAT - desc ADDMAT - 15 - 8 - read-write - - - BRC - desc BRC - 16 - 16 - read-write - - - - - CSCR1 - desc CSCR1 - 0x204 - 32 - read-write - 0xFF00 - 0x101FFFF - - - ADDMSK - desc ADDMSK - 7 - 0 - read-write - - - ADDMAT - desc ADDMAT - 15 - 8 - read-write - - - BRC - desc BRC - 16 - 16 - read-write - - - - - CSCR2 - desc CSCR2 - 0x208 - 32 - read-write - 0xFF00 - 0x101FFFF - - - ADDMSK - desc ADDMSK - 7 - 0 - read-write - - - ADDMAT - desc ADDMAT - 15 - 8 - read-write - - - BRC - desc BRC - 16 - 16 - read-write - - - - - CSCR3 - desc CSCR3 - 0x20C - 32 - read-write - 0xFF00 - 0x101FFFF - - - ADDMSK - desc ADDMSK - 7 - 0 - read-write - - - ADDMAT - desc ADDMAT - 15 - 8 - read-write - - - BRC - desc BRC - 16 - 16 - read-write - - - - - BACR - desc BACR - 0x300 - 32 - read-write - 0x300 - 0x100C003 - - - DMCMW - desc DMCMW - 1 - 0 - read-write - - - CKSEL - desc CKSEL - 15 - 14 - read-write - - - - - - - DVP - desc DVP - 0x40055800 - - 0x0 - 0x30 - - - - CTR - desc CTR - 0x0 - 32 - read-write - 0x0 - 0x4FFF - - - CAPEN - desc CAPEN - 0 - 0 - read-write - - - CAPMD - desc CAPMD - 1 - 1 - read-write - - - CROPEN - desc CROPEN - 2 - 2 - read-write - - - JPEGEN - desc JPEGEN - 3 - 3 - read-write - - - SWSYNC - desc SWSYNC - 4 - 4 - read-write - - - PIXCKSEL - desc PIXCKSEL - 5 - 5 - read-write - - - HSYNCSEL - desc HSYNCSEL - 6 - 6 - read-write - - - VSYNCSEL - desc VSYNCSEL - 7 - 7 - read-write - - - CAPFRC - desc CAPFRC - 9 - 8 - read-write - - - BITSEL - desc BITSEL - 11 - 10 - read-write - - - DVPEN - desc DVPEN - 14 - 14 - read-write - - - - - DTR - desc DTR - 0x4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - STR - desc STR - 0x8 - 32 - read-write - 0x0 - 0x3F - - - FSF - desc FSF - 0 - 0 - read-write - - - LSF - desc LSF - 1 - 1 - read-write - - - LEF - desc LEF - 2 - 2 - read-write - - - FEF - desc FEF - 3 - 3 - read-write - - - SQUERF - desc SQUERF - 4 - 4 - read-write - - - FIFOERF - desc FIFOERF - 5 - 5 - read-write - - - - - IER - desc IER - 0xC - 32 - read-write - 0x0 - 0x3F - - - FSIEN - desc FSIEN - 0 - 0 - read-write - - - LSIEN - desc LSIEN - 1 - 1 - read-write - - - LEIEN - desc LEIEN - 2 - 2 - read-write - - - FEIEN - desc FEIEN - 3 - 3 - read-write - - - SQUERIEN - desc SQUERIEN - 4 - 4 - read-write - - - FIFOERIEN - desc FIFOERIEN - 5 - 5 - read-write - - - - - DMR - desc DMR - 0x10 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SSYNDR - desc SSYNDR - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FSDAT - desc FSDAT - 7 - 0 - read-write - - - LSDAT - desc LSDAT - 15 - 8 - read-write - - - LEDAT - desc LEDAT - 23 - 16 - read-write - - - FEDAT - desc FEDAT - 31 - 24 - read-write - - - - - SSYNMR - desc SSYNMR - 0x24 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - FSMSK - desc FSMSK - 7 - 0 - read-write - - - LSMSK - desc LSMSK - 15 - 8 - read-write - - - LEMSK - desc LEMSK - 23 - 16 - read-write - - - FEMSK - desc FEMSK - 31 - 24 - read-write - - - - - CPSFTR - desc CPSFTR - 0x28 - 32 - read-write - 0x0 - 0x3FFF3FFF - - - RSHIFT - desc RSHIFT - 13 - 0 - read-write - - - CSHIFT - desc CSHIFT - 29 - 16 - read-write - - - - - CPSZER - desc CPSZER - 0x2C - 32 - read-write - 0x0 - 0x3FFF3FFF - - - RSIZE - desc RSIZE - 13 - 0 - read-write - - - CSIZE - desc CSIZE - 29 - 16 - read-write - - - - - - - EFM - desc EFM - 0x40010400 - - 0x0 - 0x1B0 - - - - FAPRT - desc FAPRT - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - FAPRT - desc FAPRT - 15 - 0 - read-write - - - - - KEY1 - desc KEY1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KEY2 - desc KEY2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FSTP - desc FSTP - 0x14 - 32 - read-write - 0x0 - 0x3 - - - F0STP - desc F0STP - 0 - 0 - read-write - - - F1STP - desc F1STP - 1 - 1 - read-write - - - - - FRMC - desc FRMC - 0x18 - 32 - read-write - 0x0 - 0xF010F - - - FLWT - desc FLWT - 3 - 0 - read-write - - - LVM - desc LVM - 8 - 8 - read-write - - - ICACHE - desc ICACHE - 16 - 16 - read-write - - - DCACHE - desc DCACHE - 17 - 17 - read-write - - - PREFETE - desc PREFETE - 18 - 18 - read-write - - - CRST - desc CRST - 19 - 19 - read-write - - - - - FWMC - desc FWMC - 0x1C - 32 - read-write - 0x30000 - 0x30107 - - - PEMOD - desc PEMOD - 2 - 0 - read-write - - - BUSHLDCTL - desc BUSHLDCTL - 8 - 8 - read-write - - - KEY1LOCK - desc KEY1LOCK - 16 - 16 - read-write - - - KEY2LOCK - desc KEY2LOCK - 17 - 17 - read-write - - - - - FSR - desc FSR - 0x20 - 32 - read-only - 0x1000100 - 0x13E013F - - - OTPWERR0 - desc OTPWERR0 - 0 - 0 - read-only - - - PRTWERR0 - desc PRTWERR0 - 1 - 1 - read-only - - - PGSZERR0 - desc PGSZERR0 - 2 - 2 - read-only - - - MISMTCH0 - desc MISMTCH0 - 3 - 3 - read-only - - - OPTEND0 - desc OPTEND0 - 4 - 4 - read-only - - - COLERR0 - desc COLERR0 - 5 - 5 - read-only - - - RDY0 - desc RDY0 - 8 - 8 - read-only - - - PRTWERR1 - desc PRTWERR1 - 17 - 17 - read-only - - - PGSZERR1 - desc PGSZERR1 - 18 - 18 - read-only - - - MISMTCH1 - desc MISMTCH1 - 19 - 19 - read-only - - - OPTEND1 - desc OPTEND1 - 20 - 20 - read-only - - - COLERR1 - desc COLERR1 - 21 - 21 - read-only - - - RDY1 - desc RDY1 - 24 - 24 - read-only - - - - - FSCLR - desc FSCLR - 0x24 - 32 - read-write - 0x0 - 0x3E003F - - - OTPWERRCLR0 - desc OTPWERRCLR0 - 0 - 0 - read-write - - - PRTWERRCLR0 - desc PRTWERRCLR0 - 1 - 1 - read-write - - - PGSZERRCLR0 - desc PGSZERRCLR0 - 2 - 2 - read-write - - - MISMTCHCLR0 - desc MISMTCHCLR0 - 3 - 3 - read-write - - - OPTENDCLR0 - desc OPTENDCLR0 - 4 - 4 - read-write - - - COLERRCLR0 - desc COLERRCLR0 - 5 - 5 - read-write - - - PRTWERRCLR1 - desc PRTWERRCLR1 - 17 - 17 - read-write - - - PGSZERRCLR1 - desc PGSZERRCLR1 - 18 - 18 - read-write - - - MISMTCHCLR1 - desc MISMTCHCLR1 - 19 - 19 - read-write - - - OPTENDCLR1 - desc OPTENDCLR1 - 20 - 20 - read-write - - - COLERRCLR1 - desc COLERRCLR1 - 21 - 21 - read-write - - - - - FITE - desc FITE - 0x28 - 32 - read-write - 0x0 - 0x7 - - - PEERRITE - desc PEERRITE - 0 - 0 - read-write - - - OPTENDITE - desc OPTENDITE - 1 - 1 - read-write - - - COLERRITE - desc COLERRITE - 2 - 2 - read-write - - - - - FSWP - desc FSWP - 0x2C - 32 - read-only - 0x0 - 0x1 - - - FSWP - desc FSWP - 0 - 0 - read-only - - - - - CHIPID - desc CHIPID - 0x40 - 32 - read-only - 0x484404A0 - 0xFFFFFFFF - - - UQID0 - desc UQID0 - 0x50 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - UQID1 - desc UQID1 - 0x54 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - UQID2 - desc UQID2 - 0x58 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MMF_REMPRT - desc MMF_REMPRT - 0x100 - 32 - read-write - 0x0 - 0xFFFF - - - MMF_REMPRT - desc MMF_REMPRT - 15 - 0 - read-write - - - - - MMF_REMCR0 - desc MMF_REMCR0 - 0x104 - 32 - read-write - 0x0 - 0x9FFFF01F - - - RMSIZE - desc RMSIZE - 4 - 0 - read-write - - - RMTADDR - desc RMTADDR - 28 - 12 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - MMF_REMCR1 - desc MMF_REMCR1 - 0x108 - 32 - read-write - 0x0 - 0x9FFFF01F - - - RMSIZE - desc RMSIZE - 4 - 0 - read-write - - - RMTADDR - desc RMTADDR - 28 - 12 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - WLOCK - desc WLOCK - 0x180 - 32 - read-write - 0x0 - 0xFF - - - WLOCK - desc WLOCK - 7 - 0 - read-write - - - - - F0NWPRT0 - desc F0NWPRT0 - 0x190 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F0NWPRT0 - desc F0NWPRT0 - 0 - 0 - read-write - - - F0NWPRT1 - desc F0NWPRT1 - 1 - 1 - read-write - - - F0NWPRT2 - desc F0NWPRT2 - 2 - 2 - read-write - - - F0NWPRT3 - desc F0NWPRT3 - 3 - 3 - read-write - - - F0NWPRT4 - desc F0NWPRT4 - 4 - 4 - read-write - - - F0NWPRT5 - desc F0NWPRT5 - 5 - 5 - read-write - - - F0NWPRT6 - desc F0NWPRT6 - 6 - 6 - read-write - - - F0NWPRT7 - desc F0NWPRT7 - 7 - 7 - read-write - - - F0NWPRT8 - desc F0NWPRT8 - 8 - 8 - read-write - - - F0NWPRT9 - desc F0NWPRT9 - 9 - 9 - read-write - - - F0NWPRT10 - desc F0NWPRT10 - 10 - 10 - read-write - - - F0NWPRT11 - desc F0NWPRT11 - 11 - 11 - read-write - - - F0NWPRT12 - desc F0NWPRT12 - 12 - 12 - read-write - - - F0NWPRT13 - desc F0NWPRT13 - 13 - 13 - read-write - - - F0NWPRT14 - desc F0NWPRT14 - 14 - 14 - read-write - - - F0NWPRT15 - desc F0NWPRT15 - 15 - 15 - read-write - - - F0NWPRT16 - desc F0NWPRT16 - 16 - 16 - read-write - - - F0NWPRT17 - desc F0NWPRT17 - 17 - 17 - read-write - - - F0NWPRT18 - desc F0NWPRT18 - 18 - 18 - read-write - - - F0NWPRT19 - desc F0NWPRT19 - 19 - 19 - read-write - - - F0NWPRT20 - desc F0NWPRT20 - 20 - 20 - read-write - - - F0NWPRT21 - desc F0NWPRT21 - 21 - 21 - read-write - - - F0NWPRT22 - desc F0NWPRT22 - 22 - 22 - read-write - - - F0NWPRT23 - desc F0NWPRT23 - 23 - 23 - read-write - - - F0NWPRT24 - desc F0NWPRT24 - 24 - 24 - read-write - - - F0NWPRT25 - desc F0NWPRT25 - 25 - 25 - read-write - - - F0NWPRT26 - desc F0NWPRT26 - 26 - 26 - read-write - - - F0NWPRT27 - desc F0NWPRT27 - 27 - 27 - read-write - - - F0NWPRT28 - desc F0NWPRT28 - 28 - 28 - read-write - - - F0NWPRT29 - desc F0NWPRT29 - 29 - 29 - read-write - - - F0NWPRT30 - desc F0NWPRT30 - 30 - 30 - read-write - - - F0NWPRT31 - desc F0NWPRT31 - 31 - 31 - read-write - - - - - F0NWPRT1 - desc F0NWPRT1 - 0x194 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F0NWPRT32 - desc F0NWPRT32 - 0 - 0 - read-write - - - F0NWPRT33 - desc F0NWPRT33 - 1 - 1 - read-write - - - F0NWPRT34 - desc F0NWPRT34 - 2 - 2 - read-write - - - F0NWPRT35 - desc F0NWPRT35 - 3 - 3 - read-write - - - F0NWPRT36 - desc F0NWPRT36 - 4 - 4 - read-write - - - F0NWPRT37 - desc F0NWPRT37 - 5 - 5 - read-write - - - F0NWPRT38 - desc F0NWPRT38 - 6 - 6 - read-write - - - F0NWPRT39 - desc F0NWPRT39 - 7 - 7 - read-write - - - F0NWPRT40 - desc F0NWPRT40 - 8 - 8 - read-write - - - F0NWPRT41 - desc F0NWPRT41 - 9 - 9 - read-write - - - F0NWPRT42 - desc F0NWPRT42 - 10 - 10 - read-write - - - F0NWPRT43 - desc F0NWPRT43 - 11 - 11 - read-write - - - F0NWPRT44 - desc F0NWPRT44 - 12 - 12 - read-write - - - F0NWPRT45 - desc F0NWPRT45 - 13 - 13 - read-write - - - F0NWPRT46 - desc F0NWPRT46 - 14 - 14 - read-write - - - F0NWPRT47 - desc F0NWPRT47 - 15 - 15 - read-write - - - F0NWPRT48 - desc F0NWPRT48 - 16 - 16 - read-write - - - F0NWPRT49 - desc F0NWPRT49 - 17 - 17 - read-write - - - F0NWPRT50 - desc F0NWPRT50 - 18 - 18 - read-write - - - F0NWPRT51 - desc F0NWPRT51 - 19 - 19 - read-write - - - F0NWPRT52 - desc F0NWPRT52 - 20 - 20 - read-write - - - F0NWPRT53 - desc F0NWPRT53 - 21 - 21 - read-write - - - F0NWPRT54 - desc F0NWPRT54 - 22 - 22 - read-write - - - F0NWPRT55 - desc F0NWPRT55 - 23 - 23 - read-write - - - F0NWPRT56 - desc F0NWPRT56 - 24 - 24 - read-write - - - F0NWPRT57 - desc F0NWPRT57 - 25 - 25 - read-write - - - F0NWPRT58 - desc F0NWPRT58 - 26 - 26 - read-write - - - F0NWPRT59 - desc F0NWPRT59 - 27 - 27 - read-write - - - F0NWPRT60 - desc F0NWPRT60 - 28 - 28 - read-write - - - F0NWPRT61 - desc F0NWPRT61 - 29 - 29 - read-write - - - F0NWPRT62 - desc F0NWPRT62 - 30 - 30 - read-write - - - F0NWPRT63 - desc F0NWPRT63 - 31 - 31 - read-write - - - - - F0NWPRT2 - desc F0NWPRT2 - 0x198 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F0NWPRT64 - desc F0NWPRT64 - 0 - 0 - read-write - - - F0NWPRT65 - desc F0NWPRT65 - 1 - 1 - read-write - - - F0NWPRT66 - desc F0NWPRT66 - 2 - 2 - read-write - - - F0NWPRT67 - desc F0NWPRT67 - 3 - 3 - read-write - - - F0NWPRT68 - desc F0NWPRT68 - 4 - 4 - read-write - - - F0NWPRT69 - desc F0NWPRT69 - 5 - 5 - read-write - - - F0NWPRT70 - desc F0NWPRT70 - 6 - 6 - read-write - - - F0NWPRT71 - desc F0NWPRT71 - 7 - 7 - read-write - - - F0NWPRT72 - desc F0NWPRT72 - 8 - 8 - read-write - - - F0NWPRT73 - desc F0NWPRT73 - 9 - 9 - read-write - - - F0NWPRT74 - desc F0NWPRT74 - 10 - 10 - read-write - - - F0NWPRT75 - desc F0NWPRT75 - 11 - 11 - read-write - - - F0NWPRT76 - desc F0NWPRT76 - 12 - 12 - read-write - - - F0NWPRT77 - desc F0NWPRT77 - 13 - 13 - read-write - - - F0NWPRT78 - desc F0NWPRT78 - 14 - 14 - read-write - - - F0NWPRT79 - desc F0NWPRT79 - 15 - 15 - read-write - - - F0NWPRT80 - desc F0NWPRT80 - 16 - 16 - read-write - - - F0NWPRT81 - desc F0NWPRT81 - 17 - 17 - read-write - - - F0NWPRT82 - desc F0NWPRT82 - 18 - 18 - read-write - - - F0NWPRT83 - desc F0NWPRT83 - 19 - 19 - read-write - - - F0NWPRT84 - desc F0NWPRT84 - 20 - 20 - read-write - - - F0NWPRT85 - desc F0NWPRT85 - 21 - 21 - read-write - - - F0NWPRT86 - desc F0NWPRT86 - 22 - 22 - read-write - - - F0NWPRT87 - desc F0NWPRT87 - 23 - 23 - read-write - - - F0NWPRT88 - desc F0NWPRT88 - 24 - 24 - read-write - - - F0NWPRT89 - desc F0NWPRT89 - 25 - 25 - read-write - - - F0NWPRT90 - desc F0NWPRT90 - 26 - 26 - read-write - - - F0NWPRT91 - desc F0NWPRT91 - 27 - 27 - read-write - - - F0NWPRT92 - desc F0NWPRT92 - 28 - 28 - read-write - - - F0NWPRT93 - desc F0NWPRT93 - 29 - 29 - read-write - - - F0NWPRT94 - desc F0NWPRT94 - 30 - 30 - read-write - - - F0NWPRT95 - desc F0NWPRT95 - 31 - 31 - read-write - - - - - F0NWPRT3 - desc F0NWPRT3 - 0x19C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F0NWPRT96 - desc F0NWPRT96 - 0 - 0 - read-write - - - F0NWPRT97 - desc F0NWPRT97 - 1 - 1 - read-write - - - F0NWPRT98 - desc F0NWPRT98 - 2 - 2 - read-write - - - F0NWPRT99 - desc F0NWPRT99 - 3 - 3 - read-write - - - F0NWPRT100 - desc F0NWPRT100 - 4 - 4 - read-write - - - F0NWPRT101 - desc F0NWPRT101 - 5 - 5 - read-write - - - F0NWPRT102 - desc F0NWPRT102 - 6 - 6 - read-write - - - F0NWPRT103 - desc F0NWPRT103 - 7 - 7 - read-write - - - F0NWPRT104 - desc F0NWPRT104 - 8 - 8 - read-write - - - F0NWPRT105 - desc F0NWPRT105 - 9 - 9 - read-write - - - F0NWPRT106 - desc F0NWPRT106 - 10 - 10 - read-write - - - F0NWPRT107 - desc F0NWPRT107 - 11 - 11 - read-write - - - F0NWPRT108 - desc F0NWPRT108 - 12 - 12 - read-write - - - F0NWPRT109 - desc F0NWPRT109 - 13 - 13 - read-write - - - F0NWPRT110 - desc F0NWPRT110 - 14 - 14 - read-write - - - F0NWPRT111 - desc F0NWPRT111 - 15 - 15 - read-write - - - F0NWPRT112 - desc F0NWPRT112 - 16 - 16 - read-write - - - F0NWPRT113 - desc F0NWPRT113 - 17 - 17 - read-write - - - F0NWPRT114 - desc F0NWPRT114 - 18 - 18 - read-write - - - F0NWPRT115 - desc F0NWPRT115 - 19 - 19 - read-write - - - F0NWPRT116 - desc F0NWPRT116 - 20 - 20 - read-write - - - F0NWPRT117 - desc F0NWPRT117 - 21 - 21 - read-write - - - F0NWPRT118 - desc F0NWPRT118 - 22 - 22 - read-write - - - F0NWPRT119 - desc F0NWPRT119 - 23 - 23 - read-write - - - F0NWPRT120 - desc F0NWPRT120 - 24 - 24 - read-write - - - F0NWPRT121 - desc F0NWPRT121 - 25 - 25 - read-write - - - F0NWPRT122 - desc F0NWPRT122 - 26 - 26 - read-write - - - F0NWPRT123 - desc F0NWPRT123 - 27 - 27 - read-write - - - F0NWPRT124 - desc F0NWPRT124 - 28 - 28 - read-write - - - F0NWPRT125 - desc F0NWPRT125 - 29 - 29 - read-write - - - F0NWPRT126 - desc F0NWPRT126 - 30 - 30 - read-write - - - F0NWPRT127 - desc F0NWPRT127 - 31 - 31 - read-write - - - - - F1NWPRT0 - desc F1NWPRT0 - 0x1A0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F1NWPRT0 - desc F1NWPRT0 - 0 - 0 - read-write - - - F1NWPRT1 - desc F1NWPRT1 - 1 - 1 - read-write - - - F1NWPRT2 - desc F1NWPRT2 - 2 - 2 - read-write - - - F1NWPRT3 - desc F1NWPRT3 - 3 - 3 - read-write - - - F1NWPRT4 - desc F1NWPRT4 - 4 - 4 - read-write - - - F1NWPRT5 - desc F1NWPRT5 - 5 - 5 - read-write - - - F1NWPRT6 - desc F1NWPRT6 - 6 - 6 - read-write - - - F1NWPRT7 - desc F1NWPRT7 - 7 - 7 - read-write - - - F1NWPRT8 - desc F1NWPRT8 - 8 - 8 - read-write - - - F1NWPRT9 - desc F1NWPRT9 - 9 - 9 - read-write - - - F1NWPRT10 - desc F1NWPRT10 - 10 - 10 - read-write - - - F1NWPRT11 - desc F1NWPRT11 - 11 - 11 - read-write - - - F1NWPRT12 - desc F1NWPRT12 - 12 - 12 - read-write - - - F1NWPRT13 - desc F1NWPRT13 - 13 - 13 - read-write - - - F1NWPRT14 - desc F1NWPRT14 - 14 - 14 - read-write - - - F1NWPRT15 - desc F1NWPRT15 - 15 - 15 - read-write - - - F1NWPRT16 - desc F1NWPRT16 - 16 - 16 - read-write - - - F1NWPRT17 - desc F1NWPRT17 - 17 - 17 - read-write - - - F1NWPRT18 - desc F1NWPRT18 - 18 - 18 - read-write - - - F1NWPRT19 - desc F1NWPRT19 - 19 - 19 - read-write - - - F1NWPRT20 - desc F1NWPRT20 - 20 - 20 - read-write - - - F1NWPRT21 - desc F1NWPRT21 - 21 - 21 - read-write - - - F1NWPRT22 - desc F1NWPRT22 - 22 - 22 - read-write - - - F1NWPRT23 - desc F1NWPRT23 - 23 - 23 - read-write - - - F1NWPRT24 - desc F1NWPRT24 - 24 - 24 - read-write - - - F1NWPRT25 - desc F1NWPRT25 - 25 - 25 - read-write - - - F1NWPRT26 - desc F1NWPRT26 - 26 - 26 - read-write - - - F1NWPRT27 - desc F1NWPRT27 - 27 - 27 - read-write - - - F1NWPRT28 - desc F1NWPRT28 - 28 - 28 - read-write - - - F1NWPRT29 - desc F1NWPRT29 - 29 - 29 - read-write - - - F1NWPRT30 - desc F1NWPRT30 - 30 - 30 - read-write - - - F1NWPRT31 - desc F1NWPRT31 - 31 - 31 - read-write - - - - - F1NWPRT1 - desc F1NWPRT1 - 0x1A4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F1NWPRT32 - desc F1NWPRT32 - 0 - 0 - read-write - - - F1NWPRT33 - desc F1NWPRT33 - 1 - 1 - read-write - - - F1NWPRT34 - desc F1NWPRT34 - 2 - 2 - read-write - - - F1NWPRT35 - desc F1NWPRT35 - 3 - 3 - read-write - - - F1NWPRT36 - desc F1NWPRT36 - 4 - 4 - read-write - - - F1NWPRT37 - desc F1NWPRT37 - 5 - 5 - read-write - - - F1NWPRT38 - desc F1NWPRT38 - 6 - 6 - read-write - - - F1NWPRT39 - desc F1NWPRT39 - 7 - 7 - read-write - - - F1NWPRT40 - desc F1NWPRT40 - 8 - 8 - read-write - - - F1NWPRT41 - desc F1NWPRT41 - 9 - 9 - read-write - - - F1NWPRT42 - desc F1NWPRT42 - 10 - 10 - read-write - - - F1NWPRT43 - desc F1NWPRT43 - 11 - 11 - read-write - - - F1NWPRT44 - desc F1NWPRT44 - 12 - 12 - read-write - - - F1NWPRT45 - desc F1NWPRT45 - 13 - 13 - read-write - - - F1NWPRT46 - desc F1NWPRT46 - 14 - 14 - read-write - - - F1NWPRT47 - desc F1NWPRT47 - 15 - 15 - read-write - - - F1NWPRT48 - desc F1NWPRT48 - 16 - 16 - read-write - - - F1NWPRT49 - desc F1NWPRT49 - 17 - 17 - read-write - - - F1NWPRT50 - desc F1NWPRT50 - 18 - 18 - read-write - - - F1NWPRT51 - desc F1NWPRT51 - 19 - 19 - read-write - - - F1NWPRT52 - desc F1NWPRT52 - 20 - 20 - read-write - - - F1NWPRT53 - desc F1NWPRT53 - 21 - 21 - read-write - - - F1NWPRT54 - desc F1NWPRT54 - 22 - 22 - read-write - - - F1NWPRT55 - desc F1NWPRT55 - 23 - 23 - read-write - - - F1NWPRT56 - desc F1NWPRT56 - 24 - 24 - read-write - - - F1NWPRT57 - desc F1NWPRT57 - 25 - 25 - read-write - - - F1NWPRT58 - desc F1NWPRT58 - 26 - 26 - read-write - - - F1NWPRT59 - desc F1NWPRT59 - 27 - 27 - read-write - - - F1NWPRT60 - desc F1NWPRT60 - 28 - 28 - read-write - - - F1NWPRT61 - desc F1NWPRT61 - 29 - 29 - read-write - - - F1NWPRT62 - desc F1NWPRT62 - 30 - 30 - read-write - - - F1NWPRT63 - desc F1NWPRT63 - 31 - 31 - read-write - - - - - F1NWPRT2 - desc F1NWPRT2 - 0x1A8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F1NWPRT64 - desc F1NWPRT64 - 0 - 0 - read-write - - - F1NWPRT65 - desc F1NWPRT65 - 1 - 1 - read-write - - - F1NWPRT66 - desc F1NWPRT66 - 2 - 2 - read-write - - - F1NWPRT67 - desc F1NWPRT67 - 3 - 3 - read-write - - - F1NWPRT68 - desc F1NWPRT68 - 4 - 4 - read-write - - - F1NWPRT69 - desc F1NWPRT69 - 5 - 5 - read-write - - - F1NWPRT70 - desc F1NWPRT70 - 6 - 6 - read-write - - - F1NWPRT71 - desc F1NWPRT71 - 7 - 7 - read-write - - - F1NWPRT72 - desc F1NWPRT72 - 8 - 8 - read-write - - - F1NWPRT73 - desc F1NWPRT73 - 9 - 9 - read-write - - - F1NWPRT74 - desc F1NWPRT74 - 10 - 10 - read-write - - - F1NWPRT75 - desc F1NWPRT75 - 11 - 11 - read-write - - - F1NWPRT76 - desc F1NWPRT76 - 12 - 12 - read-write - - - F1NWPRT77 - desc F1NWPRT77 - 13 - 13 - read-write - - - F1NWPRT78 - desc F1NWPRT78 - 14 - 14 - read-write - - - F1NWPRT79 - desc F1NWPRT79 - 15 - 15 - read-write - - - F1NWPRT80 - desc F1NWPRT80 - 16 - 16 - read-write - - - F1NWPRT81 - desc F1NWPRT81 - 17 - 17 - read-write - - - F1NWPRT82 - desc F1NWPRT82 - 18 - 18 - read-write - - - F1NWPRT83 - desc F1NWPRT83 - 19 - 19 - read-write - - - F1NWPRT84 - desc F1NWPRT84 - 20 - 20 - read-write - - - F1NWPRT85 - desc F1NWPRT85 - 21 - 21 - read-write - - - F1NWPRT86 - desc F1NWPRT86 - 22 - 22 - read-write - - - F1NWPRT87 - desc F1NWPRT87 - 23 - 23 - read-write - - - F1NWPRT88 - desc F1NWPRT88 - 24 - 24 - read-write - - - F1NWPRT89 - desc F1NWPRT89 - 25 - 25 - read-write - - - F1NWPRT90 - desc F1NWPRT90 - 26 - 26 - read-write - - - F1NWPRT91 - desc F1NWPRT91 - 27 - 27 - read-write - - - F1NWPRT92 - desc F1NWPRT92 - 28 - 28 - read-write - - - F1NWPRT93 - desc F1NWPRT93 - 29 - 29 - read-write - - - F1NWPRT94 - desc F1NWPRT94 - 30 - 30 - read-write - - - F1NWPRT95 - desc F1NWPRT95 - 31 - 31 - read-write - - - - - F1NWPRT3 - desc F1NWPRT3 - 0x1AC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F1NWPRT96 - desc F1NWPRT96 - 0 - 0 - read-write - - - F1NWPRT97 - desc F1NWPRT97 - 1 - 1 - read-write - - - F1NWPRT98 - desc F1NWPRT98 - 2 - 2 - read-write - - - F1NWPRT99 - desc F1NWPRT99 - 3 - 3 - read-write - - - F1NWPRT100 - desc F1NWPRT100 - 4 - 4 - read-write - - - F1NWPRT101 - desc F1NWPRT101 - 5 - 5 - read-write - - - F1NWPRT102 - desc F1NWPRT102 - 6 - 6 - read-write - - - F1NWPRT103 - desc F1NWPRT103 - 7 - 7 - read-write - - - F1NWPRT104 - desc F1NWPRT104 - 8 - 8 - read-write - - - F1NWPRT105 - desc F1NWPRT105 - 9 - 9 - read-write - - - F1NWPRT106 - desc F1NWPRT106 - 10 - 10 - read-write - - - F1NWPRT107 - desc F1NWPRT107 - 11 - 11 - read-write - - - F1NWPRT108 - desc F1NWPRT108 - 12 - 12 - read-write - - - F1NWPRT109 - desc F1NWPRT109 - 13 - 13 - read-write - - - F1NWPRT110 - desc F1NWPRT110 - 14 - 14 - read-write - - - F1NWPRT111 - desc F1NWPRT111 - 15 - 15 - read-write - - - F1NWPRT112 - desc F1NWPRT112 - 16 - 16 - read-write - - - F1NWPRT113 - desc F1NWPRT113 - 17 - 17 - read-write - - - F1NWPRT114 - desc F1NWPRT114 - 18 - 18 - read-write - - - F1NWPRT115 - desc F1NWPRT115 - 19 - 19 - read-write - - - F1NWPRT116 - desc F1NWPRT116 - 20 - 20 - read-write - - - F1NWPRT117 - desc F1NWPRT117 - 21 - 21 - read-write - - - F1NWPRT118 - desc F1NWPRT118 - 22 - 22 - read-write - - - F1NWPRT119 - desc F1NWPRT119 - 23 - 23 - read-write - - - F1NWPRT120 - desc F1NWPRT120 - 24 - 24 - read-write - - - F1NWPRT121 - desc F1NWPRT121 - 25 - 25 - read-write - - - F1NWPRT122 - desc F1NWPRT122 - 26 - 26 - read-write - - - F1NWPRT123 - desc F1NWPRT123 - 27 - 27 - read-write - - - F1NWPRT124 - desc F1NWPRT124 - 28 - 28 - read-write - - - F1NWPRT125 - desc F1NWPRT125 - 29 - 29 - read-write - - - F1NWPRT126 - desc F1NWPRT126 - 30 - 30 - read-write - - - F1NWPRT127 - desc F1NWPRT127 - 31 - 31 - read-write - - - - - - - EMB0 - desc EMB - 0x40017C00 - - 0x0 - 0x1C - - - - CTL1 - desc CTL1 - 0x0 - 32 - read-write - 0x0 - 0x3CF1FFF - - - CMPEN0 - desc CMPEN0 - 0 - 0 - read-write - - - CMPEN1 - desc CMPEN1 - 1 - 1 - read-write - - - CMPEN2 - desc CMPEN2 - 2 - 2 - read-write - - - CMPEN3 - desc CMPEN3 - 3 - 3 - read-write - - - OSCSTPEN - desc OSCSTPEN - 4 - 4 - read-write - - - PWMSEN0 - desc PWMSEN0 - 5 - 5 - read-write - - - PWMSEN1 - desc PWMSEN1 - 6 - 6 - read-write - - - PWMSEN2 - desc PWMSEN2 - 7 - 7 - read-write - - - PWMSEN3 - desc PWMSEN3 - 8 - 8 - read-write - - - PWMSEN4 - desc PWMSEN4 - 9 - 9 - read-write - - - PWMSEN5 - desc PWMSEN5 - 10 - 10 - read-write - - - PWMSEN6 - desc PWMSEN6 - 11 - 11 - read-write - - - PWMSEN7 - desc PWMSEN7 - 12 - 12 - read-write - - - PORTINEN1 - desc PORTINEN1 - 16 - 16 - read-write - - - PORTINEN2 - desc PORTINEN2 - 17 - 17 - read-write - - - PORTINEN3 - desc PORTINEN3 - 18 - 18 - read-write - - - PORTINEN4 - desc PORTINEN4 - 19 - 19 - read-write - - - INVSEL1 - desc INVSEL1 - 22 - 22 - read-write - - - INVSEL2 - desc INVSEL2 - 23 - 23 - read-write - - - INVSEL3 - desc INVSEL3 - 24 - 24 - read-write - - - INVSEL4 - desc INVSEL4 - 25 - 25 - read-write - - - - - CTL2 - desc CTL2 - 0x4 - 32 - read-write - 0x0 - 0xFFF00FF - - - PWMLV0 - desc PWMLV0 - 0 - 0 - read-write - - - PWMLV1 - desc PWMLV1 - 1 - 1 - read-write - - - PWMLV2 - desc PWMLV2 - 2 - 2 - read-write - - - PWMLV3 - desc PWMLV3 - 3 - 3 - read-write - - - PWMLV4 - desc PWMLV4 - 4 - 4 - read-write - - - PWMLV5 - desc PWMLV5 - 5 - 5 - read-write - - - PWMLV6 - desc PWMLV6 - 6 - 6 - read-write - - - PWMLV7 - desc PWMLV7 - 7 - 7 - read-write - - - NFSEL1 - desc NFSEL1 - 17 - 16 - read-write - - - NFEN1 - desc NFEN1 - 18 - 18 - read-write - - - NFSEL2 - desc NFSEL2 - 20 - 19 - read-write - - - NFEN2 - desc NFEN2 - 21 - 21 - read-write - - - NFSEL3 - desc NFSEL3 - 23 - 22 - read-write - - - NFEN3 - desc NFEN3 - 24 - 24 - read-write - - - NFSEL4 - desc NFSEL4 - 26 - 25 - read-write - - - NFEN4 - desc NFEN4 - 27 - 27 - read-write - - - - - SOE - desc SOE - 0x8 - 32 - read-write - 0x0 - 0x1 - - - SOE - desc SOE - 0 - 0 - read-write - - - - - STAT - desc STAT - 0xC - 32 - read-only - 0x0 - 0x3CFEE - - - PWMSF - desc PWMSF - 1 - 1 - read-only - - - CMPF - desc CMPF - 2 - 2 - read-only - - - OSF - desc OSF - 3 - 3 - read-only - - - PWMST - desc PWMST - 5 - 5 - read-only - - - CMPST - desc CMPST - 6 - 6 - read-only - - - OSST - desc OSST - 7 - 7 - read-only - - - PORTINF1 - desc PORTINF1 - 8 - 8 - read-only - - - PORTINF2 - desc PORTINF2 - 9 - 9 - read-only - - - PORTINF3 - desc PORTINF3 - 10 - 10 - read-only - - - PORTINF4 - desc PORTINF4 - 11 - 11 - read-only - - - PORTINST1 - desc PORTINST1 - 14 - 14 - read-only - - - PORTINST2 - desc PORTINST2 - 15 - 15 - read-only - - - PORTINST3 - desc PORTINST3 - 16 - 16 - read-only - - - PORTINST4 - desc PORTINST4 - 17 - 17 - read-only - - - - - STATCLR - desc STATCLR - 0x10 - 32 - write-only - 0x0 - 0xF0E - - - PWMSFCLR - desc PWMSFCLR - 1 - 1 - write-only - - - CMPFCLR - desc CMPFCLR - 2 - 2 - write-only - - - OSFCLR - desc OSFCLR - 3 - 3 - write-only - - - PORTINFCLR1 - desc PORTINFCLR1 - 8 - 8 - write-only - - - PORTINFCLR2 - desc PORTINFCLR2 - 9 - 9 - write-only - - - PORTINFCLR3 - desc PORTINFCLR3 - 10 - 10 - write-only - - - PORTINFCLR4 - desc PORTINFCLR4 - 11 - 11 - write-only - - - - - INTEN - desc INTEN - 0x14 - 32 - read-write - 0x0 - 0xF0E - - - PWMSINTEN - desc PWMSINTEN - 1 - 1 - read-write - - - CMPINTEN - desc CMPINTEN - 2 - 2 - read-write - - - OSINTEN - desc OSINTEN - 3 - 3 - read-write - - - PORTINTEN1 - desc PORTINTEN1 - 8 - 8 - read-write - - - PORTINTEN2 - desc PORTINTEN2 - 9 - 9 - read-write - - - PORTINTEN3 - desc PORTINTEN3 - 10 - 10 - read-write - - - PORTINTEN4 - desc PORTINTEN4 - 11 - 11 - read-write - - - - - RLSSEL - desc RLSSEL - 0x18 - 32 - read-write - 0x0 - 0xF0E - - - PWMRSEL - desc PWMRSEL - 1 - 1 - read-write - - - CMPRSEL - desc CMPRSEL - 2 - 2 - read-write - - - OSRSEL - desc OSRSEL - 3 - 3 - read-write - - - PORTINRSEL1 - desc PORTINRSEL1 - 8 - 8 - read-write - - - PORTINRSEL2 - desc PORTINRSEL2 - 9 - 9 - read-write - - - PORTINRSEL3 - desc PORTINRSEL3 - 10 - 10 - read-write - - - PORTINRSEL4 - desc PORTINRSEL4 - 11 - 11 - read-write - - - - - - - EMB1 - desc EMB - 0x40017C20 - - 0x0 - 0x1C - - - - EMB2 - desc EMB - 0x40017C40 - - 0x0 - 0x1C - - - - EMB3 - desc EMB - 0x40017C60 - - 0x0 - 0x1C - - - - EMB4 - desc EMB - 0x40017C80 - - 0x0 - 0x1C - - - - CTL1 - desc CTL1 - 0x0 - 32 - read-write - 0x0 - 0x3CF00FF - - - CMPEN - desc CMPEN - 3 - 0 - read-write - - - OSCSTPEN - desc OSCSTPEN - 4 - 4 - read-write - - - PWMSEN - desc PWMSEN - 7 - 5 - read-write - - - PORTINEN1 - desc PORTINEN1 - 16 - 16 - read-write - - - PORTINEN2 - desc PORTINEN2 - 17 - 17 - read-write - - - PORTINEN3 - desc PORTINEN3 - 18 - 18 - read-write - - - PORTINEN4 - desc PORTINEN4 - 19 - 19 - read-write - - - INVSEL1 - desc INVSEL1 - 22 - 22 - read-write - - - INVSEL2 - desc INVSEL2 - 23 - 23 - read-write - - - INVSEL3 - desc INVSEL3 - 24 - 24 - read-write - - - INVSEL4 - desc INVSEL4 - 25 - 25 - read-write - - - - - CTL2 - desc CTL2 - 0x4 - 32 - read-write - 0x0 - 0xFFF0007 - - - PWMLV - desc PWMLV - 2 - 0 - read-write - - - NFSEL1 - desc NFSEL1 - 17 - 16 - read-write - - - NFEN1 - desc NFEN1 - 18 - 18 - read-write - - - NFSEL2 - desc NFSEL2 - 20 - 19 - read-write - - - NFEN2 - desc NFEN2 - 21 - 21 - read-write - - - NFSEL3 - desc NFSEL3 - 23 - 22 - read-write - - - NFEN3 - desc NFEN3 - 24 - 24 - read-write - - - NFSEL4 - desc NFSEL4 - 26 - 25 - read-write - - - NFEN4 - desc NFEN4 - 27 - 27 - read-write - - - - - SOE - desc SOE - 0x8 - 32 - read-write - 0x0 - 0x1 - - - SOE - desc SOE - 0 - 0 - read-write - - - - - STAT - desc STAT - 0xC - 32 - read-only - 0x0 - 0x3CFEE - - - PWMSF - desc PWMSF - 1 - 1 - read-only - - - CMPF - desc CMPF - 2 - 2 - read-only - - - OSF - desc OSF - 3 - 3 - read-only - - - PWMST - desc PWMST - 5 - 5 - read-only - - - CMPST - desc CMPST - 6 - 6 - read-only - - - OSST - desc OSST - 7 - 7 - read-only - - - PORTINF1 - desc PORTINF1 - 8 - 8 - read-only - - - PORTINF2 - desc PORTINF2 - 9 - 9 - read-only - - - PORTINF3 - desc PORTINF3 - 10 - 10 - read-only - - - PORTINF4 - desc PORTINF4 - 11 - 11 - read-only - - - PORTINST1 - desc PORTINST1 - 14 - 14 - read-only - - - PORTINST2 - desc PORTINST2 - 15 - 15 - read-only - - - PORTINST3 - desc PORTINST3 - 16 - 16 - read-only - - - PORTINST4 - desc PORTINST4 - 17 - 17 - read-only - - - - - STATCLR - desc STATCLR - 0x10 - 32 - write-only - 0x0 - 0xF0E - - - PWMSFCLR - desc PWMSFCLR - 1 - 1 - write-only - - - CMPFCLR - desc CMPFCLR - 2 - 2 - write-only - - - OSFCLR - desc OSFCLR - 3 - 3 - write-only - - - PORTINFCLR1 - desc PORTINFCLR1 - 8 - 8 - write-only - - - PORTINFCLR2 - desc PORTINFCLR2 - 9 - 9 - write-only - - - PORTINFCLR3 - desc PORTINFCLR3 - 10 - 10 - write-only - - - PORTINFCLR4 - desc PORTINFCLR4 - 11 - 11 - write-only - - - - - INTEN - desc INTEN - 0x14 - 32 - read-write - 0x0 - 0xF0E - - - PWMSINTEN - desc PWMSINTEN - 1 - 1 - read-write - - - CMPINTEN - desc CMPINTEN - 2 - 2 - read-write - - - OSINTEN - desc OSINTEN - 3 - 3 - read-write - - - PORTINTEN1 - desc PORTINTEN1 - 8 - 8 - read-write - - - PORTINTEN2 - desc PORTINTEN2 - 9 - 9 - read-write - - - PORTINTEN3 - desc PORTINTEN3 - 10 - 10 - read-write - - - PORTINTEN4 - desc PORTINTEN4 - 11 - 11 - read-write - - - - - RLSSEL - desc RLSSEL - 0x18 - 32 - read-write - 0x0 - 0xF0E - - - PWMRSEL - desc PWMRSEL - 1 - 1 - read-write - - - CMPRSEL - desc CMPRSEL - 2 - 2 - read-write - - - OSRSEL - desc OSRSEL - 3 - 3 - read-write - - - PORTINRSEL1 - desc PORTINRSEL1 - 8 - 8 - read-write - - - PORTINRSEL2 - desc PORTINRSEL2 - 9 - 9 - read-write - - - PORTINRSEL3 - desc PORTINRSEL3 - 10 - 10 - read-write - - - PORTINRSEL4 - desc PORTINRSEL4 - 11 - 11 - read-write - - - - - - - EMB5 - desc EMB - 0x40017CA0 - - 0x0 - 0x1C - - - - EMB6 - desc EMB - 0x40017CC0 - - 0x0 - 0x1C - - - - ETH - desc ETH - 0x40050000 - - 0x0 - 0x11058 - - - - MAC_IFCONFR - desc MAC_IFCONFR - 0x5410 - 32 - read-write - 0x0 - 0x31 - - - IFSEL - desc IFSEL - 0 - 0 - read-write - - - RCKINV - desc RCKINV - 4 - 4 - read-write - - - TCKINV - desc TCKINV - 5 - 5 - read-write - - - - - MAC_CONFIGR - desc MAC_CONFIGR - 0x10000 - 32 - read-write - 0x8000 - 0x72CF7EFC - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - DC - desc DC - 4 - 4 - read-write - - - BL - desc BL - 6 - 5 - read-write - - - ACS - desc ACS - 7 - 7 - read-write - - - DRTY - desc DRTY - 9 - 9 - read-write - - - IPCO - desc IPCO - 10 - 10 - read-write - - - DM - desc DM - 11 - 11 - read-write - - - LM - desc LM - 12 - 12 - read-write - - - DO - desc DO - 13 - 13 - read-write - - - FES - desc FES - 14 - 14 - read-write - - - DCRS - desc DCRS - 16 - 16 - read-write - - - IFG - desc IFG - 19 - 17 - read-write - - - MJB - desc MJB - 22 - 22 - read-write - - - MWD - desc MWD - 23 - 23 - read-write - - - CST - desc CST - 25 - 25 - read-write - - - SAIRC - desc SAIRC - 30 - 28 - read-write - - - - - MAC_FLTCTLR - desc MAC_FLTCTLR - 0x10004 - 32 - read-write - 0x0 - 0x803107FF - - - PR - desc PR - 0 - 0 - read-write - - - HUC - desc HUC - 1 - 1 - read-write - - - HMC - desc HMC - 2 - 2 - read-write - - - DAIF - desc DAIF - 3 - 3 - read-write - - - PMF - desc PMF - 4 - 4 - read-write - - - DBF - desc DBF - 5 - 5 - read-write - - - PCF - desc PCF - 7 - 6 - read-write - - - SAIF - desc SAIF - 8 - 8 - read-write - - - SAF - desc SAF - 9 - 9 - read-write - - - HPF - desc HPF - 10 - 10 - read-write - - - VTFE - desc VTFE - 16 - 16 - read-write - - - IPFE - desc IPFE - 20 - 20 - read-write - - - DNTU - desc DNTU - 21 - 21 - read-write - - - RA - desc RA - 31 - 31 - read-write - - - - - MAC_HASHTHR - desc MAC_HASHTHR - 0x10008 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HTH - desc HTH - 31 - 0 - read-write - - - - - MAC_HASHTLR - desc MAC_HASHTLR - 0x1000C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HTL - desc HTL - 31 - 0 - read-write - - - - - MAC_SMIADDR - desc MAC_SMIADDR - 0x10010 - 32 - read-write - 0x0 - 0xFFFF - - - SMIB - desc SMIB - 0 - 0 - read-write - - - SMIW - desc SMIW - 1 - 1 - read-write - - - SMIC - desc SMIC - 5 - 2 - read-write - - - SMIR - desc SMIR - 10 - 6 - read-write - - - SMIA - desc SMIA - 15 - 11 - read-write - - - - - MAC_SMIDATR - desc MAC_SMIDATR - 0x10014 - 32 - read-write - 0x0 - 0xFFFF - - - SMID - desc SMID - 15 - 0 - read-write - - - - - MAC_FLOCTLR - desc MAC_FLOCTLR - 0x10018 - 32 - read-write - 0x0 - 0xFFFF00BF - - - FCA_BPA - desc FCA_BPA - 0 - 0 - read-write - - - TFE - desc TFE - 1 - 1 - read-write - - - RFE - desc RFE - 2 - 2 - read-write - - - UNP - desc UNP - 3 - 3 - read-write - - - PLT - desc PLT - 5 - 4 - read-write - - - DZPQ - desc DZPQ - 7 - 7 - read-write - - - PAUSET - desc PAUSET - 31 - 16 - read-write - - - - - MAC_VTAFLTR - desc MAC_VTAFLTR - 0x1001C - 32 - read-write - 0x0 - 0x10BFFFF - - - VLFLT - desc VLFLT - 15 - 0 - read-write - - - VTAL - desc VTAL - 16 - 16 - read-write - - - VTIM - desc VTIM - 17 - 17 - read-write - - - VTHM - desc VTHM - 19 - 19 - read-write - - - - - MAC_MACSTSR - desc MAC_MACSTSR - 0x10024 - 32 - read-only - 0x0 - 0x37F0377 - - - MREA - desc MREA - 0 - 0 - read-only - - - MRS - desc MRS - 2 - 1 - read-only - - - RFWA - desc RFWA - 4 - 4 - read-only - - - RFRS - desc RFRS - 6 - 5 - read-only - - - RFFL - desc RFFL - 9 - 8 - read-only - - - MTEA - desc MTEA - 16 - 16 - read-only - - - MTS - desc MTS - 18 - 17 - read-only - - - MTP - desc MTP - 19 - 19 - read-only - - - TFRS - desc TFRS - 21 - 20 - read-only - - - TFWA - desc TFWA - 22 - 22 - read-only - - - TFNE - desc TFNE - 24 - 24 - read-only - - - TFF - desc TFF - 25 - 25 - read-only - - - - - MAC_RTWKFFR - desc MAC_RTWKFFR - 0x10028 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - WKUPFRMFT - desc WKUPFRMFT - 31 - 0 - read-write - - - - - MAC_PMTCTLR - desc MAC_PMTCTLR - 0x1002C - 32 - read-write - 0x0 - 0x87000667 - - - PWDN - desc PWDN - 0 - 0 - read-write - - - MPEN - desc MPEN - 1 - 1 - read-write - - - WKEN - desc WKEN - 2 - 2 - read-write - - - MPFR - desc MPFR - 5 - 5 - read-only - - - WKFR - desc WKFR - 6 - 6 - read-only - - - GLUB - desc GLUB - 9 - 9 - read-write - - - RTWKTR - desc RTWKTR - 10 - 10 - read-write - - - RTWKPT - desc RTWKPT - 26 - 24 - read-only - - - RTWKFR - desc RTWKFR - 31 - 31 - read-write - - - - - MAC_INTSTSR - desc MAC_INTSTSR - 0x10038 - 32 - read-only - 0x0 - 0x278 - - - PMTIS - desc PMTIS - 3 - 3 - read-only - - - MMCIS - desc MMCIS - 4 - 4 - read-only - - - MMCRXIS - desc MMCRXIS - 5 - 5 - read-only - - - MMCTXIS - desc MMCTXIS - 6 - 6 - read-only - - - TSPIS - desc TSPIS - 9 - 9 - read-only - - - - - MAC_INTMSKR - desc MAC_INTMSKR - 0x1003C - 32 - read-write - 0x0 - 0x208 - - - PMTIM - desc PMTIM - 3 - 3 - read-write - - - TSPIM - desc TSPIM - 9 - 9 - read-write - - - - - MAC_MACADHR0 - desc MAC_MACADHR0 - 0x10040 - 32 - read-write - 0x8000FFFF - 0x8000FFFF - - - ADDRH0 - desc ADDRH0 - 15 - 0 - read-write - - - AE0 - desc AE0 - 31 - 31 - read-only - - - - - MAC_MACADLR0 - desc MAC_MACADLR0 - 0x10044 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL0 - desc ADDRL0 - 31 - 0 - read-write - - - - - MAC_MACADHR1 - desc MAC_MACADHR1 - 0x10048 - 32 - read-write - 0xFFFF - 0xFF00FFFF - - - ADDRH1 - desc ADDRH1 - 15 - 0 - read-write - - - MBC1 - desc MBC1 - 29 - 24 - read-write - - - SA1 - desc SA1 - 30 - 30 - read-write - - - AE1 - desc AE1 - 31 - 31 - read-write - - - - - MAC_MACADLR1 - desc MAC_MACADLR1 - 0x1004C - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL1 - desc ADDRL1 - 31 - 0 - read-write - - - - - MAC_MACADHR2 - desc MAC_MACADHR2 - 0x10050 - 32 - read-write - 0xFFFF - 0xFF00FFFF - - - ADDRH2 - desc ADDRH2 - 15 - 0 - read-write - - - MBC2 - desc MBC2 - 29 - 24 - read-write - - - SA2 - desc SA2 - 30 - 30 - read-write - - - AE2 - desc AE2 - 31 - 31 - read-write - - - - - MAC_MACADLR2 - desc MAC_MACADLR2 - 0x10054 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL2 - desc ADDRL2 - 31 - 0 - read-write - - - - - MAC_MACADHR3 - desc MAC_MACADHR3 - 0x10058 - 32 - read-write - 0xFFFF - 0xFF00FFFF - - - ADDRH3 - desc ADDRH3 - 15 - 0 - read-write - - - MBC3 - desc MBC3 - 29 - 24 - read-write - - - SA3 - desc SA3 - 30 - 30 - read-write - - - AE3 - desc AE3 - 31 - 31 - read-write - - - - - MAC_MACADLR3 - desc MAC_MACADLR3 - 0x1005C - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL3 - desc ADDRL3 - 31 - 0 - read-write - - - - - MAC_MACADHR4 - desc MAC_MACADHR4 - 0x10060 - 32 - read-write - 0xFFFF - 0xFF00FFFF - - - ADDRH4 - desc ADDRH4 - 15 - 0 - read-write - - - MBC4 - desc MBC4 - 29 - 24 - read-write - - - SA4 - desc SA4 - 30 - 30 - read-write - - - AE4 - desc AE4 - 31 - 31 - read-write - - - - - MAC_MACADLR4 - desc MAC_MACADLR4 - 0x10064 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL4 - desc ADDRL4 - 31 - 0 - read-write - - - - - MMC_MMCCTLR - desc MMC_MMCCTLR - 0x10100 - 32 - read-write - 0x0 - 0x3F - - - CRST - desc CRST - 0 - 0 - read-write - - - COS - desc COS - 1 - 1 - read-write - - - ROR - desc ROR - 2 - 2 - read-write - - - MCF - desc MCF - 3 - 3 - read-write - - - MCPSET - desc MCPSET - 4 - 4 - read-write - - - MCPSEL - desc MCPSEL - 5 - 5 - read-write - - - - - MMC_REVSTSR - desc MMC_REVSTSR - 0x10104 - 32 - read-only - 0x0 - 0x10E00F8 - - - RXBGIS - desc RXBGIS - 3 - 3 - read-only - - - RXMGIS - desc RXMGIS - 4 - 4 - read-only - - - RXCEIS - desc RXCEIS - 5 - 5 - read-only - - - RXAEIS - desc RXAEIS - 6 - 6 - read-only - - - RXREIS - desc RXREIS - 7 - 7 - read-only - - - RXUGIS - desc RXUGIS - 17 - 17 - read-only - - - RXLEIS - desc RXLEIS - 18 - 18 - read-only - - - RXOEIS - desc RXOEIS - 19 - 19 - read-only - - - - - MMC_TRSSTSR - desc MMC_TRSSTSR - 0x10108 - 32 - read-only - 0x0 - 0x16F000C - - - TXBGIS - desc TXBGIS - 2 - 2 - read-only - - - TXMGIS - desc TXMGIS - 3 - 3 - read-only - - - TXDEEIS - desc TXDEEIS - 16 - 16 - read-only - - - TXLCEIS - desc TXLCEIS - 17 - 17 - read-only - - - TXECEIS - desc TXECEIS - 18 - 18 - read-only - - - TXCAEIS - desc TXCAEIS - 19 - 19 - read-only - - - TXUGIS - desc TXUGIS - 21 - 21 - read-only - - - TXEDEIS - desc TXEDEIS - 22 - 22 - read-only - - - - - MMC_RITCTLR - desc MMC_RITCTLR - 0x1010C - 32 - read-write - 0x0 - 0x10E00F8 - - - RXBGIM - desc RXBGIM - 3 - 3 - read-write - - - RXMGIM - desc RXMGIM - 4 - 4 - read-write - - - RXCEIM - desc RXCEIM - 5 - 5 - read-write - - - RXAEIM - desc RXAEIM - 6 - 6 - read-write - - - RXREIM - desc RXREIM - 7 - 7 - read-write - - - RXUGIM - desc RXUGIM - 17 - 17 - read-write - - - RXLEIM - desc RXLEIM - 18 - 18 - read-write - - - RXOEIM - desc RXOEIM - 19 - 19 - read-write - - - - - MMC_TITCTLR - desc MMC_TITCTLR - 0x10110 - 32 - read-write - 0x0 - 0x16F000C - - - TXBGIM - desc TXBGIM - 2 - 2 - read-write - - - TXMGIM - desc TXMGIM - 3 - 3 - read-write - - - TXDEEIM - desc TXDEEIM - 16 - 16 - read-write - - - TXLCEIM - desc TXLCEIM - 17 - 17 - read-write - - - TXECEIM - desc TXECEIM - 18 - 18 - read-write - - - TXCAEIM - desc TXCAEIM - 19 - 19 - read-write - - - TXUGIM - desc TXUGIM - 21 - 21 - read-write - - - TXEDEIM - desc TXEDEIM - 22 - 22 - read-write - - - - - MMC_TXBRGFR - desc MMC_TXBRGFR - 0x1011C - 32 - read-only - 0x0 - 0xFFFF - - - TXBRGCNT - desc TXBRGCNT - 15 - 0 - read-only - - - - - MMC_TXMUGFR - desc MMC_TXMUGFR - 0x10120 - 32 - read-only - 0x0 - 0xFFFF - - - TXMUGCNT - desc TXMUGCNT - 15 - 0 - read-only - - - - - MMC_TXDEEFR - desc MMC_TXDEEFR - 0x10154 - 32 - read-only - 0x0 - 0xFFFF - - - TXDEECNT - desc TXDEECNT - 15 - 0 - read-only - - - - - MMC_TXLCEFR - desc MMC_TXLCEFR - 0x10158 - 32 - read-only - 0x0 - 0xFFFF - - - TXLCECNT - desc TXLCECNT - 15 - 0 - read-only - - - - - MMC_TXECEFR - desc MMC_TXECEFR - 0x1015C - 32 - read-only - 0x0 - 0xFFFF - - - TXECECNT - desc TXECECNT - 15 - 0 - read-only - - - - - MMC_TXCAEFR - desc MMC_TXCAEFR - 0x10160 - 32 - read-only - 0x0 - 0xFFFF - - - TXCAECNT - desc TXCAECNT - 15 - 0 - read-only - - - - - MMC_TXUNGFR - desc MMC_TXUNGFR - 0x10168 - 32 - read-only - 0x0 - 0xFFFF - - - TXUNGCNT - desc TXUNGCNT - 15 - 0 - read-only - - - - - MMC_TXEDEFR - desc MMC_TXEDEFR - 0x1016C - 32 - read-only - 0x0 - 0xFFFF - - - TXEDECNT - desc TXEDECNT - 15 - 0 - read-only - - - - - MMC_RXBRGFR - desc MMC_RXBRGFR - 0x1018C - 32 - read-only - 0x0 - 0xFFFF - - - RXBRGCNT - desc RXBRGCNT - 15 - 0 - read-only - - - - - MMC_RXMUGFR - desc MMC_RXMUGFR - 0x10190 - 32 - read-only - 0x0 - 0xFFFF - - - RXMUGCNT - desc RXMUGCNT - 15 - 0 - read-only - - - - - MMC_RXCREFR - desc MMC_RXCREFR - 0x10194 - 32 - read-only - 0x0 - 0xFFFF - - - RXCRECNT - desc RXCRECNT - 15 - 0 - read-only - - - - - MMC_RXALEFR - desc MMC_RXALEFR - 0x10198 - 32 - read-only - 0x0 - 0xFFFF - - - RXALECNT - desc RXALECNT - 15 - 0 - read-only - - - - - MMC_RXRUEFR - desc MMC_RXRUEFR - 0x1019C - 32 - read-only - 0x0 - 0xFFFF - - - RXRUECNT - desc RXRUECNT - 15 - 0 - read-only - - - - - MMC_RXUNGFR - desc MMC_RXUNGFR - 0x101C4 - 32 - read-only - 0x0 - 0xFFFF - - - RXUNGCNT - desc RXUNGCNT - 15 - 0 - read-only - - - - - MMC_RXLEEFR - desc MMC_RXLEEFR - 0x101C8 - 32 - read-only - 0x0 - 0xFFFF - - - RXLEECNT - desc RXLEECNT - 15 - 0 - read-only - - - - - MMC_RXOREFR - desc MMC_RXOREFR - 0x101CC - 32 - read-only - 0x0 - 0xFFFF - - - RXORECNT - desc RXORECNT - 15 - 0 - read-only - - - - - MAC_L34CTLR - desc MAC_L34CTLR - 0x10400 - 32 - read-write - 0x0 - 0x13DFFFD - - - L3PEN - desc L3PEN - 0 - 0 - read-write - - - L3SAM - desc L3SAM - 2 - 2 - read-write - - - L3SAIM - desc L3SAIM - 3 - 3 - read-write - - - L3DAM - desc L3DAM - 4 - 4 - read-write - - - L3DAIM - desc L3DAIM - 5 - 5 - read-write - - - L3HSBM - desc L3HSBM - 10 - 6 - read-write - - - L3HDBM - desc L3HDBM - 15 - 11 - read-write - - - L4PEN - desc L4PEN - 16 - 16 - read-write - - - L4SPM - desc L4SPM - 18 - 18 - read-write - - - L4SPIM - desc L4SPIM - 19 - 19 - read-write - - - L4DPM - desc L4DPM - 20 - 20 - read-write - - - L4DPIM - desc L4DPIM - 21 - 21 - read-write - - - - - MAC_L4PORTR - desc MAC_L4PORTR - 0x10404 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L4SPVAL - desc L4SPVAL - 15 - 0 - read-write - - - L4DPVAL - desc L4DPVAL - 31 - 16 - read-write - - - - - MAC_L3ADDRR0 - desc MAC_L3ADDRR0 - 0x10410 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L3ADDR0 - desc L3ADDR0 - 31 - 0 - read-write - - - - - MAC_L3ADDRR1 - desc MAC_L3ADDRR1 - 0x10414 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L3ADDR2 - desc L3ADDR2 - 31 - 0 - read-write - - - - - MAC_L3ADDRR2 - desc MAC_L3ADDRR2 - 0x10418 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L3ADDR2 - desc L3ADDR2 - 31 - 0 - read-write - - - - - MAC_L3ADDRR3 - desc MAC_L3ADDRR3 - 0x1041C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L3ADDR3 - desc L3ADDR3 - 31 - 0 - read-write - - - - - MAC_VTACTLR - desc MAC_VTACTLR - 0x10584 - 32 - read-write - 0x0 - 0x107FFFF - - - VLANV - desc VLANV - 15 - 0 - read-write - - - VLANC - desc VLANC - 17 - 16 - read-write - - - VLANS - desc VLANS - 18 - 18 - read-write - - - - - MAC_VLAHTBR - desc MAC_VLAHTBR - 0x10588 - 32 - read-write - 0x0 - 0xFFFF - - - VLHT - desc VLHT - 15 - 0 - read-write - - - - - PTP_TSPCTLR - desc PTP_TSPCTLR - 0x10700 - 32 - read-write - 0x2000 - 0x107FF3F - - - TSPEN - desc TSPEN - 0 - 0 - read-write - - - TSPUPSEL - desc TSPUPSEL - 1 - 1 - read-write - - - TSPINI - desc TSPINI - 2 - 2 - read-write - - - TSPUP - desc TSPUP - 3 - 3 - read-write - - - TSPINT - desc TSPINT - 4 - 4 - read-write - - - TSPADUP - desc TSPADUP - 5 - 5 - read-write - - - TSPEALL - desc TSPEALL - 8 - 8 - read-write - - - TSPSSR - desc TSPSSR - 9 - 9 - read-write - - - TSPVER - desc TSPVER - 10 - 10 - read-write - - - TSPOVETH - desc TSPOVETH - 11 - 11 - read-write - - - TSPOVIPV6 - desc TSPOVIPV6 - 12 - 12 - read-write - - - TSPOVIPV4 - desc TSPOVIPV4 - 13 - 13 - read-write - - - TSPMTSEL - desc TSPMTSEL - 17 - 14 - read-write - - - TSPADF - desc TSPADF - 18 - 18 - read-write - - - - - PTP_TSPNSAR - desc PTP_TSPNSAR - 0x10704 - 32 - read-write - 0x0 - 0xFF - - - TSPNSEADD - desc TSPNSEADD - 7 - 0 - read-write - - - - - PTP_TMSSECR - desc PTP_TMSSECR - 0x10708 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - TSPSYSSEC - desc TSPSYSSEC - 31 - 0 - read-only - - - - - PTP_TMSNSER - desc PTP_TMSNSER - 0x1070C - 32 - read-only - 0x0 - 0x7FFFFFFF - - - TSPSYSNSEC - desc TSPSYSNSEC - 30 - 0 - read-only - - - - - PTP_TMUSECR - desc PTP_TMUSECR - 0x10710 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPUPSEC - desc TSPUPSEC - 31 - 0 - read-write - - - - - PTP_TMUNSER - desc PTP_TMUNSER - 0x10714 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPUPNSEC - desc TSPUPNSEC - 30 - 0 - read-write - - - TSPUPNS - desc TSPUPNS - 31 - 31 - read-write - - - - - PTP_TSPADDR - desc PTP_TSPADDR - 0x10718 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPADD - desc TSPADD - 31 - 0 - read-write - - - - - PTP_TMTSECR0 - desc PTP_TMTSECR0 - 0x1071C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPTAGSEC0 - desc TSPTAGSEC0 - 31 - 0 - read-write - - - - - PTP_TMTNSER0 - desc PTP_TMTNSER0 - 0x10720 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - TSPTAGNSEC0 - desc TSPTAGNSEC0 - 30 - 0 - read-write - - - - - PTP_TSPSTSR - desc PTP_TSPSTSR - 0x10728 - 32 - read-only - 0x0 - 0x3B - - - TSOVF - desc TSOVF - 0 - 0 - read-only - - - TSTAR0 - desc TSTAR0 - 1 - 1 - read-only - - - TSERR0 - desc TSERR0 - 3 - 3 - read-only - - - TSTAR1 - desc TSTAR1 - 4 - 4 - read-only - - - TSERR1 - desc TSERR1 - 5 - 5 - read-only - - - - - PTP_PPSCTLR - desc PTP_PPSCTLR - 0x1072C - 32 - read-write - 0x0 - 0x677F - - - PPSFRE0 - desc PPSFRE0 - 3 - 0 - read-write - - - PPSOMD - desc PPSOMD - 4 - 4 - read-write - - - TT0SEL - desc TT0SEL - 6 - 5 - read-write - - - PPSFRE1 - desc PPSFRE1 - 10 - 8 - read-write - - - TT1SEL - desc TT1SEL - 14 - 13 - read-write - - - - - PTP_TMTSECR1 - desc PTP_TMTSECR1 - 0x10780 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPTAGSEC1 - desc TSPTAGSEC1 - 31 - 0 - read-write - - - - - PTP_TMTNSER1 - desc PTP_TMTNSER1 - 0x10784 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - TSPTAGNSEC1 - desc TSPTAGNSEC1 - 30 - 0 - read-write - - - - - DMA_BUSMODR - desc DMA_BUSMODR - 0x11000 - 32 - read-write - 0x20101 - 0xFFFFFFF - - - SWR - desc SWR - 0 - 0 - read-write - - - DMAA - desc DMAA - 1 - 1 - read-write - - - DSL - desc DSL - 6 - 2 - read-write - - - DSEN - desc DSEN - 7 - 7 - read-write - - - TPBL - desc TPBL - 13 - 8 - read-write - - - PRAT - desc PRAT - 15 - 14 - read-write - - - FBST - desc FBST - 16 - 16 - read-write - - - RPBL - desc RPBL - 22 - 17 - read-write - - - SPBL - desc SPBL - 23 - 23 - read-write - - - M8PBL - desc M8PBL - 24 - 24 - read-write - - - AAL - desc AAL - 25 - 25 - read-write - - - MBST - desc MBST - 26 - 26 - read-write - - - TXPR - desc TXPR - 27 - 27 - read-write - - - - - DMA_TXPOLLR - desc DMA_TXPOLLR - 0x11004 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TXPOLL - desc TXPOLL - 31 - 0 - read-write - - - - - DMA_RXPOLLR - desc DMA_RXPOLLR - 0x11008 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RXPOLL - desc RXPOLL - 31 - 0 - read-write - - - - - DMA_RXDLADR - desc DMA_RXDLADR - 0x1100C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RXDLAD - desc RXDLAD - 31 - 0 - read-write - - - - - DMA_TXDLADR - desc DMA_TXDLADR - 0x11010 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TXDLAD - desc TXDLAD - 31 - 0 - read-write - - - - - DMA_DMASTSR - desc DMA_DMASTSR - 0x11014 - 32 - read-write - 0x0 - 0x3BFFE7FF - - - TIS - desc TIS - 0 - 0 - read-write - - - TSS - desc TSS - 1 - 1 - read-write - - - TUS - desc TUS - 2 - 2 - read-write - - - TJS - desc TJS - 3 - 3 - read-write - - - OVS - desc OVS - 4 - 4 - read-write - - - UNS - desc UNS - 5 - 5 - read-write - - - RIS - desc RIS - 6 - 6 - read-write - - - RUS - desc RUS - 7 - 7 - read-write - - - RSS - desc RSS - 8 - 8 - read-write - - - RWS - desc RWS - 9 - 9 - read-write - - - ETS - desc ETS - 10 - 10 - read-write - - - FBS - desc FBS - 13 - 13 - read-write - - - ERS - desc ERS - 14 - 14 - read-write - - - AIS - desc AIS - 15 - 15 - read-write - - - NIS - desc NIS - 16 - 16 - read-write - - - RSTS - desc RSTS - 19 - 17 - read-only - - - TSTS - desc TSTS - 22 - 20 - read-only - - - EBUS - desc EBUS - 25 - 23 - read-only - - - MMCS - desc MMCS - 27 - 27 - read-only - - - PMTS - desc PMTS - 28 - 28 - read-only - - - PTPS - desc PTPS - 29 - 29 - read-only - - - - - DMA_OPRMODR - desc DMA_OPRMODR - 0x11018 - 32 - read-write - 0x0 - 0x731E0FE - - - STR - desc STR - 1 - 1 - read-write - - - OSF - desc OSF - 2 - 2 - read-write - - - RTC - desc RTC - 4 - 3 - read-write - - - DGF - desc DGF - 5 - 5 - read-write - - - FUF - desc FUF - 6 - 6 - read-write - - - FEF - desc FEF - 7 - 7 - read-write - - - STT - desc STT - 13 - 13 - read-write - - - TTC - desc TTC - 16 - 14 - read-write - - - FTF - desc FTF - 20 - 20 - read-write - - - TSF - desc TSF - 21 - 21 - read-write - - - DFRF - desc DFRF - 24 - 24 - read-write - - - RSF - desc RSF - 25 - 25 - read-write - - - DTCOE - desc DTCOE - 26 - 26 - read-write - - - - - DMA_INTENAR - desc DMA_INTENAR - 0x1101C - 32 - read-write - 0x0 - 0x101E7FF - - - TIE - desc TIE - 0 - 0 - read-write - - - TSE - desc TSE - 1 - 1 - read-write - - - TUE - desc TUE - 2 - 2 - read-write - - - TJE - desc TJE - 3 - 3 - read-write - - - OVE - desc OVE - 4 - 4 - read-write - - - UNE - desc UNE - 5 - 5 - read-write - - - RIE - desc RIE - 6 - 6 - read-write - - - RUE - desc RUE - 7 - 7 - read-write - - - RSE - desc RSE - 8 - 8 - read-write - - - RWE - desc RWE - 9 - 9 - read-write - - - ETE - desc ETE - 10 - 10 - read-write - - - FBE - desc FBE - 13 - 13 - read-write - - - ERE - desc ERE - 14 - 14 - read-write - - - AIE - desc AIE - 15 - 15 - read-write - - - NIE - desc NIE - 16 - 16 - read-write - - - - - DMA_RFRCNTR - desc DMA_RFRCNTR - 0x11020 - 32 - read-only - 0x0 - 0x1FFFFFFF - - - UNACNT - desc UNACNT - 15 - 0 - read-only - - - UNAOVF - desc UNAOVF - 16 - 16 - read-only - - - OVFCNT - desc OVFCNT - 27 - 17 - read-only - - - OVFOVF - desc OVFOVF - 28 - 28 - read-only - - - - - DMA_REVWDTR - desc DMA_REVWDTR - 0x11024 - 32 - read-write - 0x0 - 0xFF - - - RIWT - desc RIWT - 7 - 0 - read-write - - - - - DMA_CHTXDER - desc DMA_CHTXDER - 0x11048 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - CHTXDE - desc CHTXDE - 31 - 0 - read-only - - - - - DMA_CHRXDER - desc DMA_CHRXDER - 0x1104C - 32 - read-only - 0x0 - 0xFFFFFFFF - - - CHRXDE - desc CHRXDE - 31 - 0 - read-only - - - - - DMA_CHTXBFR - desc DMA_CHTXBFR - 0x11050 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - CHTXBF - desc CHTXBF - 31 - 0 - read-only - - - - - DMA_CHRXBFR - desc DMA_CHRXBFR - 0x11054 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - CHRXBF - desc CHRXBF - 31 - 0 - read-only - - - - - - - FCM - desc FCM - 0x40048400 - - 0x0 - 0x24 - - - - LVR - desc LVR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - LVR - desc LVR - 15 - 0 - read-write - - - - - UVR - desc UVR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - UVR - desc UVR - 15 - 0 - read-write - - - - - CNTR - desc CNTR - 0x8 - 32 - read-only - 0x0 - 0xFFFF - - - CNTR - desc CNTR - 15 - 0 - read-only - - - - - STR - desc STR - 0xC - 32 - read-write - 0x0 - 0x1 - - - START - desc START - 0 - 0 - read-write - - - - - MCCR - desc MCCR - 0x10 - 32 - read-write - 0x0 - 0xF3 - - - MDIVS - desc MDIVS - 1 - 0 - read-write - - - MCKS - desc MCKS - 7 - 4 - read-write - - - - - RCCR - desc RCCR - 0x14 - 32 - read-write - 0x0 - 0xB3FB - - - RDIVS - desc RDIVS - 1 - 0 - read-write - - - RCKS - desc RCKS - 6 - 3 - read-write - - - INEXS - desc INEXS - 7 - 7 - read-write - - - DNFS - desc DNFS - 9 - 8 - read-write - - - EDGES - desc EDGES - 13 - 12 - read-write - - - EXREFE - desc EXREFE - 15 - 15 - read-write - - - - - RIER - desc RIER - 0x18 - 32 - read-write - 0x0 - 0x97 - - - ERRIE - desc ERRIE - 0 - 0 - read-write - - - MENDIE - desc MENDIE - 1 - 1 - read-write - - - OVFIE - desc OVFIE - 2 - 2 - read-write - - - ERRINTRS - desc ERRINTRS - 4 - 4 - read-write - - - ERRE - desc ERRE - 7 - 7 - read-write - - - - - SR - desc SR - 0x1C - 32 - read-only - 0x0 - 0x7 - - - ERRF - desc ERRF - 0 - 0 - read-only - - - MENDF - desc MENDF - 1 - 1 - read-only - - - OVF - desc OVF - 2 - 2 - read-only - - - - - CLR - desc CLR - 0x20 - 32 - write-only - 0x0 - 0x7 - - - ERRFCLR - desc ERRFCLR - 0 - 0 - write-only - - - MENDFCLR - desc MENDFCLR - 1 - 1 - write-only - - - OVFCLR - desc OVFCLR - 2 - 2 - write-only - - - - - - - FMAC1 - desc FMAC - 0x40058000 - - 0x0 - 0x64 - - - - ENR - desc ENR - 0x0 - 32 - read-write - 0x0 - 0x1 - - - FMACEN - desc FMACEN - 0 - 0 - read-write - - - - - CTR - desc CTR - 0x4 - 32 - read-write - 0x10 - 0x1F1F - - - STAGE_NUM - desc STAGE_NUM - 4 - 0 - read-write - - - SHIFT - desc SHIFT - 12 - 8 - read-write - - - - - IER - desc IER - 0x8 - 32 - read-write - 0x0 - 0x1 - - - INTEN - desc INTEN - 0 - 0 - read-write - - - - - DTR - desc DTR - 0xC - 32 - read-write - 0x0 - 0xFFFF - - - DIN - desc DIN - 15 - 0 - read-write - - - - - RTR0 - desc RTR0 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RTR1 - desc RTR1 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - STR - desc STR - 0x18 - 32 - read-write - 0x0 - 0x80000000 - - - READY - desc READY - 31 - 31 - read-write - - - - - COR0 - desc COR0 - 0x20 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR1 - desc COR1 - 0x24 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR2 - desc COR2 - 0x28 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR3 - desc COR3 - 0x2C - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR4 - desc COR4 - 0x30 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR5 - desc COR5 - 0x34 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR6 - desc COR6 - 0x38 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR7 - desc COR7 - 0x3C - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR8 - desc COR8 - 0x40 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR9 - desc COR9 - 0x44 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR10 - desc COR10 - 0x48 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR11 - desc COR11 - 0x4C - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR12 - desc COR12 - 0x50 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR13 - desc COR13 - 0x54 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR14 - desc COR14 - 0x58 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR15 - desc COR15 - 0x5C - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR16 - desc COR16 - 0x60 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - - - FMAC2 - desc FMAC - 0x40058400 - - 0x0 - 0x64 - - - - FMAC3 - desc FMAC - 0x40058800 - - 0x0 - 0x64 - - - - FMAC4 - desc FMAC - 0x40058C00 - - 0x0 - 0x64 - - - - GPIO - desc GPIO - 0x40053800 - - 0x0 - 0x638 - - - - PIDRA - desc PIDRA - 0x0 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRA - desc PODRA - 0x4 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERA - desc POERA - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRA - desc POSRA - 0x8 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRA - desc PORRA - 0xA - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRA - desc POTRA - 0xC - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRB - desc PIDRB - 0x10 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRB - desc PODRB - 0x14 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERB - desc POERB - 0x16 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRB - desc POSRB - 0x18 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRB - desc PORRB - 0x1A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRB - desc POTRB - 0x1C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRC - desc PIDRC - 0x20 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRC - desc PODRC - 0x24 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERC - desc POERC - 0x26 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRC - desc POSRC - 0x28 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRC - desc PORRC - 0x2A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRC - desc POTRC - 0x2C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRD - desc PIDRD - 0x30 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRD - desc PODRD - 0x34 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERD - desc POERD - 0x36 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRD - desc POSRD - 0x38 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRD - desc PORRD - 0x3A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRD - desc POTRD - 0x3C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRE - desc PIDRE - 0x40 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRE - desc PODRE - 0x44 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERE - desc POERE - 0x46 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRE - desc POSRE - 0x48 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRE - desc PORRE - 0x4A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRE - desc POTRE - 0x4C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRF - desc PIDRF - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRF - desc PODRF - 0x54 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERF - desc POERF - 0x56 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRF - desc POSRF - 0x58 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRF - desc PORRF - 0x5A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRF - desc POTRF - 0x5C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRG - desc PIDRG - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRG - desc PODRG - 0x64 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERG - desc POERG - 0x66 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRG - desc POSRG - 0x68 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRG - desc PORRG - 0x6A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRG - desc POTRG - 0x6C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRH - desc PIDRH - 0x70 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRH - desc PODRH - 0x74 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERH - desc POERH - 0x76 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRH - desc POSRH - 0x78 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRH - desc PORRH - 0x7A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRH - desc POTRH - 0x7C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRI - desc PIDRI - 0x80 - 16 - read-only - 0x0 - 0x3FFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - - - PODRI - desc PODRI - 0x84 - 16 - read-write - 0x0 - 0x3FFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - - - POERI - desc POERI - 0x86 - 16 - read-write - 0x0 - 0x3FFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - - - POSRI - desc POSRI - 0x88 - 16 - write-only - 0x0 - 0x3FFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - - - PORRI - desc PORRI - 0x8A - 16 - write-only - 0x0 - 0x3FFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - - - POTRI - desc POTRI - 0x8C - 16 - write-only - 0x0 - 0x3FFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - - - PSPCR - desc PSPCR - 0x3F4 - 16 - read-write - 0x1F - 0x1F - - - SPFE - desc SPFE - 4 - 0 - read-write - - - - - PCCR - desc PCCR - 0x3F8 - 16 - read-write - 0x1000 - 0x703F - - - BFSEL - desc BFSEL - 5 - 0 - read-write - - - RDWT - desc RDWT - 14 - 12 - read-write - - - - - PINAER - desc PINAER - 0x3FA - 16 - read-write - 0x0 - 0x1FF - - - PINAE - desc PINAE - 8 - 0 - read-write - - - - - PWPR - desc PWPR - 0x3FC - 16 - read-write - 0x0 - 0xFF01 - - - WE - desc WE - 0 - 0 - read-write - - - WP - desc WP - 15 - 8 - write-only - - - - - PCRA0 - desc PCRA0 - 0x400 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA0 - desc PFSRA0 - 0x402 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA1 - desc PCRA1 - 0x404 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA1 - desc PFSRA1 - 0x406 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA2 - desc PCRA2 - 0x408 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA2 - desc PFSRA2 - 0x40A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA3 - desc PCRA3 - 0x40C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA3 - desc PFSRA3 - 0x40E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA4 - desc PCRA4 - 0x410 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA4 - desc PFSRA4 - 0x412 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA5 - desc PCRA5 - 0x414 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA5 - desc PFSRA5 - 0x416 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA6 - desc PCRA6 - 0x418 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA6 - desc PFSRA6 - 0x41A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA7 - desc PCRA7 - 0x41C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA7 - desc PFSRA7 - 0x41E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA8 - desc PCRA8 - 0x420 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA8 - desc PFSRA8 - 0x422 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA9 - desc PCRA9 - 0x424 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA9 - desc PFSRA9 - 0x426 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA10 - desc PCRA10 - 0x428 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA10 - desc PFSRA10 - 0x42A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA11 - desc PCRA11 - 0x42C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA11 - desc PFSRA11 - 0x42E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA12 - desc PCRA12 - 0x430 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA12 - desc PFSRA12 - 0x432 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA13 - desc PCRA13 - 0x434 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA13 - desc PFSRA13 - 0x436 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA14 - desc PCRA14 - 0x438 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA14 - desc PFSRA14 - 0x43A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA15 - desc PCRA15 - 0x43C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA15 - desc PFSRA15 - 0x43E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB0 - desc PCRB0 - 0x440 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB0 - desc PFSRB0 - 0x442 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB1 - desc PCRB1 - 0x444 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB1 - desc PFSRB1 - 0x446 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB2 - desc PCRB2 - 0x448 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB2 - desc PFSRB2 - 0x44A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB3 - desc PCRB3 - 0x44C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB3 - desc PFSRB3 - 0x44E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB4 - desc PCRB4 - 0x450 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB4 - desc PFSRB4 - 0x452 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB5 - desc PCRB5 - 0x454 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB5 - desc PFSRB5 - 0x456 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB6 - desc PCRB6 - 0x458 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB6 - desc PFSRB6 - 0x45A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB7 - desc PCRB7 - 0x45C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB7 - desc PFSRB7 - 0x45E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB8 - desc PCRB8 - 0x460 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB8 - desc PFSRB8 - 0x462 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB9 - desc PCRB9 - 0x464 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB9 - desc PFSRB9 - 0x466 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB10 - desc PCRB10 - 0x468 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB10 - desc PFSRB10 - 0x46A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB11 - desc PCRB11 - 0x46C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB11 - desc PFSRB11 - 0x46E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB12 - desc PCRB12 - 0x470 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB12 - desc PFSRB12 - 0x472 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB13 - desc PCRB13 - 0x474 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB13 - desc PFSRB13 - 0x476 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB14 - desc PCRB14 - 0x478 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB14 - desc PFSRB14 - 0x47A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB15 - desc PCRB15 - 0x47C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB15 - desc PFSRB15 - 0x47E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC0 - desc PCRC0 - 0x480 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC0 - desc PFSRC0 - 0x482 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC1 - desc PCRC1 - 0x484 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC1 - desc PFSRC1 - 0x486 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC2 - desc PCRC2 - 0x488 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC2 - desc PFSRC2 - 0x48A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC3 - desc PCRC3 - 0x48C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC3 - desc PFSRC3 - 0x48E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC4 - desc PCRC4 - 0x490 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC4 - desc PFSRC4 - 0x492 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC5 - desc PCRC5 - 0x494 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC5 - desc PFSRC5 - 0x496 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC6 - desc PCRC6 - 0x498 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC6 - desc PFSRC6 - 0x49A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC7 - desc PCRC7 - 0x49C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC7 - desc PFSRC7 - 0x49E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC8 - desc PCRC8 - 0x4A0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC8 - desc PFSRC8 - 0x4A2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC9 - desc PCRC9 - 0x4A4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC9 - desc PFSRC9 - 0x4A6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC10 - desc PCRC10 - 0x4A8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC10 - desc PFSRC10 - 0x4AA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC11 - desc PCRC11 - 0x4AC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC11 - desc PFSRC11 - 0x4AE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC12 - desc PCRC12 - 0x4B0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC12 - desc PFSRC12 - 0x4B2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC13 - desc PCRC13 - 0x4B4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC13 - desc PFSRC13 - 0x4B6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC14 - desc PCRC14 - 0x4B8 - 16 - read-write - 0x8100 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC14 - desc PFSRC14 - 0x4BA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC15 - desc PCRC15 - 0x4BC - 16 - read-write - 0x8100 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC15 - desc PFSRC15 - 0x4BE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD0 - desc PCRD0 - 0x4C0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD0 - desc PFSRD0 - 0x4C2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD1 - desc PCRD1 - 0x4C4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD1 - desc PFSRD1 - 0x4C6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD2 - desc PCRD2 - 0x4C8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD2 - desc PFSRD2 - 0x4CA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD3 - desc PCRD3 - 0x4CC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD3 - desc PFSRD3 - 0x4CE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD4 - desc PCRD4 - 0x4D0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD4 - desc PFSRD4 - 0x4D2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD5 - desc PCRD5 - 0x4D4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD5 - desc PFSRD5 - 0x4D6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD6 - desc PCRD6 - 0x4D8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD6 - desc PFSRD6 - 0x4DA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD7 - desc PCRD7 - 0x4DC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD7 - desc PFSRD7 - 0x4DE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD8 - desc PCRD8 - 0x4E0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD8 - desc PFSRD8 - 0x4E2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD9 - desc PCRD9 - 0x4E4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD9 - desc PFSRD9 - 0x4E6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD10 - desc PCRD10 - 0x4E8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD10 - desc PFSRD10 - 0x4EA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD11 - desc PCRD11 - 0x4EC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD11 - desc PFSRD11 - 0x4EE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD12 - desc PCRD12 - 0x4F0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD12 - desc PFSRD12 - 0x4F2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD13 - desc PCRD13 - 0x4F4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD13 - desc PFSRD13 - 0x4F6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD14 - desc PCRD14 - 0x4F8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD14 - desc PFSRD14 - 0x4FA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD15 - desc PCRD15 - 0x4FC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD15 - desc PFSRD15 - 0x4FE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE0 - desc PCRE0 - 0x500 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE0 - desc PFSRE0 - 0x502 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE1 - desc PCRE1 - 0x504 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE1 - desc PFSRE1 - 0x506 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE2 - desc PCRE2 - 0x508 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE2 - desc PFSRE2 - 0x50A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE3 - desc PCRE3 - 0x50C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE3 - desc PFSRE3 - 0x50E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE4 - desc PCRE4 - 0x510 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE4 - desc PFSRE4 - 0x512 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE5 - desc PCRE5 - 0x514 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE5 - desc PFSRE5 - 0x516 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE6 - desc PCRE6 - 0x518 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE6 - desc PFSRE6 - 0x51A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE7 - desc PCRE7 - 0x51C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE7 - desc PFSRE7 - 0x51E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE8 - desc PCRE8 - 0x520 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE8 - desc PFSRE8 - 0x522 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE9 - desc PCRE9 - 0x524 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE9 - desc PFSRE9 - 0x526 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE10 - desc PCRE10 - 0x528 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE10 - desc PFSRE10 - 0x52A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE11 - desc PCRE11 - 0x52C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE11 - desc PFSRE11 - 0x52E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE12 - desc PCRE12 - 0x530 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE12 - desc PFSRE12 - 0x532 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE13 - desc PCRE13 - 0x534 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE13 - desc PFSRE13 - 0x536 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE14 - desc PCRE14 - 0x538 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE14 - desc PFSRE14 - 0x53A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE15 - desc PCRE15 - 0x53C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE15 - desc PFSRE15 - 0x53E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF0 - desc PCRF0 - 0x540 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF0 - desc PFSRF0 - 0x542 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF1 - desc PCRF1 - 0x544 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF1 - desc PFSRF1 - 0x546 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF2 - desc PCRF2 - 0x548 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF2 - desc PFSRF2 - 0x54A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF3 - desc PCRF3 - 0x54C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF3 - desc PFSRF3 - 0x54E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF4 - desc PCRF4 - 0x550 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF4 - desc PFSRF4 - 0x552 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF5 - desc PCRF5 - 0x554 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF5 - desc PFSRF5 - 0x556 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF6 - desc PCRF6 - 0x558 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF6 - desc PFSRF6 - 0x55A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF7 - desc PCRF7 - 0x55C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF7 - desc PFSRF7 - 0x55E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF8 - desc PCRF8 - 0x560 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF8 - desc PFSRF8 - 0x562 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF9 - desc PCRF9 - 0x564 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF9 - desc PFSRF9 - 0x566 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF10 - desc PCRF10 - 0x568 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF10 - desc PFSRF10 - 0x56A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF11 - desc PCRF11 - 0x56C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF11 - desc PFSRF11 - 0x56E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF12 - desc PCRF12 - 0x570 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF12 - desc PFSRF12 - 0x572 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF13 - desc PCRF13 - 0x574 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF13 - desc PFSRF13 - 0x576 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF14 - desc PCRF14 - 0x578 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF14 - desc PFSRF14 - 0x57A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF15 - desc PCRF15 - 0x57C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF15 - desc PFSRF15 - 0x57E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG0 - desc PCRG0 - 0x580 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG0 - desc PFSRG0 - 0x582 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG1 - desc PCRG1 - 0x584 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG1 - desc PFSRG1 - 0x586 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG2 - desc PCRG2 - 0x588 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG2 - desc PFSRG2 - 0x58A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG3 - desc PCRG3 - 0x58C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG3 - desc PFSRG3 - 0x58E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG4 - desc PCRG4 - 0x590 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG4 - desc PFSRG4 - 0x592 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG5 - desc PCRG5 - 0x594 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG5 - desc PFSRG5 - 0x596 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG6 - desc PCRG6 - 0x598 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG6 - desc PFSRG6 - 0x59A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG7 - desc PCRG7 - 0x59C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG7 - desc PFSRG7 - 0x59E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG8 - desc PCRG8 - 0x5A0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG8 - desc PFSRG8 - 0x5A2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG9 - desc PCRG9 - 0x5A4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG9 - desc PFSRG9 - 0x5A6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG10 - desc PCRG10 - 0x5A8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG10 - desc PFSRG10 - 0x5AA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG11 - desc PCRG11 - 0x5AC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG11 - desc PFSRG11 - 0x5AE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG12 - desc PCRG12 - 0x5B0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG12 - desc PFSRG12 - 0x5B2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG13 - desc PCRG13 - 0x5B4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG13 - desc PFSRG13 - 0x5B6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG14 - desc PCRG14 - 0x5B8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG14 - desc PFSRG14 - 0x5BA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG15 - desc PCRG15 - 0x5BC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG15 - desc PFSRG15 - 0x5BE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH0 - desc PCRH0 - 0x5C0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH0 - desc PFSRH0 - 0x5C2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH1 - desc PCRH1 - 0x5C4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH1 - desc PFSRH1 - 0x5C6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH2 - desc PCRH2 - 0x5C8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH2 - desc PFSRH2 - 0x5CA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH3 - desc PCRH3 - 0x5CC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH3 - desc PFSRH3 - 0x5CE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH4 - desc PCRH4 - 0x5D0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH4 - desc PFSRH4 - 0x5D2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH5 - desc PCRH5 - 0x5D4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH5 - desc PFSRH5 - 0x5D6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH6 - desc PCRH6 - 0x5D8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH6 - desc PFSRH6 - 0x5DA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH7 - desc PCRH7 - 0x5DC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH7 - desc PFSRH7 - 0x5DE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH8 - desc PCRH8 - 0x5E0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH8 - desc PFSRH8 - 0x5E2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH9 - desc PCRH9 - 0x5E4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH9 - desc PFSRH9 - 0x5E6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH10 - desc PCRH10 - 0x5E8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH10 - desc PFSRH10 - 0x5EA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH11 - desc PCRH11 - 0x5EC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH11 - desc PFSRH11 - 0x5EE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH12 - desc PCRH12 - 0x5F0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH12 - desc PFSRH12 - 0x5F2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH13 - desc PCRH13 - 0x5F4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH13 - desc PFSRH13 - 0x5F6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH14 - desc PCRH14 - 0x5F8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH14 - desc PFSRH14 - 0x5FA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH15 - desc PCRH15 - 0x5FC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH15 - desc PFSRH15 - 0x5FE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI0 - desc PCRI0 - 0x600 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI0 - desc PFSRI0 - 0x602 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI1 - desc PCRI1 - 0x604 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI1 - desc PFSRI1 - 0x606 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI2 - desc PCRI2 - 0x608 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI2 - desc PFSRI2 - 0x60A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI3 - desc PCRI3 - 0x60C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI3 - desc PFSRI3 - 0x60E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI4 - desc PCRI4 - 0x610 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI4 - desc PFSRI4 - 0x612 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI5 - desc PCRI5 - 0x614 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI5 - desc PFSRI5 - 0x616 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI6 - desc PCRI6 - 0x618 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI6 - desc PFSRI6 - 0x61A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI7 - desc PCRI7 - 0x61C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI7 - desc PFSRI7 - 0x61E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI8 - desc PCRI8 - 0x620 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI8 - desc PFSRI8 - 0x622 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI9 - desc PCRI9 - 0x624 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI9 - desc PFSRI9 - 0x626 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI10 - desc PCRI10 - 0x628 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI10 - desc PFSRI10 - 0x62A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI11 - desc PCRI11 - 0x62C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI11 - desc PFSRI11 - 0x62E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI12 - desc PCRI12 - 0x630 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI12 - desc PFSRI12 - 0x632 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI13 - desc PCRI13 - 0x634 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI13 - desc PFSRI13 - 0x636 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - - - HASH - desc HASH - 0x40008400 - - 0x0 - 0x80 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0xC777 - - - START - desc START - 0 - 0 - read-write - - - FST_GRP - desc FST_GRP - 1 - 1 - read-write - - - KMSG_END - desc KMSG_END - 2 - 2 - read-write - - - MODE - desc MODE - 5 - 4 - read-write - - - LKEY - desc LKEY - 6 - 6 - read-write - - - BUSY - desc BUSY - 8 - 8 - read-write - - - CYC_END - desc CYC_END - 9 - 9 - read-write - - - HMAC_END - desc HMAC_END - 10 - 10 - read-write - - - HCIE - desc HCIE - 14 - 14 - read-write - - - HEIE - desc HEIE - 15 - 15 - read-write - - - - - HR7 - desc HR7 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR6 - desc HR6 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR5 - desc HR5 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR4 - desc HR4 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR3 - desc HR3 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR2 - desc HR2 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR1 - desc HR1 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR0 - desc HR0 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR15 - desc DR15 - 0x40 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR14 - desc DR14 - 0x44 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR13 - desc DR13 - 0x48 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR12 - desc DR12 - 0x4C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR11 - desc DR11 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR10 - desc DR10 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR9 - desc DR9 - 0x58 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR8 - desc DR8 - 0x5C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR7 - desc DR7 - 0x60 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR6 - desc DR6 - 0x64 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR5 - desc DR5 - 0x68 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR4 - desc DR4 - 0x6C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR3 - desc DR3 - 0x70 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR2 - desc DR2 - 0x74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x78 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR0 - desc DR0 - 0x7C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - HRPWM - desc HRPWM - 0x4003C000 - - 0x0 - 0x58 - - - - CR1 - desc CR1 - 0x0 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x4 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR3 - desc CR3 - 0x8 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR4 - desc CR4 - 0xC - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR5 - desc CR5 - 0x10 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR6 - desc CR6 - 0x14 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR7 - desc CR7 - 0x18 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR8 - desc CR8 - 0x1C - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR9 - desc CR9 - 0x20 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR10 - desc CR10 - 0x24 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR11 - desc CR11 - 0x28 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR12 - desc CR12 - 0x2C - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR13 - desc CR13 - 0x30 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR14 - desc CR14 - 0x34 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR15 - desc CR15 - 0x38 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR16 - desc CR16 - 0x3C - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CALCR0 - desc CALCR0 - 0x50 - 32 - read-write - 0x0 - 0x90FF - - - CALCODE - desc CALCODE - 7 - 0 - read-write - - - ENDF - desc ENDF - 12 - 12 - read-write - - - CALEN - desc CALEN - 15 - 15 - read-write - - - - - CALCR1 - desc CALCR1 - 0x54 - 32 - read-write - 0x0 - 0x90FF - - - CALCODE - desc CALCODE - 7 - 0 - read-write - - - ENDF - desc ENDF - 12 - 12 - read-write - - - CALEN - desc CALEN - 15 - 15 - read-write - - - - - - - I2C1 - desc I2C - 0x4004E000 - - 0x0 - 0x34 - - - - CR1 - desc CR1 - 0x0 - 32 - read-write - 0x40 - 0x87DF - - - PE - desc PE - 0 - 0 - read-write - - - SMBUS - desc SMBUS - 1 - 1 - read-write - - - SMBALRTEN - desc SMBALRTEN - 2 - 2 - read-write - - - SMBDEFAULTEN - desc SMBDEFAULTEN - 3 - 3 - read-write - - - SMBHOSTEN - desc SMBHOSTEN - 4 - 4 - read-write - - - GCEN - desc GCEN - 6 - 6 - read-write - - - RESTART - desc RESTART - 7 - 7 - read-write - - - START - desc START - 8 - 8 - read-write - - - STOP - desc STOP - 9 - 9 - read-write - - - ACK - desc ACK - 10 - 10 - read-write - - - SWRST - desc SWRST - 15 - 15 - read-write - - - - - CR2 - desc CR2 - 0x4 - 32 - read-write - 0x0 - 0xF052DF - - - STARTIE - desc STARTIE - 0 - 0 - read-write - - - SLADDR0IE - desc SLADDR0IE - 1 - 1 - read-write - - - SLADDR1IE - desc SLADDR1IE - 2 - 2 - read-write - - - TENDIE - desc TENDIE - 3 - 3 - read-write - - - STOPIE - desc STOPIE - 4 - 4 - read-write - - - RFULLIE - desc RFULLIE - 6 - 6 - read-write - - - TEMPTYIE - desc TEMPTYIE - 7 - 7 - read-write - - - ARLOIE - desc ARLOIE - 9 - 9 - read-write - - - NACKIE - desc NACKIE - 12 - 12 - read-write - - - TMOUTIE - desc TMOUTIE - 14 - 14 - read-write - - - GENCALLIE - desc GENCALLIE - 20 - 20 - read-write - - - SMBDEFAULTIE - desc SMBDEFAULTIE - 21 - 21 - read-write - - - SMBHOSTIE - desc SMBHOSTIE - 22 - 22 - read-write - - - SMBALRTIE - desc SMBALRTIE - 23 - 23 - read-write - - - - - CR3 - desc CR3 - 0x8 - 32 - read-write - 0x6 - 0x87 - - - TMOUTEN - desc TMOUTEN - 0 - 0 - read-write - - - LTMOUT - desc LTMOUT - 1 - 1 - read-write - - - HTMOUT - desc HTMOUT - 2 - 2 - read-write - - - FACKEN - desc FACKEN - 7 - 7 - read-write - - - - - CR4 - desc CR4 - 0xC - 32 - read-write - 0x300307 - 0x400 - - - BUSWAIT - desc BUSWAIT - 10 - 10 - read-write - - - - - SLR0 - desc SLR0 - 0x10 - 32 - read-write - 0x1000 - 0x93FF - - - SLADDR0 - desc SLADDR0 - 9 - 0 - read-write - - - SLADDR0EN - desc SLADDR0EN - 12 - 12 - read-write - - - ADDRMOD0 - desc ADDRMOD0 - 15 - 15 - read-write - - - - - SLR1 - desc SLR1 - 0x14 - 32 - read-write - 0x0 - 0x93FF - - - SLADDR1 - desc SLADDR1 - 9 - 0 - read-write - - - SLADDR1EN - desc SLADDR1EN - 12 - 12 - read-write - - - ADDRMOD1 - desc ADDRMOD1 - 15 - 15 - read-write - - - - - SLTR - desc SLTR - 0x18 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - TOUTLOW - desc TOUTLOW - 15 - 0 - read-write - - - TOUTHIGH - desc TOUTHIGH - 31 - 16 - read-write - - - - - SR - desc SR - 0x1C - 32 - read-write - 0x0 - 0xF756DF - - - STARTF - desc STARTF - 0 - 0 - read-write - - - SLADDR0F - desc SLADDR0F - 1 - 1 - read-write - - - SLADDR1F - desc SLADDR1F - 2 - 2 - read-write - - - TENDF - desc TENDF - 3 - 3 - read-write - - - STOPF - desc STOPF - 4 - 4 - read-write - - - RFULLF - desc RFULLF - 6 - 6 - read-write - - - TEMPTYF - desc TEMPTYF - 7 - 7 - read-write - - - ARLOF - desc ARLOF - 9 - 9 - read-write - - - ACKRF - desc ACKRF - 10 - 10 - read-write - - - NACKF - desc NACKF - 12 - 12 - read-write - - - TMOUTF - desc TMOUTF - 14 - 14 - read-write - - - MSL - desc MSL - 16 - 16 - read-write - - - BUSY - desc BUSY - 17 - 17 - read-write - - - TRA - desc TRA - 18 - 18 - read-write - - - GENCALLF - desc GENCALLF - 20 - 20 - read-write - - - SMBDEFAULTF - desc SMBDEFAULTF - 21 - 21 - read-write - - - SMBHOSTF - desc SMBHOSTF - 22 - 22 - read-write - - - SMBALRTF - desc SMBALRTF - 23 - 23 - read-write - - - - - CLR - desc CLR - 0x20 - 32 - write-only - 0x0 - 0xF052DF - - - STARTFCLR - desc STARTFCLR - 0 - 0 - write-only - - - SLADDR0FCLR - desc SLADDR0FCLR - 1 - 1 - write-only - - - SLADDR1FCLR - desc SLADDR1FCLR - 2 - 2 - write-only - - - TENDFCLR - desc TENDFCLR - 3 - 3 - write-only - - - STOPFCLR - desc STOPFCLR - 4 - 4 - write-only - - - RFULLFCLR - desc RFULLFCLR - 6 - 6 - write-only - - - TEMPTYFCLR - desc TEMPTYFCLR - 7 - 7 - write-only - - - ARLOFCLR - desc ARLOFCLR - 9 - 9 - write-only - - - NACKFCLR - desc NACKFCLR - 12 - 12 - write-only - - - TMOUTFCLR - desc TMOUTFCLR - 14 - 14 - write-only - - - GENCALLFCLR - desc GENCALLFCLR - 20 - 20 - write-only - - - SMBDEFAULTFCLR - desc SMBDEFAULTFCLR - 21 - 21 - write-only - - - SMBHOSTFCLR - desc SMBHOSTFCLR - 22 - 22 - write-only - - - SMBALRTFCLR - desc SMBALRTFCLR - 23 - 23 - write-only - - - - - DTR - desc DTR - 0x24 - 8 - write-only - 0xFF - 0xFF - - - DT - desc DT - 7 - 0 - write-only - - - - - DRR - desc DRR - 0x28 - 8 - read-only - 0x0 - 0xFF - - - DR - desc DR - 7 - 0 - read-only - - - - - CCR - desc CCR - 0x2C - 32 - read-write - 0x1F1F - 0x71F1F - - - SLOWW - desc SLOWW - 4 - 0 - read-write - - - SHIGHW - desc SHIGHW - 12 - 8 - read-write - - - FREQ - desc FREQ - 18 - 16 - read-write - - - - - FLTR - desc FLTR - 0x30 - 32 - read-write - 0x10 - 0x33 - - - DNF - desc DNF - 1 - 0 - read-write - - - DNFEN - desc DNFEN - 4 - 4 - read-write - - - ANFEN - desc ANFEN - 5 - 5 - read-write - - - - - - - I2C2 - desc I2C - 0x4004E400 - - 0x0 - 0x34 - - - - I2C3 - desc I2C - 0x4004E800 - - 0x0 - 0x34 - - - - I2C4 - desc I2C - 0x4004EC00 - - 0x0 - 0x34 - - - - I2C5 - desc I2C - 0x4004F000 - - 0x0 - 0x34 - - - - I2C6 - desc I2C - 0x4004F400 - - 0x0 - 0x34 - - - - I2S1 - desc I2S - 0x4001E000 - - 0x0 - 0x1C - - - - CTRL - desc CTRL - 0x0 - 32 - read-write - 0x2200 - 0x1FF77FF - - - TXE - desc TXE - 0 - 0 - read-write - - - TXIE - desc TXIE - 1 - 1 - read-write - - - RXE - desc RXE - 2 - 2 - read-write - - - RXIE - desc RXIE - 3 - 3 - read-write - - - EIE - desc EIE - 4 - 4 - read-write - - - WMS - desc WMS - 5 - 5 - read-write - - - ODD - desc ODD - 6 - 6 - read-write - - - MCKOE - desc MCKOE - 7 - 7 - read-write - - - TXBIRQWL - desc TXBIRQWL - 10 - 8 - read-write - - - RXBIRQWL - desc RXBIRQWL - 14 - 12 - read-write - - - FIFOR - desc FIFOR - 16 - 16 - read-write - - - CODECRC - desc CODECRC - 17 - 17 - read-write - - - I2SPLLSEL - desc I2SPLLSEL - 18 - 18 - read-write - - - SDOE - desc SDOE - 19 - 19 - read-write - - - LRCKOE - desc LRCKOE - 20 - 20 - read-write - - - CKOE - desc CKOE - 21 - 21 - read-write - - - DUPLEX - desc DUPLEX - 22 - 22 - read-write - - - CLKSEL - desc CLKSEL - 23 - 23 - read-write - - - SRST - desc SRST - 24 - 24 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-only - 0x14 - 0x3F - - - TXBA - desc TXBA - 0 - 0 - read-only - - - RXBA - desc RXBA - 1 - 1 - read-only - - - TXBE - desc TXBE - 2 - 2 - read-only - - - TXBF - desc TXBF - 3 - 3 - read-only - - - RXBE - desc RXBE - 4 - 4 - read-only - - - RXBF - desc RXBF - 5 - 5 - read-only - - - - - ER - desc ER - 0x8 - 32 - read-write - 0x0 - 0x3 - - - TXERR - desc TXERR - 0 - 0 - read-write - - - RXERR - desc RXERR - 1 - 1 - read-write - - - - - CFGR - desc CFGR - 0xC - 32 - read-write - 0x0 - 0x3F - - - I2SSTD - desc I2SSTD - 1 - 0 - read-write - - - DATLEN - desc DATLEN - 3 - 2 - read-write - - - CHLEN - desc CHLEN - 4 - 4 - read-write - - - PCMSYNC - desc PCMSYNC - 5 - 5 - read-write - - - - - TXBUF - desc TXBUF - 0x10 - 32 - write-only - 0x0 - 0xFFFFFFFF - - - RXBUF - desc RXBUF - 0x14 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - PR - desc PR - 0x18 - 32 - read-write - 0x2 - 0xFF - - - I2SDIV - desc I2SDIV - 7 - 0 - read-write - - - - - - - I2S2 - desc I2S - 0x4001E400 - - 0x0 - 0x1C - - - - I2S3 - desc I2S - 0x40022000 - - 0x0 - 0x1C - - - - I2S4 - desc I2S - 0x40022400 - - 0x0 - 0x1C - - - - ICG - desc ICG - 0x00000400 - - 0x0 - 0x10 - - - - ICG0 - desc ICG0 - 0x0 - 32 - read-only - 0xFFFFFFFF - 0x1FFF1FFF - - - SWDTAUTS - desc SWDTAUTS - 0 - 0 - read-only - - - SWDTITS - desc SWDTITS - 1 - 1 - read-only - - - SWDTPERI - desc SWDTPERI - 3 - 2 - read-only - - - SWDTCKS - desc SWDTCKS - 7 - 4 - read-only - - - SWDTWDPT - desc SWDTWDPT - 11 - 8 - read-only - - - SWDTSLPOFF - desc SWDTSLPOFF - 12 - 12 - read-only - - - WDTAUTS - desc WDTAUTS - 16 - 16 - read-only - - - WDTITS - desc WDTITS - 17 - 17 - read-only - - - WDTPERI - desc WDTPERI - 19 - 18 - read-only - - - WDTCKS - desc WDTCKS - 23 - 20 - read-only - - - WDTWDPT - desc WDTWDPT - 27 - 24 - read-only - - - WDTSLPOFF - desc WDTSLPOFF - 28 - 28 - read-only - - - - - ICG1 - desc ICG1 - 0x4 - 32 - read-only - 0xFFFFFFFF - 0x70101 - - - HRCFREQSEL - desc HRCFREQSEL - 0 - 0 - read-only - - - HRCSTOP - desc HRCSTOP - 8 - 8 - read-only - - - BOR_LEV - desc BOR_LEV - 17 - 16 - read-only - - - BORDIS - desc BORDIS - 18 - 18 - read-only - - - - - ICG2 - desc ICG2 - 0x8 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFF - - - BGO1M - desc BGO1M - 23 - 0 - read-only - - - - - ICG3 - desc ICG3 - 0xC - 32 - read-only - 0xFFFFFFFF - 0xFFFF - - - DBUSPRT - desc DBUSPRT - 15 - 0 - read-only - - - - - - - INTC - desc INTC - 0x40051000 - - 0x0 - 0x2B4 - - - - NOCCR - desc NOCCR - 0x0 - 32 - read-write - 0x0 - 0x3000 - - - NOCSEL - desc NOCSEL - 13 - 12 - read-write - - - - - NMIENR - desc NMIENR - 0x4 - 32 - read-write - 0x0 - 0xF2E - - - SWDTENR - desc SWDTENR - 1 - 1 - read-write - - - PVD1ENR - desc PVD1ENR - 2 - 2 - read-write - - - PVD2ENR - desc PVD2ENR - 3 - 3 - read-write - - - XTALSTPENR - desc XTALSTPENR - 5 - 5 - read-write - - - REPENR - desc REPENR - 8 - 8 - read-write - - - RECCENR - desc RECCENR - 9 - 9 - read-write - - - BUSMENR - desc BUSMENR - 10 - 10 - read-write - - - WDTENR - desc WDTENR - 11 - 11 - read-write - - - - - NMIFR - desc NMIFR - 0x8 - 32 - read-write - 0x0 - 0xF2E - - - SWDTFR - desc SWDTFR - 1 - 1 - read-write - - - PVD1FR - desc PVD1FR - 2 - 2 - read-write - - - PVD2FR - desc PVD2FR - 3 - 3 - read-write - - - XTALSTPFR - desc XTALSTPFR - 5 - 5 - read-write - - - REPFR - desc REPFR - 8 - 8 - read-write - - - RECCFR - desc RECCFR - 9 - 9 - read-write - - - BUSMFR - desc BUSMFR - 10 - 10 - read-write - - - WDTFR - desc WDTFR - 11 - 11 - read-write - - - - - NMICFR - desc NMICFR - 0xC - 32 - read-write - 0x0 - 0xF2E - - - SWDTCFR - desc SWDTCFR - 1 - 1 - read-write - - - PVD1CFR - desc PVD1CFR - 2 - 2 - read-write - - - PVD2CFR - desc PVD2CFR - 3 - 3 - read-write - - - XTALSTPCFR - desc XTALSTPCFR - 5 - 5 - read-write - - - REPCFR - desc REPCFR - 8 - 8 - read-write - - - RECCCFR - desc RECCCFR - 9 - 9 - read-write - - - BUSMCFR - desc BUSMCFR - 10 - 10 - read-write - - - WDTCFR - desc WDTCFR - 11 - 11 - read-write - - - - - EIRQCR0 - desc EIRQCR0 - 0x10 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR1 - desc EIRQCR1 - 0x14 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR2 - desc EIRQCR2 - 0x18 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR3 - desc EIRQCR3 - 0x1C - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR4 - desc EIRQCR4 - 0x20 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR5 - desc EIRQCR5 - 0x24 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR6 - desc EIRQCR6 - 0x28 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR7 - desc EIRQCR7 - 0x2C - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR8 - desc EIRQCR8 - 0x30 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR9 - desc EIRQCR9 - 0x34 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR10 - desc EIRQCR10 - 0x38 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR11 - desc EIRQCR11 - 0x3C - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR12 - desc EIRQCR12 - 0x40 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR13 - desc EIRQCR13 - 0x44 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR14 - desc EIRQCR14 - 0x48 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR15 - desc EIRQCR15 - 0x4C - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - WUPEN - desc WUPEN - 0x50 - 32 - read-write - 0x0 - 0x3FFFFFFF - - - EIRQWUEN - desc EIRQWUEN - 15 - 0 - read-write - - - SWDTWUEN - desc SWDTWUEN - 16 - 16 - read-write - - - PVD1WUEN - desc PVD1WUEN - 17 - 17 - read-write - - - PVD2WUEN - desc PVD2WUEN - 18 - 18 - read-write - - - CMPWUEN - desc CMPWUEN - 19 - 19 - read-write - - - WKTMWUEN - desc WKTMWUEN - 20 - 20 - read-write - - - RTCALMWUEN - desc RTCALMWUEN - 21 - 21 - read-write - - - RTCPRDWUEN - desc RTCPRDWUEN - 22 - 22 - read-write - - - TMR0GCMWUEN - desc TMR0GCMWUEN - 23 - 23 - read-write - - - TMR2GCMWUEN - desc TMR2GCMWUEN - 24 - 24 - read-write - - - TMR2OVFWUEN - desc TMR2OVFWUEN - 25 - 25 - read-write - - - RXWUEN - desc RXWUEN - 26 - 26 - read-write - - - USHWUEN - desc USHWUEN - 27 - 27 - read-write - - - USFWUEN - desc USFWUEN - 28 - 28 - read-write - - - ETHWUEN - desc ETHWUEN - 29 - 29 - read-write - - - - - EIRQFR - desc EIRQFR - 0x54 - 32 - read-write - 0x0 - 0xFFFF - - - EIRQFR0 - desc EIRQFR0 - 0 - 0 - read-write - - - EIRQFR1 - desc EIRQFR1 - 1 - 1 - read-write - - - EIRQFR2 - desc EIRQFR2 - 2 - 2 - read-write - - - EIRQFR3 - desc EIRQFR3 - 3 - 3 - read-write - - - EIRQFR4 - desc EIRQFR4 - 4 - 4 - read-write - - - EIRQFR5 - desc EIRQFR5 - 5 - 5 - read-write - - - EIRQFR6 - desc EIRQFR6 - 6 - 6 - read-write - - - EIRQFR7 - desc EIRQFR7 - 7 - 7 - read-write - - - EIRQFR8 - desc EIRQFR8 - 8 - 8 - read-write - - - EIRQFR9 - desc EIRQFR9 - 9 - 9 - read-write - - - EIRQFR10 - desc EIRQFR10 - 10 - 10 - read-write - - - EIRQFR11 - desc EIRQFR11 - 11 - 11 - read-write - - - EIRQFR12 - desc EIRQFR12 - 12 - 12 - read-write - - - EIRQFR13 - desc EIRQFR13 - 13 - 13 - read-write - - - EIRQFR14 - desc EIRQFR14 - 14 - 14 - read-write - - - EIRQFR15 - desc EIRQFR15 - 15 - 15 - read-write - - - - - EIRQCFR - desc EIRQCFR - 0x58 - 32 - read-write - 0x0 - 0xFFFF - - - EIRQCFR0 - desc EIRQCFR0 - 0 - 0 - read-write - - - EIRQCFR1 - desc EIRQCFR1 - 1 - 1 - read-write - - - EIRQCFR2 - desc EIRQCFR2 - 2 - 2 - read-write - - - EIRQCFR3 - desc EIRQCFR3 - 3 - 3 - read-write - - - EIRQCFR4 - desc EIRQCFR4 - 4 - 4 - read-write - - - EIRQCFR5 - desc EIRQCFR5 - 5 - 5 - read-write - - - EIRQCFR6 - desc EIRQCFR6 - 6 - 6 - read-write - - - EIRQCFR7 - desc EIRQCFR7 - 7 - 7 - read-write - - - EIRQCFR8 - desc EIRQCFR8 - 8 - 8 - read-write - - - EIRQCFR9 - desc EIRQCFR9 - 9 - 9 - read-write - - - EIRQCFR10 - desc EIRQCFR10 - 10 - 10 - read-write - - - EIRQCFR11 - desc EIRQCFR11 - 11 - 11 - read-write - - - EIRQCFR12 - desc EIRQCFR12 - 12 - 12 - read-write - - - EIRQCFR13 - desc EIRQCFR13 - 13 - 13 - read-write - - - EIRQCFR14 - desc EIRQCFR14 - 14 - 14 - read-write - - - EIRQCFR15 - desc EIRQCFR15 - 15 - 15 - read-write - - - - - SEL0 - desc SEL0 - 0x5C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL1 - desc SEL1 - 0x60 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL2 - desc SEL2 - 0x64 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL3 - desc SEL3 - 0x68 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL4 - desc SEL4 - 0x6C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL5 - desc SEL5 - 0x70 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL6 - desc SEL6 - 0x74 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL7 - desc SEL7 - 0x78 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL8 - desc SEL8 - 0x7C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL9 - desc SEL9 - 0x80 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL10 - desc SEL10 - 0x84 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL11 - desc SEL11 - 0x88 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL12 - desc SEL12 - 0x8C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL13 - desc SEL13 - 0x90 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL14 - desc SEL14 - 0x94 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL15 - desc SEL15 - 0x98 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL16 - desc SEL16 - 0x9C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL17 - desc SEL17 - 0xA0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL18 - desc SEL18 - 0xA4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL19 - desc SEL19 - 0xA8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL20 - desc SEL20 - 0xAC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL21 - desc SEL21 - 0xB0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL22 - desc SEL22 - 0xB4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL23 - desc SEL23 - 0xB8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL24 - desc SEL24 - 0xBC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL25 - desc SEL25 - 0xC0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL26 - desc SEL26 - 0xC4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL27 - desc SEL27 - 0xC8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL28 - desc SEL28 - 0xCC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL29 - desc SEL29 - 0xD0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL30 - desc SEL30 - 0xD4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL31 - desc SEL31 - 0xD8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL32 - desc SEL32 - 0xDC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL33 - desc SEL33 - 0xE0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL34 - desc SEL34 - 0xE4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL35 - desc SEL35 - 0xE8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL36 - desc SEL36 - 0xEC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL37 - desc SEL37 - 0xF0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL38 - desc SEL38 - 0xF4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL39 - desc SEL39 - 0xF8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL40 - desc SEL40 - 0xFC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL41 - desc SEL41 - 0x100 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL42 - desc SEL42 - 0x104 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL43 - desc SEL43 - 0x108 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL44 - desc SEL44 - 0x10C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL45 - desc SEL45 - 0x110 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL46 - desc SEL46 - 0x114 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL47 - desc SEL47 - 0x118 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL48 - desc SEL48 - 0x11C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL49 - desc SEL49 - 0x120 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL50 - desc SEL50 - 0x124 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL51 - desc SEL51 - 0x128 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL52 - desc SEL52 - 0x12C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL53 - desc SEL53 - 0x130 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL54 - desc SEL54 - 0x134 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL55 - desc SEL55 - 0x138 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL56 - desc SEL56 - 0x13C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL57 - desc SEL57 - 0x140 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL58 - desc SEL58 - 0x144 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL59 - desc SEL59 - 0x148 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL60 - desc SEL60 - 0x14C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL61 - desc SEL61 - 0x150 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL62 - desc SEL62 - 0x154 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL63 - desc SEL63 - 0x158 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL64 - desc SEL64 - 0x15C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL65 - desc SEL65 - 0x160 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL66 - desc SEL66 - 0x164 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL67 - desc SEL67 - 0x168 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL68 - desc SEL68 - 0x16C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL69 - desc SEL69 - 0x170 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL70 - desc SEL70 - 0x174 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL71 - desc SEL71 - 0x178 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL72 - desc SEL72 - 0x17C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL73 - desc SEL73 - 0x180 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL74 - desc SEL74 - 0x184 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL75 - desc SEL75 - 0x188 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL76 - desc SEL76 - 0x18C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL77 - desc SEL77 - 0x190 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL78 - desc SEL78 - 0x194 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL79 - desc SEL79 - 0x198 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL80 - desc SEL80 - 0x19C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL81 - desc SEL81 - 0x1A0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL82 - desc SEL82 - 0x1A4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL83 - desc SEL83 - 0x1A8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL84 - desc SEL84 - 0x1AC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL85 - desc SEL85 - 0x1B0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL86 - desc SEL86 - 0x1B4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL87 - desc SEL87 - 0x1B8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL88 - desc SEL88 - 0x1BC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL89 - desc SEL89 - 0x1C0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL90 - desc SEL90 - 0x1C4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL91 - desc SEL91 - 0x1C8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL92 - desc SEL92 - 0x1CC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL93 - desc SEL93 - 0x1D0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL94 - desc SEL94 - 0x1D4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL95 - desc SEL95 - 0x1D8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL96 - desc SEL96 - 0x1DC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL97 - desc SEL97 - 0x1E0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL98 - desc SEL98 - 0x1E4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL99 - desc SEL99 - 0x1E8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL100 - desc SEL100 - 0x1EC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL101 - desc SEL101 - 0x1F0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL102 - desc SEL102 - 0x1F4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL103 - desc SEL103 - 0x1F8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL104 - desc SEL104 - 0x1FC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL105 - desc SEL105 - 0x200 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL106 - desc SEL106 - 0x204 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL107 - desc SEL107 - 0x208 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL108 - desc SEL108 - 0x20C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL109 - desc SEL109 - 0x210 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL110 - desc SEL110 - 0x214 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL111 - desc SEL111 - 0x218 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL112 - desc SEL112 - 0x21C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL113 - desc SEL113 - 0x220 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL114 - desc SEL114 - 0x224 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL115 - desc SEL115 - 0x228 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL116 - desc SEL116 - 0x22C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL117 - desc SEL117 - 0x230 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL118 - desc SEL118 - 0x234 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL119 - desc SEL119 - 0x238 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL120 - desc SEL120 - 0x23C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL121 - desc SEL121 - 0x240 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL122 - desc SEL122 - 0x244 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL123 - desc SEL123 - 0x248 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL124 - desc SEL124 - 0x24C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL125 - desc SEL125 - 0x250 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL126 - desc SEL126 - 0x254 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL127 - desc SEL127 - 0x258 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - VSSEL128 - desc VSSEL128 - 0x25C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL129 - desc VSSEL129 - 0x260 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL130 - desc VSSEL130 - 0x264 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL131 - desc VSSEL131 - 0x268 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL132 - desc VSSEL132 - 0x26C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL133 - desc VSSEL133 - 0x270 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL134 - desc VSSEL134 - 0x274 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL135 - desc VSSEL135 - 0x278 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL136 - desc VSSEL136 - 0x27C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL137 - desc VSSEL137 - 0x280 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL138 - desc VSSEL138 - 0x284 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL139 - desc VSSEL139 - 0x288 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL140 - desc VSSEL140 - 0x28C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL141 - desc VSSEL141 - 0x290 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL142 - desc VSSEL142 - 0x294 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL143 - desc VSSEL143 - 0x298 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - SWIER - desc SWIER - 0x29C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SWIE0 - desc SWIE0 - 0 - 0 - read-write - - - SWIE1 - desc SWIE1 - 1 - 1 - read-write - - - SWIE2 - desc SWIE2 - 2 - 2 - read-write - - - SWIE3 - desc SWIE3 - 3 - 3 - read-write - - - SWIE4 - desc SWIE4 - 4 - 4 - read-write - - - SWIE5 - desc SWIE5 - 5 - 5 - read-write - - - SWIE6 - desc SWIE6 - 6 - 6 - read-write - - - SWIE7 - desc SWIE7 - 7 - 7 - read-write - - - SWIE8 - desc SWIE8 - 8 - 8 - read-write - - - SWIE9 - desc SWIE9 - 9 - 9 - read-write - - - SWIE10 - desc SWIE10 - 10 - 10 - read-write - - - SWIE11 - desc SWIE11 - 11 - 11 - read-write - - - SWIE12 - desc SWIE12 - 12 - 12 - read-write - - - SWIE13 - desc SWIE13 - 13 - 13 - read-write - - - SWIE14 - desc SWIE14 - 14 - 14 - read-write - - - SWIE15 - desc SWIE15 - 15 - 15 - read-write - - - SWIE16 - desc SWIE16 - 16 - 16 - read-write - - - SWIE17 - desc SWIE17 - 17 - 17 - read-write - - - SWIE18 - desc SWIE18 - 18 - 18 - read-write - - - SWIE19 - desc SWIE19 - 19 - 19 - read-write - - - SWIE20 - desc SWIE20 - 20 - 20 - read-write - - - SWIE21 - desc SWIE21 - 21 - 21 - read-write - - - SWIE22 - desc SWIE22 - 22 - 22 - read-write - - - SWIE23 - desc SWIE23 - 23 - 23 - read-write - - - SWIE24 - desc SWIE24 - 24 - 24 - read-write - - - SWIE25 - desc SWIE25 - 25 - 25 - read-write - - - SWIE26 - desc SWIE26 - 26 - 26 - read-write - - - SWIE27 - desc SWIE27 - 27 - 27 - read-write - - - SWIE28 - desc SWIE28 - 28 - 28 - read-write - - - SWIE29 - desc SWIE29 - 29 - 29 - read-write - - - SWIE30 - desc SWIE30 - 30 - 30 - read-write - - - SWIE31 - desc SWIE31 - 31 - 31 - read-write - - - - - EVTER - desc EVTER - 0x2A0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - EVTE0 - desc EVTE0 - 0 - 0 - read-write - - - EVTE1 - desc EVTE1 - 1 - 1 - read-write - - - EVTE2 - desc EVTE2 - 2 - 2 - read-write - - - EVTE3 - desc EVTE3 - 3 - 3 - read-write - - - EVTE4 - desc EVTE4 - 4 - 4 - read-write - - - EVTE5 - desc EVTE5 - 5 - 5 - read-write - - - EVTE6 - desc EVTE6 - 6 - 6 - read-write - - - EVTE7 - desc EVTE7 - 7 - 7 - read-write - - - EVTE8 - desc EVTE8 - 8 - 8 - read-write - - - EVTE9 - desc EVTE9 - 9 - 9 - read-write - - - EVTE10 - desc EVTE10 - 10 - 10 - read-write - - - EVTE11 - desc EVTE11 - 11 - 11 - read-write - - - EVTE12 - desc EVTE12 - 12 - 12 - read-write - - - EVTE13 - desc EVTE13 - 13 - 13 - read-write - - - EVTE14 - desc EVTE14 - 14 - 14 - read-write - - - EVTE15 - desc EVTE15 - 15 - 15 - read-write - - - EVTE16 - desc EVTE16 - 16 - 16 - read-write - - - EVTE17 - desc EVTE17 - 17 - 17 - read-write - - - EVTE18 - desc EVTE18 - 18 - 18 - read-write - - - EVTE19 - desc EVTE19 - 19 - 19 - read-write - - - EVTE20 - desc EVTE20 - 20 - 20 - read-write - - - EVTE21 - desc EVTE21 - 21 - 21 - read-write - - - EVTE22 - desc EVTE22 - 22 - 22 - read-write - - - EVTE23 - desc EVTE23 - 23 - 23 - read-write - - - EVTE24 - desc EVTE24 - 24 - 24 - read-write - - - EVTE25 - desc EVTE25 - 25 - 25 - read-write - - - EVTE26 - desc EVTE26 - 26 - 26 - read-write - - - EVTE27 - desc EVTE27 - 27 - 27 - read-write - - - EVTE28 - desc EVTE28 - 28 - 28 - read-write - - - EVTE29 - desc EVTE29 - 29 - 29 - read-write - - - EVTE30 - desc EVTE30 - 30 - 30 - read-write - - - EVTE31 - desc EVTE31 - 31 - 31 - read-write - - - - - IER - desc IER - 0x2A4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - IER0 - desc IER0 - 0 - 0 - read-write - - - IER1 - desc IER1 - 1 - 1 - read-write - - - IER2 - desc IER2 - 2 - 2 - read-write - - - IER3 - desc IER3 - 3 - 3 - read-write - - - IER4 - desc IER4 - 4 - 4 - read-write - - - IER5 - desc IER5 - 5 - 5 - read-write - - - IER6 - desc IER6 - 6 - 6 - read-write - - - IER7 - desc IER7 - 7 - 7 - read-write - - - IER8 - desc IER8 - 8 - 8 - read-write - - - IER9 - desc IER9 - 9 - 9 - read-write - - - IER10 - desc IER10 - 10 - 10 - read-write - - - IER11 - desc IER11 - 11 - 11 - read-write - - - IER12 - desc IER12 - 12 - 12 - read-write - - - IER13 - desc IER13 - 13 - 13 - read-write - - - IER14 - desc IER14 - 14 - 14 - read-write - - - IER15 - desc IER15 - 15 - 15 - read-write - - - IER16 - desc IER16 - 16 - 16 - read-write - - - IER17 - desc IER17 - 17 - 17 - read-write - - - IER18 - desc IER18 - 18 - 18 - read-write - - - IER19 - desc IER19 - 19 - 19 - read-write - - - IER20 - desc IER20 - 20 - 20 - read-write - - - IER21 - desc IER21 - 21 - 21 - read-write - - - IER22 - desc IER22 - 22 - 22 - read-write - - - IER23 - desc IER23 - 23 - 23 - read-write - - - IER24 - desc IER24 - 24 - 24 - read-write - - - IER25 - desc IER25 - 25 - 25 - read-write - - - IER26 - desc IER26 - 26 - 26 - read-write - - - IER27 - desc IER27 - 27 - 27 - read-write - - - IER28 - desc IER28 - 28 - 28 - read-write - - - IER29 - desc IER29 - 29 - 29 - read-write - - - IER30 - desc IER30 - 30 - 30 - read-write - - - IER31 - desc IER31 - 31 - 31 - read-write - - - - - - - KEYSCAN - desc KEYSCAN - 0x40050C00 - - 0x0 - 0xC - - - - SCR - desc SCR - 0x0 - 32 - read-write - 0x0 - 0xFF37FFFF - - - KEYINSEL - desc KEYINSEL - 15 - 0 - read-write - - - KEYOUTSEL - desc KEYOUTSEL - 18 - 16 - read-write - - - CKSEL - desc CKSEL - 21 - 20 - read-write - - - T_LLEVEL - desc T_LLEVEL - 28 - 24 - read-write - - - T_HIZ - desc T_HIZ - 31 - 29 - read-write - - - - - SER - desc SER - 0x4 - 32 - read-write - 0x0 - 0x1 - - - SEN - desc SEN - 0 - 0 - read-write - - - - - SSR - desc SSR - 0x8 - 32 - read-write - 0x0 - 0x7 - - - INDEX - desc INDEX - 2 - 0 - read-write - - - - - - - MAU - desc MAU - 0x40055000 - - 0x0 - 0x18 - - - - CSR - desc CSR - 0x0 - 32 - read-write - 0x0 - 0x1F0B - - - START - desc START - 0 - 0 - read-write - - - INTEN - desc INTEN - 1 - 1 - read-write - - - BUSY - desc BUSY - 3 - 3 - read-write - - - SHIFT - desc SHIFT - 12 - 8 - read-write - - - - - DTR0 - desc DTR0 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RTR0 - desc RTR0 - 0xC - 32 - read-write - 0x0 - 0x1FFFF - - - SQRT_DOUT - desc SQRT_DOUT - 16 - 0 - read-write - - - - - DTR1 - desc DTR1 - 0x10 - 32 - read-write - 0x0 - 0xFFF - - - SIN_DIN - desc SIN_DIN - 11 - 0 - read-write - - - - - RTR1 - desc RTR1 - 0x14 - 32 - read-write - 0x0 - 0xFFFF - - - SIN_DOUT - desc SIN_DOUT - 15 - 0 - read-write - - - - - - - MPU - desc MPU - 0x40050000 - ETH - - 0x0 - 0xA0 - - - - RGD0 - desc RGD0 - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD1 - desc RGD1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD2 - desc RGD2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD3 - desc RGD3 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD4 - desc RGD4 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD5 - desc RGD5 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD6 - desc RGD6 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD7 - desc RGD7 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD8 - desc RGD8 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD9 - desc RGD9 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD10 - desc RGD10 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD11 - desc RGD11 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD12 - desc RGD12 - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD13 - desc RGD13 - 0x34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD14 - desc RGD14 - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD15 - desc RGD15 - 0x3C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - SR - desc SR - 0x40 - 32 - read-only - 0x0 - 0x1F - - - SMPU1EAF - desc SMPU1EAF - 0 - 0 - read-only - - - SMPU2EAF - desc SMPU2EAF - 1 - 1 - read-only - - - FMPUEAF - desc FMPUEAF - 2 - 2 - read-only - - - HMPUEAF - desc HMPUEAF - 3 - 3 - read-only - - - EMPUEAF - desc EMPUEAF - 4 - 4 - read-only - - - - - ECLR - desc ECLR - 0x44 - 32 - write-only - 0x0 - 0x1F - - - SMPU1ECLR - desc SMPU1ECLR - 0 - 0 - write-only - - - SMPU2ECLR - desc SMPU2ECLR - 1 - 1 - write-only - - - FMPUECLR - desc FMPUECLR - 2 - 2 - write-only - - - HMPUECLR - desc HMPUECLR - 3 - 3 - write-only - - - EMPUECLR - desc EMPUECLR - 4 - 4 - write-only - - - - - WP - desc WP - 0x48 - 32 - read-write - 0x0 - 0xFFFF - - - MPUWE - desc MPUWE - 0 - 0 - read-write - - - WKEY - desc WKEY - 15 - 1 - write-only - - - - - IPPR - desc IPPR - 0x4C - 32 - read-write - 0x0 - 0xBFFFF3FF - - - AESRDP - desc AESRDP - 0 - 0 - read-write - - - AESWRP - desc AESWRP - 1 - 1 - read-write - - - HASHRDP - desc HASHRDP - 2 - 2 - read-write - - - HASHWRP - desc HASHWRP - 3 - 3 - read-write - - - TRNGRDP - desc TRNGRDP - 4 - 4 - read-write - - - TRNGWRP - desc TRNGWRP - 5 - 5 - read-write - - - CRCRDP - desc CRCRDP - 6 - 6 - read-write - - - CRCWRP - desc CRCWRP - 7 - 7 - read-write - - - EFMRDP - desc EFMRDP - 8 - 8 - read-write - - - EFMWRP - desc EFMWRP - 9 - 9 - read-write - - - WDTRDP - desc WDTRDP - 12 - 12 - read-write - - - WDTWRP - desc WDTWRP - 13 - 13 - read-write - - - SWDTRDP - desc SWDTRDP - 14 - 14 - read-write - - - SWDTWRP - desc SWDTWRP - 15 - 15 - read-write - - - BKSRAMRDP - desc BKSRAMRDP - 16 - 16 - read-write - - - BKSRAMWRP - desc BKSRAMWRP - 17 - 17 - read-write - - - RTCRDP - desc RTCRDP - 18 - 18 - read-write - - - RTCWRP - desc RTCWRP - 19 - 19 - read-write - - - DMPURDP - desc DMPURDP - 20 - 20 - read-write - - - DMPUWRP - desc DMPUWRP - 21 - 21 - read-write - - - SRAMCRDP - desc SRAMCRDP - 22 - 22 - read-write - - - SRAMCWRP - desc SRAMCWRP - 23 - 23 - read-write - - - INTCRDP - desc INTCRDP - 24 - 24 - read-write - - - INTCWRP - desc INTCWRP - 25 - 25 - read-write - - - SYSCRDP - desc SYSCRDP - 26 - 26 - read-write - - - SYSCWRP - desc SYSCWRP - 27 - 27 - read-write - - - MSTPRDP - desc MSTPRDP - 28 - 28 - read-write - - - MSPTWRP - desc MSPTWRP - 29 - 29 - read-write - - - BUSERRE - desc BUSERRE - 31 - 31 - read-write - - - - - S1RGE - desc S1RGE - 0x50 - 32 - read-write - 0x0 - 0xFFFF - - - S1RG0E - desc S1RG0E - 0 - 0 - read-write - - - S1RG1E - desc S1RG1E - 1 - 1 - read-write - - - S1RG2E - desc S1RG2E - 2 - 2 - read-write - - - S1RG3E - desc S1RG3E - 3 - 3 - read-write - - - S1RG4E - desc S1RG4E - 4 - 4 - read-write - - - S1RG5E - desc S1RG5E - 5 - 5 - read-write - - - S1RG6E - desc S1RG6E - 6 - 6 - read-write - - - S1RG7E - desc S1RG7E - 7 - 7 - read-write - - - S1RG8E - desc S1RG8E - 8 - 8 - read-write - - - S1RG9E - desc S1RG9E - 9 - 9 - read-write - - - S1RG10E - desc S1RG10E - 10 - 10 - read-write - - - S1RG11E - desc S1RG11E - 11 - 11 - read-write - - - S1RG12E - desc S1RG12E - 12 - 12 - read-write - - - S1RG13E - desc S1RG13E - 13 - 13 - read-write - - - S1RG14E - desc S1RG14E - 14 - 14 - read-write - - - S1RG15E - desc S1RG15E - 15 - 15 - read-write - - - - - S1RGWP - desc S1RGWP - 0x54 - 32 - read-write - 0x0 - 0xFFFF - - - S1RG0WP - desc S1RG0WP - 0 - 0 - read-write - - - S1RG1WP - desc S1RG1WP - 1 - 1 - read-write - - - S1RG2WP - desc S1RG2WP - 2 - 2 - read-write - - - S1RG3WP - desc S1RG3WP - 3 - 3 - read-write - - - S1RG4WP - desc S1RG4WP - 4 - 4 - read-write - - - S1RG5WP - desc S1RG5WP - 5 - 5 - read-write - - - S1RG6WP - desc S1RG6WP - 6 - 6 - read-write - - - S1RG7WP - desc S1RG7WP - 7 - 7 - read-write - - - S1RG8WP - desc S1RG8WP - 8 - 8 - read-write - - - S1RG9WP - desc S1RG9WP - 9 - 9 - read-write - - - S1RG10WP - desc S1RG10WP - 10 - 10 - read-write - - - S1RG11WP - desc S1RG11WP - 11 - 11 - read-write - - - S1RG12WP - desc S1RG12WP - 12 - 12 - read-write - - - S1RG13WP - desc S1RG13WP - 13 - 13 - read-write - - - S1RG14WP - desc S1RG14WP - 14 - 14 - read-write - - - S1RG15WP - desc S1RG15WP - 15 - 15 - read-write - - - - - S1RGRP - desc S1RGRP - 0x58 - 32 - read-write - 0x0 - 0xFFFF - - - S1RG0RP - desc S1RG0RP - 0 - 0 - read-write - - - S1RG1RP - desc S1RG1RP - 1 - 1 - read-write - - - S1RG2RP - desc S1RG2RP - 2 - 2 - read-write - - - S1RG3RP - desc S1RG3RP - 3 - 3 - read-write - - - S1RG4RP - desc S1RG4RP - 4 - 4 - read-write - - - S1RG5RP - desc S1RG5RP - 5 - 5 - read-write - - - S1RG6RP - desc S1RG6RP - 6 - 6 - read-write - - - S1RG7RP - desc S1RG7RP - 7 - 7 - read-write - - - S1RG8RP - desc S1RG8RP - 8 - 8 - read-write - - - S1RG9RP - desc S1RG9RP - 9 - 9 - read-write - - - S1RG10RP - desc S1RG10RP - 10 - 10 - read-write - - - S1RG11RP - desc S1RG11RP - 11 - 11 - read-write - - - S1RG12RP - desc S1RG12RP - 12 - 12 - read-write - - - S1RG13RP - desc S1RG13RP - 13 - 13 - read-write - - - S1RG14RP - desc S1RG14RP - 14 - 14 - read-write - - - S1RG15RP - desc S1RG15RP - 15 - 15 - read-write - - - - - S1CR - desc S1CR - 0x5C - 32 - read-write - 0x0 - 0x8F - - - SMPU1BRP - desc SMPU1BRP - 0 - 0 - read-write - - - SMPU1BWP - desc SMPU1BWP - 1 - 1 - read-write - - - SMPU1ACT - desc SMPU1ACT - 3 - 2 - read-write - - - SMPU1E - desc SMPU1E - 7 - 7 - read-write - - - - - S2RGE - desc S2RGE - 0x60 - 32 - read-write - 0x0 - 0xFFFF - - - S2RG0E - desc S2RG0E - 0 - 0 - read-write - - - S2RG1E - desc S2RG1E - 1 - 1 - read-write - - - S2RG2E - desc S2RG2E - 2 - 2 - read-write - - - S2RG3E - desc S2RG3E - 3 - 3 - read-write - - - S2RG4E - desc S2RG4E - 4 - 4 - read-write - - - S2RG5E - desc S2RG5E - 5 - 5 - read-write - - - S2RG6E - desc S2RG6E - 6 - 6 - read-write - - - S2RG7E - desc S2RG7E - 7 - 7 - read-write - - - S2RG8E - desc S2RG8E - 8 - 8 - read-write - - - S2RG9E - desc S2RG9E - 9 - 9 - read-write - - - S2RG10E - desc S2RG10E - 10 - 10 - read-write - - - S2RG11E - desc S2RG11E - 11 - 11 - read-write - - - S2RG12E - desc S2RG12E - 12 - 12 - read-write - - - S2RG13E - desc S2RG13E - 13 - 13 - read-write - - - S2RG14E - desc S2RG14E - 14 - 14 - read-write - - - S2RG15E - desc S2RG15E - 15 - 15 - read-write - - - - - S2RGWP - desc S2RGWP - 0x64 - 32 - read-write - 0x0 - 0xFFFF - - - S2RG0WP - desc S2RG0WP - 0 - 0 - read-write - - - S2RG1WP - desc S2RG1WP - 1 - 1 - read-write - - - S2RG2WP - desc S2RG2WP - 2 - 2 - read-write - - - S2RG3WP - desc S2RG3WP - 3 - 3 - read-write - - - S2RG4WP - desc S2RG4WP - 4 - 4 - read-write - - - S2RG5WP - desc S2RG5WP - 5 - 5 - read-write - - - S2RG6WP - desc S2RG6WP - 6 - 6 - read-write - - - S2RG7WP - desc S2RG7WP - 7 - 7 - read-write - - - S2RG8WP - desc S2RG8WP - 8 - 8 - read-write - - - S2RG9WP - desc S2RG9WP - 9 - 9 - read-write - - - S2RG10WP - desc S2RG10WP - 10 - 10 - read-write - - - S2RG11WP - desc S2RG11WP - 11 - 11 - read-write - - - S2RG12WP - desc S2RG12WP - 12 - 12 - read-write - - - S2RG13WP - desc S2RG13WP - 13 - 13 - read-write - - - S2RG14WP - desc S2RG14WP - 14 - 14 - read-write - - - S2RG15WP - desc S2RG15WP - 15 - 15 - read-write - - - - - S2RGRP - desc S2RGRP - 0x68 - 32 - read-write - 0x0 - 0xFFFF - - - S2RG0RP - desc S2RG0RP - 0 - 0 - read-write - - - S2RG1RP - desc S2RG1RP - 1 - 1 - read-write - - - S2RG2RP - desc S2RG2RP - 2 - 2 - read-write - - - S2RG3RP - desc S2RG3RP - 3 - 3 - read-write - - - S2RG4RP - desc S2RG4RP - 4 - 4 - read-write - - - S2RG5RP - desc S2RG5RP - 5 - 5 - read-write - - - S2RG6RP - desc S2RG6RP - 6 - 6 - read-write - - - S2RG7RP - desc S2RG7RP - 7 - 7 - read-write - - - S2RG8RP - desc S2RG8RP - 8 - 8 - read-write - - - S2RG9RP - desc S2RG9RP - 9 - 9 - read-write - - - S2RG10RP - desc S2RG10RP - 10 - 10 - read-write - - - S2RG11RP - desc S2RG11RP - 11 - 11 - read-write - - - S2RG12RP - desc S2RG12RP - 12 - 12 - read-write - - - S2RG13RP - desc S2RG13RP - 13 - 13 - read-write - - - S2RG14RP - desc S2RG14RP - 14 - 14 - read-write - - - S2RG15RP - desc S2RG15RP - 15 - 15 - read-write - - - - - S2CR - desc S2CR - 0x6C - 32 - read-write - 0x0 - 0x8F - - - SMPU2BRP - desc SMPU2BRP - 0 - 0 - read-write - - - SMPU2BWP - desc SMPU2BWP - 1 - 1 - read-write - - - SMPU2ACT - desc SMPU2ACT - 3 - 2 - read-write - - - SMPU2E - desc SMPU2E - 7 - 7 - read-write - - - - - FRGE - desc FRGE - 0x70 - 32 - read-write - 0x0 - 0xFF - - - FRG0E - desc FRG0E - 0 - 0 - read-write - - - FRG1E - desc FRG1E - 1 - 1 - read-write - - - FRG2E - desc FRG2E - 2 - 2 - read-write - - - FRG3E - desc FRG3E - 3 - 3 - read-write - - - FRG4E - desc FRG4E - 4 - 4 - read-write - - - FRG5E - desc FRG5E - 5 - 5 - read-write - - - FRG6E - desc FRG6E - 6 - 6 - read-write - - - FRG7E - desc FRG7E - 7 - 7 - read-write - - - - - FRGWP - desc FRGWP - 0x74 - 32 - read-write - 0x0 - 0xFF - - - FRG0WP - desc FRG0WP - 0 - 0 - read-write - - - FRG1WP - desc FRG1WP - 1 - 1 - read-write - - - FRG2WP - desc FRG2WP - 2 - 2 - read-write - - - FRG3WP - desc FRG3WP - 3 - 3 - read-write - - - FRG4WP - desc FRG4WP - 4 - 4 - read-write - - - FRG5WP - desc FRG5WP - 5 - 5 - read-write - - - FRG6WP - desc FRG6WP - 6 - 6 - read-write - - - FRG7WP - desc FRG7WP - 7 - 7 - read-write - - - - - FRGRP - desc FRGRP - 0x78 - 32 - read-write - 0x0 - 0xFF - - - FRG0RP - desc FRG0RP - 0 - 0 - read-write - - - FRG1RP - desc FRG1RP - 1 - 1 - read-write - - - FRG2RP - desc FRG2RP - 2 - 2 - read-write - - - FRG3RP - desc FRG3RP - 3 - 3 - read-write - - - FRG4RP - desc FRG4RP - 4 - 4 - read-write - - - FRG5RP - desc FRG5RP - 5 - 5 - read-write - - - FRG6RP - desc FRG6RP - 6 - 6 - read-write - - - FRG7RP - desc FRG7RP - 7 - 7 - read-write - - - - - FCR - desc FCR - 0x7C - 32 - read-write - 0x0 - 0x8F - - - FMPUBRP - desc FMPUBRP - 0 - 0 - read-write - - - FMPUBWP - desc FMPUBWP - 1 - 1 - read-write - - - FMPUACT - desc FMPUACT - 3 - 2 - read-write - - - FMPUE - desc FMPUE - 7 - 7 - read-write - - - - - HRGE - desc HRGE - 0x80 - 32 - read-write - 0x0 - 0xFF - - - HRG0E - desc HRG0E - 0 - 0 - read-write - - - HRG1E - desc HRG1E - 1 - 1 - read-write - - - HRG2E - desc HRG2E - 2 - 2 - read-write - - - HRG3E - desc HRG3E - 3 - 3 - read-write - - - HRG4E - desc HRG4E - 4 - 4 - read-write - - - HRG5E - desc HRG5E - 5 - 5 - read-write - - - HRG6E - desc HRG6E - 6 - 6 - read-write - - - HRG7E - desc HRG7E - 7 - 7 - read-write - - - - - HRGWP - desc HRGWP - 0x84 - 32 - read-write - 0x0 - 0xFF - - - HRG0WP - desc HRG0WP - 0 - 0 - read-write - - - HRG1WP - desc HRG1WP - 1 - 1 - read-write - - - HRG2WP - desc HRG2WP - 2 - 2 - read-write - - - HRG3WP - desc HRG3WP - 3 - 3 - read-write - - - HRG4WP - desc HRG4WP - 4 - 4 - read-write - - - HRG5WP - desc HRG5WP - 5 - 5 - read-write - - - HRG6WP - desc HRG6WP - 6 - 6 - read-write - - - HRG7WP - desc HRG7WP - 7 - 7 - read-write - - - - - HRGRP - desc HRGRP - 0x88 - 32 - read-write - 0x0 - 0xFF - - - HRG0RP - desc HRG0RP - 0 - 0 - read-write - - - HRG1RP - desc HRG1RP - 1 - 1 - read-write - - - HRG2RP - desc HRG2RP - 2 - 2 - read-write - - - HRG3RP - desc HRG3RP - 3 - 3 - read-write - - - HRG4RP - desc HRG4RP - 4 - 4 - read-write - - - HRG5RP - desc HRG5RP - 5 - 5 - read-write - - - HRG6RP - desc HRG6RP - 6 - 6 - read-write - - - HRG7RP - desc HRG7RP - 7 - 7 - read-write - - - - - HCR - desc HCR - 0x8C - 32 - read-write - 0x0 - 0x8F - - - HMPUBRP - desc HMPUBRP - 0 - 0 - read-write - - - HMPUBWP - desc HMPUBWP - 1 - 1 - read-write - - - HMPUACT - desc HMPUACT - 3 - 2 - read-write - - - HMPUE - desc HMPUE - 7 - 7 - read-write - - - - - ERGE - desc ERGE - 0x90 - 32 - read-write - 0x0 - 0xFF - - - ERG0E - desc ERG0E - 0 - 0 - read-write - - - ERG1E - desc ERG1E - 1 - 1 - read-write - - - ERG2E - desc ERG2E - 2 - 2 - read-write - - - ERG3E - desc ERG3E - 3 - 3 - read-write - - - ERG4E - desc ERG4E - 4 - 4 - read-write - - - ERG5E - desc ERG5E - 5 - 5 - read-write - - - ERG6E - desc ERG6E - 6 - 6 - read-write - - - ERG7E - desc ERG7E - 7 - 7 - read-write - - - - - ERGWP - desc ERGWP - 0x94 - 32 - read-write - 0x0 - 0xFF - - - ERG0WP - desc ERG0WP - 0 - 0 - read-write - - - ERG1WP - desc ERG1WP - 1 - 1 - read-write - - - ERG2WP - desc ERG2WP - 2 - 2 - read-write - - - ERG3WP - desc ERG3WP - 3 - 3 - read-write - - - ERG4WP - desc ERG4WP - 4 - 4 - read-write - - - ERG5WP - desc ERG5WP - 5 - 5 - read-write - - - ERG6WP - desc ERG6WP - 6 - 6 - read-write - - - ERG7WP - desc ERG7WP - 7 - 7 - read-write - - - - - ERGRP - desc ERGRP - 0x98 - 32 - read-write - 0x0 - 0xFF - - - ERG0RP - desc ERG0RP - 0 - 0 - read-write - - - ERG1RP - desc ERG1RP - 1 - 1 - read-write - - - ERG2RP - desc ERG2RP - 2 - 2 - read-write - - - ERG3RP - desc ERG3RP - 3 - 3 - read-write - - - ERG4RP - desc ERG4RP - 4 - 4 - read-write - - - ERG5RP - desc ERG5RP - 5 - 5 - read-write - - - ERG6RP - desc ERG6RP - 6 - 6 - read-write - - - ERG7RP - desc ERG7RP - 7 - 7 - read-write - - - - - ECR - desc ECR - 0x9C - 32 - read-write - 0x0 - 0x8F - - - EMPUBRP - desc EMPUBRP - 0 - 0 - read-write - - - EMPUBWP - desc EMPUBWP - 1 - 1 - read-write - - - EMPUACT - desc EMPUACT - 3 - 2 - read-write - - - EMPUE - desc EMPUE - 7 - 7 - read-write - - - - - - - NFC - desc NFC - 0x88100000 - - 0x0 - 0x8180 - - - - DATR_BASE - desc DATR_BASE - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CMDR - desc CMDR - 0x8000 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CMD - desc CMD - 7 - 0 - read-write - - - ARG - desc ARG - 31 - 8 - read-write - - - - - IDXR0 - desc IDXR0 - 0x8004 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IENR - desc IENR - 0x8030 - 32 - read-write - 0x0 - 0xFFD3 - - - ECCEUEN - desc ECCEUEN - 0 - 0 - read-write - - - ECCECEN - desc ECCECEN - 1 - 1 - read-write - - - ECCCEN - desc ECCCEN - 4 - 4 - read-write - - - ECCEEN - desc ECCEEN - 6 - 6 - read-write - - - ECCDIS - desc ECCDIS - 7 - 7 - read-write - - - RBEN - desc RBEN - 15 - 8 - read-write - - - - - ISTR - desc ISTR - 0x8034 - 32 - read-write - 0x0 - 0xFF53 - - - ECCEUST - desc ECCEUST - 0 - 0 - read-write - - - ECCECST - desc ECCECST - 1 - 1 - read-write - - - ECCCST - desc ECCCST - 4 - 4 - read-write - - - ECCEST - desc ECCEST - 6 - 6 - read-write - - - RBST - desc RBST - 15 - 8 - read-write - - - - - IRSR - desc IRSR - 0x8038 - 32 - read-write - 0x0 - 0xFF53 - - - ECCEURS - desc ECCEURS - 0 - 0 - read-write - - - ECCECRS - desc ECCECRS - 1 - 1 - read-write - - - ECCCRS - desc ECCCRS - 4 - 4 - read-write - - - ECCERS - desc ECCERS - 6 - 6 - read-write - - - RBRS - desc RBRS - 15 - 8 - read-write - - - - - IDXR1 - desc IDXR1 - 0x8048 - 32 - read-write - 0x0 - 0xFF - - - IDX1 - desc IDX1 - 7 - 0 - read-write - - - - - TMCR0 - desc TMCR0 - 0x804C - 32 - read-write - 0x3030202 - 0xFFFFFFFF - - - TS - desc TS - 7 - 0 - read-write - - - TWP - desc TWP - 15 - 8 - read-write - - - TRP - desc TRP - 23 - 16 - read-write - - - TH - desc TH - 31 - 24 - read-write - - - - - TMCR1 - desc TMCR1 - 0x8050 - 32 - read-write - 0x28080303 - 0xFFFFFFFF - - - TWH - desc TWH - 7 - 0 - read-write - - - TRH - desc TRH - 15 - 8 - read-write - - - TRR - desc TRR - 23 - 16 - read-write - - - TWB - desc TWB - 31 - 24 - read-write - - - - - BACR - desc BACR - 0x8054 - 32 - read-write - 0x2187 - 0xFF3FCF - - - SIZE - desc SIZE - 2 - 0 - read-write - - - B16BIT - desc B16BIT - 3 - 3 - read-write - - - BANK - desc BANK - 7 - 6 - read-write - - - PAGE - desc PAGE - 9 - 8 - read-write - - - WP - desc WP - 10 - 10 - read-write - - - ECCM - desc ECCM - 12 - 11 - read-write - - - RAC - desc RAC - 13 - 13 - read-write - - - SCS - desc SCS - 23 - 16 - read-write - - - - - TMCR2 - desc TMCR2 - 0x805C - 32 - read-write - 0x3050D03 - 0xFFFFFFFF - - - TCCS - desc TCCS - 7 - 0 - read-write - - - TWTR - desc TWTR - 15 - 8 - read-write - - - TRTW - desc TRTW - 23 - 16 - read-write - - - TADL - desc TADL - 31 - 24 - read-write - - - - - ECCR0 - desc ECCR0 - 0x8060 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR1 - desc ECCR1 - 0x8064 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR2 - desc ECCR2 - 0x8068 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR3 - desc ECCR3 - 0x806C - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR4 - desc ECCR4 - 0x8070 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR5 - desc ECCR5 - 0x8074 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR6 - desc ECCR6 - 0x8078 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECC_STAT - desc ECC_STAT - 0x807C - 32 - read-only - 0x0 - 0xFFFF - - - ERRSEC - desc ERRSEC - 15 - 0 - read-only - - - - - ECC_SYND0_0 - desc ECC_SYND0_0 - 0x8080 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND0_1 - desc ECC_SYND0_1 - 0x8084 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND0_2 - desc ECC_SYND0_2 - 0x8088 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND0_3 - desc ECC_SYND0_3 - 0x808C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND1_0 - desc ECC_SYND1_0 - 0x8090 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND1_1 - desc ECC_SYND1_1 - 0x8094 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND1_2 - desc ECC_SYND1_2 - 0x8098 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND1_3 - desc ECC_SYND1_3 - 0x809C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND2_0 - desc ECC_SYND2_0 - 0x80A0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND2_1 - desc ECC_SYND2_1 - 0x80A4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND2_2 - desc ECC_SYND2_2 - 0x80A8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND2_3 - desc ECC_SYND2_3 - 0x80AC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND3_0 - desc ECC_SYND3_0 - 0x80B0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND3_1 - desc ECC_SYND3_1 - 0x80B4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND3_2 - desc ECC_SYND3_2 - 0x80B8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND3_3 - desc ECC_SYND3_3 - 0x80BC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND4_0 - desc ECC_SYND4_0 - 0x80C0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND4_1 - desc ECC_SYND4_1 - 0x80C4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND4_2 - desc ECC_SYND4_2 - 0x80C8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND4_3 - desc ECC_SYND4_3 - 0x80CC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND5_0 - desc ECC_SYND5_0 - 0x80D0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND5_1 - desc ECC_SYND5_1 - 0x80D4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND5_2 - desc ECC_SYND5_2 - 0x80D8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND5_3 - desc ECC_SYND5_3 - 0x80DC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND6_0 - desc ECC_SYND6_0 - 0x80E0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND6_1 - desc ECC_SYND6_1 - 0x80E4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - RESV - desc RESV - 31 - 31 - read-write - - - - - ECC_SYND6_2 - desc ECC_SYND6_2 - 0x80E8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND6_3 - desc ECC_SYND6_3 - 0x80EC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND7_0 - desc ECC_SYND7_0 - 0x80F0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND7_1 - desc ECC_SYND7_1 - 0x80F4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND7_2 - desc ECC_SYND7_2 - 0x80F8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND7_3 - desc ECC_SYND7_3 - 0x80FC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND8_0 - desc ECC_SYND8_0 - 0x8100 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND8_1 - desc ECC_SYND8_1 - 0x8104 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND8_2 - desc ECC_SYND8_2 - 0x8108 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND8_3 - desc ECC_SYND8_3 - 0x810C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND9_0 - desc ECC_SYND9_0 - 0x8110 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND9_1 - desc ECC_SYND9_1 - 0x8114 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND9_2 - desc ECC_SYND9_2 - 0x8118 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND9_3 - desc ECC_SYND9_3 - 0x811C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND10_0 - desc ECC_SYND10_0 - 0x8120 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND10_1 - desc ECC_SYND10_1 - 0x8124 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND10_2 - desc ECC_SYND10_2 - 0x8128 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND10_3 - desc ECC_SYND10_3 - 0x812C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND11_0 - desc ECC_SYND11_0 - 0x8130 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND11_1 - desc ECC_SYND11_1 - 0x8134 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND11_2 - desc ECC_SYND11_2 - 0x8138 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND11_3 - desc ECC_SYND11_3 - 0x813C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND12_0 - desc ECC_SYND12_0 - 0x8140 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND12_1 - desc ECC_SYND12_1 - 0x8144 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND12_2 - desc ECC_SYND12_2 - 0x8148 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND12_3 - desc ECC_SYND12_3 - 0x814C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND13_0 - desc ECC_SYND13_0 - 0x8150 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND13_1 - desc ECC_SYND13_1 - 0x8154 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND13_2 - desc ECC_SYND13_2 - 0x8158 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND13_3 - desc ECC_SYND13_3 - 0x815C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND14_0 - desc ECC_SYND14_0 - 0x8160 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND14_1 - desc ECC_SYND14_1 - 0x8164 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND14_2 - desc ECC_SYND14_2 - 0x8168 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND14_3 - desc ECC_SYND14_3 - 0x816C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND15_0 - desc ECC_SYND15_0 - 0x8170 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND15_1 - desc ECC_SYND15_1 - 0x8174 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND15_2 - desc ECC_SYND15_2 - 0x8178 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND15_3 - desc ECC_SYND15_3 - 0x817C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - - - OTS - desc OTS - 0x40010600 - - 0x0 - 0x3A20C - - - - PDR1 - desc PDR1 - 0xE0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPD1 - desc TSPD1 - 15 - 0 - read-write - - - TSPD2 - desc TSPD2 - 31 - 16 - read-write - - - - - PDR2 - desc PDR2 - 0xF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPD1 - desc TSPD1 - 15 - 0 - read-write - - - TSPD2 - desc TSPD2 - 31 - 16 - read-write - - - - - PDR3 - desc PDR3 - 0xF8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPD1 - desc TSPD1 - 15 - 0 - read-write - - - TSPD2 - desc TSPD2 - 31 - 16 - read-write - - - - - CTL - desc CTL - 0x3A200 - 16 - read-write - 0x0 - 0xF - - - OTSST - desc OTSST - 0 - 0 - read-write - - - OTSCK - desc OTSCK - 1 - 1 - read-write - - - OTSIE - desc OTSIE - 2 - 2 - read-write - - - TSSTP - desc TSSTP - 3 - 3 - read-write - - - - - DR1 - desc DR1 - 0x3A202 - 16 - read-write - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x3A204 - 16 - read-write - 0x0 - 0xFFFF - - - ECR - desc ECR - 0x3A206 - 16 - read-write - 0x0 - 0xFFFF - - - LPR - desc LPR - 0x3A208 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - TSOFS - desc TSOFS - 7 - 0 - read-only - - - TSSLP - desc TSSLP - 31 - 8 - read-only - - - - - - - PERIC - desc PERIC - 0x40055400 - - 0x0 - 0x2C - - - - USB_SYCTLREG - desc USB_SYCTLREG - 0x0 - 32 - read-write - 0x0 - 0x7070703 - - - USBFS_DFB - desc USBFS_DFB - 0 - 0 - read-write - - - USBFS_SOFEN - desc USBFS_SOFEN - 1 - 1 - read-write - - - USBHS_DFB - desc USBHS_DFB - 8 - 8 - read-write - - - USBHS_SOFEN - desc USBHS_SOFEN - 9 - 9 - read-write - - - USBHS_FSPHYE - desc USBHS_FSPHYE - 10 - 10 - read-write - - - USBFS_NFS - desc USBFS_NFS - 17 - 16 - read-write - - - USBFS_NFE - desc USBFS_NFE - 18 - 18 - read-write - - - USBHS_NFS - desc USBHS_NFS - 25 - 24 - read-write - - - USBHS_NFE - desc USBHS_NFE - 26 - 26 - read-write - - - - - SDIOC_SYCTLREG - desc SDIOC_SYCTLREG - 0x4 - 32 - read-write - 0x0 - 0xA - - - SELMMC1 - desc SELMMC1 - 1 - 1 - read-write - - - SELMMC2 - desc SELMMC2 - 3 - 3 - read-write - - - - - NFC_STCR - desc NFC_STCR - 0x8 - 32 - read-write - 0x0 - 0x1 - - - OPENP - desc OPENP - 0 - 0 - read-write - - - - - NFC_ENAR - desc NFC_ENAR - 0xC - 32 - read-write - 0x0 - 0x4 - - - NFCEN - desc NFCEN - 2 - 2 - read-write - - - - - SMC_ENAR - desc SMC_ENAR - 0xC - 32 - read-write - 0x0 - 0x2 - - - SMCEN - desc SMCEN - 1 - 1 - read-write - - - - - DMC_ENAR - desc DMC_ENAR - 0xC - 32 - read-write - 0x0 - 0x1 - - - DMCEN - desc DMCEN - 0 - 0 - read-write - - - - - USART1_NFC - desc USART1_NFC - 0x1C - 32 - read-write - 0x0 - 0x7 - - - USASRT1_NFS - desc USASRT1_NFS - 1 - 0 - read-write - - - USART1_NFE - desc USART1_NFE - 2 - 2 - read-write - - - - - NFC_STSR - desc NFC_STSR - 0x28 - 32 - read-only - 0x0 - 0x1FF - - - CHIP_BUSY - desc CHIP_BUSY - 7 - 0 - read-only - - - PECC - desc PECC - 8 - 8 - read-only - - - - - - - PWC - desc PWC - 0x40048000 - - 0x0 - 0xC400 - - - - FCG0 - desc FCG0 - 0x0 - 32 - read-write - 0xFFFFFA0E - 0xFFFFE4F1 - - - SRAMH - desc SRAMH - 0 - 0 - read-write - - - SRAM1 - desc SRAM1 - 4 - 4 - read-write - - - SRAM2 - desc SRAM2 - 5 - 5 - read-write - - - SRAM3 - desc SRAM3 - 6 - 6 - read-write - - - SRAM4 - desc SRAM4 - 7 - 7 - read-write - - - SRAMB - desc SRAMB - 10 - 10 - read-write - - - KEY - desc KEY - 13 - 13 - read-write - - - DMA1 - desc DMA1 - 14 - 14 - read-write - - - DMA2 - desc DMA2 - 15 - 15 - read-write - - - FCM - desc FCM - 16 - 16 - read-write - - - AOS - desc AOS - 17 - 17 - read-write - - - CTC - desc CTC - 18 - 18 - read-write - - - MAU - desc MAU - 19 - 19 - read-write - - - AES - desc AES - 20 - 20 - read-write - - - HASH - desc HASH - 21 - 21 - read-write - - - TRNG - desc TRNG - 22 - 22 - read-write - - - CRC - desc CRC - 23 - 23 - read-write - - - DCU1 - desc DCU1 - 24 - 24 - read-write - - - DCU2 - desc DCU2 - 25 - 25 - read-write - - - DCU3 - desc DCU3 - 26 - 26 - read-write - - - DCU4 - desc DCU4 - 27 - 27 - read-write - - - DCU5 - desc DCU5 - 28 - 28 - read-write - - - DCU6 - desc DCU6 - 29 - 29 - read-write - - - DCU7 - desc DCU7 - 30 - 30 - read-write - - - DCU8 - desc DCU8 - 31 - 31 - read-write - - - - - FCG1 - desc FCG1 - 0x4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFF - - - CAN1 - desc CAN1 - 0 - 0 - read-write - - - CAN2 - desc CAN2 - 1 - 1 - read-write - - - ETHMAC - desc ETHMAC - 2 - 2 - read-write - - - QSPI - desc QSPI - 3 - 3 - read-write - - - I2C1 - desc I2C1 - 4 - 4 - read-write - - - I2C2 - desc I2C2 - 5 - 5 - read-write - - - I2C3 - desc I2C3 - 6 - 6 - read-write - - - I2C4 - desc I2C4 - 7 - 7 - read-write - - - I2C5 - desc I2C5 - 8 - 8 - read-write - - - I2C6 - desc I2C6 - 9 - 9 - read-write - - - SDIOC1 - desc SDIOC1 - 10 - 10 - read-write - - - SDIOC2 - desc SDIOC2 - 11 - 11 - read-write - - - I2S1 - desc I2S1 - 12 - 12 - read-write - - - I2S2 - desc I2S2 - 13 - 13 - read-write - - - I2S3 - desc I2S3 - 14 - 14 - read-write - - - I2S4 - desc I2S4 - 15 - 15 - read-write - - - SPI1 - desc SPI1 - 16 - 16 - read-write - - - SPI2 - desc SPI2 - 17 - 17 - read-write - - - SPI3 - desc SPI3 - 18 - 18 - read-write - - - SPI4 - desc SPI4 - 19 - 19 - read-write - - - SPI5 - desc SPI5 - 20 - 20 - read-write - - - SPI6 - desc SPI6 - 21 - 21 - read-write - - - USBFS - desc USBFS - 22 - 22 - read-write - - - USBHS - desc USBHS - 23 - 23 - read-write - - - FMAC1 - desc FMAC1 - 24 - 24 - read-write - - - FMAC2 - desc FMAC2 - 25 - 25 - read-write - - - FMAC3 - desc FMAC3 - 26 - 26 - read-write - - - FMAC4 - desc FMAC4 - 27 - 27 - read-write - - - - - FCG2 - desc FCG2 - 0x8 - 32 - read-write - 0xFFFFFFFF - 0xFFFFBFFF - - - TMR6_1 - desc TMR6_1 - 0 - 0 - read-write - - - TMR6_2 - desc TMR6_2 - 1 - 1 - read-write - - - TMR6_3 - desc TMR6_3 - 2 - 2 - read-write - - - TMR6_4 - desc TMR6_4 - 3 - 3 - read-write - - - TMR6_5 - desc TMR6_5 - 4 - 4 - read-write - - - TMR6_6 - desc TMR6_6 - 5 - 5 - read-write - - - TMR6_7 - desc TMR6_7 - 6 - 6 - read-write - - - TMR6_8 - desc TMR6_8 - 7 - 7 - read-write - - - TMR4_1 - desc TMR4_1 - 8 - 8 - read-write - - - TMR4_2 - desc TMR4_2 - 9 - 9 - read-write - - - TMR4_3 - desc TMR4_3 - 10 - 10 - read-write - - - HRPWM - desc HRPWM - 11 - 11 - read-write - - - TMR0_1 - desc TMR0_1 - 12 - 12 - read-write - - - TMR0_2 - desc TMR0_2 - 13 - 13 - read-write - - - EMB - desc EMB - 15 - 15 - read-write - - - TMR2_1 - desc TMR2_1 - 16 - 16 - read-write - - - TMR2_2 - desc TMR2_2 - 17 - 17 - read-write - - - TMR2_3 - desc TMR2_3 - 18 - 18 - read-write - - - TMR2_4 - desc TMR2_4 - 19 - 19 - read-write - - - TMRA_1 - desc TMRA_1 - 20 - 20 - read-write - - - TMRA_2 - desc TMRA_2 - 21 - 21 - read-write - - - TMRA_3 - desc TMRA_3 - 22 - 22 - read-write - - - TMRA_4 - desc TMRA_4 - 23 - 23 - read-write - - - TMRA_5 - desc TMRA_5 - 24 - 24 - read-write - - - TMRA_6 - desc TMRA_6 - 25 - 25 - read-write - - - TMRA_7 - desc TMRA_7 - 26 - 26 - read-write - - - TMRA_8 - desc TMRA_8 - 27 - 27 - read-write - - - TMRA_9 - desc TMRA_9 - 28 - 28 - read-write - - - TMRA_10 - desc TMRA_10 - 29 - 29 - read-write - - - TMRA_11 - desc TMRA_11 - 30 - 30 - read-write - - - TMRA_12 - desc TMRA_12 - 31 - 31 - read-write - - - - - FCG3 - desc FCG3 - 0xC - 32 - read-write - 0xFFFFFFFF - 0x3FF7933F - - - ADC1 - desc ADC1 - 0 - 0 - read-write - - - ADC2 - desc ADC2 - 1 - 1 - read-write - - - ADC3 - desc ADC3 - 2 - 2 - read-write - - - CMBIAS - desc CMBIAS - 3 - 3 - read-write - - - DAC1 - desc DAC1 - 4 - 4 - read-write - - - DAC2 - desc DAC2 - 5 - 5 - read-write - - - CMP1 - desc CMP1 - 8 - 8 - read-write - - - CMP2 - desc CMP2 - 9 - 9 - read-write - - - OTS - desc OTS - 12 - 12 - read-write - - - DVP - desc DVP - 15 - 15 - read-write - - - SMC - desc SMC - 16 - 16 - read-write - - - DMC - desc DMC - 17 - 17 - read-write - - - NFC - desc NFC - 18 - 18 - read-write - - - USART1 - desc USART1 - 20 - 20 - read-write - - - USART2 - desc USART2 - 21 - 21 - read-write - - - USART3 - desc USART3 - 22 - 22 - read-write - - - USART4 - desc USART4 - 23 - 23 - read-write - - - USART5 - desc USART5 - 24 - 24 - read-write - - - USART6 - desc USART6 - 25 - 25 - read-write - - - USART7 - desc USART7 - 26 - 26 - read-write - - - USART8 - desc USART8 - 27 - 27 - read-write - - - USART9 - desc USART9 - 28 - 28 - read-write - - - USART10 - desc USART10 - 29 - 29 - read-write - - - - - FCG0PC - desc FCG0PC - 0x10 - 32 - read-write - 0x0 - 0xFFFF0001 - - - PRT0 - desc PRT0 - 0 - 0 - read-write - - - FCG0PCWE - desc FCG0PCWE - 31 - 16 - write-only - - - - - VBATRSTR - desc VBATRSTR - 0x4430 - 8 - read-write - 0x0 - 0xFF - - - VBATCR - desc VBATCR - 0x4440 - 8 - read-write - 0x0 - 0x8F - - - VBTRSD - desc VBTRSD - 0 - 0 - read-write - - - RAMVALID - desc RAMVALID - 1 - 1 - read-write - - - RAMPDF - desc RAMPDF - 2 - 2 - read-write - - - VBATDIVMONE - desc VBATDIVMONE - 3 - 3 - read-write - - - CSDIS - desc CSDIS - 7 - 7 - read-write - - - - - WKTC0 - desc WKTC0 - 0x4450 - 8 - read-write - 0x0 - 0xFF - - - WKTMCMP - desc WKTMCMP - 7 - 0 - read-write - - - - - WKTC1 - desc WKTC1 - 0x4454 - 8 - read-write - 0x0 - 0xF - - - WKTMCMP - desc WKTMCMP - 3 - 0 - read-write - - - - - WKTC2 - desc WKTC2 - 0x4458 - 8 - read-write - 0x0 - 0xF0 - - - WKOVF - desc WKOVF - 4 - 4 - read-write - - - WKCKS - desc WKCKS - 6 - 5 - read-write - - - WKTCE - desc WKTCE - 7 - 7 - read-write - - - - - BKR0 - desc BKR0 - 0x4600 - 8 - read-write - 0x0 - 0xFF - - - BKR1 - desc BKR1 - 0x4604 - 8 - read-write - 0x0 - 0xFF - - - BKR2 - desc BKR2 - 0x4608 - 8 - read-write - 0x0 - 0xFF - - - BKR3 - desc BKR3 - 0x460C - 8 - read-write - 0x0 - 0xFF - - - BKR4 - desc BKR4 - 0x4610 - 8 - read-write - 0x0 - 0xFF - - - BKR5 - desc BKR5 - 0x4614 - 8 - read-write - 0x0 - 0xFF - - - BKR6 - desc BKR6 - 0x4618 - 8 - read-write - 0x0 - 0xFF - - - BKR7 - desc BKR7 - 0x461C - 8 - read-write - 0x0 - 0xFF - - - BKR8 - desc BKR8 - 0x4620 - 8 - read-write - 0x0 - 0xFF - - - BKR9 - desc BKR9 - 0x4624 - 8 - read-write - 0x0 - 0xFF - - - BKR10 - desc BKR10 - 0x4628 - 8 - read-write - 0x0 - 0xFF - - - BKR11 - desc BKR11 - 0x462C - 8 - read-write - 0x0 - 0xFF - - - BKR12 - desc BKR12 - 0x4630 - 8 - read-write - 0x0 - 0xFF - - - BKR13 - desc BKR13 - 0x4634 - 8 - read-write - 0x0 - 0xFF - - - BKR14 - desc BKR14 - 0x4638 - 8 - read-write - 0x0 - 0xFF - - - BKR15 - desc BKR15 - 0x463C - 8 - read-write - 0x0 - 0xFF - - - BKR16 - desc BKR16 - 0x4640 - 8 - read-write - 0x0 - 0xFF - - - BKR17 - desc BKR17 - 0x4644 - 8 - read-write - 0x0 - 0xFF - - - BKR18 - desc BKR18 - 0x4648 - 8 - read-write - 0x0 - 0xFF - - - BKR19 - desc BKR19 - 0x464C - 8 - read-write - 0x0 - 0xFF - - - BKR20 - desc BKR20 - 0x4650 - 8 - read-write - 0x0 - 0xFF - - - BKR21 - desc BKR21 - 0x4654 - 8 - read-write - 0x0 - 0xFF - - - BKR22 - desc BKR22 - 0x4658 - 8 - read-write - 0x0 - 0xFF - - - BKR23 - desc BKR23 - 0x465C - 8 - read-write - 0x0 - 0xFF - - - BKR24 - desc BKR24 - 0x4660 - 8 - read-write - 0x0 - 0xFF - - - BKR25 - desc BKR25 - 0x4664 - 8 - read-write - 0x0 - 0xFF - - - BKR26 - desc BKR26 - 0x4668 - 8 - read-write - 0x0 - 0xFF - - - BKR27 - desc BKR27 - 0x466C - 8 - read-write - 0x0 - 0xFF - - - BKR28 - desc BKR28 - 0x4670 - 8 - read-write - 0x0 - 0xFF - - - BKR29 - desc BKR29 - 0x4674 - 8 - read-write - 0x0 - 0xFF - - - BKR30 - desc BKR30 - 0x4678 - 8 - read-write - 0x0 - 0xFF - - - BKR31 - desc BKR31 - 0x467C - 8 - read-write - 0x0 - 0xFF - - - BKR32 - desc BKR32 - 0x4680 - 8 - read-write - 0x0 - 0xFF - - - BKR33 - desc BKR33 - 0x4684 - 8 - read-write - 0x0 - 0xFF - - - BKR34 - desc BKR34 - 0x4688 - 8 - read-write - 0x0 - 0xFF - - - BKR35 - desc BKR35 - 0x468C - 8 - read-write - 0x0 - 0xFF - - - BKR36 - desc BKR36 - 0x4690 - 8 - read-write - 0x0 - 0xFF - - - BKR37 - desc BKR37 - 0x4694 - 8 - read-write - 0x0 - 0xFF - - - BKR38 - desc BKR38 - 0x4698 - 8 - read-write - 0x0 - 0xFF - - - BKR39 - desc BKR39 - 0x469C - 8 - read-write - 0x0 - 0xFF - - - BKR40 - desc BKR40 - 0x46A0 - 8 - read-write - 0x0 - 0xFF - - - BKR41 - desc BKR41 - 0x46A4 - 8 - read-write - 0x0 - 0xFF - - - BKR42 - desc BKR42 - 0x46A8 - 8 - read-write - 0x0 - 0xFF - - - BKR43 - desc BKR43 - 0x46AC - 8 - read-write - 0x0 - 0xFF - - - BKR44 - desc BKR44 - 0x46B0 - 8 - read-write - 0x0 - 0xFF - - - BKR45 - desc BKR45 - 0x46B4 - 8 - read-write - 0x0 - 0xFF - - - BKR46 - desc BKR46 - 0x46B8 - 8 - read-write - 0x0 - 0xFF - - - BKR47 - desc BKR47 - 0x46BC - 8 - read-write - 0x0 - 0xFF - - - BKR48 - desc BKR48 - 0x46C0 - 8 - read-write - 0x0 - 0xFF - - - BKR49 - desc BKR49 - 0x46C4 - 8 - read-write - 0x0 - 0xFF - - - BKR50 - desc BKR50 - 0x46C8 - 8 - read-write - 0x0 - 0xFF - - - BKR51 - desc BKR51 - 0x46CC - 8 - read-write - 0x0 - 0xFF - - - BKR52 - desc BKR52 - 0x46D0 - 8 - read-write - 0x0 - 0xFF - - - BKR53 - desc BKR53 - 0x46D4 - 8 - read-write - 0x0 - 0xFF - - - BKR54 - desc BKR54 - 0x46D8 - 8 - read-write - 0x0 - 0xFF - - - BKR55 - desc BKR55 - 0x46DC - 8 - read-write - 0x0 - 0xFF - - - BKR56 - desc BKR56 - 0x46E0 - 8 - read-write - 0x0 - 0xFF - - - BKR57 - desc BKR57 - 0x46E4 - 8 - read-write - 0x0 - 0xFF - - - BKR58 - desc BKR58 - 0x46E8 - 8 - read-write - 0x0 - 0xFF - - - BKR59 - desc BKR59 - 0x46EC - 8 - read-write - 0x0 - 0xFF - - - BKR60 - desc BKR60 - 0x46F0 - 8 - read-write - 0x0 - 0xFF - - - BKR61 - desc BKR61 - 0x46F4 - 8 - read-write - 0x0 - 0xFF - - - BKR62 - desc BKR62 - 0x46F8 - 8 - read-write - 0x0 - 0xFF - - - BKR63 - desc BKR63 - 0x46FC - 8 - read-write - 0x0 - 0xFF - - - BKR64 - desc BKR64 - 0x4700 - 8 - read-write - 0x0 - 0xFF - - - BKR65 - desc BKR65 - 0x4704 - 8 - read-write - 0x0 - 0xFF - - - BKR66 - desc BKR66 - 0x4708 - 8 - read-write - 0x0 - 0xFF - - - BKR67 - desc BKR67 - 0x470C - 8 - read-write - 0x0 - 0xFF - - - BKR68 - desc BKR68 - 0x4710 - 8 - read-write - 0x0 - 0xFF - - - BKR69 - desc BKR69 - 0x4714 - 8 - read-write - 0x0 - 0xFF - - - BKR70 - desc BKR70 - 0x4718 - 8 - read-write - 0x0 - 0xFF - - - BKR71 - desc BKR71 - 0x471C - 8 - read-write - 0x0 - 0xFF - - - BKR72 - desc BKR72 - 0x4720 - 8 - read-write - 0x0 - 0xFF - - - BKR73 - desc BKR73 - 0x4724 - 8 - read-write - 0x0 - 0xFF - - - BKR74 - desc BKR74 - 0x4728 - 8 - read-write - 0x0 - 0xFF - - - BKR75 - desc BKR75 - 0x472C - 8 - read-write - 0x0 - 0xFF - - - BKR76 - desc BKR76 - 0x4730 - 8 - read-write - 0x0 - 0xFF - - - BKR77 - desc BKR77 - 0x4734 - 8 - read-write - 0x0 - 0xFF - - - BKR78 - desc BKR78 - 0x4738 - 8 - read-write - 0x0 - 0xFF - - - BKR79 - desc BKR79 - 0x473C - 8 - read-write - 0x0 - 0xFF - - - BKR80 - desc BKR80 - 0x4740 - 8 - read-write - 0x0 - 0xFF - - - BKR81 - desc BKR81 - 0x4744 - 8 - read-write - 0x0 - 0xFF - - - BKR82 - desc BKR82 - 0x4748 - 8 - read-write - 0x0 - 0xFF - - - BKR83 - desc BKR83 - 0x474C - 8 - read-write - 0x0 - 0xFF - - - BKR84 - desc BKR84 - 0x4750 - 8 - read-write - 0x0 - 0xFF - - - BKR85 - desc BKR85 - 0x4754 - 8 - read-write - 0x0 - 0xFF - - - BKR86 - desc BKR86 - 0x4758 - 8 - read-write - 0x0 - 0xFF - - - BKR87 - desc BKR87 - 0x475C - 8 - read-write - 0x0 - 0xFF - - - BKR88 - desc BKR88 - 0x4760 - 8 - read-write - 0x0 - 0xFF - - - BKR89 - desc BKR89 - 0x4764 - 8 - read-write - 0x0 - 0xFF - - - BKR90 - desc BKR90 - 0x4768 - 8 - read-write - 0x0 - 0xFF - - - BKR91 - desc BKR91 - 0x476C - 8 - read-write - 0x0 - 0xFF - - - BKR92 - desc BKR92 - 0x4770 - 8 - read-write - 0x0 - 0xFF - - - BKR93 - desc BKR93 - 0x4774 - 8 - read-write - 0x0 - 0xFF - - - BKR94 - desc BKR94 - 0x4778 - 8 - read-write - 0x0 - 0xFF - - - BKR95 - desc BKR95 - 0x477C - 8 - read-write - 0x0 - 0xFF - - - BKR96 - desc BKR96 - 0x4780 - 8 - read-write - 0x0 - 0xFF - - - BKR97 - desc BKR97 - 0x4784 - 8 - read-write - 0x0 - 0xFF - - - BKR98 - desc BKR98 - 0x4788 - 8 - read-write - 0x0 - 0xFF - - - BKR99 - desc BKR99 - 0x478C - 8 - read-write - 0x0 - 0xFF - - - BKR100 - desc BKR100 - 0x4790 - 8 - read-write - 0x0 - 0xFF - - - BKR101 - desc BKR101 - 0x4794 - 8 - read-write - 0x0 - 0xFF - - - BKR102 - desc BKR102 - 0x4798 - 8 - read-write - 0x0 - 0xFF - - - BKR103 - desc BKR103 - 0x479C - 8 - read-write - 0x0 - 0xFF - - - BKR104 - desc BKR104 - 0x47A0 - 8 - read-write - 0x0 - 0xFF - - - BKR105 - desc BKR105 - 0x47A4 - 8 - read-write - 0x0 - 0xFF - - - BKR106 - desc BKR106 - 0x47A8 - 8 - read-write - 0x0 - 0xFF - - - BKR107 - desc BKR107 - 0x47AC - 8 - read-write - 0x0 - 0xFF - - - BKR108 - desc BKR108 - 0x47B0 - 8 - read-write - 0x0 - 0xFF - - - BKR109 - desc BKR109 - 0x47B4 - 8 - read-write - 0x0 - 0xFF - - - BKR110 - desc BKR110 - 0x47B8 - 8 - read-write - 0x0 - 0xFF - - - BKR111 - desc BKR111 - 0x47BC - 8 - read-write - 0x0 - 0xFF - - - BKR112 - desc BKR112 - 0x47C0 - 8 - read-write - 0x0 - 0xFF - - - BKR113 - desc BKR113 - 0x47C4 - 8 - read-write - 0x0 - 0xFF - - - BKR114 - desc BKR114 - 0x47C8 - 8 - read-write - 0x0 - 0xFF - - - BKR115 - desc BKR115 - 0x47CC - 8 - read-write - 0x0 - 0xFF - - - BKR116 - desc BKR116 - 0x47D0 - 8 - read-write - 0x0 - 0xFF - - - BKR117 - desc BKR117 - 0x47D4 - 8 - read-write - 0x0 - 0xFF - - - BKR118 - desc BKR118 - 0x47D8 - 8 - read-write - 0x0 - 0xFF - - - BKR119 - desc BKR119 - 0x47DC - 8 - read-write - 0x0 - 0xFF - - - BKR120 - desc BKR120 - 0x47E0 - 8 - read-write - 0x0 - 0xFF - - - BKR121 - desc BKR121 - 0x47E4 - 8 - read-write - 0x0 - 0xFF - - - BKR122 - desc BKR122 - 0x47E8 - 8 - read-write - 0x0 - 0xFF - - - BKR123 - desc BKR123 - 0x47EC - 8 - read-write - 0x0 - 0xFF - - - BKR124 - desc BKR124 - 0x47F0 - 8 - read-write - 0x0 - 0xFF - - - BKR125 - desc BKR125 - 0x47F4 - 8 - read-write - 0x0 - 0xFF - - - BKR126 - desc BKR126 - 0x47F8 - 8 - read-write - 0x0 - 0xFF - - - BKR127 - desc BKR127 - 0x47FC - 8 - read-write - 0x0 - 0xFF - - - PWRC0 - desc PWRC0 - 0x4C00 - 8 - read-write - 0x0 - 0xBB - - - PDMDS - desc PDMDS - 1 - 0 - read-write - - - IORTN - desc IORTN - 5 - 4 - read-write - - - PWDN - desc PWDN - 7 - 7 - read-write - - - - - PWRC1 - desc PWRC1 - 0x4C04 - 8 - read-write - 0x0 - 0xCF - - - VPLLSD - desc VPLLSD - 1 - 0 - read-write - - - VHRCSD - desc VHRCSD - 2 - 2 - read-write - - - PDTS - desc PDTS - 3 - 3 - read-write - - - STPDAS - desc STPDAS - 7 - 6 - read-write - - - - - PWRC2 - desc PWRC2 - 0x4C08 - 8 - read-write - 0xFF - 0x3F - - - DDAS - desc DDAS - 3 - 0 - read-write - - - DVS - desc DVS - 5 - 4 - read-write - - - - - PWRC3 - desc PWRC3 - 0x4C0C - 8 - read-write - 0xFF - 0xFF - - - DDAS - desc DDAS - 7 - 0 - read-write - - - - - PWRC4 - desc PWRC4 - 0x4C10 - 8 - read-write - 0x0 - 0xD3 - - - VBATREFSEL - desc VBATREFSEL - 0 - 0 - read-write - - - VBATME - desc VBATME - 1 - 1 - read-write - - - VBATMON - desc VBATMON - 4 - 4 - read-write - - - ADBUFS - desc ADBUFS - 6 - 6 - read-write - - - ADBUFE - desc ADBUFE - 7 - 7 - read-write - - - - - PVDCR0 - desc PVDCR0 - 0x4C14 - 8 - read-write - 0x0 - 0x61 - - - EXVCCINEN - desc EXVCCINEN - 0 - 0 - read-write - - - PVD1EN - desc PVD1EN - 5 - 5 - read-write - - - PVD2EN - desc PVD2EN - 6 - 6 - read-write - - - - - PVDCR1 - desc PVDCR1 - 0x4C18 - 8 - read-write - 0x0 - 0x77 - - - PVD1IRE - desc PVD1IRE - 0 - 0 - read-write - - - PVD1IRS - desc PVD1IRS - 1 - 1 - read-write - - - PVD1CMPOE - desc PVD1CMPOE - 2 - 2 - read-write - - - PVD2IRE - desc PVD2IRE - 4 - 4 - read-write - - - PVD2IRS - desc PVD2IRS - 5 - 5 - read-write - - - PVD2CMPOE - desc PVD2CMPOE - 6 - 6 - read-write - - - - - PVDFCR - desc PVDFCR - 0x4C1C - 8 - read-write - 0x11 - 0x77 - - - PVD1NFDIS - desc PVD1NFDIS - 0 - 0 - read-write - - - PVD1NFCKS - desc PVD1NFCKS - 2 - 1 - read-write - - - PVD2NFDIS - desc PVD2NFDIS - 4 - 4 - read-write - - - PVD2NFCKS - desc PVD2NFCKS - 6 - 5 - read-write - - - - - PVDLCR - desc PVDLCR - 0x4C20 - 8 - read-write - 0x0 - 0x77 - - - PVD1LVL - desc PVD1LVL - 2 - 0 - read-write - - - PVD2LVL - desc PVD2LVL - 6 - 4 - read-write - - - - - PDWKE0 - desc PDWKE0 - 0x4C28 - 8 - read-write - 0x0 - 0xFF - - - WKE00 - desc WKE00 - 0 - 0 - read-write - - - WKE01 - desc WKE01 - 1 - 1 - read-write - - - WKE02 - desc WKE02 - 2 - 2 - read-write - - - WKE03 - desc WKE03 - 3 - 3 - read-write - - - WKE10 - desc WKE10 - 4 - 4 - read-write - - - WKE11 - desc WKE11 - 5 - 5 - read-write - - - WKE12 - desc WKE12 - 6 - 6 - read-write - - - WKE13 - desc WKE13 - 7 - 7 - read-write - - - - - PDWKE1 - desc PDWKE1 - 0x4C2C - 8 - read-write - 0x0 - 0xFF - - - WKE20 - desc WKE20 - 0 - 0 - read-write - - - WKE21 - desc WKE21 - 1 - 1 - read-write - - - WKE22 - desc WKE22 - 2 - 2 - read-write - - - WKE23 - desc WKE23 - 3 - 3 - read-write - - - WKE30 - desc WKE30 - 4 - 4 - read-write - - - WKE31 - desc WKE31 - 5 - 5 - read-write - - - WKE32 - desc WKE32 - 6 - 6 - read-write - - - WKE33 - desc WKE33 - 7 - 7 - read-write - - - - - PDWKE2 - desc PDWKE2 - 0x4C30 - 8 - read-write - 0x0 - 0xF3 - - - VD1WKE - desc VD1WKE - 0 - 0 - read-write - - - VD2WKE - desc VD2WKE - 1 - 1 - read-write - - - RTCPRDWKE - desc RTCPRDWKE - 4 - 4 - read-write - - - RTCALMWKE - desc RTCALMWKE - 5 - 5 - read-write - - - WKTMWKE - desc WKTMWKE - 7 - 7 - read-write - - - - - PDWKES - desc PDWKES - 0x4C34 - 8 - read-write - 0x0 - 0x3F - - - WK0EGS - desc WK0EGS - 0 - 0 - read-write - - - WK1EGS - desc WK1EGS - 1 - 1 - read-write - - - WK2EGS - desc WK2EGS - 2 - 2 - read-write - - - WK3EGS - desc WK3EGS - 3 - 3 - read-write - - - VD1EGS - desc VD1EGS - 4 - 4 - read-write - - - VD2EGS - desc VD2EGS - 5 - 5 - read-write - - - - - PDWKF0 - desc PDWKF0 - 0x4C38 - 8 - read-write - 0x0 - 0x3F - - - PTWK0F - desc PTWK0F - 0 - 0 - read-write - - - PTWK1F - desc PTWK1F - 1 - 1 - read-write - - - PTWK2F - desc PTWK2F - 2 - 2 - read-write - - - PTWK3F - desc PTWK3F - 3 - 3 - read-write - - - VD1WKF - desc VD1WKF - 4 - 4 - read-write - - - VD2WKF - desc VD2WKF - 5 - 5 - read-write - - - - - PDWKF1 - desc PDWKF1 - 0x4C3C - 8 - read-write - 0x0 - 0xF8 - - - RXD0WKF - desc RXD0WKF - 3 - 3 - read-write - - - RTCPRDWKF - desc RTCPRDWKF - 4 - 4 - read-write - - - RTCALMWKF - desc RTCALMWKF - 5 - 5 - read-write - - - WKTMWKF - desc WKTMWKF - 7 - 7 - read-write - - - - - RAMPC0 - desc RAMPC0 - 0x4CE0 - 32 - read-write - 0x0 - 0x7FF - - - RAMPDC0 - desc RAMPDC0 - 0 - 0 - read-write - - - RAMPDC1 - desc RAMPDC1 - 1 - 1 - read-write - - - RAMPDC2 - desc RAMPDC2 - 2 - 2 - read-write - - - RAMPDC3 - desc RAMPDC3 - 3 - 3 - read-write - - - RAMPDC4 - desc RAMPDC4 - 4 - 4 - read-write - - - RAMPDC5 - desc RAMPDC5 - 5 - 5 - read-write - - - RAMPDC6 - desc RAMPDC6 - 6 - 6 - read-write - - - RAMPDC7 - desc RAMPDC7 - 7 - 7 - read-write - - - RAMPDC8 - desc RAMPDC8 - 8 - 8 - read-write - - - RAMPDC9 - desc RAMPDC9 - 9 - 9 - read-write - - - RAMPDC10 - desc RAMPDC10 - 10 - 10 - read-write - - - - - RAMOPM - desc RAMOPM - 0x4CE4 - 16 - read-write - 0x8043 - 0xFFFF - - - PRAMLPC - desc PRAMLPC - 0x4CE8 - 32 - read-write - 0x0 - 0x3FF - - - PRAMPDC0 - desc PRAMPDC0 - 0 - 0 - read-write - - - PRAMPDC1 - desc PRAMPDC1 - 1 - 1 - read-write - - - PRAMPDC2 - desc PRAMPDC2 - 2 - 2 - read-write - - - PRAMPDC3 - desc PRAMPDC3 - 3 - 3 - read-write - - - PRAMPDC4 - desc PRAMPDC4 - 4 - 4 - read-write - - - PRAMPDC5 - desc PRAMPDC5 - 5 - 5 - read-write - - - PRAMPDC6 - desc PRAMPDC6 - 6 - 6 - read-write - - - PRAMPDC7 - desc PRAMPDC7 - 7 - 7 - read-write - - - PRAMPDC8 - desc PRAMPDC8 - 8 - 8 - read-write - - - PRAMPDC9 - desc PRAMPDC9 - 9 - 9 - read-write - - - - - PVDICR - desc PVDICR - 0x4CF0 - 8 - read-write - 0x0 - 0x77 - - - PVD1NMIS - desc PVD1NMIS - 0 - 0 - read-write - - - PVD1EDGS - desc PVD1EDGS - 2 - 1 - read-write - - - PVD2NMIS - desc PVD2NMIS - 4 - 4 - read-write - - - PVD2EDGS - desc PVD2EDGS - 6 - 5 - read-write - - - - - PVDDSR - desc PVDDSR - 0x4CF4 - 8 - read-write - 0x11 - 0x33 - - - PVD1MON - desc PVD1MON - 0 - 0 - read-write - - - PVD1DETFLG - desc PVD1DETFLG - 1 - 1 - read-write - - - PVD2MON - desc PVD2MON - 4 - 4 - read-write - - - PVD2DETFLG - desc PVD2DETFLG - 5 - 5 - read-write - - - - - STPMCR - desc STPMCR - 0xC00C - 16 - read-write - 0x0 - 0xC003 - - - FLNWT - desc FLNWT - 0 - 0 - read-write - - - CKSMRC - desc CKSMRC - 1 - 1 - read-write - - - EXBUSOE - desc EXBUSOE - 14 - 14 - read-write - - - STOP - desc STOP - 15 - 15 - read-write - - - - - FPRC - desc FPRC - 0xC3FE - 16 - read-write - 0x0 - 0xFF0F - - - FPRCB0 - desc FPRCB0 - 0 - 0 - read-write - - - FPRCB1 - desc FPRCB1 - 1 - 1 - read-write - - - FPRCB2 - desc FPRCB2 - 2 - 2 - read-write - - - FPRCB3 - desc FPRCB3 - 3 - 3 - read-write - - - FPRCWE - desc FPRCWE - 15 - 8 - read-write - - - - - - - QSPI - desc QSPI - 0x9C000000 - - 0x0 - 0x808 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x3F0000 - 0x3F3FFF - - - MDSEL - desc MDSEL - 2 - 0 - read-write - - - PFE - desc PFE - 3 - 3 - read-write - - - PFSAE - desc PFSAE - 4 - 4 - read-write - - - DCOME - desc DCOME - 5 - 5 - read-write - - - XIPE - desc XIPE - 6 - 6 - read-write - - - SPIMD3 - desc SPIMD3 - 7 - 7 - read-write - - - IPRSL - desc IPRSL - 9 - 8 - read-write - - - APRSL - desc APRSL - 11 - 10 - read-write - - - DPRSL - desc DPRSL - 13 - 12 - read-write - - - DIV - desc DIV - 21 - 16 - read-write - - - - - CSCR - desc CSCR - 0x4 - 32 - read-write - 0xF - 0x3F - - - SSHW - desc SSHW - 3 - 0 - read-write - - - SSNW - desc SSNW - 5 - 4 - read-write - - - - - FCR - desc FCR - 0x8 - 32 - read-write - 0x80B3 - 0x8F77 - - - AWSL - desc AWSL - 1 - 0 - read-write - - - FOUR_BIC - desc FOUR_BIC - 2 - 2 - read-write - - - SSNHD - desc SSNHD - 4 - 4 - read-write - - - SSNLD - desc SSNLD - 5 - 5 - read-write - - - WPOL - desc WPOL - 6 - 6 - read-write - - - DMCYCN - desc DMCYCN - 11 - 8 - read-write - - - DUTY - desc DUTY - 15 - 15 - read-write - - - - - SR - desc SR - 0xC - 32 - read-write - 0x8000 - 0xDFC1 - - - BUSY - desc BUSY - 0 - 0 - read-write - - - XIPF - desc XIPF - 6 - 6 - read-write - - - RAER - desc RAER - 7 - 7 - read-write - - - PFNUM - desc PFNUM - 12 - 8 - read-write - - - PFFUL - desc PFFUL - 14 - 14 - read-write - - - PFAN - desc PFAN - 15 - 15 - read-write - - - - - DCOM - desc DCOM - 0x10 - 32 - read-write - 0x0 - 0xFF - - - DCOM - desc DCOM - 7 - 0 - read-write - - - - - CCMD - desc CCMD - 0x14 - 32 - read-write - 0x0 - 0xFF - - - RIC - desc RIC - 7 - 0 - read-write - - - - - XCMD - desc XCMD - 0x18 - 32 - read-write - 0xFF - 0xFF - - - XIPMC - desc XIPMC - 7 - 0 - read-write - - - - - SR2 - desc SR2 - 0x24 - 32 - write-only - 0x0 - 0x80 - - - RAERCLR - desc RAERCLR - 7 - 7 - write-only - - - - - EXAR - desc EXAR - 0x804 - 32 - read-write - 0x0 - 0xFC000000 - - - EXADR - desc EXADR - 31 - 26 - read-write - - - - - - - RMU - desc RMU - 0x4004CC00 - - 0x0 - 0x100 - - - - PRSTCR0 - desc PRSTCR0 - 0xF8 - 8 - read-write - 0x40 - 0x20 - - - LKUPREN - desc LKUPREN - 5 - 5 - read-write - - - - - RSTF0 - desc RSTF0 - 0xFC - 32 - read-write - 0x2 - 0xC0007FFF - - - PORF - desc PORF - 0 - 0 - read-write - - - PINRF - desc PINRF - 1 - 1 - read-write - - - BORF - desc BORF - 2 - 2 - read-write - - - PVD1RF - desc PVD1RF - 3 - 3 - read-write - - - PVD2RF - desc PVD2RF - 4 - 4 - read-write - - - WDRF - desc WDRF - 5 - 5 - read-write - - - SWDRF - desc SWDRF - 6 - 6 - read-write - - - PDRF - desc PDRF - 7 - 7 - read-write - - - SWRF - desc SWRF - 8 - 8 - read-write - - - MPUERF - desc MPUERF - 9 - 9 - read-write - - - RAPERF - desc RAPERF - 10 - 10 - read-write - - - RAECRF - desc RAECRF - 11 - 11 - read-write - - - CKFERF - desc CKFERF - 12 - 12 - read-write - - - XTALERF - desc XTALERF - 13 - 13 - read-write - - - LKUPRF - desc LKUPRF - 14 - 14 - read-write - - - MULTIRF - desc MULTIRF - 30 - 30 - read-write - - - CLRF - desc CLRF - 31 - 31 - read-write - - - - - - - RTC - desc RTC - 0x4004C000 - - 0x0 - 0x60 - - - - CR0 - desc CR0 - 0x0 - 8 - read-write - 0x0 - 0x1 - - - RESET - desc RESET - 0 - 0 - read-write - - - - - CR1 - desc CR1 - 0x4 - 8 - read-write - 0x0 - 0xEF - - - PRDS - desc PRDS - 2 - 0 - read-write - - - AMPM - desc AMPM - 3 - 3 - read-write - - - ONEHZOE - desc ONEHZOE - 5 - 5 - read-write - - - ONEHZSEL - desc ONEHZSEL - 6 - 6 - read-write - - - START - desc START - 7 - 7 - read-write - - - - - CR2 - desc CR2 - 0x8 - 8 - read-write - 0x0 - 0xEF - - - RWREQ - desc RWREQ - 0 - 0 - read-write - - - RWEN - desc RWEN - 1 - 1 - read-write - - - PRDF - desc PRDF - 2 - 2 - read-write - - - ALMF - desc ALMF - 3 - 3 - read-write - - - PRDIE - desc PRDIE - 5 - 5 - read-write - - - ALMIE - desc ALMIE - 6 - 6 - read-write - - - ALME - desc ALME - 7 - 7 - read-write - - - - - CR3 - desc CR3 - 0xC - 8 - read-write - 0x0 - 0x90 - - - LRCEN - desc LRCEN - 4 - 4 - read-write - - - RCKSEL - desc RCKSEL - 7 - 7 - read-write - - - - - SEC - desc SEC - 0x10 - 8 - read-write - 0x0 - 0x7F - - - SECU - desc SECU - 3 - 0 - read-write - - - SECD - desc SECD - 6 - 4 - read-write - - - - - MIN - desc MIN - 0x14 - 8 - read-write - 0x0 - 0x7F - - - MINU - desc MINU - 3 - 0 - read-write - - - MIND - desc MIND - 6 - 4 - read-write - - - - - HOUR - desc HOUR - 0x18 - 8 - read-write - 0x12 - 0x3F - - - HOURU - desc HOURU - 3 - 0 - read-write - - - HOURD - desc HOURD - 5 - 4 - read-write - - - - - WEEK - desc WEEK - 0x1C - 8 - read-write - 0x0 - 0x7 - - - WEEK - desc WEEK - 2 - 0 - read-write - - - - - DAY - desc DAY - 0x20 - 8 - read-write - 0x0 - 0x3F - - - DAYU - desc DAYU - 3 - 0 - read-write - - - DAYD - desc DAYD - 5 - 4 - read-write - - - - - MON - desc MON - 0x24 - 8 - read-write - 0x0 - 0x1F - - - MON - desc MON - 4 - 0 - read-write - - - - - YEAR - desc YEAR - 0x28 - 8 - read-write - 0x0 - 0xFF - - - YEARU - desc YEARU - 3 - 0 - read-write - - - YEARD - desc YEARD - 7 - 4 - read-write - - - - - ALMMIN - desc ALMMIN - 0x2C - 8 - read-write - 0x12 - 0x7F - - - ALMMINU - desc ALMMINU - 3 - 0 - read-write - - - ALMMIND - desc ALMMIND - 6 - 4 - read-write - - - - - ALMHOUR - desc ALMHOUR - 0x30 - 8 - read-write - 0x0 - 0x3F - - - ALMHOURU - desc ALMHOURU - 3 - 0 - read-write - - - ALMHOURD - desc ALMHOURD - 5 - 4 - read-write - - - - - ALMWEEK - desc ALMWEEK - 0x34 - 8 - read-write - 0x0 - 0x7F - - - ALMWEEK - desc ALMWEEK - 6 - 0 - read-write - - - - - ERRCRH - desc ERRCRH - 0x38 - 8 - read-write - 0x0 - 0x81 - - - COMP8 - desc COMP8 - 0 - 0 - read-write - - - COMPEN - desc COMPEN - 7 - 7 - read-write - - - - - ERRCRL - desc ERRCRL - 0x3C - 8 - read-write - 0x0 - 0xFF - - - COMP - desc COMP - 7 - 0 - read-write - - - - - TPCR0 - desc TPCR0 - 0x40 - 8 - read-write - 0x0 - 0xFF - - - TPCT0 - desc TPCT0 - 1 - 0 - read-write - - - TPNF0 - desc TPNF0 - 3 - 2 - read-write - - - TPRSTE0 - desc TPRSTE0 - 4 - 4 - read-write - - - TPIE0 - desc TPIE0 - 5 - 5 - read-write - - - TSTPE0 - desc TSTPE0 - 6 - 6 - read-write - - - TPEN0 - desc TPEN0 - 7 - 7 - read-write - - - - - TPCR1 - desc TPCR1 - 0x44 - 8 - read-write - 0x0 - 0xFF - - - TPCT1 - desc TPCT1 - 1 - 0 - read-write - - - TPNF1 - desc TPNF1 - 3 - 2 - read-write - - - TPRSTE1 - desc TPRSTE1 - 4 - 4 - read-write - - - TPIE1 - desc TPIE1 - 5 - 5 - read-write - - - TSTPE1 - desc TSTPE1 - 6 - 6 - read-write - - - TPEN1 - desc TPEN1 - 7 - 7 - read-write - - - - - TPSR - desc TPSR - 0x48 - 8 - read-write - 0x0 - 0x7 - - - TPF0 - desc TPF0 - 0 - 0 - read-write - - - TPF1 - desc TPF1 - 1 - 1 - read-write - - - TPOVF - desc TPOVF - 2 - 2 - read-write - - - - - SECTP - desc SECTP - 0x4C - 8 - read-write - 0x0 - 0x7F - - - SECTPU - desc SECTPU - 3 - 0 - read-write - - - SECTPD - desc SECTPD - 6 - 4 - read-write - - - - - MINTP - desc MINTP - 0x50 - 8 - read-write - 0x0 - 0x7F - - - MINTPU - desc MINTPU - 3 - 0 - read-write - - - MINTPD - desc MINTPD - 6 - 4 - read-write - - - - - HOURTP - desc HOURTP - 0x54 - 8 - read-write - 0x0 - 0x3F - - - HOURTPU - desc HOURTPU - 3 - 0 - read-write - - - HOURTPD - desc HOURTPD - 5 - 4 - read-write - - - - - DAYTP - desc DAYTP - 0x58 - 8 - read-write - 0x0 - 0x3F - - - DAYTPU - desc DAYTPU - 3 - 0 - read-write - - - DAYTPD - desc DAYTPD - 5 - 4 - read-write - - - - - MONTP - desc MONTP - 0x5C - 8 - read-write - 0x0 - 0x1F - - - MONTP - desc MONTP - 4 - 0 - read-write - - - - - - - SDIOC1 - desc SDIOC - 0x40070000 - - 0x0 - 0x54 - - - - BLKSIZE - desc BLKSIZE - 0x4 - 16 - read-write - 0x0 - 0xFFF - - - TBS - desc TBS - 11 - 0 - read-write - - - - - BLKCNT - desc BLKCNT - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - ARG0 - desc ARG0 - 0x8 - 16 - read-write - 0x0 - 0xFFFF - - - ARG1 - desc ARG1 - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - TRANSMODE - desc TRANSMODE - 0xC - 16 - read-write - 0x0 - 0x3E - - - BCE - desc BCE - 1 - 1 - read-write - - - ATCEN - desc ATCEN - 3 - 2 - read-write - - - DDIR - desc DDIR - 4 - 4 - read-write - - - MULB - desc MULB - 5 - 5 - read-write - - - - - CMD - desc CMD - 0xE - 16 - read-write - 0x0 - 0x3FFB - - - RESTYP - desc RESTYP - 1 - 0 - read-write - - - CCE - desc CCE - 3 - 3 - read-write - - - ICE - desc ICE - 4 - 4 - read-write - - - DAT - desc DAT - 5 - 5 - read-write - - - TYP - desc TYP - 7 - 6 - read-write - - - IDX - desc IDX - 13 - 8 - read-write - - - - - RESP0 - desc RESP0 - 0x10 - 16 - read-only - 0x0 - 0xFFFF - - - RESP1 - desc RESP1 - 0x12 - 16 - read-only - 0x0 - 0xFFFF - - - RESP2 - desc RESP2 - 0x14 - 16 - read-only - 0x0 - 0xFFFF - - - RESP3 - desc RESP3 - 0x16 - 16 - read-only - 0x0 - 0xFFFF - - - RESP4 - desc RESP4 - 0x18 - 16 - read-only - 0x0 - 0xFFFF - - - RESP5 - desc RESP5 - 0x1A - 16 - read-only - 0x0 - 0xFFFF - - - RESP6 - desc RESP6 - 0x1C - 16 - read-only - 0x0 - 0xFFFF - - - RESP7 - desc RESP7 - 0x1E - 16 - read-only - 0x0 - 0xFFFF - - - BUF0 - desc BUF0 - 0x20 - 16 - read-write - 0x0 - 0xFFFF - - - BUF1 - desc BUF1 - 0x22 - 16 - read-write - 0x0 - 0xFFFF - - - PSTAT - desc PSTAT - 0x24 - 32 - read-only - 0x0 - 0x1FF0F07 - - - CIC - desc CIC - 0 - 0 - read-only - - - CID - desc CID - 1 - 1 - read-only - - - DA - desc DA - 2 - 2 - read-only - - - WTA - desc WTA - 8 - 8 - read-only - - - RTA - desc RTA - 9 - 9 - read-only - - - BWE - desc BWE - 10 - 10 - read-only - - - BRE - desc BRE - 11 - 11 - read-only - - - CIN - desc CIN - 16 - 16 - read-only - - - CSS - desc CSS - 17 - 17 - read-only - - - CDL - desc CDL - 18 - 18 - read-only - - - WPL - desc WPL - 19 - 19 - read-only - - - DATL - desc DATL - 23 - 20 - read-only - - - CMDL - desc CMDL - 24 - 24 - read-only - - - - - HOSTCON - desc HOSTCON - 0x28 - 8 - read-write - 0x0 - 0xE6 - - - DW - desc DW - 1 - 1 - read-write - - - HSEN - desc HSEN - 2 - 2 - read-write - - - EXDW - desc EXDW - 5 - 5 - read-write - - - CDTL - desc CDTL - 6 - 6 - read-write - - - CDSS - desc CDSS - 7 - 7 - read-write - - - - - PWRCON - desc PWRCON - 0x29 - 8 - read-write - 0x0 - 0x1 - - - PWON - desc PWON - 0 - 0 - read-write - - - - - BLKGPCON - desc BLKGPCON - 0x2A - 8 - read-write - 0x0 - 0xF - - - SABGR - desc SABGR - 0 - 0 - read-write - - - CR - desc CR - 1 - 1 - read-write - - - RWC - desc RWC - 2 - 2 - read-write - - - IABG - desc IABG - 3 - 3 - read-write - - - - - CLKCON - desc CLKCON - 0x2C - 16 - read-write - 0x2 - 0xFF05 - - - ICE - desc ICE - 0 - 0 - read-write - - - CE - desc CE - 2 - 2 - read-write - - - FS - desc FS - 15 - 8 - read-write - - - - - TOUTCON - desc TOUTCON - 0x2E - 8 - read-write - 0x0 - 0xF - - - DTO - desc DTO - 3 - 0 - read-write - - - - - SFTRST - desc SFTRST - 0x2F - 8 - read-write - 0x0 - 0x7 - - - RSTA - desc RSTA - 0 - 0 - read-write - - - RSTC - desc RSTC - 1 - 1 - read-write - - - RSTD - desc RSTD - 2 - 2 - read-write - - - - - NORINTST - desc NORINTST - 0x30 - 16 - read-write - 0x0 - 0x81F7 - - - CC - desc CC - 0 - 0 - read-write - - - TC - desc TC - 1 - 1 - read-write - - - BGE - desc BGE - 2 - 2 - read-write - - - BWR - desc BWR - 4 - 4 - read-write - - - BRR - desc BRR - 5 - 5 - read-write - - - CIST - desc CIST - 6 - 6 - read-write - - - CRM - desc CRM - 7 - 7 - read-write - - - CINT - desc CINT - 8 - 8 - read-only - - - EI - desc EI - 15 - 15 - read-only - - - - - ERRINTST - desc ERRINTST - 0x32 - 16 - read-write - 0x0 - 0x17F - - - CTOE - desc CTOE - 0 - 0 - read-write - - - CCE - desc CCE - 1 - 1 - read-write - - - CEBE - desc CEBE - 2 - 2 - read-write - - - CIE - desc CIE - 3 - 3 - read-write - - - DTOE - desc DTOE - 4 - 4 - read-write - - - DCE - desc DCE - 5 - 5 - read-write - - - DEBE - desc DEBE - 6 - 6 - read-write - - - ACE - desc ACE - 8 - 8 - read-write - - - - - NORINTSTEN - desc NORINTSTEN - 0x34 - 16 - read-write - 0x0 - 0x1F7 - - - CCEN - desc CCEN - 0 - 0 - read-write - - - TCEN - desc TCEN - 1 - 1 - read-write - - - BGEEN - desc BGEEN - 2 - 2 - read-write - - - BWREN - desc BWREN - 4 - 4 - read-write - - - BRREN - desc BRREN - 5 - 5 - read-write - - - CISTEN - desc CISTEN - 6 - 6 - read-write - - - CRMEN - desc CRMEN - 7 - 7 - read-write - - - CINTEN - desc CINTEN - 8 - 8 - read-write - - - - - ERRINTSTEN - desc ERRINTSTEN - 0x36 - 16 - read-write - 0x0 - 0x17F - - - CTOEEN - desc CTOEEN - 0 - 0 - read-write - - - CCEEN - desc CCEEN - 1 - 1 - read-write - - - CEBEEN - desc CEBEEN - 2 - 2 - read-write - - - CIEEN - desc CIEEN - 3 - 3 - read-write - - - DTOEEN - desc DTOEEN - 4 - 4 - read-write - - - DCEEN - desc DCEEN - 5 - 5 - read-write - - - DEBEEN - desc DEBEEN - 6 - 6 - read-write - - - ACEEN - desc ACEEN - 8 - 8 - read-write - - - - - NORINTSGEN - desc NORINTSGEN - 0x38 - 16 - read-write - 0x0 - 0x1F7 - - - CCSEN - desc CCSEN - 0 - 0 - read-write - - - TCSEN - desc TCSEN - 1 - 1 - read-write - - - BGESEN - desc BGESEN - 2 - 2 - read-write - - - BWRSEN - desc BWRSEN - 4 - 4 - read-write - - - BRRSEN - desc BRRSEN - 5 - 5 - read-write - - - CISTSEN - desc CISTSEN - 6 - 6 - read-write - - - CRMSEN - desc CRMSEN - 7 - 7 - read-write - - - CINTSEN - desc CINTSEN - 8 - 8 - read-write - - - - - ERRINTSGEN - desc ERRINTSGEN - 0x3A - 16 - read-write - 0x0 - 0x17F - - - CTOESEN - desc CTOESEN - 0 - 0 - read-write - - - CCESEN - desc CCESEN - 1 - 1 - read-write - - - CEBESEN - desc CEBESEN - 2 - 2 - read-write - - - CIESEN - desc CIESEN - 3 - 3 - read-write - - - DTOESEN - desc DTOESEN - 4 - 4 - read-write - - - DCESEN - desc DCESEN - 5 - 5 - read-write - - - DEBESEN - desc DEBESEN - 6 - 6 - read-write - - - ACESEN - desc ACESEN - 8 - 8 - read-write - - - - - ATCERRST - desc ATCERRST - 0x3C - 16 - read-only - 0x0 - 0x9F - - - NE - desc NE - 0 - 0 - read-only - - - TOE - desc TOE - 1 - 1 - read-only - - - CE - desc CE - 2 - 2 - read-only - - - EBE - desc EBE - 3 - 3 - read-only - - - IE - desc IE - 4 - 4 - read-only - - - CMDE - desc CMDE - 7 - 7 - read-only - - - - - FEA - desc FEA - 0x50 - 16 - write-only - 0x0 - 0x9F - - - FNE - desc FNE - 0 - 0 - write-only - - - FTOE - desc FTOE - 1 - 1 - write-only - - - FCE - desc FCE - 2 - 2 - write-only - - - FEBE - desc FEBE - 3 - 3 - write-only - - - FIE - desc FIE - 4 - 4 - write-only - - - FCMDE - desc FCMDE - 7 - 7 - write-only - - - - - FEE - desc FEE - 0x52 - 16 - write-only - 0x0 - 0x17F - - - FCTOE - desc FCTOE - 0 - 0 - write-only - - - FCCE - desc FCCE - 1 - 1 - write-only - - - FCEBE - desc FCEBE - 2 - 2 - write-only - - - FCIE - desc FCIE - 3 - 3 - write-only - - - FDTOE - desc FDTOE - 4 - 4 - write-only - - - FDCE - desc FDCE - 5 - 5 - write-only - - - FDEBE - desc FDEBE - 6 - 6 - write-only - - - FACE - desc FACE - 8 - 8 - write-only - - - - - - - SDIOC2 - desc SDIOC - 0x40078400 - - 0x0 - 0x54 - - - - SMC - desc SMC - 0x88000000 - - 0x0 - 0x210 - - - - STSR - desc STSR - 0x0 - 32 - read-only - 0x1 - 0x1 - - - STATUS - desc STATUS - 0 - 0 - read-only - - - - - STCR0 - desc STCR0 - 0x8 - 32 - write-only - 0x0 - 0x4 - - - LPWIR - desc LPWIR - 2 - 2 - write-only - - - - - STCR1 - desc STCR1 - 0xC - 32 - write-only - 0x0 - 0x4 - - - LPWOR - desc LPWOR - 2 - 2 - write-only - - - - - CMDR - desc CMDR - 0x10 - 32 - write-only - 0x0 - 0x3FFFFFF - - - CMDADD - desc CMDADD - 19 - 0 - write-only - - - CRES - desc CRES - 20 - 20 - write-only - - - CMD - desc CMD - 22 - 21 - write-only - - - CMDCHIP - desc CMDCHIP - 25 - 23 - write-only - - - - - TMCR - desc TMCR - 0x14 - 32 - write-only - 0x0 - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - write-only - - - T_WC - desc T_WC - 7 - 4 - write-only - - - T_CEOE - desc T_CEOE - 10 - 8 - write-only - - - T_WP - desc T_WP - 14 - 12 - write-only - - - T_PC - desc T_PC - 18 - 16 - write-only - - - T_TR - desc T_TR - 22 - 20 - write-only - - - - - CPCR - desc CPCR - 0x18 - 32 - write-only - 0x0 - 0x1FFF - - - RSYN - desc RSYN - 0 - 0 - write-only - - - RBL - desc RBL - 3 - 1 - write-only - - - WSYN - desc WSYN - 4 - 4 - write-only - - - WBL - desc WBL - 7 - 5 - write-only - - - MW - desc MW - 9 - 8 - write-only - - - BAAS - desc BAAS - 10 - 10 - write-only - - - ADVS - desc ADVS - 11 - 11 - write-only - - - BLSS - desc BLSS - 12 - 12 - write-only - - - - - RFTR - desc RFTR - 0x20 - 32 - read-write - 0x0 - 0xF - - - REFPRD - desc REFPRD - 3 - 0 - read-write - - - - - TMSR0 - desc TMSR0 - 0x100 - 32 - read-only - 0x1263CC - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - read-only - - - T_WC - desc T_WC - 7 - 4 - read-only - - - T_CEOE - desc T_CEOE - 10 - 8 - read-only - - - T_WP - desc T_WP - 14 - 12 - read-only - - - T_PC - desc T_PC - 18 - 16 - read-only - - - T_TR - desc T_TR - 22 - 20 - read-only - - - - - CPSR0 - desc CPSR0 - 0x104 - 32 - read-only - 0xFF0A00 - 0xFFFF1FFF - - - RSYN - desc RSYN - 0 - 0 - read-only - - - RBL - desc RBL - 3 - 1 - read-only - - - WSYN - desc WSYN - 4 - 4 - read-only - - - WBL - desc WBL - 7 - 5 - read-only - - - MW - desc MW - 9 - 8 - read-only - - - BAAS - desc BAAS - 10 - 10 - read-only - - - ADVS - desc ADVS - 11 - 11 - read-only - - - BLSS - desc BLSS - 12 - 12 - read-only - - - ADDMSK - desc ADDMSK - 23 - 16 - read-only - - - ADDMAT - desc ADDMAT - 31 - 24 - read-only - - - - - TMSR1 - desc TMSR1 - 0x120 - 32 - read-only - 0x1263CC - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - read-only - - - T_WC - desc T_WC - 7 - 4 - read-only - - - T_CEOE - desc T_CEOE - 10 - 8 - read-only - - - T_WP - desc T_WP - 14 - 12 - read-only - - - T_PC - desc T_PC - 18 - 16 - read-only - - - T_TR - desc T_TR - 22 - 20 - read-only - - - - - CPSR1 - desc CPSR1 - 0x124 - 32 - read-only - 0xFF0A00 - 0xFFFF1FFF - - - RSYN - desc RSYN - 0 - 0 - read-only - - - RBL - desc RBL - 3 - 1 - read-only - - - WSYN - desc WSYN - 4 - 4 - read-only - - - WBL - desc WBL - 7 - 5 - read-only - - - MW - desc MW - 9 - 8 - read-only - - - BAAS - desc BAAS - 10 - 10 - read-only - - - ADVS - desc ADVS - 11 - 11 - read-only - - - BLSS - desc BLSS - 12 - 12 - read-only - - - ADDMSK - desc ADDMSK - 23 - 16 - read-only - - - ADDMAT - desc ADDMAT - 31 - 24 - read-only - - - - - TMSR2 - desc TMSR2 - 0x140 - 32 - read-only - 0x1263CC - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - read-only - - - T_WC - desc T_WC - 7 - 4 - read-only - - - T_CEOE - desc T_CEOE - 10 - 8 - read-only - - - T_WP - desc T_WP - 14 - 12 - read-only - - - T_PC - desc T_PC - 18 - 16 - read-only - - - T_TR - desc T_TR - 22 - 20 - read-only - - - - - CPSR2 - desc CPSR2 - 0x144 - 32 - read-only - 0xFF0A00 - 0xFFFF1FFF - - - RSYN - desc RSYN - 0 - 0 - read-only - - - RBL - desc RBL - 3 - 1 - read-only - - - WSYN - desc WSYN - 4 - 4 - read-only - - - WBL - desc WBL - 7 - 5 - read-only - - - MW - desc MW - 9 - 8 - read-only - - - BAAS - desc BAAS - 10 - 10 - read-only - - - ADVS - desc ADVS - 11 - 11 - read-only - - - BLSS - desc BLSS - 12 - 12 - read-only - - - ADDMSK - desc ADDMSK - 23 - 16 - read-only - - - ADDMAT - desc ADDMAT - 31 - 24 - read-only - - - - - TMSR3 - desc TMSR3 - 0x160 - 32 - read-only - 0x1263CC - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - read-only - - - T_WC - desc T_WC - 7 - 4 - read-only - - - T_CEOE - desc T_CEOE - 10 - 8 - read-only - - - T_WP - desc T_WP - 14 - 12 - read-only - - - T_PC - desc T_PC - 18 - 16 - read-only - - - T_TR - desc T_TR - 22 - 20 - read-only - - - - - CPSR3 - desc CPSR3 - 0x164 - 32 - read-only - 0xFF0A00 - 0xFFFF1FFF - - - RSYN - desc RSYN - 0 - 0 - read-only - - - RBL - desc RBL - 3 - 1 - read-only - - - WSYN - desc WSYN - 4 - 4 - read-only - - - WBL - desc WBL - 7 - 5 - read-only - - - MW - desc MW - 9 - 8 - read-only - - - BAAS - desc BAAS - 10 - 10 - read-only - - - ADVS - desc ADVS - 11 - 11 - read-only - - - BLSS - desc BLSS - 12 - 12 - read-only - - - ADDMSK - desc ADDMSK - 23 - 16 - read-only - - - ADDMAT - desc ADDMAT - 31 - 24 - read-only - - - - - BACR - desc BACR - 0x200 - 32 - read-write - 0x300 - 0xC010 - - - MUXMD - desc MUXMD - 4 - 4 - read-write - - - CKSEL - desc CKSEL - 15 - 14 - read-write - - - - - CSCR0 - desc CSCR0 - 0x208 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDMSK0 - desc ADDMSK0 - 7 - 0 - read-write - - - ADDMSK1 - desc ADDMSK1 - 15 - 8 - read-write - - - ADDMSK2 - desc ADDMSK2 - 23 - 16 - read-write - - - ADDMSK3 - desc ADDMSK3 - 31 - 24 - read-write - - - - - CSCR1 - desc CSCR1 - 0x20C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - ADDMAT0 - desc ADDMAT0 - 7 - 0 - read-write - - - ADDMAT1 - desc ADDMAT1 - 15 - 8 - read-write - - - ADDMAT2 - desc ADDMAT2 - 23 - 16 - read-write - - - ADDMAT3 - desc ADDMAT3 - 31 - 24 - read-write - - - - - - - SPI1 - desc SPI - 0x4001C000 - - 0x0 - 0x1C - - - - DR - desc DR - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CR1 - desc CR1 - 0x4 - 32 - read-write - 0x0 - 0xFFFB - - - SPIMDS - desc SPIMDS - 0 - 0 - read-write - - - TXMDS - desc TXMDS - 1 - 1 - read-write - - - MSTR - desc MSTR - 3 - 3 - read-write - - - SPLPBK - desc SPLPBK - 4 - 4 - read-write - - - SPLPBK2 - desc SPLPBK2 - 5 - 5 - read-write - - - SPE - desc SPE - 6 - 6 - read-write - - - CSUSPE - desc CSUSPE - 7 - 7 - read-write - - - EIE - desc EIE - 8 - 8 - read-write - - - TXIE - desc TXIE - 9 - 9 - read-write - - - RXIE - desc RXIE - 10 - 10 - read-write - - - IDIE - desc IDIE - 11 - 11 - read-write - - - MODFE - desc MODFE - 12 - 12 - read-write - - - PATE - desc PATE - 13 - 13 - read-write - - - PAOE - desc PAOE - 14 - 14 - read-write - - - PAE - desc PAE - 15 - 15 - read-write - - - - - CFG1 - desc CFG1 - 0xC - 32 - read-write - 0x10 - 0x77700F43 - - - FTHLV - desc FTHLV - 1 - 0 - read-write - - - SPRDTD - desc SPRDTD - 6 - 6 - read-write - - - SS0PV - desc SS0PV - 8 - 8 - read-write - - - SS1PV - desc SS1PV - 9 - 9 - read-write - - - SS2PV - desc SS2PV - 10 - 10 - read-write - - - SS3PV - desc SS3PV - 11 - 11 - read-write - - - MSSI - desc MSSI - 22 - 20 - read-write - - - MSSDL - desc MSSDL - 26 - 24 - read-write - - - MIDI - desc MIDI - 30 - 28 - read-write - - - - - SR - desc SR - 0x14 - 32 - read-write - 0x20 - 0xBF - - - OVRERF - desc OVRERF - 0 - 0 - read-write - - - IDLNF - desc IDLNF - 1 - 1 - read-only - - - MODFERF - desc MODFERF - 2 - 2 - read-write - - - PERF - desc PERF - 3 - 3 - read-write - - - UDRERF - desc UDRERF - 4 - 4 - read-write - - - TDEF - desc TDEF - 5 - 5 - read-only - - - RDFF - desc RDFF - 7 - 7 - read-only - - - - - CFG2 - desc CFG2 - 0x18 - 32 - read-write - 0xF1D - 0xFFFF - - - CPHA - desc CPHA - 0 - 0 - read-write - - - CPOL - desc CPOL - 1 - 1 - read-write - - - MBR - desc MBR - 4 - 2 - read-write - - - SSA - desc SSA - 7 - 5 - read-write - - - DSIZE - desc DSIZE - 11 - 8 - read-write - - - LSBF - desc LSBF - 12 - 12 - read-write - - - MIDIE - desc MIDIE - 13 - 13 - read-write - - - MSSDLE - desc MSSDLE - 14 - 14 - read-write - - - MSSIE - desc MSSIE - 15 - 15 - read-write - - - - - - - SPI2 - desc SPI - 0x4001C400 - - 0x0 - 0x1C - - - - SPI3 - desc SPI - 0x4001C800 - - 0x0 - 0x1C - - - - SPI4 - desc SPI - 0x40020000 - - 0x0 - 0x1C - - - - SPI5 - desc SPI - 0x40020400 - - 0x0 - 0x1C - - - - SPI6 - desc SPI - 0x40020800 - - 0x0 - 0x1C - - - - SRAMC - desc SRAMC - 0x40050800 - - 0x0 - 0x14 - - - - WTCR - desc WTCR - 0x0 - 32 - read-write - 0x0 - 0x77777777 - - - SRAM123RWT - desc SRAM123RWT - 2 - 0 - read-write - - - SRAM123WWT - desc SRAM123WWT - 6 - 4 - read-write - - - SRAM4RWT - desc SRAM4RWT - 10 - 8 - read-write - - - SRAM4WWT - desc SRAM4WWT - 14 - 12 - read-write - - - SRAMHRWT - desc SRAMHRWT - 18 - 16 - read-write - - - SRAMHWWT - desc SRAMHWWT - 22 - 20 - read-write - - - SRAMBRWT - desc SRAMBRWT - 26 - 24 - read-write - - - SRAMBWWT - desc SRAMBWWT - 30 - 28 - read-write - - - - - WTPR - desc WTPR - 0x4 - 32 - read-write - 0x0 - 0xFF - - - WTPRC - desc WTPRC - 0 - 0 - read-write - - - WTPRKW - desc WTPRKW - 7 - 1 - read-write - - - - - CKCR - desc CKCR - 0x8 - 32 - read-write - 0x0 - 0xF030001 - - - PYOAD - desc PYOAD - 0 - 0 - read-write - - - ECCOAD - desc ECCOAD - 16 - 16 - read-write - - - BECCOAD - desc BECCOAD - 17 - 17 - read-write - - - ECCMOD - desc ECCMOD - 25 - 24 - read-write - - - BECCMOD - desc BECCMOD - 27 - 26 - read-write - - - - - CKPR - desc CKPR - 0xC - 32 - read-write - 0x0 - 0xFF - - - CKPRC - desc CKPRC - 0 - 0 - read-write - - - CKPRKW - desc CKPRKW - 7 - 1 - read-write - - - - - CKSR - desc CKSR - 0x10 - 32 - read-write - 0x0 - 0x1FF - - - SRAM1_PYERR - desc SRAM1_PYERR - 0 - 0 - read-write - - - SRAM2_PYERR - desc SRAM2_PYERR - 1 - 1 - read-write - - - SRAM3_PYERR - desc SRAM3_PYERR - 2 - 2 - read-write - - - SRAMH_PYERR - desc SRAMH_PYERR - 3 - 3 - read-write - - - SRAM4_1ERR - desc SRAM4_1ERR - 4 - 4 - read-write - - - SRAM4_2ERR - desc SRAM4_2ERR - 5 - 5 - read-write - - - SRAMB_1ERR - desc SRAMB_1ERR - 6 - 6 - read-write - - - SRAMB_2ERR - desc SRAMB_2ERR - 7 - 7 - read-write - - - CACHE_PYERR - desc CACHE_PYERR - 8 - 8 - read-write - - - - - - - SWDT - desc SWDT - 0x40049400 - - 0x0 - 0xC - - - - CR - desc CR - 0x0 - 32 - read-write - 0x80010FF3 - 0x80010FF3 - - - PERI - desc PERI - 1 - 0 - read-write - - - CKS - desc CKS - 7 - 4 - read-write - - - WDPT - desc WDPT - 11 - 8 - read-write - - - SLPOFF - desc SLPOFF - 16 - 16 - read-write - - - ITS - desc ITS - 31 - 31 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-write - 0x0 - 0x3FFFF - - - CNT - desc CNT - 15 - 0 - read-only - - - UDF - desc UDF - 16 - 16 - read-write - - - REF - desc REF - 17 - 17 - read-write - - - - - RR - desc RR - 0x8 - 32 - read-write - 0x0 - 0xFFFF - - - RF - desc RF - 15 - 0 - read-write - - - - - - - TMR01 - desc TMR0 - 0x40024000 - - 0x0 - 0x18 - - - - CNTAR - desc CNTAR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - CNTA - desc CNTA - 15 - 0 - read-write - - - - - CNTBR - desc CNTBR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - CNTB - desc CNTB - 15 - 0 - read-write - - - - - CMPAR - desc CMPAR - 0x8 - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPA - desc CMPA - 15 - 0 - read-write - - - - - CMPBR - desc CMPBR - 0xC - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPB - desc CMPB - 15 - 0 - read-write - - - - - BCONR - desc BCONR - 0x10 - 32 - read-write - 0x0 - 0xF7F7F7F7 - - - CSTA - desc CSTA - 0 - 0 - read-write - - - CAPMDA - desc CAPMDA - 1 - 1 - read-write - - - INTENA - desc INTENA - 2 - 2 - read-write - - - CKDIVA - desc CKDIVA - 7 - 4 - read-write - - - SYNSA - desc SYNSA - 8 - 8 - read-write - - - SYNCLKA - desc SYNCLKA - 9 - 9 - read-write - - - ASYNCLKA - desc ASYNCLKA - 10 - 10 - read-write - - - HSTAA - desc HSTAA - 12 - 12 - read-write - - - HSTPA - desc HSTPA - 13 - 13 - read-write - - - HCLEA - desc HCLEA - 14 - 14 - read-write - - - HICPA - desc HICPA - 15 - 15 - read-write - - - CSTB - desc CSTB - 16 - 16 - read-write - - - CAPMDB - desc CAPMDB - 17 - 17 - read-write - - - INTENB - desc INTENB - 18 - 18 - read-write - - - CKDIVB - desc CKDIVB - 23 - 20 - read-write - - - SYNSB - desc SYNSB - 24 - 24 - read-write - - - SYNCLKB - desc SYNCLKB - 25 - 25 - read-write - - - ASYNCLKB - desc ASYNCLKB - 26 - 26 - read-write - - - HSTAB - desc HSTAB - 28 - 28 - read-write - - - HSTPB - desc HSTPB - 29 - 29 - read-write - - - HCLEB - desc HCLEB - 30 - 30 - read-write - - - HICPB - desc HICPB - 31 - 31 - read-write - - - - - STFLR - desc STFLR - 0x14 - 32 - read-write - 0x0 - 0x10001 - - - CMFA - desc CMFA - 0 - 0 - read-write - - - CMFB - desc CMFB - 16 - 16 - read-write - - - - - - - TMR02 - desc TMR0 - 0x40024400 - - 0x0 - 0x18 - - - - TMR21 - desc TMR2 - 0x40024800 - - 0x0 - 0x24 - - - - CNTAR - desc CNTAR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - CNTA - desc CNTA - 15 - 0 - read-write - - - - - CNTBR - desc CNTBR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - CNTB - desc CNTB - 15 - 0 - read-write - - - - - CMPAR - desc CMPAR - 0x8 - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPA - desc CMPA - 15 - 0 - read-write - - - - - CMPBR - desc CMPBR - 0xC - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPB - desc CMPB - 15 - 0 - read-write - - - - - BCONR - desc BCONR - 0x10 - 32 - read-write - 0x0 - 0x3FFB3FFB - - - CSTA - desc CSTA - 0 - 0 - read-write - - - CAPMDA - desc CAPMDA - 1 - 1 - read-write - - - SYNSA - desc SYNSA - 3 - 3 - read-write - - - CKDIVA - desc CKDIVA - 7 - 4 - read-write - - - SYNCLKA - desc SYNCLKA - 9 - 8 - read-write - - - ASYNCLKA - desc ASYNCLKA - 11 - 10 - read-write - - - SYNCLKAT - desc SYNCLKAT - 13 - 12 - read-write - - - CSTB - desc CSTB - 16 - 16 - read-write - - - CAPMDB - desc CAPMDB - 17 - 17 - read-write - - - SYNSB - desc SYNSB - 19 - 19 - read-write - - - CKDIVB - desc CKDIVB - 23 - 20 - read-write - - - SYNCLKB - desc SYNCLKB - 25 - 24 - read-write - - - ASYNCLKB - desc ASYNCLKB - 27 - 26 - read-write - - - SYNCLKBT - desc SYNCLKBT - 29 - 28 - read-write - - - - - ICONR - desc ICONR - 0x14 - 32 - read-write - 0x0 - 0x30003 - - - CMENA - desc CMENA - 0 - 0 - read-write - - - OVENA - desc OVENA - 1 - 1 - read-write - - - CMENB - desc CMENB - 16 - 16 - read-write - - - OVENB - desc OVENB - 17 - 17 - read-write - - - - - PCONR - desc PCONR - 0x18 - 32 - read-write - 0x0 - 0x713F713F - - - STACA - desc STACA - 1 - 0 - read-write - - - STPCA - desc STPCA - 3 - 2 - read-write - - - CMPCA - desc CMPCA - 5 - 4 - read-write - - - OUTENA - desc OUTENA - 8 - 8 - read-write - - - NOFIENA - desc NOFIENA - 12 - 12 - read-write - - - NOFICKA - desc NOFICKA - 14 - 13 - read-write - - - STACB - desc STACB - 17 - 16 - read-write - - - STPCB - desc STPCB - 19 - 18 - read-write - - - CMPCB - desc CMPCB - 21 - 20 - read-write - - - OUTENB - desc OUTENB - 24 - 24 - read-write - - - NOFIENB - desc NOFIENB - 28 - 28 - read-write - - - NOFICKB - desc NOFICKB - 30 - 29 - read-write - - - - - HCONR - desc HCONR - 0x1C - 32 - read-write - 0x0 - 0x77777777 - - - HSTAA0 - desc HSTAA0 - 0 - 0 - read-write - - - HSTAA1 - desc HSTAA1 - 1 - 1 - read-write - - - HSTAA2 - desc HSTAA2 - 2 - 2 - read-write - - - HSTPA0 - desc HSTPA0 - 4 - 4 - read-write - - - HSTPA1 - desc HSTPA1 - 5 - 5 - read-write - - - HSTPA2 - desc HSTPA2 - 6 - 6 - read-write - - - HCLEA0 - desc HCLEA0 - 8 - 8 - read-write - - - HCLEA1 - desc HCLEA1 - 9 - 9 - read-write - - - HCLEA2 - desc HCLEA2 - 10 - 10 - read-write - - - HICPA0 - desc HICPA0 - 12 - 12 - read-write - - - HICPA1 - desc HICPA1 - 13 - 13 - read-write - - - HICPA2 - desc HICPA2 - 14 - 14 - read-write - - - HSTAB0 - desc HSTAB0 - 16 - 16 - read-write - - - HSTAB1 - desc HSTAB1 - 17 - 17 - read-write - - - HSTAB2 - desc HSTAB2 - 18 - 18 - read-write - - - HSTPB0 - desc HSTPB0 - 20 - 20 - read-write - - - HSTPB1 - desc HSTPB1 - 21 - 21 - read-write - - - HSTPB2 - desc HSTPB2 - 22 - 22 - read-write - - - HCLEB0 - desc HCLEB0 - 24 - 24 - read-write - - - HCLEB1 - desc HCLEB1 - 25 - 25 - read-write - - - HCLEB2 - desc HCLEB2 - 26 - 26 - read-write - - - HICPB0 - desc HICPB0 - 28 - 28 - read-write - - - HICPB1 - desc HICPB1 - 29 - 29 - read-write - - - HICPB2 - desc HICPB2 - 30 - 30 - read-write - - - - - STFLR - desc STFLR - 0x20 - 32 - read-write - 0x0 - 0x1030003 - - - CMFA - desc CMFA - 0 - 0 - read-write - - - OVFA - desc OVFA - 1 - 1 - read-write - - - CMFB - desc CMFB - 16 - 16 - read-write - - - OVFB - desc OVFB - 17 - 17 - read-write - - - - - - - TMR22 - desc TMR2 - 0x40024C00 - - 0x0 - 0x24 - - - - TMR23 - desc TMR2 - 0x40025000 - - 0x0 - 0x24 - - - - TMR24 - desc TMR2 - 0x40025400 - - 0x0 - 0x24 - - - - TMR41 - desc TMR4 - 0x40038000 - - 0x0 - 0xE6 - - - - OCCRUH - desc OCCRUH - 0x2 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRUL - desc OCCRUL - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRVH - desc OCCRVH - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - OCCRVL - desc OCCRVL - 0xE - 16 - read-write - 0x0 - 0xFFFF - - - OCCRWH - desc OCCRWH - 0x12 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRWL - desc OCCRWL - 0x16 - 16 - read-write - 0x0 - 0xFFFF - - - OCSRU - desc OCSRU - 0x18 - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERU - desc OCERU - 0x1A - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCSRV - desc OCSRV - 0x1C - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERV - desc OCERV - 0x1E - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCSRW - desc OCSRW - 0x20 - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERW - desc OCERW - 0x22 - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCMRHUH - desc OCMRHUH - 0x24 - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLUL - desc OCMRLUL - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - OCMRHVH - desc OCMRHVH - 0x2C - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLVL - desc OCMRLVL - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - OCMRHWH - desc OCMRHWH - 0x34 - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLWL - desc OCMRLWL - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - CPSR - desc CPSR - 0x42 - 16 - read-write - 0xFFFF - 0xFFFF - - - CNTR - desc CNTR - 0x46 - 16 - read-write - 0x0 - 0xFFFF - - - CCSR - desc CCSR - 0x48 - 16 - read-write - 0x40 - 0xE3FF - - - CKDIV - desc CKDIV - 3 - 0 - read-write - - - CLEAR - desc CLEAR - 4 - 4 - read-write - - - MODE - desc MODE - 5 - 5 - read-write - - - STOP - desc STOP - 6 - 6 - read-write - - - BUFEN - desc BUFEN - 7 - 7 - read-write - - - IRQPEN - desc IRQPEN - 8 - 8 - read-write - - - IRQPF - desc IRQPF - 9 - 9 - read-write - - - IRQZEN - desc IRQZEN - 13 - 13 - read-write - - - IRQZF - desc IRQZF - 14 - 14 - read-write - - - ECKEN - desc ECKEN - 15 - 15 - read-write - - - - - CVPR - desc CVPR - 0x4A - 16 - read-write - 0x0 - 0xFFFF - - - ZIM - desc ZIM - 3 - 0 - read-write - - - PIM - desc PIM - 7 - 4 - read-write - - - ZIC - desc ZIC - 11 - 8 - read-only - - - PIC - desc PIC - 15 - 12 - read-only - - - - - PFSRU - desc PFSRU - 0x82 - 16 - read-write - 0x0 - 0xFFFF - - - PDARU - desc PDARU - 0x84 - 16 - read-write - 0x0 - 0xFFFF - - - PDBRU - desc PDBRU - 0x86 - 16 - read-write - 0x0 - 0xFFFF - - - PFSRV - desc PFSRV - 0x8A - 16 - read-write - 0x0 - 0xFFFF - - - PDARV - desc PDARV - 0x8C - 16 - read-write - 0x0 - 0xFFFF - - - PDBRV - desc PDBRV - 0x8E - 16 - read-write - 0x0 - 0xFFFF - - - PFSRW - desc PFSRW - 0x92 - 16 - read-write - 0x0 - 0xFFFF - - - PDARW - desc PDARW - 0x94 - 16 - read-write - 0x0 - 0xFFFF - - - PDBRW - desc PDBRW - 0x96 - 16 - read-write - 0x0 - 0xFFFF - - - POCRU - desc POCRU - 0x98 - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - POCRV - desc POCRV - 0x9C - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - POCRW - desc POCRW - 0xA0 - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - RCSR - desc RCSR - 0xA4 - 16 - read-write - 0x0 - 0xFFF7 - - - RTIDU - desc RTIDU - 0 - 0 - read-write - - - RTIDV - desc RTIDV - 1 - 1 - read-write - - - RTIDW - desc RTIDW - 2 - 2 - read-write - - - RTIFU - desc RTIFU - 4 - 4 - read-only - - - RTICU - desc RTICU - 5 - 5 - read-write - - - RTEU - desc RTEU - 6 - 6 - read-write - - - RTSU - desc RTSU - 7 - 7 - read-write - - - RTIFV - desc RTIFV - 8 - 8 - read-only - - - RTICV - desc RTICV - 9 - 9 - read-write - - - RTEV - desc RTEV - 10 - 10 - read-write - - - RTSV - desc RTSV - 11 - 11 - read-write - - - RTIFW - desc RTIFW - 12 - 12 - read-only - - - RTICW - desc RTICW - 13 - 13 - read-write - - - RTEW - desc RTEW - 14 - 14 - read-write - - - RTSW - desc RTSW - 15 - 15 - read-write - - - - - SCCRUH - desc SCCRUH - 0xB2 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRUL - desc SCCRUL - 0xB6 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRVH - desc SCCRVH - 0xBA - 16 - read-write - 0x0 - 0xFFFF - - - SCCRVL - desc SCCRVL - 0xBE - 16 - read-write - 0x0 - 0xFFFF - - - SCCRWH - desc SCCRWH - 0xC2 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRWL - desc SCCRWL - 0xC6 - 16 - read-write - 0x0 - 0xFFFF - - - SCSRUH - desc SCSRUH - 0xC8 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRUH - desc SCMRUH - 0xCA - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRUL - desc SCSRUL - 0xCC - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRUL - desc SCMRUL - 0xCE - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRVH - desc SCSRVH - 0xD0 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRVH - desc SCMRVH - 0xD2 - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRVL - desc SCSRVL - 0xD4 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRVL - desc SCMRVL - 0xD6 - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRWH - desc SCSRWH - 0xD8 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRWH - desc SCMRWH - 0xDA - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRWL - desc SCSRWL - 0xDC - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRWL - desc SCMRWL - 0xDE - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - PSCR - desc PSCR - 0xE0 - 32 - read-write - 0x5550000 - 0xFFF03FF - - - OEUH - desc OEUH - 0 - 0 - read-write - - - OEUL - desc OEUL - 1 - 1 - read-write - - - OEVH - desc OEVH - 2 - 2 - read-write - - - OEVL - desc OEVL - 3 - 3 - read-write - - - OEWH - desc OEWH - 4 - 4 - read-write - - - OEWL - desc OEWL - 5 - 5 - read-write - - - ODT - desc ODT - 7 - 6 - read-write - - - MOE - desc MOE - 8 - 8 - read-write - - - AOE - desc AOE - 9 - 9 - read-write - - - OSUH - desc OSUH - 17 - 16 - read-write - - - OSUL - desc OSUL - 19 - 18 - read-write - - - OSVH - desc OSVH - 21 - 20 - read-write - - - OSVL - desc OSVL - 23 - 22 - read-write - - - OSWH - desc OSWH - 25 - 24 - read-write - - - OSWL - desc OSWL - 27 - 26 - read-write - - - - - SCER - desc SCER - 0xE4 - 16 - read-write - 0xFF00 - 0xF - - - EVTRS - desc EVTRS - 2 - 0 - read-write - - - PCTS - desc PCTS - 3 - 3 - read-write - - - - - - - TMR42 - desc TMR4 - 0x40038400 - - 0x0 - 0xE6 - - - - TMR43 - desc TMR4 - 0x40038800 - - 0x0 - 0xE6 - - - - TMR61 - desc TMR6 - 0x40018000 - - 0x0 - 0x1A0 - - - - CNTER - desc CNTER - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - UPDAR - desc UPDAR - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - PERAR - desc PERAR - 0x40 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - PERBR - desc PERBR - 0x44 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - PERCR - desc PERCR - 0x48 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMAR - desc GCMAR - 0x80 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMBR - desc GCMBR - 0x84 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMCR - desc GCMCR - 0x88 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMDR - desc GCMDR - 0x8C - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMER - desc GCMER - 0x90 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMFR - desc GCMFR - 0x94 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMAR - desc SCMAR - 0xC0 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMBR - desc SCMBR - 0xC4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMCR - desc SCMCR - 0xC8 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMDR - desc SCMDR - 0xCC - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMER - desc SCMER - 0xD0 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMFR - desc SCMFR - 0xD4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - DTUAR - desc DTUAR - 0x100 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - DTDAR - desc DTDAR - 0x104 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - DTUBR - desc DTUBR - 0x108 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - DTDBR - desc DTDBR - 0x10C - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCONR - desc GCONR - 0x140 - 32 - read-write - 0x2 - 0xF01F7 - - - START - desc START - 0 - 0 - read-write - - - DIR - desc DIR - 1 - 1 - read-write - - - MODE - desc MODE - 2 - 2 - read-write - - - CKDIV - desc CKDIV - 7 - 4 - read-write - - - OVSTP - desc OVSTP - 8 - 8 - read-write - - - ZMSKREV - desc ZMSKREV - 16 - 16 - read-write - - - ZMSKPOS - desc ZMSKPOS - 17 - 17 - read-write - - - ZMSKVAL - desc ZMSKVAL - 19 - 18 - read-write - - - - - ICONR - desc ICONR - 0x144 - 32 - read-write - 0x0 - 0xF01FF - - - INTENA - desc INTENA - 0 - 0 - read-write - - - INTENB - desc INTENB - 1 - 1 - read-write - - - INTENC - desc INTENC - 2 - 2 - read-write - - - INTEND - desc INTEND - 3 - 3 - read-write - - - INTENE - desc INTENE - 4 - 4 - read-write - - - INTENF - desc INTENF - 5 - 5 - read-write - - - INTENOVF - desc INTENOVF - 6 - 6 - read-write - - - INTENUDF - desc INTENUDF - 7 - 7 - read-write - - - INTENDTE - desc INTENDTE - 8 - 8 - read-write - - - INTENSAU - desc INTENSAU - 16 - 16 - read-write - - - INTENSAD - desc INTENSAD - 17 - 17 - read-write - - - INTENSBU - desc INTENSBU - 18 - 18 - read-write - - - INTENSBD - desc INTENSBD - 19 - 19 - read-write - - - - - BCONR - desc BCONR - 0x148 - 32 - read-write - 0x0 - 0xFF0FFF - - - BENA - desc BENA - 0 - 0 - read-write - - - BSEA - desc BSEA - 1 - 1 - read-write - - - BTRUA - desc BTRUA - 2 - 2 - read-write - - - BTRDA - desc BTRDA - 3 - 3 - read-write - - - BENB - desc BENB - 4 - 4 - read-write - - - BSEB - desc BSEB - 5 - 5 - read-write - - - BTRUB - desc BTRUB - 6 - 6 - read-write - - - BTRDB - desc BTRDB - 7 - 7 - read-write - - - BENP - desc BENP - 8 - 8 - read-write - - - BSEP - desc BSEP - 9 - 9 - read-write - - - BTRUP - desc BTRUP - 10 - 10 - read-write - - - BTRDP - desc BTRDP - 11 - 11 - read-write - - - BENSPA - desc BENSPA - 16 - 16 - read-write - - - BSESPA - desc BSESPA - 17 - 17 - read-write - - - BTRUSPA - desc BTRUSPA - 18 - 18 - read-write - - - BTRDSPA - desc BTRDSPA - 19 - 19 - read-write - - - BENSPB - desc BENSPB - 20 - 20 - read-write - - - BSESPB - desc BSESPB - 21 - 21 - read-write - - - BTRUSPB - desc BTRUSPB - 22 - 22 - read-write - - - BTRDSPB - desc BTRDSPB - 23 - 23 - read-write - - - - - DCONR - desc DCONR - 0x14C - 32 - read-write - 0x0 - 0xF3 - - - DTCEN - desc DTCEN - 0 - 0 - read-write - - - SEPA - desc SEPA - 1 - 1 - read-write - - - DTBENU - desc DTBENU - 4 - 4 - read-write - - - DTBEND - desc DTBEND - 5 - 5 - read-write - - - DTBTRU - desc DTBTRU - 6 - 6 - read-write - - - DTBTRD - desc DTBTRD - 7 - 7 - read-write - - - - - PCNAR - desc PCNAR - 0x154 - 32 - read-write - 0x0 - 0x93F3FFFF - - - STACA - desc STACA - 1 - 0 - read-write - - - STPCA - desc STPCA - 3 - 2 - read-write - - - OVFCA - desc OVFCA - 5 - 4 - read-write - - - UDFCA - desc UDFCA - 7 - 6 - read-write - - - CMAUCA - desc CMAUCA - 9 - 8 - read-write - - - CMADCA - desc CMADCA - 11 - 10 - read-write - - - CMBUCA - desc CMBUCA - 13 - 12 - read-write - - - CMBDCA - desc CMBDCA - 15 - 14 - read-write - - - FORCA - desc FORCA - 17 - 16 - read-write - - - EMBCA - desc EMBCA - 21 - 20 - read-write - - - EMBRA - desc EMBRA - 23 - 22 - read-write - - - EMBSA - desc EMBSA - 25 - 24 - read-write - - - OUTENA - desc OUTENA - 28 - 28 - read-write - - - CAPMDA - desc CAPMDA - 31 - 31 - read-write - - - - - PCNBR - desc PCNBR - 0x158 - 32 - read-write - 0x0 - 0x93F3FFFF - - - STACB - desc STACB - 1 - 0 - read-write - - - STPCB - desc STPCB - 3 - 2 - read-write - - - OVFCB - desc OVFCB - 5 - 4 - read-write - - - UDFCB - desc UDFCB - 7 - 6 - read-write - - - CMAUCB - desc CMAUCB - 9 - 8 - read-write - - - CMADCB - desc CMADCB - 11 - 10 - read-write - - - CMBUCB - desc CMBUCB - 13 - 12 - read-write - - - CMBDCB - desc CMBDCB - 15 - 14 - read-write - - - FORCB - desc FORCB - 17 - 16 - read-write - - - EMBCB - desc EMBCB - 21 - 20 - read-write - - - EMBRB - desc EMBRB - 23 - 22 - read-write - - - EMBSB - desc EMBSB - 25 - 24 - read-write - - - OUTENB - desc OUTENB - 28 - 28 - read-write - - - CAPMDB - desc CAPMDB - 31 - 31 - read-write - - - - - FCNGR - desc FCNGR - 0x15C - 32 - read-write - 0x0 - 0x77 - - - NOFIENGA - desc NOFIENGA - 0 - 0 - read-write - - - NOFICKGA - desc NOFICKGA - 2 - 1 - read-write - - - NOFIENGB - desc NOFIENGB - 4 - 4 - read-write - - - NOFICKGB - desc NOFICKGB - 6 - 5 - read-write - - - - - VPERR - desc VPERR - 0x160 - 32 - read-write - 0x0 - 0x1F0300 - - - SPPERIA - desc SPPERIA - 8 - 8 - read-write - - - SPPERIB - desc SPPERIB - 9 - 9 - read-write - - - PCNTE - desc PCNTE - 17 - 16 - read-write - - - PCNTS - desc PCNTS - 20 - 18 - read-write - - - - - STFLR - desc STFLR - 0x164 - 32 - read-write - 0x80000000 - 0x80E01FFF - - - CMAF - desc CMAF - 0 - 0 - read-write - - - CMBF - desc CMBF - 1 - 1 - read-write - - - CMCF - desc CMCF - 2 - 2 - read-write - - - CMDF - desc CMDF - 3 - 3 - read-write - - - CMEF - desc CMEF - 4 - 4 - read-write - - - CMFF - desc CMFF - 5 - 5 - read-write - - - OVFF - desc OVFF - 6 - 6 - read-write - - - UDFF - desc UDFF - 7 - 7 - read-write - - - DTEF - desc DTEF - 8 - 8 - read-only - - - CMSAUF - desc CMSAUF - 9 - 9 - read-write - - - CMSADF - desc CMSADF - 10 - 10 - read-write - - - CMSBUF - desc CMSBUF - 11 - 11 - read-write - - - CMSBDF - desc CMSBDF - 12 - 12 - read-write - - - VPERNUM - desc VPERNUM - 23 - 21 - read-only - - - DIRF - desc DIRF - 31 - 31 - read-only - - - - - HSTAR - desc HSTAR - 0x180 - 32 - read-write - 0x0 - 0xFF0F8F - - - HSTA0 - desc HSTA0 - 0 - 0 - read-write - - - HSTA1 - desc HSTA1 - 1 - 1 - read-write - - - HSTA2 - desc HSTA2 - 2 - 2 - read-write - - - HSTA3 - desc HSTA3 - 3 - 3 - read-write - - - STAS - desc STAS - 7 - 7 - read-write - - - HSTA8 - desc HSTA8 - 8 - 8 - read-write - - - HSTA9 - desc HSTA9 - 9 - 9 - read-write - - - HSTA10 - desc HSTA10 - 10 - 10 - read-write - - - HSTA11 - desc HSTA11 - 11 - 11 - read-write - - - HSTA16 - desc HSTA16 - 16 - 16 - read-write - - - HSTA17 - desc HSTA17 - 17 - 17 - read-write - - - HSTA18 - desc HSTA18 - 18 - 18 - read-write - - - HSTA19 - desc HSTA19 - 19 - 19 - read-write - - - HSTA20 - desc HSTA20 - 20 - 20 - read-write - - - HSTA21 - desc HSTA21 - 21 - 21 - read-write - - - HSTA22 - desc HSTA22 - 22 - 22 - read-write - - - HSTA23 - desc HSTA23 - 23 - 23 - read-write - - - - - HSTPR - desc HSTPR - 0x184 - 32 - read-write - 0x0 - 0xFF0F8F - - - HSTP0 - desc HSTP0 - 0 - 0 - read-write - - - HSTP1 - desc HSTP1 - 1 - 1 - read-write - - - HSTP2 - desc HSTP2 - 2 - 2 - read-write - - - HSTP3 - desc HSTP3 - 3 - 3 - read-write - - - STPS - desc STPS - 7 - 7 - read-write - - - HSTP8 - desc HSTP8 - 8 - 8 - read-write - - - HSTP9 - desc HSTP9 - 9 - 9 - read-write - - - HSTP10 - desc HSTP10 - 10 - 10 - read-write - - - HSTP11 - desc HSTP11 - 11 - 11 - read-write - - - HSTP16 - desc HSTP16 - 16 - 16 - read-write - - - HSTP17 - desc HSTP17 - 17 - 17 - read-write - - - HSTP18 - desc HSTP18 - 18 - 18 - read-write - - - HSTP19 - desc HSTP19 - 19 - 19 - read-write - - - HSTP20 - desc HSTP20 - 20 - 20 - read-write - - - HSTP21 - desc HSTP21 - 21 - 21 - read-write - - - HSTP22 - desc HSTP22 - 22 - 22 - read-write - - - HSTP23 - desc HSTP23 - 23 - 23 - read-write - - - - - HCLRR - desc HCLRR - 0x188 - 32 - read-write - 0x0 - 0xFF0F8F - - - HCLE0 - desc HCLE0 - 0 - 0 - read-write - - - HCLE1 - desc HCLE1 - 1 - 1 - read-write - - - HCLE2 - desc HCLE2 - 2 - 2 - read-write - - - HCLE3 - desc HCLE3 - 3 - 3 - read-write - - - CLES - desc CLES - 7 - 7 - read-write - - - HCLE8 - desc HCLE8 - 8 - 8 - read-write - - - HCLE9 - desc HCLE9 - 9 - 9 - read-write - - - HCLE10 - desc HCLE10 - 10 - 10 - read-write - - - HCLE11 - desc HCLE11 - 11 - 11 - read-write - - - HCLE16 - desc HCLE16 - 16 - 16 - read-write - - - HCLE17 - desc HCLE17 - 17 - 17 - read-write - - - HCLE18 - desc HCLE18 - 18 - 18 - read-write - - - HCLE19 - desc HCLE19 - 19 - 19 - read-write - - - HCLE20 - desc HCLE20 - 20 - 20 - read-write - - - HCLE21 - desc HCLE21 - 21 - 21 - read-write - - - HCLE22 - desc HCLE22 - 22 - 22 - read-write - - - HCLE23 - desc HCLE23 - 23 - 23 - read-write - - - - - HUPDR - desc HUPDR - 0x18C - 32 - read-write - 0x0 - 0xFF0F8F - - - HUPD0 - desc HUPD0 - 0 - 0 - read-write - - - HUPD1 - desc HUPD1 - 1 - 1 - read-write - - - HUPD2 - desc HUPD2 - 2 - 2 - read-write - - - HUPD3 - desc HUPD3 - 3 - 3 - read-write - - - UPDS - desc UPDS - 7 - 7 - read-write - - - HUPD8 - desc HUPD8 - 8 - 8 - read-write - - - HUPD9 - desc HUPD9 - 9 - 9 - read-write - - - HUPD10 - desc HUPD10 - 10 - 10 - read-write - - - HUPD11 - desc HUPD11 - 11 - 11 - read-write - - - HUPD16 - desc HUPD16 - 16 - 16 - read-write - - - HUPD17 - desc HUPD17 - 17 - 17 - read-write - - - HUPD18 - desc HUPD18 - 18 - 18 - read-write - - - HUPD19 - desc HUPD19 - 19 - 19 - read-write - - - HUPD20 - desc HUPD20 - 20 - 20 - read-write - - - HUPD21 - desc HUPD21 - 21 - 21 - read-write - - - HUPD22 - desc HUPD22 - 22 - 22 - read-write - - - HUPD23 - desc HUPD23 - 23 - 23 - read-write - - - - - HCPAR - desc HCPAR - 0x190 - 32 - read-write - 0x0 - 0xFF0F0F - - - HCPA0 - desc HCPA0 - 0 - 0 - read-write - - - HCPA1 - desc HCPA1 - 1 - 1 - read-write - - - HCPA2 - desc HCPA2 - 2 - 2 - read-write - - - HCPA3 - desc HCPA3 - 3 - 3 - read-write - - - HCPA8 - desc HCPA8 - 8 - 8 - read-write - - - HCPA9 - desc HCPA9 - 9 - 9 - read-write - - - HCPA10 - desc HCPA10 - 10 - 10 - read-write - - - HCPA11 - desc HCPA11 - 11 - 11 - read-write - - - HCPA16 - desc HCPA16 - 16 - 16 - read-write - - - HCPA17 - desc HCPA17 - 17 - 17 - read-write - - - HCPA18 - desc HCPA18 - 18 - 18 - read-write - - - HCPA19 - desc HCPA19 - 19 - 19 - read-write - - - HCPA20 - desc HCPA20 - 20 - 20 - read-write - - - HCPA21 - desc HCPA21 - 21 - 21 - read-write - - - HCPA22 - desc HCPA22 - 22 - 22 - read-write - - - HCPA23 - desc HCPA23 - 23 - 23 - read-write - - - - - HCPBR - desc HCPBR - 0x194 - 32 - read-write - 0x0 - 0xFF0F0F - - - HCPB0 - desc HCPB0 - 0 - 0 - read-write - - - HCPB1 - desc HCPB1 - 1 - 1 - read-write - - - HCPB2 - desc HCPB2 - 2 - 2 - read-write - - - HCPB3 - desc HCPB3 - 3 - 3 - read-write - - - HCPB8 - desc HCPB8 - 8 - 8 - read-write - - - HCPB9 - desc HCPB9 - 9 - 9 - read-write - - - HCPB10 - desc HCPB10 - 10 - 10 - read-write - - - HCPB11 - desc HCPB11 - 11 - 11 - read-write - - - HCPB16 - desc HCPB16 - 16 - 16 - read-write - - - HCPB17 - desc HCPB17 - 17 - 17 - read-write - - - HCPB18 - desc HCPB18 - 18 - 18 - read-write - - - HCPB19 - desc HCPB19 - 19 - 19 - read-write - - - HCPB20 - desc HCPB20 - 20 - 20 - read-write - - - HCPB21 - desc HCPB21 - 21 - 21 - read-write - - - HCPB22 - desc HCPB22 - 22 - 22 - read-write - - - HCPB23 - desc HCPB23 - 23 - 23 - read-write - - - - - HCUPR - desc HCUPR - 0x198 - 32 - read-write - 0x0 - 0xFF0FFF - - - HCUP0 - desc HCUP0 - 0 - 0 - read-write - - - HCUP1 - desc HCUP1 - 1 - 1 - read-write - - - HCUP2 - desc HCUP2 - 2 - 2 - read-write - - - HCUP3 - desc HCUP3 - 3 - 3 - read-write - - - HCUP4 - desc HCUP4 - 4 - 4 - read-write - - - HCUP5 - desc HCUP5 - 5 - 5 - read-write - - - HCUP6 - desc HCUP6 - 6 - 6 - read-write - - - HCUP7 - desc HCUP7 - 7 - 7 - read-write - - - HCUP8 - desc HCUP8 - 8 - 8 - read-write - - - HCUP9 - desc HCUP9 - 9 - 9 - read-write - - - HCUP10 - desc HCUP10 - 10 - 10 - read-write - - - HCUP11 - desc HCUP11 - 11 - 11 - read-write - - - HCUP16 - desc HCUP16 - 16 - 16 - read-write - - - HCUP17 - desc HCUP17 - 17 - 17 - read-write - - - HCUP18 - desc HCUP18 - 18 - 18 - read-write - - - HCUP19 - desc HCUP19 - 19 - 19 - read-write - - - HCUP20 - desc HCUP20 - 20 - 20 - read-write - - - HCUP21 - desc HCUP21 - 21 - 21 - read-write - - - HCUP22 - desc HCUP22 - 22 - 22 - read-write - - - HCUP23 - desc HCUP23 - 23 - 23 - read-write - - - - - HCDOR - desc HCDOR - 0x19C - 32 - read-write - 0x0 - 0xFF0FFF - - - HCDO0 - desc HCDO0 - 0 - 0 - read-write - - - HCDO1 - desc HCDO1 - 1 - 1 - read-write - - - HCDO2 - desc HCDO2 - 2 - 2 - read-write - - - HCDO3 - desc HCDO3 - 3 - 3 - read-write - - - HCDO4 - desc HCDO4 - 4 - 4 - read-write - - - HCDO5 - desc HCDO5 - 5 - 5 - read-write - - - HCDO6 - desc HCDO6 - 6 - 6 - read-write - - - HCDO7 - desc HCDO7 - 7 - 7 - read-write - - - HCDO8 - desc HCDO8 - 8 - 8 - read-write - - - HCDO9 - desc HCDO9 - 9 - 9 - read-write - - - HCDO10 - desc HCDO10 - 10 - 10 - read-write - - - HCDO11 - desc HCDO11 - 11 - 11 - read-write - - - HCDO16 - desc HCDO16 - 16 - 16 - read-write - - - HCDO17 - desc HCDO17 - 17 - 17 - read-write - - - HCDO18 - desc HCDO18 - 18 - 18 - read-write - - - HCDO19 - desc HCDO19 - 19 - 19 - read-write - - - HCDO20 - desc HCDO20 - 20 - 20 - read-write - - - HCDO21 - desc HCDO21 - 21 - 21 - read-write - - - HCDO22 - desc HCDO22 - 22 - 22 - read-write - - - HCDO23 - desc HCDO23 - 23 - 23 - read-write - - - - - - - TMR62 - desc TMR6 - 0x40018400 - - 0x0 - 0x1A0 - - - - TMR63 - desc TMR6 - 0x40018800 - - 0x0 - 0x1A0 - - - - TMR64 - desc TMR6 - 0x40018C00 - - 0x0 - 0x1A0 - - - - TMR65 - desc TMR6 - 0x40019000 - - 0x0 - 0x1A0 - - - - TMR66 - desc TMR6 - 0x40019400 - - 0x0 - 0x1A0 - - - - TMR67 - desc TMR6 - 0x40019800 - - 0x0 - 0x1A0 - - - - TMR68 - desc TMR6 - 0x40019C00 - - 0x0 - 0x1A0 - - - - TMR6CR - desc TMR6CR - 0x40018000 - TMR61 - - 0x0 - 0x400 - - - - FCNTR - desc FCNTR - 0x3EC - 32 - read-write - 0x0 - 0x7777 - - - NOFIENTA - desc NOFIENTA - 0 - 0 - read-write - - - NOFICKTA - desc NOFICKTA - 2 - 1 - read-write - - - NOFIENTB - desc NOFIENTB - 4 - 4 - read-write - - - NOFICKTB - desc NOFICKTB - 6 - 5 - read-write - - - NOFIENTC - desc NOFIENTC - 8 - 8 - read-write - - - NOFICKTC - desc NOFICKTC - 10 - 9 - read-write - - - NOFIENTD - desc NOFIENTD - 12 - 12 - read-write - - - NOFICKTD - desc NOFICKTD - 14 - 13 - read-write - - - - - SSTAR - desc SSTAR - 0x3F0 - 32 - read-write - 0x0 - 0xFF - - - SSTA1 - desc SSTA1 - 0 - 0 - read-write - - - SSTA2 - desc SSTA2 - 1 - 1 - read-write - - - SSTA3 - desc SSTA3 - 2 - 2 - read-write - - - SSTA4 - desc SSTA4 - 3 - 3 - read-write - - - SSTA5 - desc SSTA5 - 4 - 4 - read-write - - - SSTA6 - desc SSTA6 - 5 - 5 - read-write - - - SSTA7 - desc SSTA7 - 6 - 6 - read-write - - - SSTA8 - desc SSTA8 - 7 - 7 - read-write - - - - - SSTPR - desc SSTPR - 0x3F4 - 32 - read-write - 0x0 - 0xFF - - - SSTP1 - desc SSTP1 - 0 - 0 - read-write - - - SSTP2 - desc SSTP2 - 1 - 1 - read-write - - - SSTP3 - desc SSTP3 - 2 - 2 - read-write - - - SSTP4 - desc SSTP4 - 3 - 3 - read-write - - - SSTP5 - desc SSTP5 - 4 - 4 - read-write - - - SSTP6 - desc SSTP6 - 5 - 5 - read-write - - - SSTP7 - desc SSTP7 - 6 - 6 - read-write - - - SSTP8 - desc SSTP8 - 7 - 7 - read-write - - - - - SCLRR - desc SCLRR - 0x3F8 - 32 - read-write - 0x0 - 0xFF - - - SCLE1 - desc SCLE1 - 0 - 0 - read-write - - - SCLE2 - desc SCLE2 - 1 - 1 - read-write - - - SCLE3 - desc SCLE3 - 2 - 2 - read-write - - - SCLE4 - desc SCLE4 - 3 - 3 - read-write - - - SCLE5 - desc SCLE5 - 4 - 4 - read-write - - - SCLE6 - desc SCLE6 - 5 - 5 - read-write - - - SCLE7 - desc SCLE7 - 6 - 6 - read-write - - - SCLE8 - desc SCLE8 - 7 - 7 - read-write - - - - - SUPDR - desc SUPDR - 0x3FC - 32 - read-write - 0x0 - 0xFF - - - SUPD1 - desc SUPD1 - 0 - 0 - read-write - - - SUPD2 - desc SUPD2 - 1 - 1 - read-write - - - SUPD3 - desc SUPD3 - 2 - 2 - read-write - - - SUPD4 - desc SUPD4 - 3 - 3 - read-write - - - SUPD5 - desc SUPD5 - 4 - 4 - read-write - - - SUPD6 - desc SUPD6 - 5 - 5 - read-write - - - SUPD7 - desc SUPD7 - 6 - 6 - read-write - - - SUPD8 - desc SUPD8 - 7 - 7 - read-write - - - - - - - TMRA1 - desc TMRA - 0x4003A000 - - 0x0 - 0x150 - - - - CNTER - desc CNTER - 0x0 - 16 - read-write - 0x0 - 0xFFFF - - - CNT - desc CNT - 15 - 0 - read-write - - - - - PERAR - desc PERAR - 0x4 - 16 - read-write - 0xFFFF - 0xFFFF - - - PER - desc PER - 15 - 0 - read-write - - - - - CMPAR1 - desc CMPAR1 - 0x40 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR2 - desc CMPAR2 - 0x44 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR3 - desc CMPAR3 - 0x48 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR4 - desc CMPAR4 - 0x4C - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - BCSTR - desc BCSTR - 0x80 - 16 - read-write - 0x2 - 0xF1FF - - - START - desc START - 0 - 0 - read-write - - - DIR - desc DIR - 1 - 1 - read-write - - - MODE - desc MODE - 2 - 2 - read-write - - - SYNST - desc SYNST - 3 - 3 - read-write - - - CKDIV - desc CKDIV - 7 - 4 - read-write - - - OVSTP - desc OVSTP - 8 - 8 - read-write - - - ITENOVF - desc ITENOVF - 12 - 12 - read-write - - - ITENUDF - desc ITENUDF - 13 - 13 - read-write - - - OVFF - desc OVFF - 14 - 14 - read-write - - - UDFF - desc UDFF - 15 - 15 - read-write - - - - - HCONR - desc HCONR - 0x84 - 16 - read-write - 0x0 - 0xF777 - - - HSTA0 - desc HSTA0 - 0 - 0 - read-write - - - HSTA1 - desc HSTA1 - 1 - 1 - read-write - - - HSTA2 - desc HSTA2 - 2 - 2 - read-write - - - HSTP0 - desc HSTP0 - 4 - 4 - read-write - - - HSTP1 - desc HSTP1 - 5 - 5 - read-write - - - HSTP2 - desc HSTP2 - 6 - 6 - read-write - - - HCLE0 - desc HCLE0 - 8 - 8 - read-write - - - HCLE1 - desc HCLE1 - 9 - 9 - read-write - - - HCLE2 - desc HCLE2 - 10 - 10 - read-write - - - HCLE3 - desc HCLE3 - 12 - 12 - read-write - - - HCLE4 - desc HCLE4 - 13 - 13 - read-write - - - HCLE5 - desc HCLE5 - 14 - 14 - read-write - - - HCLE6 - desc HCLE6 - 15 - 15 - read-write - - - - - HCUPR - desc HCUPR - 0x88 - 16 - read-write - 0x0 - 0x1FFF - - - HCUP0 - desc HCUP0 - 0 - 0 - read-write - - - HCUP1 - desc HCUP1 - 1 - 1 - read-write - - - HCUP2 - desc HCUP2 - 2 - 2 - read-write - - - HCUP3 - desc HCUP3 - 3 - 3 - read-write - - - HCUP4 - desc HCUP4 - 4 - 4 - read-write - - - HCUP5 - desc HCUP5 - 5 - 5 - read-write - - - HCUP6 - desc HCUP6 - 6 - 6 - read-write - - - HCUP7 - desc HCUP7 - 7 - 7 - read-write - - - HCUP8 - desc HCUP8 - 8 - 8 - read-write - - - HCUP9 - desc HCUP9 - 9 - 9 - read-write - - - HCUP10 - desc HCUP10 - 10 - 10 - read-write - - - HCUP11 - desc HCUP11 - 11 - 11 - read-write - - - HCUP12 - desc HCUP12 - 12 - 12 - read-write - - - - - HCDOR - desc HCDOR - 0x8C - 16 - read-write - 0x0 - 0x1FFF - - - HCDO0 - desc HCDO0 - 0 - 0 - read-write - - - HCDO1 - desc HCDO1 - 1 - 1 - read-write - - - HCDO2 - desc HCDO2 - 2 - 2 - read-write - - - HCDO3 - desc HCDO3 - 3 - 3 - read-write - - - HCDO4 - desc HCDO4 - 4 - 4 - read-write - - - HCDO5 - desc HCDO5 - 5 - 5 - read-write - - - HCDO6 - desc HCDO6 - 6 - 6 - read-write - - - HCDO7 - desc HCDO7 - 7 - 7 - read-write - - - HCDO8 - desc HCDO8 - 8 - 8 - read-write - - - HCDO9 - desc HCDO9 - 9 - 9 - read-write - - - HCDO10 - desc HCDO10 - 10 - 10 - read-write - - - HCDO11 - desc HCDO11 - 11 - 11 - read-write - - - HCDO12 - desc HCDO12 - 12 - 12 - read-write - - - - - ICONR - desc ICONR - 0x90 - 16 - read-write - 0x0 - 0xF - - - ITEN1 - desc ITEN1 - 0 - 0 - read-write - - - ITEN2 - desc ITEN2 - 1 - 1 - read-write - - - ITEN3 - desc ITEN3 - 2 - 2 - read-write - - - ITEN4 - desc ITEN4 - 3 - 3 - read-write - - - - - ECONR - desc ECONR - 0x94 - 16 - read-write - 0x0 - 0xF - - - ETEN1 - desc ETEN1 - 0 - 0 - read-write - - - ETEN2 - desc ETEN2 - 1 - 1 - read-write - - - ETEN3 - desc ETEN3 - 2 - 2 - read-write - - - ETEN4 - desc ETEN4 - 3 - 3 - read-write - - - - - FCONR - desc FCONR - 0x98 - 16 - read-write - 0x0 - 0x7707 - - - NOFIENTG - desc NOFIENTG - 0 - 0 - read-write - - - NOFICKTG - desc NOFICKTG - 2 - 1 - read-write - - - NOFIENCA - desc NOFIENCA - 8 - 8 - read-write - - - NOFICKCA - desc NOFICKCA - 10 - 9 - read-write - - - NOFIENCB - desc NOFIENCB - 12 - 12 - read-write - - - NOFICKCB - desc NOFICKCB - 14 - 13 - read-write - - - - - STFLR - desc STFLR - 0x9C - 16 - read-write - 0x0 - 0xF - - - CMPF1 - desc CMPF1 - 0 - 0 - read-write - - - CMPF2 - desc CMPF2 - 1 - 1 - read-write - - - CMPF3 - desc CMPF3 - 2 - 2 - read-write - - - CMPF4 - desc CMPF4 - 3 - 3 - read-write - - - - - BCONR1 - desc BCONR1 - 0xC0 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - BCONR2 - desc BCONR2 - 0xC8 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - CCONR1 - desc CCONR1 - 0x100 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR2 - desc CCONR2 - 0x104 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR3 - desc CCONR3 - 0x108 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR4 - desc CCONR4 - 0x10C - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - PCONR1 - desc PCONR1 - 0x140 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR2 - desc PCONR2 - 0x144 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR3 - desc PCONR3 - 0x148 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR4 - desc PCONR4 - 0x14C - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - - - TMRA10 - desc TMRA - 0x40027400 - - 0x0 - 0x150 - - - - TMRA11 - desc TMRA - 0x40027800 - - 0x0 - 0x150 - - - - TMRA12 - desc TMRA - 0x40027C00 - - 0x0 - 0x150 - - - - TMRA2 - desc TMRA - 0x4003A400 - - 0x0 - 0x150 - - - - TMRA3 - desc TMRA - 0x4003A800 - - 0x0 - 0x150 - - - - TMRA4 - desc TMRA - 0x4003AC00 - - 0x0 - 0x150 - - - - TMRA5 - desc TMRA - 0x40026000 - - 0x0 - 0x150 - - - - TMRA6 - desc TMRA - 0x40026400 - - 0x0 - 0x150 - - - - TMRA7 - desc TMRA - 0x40026800 - - 0x0 - 0x150 - - - - TMRA8 - desc TMRA - 0x40026C00 - - 0x0 - 0x150 - - - - TMRA9 - desc TMRA - 0x40027000 - - 0x0 - 0x150 - - - - TRNG - desc TRNG - 0x40042000 - - 0x0 - 0x14 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x3 - - - EN - desc EN - 0 - 0 - read-write - - - RUN - desc RUN - 1 - 1 - read-write - - - - - MR - desc MR - 0x4 - 32 - read-write - 0x12 - 0x1D - - - LOAD - desc LOAD - 0 - 0 - read-write - - - CNT - desc CNT - 4 - 2 - read-write - - - - - DR0 - desc DR0 - 0xC - 32 - read-only - 0x8000000 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x10 - 32 - read-only - 0x8000200 - 0xFFFFFFFF - - - - - USART1 - desc USART - 0x4001CC00 - - 0x0 - 0x1C - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x101EB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - RTOF - desc RTOF - 8 - 8 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFFFF - 0xFF7F - - - DIV_FRACTION - desc DIV_FRACTION - 6 - 0 - read-write - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xF11B96FF - - - RTOE - desc RTOE - 0 - 0 - read-write - - - RTOIE - desc RTOIE - 1 - 1 - read-write - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - CRTOF - desc CRTOF - 20 - 20 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - FBME - desc FBME - 29 - 29 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x3801 - - - MPE - desc MPE - 0 - 0 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0xE00328 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - SCEN - desc SCEN - 5 - 5 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - BCN - desc BCN - 23 - 21 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0x3 - - - PSC - desc PSC - 1 - 0 - read-write - - - - - - - USART10 - desc USART10 - 0x40021C00 - - 0x0 - 0x20 - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x106FB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - BE - desc BE - 4 - 4 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - WKUP - desc WKUP - 9 - 9 - read-only - - - LBD - desc LBD - 10 - 10 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFF00 - 0xFF00 - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xD1EB96FC - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - CBE - desc CBE - 21 - 21 - read-write - - - CWKUP - desc CWKUP - 22 - 22 - read-write - - - CLBD - desc CLBD - 23 - 23 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x379FF - - - MPE - desc MPE - 0 - 0 - read-write - - - WKUPIE - desc WKUPIE - 1 - 1 - read-write - - - BEIE - desc BEIE - 2 - 2 - read-write - - - BEE - desc BEE - 3 - 3 - read-write - - - LBDIE - desc LBDIE - 4 - 4 - read-write - - - LBDL - desc LBDL - 5 - 5 - read-write - - - SBKL - desc SBKL - 7 - 6 - read-write - - - WKUPE - desc WKUPE - 8 - 8 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - LINEN - desc LINEN - 14 - 14 - read-write - - - SBK - desc SBK - 16 - 16 - read-write - - - SBKM - desc SBKM - 17 - 17 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0x318 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - LOOP - desc LOOP - 4 - 4 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0xF - - - PSC - desc PSC - 1 - 0 - read-write - - - LBMPSC - desc LBMPSC - 3 - 2 - read-write - - - - - LBMC - desc LBMC - 0x1C - 32 - read-only - 0x0 - 0xFFFF - - - LBMC - desc LBMC - 15 - 0 - read-only - - - - - - - USART2 - desc USART - 0x4001D000 - - 0x0 - 0x1C - - - - USART3 - desc USART - 0x4001D400 - - 0x0 - 0x1C - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x100EB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFFFF - 0xFF7F - - - DIV_FRACTION - desc DIV_FRACTION - 6 - 0 - read-write - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xF10B96FC - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - FBME - desc FBME - 29 - 29 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x3801 - - - MPE - desc MPE - 0 - 0 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0xE00328 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - SCEN - desc SCEN - 5 - 5 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - BCN - desc BCN - 23 - 21 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0x3 - - - PSC - desc PSC - 1 - 0 - read-write - - - - - - - USART4 - desc USART - 0x4001D800 - - 0x0 - 0x1C - - - - USART5 - desc USART - 0x4001DC00 - - 0x0 - 0x20 - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x106FB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - BE - desc BE - 4 - 4 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - WKUP - desc WKUP - 9 - 9 - read-only - - - LBD - desc LBD - 10 - 10 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFF00 - 0xFF00 - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xD1EB96FC - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - CBE - desc CBE - 21 - 21 - read-write - - - CWKUP - desc CWKUP - 22 - 22 - read-write - - - CLBD - desc CLBD - 23 - 23 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x379FF - - - MPE - desc MPE - 0 - 0 - read-write - - - WKUPIE - desc WKUPIE - 1 - 1 - read-write - - - BEIE - desc BEIE - 2 - 2 - read-write - - - BEE - desc BEE - 3 - 3 - read-write - - - LBDIE - desc LBDIE - 4 - 4 - read-write - - - LBDL - desc LBDL - 5 - 5 - read-write - - - SBKL - desc SBKL - 7 - 6 - read-write - - - WKUPE - desc WKUPE - 8 - 8 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - LINEN - desc LINEN - 14 - 14 - read-write - - - SBK - desc SBK - 16 - 16 - read-write - - - SBKM - desc SBKM - 17 - 17 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0x318 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - LOOP - desc LOOP - 4 - 4 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0xF - - - PSC - desc PSC - 1 - 0 - read-write - - - LBMPSC - desc LBMPSC - 3 - 2 - read-write - - - - - LBMC - desc LBMC - 0x1C - 32 - read-only - 0x0 - 0xFFFF - - - LBMC - desc LBMC - 15 - 0 - read-only - - - - - - - USART6 - desc USART6 - 0x40020C00 - - 0x0 - 0x1C - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x101EB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - RTOF - desc RTOF - 8 - 8 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFFFF - 0xFF7F - - - DIV_FRACTION - desc DIV_FRACTION - 6 - 0 - read-write - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xF11B96FF - - - RTOE - desc RTOE - 0 - 0 - read-write - - - RTOIE - desc RTOIE - 1 - 1 - read-write - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - CRTOF - desc CRTOF - 20 - 20 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - FBME - desc FBME - 29 - 29 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x3801 - - - MPE - desc MPE - 0 - 0 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0xE00328 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - SCEN - desc SCEN - 5 - 5 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - BCN - desc BCN - 23 - 21 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0x3 - - - PSC - desc PSC - 1 - 0 - read-write - - - - - - - USART7 - desc USART - 0x40021000 - - 0x0 - 0x1C - - - - USART8 - desc USART - 0x40021400 - - 0x0 - 0x1C - - - - USART9 - desc USART - 0x40021800 - - 0x0 - 0x1C - - - - USBFS - desc USBFS - 0x40080000 - - 0x0 - 0xE04 - - - - GVBUSCFG - desc GVBUSCFG - 0x0 - 32 - read-write - 0x0 - 0xC0 - - - VBUSOVEN - desc VBUSOVEN - 6 - 6 - read-write - - - VBUSVAL - desc VBUSVAL - 7 - 7 - read-write - - - - - GAHBCFG - desc GAHBCFG - 0x8 - 32 - read-write - 0x0 - 0x1BF - - - GINTMSK - desc GINTMSK - 0 - 0 - read-write - - - HBSTLEN - desc HBSTLEN - 4 - 1 - read-write - - - DMAEN - desc DMAEN - 5 - 5 - read-write - - - TXFELVL - desc TXFELVL - 7 - 7 - read-write - - - PTXFELVL - desc PTXFELVL - 8 - 8 - read-write - - - - - GUSBCFG - desc GUSBCFG - 0xC - 32 - read-write - 0x1440 - 0x60003C47 - - - TOCAL - desc TOCAL - 2 - 0 - read-write - - - PHYSEL - desc PHYSEL - 6 - 6 - read-write - - - TRDT - desc TRDT - 13 - 10 - read-write - - - FHMOD - desc FHMOD - 29 - 29 - read-write - - - FDMOD - desc FDMOD - 30 - 30 - read-write - - - - - GRSTCTL - desc GRSTCTL - 0x10 - 32 - read-write - 0x80000000 - 0xC00007F7 - - - CSRST - desc CSRST - 0 - 0 - read-write - - - HSRST - desc HSRST - 1 - 1 - read-write - - - FCRST - desc FCRST - 2 - 2 - read-write - - - RXFFLSH - desc RXFFLSH - 4 - 4 - read-write - - - TXFFLSH - desc TXFFLSH - 5 - 5 - read-write - - - TXFNUM - desc TXFNUM - 10 - 6 - read-write - - - DMAREQ - desc DMAREQ - 30 - 30 - read-only - - - AHBIDL - desc AHBIDL - 31 - 31 - read-only - - - - - GINTSTS - desc GINTSTS - 0x14 - 32 - read-only - 0x14000020 - 0xFF7CFCFB - - - CMOD - desc CMOD - 0 - 0 - read-only - - - MMIS - desc MMIS - 1 - 1 - read-write - - - SOF - desc SOF - 3 - 3 - read-write - - - RXFNE - desc RXFNE - 4 - 4 - read-only - - - NPTXFE - desc NPTXFE - 5 - 5 - read-only - - - GINAKEFF - desc GINAKEFF - 6 - 6 - read-only - - - GONAKEFF - desc GONAKEFF - 7 - 7 - read-only - - - ESUSP - desc ESUSP - 10 - 10 - read-write - - - USBSUSP - desc USBSUSP - 11 - 11 - read-write - - - USBRST - desc USBRST - 12 - 12 - read-write - - - ENUMDNE - desc ENUMDNE - 13 - 13 - read-write - - - ISOODRP - desc ISOODRP - 14 - 14 - read-write - - - EOPF - desc EOPF - 15 - 15 - read-write - - - IEPINT - desc IEPINT - 18 - 18 - read-only - - - OEPINT - desc OEPINT - 19 - 19 - read-only - - - IISOIXFR - desc IISOIXFR - 20 - 20 - read-write - - - IPXFR_INCOMPISOOUT - desc IPXFR_INCOMPISOOUT - 21 - 21 - read-write - - - DATAFSUSP - desc DATAFSUSP - 22 - 22 - read-write - - - HPRTINT - desc HPRTINT - 24 - 24 - read-only - - - HCINT - desc HCINT - 25 - 25 - read-only - - - PTXFE - desc PTXFE - 26 - 26 - read-only - - - LPMINT - desc LPMINT - 27 - 27 - read-write - - - CIDSCHG - desc CIDSCHG - 28 - 28 - read-write - - - DISCINT - desc DISCINT - 29 - 29 - read-write - - - VBUSVINT - desc VBUSVINT - 30 - 30 - read-write - - - WKUINT - desc WKUINT - 31 - 31 - read-write - - - - - GINTMSK - desc GINTMSK - 0x18 - 32 - read-write - 0x0 - 0xFF7CFCFA - - - MMISM - desc MMISM - 1 - 1 - read-write - - - SOFM - desc SOFM - 3 - 3 - read-write - - - RXFNEM - desc RXFNEM - 4 - 4 - read-write - - - NPTXFEM - desc NPTXFEM - 5 - 5 - read-write - - - GINAKEFFM - desc GINAKEFFM - 6 - 6 - read-write - - - GONAKEFFM - desc GONAKEFFM - 7 - 7 - read-write - - - ESUSPM - desc ESUSPM - 10 - 10 - read-write - - - USBSUSPM - desc USBSUSPM - 11 - 11 - read-write - - - USBRSTM - desc USBRSTM - 12 - 12 - read-write - - - ENUMDNEM - desc ENUMDNEM - 13 - 13 - read-write - - - ISOODRPM - desc ISOODRPM - 14 - 14 - read-write - - - EOPFM - desc EOPFM - 15 - 15 - read-write - - - IEPIM - desc IEPIM - 18 - 18 - read-write - - - OEPIM - desc OEPIM - 19 - 19 - read-write - - - IISOIXFRM - desc IISOIXFRM - 20 - 20 - read-write - - - IPXFRM_INCOMPISOOUTM - desc IPXFRM_INCOMPISOOUTM - 21 - 21 - read-write - - - DATAFSUSPM - desc DATAFSUSPM - 22 - 22 - read-write - - - HPRTIM - desc HPRTIM - 24 - 24 - read-write - - - HCIM - desc HCIM - 25 - 25 - read-write - - - PTXFEM - desc PTXFEM - 26 - 26 - read-write - - - LPMINTM - desc LPMINTM - 27 - 27 - read-write - - - CIDSCHGM - desc CIDSCHGM - 28 - 28 - read-write - - - DISCIM - desc DISCIM - 29 - 29 - read-write - - - VBUSVIM - desc VBUSVIM - 30 - 30 - read-write - - - WKUIM - desc WKUIM - 31 - 31 - read-write - - - - - GRXSTSR - desc GRXSTSR - 0x1C - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXSTSP - desc GRXSTSP - 0x20 - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXFSIZ - desc GRXFSIZ - 0x24 - 32 - read-write - 0x280 - 0x7FF - - - RXFD - desc RXFD - 10 - 0 - read-write - - - - - HNPTXFSIZ - desc HNPTXFSIZ - 0x28 - 32 - read-write - 0x2800280 - 0xFFFFFFFF - - - NPTXFSA - desc NPTXFSA - 15 - 0 - read-write - - - NPTXFD - desc NPTXFD - 31 - 16 - read-write - - - - - HNPTXSTS - desc HNPTXSTS - 0x2C - 32 - read-only - 0x80280 - 0x7FFFFFFF - - - NPTXFSAV - desc NPTXFSAV - 15 - 0 - read-only - - - NPTQXSAV - desc NPTQXSAV - 23 - 16 - read-only - - - NPTXQTOP - desc NPTXQTOP - 30 - 24 - read-only - - - - - CID - desc CID - 0x3C - 32 - read-write - 0x12345678 - 0xFFFFFFFF - - - GLPMCFG - desc GLPMCFG - 0x54 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - LPMEN - desc LPMEN - 0 - 0 - read-write - - - LPMACK - desc LPMACK - 1 - 1 - read-write - - - BSEL - desc BSEL - 5 - 2 - read-write - - - REMWAKE - desc REMWAKE - 6 - 6 - read-write - - - L1SSEN - desc L1SSEN - 7 - 7 - read-write - - - BESLTHRS - desc BESLTHRS - 11 - 8 - read-write - - - L1DSEN - desc L1DSEN - 12 - 12 - read-write - - - LPMRSP - desc LPMRSP - 14 - 13 - read-only - - - SLPSTS - desc SLPSTS - 15 - 15 - read-only - - - L1RSMOK - desc L1RSMOK - 16 - 16 - read-only - - - LPMCHIDX - desc LPMCHIDX - 20 - 17 - read-write - - - LPMRCNT - desc LPMRCNT - 23 - 21 - read-write - - - SENDLPM - desc SENDLPM - 24 - 24 - read-write - - - LPMRCNTSTS - desc LPMRCNTSTS - 27 - 25 - read-only - - - ENBSEL - desc ENBSEL - 28 - 28 - read-write - - - - - HPTXFSIZ - desc HPTXFSIZ - 0x100 - 32 - read-write - 0x2800500 - 0xFFFFFFFF - - - PTXSA - desc PTXSA - 15 - 0 - read-write - - - PTXFD - desc PTXFD - 31 - 16 - read-write - - - - - DIEPTXF1 - desc DIEPTXF1 - 0x104 - 32 - read-write - 0x2800500 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF2 - desc DIEPTXF2 - 0x108 - 32 - read-write - 0x2800780 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF3 - desc DIEPTXF3 - 0x10C - 32 - read-write - 0x2800A00 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF4 - desc DIEPTXF4 - 0x110 - 32 - read-write - 0x2800C80 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF5 - desc DIEPTXF5 - 0x114 - 32 - read-write - 0x2800F00 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF6 - desc DIEPTXF6 - 0x118 - 32 - read-write - 0x2801180 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF7 - desc DIEPTXF7 - 0x11C - 32 - read-write - 0x2801400 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF8 - desc DIEPTXF8 - 0x120 - 32 - read-write - 0x2801680 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF9 - desc DIEPTXF9 - 0x124 - 32 - read-write - 0x2801900 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF10 - desc DIEPTXF10 - 0x128 - 32 - read-write - 0x2801B80 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF11 - desc DIEPTXF11 - 0x12C - 32 - read-write - 0x2801E00 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF12 - desc DIEPTXF12 - 0x130 - 32 - read-write - 0x2802080 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF13 - desc DIEPTXF13 - 0x134 - 32 - read-write - 0x2802300 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF14 - desc DIEPTXF14 - 0x138 - 32 - read-write - 0x2802580 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF15 - desc DIEPTXF15 - 0x13C - 32 - read-write - 0x2802800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - HCFG - desc HCFG - 0x400 - 32 - read-write - 0x200 - 0x7 - - - FSLSPCS - desc FSLSPCS - 1 - 0 - read-write - - - FSLSS - desc FSLSS - 2 - 2 - read-write - - - - - HFIR - desc HFIR - 0x404 - 32 - read-write - 0xEA60 - 0xFFFF - - - FRIVL - desc FRIVL - 15 - 0 - read-write - - - - - HFNUM - desc HFNUM - 0x408 - 32 - read-only - 0x3FFF - 0xFFFFFFFF - - - FRNUM - desc FRNUM - 15 - 0 - read-only - - - FTREM - desc FTREM - 31 - 16 - read-only - - - - - HPTXSTS - desc HPTXSTS - 0x410 - 32 - read-only - 0x80280 - 0xFFFFFFFF - - - PTXFSAVL - desc PTXFSAVL - 15 - 0 - read-only - - - PTXQSAV - desc PTXQSAV - 23 - 16 - read-only - - - PTXQTOP - desc PTXQTOP - 31 - 24 - read-only - - - - - HAINT - desc HAINT - 0x414 - 32 - read-only - 0x0 - 0xFFFF - - - HAINT - desc HAINT - 15 - 0 - read-only - - - - - HAINTMSK - desc HAINTMSK - 0x418 - 32 - read-write - 0x0 - 0xFFFF - - - HAINTM - desc HAINTM - 15 - 0 - read-write - - - - - HPRT - desc HPRT - 0x440 - 32 - read-only - 0x0 - 0x61DCF - - - PCSTS - desc PCSTS - 0 - 0 - read-only - - - PCDET - desc PCDET - 1 - 1 - read-write - - - PENA - desc PENA - 2 - 2 - read-write - - - PENCHNG - desc PENCHNG - 3 - 3 - read-write - - - PRES - desc PRES - 6 - 6 - read-write - - - PSUSP - desc PSUSP - 7 - 7 - read-write - - - PRST - desc PRST - 8 - 8 - read-write - - - PLSTS - desc PLSTS - 11 - 10 - read-only - - - PWPR - desc PWPR - 12 - 12 - read-write - - - PSPD - desc PSPD - 18 - 17 - read-only - - - - - HCCHAR0 - desc HCCHAR0 - 0x500 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT0 - desc HCINT0 - 0x508 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK0 - desc HCINTMSK0 - 0x50C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ0 - desc HCTSIZ0 - 0x510 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA0 - desc HCDMA0 - 0x514 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR1 - desc HCCHAR1 - 0x520 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT1 - desc HCINT1 - 0x528 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK1 - desc HCINTMSK1 - 0x52C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ1 - desc HCTSIZ1 - 0x530 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA1 - desc HCDMA1 - 0x534 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR2 - desc HCCHAR2 - 0x540 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT2 - desc HCINT2 - 0x548 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK2 - desc HCINTMSK2 - 0x54C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ2 - desc HCTSIZ2 - 0x550 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA2 - desc HCDMA2 - 0x554 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR3 - desc HCCHAR3 - 0x560 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT3 - desc HCINT3 - 0x568 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK3 - desc HCINTMSK3 - 0x56C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ3 - desc HCTSIZ3 - 0x570 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA3 - desc HCDMA3 - 0x574 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR4 - desc HCCHAR4 - 0x580 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT4 - desc HCINT4 - 0x588 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK4 - desc HCINTMSK4 - 0x58C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ4 - desc HCTSIZ4 - 0x590 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA4 - desc HCDMA4 - 0x594 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR5 - desc HCCHAR5 - 0x5A0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT5 - desc HCINT5 - 0x5A8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK5 - desc HCINTMSK5 - 0x5AC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ5 - desc HCTSIZ5 - 0x5B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA5 - desc HCDMA5 - 0x5B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR6 - desc HCCHAR6 - 0x5C0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT6 - desc HCINT6 - 0x5C8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK6 - desc HCINTMSK6 - 0x5CC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ6 - desc HCTSIZ6 - 0x5D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA6 - desc HCDMA6 - 0x5D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR7 - desc HCCHAR7 - 0x5E0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT7 - desc HCINT7 - 0x5E8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK7 - desc HCINTMSK7 - 0x5EC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ7 - desc HCTSIZ7 - 0x5F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA7 - desc HCDMA7 - 0x5F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR8 - desc HCCHAR8 - 0x600 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT8 - desc HCINT8 - 0x608 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK8 - desc HCINTMSK8 - 0x60C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ8 - desc HCTSIZ8 - 0x610 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA8 - desc HCDMA8 - 0x614 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR9 - desc HCCHAR9 - 0x620 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT9 - desc HCINT9 - 0x628 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK9 - desc HCINTMSK9 - 0x62C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ9 - desc HCTSIZ9 - 0x630 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA9 - desc HCDMA9 - 0x634 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR10 - desc HCCHAR10 - 0x640 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT10 - desc HCINT10 - 0x648 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK10 - desc HCINTMSK10 - 0x64C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ10 - desc HCTSIZ10 - 0x650 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA10 - desc HCDMA10 - 0x654 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR11 - desc HCCHAR11 - 0x660 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT11 - desc HCINT11 - 0x668 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK11 - desc HCINTMSK11 - 0x66C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ11 - desc HCTSIZ11 - 0x670 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA11 - desc HCDMA11 - 0x674 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR12 - desc HCCHAR12 - 0x680 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT12 - desc HCINT12 - 0x688 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK12 - desc HCINTMSK12 - 0x68C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ12 - desc HCTSIZ12 - 0x690 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA12 - desc HCDMA12 - 0x694 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR13 - desc HCCHAR13 - 0x6A0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT13 - desc HCINT13 - 0x6A8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK13 - desc HCINTMSK13 - 0x6AC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ13 - desc HCTSIZ13 - 0x6B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA13 - desc HCDMA13 - 0x6B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR14 - desc HCCHAR14 - 0x6C0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT14 - desc HCINT14 - 0x6C8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK14 - desc HCINTMSK14 - 0x6CC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ14 - desc HCTSIZ14 - 0x6D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA14 - desc HCDMA14 - 0x6D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR15 - desc HCCHAR15 - 0x6E0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT15 - desc HCINT15 - 0x6E8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK15 - desc HCINTMSK15 - 0x6EC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ15 - desc HCTSIZ15 - 0x6F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA15 - desc HCDMA15 - 0x6F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DCFG - desc DCFG - 0x800 - 32 - read-write - 0x8200000 - 0x1FF7 - - - DSPD - desc DSPD - 1 - 0 - read-write - - - NZLSOHSK - desc NZLSOHSK - 2 - 2 - read-write - - - DAD - desc DAD - 10 - 4 - read-write - - - PFIVL - desc PFIVL - 12 - 11 - read-write - - - - - DCTL - desc DCTL - 0x804 - 32 - read-write - 0x2 - 0xF8F - - - RWUSIG - desc RWUSIG - 0 - 0 - read-write - - - SDIS - desc SDIS - 1 - 1 - read-write - - - GINSTS - desc GINSTS - 2 - 2 - read-only - - - GONSTS - desc GONSTS - 3 - 3 - read-only - - - SGINAK - desc SGINAK - 7 - 7 - write-only - - - CGINAK - desc CGINAK - 8 - 8 - write-only - - - SGONAK - desc SGONAK - 9 - 9 - write-only - - - CGONAK - desc CGONAK - 10 - 10 - write-only - - - POPRGDNE - desc POPRGDNE - 11 - 11 - read-write - - - - - DSTS - desc DSTS - 0x808 - 32 - read-only - 0x2 - 0xFFFF0F - - - SUSPSTS - desc SUSPSTS - 0 - 0 - read-only - - - ENUMSPD - desc ENUMSPD - 2 - 1 - read-only - - - EERR - desc EERR - 3 - 3 - read-only - - - FNSOF - desc FNSOF - 21 - 8 - read-only - - - LNSTS - desc LNSTS - 23 - 22 - read-only - - - - - DIEPMSK - desc DIEPMSK - 0x810 - 32 - read-write - 0x0 - 0x207B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - TOM - desc TOM - 3 - 3 - read-write - - - ITTXFEMSK - desc ITTXFEMSK - 4 - 4 - read-write - - - INEPNMM - desc INEPNMM - 5 - 5 - read-write - - - INEPNEM - desc INEPNEM - 6 - 6 - read-write - - - NAKM - desc NAKM - 13 - 13 - read-write - - - - - DOEPMSK - desc DOEPMSK - 0x814 - 32 - read-write - 0x0 - 0x1B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - STUPM - desc STUPM - 3 - 3 - read-write - - - OTEPDM - desc OTEPDM - 4 - 4 - read-write - - - - - DAINT - desc DAINT - 0x818 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IEPINT - desc IEPINT - 15 - 0 - read-write - - - OEPINT - desc OEPINT - 31 - 16 - read-write - - - - - DAINTMSK - desc DAINTMSK - 0x81C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IEPINTM - desc IEPINTM - 15 - 0 - read-write - - - OEPINTM - desc OEPINTM - 31 - 16 - read-write - - - - - DIEPEMPMSK - desc DIEPEMPMSK - 0x834 - 32 - read-write - 0x0 - 0xFFFF - - - INEPTXFEM - desc INEPTXFEM - 15 - 0 - read-write - - - - - DIEPCTL0 - desc DIEPCTL0 - 0x900 - 32 - read-write - 0x8000 - 0xCFEE8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT0 - desc DIEPINT0 - 0x908 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ0 - desc DIEPTSIZ0 - 0x910 - 32 - read-write - 0x0 - 0x18007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 20 - 19 - read-write - - - - - DIEPDMA0 - desc DIEPDMA0 - 0x914 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS0 - desc DTXFSTS0 - 0x918 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL1 - desc DIEPCTL1 - 0x920 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT1 - desc DIEPINT1 - 0x928 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ1 - desc DIEPTSIZ1 - 0x930 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA1 - desc DIEPDMA1 - 0x934 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS1 - desc DTXFSTS1 - 0x938 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL2 - desc DIEPCTL2 - 0x940 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT2 - desc DIEPINT2 - 0x948 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ2 - desc DIEPTSIZ2 - 0x950 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA2 - desc DIEPDMA2 - 0x954 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS2 - desc DTXFSTS2 - 0x958 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL3 - desc DIEPCTL3 - 0x960 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT3 - desc DIEPINT3 - 0x968 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ3 - desc DIEPTSIZ3 - 0x970 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA3 - desc DIEPDMA3 - 0x974 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS3 - desc DTXFSTS3 - 0x978 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL4 - desc DIEPCTL4 - 0x980 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT4 - desc DIEPINT4 - 0x988 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ4 - desc DIEPTSIZ4 - 0x990 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA4 - desc DIEPDMA4 - 0x994 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS4 - desc DTXFSTS4 - 0x998 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL5 - desc DIEPCTL5 - 0x9A0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT5 - desc DIEPINT5 - 0x9A8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ5 - desc DIEPTSIZ5 - 0x9B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA5 - desc DIEPDMA5 - 0x9B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS5 - desc DTXFSTS5 - 0x9B8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL6 - desc DIEPCTL6 - 0x9C0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT6 - desc DIEPINT6 - 0x9C8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ6 - desc DIEPTSIZ6 - 0x9D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA6 - desc DIEPDMA6 - 0x9D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS6 - desc DTXFSTS6 - 0x9D8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL7 - desc DIEPCTL7 - 0x9E0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT7 - desc DIEPINT7 - 0x9E8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ7 - desc DIEPTSIZ7 - 0x9F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA7 - desc DIEPDMA7 - 0x9F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS7 - desc DTXFSTS7 - 0x9F8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL8 - desc DIEPCTL8 - 0xA00 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT8 - desc DIEPINT8 - 0xA08 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ8 - desc DIEPTSIZ8 - 0xA10 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA8 - desc DIEPDMA8 - 0xA14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS8 - desc DTXFSTS8 - 0xA18 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL9 - desc DIEPCTL9 - 0xA20 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT9 - desc DIEPINT9 - 0xA28 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ9 - desc DIEPTSIZ9 - 0xA30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA9 - desc DIEPDMA9 - 0xA34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS9 - desc DTXFSTS9 - 0xA38 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL10 - desc DIEPCTL10 - 0xA40 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT10 - desc DIEPINT10 - 0xA48 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ10 - desc DIEPTSIZ10 - 0xA50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA10 - desc DIEPDMA10 - 0xA54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS10 - desc DTXFSTS10 - 0xA58 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL11 - desc DIEPCTL11 - 0xA60 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT11 - desc DIEPINT11 - 0xA68 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ11 - desc DIEPTSIZ11 - 0xA70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA11 - desc DIEPDMA11 - 0xA74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS11 - desc DTXFSTS11 - 0xA78 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL12 - desc DIEPCTL12 - 0xA80 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT12 - desc DIEPINT12 - 0xA88 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ12 - desc DIEPTSIZ12 - 0xA90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA12 - desc DIEPDMA12 - 0xA94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS12 - desc DTXFSTS12 - 0xA98 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL13 - desc DIEPCTL13 - 0xAA0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT13 - desc DIEPINT13 - 0xAA8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ13 - desc DIEPTSIZ13 - 0xAB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA13 - desc DIEPDMA13 - 0xAB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS13 - desc DTXFSTS13 - 0xAB8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL14 - desc DIEPCTL14 - 0xAC0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT14 - desc DIEPINT14 - 0xAC8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ14 - desc DIEPTSIZ14 - 0xAD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA14 - desc DIEPDMA14 - 0xAD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS14 - desc DTXFSTS14 - 0xAD8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL15 - desc DIEPCTL15 - 0xAE0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT15 - desc DIEPINT15 - 0xAE8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ15 - desc DIEPTSIZ15 - 0xAF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA15 - desc DIEPDMA15 - 0xAF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS15 - desc DTXFSTS15 - 0xAF8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DOEPCTL0 - desc DOEPCTL0 - 0xB00 - 32 - read-write - 0x8000 - 0xCC3E8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT0 - desc DOEPINT0 - 0xB08 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ0 - desc DOEPTSIZ0 - 0xB10 - 32 - read-write - 0x0 - 0x6008007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 19 - 19 - read-write - - - STUPCNT - desc STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA0 - desc DOEPDMA0 - 0xB14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL1 - desc DOEPCTL1 - 0xB20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT1 - desc DOEPINT1 - 0xB28 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ1 - desc DOEPTSIZ1 - 0xB30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA1 - desc DOEPDMA1 - 0xB34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL2 - desc DOEPCTL2 - 0xB40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT2 - desc DOEPINT2 - 0xB48 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ2 - desc DOEPTSIZ2 - 0xB50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA2 - desc DOEPDMA2 - 0xB54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL3 - desc DOEPCTL3 - 0xB60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT3 - desc DOEPINT3 - 0xB68 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ3 - desc DOEPTSIZ3 - 0xB70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA3 - desc DOEPDMA3 - 0xB74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL4 - desc DOEPCTL4 - 0xB80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT4 - desc DOEPINT4 - 0xB88 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ4 - desc DOEPTSIZ4 - 0xB90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA4 - desc DOEPDMA4 - 0xB94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL5 - desc DOEPCTL5 - 0xBA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT5 - desc DOEPINT5 - 0xBA8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ5 - desc DOEPTSIZ5 - 0xBB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA5 - desc DOEPDMA5 - 0xBB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL6 - desc DOEPCTL6 - 0xBC0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT6 - desc DOEPINT6 - 0xBC8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ6 - desc DOEPTSIZ6 - 0xBD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA6 - desc DOEPDMA6 - 0xBD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL7 - desc DOEPCTL7 - 0xBE0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT7 - desc DOEPINT7 - 0xBE8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ7 - desc DOEPTSIZ7 - 0xBF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA7 - desc DOEPDMA7 - 0xBF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL8 - desc DOEPCTL8 - 0xC00 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT8 - desc DOEPINT8 - 0xC08 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ8 - desc DOEPTSIZ8 - 0xC10 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA8 - desc DOEPDMA8 - 0xC14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL9 - desc DOEPCTL9 - 0xC20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT9 - desc DOEPINT9 - 0xC28 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ9 - desc DOEPTSIZ9 - 0xC30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA9 - desc DOEPDMA9 - 0xC34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL10 - desc DOEPCTL10 - 0xC40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT10 - desc DOEPINT10 - 0xC48 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ10 - desc DOEPTSIZ10 - 0xC50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA10 - desc DOEPDMA10 - 0xC54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL11 - desc DOEPCTL11 - 0xC60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT11 - desc DOEPINT11 - 0xC68 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ11 - desc DOEPTSIZ11 - 0xC70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA11 - desc DOEPDMA11 - 0xC74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL12 - desc DOEPCTL12 - 0xC80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT12 - desc DOEPINT12 - 0xC88 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ12 - desc DOEPTSIZ12 - 0xC90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA12 - desc DOEPDMA12 - 0xC94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL13 - desc DOEPCTL13 - 0xCA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT13 - desc DOEPINT13 - 0xCA8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ13 - desc DOEPTSIZ13 - 0xCB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA13 - desc DOEPDMA13 - 0xCB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL14 - desc DOEPCTL14 - 0xCC0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT14 - desc DOEPINT14 - 0xCC8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ14 - desc DOEPTSIZ14 - 0xCD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA14 - desc DOEPDMA14 - 0xCD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL15 - desc DOEPCTL15 - 0xCE0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT15 - desc DOEPINT15 - 0xCE8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ15 - desc DOEPTSIZ15 - 0xCF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA15 - desc DOEPDMA15 - 0xCF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - GCCTL - desc GCCTL - 0xE00 - 32 - read-write - 0x0 - 0xE3 - - - STPPCLK - desc STPPCLK - 0 - 0 - read-write - - - GATEHCLK - desc GATEHCLK - 1 - 1 - read-write - - - ENL1GTG - desc ENL1GTG - 5 - 5 - read-write - - - PHYSLEEP - desc PHYSLEEP - 6 - 6 - read-write - - - SUSP - desc SUSP - 7 - 7 - read-write - - - - - - - USBHS - desc USBHS - 0x400C0000 - - 0x0 - 0xE04 - - - - GVBUSCFG - desc GVBUSCFG - 0x0 - 32 - read-write - 0x0 - 0xC0 - - - VBUSOVEN - desc VBUSOVEN - 6 - 6 - read-write - - - VBUSVAL - desc VBUSVAL - 7 - 7 - read-write - - - - - GAHBCFG - desc GAHBCFG - 0x8 - 32 - read-write - 0x0 - 0x1BF - - - GINTMSK - desc GINTMSK - 0 - 0 - read-write - - - HBSTLEN - desc HBSTLEN - 4 - 1 - read-write - - - DMAEN - desc DMAEN - 5 - 5 - read-write - - - TXFELVL - desc TXFELVL - 7 - 7 - read-write - - - PTXFELVL - desc PTXFELVL - 8 - 8 - read-write - - - - - GUSBCFG - desc GUSBCFG - 0xC - 32 - read-write - 0x1410 - 0x63BEBC47 - - - TOCAL - desc TOCAL - 2 - 0 - read-write - - - PHYSEL - desc PHYSEL - 6 - 6 - read-write - - - TRDT - desc TRDT - 13 - 10 - read-write - - - PHYLPCS - desc PHYLPCS - 15 - 15 - read-write - - - ULFSLS - desc ULFSLS - 17 - 17 - read-write - - - ULPIAR - desc ULPIAR - 18 - 18 - read-write - - - ULPICSM - desc ULPICSM - 19 - 19 - read-write - - - ULPIEVBUSD - desc ULPIEVBUSD - 20 - 20 - read-write - - - ULPIEVBUSI - desc ULPIEVBUSI - 21 - 21 - read-write - - - PCCI - desc PCCI - 23 - 23 - read-write - - - PTCI - desc PTCI - 24 - 24 - read-write - - - ULPIPD - desc ULPIPD - 25 - 25 - read-write - - - FHMOD - desc FHMOD - 29 - 29 - read-write - - - FDMOD - desc FDMOD - 30 - 30 - read-write - - - - - GRSTCTL - desc GRSTCTL - 0x10 - 32 - read-write - 0x80000000 - 0xC00007F7 - - - CSRST - desc CSRST - 0 - 0 - read-write - - - HSRST - desc HSRST - 1 - 1 - read-write - - - FCRST - desc FCRST - 2 - 2 - read-write - - - RXFFLSH - desc RXFFLSH - 4 - 4 - read-write - - - TXFFLSH - desc TXFFLSH - 5 - 5 - read-write - - - TXFNUM - desc TXFNUM - 10 - 6 - read-write - - - DMAREQ - desc DMAREQ - 30 - 30 - read-only - - - AHBIDL - desc AHBIDL - 31 - 31 - read-only - - - - - GINTSTS - desc GINTSTS - 0x14 - 32 - read-only - 0x14000020 - 0xFF7CFCFB - - - CMOD - desc CMOD - 0 - 0 - read-only - - - MMIS - desc MMIS - 1 - 1 - read-write - - - SOF - desc SOF - 3 - 3 - read-write - - - RXFNE - desc RXFNE - 4 - 4 - read-only - - - NPTXFE - desc NPTXFE - 5 - 5 - read-only - - - GINAKEFF - desc GINAKEFF - 6 - 6 - read-only - - - GONAKEFF - desc GONAKEFF - 7 - 7 - read-only - - - ESUSP - desc ESUSP - 10 - 10 - read-write - - - USBSUSP - desc USBSUSP - 11 - 11 - read-write - - - USBRST - desc USBRST - 12 - 12 - read-write - - - ENUMDNE - desc ENUMDNE - 13 - 13 - read-write - - - ISOODRP - desc ISOODRP - 14 - 14 - read-write - - - EOPF - desc EOPF - 15 - 15 - read-write - - - IEPINT - desc IEPINT - 18 - 18 - read-only - - - OEPINT - desc OEPINT - 19 - 19 - read-only - - - IISOIXFR - desc IISOIXFR - 20 - 20 - read-write - - - IPXFR_INCOMPISOOUT - desc IPXFR_INCOMPISOOUT - 21 - 21 - read-write - - - DATAFSUSP - desc DATAFSUSP - 22 - 22 - read-write - - - HPRTINT - desc HPRTINT - 24 - 24 - read-only - - - HCINT - desc HCINT - 25 - 25 - read-only - - - PTXFE - desc PTXFE - 26 - 26 - read-only - - - LPMINT - desc LPMINT - 27 - 27 - read-write - - - CIDSCHG - desc CIDSCHG - 28 - 28 - read-write - - - DISCINT - desc DISCINT - 29 - 29 - read-write - - - VBUSVINT - desc VBUSVINT - 30 - 30 - read-write - - - WKUINT - desc WKUINT - 31 - 31 - read-write - - - - - GINTMSK - desc GINTMSK - 0x18 - 32 - read-write - 0x0 - 0xFF7CFCFA - - - MMISM - desc MMISM - 1 - 1 - read-write - - - SOFM - desc SOFM - 3 - 3 - read-write - - - RXFNEM - desc RXFNEM - 4 - 4 - read-write - - - NPTXFEM - desc NPTXFEM - 5 - 5 - read-write - - - GINAKEFFM - desc GINAKEFFM - 6 - 6 - read-write - - - GONAKEFFM - desc GONAKEFFM - 7 - 7 - read-write - - - ESUSPM - desc ESUSPM - 10 - 10 - read-write - - - USBSUSPM - desc USBSUSPM - 11 - 11 - read-write - - - USBRSTM - desc USBRSTM - 12 - 12 - read-write - - - ENUMDNEM - desc ENUMDNEM - 13 - 13 - read-write - - - ISOODRPM - desc ISOODRPM - 14 - 14 - read-write - - - EOPFM - desc EOPFM - 15 - 15 - read-write - - - IEPIM - desc IEPIM - 18 - 18 - read-write - - - OEPIM - desc OEPIM - 19 - 19 - read-write - - - IISOIXFRM - desc IISOIXFRM - 20 - 20 - read-write - - - IPXFRM_INCOMPISOOUTM - desc IPXFRM_INCOMPISOOUTM - 21 - 21 - read-write - - - DATAFSUSPM - desc DATAFSUSPM - 22 - 22 - read-write - - - HPRTIM - desc HPRTIM - 24 - 24 - read-write - - - HCIM - desc HCIM - 25 - 25 - read-write - - - PTXFEM - desc PTXFEM - 26 - 26 - read-write - - - LPMINTM - desc LPMINTM - 27 - 27 - read-write - - - CIDSCHGM - desc CIDSCHGM - 28 - 28 - read-write - - - DISCIM - desc DISCIM - 29 - 29 - read-write - - - VBUSVIM - desc VBUSVIM - 30 - 30 - read-write - - - WKUIM - desc WKUIM - 31 - 31 - read-write - - - - - GRXSTSR - desc GRXSTSR - 0x1C - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXSTSP - desc GRXSTSP - 0x20 - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXFSIZ - desc GRXFSIZ - 0x24 - 32 - read-write - 0x800 - 0xFFF - - - RXFD - desc RXFD - 11 - 0 - read-write - - - - - HNPTXFSIZ - desc HNPTXFSIZ - 0x28 - 32 - read-write - 0x8000800 - 0xFFFFFFFF - - - NPTXFSA - desc NPTXFSA - 15 - 0 - read-write - - - NPTXFD - desc NPTXFD - 31 - 16 - read-write - - - - - HNPTXSTS - desc HNPTXSTS - 0x2C - 32 - read-only - 0x80800 - 0x7FFFFFFF - - - NPTXFSAV - desc NPTXFSAV - 15 - 0 - read-only - - - NPTQXSAV - desc NPTQXSAV - 23 - 16 - read-only - - - NPTXQTOP - desc NPTXQTOP - 30 - 24 - read-only - - - - - CID - desc CID - 0x3C - 32 - read-write - 0x12345678 - 0xFFFFFFFF - - - GLPMCFG - desc GLPMCFG - 0x54 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - LPMEN - desc LPMEN - 0 - 0 - read-write - - - LPMACK - desc LPMACK - 1 - 1 - read-write - - - BSEL - desc BSEL - 5 - 2 - read-write - - - REMWAKE - desc REMWAKE - 6 - 6 - read-write - - - L1SSEN - desc L1SSEN - 7 - 7 - read-write - - - BESLTHRS - desc BESLTHRS - 11 - 8 - read-write - - - L1DSEN - desc L1DSEN - 12 - 12 - read-write - - - LPMRSP - desc LPMRSP - 14 - 13 - read-only - - - SLPSTS - desc SLPSTS - 15 - 15 - read-only - - - L1RSMOK - desc L1RSMOK - 16 - 16 - read-only - - - LPMCHIDX - desc LPMCHIDX - 20 - 17 - read-write - - - LPMRCNT - desc LPMRCNT - 23 - 21 - read-write - - - SENDLPM - desc SENDLPM - 24 - 24 - read-write - - - LPMRCNTSTS - desc LPMRCNTSTS - 27 - 25 - read-only - - - ENBSEL - desc ENBSEL - 28 - 28 - read-write - - - - - HPTXFSIZ - desc HPTXFSIZ - 0x100 - 32 - read-write - 0x8001000 - 0xFFFFFFFF - - - PTXSA - desc PTXSA - 15 - 0 - read-write - - - PTXFD - desc PTXFD - 31 - 16 - read-write - - - - - DIEPTXF1 - desc DIEPTXF1 - 0x104 - 32 - read-write - 0x8001000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF2 - desc DIEPTXF2 - 0x108 - 32 - read-write - 0x8001800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF3 - desc DIEPTXF3 - 0x10C - 32 - read-write - 0x8002000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF4 - desc DIEPTXF4 - 0x110 - 32 - read-write - 0x8002800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF5 - desc DIEPTXF5 - 0x114 - 32 - read-write - 0x8003000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF6 - desc DIEPTXF6 - 0x118 - 32 - read-write - 0x8003800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF7 - desc DIEPTXF7 - 0x11C - 32 - read-write - 0x8004000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF8 - desc DIEPTXF8 - 0x120 - 32 - read-write - 0x8004800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF9 - desc DIEPTXF9 - 0x124 - 32 - read-write - 0x8005000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF10 - desc DIEPTXF10 - 0x128 - 32 - read-write - 0x8005800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF11 - desc DIEPTXF11 - 0x12C - 32 - read-write - 0x8006000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF12 - desc DIEPTXF12 - 0x130 - 32 - read-write - 0x8006800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF13 - desc DIEPTXF13 - 0x134 - 32 - read-write - 0x8007000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF14 - desc DIEPTXF14 - 0x138 - 32 - read-write - 0x8007800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF15 - desc DIEPTXF15 - 0x13C - 32 - read-write - 0x8008000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - HCFG - desc HCFG - 0x400 - 32 - read-write - 0x200 - 0x7 - - - FSLSPCS - desc FSLSPCS - 1 - 0 - read-write - - - FSLSS - desc FSLSS - 2 - 2 - read-write - - - - - HFIR - desc HFIR - 0x404 - 32 - read-write - 0xEA60 - 0xFFFF - - - FRIVL - desc FRIVL - 15 - 0 - read-write - - - - - HFNUM - desc HFNUM - 0x408 - 32 - read-only - 0x3FFF - 0xFFFFFFFF - - - FRNUM - desc FRNUM - 15 - 0 - read-only - - - FTREM - desc FTREM - 31 - 16 - read-only - - - - - HPTXSTS - desc HPTXSTS - 0x410 - 32 - read-only - 0x80800 - 0xFFFFFFFF - - - PTXFSAVL - desc PTXFSAVL - 15 - 0 - read-only - - - PTXQSAV - desc PTXQSAV - 23 - 16 - read-only - - - PTXQTOP - desc PTXQTOP - 31 - 24 - read-only - - - - - HAINT - desc HAINT - 0x414 - 32 - read-only - 0x0 - 0xFFFF - - - HAINT - desc HAINT - 15 - 0 - read-only - - - - - HAINTMSK - desc HAINTMSK - 0x418 - 32 - read-write - 0x0 - 0xFFFF - - - HAINTM - desc HAINTM - 15 - 0 - read-write - - - - - HPRT - desc HPRT - 0x440 - 32 - read-only - 0x0 - 0x7FDFF - - - PCSTS - desc PCSTS - 0 - 0 - read-only - - - PCDET - desc PCDET - 1 - 1 - read-write - - - PENA - desc PENA - 2 - 2 - read-write - - - PENCHNG - desc PENCHNG - 3 - 3 - read-write - - - POCA - desc POCA - 4 - 4 - read-write - - - POCCHNG - desc POCCHNG - 5 - 5 - read-write - - - PRES - desc PRES - 6 - 6 - read-write - - - PSUSP - desc PSUSP - 7 - 7 - read-write - - - PRST - desc PRST - 8 - 8 - read-write - - - PLSTS - desc PLSTS - 11 - 10 - read-only - - - PWPR - desc PWPR - 12 - 12 - read-write - - - PTCTL - desc PTCTL - 16 - 13 - read-write - - - PSPD - desc PSPD - 18 - 17 - read-only - - - - - HCCHAR0 - desc HCCHAR0 - 0x500 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT0 - desc HCSPLT0 - 0x504 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT0 - desc HCINT0 - 0x508 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK0 - desc HCINTMSK0 - 0x50C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ0 - desc HCTSIZ0 - 0x510 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA0 - desc HCDMA0 - 0x514 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR1 - desc HCCHAR1 - 0x520 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT1 - desc HCSPLT1 - 0x524 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT1 - desc HCINT1 - 0x528 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK1 - desc HCINTMSK1 - 0x52C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ1 - desc HCTSIZ1 - 0x530 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA1 - desc HCDMA1 - 0x534 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR2 - desc HCCHAR2 - 0x540 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT2 - desc HCSPLT2 - 0x544 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT2 - desc HCINT2 - 0x548 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK2 - desc HCINTMSK2 - 0x54C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ2 - desc HCTSIZ2 - 0x550 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA2 - desc HCDMA2 - 0x554 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR3 - desc HCCHAR3 - 0x560 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT3 - desc HCSPLT3 - 0x564 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT3 - desc HCINT3 - 0x568 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK3 - desc HCINTMSK3 - 0x56C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ3 - desc HCTSIZ3 - 0x570 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA3 - desc HCDMA3 - 0x574 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR4 - desc HCCHAR4 - 0x580 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT4 - desc HCSPLT4 - 0x584 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT4 - desc HCINT4 - 0x588 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK4 - desc HCINTMSK4 - 0x58C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ4 - desc HCTSIZ4 - 0x590 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA4 - desc HCDMA4 - 0x594 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR5 - desc HCCHAR5 - 0x5A0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT5 - desc HCSPLT5 - 0x5A4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT5 - desc HCINT5 - 0x5A8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK5 - desc HCINTMSK5 - 0x5AC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ5 - desc HCTSIZ5 - 0x5B0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA5 - desc HCDMA5 - 0x5B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR6 - desc HCCHAR6 - 0x5C0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT6 - desc HCSPLT6 - 0x5C4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT6 - desc HCINT6 - 0x5C8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK6 - desc HCINTMSK6 - 0x5CC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ6 - desc HCTSIZ6 - 0x5D0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA6 - desc HCDMA6 - 0x5D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR7 - desc HCCHAR7 - 0x5E0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT7 - desc HCSPLT7 - 0x5E4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT7 - desc HCINT7 - 0x5E8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK7 - desc HCINTMSK7 - 0x5EC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ7 - desc HCTSIZ7 - 0x5F0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA7 - desc HCDMA7 - 0x5F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR8 - desc HCCHAR8 - 0x600 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT8 - desc HCSPLT8 - 0x604 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT8 - desc HCINT8 - 0x608 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK8 - desc HCINTMSK8 - 0x60C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ8 - desc HCTSIZ8 - 0x610 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA8 - desc HCDMA8 - 0x614 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR9 - desc HCCHAR9 - 0x620 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT9 - desc HCSPLT9 - 0x624 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT9 - desc HCINT9 - 0x628 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK9 - desc HCINTMSK9 - 0x62C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ9 - desc HCTSIZ9 - 0x630 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA9 - desc HCDMA9 - 0x634 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR10 - desc HCCHAR10 - 0x640 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT10 - desc HCSPLT10 - 0x644 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT10 - desc HCINT10 - 0x648 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK10 - desc HCINTMSK10 - 0x64C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ10 - desc HCTSIZ10 - 0x650 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA10 - desc HCDMA10 - 0x654 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR11 - desc HCCHAR11 - 0x660 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT11 - desc HCSPLT11 - 0x664 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT11 - desc HCINT11 - 0x668 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK11 - desc HCINTMSK11 - 0x66C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ11 - desc HCTSIZ11 - 0x670 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA11 - desc HCDMA11 - 0x674 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR12 - desc HCCHAR12 - 0x680 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT12 - desc HCSPLT12 - 0x684 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT12 - desc HCINT12 - 0x688 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK12 - desc HCINTMSK12 - 0x68C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ12 - desc HCTSIZ12 - 0x690 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA12 - desc HCDMA12 - 0x694 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR13 - desc HCCHAR13 - 0x6A0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT13 - desc HCSPLT13 - 0x6A4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT13 - desc HCINT13 - 0x6A8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK13 - desc HCINTMSK13 - 0x6AC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ13 - desc HCTSIZ13 - 0x6B0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA13 - desc HCDMA13 - 0x6B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR14 - desc HCCHAR14 - 0x6C0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT14 - desc HCSPLT14 - 0x6C4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT14 - desc HCINT14 - 0x6C8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK14 - desc HCINTMSK14 - 0x6CC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ14 - desc HCTSIZ14 - 0x6D0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA14 - desc HCDMA14 - 0x6D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR15 - desc HCCHAR15 - 0x6E0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT15 - desc HCSPLT15 - 0x6E4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT15 - desc HCINT15 - 0x6E8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK15 - desc HCINTMSK15 - 0x6EC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ15 - desc HCTSIZ15 - 0x6F0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA15 - desc HCDMA15 - 0x6F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DCFG - desc DCFG - 0x800 - 32 - read-write - 0x8220000 - 0x1FF7 - - - DSPD - desc DSPD - 1 - 0 - read-write - - - NZLSOHSK - desc NZLSOHSK - 2 - 2 - read-write - - - DAD - desc DAD - 10 - 4 - read-write - - - PFIVL - desc PFIVL - 12 - 11 - read-write - - - - - DCTL - desc DCTL - 0x804 - 32 - read-write - 0x2 - 0xFFF - - - RWUSIG - desc RWUSIG - 0 - 0 - read-write - - - SDIS - desc SDIS - 1 - 1 - read-write - - - GINSTS - desc GINSTS - 2 - 2 - read-only - - - GONSTS - desc GONSTS - 3 - 3 - read-only - - - TCTL - desc TCTL - 6 - 4 - read-write - - - SGINAK - desc SGINAK - 7 - 7 - read-write - - - CGINAK - desc CGINAK - 8 - 8 - read-write - - - SGONAK - desc SGONAK - 9 - 9 - read-write - - - CGONAK - desc CGONAK - 10 - 10 - read-write - - - POPRGDNE - desc POPRGDNE - 11 - 11 - read-write - - - - - DSTS - desc DSTS - 0x808 - 32 - read-only - 0x2 - 0xFFFF0F - - - SUSPSTS - desc SUSPSTS - 0 - 0 - read-only - - - ENUMSPD - desc ENUMSPD - 2 - 1 - read-only - - - EERR - desc EERR - 3 - 3 - read-only - - - FNSOF - desc FNSOF - 21 - 8 - read-only - - - LNSTS - desc LNSTS - 23 - 22 - read-only - - - - - DIEPMSK - desc DIEPMSK - 0x810 - 32 - read-write - 0x0 - 0x217B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - TOM - desc TOM - 3 - 3 - read-write - - - TTXFEMSK - desc TTXFEMSK - 4 - 4 - read-write - - - INEPNMM - desc INEPNMM - 5 - 5 - read-write - - - INEPNEM - desc INEPNEM - 6 - 6 - read-write - - - TXFURM - desc TXFURM - 8 - 8 - read-write - - - NAKM - desc NAKM - 13 - 13 - read-write - - - - - DOEPMSK - desc DOEPMSK - 0x814 - 32 - read-write - 0x0 - 0x415B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - STUPM - desc STUPM - 3 - 3 - read-write - - - OTEPDM - desc OTEPDM - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - OPEM - desc OPEM - 8 - 8 - read-write - - - NYETM - desc NYETM - 14 - 14 - read-write - - - - - DAINT - desc DAINT - 0x818 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IEPINT - desc IEPINT - 15 - 0 - read-write - - - OEPINT - desc OEPINT - 31 - 16 - read-write - - - - - DAINTMSK - desc DAINTMSK - 0x81C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IEPINTM - desc IEPINTM - 15 - 0 - read-write - - - OEPINTM - desc OEPINTM - 31 - 16 - read-write - - - - - DTHRCTL - desc DTHRCTL - 0x830 - 32 - read-write - 0xC100020 - 0xBFF07FF - - - NONISOTHREN - desc NONISOTHREN - 0 - 0 - read-write - - - ISOTHREN - desc ISOTHREN - 1 - 1 - read-write - - - TXTHRLEN - desc TXTHRLEN - 10 - 2 - read-write - - - RXTHREN - desc RXTHREN - 16 - 16 - read-write - - - RXTHRLEN - desc RXTHRLEN - 25 - 17 - read-write - - - ARPEN - desc ARPEN - 27 - 27 - read-write - - - - - DIEPEMPMSK - desc DIEPEMPMSK - 0x834 - 32 - read-write - 0x0 - 0xFFFF - - - INEPTXFEM - desc INEPTXFEM - 15 - 0 - read-write - - - - - DEACHINT - desc DEACHINT - 0x838 - 32 - read-write - 0x0 - 0x20002 - - - IEP1INT - desc IEP1INT - 1 - 1 - read-write - - - OEP1INT - desc OEP1INT - 17 - 17 - read-write - - - - - DEACHINTMSK - desc DEACHINTMSK - 0x83C - 32 - read-write - 0x0 - 0x20002 - - - IEP1INTM - desc IEP1INTM - 1 - 1 - read-write - - - OEP1INTM - desc OEP1INTM - 17 - 17 - read-write - - - - - DIEPEACHMSK1 - desc DIEPEACHMSK1 - 0x844 - 32 - read-write - 0x0 - 0x217B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - TOM - desc TOM - 3 - 3 - read-write - - - TTXFEMSK - desc TTXFEMSK - 4 - 4 - read-write - - - INEPNMM - desc INEPNMM - 5 - 5 - read-write - - - INEPNEM - desc INEPNEM - 6 - 6 - read-write - - - TXFURM - desc TXFURM - 8 - 8 - read-write - - - NAKM - desc NAKM - 13 - 13 - read-write - - - - - DOEPEACHMSK1 - desc DOEPEACHMSK1 - 0x884 - 32 - read-write - 0x0 - 0x415B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - STUPM - desc STUPM - 3 - 3 - read-write - - - OTEPDM - desc OTEPDM - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - OPEM - desc OPEM - 8 - 8 - read-write - - - NYETM - desc NYETM - 14 - 14 - read-write - - - - - DIEPCTL0 - desc DIEPCTL0 - 0x900 - 32 - read-only - 0x8000 - 0xCFEE8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT0 - desc DIEPINT0 - 0x908 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ0 - desc DIEPTSIZ0 - 0x910 - 32 - read-write - 0x0 - 0x18007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 20 - 19 - read-write - - - - - DIEPDMA0 - desc DIEPDMA0 - 0x914 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS0 - desc DTXFSTS0 - 0x918 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL1 - desc DIEPCTL1 - 0x920 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT1 - desc DIEPINT1 - 0x928 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ1 - desc DIEPTSIZ1 - 0x930 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA1 - desc DIEPDMA1 - 0x934 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS1 - desc DTXFSTS1 - 0x938 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL2 - desc DIEPCTL2 - 0x940 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT2 - desc DIEPINT2 - 0x948 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ2 - desc DIEPTSIZ2 - 0x950 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA2 - desc DIEPDMA2 - 0x954 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS2 - desc DTXFSTS2 - 0x958 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL3 - desc DIEPCTL3 - 0x960 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT3 - desc DIEPINT3 - 0x968 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ3 - desc DIEPTSIZ3 - 0x970 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA3 - desc DIEPDMA3 - 0x974 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS3 - desc DTXFSTS3 - 0x978 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL4 - desc DIEPCTL4 - 0x980 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT4 - desc DIEPINT4 - 0x988 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ4 - desc DIEPTSIZ4 - 0x990 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA4 - desc DIEPDMA4 - 0x994 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS4 - desc DTXFSTS4 - 0x998 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL5 - desc DIEPCTL5 - 0x9A0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT5 - desc DIEPINT5 - 0x9A8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ5 - desc DIEPTSIZ5 - 0x9B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA5 - desc DIEPDMA5 - 0x9B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS5 - desc DTXFSTS5 - 0x9B8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL6 - desc DIEPCTL6 - 0x9C0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT6 - desc DIEPINT6 - 0x9C8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ6 - desc DIEPTSIZ6 - 0x9D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA6 - desc DIEPDMA6 - 0x9D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS6 - desc DTXFSTS6 - 0x9D8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL7 - desc DIEPCTL7 - 0x9E0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT7 - desc DIEPINT7 - 0x9E8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ7 - desc DIEPTSIZ7 - 0x9F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA7 - desc DIEPDMA7 - 0x9F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS7 - desc DTXFSTS7 - 0x9F8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL8 - desc DIEPCTL8 - 0xA00 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT8 - desc DIEPINT8 - 0xA08 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ8 - desc DIEPTSIZ8 - 0xA10 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA8 - desc DIEPDMA8 - 0xA14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS8 - desc DTXFSTS8 - 0xA18 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL9 - desc DIEPCTL9 - 0xA20 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT9 - desc DIEPINT9 - 0xA28 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ9 - desc DIEPTSIZ9 - 0xA30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA9 - desc DIEPDMA9 - 0xA34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS9 - desc DTXFSTS9 - 0xA38 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL10 - desc DIEPCTL10 - 0xA40 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT10 - desc DIEPINT10 - 0xA48 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ10 - desc DIEPTSIZ10 - 0xA50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA10 - desc DIEPDMA10 - 0xA54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS10 - desc DTXFSTS10 - 0xA58 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL11 - desc DIEPCTL11 - 0xA60 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT11 - desc DIEPINT11 - 0xA68 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ11 - desc DIEPTSIZ11 - 0xA70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA11 - desc DIEPDMA11 - 0xA74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS11 - desc DTXFSTS11 - 0xA78 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL12 - desc DIEPCTL12 - 0xA80 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT12 - desc DIEPINT12 - 0xA88 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ12 - desc DIEPTSIZ12 - 0xA90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA12 - desc DIEPDMA12 - 0xA94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS12 - desc DTXFSTS12 - 0xA98 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL13 - desc DIEPCTL13 - 0xAA0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT13 - desc DIEPINT13 - 0xAA8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ13 - desc DIEPTSIZ13 - 0xAB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA13 - desc DIEPDMA13 - 0xAB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS13 - desc DTXFSTS13 - 0xAB8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL14 - desc DIEPCTL14 - 0xAC0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT14 - desc DIEPINT14 - 0xAC8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ14 - desc DIEPTSIZ14 - 0xAD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA14 - desc DIEPDMA14 - 0xAD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS14 - desc DTXFSTS14 - 0xAD8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL15 - desc DIEPCTL15 - 0xAE0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT15 - desc DIEPINT15 - 0xAE8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ15 - desc DIEPTSIZ15 - 0xAF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA15 - desc DIEPDMA15 - 0xAF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS15 - desc DTXFSTS15 - 0xAF8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DOEPCTL0 - desc DOEPCTL0 - 0xB00 - 32 - read-only - 0x8000 - 0xCC3E8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT0 - desc DOEPINT0 - 0xB08 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ0 - desc DOEPTSIZ0 - 0xB10 - 32 - read-write - 0x0 - 0x6008007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 19 - 19 - read-write - - - STUPCNT - desc STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA0 - desc DOEPDMA0 - 0xB14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL1 - desc DOEPCTL1 - 0xB20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT1 - desc DOEPINT1 - 0xB28 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ1 - desc DOEPTSIZ1 - 0xB30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA1 - desc DOEPDMA1 - 0xB34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL2 - desc DOEPCTL2 - 0xB40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT2 - desc DOEPINT2 - 0xB48 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ2 - desc DOEPTSIZ2 - 0xB50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA2 - desc DOEPDMA2 - 0xB54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL3 - desc DOEPCTL3 - 0xB60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT3 - desc DOEPINT3 - 0xB68 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ3 - desc DOEPTSIZ3 - 0xB70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA3 - desc DOEPDMA3 - 0xB74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL4 - desc DOEPCTL4 - 0xB80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT4 - desc DOEPINT4 - 0xB88 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ4 - desc DOEPTSIZ4 - 0xB90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA4 - desc DOEPDMA4 - 0xB94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL5 - desc DOEPCTL5 - 0xBA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT5 - desc DOEPINT5 - 0xBA8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ5 - desc DOEPTSIZ5 - 0xBB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA5 - desc DOEPDMA5 - 0xBB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL6 - desc DOEPCTL6 - 0xBC0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT6 - desc DOEPINT6 - 0xBC8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ6 - desc DOEPTSIZ6 - 0xBD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA6 - desc DOEPDMA6 - 0xBD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL7 - desc DOEPCTL7 - 0xBE0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT7 - desc DOEPINT7 - 0xBE8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ7 - desc DOEPTSIZ7 - 0xBF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA7 - desc DOEPDMA7 - 0xBF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL8 - desc DOEPCTL8 - 0xC00 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT8 - desc DOEPINT8 - 0xC08 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ8 - desc DOEPTSIZ8 - 0xC10 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA8 - desc DOEPDMA8 - 0xC14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL9 - desc DOEPCTL9 - 0xC20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT9 - desc DOEPINT9 - 0xC28 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ9 - desc DOEPTSIZ9 - 0xC30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA9 - desc DOEPDMA9 - 0xC34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL10 - desc DOEPCTL10 - 0xC40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT10 - desc DOEPINT10 - 0xC48 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ10 - desc DOEPTSIZ10 - 0xC50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA10 - desc DOEPDMA10 - 0xC54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL11 - desc DOEPCTL11 - 0xC60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT11 - desc DOEPINT11 - 0xC68 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ11 - desc DOEPTSIZ11 - 0xC70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA11 - desc DOEPDMA11 - 0xC74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL12 - desc DOEPCTL12 - 0xC80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT12 - desc DOEPINT12 - 0xC88 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ12 - desc DOEPTSIZ12 - 0xC90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA12 - desc DOEPDMA12 - 0xC94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL13 - desc DOEPCTL13 - 0xCA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT13 - desc DOEPINT13 - 0xCA8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ13 - desc DOEPTSIZ13 - 0xCB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA13 - desc DOEPDMA13 - 0xCB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL14 - desc DOEPCTL14 - 0xCC0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT14 - desc DOEPINT14 - 0xCC8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ14 - desc DOEPTSIZ14 - 0xCD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA14 - desc DOEPDMA14 - 0xCD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL15 - desc DOEPCTL15 - 0xCE0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT15 - desc DOEPINT15 - 0xCE8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ15 - desc DOEPTSIZ15 - 0xCF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA15 - desc DOEPDMA15 - 0xCF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - GCCTL - desc GCCTL - 0xE00 - 32 - read-write - 0x0 - 0xE3 - - - STPPCLK - desc STPPCLK - 0 - 0 - read-write - - - GATEHCLK - desc GATEHCLK - 1 - 1 - read-write - - - ENL1GTG - desc ENL1GTG - 5 - 5 - read-write - - - PHYSLEEP - desc PHYSLEEP - 6 - 6 - read-write - - - SUSP - desc SUSP - 7 - 7 - read-write - - - - - - - WDT - desc WDT - 0x40049000 - - 0x0 - 0xC - - - - CR - desc CR - 0x0 - 32 - read-write - 0x80010FF3 - 0x80010FF3 - - - PERI - desc PERI - 1 - 0 - read-write - - - CKS - desc CKS - 7 - 4 - read-write - - - WDPT - desc WDPT - 11 - 8 - read-write - - - SLPOFF - desc SLPOFF - 16 - 16 - read-write - - - ITS - desc ITS - 31 - 31 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-write - 0x0 - 0x3FFFF - - - CNT - desc CNT - 15 - 0 - read-only - - - UDF - desc UDF - 16 - 16 - read-write - - - REF - desc REF - 17 - 17 - read-write - - - - - RR - desc RR - 0x8 - 32 - read-write - 0x0 - 0xFFFF - - - RF - desc RF - 15 - 0 - read-write - - - - - - - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.mac b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.mac deleted file mode 100644 index e30bd40aa2e..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/flashloader/FlashHC32F4A0.mac +++ /dev/null @@ -1,16 +0,0 @@ -setup() -{ - ; -} - -execUserPreload() -{ - __message "----- Prepare hardware for Flashloader -----\n"; - setup(); -} -execUserFlashInit() // Called by debugger before loading flash loader in RAM. -{ - __message "----- Prepare hardware for Flashloader -----\n"; - setup(); -} - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HDSC_HC32F4A0.svd b/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HDSC_HC32F4A0.svd deleted file mode 100644 index a8542c60e7f..00000000000 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/cmsis/Device/HDSC/hc32f4xx/Source/IAR/svd/HDSC_HC32F4A0.svd +++ /dev/null @@ -1,102653 +0,0 @@ - - - HDSC - HDSC - HDSC_HC32F4A0 - ARMCM4 - 1.0 - - CM4 - r0p1 - little - true - true - 4 - false - - 8 - 32 - 32 - read-write - 0x0 - 0x0 - - - ADC1 - desc ADC1 - 0x40040000 - - 0x0 - 0xC5 - - - - STR - desc STR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - STRT - desc STRT - 0 - 0 - read-write - - - - - CR0 - desc CR0 - 0x2 - 16 - read-write - 0x0 - 0x7F3 - - - MS - desc MS - 1 - 0 - read-write - - - ACCSEL - desc ACCSEL - 5 - 4 - read-write - - - CLREN - desc CLREN - 6 - 6 - read-write - - - DFMT - desc DFMT - 7 - 7 - read-write - - - AVCNT - desc AVCNT - 10 - 8 - read-write - - - - - CR1 - desc CR1 - 0x4 - 16 - read-write - 0x0 - 0x4 - - - RSCHSEL - desc RSCHSEL - 2 - 2 - read-write - - - - - TRGSR - desc TRGSR - 0xA - 16 - read-write - 0x0 - 0x8383 - - - TRGSELA - desc TRGSELA - 1 - 0 - read-write - - - TRGENA - desc TRGENA - 7 - 7 - read-write - - - TRGSELB - desc TRGSELB - 9 - 8 - read-write - - - TRGENB - desc TRGENB - 15 - 15 - read-write - - - - - CHSELRA - desc CHSELRA - 0xC - 32 - read-write - 0x0 - 0xFFFF - - - CHSELA - desc CHSELA - 15 - 0 - read-write - - - - - CHSELRB - desc CHSELRB - 0x10 - 32 - read-write - 0x0 - 0xFFFF - - - CHSELB - desc CHSELB - 15 - 0 - read-write - - - - - AVCHSELR - desc AVCHSELR - 0x14 - 32 - read-write - 0x0 - 0xFFFF - - - AVCHSEL - desc AVCHSEL - 15 - 0 - read-write - - - - - EXCHSELR - desc EXCHSELR - 0x18 - 8 - read-write - 0x0 - 0x1 - - - EXCHSEL - desc EXCHSEL - 0 - 0 - read-write - - - - - SHCR - desc SHCR - 0x1A - 16 - read-write - 0x18 - 0x7FF - - - SHSST - desc SHSST - 7 - 0 - read-write - - - SHSEL - desc SHSEL - 10 - 8 - read-write - - - - - SSTR0 - desc SSTR0 - 0x20 - 8 - read-write - 0xB - 0xFF - - - SSTR1 - desc SSTR1 - 0x21 - 8 - read-write - 0xB - 0xFF - - - SSTR2 - desc SSTR2 - 0x22 - 8 - read-write - 0xB - 0xFF - - - SSTR3 - desc SSTR3 - 0x23 - 8 - read-write - 0xB - 0xFF - - - SSTR4 - desc SSTR4 - 0x24 - 8 - read-write - 0xB - 0xFF - - - SSTR5 - desc SSTR5 - 0x25 - 8 - read-write - 0xB - 0xFF - - - SSTR6 - desc SSTR6 - 0x26 - 8 - read-write - 0xB - 0xFF - - - SSTR7 - desc SSTR7 - 0x27 - 8 - read-write - 0xB - 0xFF - - - SSTR8 - desc SSTR8 - 0x28 - 8 - read-write - 0xB - 0xFF - - - SSTR9 - desc SSTR9 - 0x29 - 8 - read-write - 0xB - 0xFF - - - SSTR10 - desc SSTR10 - 0x2A - 8 - read-write - 0xB - 0xFF - - - SSTR11 - desc SSTR11 - 0x2B - 8 - read-write - 0xB - 0xFF - - - SSTR12 - desc SSTR12 - 0x2C - 8 - read-write - 0xB - 0xFF - - - SSTR13 - desc SSTR13 - 0x2D - 8 - read-write - 0xB - 0xFF - - - SSTR14 - desc SSTR14 - 0x2E - 8 - read-write - 0xB - 0xFF - - - SSTR15 - desc SSTR15 - 0x2F - 8 - read-write - 0xB - 0xFF - - - SSTRL - desc SSTRL - 0x30 - 8 - read-write - 0xB - 0xFF - - - CHMUXR0 - desc CHMUXR0 - 0x38 - 16 - read-write - 0x3210 - 0xFFFF - - - CH00MUX - desc CH00MUX - 3 - 0 - read-write - - - CH01MUX - desc CH01MUX - 7 - 4 - read-write - - - CH02MUX - desc CH02MUX - 11 - 8 - read-write - - - CH03MUX - desc CH03MUX - 15 - 12 - read-write - - - - - CHMUXR1 - desc CHMUXR1 - 0x3A - 16 - read-write - 0x7654 - 0xFFFF - - - CH04MUX - desc CH04MUX - 3 - 0 - read-write - - - CH05MUX - desc CH05MUX - 7 - 4 - read-write - - - CH06MUX - desc CH06MUX - 11 - 8 - read-write - - - CH07MUX - desc CH07MUX - 15 - 12 - read-write - - - - - CHMUXR2 - desc CHMUXR2 - 0x3C - 16 - read-write - 0xBA98 - 0xFFFF - - - CH08MUX - desc CH08MUX - 3 - 0 - read-write - - - CH09MUX - desc CH09MUX - 7 - 4 - read-write - - - CH10MUX - desc CH10MUX - 11 - 8 - read-write - - - CH11MUX - desc CH11MUX - 15 - 12 - read-write - - - - - CHMUXR3 - desc CHMUXR3 - 0x3E - 16 - read-write - 0xFEDC - 0xFFFF - - - CH12MUX - desc CH12MUX - 3 - 0 - read-write - - - CH13MUX - desc CH13MUX - 7 - 4 - read-write - - - CH14MUX - desc CH14MUX - 11 - 8 - read-write - - - CH15MUX - desc CH15MUX - 15 - 12 - read-write - - - - - ISR - desc ISR - 0x44 - 8 - read-only - 0x0 - 0x13 - - - EOCAF - desc EOCAF - 0 - 0 - read-only - - - EOCBF - desc EOCBF - 1 - 1 - read-only - - - SASTPDF - desc SASTPDF - 4 - 4 - read-only - - - - - ICR - desc ICR - 0x45 - 8 - read-write - 0x3 - 0x3 - - - EOCAIEN - desc EOCAIEN - 0 - 0 - read-write - - - EOCBIEN - desc EOCBIEN - 1 - 1 - read-write - - - - - ISCLRR - desc ISCLRR - 0x46 - 8 - read-write - 0x0 - 0x13 - - - CLREOCAF - desc CLREOCAF - 0 - 0 - read-write - - - CLREOCBF - desc CLREOCBF - 1 - 1 - read-write - - - CLRSASTPDF - desc CLRSASTPDF - 4 - 4 - read-write - - - - - SYNCCR - desc SYNCCR - 0x4C - 16 - read-write - 0xC00 - 0xFF71 - - - SYNCEN - desc SYNCEN - 0 - 0 - read-write - - - SYNCMD - desc SYNCMD - 6 - 4 - read-write - - - SYNCDLY - desc SYNCDLY - 15 - 8 - read-write - - - - - DR0 - desc DR0 - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - DR1 - desc DR1 - 0x52 - 16 - read-only - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x54 - 16 - read-only - 0x0 - 0xFFFF - - - DR3 - desc DR3 - 0x56 - 16 - read-only - 0x0 - 0xFFFF - - - DR4 - desc DR4 - 0x58 - 16 - read-only - 0x0 - 0xFFFF - - - DR5 - desc DR5 - 0x5A - 16 - read-only - 0x0 - 0xFFFF - - - DR6 - desc DR6 - 0x5C - 16 - read-only - 0x0 - 0xFFFF - - - DR7 - desc DR7 - 0x5E - 16 - read-only - 0x0 - 0xFFFF - - - DR8 - desc DR8 - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - DR9 - desc DR9 - 0x62 - 16 - read-only - 0x0 - 0xFFFF - - - DR10 - desc DR10 - 0x64 - 16 - read-only - 0x0 - 0xFFFF - - - DR11 - desc DR11 - 0x66 - 16 - read-only - 0x0 - 0xFFFF - - - DR12 - desc DR12 - 0x68 - 16 - read-only - 0x0 - 0xFFFF - - - DR13 - desc DR13 - 0x6A - 16 - read-only - 0x0 - 0xFFFF - - - DR14 - desc DR14 - 0x6C - 16 - read-only - 0x0 - 0xFFFF - - - DR15 - desc DR15 - 0x6E - 16 - read-only - 0x0 - 0xFFFF - - - AWDCR - desc AWDCR - 0xA0 - 16 - read-write - 0x0 - 0x377 - - - AWD0EN - desc AWD0EN - 0 - 0 - read-write - - - AWD0IEN - desc AWD0IEN - 1 - 1 - read-write - - - AWD0MD - desc AWD0MD - 2 - 2 - read-write - - - AWD1EN - desc AWD1EN - 4 - 4 - read-write - - - AWD1IEN - desc AWD1IEN - 5 - 5 - read-write - - - AWD1MD - desc AWD1MD - 6 - 6 - read-write - - - AWDCM - desc AWDCM - 9 - 8 - read-write - - - - - AWDSR - desc AWDSR - 0xA2 - 8 - read-only - 0x0 - 0x13 - - - AWD0F - desc AWD0F - 0 - 0 - read-only - - - AWD1F - desc AWD1F - 1 - 1 - read-only - - - AWDCMF - desc AWDCMF - 4 - 4 - read-only - - - - - AWDSCLRR - desc AWDSCLRR - 0xA3 - 8 - write-only - 0x0 - 0x13 - - - CLRAWD0F - desc CLRAWD0F - 0 - 0 - write-only - - - CLRAWD1F - desc CLRAWD1F - 1 - 1 - write-only - - - CLRAWDCMF - desc CLRAWDCMF - 4 - 4 - write-only - - - - - AWD0DR0 - desc AWD0DR0 - 0xA4 - 16 - read-write - 0x0 - 0xFFFF - - - AWD0DR1 - desc AWD0DR1 - 0xA6 - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD0CHSR - desc AWD0CHSR - 0xA8 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - AWD1DR0 - desc AWD1DR0 - 0xAC - 16 - read-write - 0x0 - 0xFFFF - - - AWD1DR1 - desc AWD1DR1 - 0xAE - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD1CHSR - desc AWD1CHSR - 0xB0 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - PGACR1 - desc PGACR1 - 0xC0 - 8 - read-write - 0x0 - 0xFF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - PGAGAIN - desc PGAGAIN - 7 - 4 - read-write - - - - - PGACR2 - desc PGACR2 - 0xC1 - 8 - read-write - 0x0 - 0xFF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - PGAGAIN - desc PGAGAIN - 7 - 4 - read-write - - - - - PGACR3 - desc PGACR3 - 0xC2 - 8 - read-write - 0x0 - 0xFF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - PGAGAIN - desc PGAGAIN - 7 - 4 - read-write - - - - - PGAVSSENR - desc PGAVSSENR - 0xC4 - 8 - read-write - 0x0 - 0x7 - - - PGAVSSEN - desc PGAVSSEN - 2 - 0 - read-write - - - - - - - ADC2 - desc ADC2 - 0x40040400 - - 0x0 - 0xC5 - - - - STR - desc STR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - STRT - desc STRT - 0 - 0 - read-write - - - - - CR0 - desc CR0 - 0x2 - 16 - read-write - 0x0 - 0x7F3 - - - MS - desc MS - 1 - 0 - read-write - - - ACCSEL - desc ACCSEL - 5 - 4 - read-write - - - CLREN - desc CLREN - 6 - 6 - read-write - - - DFMT - desc DFMT - 7 - 7 - read-write - - - AVCNT - desc AVCNT - 10 - 8 - read-write - - - - - CR1 - desc CR1 - 0x4 - 16 - read-write - 0x0 - 0x4 - - - RSCHSEL - desc RSCHSEL - 2 - 2 - read-write - - - - - TRGSR - desc TRGSR - 0xA - 16 - read-write - 0x0 - 0x8383 - - - TRGSELA - desc TRGSELA - 1 - 0 - read-write - - - TRGENA - desc TRGENA - 7 - 7 - read-write - - - TRGSELB - desc TRGSELB - 9 - 8 - read-write - - - TRGENB - desc TRGENB - 15 - 15 - read-write - - - - - CHSELRA - desc CHSELRA - 0xC - 32 - read-write - 0x0 - 0xFFFF - - - CHSELA - desc CHSELA - 15 - 0 - read-write - - - - - CHSELRB - desc CHSELRB - 0x10 - 32 - read-write - 0x0 - 0xFFFF - - - CHSELB - desc CHSELB - 15 - 0 - read-write - - - - - AVCHSELR - desc AVCHSELR - 0x14 - 32 - read-write - 0x0 - 0xFFFF - - - AVCHSEL - desc AVCHSEL - 15 - 0 - read-write - - - - - EXCHSELR - desc EXCHSELR - 0x18 - 8 - read-write - 0x0 - 0x1 - - - EXCHSEL - desc EXCHSEL - 0 - 0 - read-write - - - - - SSTR0 - desc SSTR0 - 0x20 - 8 - read-write - 0xB - 0xFF - - - SSTR1 - desc SSTR1 - 0x21 - 8 - read-write - 0xB - 0xFF - - - SSTR2 - desc SSTR2 - 0x22 - 8 - read-write - 0xB - 0xFF - - - SSTR3 - desc SSTR3 - 0x23 - 8 - read-write - 0xB - 0xFF - - - SSTR4 - desc SSTR4 - 0x24 - 8 - read-write - 0xB - 0xFF - - - SSTR5 - desc SSTR5 - 0x25 - 8 - read-write - 0xB - 0xFF - - - SSTR6 - desc SSTR6 - 0x26 - 8 - read-write - 0xB - 0xFF - - - SSTR7 - desc SSTR7 - 0x27 - 8 - read-write - 0xB - 0xFF - - - SSTR8 - desc SSTR8 - 0x28 - 8 - read-write - 0xB - 0xFF - - - SSTR9 - desc SSTR9 - 0x29 - 8 - read-write - 0xB - 0xFF - - - SSTR10 - desc SSTR10 - 0x2A - 8 - read-write - 0xB - 0xFF - - - SSTR11 - desc SSTR11 - 0x2B - 8 - read-write - 0xB - 0xFF - - - SSTR12 - desc SSTR12 - 0x2C - 8 - read-write - 0xB - 0xFF - - - SSTR13 - desc SSTR13 - 0x2D - 8 - read-write - 0xB - 0xFF - - - SSTR14 - desc SSTR14 - 0x2E - 8 - read-write - 0xB - 0xFF - - - SSTR15 - desc SSTR15 - 0x2F - 8 - read-write - 0xB - 0xFF - - - SSTRL - desc SSTRL - 0x30 - 8 - read-write - 0xB - 0xFF - - - CHMUXR0 - desc CHMUXR0 - 0x38 - 16 - read-write - 0x3210 - 0xFFFF - - - CH00MUX - desc CH00MUX - 3 - 0 - read-write - - - CH01MUX - desc CH01MUX - 7 - 4 - read-write - - - CH02MUX - desc CH02MUX - 11 - 8 - read-write - - - CH03MUX - desc CH03MUX - 15 - 12 - read-write - - - - - CHMUXR1 - desc CHMUXR1 - 0x3A - 16 - read-write - 0x7654 - 0xFFFF - - - CH04MUX - desc CH04MUX - 3 - 0 - read-write - - - CH05MUX - desc CH05MUX - 7 - 4 - read-write - - - CH06MUX - desc CH06MUX - 11 - 8 - read-write - - - CH07MUX - desc CH07MUX - 15 - 12 - read-write - - - - - CHMUXR2 - desc CHMUXR2 - 0x3C - 16 - read-write - 0xBA98 - 0xFFFF - - - CH08MUX - desc CH08MUX - 3 - 0 - read-write - - - CH09MUX - desc CH09MUX - 7 - 4 - read-write - - - CH10MUX - desc CH10MUX - 11 - 8 - read-write - - - CH11MUX - desc CH11MUX - 15 - 12 - read-write - - - - - CHMUXR3 - desc CHMUXR3 - 0x3E - 16 - read-write - 0xFEDC - 0xFFFF - - - CH12MUX - desc CH12MUX - 3 - 0 - read-write - - - CH13MUX - desc CH13MUX - 7 - 4 - read-write - - - CH14MUX - desc CH14MUX - 11 - 8 - read-write - - - CH15MUX - desc CH15MUX - 15 - 12 - read-write - - - - - ISR - desc ISR - 0x44 - 8 - read-only - 0x0 - 0x13 - - - EOCAF - desc EOCAF - 0 - 0 - read-only - - - EOCBF - desc EOCBF - 1 - 1 - read-only - - - SASTPDF - desc SASTPDF - 4 - 4 - read-only - - - - - ICR - desc ICR - 0x45 - 8 - read-write - 0x3 - 0x3 - - - EOCAIEN - desc EOCAIEN - 0 - 0 - read-write - - - EOCBIEN - desc EOCBIEN - 1 - 1 - read-write - - - - - ISCLRR - desc ISCLRR - 0x46 - 8 - write-only - 0x0 - 0x13 - - - CLREOCAF - desc CLREOCAF - 0 - 0 - write-only - - - CLREOCBF - desc CLREOCBF - 1 - 1 - write-only - - - CLRSASTPDF - desc CLRSASTPDF - 4 - 4 - write-only - - - - - DR0 - desc DR0 - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - DR1 - desc DR1 - 0x52 - 16 - read-only - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x54 - 16 - read-only - 0x0 - 0xFFFF - - - DR3 - desc DR3 - 0x56 - 16 - read-only - 0x0 - 0xFFFF - - - DR4 - desc DR4 - 0x58 - 16 - read-only - 0x0 - 0xFFFF - - - DR5 - desc DR5 - 0x5A - 16 - read-only - 0x0 - 0xFFFF - - - DR6 - desc DR6 - 0x5C - 16 - read-only - 0x0 - 0xFFFF - - - DR7 - desc DR7 - 0x5E - 16 - read-only - 0x0 - 0xFFFF - - - DR8 - desc DR8 - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - DR9 - desc DR9 - 0x62 - 16 - read-only - 0x0 - 0xFFFF - - - DR10 - desc DR10 - 0x64 - 16 - read-only - 0x0 - 0xFFFF - - - DR11 - desc DR11 - 0x66 - 16 - read-only - 0x0 - 0xFFFF - - - DR12 - desc DR12 - 0x68 - 16 - read-only - 0x0 - 0xFFFF - - - DR13 - desc DR13 - 0x6A - 16 - read-only - 0x0 - 0xFFFF - - - DR14 - desc DR14 - 0x6C - 16 - read-only - 0x0 - 0xFFFF - - - DR15 - desc DR15 - 0x6E - 16 - read-only - 0x0 - 0xFFFF - - - AWDCR - desc AWDCR - 0xA0 - 16 - read-write - 0x0 - 0x377 - - - AWD0EN - desc AWD0EN - 0 - 0 - read-write - - - AWD0IEN - desc AWD0IEN - 1 - 1 - read-write - - - AWD0MD - desc AWD0MD - 2 - 2 - read-write - - - AWD1EN - desc AWD1EN - 4 - 4 - read-write - - - AWD1IEN - desc AWD1IEN - 5 - 5 - read-write - - - AWD1MD - desc AWD1MD - 6 - 6 - read-write - - - AWDCM - desc AWDCM - 9 - 8 - read-write - - - - - AWDSR - desc AWDSR - 0xA2 - 8 - read-only - 0x0 - 0x13 - - - AWD0F - desc AWD0F - 0 - 0 - read-only - - - AWD1F - desc AWD1F - 1 - 1 - read-only - - - AWDCMF - desc AWDCMF - 4 - 4 - read-only - - - - - AWDSCLRR - desc AWDSCLRR - 0xA3 - 8 - write-only - 0x0 - 0x13 - - - CLRAWD0F - desc CLRAWD0F - 0 - 0 - write-only - - - CLRAWD1F - desc CLRAWD1F - 1 - 1 - write-only - - - CLRAWDCMF - desc CLRAWDCMF - 4 - 4 - write-only - - - - - AWD0DR0 - desc AWD0DR0 - 0xA4 - 16 - read-write - 0x0 - 0xFFFF - - - AWD0DR1 - desc AWD0DR1 - 0xA6 - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD0CHSR - desc AWD0CHSR - 0xA8 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - AWD1DR0 - desc AWD1DR0 - 0xAC - 16 - read-write - 0x0 - 0xFFFF - - - AWD1DR1 - desc AWD1DR1 - 0xAE - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD1CHSR - desc AWD1CHSR - 0xB0 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - PGACR1 - desc PGACR1 - 0xC0 - 8 - read-write - 0x0 - 0xFF - - - PGACTL - desc PGACTL - 3 - 0 - read-write - - - PGAGAIN - desc PGAGAIN - 7 - 4 - read-write - - - - - PGAVSSENR - desc PGAVSSENR - 0xC4 - 8 - read-write - 0x0 - 0x1 - - - PGAVSSEN - desc PGAVSSEN - 0 - 0 - read-write - - - - - - - ADC3 - desc ADC3 - 0x40040800 - - 0x0 - 0xB1 - - - - STR - desc STR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - STRT - desc STRT - 0 - 0 - read-write - - - - - CR0 - desc CR0 - 0x2 - 16 - read-write - 0x0 - 0x7F3 - - - MS - desc MS - 1 - 0 - read-write - - - ACCSEL - desc ACCSEL - 5 - 4 - read-write - - - CLREN - desc CLREN - 6 - 6 - read-write - - - DFMT - desc DFMT - 7 - 7 - read-write - - - AVCNT - desc AVCNT - 10 - 8 - read-write - - - - - CR1 - desc CR1 - 0x4 - 16 - read-write - 0x0 - 0x4 - - - RSCHSEL - desc RSCHSEL - 2 - 2 - read-write - - - - - TRGSR - desc TRGSR - 0xA - 16 - read-write - 0x0 - 0x8383 - - - TRGSELA - desc TRGSELA - 1 - 0 - read-write - - - TRGENA - desc TRGENA - 7 - 7 - read-write - - - TRGSELB - desc TRGSELB - 9 - 8 - read-write - - - TRGENB - desc TRGENB - 15 - 15 - read-write - - - - - CHSELRA - desc CHSELRA - 0xC - 32 - read-write - 0x0 - 0xFFFFF - - - CHSELA - desc CHSELA - 19 - 0 - read-write - - - - - CHSELRB - desc CHSELRB - 0x10 - 32 - read-write - 0x0 - 0xFFFFF - - - CHSELB - desc CHSELB - 19 - 0 - read-write - - - - - AVCHSELR - desc AVCHSELR - 0x14 - 32 - read-write - 0x0 - 0xFFFFF - - - AVCHSEL - desc AVCHSEL - 19 - 0 - read-write - - - - - EXCHSELR - desc EXCHSELR - 0x18 - 8 - read-write - 0x0 - 0x1 - - - EXCHSEL - desc EXCHSEL - 0 - 0 - read-write - - - - - SSTR0 - desc SSTR0 - 0x20 - 8 - read-write - 0xB - 0xFF - - - SSTR1 - desc SSTR1 - 0x21 - 8 - read-write - 0xB - 0xFF - - - SSTR2 - desc SSTR2 - 0x22 - 8 - read-write - 0xB - 0xFF - - - SSTR3 - desc SSTR3 - 0x23 - 8 - read-write - 0xB - 0xFF - - - SSTR4 - desc SSTR4 - 0x24 - 8 - read-write - 0xB - 0xFF - - - SSTR5 - desc SSTR5 - 0x25 - 8 - read-write - 0xB - 0xFF - - - SSTR6 - desc SSTR6 - 0x26 - 8 - read-write - 0xB - 0xFF - - - SSTR7 - desc SSTR7 - 0x27 - 8 - read-write - 0xB - 0xFF - - - SSTR8 - desc SSTR8 - 0x28 - 8 - read-write - 0xB - 0xFF - - - SSTR9 - desc SSTR9 - 0x29 - 8 - read-write - 0xB - 0xFF - - - SSTR10 - desc SSTR10 - 0x2A - 8 - read-write - 0xB - 0xFF - - - SSTR11 - desc SSTR11 - 0x2B - 8 - read-write - 0xB - 0xFF - - - SSTR12 - desc SSTR12 - 0x2C - 8 - read-write - 0xB - 0xFF - - - SSTR13 - desc SSTR13 - 0x2D - 8 - read-write - 0xB - 0xFF - - - SSTR14 - desc SSTR14 - 0x2E - 8 - read-write - 0xB - 0xFF - - - SSTR15 - desc SSTR15 - 0x2F - 8 - read-write - 0xB - 0xFF - - - SSTRL - desc SSTRL - 0x30 - 8 - read-write - 0xB - 0xFF - - - CHMUXR0 - desc CHMUXR0 - 0x38 - 16 - read-write - 0x3210 - 0xFFFF - - - CH00MUX - desc CH00MUX - 3 - 0 - read-write - - - CH01MUX - desc CH01MUX - 7 - 4 - read-write - - - CH02MUX - desc CH02MUX - 11 - 8 - read-write - - - CH03MUX - desc CH03MUX - 15 - 12 - read-write - - - - - CHMUXR1 - desc CHMUXR1 - 0x3A - 16 - read-write - 0x7654 - 0xFFFF - - - CH04MUX - desc CH04MUX - 3 - 0 - read-write - - - CH05MUX - desc CH05MUX - 7 - 4 - read-write - - - CH06MUX - desc CH06MUX - 11 - 8 - read-write - - - CH07MUX - desc CH07MUX - 15 - 12 - read-write - - - - - CHMUXR2 - desc CHMUXR2 - 0x3C - 16 - read-write - 0xBA98 - 0xFFFF - - - CH08MUX - desc CH08MUX - 3 - 0 - read-write - - - CH09MUX - desc CH09MUX - 7 - 4 - read-write - - - CH10MUX - desc CH10MUX - 11 - 8 - read-write - - - CH11MUX - desc CH11MUX - 15 - 12 - read-write - - - - - CHMUXR3 - desc CHMUXR3 - 0x3E - 16 - read-write - 0xFEDC - 0xFFFF - - - CH12MUX - desc CH12MUX - 3 - 0 - read-write - - - CH13MUX - desc CH13MUX - 7 - 4 - read-write - - - CH14MUX - desc CH14MUX - 11 - 8 - read-write - - - CH15MUX - desc CH15MUX - 15 - 12 - read-write - - - - - ISR - desc ISR - 0x44 - 8 - read-only - 0x0 - 0x13 - - - EOCAF - desc EOCAF - 0 - 0 - read-only - - - EOCBF - desc EOCBF - 1 - 1 - read-only - - - SASTPDF - desc SASTPDF - 4 - 4 - read-only - - - - - ICR - desc ICR - 0x45 - 8 - read-write - 0x3 - 0x3 - - - EOCAIEN - desc EOCAIEN - 0 - 0 - read-write - - - EOCBIEN - desc EOCBIEN - 1 - 1 - read-write - - - - - ISCLRR - desc ISCLRR - 0x46 - 8 - write-only - 0x0 - 0x13 - - - CLREOCAF - desc CLREOCAF - 0 - 0 - write-only - - - CLREOCBF - desc CLREOCBF - 1 - 1 - write-only - - - CLRSASTPDF - desc CLRSASTPDF - 4 - 4 - write-only - - - - - DR0 - desc DR0 - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - DR1 - desc DR1 - 0x52 - 16 - read-only - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x54 - 16 - read-only - 0x0 - 0xFFFF - - - DR3 - desc DR3 - 0x56 - 16 - read-only - 0x0 - 0xFFFF - - - DR4 - desc DR4 - 0x58 - 16 - read-only - 0x0 - 0xFFFF - - - DR5 - desc DR5 - 0x5A - 16 - read-only - 0x0 - 0xFFFF - - - DR6 - desc DR6 - 0x5C - 16 - read-only - 0x0 - 0xFFFF - - - DR7 - desc DR7 - 0x5E - 16 - read-only - 0x0 - 0xFFFF - - - DR8 - desc DR8 - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - DR9 - desc DR9 - 0x62 - 16 - read-only - 0x0 - 0xFFFF - - - DR10 - desc DR10 - 0x64 - 16 - read-only - 0x0 - 0xFFFF - - - DR11 - desc DR11 - 0x66 - 16 - read-only - 0x0 - 0xFFFF - - - DR12 - desc DR12 - 0x68 - 16 - read-only - 0x0 - 0xFFFF - - - DR13 - desc DR13 - 0x6A - 16 - read-only - 0x0 - 0xFFFF - - - DR14 - desc DR14 - 0x6C - 16 - read-only - 0x0 - 0xFFFF - - - DR15 - desc DR15 - 0x6E - 16 - read-only - 0x0 - 0xFFFF - - - DR16 - desc DR16 - 0x70 - 16 - read-only - 0x0 - 0xFFFF - - - DR17 - desc DR17 - 0x72 - 16 - read-only - 0x0 - 0xFFFF - - - DR18 - desc DR18 - 0x74 - 16 - read-only - 0x0 - 0xFFFF - - - DR19 - desc DR19 - 0x76 - 16 - read-only - 0x0 - 0xFFFF - - - AWDCR - desc AWDCR - 0xA0 - 16 - read-write - 0x0 - 0x377 - - - AWD0EN - desc AWD0EN - 0 - 0 - read-write - - - AWD0IEN - desc AWD0IEN - 1 - 1 - read-write - - - AWD0MD - desc AWD0MD - 2 - 2 - read-write - - - AWD1EN - desc AWD1EN - 4 - 4 - read-write - - - AWD1IEN - desc AWD1IEN - 5 - 5 - read-write - - - AWD1MD - desc AWD1MD - 6 - 6 - read-write - - - AWDCM - desc AWDCM - 9 - 8 - read-write - - - - - AWDSR - desc AWDSR - 0xA2 - 8 - read-only - 0x0 - 0x13 - - - AWD0F - desc AWD0F - 0 - 0 - read-only - - - AWD1F - desc AWD1F - 1 - 1 - read-only - - - AWDCMF - desc AWDCMF - 4 - 4 - read-only - - - - - AWDSCLRR - desc AWDSCLRR - 0xA3 - 8 - write-only - 0x0 - 0x13 - - - CLRAWD0F - desc CLRAWD0F - 0 - 0 - write-only - - - CLRAWD1F - desc CLRAWD1F - 1 - 1 - write-only - - - CLRAWDCMF - desc CLRAWDCMF - 4 - 4 - write-only - - - - - AWD0DR0 - desc AWD0DR0 - 0xA4 - 16 - read-write - 0x0 - 0xFFFF - - - AWD0DR1 - desc AWD0DR1 - 0xA6 - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD0CHSR - desc AWD0CHSR - 0xA8 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - AWD1DR0 - desc AWD1DR0 - 0xAC - 16 - read-write - 0x0 - 0xFFFF - - - AWD1DR1 - desc AWD1DR1 - 0xAE - 16 - read-write - 0xFFFF - 0xFFFF - - - AWD1CHSR - desc AWD1CHSR - 0xB0 - 8 - read-write - 0x0 - 0x1F - - - AWDCH - desc AWDCH - 4 - 0 - read-write - - - - - - - AES - desc AES - 0x40008000 - - 0x0 - 0x40 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x1B - - - START - desc START - 0 - 0 - read-write - - - MODE - desc MODE - 1 - 1 - read-write - - - KEYSIZE - desc KEYSIZE - 4 - 3 - read-write - - - - - DR0 - desc DR0 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR2 - desc DR2 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR3 - desc DR3 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR0 - desc KR0 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR1 - desc KR1 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR2 - desc KR2 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR3 - desc KR3 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR4 - desc KR4 - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR5 - desc KR5 - 0x34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR6 - desc KR6 - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KR7 - desc KR7 - 0x3C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - AOS - desc AOS - 0x40010800 - - 0x0 - 0x174 - - - - INTSFTTRG - desc INTSFTTRG - 0x0 - 32 - write-only - 0x0 - 0x1 - - - STRG - desc STRG - 0 - 0 - write-only - - - - - DCU_TRGSEL1 - desc DCU_TRGSEL1 - 0x4 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL2 - desc DCU_TRGSEL2 - 0x8 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL3 - desc DCU_TRGSEL3 - 0xC - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DCU_TRGSEL4 - desc DCU_TRGSEL4 - 0x10 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL0 - desc DMA1_TRGSEL0 - 0x14 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL1 - desc DMA1_TRGSEL1 - 0x18 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL2 - desc DMA1_TRGSEL2 - 0x1C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL3 - desc DMA1_TRGSEL3 - 0x20 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL4 - desc DMA1_TRGSEL4 - 0x24 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL5 - desc DMA1_TRGSEL5 - 0x28 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL6 - desc DMA1_TRGSEL6 - 0x2C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA1_TRGSEL7 - desc DMA1_TRGSEL7 - 0x30 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL0 - desc DMA2_TRGSEL0 - 0x34 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL1 - desc DMA2_TRGSEL1 - 0x38 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL2 - desc DMA2_TRGSEL2 - 0x3C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL3 - desc DMA2_TRGSEL3 - 0x40 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL4 - desc DMA2_TRGSEL4 - 0x44 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL5 - desc DMA2_TRGSEL5 - 0x48 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL6 - desc DMA2_TRGSEL6 - 0x4C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA2_TRGSEL7 - desc DMA2_TRGSEL7 - 0x50 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - DMA_TRGSELRC - desc DMA_TRGSELRC - 0x54 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR0 - desc TMR6_HTSSR0 - 0x58 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR1 - desc TMR6_HTSSR1 - 0x5C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR2 - desc TMR6_HTSSR2 - 0x60 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR6_HTSSR3 - desc TMR6_HTSSR3 - 0x64 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - PEVNTTRGSR12 - desc PEVNTTRGSR12 - 0x68 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - PEVNTTRGSR34 - desc PEVNTTRGSR34 - 0x6C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR0_HTSSR - desc TMR0_HTSSR - 0x70 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMR2_HTSSR - desc TMR2_HTSSR - 0x74 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - HASH_ITRGSELA - desc HASH_ITRGSELA - 0x78 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - HASH_ITRGSELB - desc HASH_ITRGSELB - 0x7C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR0 - desc TMRA_HTSSR0 - 0x80 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR1 - desc TMRA_HTSSR1 - 0x84 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR2 - desc TMRA_HTSSR2 - 0x88 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - TMRA_HTSSR3 - desc TMRA_HTSSR3 - 0x8C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - OTS_TRG - desc OTS_TRG - 0x90 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC1_ITRGSELR0 - desc ADC1_ITRGSELR0 - 0x94 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC1_ITRGSELR1 - desc ADC1_ITRGSELR1 - 0x98 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC2_ITRGSELR0 - desc ADC2_ITRGSELR0 - 0x9C - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC2_ITRGSELR1 - desc ADC2_ITRGSELR1 - 0xA0 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC3_ITRGSELR0 - desc ADC3_ITRGSELR0 - 0xA4 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - ADC3_ITRGSELR1 - desc ADC3_ITRGSELR1 - 0xA8 - 32 - read-write - 0x1FF - 0xC00001FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - COMTRG_EN - desc COMTRG_EN - 31 - 30 - read-write - - - - - COMTRG1 - desc COMTRG1 - 0xAC - 32 - read-write - 0x1FF - 0x1FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - - - COMTRG2 - desc COMTRG2 - 0xB0 - 32 - read-write - 0x1FF - 0x1FF - - - TRGSEL - desc TRGSEL - 8 - 0 - read-write - - - - - PEVNTDIRR1 - desc PEVNTDIRR1 - 0x100 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR - desc PDIR - 15 - 0 - read-write - - - - - PEVNTIDR1 - desc PEVNTIDR1 - 0x104 - 32 - read-only - 0x0 - 0xFFFF - - - PIN - desc PIN - 15 - 0 - read-only - - - - - PEVNTODR1 - desc PEVNTODR1 - 0x108 - 32 - read-write - 0x0 - 0xFFFF - - - POUT - desc POUT - 15 - 0 - read-write - - - - - PEVNTORR1 - desc PEVNTORR1 - 0x10C - 32 - read-write - 0x0 - 0xFFFF - - - POR - desc POR - 15 - 0 - read-write - - - - - PEVNTOSR1 - desc PEVNTOSR1 - 0x110 - 32 - read-write - 0x0 - 0xFFFF - - - POS - desc POS - 15 - 0 - read-write - - - - - PEVNTRISR1 - desc PEVNTRISR1 - 0x114 - 32 - read-write - 0x0 - 0xFFFF - - - RIS - desc RIS - 15 - 0 - read-write - - - - - PEVNTFAL1 - desc PEVNTFAL1 - 0x118 - 32 - read-write - 0x0 - 0xFFFF - - - FAL - desc FAL - 15 - 0 - read-write - - - - - PEVNTDIRR2 - desc PEVNTDIRR2 - 0x11C - 32 - read-write - 0x0 - 0xFFFF - - - PDIR - desc PDIR - 15 - 0 - read-write - - - - - PEVNTIDR2 - desc PEVNTIDR2 - 0x120 - 32 - read-only - 0x0 - 0xFFFF - - - PIN - desc PIN - 15 - 0 - read-only - - - - - PEVNTODR2 - desc PEVNTODR2 - 0x124 - 32 - read-write - 0x0 - 0xFFFF - - - POUT - desc POUT - 15 - 0 - read-write - - - - - PEVNTORR2 - desc PEVNTORR2 - 0x128 - 32 - read-write - 0x0 - 0xFFFF - - - POR - desc POR - 15 - 0 - read-write - - - - - PEVNTOSR2 - desc PEVNTOSR2 - 0x12C - 32 - read-write - 0x0 - 0xFFFF - - - POS - desc POS - 15 - 0 - read-write - - - - - PEVNTRISR2 - desc PEVNTRISR2 - 0x130 - 32 - read-write - 0x0 - 0xFFFF - - - RIS - desc RIS - 15 - 0 - read-write - - - - - PEVNTFAL2 - desc PEVNTFAL2 - 0x134 - 32 - read-write - 0x0 - 0xFFFF - - - FAL - desc FAL - 15 - 0 - read-write - - - - - PEVNTDIRR3 - desc PEVNTDIRR3 - 0x138 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR - desc PDIR - 15 - 0 - read-write - - - - - PEVNTIDR3 - desc PEVNTIDR3 - 0x13C - 32 - read-only - 0x0 - 0xFFFF - - - PIN - desc PIN - 15 - 0 - read-only - - - - - PEVNTODR3 - desc PEVNTODR3 - 0x140 - 32 - read-write - 0x0 - 0xFFFF - - - POUT - desc POUT - 15 - 0 - read-write - - - - - PEVNTORR3 - desc PEVNTORR3 - 0x144 - 32 - read-write - 0x0 - 0xFFFF - - - POR - desc POR - 15 - 0 - read-write - - - - - PEVNTOSR3 - desc PEVNTOSR3 - 0x148 - 32 - read-write - 0x0 - 0xFFFF - - - POS - desc POS - 15 - 0 - read-write - - - - - PEVNTRISR3 - desc PEVNTRISR3 - 0x14C - 32 - read-write - 0x0 - 0xFFFF - - - RIS - desc RIS - 15 - 0 - read-write - - - - - PEVNTFAL3 - desc PEVNTFAL3 - 0x150 - 32 - read-write - 0x0 - 0xFFFF - - - FAL - desc FAL - 15 - 0 - read-write - - - - - PEVNTDIRR4 - desc PEVNTDIRR4 - 0x154 - 32 - read-write - 0x0 - 0xFFFF - - - PDIR - desc PDIR - 15 - 0 - read-write - - - - - PEVNTIDR4 - desc PEVNTIDR4 - 0x158 - 32 - read-only - 0x0 - 0xFFFF - - - PIN - desc PIN - 15 - 0 - read-only - - - - - PEVNTODR4 - desc PEVNTODR4 - 0x15C - 32 - read-write - 0x0 - 0xFFFF - - - POUT - desc POUT - 15 - 0 - read-write - - - - - PEVNTORR4 - desc PEVNTORR4 - 0x160 - 32 - read-write - 0x0 - 0xFFFF - - - POR - desc POR - 15 - 0 - read-write - - - - - PEVNTOSR4 - desc PEVNTOSR4 - 0x164 - 32 - read-write - 0x0 - 0xFFFF - - - POS - desc POS - 15 - 0 - read-write - - - - - PEVNTRISR4 - desc PEVNTRISR4 - 0x168 - 32 - read-write - 0x0 - 0xFFFF - - - RIS - desc RIS - 15 - 0 - read-write - - - - - PEVNTFAL4 - desc PEVNTFAL4 - 0x16C - 32 - read-write - 0x0 - 0xFFFF - - - FAL - desc FAL - 15 - 0 - read-write - - - - - PEVNTNFCR - desc PEVNTNFCR - 0x170 - 32 - read-write - 0x0 - 0x7070707 - - - NFEN1 - desc NFEN1 - 0 - 0 - read-write - - - DIVS1 - desc DIVS1 - 2 - 1 - read-write - - - NFEN2 - desc NFEN2 - 8 - 8 - read-write - - - DIVS2 - desc DIVS2 - 10 - 9 - read-write - - - NFEN3 - desc NFEN3 - 16 - 16 - read-write - - - DIVS3 - desc DIVS3 - 18 - 17 - read-write - - - NFEN4 - desc NFEN4 - 24 - 24 - read-write - - - DIVS4 - desc DIVS4 - 26 - 25 - read-write - - - - - - - CAN1 - desc CAN - 0x40009000 - - 0x0 - 0xCA - - - - RBUF - desc RBUF - 0x0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - TBUF - desc TBUF - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CFG_STAT - desc CFG_STAT - 0xA0 - 8 - read-write - 0x80 - 0xFF - - - BUSOFF - desc BUSOFF - 0 - 0 - read-write - - - TACTIVE - desc TACTIVE - 1 - 1 - read-only - - - RACTIVE - desc RACTIVE - 2 - 2 - read-only - - - TSSS - desc TSSS - 3 - 3 - read-write - - - TPSS - desc TPSS - 4 - 4 - read-write - - - LBMI - desc LBMI - 5 - 5 - read-write - - - LBME - desc LBME - 6 - 6 - read-write - - - RESET - desc RESET - 7 - 7 - read-write - - - - - TCMD - desc TCMD - 0xA1 - 8 - read-write - 0x0 - 0xDF - - - TSA - desc TSA - 0 - 0 - read-write - - - TSALL - desc TSALL - 1 - 1 - read-write - - - TSONE - desc TSONE - 2 - 2 - read-write - - - TPA - desc TPA - 3 - 3 - read-write - - - TPE - desc TPE - 4 - 4 - read-write - - - LOM - desc LOM - 6 - 6 - read-write - - - TBSEL - desc TBSEL - 7 - 7 - read-write - - - - - TCTRL - desc TCTRL - 0xA2 - 8 - read-write - 0x90 - 0xF3 - - - TSSTAT - desc TSSTAT - 1 - 0 - read-only - - - TTTBM - desc TTTBM - 4 - 4 - read-write - - - TSMODE - desc TSMODE - 5 - 5 - read-write - - - TSNEXT - desc TSNEXT - 6 - 6 - read-write - - - FD_ISO - desc FD_ISO - 7 - 7 - read-write - - - - - RCTRL - desc RCTRL - 0xA3 - 8 - read-write - 0x0 - 0xFB - - - RSTAT - desc RSTAT - 1 - 0 - read-only - - - RBALL - desc RBALL - 3 - 3 - read-write - - - RREL - desc RREL - 4 - 4 - read-write - - - ROV - desc ROV - 5 - 5 - read-only - - - ROM - desc ROM - 6 - 6 - read-write - - - SACK - desc SACK - 7 - 7 - read-write - - - - - RTIE - desc RTIE - 0xA4 - 8 - read-write - 0xFE - 0xFF - - - TSFF - desc TSFF - 0 - 0 - read-only - - - EIE - desc EIE - 1 - 1 - read-write - - - TSIE - desc TSIE - 2 - 2 - read-write - - - TPIE - desc TPIE - 3 - 3 - read-write - - - RAFIE - desc RAFIE - 4 - 4 - read-write - - - RFIE - desc RFIE - 5 - 5 - read-write - - - ROIE - desc ROIE - 6 - 6 - read-write - - - RIE - desc RIE - 7 - 7 - read-write - - - - - RTIF - desc RTIF - 0xA5 - 8 - read-write - 0x0 - 0xFF - - - AIF - desc AIF - 0 - 0 - read-write - - - EIF - desc EIF - 1 - 1 - read-write - - - TSIF - desc TSIF - 2 - 2 - read-write - - - TPIF - desc TPIF - 3 - 3 - read-write - - - RAFIF - desc RAFIF - 4 - 4 - read-write - - - RFIF - desc RFIF - 5 - 5 - read-write - - - ROIF - desc ROIF - 6 - 6 - read-write - - - RIF - desc RIF - 7 - 7 - read-write - - - - - ERRINT - desc ERRINT - 0xA6 - 8 - read-write - 0x0 - 0xFF - - - BEIF - desc BEIF - 0 - 0 - read-write - - - BEIE - desc BEIE - 1 - 1 - read-write - - - ALIF - desc ALIF - 2 - 2 - read-write - - - ALIE - desc ALIE - 3 - 3 - read-write - - - EPIF - desc EPIF - 4 - 4 - read-write - - - EPIE - desc EPIE - 5 - 5 - read-write - - - EPASS - desc EPASS - 6 - 6 - read-only - - - EWARN - desc EWARN - 7 - 7 - read-only - - - - - LIMIT - desc LIMIT - 0xA7 - 8 - read-write - 0x1B - 0xFF - - - EWL - desc EWL - 3 - 0 - read-write - - - AFWL - desc AFWL - 7 - 4 - read-write - - - - - SBT - desc SBT - 0xA8 - 32 - read-write - 0x1020203 - 0xFF7F7FFF - - - S_SEG_1 - desc S_SEG_1 - 7 - 0 - read-write - - - S_SEG_2 - desc S_SEG_2 - 14 - 8 - read-write - - - S_SJW - desc S_SJW - 22 - 16 - read-write - - - S_PRESC - desc S_PRESC - 31 - 24 - read-write - - - - - FBT - desc FBT - 0xAC - 32 - read-write - 0x1020203 - 0xFF0F0F1F - - - F_SEG_1 - desc F_SEG_1 - 4 - 0 - read-write - - - F_SEG_2 - desc F_SEG_2 - 11 - 8 - read-write - - - F_SJW - desc F_SJW - 19 - 16 - read-write - - - F_PRESC - desc F_PRESC - 31 - 24 - read-write - - - - - EALCAP - desc EALCAP - 0xB0 - 8 - read-only - 0x0 - 0xFF - - - ALC - desc ALC - 4 - 0 - read-only - - - KOER - desc KOER - 7 - 5 - read-only - - - - - TDC - desc TDC - 0xB1 - 8 - read-write - 0x0 - 0xFF - - - SSPOFF - desc SSPOFF - 6 - 0 - read-write - - - TDCEN - desc TDCEN - 7 - 7 - read-write - - - - - RECNT - desc RECNT - 0xB2 - 8 - read-write - 0x0 - 0xFF - - - TECNT - desc TECNT - 0xB3 - 8 - read-write - 0x0 - 0xFF - - - ACFCTRL - desc ACFCTRL - 0xB4 - 8 - read-write - 0x0 - 0x2F - - - ACFADR - desc ACFADR - 3 - 0 - read-write - - - SELMASK - desc SELMASK - 5 - 5 - read-write - - - - - ACFEN - desc ACFEN - 0xB6 - 16 - read-write - 0x1 - 0xFFFF - - - AE_1 - desc AE_1 - 0 - 0 - read-write - - - AE_2 - desc AE_2 - 1 - 1 - read-write - - - AE_3 - desc AE_3 - 2 - 2 - read-write - - - AE_4 - desc AE_4 - 3 - 3 - read-write - - - AE_5 - desc AE_5 - 4 - 4 - read-write - - - AE_6 - desc AE_6 - 5 - 5 - read-write - - - AE_7 - desc AE_7 - 6 - 6 - read-write - - - AE_8 - desc AE_8 - 7 - 7 - read-write - - - AE_9 - desc AE_9 - 8 - 8 - read-write - - - AE_10 - desc AE_10 - 9 - 9 - read-write - - - AE_11 - desc AE_11 - 10 - 10 - read-write - - - AE_12 - desc AE_12 - 11 - 11 - read-write - - - AE_13 - desc AE_13 - 12 - 12 - read-write - - - AE_14 - desc AE_14 - 13 - 13 - read-write - - - AE_15 - desc AE_15 - 14 - 14 - read-write - - - AE_16 - desc AE_16 - 15 - 15 - read-write - - - - - ACF - desc ACF - 0xB8 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - ACODEORAMASK - desc ACODEORAMASK - 28 - 0 - read-write - - - AIDE - desc AIDE - 29 - 29 - read-write - - - AIDEE - desc AIDEE - 30 - 30 - read-write - - - - - TBSLOT - desc TBSLOT - 0xBE - 8 - read-write - 0x0 - 0xFF - - - TBPTR - desc TBPTR - 5 - 0 - read-write - - - TBF - desc TBF - 6 - 6 - read-write - - - TBE - desc TBE - 7 - 7 - read-write - - - - - TTCFG - desc TTCFG - 0xBF - 8 - read-write - 0x90 - 0xFF - - - TTEN - desc TTEN - 0 - 0 - read-write - - - T_PRESC - desc T_PRESC - 2 - 1 - read-write - - - TTIF - desc TTIF - 3 - 3 - read-write - - - TTIE - desc TTIE - 4 - 4 - read-write - - - TEIF - desc TEIF - 5 - 5 - read-write - - - WTIF - desc WTIF - 6 - 6 - read-write - - - WTIE - desc WTIE - 7 - 7 - read-write - - - - - REF_MSG - desc REF_MSG - 0xC0 - 32 - read-write - 0x0 - 0x9FFFFFFF - - - REF_ID - desc REF_ID - 28 - 0 - read-write - - - REF_IDE - desc REF_IDE - 31 - 31 - read-write - - - - - TRG_CFG - desc TRG_CFG - 0xC4 - 16 - read-write - 0x0 - 0xF73F - - - TTPTR - desc TTPTR - 5 - 0 - read-write - - - TTYPE - desc TTYPE - 10 - 8 - read-write - - - TEW - desc TEW - 15 - 12 - read-write - - - - - TT_TRIG - desc TT_TRIG - 0xC6 - 16 - read-write - 0x0 - 0xFFFF - - - TT_WTRIG - desc TT_WTRIG - 0xC8 - 16 - read-write - 0xFFFF - 0xFFFF - - - - - CAN2 - desc CAN - 0x40078000 - - 0x0 - 0xCA - - - - CMP1 - desc CMP - 0x4004A000 - - 0x0 - 0xA - - - - MDR - desc MDR - 0x0 - 8 - read-write - 0x0 - 0x83 - - - CENB - desc CENB - 0 - 0 - read-write - - - CWDE - desc CWDE - 1 - 1 - read-write - - - CMON - desc CMON - 7 - 7 - read-only - - - - - FIR - desc FIR - 0x1 - 8 - read-write - 0x0 - 0x73 - - - FCKS - desc FCKS - 1 - 0 - read-write - - - EDGS - desc EDGS - 5 - 4 - read-write - - - CIEN - desc CIEN - 6 - 6 - read-write - - - - - OCR - desc OCR - 0x2 - 8 - read-write - 0x0 - 0x1F - - - COEN - desc COEN - 0 - 0 - read-write - - - COPS - desc COPS - 1 - 1 - read-write - - - CPOE - desc CPOE - 2 - 2 - read-write - - - TWOE - desc TWOE - 3 - 3 - read-write - - - TWOL - desc TWOL - 4 - 4 - read-write - - - - - PMSR - desc PMSR - 0x3 - 8 - read-write - 0x0 - 0xFF - - - RVSL - desc RVSL - 3 - 0 - read-write - - - CVSL - desc CVSL - 7 - 4 - read-write - - - - - TWSR - desc TWSR - 0x4 - 16 - read-write - 0x0 - 0xFFFF - - - CTWS0 - desc CTWS0 - 0 - 0 - read-write - - - CTWS1 - desc CTWS1 - 1 - 1 - read-write - - - CTWS2 - desc CTWS2 - 2 - 2 - read-write - - - CTWS3 - desc CTWS3 - 3 - 3 - read-write - - - CTWS4 - desc CTWS4 - 4 - 4 - read-write - - - CTWS5 - desc CTWS5 - 5 - 5 - read-write - - - CTWS6 - desc CTWS6 - 6 - 6 - read-write - - - CTWS7 - desc CTWS7 - 7 - 7 - read-write - - - CTWS8 - desc CTWS8 - 8 - 8 - read-write - - - CTWS9 - desc CTWS9 - 9 - 9 - read-write - - - CTWS10 - desc CTWS10 - 10 - 10 - read-write - - - CTWS11 - desc CTWS11 - 11 - 11 - read-write - - - CTWS12 - desc CTWS12 - 12 - 12 - read-write - - - CTWS13 - desc CTWS13 - 13 - 13 - read-write - - - CTWS14 - desc CTWS14 - 14 - 14 - read-write - - - CTWS15 - desc CTWS15 - 15 - 15 - read-write - - - - - TWPR - desc TWPR - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - CTWP0 - desc CTWP0 - 0 - 0 - read-write - - - CTWP1 - desc CTWP1 - 1 - 1 - read-write - - - CTWP2 - desc CTWP2 - 2 - 2 - read-write - - - CTWP3 - desc CTWP3 - 3 - 3 - read-write - - - CTWP4 - desc CTWP4 - 4 - 4 - read-write - - - CTWP5 - desc CTWP5 - 5 - 5 - read-write - - - CTWP6 - desc CTWP6 - 6 - 6 - read-write - - - CTWP7 - desc CTWP7 - 7 - 7 - read-write - - - CTWP8 - desc CTWP8 - 8 - 8 - read-write - - - CTWP9 - desc CTWP9 - 9 - 9 - read-write - - - CTWP10 - desc CTWP10 - 10 - 10 - read-write - - - CTWP11 - desc CTWP11 - 11 - 11 - read-write - - - CTWP12 - desc CTWP12 - 12 - 12 - read-write - - - CTWP13 - desc CTWP13 - 13 - 13 - read-write - - - CTWP14 - desc CTWP14 - 14 - 14 - read-write - - - CTWP15 - desc CTWP15 - 15 - 15 - read-write - - - - - VISR - desc VISR - 0x8 - 16 - read-write - 0x0 - 0x37 - - - P2SL - desc P2SL - 2 - 0 - read-write - - - P3SL - desc P3SL - 5 - 4 - read-write - - - - - - - CMP2 - desc CMP - 0x4004A010 - - 0x0 - 0xA - - - - CMP3 - desc CMP - 0x4004A400 - - 0x0 - 0xA - - - - CMP4 - desc CMP - 0x4004A410 - - 0x0 - 0xA - - - - CMU - desc CMU - 0x4004C400 - - 0x0 - 0x7D08 - - - - XTAL32CR - desc XTAL32CR - 0x0 - 8 - read-write - 0x0 - 0x1 - - - XTAL32STP - desc XTAL32STP - 0 - 0 - read-write - - - - - XTAL32CFGR - desc XTAL32CFGR - 0x4 - 8 - read-write - 0x0 - 0x7 - - - XTAL32DRV - desc XTAL32DRV - 2 - 0 - read-write - - - XTAL32IE - desc XTAL32IE - 3 - 3 - read-write - - - - - XTAL32NFR - desc XTAL32NFR - 0x14 - 8 - read-write - 0x0 - 0x3 - - - XTAL32NF - desc XTAL32NF - 1 - 0 - read-write - - - - - LRCCR - desc LRCCR - 0x1C - 8 - read-write - 0x0 - 0x1 - - - LRCSTP - desc LRCSTP - 0 - 0 - read-write - - - - - RTCLRCCR - desc RTCLRCCR - 0x20 - 8 - read-write - 0x0 - 0x1 - - - RTCLRCSTP - desc RTCLRCSTP - 0 - 0 - read-write - - - - - LRCTRM - desc LRCTRM - 0x24 - 8 - read-write - 0x0 - 0xFF - - - RTCLRCTRM - desc RTCLRCTRM - 0x2C - 8 - read-write - 0x0 - 0xFF - - - XTALCFGR - desc XTALCFGR - 0x878 - 8 - read-write - 0x80 - 0x70 - - - XTALDRV - desc XTALDRV - 5 - 4 - read-write - - - XTALMS - desc XTALMS - 6 - 6 - read-write - - - - - PERICKSEL - desc PERICKSEL - 0x7C10 - 16 - read-write - 0x0 - 0xF - - - PERICKSEL - desc PERICKSEL - 3 - 0 - read-write - - - - - I2SCKSEL - desc I2SCKSEL - 0x7C12 - 16 - read-write - 0xBBBB - 0xFFFF - - - I2S1CKSEL - desc I2S1CKSEL - 3 - 0 - read-write - - - I2S2CKSEL - desc I2S2CKSEL - 7 - 4 - read-write - - - I2S3CKSEL - desc I2S3CKSEL - 11 - 8 - read-write - - - I2S4CKSEL - desc I2S4CKSEL - 15 - 12 - read-write - - - - - CANCKCFGR - desc CANCKCFGR - 0x7C18 - 8 - read-write - 0xDD - 0xFF - - - CAN1CKS - desc CAN1CKS - 3 - 0 - read-write - - - CAN2CKS - desc CAN2CKS - 7 - 4 - read-write - - - - - SCFGR - desc SCFGR - 0x7C20 - 32 - read-write - 0x0 - 0x7777777 - - - PCLK0S - desc PCLK0S - 2 - 0 - read-write - - - PCLK1S - desc PCLK1S - 6 - 4 - read-write - - - PCLK2S - desc PCLK2S - 10 - 8 - read-write - - - PCLK3S - desc PCLK3S - 14 - 12 - read-write - - - PCLK4S - desc PCLK4S - 18 - 16 - read-write - - - EXCKS - desc EXCKS - 22 - 20 - read-write - - - HCLKS - desc HCLKS - 26 - 24 - read-write - - - - - USBCKCFGR - desc USBCKCFGR - 0x7C24 - 8 - read-write - 0x40 - 0xF0 - - - USBCKS - desc USBCKS - 7 - 4 - read-write - - - - - CKSWR - desc CKSWR - 0x7C26 - 8 - read-write - 0x1 - 0x7 - - - CKSW - desc CKSW - 2 - 0 - read-write - - - - - PLLHCR - desc PLLHCR - 0x7C2A - 8 - read-write - 0x1 - 0x1 - - - PLLHOFF - desc PLLHOFF - 0 - 0 - read-write - - - - - PLLACR - desc PLLACR - 0x7C2E - 8 - read-write - 0x1 - 0x1 - - - PLLAOFF - desc PLLAOFF - 0 - 0 - read-write - - - - - XTALCR - desc XTALCR - 0x7C32 - 8 - read-write - 0x1 - 0x1 - - - XTALSTP - desc XTALSTP - 0 - 0 - read-write - - - - - HRCCR - desc HRCCR - 0x7C36 - 8 - read-write - 0x1 - 0x1 - - - HRCSTP - desc HRCSTP - 0 - 0 - read-write - - - - - MRCCR - desc MRCCR - 0x7C38 - 8 - read-write - 0x80 - 0x1 - - - MRCSTP - desc MRCSTP - 0 - 0 - read-write - - - - - OSCSTBSR - desc OSCSTBSR - 0x7C3C - 8 - read-write - 0x0 - 0xE9 - - - HRCSTBF - desc HRCSTBF - 0 - 0 - read-write - - - XTALSTBF - desc XTALSTBF - 3 - 3 - read-write - - - PLLHSTBF - desc PLLHSTBF - 5 - 5 - read-write - - - PLLASTBF - desc PLLASTBF - 6 - 6 - read-write - - - - - MCOCFGR1 - desc MCOCFGR1 - 0x7C3D - 8 - read-write - 0x0 - 0xFF - - - MCOSEL - desc MCOSEL - 3 - 0 - read-write - - - MCODIV - desc MCODIV - 6 - 4 - read-write - - - MCOEN - desc MCOEN - 7 - 7 - read-write - - - - - MCOCFGR2 - desc MCOCFGR2 - 0x7C3E - 8 - read-write - 0x0 - 0xFF - - - MCOSEL - desc MCOSEL - 3 - 0 - read-write - - - MCODIV - desc MCODIV - 6 - 4 - read-write - - - MCOEN - desc MCOEN - 7 - 7 - read-write - - - - - TPIUCKCFGR - desc TPIUCKCFGR - 0x7C3F - 8 - read-write - 0x0 - 0x83 - - - TPIUCKS - desc TPIUCKS - 1 - 0 - read-write - - - TPIUCKOE - desc TPIUCKOE - 7 - 7 - read-write - - - - - XTALSTDCR - desc XTALSTDCR - 0x7C40 - 8 - read-write - 0x0 - 0x87 - - - XTALSTDIE - desc XTALSTDIE - 0 - 0 - read-write - - - XTALSTDRE - desc XTALSTDRE - 1 - 1 - read-write - - - XTALSTDRIS - desc XTALSTDRIS - 2 - 2 - read-write - - - XTALSTDE - desc XTALSTDE - 7 - 7 - read-write - - - - - XTALSTDSR - desc XTALSTDSR - 0x7C41 - 8 - read-write - 0x0 - 0x1 - - - XTALSTDF - desc XTALSTDF - 0 - 0 - read-write - - - - - MRCTRM - desc MRCTRM - 0x7C61 - 8 - read-write - 0x0 - 0xFF - - - HRCTRM - desc HRCTRM - 0x7C62 - 8 - read-write - 0x0 - 0xFF - - - XTALSTBCR - desc XTALSTBCR - 0x7CA2 - 8 - read-write - 0x5 - 0xF - - - XTALSTB - desc XTALSTB - 3 - 0 - read-write - - - - - PLLHCFGR - desc PLLHCFGR - 0x7D00 - 32 - read-write - 0x11101300 - 0xFFF1FF9F - - - PLLHM - desc PLLHM - 1 - 0 - read-write - - - PLLSRC - desc PLLSRC - 7 - 7 - read-write - - - PLLHN - desc PLLHN - 15 - 8 - read-write - - - PLLHR - desc PLLHR - 23 - 20 - read-write - - - PLLHQ - desc PLLHQ - 27 - 24 - read-write - - - PLLHP - desc PLLHP - 31 - 28 - read-write - - - - - PLLACFGR - desc PLLACFGR - 0x7D04 - 32 - read-write - 0x11101300 - 0xFFF1FF1F - - - PLLAM - desc PLLAM - 4 - 0 - read-write - - - PLLAN - desc PLLAN - 16 - 8 - read-write - - - PLLAR - desc PLLAR - 23 - 20 - read-write - - - PLLAQ - desc PLLAQ - 27 - 24 - read-write - - - PLLAP - desc PLLAP - 31 - 28 - read-write - - - - - - - CRC - desc CRC - 0x40008C00 - - 0x0 - 0x100 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x1 - 0x3 - - - CR - desc CR - 0 - 0 - read-write - - - FLAG - desc FLAG - 1 - 1 - read-only - - - - - RESLT - desc RESLT - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT0 - desc DAT0 - 0x80 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT1 - desc DAT1 - 0x84 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT2 - desc DAT2 - 0x88 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT3 - desc DAT3 - 0x8C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT4 - desc DAT4 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT5 - desc DAT5 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT6 - desc DAT6 - 0x98 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT7 - desc DAT7 - 0x9C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT8 - desc DAT8 - 0xA0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT9 - desc DAT9 - 0xA4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT10 - desc DAT10 - 0xA8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT11 - desc DAT11 - 0xAC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT12 - desc DAT12 - 0xB0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT13 - desc DAT13 - 0xB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT14 - desc DAT14 - 0xB8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT15 - desc DAT15 - 0xBC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT16 - desc DAT16 - 0xC0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT17 - desc DAT17 - 0xC4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT18 - desc DAT18 - 0xC8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT19 - desc DAT19 - 0xCC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT20 - desc DAT20 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT21 - desc DAT21 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT22 - desc DAT22 - 0xD8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT23 - desc DAT23 - 0xDC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT24 - desc DAT24 - 0xE0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT25 - desc DAT25 - 0xE4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT26 - desc DAT26 - 0xE8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT27 - desc DAT27 - 0xEC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT28 - desc DAT28 - 0xF0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT29 - desc DAT29 - 0xF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT30 - desc DAT30 - 0xF8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAT31 - desc DAT31 - 0xFC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - CTC - desc CTC - 0x40049C00 - - 0x0 - 0xC - - - - CR1 - desc CR1 - 0x0 - 32 - read-write - 0x0 - 0x3F00F7 - - - REFPSC - desc REFPSC - 2 - 0 - read-write - - - REFCKS - desc REFCKS - 5 - 4 - read-write - - - ERRIE - desc ERRIE - 6 - 6 - read-write - - - CTCEN - desc CTCEN - 7 - 7 - read-write - - - TRMVAL - desc TRMVAL - 21 - 16 - read-write - - - - - CR2 - desc CR2 - 0x4 - 32 - read-write - 0x0 - 0xFFFF00FF - - - OFSVAL - desc OFSVAL - 7 - 0 - read-write - - - RLDVAL - desc RLDVAL - 31 - 16 - read-write - - - - - STR - desc STR - 0x8 - 32 - read-only - 0x0 - 0xF - - - TRIMOK - desc TRIMOK - 0 - 0 - read-only - - - TRMOVF - desc TRMOVF - 1 - 1 - read-only - - - TRMUDF - desc TRMUDF - 2 - 2 - read-only - - - CTCBSY - desc CTCBSY - 3 - 3 - read-only - - - - - - - DAC1 - desc DAC - 0x40041000 - - 0x0 - 0x1E - - - - DADR1 - desc DADR1 - 0x0 - 16 - read-write - 0x0 - 0xFFFF - - - DADR2 - desc DADR2 - 0x2 - 16 - read-write - 0x0 - 0xFFFF - - - DACR - desc DACR - 0x4 - 16 - read-write - 0x0 - 0x1F07 - - - DAEN - desc DAEN - 0 - 0 - read-write - - - DA1EN - desc DA1EN - 1 - 1 - read-write - - - DA2EN - desc DA2EN - 2 - 2 - read-write - - - ALIGN - desc ALIGN - 8 - 8 - read-write - - - DAAMP1 - desc DAAMP1 - 9 - 9 - read-write - - - DAAMP2 - desc DAAMP2 - 10 - 10 - read-write - - - EXTDSL1 - desc EXTDSL1 - 11 - 11 - read-write - - - EXTDSL2 - desc EXTDSL2 - 12 - 12 - read-write - - - - - DAADPCR - desc DAADPCR - 0x6 - 16 - read-write - 0x0 - 0x8307 - - - ADPSL1 - desc ADPSL1 - 0 - 0 - read-write - - - ADPSL2 - desc ADPSL2 - 1 - 1 - read-write - - - ADPSL3 - desc ADPSL3 - 2 - 2 - read-write - - - DA1SF - desc DA1SF - 8 - 8 - read-only - - - DA2SF - desc DA2SF - 9 - 9 - read-only - - - ADPEN - desc ADPEN - 15 - 15 - read-write - - - - - DAOCR - desc DAOCR - 0x1C - 16 - read-write - 0x0 - 0xC000 - - - DAODIS1 - desc DAODIS1 - 14 - 14 - read-write - - - DAODIS2 - desc DAODIS2 - 15 - 15 - read-write - - - - - - - DAC2 - desc DAC - 0x40041400 - - 0x0 - 0x1E - - - - DBGC - desc DBGC - 0xE0042000 - - 0x0 - 0x2C - - - - AUTHID0 - desc AUTHID0 - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - AUTHID1 - desc AUTHID1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - AUTHID2 - desc AUTHID2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RESV0 - desc RESV0 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MCUSTAT - desc MCUSTAT - 0x10 - 32 - read-write - 0x0 - 0x30F - - - AUTH - desc AUTH - 0 - 0 - read-write - - - REMVLOCK - desc REMVLOCK - 1 - 1 - read-write - - - SAFTYLOCK1 - desc SAFTYLOCK1 - 2 - 2 - read-write - - - SAFTYLOCK2 - desc SAFTYLOCK2 - 3 - 3 - read-write - - - CPUSTOP - desc CPUSTOP - 8 - 8 - read-write - - - CPUSLEEP - desc CPUSLEEP - 9 - 9 - read-write - - - - - MCUCTL - desc MCUCTL - 0x14 - 32 - read-write - 0x0 - 0x103 - - - EDBGRQ - desc EDBGRQ - 0 - 0 - read-write - - - RESTART - desc RESTART - 1 - 1 - read-write - - - DIRQ - desc DIRQ - 8 - 8 - read-write - - - - - FMCCTL - desc FMCCTL - 0x18 - 32 - read-write - 0x0 - 0x7 - - - ERASEREQ - desc ERASEREQ - 0 - 0 - read-write - - - ERASEACK - desc ERASEACK - 1 - 1 - read-write - - - ERASEERR - desc ERASEERR - 2 - 2 - read-write - - - - - MCUDBGCSTAT - desc MCUDBGCSTAT - 0x1C - 32 - read-write - 0x0 - 0x3 - - - CDBGPWRUPREQ - desc CDBGPWRUPREQ - 0 - 0 - read-write - - - CDBGPWRUPACK - desc CDBGPWRUPACK - 1 - 1 - read-write - - - - - MCUSTPCTL - desc MCUSTPCTL - 0x20 - 32 - read-write - 0x3B - 0x7FFFFF - - - SWDTSTP - desc SWDTSTP - 0 - 0 - read-write - - - WDTSTP - desc WDTSTP - 1 - 1 - read-write - - - RTCSTP - desc RTCSTP - 2 - 2 - read-write - - - PVD0STP - desc PVD0STP - 3 - 3 - read-write - - - PVD1STP - desc PVD1STP - 4 - 4 - read-write - - - PVD2STP - desc PVD2STP - 5 - 5 - read-write - - - M06STP - desc M06STP - 6 - 6 - read-write - - - M07STP - desc M07STP - 7 - 7 - read-write - - - M08STP - desc M08STP - 8 - 8 - read-write - - - M09STP - desc M09STP - 9 - 9 - read-write - - - M10STP - desc M10STP - 10 - 10 - read-write - - - M11STP - desc M11STP - 11 - 11 - read-write - - - M12STP - desc M12STP - 12 - 12 - read-write - - - M13STP - desc M13STP - 13 - 13 - read-write - - - M14STP - desc M14STP - 14 - 14 - read-write - - - M15STP - desc M15STP - 15 - 15 - read-write - - - M16STP - desc M16STP - 16 - 16 - read-write - - - M17STP - desc M17STP - 17 - 17 - read-write - - - M18STP - desc M18STP - 18 - 18 - read-write - - - M19STP - desc M19STP - 19 - 19 - read-write - - - M20STP - desc M20STP - 20 - 20 - read-write - - - M21STP - desc M21STP - 21 - 21 - read-write - - - M22STP - desc M22STP - 22 - 22 - read-write - - - - - MCUTRACECTL - desc MCUTRACECTL - 0x24 - 32 - read-write - 0x0 - 0x7 - - - TRACEMODE - desc TRACEMODE - 1 - 0 - read-write - - - TRACEIOEN - desc TRACEIOEN - 2 - 2 - read-write - - - - - MCUSTPCTL2 - desc MCUSTPCTL2 - 0x28 - 32 - read-write - 0x0 - 0xFFF - - - M32STP - desc M32STP - 0 - 0 - read-write - - - M33STP - desc M33STP - 1 - 1 - read-write - - - M34STP - desc M34STP - 2 - 2 - read-write - - - M35STP - desc M35STP - 3 - 3 - read-write - - - M36STP - desc M36STP - 4 - 4 - read-write - - - M37STP - desc M37STP - 5 - 5 - read-write - - - M38STP - desc M38STP - 6 - 6 - read-write - - - M39STP - desc M39STP - 7 - 7 - read-write - - - M40STP - desc M40STP - 8 - 8 - read-write - - - M41STP - desc M41STP - 9 - 9 - read-write - - - M42STP - desc M42STP - 10 - 10 - read-write - - - M43STP - desc M43STP - 11 - 11 - read-write - - - - - - - DCU1 - desc DCU - 0x40056000 - - 0x0 - 0x1C - - - - CTL - desc CTL - 0x0 - 32 - read-write - 0x80000000 - 0x8000013F - - - MODE - desc MODE - 3 - 0 - read-write - - - DATASIZE - desc DATASIZE - 5 - 4 - read-write - - - COMP_TRG - desc COMP_TRG - 8 - 8 - read-write - - - INTEN - desc INTEN - 31 - 31 - read-write - - - - - FLAG - desc FLAG - 0x4 - 32 - read-only - 0x0 - 0xE7F - - - FLAG_OP - desc FLAG_OP - 0 - 0 - read-only - - - FLAG_LS2 - desc FLAG_LS2 - 1 - 1 - read-only - - - FLAG_EQ2 - desc FLAG_EQ2 - 2 - 2 - read-only - - - FLAG_GT2 - desc FLAG_GT2 - 3 - 3 - read-only - - - FLAG_LS1 - desc FLAG_LS1 - 4 - 4 - read-only - - - FLAG_EQ1 - desc FLAG_EQ1 - 5 - 5 - read-only - - - FLAG_GT1 - desc FLAG_GT1 - 6 - 6 - read-only - - - FLAG_RLD - desc FLAG_RLD - 9 - 9 - read-only - - - FLAG_BTM - desc FLAG_BTM - 10 - 10 - read-only - - - FLAG_TOP - desc FLAG_TOP - 11 - 11 - read-only - - - - - DATA0 - desc DATA0 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA1 - desc DATA1 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA2 - desc DATA2 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FLAGCLR - desc FLAGCLR - 0x14 - 32 - write-only - 0x0 - 0xE7F - - - CLR_OP - desc CLR_OP - 0 - 0 - write-only - - - CLR_LS2 - desc CLR_LS2 - 1 - 1 - write-only - - - CLR_EQ2 - desc CLR_EQ2 - 2 - 2 - write-only - - - CLR_GT2 - desc CLR_GT2 - 3 - 3 - write-only - - - CLR_LS1 - desc CLR_LS1 - 4 - 4 - write-only - - - CLR_EQ1 - desc CLR_EQ1 - 5 - 5 - write-only - - - CLR_GT1 - desc CLR_GT1 - 6 - 6 - write-only - - - CLR_RLD - desc CLR_RLD - 9 - 9 - read-write - - - CLR_BTM - desc CLR_BTM - 10 - 10 - read-write - - - CLR_TOP - desc CLR_TOP - 11 - 11 - read-write - - - - - INTSEL - desc INTSEL - 0x18 - 32 - read-write - 0x0 - 0xFFF - - - INT_OP - desc INT_OP - 0 - 0 - read-write - - - INT_LS2 - desc INT_LS2 - 1 - 1 - read-write - - - INT_EQ2 - desc INT_EQ2 - 2 - 2 - read-write - - - INT_GT2 - desc INT_GT2 - 3 - 3 - read-write - - - INT_LS1 - desc INT_LS1 - 4 - 4 - read-write - - - INT_EQ1 - desc INT_EQ1 - 5 - 5 - read-write - - - INT_GT1 - desc INT_GT1 - 6 - 6 - read-write - - - INT_WIN - desc INT_WIN - 8 - 7 - read-write - - - INT_RLD - desc INT_RLD - 9 - 9 - read-write - - - INT_BTM - desc INT_BTM - 10 - 10 - read-write - - - INT_TOP - desc INT_TOP - 11 - 11 - read-write - - - - - - - DCU2 - desc DCU - 0x40056400 - - 0x0 - 0x1C - - - - DCU3 - desc DCU - 0x40056800 - - 0x0 - 0x1C - - - - DCU4 - desc DCU - 0x40056C00 - - 0x0 - 0x1C - - - - DCU5 - desc DCU - 0x40057000 - - 0x0 - 0x1C - - - - CTL - desc CTL - 0x0 - 32 - read-write - 0x80000000 - 0x8000013F - - - MODE - desc MODE - 3 - 0 - read-write - - - DATASIZE - desc DATASIZE - 5 - 4 - read-write - - - COMP_TRG - desc COMP_TRG - 8 - 8 - read-write - - - INTEN - desc INTEN - 31 - 31 - read-write - - - - - FLAG - desc FLAG - 0x4 - 32 - read-only - 0x0 - 0x7F - - - FLAG_OP - desc FLAG_OP - 0 - 0 - read-only - - - FLAG_LS2 - desc FLAG_LS2 - 1 - 1 - read-only - - - FLAG_EQ2 - desc FLAG_EQ2 - 2 - 2 - read-only - - - FLAG_GT2 - desc FLAG_GT2 - 3 - 3 - read-only - - - FLAG_LS1 - desc FLAG_LS1 - 4 - 4 - read-only - - - FLAG_EQ1 - desc FLAG_EQ1 - 5 - 5 - read-only - - - FLAG_GT1 - desc FLAG_GT1 - 6 - 6 - read-only - - - - - DATA0 - desc DATA0 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA1 - desc DATA1 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DATA2 - desc DATA2 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FLAGCLR - desc FLAGCLR - 0x14 - 32 - write-only - 0x0 - 0x7F - - - CLR_OP - desc CLR_OP - 0 - 0 - write-only - - - CLR_LS2 - desc CLR_LS2 - 1 - 1 - write-only - - - CLR_EQ2 - desc CLR_EQ2 - 2 - 2 - write-only - - - CLR_GT2 - desc CLR_GT2 - 3 - 3 - write-only - - - CLR_LS1 - desc CLR_LS1 - 4 - 4 - write-only - - - CLR_EQ1 - desc CLR_EQ1 - 5 - 5 - write-only - - - CLR_GT1 - desc CLR_GT1 - 6 - 6 - write-only - - - - - INTSEL - desc INTSEL - 0x18 - 32 - read-write - 0x0 - 0x1FF - - - INT_OP - desc INT_OP - 0 - 0 - read-write - - - INT_LS2 - desc INT_LS2 - 1 - 1 - read-write - - - INT_EQ2 - desc INT_EQ2 - 2 - 2 - read-write - - - INT_GT2 - desc INT_GT2 - 3 - 3 - read-write - - - INT_LS1 - desc INT_LS1 - 4 - 4 - read-write - - - INT_EQ1 - desc INT_EQ1 - 5 - 5 - read-write - - - INT_GT1 - desc INT_GT1 - 6 - 6 - read-write - - - INT_WIN - desc INT_WIN - 8 - 7 - read-write - - - - - - - DCU6 - desc DCU - 0x40057400 - - 0x0 - 0x1C - - - - DCU7 - desc DCU - 0x40057800 - - 0x0 - 0x1C - - - - DCU8 - desc DCU - 0x40057C00 - - 0x0 - 0x1C - - - - DMA1 - desc DMA - 0x40053000 - - 0x0 - 0x238 - - - - EN - desc EN - 0x0 - 32 - read-write - 0x0 - 0x1 - - - EN - desc EN - 0 - 0 - read-write - - - - - INTSTAT0 - desc INTSTAT0 - 0x4 - 32 - read-only - 0x0 - 0xFF00FF - - - TRNERR - desc TRNERR - 7 - 0 - read-only - - - REQERR - desc REQERR - 23 - 16 - read-only - - - - - INTSTAT1 - desc INTSTAT1 - 0x8 - 32 - read-only - 0x0 - 0xFF00FF - - - TC - desc TC - 7 - 0 - read-only - - - BTC - desc BTC - 23 - 16 - read-only - - - - - INTMASK0 - desc INTMASK0 - 0xC - 32 - read-write - 0x0 - 0xFF00FF - - - MSKTRNERR - desc MSKTRNERR - 7 - 0 - read-write - - - MSKREQERR - desc MSKREQERR - 23 - 16 - read-write - - - - - INTMASK1 - desc INTMASK1 - 0x10 - 32 - read-write - 0x0 - 0xFF00FF - - - MSKTC - desc MSKTC - 7 - 0 - read-write - - - MSKBTC - desc MSKBTC - 23 - 16 - read-write - - - - - INTCLR0 - desc INTCLR0 - 0x14 - 32 - read-write - 0x0 - 0xFF00FF - - - CLRTRNERR - desc CLRTRNERR - 7 - 0 - read-write - - - CLRREQERR - desc CLRREQERR - 23 - 16 - read-write - - - - - INTCLR1 - desc INTCLR1 - 0x18 - 32 - read-write - 0x0 - 0xFF00FF - - - CLRTC - desc CLRTC - 7 - 0 - read-write - - - CLRBTC - desc CLRBTC - 23 - 16 - read-write - - - - - CHEN - desc CHEN - 0x1C - 32 - read-write - 0x0 - 0xFF - - - CHEN - desc CHEN - 7 - 0 - read-write - - - - - REQSTAT - desc REQSTAT - 0x20 - 32 - read-only - 0x0 - 0x80FF - - - CHREQ - desc CHREQ - 7 - 0 - read-only - - - RCFGREQ - desc RCFGREQ - 15 - 15 - read-only - - - - - CHSTAT - desc CHSTAT - 0x24 - 32 - read-only - 0x0 - 0xFF0003 - - - DMAACT - desc DMAACT - 0 - 0 - read-only - - - RCFGACT - desc RCFGACT - 1 - 1 - read-only - - - CHACT - desc CHACT - 23 - 16 - read-only - - - - - RCFGCTL - desc RCFGCTL - 0x2C - 32 - read-write - 0x0 - 0x3F0F03 - - - RCFGEN - desc RCFGEN - 0 - 0 - read-write - - - RCFGLLP - desc RCFGLLP - 1 - 1 - read-write - - - RCFGCHS - desc RCFGCHS - 11 - 8 - read-write - - - SARMD - desc SARMD - 17 - 16 - read-write - - - DARMD - desc DARMD - 19 - 18 - read-write - - - CNTMD - desc CNTMD - 21 - 20 - read-write - - - - - CHENCLR - desc CHENCLR - 0x34 - 32 - read-write - 0x0 - 0xFF - - - CHENCLR - desc CHENCLR - 7 - 0 - read-write - - - - - SAR0 - desc SAR0 - 0x40 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR0 - desc DAR0 - 0x44 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL0 - desc DTCTL0 - 0x48 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT0 - desc RPT0 - 0x4C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB0 - desc RPTB0 - 0x4C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL0 - desc SNSEQCTL0 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB0 - desc SNSEQCTLB0 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL0 - desc DNSEQCTL0 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB0 - desc DNSEQCTLB0 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP0 - desc LLP0 - 0x58 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL0 - desc CHCTL0 - 0x5C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR0 - desc MONSAR0 - 0x60 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR0 - desc MONDAR0 - 0x64 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL0 - desc MONDTCTL0 - 0x68 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT0 - desc MONRPT0 - 0x6C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL0 - desc MONSNSEQCTL0 - 0x70 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL0 - desc MONDNSEQCTL0 - 0x74 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR1 - desc SAR1 - 0x80 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR1 - desc DAR1 - 0x84 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL1 - desc DTCTL1 - 0x88 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT1 - desc RPT1 - 0x8C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB1 - desc RPTB1 - 0x8C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL1 - desc SNSEQCTL1 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB1 - desc SNSEQCTLB1 - 0x90 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL1 - desc DNSEQCTL1 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB1 - desc DNSEQCTLB1 - 0x94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP1 - desc LLP1 - 0x98 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL1 - desc CHCTL1 - 0x9C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR1 - desc MONSAR1 - 0xA0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR1 - desc MONDAR1 - 0xA4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL1 - desc MONDTCTL1 - 0xA8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT1 - desc MONRPT1 - 0xAC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL1 - desc MONSNSEQCTL1 - 0xB0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL1 - desc MONDNSEQCTL1 - 0xB4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR2 - desc SAR2 - 0xC0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR2 - desc DAR2 - 0xC4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL2 - desc DTCTL2 - 0xC8 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT2 - desc RPT2 - 0xCC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB2 - desc RPTB2 - 0xCC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL2 - desc SNSEQCTL2 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB2 - desc SNSEQCTLB2 - 0xD0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL2 - desc DNSEQCTL2 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB2 - desc DNSEQCTLB2 - 0xD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP2 - desc LLP2 - 0xD8 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL2 - desc CHCTL2 - 0xDC - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR2 - desc MONSAR2 - 0xE0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR2 - desc MONDAR2 - 0xE4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL2 - desc MONDTCTL2 - 0xE8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT2 - desc MONRPT2 - 0xEC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL2 - desc MONSNSEQCTL2 - 0xF0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL2 - desc MONDNSEQCTL2 - 0xF4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR3 - desc SAR3 - 0x100 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR3 - desc DAR3 - 0x104 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL3 - desc DTCTL3 - 0x108 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT3 - desc RPT3 - 0x10C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB3 - desc RPTB3 - 0x10C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL3 - desc SNSEQCTL3 - 0x110 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB3 - desc SNSEQCTLB3 - 0x110 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL3 - desc DNSEQCTL3 - 0x114 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB3 - desc DNSEQCTLB3 - 0x114 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP3 - desc LLP3 - 0x118 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL3 - desc CHCTL3 - 0x11C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR3 - desc MONSAR3 - 0x120 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR3 - desc MONDAR3 - 0x124 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL3 - desc MONDTCTL3 - 0x128 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT3 - desc MONRPT3 - 0x12C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL3 - desc MONSNSEQCTL3 - 0x130 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL3 - desc MONDNSEQCTL3 - 0x134 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR4 - desc SAR4 - 0x140 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR4 - desc DAR4 - 0x144 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL4 - desc DTCTL4 - 0x148 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT4 - desc RPT4 - 0x14C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB4 - desc RPTB4 - 0x14C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL4 - desc SNSEQCTL4 - 0x150 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB4 - desc SNSEQCTLB4 - 0x150 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL4 - desc DNSEQCTL4 - 0x154 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB4 - desc DNSEQCTLB4 - 0x154 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP4 - desc LLP4 - 0x158 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL4 - desc CHCTL4 - 0x15C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR4 - desc MONSAR4 - 0x160 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR4 - desc MONDAR4 - 0x164 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL4 - desc MONDTCTL4 - 0x168 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT4 - desc MONRPT4 - 0x16C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL4 - desc MONSNSEQCTL4 - 0x170 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL4 - desc MONDNSEQCTL4 - 0x174 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR5 - desc SAR5 - 0x180 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR5 - desc DAR5 - 0x184 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL5 - desc DTCTL5 - 0x188 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT5 - desc RPT5 - 0x18C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB5 - desc RPTB5 - 0x18C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL5 - desc SNSEQCTL5 - 0x190 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB5 - desc SNSEQCTLB5 - 0x190 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL5 - desc DNSEQCTL5 - 0x194 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB5 - desc DNSEQCTLB5 - 0x194 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP5 - desc LLP5 - 0x198 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL5 - desc CHCTL5 - 0x19C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR5 - desc MONSAR5 - 0x1A0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR5 - desc MONDAR5 - 0x1A4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL5 - desc MONDTCTL5 - 0x1A8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT5 - desc MONRPT5 - 0x1AC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL5 - desc MONSNSEQCTL5 - 0x1B0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL5 - desc MONDNSEQCTL5 - 0x1B4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR6 - desc SAR6 - 0x1C0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR6 - desc DAR6 - 0x1C4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL6 - desc DTCTL6 - 0x1C8 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT6 - desc RPT6 - 0x1CC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB6 - desc RPTB6 - 0x1CC - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL6 - desc SNSEQCTL6 - 0x1D0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB6 - desc SNSEQCTLB6 - 0x1D0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL6 - desc DNSEQCTL6 - 0x1D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB6 - desc DNSEQCTLB6 - 0x1D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP6 - desc LLP6 - 0x1D8 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL6 - desc CHCTL6 - 0x1DC - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR6 - desc MONSAR6 - 0x1E0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR6 - desc MONDAR6 - 0x1E4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL6 - desc MONDTCTL6 - 0x1E8 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT6 - desc MONRPT6 - 0x1EC - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL6 - desc MONSNSEQCTL6 - 0x1F0 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL6 - desc MONDNSEQCTL6 - 0x1F4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - SAR7 - desc SAR7 - 0x200 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DAR7 - desc DAR7 - 0x204 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTCTL7 - desc DTCTL7 - 0x208 - 32 - read-write - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-write - - - CNT - desc CNT - 31 - 16 - read-write - - - - - RPT7 - desc RPT7 - 0x20C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-write - - - DRPT - desc DRPT - 25 - 16 - read-write - - - - - RPTB7 - desc RPTB7 - 0x20C - 32 - read-write - 0x0 - 0x3FF03FF - - - SRPTB - desc SRPTB - 9 - 0 - read-write - - - DRPTB - desc DRPTB - 25 - 16 - read-write - - - - - SNSEQCTL7 - desc SNSEQCTL7 - 0x210 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-write - - - SNSCNT - desc SNSCNT - 31 - 20 - read-write - - - - - SNSEQCTLB7 - desc SNSEQCTLB7 - 0x210 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SNSDIST - desc SNSDIST - 19 - 0 - read-write - - - SNSCNTB - desc SNSCNTB - 31 - 20 - read-write - - - - - DNSEQCTL7 - desc DNSEQCTL7 - 0x214 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-write - - - DNSCNT - desc DNSCNT - 31 - 20 - read-write - - - - - DNSEQCTLB7 - desc DNSEQCTLB7 - 0x214 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DNSDIST - desc DNSDIST - 19 - 0 - read-write - - - DNSCNTB - desc DNSCNTB - 31 - 20 - read-write - - - - - LLP7 - desc LLP7 - 0x218 - 32 - read-write - 0x0 - 0xFFFFFFFC - - - LLP - desc LLP - 31 - 2 - read-write - - - - - CHCTL7 - desc CHCTL7 - 0x21C - 32 - read-write - 0x1000 - 0x1FFF - - - SINC - desc SINC - 1 - 0 - read-write - - - DINC - desc DINC - 3 - 2 - read-write - - - SRPTEN - desc SRPTEN - 4 - 4 - read-write - - - DRPTEN - desc DRPTEN - 5 - 5 - read-write - - - SNSEQEN - desc SNSEQEN - 6 - 6 - read-write - - - DNSEQEN - desc DNSEQEN - 7 - 7 - read-write - - - HSIZE - desc HSIZE - 9 - 8 - read-write - - - LLPEN - desc LLPEN - 10 - 10 - read-write - - - LLPRUN - desc LLPRUN - 11 - 11 - read-write - - - IE - desc IE - 12 - 12 - read-write - - - - - MONSAR7 - desc MONSAR7 - 0x220 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDAR7 - desc MONDAR7 - 0x224 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MONDTCTL7 - desc MONDTCTL7 - 0x228 - 32 - read-only - 0x1 - 0xFFFF03FF - - - BLKSIZE - desc BLKSIZE - 9 - 0 - read-only - - - CNT - desc CNT - 31 - 16 - read-only - - - - - MONRPT7 - desc MONRPT7 - 0x22C - 32 - read-only - 0x0 - 0x3FF03FF - - - SRPT - desc SRPT - 9 - 0 - read-only - - - DRPT - desc DRPT - 25 - 16 - read-only - - - - - MONSNSEQCTL7 - desc MONSNSEQCTL7 - 0x230 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SOFFSET - desc SOFFSET - 19 - 0 - read-only - - - SNSCNT - desc SNSCNT - 31 - 20 - read-only - - - - - MONDNSEQCTL7 - desc MONDNSEQCTL7 - 0x234 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - DOFFSET - desc DOFFSET - 19 - 0 - read-only - - - DNSCNT - desc DNSCNT - 31 - 20 - read-only - - - - - - - DMA2 - desc DMA - 0x40053400 - - 0x0 - 0x238 - - - - DMC - desc DMC - 0x88000400 - - 0x0 - 0x304 - - - - STSR - desc STSR - 0x0 - 32 - read-only - 0x700 - 0xF - - - STATUS - desc STATUS - 1 - 0 - read-only - - - MEMW - desc MEMW - 3 - 2 - read-only - - - - - STCR - desc STCR - 0x4 - 32 - write-only - 0x0 - 0x7 - - - STCTL - desc STCTL - 2 - 0 - write-only - - - - - CMDR - desc CMDR - 0x8 - 32 - write-only - 0x0 - 0x13F3FFF - - - CMDADD - desc CMDADD - 13 - 0 - write-only - - - CMDBA - desc CMDBA - 17 - 16 - write-only - - - CMD - desc CMD - 19 - 18 - write-only - - - CMDCHIP - desc CMDCHIP - 21 - 20 - write-only - - - - - CPCR - desc CPCR - 0xC - 32 - read-write - 0x20040 - 0x307FFF7 - - - COLBS - desc COLBS - 2 - 0 - read-write - - - ROWBS - desc ROWBS - 6 - 4 - read-write - - - APBS - desc APBS - 7 - 7 - read-write - - - CKEDIS - desc CKEDIS - 8 - 8 - read-write - - - CKSTOP - desc CKSTOP - 9 - 9 - read-write - - - CKEDISPRD - desc CKEDISPRD - 15 - 10 - read-write - - - BURST - desc BURST - 18 - 16 - read-write - - - ACTCP - desc ACTCP - 25 - 24 - read-write - - - - - RFTR - desc RFTR - 0x10 - 32 - read-write - 0xA60 - 0x7FFF - - - REFPRD - desc REFPRD - 14 - 0 - read-write - - - - - TMCR_T_CASL - desc TMCR_T_CASL - 0x14 - 32 - read-write - 0x3 - 0x7 - - - T_CASL - desc T_CASL - 2 - 0 - read-write - - - - - TMCR_T_DQSS - desc TMCR_T_DQSS - 0x18 - 32 - read-write - 0x1 - 0x3 - - - T_DQSS - desc T_DQSS - 1 - 0 - read-write - - - - - TMCR_T_MRD - desc TMCR_T_MRD - 0x1C - 32 - read-write - 0x2 - 0x7F - - - T_MRD - desc T_MRD - 6 - 0 - read-write - - - - - TMCR_T_RAS - desc TMCR_T_RAS - 0x20 - 32 - read-write - 0x7 - 0xF - - - T_RAS - desc T_RAS - 3 - 0 - read-write - - - - - TMCR_T_RC - desc TMCR_T_RC - 0x24 - 32 - read-write - 0xB - 0xF - - - T_RC - desc T_RC - 3 - 0 - read-write - - - - - TMCR_T_RCD - desc TMCR_T_RCD - 0x28 - 32 - read-write - 0x35 - 0x77 - - - T_RCD_B - desc T_RCD_B - 2 - 0 - read-write - - - T_RCD_P - desc T_RCD_P - 6 - 4 - read-write - - - - - TMCR_T_RFC - desc TMCR_T_RFC - 0x2C - 32 - read-write - 0x1012 - 0x1F1F - - - T_RFC_B - desc T_RFC_B - 4 - 0 - read-write - - - T_RFC_P - desc T_RFC_P - 12 - 8 - read-write - - - - - TMCR_T_RP - desc TMCR_T_RP - 0x30 - 32 - read-write - 0x35 - 0x77 - - - T_RP_B - desc T_RP_B - 2 - 0 - read-write - - - T_RP_P - desc T_RP_P - 6 - 4 - read-write - - - - - TMCR_T_RRD - desc TMCR_T_RRD - 0x34 - 32 - read-write - 0x2 - 0xF - - - T_RRD - desc T_RRD - 3 - 0 - read-write - - - - - TMCR_T_WR - desc TMCR_T_WR - 0x38 - 32 - read-write - 0x3 - 0x7 - - - T_WR - desc T_WR - 2 - 0 - read-write - - - - - TMCR_T_WTR - desc TMCR_T_WTR - 0x3C - 32 - read-write - 0x2 - 0x7 - - - T_WTR - desc T_WTR - 2 - 0 - read-write - - - - - TMCR_T_XP - desc TMCR_T_XP - 0x40 - 32 - read-write - 0x1 - 0xFF - - - T_XP - desc T_XP - 7 - 0 - read-write - - - - - TMCR_T_XSR - desc TMCR_T_XSR - 0x44 - 32 - read-write - 0xA - 0xFF - - - T_XSR - desc T_XSR - 7 - 0 - read-write - - - - - TMCR_T_ESR - desc TMCR_T_ESR - 0x48 - 32 - read-write - 0x14 - 0xFF - - - T_ESR - desc T_ESR - 7 - 0 - read-write - - - - - CSCR0 - desc CSCR0 - 0x200 - 32 - read-write - 0xFF00 - 0x101FFFF - - - ADDMSK - desc ADDMSK - 7 - 0 - read-write - - - ADDMAT - desc ADDMAT - 15 - 8 - read-write - - - BRC - desc BRC - 16 - 16 - read-write - - - - - CSCR1 - desc CSCR1 - 0x204 - 32 - read-write - 0xFF00 - 0x101FFFF - - - ADDMSK - desc ADDMSK - 7 - 0 - read-write - - - ADDMAT - desc ADDMAT - 15 - 8 - read-write - - - BRC - desc BRC - 16 - 16 - read-write - - - - - CSCR2 - desc CSCR2 - 0x208 - 32 - read-write - 0xFF00 - 0x101FFFF - - - ADDMSK - desc ADDMSK - 7 - 0 - read-write - - - ADDMAT - desc ADDMAT - 15 - 8 - read-write - - - BRC - desc BRC - 16 - 16 - read-write - - - - - CSCR3 - desc CSCR3 - 0x20C - 32 - read-write - 0xFF00 - 0x101FFFF - - - ADDMSK - desc ADDMSK - 7 - 0 - read-write - - - ADDMAT - desc ADDMAT - 15 - 8 - read-write - - - BRC - desc BRC - 16 - 16 - read-write - - - - - BACR - desc BACR - 0x300 - 32 - read-write - 0x300 - 0x100C003 - - - DMCMW - desc DMCMW - 1 - 0 - read-write - - - CKSEL - desc CKSEL - 15 - 14 - read-write - - - - - - - DVP - desc DVP - 0x40055800 - - 0x0 - 0x30 - - - - CTR - desc CTR - 0x0 - 32 - read-write - 0x0 - 0x4FFF - - - CAPEN - desc CAPEN - 0 - 0 - read-write - - - CAPMD - desc CAPMD - 1 - 1 - read-write - - - CROPEN - desc CROPEN - 2 - 2 - read-write - - - JPEGEN - desc JPEGEN - 3 - 3 - read-write - - - SWSYNC - desc SWSYNC - 4 - 4 - read-write - - - PIXCKSEL - desc PIXCKSEL - 5 - 5 - read-write - - - HSYNCSEL - desc HSYNCSEL - 6 - 6 - read-write - - - VSYNCSEL - desc VSYNCSEL - 7 - 7 - read-write - - - CAPFRC - desc CAPFRC - 9 - 8 - read-write - - - BITSEL - desc BITSEL - 11 - 10 - read-write - - - DVPEN - desc DVPEN - 14 - 14 - read-write - - - - - DTR - desc DTR - 0x4 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - STR - desc STR - 0x8 - 32 - read-write - 0x0 - 0x3F - - - FSF - desc FSF - 0 - 0 - read-write - - - LSF - desc LSF - 1 - 1 - read-write - - - LEF - desc LEF - 2 - 2 - read-write - - - FEF - desc FEF - 3 - 3 - read-write - - - SQUERF - desc SQUERF - 4 - 4 - read-write - - - FIFOERF - desc FIFOERF - 5 - 5 - read-write - - - - - IER - desc IER - 0xC - 32 - read-write - 0x0 - 0x3F - - - FSIEN - desc FSIEN - 0 - 0 - read-write - - - LSIEN - desc LSIEN - 1 - 1 - read-write - - - LEIEN - desc LEIEN - 2 - 2 - read-write - - - FEIEN - desc FEIEN - 3 - 3 - read-write - - - SQUERIEN - desc SQUERIEN - 4 - 4 - read-write - - - FIFOERIEN - desc FIFOERIEN - 5 - 5 - read-write - - - - - DMR - desc DMR - 0x10 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - SSYNDR - desc SSYNDR - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FSDAT - desc FSDAT - 7 - 0 - read-write - - - LSDAT - desc LSDAT - 15 - 8 - read-write - - - LEDAT - desc LEDAT - 23 - 16 - read-write - - - FEDAT - desc FEDAT - 31 - 24 - read-write - - - - - SSYNMR - desc SSYNMR - 0x24 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - FSMSK - desc FSMSK - 7 - 0 - read-write - - - LSMSK - desc LSMSK - 15 - 8 - read-write - - - LEMSK - desc LEMSK - 23 - 16 - read-write - - - FEMSK - desc FEMSK - 31 - 24 - read-write - - - - - CPSFTR - desc CPSFTR - 0x28 - 32 - read-write - 0x0 - 0x3FFF3FFF - - - RSHIFT - desc RSHIFT - 13 - 0 - read-write - - - CSHIFT - desc CSHIFT - 29 - 16 - read-write - - - - - CPSZER - desc CPSZER - 0x2C - 32 - read-write - 0x0 - 0x3FFF3FFF - - - RSIZE - desc RSIZE - 13 - 0 - read-write - - - CSIZE - desc CSIZE - 29 - 16 - read-write - - - - - - - EFM - desc EFM - 0x40010400 - - 0x0 - 0x1B0 - - - - FAPRT - desc FAPRT - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - FAPRT - desc FAPRT - 15 - 0 - read-write - - - - - KEY1 - desc KEY1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - KEY2 - desc KEY2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - FSTP - desc FSTP - 0x14 - 32 - read-write - 0x0 - 0x3 - - - F0STP - desc F0STP - 0 - 0 - read-write - - - F1STP - desc F1STP - 1 - 1 - read-write - - - - - FRMC - desc FRMC - 0x18 - 32 - read-write - 0x0 - 0xF010F - - - FLWT - desc FLWT - 3 - 0 - read-write - - - LVM - desc LVM - 8 - 8 - read-write - - - ICACHE - desc ICACHE - 16 - 16 - read-write - - - DCACHE - desc DCACHE - 17 - 17 - read-write - - - PREFETE - desc PREFETE - 18 - 18 - read-write - - - CRST - desc CRST - 19 - 19 - read-write - - - - - FWMC - desc FWMC - 0x1C - 32 - read-write - 0x30000 - 0x30107 - - - PEMOD - desc PEMOD - 2 - 0 - read-write - - - BUSHLDCTL - desc BUSHLDCTL - 8 - 8 - read-write - - - KEY1LOCK - desc KEY1LOCK - 16 - 16 - read-write - - - KEY2LOCK - desc KEY2LOCK - 17 - 17 - read-write - - - - - FSR - desc FSR - 0x20 - 32 - read-only - 0x1000100 - 0x13E013F - - - OTPWERR0 - desc OTPWERR0 - 0 - 0 - read-only - - - PRTWERR0 - desc PRTWERR0 - 1 - 1 - read-only - - - PGSZERR0 - desc PGSZERR0 - 2 - 2 - read-only - - - MISMTCH0 - desc MISMTCH0 - 3 - 3 - read-only - - - OPTEND0 - desc OPTEND0 - 4 - 4 - read-only - - - COLERR0 - desc COLERR0 - 5 - 5 - read-only - - - RDY0 - desc RDY0 - 8 - 8 - read-only - - - PRTWERR1 - desc PRTWERR1 - 17 - 17 - read-only - - - PGSZERR1 - desc PGSZERR1 - 18 - 18 - read-only - - - MISMTCH1 - desc MISMTCH1 - 19 - 19 - read-only - - - OPTEND1 - desc OPTEND1 - 20 - 20 - read-only - - - COLERR1 - desc COLERR1 - 21 - 21 - read-only - - - RDY1 - desc RDY1 - 24 - 24 - read-only - - - - - FSCLR - desc FSCLR - 0x24 - 32 - read-write - 0x0 - 0x3E003F - - - OTPWERRCLR0 - desc OTPWERRCLR0 - 0 - 0 - read-write - - - PRTWERRCLR0 - desc PRTWERRCLR0 - 1 - 1 - read-write - - - PGSZERRCLR0 - desc PGSZERRCLR0 - 2 - 2 - read-write - - - MISMTCHCLR0 - desc MISMTCHCLR0 - 3 - 3 - read-write - - - OPTENDCLR0 - desc OPTENDCLR0 - 4 - 4 - read-write - - - COLERRCLR0 - desc COLERRCLR0 - 5 - 5 - read-write - - - PRTWERRCLR1 - desc PRTWERRCLR1 - 17 - 17 - read-write - - - PGSZERRCLR1 - desc PGSZERRCLR1 - 18 - 18 - read-write - - - MISMTCHCLR1 - desc MISMTCHCLR1 - 19 - 19 - read-write - - - OPTENDCLR1 - desc OPTENDCLR1 - 20 - 20 - read-write - - - COLERRCLR1 - desc COLERRCLR1 - 21 - 21 - read-write - - - - - FITE - desc FITE - 0x28 - 32 - read-write - 0x0 - 0x7 - - - PEERRITE - desc PEERRITE - 0 - 0 - read-write - - - OPTENDITE - desc OPTENDITE - 1 - 1 - read-write - - - COLERRITE - desc COLERRITE - 2 - 2 - read-write - - - - - FSWP - desc FSWP - 0x2C - 32 - read-only - 0x0 - 0x1 - - - FSWP - desc FSWP - 0 - 0 - read-only - - - - - CHIPID - desc CHIPID - 0x40 - 32 - read-only - 0x484404A0 - 0xFFFFFFFF - - - UQID0 - desc UQID0 - 0x50 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - UQID1 - desc UQID1 - 0x54 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - UQID2 - desc UQID2 - 0x58 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - MMF_REMPRT - desc MMF_REMPRT - 0x100 - 32 - read-write - 0x0 - 0xFFFF - - - MMF_REMPRT - desc MMF_REMPRT - 15 - 0 - read-write - - - - - MMF_REMCR0 - desc MMF_REMCR0 - 0x104 - 32 - read-write - 0x0 - 0x9FFFF01F - - - RMSIZE - desc RMSIZE - 4 - 0 - read-write - - - RMTADDR - desc RMTADDR - 28 - 12 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - MMF_REMCR1 - desc MMF_REMCR1 - 0x108 - 32 - read-write - 0x0 - 0x9FFFF01F - - - RMSIZE - desc RMSIZE - 4 - 0 - read-write - - - RMTADDR - desc RMTADDR - 28 - 12 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - WLOCK - desc WLOCK - 0x180 - 32 - read-write - 0x0 - 0xFF - - - WLOCK - desc WLOCK - 7 - 0 - read-write - - - - - F0NWPRT0 - desc F0NWPRT0 - 0x190 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F0NWPRT0 - desc F0NWPRT0 - 0 - 0 - read-write - - - F0NWPRT1 - desc F0NWPRT1 - 1 - 1 - read-write - - - F0NWPRT2 - desc F0NWPRT2 - 2 - 2 - read-write - - - F0NWPRT3 - desc F0NWPRT3 - 3 - 3 - read-write - - - F0NWPRT4 - desc F0NWPRT4 - 4 - 4 - read-write - - - F0NWPRT5 - desc F0NWPRT5 - 5 - 5 - read-write - - - F0NWPRT6 - desc F0NWPRT6 - 6 - 6 - read-write - - - F0NWPRT7 - desc F0NWPRT7 - 7 - 7 - read-write - - - F0NWPRT8 - desc F0NWPRT8 - 8 - 8 - read-write - - - F0NWPRT9 - desc F0NWPRT9 - 9 - 9 - read-write - - - F0NWPRT10 - desc F0NWPRT10 - 10 - 10 - read-write - - - F0NWPRT11 - desc F0NWPRT11 - 11 - 11 - read-write - - - F0NWPRT12 - desc F0NWPRT12 - 12 - 12 - read-write - - - F0NWPRT13 - desc F0NWPRT13 - 13 - 13 - read-write - - - F0NWPRT14 - desc F0NWPRT14 - 14 - 14 - read-write - - - F0NWPRT15 - desc F0NWPRT15 - 15 - 15 - read-write - - - F0NWPRT16 - desc F0NWPRT16 - 16 - 16 - read-write - - - F0NWPRT17 - desc F0NWPRT17 - 17 - 17 - read-write - - - F0NWPRT18 - desc F0NWPRT18 - 18 - 18 - read-write - - - F0NWPRT19 - desc F0NWPRT19 - 19 - 19 - read-write - - - F0NWPRT20 - desc F0NWPRT20 - 20 - 20 - read-write - - - F0NWPRT21 - desc F0NWPRT21 - 21 - 21 - read-write - - - F0NWPRT22 - desc F0NWPRT22 - 22 - 22 - read-write - - - F0NWPRT23 - desc F0NWPRT23 - 23 - 23 - read-write - - - F0NWPRT24 - desc F0NWPRT24 - 24 - 24 - read-write - - - F0NWPRT25 - desc F0NWPRT25 - 25 - 25 - read-write - - - F0NWPRT26 - desc F0NWPRT26 - 26 - 26 - read-write - - - F0NWPRT27 - desc F0NWPRT27 - 27 - 27 - read-write - - - F0NWPRT28 - desc F0NWPRT28 - 28 - 28 - read-write - - - F0NWPRT29 - desc F0NWPRT29 - 29 - 29 - read-write - - - F0NWPRT30 - desc F0NWPRT30 - 30 - 30 - read-write - - - F0NWPRT31 - desc F0NWPRT31 - 31 - 31 - read-write - - - - - F0NWPRT1 - desc F0NWPRT1 - 0x194 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F0NWPRT32 - desc F0NWPRT32 - 0 - 0 - read-write - - - F0NWPRT33 - desc F0NWPRT33 - 1 - 1 - read-write - - - F0NWPRT34 - desc F0NWPRT34 - 2 - 2 - read-write - - - F0NWPRT35 - desc F0NWPRT35 - 3 - 3 - read-write - - - F0NWPRT36 - desc F0NWPRT36 - 4 - 4 - read-write - - - F0NWPRT37 - desc F0NWPRT37 - 5 - 5 - read-write - - - F0NWPRT38 - desc F0NWPRT38 - 6 - 6 - read-write - - - F0NWPRT39 - desc F0NWPRT39 - 7 - 7 - read-write - - - F0NWPRT40 - desc F0NWPRT40 - 8 - 8 - read-write - - - F0NWPRT41 - desc F0NWPRT41 - 9 - 9 - read-write - - - F0NWPRT42 - desc F0NWPRT42 - 10 - 10 - read-write - - - F0NWPRT43 - desc F0NWPRT43 - 11 - 11 - read-write - - - F0NWPRT44 - desc F0NWPRT44 - 12 - 12 - read-write - - - F0NWPRT45 - desc F0NWPRT45 - 13 - 13 - read-write - - - F0NWPRT46 - desc F0NWPRT46 - 14 - 14 - read-write - - - F0NWPRT47 - desc F0NWPRT47 - 15 - 15 - read-write - - - F0NWPRT48 - desc F0NWPRT48 - 16 - 16 - read-write - - - F0NWPRT49 - desc F0NWPRT49 - 17 - 17 - read-write - - - F0NWPRT50 - desc F0NWPRT50 - 18 - 18 - read-write - - - F0NWPRT51 - desc F0NWPRT51 - 19 - 19 - read-write - - - F0NWPRT52 - desc F0NWPRT52 - 20 - 20 - read-write - - - F0NWPRT53 - desc F0NWPRT53 - 21 - 21 - read-write - - - F0NWPRT54 - desc F0NWPRT54 - 22 - 22 - read-write - - - F0NWPRT55 - desc F0NWPRT55 - 23 - 23 - read-write - - - F0NWPRT56 - desc F0NWPRT56 - 24 - 24 - read-write - - - F0NWPRT57 - desc F0NWPRT57 - 25 - 25 - read-write - - - F0NWPRT58 - desc F0NWPRT58 - 26 - 26 - read-write - - - F0NWPRT59 - desc F0NWPRT59 - 27 - 27 - read-write - - - F0NWPRT60 - desc F0NWPRT60 - 28 - 28 - read-write - - - F0NWPRT61 - desc F0NWPRT61 - 29 - 29 - read-write - - - F0NWPRT62 - desc F0NWPRT62 - 30 - 30 - read-write - - - F0NWPRT63 - desc F0NWPRT63 - 31 - 31 - read-write - - - - - F0NWPRT2 - desc F0NWPRT2 - 0x198 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F0NWPRT64 - desc F0NWPRT64 - 0 - 0 - read-write - - - F0NWPRT65 - desc F0NWPRT65 - 1 - 1 - read-write - - - F0NWPRT66 - desc F0NWPRT66 - 2 - 2 - read-write - - - F0NWPRT67 - desc F0NWPRT67 - 3 - 3 - read-write - - - F0NWPRT68 - desc F0NWPRT68 - 4 - 4 - read-write - - - F0NWPRT69 - desc F0NWPRT69 - 5 - 5 - read-write - - - F0NWPRT70 - desc F0NWPRT70 - 6 - 6 - read-write - - - F0NWPRT71 - desc F0NWPRT71 - 7 - 7 - read-write - - - F0NWPRT72 - desc F0NWPRT72 - 8 - 8 - read-write - - - F0NWPRT73 - desc F0NWPRT73 - 9 - 9 - read-write - - - F0NWPRT74 - desc F0NWPRT74 - 10 - 10 - read-write - - - F0NWPRT75 - desc F0NWPRT75 - 11 - 11 - read-write - - - F0NWPRT76 - desc F0NWPRT76 - 12 - 12 - read-write - - - F0NWPRT77 - desc F0NWPRT77 - 13 - 13 - read-write - - - F0NWPRT78 - desc F0NWPRT78 - 14 - 14 - read-write - - - F0NWPRT79 - desc F0NWPRT79 - 15 - 15 - read-write - - - F0NWPRT80 - desc F0NWPRT80 - 16 - 16 - read-write - - - F0NWPRT81 - desc F0NWPRT81 - 17 - 17 - read-write - - - F0NWPRT82 - desc F0NWPRT82 - 18 - 18 - read-write - - - F0NWPRT83 - desc F0NWPRT83 - 19 - 19 - read-write - - - F0NWPRT84 - desc F0NWPRT84 - 20 - 20 - read-write - - - F0NWPRT85 - desc F0NWPRT85 - 21 - 21 - read-write - - - F0NWPRT86 - desc F0NWPRT86 - 22 - 22 - read-write - - - F0NWPRT87 - desc F0NWPRT87 - 23 - 23 - read-write - - - F0NWPRT88 - desc F0NWPRT88 - 24 - 24 - read-write - - - F0NWPRT89 - desc F0NWPRT89 - 25 - 25 - read-write - - - F0NWPRT90 - desc F0NWPRT90 - 26 - 26 - read-write - - - F0NWPRT91 - desc F0NWPRT91 - 27 - 27 - read-write - - - F0NWPRT92 - desc F0NWPRT92 - 28 - 28 - read-write - - - F0NWPRT93 - desc F0NWPRT93 - 29 - 29 - read-write - - - F0NWPRT94 - desc F0NWPRT94 - 30 - 30 - read-write - - - F0NWPRT95 - desc F0NWPRT95 - 31 - 31 - read-write - - - - - F0NWPRT3 - desc F0NWPRT3 - 0x19C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F0NWPRT96 - desc F0NWPRT96 - 0 - 0 - read-write - - - F0NWPRT97 - desc F0NWPRT97 - 1 - 1 - read-write - - - F0NWPRT98 - desc F0NWPRT98 - 2 - 2 - read-write - - - F0NWPRT99 - desc F0NWPRT99 - 3 - 3 - read-write - - - F0NWPRT100 - desc F0NWPRT100 - 4 - 4 - read-write - - - F0NWPRT101 - desc F0NWPRT101 - 5 - 5 - read-write - - - F0NWPRT102 - desc F0NWPRT102 - 6 - 6 - read-write - - - F0NWPRT103 - desc F0NWPRT103 - 7 - 7 - read-write - - - F0NWPRT104 - desc F0NWPRT104 - 8 - 8 - read-write - - - F0NWPRT105 - desc F0NWPRT105 - 9 - 9 - read-write - - - F0NWPRT106 - desc F0NWPRT106 - 10 - 10 - read-write - - - F0NWPRT107 - desc F0NWPRT107 - 11 - 11 - read-write - - - F0NWPRT108 - desc F0NWPRT108 - 12 - 12 - read-write - - - F0NWPRT109 - desc F0NWPRT109 - 13 - 13 - read-write - - - F0NWPRT110 - desc F0NWPRT110 - 14 - 14 - read-write - - - F0NWPRT111 - desc F0NWPRT111 - 15 - 15 - read-write - - - F0NWPRT112 - desc F0NWPRT112 - 16 - 16 - read-write - - - F0NWPRT113 - desc F0NWPRT113 - 17 - 17 - read-write - - - F0NWPRT114 - desc F0NWPRT114 - 18 - 18 - read-write - - - F0NWPRT115 - desc F0NWPRT115 - 19 - 19 - read-write - - - F0NWPRT116 - desc F0NWPRT116 - 20 - 20 - read-write - - - F0NWPRT117 - desc F0NWPRT117 - 21 - 21 - read-write - - - F0NWPRT118 - desc F0NWPRT118 - 22 - 22 - read-write - - - F0NWPRT119 - desc F0NWPRT119 - 23 - 23 - read-write - - - F0NWPRT120 - desc F0NWPRT120 - 24 - 24 - read-write - - - F0NWPRT121 - desc F0NWPRT121 - 25 - 25 - read-write - - - F0NWPRT122 - desc F0NWPRT122 - 26 - 26 - read-write - - - F0NWPRT123 - desc F0NWPRT123 - 27 - 27 - read-write - - - F0NWPRT124 - desc F0NWPRT124 - 28 - 28 - read-write - - - F0NWPRT125 - desc F0NWPRT125 - 29 - 29 - read-write - - - F0NWPRT126 - desc F0NWPRT126 - 30 - 30 - read-write - - - F0NWPRT127 - desc F0NWPRT127 - 31 - 31 - read-write - - - - - F1NWPRT0 - desc F1NWPRT0 - 0x1A0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F1NWPRT0 - desc F1NWPRT0 - 0 - 0 - read-write - - - F1NWPRT1 - desc F1NWPRT1 - 1 - 1 - read-write - - - F1NWPRT2 - desc F1NWPRT2 - 2 - 2 - read-write - - - F1NWPRT3 - desc F1NWPRT3 - 3 - 3 - read-write - - - F1NWPRT4 - desc F1NWPRT4 - 4 - 4 - read-write - - - F1NWPRT5 - desc F1NWPRT5 - 5 - 5 - read-write - - - F1NWPRT6 - desc F1NWPRT6 - 6 - 6 - read-write - - - F1NWPRT7 - desc F1NWPRT7 - 7 - 7 - read-write - - - F1NWPRT8 - desc F1NWPRT8 - 8 - 8 - read-write - - - F1NWPRT9 - desc F1NWPRT9 - 9 - 9 - read-write - - - F1NWPRT10 - desc F1NWPRT10 - 10 - 10 - read-write - - - F1NWPRT11 - desc F1NWPRT11 - 11 - 11 - read-write - - - F1NWPRT12 - desc F1NWPRT12 - 12 - 12 - read-write - - - F1NWPRT13 - desc F1NWPRT13 - 13 - 13 - read-write - - - F1NWPRT14 - desc F1NWPRT14 - 14 - 14 - read-write - - - F1NWPRT15 - desc F1NWPRT15 - 15 - 15 - read-write - - - F1NWPRT16 - desc F1NWPRT16 - 16 - 16 - read-write - - - F1NWPRT17 - desc F1NWPRT17 - 17 - 17 - read-write - - - F1NWPRT18 - desc F1NWPRT18 - 18 - 18 - read-write - - - F1NWPRT19 - desc F1NWPRT19 - 19 - 19 - read-write - - - F1NWPRT20 - desc F1NWPRT20 - 20 - 20 - read-write - - - F1NWPRT21 - desc F1NWPRT21 - 21 - 21 - read-write - - - F1NWPRT22 - desc F1NWPRT22 - 22 - 22 - read-write - - - F1NWPRT23 - desc F1NWPRT23 - 23 - 23 - read-write - - - F1NWPRT24 - desc F1NWPRT24 - 24 - 24 - read-write - - - F1NWPRT25 - desc F1NWPRT25 - 25 - 25 - read-write - - - F1NWPRT26 - desc F1NWPRT26 - 26 - 26 - read-write - - - F1NWPRT27 - desc F1NWPRT27 - 27 - 27 - read-write - - - F1NWPRT28 - desc F1NWPRT28 - 28 - 28 - read-write - - - F1NWPRT29 - desc F1NWPRT29 - 29 - 29 - read-write - - - F1NWPRT30 - desc F1NWPRT30 - 30 - 30 - read-write - - - F1NWPRT31 - desc F1NWPRT31 - 31 - 31 - read-write - - - - - F1NWPRT1 - desc F1NWPRT1 - 0x1A4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F1NWPRT32 - desc F1NWPRT32 - 0 - 0 - read-write - - - F1NWPRT33 - desc F1NWPRT33 - 1 - 1 - read-write - - - F1NWPRT34 - desc F1NWPRT34 - 2 - 2 - read-write - - - F1NWPRT35 - desc F1NWPRT35 - 3 - 3 - read-write - - - F1NWPRT36 - desc F1NWPRT36 - 4 - 4 - read-write - - - F1NWPRT37 - desc F1NWPRT37 - 5 - 5 - read-write - - - F1NWPRT38 - desc F1NWPRT38 - 6 - 6 - read-write - - - F1NWPRT39 - desc F1NWPRT39 - 7 - 7 - read-write - - - F1NWPRT40 - desc F1NWPRT40 - 8 - 8 - read-write - - - F1NWPRT41 - desc F1NWPRT41 - 9 - 9 - read-write - - - F1NWPRT42 - desc F1NWPRT42 - 10 - 10 - read-write - - - F1NWPRT43 - desc F1NWPRT43 - 11 - 11 - read-write - - - F1NWPRT44 - desc F1NWPRT44 - 12 - 12 - read-write - - - F1NWPRT45 - desc F1NWPRT45 - 13 - 13 - read-write - - - F1NWPRT46 - desc F1NWPRT46 - 14 - 14 - read-write - - - F1NWPRT47 - desc F1NWPRT47 - 15 - 15 - read-write - - - F1NWPRT48 - desc F1NWPRT48 - 16 - 16 - read-write - - - F1NWPRT49 - desc F1NWPRT49 - 17 - 17 - read-write - - - F1NWPRT50 - desc F1NWPRT50 - 18 - 18 - read-write - - - F1NWPRT51 - desc F1NWPRT51 - 19 - 19 - read-write - - - F1NWPRT52 - desc F1NWPRT52 - 20 - 20 - read-write - - - F1NWPRT53 - desc F1NWPRT53 - 21 - 21 - read-write - - - F1NWPRT54 - desc F1NWPRT54 - 22 - 22 - read-write - - - F1NWPRT55 - desc F1NWPRT55 - 23 - 23 - read-write - - - F1NWPRT56 - desc F1NWPRT56 - 24 - 24 - read-write - - - F1NWPRT57 - desc F1NWPRT57 - 25 - 25 - read-write - - - F1NWPRT58 - desc F1NWPRT58 - 26 - 26 - read-write - - - F1NWPRT59 - desc F1NWPRT59 - 27 - 27 - read-write - - - F1NWPRT60 - desc F1NWPRT60 - 28 - 28 - read-write - - - F1NWPRT61 - desc F1NWPRT61 - 29 - 29 - read-write - - - F1NWPRT62 - desc F1NWPRT62 - 30 - 30 - read-write - - - F1NWPRT63 - desc F1NWPRT63 - 31 - 31 - read-write - - - - - F1NWPRT2 - desc F1NWPRT2 - 0x1A8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F1NWPRT64 - desc F1NWPRT64 - 0 - 0 - read-write - - - F1NWPRT65 - desc F1NWPRT65 - 1 - 1 - read-write - - - F1NWPRT66 - desc F1NWPRT66 - 2 - 2 - read-write - - - F1NWPRT67 - desc F1NWPRT67 - 3 - 3 - read-write - - - F1NWPRT68 - desc F1NWPRT68 - 4 - 4 - read-write - - - F1NWPRT69 - desc F1NWPRT69 - 5 - 5 - read-write - - - F1NWPRT70 - desc F1NWPRT70 - 6 - 6 - read-write - - - F1NWPRT71 - desc F1NWPRT71 - 7 - 7 - read-write - - - F1NWPRT72 - desc F1NWPRT72 - 8 - 8 - read-write - - - F1NWPRT73 - desc F1NWPRT73 - 9 - 9 - read-write - - - F1NWPRT74 - desc F1NWPRT74 - 10 - 10 - read-write - - - F1NWPRT75 - desc F1NWPRT75 - 11 - 11 - read-write - - - F1NWPRT76 - desc F1NWPRT76 - 12 - 12 - read-write - - - F1NWPRT77 - desc F1NWPRT77 - 13 - 13 - read-write - - - F1NWPRT78 - desc F1NWPRT78 - 14 - 14 - read-write - - - F1NWPRT79 - desc F1NWPRT79 - 15 - 15 - read-write - - - F1NWPRT80 - desc F1NWPRT80 - 16 - 16 - read-write - - - F1NWPRT81 - desc F1NWPRT81 - 17 - 17 - read-write - - - F1NWPRT82 - desc F1NWPRT82 - 18 - 18 - read-write - - - F1NWPRT83 - desc F1NWPRT83 - 19 - 19 - read-write - - - F1NWPRT84 - desc F1NWPRT84 - 20 - 20 - read-write - - - F1NWPRT85 - desc F1NWPRT85 - 21 - 21 - read-write - - - F1NWPRT86 - desc F1NWPRT86 - 22 - 22 - read-write - - - F1NWPRT87 - desc F1NWPRT87 - 23 - 23 - read-write - - - F1NWPRT88 - desc F1NWPRT88 - 24 - 24 - read-write - - - F1NWPRT89 - desc F1NWPRT89 - 25 - 25 - read-write - - - F1NWPRT90 - desc F1NWPRT90 - 26 - 26 - read-write - - - F1NWPRT91 - desc F1NWPRT91 - 27 - 27 - read-write - - - F1NWPRT92 - desc F1NWPRT92 - 28 - 28 - read-write - - - F1NWPRT93 - desc F1NWPRT93 - 29 - 29 - read-write - - - F1NWPRT94 - desc F1NWPRT94 - 30 - 30 - read-write - - - F1NWPRT95 - desc F1NWPRT95 - 31 - 31 - read-write - - - - - F1NWPRT3 - desc F1NWPRT3 - 0x1AC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - F1NWPRT96 - desc F1NWPRT96 - 0 - 0 - read-write - - - F1NWPRT97 - desc F1NWPRT97 - 1 - 1 - read-write - - - F1NWPRT98 - desc F1NWPRT98 - 2 - 2 - read-write - - - F1NWPRT99 - desc F1NWPRT99 - 3 - 3 - read-write - - - F1NWPRT100 - desc F1NWPRT100 - 4 - 4 - read-write - - - F1NWPRT101 - desc F1NWPRT101 - 5 - 5 - read-write - - - F1NWPRT102 - desc F1NWPRT102 - 6 - 6 - read-write - - - F1NWPRT103 - desc F1NWPRT103 - 7 - 7 - read-write - - - F1NWPRT104 - desc F1NWPRT104 - 8 - 8 - read-write - - - F1NWPRT105 - desc F1NWPRT105 - 9 - 9 - read-write - - - F1NWPRT106 - desc F1NWPRT106 - 10 - 10 - read-write - - - F1NWPRT107 - desc F1NWPRT107 - 11 - 11 - read-write - - - F1NWPRT108 - desc F1NWPRT108 - 12 - 12 - read-write - - - F1NWPRT109 - desc F1NWPRT109 - 13 - 13 - read-write - - - F1NWPRT110 - desc F1NWPRT110 - 14 - 14 - read-write - - - F1NWPRT111 - desc F1NWPRT111 - 15 - 15 - read-write - - - F1NWPRT112 - desc F1NWPRT112 - 16 - 16 - read-write - - - F1NWPRT113 - desc F1NWPRT113 - 17 - 17 - read-write - - - F1NWPRT114 - desc F1NWPRT114 - 18 - 18 - read-write - - - F1NWPRT115 - desc F1NWPRT115 - 19 - 19 - read-write - - - F1NWPRT116 - desc F1NWPRT116 - 20 - 20 - read-write - - - F1NWPRT117 - desc F1NWPRT117 - 21 - 21 - read-write - - - F1NWPRT118 - desc F1NWPRT118 - 22 - 22 - read-write - - - F1NWPRT119 - desc F1NWPRT119 - 23 - 23 - read-write - - - F1NWPRT120 - desc F1NWPRT120 - 24 - 24 - read-write - - - F1NWPRT121 - desc F1NWPRT121 - 25 - 25 - read-write - - - F1NWPRT122 - desc F1NWPRT122 - 26 - 26 - read-write - - - F1NWPRT123 - desc F1NWPRT123 - 27 - 27 - read-write - - - F1NWPRT124 - desc F1NWPRT124 - 28 - 28 - read-write - - - F1NWPRT125 - desc F1NWPRT125 - 29 - 29 - read-write - - - F1NWPRT126 - desc F1NWPRT126 - 30 - 30 - read-write - - - F1NWPRT127 - desc F1NWPRT127 - 31 - 31 - read-write - - - - - - - EMB0 - desc EMB - 0x40017C00 - - 0x0 - 0x1C - - - - CTL1 - desc CTL1 - 0x0 - 32 - read-write - 0x0 - 0x3CF1FFF - - - CMPEN0 - desc CMPEN0 - 0 - 0 - read-write - - - CMPEN1 - desc CMPEN1 - 1 - 1 - read-write - - - CMPEN2 - desc CMPEN2 - 2 - 2 - read-write - - - CMPEN3 - desc CMPEN3 - 3 - 3 - read-write - - - OSCSTPEN - desc OSCSTPEN - 4 - 4 - read-write - - - PWMSEN0 - desc PWMSEN0 - 5 - 5 - read-write - - - PWMSEN1 - desc PWMSEN1 - 6 - 6 - read-write - - - PWMSEN2 - desc PWMSEN2 - 7 - 7 - read-write - - - PWMSEN3 - desc PWMSEN3 - 8 - 8 - read-write - - - PWMSEN4 - desc PWMSEN4 - 9 - 9 - read-write - - - PWMSEN5 - desc PWMSEN5 - 10 - 10 - read-write - - - PWMSEN6 - desc PWMSEN6 - 11 - 11 - read-write - - - PWMSEN7 - desc PWMSEN7 - 12 - 12 - read-write - - - PORTINEN1 - desc PORTINEN1 - 16 - 16 - read-write - - - PORTINEN2 - desc PORTINEN2 - 17 - 17 - read-write - - - PORTINEN3 - desc PORTINEN3 - 18 - 18 - read-write - - - PORTINEN4 - desc PORTINEN4 - 19 - 19 - read-write - - - INVSEL1 - desc INVSEL1 - 22 - 22 - read-write - - - INVSEL2 - desc INVSEL2 - 23 - 23 - read-write - - - INVSEL3 - desc INVSEL3 - 24 - 24 - read-write - - - INVSEL4 - desc INVSEL4 - 25 - 25 - read-write - - - - - CTL2 - desc CTL2 - 0x4 - 32 - read-write - 0x0 - 0xFFF00FF - - - PWMLV0 - desc PWMLV0 - 0 - 0 - read-write - - - PWMLV1 - desc PWMLV1 - 1 - 1 - read-write - - - PWMLV2 - desc PWMLV2 - 2 - 2 - read-write - - - PWMLV3 - desc PWMLV3 - 3 - 3 - read-write - - - PWMLV4 - desc PWMLV4 - 4 - 4 - read-write - - - PWMLV5 - desc PWMLV5 - 5 - 5 - read-write - - - PWMLV6 - desc PWMLV6 - 6 - 6 - read-write - - - PWMLV7 - desc PWMLV7 - 7 - 7 - read-write - - - NFSEL1 - desc NFSEL1 - 17 - 16 - read-write - - - NFEN1 - desc NFEN1 - 18 - 18 - read-write - - - NFSEL2 - desc NFSEL2 - 20 - 19 - read-write - - - NFEN2 - desc NFEN2 - 21 - 21 - read-write - - - NFSEL3 - desc NFSEL3 - 23 - 22 - read-write - - - NFEN3 - desc NFEN3 - 24 - 24 - read-write - - - NFSEL4 - desc NFSEL4 - 26 - 25 - read-write - - - NFEN4 - desc NFEN4 - 27 - 27 - read-write - - - - - SOE - desc SOE - 0x8 - 32 - read-write - 0x0 - 0x1 - - - SOE - desc SOE - 0 - 0 - read-write - - - - - STAT - desc STAT - 0xC - 32 - read-only - 0x0 - 0x3CFEE - - - PWMSF - desc PWMSF - 1 - 1 - read-only - - - CMPF - desc CMPF - 2 - 2 - read-only - - - OSF - desc OSF - 3 - 3 - read-only - - - PWMST - desc PWMST - 5 - 5 - read-only - - - CMPST - desc CMPST - 6 - 6 - read-only - - - OSST - desc OSST - 7 - 7 - read-only - - - PORTINF1 - desc PORTINF1 - 8 - 8 - read-only - - - PORTINF2 - desc PORTINF2 - 9 - 9 - read-only - - - PORTINF3 - desc PORTINF3 - 10 - 10 - read-only - - - PORTINF4 - desc PORTINF4 - 11 - 11 - read-only - - - PORTINST1 - desc PORTINST1 - 14 - 14 - read-only - - - PORTINST2 - desc PORTINST2 - 15 - 15 - read-only - - - PORTINST3 - desc PORTINST3 - 16 - 16 - read-only - - - PORTINST4 - desc PORTINST4 - 17 - 17 - read-only - - - - - STATCLR - desc STATCLR - 0x10 - 32 - write-only - 0x0 - 0xF0E - - - PWMSFCLR - desc PWMSFCLR - 1 - 1 - write-only - - - CMPFCLR - desc CMPFCLR - 2 - 2 - write-only - - - OSFCLR - desc OSFCLR - 3 - 3 - write-only - - - PORTINFCLR1 - desc PORTINFCLR1 - 8 - 8 - write-only - - - PORTINFCLR2 - desc PORTINFCLR2 - 9 - 9 - write-only - - - PORTINFCLR3 - desc PORTINFCLR3 - 10 - 10 - write-only - - - PORTINFCLR4 - desc PORTINFCLR4 - 11 - 11 - write-only - - - - - INTEN - desc INTEN - 0x14 - 32 - read-write - 0x0 - 0xF0E - - - PWMSINTEN - desc PWMSINTEN - 1 - 1 - read-write - - - CMPINTEN - desc CMPINTEN - 2 - 2 - read-write - - - OSINTEN - desc OSINTEN - 3 - 3 - read-write - - - PORTINTEN1 - desc PORTINTEN1 - 8 - 8 - read-write - - - PORTINTEN2 - desc PORTINTEN2 - 9 - 9 - read-write - - - PORTINTEN3 - desc PORTINTEN3 - 10 - 10 - read-write - - - PORTINTEN4 - desc PORTINTEN4 - 11 - 11 - read-write - - - - - RLSSEL - desc RLSSEL - 0x18 - 32 - read-write - 0x0 - 0xF0E - - - PWMRSEL - desc PWMRSEL - 1 - 1 - read-write - - - CMPRSEL - desc CMPRSEL - 2 - 2 - read-write - - - OSRSEL - desc OSRSEL - 3 - 3 - read-write - - - PORTINRSEL1 - desc PORTINRSEL1 - 8 - 8 - read-write - - - PORTINRSEL2 - desc PORTINRSEL2 - 9 - 9 - read-write - - - PORTINRSEL3 - desc PORTINRSEL3 - 10 - 10 - read-write - - - PORTINRSEL4 - desc PORTINRSEL4 - 11 - 11 - read-write - - - - - - - EMB1 - desc EMB - 0x40017C20 - - 0x0 - 0x1C - - - - EMB2 - desc EMB - 0x40017C40 - - 0x0 - 0x1C - - - - EMB3 - desc EMB - 0x40017C60 - - 0x0 - 0x1C - - - - EMB4 - desc EMB - 0x40017C80 - - 0x0 - 0x1C - - - - CTL1 - desc CTL1 - 0x0 - 32 - read-write - 0x0 - 0x3CF00FF - - - CMPEN - desc CMPEN - 3 - 0 - read-write - - - OSCSTPEN - desc OSCSTPEN - 4 - 4 - read-write - - - PWMSEN - desc PWMSEN - 7 - 5 - read-write - - - PORTINEN1 - desc PORTINEN1 - 16 - 16 - read-write - - - PORTINEN2 - desc PORTINEN2 - 17 - 17 - read-write - - - PORTINEN3 - desc PORTINEN3 - 18 - 18 - read-write - - - PORTINEN4 - desc PORTINEN4 - 19 - 19 - read-write - - - INVSEL1 - desc INVSEL1 - 22 - 22 - read-write - - - INVSEL2 - desc INVSEL2 - 23 - 23 - read-write - - - INVSEL3 - desc INVSEL3 - 24 - 24 - read-write - - - INVSEL4 - desc INVSEL4 - 25 - 25 - read-write - - - - - CTL2 - desc CTL2 - 0x4 - 32 - read-write - 0x0 - 0xFFF0007 - - - PWMLV - desc PWMLV - 2 - 0 - read-write - - - NFSEL1 - desc NFSEL1 - 17 - 16 - read-write - - - NFEN1 - desc NFEN1 - 18 - 18 - read-write - - - NFSEL2 - desc NFSEL2 - 20 - 19 - read-write - - - NFEN2 - desc NFEN2 - 21 - 21 - read-write - - - NFSEL3 - desc NFSEL3 - 23 - 22 - read-write - - - NFEN3 - desc NFEN3 - 24 - 24 - read-write - - - NFSEL4 - desc NFSEL4 - 26 - 25 - read-write - - - NFEN4 - desc NFEN4 - 27 - 27 - read-write - - - - - SOE - desc SOE - 0x8 - 32 - read-write - 0x0 - 0x1 - - - SOE - desc SOE - 0 - 0 - read-write - - - - - STAT - desc STAT - 0xC - 32 - read-only - 0x0 - 0x3CFEE - - - PWMSF - desc PWMSF - 1 - 1 - read-only - - - CMPF - desc CMPF - 2 - 2 - read-only - - - OSF - desc OSF - 3 - 3 - read-only - - - PWMST - desc PWMST - 5 - 5 - read-only - - - CMPST - desc CMPST - 6 - 6 - read-only - - - OSST - desc OSST - 7 - 7 - read-only - - - PORTINF1 - desc PORTINF1 - 8 - 8 - read-only - - - PORTINF2 - desc PORTINF2 - 9 - 9 - read-only - - - PORTINF3 - desc PORTINF3 - 10 - 10 - read-only - - - PORTINF4 - desc PORTINF4 - 11 - 11 - read-only - - - PORTINST1 - desc PORTINST1 - 14 - 14 - read-only - - - PORTINST2 - desc PORTINST2 - 15 - 15 - read-only - - - PORTINST3 - desc PORTINST3 - 16 - 16 - read-only - - - PORTINST4 - desc PORTINST4 - 17 - 17 - read-only - - - - - STATCLR - desc STATCLR - 0x10 - 32 - write-only - 0x0 - 0xF0E - - - PWMSFCLR - desc PWMSFCLR - 1 - 1 - write-only - - - CMPFCLR - desc CMPFCLR - 2 - 2 - write-only - - - OSFCLR - desc OSFCLR - 3 - 3 - write-only - - - PORTINFCLR1 - desc PORTINFCLR1 - 8 - 8 - write-only - - - PORTINFCLR2 - desc PORTINFCLR2 - 9 - 9 - write-only - - - PORTINFCLR3 - desc PORTINFCLR3 - 10 - 10 - write-only - - - PORTINFCLR4 - desc PORTINFCLR4 - 11 - 11 - write-only - - - - - INTEN - desc INTEN - 0x14 - 32 - read-write - 0x0 - 0xF0E - - - PWMSINTEN - desc PWMSINTEN - 1 - 1 - read-write - - - CMPINTEN - desc CMPINTEN - 2 - 2 - read-write - - - OSINTEN - desc OSINTEN - 3 - 3 - read-write - - - PORTINTEN1 - desc PORTINTEN1 - 8 - 8 - read-write - - - PORTINTEN2 - desc PORTINTEN2 - 9 - 9 - read-write - - - PORTINTEN3 - desc PORTINTEN3 - 10 - 10 - read-write - - - PORTINTEN4 - desc PORTINTEN4 - 11 - 11 - read-write - - - - - RLSSEL - desc RLSSEL - 0x18 - 32 - read-write - 0x0 - 0xF0E - - - PWMRSEL - desc PWMRSEL - 1 - 1 - read-write - - - CMPRSEL - desc CMPRSEL - 2 - 2 - read-write - - - OSRSEL - desc OSRSEL - 3 - 3 - read-write - - - PORTINRSEL1 - desc PORTINRSEL1 - 8 - 8 - read-write - - - PORTINRSEL2 - desc PORTINRSEL2 - 9 - 9 - read-write - - - PORTINRSEL3 - desc PORTINRSEL3 - 10 - 10 - read-write - - - PORTINRSEL4 - desc PORTINRSEL4 - 11 - 11 - read-write - - - - - - - EMB5 - desc EMB - 0x40017CA0 - - 0x0 - 0x1C - - - - EMB6 - desc EMB - 0x40017CC0 - - 0x0 - 0x1C - - - - ETH - desc ETH - 0x40050000 - - 0x0 - 0x11058 - - - - MAC_IFCONFR - desc MAC_IFCONFR - 0x5410 - 32 - read-write - 0x0 - 0x31 - - - IFSEL - desc IFSEL - 0 - 0 - read-write - - - RCKINV - desc RCKINV - 4 - 4 - read-write - - - TCKINV - desc TCKINV - 5 - 5 - read-write - - - - - MAC_CONFIGR - desc MAC_CONFIGR - 0x10000 - 32 - read-write - 0x8000 - 0x72CF7EFC - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - DC - desc DC - 4 - 4 - read-write - - - BL - desc BL - 6 - 5 - read-write - - - ACS - desc ACS - 7 - 7 - read-write - - - DRTY - desc DRTY - 9 - 9 - read-write - - - IPCO - desc IPCO - 10 - 10 - read-write - - - DM - desc DM - 11 - 11 - read-write - - - LM - desc LM - 12 - 12 - read-write - - - DO - desc DO - 13 - 13 - read-write - - - FES - desc FES - 14 - 14 - read-write - - - DCRS - desc DCRS - 16 - 16 - read-write - - - IFG - desc IFG - 19 - 17 - read-write - - - MJB - desc MJB - 22 - 22 - read-write - - - MWD - desc MWD - 23 - 23 - read-write - - - CST - desc CST - 25 - 25 - read-write - - - SAIRC - desc SAIRC - 30 - 28 - read-write - - - - - MAC_FLTCTLR - desc MAC_FLTCTLR - 0x10004 - 32 - read-write - 0x0 - 0x803107FF - - - PR - desc PR - 0 - 0 - read-write - - - HUC - desc HUC - 1 - 1 - read-write - - - HMC - desc HMC - 2 - 2 - read-write - - - DAIF - desc DAIF - 3 - 3 - read-write - - - PMF - desc PMF - 4 - 4 - read-write - - - DBF - desc DBF - 5 - 5 - read-write - - - PCF - desc PCF - 7 - 6 - read-write - - - SAIF - desc SAIF - 8 - 8 - read-write - - - SAF - desc SAF - 9 - 9 - read-write - - - HPF - desc HPF - 10 - 10 - read-write - - - VTFE - desc VTFE - 16 - 16 - read-write - - - IPFE - desc IPFE - 20 - 20 - read-write - - - DNTU - desc DNTU - 21 - 21 - read-write - - - RA - desc RA - 31 - 31 - read-write - - - - - MAC_HASHTHR - desc MAC_HASHTHR - 0x10008 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HTH - desc HTH - 31 - 0 - read-write - - - - - MAC_HASHTLR - desc MAC_HASHTLR - 0x1000C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HTL - desc HTL - 31 - 0 - read-write - - - - - MAC_SMIADDR - desc MAC_SMIADDR - 0x10010 - 32 - read-write - 0x0 - 0xFFFF - - - SMIB - desc SMIB - 0 - 0 - read-write - - - SMIW - desc SMIW - 1 - 1 - read-write - - - SMIC - desc SMIC - 5 - 2 - read-write - - - SMIR - desc SMIR - 10 - 6 - read-write - - - SMIA - desc SMIA - 15 - 11 - read-write - - - - - MAC_SMIDATR - desc MAC_SMIDATR - 0x10014 - 32 - read-write - 0x0 - 0xFFFF - - - SMID - desc SMID - 15 - 0 - read-write - - - - - MAC_FLOCTLR - desc MAC_FLOCTLR - 0x10018 - 32 - read-write - 0x0 - 0xFFFF00BF - - - FCA_BPA - desc FCA_BPA - 0 - 0 - read-write - - - TFE - desc TFE - 1 - 1 - read-write - - - RFE - desc RFE - 2 - 2 - read-write - - - UNP - desc UNP - 3 - 3 - read-write - - - PLT - desc PLT - 5 - 4 - read-write - - - DZPQ - desc DZPQ - 7 - 7 - read-write - - - PAUSET - desc PAUSET - 31 - 16 - read-write - - - - - MAC_VTAFLTR - desc MAC_VTAFLTR - 0x1001C - 32 - read-write - 0x0 - 0x10BFFFF - - - VLFLT - desc VLFLT - 15 - 0 - read-write - - - VTAL - desc VTAL - 16 - 16 - read-write - - - VTIM - desc VTIM - 17 - 17 - read-write - - - VTHM - desc VTHM - 19 - 19 - read-write - - - - - MAC_MACSTSR - desc MAC_MACSTSR - 0x10024 - 32 - read-only - 0x0 - 0x37F0377 - - - MREA - desc MREA - 0 - 0 - read-only - - - MRS - desc MRS - 2 - 1 - read-only - - - RFWA - desc RFWA - 4 - 4 - read-only - - - RFRS - desc RFRS - 6 - 5 - read-only - - - RFFL - desc RFFL - 9 - 8 - read-only - - - MTEA - desc MTEA - 16 - 16 - read-only - - - MTS - desc MTS - 18 - 17 - read-only - - - MTP - desc MTP - 19 - 19 - read-only - - - TFRS - desc TFRS - 21 - 20 - read-only - - - TFWA - desc TFWA - 22 - 22 - read-only - - - TFNE - desc TFNE - 24 - 24 - read-only - - - TFF - desc TFF - 25 - 25 - read-only - - - - - MAC_RTWKFFR - desc MAC_RTWKFFR - 0x10028 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - WKUPFRMFT - desc WKUPFRMFT - 31 - 0 - read-write - - - - - MAC_PMTCTLR - desc MAC_PMTCTLR - 0x1002C - 32 - read-write - 0x0 - 0x87000667 - - - PWDN - desc PWDN - 0 - 0 - read-write - - - MPEN - desc MPEN - 1 - 1 - read-write - - - WKEN - desc WKEN - 2 - 2 - read-write - - - MPFR - desc MPFR - 5 - 5 - read-only - - - WKFR - desc WKFR - 6 - 6 - read-only - - - GLUB - desc GLUB - 9 - 9 - read-write - - - RTWKTR - desc RTWKTR - 10 - 10 - read-write - - - RTWKPT - desc RTWKPT - 26 - 24 - read-only - - - RTWKFR - desc RTWKFR - 31 - 31 - read-write - - - - - MAC_INTSTSR - desc MAC_INTSTSR - 0x10038 - 32 - read-only - 0x0 - 0x278 - - - PMTIS - desc PMTIS - 3 - 3 - read-only - - - MMCIS - desc MMCIS - 4 - 4 - read-only - - - MMCRXIS - desc MMCRXIS - 5 - 5 - read-only - - - MMCTXIS - desc MMCTXIS - 6 - 6 - read-only - - - TSPIS - desc TSPIS - 9 - 9 - read-only - - - - - MAC_INTMSKR - desc MAC_INTMSKR - 0x1003C - 32 - read-write - 0x0 - 0x208 - - - PMTIM - desc PMTIM - 3 - 3 - read-write - - - TSPIM - desc TSPIM - 9 - 9 - read-write - - - - - MAC_MACADHR0 - desc MAC_MACADHR0 - 0x10040 - 32 - read-write - 0x8000FFFF - 0x8000FFFF - - - ADDRH0 - desc ADDRH0 - 15 - 0 - read-write - - - AE0 - desc AE0 - 31 - 31 - read-only - - - - - MAC_MACADLR0 - desc MAC_MACADLR0 - 0x10044 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL0 - desc ADDRL0 - 31 - 0 - read-write - - - - - MAC_MACADHR1 - desc MAC_MACADHR1 - 0x10048 - 32 - read-write - 0xFFFF - 0xFF00FFFF - - - ADDRH1 - desc ADDRH1 - 15 - 0 - read-write - - - MBC1 - desc MBC1 - 29 - 24 - read-write - - - SA1 - desc SA1 - 30 - 30 - read-write - - - AE1 - desc AE1 - 31 - 31 - read-write - - - - - MAC_MACADLR1 - desc MAC_MACADLR1 - 0x1004C - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL1 - desc ADDRL1 - 31 - 0 - read-write - - - - - MAC_MACADHR2 - desc MAC_MACADHR2 - 0x10050 - 32 - read-write - 0xFFFF - 0xFF00FFFF - - - ADDRH2 - desc ADDRH2 - 15 - 0 - read-write - - - MBC2 - desc MBC2 - 29 - 24 - read-write - - - SA2 - desc SA2 - 30 - 30 - read-write - - - AE2 - desc AE2 - 31 - 31 - read-write - - - - - MAC_MACADLR2 - desc MAC_MACADLR2 - 0x10054 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL2 - desc ADDRL2 - 31 - 0 - read-write - - - - - MAC_MACADHR3 - desc MAC_MACADHR3 - 0x10058 - 32 - read-write - 0xFFFF - 0xFF00FFFF - - - ADDRH3 - desc ADDRH3 - 15 - 0 - read-write - - - MBC3 - desc MBC3 - 29 - 24 - read-write - - - SA3 - desc SA3 - 30 - 30 - read-write - - - AE3 - desc AE3 - 31 - 31 - read-write - - - - - MAC_MACADLR3 - desc MAC_MACADLR3 - 0x1005C - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL3 - desc ADDRL3 - 31 - 0 - read-write - - - - - MAC_MACADHR4 - desc MAC_MACADHR4 - 0x10060 - 32 - read-write - 0xFFFF - 0xFF00FFFF - - - ADDRH4 - desc ADDRH4 - 15 - 0 - read-write - - - MBC4 - desc MBC4 - 29 - 24 - read-write - - - SA4 - desc SA4 - 30 - 30 - read-write - - - AE4 - desc AE4 - 31 - 31 - read-write - - - - - MAC_MACADLR4 - desc MAC_MACADLR4 - 0x10064 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDRL4 - desc ADDRL4 - 31 - 0 - read-write - - - - - MMC_MMCCTLR - desc MMC_MMCCTLR - 0x10100 - 32 - read-write - 0x0 - 0x3F - - - CRST - desc CRST - 0 - 0 - read-write - - - COS - desc COS - 1 - 1 - read-write - - - ROR - desc ROR - 2 - 2 - read-write - - - MCF - desc MCF - 3 - 3 - read-write - - - MCPSET - desc MCPSET - 4 - 4 - read-write - - - MCPSEL - desc MCPSEL - 5 - 5 - read-write - - - - - MMC_REVSTSR - desc MMC_REVSTSR - 0x10104 - 32 - read-only - 0x0 - 0x10E00F8 - - - RXBGIS - desc RXBGIS - 3 - 3 - read-only - - - RXMGIS - desc RXMGIS - 4 - 4 - read-only - - - RXCEIS - desc RXCEIS - 5 - 5 - read-only - - - RXAEIS - desc RXAEIS - 6 - 6 - read-only - - - RXREIS - desc RXREIS - 7 - 7 - read-only - - - RXUGIS - desc RXUGIS - 17 - 17 - read-only - - - RXLEIS - desc RXLEIS - 18 - 18 - read-only - - - RXOEIS - desc RXOEIS - 19 - 19 - read-only - - - - - MMC_TRSSTSR - desc MMC_TRSSTSR - 0x10108 - 32 - read-only - 0x0 - 0x16F000C - - - TXBGIS - desc TXBGIS - 2 - 2 - read-only - - - TXMGIS - desc TXMGIS - 3 - 3 - read-only - - - TXDEEIS - desc TXDEEIS - 16 - 16 - read-only - - - TXLCEIS - desc TXLCEIS - 17 - 17 - read-only - - - TXECEIS - desc TXECEIS - 18 - 18 - read-only - - - TXCAEIS - desc TXCAEIS - 19 - 19 - read-only - - - TXUGIS - desc TXUGIS - 21 - 21 - read-only - - - TXEDEIS - desc TXEDEIS - 22 - 22 - read-only - - - - - MMC_RITCTLR - desc MMC_RITCTLR - 0x1010C - 32 - read-write - 0x0 - 0x10E00F8 - - - RXBGIM - desc RXBGIM - 3 - 3 - read-write - - - RXMGIM - desc RXMGIM - 4 - 4 - read-write - - - RXCEIM - desc RXCEIM - 5 - 5 - read-write - - - RXAEIM - desc RXAEIM - 6 - 6 - read-write - - - RXREIM - desc RXREIM - 7 - 7 - read-write - - - RXUGIM - desc RXUGIM - 17 - 17 - read-write - - - RXLEIM - desc RXLEIM - 18 - 18 - read-write - - - RXOEIM - desc RXOEIM - 19 - 19 - read-write - - - - - MMC_TITCTLR - desc MMC_TITCTLR - 0x10110 - 32 - read-write - 0x0 - 0x16F000C - - - TXBGIM - desc TXBGIM - 2 - 2 - read-write - - - TXMGIM - desc TXMGIM - 3 - 3 - read-write - - - TXDEEIM - desc TXDEEIM - 16 - 16 - read-write - - - TXLCEIM - desc TXLCEIM - 17 - 17 - read-write - - - TXECEIM - desc TXECEIM - 18 - 18 - read-write - - - TXCAEIM - desc TXCAEIM - 19 - 19 - read-write - - - TXUGIM - desc TXUGIM - 21 - 21 - read-write - - - TXEDEIM - desc TXEDEIM - 22 - 22 - read-write - - - - - MMC_TXBRGFR - desc MMC_TXBRGFR - 0x1011C - 32 - read-only - 0x0 - 0xFFFF - - - TXBRGCNT - desc TXBRGCNT - 15 - 0 - read-only - - - - - MMC_TXMUGFR - desc MMC_TXMUGFR - 0x10120 - 32 - read-only - 0x0 - 0xFFFF - - - TXMUGCNT - desc TXMUGCNT - 15 - 0 - read-only - - - - - MMC_TXDEEFR - desc MMC_TXDEEFR - 0x10154 - 32 - read-only - 0x0 - 0xFFFF - - - TXDEECNT - desc TXDEECNT - 15 - 0 - read-only - - - - - MMC_TXLCEFR - desc MMC_TXLCEFR - 0x10158 - 32 - read-only - 0x0 - 0xFFFF - - - TXLCECNT - desc TXLCECNT - 15 - 0 - read-only - - - - - MMC_TXECEFR - desc MMC_TXECEFR - 0x1015C - 32 - read-only - 0x0 - 0xFFFF - - - TXECECNT - desc TXECECNT - 15 - 0 - read-only - - - - - MMC_TXCAEFR - desc MMC_TXCAEFR - 0x10160 - 32 - read-only - 0x0 - 0xFFFF - - - TXCAECNT - desc TXCAECNT - 15 - 0 - read-only - - - - - MMC_TXUNGFR - desc MMC_TXUNGFR - 0x10168 - 32 - read-only - 0x0 - 0xFFFF - - - TXUNGCNT - desc TXUNGCNT - 15 - 0 - read-only - - - - - MMC_TXEDEFR - desc MMC_TXEDEFR - 0x1016C - 32 - read-only - 0x0 - 0xFFFF - - - TXEDECNT - desc TXEDECNT - 15 - 0 - read-only - - - - - MMC_RXBRGFR - desc MMC_RXBRGFR - 0x1018C - 32 - read-only - 0x0 - 0xFFFF - - - RXBRGCNT - desc RXBRGCNT - 15 - 0 - read-only - - - - - MMC_RXMUGFR - desc MMC_RXMUGFR - 0x10190 - 32 - read-only - 0x0 - 0xFFFF - - - RXMUGCNT - desc RXMUGCNT - 15 - 0 - read-only - - - - - MMC_RXCREFR - desc MMC_RXCREFR - 0x10194 - 32 - read-only - 0x0 - 0xFFFF - - - RXCRECNT - desc RXCRECNT - 15 - 0 - read-only - - - - - MMC_RXALEFR - desc MMC_RXALEFR - 0x10198 - 32 - read-only - 0x0 - 0xFFFF - - - RXALECNT - desc RXALECNT - 15 - 0 - read-only - - - - - MMC_RXRUEFR - desc MMC_RXRUEFR - 0x1019C - 32 - read-only - 0x0 - 0xFFFF - - - RXRUECNT - desc RXRUECNT - 15 - 0 - read-only - - - - - MMC_RXUNGFR - desc MMC_RXUNGFR - 0x101C4 - 32 - read-only - 0x0 - 0xFFFF - - - RXUNGCNT - desc RXUNGCNT - 15 - 0 - read-only - - - - - MMC_RXLEEFR - desc MMC_RXLEEFR - 0x101C8 - 32 - read-only - 0x0 - 0xFFFF - - - RXLEECNT - desc RXLEECNT - 15 - 0 - read-only - - - - - MMC_RXOREFR - desc MMC_RXOREFR - 0x101CC - 32 - read-only - 0x0 - 0xFFFF - - - RXORECNT - desc RXORECNT - 15 - 0 - read-only - - - - - MAC_L34CTLR - desc MAC_L34CTLR - 0x10400 - 32 - read-write - 0x0 - 0x13DFFFD - - - L3PEN - desc L3PEN - 0 - 0 - read-write - - - L3SAM - desc L3SAM - 2 - 2 - read-write - - - L3SAIM - desc L3SAIM - 3 - 3 - read-write - - - L3DAM - desc L3DAM - 4 - 4 - read-write - - - L3DAIM - desc L3DAIM - 5 - 5 - read-write - - - L3HSBM - desc L3HSBM - 10 - 6 - read-write - - - L3HDBM - desc L3HDBM - 15 - 11 - read-write - - - L4PEN - desc L4PEN - 16 - 16 - read-write - - - L4SPM - desc L4SPM - 18 - 18 - read-write - - - L4SPIM - desc L4SPIM - 19 - 19 - read-write - - - L4DPM - desc L4DPM - 20 - 20 - read-write - - - L4DPIM - desc L4DPIM - 21 - 21 - read-write - - - - - MAC_L4PORTR - desc MAC_L4PORTR - 0x10404 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L4SPVAL - desc L4SPVAL - 15 - 0 - read-write - - - L4DPVAL - desc L4DPVAL - 31 - 16 - read-write - - - - - MAC_L3ADDRR0 - desc MAC_L3ADDRR0 - 0x10410 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L3ADDR0 - desc L3ADDR0 - 31 - 0 - read-write - - - - - MAC_L3ADDRR1 - desc MAC_L3ADDRR1 - 0x10414 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L3ADDR2 - desc L3ADDR2 - 31 - 0 - read-write - - - - - MAC_L3ADDRR2 - desc MAC_L3ADDRR2 - 0x10418 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L3ADDR2 - desc L3ADDR2 - 31 - 0 - read-write - - - - - MAC_L3ADDRR3 - desc MAC_L3ADDRR3 - 0x1041C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - L3ADDR3 - desc L3ADDR3 - 31 - 0 - read-write - - - - - MAC_VTACTLR - desc MAC_VTACTLR - 0x10584 - 32 - read-write - 0x0 - 0x107FFFF - - - VLANV - desc VLANV - 15 - 0 - read-write - - - VLANC - desc VLANC - 17 - 16 - read-write - - - VLANS - desc VLANS - 18 - 18 - read-write - - - - - MAC_VLAHTBR - desc MAC_VLAHTBR - 0x10588 - 32 - read-write - 0x0 - 0xFFFF - - - VLHT - desc VLHT - 15 - 0 - read-write - - - - - PTP_TSPCTLR - desc PTP_TSPCTLR - 0x10700 - 32 - read-write - 0x2000 - 0x107FF3F - - - TSPEN - desc TSPEN - 0 - 0 - read-write - - - TSPUPSEL - desc TSPUPSEL - 1 - 1 - read-write - - - TSPINI - desc TSPINI - 2 - 2 - read-write - - - TSPUP - desc TSPUP - 3 - 3 - read-write - - - TSPINT - desc TSPINT - 4 - 4 - read-write - - - TSPADUP - desc TSPADUP - 5 - 5 - read-write - - - TSPEALL - desc TSPEALL - 8 - 8 - read-write - - - TSPSSR - desc TSPSSR - 9 - 9 - read-write - - - TSPVER - desc TSPVER - 10 - 10 - read-write - - - TSPOVETH - desc TSPOVETH - 11 - 11 - read-write - - - TSPOVIPV6 - desc TSPOVIPV6 - 12 - 12 - read-write - - - TSPOVIPV4 - desc TSPOVIPV4 - 13 - 13 - read-write - - - TSPMTSEL - desc TSPMTSEL - 17 - 14 - read-write - - - TSPADF - desc TSPADF - 18 - 18 - read-write - - - - - PTP_TSPNSAR - desc PTP_TSPNSAR - 0x10704 - 32 - read-write - 0x0 - 0xFF - - - TSPNSEADD - desc TSPNSEADD - 7 - 0 - read-write - - - - - PTP_TMSSECR - desc PTP_TMSSECR - 0x10708 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - TSPSYSSEC - desc TSPSYSSEC - 31 - 0 - read-only - - - - - PTP_TMSNSER - desc PTP_TMSNSER - 0x1070C - 32 - read-only - 0x0 - 0x7FFFFFFF - - - TSPSYSNSEC - desc TSPSYSNSEC - 30 - 0 - read-only - - - - - PTP_TMUSECR - desc PTP_TMUSECR - 0x10710 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPUPSEC - desc TSPUPSEC - 31 - 0 - read-write - - - - - PTP_TMUNSER - desc PTP_TMUNSER - 0x10714 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPUPNSEC - desc TSPUPNSEC - 30 - 0 - read-write - - - TSPUPNS - desc TSPUPNS - 31 - 31 - read-write - - - - - PTP_TSPADDR - desc PTP_TSPADDR - 0x10718 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPADD - desc TSPADD - 31 - 0 - read-write - - - - - PTP_TMTSECR0 - desc PTP_TMTSECR0 - 0x1071C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPTAGSEC0 - desc TSPTAGSEC0 - 31 - 0 - read-write - - - - - PTP_TMTNSER0 - desc PTP_TMTNSER0 - 0x10720 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - TSPTAGNSEC0 - desc TSPTAGNSEC0 - 30 - 0 - read-write - - - - - PTP_TSPSTSR - desc PTP_TSPSTSR - 0x10728 - 32 - read-only - 0x0 - 0x3B - - - TSOVF - desc TSOVF - 0 - 0 - read-only - - - TSTAR0 - desc TSTAR0 - 1 - 1 - read-only - - - TSERR0 - desc TSERR0 - 3 - 3 - read-only - - - TSTAR1 - desc TSTAR1 - 4 - 4 - read-only - - - TSERR1 - desc TSERR1 - 5 - 5 - read-only - - - - - PTP_PPSCTLR - desc PTP_PPSCTLR - 0x1072C - 32 - read-write - 0x0 - 0x677F - - - PPSFRE0 - desc PPSFRE0 - 3 - 0 - read-write - - - PPSOMD - desc PPSOMD - 4 - 4 - read-write - - - TT0SEL - desc TT0SEL - 6 - 5 - read-write - - - PPSFRE1 - desc PPSFRE1 - 10 - 8 - read-write - - - TT1SEL - desc TT1SEL - 14 - 13 - read-write - - - - - PTP_TMTSECR1 - desc PTP_TMTSECR1 - 0x10780 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPTAGSEC1 - desc TSPTAGSEC1 - 31 - 0 - read-write - - - - - PTP_TMTNSER1 - desc PTP_TMTNSER1 - 0x10784 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - TSPTAGNSEC1 - desc TSPTAGNSEC1 - 30 - 0 - read-write - - - - - DMA_BUSMODR - desc DMA_BUSMODR - 0x11000 - 32 - read-write - 0x20101 - 0xFFFFFFF - - - SWR - desc SWR - 0 - 0 - read-write - - - DMAA - desc DMAA - 1 - 1 - read-write - - - DSL - desc DSL - 6 - 2 - read-write - - - DSEN - desc DSEN - 7 - 7 - read-write - - - TPBL - desc TPBL - 13 - 8 - read-write - - - PRAT - desc PRAT - 15 - 14 - read-write - - - FBST - desc FBST - 16 - 16 - read-write - - - RPBL - desc RPBL - 22 - 17 - read-write - - - SPBL - desc SPBL - 23 - 23 - read-write - - - M8PBL - desc M8PBL - 24 - 24 - read-write - - - AAL - desc AAL - 25 - 25 - read-write - - - MBST - desc MBST - 26 - 26 - read-write - - - TXPR - desc TXPR - 27 - 27 - read-write - - - - - DMA_TXPOLLR - desc DMA_TXPOLLR - 0x11004 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TXPOLL - desc TXPOLL - 31 - 0 - read-write - - - - - DMA_RXPOLLR - desc DMA_RXPOLLR - 0x11008 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RXPOLL - desc RXPOLL - 31 - 0 - read-write - - - - - DMA_RXDLADR - desc DMA_RXDLADR - 0x1100C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RXDLAD - desc RXDLAD - 31 - 0 - read-write - - - - - DMA_TXDLADR - desc DMA_TXDLADR - 0x11010 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TXDLAD - desc TXDLAD - 31 - 0 - read-write - - - - - DMA_DMASTSR - desc DMA_DMASTSR - 0x11014 - 32 - read-write - 0x0 - 0x3BFFE7FF - - - TIS - desc TIS - 0 - 0 - read-write - - - TSS - desc TSS - 1 - 1 - read-write - - - TUS - desc TUS - 2 - 2 - read-write - - - TJS - desc TJS - 3 - 3 - read-write - - - OVS - desc OVS - 4 - 4 - read-write - - - UNS - desc UNS - 5 - 5 - read-write - - - RIS - desc RIS - 6 - 6 - read-write - - - RUS - desc RUS - 7 - 7 - read-write - - - RSS - desc RSS - 8 - 8 - read-write - - - RWS - desc RWS - 9 - 9 - read-write - - - ETS - desc ETS - 10 - 10 - read-write - - - FBS - desc FBS - 13 - 13 - read-write - - - ERS - desc ERS - 14 - 14 - read-write - - - AIS - desc AIS - 15 - 15 - read-write - - - NIS - desc NIS - 16 - 16 - read-write - - - RSTS - desc RSTS - 19 - 17 - read-only - - - TSTS - desc TSTS - 22 - 20 - read-only - - - EBUS - desc EBUS - 25 - 23 - read-only - - - MMCS - desc MMCS - 27 - 27 - read-only - - - PMTS - desc PMTS - 28 - 28 - read-only - - - PTPS - desc PTPS - 29 - 29 - read-only - - - - - DMA_OPRMODR - desc DMA_OPRMODR - 0x11018 - 32 - read-write - 0x0 - 0x731E0FE - - - STR - desc STR - 1 - 1 - read-write - - - OSF - desc OSF - 2 - 2 - read-write - - - RTC - desc RTC - 4 - 3 - read-write - - - DGF - desc DGF - 5 - 5 - read-write - - - FUF - desc FUF - 6 - 6 - read-write - - - FEF - desc FEF - 7 - 7 - read-write - - - STT - desc STT - 13 - 13 - read-write - - - TTC - desc TTC - 16 - 14 - read-write - - - FTF - desc FTF - 20 - 20 - read-write - - - TSF - desc TSF - 21 - 21 - read-write - - - DFRF - desc DFRF - 24 - 24 - read-write - - - RSF - desc RSF - 25 - 25 - read-write - - - DTCOE - desc DTCOE - 26 - 26 - read-write - - - - - DMA_INTENAR - desc DMA_INTENAR - 0x1101C - 32 - read-write - 0x0 - 0x101E7FF - - - TIE - desc TIE - 0 - 0 - read-write - - - TSE - desc TSE - 1 - 1 - read-write - - - TUE - desc TUE - 2 - 2 - read-write - - - TJE - desc TJE - 3 - 3 - read-write - - - OVE - desc OVE - 4 - 4 - read-write - - - UNE - desc UNE - 5 - 5 - read-write - - - RIE - desc RIE - 6 - 6 - read-write - - - RUE - desc RUE - 7 - 7 - read-write - - - RSE - desc RSE - 8 - 8 - read-write - - - RWE - desc RWE - 9 - 9 - read-write - - - ETE - desc ETE - 10 - 10 - read-write - - - FBE - desc FBE - 13 - 13 - read-write - - - ERE - desc ERE - 14 - 14 - read-write - - - AIE - desc AIE - 15 - 15 - read-write - - - NIE - desc NIE - 16 - 16 - read-write - - - - - DMA_RFRCNTR - desc DMA_RFRCNTR - 0x11020 - 32 - read-only - 0x0 - 0x1FFFFFFF - - - UNACNT - desc UNACNT - 15 - 0 - read-only - - - UNAOVF - desc UNAOVF - 16 - 16 - read-only - - - OVFCNT - desc OVFCNT - 27 - 17 - read-only - - - OVFOVF - desc OVFOVF - 28 - 28 - read-only - - - - - DMA_REVWDTR - desc DMA_REVWDTR - 0x11024 - 32 - read-write - 0x0 - 0xFF - - - RIWT - desc RIWT - 7 - 0 - read-write - - - - - DMA_CHTXDER - desc DMA_CHTXDER - 0x11048 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - CHTXDE - desc CHTXDE - 31 - 0 - read-only - - - - - DMA_CHRXDER - desc DMA_CHRXDER - 0x1104C - 32 - read-only - 0x0 - 0xFFFFFFFF - - - CHRXDE - desc CHRXDE - 31 - 0 - read-only - - - - - DMA_CHTXBFR - desc DMA_CHTXBFR - 0x11050 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - CHTXBF - desc CHTXBF - 31 - 0 - read-only - - - - - DMA_CHRXBFR - desc DMA_CHRXBFR - 0x11054 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - CHRXBF - desc CHRXBF - 31 - 0 - read-only - - - - - - - FCM - desc FCM - 0x40048400 - - 0x0 - 0x24 - - - - LVR - desc LVR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - LVR - desc LVR - 15 - 0 - read-write - - - - - UVR - desc UVR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - UVR - desc UVR - 15 - 0 - read-write - - - - - CNTR - desc CNTR - 0x8 - 32 - read-only - 0x0 - 0xFFFF - - - CNTR - desc CNTR - 15 - 0 - read-only - - - - - STR - desc STR - 0xC - 32 - read-write - 0x0 - 0x1 - - - START - desc START - 0 - 0 - read-write - - - - - MCCR - desc MCCR - 0x10 - 32 - read-write - 0x0 - 0xF3 - - - MDIVS - desc MDIVS - 1 - 0 - read-write - - - MCKS - desc MCKS - 7 - 4 - read-write - - - - - RCCR - desc RCCR - 0x14 - 32 - read-write - 0x0 - 0xB3FB - - - RDIVS - desc RDIVS - 1 - 0 - read-write - - - RCKS - desc RCKS - 6 - 3 - read-write - - - INEXS - desc INEXS - 7 - 7 - read-write - - - DNFS - desc DNFS - 9 - 8 - read-write - - - EDGES - desc EDGES - 13 - 12 - read-write - - - EXREFE - desc EXREFE - 15 - 15 - read-write - - - - - RIER - desc RIER - 0x18 - 32 - read-write - 0x0 - 0x97 - - - ERRIE - desc ERRIE - 0 - 0 - read-write - - - MENDIE - desc MENDIE - 1 - 1 - read-write - - - OVFIE - desc OVFIE - 2 - 2 - read-write - - - ERRINTRS - desc ERRINTRS - 4 - 4 - read-write - - - ERRE - desc ERRE - 7 - 7 - read-write - - - - - SR - desc SR - 0x1C - 32 - read-only - 0x0 - 0x7 - - - ERRF - desc ERRF - 0 - 0 - read-only - - - MENDF - desc MENDF - 1 - 1 - read-only - - - OVF - desc OVF - 2 - 2 - read-only - - - - - CLR - desc CLR - 0x20 - 32 - write-only - 0x0 - 0x7 - - - ERRFCLR - desc ERRFCLR - 0 - 0 - write-only - - - MENDFCLR - desc MENDFCLR - 1 - 1 - write-only - - - OVFCLR - desc OVFCLR - 2 - 2 - write-only - - - - - - - FMAC1 - desc FMAC - 0x40058000 - - 0x0 - 0x64 - - - - ENR - desc ENR - 0x0 - 32 - read-write - 0x0 - 0x1 - - - FMACEN - desc FMACEN - 0 - 0 - read-write - - - - - CTR - desc CTR - 0x4 - 32 - read-write - 0x10 - 0x1F1F - - - STAGE_NUM - desc STAGE_NUM - 4 - 0 - read-write - - - SHIFT - desc SHIFT - 12 - 8 - read-write - - - - - IER - desc IER - 0x8 - 32 - read-write - 0x0 - 0x1 - - - INTEN - desc INTEN - 0 - 0 - read-write - - - - - DTR - desc DTR - 0xC - 32 - read-write - 0x0 - 0xFFFF - - - DIN - desc DIN - 15 - 0 - read-write - - - - - RTR0 - desc RTR0 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RTR1 - desc RTR1 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - STR - desc STR - 0x18 - 32 - read-write - 0x0 - 0x80000000 - - - READY - desc READY - 31 - 31 - read-write - - - - - COR0 - desc COR0 - 0x20 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR1 - desc COR1 - 0x24 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR2 - desc COR2 - 0x28 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR3 - desc COR3 - 0x2C - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR4 - desc COR4 - 0x30 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR5 - desc COR5 - 0x34 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR6 - desc COR6 - 0x38 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR7 - desc COR7 - 0x3C - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR8 - desc COR8 - 0x40 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR9 - desc COR9 - 0x44 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR10 - desc COR10 - 0x48 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR11 - desc COR11 - 0x4C - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR12 - desc COR12 - 0x50 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR13 - desc COR13 - 0x54 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR14 - desc COR14 - 0x58 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR15 - desc COR15 - 0x5C - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - COR16 - desc COR16 - 0x60 - 32 - read-write - 0x0 - 0xFFFF - - - CIN - desc CIN - 15 - 0 - read-write - - - - - - - FMAC2 - desc FMAC - 0x40058400 - - 0x0 - 0x64 - - - - FMAC3 - desc FMAC - 0x40058800 - - 0x0 - 0x64 - - - - FMAC4 - desc FMAC - 0x40058C00 - - 0x0 - 0x64 - - - - GPIO - desc GPIO - 0x40053800 - - 0x0 - 0x638 - - - - PIDRA - desc PIDRA - 0x0 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRA - desc PODRA - 0x4 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERA - desc POERA - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRA - desc POSRA - 0x8 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRA - desc PORRA - 0xA - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRA - desc POTRA - 0xC - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRB - desc PIDRB - 0x10 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRB - desc PODRB - 0x14 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERB - desc POERB - 0x16 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRB - desc POSRB - 0x18 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRB - desc PORRB - 0x1A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRB - desc POTRB - 0x1C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRC - desc PIDRC - 0x20 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRC - desc PODRC - 0x24 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERC - desc POERC - 0x26 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRC - desc POSRC - 0x28 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRC - desc PORRC - 0x2A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRC - desc POTRC - 0x2C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRD - desc PIDRD - 0x30 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRD - desc PODRD - 0x34 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERD - desc POERD - 0x36 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRD - desc POSRD - 0x38 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRD - desc PORRD - 0x3A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRD - desc POTRD - 0x3C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRE - desc PIDRE - 0x40 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRE - desc PODRE - 0x44 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERE - desc POERE - 0x46 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRE - desc POSRE - 0x48 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRE - desc PORRE - 0x4A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRE - desc POTRE - 0x4C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRF - desc PIDRF - 0x50 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRF - desc PODRF - 0x54 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERF - desc POERF - 0x56 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRF - desc POSRF - 0x58 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRF - desc PORRF - 0x5A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRF - desc POTRF - 0x5C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRG - desc PIDRG - 0x60 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRG - desc PODRG - 0x64 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERG - desc POERG - 0x66 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRG - desc POSRG - 0x68 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRG - desc PORRG - 0x6A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRG - desc POTRG - 0x6C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRH - desc PIDRH - 0x70 - 16 - read-only - 0x0 - 0xFFFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - PIN14 - desc PIN14 - 14 - 14 - read-only - - - PIN15 - desc PIN15 - 15 - 15 - read-only - - - - - PODRH - desc PODRH - 0x74 - 16 - read-write - 0x0 - 0xFFFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - POUT14 - desc POUT14 - 14 - 14 - read-write - - - POUT15 - desc POUT15 - 15 - 15 - read-write - - - - - POERH - desc POERH - 0x76 - 16 - read-write - 0x0 - 0xFFFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - POUTE14 - desc POUTE14 - 14 - 14 - read-write - - - POUTE15 - desc POUTE15 - 15 - 15 - read-write - - - - - POSRH - desc POSRH - 0x78 - 16 - write-only - 0x0 - 0xFFFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - POS14 - desc POS14 - 14 - 14 - write-only - - - POS15 - desc POS15 - 15 - 15 - write-only - - - - - PORRH - desc PORRH - 0x7A - 16 - write-only - 0x0 - 0xFFFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - POR14 - desc POR14 - 14 - 14 - write-only - - - POR15 - desc POR15 - 15 - 15 - write-only - - - - - POTRH - desc POTRH - 0x7C - 16 - write-only - 0x0 - 0xFFFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - POT14 - desc POT14 - 14 - 14 - write-only - - - POT15 - desc POT15 - 15 - 15 - write-only - - - - - PIDRI - desc PIDRI - 0x80 - 16 - read-only - 0x0 - 0x3FFF - - - PIN00 - desc PIN00 - 0 - 0 - read-only - - - PIN01 - desc PIN01 - 1 - 1 - read-only - - - PIN02 - desc PIN02 - 2 - 2 - read-only - - - PIN03 - desc PIN03 - 3 - 3 - read-only - - - PIN04 - desc PIN04 - 4 - 4 - read-only - - - PIN05 - desc PIN05 - 5 - 5 - read-only - - - PIN06 - desc PIN06 - 6 - 6 - read-only - - - PIN07 - desc PIN07 - 7 - 7 - read-only - - - PIN08 - desc PIN08 - 8 - 8 - read-only - - - PIN09 - desc PIN09 - 9 - 9 - read-only - - - PIN10 - desc PIN10 - 10 - 10 - read-only - - - PIN11 - desc PIN11 - 11 - 11 - read-only - - - PIN12 - desc PIN12 - 12 - 12 - read-only - - - PIN13 - desc PIN13 - 13 - 13 - read-only - - - - - PODRI - desc PODRI - 0x84 - 16 - read-write - 0x0 - 0x3FFF - - - POUT00 - desc POUT00 - 0 - 0 - read-write - - - POUT01 - desc POUT01 - 1 - 1 - read-write - - - POUT02 - desc POUT02 - 2 - 2 - read-write - - - POUT03 - desc POUT03 - 3 - 3 - read-write - - - POUT04 - desc POUT04 - 4 - 4 - read-write - - - POUT05 - desc POUT05 - 5 - 5 - read-write - - - POUT06 - desc POUT06 - 6 - 6 - read-write - - - POUT07 - desc POUT07 - 7 - 7 - read-write - - - POUT08 - desc POUT08 - 8 - 8 - read-write - - - POUT09 - desc POUT09 - 9 - 9 - read-write - - - POUT10 - desc POUT10 - 10 - 10 - read-write - - - POUT11 - desc POUT11 - 11 - 11 - read-write - - - POUT12 - desc POUT12 - 12 - 12 - read-write - - - POUT13 - desc POUT13 - 13 - 13 - read-write - - - - - POERI - desc POERI - 0x86 - 16 - read-write - 0x0 - 0x3FFF - - - POUTE00 - desc POUTE00 - 0 - 0 - read-write - - - POUTE01 - desc POUTE01 - 1 - 1 - read-write - - - POUTE02 - desc POUTE02 - 2 - 2 - read-write - - - POUTE03 - desc POUTE03 - 3 - 3 - read-write - - - POUTE04 - desc POUTE04 - 4 - 4 - read-write - - - POUTE05 - desc POUTE05 - 5 - 5 - read-write - - - POUTE06 - desc POUTE06 - 6 - 6 - read-write - - - POUTE07 - desc POUTE07 - 7 - 7 - read-write - - - POUTE08 - desc POUTE08 - 8 - 8 - read-write - - - POUTE09 - desc POUTE09 - 9 - 9 - read-write - - - POUTE10 - desc POUTE10 - 10 - 10 - read-write - - - POUTE11 - desc POUTE11 - 11 - 11 - read-write - - - POUTE12 - desc POUTE12 - 12 - 12 - read-write - - - POUTE13 - desc POUTE13 - 13 - 13 - read-write - - - - - POSRI - desc POSRI - 0x88 - 16 - write-only - 0x0 - 0x3FFF - - - POS00 - desc POS00 - 0 - 0 - write-only - - - POS01 - desc POS01 - 1 - 1 - write-only - - - POS02 - desc POS02 - 2 - 2 - write-only - - - POS03 - desc POS03 - 3 - 3 - write-only - - - POS04 - desc POS04 - 4 - 4 - write-only - - - POS05 - desc POS05 - 5 - 5 - write-only - - - POS06 - desc POS06 - 6 - 6 - write-only - - - POS07 - desc POS07 - 7 - 7 - write-only - - - POS08 - desc POS08 - 8 - 8 - write-only - - - POS09 - desc POS09 - 9 - 9 - write-only - - - POS10 - desc POS10 - 10 - 10 - write-only - - - POS11 - desc POS11 - 11 - 11 - write-only - - - POS12 - desc POS12 - 12 - 12 - write-only - - - POS13 - desc POS13 - 13 - 13 - write-only - - - - - PORRI - desc PORRI - 0x8A - 16 - write-only - 0x0 - 0x3FFF - - - POR00 - desc POR00 - 0 - 0 - write-only - - - POR01 - desc POR01 - 1 - 1 - write-only - - - POR02 - desc POR02 - 2 - 2 - write-only - - - POR03 - desc POR03 - 3 - 3 - write-only - - - POR04 - desc POR04 - 4 - 4 - write-only - - - POR05 - desc POR05 - 5 - 5 - write-only - - - POR06 - desc POR06 - 6 - 6 - write-only - - - POR07 - desc POR07 - 7 - 7 - write-only - - - POR08 - desc POR08 - 8 - 8 - write-only - - - POR09 - desc POR09 - 9 - 9 - write-only - - - POR10 - desc POR10 - 10 - 10 - write-only - - - POR11 - desc POR11 - 11 - 11 - write-only - - - POR12 - desc POR12 - 12 - 12 - write-only - - - POR13 - desc POR13 - 13 - 13 - write-only - - - - - POTRI - desc POTRI - 0x8C - 16 - write-only - 0x0 - 0x3FFF - - - POT00 - desc POT00 - 0 - 0 - write-only - - - POT01 - desc POT01 - 1 - 1 - write-only - - - POT02 - desc POT02 - 2 - 2 - write-only - - - POT03 - desc POT03 - 3 - 3 - write-only - - - POT04 - desc POT04 - 4 - 4 - write-only - - - POT05 - desc POT05 - 5 - 5 - write-only - - - POT06 - desc POT06 - 6 - 6 - write-only - - - POT07 - desc POT07 - 7 - 7 - write-only - - - POT08 - desc POT08 - 8 - 8 - write-only - - - POT09 - desc POT09 - 9 - 9 - write-only - - - POT10 - desc POT10 - 10 - 10 - write-only - - - POT11 - desc POT11 - 11 - 11 - write-only - - - POT12 - desc POT12 - 12 - 12 - write-only - - - POT13 - desc POT13 - 13 - 13 - write-only - - - - - PSPCR - desc PSPCR - 0x3F4 - 16 - read-write - 0x1F - 0x1F - - - SPFE - desc SPFE - 4 - 0 - read-write - - - - - PCCR - desc PCCR - 0x3F8 - 16 - read-write - 0x1000 - 0x703F - - - BFSEL - desc BFSEL - 5 - 0 - read-write - - - RDWT - desc RDWT - 14 - 12 - read-write - - - - - PINAER - desc PINAER - 0x3FA - 16 - read-write - 0x0 - 0x1FF - - - PINAE - desc PINAE - 8 - 0 - read-write - - - - - PWPR - desc PWPR - 0x3FC - 16 - read-write - 0x0 - 0xFF01 - - - WE - desc WE - 0 - 0 - read-write - - - WP - desc WP - 15 - 8 - write-only - - - - - PCRA0 - desc PCRA0 - 0x400 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA0 - desc PFSRA0 - 0x402 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA1 - desc PCRA1 - 0x404 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA1 - desc PFSRA1 - 0x406 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA2 - desc PCRA2 - 0x408 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA2 - desc PFSRA2 - 0x40A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA3 - desc PCRA3 - 0x40C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA3 - desc PFSRA3 - 0x40E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA4 - desc PCRA4 - 0x410 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA4 - desc PFSRA4 - 0x412 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA5 - desc PCRA5 - 0x414 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA5 - desc PFSRA5 - 0x416 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA6 - desc PCRA6 - 0x418 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA6 - desc PFSRA6 - 0x41A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA7 - desc PCRA7 - 0x41C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA7 - desc PFSRA7 - 0x41E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA8 - desc PCRA8 - 0x420 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA8 - desc PFSRA8 - 0x422 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA9 - desc PCRA9 - 0x424 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA9 - desc PFSRA9 - 0x426 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA10 - desc PCRA10 - 0x428 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA10 - desc PFSRA10 - 0x42A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA11 - desc PCRA11 - 0x42C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA11 - desc PFSRA11 - 0x42E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA12 - desc PCRA12 - 0x430 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA12 - desc PFSRA12 - 0x432 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA13 - desc PCRA13 - 0x434 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA13 - desc PFSRA13 - 0x436 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA14 - desc PCRA14 - 0x438 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA14 - desc PFSRA14 - 0x43A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRA15 - desc PCRA15 - 0x43C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRA15 - desc PFSRA15 - 0x43E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB0 - desc PCRB0 - 0x440 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB0 - desc PFSRB0 - 0x442 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB1 - desc PCRB1 - 0x444 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB1 - desc PFSRB1 - 0x446 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB2 - desc PCRB2 - 0x448 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB2 - desc PFSRB2 - 0x44A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB3 - desc PCRB3 - 0x44C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB3 - desc PFSRB3 - 0x44E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB4 - desc PCRB4 - 0x450 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB4 - desc PFSRB4 - 0x452 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB5 - desc PCRB5 - 0x454 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB5 - desc PFSRB5 - 0x456 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB6 - desc PCRB6 - 0x458 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB6 - desc PFSRB6 - 0x45A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB7 - desc PCRB7 - 0x45C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB7 - desc PFSRB7 - 0x45E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB8 - desc PCRB8 - 0x460 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB8 - desc PFSRB8 - 0x462 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB9 - desc PCRB9 - 0x464 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB9 - desc PFSRB9 - 0x466 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB10 - desc PCRB10 - 0x468 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB10 - desc PFSRB10 - 0x46A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB11 - desc PCRB11 - 0x46C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB11 - desc PFSRB11 - 0x46E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB12 - desc PCRB12 - 0x470 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB12 - desc PFSRB12 - 0x472 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB13 - desc PCRB13 - 0x474 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB13 - desc PFSRB13 - 0x476 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB14 - desc PCRB14 - 0x478 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB14 - desc PFSRB14 - 0x47A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRB15 - desc PCRB15 - 0x47C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRB15 - desc PFSRB15 - 0x47E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC0 - desc PCRC0 - 0x480 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC0 - desc PFSRC0 - 0x482 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC1 - desc PCRC1 - 0x484 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC1 - desc PFSRC1 - 0x486 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC2 - desc PCRC2 - 0x488 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC2 - desc PFSRC2 - 0x48A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC3 - desc PCRC3 - 0x48C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC3 - desc PFSRC3 - 0x48E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC4 - desc PCRC4 - 0x490 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC4 - desc PFSRC4 - 0x492 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC5 - desc PCRC5 - 0x494 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC5 - desc PFSRC5 - 0x496 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC6 - desc PCRC6 - 0x498 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC6 - desc PFSRC6 - 0x49A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC7 - desc PCRC7 - 0x49C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC7 - desc PFSRC7 - 0x49E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC8 - desc PCRC8 - 0x4A0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC8 - desc PFSRC8 - 0x4A2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC9 - desc PCRC9 - 0x4A4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC9 - desc PFSRC9 - 0x4A6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC10 - desc PCRC10 - 0x4A8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC10 - desc PFSRC10 - 0x4AA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC11 - desc PCRC11 - 0x4AC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC11 - desc PFSRC11 - 0x4AE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC12 - desc PCRC12 - 0x4B0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC12 - desc PFSRC12 - 0x4B2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC13 - desc PCRC13 - 0x4B4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC13 - desc PFSRC13 - 0x4B6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC14 - desc PCRC14 - 0x4B8 - 16 - read-write - 0x8100 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC14 - desc PFSRC14 - 0x4BA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRC15 - desc PCRC15 - 0x4BC - 16 - read-write - 0x8100 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRC15 - desc PFSRC15 - 0x4BE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD0 - desc PCRD0 - 0x4C0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD0 - desc PFSRD0 - 0x4C2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD1 - desc PCRD1 - 0x4C4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD1 - desc PFSRD1 - 0x4C6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD2 - desc PCRD2 - 0x4C8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD2 - desc PFSRD2 - 0x4CA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD3 - desc PCRD3 - 0x4CC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD3 - desc PFSRD3 - 0x4CE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD4 - desc PCRD4 - 0x4D0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD4 - desc PFSRD4 - 0x4D2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD5 - desc PCRD5 - 0x4D4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD5 - desc PFSRD5 - 0x4D6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD6 - desc PCRD6 - 0x4D8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD6 - desc PFSRD6 - 0x4DA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD7 - desc PCRD7 - 0x4DC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD7 - desc PFSRD7 - 0x4DE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD8 - desc PCRD8 - 0x4E0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD8 - desc PFSRD8 - 0x4E2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD9 - desc PCRD9 - 0x4E4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD9 - desc PFSRD9 - 0x4E6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD10 - desc PCRD10 - 0x4E8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD10 - desc PFSRD10 - 0x4EA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD11 - desc PCRD11 - 0x4EC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD11 - desc PFSRD11 - 0x4EE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD12 - desc PCRD12 - 0x4F0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD12 - desc PFSRD12 - 0x4F2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD13 - desc PCRD13 - 0x4F4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD13 - desc PFSRD13 - 0x4F6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD14 - desc PCRD14 - 0x4F8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD14 - desc PFSRD14 - 0x4FA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRD15 - desc PCRD15 - 0x4FC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRD15 - desc PFSRD15 - 0x4FE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE0 - desc PCRE0 - 0x500 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE0 - desc PFSRE0 - 0x502 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE1 - desc PCRE1 - 0x504 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE1 - desc PFSRE1 - 0x506 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE2 - desc PCRE2 - 0x508 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE2 - desc PFSRE2 - 0x50A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE3 - desc PCRE3 - 0x50C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE3 - desc PFSRE3 - 0x50E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE4 - desc PCRE4 - 0x510 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE4 - desc PFSRE4 - 0x512 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE5 - desc PCRE5 - 0x514 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE5 - desc PFSRE5 - 0x516 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE6 - desc PCRE6 - 0x518 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE6 - desc PFSRE6 - 0x51A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE7 - desc PCRE7 - 0x51C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE7 - desc PFSRE7 - 0x51E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE8 - desc PCRE8 - 0x520 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE8 - desc PFSRE8 - 0x522 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE9 - desc PCRE9 - 0x524 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE9 - desc PFSRE9 - 0x526 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE10 - desc PCRE10 - 0x528 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE10 - desc PFSRE10 - 0x52A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE11 - desc PCRE11 - 0x52C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE11 - desc PFSRE11 - 0x52E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE12 - desc PCRE12 - 0x530 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE12 - desc PFSRE12 - 0x532 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE13 - desc PCRE13 - 0x534 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE13 - desc PFSRE13 - 0x536 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE14 - desc PCRE14 - 0x538 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE14 - desc PFSRE14 - 0x53A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRE15 - desc PCRE15 - 0x53C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRE15 - desc PFSRE15 - 0x53E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF0 - desc PCRF0 - 0x540 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF0 - desc PFSRF0 - 0x542 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF1 - desc PCRF1 - 0x544 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF1 - desc PFSRF1 - 0x546 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF2 - desc PCRF2 - 0x548 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF2 - desc PFSRF2 - 0x54A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF3 - desc PCRF3 - 0x54C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF3 - desc PFSRF3 - 0x54E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF4 - desc PCRF4 - 0x550 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF4 - desc PFSRF4 - 0x552 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF5 - desc PCRF5 - 0x554 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF5 - desc PFSRF5 - 0x556 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF6 - desc PCRF6 - 0x558 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF6 - desc PFSRF6 - 0x55A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF7 - desc PCRF7 - 0x55C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF7 - desc PFSRF7 - 0x55E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF8 - desc PCRF8 - 0x560 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF8 - desc PFSRF8 - 0x562 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF9 - desc PCRF9 - 0x564 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF9 - desc PFSRF9 - 0x566 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF10 - desc PCRF10 - 0x568 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF10 - desc PFSRF10 - 0x56A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF11 - desc PCRF11 - 0x56C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF11 - desc PFSRF11 - 0x56E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF12 - desc PCRF12 - 0x570 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF12 - desc PFSRF12 - 0x572 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF13 - desc PCRF13 - 0x574 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF13 - desc PFSRF13 - 0x576 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF14 - desc PCRF14 - 0x578 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF14 - desc PFSRF14 - 0x57A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRF15 - desc PCRF15 - 0x57C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRF15 - desc PFSRF15 - 0x57E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG0 - desc PCRG0 - 0x580 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG0 - desc PFSRG0 - 0x582 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG1 - desc PCRG1 - 0x584 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG1 - desc PFSRG1 - 0x586 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG2 - desc PCRG2 - 0x588 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG2 - desc PFSRG2 - 0x58A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG3 - desc PCRG3 - 0x58C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG3 - desc PFSRG3 - 0x58E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG4 - desc PCRG4 - 0x590 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG4 - desc PFSRG4 - 0x592 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG5 - desc PCRG5 - 0x594 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG5 - desc PFSRG5 - 0x596 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG6 - desc PCRG6 - 0x598 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG6 - desc PFSRG6 - 0x59A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG7 - desc PCRG7 - 0x59C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG7 - desc PFSRG7 - 0x59E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG8 - desc PCRG8 - 0x5A0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG8 - desc PFSRG8 - 0x5A2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG9 - desc PCRG9 - 0x5A4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG9 - desc PFSRG9 - 0x5A6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG10 - desc PCRG10 - 0x5A8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG10 - desc PFSRG10 - 0x5AA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG11 - desc PCRG11 - 0x5AC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG11 - desc PFSRG11 - 0x5AE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG12 - desc PCRG12 - 0x5B0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG12 - desc PFSRG12 - 0x5B2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG13 - desc PCRG13 - 0x5B4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG13 - desc PFSRG13 - 0x5B6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG14 - desc PCRG14 - 0x5B8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG14 - desc PFSRG14 - 0x5BA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRG15 - desc PCRG15 - 0x5BC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRG15 - desc PFSRG15 - 0x5BE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH0 - desc PCRH0 - 0x5C0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH0 - desc PFSRH0 - 0x5C2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH1 - desc PCRH1 - 0x5C4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH1 - desc PFSRH1 - 0x5C6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH2 - desc PCRH2 - 0x5C8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH2 - desc PFSRH2 - 0x5CA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH3 - desc PCRH3 - 0x5CC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH3 - desc PFSRH3 - 0x5CE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH4 - desc PCRH4 - 0x5D0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH4 - desc PFSRH4 - 0x5D2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH5 - desc PCRH5 - 0x5D4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH5 - desc PFSRH5 - 0x5D6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH6 - desc PCRH6 - 0x5D8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH6 - desc PFSRH6 - 0x5DA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH7 - desc PCRH7 - 0x5DC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH7 - desc PFSRH7 - 0x5DE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH8 - desc PCRH8 - 0x5E0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH8 - desc PFSRH8 - 0x5E2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH9 - desc PCRH9 - 0x5E4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH9 - desc PFSRH9 - 0x5E6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH10 - desc PCRH10 - 0x5E8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH10 - desc PFSRH10 - 0x5EA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH11 - desc PCRH11 - 0x5EC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH11 - desc PFSRH11 - 0x5EE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH12 - desc PCRH12 - 0x5F0 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH12 - desc PFSRH12 - 0x5F2 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH13 - desc PCRH13 - 0x5F4 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH13 - desc PFSRH13 - 0x5F6 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH14 - desc PCRH14 - 0x5F8 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH14 - desc PFSRH14 - 0x5FA - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRH15 - desc PCRH15 - 0x5FC - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRH15 - desc PFSRH15 - 0x5FE - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI0 - desc PCRI0 - 0x600 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI0 - desc PFSRI0 - 0x602 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI1 - desc PCRI1 - 0x604 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI1 - desc PFSRI1 - 0x606 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI2 - desc PCRI2 - 0x608 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI2 - desc PFSRI2 - 0x60A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI3 - desc PCRI3 - 0x60C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI3 - desc PFSRI3 - 0x60E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI4 - desc PCRI4 - 0x610 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI4 - desc PFSRI4 - 0x612 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI5 - desc PCRI5 - 0x614 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI5 - desc PFSRI5 - 0x616 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI6 - desc PCRI6 - 0x618 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI6 - desc PFSRI6 - 0x61A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI7 - desc PCRI7 - 0x61C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI7 - desc PFSRI7 - 0x61E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI8 - desc PCRI8 - 0x620 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI8 - desc PFSRI8 - 0x622 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI9 - desc PCRI9 - 0x624 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI9 - desc PFSRI9 - 0x626 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI10 - desc PCRI10 - 0x628 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI10 - desc PFSRI10 - 0x62A - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI11 - desc PCRI11 - 0x62C - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI11 - desc PFSRI11 - 0x62E - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI12 - desc PCRI12 - 0x630 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI12 - desc PFSRI12 - 0x632 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - PCRI13 - desc PCRI13 - 0x634 - 16 - read-write - 0x0 - 0xD777 - - - POUT - desc POUT - 0 - 0 - read-write - - - POUTE - desc POUTE - 1 - 1 - read-write - - - NOD - desc NOD - 2 - 2 - read-write - - - DRV - desc DRV - 5 - 4 - read-write - - - PUU - desc PUU - 6 - 6 - read-write - - - PIN - desc PIN - 8 - 8 - read-only - - - INVE - desc INVE - 9 - 9 - read-write - - - CINSEL - desc CINSEL - 10 - 10 - read-write - - - INTE - desc INTE - 12 - 12 - read-write - - - LTE - desc LTE - 14 - 14 - read-write - - - DDIS - desc DDIS - 15 - 15 - read-write - - - - - PFSRI13 - desc PFSRI13 - 0x636 - 16 - read-write - 0x0 - 0x13F - - - FSEL - desc FSEL - 5 - 0 - read-write - - - BFE - desc BFE - 8 - 8 - read-write - - - - - - - HASH - desc HASH - 0x40008400 - - 0x0 - 0x80 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0xC777 - - - START - desc START - 0 - 0 - read-write - - - FST_GRP - desc FST_GRP - 1 - 1 - read-write - - - KMSG_END - desc KMSG_END - 2 - 2 - read-write - - - MODE - desc MODE - 5 - 4 - read-write - - - LKEY - desc LKEY - 6 - 6 - read-write - - - BUSY - desc BUSY - 8 - 8 - read-write - - - CYC_END - desc CYC_END - 9 - 9 - read-write - - - HMAC_END - desc HMAC_END - 10 - 10 - read-write - - - HCIE - desc HCIE - 14 - 14 - read-write - - - HEIE - desc HEIE - 15 - 15 - read-write - - - - - HR7 - desc HR7 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR6 - desc HR6 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR5 - desc HR5 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR4 - desc HR4 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR3 - desc HR3 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR2 - desc HR2 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR1 - desc HR1 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HR0 - desc HR0 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR15 - desc DR15 - 0x40 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR14 - desc DR14 - 0x44 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR13 - desc DR13 - 0x48 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR12 - desc DR12 - 0x4C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR11 - desc DR11 - 0x50 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR10 - desc DR10 - 0x54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR9 - desc DR9 - 0x58 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR8 - desc DR8 - 0x5C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR7 - desc DR7 - 0x60 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR6 - desc DR6 - 0x64 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR5 - desc DR5 - 0x68 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR4 - desc DR4 - 0x6C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR3 - desc DR3 - 0x70 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR2 - desc DR2 - 0x74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x78 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DR0 - desc DR0 - 0x7C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - - - HRPWM - desc HRPWM - 0x4003C000 - - 0x0 - 0x58 - - - - CR1 - desc CR1 - 0x0 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x4 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR3 - desc CR3 - 0x8 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR4 - desc CR4 - 0xC - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR5 - desc CR5 - 0x10 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR6 - desc CR6 - 0x14 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR7 - desc CR7 - 0x18 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR8 - desc CR8 - 0x1C - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR9 - desc CR9 - 0x20 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR10 - desc CR10 - 0x24 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR11 - desc CR11 - 0x28 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR12 - desc CR12 - 0x2C - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR13 - desc CR13 - 0x30 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR14 - desc CR14 - 0x34 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR15 - desc CR15 - 0x38 - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CR16 - desc CR16 - 0x3C - 32 - read-write - 0x0 - 0xE000FFFF - - - NSEL - desc NSEL - 7 - 0 - read-write - - - PSEL - desc PSEL - 15 - 8 - read-write - - - NE - desc NE - 29 - 29 - read-write - - - PE - desc PE - 30 - 30 - read-write - - - EN - desc EN - 31 - 31 - read-write - - - - - CALCR0 - desc CALCR0 - 0x50 - 32 - read-write - 0x0 - 0x90FF - - - CALCODE - desc CALCODE - 7 - 0 - read-write - - - ENDF - desc ENDF - 12 - 12 - read-write - - - CALEN - desc CALEN - 15 - 15 - read-write - - - - - CALCR1 - desc CALCR1 - 0x54 - 32 - read-write - 0x0 - 0x90FF - - - CALCODE - desc CALCODE - 7 - 0 - read-write - - - ENDF - desc ENDF - 12 - 12 - read-write - - - CALEN - desc CALEN - 15 - 15 - read-write - - - - - - - I2C1 - desc I2C - 0x4004E000 - - 0x0 - 0x34 - - - - CR1 - desc CR1 - 0x0 - 32 - read-write - 0x40 - 0x87DF - - - PE - desc PE - 0 - 0 - read-write - - - SMBUS - desc SMBUS - 1 - 1 - read-write - - - SMBALRTEN - desc SMBALRTEN - 2 - 2 - read-write - - - SMBDEFAULTEN - desc SMBDEFAULTEN - 3 - 3 - read-write - - - SMBHOSTEN - desc SMBHOSTEN - 4 - 4 - read-write - - - GCEN - desc GCEN - 6 - 6 - read-write - - - RESTART - desc RESTART - 7 - 7 - read-write - - - START - desc START - 8 - 8 - read-write - - - STOP - desc STOP - 9 - 9 - read-write - - - ACK - desc ACK - 10 - 10 - read-write - - - SWRST - desc SWRST - 15 - 15 - read-write - - - - - CR2 - desc CR2 - 0x4 - 32 - read-write - 0x0 - 0xF052DF - - - STARTIE - desc STARTIE - 0 - 0 - read-write - - - SLADDR0IE - desc SLADDR0IE - 1 - 1 - read-write - - - SLADDR1IE - desc SLADDR1IE - 2 - 2 - read-write - - - TENDIE - desc TENDIE - 3 - 3 - read-write - - - STOPIE - desc STOPIE - 4 - 4 - read-write - - - RFULLIE - desc RFULLIE - 6 - 6 - read-write - - - TEMPTYIE - desc TEMPTYIE - 7 - 7 - read-write - - - ARLOIE - desc ARLOIE - 9 - 9 - read-write - - - NACKIE - desc NACKIE - 12 - 12 - read-write - - - TMOUTIE - desc TMOUTIE - 14 - 14 - read-write - - - GENCALLIE - desc GENCALLIE - 20 - 20 - read-write - - - SMBDEFAULTIE - desc SMBDEFAULTIE - 21 - 21 - read-write - - - SMBHOSTIE - desc SMBHOSTIE - 22 - 22 - read-write - - - SMBALRTIE - desc SMBALRTIE - 23 - 23 - read-write - - - - - CR3 - desc CR3 - 0x8 - 32 - read-write - 0x6 - 0x87 - - - TMOUTEN - desc TMOUTEN - 0 - 0 - read-write - - - LTMOUT - desc LTMOUT - 1 - 1 - read-write - - - HTMOUT - desc HTMOUT - 2 - 2 - read-write - - - FACKEN - desc FACKEN - 7 - 7 - read-write - - - - - CR4 - desc CR4 - 0xC - 32 - read-write - 0x300307 - 0x400 - - - BUSWAIT - desc BUSWAIT - 10 - 10 - read-write - - - - - SLR0 - desc SLR0 - 0x10 - 32 - read-write - 0x1000 - 0x93FF - - - SLADDR0 - desc SLADDR0 - 9 - 0 - read-write - - - SLADDR0EN - desc SLADDR0EN - 12 - 12 - read-write - - - ADDRMOD0 - desc ADDRMOD0 - 15 - 15 - read-write - - - - - SLR1 - desc SLR1 - 0x14 - 32 - read-write - 0x0 - 0x93FF - - - SLADDR1 - desc SLADDR1 - 9 - 0 - read-write - - - SLADDR1EN - desc SLADDR1EN - 12 - 12 - read-write - - - ADDRMOD1 - desc ADDRMOD1 - 15 - 15 - read-write - - - - - SLTR - desc SLTR - 0x18 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - TOUTLOW - desc TOUTLOW - 15 - 0 - read-write - - - TOUTHIGH - desc TOUTHIGH - 31 - 16 - read-write - - - - - SR - desc SR - 0x1C - 32 - read-write - 0x0 - 0xF756DF - - - STARTF - desc STARTF - 0 - 0 - read-write - - - SLADDR0F - desc SLADDR0F - 1 - 1 - read-write - - - SLADDR1F - desc SLADDR1F - 2 - 2 - read-write - - - TENDF - desc TENDF - 3 - 3 - read-write - - - STOPF - desc STOPF - 4 - 4 - read-write - - - RFULLF - desc RFULLF - 6 - 6 - read-write - - - TEMPTYF - desc TEMPTYF - 7 - 7 - read-write - - - ARLOF - desc ARLOF - 9 - 9 - read-write - - - ACKRF - desc ACKRF - 10 - 10 - read-write - - - NACKF - desc NACKF - 12 - 12 - read-write - - - TMOUTF - desc TMOUTF - 14 - 14 - read-write - - - MSL - desc MSL - 16 - 16 - read-write - - - BUSY - desc BUSY - 17 - 17 - read-write - - - TRA - desc TRA - 18 - 18 - read-write - - - GENCALLF - desc GENCALLF - 20 - 20 - read-write - - - SMBDEFAULTF - desc SMBDEFAULTF - 21 - 21 - read-write - - - SMBHOSTF - desc SMBHOSTF - 22 - 22 - read-write - - - SMBALRTF - desc SMBALRTF - 23 - 23 - read-write - - - - - CLR - desc CLR - 0x20 - 32 - write-only - 0x0 - 0xF052DF - - - STARTFCLR - desc STARTFCLR - 0 - 0 - write-only - - - SLADDR0FCLR - desc SLADDR0FCLR - 1 - 1 - write-only - - - SLADDR1FCLR - desc SLADDR1FCLR - 2 - 2 - write-only - - - TENDFCLR - desc TENDFCLR - 3 - 3 - write-only - - - STOPFCLR - desc STOPFCLR - 4 - 4 - write-only - - - RFULLFCLR - desc RFULLFCLR - 6 - 6 - write-only - - - TEMPTYFCLR - desc TEMPTYFCLR - 7 - 7 - write-only - - - ARLOFCLR - desc ARLOFCLR - 9 - 9 - write-only - - - NACKFCLR - desc NACKFCLR - 12 - 12 - write-only - - - TMOUTFCLR - desc TMOUTFCLR - 14 - 14 - write-only - - - GENCALLFCLR - desc GENCALLFCLR - 20 - 20 - write-only - - - SMBDEFAULTFCLR - desc SMBDEFAULTFCLR - 21 - 21 - write-only - - - SMBHOSTFCLR - desc SMBHOSTFCLR - 22 - 22 - write-only - - - SMBALRTFCLR - desc SMBALRTFCLR - 23 - 23 - write-only - - - - - DTR - desc DTR - 0x24 - 8 - write-only - 0xFF - 0xFF - - - DT - desc DT - 7 - 0 - write-only - - - - - DRR - desc DRR - 0x28 - 8 - read-only - 0x0 - 0xFF - - - DR - desc DR - 7 - 0 - read-only - - - - - CCR - desc CCR - 0x2C - 32 - read-write - 0x1F1F - 0x71F1F - - - SLOWW - desc SLOWW - 4 - 0 - read-write - - - SHIGHW - desc SHIGHW - 12 - 8 - read-write - - - FREQ - desc FREQ - 18 - 16 - read-write - - - - - FLTR - desc FLTR - 0x30 - 32 - read-write - 0x10 - 0x33 - - - DNF - desc DNF - 1 - 0 - read-write - - - DNFEN - desc DNFEN - 4 - 4 - read-write - - - ANFEN - desc ANFEN - 5 - 5 - read-write - - - - - - - I2C2 - desc I2C - 0x4004E400 - - 0x0 - 0x34 - - - - I2C3 - desc I2C - 0x4004E800 - - 0x0 - 0x34 - - - - I2C4 - desc I2C - 0x4004EC00 - - 0x0 - 0x34 - - - - I2C5 - desc I2C - 0x4004F000 - - 0x0 - 0x34 - - - - I2C6 - desc I2C - 0x4004F400 - - 0x0 - 0x34 - - - - I2S1 - desc I2S - 0x4001E000 - - 0x0 - 0x1C - - - - CTRL - desc CTRL - 0x0 - 32 - read-write - 0x2200 - 0x1FF77FF - - - TXE - desc TXE - 0 - 0 - read-write - - - TXIE - desc TXIE - 1 - 1 - read-write - - - RXE - desc RXE - 2 - 2 - read-write - - - RXIE - desc RXIE - 3 - 3 - read-write - - - EIE - desc EIE - 4 - 4 - read-write - - - WMS - desc WMS - 5 - 5 - read-write - - - ODD - desc ODD - 6 - 6 - read-write - - - MCKOE - desc MCKOE - 7 - 7 - read-write - - - TXBIRQWL - desc TXBIRQWL - 10 - 8 - read-write - - - RXBIRQWL - desc RXBIRQWL - 14 - 12 - read-write - - - FIFOR - desc FIFOR - 16 - 16 - read-write - - - CODECRC - desc CODECRC - 17 - 17 - read-write - - - I2SPLLSEL - desc I2SPLLSEL - 18 - 18 - read-write - - - SDOE - desc SDOE - 19 - 19 - read-write - - - LRCKOE - desc LRCKOE - 20 - 20 - read-write - - - CKOE - desc CKOE - 21 - 21 - read-write - - - DUPLEX - desc DUPLEX - 22 - 22 - read-write - - - CLKSEL - desc CLKSEL - 23 - 23 - read-write - - - SRST - desc SRST - 24 - 24 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-only - 0x14 - 0x3F - - - TXBA - desc TXBA - 0 - 0 - read-only - - - RXBA - desc RXBA - 1 - 1 - read-only - - - TXBE - desc TXBE - 2 - 2 - read-only - - - TXBF - desc TXBF - 3 - 3 - read-only - - - RXBE - desc RXBE - 4 - 4 - read-only - - - RXBF - desc RXBF - 5 - 5 - read-only - - - - - ER - desc ER - 0x8 - 32 - read-write - 0x0 - 0x3 - - - TXERR - desc TXERR - 0 - 0 - read-write - - - RXERR - desc RXERR - 1 - 1 - read-write - - - - - CFGR - desc CFGR - 0xC - 32 - read-write - 0x0 - 0x3F - - - I2SSTD - desc I2SSTD - 1 - 0 - read-write - - - DATLEN - desc DATLEN - 3 - 2 - read-write - - - CHLEN - desc CHLEN - 4 - 4 - read-write - - - PCMSYNC - desc PCMSYNC - 5 - 5 - read-write - - - - - TXBUF - desc TXBUF - 0x10 - 32 - write-only - 0x0 - 0xFFFFFFFF - - - RXBUF - desc RXBUF - 0x14 - 32 - read-only - 0x0 - 0xFFFFFFFF - - - PR - desc PR - 0x18 - 32 - read-write - 0x2 - 0xFF - - - I2SDIV - desc I2SDIV - 7 - 0 - read-write - - - - - - - I2S2 - desc I2S - 0x4001E400 - - 0x0 - 0x1C - - - - I2S3 - desc I2S - 0x40022000 - - 0x0 - 0x1C - - - - I2S4 - desc I2S - 0x40022400 - - 0x0 - 0x1C - - - - ICG - desc ICG - 0x00000400 - - 0x0 - 0x10 - - - - ICG0 - desc ICG0 - 0x0 - 32 - read-only - 0xFFFFFFFF - 0x1FFF1FFF - - - SWDTAUTS - desc SWDTAUTS - 0 - 0 - read-only - - - SWDTITS - desc SWDTITS - 1 - 1 - read-only - - - SWDTPERI - desc SWDTPERI - 3 - 2 - read-only - - - SWDTCKS - desc SWDTCKS - 7 - 4 - read-only - - - SWDTWDPT - desc SWDTWDPT - 11 - 8 - read-only - - - SWDTSLPOFF - desc SWDTSLPOFF - 12 - 12 - read-only - - - WDTAUTS - desc WDTAUTS - 16 - 16 - read-only - - - WDTITS - desc WDTITS - 17 - 17 - read-only - - - WDTPERI - desc WDTPERI - 19 - 18 - read-only - - - WDTCKS - desc WDTCKS - 23 - 20 - read-only - - - WDTWDPT - desc WDTWDPT - 27 - 24 - read-only - - - WDTSLPOFF - desc WDTSLPOFF - 28 - 28 - read-only - - - - - ICG1 - desc ICG1 - 0x4 - 32 - read-only - 0xFFFFFFFF - 0x70101 - - - HRCFREQSEL - desc HRCFREQSEL - 0 - 0 - read-only - - - HRCSTOP - desc HRCSTOP - 8 - 8 - read-only - - - BOR_LEV - desc BOR_LEV - 17 - 16 - read-only - - - BORDIS - desc BORDIS - 18 - 18 - read-only - - - - - ICG2 - desc ICG2 - 0x8 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFF - - - BGO1M - desc BGO1M - 23 - 0 - read-only - - - - - ICG3 - desc ICG3 - 0xC - 32 - read-only - 0xFFFFFFFF - 0xFFFF - - - DBUSPRT - desc DBUSPRT - 15 - 0 - read-only - - - - - - - INTC - desc INTC - 0x40051000 - - 0x0 - 0x2B4 - - - - NOCCR - desc NOCCR - 0x0 - 32 - read-write - 0x0 - 0x3000 - - - NOCSEL - desc NOCSEL - 13 - 12 - read-write - - - - - NMIENR - desc NMIENR - 0x4 - 32 - read-write - 0x0 - 0xF2E - - - SWDTENR - desc SWDTENR - 1 - 1 - read-write - - - PVD1ENR - desc PVD1ENR - 2 - 2 - read-write - - - PVD2ENR - desc PVD2ENR - 3 - 3 - read-write - - - XTALSTPENR - desc XTALSTPENR - 5 - 5 - read-write - - - REPENR - desc REPENR - 8 - 8 - read-write - - - RECCENR - desc RECCENR - 9 - 9 - read-write - - - BUSMENR - desc BUSMENR - 10 - 10 - read-write - - - WDTENR - desc WDTENR - 11 - 11 - read-write - - - - - NMIFR - desc NMIFR - 0x8 - 32 - read-write - 0x0 - 0xF2E - - - SWDTFR - desc SWDTFR - 1 - 1 - read-write - - - PVD1FR - desc PVD1FR - 2 - 2 - read-write - - - PVD2FR - desc PVD2FR - 3 - 3 - read-write - - - XTALSTPFR - desc XTALSTPFR - 5 - 5 - read-write - - - REPFR - desc REPFR - 8 - 8 - read-write - - - RECCFR - desc RECCFR - 9 - 9 - read-write - - - BUSMFR - desc BUSMFR - 10 - 10 - read-write - - - WDTFR - desc WDTFR - 11 - 11 - read-write - - - - - NMICFR - desc NMICFR - 0xC - 32 - read-write - 0x0 - 0xF2E - - - SWDTCFR - desc SWDTCFR - 1 - 1 - read-write - - - PVD1CFR - desc PVD1CFR - 2 - 2 - read-write - - - PVD2CFR - desc PVD2CFR - 3 - 3 - read-write - - - XTALSTPCFR - desc XTALSTPCFR - 5 - 5 - read-write - - - REPCFR - desc REPCFR - 8 - 8 - read-write - - - RECCCFR - desc RECCCFR - 9 - 9 - read-write - - - BUSMCFR - desc BUSMCFR - 10 - 10 - read-write - - - WDTCFR - desc WDTCFR - 11 - 11 - read-write - - - - - EIRQCR0 - desc EIRQCR0 - 0x10 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR1 - desc EIRQCR1 - 0x14 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR2 - desc EIRQCR2 - 0x18 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR3 - desc EIRQCR3 - 0x1C - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR4 - desc EIRQCR4 - 0x20 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR5 - desc EIRQCR5 - 0x24 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR6 - desc EIRQCR6 - 0x28 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR7 - desc EIRQCR7 - 0x2C - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR8 - desc EIRQCR8 - 0x30 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR9 - desc EIRQCR9 - 0x34 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR10 - desc EIRQCR10 - 0x38 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR11 - desc EIRQCR11 - 0x3C - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR12 - desc EIRQCR12 - 0x40 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR13 - desc EIRQCR13 - 0x44 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR14 - desc EIRQCR14 - 0x48 - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - EIRQCR15 - desc EIRQCR15 - 0x4C - 32 - read-write - 0x0 - 0x80B3 - - - EIRQTRG - desc EIRQTRG - 1 - 0 - read-write - - - EISMPCLK - desc EISMPCLK - 5 - 4 - read-write - - - EFEN - desc EFEN - 7 - 7 - read-write - - - NOCEN - desc NOCEN - 15 - 15 - read-write - - - - - WUPEN - desc WUPEN - 0x50 - 32 - read-write - 0x0 - 0x3FFFFFFF - - - EIRQWUEN - desc EIRQWUEN - 15 - 0 - read-write - - - SWDTWUEN - desc SWDTWUEN - 16 - 16 - read-write - - - PVD1WUEN - desc PVD1WUEN - 17 - 17 - read-write - - - PVD2WUEN - desc PVD2WUEN - 18 - 18 - read-write - - - CMPWUEN - desc CMPWUEN - 19 - 19 - read-write - - - WKTMWUEN - desc WKTMWUEN - 20 - 20 - read-write - - - RTCALMWUEN - desc RTCALMWUEN - 21 - 21 - read-write - - - RTCPRDWUEN - desc RTCPRDWUEN - 22 - 22 - read-write - - - TMR0GCMWUEN - desc TMR0GCMWUEN - 23 - 23 - read-write - - - TMR2GCMWUEN - desc TMR2GCMWUEN - 24 - 24 - read-write - - - TMR2OVFWUEN - desc TMR2OVFWUEN - 25 - 25 - read-write - - - RXWUEN - desc RXWUEN - 26 - 26 - read-write - - - USHWUEN - desc USHWUEN - 27 - 27 - read-write - - - USFWUEN - desc USFWUEN - 28 - 28 - read-write - - - ETHWUEN - desc ETHWUEN - 29 - 29 - read-write - - - - - EIRQFR - desc EIRQFR - 0x54 - 32 - read-write - 0x0 - 0xFFFF - - - EIRQFR0 - desc EIRQFR0 - 0 - 0 - read-write - - - EIRQFR1 - desc EIRQFR1 - 1 - 1 - read-write - - - EIRQFR2 - desc EIRQFR2 - 2 - 2 - read-write - - - EIRQFR3 - desc EIRQFR3 - 3 - 3 - read-write - - - EIRQFR4 - desc EIRQFR4 - 4 - 4 - read-write - - - EIRQFR5 - desc EIRQFR5 - 5 - 5 - read-write - - - EIRQFR6 - desc EIRQFR6 - 6 - 6 - read-write - - - EIRQFR7 - desc EIRQFR7 - 7 - 7 - read-write - - - EIRQFR8 - desc EIRQFR8 - 8 - 8 - read-write - - - EIRQFR9 - desc EIRQFR9 - 9 - 9 - read-write - - - EIRQFR10 - desc EIRQFR10 - 10 - 10 - read-write - - - EIRQFR11 - desc EIRQFR11 - 11 - 11 - read-write - - - EIRQFR12 - desc EIRQFR12 - 12 - 12 - read-write - - - EIRQFR13 - desc EIRQFR13 - 13 - 13 - read-write - - - EIRQFR14 - desc EIRQFR14 - 14 - 14 - read-write - - - EIRQFR15 - desc EIRQFR15 - 15 - 15 - read-write - - - - - EIRQCFR - desc EIRQCFR - 0x58 - 32 - read-write - 0x0 - 0xFFFF - - - EIRQCFR0 - desc EIRQCFR0 - 0 - 0 - read-write - - - EIRQCFR1 - desc EIRQCFR1 - 1 - 1 - read-write - - - EIRQCFR2 - desc EIRQCFR2 - 2 - 2 - read-write - - - EIRQCFR3 - desc EIRQCFR3 - 3 - 3 - read-write - - - EIRQCFR4 - desc EIRQCFR4 - 4 - 4 - read-write - - - EIRQCFR5 - desc EIRQCFR5 - 5 - 5 - read-write - - - EIRQCFR6 - desc EIRQCFR6 - 6 - 6 - read-write - - - EIRQCFR7 - desc EIRQCFR7 - 7 - 7 - read-write - - - EIRQCFR8 - desc EIRQCFR8 - 8 - 8 - read-write - - - EIRQCFR9 - desc EIRQCFR9 - 9 - 9 - read-write - - - EIRQCFR10 - desc EIRQCFR10 - 10 - 10 - read-write - - - EIRQCFR11 - desc EIRQCFR11 - 11 - 11 - read-write - - - EIRQCFR12 - desc EIRQCFR12 - 12 - 12 - read-write - - - EIRQCFR13 - desc EIRQCFR13 - 13 - 13 - read-write - - - EIRQCFR14 - desc EIRQCFR14 - 14 - 14 - read-write - - - EIRQCFR15 - desc EIRQCFR15 - 15 - 15 - read-write - - - - - SEL0 - desc SEL0 - 0x5C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL1 - desc SEL1 - 0x60 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL2 - desc SEL2 - 0x64 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL3 - desc SEL3 - 0x68 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL4 - desc SEL4 - 0x6C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL5 - desc SEL5 - 0x70 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL6 - desc SEL6 - 0x74 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL7 - desc SEL7 - 0x78 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL8 - desc SEL8 - 0x7C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL9 - desc SEL9 - 0x80 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL10 - desc SEL10 - 0x84 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL11 - desc SEL11 - 0x88 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL12 - desc SEL12 - 0x8C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL13 - desc SEL13 - 0x90 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL14 - desc SEL14 - 0x94 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL15 - desc SEL15 - 0x98 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL16 - desc SEL16 - 0x9C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL17 - desc SEL17 - 0xA0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL18 - desc SEL18 - 0xA4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL19 - desc SEL19 - 0xA8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL20 - desc SEL20 - 0xAC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL21 - desc SEL21 - 0xB0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL22 - desc SEL22 - 0xB4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL23 - desc SEL23 - 0xB8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL24 - desc SEL24 - 0xBC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL25 - desc SEL25 - 0xC0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL26 - desc SEL26 - 0xC4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL27 - desc SEL27 - 0xC8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL28 - desc SEL28 - 0xCC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL29 - desc SEL29 - 0xD0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL30 - desc SEL30 - 0xD4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL31 - desc SEL31 - 0xD8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL32 - desc SEL32 - 0xDC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL33 - desc SEL33 - 0xE0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL34 - desc SEL34 - 0xE4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL35 - desc SEL35 - 0xE8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL36 - desc SEL36 - 0xEC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL37 - desc SEL37 - 0xF0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL38 - desc SEL38 - 0xF4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL39 - desc SEL39 - 0xF8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL40 - desc SEL40 - 0xFC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL41 - desc SEL41 - 0x100 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL42 - desc SEL42 - 0x104 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL43 - desc SEL43 - 0x108 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL44 - desc SEL44 - 0x10C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL45 - desc SEL45 - 0x110 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL46 - desc SEL46 - 0x114 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL47 - desc SEL47 - 0x118 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL48 - desc SEL48 - 0x11C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL49 - desc SEL49 - 0x120 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL50 - desc SEL50 - 0x124 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL51 - desc SEL51 - 0x128 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL52 - desc SEL52 - 0x12C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL53 - desc SEL53 - 0x130 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL54 - desc SEL54 - 0x134 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL55 - desc SEL55 - 0x138 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL56 - desc SEL56 - 0x13C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL57 - desc SEL57 - 0x140 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL58 - desc SEL58 - 0x144 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL59 - desc SEL59 - 0x148 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL60 - desc SEL60 - 0x14C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL61 - desc SEL61 - 0x150 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL62 - desc SEL62 - 0x154 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL63 - desc SEL63 - 0x158 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL64 - desc SEL64 - 0x15C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL65 - desc SEL65 - 0x160 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL66 - desc SEL66 - 0x164 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL67 - desc SEL67 - 0x168 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL68 - desc SEL68 - 0x16C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL69 - desc SEL69 - 0x170 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL70 - desc SEL70 - 0x174 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL71 - desc SEL71 - 0x178 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL72 - desc SEL72 - 0x17C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL73 - desc SEL73 - 0x180 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL74 - desc SEL74 - 0x184 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL75 - desc SEL75 - 0x188 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL76 - desc SEL76 - 0x18C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL77 - desc SEL77 - 0x190 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL78 - desc SEL78 - 0x194 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL79 - desc SEL79 - 0x198 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL80 - desc SEL80 - 0x19C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL81 - desc SEL81 - 0x1A0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL82 - desc SEL82 - 0x1A4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL83 - desc SEL83 - 0x1A8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL84 - desc SEL84 - 0x1AC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL85 - desc SEL85 - 0x1B0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL86 - desc SEL86 - 0x1B4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL87 - desc SEL87 - 0x1B8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL88 - desc SEL88 - 0x1BC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL89 - desc SEL89 - 0x1C0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL90 - desc SEL90 - 0x1C4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL91 - desc SEL91 - 0x1C8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL92 - desc SEL92 - 0x1CC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL93 - desc SEL93 - 0x1D0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL94 - desc SEL94 - 0x1D4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL95 - desc SEL95 - 0x1D8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL96 - desc SEL96 - 0x1DC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL97 - desc SEL97 - 0x1E0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL98 - desc SEL98 - 0x1E4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL99 - desc SEL99 - 0x1E8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL100 - desc SEL100 - 0x1EC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL101 - desc SEL101 - 0x1F0 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL102 - desc SEL102 - 0x1F4 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL103 - desc SEL103 - 0x1F8 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL104 - desc SEL104 - 0x1FC - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL105 - desc SEL105 - 0x200 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL106 - desc SEL106 - 0x204 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL107 - desc SEL107 - 0x208 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL108 - desc SEL108 - 0x20C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL109 - desc SEL109 - 0x210 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL110 - desc SEL110 - 0x214 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL111 - desc SEL111 - 0x218 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL112 - desc SEL112 - 0x21C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL113 - desc SEL113 - 0x220 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL114 - desc SEL114 - 0x224 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL115 - desc SEL115 - 0x228 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL116 - desc SEL116 - 0x22C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL117 - desc SEL117 - 0x230 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL118 - desc SEL118 - 0x234 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL119 - desc SEL119 - 0x238 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL120 - desc SEL120 - 0x23C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL121 - desc SEL121 - 0x240 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL122 - desc SEL122 - 0x244 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL123 - desc SEL123 - 0x248 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL124 - desc SEL124 - 0x24C - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL125 - desc SEL125 - 0x250 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL126 - desc SEL126 - 0x254 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - SEL127 - desc SEL127 - 0x258 - 32 - read-write - 0x1FF - 0x1FF - - - INTSEL - desc INTSEL - 8 - 0 - read-write - - - - - VSSEL128 - desc VSSEL128 - 0x25C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL129 - desc VSSEL129 - 0x260 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL130 - desc VSSEL130 - 0x264 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL131 - desc VSSEL131 - 0x268 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL132 - desc VSSEL132 - 0x26C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL133 - desc VSSEL133 - 0x270 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL134 - desc VSSEL134 - 0x274 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL135 - desc VSSEL135 - 0x278 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL136 - desc VSSEL136 - 0x27C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL137 - desc VSSEL137 - 0x280 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL138 - desc VSSEL138 - 0x284 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL139 - desc VSSEL139 - 0x288 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL140 - desc VSSEL140 - 0x28C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL141 - desc VSSEL141 - 0x290 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL142 - desc VSSEL142 - 0x294 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - VSSEL143 - desc VSSEL143 - 0x298 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - VSEL0 - desc VSEL0 - 0 - 0 - read-write - - - VSEL1 - desc VSEL1 - 1 - 1 - read-write - - - VSEL2 - desc VSEL2 - 2 - 2 - read-write - - - VSEL3 - desc VSEL3 - 3 - 3 - read-write - - - VSEL4 - desc VSEL4 - 4 - 4 - read-write - - - VSEL5 - desc VSEL5 - 5 - 5 - read-write - - - VSEL6 - desc VSEL6 - 6 - 6 - read-write - - - VSEL7 - desc VSEL7 - 7 - 7 - read-write - - - VSEL8 - desc VSEL8 - 8 - 8 - read-write - - - VSEL9 - desc VSEL9 - 9 - 9 - read-write - - - VSEL10 - desc VSEL10 - 10 - 10 - read-write - - - VSEL11 - desc VSEL11 - 11 - 11 - read-write - - - VSEL12 - desc VSEL12 - 12 - 12 - read-write - - - VSEL13 - desc VSEL13 - 13 - 13 - read-write - - - VSEL14 - desc VSEL14 - 14 - 14 - read-write - - - VSEL15 - desc VSEL15 - 15 - 15 - read-write - - - VSEL16 - desc VSEL16 - 16 - 16 - read-write - - - VSEL17 - desc VSEL17 - 17 - 17 - read-write - - - VSEL18 - desc VSEL18 - 18 - 18 - read-write - - - VSEL19 - desc VSEL19 - 19 - 19 - read-write - - - VSEL20 - desc VSEL20 - 20 - 20 - read-write - - - VSEL21 - desc VSEL21 - 21 - 21 - read-write - - - VSEL22 - desc VSEL22 - 22 - 22 - read-write - - - VSEL23 - desc VSEL23 - 23 - 23 - read-write - - - VSEL24 - desc VSEL24 - 24 - 24 - read-write - - - VSEL25 - desc VSEL25 - 25 - 25 - read-write - - - VSEL26 - desc VSEL26 - 26 - 26 - read-write - - - VSEL27 - desc VSEL27 - 27 - 27 - read-write - - - VSEL28 - desc VSEL28 - 28 - 28 - read-write - - - VSEL29 - desc VSEL29 - 29 - 29 - read-write - - - VSEL30 - desc VSEL30 - 30 - 30 - read-write - - - VSEL31 - desc VSEL31 - 31 - 31 - read-write - - - - - SWIER - desc SWIER - 0x29C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - SWIE0 - desc SWIE0 - 0 - 0 - read-write - - - SWIE1 - desc SWIE1 - 1 - 1 - read-write - - - SWIE2 - desc SWIE2 - 2 - 2 - read-write - - - SWIE3 - desc SWIE3 - 3 - 3 - read-write - - - SWIE4 - desc SWIE4 - 4 - 4 - read-write - - - SWIE5 - desc SWIE5 - 5 - 5 - read-write - - - SWIE6 - desc SWIE6 - 6 - 6 - read-write - - - SWIE7 - desc SWIE7 - 7 - 7 - read-write - - - SWIE8 - desc SWIE8 - 8 - 8 - read-write - - - SWIE9 - desc SWIE9 - 9 - 9 - read-write - - - SWIE10 - desc SWIE10 - 10 - 10 - read-write - - - SWIE11 - desc SWIE11 - 11 - 11 - read-write - - - SWIE12 - desc SWIE12 - 12 - 12 - read-write - - - SWIE13 - desc SWIE13 - 13 - 13 - read-write - - - SWIE14 - desc SWIE14 - 14 - 14 - read-write - - - SWIE15 - desc SWIE15 - 15 - 15 - read-write - - - SWIE16 - desc SWIE16 - 16 - 16 - read-write - - - SWIE17 - desc SWIE17 - 17 - 17 - read-write - - - SWIE18 - desc SWIE18 - 18 - 18 - read-write - - - SWIE19 - desc SWIE19 - 19 - 19 - read-write - - - SWIE20 - desc SWIE20 - 20 - 20 - read-write - - - SWIE21 - desc SWIE21 - 21 - 21 - read-write - - - SWIE22 - desc SWIE22 - 22 - 22 - read-write - - - SWIE23 - desc SWIE23 - 23 - 23 - read-write - - - SWIE24 - desc SWIE24 - 24 - 24 - read-write - - - SWIE25 - desc SWIE25 - 25 - 25 - read-write - - - SWIE26 - desc SWIE26 - 26 - 26 - read-write - - - SWIE27 - desc SWIE27 - 27 - 27 - read-write - - - SWIE28 - desc SWIE28 - 28 - 28 - read-write - - - SWIE29 - desc SWIE29 - 29 - 29 - read-write - - - SWIE30 - desc SWIE30 - 30 - 30 - read-write - - - SWIE31 - desc SWIE31 - 31 - 31 - read-write - - - - - EVTER - desc EVTER - 0x2A0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - EVTE0 - desc EVTE0 - 0 - 0 - read-write - - - EVTE1 - desc EVTE1 - 1 - 1 - read-write - - - EVTE2 - desc EVTE2 - 2 - 2 - read-write - - - EVTE3 - desc EVTE3 - 3 - 3 - read-write - - - EVTE4 - desc EVTE4 - 4 - 4 - read-write - - - EVTE5 - desc EVTE5 - 5 - 5 - read-write - - - EVTE6 - desc EVTE6 - 6 - 6 - read-write - - - EVTE7 - desc EVTE7 - 7 - 7 - read-write - - - EVTE8 - desc EVTE8 - 8 - 8 - read-write - - - EVTE9 - desc EVTE9 - 9 - 9 - read-write - - - EVTE10 - desc EVTE10 - 10 - 10 - read-write - - - EVTE11 - desc EVTE11 - 11 - 11 - read-write - - - EVTE12 - desc EVTE12 - 12 - 12 - read-write - - - EVTE13 - desc EVTE13 - 13 - 13 - read-write - - - EVTE14 - desc EVTE14 - 14 - 14 - read-write - - - EVTE15 - desc EVTE15 - 15 - 15 - read-write - - - EVTE16 - desc EVTE16 - 16 - 16 - read-write - - - EVTE17 - desc EVTE17 - 17 - 17 - read-write - - - EVTE18 - desc EVTE18 - 18 - 18 - read-write - - - EVTE19 - desc EVTE19 - 19 - 19 - read-write - - - EVTE20 - desc EVTE20 - 20 - 20 - read-write - - - EVTE21 - desc EVTE21 - 21 - 21 - read-write - - - EVTE22 - desc EVTE22 - 22 - 22 - read-write - - - EVTE23 - desc EVTE23 - 23 - 23 - read-write - - - EVTE24 - desc EVTE24 - 24 - 24 - read-write - - - EVTE25 - desc EVTE25 - 25 - 25 - read-write - - - EVTE26 - desc EVTE26 - 26 - 26 - read-write - - - EVTE27 - desc EVTE27 - 27 - 27 - read-write - - - EVTE28 - desc EVTE28 - 28 - 28 - read-write - - - EVTE29 - desc EVTE29 - 29 - 29 - read-write - - - EVTE30 - desc EVTE30 - 30 - 30 - read-write - - - EVTE31 - desc EVTE31 - 31 - 31 - read-write - - - - - IER - desc IER - 0x2A4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - IER0 - desc IER0 - 0 - 0 - read-write - - - IER1 - desc IER1 - 1 - 1 - read-write - - - IER2 - desc IER2 - 2 - 2 - read-write - - - IER3 - desc IER3 - 3 - 3 - read-write - - - IER4 - desc IER4 - 4 - 4 - read-write - - - IER5 - desc IER5 - 5 - 5 - read-write - - - IER6 - desc IER6 - 6 - 6 - read-write - - - IER7 - desc IER7 - 7 - 7 - read-write - - - IER8 - desc IER8 - 8 - 8 - read-write - - - IER9 - desc IER9 - 9 - 9 - read-write - - - IER10 - desc IER10 - 10 - 10 - read-write - - - IER11 - desc IER11 - 11 - 11 - read-write - - - IER12 - desc IER12 - 12 - 12 - read-write - - - IER13 - desc IER13 - 13 - 13 - read-write - - - IER14 - desc IER14 - 14 - 14 - read-write - - - IER15 - desc IER15 - 15 - 15 - read-write - - - IER16 - desc IER16 - 16 - 16 - read-write - - - IER17 - desc IER17 - 17 - 17 - read-write - - - IER18 - desc IER18 - 18 - 18 - read-write - - - IER19 - desc IER19 - 19 - 19 - read-write - - - IER20 - desc IER20 - 20 - 20 - read-write - - - IER21 - desc IER21 - 21 - 21 - read-write - - - IER22 - desc IER22 - 22 - 22 - read-write - - - IER23 - desc IER23 - 23 - 23 - read-write - - - IER24 - desc IER24 - 24 - 24 - read-write - - - IER25 - desc IER25 - 25 - 25 - read-write - - - IER26 - desc IER26 - 26 - 26 - read-write - - - IER27 - desc IER27 - 27 - 27 - read-write - - - IER28 - desc IER28 - 28 - 28 - read-write - - - IER29 - desc IER29 - 29 - 29 - read-write - - - IER30 - desc IER30 - 30 - 30 - read-write - - - IER31 - desc IER31 - 31 - 31 - read-write - - - - - - - KEYSCAN - desc KEYSCAN - 0x40050C00 - - 0x0 - 0xC - - - - SCR - desc SCR - 0x0 - 32 - read-write - 0x0 - 0xFF37FFFF - - - KEYINSEL - desc KEYINSEL - 15 - 0 - read-write - - - KEYOUTSEL - desc KEYOUTSEL - 18 - 16 - read-write - - - CKSEL - desc CKSEL - 21 - 20 - read-write - - - T_LLEVEL - desc T_LLEVEL - 28 - 24 - read-write - - - T_HIZ - desc T_HIZ - 31 - 29 - read-write - - - - - SER - desc SER - 0x4 - 32 - read-write - 0x0 - 0x1 - - - SEN - desc SEN - 0 - 0 - read-write - - - - - SSR - desc SSR - 0x8 - 32 - read-write - 0x0 - 0x7 - - - INDEX - desc INDEX - 2 - 0 - read-write - - - - - - - MAU - desc MAU - 0x40055000 - - 0x0 - 0x18 - - - - CSR - desc CSR - 0x0 - 32 - read-write - 0x0 - 0x1F0B - - - START - desc START - 0 - 0 - read-write - - - INTEN - desc INTEN - 1 - 1 - read-write - - - BUSY - desc BUSY - 3 - 3 - read-write - - - SHIFT - desc SHIFT - 12 - 8 - read-write - - - - - DTR0 - desc DTR0 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - RTR0 - desc RTR0 - 0xC - 32 - read-write - 0x0 - 0x1FFFF - - - SQRT_DOUT - desc SQRT_DOUT - 16 - 0 - read-write - - - - - DTR1 - desc DTR1 - 0x10 - 32 - read-write - 0x0 - 0xFFF - - - SIN_DIN - desc SIN_DIN - 11 - 0 - read-write - - - - - RTR1 - desc RTR1 - 0x14 - 32 - read-write - 0x0 - 0xFFFF - - - SIN_DOUT - desc SIN_DOUT - 15 - 0 - read-write - - - - - - - MPU - desc MPU - 0x40050000 - ETH - - 0x0 - 0xA0 - - - - RGD0 - desc RGD0 - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD1 - desc RGD1 - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD2 - desc RGD2 - 0x8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD3 - desc RGD3 - 0xC - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD4 - desc RGD4 - 0x10 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD5 - desc RGD5 - 0x14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD6 - desc RGD6 - 0x18 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD7 - desc RGD7 - 0x1C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD8 - desc RGD8 - 0x20 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD9 - desc RGD9 - 0x24 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD10 - desc RGD10 - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD11 - desc RGD11 - 0x2C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD12 - desc RGD12 - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD13 - desc RGD13 - 0x34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD14 - desc RGD14 - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - RGD15 - desc RGD15 - 0x3C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - MPURGSIZE - desc MPURGSIZE - 4 - 0 - read-write - - - MPURGADDR - desc MPURGADDR - 31 - 5 - read-write - - - - - SR - desc SR - 0x40 - 32 - read-only - 0x0 - 0x1F - - - SMPU1EAF - desc SMPU1EAF - 0 - 0 - read-only - - - SMPU2EAF - desc SMPU2EAF - 1 - 1 - read-only - - - FMPUEAF - desc FMPUEAF - 2 - 2 - read-only - - - HMPUEAF - desc HMPUEAF - 3 - 3 - read-only - - - EMPUEAF - desc EMPUEAF - 4 - 4 - read-only - - - - - ECLR - desc ECLR - 0x44 - 32 - write-only - 0x0 - 0x1F - - - SMPU1ECLR - desc SMPU1ECLR - 0 - 0 - write-only - - - SMPU2ECLR - desc SMPU2ECLR - 1 - 1 - write-only - - - FMPUECLR - desc FMPUECLR - 2 - 2 - write-only - - - HMPUECLR - desc HMPUECLR - 3 - 3 - write-only - - - EMPUECLR - desc EMPUECLR - 4 - 4 - write-only - - - - - WP - desc WP - 0x48 - 32 - read-write - 0x0 - 0xFFFF - - - MPUWE - desc MPUWE - 0 - 0 - read-write - - - WKEY - desc WKEY - 15 - 1 - write-only - - - - - IPPR - desc IPPR - 0x4C - 32 - read-write - 0x0 - 0xBFFFF3FF - - - AESRDP - desc AESRDP - 0 - 0 - read-write - - - AESWRP - desc AESWRP - 1 - 1 - read-write - - - HASHRDP - desc HASHRDP - 2 - 2 - read-write - - - HASHWRP - desc HASHWRP - 3 - 3 - read-write - - - TRNGRDP - desc TRNGRDP - 4 - 4 - read-write - - - TRNGWRP - desc TRNGWRP - 5 - 5 - read-write - - - CRCRDP - desc CRCRDP - 6 - 6 - read-write - - - CRCWRP - desc CRCWRP - 7 - 7 - read-write - - - EFMRDP - desc EFMRDP - 8 - 8 - read-write - - - EFMWRP - desc EFMWRP - 9 - 9 - read-write - - - WDTRDP - desc WDTRDP - 12 - 12 - read-write - - - WDTWRP - desc WDTWRP - 13 - 13 - read-write - - - SWDTRDP - desc SWDTRDP - 14 - 14 - read-write - - - SWDTWRP - desc SWDTWRP - 15 - 15 - read-write - - - BKSRAMRDP - desc BKSRAMRDP - 16 - 16 - read-write - - - BKSRAMWRP - desc BKSRAMWRP - 17 - 17 - read-write - - - RTCRDP - desc RTCRDP - 18 - 18 - read-write - - - RTCWRP - desc RTCWRP - 19 - 19 - read-write - - - DMPURDP - desc DMPURDP - 20 - 20 - read-write - - - DMPUWRP - desc DMPUWRP - 21 - 21 - read-write - - - SRAMCRDP - desc SRAMCRDP - 22 - 22 - read-write - - - SRAMCWRP - desc SRAMCWRP - 23 - 23 - read-write - - - INTCRDP - desc INTCRDP - 24 - 24 - read-write - - - INTCWRP - desc INTCWRP - 25 - 25 - read-write - - - SYSCRDP - desc SYSCRDP - 26 - 26 - read-write - - - SYSCWRP - desc SYSCWRP - 27 - 27 - read-write - - - MSTPRDP - desc MSTPRDP - 28 - 28 - read-write - - - MSPTWRP - desc MSPTWRP - 29 - 29 - read-write - - - BUSERRE - desc BUSERRE - 31 - 31 - read-write - - - - - S1RGE - desc S1RGE - 0x50 - 32 - read-write - 0x0 - 0xFFFF - - - S1RG0E - desc S1RG0E - 0 - 0 - read-write - - - S1RG1E - desc S1RG1E - 1 - 1 - read-write - - - S1RG2E - desc S1RG2E - 2 - 2 - read-write - - - S1RG3E - desc S1RG3E - 3 - 3 - read-write - - - S1RG4E - desc S1RG4E - 4 - 4 - read-write - - - S1RG5E - desc S1RG5E - 5 - 5 - read-write - - - S1RG6E - desc S1RG6E - 6 - 6 - read-write - - - S1RG7E - desc S1RG7E - 7 - 7 - read-write - - - S1RG8E - desc S1RG8E - 8 - 8 - read-write - - - S1RG9E - desc S1RG9E - 9 - 9 - read-write - - - S1RG10E - desc S1RG10E - 10 - 10 - read-write - - - S1RG11E - desc S1RG11E - 11 - 11 - read-write - - - S1RG12E - desc S1RG12E - 12 - 12 - read-write - - - S1RG13E - desc S1RG13E - 13 - 13 - read-write - - - S1RG14E - desc S1RG14E - 14 - 14 - read-write - - - S1RG15E - desc S1RG15E - 15 - 15 - read-write - - - - - S1RGWP - desc S1RGWP - 0x54 - 32 - read-write - 0x0 - 0xFFFF - - - S1RG0WP - desc S1RG0WP - 0 - 0 - read-write - - - S1RG1WP - desc S1RG1WP - 1 - 1 - read-write - - - S1RG2WP - desc S1RG2WP - 2 - 2 - read-write - - - S1RG3WP - desc S1RG3WP - 3 - 3 - read-write - - - S1RG4WP - desc S1RG4WP - 4 - 4 - read-write - - - S1RG5WP - desc S1RG5WP - 5 - 5 - read-write - - - S1RG6WP - desc S1RG6WP - 6 - 6 - read-write - - - S1RG7WP - desc S1RG7WP - 7 - 7 - read-write - - - S1RG8WP - desc S1RG8WP - 8 - 8 - read-write - - - S1RG9WP - desc S1RG9WP - 9 - 9 - read-write - - - S1RG10WP - desc S1RG10WP - 10 - 10 - read-write - - - S1RG11WP - desc S1RG11WP - 11 - 11 - read-write - - - S1RG12WP - desc S1RG12WP - 12 - 12 - read-write - - - S1RG13WP - desc S1RG13WP - 13 - 13 - read-write - - - S1RG14WP - desc S1RG14WP - 14 - 14 - read-write - - - S1RG15WP - desc S1RG15WP - 15 - 15 - read-write - - - - - S1RGRP - desc S1RGRP - 0x58 - 32 - read-write - 0x0 - 0xFFFF - - - S1RG0RP - desc S1RG0RP - 0 - 0 - read-write - - - S1RG1RP - desc S1RG1RP - 1 - 1 - read-write - - - S1RG2RP - desc S1RG2RP - 2 - 2 - read-write - - - S1RG3RP - desc S1RG3RP - 3 - 3 - read-write - - - S1RG4RP - desc S1RG4RP - 4 - 4 - read-write - - - S1RG5RP - desc S1RG5RP - 5 - 5 - read-write - - - S1RG6RP - desc S1RG6RP - 6 - 6 - read-write - - - S1RG7RP - desc S1RG7RP - 7 - 7 - read-write - - - S1RG8RP - desc S1RG8RP - 8 - 8 - read-write - - - S1RG9RP - desc S1RG9RP - 9 - 9 - read-write - - - S1RG10RP - desc S1RG10RP - 10 - 10 - read-write - - - S1RG11RP - desc S1RG11RP - 11 - 11 - read-write - - - S1RG12RP - desc S1RG12RP - 12 - 12 - read-write - - - S1RG13RP - desc S1RG13RP - 13 - 13 - read-write - - - S1RG14RP - desc S1RG14RP - 14 - 14 - read-write - - - S1RG15RP - desc S1RG15RP - 15 - 15 - read-write - - - - - S1CR - desc S1CR - 0x5C - 32 - read-write - 0x0 - 0x8F - - - SMPU1BRP - desc SMPU1BRP - 0 - 0 - read-write - - - SMPU1BWP - desc SMPU1BWP - 1 - 1 - read-write - - - SMPU1ACT - desc SMPU1ACT - 3 - 2 - read-write - - - SMPU1E - desc SMPU1E - 7 - 7 - read-write - - - - - S2RGE - desc S2RGE - 0x60 - 32 - read-write - 0x0 - 0xFFFF - - - S2RG0E - desc S2RG0E - 0 - 0 - read-write - - - S2RG1E - desc S2RG1E - 1 - 1 - read-write - - - S2RG2E - desc S2RG2E - 2 - 2 - read-write - - - S2RG3E - desc S2RG3E - 3 - 3 - read-write - - - S2RG4E - desc S2RG4E - 4 - 4 - read-write - - - S2RG5E - desc S2RG5E - 5 - 5 - read-write - - - S2RG6E - desc S2RG6E - 6 - 6 - read-write - - - S2RG7E - desc S2RG7E - 7 - 7 - read-write - - - S2RG8E - desc S2RG8E - 8 - 8 - read-write - - - S2RG9E - desc S2RG9E - 9 - 9 - read-write - - - S2RG10E - desc S2RG10E - 10 - 10 - read-write - - - S2RG11E - desc S2RG11E - 11 - 11 - read-write - - - S2RG12E - desc S2RG12E - 12 - 12 - read-write - - - S2RG13E - desc S2RG13E - 13 - 13 - read-write - - - S2RG14E - desc S2RG14E - 14 - 14 - read-write - - - S2RG15E - desc S2RG15E - 15 - 15 - read-write - - - - - S2RGWP - desc S2RGWP - 0x64 - 32 - read-write - 0x0 - 0xFFFF - - - S2RG0WP - desc S2RG0WP - 0 - 0 - read-write - - - S2RG1WP - desc S2RG1WP - 1 - 1 - read-write - - - S2RG2WP - desc S2RG2WP - 2 - 2 - read-write - - - S2RG3WP - desc S2RG3WP - 3 - 3 - read-write - - - S2RG4WP - desc S2RG4WP - 4 - 4 - read-write - - - S2RG5WP - desc S2RG5WP - 5 - 5 - read-write - - - S2RG6WP - desc S2RG6WP - 6 - 6 - read-write - - - S2RG7WP - desc S2RG7WP - 7 - 7 - read-write - - - S2RG8WP - desc S2RG8WP - 8 - 8 - read-write - - - S2RG9WP - desc S2RG9WP - 9 - 9 - read-write - - - S2RG10WP - desc S2RG10WP - 10 - 10 - read-write - - - S2RG11WP - desc S2RG11WP - 11 - 11 - read-write - - - S2RG12WP - desc S2RG12WP - 12 - 12 - read-write - - - S2RG13WP - desc S2RG13WP - 13 - 13 - read-write - - - S2RG14WP - desc S2RG14WP - 14 - 14 - read-write - - - S2RG15WP - desc S2RG15WP - 15 - 15 - read-write - - - - - S2RGRP - desc S2RGRP - 0x68 - 32 - read-write - 0x0 - 0xFFFF - - - S2RG0RP - desc S2RG0RP - 0 - 0 - read-write - - - S2RG1RP - desc S2RG1RP - 1 - 1 - read-write - - - S2RG2RP - desc S2RG2RP - 2 - 2 - read-write - - - S2RG3RP - desc S2RG3RP - 3 - 3 - read-write - - - S2RG4RP - desc S2RG4RP - 4 - 4 - read-write - - - S2RG5RP - desc S2RG5RP - 5 - 5 - read-write - - - S2RG6RP - desc S2RG6RP - 6 - 6 - read-write - - - S2RG7RP - desc S2RG7RP - 7 - 7 - read-write - - - S2RG8RP - desc S2RG8RP - 8 - 8 - read-write - - - S2RG9RP - desc S2RG9RP - 9 - 9 - read-write - - - S2RG10RP - desc S2RG10RP - 10 - 10 - read-write - - - S2RG11RP - desc S2RG11RP - 11 - 11 - read-write - - - S2RG12RP - desc S2RG12RP - 12 - 12 - read-write - - - S2RG13RP - desc S2RG13RP - 13 - 13 - read-write - - - S2RG14RP - desc S2RG14RP - 14 - 14 - read-write - - - S2RG15RP - desc S2RG15RP - 15 - 15 - read-write - - - - - S2CR - desc S2CR - 0x6C - 32 - read-write - 0x0 - 0x8F - - - SMPU2BRP - desc SMPU2BRP - 0 - 0 - read-write - - - SMPU2BWP - desc SMPU2BWP - 1 - 1 - read-write - - - SMPU2ACT - desc SMPU2ACT - 3 - 2 - read-write - - - SMPU2E - desc SMPU2E - 7 - 7 - read-write - - - - - FRGE - desc FRGE - 0x70 - 32 - read-write - 0x0 - 0xFF - - - FRG0E - desc FRG0E - 0 - 0 - read-write - - - FRG1E - desc FRG1E - 1 - 1 - read-write - - - FRG2E - desc FRG2E - 2 - 2 - read-write - - - FRG3E - desc FRG3E - 3 - 3 - read-write - - - FRG4E - desc FRG4E - 4 - 4 - read-write - - - FRG5E - desc FRG5E - 5 - 5 - read-write - - - FRG6E - desc FRG6E - 6 - 6 - read-write - - - FRG7E - desc FRG7E - 7 - 7 - read-write - - - - - FRGWP - desc FRGWP - 0x74 - 32 - read-write - 0x0 - 0xFF - - - FRG0WP - desc FRG0WP - 0 - 0 - read-write - - - FRG1WP - desc FRG1WP - 1 - 1 - read-write - - - FRG2WP - desc FRG2WP - 2 - 2 - read-write - - - FRG3WP - desc FRG3WP - 3 - 3 - read-write - - - FRG4WP - desc FRG4WP - 4 - 4 - read-write - - - FRG5WP - desc FRG5WP - 5 - 5 - read-write - - - FRG6WP - desc FRG6WP - 6 - 6 - read-write - - - FRG7WP - desc FRG7WP - 7 - 7 - read-write - - - - - FRGRP - desc FRGRP - 0x78 - 32 - read-write - 0x0 - 0xFF - - - FRG0RP - desc FRG0RP - 0 - 0 - read-write - - - FRG1RP - desc FRG1RP - 1 - 1 - read-write - - - FRG2RP - desc FRG2RP - 2 - 2 - read-write - - - FRG3RP - desc FRG3RP - 3 - 3 - read-write - - - FRG4RP - desc FRG4RP - 4 - 4 - read-write - - - FRG5RP - desc FRG5RP - 5 - 5 - read-write - - - FRG6RP - desc FRG6RP - 6 - 6 - read-write - - - FRG7RP - desc FRG7RP - 7 - 7 - read-write - - - - - FCR - desc FCR - 0x7C - 32 - read-write - 0x0 - 0x8F - - - FMPUBRP - desc FMPUBRP - 0 - 0 - read-write - - - FMPUBWP - desc FMPUBWP - 1 - 1 - read-write - - - FMPUACT - desc FMPUACT - 3 - 2 - read-write - - - FMPUE - desc FMPUE - 7 - 7 - read-write - - - - - HRGE - desc HRGE - 0x80 - 32 - read-write - 0x0 - 0xFF - - - HRG0E - desc HRG0E - 0 - 0 - read-write - - - HRG1E - desc HRG1E - 1 - 1 - read-write - - - HRG2E - desc HRG2E - 2 - 2 - read-write - - - HRG3E - desc HRG3E - 3 - 3 - read-write - - - HRG4E - desc HRG4E - 4 - 4 - read-write - - - HRG5E - desc HRG5E - 5 - 5 - read-write - - - HRG6E - desc HRG6E - 6 - 6 - read-write - - - HRG7E - desc HRG7E - 7 - 7 - read-write - - - - - HRGWP - desc HRGWP - 0x84 - 32 - read-write - 0x0 - 0xFF - - - HRG0WP - desc HRG0WP - 0 - 0 - read-write - - - HRG1WP - desc HRG1WP - 1 - 1 - read-write - - - HRG2WP - desc HRG2WP - 2 - 2 - read-write - - - HRG3WP - desc HRG3WP - 3 - 3 - read-write - - - HRG4WP - desc HRG4WP - 4 - 4 - read-write - - - HRG5WP - desc HRG5WP - 5 - 5 - read-write - - - HRG6WP - desc HRG6WP - 6 - 6 - read-write - - - HRG7WP - desc HRG7WP - 7 - 7 - read-write - - - - - HRGRP - desc HRGRP - 0x88 - 32 - read-write - 0x0 - 0xFF - - - HRG0RP - desc HRG0RP - 0 - 0 - read-write - - - HRG1RP - desc HRG1RP - 1 - 1 - read-write - - - HRG2RP - desc HRG2RP - 2 - 2 - read-write - - - HRG3RP - desc HRG3RP - 3 - 3 - read-write - - - HRG4RP - desc HRG4RP - 4 - 4 - read-write - - - HRG5RP - desc HRG5RP - 5 - 5 - read-write - - - HRG6RP - desc HRG6RP - 6 - 6 - read-write - - - HRG7RP - desc HRG7RP - 7 - 7 - read-write - - - - - HCR - desc HCR - 0x8C - 32 - read-write - 0x0 - 0x8F - - - HMPUBRP - desc HMPUBRP - 0 - 0 - read-write - - - HMPUBWP - desc HMPUBWP - 1 - 1 - read-write - - - HMPUACT - desc HMPUACT - 3 - 2 - read-write - - - HMPUE - desc HMPUE - 7 - 7 - read-write - - - - - ERGE - desc ERGE - 0x90 - 32 - read-write - 0x0 - 0xFF - - - ERG0E - desc ERG0E - 0 - 0 - read-write - - - ERG1E - desc ERG1E - 1 - 1 - read-write - - - ERG2E - desc ERG2E - 2 - 2 - read-write - - - ERG3E - desc ERG3E - 3 - 3 - read-write - - - ERG4E - desc ERG4E - 4 - 4 - read-write - - - ERG5E - desc ERG5E - 5 - 5 - read-write - - - ERG6E - desc ERG6E - 6 - 6 - read-write - - - ERG7E - desc ERG7E - 7 - 7 - read-write - - - - - ERGWP - desc ERGWP - 0x94 - 32 - read-write - 0x0 - 0xFF - - - ERG0WP - desc ERG0WP - 0 - 0 - read-write - - - ERG1WP - desc ERG1WP - 1 - 1 - read-write - - - ERG2WP - desc ERG2WP - 2 - 2 - read-write - - - ERG3WP - desc ERG3WP - 3 - 3 - read-write - - - ERG4WP - desc ERG4WP - 4 - 4 - read-write - - - ERG5WP - desc ERG5WP - 5 - 5 - read-write - - - ERG6WP - desc ERG6WP - 6 - 6 - read-write - - - ERG7WP - desc ERG7WP - 7 - 7 - read-write - - - - - ERGRP - desc ERGRP - 0x98 - 32 - read-write - 0x0 - 0xFF - - - ERG0RP - desc ERG0RP - 0 - 0 - read-write - - - ERG1RP - desc ERG1RP - 1 - 1 - read-write - - - ERG2RP - desc ERG2RP - 2 - 2 - read-write - - - ERG3RP - desc ERG3RP - 3 - 3 - read-write - - - ERG4RP - desc ERG4RP - 4 - 4 - read-write - - - ERG5RP - desc ERG5RP - 5 - 5 - read-write - - - ERG6RP - desc ERG6RP - 6 - 6 - read-write - - - ERG7RP - desc ERG7RP - 7 - 7 - read-write - - - - - ECR - desc ECR - 0x9C - 32 - read-write - 0x0 - 0x8F - - - EMPUBRP - desc EMPUBRP - 0 - 0 - read-write - - - EMPUBWP - desc EMPUBWP - 1 - 1 - read-write - - - EMPUACT - desc EMPUACT - 3 - 2 - read-write - - - EMPUE - desc EMPUE - 7 - 7 - read-write - - - - - - - NFC - desc NFC - 0x88100000 - - 0x0 - 0x8180 - - - - DATR_BASE - desc DATR_BASE - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CMDR - desc CMDR - 0x8000 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CMD - desc CMD - 7 - 0 - read-write - - - ARG - desc ARG - 31 - 8 - read-write - - - - - IDXR0 - desc IDXR0 - 0x8004 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IENR - desc IENR - 0x8030 - 32 - read-write - 0x0 - 0xFFD3 - - - ECCEUEN - desc ECCEUEN - 0 - 0 - read-write - - - ECCECEN - desc ECCECEN - 1 - 1 - read-write - - - ECCCEN - desc ECCCEN - 4 - 4 - read-write - - - ECCEEN - desc ECCEEN - 6 - 6 - read-write - - - ECCDIS - desc ECCDIS - 7 - 7 - read-write - - - RBEN - desc RBEN - 15 - 8 - read-write - - - - - ISTR - desc ISTR - 0x8034 - 32 - read-write - 0x0 - 0xFF53 - - - ECCEUST - desc ECCEUST - 0 - 0 - read-write - - - ECCECST - desc ECCECST - 1 - 1 - read-write - - - ECCCST - desc ECCCST - 4 - 4 - read-write - - - ECCEST - desc ECCEST - 6 - 6 - read-write - - - RBST - desc RBST - 15 - 8 - read-write - - - - - IRSR - desc IRSR - 0x8038 - 32 - read-write - 0x0 - 0xFF53 - - - ECCEURS - desc ECCEURS - 0 - 0 - read-write - - - ECCECRS - desc ECCECRS - 1 - 1 - read-write - - - ECCCRS - desc ECCCRS - 4 - 4 - read-write - - - ECCERS - desc ECCERS - 6 - 6 - read-write - - - RBRS - desc RBRS - 15 - 8 - read-write - - - - - IDXR1 - desc IDXR1 - 0x8048 - 32 - read-write - 0x0 - 0xFF - - - IDX1 - desc IDX1 - 7 - 0 - read-write - - - - - TMCR0 - desc TMCR0 - 0x804C - 32 - read-write - 0x3030202 - 0xFFFFFFFF - - - TS - desc TS - 7 - 0 - read-write - - - TWP - desc TWP - 15 - 8 - read-write - - - TRP - desc TRP - 23 - 16 - read-write - - - TH - desc TH - 31 - 24 - read-write - - - - - TMCR1 - desc TMCR1 - 0x8050 - 32 - read-write - 0x28080303 - 0xFFFFFFFF - - - TWH - desc TWH - 7 - 0 - read-write - - - TRH - desc TRH - 15 - 8 - read-write - - - TRR - desc TRR - 23 - 16 - read-write - - - TWB - desc TWB - 31 - 24 - read-write - - - - - BACR - desc BACR - 0x8054 - 32 - read-write - 0x2187 - 0xFF3FCF - - - SIZE - desc SIZE - 2 - 0 - read-write - - - B16BIT - desc B16BIT - 3 - 3 - read-write - - - BANK - desc BANK - 7 - 6 - read-write - - - PAGE - desc PAGE - 9 - 8 - read-write - - - WP - desc WP - 10 - 10 - read-write - - - ECCM - desc ECCM - 12 - 11 - read-write - - - RAC - desc RAC - 13 - 13 - read-write - - - SCS - desc SCS - 23 - 16 - read-write - - - - - TMCR2 - desc TMCR2 - 0x805C - 32 - read-write - 0x3050D03 - 0xFFFFFFFF - - - TCCS - desc TCCS - 7 - 0 - read-write - - - TWTR - desc TWTR - 15 - 8 - read-write - - - TRTW - desc TRTW - 23 - 16 - read-write - - - TADL - desc TADL - 31 - 24 - read-write - - - - - ECCR0 - desc ECCR0 - 0x8060 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR1 - desc ECCR1 - 0x8064 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR2 - desc ECCR2 - 0x8068 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR3 - desc ECCR3 - 0x806C - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR4 - desc ECCR4 - 0x8070 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR5 - desc ECCR5 - 0x8074 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECCR6 - desc ECCR6 - 0x8078 - 32 - read-only - 0x0 - 0x3FFF - - - ERRLOC - desc ERRLOC - 11 - 0 - read-only - - - SE - desc SE - 12 - 12 - read-only - - - ME - desc ME - 13 - 13 - read-only - - - - - ECC_STAT - desc ECC_STAT - 0x807C - 32 - read-only - 0x0 - 0xFFFF - - - ERRSEC - desc ERRSEC - 15 - 0 - read-only - - - - - ECC_SYND0_0 - desc ECC_SYND0_0 - 0x8080 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND0_1 - desc ECC_SYND0_1 - 0x8084 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND0_2 - desc ECC_SYND0_2 - 0x8088 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND0_3 - desc ECC_SYND0_3 - 0x808C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND1_0 - desc ECC_SYND1_0 - 0x8090 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND1_1 - desc ECC_SYND1_1 - 0x8094 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND1_2 - desc ECC_SYND1_2 - 0x8098 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND1_3 - desc ECC_SYND1_3 - 0x809C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND2_0 - desc ECC_SYND2_0 - 0x80A0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND2_1 - desc ECC_SYND2_1 - 0x80A4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND2_2 - desc ECC_SYND2_2 - 0x80A8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND2_3 - desc ECC_SYND2_3 - 0x80AC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND3_0 - desc ECC_SYND3_0 - 0x80B0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND3_1 - desc ECC_SYND3_1 - 0x80B4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND3_2 - desc ECC_SYND3_2 - 0x80B8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND3_3 - desc ECC_SYND3_3 - 0x80BC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND4_0 - desc ECC_SYND4_0 - 0x80C0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND4_1 - desc ECC_SYND4_1 - 0x80C4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND4_2 - desc ECC_SYND4_2 - 0x80C8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND4_3 - desc ECC_SYND4_3 - 0x80CC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND5_0 - desc ECC_SYND5_0 - 0x80D0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND5_1 - desc ECC_SYND5_1 - 0x80D4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND5_2 - desc ECC_SYND5_2 - 0x80D8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND5_3 - desc ECC_SYND5_3 - 0x80DC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND6_0 - desc ECC_SYND6_0 - 0x80E0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND6_1 - desc ECC_SYND6_1 - 0x80E4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - RESV - desc RESV - 31 - 31 - read-write - - - - - ECC_SYND6_2 - desc ECC_SYND6_2 - 0x80E8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND6_3 - desc ECC_SYND6_3 - 0x80EC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND7_0 - desc ECC_SYND7_0 - 0x80F0 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND7_1 - desc ECC_SYND7_1 - 0x80F4 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND7_2 - desc ECC_SYND7_2 - 0x80F8 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND7_3 - desc ECC_SYND7_3 - 0x80FC - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND8_0 - desc ECC_SYND8_0 - 0x8100 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND8_1 - desc ECC_SYND8_1 - 0x8104 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND8_2 - desc ECC_SYND8_2 - 0x8108 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND8_3 - desc ECC_SYND8_3 - 0x810C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND9_0 - desc ECC_SYND9_0 - 0x8110 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND9_1 - desc ECC_SYND9_1 - 0x8114 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND9_2 - desc ECC_SYND9_2 - 0x8118 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND9_3 - desc ECC_SYND9_3 - 0x811C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND10_0 - desc ECC_SYND10_0 - 0x8120 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND10_1 - desc ECC_SYND10_1 - 0x8124 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND10_2 - desc ECC_SYND10_2 - 0x8128 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND10_3 - desc ECC_SYND10_3 - 0x812C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND11_0 - desc ECC_SYND11_0 - 0x8130 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND11_1 - desc ECC_SYND11_1 - 0x8134 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND11_2 - desc ECC_SYND11_2 - 0x8138 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND11_3 - desc ECC_SYND11_3 - 0x813C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND12_0 - desc ECC_SYND12_0 - 0x8140 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND12_1 - desc ECC_SYND12_1 - 0x8144 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND12_2 - desc ECC_SYND12_2 - 0x8148 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND12_3 - desc ECC_SYND12_3 - 0x814C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND13_0 - desc ECC_SYND13_0 - 0x8150 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND13_1 - desc ECC_SYND13_1 - 0x8154 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND13_2 - desc ECC_SYND13_2 - 0x8158 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND13_3 - desc ECC_SYND13_3 - 0x815C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND14_0 - desc ECC_SYND14_0 - 0x8160 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND14_1 - desc ECC_SYND14_1 - 0x8164 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND14_2 - desc ECC_SYND14_2 - 0x8168 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND14_3 - desc ECC_SYND14_3 - 0x816C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - ECC_SYND15_0 - desc ECC_SYND15_0 - 0x8170 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S1 - desc S1 - 12 - 0 - read-only - - - S2 - desc S2 - 28 - 16 - read-only - - - - - ECC_SYND15_1 - desc ECC_SYND15_1 - 0x8174 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S3 - desc S3 - 12 - 0 - read-only - - - S4 - desc S4 - 28 - 16 - read-only - - - - - ECC_SYND15_2 - desc ECC_SYND15_2 - 0x8178 - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S5 - desc S5 - 12 - 0 - read-only - - - S6 - desc S6 - 28 - 16 - read-only - - - - - ECC_SYND15_3 - desc ECC_SYND15_3 - 0x817C - 32 - read-only - 0x0 - 0x1FFF1FFF - - - S7 - desc S7 - 12 - 0 - read-only - - - S8 - desc S8 - 28 - 16 - read-only - - - - - - - OTS - desc OTS - 0x40010600 - - 0x0 - 0x3A20C - - - - PDR1 - desc PDR1 - 0xE0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPD1 - desc TSPD1 - 15 - 0 - read-write - - - TSPD2 - desc TSPD2 - 31 - 16 - read-write - - - - - PDR2 - desc PDR2 - 0xF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPD1 - desc TSPD1 - 15 - 0 - read-write - - - TSPD2 - desc TSPD2 - 31 - 16 - read-write - - - - - PDR3 - desc PDR3 - 0xF8 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - TSPD1 - desc TSPD1 - 15 - 0 - read-write - - - TSPD2 - desc TSPD2 - 31 - 16 - read-write - - - - - CTL - desc CTL - 0x3A200 - 16 - read-write - 0x0 - 0xF - - - OTSST - desc OTSST - 0 - 0 - read-write - - - OTSCK - desc OTSCK - 1 - 1 - read-write - - - OTSIE - desc OTSIE - 2 - 2 - read-write - - - TSSTP - desc TSSTP - 3 - 3 - read-write - - - - - DR1 - desc DR1 - 0x3A202 - 16 - read-write - 0x0 - 0xFFFF - - - DR2 - desc DR2 - 0x3A204 - 16 - read-write - 0x0 - 0xFFFF - - - ECR - desc ECR - 0x3A206 - 16 - read-write - 0x0 - 0xFFFF - - - LPR - desc LPR - 0x3A208 - 32 - read-only - 0xFFFFFFFF - 0xFFFFFFFF - - - TSOFS - desc TSOFS - 7 - 0 - read-only - - - TSSLP - desc TSSLP - 31 - 8 - read-only - - - - - - - PERIC - desc PERIC - 0x40055400 - - 0x0 - 0x2C - - - - USB_SYCTLREG - desc USB_SYCTLREG - 0x0 - 32 - read-write - 0x0 - 0x7070703 - - - USBFS_DFB - desc USBFS_DFB - 0 - 0 - read-write - - - USBFS_SOFEN - desc USBFS_SOFEN - 1 - 1 - read-write - - - USBHS_DFB - desc USBHS_DFB - 8 - 8 - read-write - - - USBHS_SOFEN - desc USBHS_SOFEN - 9 - 9 - read-write - - - USBHS_FSPHYE - desc USBHS_FSPHYE - 10 - 10 - read-write - - - USBFS_NFS - desc USBFS_NFS - 17 - 16 - read-write - - - USBFS_NFE - desc USBFS_NFE - 18 - 18 - read-write - - - USBHS_NFS - desc USBHS_NFS - 25 - 24 - read-write - - - USBHS_NFE - desc USBHS_NFE - 26 - 26 - read-write - - - - - SDIOC_SYCTLREG - desc SDIOC_SYCTLREG - 0x4 - 32 - read-write - 0x0 - 0xA - - - SELMMC1 - desc SELMMC1 - 1 - 1 - read-write - - - SELMMC2 - desc SELMMC2 - 3 - 3 - read-write - - - - - NFC_STCR - desc NFC_STCR - 0x8 - 32 - read-write - 0x0 - 0x1 - - - OPENP - desc OPENP - 0 - 0 - read-write - - - - - NFC_ENAR - desc NFC_ENAR - 0xC - 32 - read-write - 0x0 - 0x4 - - - NFCEN - desc NFCEN - 2 - 2 - read-write - - - - - SMC_ENAR - desc SMC_ENAR - 0xC - 32 - read-write - 0x0 - 0x2 - - - SMCEN - desc SMCEN - 1 - 1 - read-write - - - - - DMC_ENAR - desc DMC_ENAR - 0xC - 32 - read-write - 0x0 - 0x1 - - - DMCEN - desc DMCEN - 0 - 0 - read-write - - - - - USART1_NFC - desc USART1_NFC - 0x1C - 32 - read-write - 0x0 - 0x7 - - - USASRT1_NFS - desc USASRT1_NFS - 1 - 0 - read-write - - - USART1_NFE - desc USART1_NFE - 2 - 2 - read-write - - - - - NFC_STSR - desc NFC_STSR - 0x28 - 32 - read-only - 0x0 - 0x1FF - - - CHIP_BUSY - desc CHIP_BUSY - 7 - 0 - read-only - - - PECC - desc PECC - 8 - 8 - read-only - - - - - - - PWC - desc PWC - 0x40048000 - - 0x0 - 0xC400 - - - - FCG0 - desc FCG0 - 0x0 - 32 - read-write - 0xFFFFFA0E - 0xFFFFE4F1 - - - SRAMH - desc SRAMH - 0 - 0 - read-write - - - SRAM1 - desc SRAM1 - 4 - 4 - read-write - - - SRAM2 - desc SRAM2 - 5 - 5 - read-write - - - SRAM3 - desc SRAM3 - 6 - 6 - read-write - - - SRAM4 - desc SRAM4 - 7 - 7 - read-write - - - SRAMB - desc SRAMB - 10 - 10 - read-write - - - KEY - desc KEY - 13 - 13 - read-write - - - DMA1 - desc DMA1 - 14 - 14 - read-write - - - DMA2 - desc DMA2 - 15 - 15 - read-write - - - FCM - desc FCM - 16 - 16 - read-write - - - AOS - desc AOS - 17 - 17 - read-write - - - CTC - desc CTC - 18 - 18 - read-write - - - MAU - desc MAU - 19 - 19 - read-write - - - AES - desc AES - 20 - 20 - read-write - - - HASH - desc HASH - 21 - 21 - read-write - - - TRNG - desc TRNG - 22 - 22 - read-write - - - CRC - desc CRC - 23 - 23 - read-write - - - DCU1 - desc DCU1 - 24 - 24 - read-write - - - DCU2 - desc DCU2 - 25 - 25 - read-write - - - DCU3 - desc DCU3 - 26 - 26 - read-write - - - DCU4 - desc DCU4 - 27 - 27 - read-write - - - DCU5 - desc DCU5 - 28 - 28 - read-write - - - DCU6 - desc DCU6 - 29 - 29 - read-write - - - DCU7 - desc DCU7 - 30 - 30 - read-write - - - DCU8 - desc DCU8 - 31 - 31 - read-write - - - - - FCG1 - desc FCG1 - 0x4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFF - - - CAN1 - desc CAN1 - 0 - 0 - read-write - - - CAN2 - desc CAN2 - 1 - 1 - read-write - - - ETHMAC - desc ETHMAC - 2 - 2 - read-write - - - QSPI - desc QSPI - 3 - 3 - read-write - - - I2C1 - desc I2C1 - 4 - 4 - read-write - - - I2C2 - desc I2C2 - 5 - 5 - read-write - - - I2C3 - desc I2C3 - 6 - 6 - read-write - - - I2C4 - desc I2C4 - 7 - 7 - read-write - - - I2C5 - desc I2C5 - 8 - 8 - read-write - - - I2C6 - desc I2C6 - 9 - 9 - read-write - - - SDIOC1 - desc SDIOC1 - 10 - 10 - read-write - - - SDIOC2 - desc SDIOC2 - 11 - 11 - read-write - - - I2S1 - desc I2S1 - 12 - 12 - read-write - - - I2S2 - desc I2S2 - 13 - 13 - read-write - - - I2S3 - desc I2S3 - 14 - 14 - read-write - - - I2S4 - desc I2S4 - 15 - 15 - read-write - - - SPI1 - desc SPI1 - 16 - 16 - read-write - - - SPI2 - desc SPI2 - 17 - 17 - read-write - - - SPI3 - desc SPI3 - 18 - 18 - read-write - - - SPI4 - desc SPI4 - 19 - 19 - read-write - - - SPI5 - desc SPI5 - 20 - 20 - read-write - - - SPI6 - desc SPI6 - 21 - 21 - read-write - - - USBFS - desc USBFS - 22 - 22 - read-write - - - USBHS - desc USBHS - 23 - 23 - read-write - - - FMAC1 - desc FMAC1 - 24 - 24 - read-write - - - FMAC2 - desc FMAC2 - 25 - 25 - read-write - - - FMAC3 - desc FMAC3 - 26 - 26 - read-write - - - FMAC4 - desc FMAC4 - 27 - 27 - read-write - - - - - FCG2 - desc FCG2 - 0x8 - 32 - read-write - 0xFFFFFFFF - 0xFFFFBFFF - - - TMR6_1 - desc TMR6_1 - 0 - 0 - read-write - - - TMR6_2 - desc TMR6_2 - 1 - 1 - read-write - - - TMR6_3 - desc TMR6_3 - 2 - 2 - read-write - - - TMR6_4 - desc TMR6_4 - 3 - 3 - read-write - - - TMR6_5 - desc TMR6_5 - 4 - 4 - read-write - - - TMR6_6 - desc TMR6_6 - 5 - 5 - read-write - - - TMR6_7 - desc TMR6_7 - 6 - 6 - read-write - - - TMR6_8 - desc TMR6_8 - 7 - 7 - read-write - - - TMR4_1 - desc TMR4_1 - 8 - 8 - read-write - - - TMR4_2 - desc TMR4_2 - 9 - 9 - read-write - - - TMR4_3 - desc TMR4_3 - 10 - 10 - read-write - - - HRPWM - desc HRPWM - 11 - 11 - read-write - - - TMR0_1 - desc TMR0_1 - 12 - 12 - read-write - - - TMR0_2 - desc TMR0_2 - 13 - 13 - read-write - - - EMB - desc EMB - 15 - 15 - read-write - - - TMR2_1 - desc TMR2_1 - 16 - 16 - read-write - - - TMR2_2 - desc TMR2_2 - 17 - 17 - read-write - - - TMR2_3 - desc TMR2_3 - 18 - 18 - read-write - - - TMR2_4 - desc TMR2_4 - 19 - 19 - read-write - - - TMRA_1 - desc TMRA_1 - 20 - 20 - read-write - - - TMRA_2 - desc TMRA_2 - 21 - 21 - read-write - - - TMRA_3 - desc TMRA_3 - 22 - 22 - read-write - - - TMRA_4 - desc TMRA_4 - 23 - 23 - read-write - - - TMRA_5 - desc TMRA_5 - 24 - 24 - read-write - - - TMRA_6 - desc TMRA_6 - 25 - 25 - read-write - - - TMRA_7 - desc TMRA_7 - 26 - 26 - read-write - - - TMRA_8 - desc TMRA_8 - 27 - 27 - read-write - - - TMRA_9 - desc TMRA_9 - 28 - 28 - read-write - - - TMRA_10 - desc TMRA_10 - 29 - 29 - read-write - - - TMRA_11 - desc TMRA_11 - 30 - 30 - read-write - - - TMRA_12 - desc TMRA_12 - 31 - 31 - read-write - - - - - FCG3 - desc FCG3 - 0xC - 32 - read-write - 0xFFFFFFFF - 0x3FF7933F - - - ADC1 - desc ADC1 - 0 - 0 - read-write - - - ADC2 - desc ADC2 - 1 - 1 - read-write - - - ADC3 - desc ADC3 - 2 - 2 - read-write - - - CMBIAS - desc CMBIAS - 3 - 3 - read-write - - - DAC1 - desc DAC1 - 4 - 4 - read-write - - - DAC2 - desc DAC2 - 5 - 5 - read-write - - - CMP1 - desc CMP1 - 8 - 8 - read-write - - - CMP2 - desc CMP2 - 9 - 9 - read-write - - - OTS - desc OTS - 12 - 12 - read-write - - - DVP - desc DVP - 15 - 15 - read-write - - - SMC - desc SMC - 16 - 16 - read-write - - - DMC - desc DMC - 17 - 17 - read-write - - - NFC - desc NFC - 18 - 18 - read-write - - - USART1 - desc USART1 - 20 - 20 - read-write - - - USART2 - desc USART2 - 21 - 21 - read-write - - - USART3 - desc USART3 - 22 - 22 - read-write - - - USART4 - desc USART4 - 23 - 23 - read-write - - - USART5 - desc USART5 - 24 - 24 - read-write - - - USART6 - desc USART6 - 25 - 25 - read-write - - - USART7 - desc USART7 - 26 - 26 - read-write - - - USART8 - desc USART8 - 27 - 27 - read-write - - - USART9 - desc USART9 - 28 - 28 - read-write - - - USART10 - desc USART10 - 29 - 29 - read-write - - - - - FCG0PC - desc FCG0PC - 0x10 - 32 - read-write - 0x0 - 0xFFFF0001 - - - PRT0 - desc PRT0 - 0 - 0 - read-write - - - FCG0PCWE - desc FCG0PCWE - 31 - 16 - write-only - - - - - VBATRSTR - desc VBATRSTR - 0x4430 - 8 - read-write - 0x0 - 0xFF - - - VBATCR - desc VBATCR - 0x4440 - 8 - read-write - 0x0 - 0x8F - - - VBTRSD - desc VBTRSD - 0 - 0 - read-write - - - RAMVALID - desc RAMVALID - 1 - 1 - read-write - - - RAMPDF - desc RAMPDF - 2 - 2 - read-write - - - VBATDIVMONE - desc VBATDIVMONE - 3 - 3 - read-write - - - CSDIS - desc CSDIS - 7 - 7 - read-write - - - - - WKTC0 - desc WKTC0 - 0x4450 - 8 - read-write - 0x0 - 0xFF - - - WKTMCMP - desc WKTMCMP - 7 - 0 - read-write - - - - - WKTC1 - desc WKTC1 - 0x4454 - 8 - read-write - 0x0 - 0xF - - - WKTMCMP - desc WKTMCMP - 3 - 0 - read-write - - - - - WKTC2 - desc WKTC2 - 0x4458 - 8 - read-write - 0x0 - 0xF0 - - - WKOVF - desc WKOVF - 4 - 4 - read-write - - - WKCKS - desc WKCKS - 6 - 5 - read-write - - - WKTCE - desc WKTCE - 7 - 7 - read-write - - - - - BKR0 - desc BKR0 - 0x4600 - 8 - read-write - 0x0 - 0xFF - - - BKR1 - desc BKR1 - 0x4604 - 8 - read-write - 0x0 - 0xFF - - - BKR2 - desc BKR2 - 0x4608 - 8 - read-write - 0x0 - 0xFF - - - BKR3 - desc BKR3 - 0x460C - 8 - read-write - 0x0 - 0xFF - - - BKR4 - desc BKR4 - 0x4610 - 8 - read-write - 0x0 - 0xFF - - - BKR5 - desc BKR5 - 0x4614 - 8 - read-write - 0x0 - 0xFF - - - BKR6 - desc BKR6 - 0x4618 - 8 - read-write - 0x0 - 0xFF - - - BKR7 - desc BKR7 - 0x461C - 8 - read-write - 0x0 - 0xFF - - - BKR8 - desc BKR8 - 0x4620 - 8 - read-write - 0x0 - 0xFF - - - BKR9 - desc BKR9 - 0x4624 - 8 - read-write - 0x0 - 0xFF - - - BKR10 - desc BKR10 - 0x4628 - 8 - read-write - 0x0 - 0xFF - - - BKR11 - desc BKR11 - 0x462C - 8 - read-write - 0x0 - 0xFF - - - BKR12 - desc BKR12 - 0x4630 - 8 - read-write - 0x0 - 0xFF - - - BKR13 - desc BKR13 - 0x4634 - 8 - read-write - 0x0 - 0xFF - - - BKR14 - desc BKR14 - 0x4638 - 8 - read-write - 0x0 - 0xFF - - - BKR15 - desc BKR15 - 0x463C - 8 - read-write - 0x0 - 0xFF - - - BKR16 - desc BKR16 - 0x4640 - 8 - read-write - 0x0 - 0xFF - - - BKR17 - desc BKR17 - 0x4644 - 8 - read-write - 0x0 - 0xFF - - - BKR18 - desc BKR18 - 0x4648 - 8 - read-write - 0x0 - 0xFF - - - BKR19 - desc BKR19 - 0x464C - 8 - read-write - 0x0 - 0xFF - - - BKR20 - desc BKR20 - 0x4650 - 8 - read-write - 0x0 - 0xFF - - - BKR21 - desc BKR21 - 0x4654 - 8 - read-write - 0x0 - 0xFF - - - BKR22 - desc BKR22 - 0x4658 - 8 - read-write - 0x0 - 0xFF - - - BKR23 - desc BKR23 - 0x465C - 8 - read-write - 0x0 - 0xFF - - - BKR24 - desc BKR24 - 0x4660 - 8 - read-write - 0x0 - 0xFF - - - BKR25 - desc BKR25 - 0x4664 - 8 - read-write - 0x0 - 0xFF - - - BKR26 - desc BKR26 - 0x4668 - 8 - read-write - 0x0 - 0xFF - - - BKR27 - desc BKR27 - 0x466C - 8 - read-write - 0x0 - 0xFF - - - BKR28 - desc BKR28 - 0x4670 - 8 - read-write - 0x0 - 0xFF - - - BKR29 - desc BKR29 - 0x4674 - 8 - read-write - 0x0 - 0xFF - - - BKR30 - desc BKR30 - 0x4678 - 8 - read-write - 0x0 - 0xFF - - - BKR31 - desc BKR31 - 0x467C - 8 - read-write - 0x0 - 0xFF - - - BKR32 - desc BKR32 - 0x4680 - 8 - read-write - 0x0 - 0xFF - - - BKR33 - desc BKR33 - 0x4684 - 8 - read-write - 0x0 - 0xFF - - - BKR34 - desc BKR34 - 0x4688 - 8 - read-write - 0x0 - 0xFF - - - BKR35 - desc BKR35 - 0x468C - 8 - read-write - 0x0 - 0xFF - - - BKR36 - desc BKR36 - 0x4690 - 8 - read-write - 0x0 - 0xFF - - - BKR37 - desc BKR37 - 0x4694 - 8 - read-write - 0x0 - 0xFF - - - BKR38 - desc BKR38 - 0x4698 - 8 - read-write - 0x0 - 0xFF - - - BKR39 - desc BKR39 - 0x469C - 8 - read-write - 0x0 - 0xFF - - - BKR40 - desc BKR40 - 0x46A0 - 8 - read-write - 0x0 - 0xFF - - - BKR41 - desc BKR41 - 0x46A4 - 8 - read-write - 0x0 - 0xFF - - - BKR42 - desc BKR42 - 0x46A8 - 8 - read-write - 0x0 - 0xFF - - - BKR43 - desc BKR43 - 0x46AC - 8 - read-write - 0x0 - 0xFF - - - BKR44 - desc BKR44 - 0x46B0 - 8 - read-write - 0x0 - 0xFF - - - BKR45 - desc BKR45 - 0x46B4 - 8 - read-write - 0x0 - 0xFF - - - BKR46 - desc BKR46 - 0x46B8 - 8 - read-write - 0x0 - 0xFF - - - BKR47 - desc BKR47 - 0x46BC - 8 - read-write - 0x0 - 0xFF - - - BKR48 - desc BKR48 - 0x46C0 - 8 - read-write - 0x0 - 0xFF - - - BKR49 - desc BKR49 - 0x46C4 - 8 - read-write - 0x0 - 0xFF - - - BKR50 - desc BKR50 - 0x46C8 - 8 - read-write - 0x0 - 0xFF - - - BKR51 - desc BKR51 - 0x46CC - 8 - read-write - 0x0 - 0xFF - - - BKR52 - desc BKR52 - 0x46D0 - 8 - read-write - 0x0 - 0xFF - - - BKR53 - desc BKR53 - 0x46D4 - 8 - read-write - 0x0 - 0xFF - - - BKR54 - desc BKR54 - 0x46D8 - 8 - read-write - 0x0 - 0xFF - - - BKR55 - desc BKR55 - 0x46DC - 8 - read-write - 0x0 - 0xFF - - - BKR56 - desc BKR56 - 0x46E0 - 8 - read-write - 0x0 - 0xFF - - - BKR57 - desc BKR57 - 0x46E4 - 8 - read-write - 0x0 - 0xFF - - - BKR58 - desc BKR58 - 0x46E8 - 8 - read-write - 0x0 - 0xFF - - - BKR59 - desc BKR59 - 0x46EC - 8 - read-write - 0x0 - 0xFF - - - BKR60 - desc BKR60 - 0x46F0 - 8 - read-write - 0x0 - 0xFF - - - BKR61 - desc BKR61 - 0x46F4 - 8 - read-write - 0x0 - 0xFF - - - BKR62 - desc BKR62 - 0x46F8 - 8 - read-write - 0x0 - 0xFF - - - BKR63 - desc BKR63 - 0x46FC - 8 - read-write - 0x0 - 0xFF - - - BKR64 - desc BKR64 - 0x4700 - 8 - read-write - 0x0 - 0xFF - - - BKR65 - desc BKR65 - 0x4704 - 8 - read-write - 0x0 - 0xFF - - - BKR66 - desc BKR66 - 0x4708 - 8 - read-write - 0x0 - 0xFF - - - BKR67 - desc BKR67 - 0x470C - 8 - read-write - 0x0 - 0xFF - - - BKR68 - desc BKR68 - 0x4710 - 8 - read-write - 0x0 - 0xFF - - - BKR69 - desc BKR69 - 0x4714 - 8 - read-write - 0x0 - 0xFF - - - BKR70 - desc BKR70 - 0x4718 - 8 - read-write - 0x0 - 0xFF - - - BKR71 - desc BKR71 - 0x471C - 8 - read-write - 0x0 - 0xFF - - - BKR72 - desc BKR72 - 0x4720 - 8 - read-write - 0x0 - 0xFF - - - BKR73 - desc BKR73 - 0x4724 - 8 - read-write - 0x0 - 0xFF - - - BKR74 - desc BKR74 - 0x4728 - 8 - read-write - 0x0 - 0xFF - - - BKR75 - desc BKR75 - 0x472C - 8 - read-write - 0x0 - 0xFF - - - BKR76 - desc BKR76 - 0x4730 - 8 - read-write - 0x0 - 0xFF - - - BKR77 - desc BKR77 - 0x4734 - 8 - read-write - 0x0 - 0xFF - - - BKR78 - desc BKR78 - 0x4738 - 8 - read-write - 0x0 - 0xFF - - - BKR79 - desc BKR79 - 0x473C - 8 - read-write - 0x0 - 0xFF - - - BKR80 - desc BKR80 - 0x4740 - 8 - read-write - 0x0 - 0xFF - - - BKR81 - desc BKR81 - 0x4744 - 8 - read-write - 0x0 - 0xFF - - - BKR82 - desc BKR82 - 0x4748 - 8 - read-write - 0x0 - 0xFF - - - BKR83 - desc BKR83 - 0x474C - 8 - read-write - 0x0 - 0xFF - - - BKR84 - desc BKR84 - 0x4750 - 8 - read-write - 0x0 - 0xFF - - - BKR85 - desc BKR85 - 0x4754 - 8 - read-write - 0x0 - 0xFF - - - BKR86 - desc BKR86 - 0x4758 - 8 - read-write - 0x0 - 0xFF - - - BKR87 - desc BKR87 - 0x475C - 8 - read-write - 0x0 - 0xFF - - - BKR88 - desc BKR88 - 0x4760 - 8 - read-write - 0x0 - 0xFF - - - BKR89 - desc BKR89 - 0x4764 - 8 - read-write - 0x0 - 0xFF - - - BKR90 - desc BKR90 - 0x4768 - 8 - read-write - 0x0 - 0xFF - - - BKR91 - desc BKR91 - 0x476C - 8 - read-write - 0x0 - 0xFF - - - BKR92 - desc BKR92 - 0x4770 - 8 - read-write - 0x0 - 0xFF - - - BKR93 - desc BKR93 - 0x4774 - 8 - read-write - 0x0 - 0xFF - - - BKR94 - desc BKR94 - 0x4778 - 8 - read-write - 0x0 - 0xFF - - - BKR95 - desc BKR95 - 0x477C - 8 - read-write - 0x0 - 0xFF - - - BKR96 - desc BKR96 - 0x4780 - 8 - read-write - 0x0 - 0xFF - - - BKR97 - desc BKR97 - 0x4784 - 8 - read-write - 0x0 - 0xFF - - - BKR98 - desc BKR98 - 0x4788 - 8 - read-write - 0x0 - 0xFF - - - BKR99 - desc BKR99 - 0x478C - 8 - read-write - 0x0 - 0xFF - - - BKR100 - desc BKR100 - 0x4790 - 8 - read-write - 0x0 - 0xFF - - - BKR101 - desc BKR101 - 0x4794 - 8 - read-write - 0x0 - 0xFF - - - BKR102 - desc BKR102 - 0x4798 - 8 - read-write - 0x0 - 0xFF - - - BKR103 - desc BKR103 - 0x479C - 8 - read-write - 0x0 - 0xFF - - - BKR104 - desc BKR104 - 0x47A0 - 8 - read-write - 0x0 - 0xFF - - - BKR105 - desc BKR105 - 0x47A4 - 8 - read-write - 0x0 - 0xFF - - - BKR106 - desc BKR106 - 0x47A8 - 8 - read-write - 0x0 - 0xFF - - - BKR107 - desc BKR107 - 0x47AC - 8 - read-write - 0x0 - 0xFF - - - BKR108 - desc BKR108 - 0x47B0 - 8 - read-write - 0x0 - 0xFF - - - BKR109 - desc BKR109 - 0x47B4 - 8 - read-write - 0x0 - 0xFF - - - BKR110 - desc BKR110 - 0x47B8 - 8 - read-write - 0x0 - 0xFF - - - BKR111 - desc BKR111 - 0x47BC - 8 - read-write - 0x0 - 0xFF - - - BKR112 - desc BKR112 - 0x47C0 - 8 - read-write - 0x0 - 0xFF - - - BKR113 - desc BKR113 - 0x47C4 - 8 - read-write - 0x0 - 0xFF - - - BKR114 - desc BKR114 - 0x47C8 - 8 - read-write - 0x0 - 0xFF - - - BKR115 - desc BKR115 - 0x47CC - 8 - read-write - 0x0 - 0xFF - - - BKR116 - desc BKR116 - 0x47D0 - 8 - read-write - 0x0 - 0xFF - - - BKR117 - desc BKR117 - 0x47D4 - 8 - read-write - 0x0 - 0xFF - - - BKR118 - desc BKR118 - 0x47D8 - 8 - read-write - 0x0 - 0xFF - - - BKR119 - desc BKR119 - 0x47DC - 8 - read-write - 0x0 - 0xFF - - - BKR120 - desc BKR120 - 0x47E0 - 8 - read-write - 0x0 - 0xFF - - - BKR121 - desc BKR121 - 0x47E4 - 8 - read-write - 0x0 - 0xFF - - - BKR122 - desc BKR122 - 0x47E8 - 8 - read-write - 0x0 - 0xFF - - - BKR123 - desc BKR123 - 0x47EC - 8 - read-write - 0x0 - 0xFF - - - BKR124 - desc BKR124 - 0x47F0 - 8 - read-write - 0x0 - 0xFF - - - BKR125 - desc BKR125 - 0x47F4 - 8 - read-write - 0x0 - 0xFF - - - BKR126 - desc BKR126 - 0x47F8 - 8 - read-write - 0x0 - 0xFF - - - BKR127 - desc BKR127 - 0x47FC - 8 - read-write - 0x0 - 0xFF - - - PWRC0 - desc PWRC0 - 0x4C00 - 8 - read-write - 0x0 - 0xBB - - - PDMDS - desc PDMDS - 1 - 0 - read-write - - - IORTN - desc IORTN - 5 - 4 - read-write - - - PWDN - desc PWDN - 7 - 7 - read-write - - - - - PWRC1 - desc PWRC1 - 0x4C04 - 8 - read-write - 0x0 - 0xCF - - - VPLLSD - desc VPLLSD - 1 - 0 - read-write - - - VHRCSD - desc VHRCSD - 2 - 2 - read-write - - - PDTS - desc PDTS - 3 - 3 - read-write - - - STPDAS - desc STPDAS - 7 - 6 - read-write - - - - - PWRC2 - desc PWRC2 - 0x4C08 - 8 - read-write - 0xFF - 0x3F - - - DDAS - desc DDAS - 3 - 0 - read-write - - - DVS - desc DVS - 5 - 4 - read-write - - - - - PWRC3 - desc PWRC3 - 0x4C0C - 8 - read-write - 0xFF - 0xFF - - - DDAS - desc DDAS - 7 - 0 - read-write - - - - - PWRC4 - desc PWRC4 - 0x4C10 - 8 - read-write - 0x0 - 0xD3 - - - VBATREFSEL - desc VBATREFSEL - 0 - 0 - read-write - - - VBATME - desc VBATME - 1 - 1 - read-write - - - VBATMON - desc VBATMON - 4 - 4 - read-write - - - ADBUFS - desc ADBUFS - 6 - 6 - read-write - - - ADBUFE - desc ADBUFE - 7 - 7 - read-write - - - - - PVDCR0 - desc PVDCR0 - 0x4C14 - 8 - read-write - 0x0 - 0x61 - - - EXVCCINEN - desc EXVCCINEN - 0 - 0 - read-write - - - PVD1EN - desc PVD1EN - 5 - 5 - read-write - - - PVD2EN - desc PVD2EN - 6 - 6 - read-write - - - - - PVDCR1 - desc PVDCR1 - 0x4C18 - 8 - read-write - 0x0 - 0x77 - - - PVD1IRE - desc PVD1IRE - 0 - 0 - read-write - - - PVD1IRS - desc PVD1IRS - 1 - 1 - read-write - - - PVD1CMPOE - desc PVD1CMPOE - 2 - 2 - read-write - - - PVD2IRE - desc PVD2IRE - 4 - 4 - read-write - - - PVD2IRS - desc PVD2IRS - 5 - 5 - read-write - - - PVD2CMPOE - desc PVD2CMPOE - 6 - 6 - read-write - - - - - PVDFCR - desc PVDFCR - 0x4C1C - 8 - read-write - 0x11 - 0x77 - - - PVD1NFDIS - desc PVD1NFDIS - 0 - 0 - read-write - - - PVD1NFCKS - desc PVD1NFCKS - 2 - 1 - read-write - - - PVD2NFDIS - desc PVD2NFDIS - 4 - 4 - read-write - - - PVD2NFCKS - desc PVD2NFCKS - 6 - 5 - read-write - - - - - PVDLCR - desc PVDLCR - 0x4C20 - 8 - read-write - 0x0 - 0x77 - - - PVD1LVL - desc PVD1LVL - 2 - 0 - read-write - - - PVD2LVL - desc PVD2LVL - 6 - 4 - read-write - - - - - PDWKE0 - desc PDWKE0 - 0x4C28 - 8 - read-write - 0x0 - 0xFF - - - WKE00 - desc WKE00 - 0 - 0 - read-write - - - WKE01 - desc WKE01 - 1 - 1 - read-write - - - WKE02 - desc WKE02 - 2 - 2 - read-write - - - WKE03 - desc WKE03 - 3 - 3 - read-write - - - WKE10 - desc WKE10 - 4 - 4 - read-write - - - WKE11 - desc WKE11 - 5 - 5 - read-write - - - WKE12 - desc WKE12 - 6 - 6 - read-write - - - WKE13 - desc WKE13 - 7 - 7 - read-write - - - - - PDWKE1 - desc PDWKE1 - 0x4C2C - 8 - read-write - 0x0 - 0xFF - - - WKE20 - desc WKE20 - 0 - 0 - read-write - - - WKE21 - desc WKE21 - 1 - 1 - read-write - - - WKE22 - desc WKE22 - 2 - 2 - read-write - - - WKE23 - desc WKE23 - 3 - 3 - read-write - - - WKE30 - desc WKE30 - 4 - 4 - read-write - - - WKE31 - desc WKE31 - 5 - 5 - read-write - - - WKE32 - desc WKE32 - 6 - 6 - read-write - - - WKE33 - desc WKE33 - 7 - 7 - read-write - - - - - PDWKE2 - desc PDWKE2 - 0x4C30 - 8 - read-write - 0x0 - 0xF3 - - - VD1WKE - desc VD1WKE - 0 - 0 - read-write - - - VD2WKE - desc VD2WKE - 1 - 1 - read-write - - - RTCPRDWKE - desc RTCPRDWKE - 4 - 4 - read-write - - - RTCALMWKE - desc RTCALMWKE - 5 - 5 - read-write - - - WKTMWKE - desc WKTMWKE - 7 - 7 - read-write - - - - - PDWKES - desc PDWKES - 0x4C34 - 8 - read-write - 0x0 - 0x3F - - - WK0EGS - desc WK0EGS - 0 - 0 - read-write - - - WK1EGS - desc WK1EGS - 1 - 1 - read-write - - - WK2EGS - desc WK2EGS - 2 - 2 - read-write - - - WK3EGS - desc WK3EGS - 3 - 3 - read-write - - - VD1EGS - desc VD1EGS - 4 - 4 - read-write - - - VD2EGS - desc VD2EGS - 5 - 5 - read-write - - - - - PDWKF0 - desc PDWKF0 - 0x4C38 - 8 - read-write - 0x0 - 0x3F - - - PTWK0F - desc PTWK0F - 0 - 0 - read-write - - - PTWK1F - desc PTWK1F - 1 - 1 - read-write - - - PTWK2F - desc PTWK2F - 2 - 2 - read-write - - - PTWK3F - desc PTWK3F - 3 - 3 - read-write - - - VD1WKF - desc VD1WKF - 4 - 4 - read-write - - - VD2WKF - desc VD2WKF - 5 - 5 - read-write - - - - - PDWKF1 - desc PDWKF1 - 0x4C3C - 8 - read-write - 0x0 - 0xF8 - - - RXD0WKF - desc RXD0WKF - 3 - 3 - read-write - - - RTCPRDWKF - desc RTCPRDWKF - 4 - 4 - read-write - - - RTCALMWKF - desc RTCALMWKF - 5 - 5 - read-write - - - WKTMWKF - desc WKTMWKF - 7 - 7 - read-write - - - - - RAMPC0 - desc RAMPC0 - 0x4CE0 - 32 - read-write - 0x0 - 0x7FF - - - RAMPDC0 - desc RAMPDC0 - 0 - 0 - read-write - - - RAMPDC1 - desc RAMPDC1 - 1 - 1 - read-write - - - RAMPDC2 - desc RAMPDC2 - 2 - 2 - read-write - - - RAMPDC3 - desc RAMPDC3 - 3 - 3 - read-write - - - RAMPDC4 - desc RAMPDC4 - 4 - 4 - read-write - - - RAMPDC5 - desc RAMPDC5 - 5 - 5 - read-write - - - RAMPDC6 - desc RAMPDC6 - 6 - 6 - read-write - - - RAMPDC7 - desc RAMPDC7 - 7 - 7 - read-write - - - RAMPDC8 - desc RAMPDC8 - 8 - 8 - read-write - - - RAMPDC9 - desc RAMPDC9 - 9 - 9 - read-write - - - RAMPDC10 - desc RAMPDC10 - 10 - 10 - read-write - - - - - RAMOPM - desc RAMOPM - 0x4CE4 - 16 - read-write - 0x8043 - 0xFFFF - - - PRAMLPC - desc PRAMLPC - 0x4CE8 - 32 - read-write - 0x0 - 0x3FF - - - PRAMPDC0 - desc PRAMPDC0 - 0 - 0 - read-write - - - PRAMPDC1 - desc PRAMPDC1 - 1 - 1 - read-write - - - PRAMPDC2 - desc PRAMPDC2 - 2 - 2 - read-write - - - PRAMPDC3 - desc PRAMPDC3 - 3 - 3 - read-write - - - PRAMPDC4 - desc PRAMPDC4 - 4 - 4 - read-write - - - PRAMPDC5 - desc PRAMPDC5 - 5 - 5 - read-write - - - PRAMPDC6 - desc PRAMPDC6 - 6 - 6 - read-write - - - PRAMPDC7 - desc PRAMPDC7 - 7 - 7 - read-write - - - PRAMPDC8 - desc PRAMPDC8 - 8 - 8 - read-write - - - PRAMPDC9 - desc PRAMPDC9 - 9 - 9 - read-write - - - - - PVDICR - desc PVDICR - 0x4CF0 - 8 - read-write - 0x0 - 0x77 - - - PVD1NMIS - desc PVD1NMIS - 0 - 0 - read-write - - - PVD1EDGS - desc PVD1EDGS - 2 - 1 - read-write - - - PVD2NMIS - desc PVD2NMIS - 4 - 4 - read-write - - - PVD2EDGS - desc PVD2EDGS - 6 - 5 - read-write - - - - - PVDDSR - desc PVDDSR - 0x4CF4 - 8 - read-write - 0x11 - 0x33 - - - PVD1MON - desc PVD1MON - 0 - 0 - read-write - - - PVD1DETFLG - desc PVD1DETFLG - 1 - 1 - read-write - - - PVD2MON - desc PVD2MON - 4 - 4 - read-write - - - PVD2DETFLG - desc PVD2DETFLG - 5 - 5 - read-write - - - - - STPMCR - desc STPMCR - 0xC00C - 16 - read-write - 0x0 - 0xC003 - - - FLNWT - desc FLNWT - 0 - 0 - read-write - - - CKSMRC - desc CKSMRC - 1 - 1 - read-write - - - EXBUSOE - desc EXBUSOE - 14 - 14 - read-write - - - STOP - desc STOP - 15 - 15 - read-write - - - - - FPRC - desc FPRC - 0xC3FE - 16 - read-write - 0x0 - 0xFF0F - - - FPRCB0 - desc FPRCB0 - 0 - 0 - read-write - - - FPRCB1 - desc FPRCB1 - 1 - 1 - read-write - - - FPRCB2 - desc FPRCB2 - 2 - 2 - read-write - - - FPRCB3 - desc FPRCB3 - 3 - 3 - read-write - - - FPRCWE - desc FPRCWE - 15 - 8 - read-write - - - - - - - QSPI - desc QSPI - 0x9C000000 - - 0x0 - 0x808 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x3F0000 - 0x3F3FFF - - - MDSEL - desc MDSEL - 2 - 0 - read-write - - - PFE - desc PFE - 3 - 3 - read-write - - - PFSAE - desc PFSAE - 4 - 4 - read-write - - - DCOME - desc DCOME - 5 - 5 - read-write - - - XIPE - desc XIPE - 6 - 6 - read-write - - - SPIMD3 - desc SPIMD3 - 7 - 7 - read-write - - - IPRSL - desc IPRSL - 9 - 8 - read-write - - - APRSL - desc APRSL - 11 - 10 - read-write - - - DPRSL - desc DPRSL - 13 - 12 - read-write - - - DIV - desc DIV - 21 - 16 - read-write - - - - - CSCR - desc CSCR - 0x4 - 32 - read-write - 0xF - 0x3F - - - SSHW - desc SSHW - 3 - 0 - read-write - - - SSNW - desc SSNW - 5 - 4 - read-write - - - - - FCR - desc FCR - 0x8 - 32 - read-write - 0x80B3 - 0x8F77 - - - AWSL - desc AWSL - 1 - 0 - read-write - - - FOUR_BIC - desc FOUR_BIC - 2 - 2 - read-write - - - SSNHD - desc SSNHD - 4 - 4 - read-write - - - SSNLD - desc SSNLD - 5 - 5 - read-write - - - WPOL - desc WPOL - 6 - 6 - read-write - - - DMCYCN - desc DMCYCN - 11 - 8 - read-write - - - DUTY - desc DUTY - 15 - 15 - read-write - - - - - SR - desc SR - 0xC - 32 - read-write - 0x8000 - 0xDFC1 - - - BUSY - desc BUSY - 0 - 0 - read-write - - - XIPF - desc XIPF - 6 - 6 - read-write - - - RAER - desc RAER - 7 - 7 - read-write - - - PFNUM - desc PFNUM - 12 - 8 - read-write - - - PFFUL - desc PFFUL - 14 - 14 - read-write - - - PFAN - desc PFAN - 15 - 15 - read-write - - - - - DCOM - desc DCOM - 0x10 - 32 - read-write - 0x0 - 0xFF - - - DCOM - desc DCOM - 7 - 0 - read-write - - - - - CCMD - desc CCMD - 0x14 - 32 - read-write - 0x0 - 0xFF - - - RIC - desc RIC - 7 - 0 - read-write - - - - - XCMD - desc XCMD - 0x18 - 32 - read-write - 0xFF - 0xFF - - - XIPMC - desc XIPMC - 7 - 0 - read-write - - - - - SR2 - desc SR2 - 0x24 - 32 - write-only - 0x0 - 0x80 - - - RAERCLR - desc RAERCLR - 7 - 7 - write-only - - - - - EXAR - desc EXAR - 0x804 - 32 - read-write - 0x0 - 0xFC000000 - - - EXADR - desc EXADR - 31 - 26 - read-write - - - - - - - RMU - desc RMU - 0x4004CC00 - - 0x0 - 0x100 - - - - PRSTCR0 - desc PRSTCR0 - 0xF8 - 8 - read-write - 0x40 - 0x20 - - - LKUPREN - desc LKUPREN - 5 - 5 - read-write - - - - - RSTF0 - desc RSTF0 - 0xFC - 32 - read-write - 0x2 - 0xC0007FFF - - - PORF - desc PORF - 0 - 0 - read-write - - - PINRF - desc PINRF - 1 - 1 - read-write - - - BORF - desc BORF - 2 - 2 - read-write - - - PVD1RF - desc PVD1RF - 3 - 3 - read-write - - - PVD2RF - desc PVD2RF - 4 - 4 - read-write - - - WDRF - desc WDRF - 5 - 5 - read-write - - - SWDRF - desc SWDRF - 6 - 6 - read-write - - - PDRF - desc PDRF - 7 - 7 - read-write - - - SWRF - desc SWRF - 8 - 8 - read-write - - - MPUERF - desc MPUERF - 9 - 9 - read-write - - - RAPERF - desc RAPERF - 10 - 10 - read-write - - - RAECRF - desc RAECRF - 11 - 11 - read-write - - - CKFERF - desc CKFERF - 12 - 12 - read-write - - - XTALERF - desc XTALERF - 13 - 13 - read-write - - - LKUPRF - desc LKUPRF - 14 - 14 - read-write - - - MULTIRF - desc MULTIRF - 30 - 30 - read-write - - - CLRF - desc CLRF - 31 - 31 - read-write - - - - - - - RTC - desc RTC - 0x4004C000 - - 0x0 - 0x60 - - - - CR0 - desc CR0 - 0x0 - 8 - read-write - 0x0 - 0x1 - - - RESET - desc RESET - 0 - 0 - read-write - - - - - CR1 - desc CR1 - 0x4 - 8 - read-write - 0x0 - 0xEF - - - PRDS - desc PRDS - 2 - 0 - read-write - - - AMPM - desc AMPM - 3 - 3 - read-write - - - ONEHZOE - desc ONEHZOE - 5 - 5 - read-write - - - ONEHZSEL - desc ONEHZSEL - 6 - 6 - read-write - - - START - desc START - 7 - 7 - read-write - - - - - CR2 - desc CR2 - 0x8 - 8 - read-write - 0x0 - 0xEF - - - RWREQ - desc RWREQ - 0 - 0 - read-write - - - RWEN - desc RWEN - 1 - 1 - read-write - - - PRDF - desc PRDF - 2 - 2 - read-write - - - ALMF - desc ALMF - 3 - 3 - read-write - - - PRDIE - desc PRDIE - 5 - 5 - read-write - - - ALMIE - desc ALMIE - 6 - 6 - read-write - - - ALME - desc ALME - 7 - 7 - read-write - - - - - CR3 - desc CR3 - 0xC - 8 - read-write - 0x0 - 0x90 - - - LRCEN - desc LRCEN - 4 - 4 - read-write - - - RCKSEL - desc RCKSEL - 7 - 7 - read-write - - - - - SEC - desc SEC - 0x10 - 8 - read-write - 0x0 - 0x7F - - - SECU - desc SECU - 3 - 0 - read-write - - - SECD - desc SECD - 6 - 4 - read-write - - - - - MIN - desc MIN - 0x14 - 8 - read-write - 0x0 - 0x7F - - - MINU - desc MINU - 3 - 0 - read-write - - - MIND - desc MIND - 6 - 4 - read-write - - - - - HOUR - desc HOUR - 0x18 - 8 - read-write - 0x12 - 0x3F - - - HOURU - desc HOURU - 3 - 0 - read-write - - - HOURD - desc HOURD - 5 - 4 - read-write - - - - - WEEK - desc WEEK - 0x1C - 8 - read-write - 0x0 - 0x7 - - - WEEK - desc WEEK - 2 - 0 - read-write - - - - - DAY - desc DAY - 0x20 - 8 - read-write - 0x0 - 0x3F - - - DAYU - desc DAYU - 3 - 0 - read-write - - - DAYD - desc DAYD - 5 - 4 - read-write - - - - - MON - desc MON - 0x24 - 8 - read-write - 0x0 - 0x1F - - - MON - desc MON - 4 - 0 - read-write - - - - - YEAR - desc YEAR - 0x28 - 8 - read-write - 0x0 - 0xFF - - - YEARU - desc YEARU - 3 - 0 - read-write - - - YEARD - desc YEARD - 7 - 4 - read-write - - - - - ALMMIN - desc ALMMIN - 0x2C - 8 - read-write - 0x12 - 0x7F - - - ALMMINU - desc ALMMINU - 3 - 0 - read-write - - - ALMMIND - desc ALMMIND - 6 - 4 - read-write - - - - - ALMHOUR - desc ALMHOUR - 0x30 - 8 - read-write - 0x0 - 0x3F - - - ALMHOURU - desc ALMHOURU - 3 - 0 - read-write - - - ALMHOURD - desc ALMHOURD - 5 - 4 - read-write - - - - - ALMWEEK - desc ALMWEEK - 0x34 - 8 - read-write - 0x0 - 0x7F - - - ALMWEEK - desc ALMWEEK - 6 - 0 - read-write - - - - - ERRCRH - desc ERRCRH - 0x38 - 8 - read-write - 0x0 - 0x81 - - - COMP8 - desc COMP8 - 0 - 0 - read-write - - - COMPEN - desc COMPEN - 7 - 7 - read-write - - - - - ERRCRL - desc ERRCRL - 0x3C - 8 - read-write - 0x0 - 0xFF - - - COMP - desc COMP - 7 - 0 - read-write - - - - - TPCR0 - desc TPCR0 - 0x40 - 8 - read-write - 0x0 - 0xFF - - - TPCT0 - desc TPCT0 - 1 - 0 - read-write - - - TPNF0 - desc TPNF0 - 3 - 2 - read-write - - - TPRSTE0 - desc TPRSTE0 - 4 - 4 - read-write - - - TPIE0 - desc TPIE0 - 5 - 5 - read-write - - - TSTPE0 - desc TSTPE0 - 6 - 6 - read-write - - - TPEN0 - desc TPEN0 - 7 - 7 - read-write - - - - - TPCR1 - desc TPCR1 - 0x44 - 8 - read-write - 0x0 - 0xFF - - - TPCT1 - desc TPCT1 - 1 - 0 - read-write - - - TPNF1 - desc TPNF1 - 3 - 2 - read-write - - - TPRSTE1 - desc TPRSTE1 - 4 - 4 - read-write - - - TPIE1 - desc TPIE1 - 5 - 5 - read-write - - - TSTPE1 - desc TSTPE1 - 6 - 6 - read-write - - - TPEN1 - desc TPEN1 - 7 - 7 - read-write - - - - - TPSR - desc TPSR - 0x48 - 8 - read-write - 0x0 - 0x7 - - - TPF0 - desc TPF0 - 0 - 0 - read-write - - - TPF1 - desc TPF1 - 1 - 1 - read-write - - - TPOVF - desc TPOVF - 2 - 2 - read-write - - - - - SECTP - desc SECTP - 0x4C - 8 - read-write - 0x0 - 0x7F - - - SECTPU - desc SECTPU - 3 - 0 - read-write - - - SECTPD - desc SECTPD - 6 - 4 - read-write - - - - - MINTP - desc MINTP - 0x50 - 8 - read-write - 0x0 - 0x7F - - - MINTPU - desc MINTPU - 3 - 0 - read-write - - - MINTPD - desc MINTPD - 6 - 4 - read-write - - - - - HOURTP - desc HOURTP - 0x54 - 8 - read-write - 0x0 - 0x3F - - - HOURTPU - desc HOURTPU - 3 - 0 - read-write - - - HOURTPD - desc HOURTPD - 5 - 4 - read-write - - - - - DAYTP - desc DAYTP - 0x58 - 8 - read-write - 0x0 - 0x3F - - - DAYTPU - desc DAYTPU - 3 - 0 - read-write - - - DAYTPD - desc DAYTPD - 5 - 4 - read-write - - - - - MONTP - desc MONTP - 0x5C - 8 - read-write - 0x0 - 0x1F - - - MONTP - desc MONTP - 4 - 0 - read-write - - - - - - - SDIOC1 - desc SDIOC - 0x40070000 - - 0x0 - 0x54 - - - - BLKSIZE - desc BLKSIZE - 0x4 - 16 - read-write - 0x0 - 0xFFF - - - TBS - desc TBS - 11 - 0 - read-write - - - - - BLKCNT - desc BLKCNT - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - ARG0 - desc ARG0 - 0x8 - 16 - read-write - 0x0 - 0xFFFF - - - ARG1 - desc ARG1 - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - TRANSMODE - desc TRANSMODE - 0xC - 16 - read-write - 0x0 - 0x3E - - - BCE - desc BCE - 1 - 1 - read-write - - - ATCEN - desc ATCEN - 3 - 2 - read-write - - - DDIR - desc DDIR - 4 - 4 - read-write - - - MULB - desc MULB - 5 - 5 - read-write - - - - - CMD - desc CMD - 0xE - 16 - read-write - 0x0 - 0x3FFB - - - RESTYP - desc RESTYP - 1 - 0 - read-write - - - CCE - desc CCE - 3 - 3 - read-write - - - ICE - desc ICE - 4 - 4 - read-write - - - DAT - desc DAT - 5 - 5 - read-write - - - TYP - desc TYP - 7 - 6 - read-write - - - IDX - desc IDX - 13 - 8 - read-write - - - - - RESP0 - desc RESP0 - 0x10 - 16 - read-only - 0x0 - 0xFFFF - - - RESP1 - desc RESP1 - 0x12 - 16 - read-only - 0x0 - 0xFFFF - - - RESP2 - desc RESP2 - 0x14 - 16 - read-only - 0x0 - 0xFFFF - - - RESP3 - desc RESP3 - 0x16 - 16 - read-only - 0x0 - 0xFFFF - - - RESP4 - desc RESP4 - 0x18 - 16 - read-only - 0x0 - 0xFFFF - - - RESP5 - desc RESP5 - 0x1A - 16 - read-only - 0x0 - 0xFFFF - - - RESP6 - desc RESP6 - 0x1C - 16 - read-only - 0x0 - 0xFFFF - - - RESP7 - desc RESP7 - 0x1E - 16 - read-only - 0x0 - 0xFFFF - - - BUF0 - desc BUF0 - 0x20 - 16 - read-write - 0x0 - 0xFFFF - - - BUF1 - desc BUF1 - 0x22 - 16 - read-write - 0x0 - 0xFFFF - - - PSTAT - desc PSTAT - 0x24 - 32 - read-only - 0x0 - 0x1FF0F07 - - - CIC - desc CIC - 0 - 0 - read-only - - - CID - desc CID - 1 - 1 - read-only - - - DA - desc DA - 2 - 2 - read-only - - - WTA - desc WTA - 8 - 8 - read-only - - - RTA - desc RTA - 9 - 9 - read-only - - - BWE - desc BWE - 10 - 10 - read-only - - - BRE - desc BRE - 11 - 11 - read-only - - - CIN - desc CIN - 16 - 16 - read-only - - - CSS - desc CSS - 17 - 17 - read-only - - - CDL - desc CDL - 18 - 18 - read-only - - - WPL - desc WPL - 19 - 19 - read-only - - - DATL - desc DATL - 23 - 20 - read-only - - - CMDL - desc CMDL - 24 - 24 - read-only - - - - - HOSTCON - desc HOSTCON - 0x28 - 8 - read-write - 0x0 - 0xE6 - - - DW - desc DW - 1 - 1 - read-write - - - HSEN - desc HSEN - 2 - 2 - read-write - - - EXDW - desc EXDW - 5 - 5 - read-write - - - CDTL - desc CDTL - 6 - 6 - read-write - - - CDSS - desc CDSS - 7 - 7 - read-write - - - - - PWRCON - desc PWRCON - 0x29 - 8 - read-write - 0x0 - 0x1 - - - PWON - desc PWON - 0 - 0 - read-write - - - - - BLKGPCON - desc BLKGPCON - 0x2A - 8 - read-write - 0x0 - 0xF - - - SABGR - desc SABGR - 0 - 0 - read-write - - - CR - desc CR - 1 - 1 - read-write - - - RWC - desc RWC - 2 - 2 - read-write - - - IABG - desc IABG - 3 - 3 - read-write - - - - - CLKCON - desc CLKCON - 0x2C - 16 - read-write - 0x2 - 0xFF05 - - - ICE - desc ICE - 0 - 0 - read-write - - - CE - desc CE - 2 - 2 - read-write - - - FS - desc FS - 15 - 8 - read-write - - - - - TOUTCON - desc TOUTCON - 0x2E - 8 - read-write - 0x0 - 0xF - - - DTO - desc DTO - 3 - 0 - read-write - - - - - SFTRST - desc SFTRST - 0x2F - 8 - read-write - 0x0 - 0x7 - - - RSTA - desc RSTA - 0 - 0 - read-write - - - RSTC - desc RSTC - 1 - 1 - read-write - - - RSTD - desc RSTD - 2 - 2 - read-write - - - - - NORINTST - desc NORINTST - 0x30 - 16 - read-write - 0x0 - 0x81F7 - - - CC - desc CC - 0 - 0 - read-write - - - TC - desc TC - 1 - 1 - read-write - - - BGE - desc BGE - 2 - 2 - read-write - - - BWR - desc BWR - 4 - 4 - read-write - - - BRR - desc BRR - 5 - 5 - read-write - - - CIST - desc CIST - 6 - 6 - read-write - - - CRM - desc CRM - 7 - 7 - read-write - - - CINT - desc CINT - 8 - 8 - read-only - - - EI - desc EI - 15 - 15 - read-only - - - - - ERRINTST - desc ERRINTST - 0x32 - 16 - read-write - 0x0 - 0x17F - - - CTOE - desc CTOE - 0 - 0 - read-write - - - CCE - desc CCE - 1 - 1 - read-write - - - CEBE - desc CEBE - 2 - 2 - read-write - - - CIE - desc CIE - 3 - 3 - read-write - - - DTOE - desc DTOE - 4 - 4 - read-write - - - DCE - desc DCE - 5 - 5 - read-write - - - DEBE - desc DEBE - 6 - 6 - read-write - - - ACE - desc ACE - 8 - 8 - read-write - - - - - NORINTSTEN - desc NORINTSTEN - 0x34 - 16 - read-write - 0x0 - 0x1F7 - - - CCEN - desc CCEN - 0 - 0 - read-write - - - TCEN - desc TCEN - 1 - 1 - read-write - - - BGEEN - desc BGEEN - 2 - 2 - read-write - - - BWREN - desc BWREN - 4 - 4 - read-write - - - BRREN - desc BRREN - 5 - 5 - read-write - - - CISTEN - desc CISTEN - 6 - 6 - read-write - - - CRMEN - desc CRMEN - 7 - 7 - read-write - - - CINTEN - desc CINTEN - 8 - 8 - read-write - - - - - ERRINTSTEN - desc ERRINTSTEN - 0x36 - 16 - read-write - 0x0 - 0x17F - - - CTOEEN - desc CTOEEN - 0 - 0 - read-write - - - CCEEN - desc CCEEN - 1 - 1 - read-write - - - CEBEEN - desc CEBEEN - 2 - 2 - read-write - - - CIEEN - desc CIEEN - 3 - 3 - read-write - - - DTOEEN - desc DTOEEN - 4 - 4 - read-write - - - DCEEN - desc DCEEN - 5 - 5 - read-write - - - DEBEEN - desc DEBEEN - 6 - 6 - read-write - - - ACEEN - desc ACEEN - 8 - 8 - read-write - - - - - NORINTSGEN - desc NORINTSGEN - 0x38 - 16 - read-write - 0x0 - 0x1F7 - - - CCSEN - desc CCSEN - 0 - 0 - read-write - - - TCSEN - desc TCSEN - 1 - 1 - read-write - - - BGESEN - desc BGESEN - 2 - 2 - read-write - - - BWRSEN - desc BWRSEN - 4 - 4 - read-write - - - BRRSEN - desc BRRSEN - 5 - 5 - read-write - - - CISTSEN - desc CISTSEN - 6 - 6 - read-write - - - CRMSEN - desc CRMSEN - 7 - 7 - read-write - - - CINTSEN - desc CINTSEN - 8 - 8 - read-write - - - - - ERRINTSGEN - desc ERRINTSGEN - 0x3A - 16 - read-write - 0x0 - 0x17F - - - CTOESEN - desc CTOESEN - 0 - 0 - read-write - - - CCESEN - desc CCESEN - 1 - 1 - read-write - - - CEBESEN - desc CEBESEN - 2 - 2 - read-write - - - CIESEN - desc CIESEN - 3 - 3 - read-write - - - DTOESEN - desc DTOESEN - 4 - 4 - read-write - - - DCESEN - desc DCESEN - 5 - 5 - read-write - - - DEBESEN - desc DEBESEN - 6 - 6 - read-write - - - ACESEN - desc ACESEN - 8 - 8 - read-write - - - - - ATCERRST - desc ATCERRST - 0x3C - 16 - read-only - 0x0 - 0x9F - - - NE - desc NE - 0 - 0 - read-only - - - TOE - desc TOE - 1 - 1 - read-only - - - CE - desc CE - 2 - 2 - read-only - - - EBE - desc EBE - 3 - 3 - read-only - - - IE - desc IE - 4 - 4 - read-only - - - CMDE - desc CMDE - 7 - 7 - read-only - - - - - FEA - desc FEA - 0x50 - 16 - write-only - 0x0 - 0x9F - - - FNE - desc FNE - 0 - 0 - write-only - - - FTOE - desc FTOE - 1 - 1 - write-only - - - FCE - desc FCE - 2 - 2 - write-only - - - FEBE - desc FEBE - 3 - 3 - write-only - - - FIE - desc FIE - 4 - 4 - write-only - - - FCMDE - desc FCMDE - 7 - 7 - write-only - - - - - FEE - desc FEE - 0x52 - 16 - write-only - 0x0 - 0x17F - - - FCTOE - desc FCTOE - 0 - 0 - write-only - - - FCCE - desc FCCE - 1 - 1 - write-only - - - FCEBE - desc FCEBE - 2 - 2 - write-only - - - FCIE - desc FCIE - 3 - 3 - write-only - - - FDTOE - desc FDTOE - 4 - 4 - write-only - - - FDCE - desc FDCE - 5 - 5 - write-only - - - FDEBE - desc FDEBE - 6 - 6 - write-only - - - FACE - desc FACE - 8 - 8 - write-only - - - - - - - SDIOC2 - desc SDIOC - 0x40078400 - - 0x0 - 0x54 - - - - SMC - desc SMC - 0x88000000 - - 0x0 - 0x210 - - - - STSR - desc STSR - 0x0 - 32 - read-only - 0x1 - 0x1 - - - STATUS - desc STATUS - 0 - 0 - read-only - - - - - STCR0 - desc STCR0 - 0x8 - 32 - write-only - 0x0 - 0x4 - - - LPWIR - desc LPWIR - 2 - 2 - write-only - - - - - STCR1 - desc STCR1 - 0xC - 32 - write-only - 0x0 - 0x4 - - - LPWOR - desc LPWOR - 2 - 2 - write-only - - - - - CMDR - desc CMDR - 0x10 - 32 - write-only - 0x0 - 0x3FFFFFF - - - CMDADD - desc CMDADD - 19 - 0 - write-only - - - CRES - desc CRES - 20 - 20 - write-only - - - CMD - desc CMD - 22 - 21 - write-only - - - CMDCHIP - desc CMDCHIP - 25 - 23 - write-only - - - - - TMCR - desc TMCR - 0x14 - 32 - write-only - 0x0 - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - write-only - - - T_WC - desc T_WC - 7 - 4 - write-only - - - T_CEOE - desc T_CEOE - 10 - 8 - write-only - - - T_WP - desc T_WP - 14 - 12 - write-only - - - T_PC - desc T_PC - 18 - 16 - write-only - - - T_TR - desc T_TR - 22 - 20 - write-only - - - - - CPCR - desc CPCR - 0x18 - 32 - write-only - 0x0 - 0x1FFF - - - RSYN - desc RSYN - 0 - 0 - write-only - - - RBL - desc RBL - 3 - 1 - write-only - - - WSYN - desc WSYN - 4 - 4 - write-only - - - WBL - desc WBL - 7 - 5 - write-only - - - MW - desc MW - 9 - 8 - write-only - - - BAAS - desc BAAS - 10 - 10 - write-only - - - ADVS - desc ADVS - 11 - 11 - write-only - - - BLSS - desc BLSS - 12 - 12 - write-only - - - - - RFTR - desc RFTR - 0x20 - 32 - read-write - 0x0 - 0xF - - - REFPRD - desc REFPRD - 3 - 0 - read-write - - - - - TMSR0 - desc TMSR0 - 0x100 - 32 - read-only - 0x1263CC - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - read-only - - - T_WC - desc T_WC - 7 - 4 - read-only - - - T_CEOE - desc T_CEOE - 10 - 8 - read-only - - - T_WP - desc T_WP - 14 - 12 - read-only - - - T_PC - desc T_PC - 18 - 16 - read-only - - - T_TR - desc T_TR - 22 - 20 - read-only - - - - - CPSR0 - desc CPSR0 - 0x104 - 32 - read-only - 0xFF0A00 - 0xFFFF1FFF - - - RSYN - desc RSYN - 0 - 0 - read-only - - - RBL - desc RBL - 3 - 1 - read-only - - - WSYN - desc WSYN - 4 - 4 - read-only - - - WBL - desc WBL - 7 - 5 - read-only - - - MW - desc MW - 9 - 8 - read-only - - - BAAS - desc BAAS - 10 - 10 - read-only - - - ADVS - desc ADVS - 11 - 11 - read-only - - - BLSS - desc BLSS - 12 - 12 - read-only - - - ADDMSK - desc ADDMSK - 23 - 16 - read-only - - - ADDMAT - desc ADDMAT - 31 - 24 - read-only - - - - - TMSR1 - desc TMSR1 - 0x120 - 32 - read-only - 0x1263CC - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - read-only - - - T_WC - desc T_WC - 7 - 4 - read-only - - - T_CEOE - desc T_CEOE - 10 - 8 - read-only - - - T_WP - desc T_WP - 14 - 12 - read-only - - - T_PC - desc T_PC - 18 - 16 - read-only - - - T_TR - desc T_TR - 22 - 20 - read-only - - - - - CPSR1 - desc CPSR1 - 0x124 - 32 - read-only - 0xFF0A00 - 0xFFFF1FFF - - - RSYN - desc RSYN - 0 - 0 - read-only - - - RBL - desc RBL - 3 - 1 - read-only - - - WSYN - desc WSYN - 4 - 4 - read-only - - - WBL - desc WBL - 7 - 5 - read-only - - - MW - desc MW - 9 - 8 - read-only - - - BAAS - desc BAAS - 10 - 10 - read-only - - - ADVS - desc ADVS - 11 - 11 - read-only - - - BLSS - desc BLSS - 12 - 12 - read-only - - - ADDMSK - desc ADDMSK - 23 - 16 - read-only - - - ADDMAT - desc ADDMAT - 31 - 24 - read-only - - - - - TMSR2 - desc TMSR2 - 0x140 - 32 - read-only - 0x1263CC - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - read-only - - - T_WC - desc T_WC - 7 - 4 - read-only - - - T_CEOE - desc T_CEOE - 10 - 8 - read-only - - - T_WP - desc T_WP - 14 - 12 - read-only - - - T_PC - desc T_PC - 18 - 16 - read-only - - - T_TR - desc T_TR - 22 - 20 - read-only - - - - - CPSR2 - desc CPSR2 - 0x144 - 32 - read-only - 0xFF0A00 - 0xFFFF1FFF - - - RSYN - desc RSYN - 0 - 0 - read-only - - - RBL - desc RBL - 3 - 1 - read-only - - - WSYN - desc WSYN - 4 - 4 - read-only - - - WBL - desc WBL - 7 - 5 - read-only - - - MW - desc MW - 9 - 8 - read-only - - - BAAS - desc BAAS - 10 - 10 - read-only - - - ADVS - desc ADVS - 11 - 11 - read-only - - - BLSS - desc BLSS - 12 - 12 - read-only - - - ADDMSK - desc ADDMSK - 23 - 16 - read-only - - - ADDMAT - desc ADDMAT - 31 - 24 - read-only - - - - - TMSR3 - desc TMSR3 - 0x160 - 32 - read-only - 0x1263CC - 0x17777FF - - - T_RC - desc T_RC - 3 - 0 - read-only - - - T_WC - desc T_WC - 7 - 4 - read-only - - - T_CEOE - desc T_CEOE - 10 - 8 - read-only - - - T_WP - desc T_WP - 14 - 12 - read-only - - - T_PC - desc T_PC - 18 - 16 - read-only - - - T_TR - desc T_TR - 22 - 20 - read-only - - - - - CPSR3 - desc CPSR3 - 0x164 - 32 - read-only - 0xFF0A00 - 0xFFFF1FFF - - - RSYN - desc RSYN - 0 - 0 - read-only - - - RBL - desc RBL - 3 - 1 - read-only - - - WSYN - desc WSYN - 4 - 4 - read-only - - - WBL - desc WBL - 7 - 5 - read-only - - - MW - desc MW - 9 - 8 - read-only - - - BAAS - desc BAAS - 10 - 10 - read-only - - - ADVS - desc ADVS - 11 - 11 - read-only - - - BLSS - desc BLSS - 12 - 12 - read-only - - - ADDMSK - desc ADDMSK - 23 - 16 - read-only - - - ADDMAT - desc ADDMAT - 31 - 24 - read-only - - - - - BACR - desc BACR - 0x200 - 32 - read-write - 0x300 - 0xC010 - - - MUXMD - desc MUXMD - 4 - 4 - read-write - - - CKSEL - desc CKSEL - 15 - 14 - read-write - - - - - CSCR0 - desc CSCR0 - 0x208 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - ADDMSK0 - desc ADDMSK0 - 7 - 0 - read-write - - - ADDMSK1 - desc ADDMSK1 - 15 - 8 - read-write - - - ADDMSK2 - desc ADDMSK2 - 23 - 16 - read-write - - - ADDMSK3 - desc ADDMSK3 - 31 - 24 - read-write - - - - - CSCR1 - desc CSCR1 - 0x20C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - ADDMAT0 - desc ADDMAT0 - 7 - 0 - read-write - - - ADDMAT1 - desc ADDMAT1 - 15 - 8 - read-write - - - ADDMAT2 - desc ADDMAT2 - 23 - 16 - read-write - - - ADDMAT3 - desc ADDMAT3 - 31 - 24 - read-write - - - - - - - SPI1 - desc SPI - 0x4001C000 - - 0x0 - 0x1C - - - - DR - desc DR - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - CR1 - desc CR1 - 0x4 - 32 - read-write - 0x0 - 0xFFFB - - - SPIMDS - desc SPIMDS - 0 - 0 - read-write - - - TXMDS - desc TXMDS - 1 - 1 - read-write - - - MSTR - desc MSTR - 3 - 3 - read-write - - - SPLPBK - desc SPLPBK - 4 - 4 - read-write - - - SPLPBK2 - desc SPLPBK2 - 5 - 5 - read-write - - - SPE - desc SPE - 6 - 6 - read-write - - - CSUSPE - desc CSUSPE - 7 - 7 - read-write - - - EIE - desc EIE - 8 - 8 - read-write - - - TXIE - desc TXIE - 9 - 9 - read-write - - - RXIE - desc RXIE - 10 - 10 - read-write - - - IDIE - desc IDIE - 11 - 11 - read-write - - - MODFE - desc MODFE - 12 - 12 - read-write - - - PATE - desc PATE - 13 - 13 - read-write - - - PAOE - desc PAOE - 14 - 14 - read-write - - - PAE - desc PAE - 15 - 15 - read-write - - - - - CFG1 - desc CFG1 - 0xC - 32 - read-write - 0x10 - 0x77700F43 - - - FTHLV - desc FTHLV - 1 - 0 - read-write - - - SPRDTD - desc SPRDTD - 6 - 6 - read-write - - - SS0PV - desc SS0PV - 8 - 8 - read-write - - - SS1PV - desc SS1PV - 9 - 9 - read-write - - - SS2PV - desc SS2PV - 10 - 10 - read-write - - - SS3PV - desc SS3PV - 11 - 11 - read-write - - - MSSI - desc MSSI - 22 - 20 - read-write - - - MSSDL - desc MSSDL - 26 - 24 - read-write - - - MIDI - desc MIDI - 30 - 28 - read-write - - - - - SR - desc SR - 0x14 - 32 - read-write - 0x20 - 0xBF - - - OVRERF - desc OVRERF - 0 - 0 - read-write - - - IDLNF - desc IDLNF - 1 - 1 - read-only - - - MODFERF - desc MODFERF - 2 - 2 - read-write - - - PERF - desc PERF - 3 - 3 - read-write - - - UDRERF - desc UDRERF - 4 - 4 - read-write - - - TDEF - desc TDEF - 5 - 5 - read-only - - - RDFF - desc RDFF - 7 - 7 - read-only - - - - - CFG2 - desc CFG2 - 0x18 - 32 - read-write - 0xF1D - 0xFFFF - - - CPHA - desc CPHA - 0 - 0 - read-write - - - CPOL - desc CPOL - 1 - 1 - read-write - - - MBR - desc MBR - 4 - 2 - read-write - - - SSA - desc SSA - 7 - 5 - read-write - - - DSIZE - desc DSIZE - 11 - 8 - read-write - - - LSBF - desc LSBF - 12 - 12 - read-write - - - MIDIE - desc MIDIE - 13 - 13 - read-write - - - MSSDLE - desc MSSDLE - 14 - 14 - read-write - - - MSSIE - desc MSSIE - 15 - 15 - read-write - - - - - - - SPI2 - desc SPI - 0x4001C400 - - 0x0 - 0x1C - - - - SPI3 - desc SPI - 0x4001C800 - - 0x0 - 0x1C - - - - SPI4 - desc SPI - 0x40020000 - - 0x0 - 0x1C - - - - SPI5 - desc SPI - 0x40020400 - - 0x0 - 0x1C - - - - SPI6 - desc SPI - 0x40020800 - - 0x0 - 0x1C - - - - SRAMC - desc SRAMC - 0x40050800 - - 0x0 - 0x14 - - - - WTCR - desc WTCR - 0x0 - 32 - read-write - 0x0 - 0x77777777 - - - SRAM123RWT - desc SRAM123RWT - 2 - 0 - read-write - - - SRAM123WWT - desc SRAM123WWT - 6 - 4 - read-write - - - SRAM4RWT - desc SRAM4RWT - 10 - 8 - read-write - - - SRAM4WWT - desc SRAM4WWT - 14 - 12 - read-write - - - SRAMHRWT - desc SRAMHRWT - 18 - 16 - read-write - - - SRAMHWWT - desc SRAMHWWT - 22 - 20 - read-write - - - SRAMBRWT - desc SRAMBRWT - 26 - 24 - read-write - - - SRAMBWWT - desc SRAMBWWT - 30 - 28 - read-write - - - - - WTPR - desc WTPR - 0x4 - 32 - read-write - 0x0 - 0xFF - - - WTPRC - desc WTPRC - 0 - 0 - read-write - - - WTPRKW - desc WTPRKW - 7 - 1 - read-write - - - - - CKCR - desc CKCR - 0x8 - 32 - read-write - 0x0 - 0xF030001 - - - PYOAD - desc PYOAD - 0 - 0 - read-write - - - ECCOAD - desc ECCOAD - 16 - 16 - read-write - - - BECCOAD - desc BECCOAD - 17 - 17 - read-write - - - ECCMOD - desc ECCMOD - 25 - 24 - read-write - - - BECCMOD - desc BECCMOD - 27 - 26 - read-write - - - - - CKPR - desc CKPR - 0xC - 32 - read-write - 0x0 - 0xFF - - - CKPRC - desc CKPRC - 0 - 0 - read-write - - - CKPRKW - desc CKPRKW - 7 - 1 - read-write - - - - - CKSR - desc CKSR - 0x10 - 32 - read-write - 0x0 - 0x1FF - - - SRAM1_PYERR - desc SRAM1_PYERR - 0 - 0 - read-write - - - SRAM2_PYERR - desc SRAM2_PYERR - 1 - 1 - read-write - - - SRAM3_PYERR - desc SRAM3_PYERR - 2 - 2 - read-write - - - SRAMH_PYERR - desc SRAMH_PYERR - 3 - 3 - read-write - - - SRAM4_1ERR - desc SRAM4_1ERR - 4 - 4 - read-write - - - SRAM4_2ERR - desc SRAM4_2ERR - 5 - 5 - read-write - - - SRAMB_1ERR - desc SRAMB_1ERR - 6 - 6 - read-write - - - SRAMB_2ERR - desc SRAMB_2ERR - 7 - 7 - read-write - - - CACHE_PYERR - desc CACHE_PYERR - 8 - 8 - read-write - - - - - - - SWDT - desc SWDT - 0x40049400 - - 0x0 - 0xC - - - - CR - desc CR - 0x0 - 32 - read-write - 0x80010FF3 - 0x80010FF3 - - - PERI - desc PERI - 1 - 0 - read-write - - - CKS - desc CKS - 7 - 4 - read-write - - - WDPT - desc WDPT - 11 - 8 - read-write - - - SLPOFF - desc SLPOFF - 16 - 16 - read-write - - - ITS - desc ITS - 31 - 31 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-write - 0x0 - 0x3FFFF - - - CNT - desc CNT - 15 - 0 - read-only - - - UDF - desc UDF - 16 - 16 - read-write - - - REF - desc REF - 17 - 17 - read-write - - - - - RR - desc RR - 0x8 - 32 - read-write - 0x0 - 0xFFFF - - - RF - desc RF - 15 - 0 - read-write - - - - - - - TMR01 - desc TMR0 - 0x40024000 - - 0x0 - 0x18 - - - - CNTAR - desc CNTAR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - CNTA - desc CNTA - 15 - 0 - read-write - - - - - CNTBR - desc CNTBR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - CNTB - desc CNTB - 15 - 0 - read-write - - - - - CMPAR - desc CMPAR - 0x8 - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPA - desc CMPA - 15 - 0 - read-write - - - - - CMPBR - desc CMPBR - 0xC - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPB - desc CMPB - 15 - 0 - read-write - - - - - BCONR - desc BCONR - 0x10 - 32 - read-write - 0x0 - 0xF7F7F7F7 - - - CSTA - desc CSTA - 0 - 0 - read-write - - - CAPMDA - desc CAPMDA - 1 - 1 - read-write - - - INTENA - desc INTENA - 2 - 2 - read-write - - - CKDIVA - desc CKDIVA - 7 - 4 - read-write - - - SYNSA - desc SYNSA - 8 - 8 - read-write - - - SYNCLKA - desc SYNCLKA - 9 - 9 - read-write - - - ASYNCLKA - desc ASYNCLKA - 10 - 10 - read-write - - - HSTAA - desc HSTAA - 12 - 12 - read-write - - - HSTPA - desc HSTPA - 13 - 13 - read-write - - - HCLEA - desc HCLEA - 14 - 14 - read-write - - - HICPA - desc HICPA - 15 - 15 - read-write - - - CSTB - desc CSTB - 16 - 16 - read-write - - - CAPMDB - desc CAPMDB - 17 - 17 - read-write - - - INTENB - desc INTENB - 18 - 18 - read-write - - - CKDIVB - desc CKDIVB - 23 - 20 - read-write - - - SYNSB - desc SYNSB - 24 - 24 - read-write - - - SYNCLKB - desc SYNCLKB - 25 - 25 - read-write - - - ASYNCLKB - desc ASYNCLKB - 26 - 26 - read-write - - - HSTAB - desc HSTAB - 28 - 28 - read-write - - - HSTPB - desc HSTPB - 29 - 29 - read-write - - - HCLEB - desc HCLEB - 30 - 30 - read-write - - - HICPB - desc HICPB - 31 - 31 - read-write - - - - - STFLR - desc STFLR - 0x14 - 32 - read-write - 0x0 - 0x10001 - - - CMFA - desc CMFA - 0 - 0 - read-write - - - CMFB - desc CMFB - 16 - 16 - read-write - - - - - - - TMR02 - desc TMR0 - 0x40024400 - - 0x0 - 0x18 - - - - TMR21 - desc TMR2 - 0x40024800 - - 0x0 - 0x24 - - - - CNTAR - desc CNTAR - 0x0 - 32 - read-write - 0x0 - 0xFFFF - - - CNTA - desc CNTA - 15 - 0 - read-write - - - - - CNTBR - desc CNTBR - 0x4 - 32 - read-write - 0x0 - 0xFFFF - - - CNTB - desc CNTB - 15 - 0 - read-write - - - - - CMPAR - desc CMPAR - 0x8 - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPA - desc CMPA - 15 - 0 - read-write - - - - - CMPBR - desc CMPBR - 0xC - 32 - read-write - 0xFFFF - 0xFFFF - - - CMPB - desc CMPB - 15 - 0 - read-write - - - - - BCONR - desc BCONR - 0x10 - 32 - read-write - 0x0 - 0x3FFB3FFB - - - CSTA - desc CSTA - 0 - 0 - read-write - - - CAPMDA - desc CAPMDA - 1 - 1 - read-write - - - SYNSA - desc SYNSA - 3 - 3 - read-write - - - CKDIVA - desc CKDIVA - 7 - 4 - read-write - - - SYNCLKA - desc SYNCLKA - 9 - 8 - read-write - - - ASYNCLKA - desc ASYNCLKA - 11 - 10 - read-write - - - SYNCLKAT - desc SYNCLKAT - 13 - 12 - read-write - - - CSTB - desc CSTB - 16 - 16 - read-write - - - CAPMDB - desc CAPMDB - 17 - 17 - read-write - - - SYNSB - desc SYNSB - 19 - 19 - read-write - - - CKDIVB - desc CKDIVB - 23 - 20 - read-write - - - SYNCLKB - desc SYNCLKB - 25 - 24 - read-write - - - ASYNCLKB - desc ASYNCLKB - 27 - 26 - read-write - - - SYNCLKBT - desc SYNCLKBT - 29 - 28 - read-write - - - - - ICONR - desc ICONR - 0x14 - 32 - read-write - 0x0 - 0x30003 - - - CMENA - desc CMENA - 0 - 0 - read-write - - - OVENA - desc OVENA - 1 - 1 - read-write - - - CMENB - desc CMENB - 16 - 16 - read-write - - - OVENB - desc OVENB - 17 - 17 - read-write - - - - - PCONR - desc PCONR - 0x18 - 32 - read-write - 0x0 - 0x713F713F - - - STACA - desc STACA - 1 - 0 - read-write - - - STPCA - desc STPCA - 3 - 2 - read-write - - - CMPCA - desc CMPCA - 5 - 4 - read-write - - - OUTENA - desc OUTENA - 8 - 8 - read-write - - - NOFIENA - desc NOFIENA - 12 - 12 - read-write - - - NOFICKA - desc NOFICKA - 14 - 13 - read-write - - - STACB - desc STACB - 17 - 16 - read-write - - - STPCB - desc STPCB - 19 - 18 - read-write - - - CMPCB - desc CMPCB - 21 - 20 - read-write - - - OUTENB - desc OUTENB - 24 - 24 - read-write - - - NOFIENB - desc NOFIENB - 28 - 28 - read-write - - - NOFICKB - desc NOFICKB - 30 - 29 - read-write - - - - - HCONR - desc HCONR - 0x1C - 32 - read-write - 0x0 - 0x77777777 - - - HSTAA0 - desc HSTAA0 - 0 - 0 - read-write - - - HSTAA1 - desc HSTAA1 - 1 - 1 - read-write - - - HSTAA2 - desc HSTAA2 - 2 - 2 - read-write - - - HSTPA0 - desc HSTPA0 - 4 - 4 - read-write - - - HSTPA1 - desc HSTPA1 - 5 - 5 - read-write - - - HSTPA2 - desc HSTPA2 - 6 - 6 - read-write - - - HCLEA0 - desc HCLEA0 - 8 - 8 - read-write - - - HCLEA1 - desc HCLEA1 - 9 - 9 - read-write - - - HCLEA2 - desc HCLEA2 - 10 - 10 - read-write - - - HICPA0 - desc HICPA0 - 12 - 12 - read-write - - - HICPA1 - desc HICPA1 - 13 - 13 - read-write - - - HICPA2 - desc HICPA2 - 14 - 14 - read-write - - - HSTAB0 - desc HSTAB0 - 16 - 16 - read-write - - - HSTAB1 - desc HSTAB1 - 17 - 17 - read-write - - - HSTAB2 - desc HSTAB2 - 18 - 18 - read-write - - - HSTPB0 - desc HSTPB0 - 20 - 20 - read-write - - - HSTPB1 - desc HSTPB1 - 21 - 21 - read-write - - - HSTPB2 - desc HSTPB2 - 22 - 22 - read-write - - - HCLEB0 - desc HCLEB0 - 24 - 24 - read-write - - - HCLEB1 - desc HCLEB1 - 25 - 25 - read-write - - - HCLEB2 - desc HCLEB2 - 26 - 26 - read-write - - - HICPB0 - desc HICPB0 - 28 - 28 - read-write - - - HICPB1 - desc HICPB1 - 29 - 29 - read-write - - - HICPB2 - desc HICPB2 - 30 - 30 - read-write - - - - - STFLR - desc STFLR - 0x20 - 32 - read-write - 0x0 - 0x1030003 - - - CMFA - desc CMFA - 0 - 0 - read-write - - - OVFA - desc OVFA - 1 - 1 - read-write - - - CMFB - desc CMFB - 16 - 16 - read-write - - - OVFB - desc OVFB - 17 - 17 - read-write - - - - - - - TMR22 - desc TMR2 - 0x40024C00 - - 0x0 - 0x24 - - - - TMR23 - desc TMR2 - 0x40025000 - - 0x0 - 0x24 - - - - TMR24 - desc TMR2 - 0x40025400 - - 0x0 - 0x24 - - - - TMR41 - desc TMR4 - 0x40038000 - - 0x0 - 0xE6 - - - - OCCRUH - desc OCCRUH - 0x2 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRUL - desc OCCRUL - 0x6 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRVH - desc OCCRVH - 0xA - 16 - read-write - 0x0 - 0xFFFF - - - OCCRVL - desc OCCRVL - 0xE - 16 - read-write - 0x0 - 0xFFFF - - - OCCRWH - desc OCCRWH - 0x12 - 16 - read-write - 0x0 - 0xFFFF - - - OCCRWL - desc OCCRWL - 0x16 - 16 - read-write - 0x0 - 0xFFFF - - - OCSRU - desc OCSRU - 0x18 - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERU - desc OCERU - 0x1A - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCSRV - desc OCSRV - 0x1C - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERV - desc OCERV - 0x1E - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCSRW - desc OCSRW - 0x20 - 16 - read-write - 0xFF00 - 0xFF - - - OCEH - desc OCEH - 0 - 0 - read-write - - - OCEL - desc OCEL - 1 - 1 - read-write - - - OCPH - desc OCPH - 2 - 2 - read-write - - - OCPL - desc OCPL - 3 - 3 - read-write - - - OCIEH - desc OCIEH - 4 - 4 - read-write - - - OCIEL - desc OCIEL - 5 - 5 - read-write - - - OCFH - desc OCFH - 6 - 6 - read-write - - - OCFL - desc OCFL - 7 - 7 - read-write - - - - - OCERW - desc OCERW - 0x22 - 16 - read-write - 0x0 - 0x3FFF - - - CHBUFEN - desc CHBUFEN - 1 - 0 - read-write - - - CLBUFEN - desc CLBUFEN - 3 - 2 - read-write - - - MHBUFEN - desc MHBUFEN - 5 - 4 - read-write - - - MLBUFEN - desc MLBUFEN - 7 - 6 - read-write - - - LMCH - desc LMCH - 8 - 8 - read-write - - - LMCL - desc LMCL - 9 - 9 - read-write - - - LMMH - desc LMMH - 10 - 10 - read-write - - - LMML - desc LMML - 11 - 11 - read-write - - - MCECH - desc MCECH - 12 - 12 - read-write - - - MCECL - desc MCECL - 13 - 13 - read-write - - - - - OCMRHUH - desc OCMRHUH - 0x24 - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLUL - desc OCMRLUL - 0x28 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - OCMRHVH - desc OCMRHVH - 0x2C - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLVL - desc OCMRLVL - 0x30 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - OCMRHWH - desc OCMRHWH - 0x34 - 16 - read-write - 0x0 - 0xFFFF - - - OCFDCH - desc OCFDCH - 0 - 0 - read-write - - - OCFPKH - desc OCFPKH - 1 - 1 - read-write - - - OCFUCH - desc OCFUCH - 2 - 2 - read-write - - - OCFZRH - desc OCFZRH - 3 - 3 - read-write - - - OPDCH - desc OPDCH - 5 - 4 - read-write - - - OPPKH - desc OPPKH - 7 - 6 - read-write - - - OPUCH - desc OPUCH - 9 - 8 - read-write - - - OPZRH - desc OPZRH - 11 - 10 - read-write - - - OPNPKH - desc OPNPKH - 13 - 12 - read-write - - - OPNZRH - desc OPNZRH - 15 - 14 - read-write - - - - - OCMRLWL - desc OCMRLWL - 0x38 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - OCFDCL - desc OCFDCL - 0 - 0 - read-write - - - OCFPKL - desc OCFPKL - 1 - 1 - read-write - - - OCFUCL - desc OCFUCL - 2 - 2 - read-write - - - OCFZRL - desc OCFZRL - 3 - 3 - read-write - - - OPDCL - desc OPDCL - 5 - 4 - read-write - - - OPPKL - desc OPPKL - 7 - 6 - read-write - - - OPUCL - desc OPUCL - 9 - 8 - read-write - - - OPZRL - desc OPZRL - 11 - 10 - read-write - - - OPNPKL - desc OPNPKL - 13 - 12 - read-write - - - OPNZRL - desc OPNZRL - 15 - 14 - read-write - - - EOPNDCL - desc EOPNDCL - 17 - 16 - read-write - - - EOPNUCL - desc EOPNUCL - 19 - 18 - read-write - - - EOPDCL - desc EOPDCL - 21 - 20 - read-write - - - EOPPKL - desc EOPPKL - 23 - 22 - read-write - - - EOPUCL - desc EOPUCL - 25 - 24 - read-write - - - EOPZRL - desc EOPZRL - 27 - 26 - read-write - - - EOPNPKL - desc EOPNPKL - 29 - 28 - read-write - - - EOPNZRL - desc EOPNZRL - 31 - 30 - read-write - - - - - CPSR - desc CPSR - 0x42 - 16 - read-write - 0xFFFF - 0xFFFF - - - CNTR - desc CNTR - 0x46 - 16 - read-write - 0x0 - 0xFFFF - - - CCSR - desc CCSR - 0x48 - 16 - read-write - 0x40 - 0xE3FF - - - CKDIV - desc CKDIV - 3 - 0 - read-write - - - CLEAR - desc CLEAR - 4 - 4 - read-write - - - MODE - desc MODE - 5 - 5 - read-write - - - STOP - desc STOP - 6 - 6 - read-write - - - BUFEN - desc BUFEN - 7 - 7 - read-write - - - IRQPEN - desc IRQPEN - 8 - 8 - read-write - - - IRQPF - desc IRQPF - 9 - 9 - read-write - - - IRQZEN - desc IRQZEN - 13 - 13 - read-write - - - IRQZF - desc IRQZF - 14 - 14 - read-write - - - ECKEN - desc ECKEN - 15 - 15 - read-write - - - - - CVPR - desc CVPR - 0x4A - 16 - read-write - 0x0 - 0xFFFF - - - ZIM - desc ZIM - 3 - 0 - read-write - - - PIM - desc PIM - 7 - 4 - read-write - - - ZIC - desc ZIC - 11 - 8 - read-only - - - PIC - desc PIC - 15 - 12 - read-only - - - - - PFSRU - desc PFSRU - 0x82 - 16 - read-write - 0x0 - 0xFFFF - - - PDARU - desc PDARU - 0x84 - 16 - read-write - 0x0 - 0xFFFF - - - PDBRU - desc PDBRU - 0x86 - 16 - read-write - 0x0 - 0xFFFF - - - PFSRV - desc PFSRV - 0x8A - 16 - read-write - 0x0 - 0xFFFF - - - PDARV - desc PDARV - 0x8C - 16 - read-write - 0x0 - 0xFFFF - - - PDBRV - desc PDBRV - 0x8E - 16 - read-write - 0x0 - 0xFFFF - - - PFSRW - desc PFSRW - 0x92 - 16 - read-write - 0x0 - 0xFFFF - - - PDARW - desc PDARW - 0x94 - 16 - read-write - 0x0 - 0xFFFF - - - PDBRW - desc PDBRW - 0x96 - 16 - read-write - 0x0 - 0xFFFF - - - POCRU - desc POCRU - 0x98 - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - POCRV - desc POCRV - 0x9C - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - POCRW - desc POCRW - 0xA0 - 16 - read-write - 0xFF00 - 0xF7 - - - DIVCK - desc DIVCK - 2 - 0 - read-write - - - PWMMD - desc PWMMD - 5 - 4 - read-write - - - LVLS - desc LVLS - 7 - 6 - read-write - - - - - RCSR - desc RCSR - 0xA4 - 16 - read-write - 0x0 - 0xFFF7 - - - RTIDU - desc RTIDU - 0 - 0 - read-write - - - RTIDV - desc RTIDV - 1 - 1 - read-write - - - RTIDW - desc RTIDW - 2 - 2 - read-write - - - RTIFU - desc RTIFU - 4 - 4 - read-only - - - RTICU - desc RTICU - 5 - 5 - read-write - - - RTEU - desc RTEU - 6 - 6 - read-write - - - RTSU - desc RTSU - 7 - 7 - read-write - - - RTIFV - desc RTIFV - 8 - 8 - read-only - - - RTICV - desc RTICV - 9 - 9 - read-write - - - RTEV - desc RTEV - 10 - 10 - read-write - - - RTSV - desc RTSV - 11 - 11 - read-write - - - RTIFW - desc RTIFW - 12 - 12 - read-only - - - RTICW - desc RTICW - 13 - 13 - read-write - - - RTEW - desc RTEW - 14 - 14 - read-write - - - RTSW - desc RTSW - 15 - 15 - read-write - - - - - SCCRUH - desc SCCRUH - 0xB2 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRUL - desc SCCRUL - 0xB6 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRVH - desc SCCRVH - 0xBA - 16 - read-write - 0x0 - 0xFFFF - - - SCCRVL - desc SCCRVL - 0xBE - 16 - read-write - 0x0 - 0xFFFF - - - SCCRWH - desc SCCRWH - 0xC2 - 16 - read-write - 0x0 - 0xFFFF - - - SCCRWL - desc SCCRWL - 0xC6 - 16 - read-write - 0x0 - 0xFFFF - - - SCSRUH - desc SCSRUH - 0xC8 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRUH - desc SCMRUH - 0xCA - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRUL - desc SCSRUL - 0xCC - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRUL - desc SCMRUL - 0xCE - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRVH - desc SCSRVH - 0xD0 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRVH - desc SCMRVH - 0xD2 - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRVL - desc SCSRVL - 0xD4 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRVL - desc SCMRVL - 0xD6 - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRWH - desc SCSRWH - 0xD8 - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRWH - desc SCMRWH - 0xDA - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - SCSRWL - desc SCSRWL - 0xDC - 16 - read-write - 0x0 - 0xF33F - - - BUFEN - desc BUFEN - 1 - 0 - read-write - - - EVTOS - desc EVTOS - 4 - 2 - read-write - - - LMC - desc LMC - 5 - 5 - read-write - - - EVTMS - desc EVTMS - 8 - 8 - read-write - - - EVTDS - desc EVTDS - 9 - 9 - read-write - - - DEN - desc DEN - 12 - 12 - read-write - - - PEN - desc PEN - 13 - 13 - read-write - - - UEN - desc UEN - 14 - 14 - read-write - - - ZEN - desc ZEN - 15 - 15 - read-write - - - - - SCMRWL - desc SCMRWL - 0xDE - 16 - read-write - 0xFF00 - 0xCF - - - AMC - desc AMC - 3 - 0 - read-write - - - MZCE - desc MZCE - 6 - 6 - read-write - - - MPCE - desc MPCE - 7 - 7 - read-write - - - - - PSCR - desc PSCR - 0xE0 - 32 - read-write - 0x5550000 - 0xFFF03FF - - - OEUH - desc OEUH - 0 - 0 - read-write - - - OEUL - desc OEUL - 1 - 1 - read-write - - - OEVH - desc OEVH - 2 - 2 - read-write - - - OEVL - desc OEVL - 3 - 3 - read-write - - - OEWH - desc OEWH - 4 - 4 - read-write - - - OEWL - desc OEWL - 5 - 5 - read-write - - - ODT - desc ODT - 7 - 6 - read-write - - - MOE - desc MOE - 8 - 8 - read-write - - - AOE - desc AOE - 9 - 9 - read-write - - - OSUH - desc OSUH - 17 - 16 - read-write - - - OSUL - desc OSUL - 19 - 18 - read-write - - - OSVH - desc OSVH - 21 - 20 - read-write - - - OSVL - desc OSVL - 23 - 22 - read-write - - - OSWH - desc OSWH - 25 - 24 - read-write - - - OSWL - desc OSWL - 27 - 26 - read-write - - - - - SCER - desc SCER - 0xE4 - 16 - read-write - 0xFF00 - 0xF - - - EVTRS - desc EVTRS - 2 - 0 - read-write - - - PCTS - desc PCTS - 3 - 3 - read-write - - - - - - - TMR42 - desc TMR4 - 0x40038400 - - 0x0 - 0xE6 - - - - TMR43 - desc TMR4 - 0x40038800 - - 0x0 - 0xE6 - - - - TMR61 - desc TMR6 - 0x40018000 - - 0x0 - 0x1A0 - - - - CNTER - desc CNTER - 0x0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - UPDAR - desc UPDAR - 0x4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - PERAR - desc PERAR - 0x40 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - PERBR - desc PERBR - 0x44 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - PERCR - desc PERCR - 0x48 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMAR - desc GCMAR - 0x80 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMBR - desc GCMBR - 0x84 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMCR - desc GCMCR - 0x88 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMDR - desc GCMDR - 0x8C - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMER - desc GCMER - 0x90 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCMFR - desc GCMFR - 0x94 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMAR - desc SCMAR - 0xC0 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMBR - desc SCMBR - 0xC4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMCR - desc SCMCR - 0xC8 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMDR - desc SCMDR - 0xCC - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMER - desc SCMER - 0xD0 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - SCMFR - desc SCMFR - 0xD4 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - DTUAR - desc DTUAR - 0x100 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - DTDAR - desc DTDAR - 0x104 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - DTUBR - desc DTUBR - 0x108 - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - DTDBR - desc DTDBR - 0x10C - 32 - read-write - 0xFFFFFFFF - 0xFFFFFFFF - - - GCONR - desc GCONR - 0x140 - 32 - read-write - 0x2 - 0xF01F7 - - - START - desc START - 0 - 0 - read-write - - - DIR - desc DIR - 1 - 1 - read-write - - - MODE - desc MODE - 2 - 2 - read-write - - - CKDIV - desc CKDIV - 7 - 4 - read-write - - - OVSTP - desc OVSTP - 8 - 8 - read-write - - - ZMSKREV - desc ZMSKREV - 16 - 16 - read-write - - - ZMSKPOS - desc ZMSKPOS - 17 - 17 - read-write - - - ZMSKVAL - desc ZMSKVAL - 19 - 18 - read-write - - - - - ICONR - desc ICONR - 0x144 - 32 - read-write - 0x0 - 0xF01FF - - - INTENA - desc INTENA - 0 - 0 - read-write - - - INTENB - desc INTENB - 1 - 1 - read-write - - - INTENC - desc INTENC - 2 - 2 - read-write - - - INTEND - desc INTEND - 3 - 3 - read-write - - - INTENE - desc INTENE - 4 - 4 - read-write - - - INTENF - desc INTENF - 5 - 5 - read-write - - - INTENOVF - desc INTENOVF - 6 - 6 - read-write - - - INTENUDF - desc INTENUDF - 7 - 7 - read-write - - - INTENDTE - desc INTENDTE - 8 - 8 - read-write - - - INTENSAU - desc INTENSAU - 16 - 16 - read-write - - - INTENSAD - desc INTENSAD - 17 - 17 - read-write - - - INTENSBU - desc INTENSBU - 18 - 18 - read-write - - - INTENSBD - desc INTENSBD - 19 - 19 - read-write - - - - - BCONR - desc BCONR - 0x148 - 32 - read-write - 0x0 - 0xFF0FFF - - - BENA - desc BENA - 0 - 0 - read-write - - - BSEA - desc BSEA - 1 - 1 - read-write - - - BTRUA - desc BTRUA - 2 - 2 - read-write - - - BTRDA - desc BTRDA - 3 - 3 - read-write - - - BENB - desc BENB - 4 - 4 - read-write - - - BSEB - desc BSEB - 5 - 5 - read-write - - - BTRUB - desc BTRUB - 6 - 6 - read-write - - - BTRDB - desc BTRDB - 7 - 7 - read-write - - - BENP - desc BENP - 8 - 8 - read-write - - - BSEP - desc BSEP - 9 - 9 - read-write - - - BTRUP - desc BTRUP - 10 - 10 - read-write - - - BTRDP - desc BTRDP - 11 - 11 - read-write - - - BENSPA - desc BENSPA - 16 - 16 - read-write - - - BSESPA - desc BSESPA - 17 - 17 - read-write - - - BTRUSPA - desc BTRUSPA - 18 - 18 - read-write - - - BTRDSPA - desc BTRDSPA - 19 - 19 - read-write - - - BENSPB - desc BENSPB - 20 - 20 - read-write - - - BSESPB - desc BSESPB - 21 - 21 - read-write - - - BTRUSPB - desc BTRUSPB - 22 - 22 - read-write - - - BTRDSPB - desc BTRDSPB - 23 - 23 - read-write - - - - - DCONR - desc DCONR - 0x14C - 32 - read-write - 0x0 - 0xF3 - - - DTCEN - desc DTCEN - 0 - 0 - read-write - - - SEPA - desc SEPA - 1 - 1 - read-write - - - DTBENU - desc DTBENU - 4 - 4 - read-write - - - DTBEND - desc DTBEND - 5 - 5 - read-write - - - DTBTRU - desc DTBTRU - 6 - 6 - read-write - - - DTBTRD - desc DTBTRD - 7 - 7 - read-write - - - - - PCNAR - desc PCNAR - 0x154 - 32 - read-write - 0x0 - 0x93F3FFFF - - - STACA - desc STACA - 1 - 0 - read-write - - - STPCA - desc STPCA - 3 - 2 - read-write - - - OVFCA - desc OVFCA - 5 - 4 - read-write - - - UDFCA - desc UDFCA - 7 - 6 - read-write - - - CMAUCA - desc CMAUCA - 9 - 8 - read-write - - - CMADCA - desc CMADCA - 11 - 10 - read-write - - - CMBUCA - desc CMBUCA - 13 - 12 - read-write - - - CMBDCA - desc CMBDCA - 15 - 14 - read-write - - - FORCA - desc FORCA - 17 - 16 - read-write - - - EMBCA - desc EMBCA - 21 - 20 - read-write - - - EMBRA - desc EMBRA - 23 - 22 - read-write - - - EMBSA - desc EMBSA - 25 - 24 - read-write - - - OUTENA - desc OUTENA - 28 - 28 - read-write - - - CAPMDA - desc CAPMDA - 31 - 31 - read-write - - - - - PCNBR - desc PCNBR - 0x158 - 32 - read-write - 0x0 - 0x93F3FFFF - - - STACB - desc STACB - 1 - 0 - read-write - - - STPCB - desc STPCB - 3 - 2 - read-write - - - OVFCB - desc OVFCB - 5 - 4 - read-write - - - UDFCB - desc UDFCB - 7 - 6 - read-write - - - CMAUCB - desc CMAUCB - 9 - 8 - read-write - - - CMADCB - desc CMADCB - 11 - 10 - read-write - - - CMBUCB - desc CMBUCB - 13 - 12 - read-write - - - CMBDCB - desc CMBDCB - 15 - 14 - read-write - - - FORCB - desc FORCB - 17 - 16 - read-write - - - EMBCB - desc EMBCB - 21 - 20 - read-write - - - EMBRB - desc EMBRB - 23 - 22 - read-write - - - EMBSB - desc EMBSB - 25 - 24 - read-write - - - OUTENB - desc OUTENB - 28 - 28 - read-write - - - CAPMDB - desc CAPMDB - 31 - 31 - read-write - - - - - FCNGR - desc FCNGR - 0x15C - 32 - read-write - 0x0 - 0x77 - - - NOFIENGA - desc NOFIENGA - 0 - 0 - read-write - - - NOFICKGA - desc NOFICKGA - 2 - 1 - read-write - - - NOFIENGB - desc NOFIENGB - 4 - 4 - read-write - - - NOFICKGB - desc NOFICKGB - 6 - 5 - read-write - - - - - VPERR - desc VPERR - 0x160 - 32 - read-write - 0x0 - 0x1F0300 - - - SPPERIA - desc SPPERIA - 8 - 8 - read-write - - - SPPERIB - desc SPPERIB - 9 - 9 - read-write - - - PCNTE - desc PCNTE - 17 - 16 - read-write - - - PCNTS - desc PCNTS - 20 - 18 - read-write - - - - - STFLR - desc STFLR - 0x164 - 32 - read-write - 0x80000000 - 0x80E01FFF - - - CMAF - desc CMAF - 0 - 0 - read-write - - - CMBF - desc CMBF - 1 - 1 - read-write - - - CMCF - desc CMCF - 2 - 2 - read-write - - - CMDF - desc CMDF - 3 - 3 - read-write - - - CMEF - desc CMEF - 4 - 4 - read-write - - - CMFF - desc CMFF - 5 - 5 - read-write - - - OVFF - desc OVFF - 6 - 6 - read-write - - - UDFF - desc UDFF - 7 - 7 - read-write - - - DTEF - desc DTEF - 8 - 8 - read-only - - - CMSAUF - desc CMSAUF - 9 - 9 - read-write - - - CMSADF - desc CMSADF - 10 - 10 - read-write - - - CMSBUF - desc CMSBUF - 11 - 11 - read-write - - - CMSBDF - desc CMSBDF - 12 - 12 - read-write - - - VPERNUM - desc VPERNUM - 23 - 21 - read-only - - - DIRF - desc DIRF - 31 - 31 - read-only - - - - - HSTAR - desc HSTAR - 0x180 - 32 - read-write - 0x0 - 0xFF0F8F - - - HSTA0 - desc HSTA0 - 0 - 0 - read-write - - - HSTA1 - desc HSTA1 - 1 - 1 - read-write - - - HSTA2 - desc HSTA2 - 2 - 2 - read-write - - - HSTA3 - desc HSTA3 - 3 - 3 - read-write - - - STAS - desc STAS - 7 - 7 - read-write - - - HSTA8 - desc HSTA8 - 8 - 8 - read-write - - - HSTA9 - desc HSTA9 - 9 - 9 - read-write - - - HSTA10 - desc HSTA10 - 10 - 10 - read-write - - - HSTA11 - desc HSTA11 - 11 - 11 - read-write - - - HSTA16 - desc HSTA16 - 16 - 16 - read-write - - - HSTA17 - desc HSTA17 - 17 - 17 - read-write - - - HSTA18 - desc HSTA18 - 18 - 18 - read-write - - - HSTA19 - desc HSTA19 - 19 - 19 - read-write - - - HSTA20 - desc HSTA20 - 20 - 20 - read-write - - - HSTA21 - desc HSTA21 - 21 - 21 - read-write - - - HSTA22 - desc HSTA22 - 22 - 22 - read-write - - - HSTA23 - desc HSTA23 - 23 - 23 - read-write - - - - - HSTPR - desc HSTPR - 0x184 - 32 - read-write - 0x0 - 0xFF0F8F - - - HSTP0 - desc HSTP0 - 0 - 0 - read-write - - - HSTP1 - desc HSTP1 - 1 - 1 - read-write - - - HSTP2 - desc HSTP2 - 2 - 2 - read-write - - - HSTP3 - desc HSTP3 - 3 - 3 - read-write - - - STPS - desc STPS - 7 - 7 - read-write - - - HSTP8 - desc HSTP8 - 8 - 8 - read-write - - - HSTP9 - desc HSTP9 - 9 - 9 - read-write - - - HSTP10 - desc HSTP10 - 10 - 10 - read-write - - - HSTP11 - desc HSTP11 - 11 - 11 - read-write - - - HSTP16 - desc HSTP16 - 16 - 16 - read-write - - - HSTP17 - desc HSTP17 - 17 - 17 - read-write - - - HSTP18 - desc HSTP18 - 18 - 18 - read-write - - - HSTP19 - desc HSTP19 - 19 - 19 - read-write - - - HSTP20 - desc HSTP20 - 20 - 20 - read-write - - - HSTP21 - desc HSTP21 - 21 - 21 - read-write - - - HSTP22 - desc HSTP22 - 22 - 22 - read-write - - - HSTP23 - desc HSTP23 - 23 - 23 - read-write - - - - - HCLRR - desc HCLRR - 0x188 - 32 - read-write - 0x0 - 0xFF0F8F - - - HCLE0 - desc HCLE0 - 0 - 0 - read-write - - - HCLE1 - desc HCLE1 - 1 - 1 - read-write - - - HCLE2 - desc HCLE2 - 2 - 2 - read-write - - - HCLE3 - desc HCLE3 - 3 - 3 - read-write - - - CLES - desc CLES - 7 - 7 - read-write - - - HCLE8 - desc HCLE8 - 8 - 8 - read-write - - - HCLE9 - desc HCLE9 - 9 - 9 - read-write - - - HCLE10 - desc HCLE10 - 10 - 10 - read-write - - - HCLE11 - desc HCLE11 - 11 - 11 - read-write - - - HCLE16 - desc HCLE16 - 16 - 16 - read-write - - - HCLE17 - desc HCLE17 - 17 - 17 - read-write - - - HCLE18 - desc HCLE18 - 18 - 18 - read-write - - - HCLE19 - desc HCLE19 - 19 - 19 - read-write - - - HCLE20 - desc HCLE20 - 20 - 20 - read-write - - - HCLE21 - desc HCLE21 - 21 - 21 - read-write - - - HCLE22 - desc HCLE22 - 22 - 22 - read-write - - - HCLE23 - desc HCLE23 - 23 - 23 - read-write - - - - - HUPDR - desc HUPDR - 0x18C - 32 - read-write - 0x0 - 0xFF0F8F - - - HUPD0 - desc HUPD0 - 0 - 0 - read-write - - - HUPD1 - desc HUPD1 - 1 - 1 - read-write - - - HUPD2 - desc HUPD2 - 2 - 2 - read-write - - - HUPD3 - desc HUPD3 - 3 - 3 - read-write - - - UPDS - desc UPDS - 7 - 7 - read-write - - - HUPD8 - desc HUPD8 - 8 - 8 - read-write - - - HUPD9 - desc HUPD9 - 9 - 9 - read-write - - - HUPD10 - desc HUPD10 - 10 - 10 - read-write - - - HUPD11 - desc HUPD11 - 11 - 11 - read-write - - - HUPD16 - desc HUPD16 - 16 - 16 - read-write - - - HUPD17 - desc HUPD17 - 17 - 17 - read-write - - - HUPD18 - desc HUPD18 - 18 - 18 - read-write - - - HUPD19 - desc HUPD19 - 19 - 19 - read-write - - - HUPD20 - desc HUPD20 - 20 - 20 - read-write - - - HUPD21 - desc HUPD21 - 21 - 21 - read-write - - - HUPD22 - desc HUPD22 - 22 - 22 - read-write - - - HUPD23 - desc HUPD23 - 23 - 23 - read-write - - - - - HCPAR - desc HCPAR - 0x190 - 32 - read-write - 0x0 - 0xFF0F0F - - - HCPA0 - desc HCPA0 - 0 - 0 - read-write - - - HCPA1 - desc HCPA1 - 1 - 1 - read-write - - - HCPA2 - desc HCPA2 - 2 - 2 - read-write - - - HCPA3 - desc HCPA3 - 3 - 3 - read-write - - - HCPA8 - desc HCPA8 - 8 - 8 - read-write - - - HCPA9 - desc HCPA9 - 9 - 9 - read-write - - - HCPA10 - desc HCPA10 - 10 - 10 - read-write - - - HCPA11 - desc HCPA11 - 11 - 11 - read-write - - - HCPA16 - desc HCPA16 - 16 - 16 - read-write - - - HCPA17 - desc HCPA17 - 17 - 17 - read-write - - - HCPA18 - desc HCPA18 - 18 - 18 - read-write - - - HCPA19 - desc HCPA19 - 19 - 19 - read-write - - - HCPA20 - desc HCPA20 - 20 - 20 - read-write - - - HCPA21 - desc HCPA21 - 21 - 21 - read-write - - - HCPA22 - desc HCPA22 - 22 - 22 - read-write - - - HCPA23 - desc HCPA23 - 23 - 23 - read-write - - - - - HCPBR - desc HCPBR - 0x194 - 32 - read-write - 0x0 - 0xFF0F0F - - - HCPB0 - desc HCPB0 - 0 - 0 - read-write - - - HCPB1 - desc HCPB1 - 1 - 1 - read-write - - - HCPB2 - desc HCPB2 - 2 - 2 - read-write - - - HCPB3 - desc HCPB3 - 3 - 3 - read-write - - - HCPB8 - desc HCPB8 - 8 - 8 - read-write - - - HCPB9 - desc HCPB9 - 9 - 9 - read-write - - - HCPB10 - desc HCPB10 - 10 - 10 - read-write - - - HCPB11 - desc HCPB11 - 11 - 11 - read-write - - - HCPB16 - desc HCPB16 - 16 - 16 - read-write - - - HCPB17 - desc HCPB17 - 17 - 17 - read-write - - - HCPB18 - desc HCPB18 - 18 - 18 - read-write - - - HCPB19 - desc HCPB19 - 19 - 19 - read-write - - - HCPB20 - desc HCPB20 - 20 - 20 - read-write - - - HCPB21 - desc HCPB21 - 21 - 21 - read-write - - - HCPB22 - desc HCPB22 - 22 - 22 - read-write - - - HCPB23 - desc HCPB23 - 23 - 23 - read-write - - - - - HCUPR - desc HCUPR - 0x198 - 32 - read-write - 0x0 - 0xFF0FFF - - - HCUP0 - desc HCUP0 - 0 - 0 - read-write - - - HCUP1 - desc HCUP1 - 1 - 1 - read-write - - - HCUP2 - desc HCUP2 - 2 - 2 - read-write - - - HCUP3 - desc HCUP3 - 3 - 3 - read-write - - - HCUP4 - desc HCUP4 - 4 - 4 - read-write - - - HCUP5 - desc HCUP5 - 5 - 5 - read-write - - - HCUP6 - desc HCUP6 - 6 - 6 - read-write - - - HCUP7 - desc HCUP7 - 7 - 7 - read-write - - - HCUP8 - desc HCUP8 - 8 - 8 - read-write - - - HCUP9 - desc HCUP9 - 9 - 9 - read-write - - - HCUP10 - desc HCUP10 - 10 - 10 - read-write - - - HCUP11 - desc HCUP11 - 11 - 11 - read-write - - - HCUP16 - desc HCUP16 - 16 - 16 - read-write - - - HCUP17 - desc HCUP17 - 17 - 17 - read-write - - - HCUP18 - desc HCUP18 - 18 - 18 - read-write - - - HCUP19 - desc HCUP19 - 19 - 19 - read-write - - - HCUP20 - desc HCUP20 - 20 - 20 - read-write - - - HCUP21 - desc HCUP21 - 21 - 21 - read-write - - - HCUP22 - desc HCUP22 - 22 - 22 - read-write - - - HCUP23 - desc HCUP23 - 23 - 23 - read-write - - - - - HCDOR - desc HCDOR - 0x19C - 32 - read-write - 0x0 - 0xFF0FFF - - - HCDO0 - desc HCDO0 - 0 - 0 - read-write - - - HCDO1 - desc HCDO1 - 1 - 1 - read-write - - - HCDO2 - desc HCDO2 - 2 - 2 - read-write - - - HCDO3 - desc HCDO3 - 3 - 3 - read-write - - - HCDO4 - desc HCDO4 - 4 - 4 - read-write - - - HCDO5 - desc HCDO5 - 5 - 5 - read-write - - - HCDO6 - desc HCDO6 - 6 - 6 - read-write - - - HCDO7 - desc HCDO7 - 7 - 7 - read-write - - - HCDO8 - desc HCDO8 - 8 - 8 - read-write - - - HCDO9 - desc HCDO9 - 9 - 9 - read-write - - - HCDO10 - desc HCDO10 - 10 - 10 - read-write - - - HCDO11 - desc HCDO11 - 11 - 11 - read-write - - - HCDO16 - desc HCDO16 - 16 - 16 - read-write - - - HCDO17 - desc HCDO17 - 17 - 17 - read-write - - - HCDO18 - desc HCDO18 - 18 - 18 - read-write - - - HCDO19 - desc HCDO19 - 19 - 19 - read-write - - - HCDO20 - desc HCDO20 - 20 - 20 - read-write - - - HCDO21 - desc HCDO21 - 21 - 21 - read-write - - - HCDO22 - desc HCDO22 - 22 - 22 - read-write - - - HCDO23 - desc HCDO23 - 23 - 23 - read-write - - - - - - - TMR62 - desc TMR6 - 0x40018400 - - 0x0 - 0x1A0 - - - - TMR63 - desc TMR6 - 0x40018800 - - 0x0 - 0x1A0 - - - - TMR64 - desc TMR6 - 0x40018C00 - - 0x0 - 0x1A0 - - - - TMR65 - desc TMR6 - 0x40019000 - - 0x0 - 0x1A0 - - - - TMR66 - desc TMR6 - 0x40019400 - - 0x0 - 0x1A0 - - - - TMR67 - desc TMR6 - 0x40019800 - - 0x0 - 0x1A0 - - - - TMR68 - desc TMR6 - 0x40019C00 - - 0x0 - 0x1A0 - - - - TMR6CR - desc TMR6CR - 0x40018000 - TMR61 - - 0x0 - 0x400 - - - - FCNTR - desc FCNTR - 0x3EC - 32 - read-write - 0x0 - 0x7777 - - - NOFIENTA - desc NOFIENTA - 0 - 0 - read-write - - - NOFICKTA - desc NOFICKTA - 2 - 1 - read-write - - - NOFIENTB - desc NOFIENTB - 4 - 4 - read-write - - - NOFICKTB - desc NOFICKTB - 6 - 5 - read-write - - - NOFIENTC - desc NOFIENTC - 8 - 8 - read-write - - - NOFICKTC - desc NOFICKTC - 10 - 9 - read-write - - - NOFIENTD - desc NOFIENTD - 12 - 12 - read-write - - - NOFICKTD - desc NOFICKTD - 14 - 13 - read-write - - - - - SSTAR - desc SSTAR - 0x3F0 - 32 - read-write - 0x0 - 0xFF - - - SSTA1 - desc SSTA1 - 0 - 0 - read-write - - - SSTA2 - desc SSTA2 - 1 - 1 - read-write - - - SSTA3 - desc SSTA3 - 2 - 2 - read-write - - - SSTA4 - desc SSTA4 - 3 - 3 - read-write - - - SSTA5 - desc SSTA5 - 4 - 4 - read-write - - - SSTA6 - desc SSTA6 - 5 - 5 - read-write - - - SSTA7 - desc SSTA7 - 6 - 6 - read-write - - - SSTA8 - desc SSTA8 - 7 - 7 - read-write - - - - - SSTPR - desc SSTPR - 0x3F4 - 32 - read-write - 0x0 - 0xFF - - - SSTP1 - desc SSTP1 - 0 - 0 - read-write - - - SSTP2 - desc SSTP2 - 1 - 1 - read-write - - - SSTP3 - desc SSTP3 - 2 - 2 - read-write - - - SSTP4 - desc SSTP4 - 3 - 3 - read-write - - - SSTP5 - desc SSTP5 - 4 - 4 - read-write - - - SSTP6 - desc SSTP6 - 5 - 5 - read-write - - - SSTP7 - desc SSTP7 - 6 - 6 - read-write - - - SSTP8 - desc SSTP8 - 7 - 7 - read-write - - - - - SCLRR - desc SCLRR - 0x3F8 - 32 - read-write - 0x0 - 0xFF - - - SCLE1 - desc SCLE1 - 0 - 0 - read-write - - - SCLE2 - desc SCLE2 - 1 - 1 - read-write - - - SCLE3 - desc SCLE3 - 2 - 2 - read-write - - - SCLE4 - desc SCLE4 - 3 - 3 - read-write - - - SCLE5 - desc SCLE5 - 4 - 4 - read-write - - - SCLE6 - desc SCLE6 - 5 - 5 - read-write - - - SCLE7 - desc SCLE7 - 6 - 6 - read-write - - - SCLE8 - desc SCLE8 - 7 - 7 - read-write - - - - - SUPDR - desc SUPDR - 0x3FC - 32 - read-write - 0x0 - 0xFF - - - SUPD1 - desc SUPD1 - 0 - 0 - read-write - - - SUPD2 - desc SUPD2 - 1 - 1 - read-write - - - SUPD3 - desc SUPD3 - 2 - 2 - read-write - - - SUPD4 - desc SUPD4 - 3 - 3 - read-write - - - SUPD5 - desc SUPD5 - 4 - 4 - read-write - - - SUPD6 - desc SUPD6 - 5 - 5 - read-write - - - SUPD7 - desc SUPD7 - 6 - 6 - read-write - - - SUPD8 - desc SUPD8 - 7 - 7 - read-write - - - - - - - TMRA1 - desc TMRA - 0x4003A000 - - 0x0 - 0x150 - - - - CNTER - desc CNTER - 0x0 - 16 - read-write - 0x0 - 0xFFFF - - - CNT - desc CNT - 15 - 0 - read-write - - - - - PERAR - desc PERAR - 0x4 - 16 - read-write - 0xFFFF - 0xFFFF - - - PER - desc PER - 15 - 0 - read-write - - - - - CMPAR1 - desc CMPAR1 - 0x40 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR2 - desc CMPAR2 - 0x44 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR3 - desc CMPAR3 - 0x48 - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - CMPAR4 - desc CMPAR4 - 0x4C - 16 - read-write - 0xFFFF - 0xFFFF - - - CMP - desc CMP - 15 - 0 - read-write - - - - - BCSTR - desc BCSTR - 0x80 - 16 - read-write - 0x2 - 0xF1FF - - - START - desc START - 0 - 0 - read-write - - - DIR - desc DIR - 1 - 1 - read-write - - - MODE - desc MODE - 2 - 2 - read-write - - - SYNST - desc SYNST - 3 - 3 - read-write - - - CKDIV - desc CKDIV - 7 - 4 - read-write - - - OVSTP - desc OVSTP - 8 - 8 - read-write - - - ITENOVF - desc ITENOVF - 12 - 12 - read-write - - - ITENUDF - desc ITENUDF - 13 - 13 - read-write - - - OVFF - desc OVFF - 14 - 14 - read-write - - - UDFF - desc UDFF - 15 - 15 - read-write - - - - - HCONR - desc HCONR - 0x84 - 16 - read-write - 0x0 - 0xF777 - - - HSTA0 - desc HSTA0 - 0 - 0 - read-write - - - HSTA1 - desc HSTA1 - 1 - 1 - read-write - - - HSTA2 - desc HSTA2 - 2 - 2 - read-write - - - HSTP0 - desc HSTP0 - 4 - 4 - read-write - - - HSTP1 - desc HSTP1 - 5 - 5 - read-write - - - HSTP2 - desc HSTP2 - 6 - 6 - read-write - - - HCLE0 - desc HCLE0 - 8 - 8 - read-write - - - HCLE1 - desc HCLE1 - 9 - 9 - read-write - - - HCLE2 - desc HCLE2 - 10 - 10 - read-write - - - HCLE3 - desc HCLE3 - 12 - 12 - read-write - - - HCLE4 - desc HCLE4 - 13 - 13 - read-write - - - HCLE5 - desc HCLE5 - 14 - 14 - read-write - - - HCLE6 - desc HCLE6 - 15 - 15 - read-write - - - - - HCUPR - desc HCUPR - 0x88 - 16 - read-write - 0x0 - 0x1FFF - - - HCUP0 - desc HCUP0 - 0 - 0 - read-write - - - HCUP1 - desc HCUP1 - 1 - 1 - read-write - - - HCUP2 - desc HCUP2 - 2 - 2 - read-write - - - HCUP3 - desc HCUP3 - 3 - 3 - read-write - - - HCUP4 - desc HCUP4 - 4 - 4 - read-write - - - HCUP5 - desc HCUP5 - 5 - 5 - read-write - - - HCUP6 - desc HCUP6 - 6 - 6 - read-write - - - HCUP7 - desc HCUP7 - 7 - 7 - read-write - - - HCUP8 - desc HCUP8 - 8 - 8 - read-write - - - HCUP9 - desc HCUP9 - 9 - 9 - read-write - - - HCUP10 - desc HCUP10 - 10 - 10 - read-write - - - HCUP11 - desc HCUP11 - 11 - 11 - read-write - - - HCUP12 - desc HCUP12 - 12 - 12 - read-write - - - - - HCDOR - desc HCDOR - 0x8C - 16 - read-write - 0x0 - 0x1FFF - - - HCDO0 - desc HCDO0 - 0 - 0 - read-write - - - HCDO1 - desc HCDO1 - 1 - 1 - read-write - - - HCDO2 - desc HCDO2 - 2 - 2 - read-write - - - HCDO3 - desc HCDO3 - 3 - 3 - read-write - - - HCDO4 - desc HCDO4 - 4 - 4 - read-write - - - HCDO5 - desc HCDO5 - 5 - 5 - read-write - - - HCDO6 - desc HCDO6 - 6 - 6 - read-write - - - HCDO7 - desc HCDO7 - 7 - 7 - read-write - - - HCDO8 - desc HCDO8 - 8 - 8 - read-write - - - HCDO9 - desc HCDO9 - 9 - 9 - read-write - - - HCDO10 - desc HCDO10 - 10 - 10 - read-write - - - HCDO11 - desc HCDO11 - 11 - 11 - read-write - - - HCDO12 - desc HCDO12 - 12 - 12 - read-write - - - - - ICONR - desc ICONR - 0x90 - 16 - read-write - 0x0 - 0xF - - - ITEN1 - desc ITEN1 - 0 - 0 - read-write - - - ITEN2 - desc ITEN2 - 1 - 1 - read-write - - - ITEN3 - desc ITEN3 - 2 - 2 - read-write - - - ITEN4 - desc ITEN4 - 3 - 3 - read-write - - - - - ECONR - desc ECONR - 0x94 - 16 - read-write - 0x0 - 0xF - - - ETEN1 - desc ETEN1 - 0 - 0 - read-write - - - ETEN2 - desc ETEN2 - 1 - 1 - read-write - - - ETEN3 - desc ETEN3 - 2 - 2 - read-write - - - ETEN4 - desc ETEN4 - 3 - 3 - read-write - - - - - FCONR - desc FCONR - 0x98 - 16 - read-write - 0x0 - 0x7707 - - - NOFIENTG - desc NOFIENTG - 0 - 0 - read-write - - - NOFICKTG - desc NOFICKTG - 2 - 1 - read-write - - - NOFIENCA - desc NOFIENCA - 8 - 8 - read-write - - - NOFICKCA - desc NOFICKCA - 10 - 9 - read-write - - - NOFIENCB - desc NOFIENCB - 12 - 12 - read-write - - - NOFICKCB - desc NOFICKCB - 14 - 13 - read-write - - - - - STFLR - desc STFLR - 0x9C - 16 - read-write - 0x0 - 0xF - - - CMPF1 - desc CMPF1 - 0 - 0 - read-write - - - CMPF2 - desc CMPF2 - 1 - 1 - read-write - - - CMPF3 - desc CMPF3 - 2 - 2 - read-write - - - CMPF4 - desc CMPF4 - 3 - 3 - read-write - - - - - BCONR1 - desc BCONR1 - 0xC0 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - BCONR2 - desc BCONR2 - 0xC8 - 16 - read-write - 0x0 - 0x7 - - - BEN - desc BEN - 0 - 0 - read-write - - - BSE0 - desc BSE0 - 1 - 1 - read-write - - - BSE1 - desc BSE1 - 2 - 2 - read-write - - - - - CCONR1 - desc CCONR1 - 0x100 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR2 - desc CCONR2 - 0x104 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR3 - desc CCONR3 - 0x108 - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - CCONR4 - desc CCONR4 - 0x10C - 16 - read-write - 0x0 - 0x7371 - - - CAPMD - desc CAPMD - 0 - 0 - read-write - - - HICP0 - desc HICP0 - 4 - 4 - read-write - - - HICP1 - desc HICP1 - 5 - 5 - read-write - - - HICP2 - desc HICP2 - 6 - 6 - read-write - - - HICP3 - desc HICP3 - 8 - 8 - read-write - - - HICP4 - desc HICP4 - 9 - 9 - read-write - - - NOFIENCP - desc NOFIENCP - 12 - 12 - read-write - - - NOFICKCP - desc NOFICKCP - 14 - 13 - read-write - - - - - PCONR1 - desc PCONR1 - 0x140 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR2 - desc PCONR2 - 0x144 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR3 - desc PCONR3 - 0x148 - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - PCONR4 - desc PCONR4 - 0x14C - 16 - read-write - 0x0 - 0x13FF - - - STAC - desc STAC - 1 - 0 - read-write - - - STPC - desc STPC - 3 - 2 - read-write - - - CMPC - desc CMPC - 5 - 4 - read-write - - - PERC - desc PERC - 7 - 6 - read-write - - - FORC - desc FORC - 9 - 8 - read-write - - - OUTEN - desc OUTEN - 12 - 12 - read-write - - - - - - - TMRA10 - desc TMRA - 0x40027400 - - 0x0 - 0x150 - - - - TMRA11 - desc TMRA - 0x40027800 - - 0x0 - 0x150 - - - - TMRA12 - desc TMRA - 0x40027C00 - - 0x0 - 0x150 - - - - TMRA2 - desc TMRA - 0x4003A400 - - 0x0 - 0x150 - - - - TMRA3 - desc TMRA - 0x4003A800 - - 0x0 - 0x150 - - - - TMRA4 - desc TMRA - 0x4003AC00 - - 0x0 - 0x150 - - - - TMRA5 - desc TMRA - 0x40026000 - - 0x0 - 0x150 - - - - TMRA6 - desc TMRA - 0x40026400 - - 0x0 - 0x150 - - - - TMRA7 - desc TMRA - 0x40026800 - - 0x0 - 0x150 - - - - TMRA8 - desc TMRA - 0x40026C00 - - 0x0 - 0x150 - - - - TMRA9 - desc TMRA - 0x40027000 - - 0x0 - 0x150 - - - - TRNG - desc TRNG - 0x40042000 - - 0x0 - 0x14 - - - - CR - desc CR - 0x0 - 32 - read-write - 0x0 - 0x3 - - - EN - desc EN - 0 - 0 - read-write - - - RUN - desc RUN - 1 - 1 - read-write - - - - - MR - desc MR - 0x4 - 32 - read-write - 0x12 - 0x1D - - - LOAD - desc LOAD - 0 - 0 - read-write - - - CNT - desc CNT - 4 - 2 - read-write - - - - - DR0 - desc DR0 - 0xC - 32 - read-only - 0x8000000 - 0xFFFFFFFF - - - DR1 - desc DR1 - 0x10 - 32 - read-only - 0x8000200 - 0xFFFFFFFF - - - - - USART1 - desc USART - 0x4001CC00 - - 0x0 - 0x1C - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x101EB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - RTOF - desc RTOF - 8 - 8 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFFFF - 0xFF7F - - - DIV_FRACTION - desc DIV_FRACTION - 6 - 0 - read-write - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xF11B96FF - - - RTOE - desc RTOE - 0 - 0 - read-write - - - RTOIE - desc RTOIE - 1 - 1 - read-write - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - CRTOF - desc CRTOF - 20 - 20 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - FBME - desc FBME - 29 - 29 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x3801 - - - MPE - desc MPE - 0 - 0 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0xE00328 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - SCEN - desc SCEN - 5 - 5 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - BCN - desc BCN - 23 - 21 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0x3 - - - PSC - desc PSC - 1 - 0 - read-write - - - - - - - USART10 - desc USART10 - 0x40021C00 - - 0x0 - 0x20 - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x106FB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - BE - desc BE - 4 - 4 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - WKUP - desc WKUP - 9 - 9 - read-only - - - LBD - desc LBD - 10 - 10 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFF00 - 0xFF00 - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xD1EB96FC - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - CBE - desc CBE - 21 - 21 - read-write - - - CWKUP - desc CWKUP - 22 - 22 - read-write - - - CLBD - desc CLBD - 23 - 23 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x379FF - - - MPE - desc MPE - 0 - 0 - read-write - - - WKUPIE - desc WKUPIE - 1 - 1 - read-write - - - BEIE - desc BEIE - 2 - 2 - read-write - - - BEE - desc BEE - 3 - 3 - read-write - - - LBDIE - desc LBDIE - 4 - 4 - read-write - - - LBDL - desc LBDL - 5 - 5 - read-write - - - SBKL - desc SBKL - 7 - 6 - read-write - - - WKUPE - desc WKUPE - 8 - 8 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - LINEN - desc LINEN - 14 - 14 - read-write - - - SBK - desc SBK - 16 - 16 - read-write - - - SBKM - desc SBKM - 17 - 17 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0x318 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - LOOP - desc LOOP - 4 - 4 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0xF - - - PSC - desc PSC - 1 - 0 - read-write - - - LBMPSC - desc LBMPSC - 3 - 2 - read-write - - - - - LBMC - desc LBMC - 0x1C - 32 - read-only - 0x0 - 0xFFFF - - - LBMC - desc LBMC - 15 - 0 - read-only - - - - - - - USART2 - desc USART - 0x4001D000 - - 0x0 - 0x1C - - - - USART3 - desc USART - 0x4001D400 - - 0x0 - 0x1C - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x100EB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFFFF - 0xFF7F - - - DIV_FRACTION - desc DIV_FRACTION - 6 - 0 - read-write - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xF10B96FC - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - FBME - desc FBME - 29 - 29 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x3801 - - - MPE - desc MPE - 0 - 0 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0xE00328 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - SCEN - desc SCEN - 5 - 5 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - BCN - desc BCN - 23 - 21 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0x3 - - - PSC - desc PSC - 1 - 0 - read-write - - - - - - - USART4 - desc USART - 0x4001D800 - - 0x0 - 0x1C - - - - USART5 - desc USART - 0x4001DC00 - - 0x0 - 0x20 - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x106FB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - BE - desc BE - 4 - 4 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - WKUP - desc WKUP - 9 - 9 - read-only - - - LBD - desc LBD - 10 - 10 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFF00 - 0xFF00 - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xD1EB96FC - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - CBE - desc CBE - 21 - 21 - read-write - - - CWKUP - desc CWKUP - 22 - 22 - read-write - - - CLBD - desc CLBD - 23 - 23 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x379FF - - - MPE - desc MPE - 0 - 0 - read-write - - - WKUPIE - desc WKUPIE - 1 - 1 - read-write - - - BEIE - desc BEIE - 2 - 2 - read-write - - - BEE - desc BEE - 3 - 3 - read-write - - - LBDIE - desc LBDIE - 4 - 4 - read-write - - - LBDL - desc LBDL - 5 - 5 - read-write - - - SBKL - desc SBKL - 7 - 6 - read-write - - - WKUPE - desc WKUPE - 8 - 8 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - LINEN - desc LINEN - 14 - 14 - read-write - - - SBK - desc SBK - 16 - 16 - read-write - - - SBKM - desc SBKM - 17 - 17 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0x318 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - LOOP - desc LOOP - 4 - 4 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0xF - - - PSC - desc PSC - 1 - 0 - read-write - - - LBMPSC - desc LBMPSC - 3 - 2 - read-write - - - - - LBMC - desc LBMC - 0x1C - 32 - read-only - 0x0 - 0xFFFF - - - LBMC - desc LBMC - 15 - 0 - read-only - - - - - - - USART6 - desc USART6 - 0x40020C00 - - 0x0 - 0x1C - - - - SR - desc SR - 0x0 - 32 - read-only - 0xC0 - 0x101EB - - - PE - desc PE - 0 - 0 - read-only - - - FE - desc FE - 1 - 1 - read-only - - - ORE - desc ORE - 3 - 3 - read-only - - - RXNE - desc RXNE - 5 - 5 - read-only - - - TC - desc TC - 6 - 6 - read-only - - - TXE - desc TXE - 7 - 7 - read-only - - - RTOF - desc RTOF - 8 - 8 - read-only - - - MPB - desc MPB - 16 - 16 - read-only - - - - - DR - desc DR - 0x4 - 32 - read-write - 0x1FF - 0x1FF03FF - - - TDR - desc TDR - 8 - 0 - read-write - - - MPID - desc MPID - 9 - 9 - read-write - - - RDR - desc RDR - 24 - 16 - read-write - - - - - BRR - desc BRR - 0x8 - 32 - read-write - 0xFFFF - 0xFF7F - - - DIV_FRACTION - desc DIV_FRACTION - 6 - 0 - read-write - - - DIV_INTEGER - desc DIV_INTEGER - 15 - 8 - read-write - - - - - CR1 - desc CR1 - 0xC - 32 - read-write - 0x80000000 - 0xF11B96FF - - - RTOE - desc RTOE - 0 - 0 - read-write - - - RTOIE - desc RTOIE - 1 - 1 - read-write - - - RE - desc RE - 2 - 2 - read-write - - - TE - desc TE - 3 - 3 - read-write - - - SLME - desc SLME - 4 - 4 - read-write - - - RIE - desc RIE - 5 - 5 - read-write - - - TCIE - desc TCIE - 6 - 6 - read-write - - - TXEIE - desc TXEIE - 7 - 7 - read-write - - - PS - desc PS - 9 - 9 - read-write - - - PCE - desc PCE - 10 - 10 - read-write - - - M - desc M - 12 - 12 - read-write - - - OVER8 - desc OVER8 - 15 - 15 - read-write - - - CPE - desc CPE - 16 - 16 - read-write - - - CFE - desc CFE - 17 - 17 - read-write - - - CORE - desc CORE - 19 - 19 - read-write - - - CRTOF - desc CRTOF - 20 - 20 - read-write - - - MS - desc MS - 24 - 24 - read-write - - - ML - desc ML - 28 - 28 - read-write - - - FBME - desc FBME - 29 - 29 - read-write - - - NFE - desc NFE - 30 - 30 - read-write - - - SBS - desc SBS - 31 - 31 - read-write - - - - - CR2 - desc CR2 - 0x10 - 32 - read-write - 0x600 - 0x3801 - - - MPE - desc MPE - 0 - 0 - read-write - - - CLKC - desc CLKC - 12 - 11 - read-write - - - STOP - desc STOP - 13 - 13 - read-write - - - - - CR3 - desc CR3 - 0x14 - 32 - read-write - 0x0 - 0xE00328 - - - HDSEL - desc HDSEL - 3 - 3 - read-write - - - SCEN - desc SCEN - 5 - 5 - read-write - - - RTSE - desc RTSE - 8 - 8 - read-write - - - CTSE - desc CTSE - 9 - 9 - read-write - - - BCN - desc BCN - 23 - 21 - read-write - - - - - PR - desc PR - 0x18 - 32 - read-write - 0x0 - 0x3 - - - PSC - desc PSC - 1 - 0 - read-write - - - - - - - USART7 - desc USART - 0x40021000 - - 0x0 - 0x1C - - - - USART8 - desc USART - 0x40021400 - - 0x0 - 0x1C - - - - USART9 - desc USART - 0x40021800 - - 0x0 - 0x1C - - - - USBFS - desc USBFS - 0x40080000 - - 0x0 - 0xE04 - - - - GVBUSCFG - desc GVBUSCFG - 0x0 - 32 - read-write - 0x0 - 0xC0 - - - VBUSOVEN - desc VBUSOVEN - 6 - 6 - read-write - - - VBUSVAL - desc VBUSVAL - 7 - 7 - read-write - - - - - GAHBCFG - desc GAHBCFG - 0x8 - 32 - read-write - 0x0 - 0x1BF - - - GINTMSK - desc GINTMSK - 0 - 0 - read-write - - - HBSTLEN - desc HBSTLEN - 4 - 1 - read-write - - - DMAEN - desc DMAEN - 5 - 5 - read-write - - - TXFELVL - desc TXFELVL - 7 - 7 - read-write - - - PTXFELVL - desc PTXFELVL - 8 - 8 - read-write - - - - - GUSBCFG - desc GUSBCFG - 0xC - 32 - read-write - 0x1440 - 0x60003C47 - - - TOCAL - desc TOCAL - 2 - 0 - read-write - - - PHYSEL - desc PHYSEL - 6 - 6 - read-write - - - TRDT - desc TRDT - 13 - 10 - read-write - - - FHMOD - desc FHMOD - 29 - 29 - read-write - - - FDMOD - desc FDMOD - 30 - 30 - read-write - - - - - GRSTCTL - desc GRSTCTL - 0x10 - 32 - read-write - 0x80000000 - 0xC00007F7 - - - CSRST - desc CSRST - 0 - 0 - read-write - - - HSRST - desc HSRST - 1 - 1 - read-write - - - FCRST - desc FCRST - 2 - 2 - read-write - - - RXFFLSH - desc RXFFLSH - 4 - 4 - read-write - - - TXFFLSH - desc TXFFLSH - 5 - 5 - read-write - - - TXFNUM - desc TXFNUM - 10 - 6 - read-write - - - DMAREQ - desc DMAREQ - 30 - 30 - read-only - - - AHBIDL - desc AHBIDL - 31 - 31 - read-only - - - - - GINTSTS - desc GINTSTS - 0x14 - 32 - read-only - 0x14000020 - 0xFF7CFCFB - - - CMOD - desc CMOD - 0 - 0 - read-only - - - MMIS - desc MMIS - 1 - 1 - read-write - - - SOF - desc SOF - 3 - 3 - read-write - - - RXFNE - desc RXFNE - 4 - 4 - read-only - - - NPTXFE - desc NPTXFE - 5 - 5 - read-only - - - GINAKEFF - desc GINAKEFF - 6 - 6 - read-only - - - GONAKEFF - desc GONAKEFF - 7 - 7 - read-only - - - ESUSP - desc ESUSP - 10 - 10 - read-write - - - USBSUSP - desc USBSUSP - 11 - 11 - read-write - - - USBRST - desc USBRST - 12 - 12 - read-write - - - ENUMDNE - desc ENUMDNE - 13 - 13 - read-write - - - ISOODRP - desc ISOODRP - 14 - 14 - read-write - - - EOPF - desc EOPF - 15 - 15 - read-write - - - IEPINT - desc IEPINT - 18 - 18 - read-only - - - OEPINT - desc OEPINT - 19 - 19 - read-only - - - IISOIXFR - desc IISOIXFR - 20 - 20 - read-write - - - IPXFR_INCOMPISOOUT - desc IPXFR_INCOMPISOOUT - 21 - 21 - read-write - - - DATAFSUSP - desc DATAFSUSP - 22 - 22 - read-write - - - HPRTINT - desc HPRTINT - 24 - 24 - read-only - - - HCINT - desc HCINT - 25 - 25 - read-only - - - PTXFE - desc PTXFE - 26 - 26 - read-only - - - LPMINT - desc LPMINT - 27 - 27 - read-write - - - CIDSCHG - desc CIDSCHG - 28 - 28 - read-write - - - DISCINT - desc DISCINT - 29 - 29 - read-write - - - VBUSVINT - desc VBUSVINT - 30 - 30 - read-write - - - WKUINT - desc WKUINT - 31 - 31 - read-write - - - - - GINTMSK - desc GINTMSK - 0x18 - 32 - read-write - 0x0 - 0xFF7CFCFA - - - MMISM - desc MMISM - 1 - 1 - read-write - - - SOFM - desc SOFM - 3 - 3 - read-write - - - RXFNEM - desc RXFNEM - 4 - 4 - read-write - - - NPTXFEM - desc NPTXFEM - 5 - 5 - read-write - - - GINAKEFFM - desc GINAKEFFM - 6 - 6 - read-write - - - GONAKEFFM - desc GONAKEFFM - 7 - 7 - read-write - - - ESUSPM - desc ESUSPM - 10 - 10 - read-write - - - USBSUSPM - desc USBSUSPM - 11 - 11 - read-write - - - USBRSTM - desc USBRSTM - 12 - 12 - read-write - - - ENUMDNEM - desc ENUMDNEM - 13 - 13 - read-write - - - ISOODRPM - desc ISOODRPM - 14 - 14 - read-write - - - EOPFM - desc EOPFM - 15 - 15 - read-write - - - IEPIM - desc IEPIM - 18 - 18 - read-write - - - OEPIM - desc OEPIM - 19 - 19 - read-write - - - IISOIXFRM - desc IISOIXFRM - 20 - 20 - read-write - - - IPXFRM_INCOMPISOOUTM - desc IPXFRM_INCOMPISOOUTM - 21 - 21 - read-write - - - DATAFSUSPM - desc DATAFSUSPM - 22 - 22 - read-write - - - HPRTIM - desc HPRTIM - 24 - 24 - read-write - - - HCIM - desc HCIM - 25 - 25 - read-write - - - PTXFEM - desc PTXFEM - 26 - 26 - read-write - - - LPMINTM - desc LPMINTM - 27 - 27 - read-write - - - CIDSCHGM - desc CIDSCHGM - 28 - 28 - read-write - - - DISCIM - desc DISCIM - 29 - 29 - read-write - - - VBUSVIM - desc VBUSVIM - 30 - 30 - read-write - - - WKUIM - desc WKUIM - 31 - 31 - read-write - - - - - GRXSTSR - desc GRXSTSR - 0x1C - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXSTSP - desc GRXSTSP - 0x20 - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXFSIZ - desc GRXFSIZ - 0x24 - 32 - read-write - 0x280 - 0x7FF - - - RXFD - desc RXFD - 10 - 0 - read-write - - - - - HNPTXFSIZ - desc HNPTXFSIZ - 0x28 - 32 - read-write - 0x2800280 - 0xFFFFFFFF - - - NPTXFSA - desc NPTXFSA - 15 - 0 - read-write - - - NPTXFD - desc NPTXFD - 31 - 16 - read-write - - - - - HNPTXSTS - desc HNPTXSTS - 0x2C - 32 - read-only - 0x80280 - 0x7FFFFFFF - - - NPTXFSAV - desc NPTXFSAV - 15 - 0 - read-only - - - NPTQXSAV - desc NPTQXSAV - 23 - 16 - read-only - - - NPTXQTOP - desc NPTXQTOP - 30 - 24 - read-only - - - - - CID - desc CID - 0x3C - 32 - read-write - 0x12345678 - 0xFFFFFFFF - - - GLPMCFG - desc GLPMCFG - 0x54 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - LPMEN - desc LPMEN - 0 - 0 - read-write - - - LPMACK - desc LPMACK - 1 - 1 - read-write - - - BSEL - desc BSEL - 5 - 2 - read-write - - - REMWAKE - desc REMWAKE - 6 - 6 - read-write - - - L1SSEN - desc L1SSEN - 7 - 7 - read-write - - - BESLTHRS - desc BESLTHRS - 11 - 8 - read-write - - - L1DSEN - desc L1DSEN - 12 - 12 - read-write - - - LPMRSP - desc LPMRSP - 14 - 13 - read-only - - - SLPSTS - desc SLPSTS - 15 - 15 - read-only - - - L1RSMOK - desc L1RSMOK - 16 - 16 - read-only - - - LPMCHIDX - desc LPMCHIDX - 20 - 17 - read-write - - - LPMRCNT - desc LPMRCNT - 23 - 21 - read-write - - - SENDLPM - desc SENDLPM - 24 - 24 - read-write - - - LPMRCNTSTS - desc LPMRCNTSTS - 27 - 25 - read-only - - - ENBSEL - desc ENBSEL - 28 - 28 - read-write - - - - - HPTXFSIZ - desc HPTXFSIZ - 0x100 - 32 - read-write - 0x2800500 - 0xFFFFFFFF - - - PTXSA - desc PTXSA - 15 - 0 - read-write - - - PTXFD - desc PTXFD - 31 - 16 - read-write - - - - - DIEPTXF1 - desc DIEPTXF1 - 0x104 - 32 - read-write - 0x2800500 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF2 - desc DIEPTXF2 - 0x108 - 32 - read-write - 0x2800780 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF3 - desc DIEPTXF3 - 0x10C - 32 - read-write - 0x2800A00 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF4 - desc DIEPTXF4 - 0x110 - 32 - read-write - 0x2800C80 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF5 - desc DIEPTXF5 - 0x114 - 32 - read-write - 0x2800F00 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF6 - desc DIEPTXF6 - 0x118 - 32 - read-write - 0x2801180 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF7 - desc DIEPTXF7 - 0x11C - 32 - read-write - 0x2801400 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF8 - desc DIEPTXF8 - 0x120 - 32 - read-write - 0x2801680 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF9 - desc DIEPTXF9 - 0x124 - 32 - read-write - 0x2801900 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF10 - desc DIEPTXF10 - 0x128 - 32 - read-write - 0x2801B80 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF11 - desc DIEPTXF11 - 0x12C - 32 - read-write - 0x2801E00 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF12 - desc DIEPTXF12 - 0x130 - 32 - read-write - 0x2802080 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF13 - desc DIEPTXF13 - 0x134 - 32 - read-write - 0x2802300 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF14 - desc DIEPTXF14 - 0x138 - 32 - read-write - 0x2802580 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF15 - desc DIEPTXF15 - 0x13C - 32 - read-write - 0x2802800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - HCFG - desc HCFG - 0x400 - 32 - read-write - 0x200 - 0x7 - - - FSLSPCS - desc FSLSPCS - 1 - 0 - read-write - - - FSLSS - desc FSLSS - 2 - 2 - read-write - - - - - HFIR - desc HFIR - 0x404 - 32 - read-write - 0xEA60 - 0xFFFF - - - FRIVL - desc FRIVL - 15 - 0 - read-write - - - - - HFNUM - desc HFNUM - 0x408 - 32 - read-only - 0x3FFF - 0xFFFFFFFF - - - FRNUM - desc FRNUM - 15 - 0 - read-only - - - FTREM - desc FTREM - 31 - 16 - read-only - - - - - HPTXSTS - desc HPTXSTS - 0x410 - 32 - read-only - 0x80280 - 0xFFFFFFFF - - - PTXFSAVL - desc PTXFSAVL - 15 - 0 - read-only - - - PTXQSAV - desc PTXQSAV - 23 - 16 - read-only - - - PTXQTOP - desc PTXQTOP - 31 - 24 - read-only - - - - - HAINT - desc HAINT - 0x414 - 32 - read-only - 0x0 - 0xFFFF - - - HAINT - desc HAINT - 15 - 0 - read-only - - - - - HAINTMSK - desc HAINTMSK - 0x418 - 32 - read-write - 0x0 - 0xFFFF - - - HAINTM - desc HAINTM - 15 - 0 - read-write - - - - - HPRT - desc HPRT - 0x440 - 32 - read-only - 0x0 - 0x61DCF - - - PCSTS - desc PCSTS - 0 - 0 - read-only - - - PCDET - desc PCDET - 1 - 1 - read-write - - - PENA - desc PENA - 2 - 2 - read-write - - - PENCHNG - desc PENCHNG - 3 - 3 - read-write - - - PRES - desc PRES - 6 - 6 - read-write - - - PSUSP - desc PSUSP - 7 - 7 - read-write - - - PRST - desc PRST - 8 - 8 - read-write - - - PLSTS - desc PLSTS - 11 - 10 - read-only - - - PWPR - desc PWPR - 12 - 12 - read-write - - - PSPD - desc PSPD - 18 - 17 - read-only - - - - - HCCHAR0 - desc HCCHAR0 - 0x500 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT0 - desc HCINT0 - 0x508 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK0 - desc HCINTMSK0 - 0x50C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ0 - desc HCTSIZ0 - 0x510 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA0 - desc HCDMA0 - 0x514 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR1 - desc HCCHAR1 - 0x520 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT1 - desc HCINT1 - 0x528 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK1 - desc HCINTMSK1 - 0x52C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ1 - desc HCTSIZ1 - 0x530 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA1 - desc HCDMA1 - 0x534 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR2 - desc HCCHAR2 - 0x540 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT2 - desc HCINT2 - 0x548 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK2 - desc HCINTMSK2 - 0x54C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ2 - desc HCTSIZ2 - 0x550 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA2 - desc HCDMA2 - 0x554 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR3 - desc HCCHAR3 - 0x560 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT3 - desc HCINT3 - 0x568 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK3 - desc HCINTMSK3 - 0x56C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ3 - desc HCTSIZ3 - 0x570 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA3 - desc HCDMA3 - 0x574 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR4 - desc HCCHAR4 - 0x580 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT4 - desc HCINT4 - 0x588 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK4 - desc HCINTMSK4 - 0x58C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ4 - desc HCTSIZ4 - 0x590 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA4 - desc HCDMA4 - 0x594 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR5 - desc HCCHAR5 - 0x5A0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT5 - desc HCINT5 - 0x5A8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK5 - desc HCINTMSK5 - 0x5AC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ5 - desc HCTSIZ5 - 0x5B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA5 - desc HCDMA5 - 0x5B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR6 - desc HCCHAR6 - 0x5C0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT6 - desc HCINT6 - 0x5C8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK6 - desc HCINTMSK6 - 0x5CC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ6 - desc HCTSIZ6 - 0x5D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA6 - desc HCDMA6 - 0x5D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR7 - desc HCCHAR7 - 0x5E0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT7 - desc HCINT7 - 0x5E8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK7 - desc HCINTMSK7 - 0x5EC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ7 - desc HCTSIZ7 - 0x5F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA7 - desc HCDMA7 - 0x5F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR8 - desc HCCHAR8 - 0x600 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT8 - desc HCINT8 - 0x608 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK8 - desc HCINTMSK8 - 0x60C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ8 - desc HCTSIZ8 - 0x610 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA8 - desc HCDMA8 - 0x614 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR9 - desc HCCHAR9 - 0x620 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT9 - desc HCINT9 - 0x628 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK9 - desc HCINTMSK9 - 0x62C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ9 - desc HCTSIZ9 - 0x630 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA9 - desc HCDMA9 - 0x634 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR10 - desc HCCHAR10 - 0x640 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT10 - desc HCINT10 - 0x648 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK10 - desc HCINTMSK10 - 0x64C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ10 - desc HCTSIZ10 - 0x650 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA10 - desc HCDMA10 - 0x654 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR11 - desc HCCHAR11 - 0x660 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT11 - desc HCINT11 - 0x668 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK11 - desc HCINTMSK11 - 0x66C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ11 - desc HCTSIZ11 - 0x670 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA11 - desc HCDMA11 - 0x674 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR12 - desc HCCHAR12 - 0x680 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT12 - desc HCINT12 - 0x688 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK12 - desc HCINTMSK12 - 0x68C - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ12 - desc HCTSIZ12 - 0x690 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA12 - desc HCDMA12 - 0x694 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR13 - desc HCCHAR13 - 0x6A0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT13 - desc HCINT13 - 0x6A8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK13 - desc HCINTMSK13 - 0x6AC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ13 - desc HCTSIZ13 - 0x6B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA13 - desc HCDMA13 - 0x6B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR14 - desc HCCHAR14 - 0x6C0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT14 - desc HCINT14 - 0x6C8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK14 - desc HCINTMSK14 - 0x6CC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ14 - desc HCTSIZ14 - 0x6D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA14 - desc HCDMA14 - 0x6D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR15 - desc HCCHAR15 - 0x6E0 - 32 - read-write - 0x0 - 0xFFCEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCINT15 - desc HCINT15 - 0x6E8 - 32 - read-write - 0x0 - 0x7BF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK15 - desc HCINTMSK15 - 0x6EC - 32 - read-write - 0x0 - 0x7BF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ15 - desc HCTSIZ15 - 0x6F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - - - HCDMA15 - desc HCDMA15 - 0x6F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DCFG - desc DCFG - 0x800 - 32 - read-write - 0x8200000 - 0x1FF7 - - - DSPD - desc DSPD - 1 - 0 - read-write - - - NZLSOHSK - desc NZLSOHSK - 2 - 2 - read-write - - - DAD - desc DAD - 10 - 4 - read-write - - - PFIVL - desc PFIVL - 12 - 11 - read-write - - - - - DCTL - desc DCTL - 0x804 - 32 - read-write - 0x2 - 0xF8F - - - RWUSIG - desc RWUSIG - 0 - 0 - read-write - - - SDIS - desc SDIS - 1 - 1 - read-write - - - GINSTS - desc GINSTS - 2 - 2 - read-only - - - GONSTS - desc GONSTS - 3 - 3 - read-only - - - SGINAK - desc SGINAK - 7 - 7 - write-only - - - CGINAK - desc CGINAK - 8 - 8 - write-only - - - SGONAK - desc SGONAK - 9 - 9 - write-only - - - CGONAK - desc CGONAK - 10 - 10 - write-only - - - POPRGDNE - desc POPRGDNE - 11 - 11 - read-write - - - - - DSTS - desc DSTS - 0x808 - 32 - read-only - 0x2 - 0xFFFF0F - - - SUSPSTS - desc SUSPSTS - 0 - 0 - read-only - - - ENUMSPD - desc ENUMSPD - 2 - 1 - read-only - - - EERR - desc EERR - 3 - 3 - read-only - - - FNSOF - desc FNSOF - 21 - 8 - read-only - - - LNSTS - desc LNSTS - 23 - 22 - read-only - - - - - DIEPMSK - desc DIEPMSK - 0x810 - 32 - read-write - 0x0 - 0x207B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - TOM - desc TOM - 3 - 3 - read-write - - - ITTXFEMSK - desc ITTXFEMSK - 4 - 4 - read-write - - - INEPNMM - desc INEPNMM - 5 - 5 - read-write - - - INEPNEM - desc INEPNEM - 6 - 6 - read-write - - - NAKM - desc NAKM - 13 - 13 - read-write - - - - - DOEPMSK - desc DOEPMSK - 0x814 - 32 - read-write - 0x0 - 0x1B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - STUPM - desc STUPM - 3 - 3 - read-write - - - OTEPDM - desc OTEPDM - 4 - 4 - read-write - - - - - DAINT - desc DAINT - 0x818 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IEPINT - desc IEPINT - 15 - 0 - read-write - - - OEPINT - desc OEPINT - 31 - 16 - read-write - - - - - DAINTMSK - desc DAINTMSK - 0x81C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IEPINTM - desc IEPINTM - 15 - 0 - read-write - - - OEPINTM - desc OEPINTM - 31 - 16 - read-write - - - - - DIEPEMPMSK - desc DIEPEMPMSK - 0x834 - 32 - read-write - 0x0 - 0xFFFF - - - INEPTXFEM - desc INEPTXFEM - 15 - 0 - read-write - - - - - DIEPCTL0 - desc DIEPCTL0 - 0x900 - 32 - read-write - 0x8000 - 0xCFEE8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT0 - desc DIEPINT0 - 0x908 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ0 - desc DIEPTSIZ0 - 0x910 - 32 - read-write - 0x0 - 0x18007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 20 - 19 - read-write - - - - - DIEPDMA0 - desc DIEPDMA0 - 0x914 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS0 - desc DTXFSTS0 - 0x918 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL1 - desc DIEPCTL1 - 0x920 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT1 - desc DIEPINT1 - 0x928 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ1 - desc DIEPTSIZ1 - 0x930 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA1 - desc DIEPDMA1 - 0x934 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS1 - desc DTXFSTS1 - 0x938 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL2 - desc DIEPCTL2 - 0x940 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT2 - desc DIEPINT2 - 0x948 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ2 - desc DIEPTSIZ2 - 0x950 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA2 - desc DIEPDMA2 - 0x954 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS2 - desc DTXFSTS2 - 0x958 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL3 - desc DIEPCTL3 - 0x960 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT3 - desc DIEPINT3 - 0x968 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ3 - desc DIEPTSIZ3 - 0x970 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA3 - desc DIEPDMA3 - 0x974 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS3 - desc DTXFSTS3 - 0x978 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL4 - desc DIEPCTL4 - 0x980 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT4 - desc DIEPINT4 - 0x988 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ4 - desc DIEPTSIZ4 - 0x990 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA4 - desc DIEPDMA4 - 0x994 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS4 - desc DTXFSTS4 - 0x998 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL5 - desc DIEPCTL5 - 0x9A0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT5 - desc DIEPINT5 - 0x9A8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ5 - desc DIEPTSIZ5 - 0x9B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA5 - desc DIEPDMA5 - 0x9B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS5 - desc DTXFSTS5 - 0x9B8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL6 - desc DIEPCTL6 - 0x9C0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT6 - desc DIEPINT6 - 0x9C8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ6 - desc DIEPTSIZ6 - 0x9D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA6 - desc DIEPDMA6 - 0x9D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS6 - desc DTXFSTS6 - 0x9D8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL7 - desc DIEPCTL7 - 0x9E0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT7 - desc DIEPINT7 - 0x9E8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ7 - desc DIEPTSIZ7 - 0x9F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA7 - desc DIEPDMA7 - 0x9F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS7 - desc DTXFSTS7 - 0x9F8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL8 - desc DIEPCTL8 - 0xA00 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT8 - desc DIEPINT8 - 0xA08 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ8 - desc DIEPTSIZ8 - 0xA10 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA8 - desc DIEPDMA8 - 0xA14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS8 - desc DTXFSTS8 - 0xA18 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL9 - desc DIEPCTL9 - 0xA20 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT9 - desc DIEPINT9 - 0xA28 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ9 - desc DIEPTSIZ9 - 0xA30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA9 - desc DIEPDMA9 - 0xA34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS9 - desc DTXFSTS9 - 0xA38 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL10 - desc DIEPCTL10 - 0xA40 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT10 - desc DIEPINT10 - 0xA48 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ10 - desc DIEPTSIZ10 - 0xA50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA10 - desc DIEPDMA10 - 0xA54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS10 - desc DTXFSTS10 - 0xA58 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL11 - desc DIEPCTL11 - 0xA60 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT11 - desc DIEPINT11 - 0xA68 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ11 - desc DIEPTSIZ11 - 0xA70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA11 - desc DIEPDMA11 - 0xA74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS11 - desc DTXFSTS11 - 0xA78 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL12 - desc DIEPCTL12 - 0xA80 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT12 - desc DIEPINT12 - 0xA88 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ12 - desc DIEPTSIZ12 - 0xA90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA12 - desc DIEPDMA12 - 0xA94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS12 - desc DTXFSTS12 - 0xA98 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL13 - desc DIEPCTL13 - 0xAA0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT13 - desc DIEPINT13 - 0xAA8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ13 - desc DIEPTSIZ13 - 0xAB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA13 - desc DIEPDMA13 - 0xAB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS13 - desc DTXFSTS13 - 0xAB8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL14 - desc DIEPCTL14 - 0xAC0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT14 - desc DIEPINT14 - 0xAC8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ14 - desc DIEPTSIZ14 - 0xAD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA14 - desc DIEPDMA14 - 0xAD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS14 - desc DTXFSTS14 - 0xAD8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL15 - desc DIEPCTL15 - 0xAE0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-write - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT15 - desc DIEPINT15 - 0xAE8 - 32 - read-write - 0x80 - 0xDB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - - - DIEPTSIZ15 - desc DIEPTSIZ15 - 0xAF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA15 - desc DIEPDMA15 - 0xAF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS15 - desc DTXFSTS15 - 0xAF8 - 32 - read-only - 0x280 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DOEPCTL0 - desc DOEPCTL0 - 0xB00 - 32 - read-write - 0x8000 - 0xCC3E8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT0 - desc DOEPINT0 - 0xB08 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ0 - desc DOEPTSIZ0 - 0xB10 - 32 - read-write - 0x0 - 0x6008007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 19 - 19 - read-write - - - STUPCNT - desc STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA0 - desc DOEPDMA0 - 0xB14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL1 - desc DOEPCTL1 - 0xB20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT1 - desc DOEPINT1 - 0xB28 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ1 - desc DOEPTSIZ1 - 0xB30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA1 - desc DOEPDMA1 - 0xB34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL2 - desc DOEPCTL2 - 0xB40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT2 - desc DOEPINT2 - 0xB48 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ2 - desc DOEPTSIZ2 - 0xB50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA2 - desc DOEPDMA2 - 0xB54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL3 - desc DOEPCTL3 - 0xB60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT3 - desc DOEPINT3 - 0xB68 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ3 - desc DOEPTSIZ3 - 0xB70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA3 - desc DOEPDMA3 - 0xB74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL4 - desc DOEPCTL4 - 0xB80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT4 - desc DOEPINT4 - 0xB88 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ4 - desc DOEPTSIZ4 - 0xB90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA4 - desc DOEPDMA4 - 0xB94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL5 - desc DOEPCTL5 - 0xBA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT5 - desc DOEPINT5 - 0xBA8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ5 - desc DOEPTSIZ5 - 0xBB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA5 - desc DOEPDMA5 - 0xBB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL6 - desc DOEPCTL6 - 0xBC0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT6 - desc DOEPINT6 - 0xBC8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ6 - desc DOEPTSIZ6 - 0xBD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA6 - desc DOEPDMA6 - 0xBD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL7 - desc DOEPCTL7 - 0xBE0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT7 - desc DOEPINT7 - 0xBE8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ7 - desc DOEPTSIZ7 - 0xBF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA7 - desc DOEPDMA7 - 0xBF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL8 - desc DOEPCTL8 - 0xC00 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT8 - desc DOEPINT8 - 0xC08 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ8 - desc DOEPTSIZ8 - 0xC10 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA8 - desc DOEPDMA8 - 0xC14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL9 - desc DOEPCTL9 - 0xC20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT9 - desc DOEPINT9 - 0xC28 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ9 - desc DOEPTSIZ9 - 0xC30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA9 - desc DOEPDMA9 - 0xC34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL10 - desc DOEPCTL10 - 0xC40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT10 - desc DOEPINT10 - 0xC48 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ10 - desc DOEPTSIZ10 - 0xC50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA10 - desc DOEPDMA10 - 0xC54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL11 - desc DOEPCTL11 - 0xC60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT11 - desc DOEPINT11 - 0xC68 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ11 - desc DOEPTSIZ11 - 0xC70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA11 - desc DOEPDMA11 - 0xC74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL12 - desc DOEPCTL12 - 0xC80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT12 - desc DOEPINT12 - 0xC88 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ12 - desc DOEPTSIZ12 - 0xC90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA12 - desc DOEPDMA12 - 0xC94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL13 - desc DOEPCTL13 - 0xCA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT13 - desc DOEPINT13 - 0xCA8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ13 - desc DOEPTSIZ13 - 0xCB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA13 - desc DOEPDMA13 - 0xCB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL14 - desc DOEPCTL14 - 0xCC0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT14 - desc DOEPINT14 - 0xCC8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ14 - desc DOEPTSIZ14 - 0xCD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA14 - desc DOEPDMA14 - 0xCD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL15 - desc DOEPCTL15 - 0xCE0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-write - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT15 - desc DOEPINT15 - 0xCE8 - 32 - read-write - 0x0 - 0x5B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - - - DOEPTSIZ15 - desc DOEPTSIZ15 - 0xCF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA15 - desc DOEPDMA15 - 0xCF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - GCCTL - desc GCCTL - 0xE00 - 32 - read-write - 0x0 - 0xE3 - - - STPPCLK - desc STPPCLK - 0 - 0 - read-write - - - GATEHCLK - desc GATEHCLK - 1 - 1 - read-write - - - ENL1GTG - desc ENL1GTG - 5 - 5 - read-write - - - PHYSLEEP - desc PHYSLEEP - 6 - 6 - read-write - - - SUSP - desc SUSP - 7 - 7 - read-write - - - - - - - USBHS - desc USBHS - 0x400C0000 - - 0x0 - 0xE04 - - - - GVBUSCFG - desc GVBUSCFG - 0x0 - 32 - read-write - 0x0 - 0xC0 - - - VBUSOVEN - desc VBUSOVEN - 6 - 6 - read-write - - - VBUSVAL - desc VBUSVAL - 7 - 7 - read-write - - - - - GAHBCFG - desc GAHBCFG - 0x8 - 32 - read-write - 0x0 - 0x1BF - - - GINTMSK - desc GINTMSK - 0 - 0 - read-write - - - HBSTLEN - desc HBSTLEN - 4 - 1 - read-write - - - DMAEN - desc DMAEN - 5 - 5 - read-write - - - TXFELVL - desc TXFELVL - 7 - 7 - read-write - - - PTXFELVL - desc PTXFELVL - 8 - 8 - read-write - - - - - GUSBCFG - desc GUSBCFG - 0xC - 32 - read-write - 0x1410 - 0x63BEBC47 - - - TOCAL - desc TOCAL - 2 - 0 - read-write - - - PHYSEL - desc PHYSEL - 6 - 6 - read-write - - - TRDT - desc TRDT - 13 - 10 - read-write - - - PHYLPCS - desc PHYLPCS - 15 - 15 - read-write - - - ULFSLS - desc ULFSLS - 17 - 17 - read-write - - - ULPIAR - desc ULPIAR - 18 - 18 - read-write - - - ULPICSM - desc ULPICSM - 19 - 19 - read-write - - - ULPIEVBUSD - desc ULPIEVBUSD - 20 - 20 - read-write - - - ULPIEVBUSI - desc ULPIEVBUSI - 21 - 21 - read-write - - - PCCI - desc PCCI - 23 - 23 - read-write - - - PTCI - desc PTCI - 24 - 24 - read-write - - - ULPIPD - desc ULPIPD - 25 - 25 - read-write - - - FHMOD - desc FHMOD - 29 - 29 - read-write - - - FDMOD - desc FDMOD - 30 - 30 - read-write - - - - - GRSTCTL - desc GRSTCTL - 0x10 - 32 - read-write - 0x80000000 - 0xC00007F7 - - - CSRST - desc CSRST - 0 - 0 - read-write - - - HSRST - desc HSRST - 1 - 1 - read-write - - - FCRST - desc FCRST - 2 - 2 - read-write - - - RXFFLSH - desc RXFFLSH - 4 - 4 - read-write - - - TXFFLSH - desc TXFFLSH - 5 - 5 - read-write - - - TXFNUM - desc TXFNUM - 10 - 6 - read-write - - - DMAREQ - desc DMAREQ - 30 - 30 - read-only - - - AHBIDL - desc AHBIDL - 31 - 31 - read-only - - - - - GINTSTS - desc GINTSTS - 0x14 - 32 - read-only - 0x14000020 - 0xFF7CFCFB - - - CMOD - desc CMOD - 0 - 0 - read-only - - - MMIS - desc MMIS - 1 - 1 - read-write - - - SOF - desc SOF - 3 - 3 - read-write - - - RXFNE - desc RXFNE - 4 - 4 - read-only - - - NPTXFE - desc NPTXFE - 5 - 5 - read-only - - - GINAKEFF - desc GINAKEFF - 6 - 6 - read-only - - - GONAKEFF - desc GONAKEFF - 7 - 7 - read-only - - - ESUSP - desc ESUSP - 10 - 10 - read-write - - - USBSUSP - desc USBSUSP - 11 - 11 - read-write - - - USBRST - desc USBRST - 12 - 12 - read-write - - - ENUMDNE - desc ENUMDNE - 13 - 13 - read-write - - - ISOODRP - desc ISOODRP - 14 - 14 - read-write - - - EOPF - desc EOPF - 15 - 15 - read-write - - - IEPINT - desc IEPINT - 18 - 18 - read-only - - - OEPINT - desc OEPINT - 19 - 19 - read-only - - - IISOIXFR - desc IISOIXFR - 20 - 20 - read-write - - - IPXFR_INCOMPISOOUT - desc IPXFR_INCOMPISOOUT - 21 - 21 - read-write - - - DATAFSUSP - desc DATAFSUSP - 22 - 22 - read-write - - - HPRTINT - desc HPRTINT - 24 - 24 - read-only - - - HCINT - desc HCINT - 25 - 25 - read-only - - - PTXFE - desc PTXFE - 26 - 26 - read-only - - - LPMINT - desc LPMINT - 27 - 27 - read-write - - - CIDSCHG - desc CIDSCHG - 28 - 28 - read-write - - - DISCINT - desc DISCINT - 29 - 29 - read-write - - - VBUSVINT - desc VBUSVINT - 30 - 30 - read-write - - - WKUINT - desc WKUINT - 31 - 31 - read-write - - - - - GINTMSK - desc GINTMSK - 0x18 - 32 - read-write - 0x0 - 0xFF7CFCFA - - - MMISM - desc MMISM - 1 - 1 - read-write - - - SOFM - desc SOFM - 3 - 3 - read-write - - - RXFNEM - desc RXFNEM - 4 - 4 - read-write - - - NPTXFEM - desc NPTXFEM - 5 - 5 - read-write - - - GINAKEFFM - desc GINAKEFFM - 6 - 6 - read-write - - - GONAKEFFM - desc GONAKEFFM - 7 - 7 - read-write - - - ESUSPM - desc ESUSPM - 10 - 10 - read-write - - - USBSUSPM - desc USBSUSPM - 11 - 11 - read-write - - - USBRSTM - desc USBRSTM - 12 - 12 - read-write - - - ENUMDNEM - desc ENUMDNEM - 13 - 13 - read-write - - - ISOODRPM - desc ISOODRPM - 14 - 14 - read-write - - - EOPFM - desc EOPFM - 15 - 15 - read-write - - - IEPIM - desc IEPIM - 18 - 18 - read-write - - - OEPIM - desc OEPIM - 19 - 19 - read-write - - - IISOIXFRM - desc IISOIXFRM - 20 - 20 - read-write - - - IPXFRM_INCOMPISOOUTM - desc IPXFRM_INCOMPISOOUTM - 21 - 21 - read-write - - - DATAFSUSPM - desc DATAFSUSPM - 22 - 22 - read-write - - - HPRTIM - desc HPRTIM - 24 - 24 - read-write - - - HCIM - desc HCIM - 25 - 25 - read-write - - - PTXFEM - desc PTXFEM - 26 - 26 - read-write - - - LPMINTM - desc LPMINTM - 27 - 27 - read-write - - - CIDSCHGM - desc CIDSCHGM - 28 - 28 - read-write - - - DISCIM - desc DISCIM - 29 - 29 - read-write - - - VBUSVIM - desc VBUSVIM - 30 - 30 - read-write - - - WKUIM - desc WKUIM - 31 - 31 - read-write - - - - - GRXSTSR - desc GRXSTSR - 0x1C - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXSTSP - desc GRXSTSP - 0x20 - 32 - read-only - 0x0 - 0x1FFFFF - - - CHNUM_EPNUM - desc CHNUM_EPNUM - 3 - 0 - read-only - - - BCNT - desc BCNT - 14 - 4 - read-only - - - DPID - desc DPID - 16 - 15 - read-only - - - PKTSTS - desc PKTSTS - 20 - 17 - read-only - - - - - GRXFSIZ - desc GRXFSIZ - 0x24 - 32 - read-write - 0x800 - 0xFFF - - - RXFD - desc RXFD - 11 - 0 - read-write - - - - - HNPTXFSIZ - desc HNPTXFSIZ - 0x28 - 32 - read-write - 0x8000800 - 0xFFFFFFFF - - - NPTXFSA - desc NPTXFSA - 15 - 0 - read-write - - - NPTXFD - desc NPTXFD - 31 - 16 - read-write - - - - - HNPTXSTS - desc HNPTXSTS - 0x2C - 32 - read-only - 0x80800 - 0x7FFFFFFF - - - NPTXFSAV - desc NPTXFSAV - 15 - 0 - read-only - - - NPTQXSAV - desc NPTQXSAV - 23 - 16 - read-only - - - NPTXQTOP - desc NPTXQTOP - 30 - 24 - read-only - - - - - CID - desc CID - 0x3C - 32 - read-write - 0x12345678 - 0xFFFFFFFF - - - GLPMCFG - desc GLPMCFG - 0x54 - 32 - read-write - 0x0 - 0x1FFFFFFF - - - LPMEN - desc LPMEN - 0 - 0 - read-write - - - LPMACK - desc LPMACK - 1 - 1 - read-write - - - BSEL - desc BSEL - 5 - 2 - read-write - - - REMWAKE - desc REMWAKE - 6 - 6 - read-write - - - L1SSEN - desc L1SSEN - 7 - 7 - read-write - - - BESLTHRS - desc BESLTHRS - 11 - 8 - read-write - - - L1DSEN - desc L1DSEN - 12 - 12 - read-write - - - LPMRSP - desc LPMRSP - 14 - 13 - read-only - - - SLPSTS - desc SLPSTS - 15 - 15 - read-only - - - L1RSMOK - desc L1RSMOK - 16 - 16 - read-only - - - LPMCHIDX - desc LPMCHIDX - 20 - 17 - read-write - - - LPMRCNT - desc LPMRCNT - 23 - 21 - read-write - - - SENDLPM - desc SENDLPM - 24 - 24 - read-write - - - LPMRCNTSTS - desc LPMRCNTSTS - 27 - 25 - read-only - - - ENBSEL - desc ENBSEL - 28 - 28 - read-write - - - - - HPTXFSIZ - desc HPTXFSIZ - 0x100 - 32 - read-write - 0x8001000 - 0xFFFFFFFF - - - PTXSA - desc PTXSA - 15 - 0 - read-write - - - PTXFD - desc PTXFD - 31 - 16 - read-write - - - - - DIEPTXF1 - desc DIEPTXF1 - 0x104 - 32 - read-write - 0x8001000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF2 - desc DIEPTXF2 - 0x108 - 32 - read-write - 0x8001800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF3 - desc DIEPTXF3 - 0x10C - 32 - read-write - 0x8002000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF4 - desc DIEPTXF4 - 0x110 - 32 - read-write - 0x8002800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF5 - desc DIEPTXF5 - 0x114 - 32 - read-write - 0x8003000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF6 - desc DIEPTXF6 - 0x118 - 32 - read-write - 0x8003800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF7 - desc DIEPTXF7 - 0x11C - 32 - read-write - 0x8004000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF8 - desc DIEPTXF8 - 0x120 - 32 - read-write - 0x8004800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF9 - desc DIEPTXF9 - 0x124 - 32 - read-write - 0x8005000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF10 - desc DIEPTXF10 - 0x128 - 32 - read-write - 0x8005800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF11 - desc DIEPTXF11 - 0x12C - 32 - read-write - 0x8006000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF12 - desc DIEPTXF12 - 0x130 - 32 - read-write - 0x8006800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF13 - desc DIEPTXF13 - 0x134 - 32 - read-write - 0x8007000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF14 - desc DIEPTXF14 - 0x138 - 32 - read-write - 0x8007800 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - DIEPTXF15 - desc DIEPTXF15 - 0x13C - 32 - read-write - 0x8008000 - 0xFFFFFFFF - - - INEPTXSA - desc INEPTXSA - 15 - 0 - read-write - - - INEPTXFD - desc INEPTXFD - 31 - 16 - read-write - - - - - HCFG - desc HCFG - 0x400 - 32 - read-write - 0x200 - 0x7 - - - FSLSPCS - desc FSLSPCS - 1 - 0 - read-write - - - FSLSS - desc FSLSS - 2 - 2 - read-write - - - - - HFIR - desc HFIR - 0x404 - 32 - read-write - 0xEA60 - 0xFFFF - - - FRIVL - desc FRIVL - 15 - 0 - read-write - - - - - HFNUM - desc HFNUM - 0x408 - 32 - read-only - 0x3FFF - 0xFFFFFFFF - - - FRNUM - desc FRNUM - 15 - 0 - read-only - - - FTREM - desc FTREM - 31 - 16 - read-only - - - - - HPTXSTS - desc HPTXSTS - 0x410 - 32 - read-only - 0x80800 - 0xFFFFFFFF - - - PTXFSAVL - desc PTXFSAVL - 15 - 0 - read-only - - - PTXQSAV - desc PTXQSAV - 23 - 16 - read-only - - - PTXQTOP - desc PTXQTOP - 31 - 24 - read-only - - - - - HAINT - desc HAINT - 0x414 - 32 - read-only - 0x0 - 0xFFFF - - - HAINT - desc HAINT - 15 - 0 - read-only - - - - - HAINTMSK - desc HAINTMSK - 0x418 - 32 - read-write - 0x0 - 0xFFFF - - - HAINTM - desc HAINTM - 15 - 0 - read-write - - - - - HPRT - desc HPRT - 0x440 - 32 - read-only - 0x0 - 0x7FDFF - - - PCSTS - desc PCSTS - 0 - 0 - read-only - - - PCDET - desc PCDET - 1 - 1 - read-write - - - PENA - desc PENA - 2 - 2 - read-write - - - PENCHNG - desc PENCHNG - 3 - 3 - read-write - - - POCA - desc POCA - 4 - 4 - read-write - - - POCCHNG - desc POCCHNG - 5 - 5 - read-write - - - PRES - desc PRES - 6 - 6 - read-write - - - PSUSP - desc PSUSP - 7 - 7 - read-write - - - PRST - desc PRST - 8 - 8 - read-write - - - PLSTS - desc PLSTS - 11 - 10 - read-only - - - PWPR - desc PWPR - 12 - 12 - read-write - - - PTCTL - desc PTCTL - 16 - 13 - read-write - - - PSPD - desc PSPD - 18 - 17 - read-only - - - - - HCCHAR0 - desc HCCHAR0 - 0x500 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT0 - desc HCSPLT0 - 0x504 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT0 - desc HCINT0 - 0x508 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK0 - desc HCINTMSK0 - 0x50C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ0 - desc HCTSIZ0 - 0x510 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA0 - desc HCDMA0 - 0x514 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR1 - desc HCCHAR1 - 0x520 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT1 - desc HCSPLT1 - 0x524 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT1 - desc HCINT1 - 0x528 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK1 - desc HCINTMSK1 - 0x52C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ1 - desc HCTSIZ1 - 0x530 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA1 - desc HCDMA1 - 0x534 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR2 - desc HCCHAR2 - 0x540 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT2 - desc HCSPLT2 - 0x544 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT2 - desc HCINT2 - 0x548 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK2 - desc HCINTMSK2 - 0x54C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ2 - desc HCTSIZ2 - 0x550 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA2 - desc HCDMA2 - 0x554 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR3 - desc HCCHAR3 - 0x560 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT3 - desc HCSPLT3 - 0x564 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT3 - desc HCINT3 - 0x568 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK3 - desc HCINTMSK3 - 0x56C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ3 - desc HCTSIZ3 - 0x570 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA3 - desc HCDMA3 - 0x574 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR4 - desc HCCHAR4 - 0x580 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT4 - desc HCSPLT4 - 0x584 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT4 - desc HCINT4 - 0x588 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK4 - desc HCINTMSK4 - 0x58C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ4 - desc HCTSIZ4 - 0x590 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA4 - desc HCDMA4 - 0x594 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR5 - desc HCCHAR5 - 0x5A0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT5 - desc HCSPLT5 - 0x5A4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT5 - desc HCINT5 - 0x5A8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK5 - desc HCINTMSK5 - 0x5AC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ5 - desc HCTSIZ5 - 0x5B0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA5 - desc HCDMA5 - 0x5B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR6 - desc HCCHAR6 - 0x5C0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT6 - desc HCSPLT6 - 0x5C4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT6 - desc HCINT6 - 0x5C8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK6 - desc HCINTMSK6 - 0x5CC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ6 - desc HCTSIZ6 - 0x5D0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA6 - desc HCDMA6 - 0x5D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR7 - desc HCCHAR7 - 0x5E0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT7 - desc HCSPLT7 - 0x5E4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT7 - desc HCINT7 - 0x5E8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK7 - desc HCINTMSK7 - 0x5EC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ7 - desc HCTSIZ7 - 0x5F0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA7 - desc HCDMA7 - 0x5F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR8 - desc HCCHAR8 - 0x600 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT8 - desc HCSPLT8 - 0x604 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT8 - desc HCINT8 - 0x608 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK8 - desc HCINTMSK8 - 0x60C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ8 - desc HCTSIZ8 - 0x610 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA8 - desc HCDMA8 - 0x614 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR9 - desc HCCHAR9 - 0x620 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT9 - desc HCSPLT9 - 0x624 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT9 - desc HCINT9 - 0x628 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK9 - desc HCINTMSK9 - 0x62C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ9 - desc HCTSIZ9 - 0x630 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA9 - desc HCDMA9 - 0x634 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR10 - desc HCCHAR10 - 0x640 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT10 - desc HCSPLT10 - 0x644 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT10 - desc HCINT10 - 0x648 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK10 - desc HCINTMSK10 - 0x64C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ10 - desc HCTSIZ10 - 0x650 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA10 - desc HCDMA10 - 0x654 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR11 - desc HCCHAR11 - 0x660 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT11 - desc HCSPLT11 - 0x664 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT11 - desc HCINT11 - 0x668 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK11 - desc HCINTMSK11 - 0x66C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ11 - desc HCTSIZ11 - 0x670 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA11 - desc HCDMA11 - 0x674 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR12 - desc HCCHAR12 - 0x680 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT12 - desc HCSPLT12 - 0x684 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT12 - desc HCINT12 - 0x688 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK12 - desc HCINTMSK12 - 0x68C - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ12 - desc HCTSIZ12 - 0x690 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA12 - desc HCDMA12 - 0x694 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR13 - desc HCCHAR13 - 0x6A0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT13 - desc HCSPLT13 - 0x6A4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT13 - desc HCINT13 - 0x6A8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK13 - desc HCINTMSK13 - 0x6AC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ13 - desc HCTSIZ13 - 0x6B0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA13 - desc HCDMA13 - 0x6B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR14 - desc HCCHAR14 - 0x6C0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT14 - desc HCSPLT14 - 0x6C4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT14 - desc HCINT14 - 0x6C8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK14 - desc HCINTMSK14 - 0x6CC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ14 - desc HCTSIZ14 - 0x6D0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA14 - desc HCDMA14 - 0x6D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - HCCHAR15 - desc HCCHAR15 - 0x6E0 - 32 - read-write - 0x0 - 0xFFFEFFFF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - EPNUM - desc EPNUM - 14 - 11 - read-write - - - EPDIR - desc EPDIR - 15 - 15 - read-write - - - LSDEV - desc LSDEV - 17 - 17 - read-write - - - EPTYP - desc EPTYP - 19 - 18 - read-write - - - MC - desc MC - 21 - 20 - read-write - - - DAD - desc DAD - 28 - 22 - read-write - - - ODDFRM - desc ODDFRM - 29 - 29 - read-write - - - CHDIS - desc CHDIS - 30 - 30 - read-write - - - CHENA - desc CHENA - 31 - 31 - read-write - - - - - HCSPLT15 - desc HCSPLT15 - 0x6E4 - 32 - read-write - 0x0 - 0x8001FFFF - - - PRTADDR - desc PRTADDR - 6 - 0 - read-write - - - HUBADDR - desc HUBADDR - 13 - 7 - read-write - - - XACTPOS - desc XACTPOS - 15 - 14 - read-write - - - COMPLSPLT - desc COMPLSPLT - 16 - 16 - read-write - - - SPLITEN - desc SPLITEN - 31 - 31 - read-write - - - - - HCINT15 - desc HCINT15 - 0x6E8 - 32 - read-write - 0x0 - 0x7FF - - - XFRC - desc XFRC - 0 - 0 - read-write - - - CHH - desc CHH - 1 - 1 - read-write - - - AHBERR - desc AHBERR - 2 - 2 - read-write - - - STALL - desc STALL - 3 - 3 - read-write - - - NAK - desc NAK - 4 - 4 - read-write - - - ACK - desc ACK - 5 - 5 - read-write - - - NYET - desc NYET - 6 - 6 - read-write - - - TXERR - desc TXERR - 7 - 7 - read-write - - - BBERR - desc BBERR - 8 - 8 - read-write - - - FRMOR - desc FRMOR - 9 - 9 - read-write - - - DTERR - desc DTERR - 10 - 10 - read-write - - - - - HCINTMSK15 - desc HCINTMSK15 - 0x6EC - 32 - read-write - 0x0 - 0x7FF - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - CHHM - desc CHHM - 1 - 1 - read-write - - - AHBERRM - desc AHBERRM - 2 - 2 - read-write - - - STALLM - desc STALLM - 3 - 3 - read-write - - - NAKM - desc NAKM - 4 - 4 - read-write - - - ACKM - desc ACKM - 5 - 5 - read-write - - - NYETM - desc NYETM - 6 - 6 - read-write - - - TXERRM - desc TXERRM - 7 - 7 - read-write - - - BBERRM - desc BBERRM - 8 - 8 - read-write - - - FRMORM - desc FRMORM - 9 - 9 - read-write - - - DTERRM - desc DTERRM - 10 - 10 - read-write - - - - - HCTSIZ15 - desc HCTSIZ15 - 0x6F0 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - DPID - desc DPID - 30 - 29 - read-write - - - DOPING - desc DOPING - 31 - 31 - read-write - - - - - HCDMA15 - desc HCDMA15 - 0x6F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DCFG - desc DCFG - 0x800 - 32 - read-write - 0x8220000 - 0x1FF7 - - - DSPD - desc DSPD - 1 - 0 - read-write - - - NZLSOHSK - desc NZLSOHSK - 2 - 2 - read-write - - - DAD - desc DAD - 10 - 4 - read-write - - - PFIVL - desc PFIVL - 12 - 11 - read-write - - - - - DCTL - desc DCTL - 0x804 - 32 - read-write - 0x2 - 0xFFF - - - RWUSIG - desc RWUSIG - 0 - 0 - read-write - - - SDIS - desc SDIS - 1 - 1 - read-write - - - GINSTS - desc GINSTS - 2 - 2 - read-only - - - GONSTS - desc GONSTS - 3 - 3 - read-only - - - TCTL - desc TCTL - 6 - 4 - read-write - - - SGINAK - desc SGINAK - 7 - 7 - read-write - - - CGINAK - desc CGINAK - 8 - 8 - read-write - - - SGONAK - desc SGONAK - 9 - 9 - read-write - - - CGONAK - desc CGONAK - 10 - 10 - read-write - - - POPRGDNE - desc POPRGDNE - 11 - 11 - read-write - - - - - DSTS - desc DSTS - 0x808 - 32 - read-only - 0x2 - 0xFFFF0F - - - SUSPSTS - desc SUSPSTS - 0 - 0 - read-only - - - ENUMSPD - desc ENUMSPD - 2 - 1 - read-only - - - EERR - desc EERR - 3 - 3 - read-only - - - FNSOF - desc FNSOF - 21 - 8 - read-only - - - LNSTS - desc LNSTS - 23 - 22 - read-only - - - - - DIEPMSK - desc DIEPMSK - 0x810 - 32 - read-write - 0x0 - 0x217B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - TOM - desc TOM - 3 - 3 - read-write - - - TTXFEMSK - desc TTXFEMSK - 4 - 4 - read-write - - - INEPNMM - desc INEPNMM - 5 - 5 - read-write - - - INEPNEM - desc INEPNEM - 6 - 6 - read-write - - - TXFURM - desc TXFURM - 8 - 8 - read-write - - - NAKM - desc NAKM - 13 - 13 - read-write - - - - - DOEPMSK - desc DOEPMSK - 0x814 - 32 - read-write - 0x0 - 0x415B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - STUPM - desc STUPM - 3 - 3 - read-write - - - OTEPDM - desc OTEPDM - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - OPEM - desc OPEM - 8 - 8 - read-write - - - NYETM - desc NYETM - 14 - 14 - read-write - - - - - DAINT - desc DAINT - 0x818 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IEPINT - desc IEPINT - 15 - 0 - read-write - - - OEPINT - desc OEPINT - 31 - 16 - read-write - - - - - DAINTMSK - desc DAINTMSK - 0x81C - 32 - read-write - 0x0 - 0xFFFFFFFF - - - IEPINTM - desc IEPINTM - 15 - 0 - read-write - - - OEPINTM - desc OEPINTM - 31 - 16 - read-write - - - - - DTHRCTL - desc DTHRCTL - 0x830 - 32 - read-write - 0xC100020 - 0xBFF07FF - - - NONISOTHREN - desc NONISOTHREN - 0 - 0 - read-write - - - ISOTHREN - desc ISOTHREN - 1 - 1 - read-write - - - TXTHRLEN - desc TXTHRLEN - 10 - 2 - read-write - - - RXTHREN - desc RXTHREN - 16 - 16 - read-write - - - RXTHRLEN - desc RXTHRLEN - 25 - 17 - read-write - - - ARPEN - desc ARPEN - 27 - 27 - read-write - - - - - DIEPEMPMSK - desc DIEPEMPMSK - 0x834 - 32 - read-write - 0x0 - 0xFFFF - - - INEPTXFEM - desc INEPTXFEM - 15 - 0 - read-write - - - - - DEACHINT - desc DEACHINT - 0x838 - 32 - read-write - 0x0 - 0x20002 - - - IEP1INT - desc IEP1INT - 1 - 1 - read-write - - - OEP1INT - desc OEP1INT - 17 - 17 - read-write - - - - - DEACHINTMSK - desc DEACHINTMSK - 0x83C - 32 - read-write - 0x0 - 0x20002 - - - IEP1INTM - desc IEP1INTM - 1 - 1 - read-write - - - OEP1INTM - desc OEP1INTM - 17 - 17 - read-write - - - - - DIEPEACHMSK1 - desc DIEPEACHMSK1 - 0x844 - 32 - read-write - 0x0 - 0x217B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - TOM - desc TOM - 3 - 3 - read-write - - - TTXFEMSK - desc TTXFEMSK - 4 - 4 - read-write - - - INEPNMM - desc INEPNMM - 5 - 5 - read-write - - - INEPNEM - desc INEPNEM - 6 - 6 - read-write - - - TXFURM - desc TXFURM - 8 - 8 - read-write - - - NAKM - desc NAKM - 13 - 13 - read-write - - - - - DOEPEACHMSK1 - desc DOEPEACHMSK1 - 0x884 - 32 - read-write - 0x0 - 0x415B - - - XFRCM - desc XFRCM - 0 - 0 - read-write - - - EPDM - desc EPDM - 1 - 1 - read-write - - - STUPM - desc STUPM - 3 - 3 - read-write - - - OTEPDM - desc OTEPDM - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - OPEM - desc OPEM - 8 - 8 - read-write - - - NYETM - desc NYETM - 14 - 14 - read-write - - - - - DIEPCTL0 - desc DIEPCTL0 - 0x900 - 32 - read-only - 0x8000 - 0xCFEE8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT0 - desc DIEPINT0 - 0x908 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ0 - desc DIEPTSIZ0 - 0x910 - 32 - read-write - 0x0 - 0x18007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 20 - 19 - read-write - - - - - DIEPDMA0 - desc DIEPDMA0 - 0x914 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS0 - desc DTXFSTS0 - 0x918 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL1 - desc DIEPCTL1 - 0x920 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT1 - desc DIEPINT1 - 0x928 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ1 - desc DIEPTSIZ1 - 0x930 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA1 - desc DIEPDMA1 - 0x934 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS1 - desc DTXFSTS1 - 0x938 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL2 - desc DIEPCTL2 - 0x940 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT2 - desc DIEPINT2 - 0x948 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ2 - desc DIEPTSIZ2 - 0x950 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA2 - desc DIEPDMA2 - 0x954 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS2 - desc DTXFSTS2 - 0x958 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL3 - desc DIEPCTL3 - 0x960 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT3 - desc DIEPINT3 - 0x968 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ3 - desc DIEPTSIZ3 - 0x970 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA3 - desc DIEPDMA3 - 0x974 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS3 - desc DTXFSTS3 - 0x978 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL4 - desc DIEPCTL4 - 0x980 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT4 - desc DIEPINT4 - 0x988 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ4 - desc DIEPTSIZ4 - 0x990 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA4 - desc DIEPDMA4 - 0x994 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS4 - desc DTXFSTS4 - 0x998 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL5 - desc DIEPCTL5 - 0x9A0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT5 - desc DIEPINT5 - 0x9A8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ5 - desc DIEPTSIZ5 - 0x9B0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA5 - desc DIEPDMA5 - 0x9B4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS5 - desc DTXFSTS5 - 0x9B8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL6 - desc DIEPCTL6 - 0x9C0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT6 - desc DIEPINT6 - 0x9C8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ6 - desc DIEPTSIZ6 - 0x9D0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA6 - desc DIEPDMA6 - 0x9D4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS6 - desc DTXFSTS6 - 0x9D8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL7 - desc DIEPCTL7 - 0x9E0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT7 - desc DIEPINT7 - 0x9E8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ7 - desc DIEPTSIZ7 - 0x9F0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA7 - desc DIEPDMA7 - 0x9F4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS7 - desc DTXFSTS7 - 0x9F8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL8 - desc DIEPCTL8 - 0xA00 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT8 - desc DIEPINT8 - 0xA08 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ8 - desc DIEPTSIZ8 - 0xA10 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA8 - desc DIEPDMA8 - 0xA14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS8 - desc DTXFSTS8 - 0xA18 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL9 - desc DIEPCTL9 - 0xA20 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT9 - desc DIEPINT9 - 0xA28 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ9 - desc DIEPTSIZ9 - 0xA30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA9 - desc DIEPDMA9 - 0xA34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS9 - desc DTXFSTS9 - 0xA38 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL10 - desc DIEPCTL10 - 0xA40 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT10 - desc DIEPINT10 - 0xA48 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ10 - desc DIEPTSIZ10 - 0xA50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA10 - desc DIEPDMA10 - 0xA54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS10 - desc DTXFSTS10 - 0xA58 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL11 - desc DIEPCTL11 - 0xA60 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT11 - desc DIEPINT11 - 0xA68 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ11 - desc DIEPTSIZ11 - 0xA70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA11 - desc DIEPDMA11 - 0xA74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS11 - desc DTXFSTS11 - 0xA78 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL12 - desc DIEPCTL12 - 0xA80 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT12 - desc DIEPINT12 - 0xA88 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ12 - desc DIEPTSIZ12 - 0xA90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA12 - desc DIEPDMA12 - 0xA94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS12 - desc DTXFSTS12 - 0xA98 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL13 - desc DIEPCTL13 - 0xAA0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT13 - desc DIEPINT13 - 0xAA8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ13 - desc DIEPTSIZ13 - 0xAB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA13 - desc DIEPDMA13 - 0xAB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS13 - desc DTXFSTS13 - 0xAB8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL14 - desc DIEPCTL14 - 0xAC0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT14 - desc DIEPINT14 - 0xAC8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ14 - desc DIEPTSIZ14 - 0xAD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA14 - desc DIEPDMA14 - 0xAD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS14 - desc DTXFSTS14 - 0xAD8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DIEPCTL15 - desc DIEPCTL15 - 0xAE0 - 32 - read-write - 0x0 - 0xFFEF87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - EONUM_DPID - desc EONUM_DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - STALL - desc STALL - 21 - 21 - read-write - - - TXFNUM - desc TXFNUM - 25 - 22 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID_SEVNFRM - desc SD0PID_SEVNFRM - 28 - 28 - read-write - - - SODDFRM - desc SODDFRM - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DIEPINT15 - desc DIEPINT15 - 0xAE8 - 32 - read-write - 0x80 - 0x39DB - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - TOC - desc TOC - 3 - 3 - read-write - - - TTXFE - desc TTXFE - 4 - 4 - read-write - - - INEPNE - desc INEPNE - 6 - 6 - read-write - - - TXFE - desc TXFE - 7 - 7 - read-only - - - TXFIFOUDRN - desc TXFIFOUDRN - 8 - 8 - read-write - - - PKTDRPSTS - desc PKTDRPSTS - 11 - 11 - read-write - - - BERR - desc BERR - 12 - 12 - read-write - - - NAK - desc NAK - 13 - 13 - read-write - - - - - DIEPTSIZ15 - desc DIEPTSIZ15 - 0xAF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - MCNT - desc MCNT - 30 - 29 - read-write - - - - - DIEPDMA15 - desc DIEPDMA15 - 0xAF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DTXFSTS15 - desc DTXFSTS15 - 0xAF8 - 32 - read-only - 0x800 - 0xFFFF - - - INEPTFSAV - desc INEPTFSAV - 15 - 0 - read-only - - - - - DOEPCTL0 - desc DOEPCTL0 - 0xB00 - 32 - read-only - 0x8000 - 0xCC3E8003 - - - MPSIZ - desc MPSIZ - 1 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT0 - desc DOEPINT0 - 0xB08 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ0 - desc DOEPTSIZ0 - 0xB10 - 32 - read-write - 0x0 - 0x6008007F - - - XFRSIZ - desc XFRSIZ - 6 - 0 - read-write - - - PKTCNT - desc PKTCNT - 19 - 19 - read-write - - - STUPCNT - desc STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA0 - desc DOEPDMA0 - 0xB14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL1 - desc DOEPCTL1 - 0xB20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT1 - desc DOEPINT1 - 0xB28 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ1 - desc DOEPTSIZ1 - 0xB30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA1 - desc DOEPDMA1 - 0xB34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL2 - desc DOEPCTL2 - 0xB40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT2 - desc DOEPINT2 - 0xB48 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ2 - desc DOEPTSIZ2 - 0xB50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA2 - desc DOEPDMA2 - 0xB54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL3 - desc DOEPCTL3 - 0xB60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT3 - desc DOEPINT3 - 0xB68 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ3 - desc DOEPTSIZ3 - 0xB70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA3 - desc DOEPDMA3 - 0xB74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL4 - desc DOEPCTL4 - 0xB80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT4 - desc DOEPINT4 - 0xB88 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ4 - desc DOEPTSIZ4 - 0xB90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA4 - desc DOEPDMA4 - 0xB94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL5 - desc DOEPCTL5 - 0xBA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT5 - desc DOEPINT5 - 0xBA8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ5 - desc DOEPTSIZ5 - 0xBB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA5 - desc DOEPDMA5 - 0xBB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL6 - desc DOEPCTL6 - 0xBC0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT6 - desc DOEPINT6 - 0xBC8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ6 - desc DOEPTSIZ6 - 0xBD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA6 - desc DOEPDMA6 - 0xBD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL7 - desc DOEPCTL7 - 0xBE0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT7 - desc DOEPINT7 - 0xBE8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ7 - desc DOEPTSIZ7 - 0xBF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA7 - desc DOEPDMA7 - 0xBF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL8 - desc DOEPCTL8 - 0xC00 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT8 - desc DOEPINT8 - 0xC08 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ8 - desc DOEPTSIZ8 - 0xC10 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA8 - desc DOEPDMA8 - 0xC14 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL9 - desc DOEPCTL9 - 0xC20 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT9 - desc DOEPINT9 - 0xC28 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ9 - desc DOEPTSIZ9 - 0xC30 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA9 - desc DOEPDMA9 - 0xC34 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL10 - desc DOEPCTL10 - 0xC40 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT10 - desc DOEPINT10 - 0xC48 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ10 - desc DOEPTSIZ10 - 0xC50 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA10 - desc DOEPDMA10 - 0xC54 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL11 - desc DOEPCTL11 - 0xC60 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT11 - desc DOEPINT11 - 0xC68 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ11 - desc DOEPTSIZ11 - 0xC70 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA11 - desc DOEPDMA11 - 0xC74 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL12 - desc DOEPCTL12 - 0xC80 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT12 - desc DOEPINT12 - 0xC88 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ12 - desc DOEPTSIZ12 - 0xC90 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA12 - desc DOEPDMA12 - 0xC94 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL13 - desc DOEPCTL13 - 0xCA0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT13 - desc DOEPINT13 - 0xCA8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ13 - desc DOEPTSIZ13 - 0xCB0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA13 - desc DOEPDMA13 - 0xCB4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL14 - desc DOEPCTL14 - 0xCC0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT14 - desc DOEPINT14 - 0xCC8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ14 - desc DOEPTSIZ14 - 0xCD0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA14 - desc DOEPDMA14 - 0xCD4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - DOEPCTL15 - desc DOEPCTL15 - 0xCE0 - 32 - read-write - 0x0 - 0xFC3F87FF - - - MPSIZ - desc MPSIZ - 10 - 0 - read-write - - - USBAEP - desc USBAEP - 15 - 15 - read-only - - - DPID - desc DPID - 16 - 16 - read-only - - - NAKSTS - desc NAKSTS - 17 - 17 - read-only - - - EPTYP - desc EPTYP - 19 - 18 - read-only - - - SNPM - desc SNPM - 20 - 20 - read-write - - - STALL - desc STALL - 21 - 21 - read-write - - - CNAK - desc CNAK - 26 - 26 - read-write - - - SNAK - desc SNAK - 27 - 27 - read-write - - - SD0PID - desc SD0PID - 28 - 28 - read-write - - - SD1PID - desc SD1PID - 29 - 29 - read-write - - - EPDIS - desc EPDIS - 30 - 30 - read-only - - - EPENA - desc EPENA - 31 - 31 - read-write - - - - - DOEPINT15 - desc DOEPINT15 - 0xCE8 - 32 - read-write - 0x0 - 0x405B - - - XFRC - desc XFRC - 0 - 0 - read-write - - - EPDISD - desc EPDISD - 1 - 1 - read-write - - - STUP - desc STUP - 3 - 3 - read-write - - - OTEPDIS - desc OTEPDIS - 4 - 4 - read-write - - - B2BSTUP - desc B2BSTUP - 6 - 6 - read-write - - - NYET - desc NYET - 14 - 14 - read-write - - - - - DOEPTSIZ15 - desc DOEPTSIZ15 - 0xCF0 - 32 - read-write - 0x0 - 0x7FFFFFFF - - - XFRSIZ - desc XFRSIZ - 18 - 0 - read-write - - - PKTCNT - desc PKTCNT - 28 - 19 - read-write - - - RXDPID_STUPCNT - desc RXDPID_STUPCNT - 30 - 29 - read-write - - - - - DOEPDMA15 - desc DOEPDMA15 - 0xCF4 - 32 - read-write - 0x0 - 0xFFFFFFFF - - - GCCTL - desc GCCTL - 0xE00 - 32 - read-write - 0x0 - 0xE3 - - - STPPCLK - desc STPPCLK - 0 - 0 - read-write - - - GATEHCLK - desc GATEHCLK - 1 - 1 - read-write - - - ENL1GTG - desc ENL1GTG - 5 - 5 - read-write - - - PHYSLEEP - desc PHYSLEEP - 6 - 6 - read-write - - - SUSP - desc SUSP - 7 - 7 - read-write - - - - - - - WDT - desc WDT - 0x40049000 - - 0x0 - 0xC - - - - CR - desc CR - 0x0 - 32 - read-write - 0x80010FF3 - 0x80010FF3 - - - PERI - desc PERI - 1 - 0 - read-write - - - CKS - desc CKS - 7 - 4 - read-write - - - WDPT - desc WDPT - 11 - 8 - read-write - - - SLPOFF - desc SLPOFF - 16 - 16 - read-write - - - ITS - desc ITS - 31 - 31 - read-write - - - - - SR - desc SR - 0x4 - 32 - read-write - 0x0 - 0x3FFFF - - - CNT - desc CNT - 15 - 0 - read-only - - - UDF - desc UDF - 16 - 16 - read-write - - - REF - desc REF - 17 - 17 - read-write - - - - - RR - desc RR - 0x8 - 32 - read-write - 0x0 - 0xFFFF - - - RF - desc RF - 15 - 0 - read-write - - - - - - - diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_adc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_adc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_adc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_adc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aes.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_aes.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aes.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_aes.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aos.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_aos.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_aos.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_aos.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_can.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_can.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_can.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_can.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_clk.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_clk.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_clk.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_clk.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_cmp.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_cmp.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_cmp.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_cmp.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_crc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_crc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_crc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_crc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_ctc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_ctc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_ctc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_ctc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dac.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dac.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dac.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dac.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dbgc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dbgc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dbgc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dbgc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dcu.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dcu.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dcu.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dcu.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_def.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_def.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_def.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_def.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dma.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dma.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dma.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dma.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dmc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dmc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dmc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dmc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dvp.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dvp.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_dvp.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_dvp.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_efm.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_efm.h similarity index 99% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_efm.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_efm.h index 8ab4d010761..15faaaa43d4 100644 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_efm.h +++ b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_efm.h @@ -249,7 +249,7 @@ typedef struct { * @defgroup EFM_Sector_Size EFM Sector Size * @{ */ -#define SECTOR_SIZE (0x2000UL) +#define EFM_SECTOR_SIZE (0x2000UL) /** * @} @@ -259,7 +259,7 @@ typedef struct { * @defgroup EFM_Sector_Address EFM Sector Address * @{ */ -#define EFM_SECTOR_ADDR(x) (uint32_t)(SECTOR_SIZE * (x)) +#define EFM_SECTOR_ADDR(x) (uint32_t)(EFM_SECTOR_SIZE * (x)) /** * @} */ diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_emb.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_emb.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_emb.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_emb.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_eth.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_eth.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_eth.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_eth.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_event_port.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_event_port.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_event_port.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_event_port.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcg.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_fcg.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcg.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_fcg.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcm.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_fcm.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fcm.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_fcm.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fmac.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_fmac.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_fmac.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_fmac.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_gpio.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_gpio.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_gpio.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_gpio.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_hash.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_hash.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_hash.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_hash.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_hrpwm.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_hrpwm.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_hrpwm.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_hrpwm.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2c.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_i2c.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2c.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_i2c.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2s.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_i2s.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_i2s.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_i2s.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_icg.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_icg.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_icg.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_icg.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_interrupts.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_interrupts.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_interrupts.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_interrupts.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_keyscan.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_keyscan.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_keyscan.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_keyscan.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_mau.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_mau.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_mau.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_mau.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_mpu.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_mpu.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_mpu.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_mpu.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_nfc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_nfc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_nfc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_nfc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_ots.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_ots.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_ots.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_ots.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_pwc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_pwc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_pwc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_pwc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_qspi.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_qspi.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_qspi.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_qspi.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rmu.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_rmu.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rmu.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_rmu.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rtc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_rtc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_rtc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_rtc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sdioc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_sdioc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sdioc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_sdioc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_smc.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_smc.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_smc.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_smc.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_spi.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_spi.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_spi.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_spi.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sram.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_sram.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_sram.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_sram.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_swdt.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_swdt.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_swdt.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_swdt.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr0.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmr0.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr0.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmr0.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr2.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmr2.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr2.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmr2.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr4.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmr4.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr4.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmr4.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr6.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmr6.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmr6.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmr6.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmra.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmra.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_tmra.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_tmra.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_trng.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_trng.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_trng.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_trng.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usart.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_usart.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usart.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_usart.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usb.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_usb.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_usb.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_usb.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_utility.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_utility.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_utility.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_utility.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_wdt.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_wdt.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32_ll_wdt.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32_ll_wdt.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32f4a0_ll_interrupts_share.h b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32f4a0_ll_interrupts_share.h similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/inc/hc32f4a0_ll_interrupts_share.h rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/inc/hc32f4a0_ll_interrupts_share.h diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_adc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_adc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_adc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_adc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_aes.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_aes.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_aes.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_aes.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_aos.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_aos.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_aos.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_aos.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_can.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_can.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_can.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_can.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_clk.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_clk.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_clk.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_clk.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_cmp.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_cmp.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_cmp.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_cmp.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_crc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_crc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_crc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_crc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_ctc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_ctc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_ctc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_ctc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dac.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dac.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dac.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dac.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dbgc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dbgc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dbgc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dbgc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dcu.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dcu.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dcu.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dcu.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dma.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dma.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dma.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dma.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dmc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dmc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dmc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dmc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dvp.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dvp.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_dvp.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_dvp.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_efm.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_efm.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_efm.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_efm.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_emb.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_emb.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_emb.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_emb.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_eth.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_eth.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_eth.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_eth.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_event_port.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_event_port.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_event_port.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_event_port.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcg.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_fcg.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcg.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_fcg.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcm.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_fcm.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_fcm.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_fcm.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_fmac.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_fmac.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_fmac.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_fmac.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_gpio.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_gpio.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_gpio.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_gpio.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_hash.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_hash.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_hash.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_hash.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_hrpwm.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_hrpwm.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_hrpwm.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_hrpwm.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2c.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_i2c.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2c.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_i2c.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2s.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_i2s.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_i2s.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_i2s.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_icg.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_icg.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_icg.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_icg.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_interrupts.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_interrupts.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_interrupts.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_interrupts.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_keyscan.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_keyscan.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_keyscan.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_keyscan.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_mau.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_mau.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_mau.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_mau.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_mpu.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_mpu.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_mpu.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_mpu.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_nfc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_nfc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_nfc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_nfc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_ots.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_ots.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_ots.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_ots.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_pwc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_pwc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_pwc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_pwc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_qspi.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_qspi.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_qspi.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_qspi.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_rmu.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_rmu.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_rmu.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_rmu.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_rtc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_rtc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_rtc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_rtc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_sdioc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_sdioc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_sdioc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_sdioc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_smc.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_smc.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_smc.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_smc.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_spi.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_spi.c similarity index 99% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_spi.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_spi.c index cf7ed50c57a..5e1226bc2e2 100644 --- a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_spi.c +++ b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_spi.c @@ -317,10 +317,10 @@ static int32_t SPI_TxRx(CM_SPI_TypeDef *SPIx, const void *pvTxBuf, void *pvRxBuf int32_t i32Ret = LL_OK; uint32_t u32Tmp; __UNUSED __IO uint32_t u32Read; - __IO uint32_t u32FrameCnt; - uint32_t u32FrameNum = READ_REG32_BIT(SPIx->CFG1, SPI_CFG1_FTHLV) + 1UL; __IO uint32_t u32TxAllow = 1U; uint32_t u32MSMode; + __IO uint32_t u32FrameCnt; + uint32_t u32FrameNum = READ_REG32_BIT(SPIx->CFG1, SPI_CFG1_FTHLV) + 1UL; DDL_ASSERT(0UL == (u32Len % u32FrameNum)); u32MSMode = READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR); @@ -401,7 +401,7 @@ static int32_t SPI_TxRx(CM_SPI_TypeDef *SPIx, const void *pvTxBuf, void *pvRxBuf u32Count++; } - if ((SPI_CR1_MSTR == READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR)) && (i32Ret == LL_OK)) { + if ((SPI_MASTER == READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR)) && (i32Ret == LL_OK)) { i32Ret = SPI_WaitStatus(SPIx, SPI_FLAG_IDLE, 0UL, u32Timeout); } @@ -453,7 +453,7 @@ static int32_t SPI_Tx(CM_SPI_TypeDef *SPIx, const void *pvTxBuf, uint32_t u32Len } } - if ((SPI_CR1_MSTR == READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR)) && (i32Ret == LL_OK)) { + if ((SPI_MASTER == READ_REG32_BIT(SPIx->CR1, SPI_CR1_MSTR)) && (i32Ret == LL_OK)) { i32Ret = SPI_WaitStatus(SPIx, SPI_FLAG_IDLE, 0UL, u32Timeout); } diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_sram.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_sram.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_sram.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_sram.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_swdt.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_swdt.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_swdt.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_swdt.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr0.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmr0.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr0.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmr0.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr2.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmr2.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr2.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmr2.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr4.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmr4.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr4.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmr4.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr6.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmr6.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmr6.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmr6.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmra.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmra.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_tmra.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_tmra.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_trng.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_trng.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_trng.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_trng.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_usart.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_usart.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_usart.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_usart.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_usb.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_usb.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_usb.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_usb.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_utility.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_utility.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_utility.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_utility.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_wdt.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_wdt.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32_ll_wdt.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32_ll_wdt.c diff --git a/bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32f4a0_ll_interrupts_share.c b/bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32f4a0_ll_interrupts_share.c similarity index 100% rename from bsp/hc32/libraries/hc32f4a0_ddl/drivers/hc32_ll_driver/src/hc32f4a0_ll_interrupts_share.c rename to bsp/hc32/libraries/hc32f4a0_ddl/hc32_ll_driver/src/hc32f4a0_ll_interrupts_share.c diff --git a/bsp/hc32/platform/sfud/SConscript b/bsp/hc32/platform/sfud/SConscript index b40316bdd7e..77b3afaf5bf 100644 --- a/bsp/hc32/platform/sfud/SConscript +++ b/bsp/hc32/platform/sfud/SConscript @@ -13,6 +13,6 @@ path = [cwd] if GetDepend(['BSP_USING_SPI_FLASH']): src += Glob('drv_spi_flash.c') -group = DefineGroup('PLATFORM', src, depend = ['RT_USING_SFUD'], CPPPATH = path) +group = DefineGroup('Platform', src, depend = ['RT_USING_SFUD'], CPPPATH = path) Return('group') diff --git a/bsp/hc32/platform/tca9539/SConscript b/bsp/hc32/platform/tca9539/SConscript index d6c6568bbf9..937dca00d85 100644 --- a/bsp/hc32/platform/tca9539/SConscript +++ b/bsp/hc32/platform/tca9539/SConscript @@ -13,6 +13,6 @@ path = [cwd] if GetDepend(['BSP_USING_TCA9539']): src += Glob('tca9539.c') -group = DefineGroup('PLATFORM', src, depend = ['BSP_USING_TCA9539'], CPPPATH = path) +group = DefineGroup('Platform', src, depend = ['BSP_USING_TCA9539'], CPPPATH = path) Return('group') diff --git a/bsp/hc32/tests/SConscript b/bsp/hc32/tests/SConscript new file mode 100644 index 00000000000..ad41311f875 --- /dev/null +++ b/bsp/hc32/tests/SConscript @@ -0,0 +1,98 @@ +Import('RTT_ROOT') +Import('rtconfig') + +from building import * +import os + +cwd = GetCurrentDir() +# add the app files. +src = [] + +if GetDepend(['RT_USING_SERIAL']): + if GetDepend(['RT_USING_SERIAL_V2']): + src += ['test_uart_v2.c'] + else: + src += ['test_uart_v1.c'] + +if GetDepend(['BSP_USING_SPI']): + src += ['test_spi.c'] + +if GetDepend(['BSP_USING_QSPI']): + src += ['test_qspi.c'] + +if GetDepend(['BSP_USING_I2C']): + src += ['test_i2c.c'] + if GetDepend(['RT_USING_I2C_BITOPS']): + src += ['test_soft_i2c.c'] + +if GetDepend(['BSP_USING_ETH', 'RT_USING_LWIP']): + src += ['test_eth.c'] + #lwIP: HTTP server + lwiphttp_src = [] + lwiphttp_src = Split(""" + ../../../components/net/lwip/lwip-2.1.2/src/apps/http/altcp_proxyconnect.c + ../../../components/net/lwip/lwip-2.1.2/src/apps/http/fs.c + ../../../components/net/lwip/lwip-2.1.2/src/apps/http/http_client.c + ../../../components/net/lwip/lwip-2.1.2/src/apps/http/httpd.c + """) + src += lwiphttp_src + +if GetDepend(['BSP_USING_ADC']): + src += ['test_adc.c'] + +if GetDepend(['BSP_USING_DAC']): + src += ['test_dac.c'] + +if GetDepend(['BSP_USING_CAN']): + src += ['test_can.c'] + +if GetDepend(['BSP_USING_RTC']): + src += ['test_rtc.c'] + +if GetDepend(['BSP_USING_WDT']) or GetDepend(['BSP_USING_SWDT']): + src += ['test_wdt.c'] + +if GetDepend(['BSP_USING_HWTIMER']): + src += ['test_hwtimer.c'] + +if GetDepend(['BSP_USING_PULSE_ENCODER']): + src += ['test_pulse_encoder.c'] + +if GetDepend(['BSP_USING_PWM']): + src += ['test_pwm.c'] + +if GetDepend(['BSP_USING_INPUT_CAPTURE']): + src += ['test_tmr_capture.c'] + +if GetDepend(['BSP_USING_PM']): + src += ['test_pm.c'] + +if GetDepend('BSP_USING_HWCRYPTO'): + src += ['test_crypto.c'] + +if GetDepend(['BSP_USING_SDIO']): + src += ['test_sdmmc.c'] + +if GetDepend(['BSP_USING_EXMC', 'BSP_USING_SDRAM']): + src += ['test_sdram.c'] + +if GetDepend(['BSP_USING_EXMC', 'BSP_USING_NAND']): + src += ['test_nand.c'] + +if GetDepend(['BSP_USING_USBD']): + src += ['test_usbd.c'] + +if GetDepend(['BSP_USING_USBH']): + src += ['test_usbh.c'] + +if GetDepend(['BSP_USING_ON_CHIP_FLASH']): + src += ['test_fal.c'] + +if GetDepend(['BSP_USING_GPIO']): + src += ['test_gpio.c'] + +path = [cwd] + +group = DefineGroup('Tests', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/hc32/tests/test_adc.c b/bsp/hc32/tests/test_adc.c new file mode 100644 index 00000000000..2641c664553 --- /dev/null +++ b/bsp/hc32/tests/test_adc.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单: ADC 设备使用例程 + * 例程导出了 adc_vol_sample 命令到控制终端 + * 命令调用格式:adc_vol_sample 参数选择:adc1 | adc2 | adc3 + * 程序功能:通过 ADC 设备采样电压值并转换为数值。 + * 示例代码参考电压为3.3V,转换位数为12位。 + */ +#include +#include +#include "board_config.h" +#include "drv_adc.h" + +#ifdef BSP_USING_ADC + +#define REFER_VOLTAGE 3300 /* 参考电压 3.3V,单位mv */ +#define CONVERT_BITS (1 << 12) /* 转换位数为12位 */ + +/* ADC Channel Max */ +#if defined (HC32F460) + #define ADC1_CH_MAX (16U) + #define ADC2_CH_MAX (8U) +#elif defined (HC32F472) + #define ADC1_CH_MAX (21U) + #define ADC2_CH_MAX (21U) + #define ADC3_CH_MAX (22U) +#elif defined (HC32F4A0) + #define ADC1_CH_MAX (16U) + #define ADC2_CH_MAX (16U) + #define ADC3_CH_MAX (20U) +#elif defined (HC32F448) + #define ADC1_CH_MAX (16U) + #define ADC2_CH_MAX (8U) + #define ADC3_CH_MAX (12U) +#endif + + +#if defined(BSP_ADC1_USING_DMA) || defined(BSP_ADC2_USING_DMA) || defined(BSP_ADC3_USING_DMA) + +static struct adc_dev_priv_params adc_priv; +static struct adc_dev_dma_priv_ops priv_ops; + +/* Timer的配置需与文件 “adc_config.h”中的 ADC1_EOCA_DMA_CONFIG 对应 */ +/* 这里使用Timer01 B通道作为ADC的触发源 */ +rt_err_t adc_dma_trig_config(void) +{ + stc_tmr0_init_t stcTmr0Init; + +#if defined(HC32F460) || defined(HC32F4A0) || defined(HC32F472) || defined(HC32F448) + FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR0_1, ENABLE); +#endif + (void)TMR0_StructInit(&stcTmr0Init); + (void)TMR0_Init(CM_TMR0_1, TMR0_CH_B, &stcTmr0Init); + return 0; +} + +rt_err_t adc_dma_trig_start(void) +{ + TMR0_SetCountValue(CM_TMR0_1, TMR0_CH_B, 0x0); + TMR0_SetCompareValue(CM_TMR0_1, TMR0_CH_B, 0x7FFF); + TMR0_Start(CM_TMR0_1, TMR0_CH_B); + return 0; +} + +rt_err_t adc_dma_trig_stop(void) +{ + TMR0_Stop(CM_TMR0_1, TMR0_CH_B); + TMR0_ClearStatus(CM_TMR0_1, TMR0_FLAG_CMP_B); + return 0; +} +#endif + +static int adc_vol_sample(int argc, char **argv) +{ + rt_adc_device_t adc_dev; /* ADC 设备句柄 */ + rt_uint32_t value; + rt_uint32_t vol; + rt_uint8_t adc_channel; + char adc_device[] = "adc1"; + rt_uint8_t adc_max_channel = ADC1_CH_MAX; + + /* 参数无输入或者输入错误按照默认值处理 */ + if (argc == 2) + { + if (0 == rt_strcmp(argv[1], "adc1")) + { + rt_strcpy(adc_device, "adc1"); + adc_max_channel = ADC1_CH_MAX; + } + else if (0 == rt_strcmp(argv[1], "adc2")) + { + rt_strcpy(adc_device, "adc2"); + adc_max_channel = ADC2_CH_MAX; + } +#if defined (HC32F472) || defined (HC32F4A0) || defined (HC32F448) + else if (0 == rt_strcmp(argv[1], "adc3")) + { + rt_strcpy(adc_device, "adc3"); + adc_max_channel = ADC3_CH_MAX; + } +#endif + else + { + rt_kprintf("The chip hasn't the adc unit!\r\n"); + return -RT_ERROR; + } + } + + /* 查找设备 */ + adc_dev = (rt_adc_device_t)rt_device_find(adc_device); + if (adc_dev == RT_NULL) + { + rt_kprintf("adc sample run failed! can't find %s device!\r\n", adc_device); + return -RT_ERROR; + } + +#if defined(BSP_ADC1_USING_DMA) || defined(BSP_ADC2_USING_DMA) || defined(BSP_ADC3_USING_DMA) + /* DMA配置 */ + adc_priv.flag = ADC_USING_EOCA_DMA_FLAG; + priv_ops.dma_trig_config = &adc_dma_trig_config; + priv_ops.dma_trig_start = &adc_dma_trig_start; + priv_ops.dma_trig_stop = &adc_dma_trig_stop; + adc_priv.ops = &priv_ops; + adc_dev->parent.user_data = &adc_priv; +#endif + + /* 遍历所有通道 */ + for (adc_channel = 0; adc_channel < adc_max_channel; adc_channel++) + { + /* 使能设备 */ + rt_adc_enable(adc_dev, adc_channel); + /* 读取采样值 */ + value = rt_adc_read(adc_dev, adc_channel); + rt_kprintf("Channel: %d, value is :%d 0x%x\r\n", adc_channel, value, value); + /* 转换为对应电压值 */ + vol = value * REFER_VOLTAGE / CONVERT_BITS; + rt_kprintf("Simulate voltage is :%d mv\r\n", vol); + vol = rt_adc_voltage(adc_dev, adc_channel); + rt_kprintf("Read voltage is :%d mv\r\n", vol); + rt_kprintf("*********************\r\n"); + } + rt_kprintf("*******The %s all channel have be tested**********\r\n", adc_device); + return RT_EOK; +} + +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(adc_vol_sample, adc convert sample: select < adc1 | adc2 | adc3 >); +#endif diff --git a/bsp/hc32/tests/test_can.c b/bsp/hc32/tests/test_can.c new file mode 100644 index 00000000000..b788b5defed --- /dev/null +++ b/bsp/hc32/tests/test_can.c @@ -0,0 +1,421 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* +* 功能 +* 展示 CAN1、CAN2、CAN3 接收消息和回发消息。 +* 代码使用方法 +* 在终端执行:can_sample 参数选择:can1 | can2 | can3 以启动CAN收发测试 +* +* 默认波特率 +* 仲裁段:波特率500K,采样率80% +* 数据段:波特率为4M,采样率80% (仅支持CAN FD的单元) +* +* 接收和发送消息 +* CAN1: +* 仅接收满足以下过滤条件的消息,并发送接收到的消息 +* 1)标准帧:match ID:0x100~0x1ff +* 2)扩展帧:match ID:0x12345100~0x123451ff +* 3)固定ID帧: match ID: 0x555 +* 测试设备发送满足以上过滤条件的消息后,会在终端打印接收到的ID和消息,并将消息原样发回给测试设备。 +* +* 命令行命令 +* 1)设置时序: (仅支持CAN FD的单元) +* 注意:使用此项设置前,需修改 MSH 最大参数格式为 20 +* (menuconfig-->RT-Thread Components-->MSH: command shell-->The number of arguments for a shell command) +* 格式: +* can set_bittiming +* 示例: +* MSH >can set_bittiming 1 1 64 16 16 0 (设置can 仲裁段波特率500K) +* MSH >can set_bittiming 2 1 64 16 16 0 1 16 4 4 16 (设置can 仲裁段波特率500K,数据段波特率2M) +* 2)设置仲裁段波特率: +* 格式: +* can set_baud +* 示例: +* MSH >can set_baud 1000000 (设置can仲裁段波特率1M) +* 3)设置数据段波特率: (仅支持CAN FD的单元) +* 格式: +* can set_baudfd +* 示例: +* MSH >can set_baudfd 2000000 (设置can数据段波特率2M) +* 4)发送消息: +* 格式: +* can send_msg +* 示例: +* MSH >can send_msg (触发can发送数据) +*/ + +#include +#include "rtdevice.h" +#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F460) + #include "drv_can.h" +#elif defined (HC32F448) + #include "drv_mcan.h" +#endif + +#include +#include + +#if defined(BSP_USING_CAN) || defined(BSP_USING_MCAN) + +#define MSH_USAGE_CAN_SET_BAUD "can set_baud - set can baud\n" +#define MSH_USAGE_CAN_SET_BAUDFD "can set_baudfd - set can baudfd\n" +#define MSH_USAGE_CAN_SET_BITTIMING "can set_bittiming - set can bit timing,\n" +#define MSH_USAGE_CAN_SEND_MSG "can send_msg \n" + +#define MSH_RESULT_STR(result) ((result == RT_EOK) ? "success" : "failure") + +static rt_device_t can_dev = RT_NULL; +static struct rt_semaphore can_rx_sem; +static rt_mutex_t can_mutex = RT_NULL; +static rt_thread_t rx_thread; +static uint32_t can_msg_tx_cnt = 0U; +static uint32_t can_msg_rx_cnt = 0U; + +#define CAN_IF_INIT() do { \ + if (can_dev == RT_NULL || can_mutex == RT_NULL) { \ + rt_kprintf("failed! please first execute can_sample cmd!\n"); \ + return; \ + } \ + } while (0) + +static rt_err_t can_rx_call(rt_device_t dev, rt_size_t size) +{ + rt_sem_release(&can_rx_sem); + return RT_EOK; +} + +static void _set_default_filter(void) +{ +#ifdef RT_CAN_USING_HDR + struct rt_can_filter_item can_items[3] = + { + RT_CAN_FILTER_ITEM_INIT(0x100, RT_CAN_STDID, RT_CAN_DTR, 1, 0x700, RT_NULL, RT_NULL), /* std,match ID:0x100~0x1ff,过滤表模式为1(0表示标识符列表模式,1表示标识符屏蔽位模式),hdr = -1(表示不指定过滤表号),设置默认过滤表,过滤表回调函数和参数均为NULL */ + RT_CAN_FILTER_ITEM_INIT(0x12345100, RT_CAN_EXTID, RT_CAN_DTR, 1, 0xFFFFFF00, RT_NULL, RT_NULL), /* ext,match ID:0x12345100~0x123451ff,hdr = -1 */ + {0x555, RT_CAN_STDID, RT_CAN_DTR, 1, 0x7ff, 7} /* std,match ID:0x555,hdr= 7,指定设置7号过滤表 */ + }; + struct rt_can_filter_config cfg = {3, 1, can_items}; /* 一共有3个过滤表,1表示初始化过滤表控制块 */ + rt_err_t res; + res = rt_device_control(can_dev, RT_CAN_CMD_SET_FILTER, &cfg); + RT_ASSERT(res == RT_EOK); +#endif +} + +static void can_rx_thread(void *parameter) +{ + struct rt_can_msg rxmsg = {0}; + rt_size_t size; + + while (1) + { + rt_memset(&rxmsg, 0, sizeof(struct rt_can_msg)); + rt_sem_take(&can_rx_sem, RT_WAITING_FOREVER); + rt_mutex_take(can_mutex, RT_WAITING_FOREVER); + /* hdr 值为 - 1,表示直接从 uselist 链表读取数据 */ + rxmsg.hdr_index = -1; + /* 从 CAN 读取一帧数据 */ + rt_device_read(can_dev, 0, &rxmsg, sizeof(rxmsg)); + /* 打印数据 ID 及内容 */ + rt_kprintf("ID:%x Data:", rxmsg.id); + for (int i = 0; i < 8; i++) + { + rt_kprintf("%2x ", rxmsg.data[i]); + } + rt_kprintf("\n"); + /* 发送接收到的消息 */ + size = rt_device_write(can_dev, 0, &rxmsg, sizeof(rxmsg)); + rt_mutex_release(can_mutex); + can_msg_rx_cnt++; + if (size == 0) + { + rt_kprintf("can dev write data failed!\n"); + } + } +} + +static void _msh_cmd_set_baud(int argc, char **argv) +{ + rt_err_t result; + + if (argc == 3) + { + uint32_t baud = atoi(argv[2]); + CAN_IF_INIT(); + rt_mutex_take(can_mutex, RT_WAITING_FOREVER); + result = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD, (void *)baud); + rt_mutex_release(can_mutex); + rt_kprintf("set %s \n", MSH_RESULT_STR(result)); + } + else + { + rt_kprintf(MSH_USAGE_CAN_SET_BAUD); + rt_kprintf(" e.g. MSH >can set_baud 500000\n"); + } +} + +#ifdef RT_CAN_USING_CANFD +void _msh_cmd_set_timing(int argc, char **argv) +{ + rt_err_t result; + + if (argc == 8 || argc == 13) + { + uint32_t count = atoi(argv[2]); + if (count > 2) + { + rt_kprintf("param error: count exceed max value 2 \n"); + return; + } + + struct rt_can_bit_timing items[2]; + struct rt_can_bit_timing_config cfg; + uint32_t pos = 3; + items[0].prescaler = atoi(argv[pos++]); + items[0].num_seg1 = atoi(argv[pos++]); + items[0].num_seg2 = atoi(argv[pos++]); + items[0].num_sjw = atoi(argv[pos++]); + items[0].num_sspoff = atoi(argv[pos++]); + if (count > 1) + { + items[1].prescaler = atoi(argv[pos++]); + items[1].num_seg1 = atoi(argv[pos++]); + items[1].num_seg2 = atoi(argv[pos++]); + items[1].num_sjw = atoi(argv[pos++]); + items[1].num_sspoff = atoi(argv[pos]); + } + cfg.count = count; + cfg.items = items; + CAN_IF_INIT(); + rt_mutex_take(can_mutex, RT_WAITING_FOREVER); + result = rt_device_control(can_dev, RT_CAN_CMD_SET_BITTIMING, &cfg); + rt_mutex_release(can_mutex); + rt_kprintf("set %s \n", MSH_RESULT_STR(result)); + } + else + { + rt_kprintf(MSH_USAGE_CAN_SET_BITTIMING); + rt_kprintf(" e.g. MSH >can set_bittiming 1 1 64 16 16 0\n"); + rt_kprintf(" e.g. MSH >can set_bittiming 2 1 64 16 16 0 1 16 4 4 16\n"); + } +} + +void _msh_cmd_set_baudfd(int argc, char **argv) +{ + rt_err_t result; + + if (argc == 3) + { + uint32_t baudfd = atoi(argv[2]); + CAN_IF_INIT(); + rt_mutex_take(can_mutex, RT_WAITING_FOREVER); + result = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD_FD, (void *)baudfd); + rt_mutex_release(can_mutex); + rt_kprintf("set %s \n", MSH_RESULT_STR(result)); + } + else + { + rt_kprintf(MSH_USAGE_CAN_SET_BAUDFD); + rt_kprintf(" e.g. MSH >can set_baudfd 4000000\n"); + } +} +#endif + +void _msh_cmd_send_msg(int argc, char **argv) +{ + rt_size_t size; + struct rt_can_msg msg = {0}; + uint8_t u8Tick; + + if (argc == 2) + { + CAN_IF_INIT(); + rt_mutex_take(can_mutex, RT_WAITING_FOREVER); +#ifdef RT_CAN_USING_CANFD + msg.id = 0x300; + msg.ide = RT_CAN_STDID; + msg.rtr = RT_CAN_DTR; +#ifdef BSP_USING_MCAN + msg.len = MCAN_DLC64; +#else + msg.len = CAN_DLC64; +#endif + msg.fd_frame = 1; + msg.brs = 1; + for (u8Tick = 0; u8Tick < 64; u8Tick++) + { + msg.data[u8Tick] = u8Tick + 1 + 0xA0; + } +#else + msg.id = 0x300; + msg.ide = RT_CAN_STDID; + msg.rtr = RT_CAN_DTR; + msg.len = CAN_DLC8; + for (u8Tick = 0; u8Tick < 8; u8Tick++) + { + msg.data[u8Tick] = u8Tick + 1 + 0xA0; + } +#endif + /* 发送一帧 CAN 数据 */ + size = rt_device_write(can_dev, 0, &msg, sizeof(msg)); + if (size == 0) + { + rt_kprintf("can dev write data failed!\n"); + } + rt_mutex_release(can_mutex); + can_msg_tx_cnt++; + rt_kprintf("send msg ok! \n"); + } + else + { + rt_kprintf(MSH_USAGE_CAN_SET_BAUD); + rt_kprintf(" e.g. MSH >can send_msg \n"); + } +} + +void _show_usage(void) +{ + rt_kprintf("Usage: \n"); + rt_kprintf(MSH_USAGE_CAN_SET_BAUD); +#ifdef RT_CAN_USING_CANFD + rt_kprintf(MSH_USAGE_CAN_SET_BAUDFD); + rt_kprintf(MSH_USAGE_CAN_SET_BITTIMING); +#endif + rt_kprintf(MSH_USAGE_CAN_SEND_MSG); +} + +int can(int argc, char **argv) +{ + if (!strcmp(argv[1], "set_baud")) + { + _msh_cmd_set_baud(argc, argv); + } +#ifdef RT_CAN_USING_CANFD + else if (!strcmp(argv[1], "set_baudfd")) + { + _msh_cmd_set_baudfd(argc, argv); + } + else if (!strcmp(argv[1], "set_bittiming")) + { + _msh_cmd_set_timing(argc, argv); + } +#endif + else if (!strcmp(argv[1], "send_msg")) + { + _msh_cmd_send_msg(argc, argv); + } + else + { + _show_usage(); + } + + return 0; +} +MSH_CMD_EXPORT(can, can function configuration); + +int can_sample(int argc, char **argv) +{ + char can_name[RT_NAME_MAX] = "can1"; + char sem_name[RT_NAME_MAX] = "can_sem"; + char mutex_name[RT_NAME_MAX] = "can_mtx"; + rt_err_t res; + + /* 参数无输入或者输入错误按照默认值处理 */ + if (argc == 2) + { + if (0 == rt_strcmp(argv[1], "can1")) + { + rt_strcpy(can_name, "can1"); + } +#if defined (HC32F4A0) || defined (HC32F448) || defined (HC32F472) + else if (0 == rt_strcmp(argv[1], "can2")) + { + rt_strcpy(can_name, "can2"); + } +#endif +#if defined (HC32F472) + else if (0 == rt_strcmp(argv[1], "can3")) + { + rt_strcpy(can_name, "can3"); + } +#endif + else + { + rt_kprintf("The chip hasn't the can unit!\r\n"); + return -RT_ERROR; + } + } + else + { + rt_kprintf("Default used %s to test!\r\n", can_name); + } + + /* 设备已经打开则关闭 */ + if (can_dev != RT_NULL) + { + rt_device_close(can_dev); + } + /* 查找设备 */ + can_dev = rt_device_find(can_name); + if (!can_dev) + { + rt_kprintf("find %s failed!\n", can_name); + return -RT_ERROR; + } + + rt_kprintf("found %s\n", can_name); + + if (can_mutex == RT_NULL) + { + rt_sem_init(&can_rx_sem, sem_name, 0, RT_IPC_FLAG_FIFO); + can_mutex = rt_mutex_create(mutex_name, RT_IPC_FLAG_FIFO); + } + + res = rt_device_open(can_dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX); + RT_ASSERT(res == RT_EOK); + res = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD, (void *)CAN500kBaud); + RT_ASSERT(res == RT_EOK); + res = rt_device_control(can_dev, RT_CAN_CMD_SET_MODE, (void *)RT_CAN_MODE_NORMAL); + RT_ASSERT(res == RT_EOK); +#ifdef RT_CAN_USING_CANFD +#if defined (HC32F4A0) + if (can_name == "can2") +#endif + { +#ifdef BSP_USING_MCAN + res = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD_FD, (void *)MCANFD_DATA_BAUD_4M); +#else + res = rt_device_control(can_dev, RT_CAN_CMD_SET_BAUD_FD, (void *)CANFD_DATA_BAUD_4M); +#endif + RT_ASSERT(res == RT_EOK); + } +#endif + rt_device_set_rx_indicate(can_dev, can_rx_call); + + _set_default_filter(); + + if (rx_thread == RT_NULL) + { + rx_thread = rt_thread_create("can_rx", can_rx_thread, RT_NULL, 2048, 15, 10); + if (rx_thread != RT_NULL) + { + rt_thread_startup(rx_thread); + } + else + { + rt_kprintf("create can_rx rx_thread failed!\n"); + } + } + + return RT_EOK; +} + +MSH_CMD_EXPORT(can_sample, can sample: select < can1 | can2 | can3 >); + +#endif diff --git a/bsp/hc32/tests/test_crypto.c b/bsp/hc32/tests/test_crypto.c new file mode 100644 index 00000000000..79744f441a6 --- /dev/null +++ b/bsp/hc32/tests/test_crypto.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +#include +#include +#include + +#if defined(BSP_USING_HWCRYPTO) + +#define ARR_SIZE(arr) (sizeof(arr)/sizeof(*arr)) +#define PRINT_DIGIT_ARR(arr) do { \ + rt_kprintf("%s: ", #arr); \ + for(int i = 0; i < ARR_SIZE(arr); i++) \ + rt_kprintf("%d ", arr[i]); \ + rt_kprintf("\n"); \ + } while(0) + +#define WDT_DEVICE_NAME "crypto" + +static void _crypto_cmd_print_usage(void) +{ +#if defined(BSP_USING_RNG) + rt_kprintf("crypto_sample [option] \n"); + rt_kprintf(" rang: get random number from rang module. \n"); + rt_kprintf(" e.g. msh >crypto_sample rang get \n"); +#endif + +#if defined(BSP_USING_CRC) + rt_kprintf("crypto_sample [option] \n"); + rt_kprintf(" crc: test crc module. \n"); + rt_kprintf(" e.g. msh >crypto_sample crc 16/32 \n"); +#endif + +#if defined(BSP_USING_AES) + rt_kprintf("crypto_sample [option] \n"); + rt_kprintf(" aes: test aes module. \n"); +#if defined(HC32F460) + rt_kprintf(" e.g. msh >crypto_sample aes 128 \n"); +#elif defined (HC32F4A0) || defined (HC32F448) || defined (HC32F472) + rt_kprintf(" e.g. msh >crypto_sample aes 128/192/256 \n"); +#endif +#endif + +#if defined(BSP_USING_HASH) + rt_kprintf("crypto_sample [option] \n"); + rt_kprintf(" hash: test hash module. \n"); + rt_kprintf(" e.g. msh >crypto_sample hash test \n"); +#endif +} + +#if defined(BSP_USING_CRC) +#define CRC16_WIDTH 16U +#define CRC32_WIDTH 32U +static void crc_test(rt_uint32_t width) +{ + rt_uint8_t temp_in[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + struct rt_hwcrypto_ctx *ctx; + rt_uint32_t result = 0; + /* CRC16_X25 */ + struct hwcrypto_crc_cfg cfg = + { + .last_val = 0xFFFFU, + .poly = 0x1021U, + .width = CRC16_WIDTH, + .xorout = 0xFFFFU, + .flags = CRC_FLAG_REFIN | CRC_FLAG_REFOUT, + }; + /* CRC32 */ + if (width == CRC32_WIDTH) + { + cfg.last_val = 0xFFFFFFFFUL; + cfg.poly = 0x04C11DB7UL; + cfg.width = CRC32_WIDTH; + cfg.xorout = 0xFFFFFFFFUL; + cfg.flags = CRC_FLAG_REFIN | CRC_FLAG_REFOUT; + ctx = rt_hwcrypto_crc_create(rt_hwcrypto_dev_default(), HWCRYPTO_CRC_CRC32); + } + else if (width == CRC16_WIDTH) + { + ctx = rt_hwcrypto_crc_create(rt_hwcrypto_dev_default(), HWCRYPTO_CRC_CRC16); + } + else + { + rt_kprintf("crc%d not support! \n", width); + return; + } + + rt_hwcrypto_crc_cfg(ctx, &cfg); + + rt_kprintf("temp_in: "); + for (int i = 0; i < sizeof(temp_in) / 2U; i++) + { + rt_kprintf("%d ", temp_in[i]); + } + rt_kprintf("\n"); + result = rt_hwcrypto_crc_update(ctx, temp_in, sizeof(temp_in) / 2U); + rt_kprintf("crc%d result: 0x%x \n", width, result); + + /* Accumulate test */ + PRINT_DIGIT_ARR(temp_in); + result = rt_hwcrypto_crc_update(ctx, &temp_in[sizeof(temp_in) / 2U], sizeof(temp_in) / 2U); + rt_kprintf("crc%d result: 0x%x \n", width, result); + + rt_hwcrypto_crc_destroy(ctx); +} +#endif + +#if defined(BSP_USING_AES) +#define AES_DATA_LEN 32U /* data of length must be a multiple of 16(128 Bit) */ +static void aes_test(rt_uint16_t key_bitlen) +{ + rt_uint32_t result = RT_EOK; + struct rt_hwcrypto_ctx *ctx; + rt_uint8_t enc_out[AES_DATA_LEN]; + rt_uint8_t dec_out[AES_DATA_LEN]; + const char *enc_in = "abcdefghijksdwpa123456789asdfghj"; + const char *key128 = "1234567890abcdef"; + const char *key192 = "1234567890abcdefghijklmn"; + const char *key256 = "1234567890abcdefghijklmnopqrstuv"; + const char *key; + + ctx = rt_hwcrypto_symmetric_create(rt_hwcrypto_dev_default(), HWCRYPTO_TYPE_AES_ECB); + if (ctx == RT_NULL) + { + rt_kprintf("create AES-CBC context err!"); + return; + } + switch (key_bitlen) + { + case 128: + key = key128; + break; + case 192: + key = key192; + break; + case 256: + key = key256; + break; + default: + key = key128; + break; + } + result = rt_hwcrypto_symmetric_setkey(ctx, (rt_uint8_t *)key, key_bitlen); + if (result == RT_EOK) + { + result = rt_hwcrypto_symmetric_crypt(ctx, HWCRYPTO_MODE_ENCRYPT, AES_DATA_LEN, (rt_uint8_t *)enc_in, enc_out); + if (result != RT_EOK) + { + goto _exit; + } + + rt_kprintf("aes src data:"); + for (int i = 0; i < AES_DATA_LEN; i++) + { + rt_kprintf("%c", enc_in[i]); + } + rt_kprintf("\n"); + + rt_kprintf("aes enc data:"); + for (int i = 0; i < AES_DATA_LEN; i++) + { + rt_kprintf("%x ", enc_out[i]); + } + rt_kprintf("\n"); + + result = rt_hwcrypto_symmetric_crypt(ctx, HWCRYPTO_MODE_DECRYPT, AES_DATA_LEN, (rt_uint8_t *)enc_out, dec_out); + if (result != RT_EOK) + { + goto _exit; + } + rt_kprintf("aes dec data:"); + for (int i = 0; i < AES_DATA_LEN; i++) + { + rt_kprintf("%c", dec_out[i]); + } + rt_kprintf("\n"); + +_exit: + rt_hwcrypto_symmetric_destroy(ctx); + } +} +#endif + +#if defined(BSP_USING_HASH) +#define HASH_SHA256_MSG_DIGEST_SIZE (32U) +static void hash_sha256_test(void) +{ + const char *in = "0123456789abcdefghijklmnopqrstuvwxyz"; + uint8_t out[HASH_SHA256_MSG_DIGEST_SIZE]; + struct rt_hwcrypto_ctx *ctx; + + ctx = rt_hwcrypto_hash_create(rt_hwcrypto_dev_default(), HWCRYPTO_TYPE_SHA256); + if (ctx != RT_NULL) + { + rt_hwcrypto_hash_update(ctx, (rt_uint8_t *)in, rt_strlen(in)); + rt_kprintf("hash in data:"); + for (int i = 0; i < rt_strlen(in); i++) + { + rt_kprintf("%c", in[i]); + } + rt_kprintf("\n"); + + rt_hwcrypto_hash_finish(ctx, out, HASH_SHA256_MSG_DIGEST_SIZE); + rt_kprintf("hash out data:"); + for (int i = 0; i < HASH_SHA256_MSG_DIGEST_SIZE; i++) + { + rt_kprintf("%x ", out[i]); + } + rt_kprintf("\n"); + rt_hwcrypto_hash_destroy(ctx); + } +} +#endif + +static int crypto_sample(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + + if (argc != 3) + { + goto _exit; + } + +#if defined(BSP_USING_RNG) + if (!rt_strcmp("rang", argv[1])) + { + if (!rt_strcmp("get", argv[2])) + { + rt_uint32_t result = rt_hwcrypto_rng_update(); + rt_kprintf("random number = %x \n", result); + } + else + { + goto _exit; + } + } +#endif +#if defined(BSP_USING_CRC) + else if (!rt_strcmp("crc", argv[1])) + { + rt_uint32_t width = atoi(argv[2]); + if (width == CRC16_WIDTH || width == CRC32_WIDTH) + { + crc_test(width); + } + else + { + goto _exit; + } + } +#endif +#if defined(BSP_USING_AES) + else if (!rt_strcmp("aes", argv[1])) + { + rt_uint32_t key_bitlen = atoi(argv[2]); + if (key_bitlen == 128 || key_bitlen == 192 || key_bitlen == 256) + { + aes_test(key_bitlen); + } + else + { + goto _exit; + } + } +#endif +#if defined(BSP_USING_HASH) + else if (!rt_strcmp("hash", argv[1])) + { + if (!rt_strcmp("test", argv[2])) + { + hash_sha256_test(); + } + else + { + goto _exit; + } + } +#endif + else + { + goto _exit; + } + + return ret; + +_exit: + _crypto_cmd_print_usage(); + return -RT_ERROR; +} + +MSH_CMD_EXPORT(crypto_sample, crypto [option]); + +#endif diff --git a/bsp/hc32/tests/test_dac.c b/bsp/hc32/tests/test_dac.c new file mode 100644 index 00000000000..a80db59fe0d --- /dev/null +++ b/bsp/hc32/tests/test_dac.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单: DAC 设备使用例程 + * 例程导出了 dac_vol_sample 命令到控制终端 + * 命令调用格式:dac_vol_sample 参数1:dac1 | dac2 参数2:DAC配置值 (可选,范围0-4095),默认1365≈1.1V + * 程序功能:通过 DAC 设备将数字值转换为模拟量,并输出电压值。将示波器通道连接到输出引脚,观察输出电压值 + * 示例代码参考电压为3.3V,转换位数为12位。 + */ +#include +#include +#include + +#ifdef BSP_USING_DAC + +#define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/ +#define DAC_MAX_OUTPUT_VALUE 4095 + +static int dac_vol_sample(int argc, char *argv[]) +{ + char dac_device_name[] = "dac1"; + rt_uint8_t channel = 1; + rt_dac_device_t dac_dev; + rt_uint32_t value = 1365; /* 默认1.1V */ + rt_uint32_t convertBits; + rt_uint32_t vol; + rt_err_t ret = RT_EOK; + + /* 参数无输入或者输入错误按照默认值处理 */ + if (argc >= 2) + { + if (0 == rt_strcmp(argv[1], "dac1")) + { + rt_strcpy(dac_device_name, "dac1"); + } +#if defined (HC32F4A0) || defined (HC32F472) + else if (0 == rt_strcmp(argv[1], "dac2")) + { + rt_strcpy(dac_device_name, "dac2"); + } +#endif +#if defined (HC32F472) + else if (0 == rt_strcmp(argv[1], "dac3")) + { + rt_strcpy(dac_device_name, "dac3"); + } + else if (0 == rt_strcmp(argv[1], "dac4")) + { + rt_strcpy(dac_device_name, "dac4"); + } +#endif + else + { + rt_kprintf("The chip hasn't the dac unit!\r\n"); + return -RT_ERROR; + } + } + + /* 查找设备 */ + dac_dev = (rt_dac_device_t)rt_device_find(dac_device_name); + if (dac_dev == RT_NULL) + { + rt_kprintf("dac sample run failed! can't find %s device!\n", dac_device_name); + return -RT_ERROR; + } + + if (RT_EOK != rt_device_control(&dac_dev->parent, RT_DAC_CMD_GET_RESOLUTION, &convertBits)) + { + rt_kprintf("dac sample can't read resolution!\n"); + return -RT_ERROR; + } + convertBits = (1 << (rt_uint8_t)convertBits); + for (channel = 1; channel < 3; channel++) + { + /* 打开通道 */ + ret = rt_dac_enable(dac_dev, channel); + /* 设置输出值 */ + if (argc >= 3) + { + value = atoi(argv[2]); + if (value > DAC_MAX_OUTPUT_VALUE) + { + rt_kprintf("invalid dac value!!! \n"); + return -RT_ERROR; + } + } + rt_dac_write(dac_dev, channel, value); + rt_kprintf("%s CH%d Value is :%d \n", dac_device_name, channel, value); + /* 转换为对应电压值 */ + vol = value * REFER_VOLTAGE / convertBits; + rt_kprintf("%s CH%d Voltage is :%d.%02dV \n", dac_device_name, channel, vol / 100, vol % 100); + } + + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(dac_vol_sample, dac voltage convert sample < dac1 | dac2 value >); +#endif diff --git a/bsp/hc32/tests/test_eth.c b/bsp/hc32/tests/test_eth.c new file mode 100644 index 00000000000..ac726651928 --- /dev/null +++ b/bsp/hc32/tests/test_eth.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:ETH设备使用例程,例程导出了eth_webserver命令到控制终端 + * 命令调用格式:eth_webserver + * + * ************************** 测试case 1 ************************** + * 1)网线连接目标板和PC的网络端口,设置PC的对应网卡的IP地址,如下: + * IPv4地址:192.168.1.10 + * 子网掩码: 255.255.255.0 + * 默认网关: 192.168.1.1 + * 2)配置RTT工程 + * menuconfig: + * RT-Thread Componets ---> Network ----> LwIP ----> lwIP version(lwIP v2.1.2) + * Static IPv4 Address,按照如下配置IP: + * IP address : 192.168.1.30 + * Gateway address : 192.168.1.1 + * Mask address : 255.255.255.0 + * Enable alloc ip address through DHCP,取消该选项 + * Hardware Drivers Config ---> Onboard Peripheral Drivers ----> Enable Ethernet: ETH PHY USING RTL8201F + * ETH Communication USING MII + * 3)拨码开关J33拨到MII端,编译下载、运行代码 + * 4)等待msh> + * 5)msh>窗口输入命令:ping 192.168.1.10,显示连接正常(60 bytes from 192.168.1.120 icmp_seq=0 ttl=128 time=1 ms) + * 6)msh>窗口输入命令:eth_webserver + * 7)PC打开浏览器,输入IP地址:192.168.1.30再按回车键,显示lwip的简介网页(lwIP - A Lightweight TCP/IP Stack), + * 表示成功访问目标板的HTTP服务器。 + * + * ************************** 测试case 2 ************************** + * 1)网线连接目标板和PC的网络端口,维持测试case 2配置 + * 2)配置RTT工程,在测试case 1的基础上,使能Enable ETH PHY interrupt mode + * menuconfig: + * Hardware Drivers Config ---> Onboard Peripheral Drivers ----> Enable ETH PHY interrupt mode: (16) ETH PHY Interrupt pin number + * 3)拨码开关J33拨到MII端,编译下载、运行代码 + * 4)等待msh> + * 5)msh>窗口输入命令:ping 192.168.1.10,显示连接正常(60 bytes from 192.168.1.120 icmp_seq=0 ttl=128 time=1 ms) + * 6)msh>窗口输入命令:eth_webserver + * 7)PC打开浏览器,输入IP地址:192.168.1.30再按回车键,显示lwip的简介网页(lwIP - A Lightweight TCP/IP Stack), + * 表示成功访问目标板的HTTP服务器。 + * + * ************************** 测试case 3 ************************** + * 1)网线连接目标板和PC的网络端口,维持测试case 2配置 + * 2)配置RTT工程,在测试case 2的基础上,ETH Communication USING MII改为ETH Communication USING RMII + * Hardware Drivers Config ---> Onboard Peripheral Drivers ----> Enable Ethernet: ETH Communication USING RMII + * 3)拨码开关J33拨到RMII端,编译下载、运行代码 + * 4)等待msh> + * 5)msh>窗口输入命令:ping 192.168.1.10,显示连接正常(60 bytes from 192.168.1.120 icmp_seq=0 ttl=128 time=1 ms) + * 6)msh>窗口输入命令:eth_webserver + * 7)PC打开浏览器,输入IP地址:192.168.1.30再按回车键,显示lwip的简介网页(lwIP - A Lightweight TCP/IP Stack), + * 表示成功访问目标板的HTTP服务器。 + */ + +#include + +#if defined(BSP_USING_ETH) && defined(RT_USING_LWIP) + +extern void httpd_init(void); + +void eth_webserver(void) +{ + rt_kprintf("Initialize the httpd...... \r\n"); + httpd_init(); +} +MSH_CMD_EXPORT(eth_webserver, eth: start web server); + +#endif diff --git a/bsp/hc32/tests/test_fal.c b/bsp/hc32/tests/test_fal.c new file mode 100644 index 00000000000..dce299a5230 --- /dev/null +++ b/bsp/hc32/tests/test_fal.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单: FAL使用例程 + * 例程导出了 fal_sample 命令到控制终端 + * 命令调用格式:fal_sample + * 1)配置RTT工程 + * menuconfig: + * RT-Thread Components ---> FAL: flash abstraction layer + * ---> Device Drivers ---> Using SPI Bus/Device device drivers ---> Using Serial Flash Universal Driver + * Hardware Drivers Config ---> Onboard Peripheral Drivers ----> Enable on-chip FLASH +*/ +#include +#include + +#if defined(RT_USING_FAL) && defined(BSP_USING_ON_CHIP_FLASH) + +#include "board.h" +#include + +#define FAL_PART_NAME "app" +#define TEST_BUF_SIZE 1024UL +#define TEST_RW_CNT 32UL +#define TEST_RW_START_ADDR HC32_FLASH_END_ADDRESS - (TEST_BUF_SIZE * TEST_RW_CNT) + + +static uint8_t write_buffer[TEST_BUF_SIZE] = {0}; +static uint8_t read_buffer[TEST_BUF_SIZE] = {0}; + + +static int fal_sample(int argc, char **argv) +{ + const struct fal_partition *param; + int ret; + uint32_t Address; + uint8_t errFlag = 0; + + fal_init(); //抽象层初始化 + /* Set write buffer, clear read buffer */ + for (uint32_t index = 0; index < TEST_BUF_SIZE; index++) + { + write_buffer[index] = index; + } + param = fal_partition_find(FAL_PART_NAME); + if (param == RT_NULL) + { + rt_kprintf("not find partition app!\r\n"); + return -1; + } + for (int j = 0; j < TEST_RW_CNT; j++) + { + errFlag = 0; + Address = TEST_RW_START_ADDR + j * TEST_BUF_SIZE; + rt_kprintf("........test %d address 0x%08x........\r\n", j + 1, Address); + /* erase process */ + + if (j == 31) + { + rt_kprintf("......."); + } + + ret = fal_partition_erase(param, Address, TEST_BUF_SIZE); + if (ret >= 0) + { + rt_kprintf("Erase succeeded!\r\n"); + } + else + { + rt_kprintf("Erase failed!\r\n"); + return ret; + } + /* write process */ + ret = fal_partition_write(param, Address, write_buffer, TEST_BUF_SIZE); + if (ret >= 0) + { + rt_kprintf("Write succeeded!\r\n"); + } + else + { + rt_kprintf("Write failed!\r\n"); + return ret; + } + /* read process */ + for (uint32_t index = 0; index < TEST_BUF_SIZE; index++) + { + read_buffer[index] = 0; + } + ret = fal_partition_read(param, Address, read_buffer, TEST_BUF_SIZE); + if (ret >= 0) + { + rt_kprintf("Read succeeded!\r\n"); + } + else + { + rt_kprintf("Read failed!\r\n"); + return ret; + } + /* compare process */ + for (int i = 0; i < TEST_BUF_SIZE; i++) + { +#if defined(HC32F460) + if ((j == (TEST_RW_CNT - 1)) && (i >= (TEST_BUF_SIZE - 32)) ? + (read_buffer[i] != 0xFF) : (read_buffer[i] != write_buffer[i])) +#else + if (read_buffer[i] != write_buffer[i]) +#endif + { + rt_kprintf("Data verification failed:\r\n"); + rt_kprintf("NUM: %d Write: %x Read: %x \r\n", i, write_buffer[i], read_buffer[i]); + errFlag = 1; + ret = -1; + } + } + if (0 == errFlag) + { + rt_kprintf("Data verification OK!\r\n"); + } + } + + return ret; +} + +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(fal_sample, fal sample); + +#endif diff --git a/bsp/hc32/tests/test_gpio.c b/bsp/hc32/tests/test_gpio.c new file mode 100644 index 00000000000..18390384bac --- /dev/null +++ b/bsp/hc32/tests/test_gpio.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是一个 PIN 设备使用例程 + * 例程导出了 pin_sample 命令到控制终端 + * 命令调用格式:pin_sample + * 程序功能:通过按键控制LED引脚的电平状态 +*/ + +#include +#include +#include "board_config.h" + +#if defined(BSP_USING_GPIO) +#include "drv_gpio.h" + +/* 1)配置RTT工程 +* menuconfig: +* Hardware Drivers Config ---> Onboard Peripheral Drivers ----> Enable TCA9539 +*/ +#if defined(HC32F460) + #define LED1_PIN_NUM GET_PIN(D, 3) /* LED0 */ + #define KEY1_PIN_NUM GET_PIN(B, 1) /* K10 */ +#elif defined(HC32F4A0) + #define LED1_PIN_NUM GET_PIN(B, 11) /* LED10 */ + #define KEY1_PIN_NUM GET_PIN(A, 0) /* K10 */ +#elif defined(HC32F448) + #define LED1_PIN_NUM GET_PIN(A, 2) /* LED3 */ + #define KEY1_PIN_NUM GET_PIN(B, 6) /* K5 */ +#elif defined(HC32F472) + #define LED1_PIN_NUM GET_PIN(C, 9) /* LED5 */ + #define KEY1_PIN_NUM GET_PIN(B, 5) /* K10 */ +#endif + +static uint8_t u8LedState = 1; + +void led_control(void *args) +{ + u8LedState = !u8LedState; + if (0 == u8LedState) + { + rt_pin_write(LED1_PIN_NUM, PIN_LOW); + } + else + { + rt_pin_write(LED1_PIN_NUM, PIN_HIGH); + } +} + +static void pin_sample(void) +{ + /* LED引脚为输出模式 */ + rt_pin_mode(LED1_PIN_NUM, PIN_MODE_OUTPUT); + /* 默认高电平 */ + rt_pin_write(LED1_PIN_NUM, PIN_HIGH); + + /* 按键1引脚为输入模式 */ + rt_pin_mode(KEY1_PIN_NUM, PIN_MODE_INPUT_PULLUP); + /* 绑定中断,下降沿模式,回调函数名为led_control */ + // rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_RISING, led_control, RT_NULL); + // rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_FALLING, led_control, RT_NULL); + rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_RISING_FALLING, led_control, RT_NULL); + /* 使能中断 */ + rt_pin_irq_enable(KEY1_PIN_NUM, PIN_IRQ_ENABLE); +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(pin_sample, pin sample); + +#endif diff --git a/bsp/hc32/tests/test_hwtimer.c b/bsp/hc32/tests/test_hwtimer.c new file mode 100644 index 00000000000..3bb8d7738c7 --- /dev/null +++ b/bsp/hc32/tests/test_hwtimer.c @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是一个 hwtimer 设备使用例程 + * 例程导出了 hwtimer_sample 命令到控制终端 + * 命令调用格式:hwtimer_sample hwtimer_sample [option1] [option2] [option3] + * option1: [tmra_1/2/3..] 定时器单元 + * option2: [oneshot/period] 定时模式 + * option3: 超时时间,单位毫秒 + * eg:hwtimer_sample tmra_1 period 1000 + * 程序功能:每隔一秒打印一次定时器运行时间值,在定时器超时回调函数中打印总tick值 + * 可以使用逻辑分析进一步查看测试管脚PA0定时时间是否准确 + */ + +#include +#include +#include +#include + +#ifdef BSP_USING_HWTIMER + +/* IO用于定时时间测试 */ +#define TIMEOUT_TEST_PIN GET_PIN(A, 0) + +static rt_uint32_t tick; +static rt_bool_t cb_run = RT_FALSE; + +static void _hwtimer_cmd_print_usage(void) +{ + rt_kprintf("hwtimer_sample [option1] [option2] [option3]\n"); + rt_kprintf(" option1: [tmra_1/2/3..] tmra uint\n"); + rt_kprintf(" option2: [oneshot/period] timing mode set\n"); + rt_kprintf(" option3: timeout unit:ms\n"); + rt_kprintf(" e.g. MSH >hwtimer_sample tmra_1 period 1000\n"); +} + +/* 定时器超时回调函数 */ +static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) +{ + static rt_uint8_t pin_cnt = 0; + rt_pin_write(TIMEOUT_TEST_PIN, ++pin_cnt % 2); /* 电平取反 */ + /* 打印出的tick值由于printf原因可能有误差,可以查看测试IO来精确确认时间 */ + rt_kprintf("callback successful! ticks = %d \n", rt_tick_get() - tick); + tick = rt_tick_get(); + cb_run = RT_TRUE; + + return 0; +} + +static int hwtimer_sample(int argc, char *argv[]) +{ + rt_uint8_t i; + rt_err_t ret = RT_EOK; + rt_hwtimerval_t timeout_s; /* 定时器超时值 */ + rt_hwtimer_mode_t mode = HWTIMER_MODE_ONESHOT; /* 定时器模式 */ + rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */ + rt_hwtimer_t *hwtimer; + float t; + rt_uint8_t loop_cnt; /* 循环打印次数 */ + rt_hwtimerval_t overflow_tv; /* 定时器超时值 */ + rt_uint32_t timer_out_s; + + if ((argc != 4) || (rt_strcmp("oneshot", argv[2]) && rt_strcmp("period", argv[2]))) + { + _hwtimer_cmd_print_usage(); + return -RT_ERROR; + } + + /* 查找定时器设备 */ + hw_dev = rt_device_find(argv[1]); + if (hw_dev == RT_NULL) + { + rt_kprintf("hwtimer sample run failed! can't find %s device!\n", argv[1]); + return -RT_ERROR; + } + else + { + hwtimer = (rt_hwtimer_t *)hw_dev; + } + + /* 以读写方式打开设备 */ + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", argv[1]); + return ret; + } + + /* 设置模式 */ + if (0 == rt_strcmp(argv[2], "oneshot")) + { + mode = HWTIMER_MODE_ONESHOT; + loop_cnt = 1; + } + else if (0 == rt_strcmp(argv[2], "period")) + { + mode = HWTIMER_MODE_PERIOD; + loop_cnt = 5; + } + rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + + /* 设置超时回调函数 */ + rt_device_set_rx_indicate(hw_dev, timeout_cb); + + /* 设置定时器超时并启动定时器 */ + timeout_s.sec = atoi(argv[3]) / 1000U; /* 秒 */ + timeout_s.usec = (atoi(argv[3]) % 1000U) * 1000U; /* 微秒 */ + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return -RT_ERROR; + } + tick = rt_tick_get(); + rt_kprintf("set timeout (%d) ms successful\n", atoi(argv[3])); + + /* 设置测试管脚为输出模式 */ + rt_pin_mode(TIMEOUT_TEST_PIN, PIN_MODE_OUTPUT); + + /* oneshot模式cb函数执行一次,period模式cb函数执行5次,且每秒打印一次运行时间 */ + timer_out_s = (atoi(argv[3]) / 1000U) > 1 ? (atoi(argv[3]) / 1000U) : 1; + for (i = 0; i < (timer_out_s * loop_cnt); i++) + { + /* 延时1000ms */ + rt_thread_mdelay(1000); + + /* 读取定时器当前值 */ + if (mode == HWTIMER_MODE_PERIOD) + { + rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); + } + else if (mode == HWTIMER_MODE_ONESHOT) + { + rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); + + t = hwtimer->overflow * hwtimer->period_sec; + overflow_tv.sec = (rt_int32_t)t; + overflow_tv.usec = (rt_int32_t)((t - overflow_tv.sec) * 1000000); + + timeout_s.sec = overflow_tv.sec + (timeout_s.usec + overflow_tv.usec) / 1000000; + timeout_s.usec = (timeout_s.usec + overflow_tv.usec) % 1000000; + } + rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec); + } + + /* 确保oneshot模式cb函数执行一次后才关闭定时器 */ + while (cb_run == RT_FALSE); + cb_run = RT_FALSE; + + /* close */ + rt_device_close(hw_dev); + + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample: devname [oneshot | period] timeout); +#endif diff --git a/bsp/hc32/tests/test_i2c.c b/bsp/hc32/tests/test_i2c.c new file mode 100644 index 00000000000..c5b163f8e06 --- /dev/null +++ b/bsp/hc32/tests/test_i2c.c @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是 I2C 设备使用例程。 + * 例程导出了 i2c_sample 到控制终端。 + * 命令调用格式:i2c_sample + * 命令解释: + * 程序功能:查找I2C模块,读写I2C设备。 + * 注意:测试要用逻辑分析仪或示波器抓取信号 +*/ + +#include +#include +#include + +/* + * to readout/write from/into i2c device, user could use this macro to choice + * either rt_i2c_master_send & rt_i2c_master_recv or rt_i2c_transfer +*/ +#if defined(RT_USING_I2C) + +#define USING_RT_I2C_TRANSFER + +/* defined EEPROM */ +#if defined(HC32F472) || defined(HC32F460) || defined(HC32F4A0) || defined(HC32F448) + #define EE_DEV_ADDR 0x50 + #define EE_TEST_PAGE_CNT 8 // Test 8 pages +#endif + +/* define EEPROM hardware */ +#if defined(HC32F472) || defined(HC32F460) || defined(HC32F448) + #define EE24C256 +#elif defined(HC32F4A0) + #define EE24C02 +#endif + +#if defined (EE24C1024) + #define EE_PAGE_SIZE 256 // 24C1024 + #define EE_WORD_ADR_SIZE 2 // 2 word addr +#elif defined (EE24C256) + #define EE_PAGE_SIZE 64 // 24C256 + #define EE_WORD_ADR_SIZE 2 // 2 word addr +#elif defined (EE24C02) + #define EE_PAGE_SIZE 8 // 24C02 + #define EE_WORD_ADR_SIZE 1 // 1 word addr +#endif + +/* device information */ +#if defined(HC32F472) || defined(HC32F4A0) || defined(HC32F448) + #define HW_I2C_DEV "i2c1" + #define SW_I2C_DEV "i2c1_sw" +#elif defined(HC32F460) + #define HW_I2C_DEV "i2c3" + #define SW_I2C_DEV "i2c1_sw" +#endif + +/* this API is for eeprom size is smaller than 256Bytes */ +static void eeprom_page_write(uint32_t page, uint8_t *pBuf) +{ + struct rt_i2c_bus_device *hc32_i2c = RT_NULL; + uint8_t TxBuf[EE_PAGE_SIZE + EE_WORD_ADR_SIZE] = {0}; + struct rt_i2c_msg msg[1]; + +#if defined (BSP_USING_I2C_HW) + hc32_i2c = rt_i2c_bus_device_find(HW_I2C_DEV); //hw i2c +#else + hc32_i2c = rt_i2c_bus_device_find(SW_I2C_DEV); //sw i2c +#endif + + /* START --- ADR_W --- WORD_ADR(1 byte) --- DATAn --- STOP */ + if (EE_WORD_ADR_SIZE == 2) + { + TxBuf[0] = (page * EE_PAGE_SIZE) / 256; // addrH + TxBuf[1] = page * EE_PAGE_SIZE; // addrL + } + else + { + TxBuf[0] = page * EE_PAGE_SIZE; + } + for (int i = 0; i < EE_PAGE_SIZE; i++) // data fill + { + TxBuf[i + EE_WORD_ADR_SIZE] = *pBuf++; + } + msg[0].addr = EE_DEV_ADDR; + msg[0].flags = RT_I2C_WR; + msg[0].len = EE_PAGE_SIZE + EE_WORD_ADR_SIZE; + msg[0].buf = TxBuf; + +#if defined(USING_RT_I2C_TRANSFER) + rt_i2c_transfer(hc32_i2c, &msg[0], 1); +#else + rt_i2c_master_send(hc32_i2c, EE_DEV_ADDR, RT_I2C_NO_STOP, TxBuf, msg[0].len / 2); + rt_i2c_master_send(hc32_i2c, EE_DEV_ADDR, RT_I2C_NO_START, TxBuf + msg[0].len / 2, msg[0].len - msg[0].len / 2); +#endif + /* write cycle 5ms */ + rt_thread_mdelay(5); +} + +static void eeprom_page_read(uint32_t page, uint8_t *pBuf) +{ + struct rt_i2c_bus_device *hc32_i2c = RT_NULL; + uint8_t readAddr[EE_WORD_ADR_SIZE]; +#if defined(USING_RT_I2C_TRANSFER) + struct rt_i2c_msg msg[2]; +#endif + +#if defined (BSP_USING_I2C_HW) + hc32_i2c = rt_i2c_bus_device_find(HW_I2C_DEV); //hw i2c +#else + hc32_i2c = rt_i2c_bus_device_find(SW_I2C_DEV); //sw i2c +#endif + + if (EE_WORD_ADR_SIZE == 2) + { + readAddr[0] = (page * EE_PAGE_SIZE) / 256; // addrH + readAddr[1] = page * EE_PAGE_SIZE; // addrL + } + else + { + readAddr[0] = page * EE_PAGE_SIZE; + } + +#if defined(USING_RT_I2C_TRANSFER) + msg[0].addr = EE_DEV_ADDR; + msg[0].flags = RT_I2C_WR; + msg[0].len = EE_WORD_ADR_SIZE; + msg[0].buf = readAddr; + + msg[1].addr = EE_DEV_ADDR; + msg[1].flags = RT_I2C_RD; + msg[1].len = EE_PAGE_SIZE; + msg[1].buf = pBuf; + rt_i2c_transfer(hc32_i2c, &msg[0], 2); +#else + rt_i2c_master_send(hc32_i2c, EE_DEV_ADDR, RT_I2C_NO_STOP, readAddr, EE_WORD_ADR_SIZE); + rt_i2c_master_recv(hc32_i2c, EE_DEV_ADDR, 0, pBuf, EE_PAGE_SIZE); +#endif +} + +void eeprom_test(void) +{ + uint32_t page, i; + uint32_t compareValueDiff = 0; + static rt_uint8_t trans_buf[EE_PAGE_SIZE * EE_TEST_PAGE_CNT]; + static rt_uint8_t recv_buf[EE_PAGE_SIZE * EE_TEST_PAGE_CNT]; + + /* write e2 */ + for (i = 0; i < sizeof(trans_buf); i++) + { + trans_buf[i] = i; + } + for (page = 0; page < EE_TEST_PAGE_CNT; page++) + { + eeprom_page_write(page, trans_buf + EE_PAGE_SIZE * page); + } + /* read e2 */ + for (i = 0; i < sizeof(trans_buf); i++) + { + recv_buf[i] = 0; + } + for (page = 0; page < EE_TEST_PAGE_CNT; page++) + { + eeprom_page_read(page, recv_buf + EE_PAGE_SIZE * page); + } + /* compare e2 */ + for (i = 0; i < sizeof(recv_buf); i++) + { + if (trans_buf[i] != recv_buf[i]) + { + compareValueDiff = 1; + break; + } + } + if (compareValueDiff == 0) + { + rt_kprintf("eeprom test ok!\r\n"); + } + else + { + rt_kprintf("eeprom test failed!\r\n"); + } +} + +/* TCA9539 device */ +#if defined(HC32F472) || defined(HC32F4A0) || defined(HC32F448) + +/* TCA9539 define */ +#define TCA9539_DEV_ADDR (0x74) // TCA9539 chip address on I2C bus + +#define TCA9539_REG_INPUT_PORT0 (0x00U) +#define TCA9539_REG_INPUT_PORT1 (0x01U) +#define TCA9539_REG_OUTPUT_PORT0 (0x02U) +#define TCA9539_REG_OUTPUT_PORT1 (0x03U) +#define TCA9539_REG_INVERT_PORT0 (0x04U) +#define TCA9539_REG_INVERT_PORT1 (0x05U) +#define TCA9539_REG_CONFIG_PORT0 (0x06U) +#define TCA9539_REG_CONFIG_PORT1 (0x07U) + +void tca9539_test(void) +{ + struct rt_i2c_bus_device *hc32_i2c = RT_NULL; + static rt_uint8_t send_buf0[0x10]; + static rt_uint8_t send_buf1[0x10], recv_buf1[0x10]; + struct rt_i2c_msg msg[2]; + +#if defined (BSP_USING_I2C_HW) + hc32_i2c = rt_i2c_bus_device_find(HW_I2C_DEV); //hw i2c +#else + hc32_i2c = rt_i2c_bus_device_find(SW_I2C_DEV); //sw i2c +#endif + RT_ASSERT(hc32_i2c != RT_NULL); + + send_buf0[0] = TCA9539_REG_CONFIG_PORT1; + send_buf0[1] = 0xFF; + msg[0].addr = TCA9539_DEV_ADDR; + msg[0].flags = RT_I2C_WR; + msg[0].len = 2; + msg[0].buf = send_buf0; + rt_i2c_transfer(hc32_i2c, &msg[0], 1); + + send_buf0[0] = TCA9539_REG_OUTPUT_PORT1; + send_buf0[1] = 0xAC; + msg[1].addr = TCA9539_DEV_ADDR; + msg[1].flags = RT_I2C_WR; + msg[1].len = 2; + msg[1].buf = send_buf0; + rt_i2c_transfer(hc32_i2c, &msg[1], 1); + + /* read */ + send_buf1[0] = TCA9539_REG_OUTPUT_PORT1; + msg[0].addr = TCA9539_DEV_ADDR; + msg[0].flags = RT_I2C_WR; + msg[0].len = 1; + msg[0].buf = send_buf1; + + msg[1].addr = TCA9539_DEV_ADDR; + msg[1].flags = RT_I2C_RD; + msg[1].len = 1; + msg[1].buf = recv_buf1; + rt_i2c_transfer(hc32_i2c, &msg[0], 2); + + if (recv_buf1[0] == 0xAC) + { + rt_kprintf("tca9539 test ok!\r\n"); + } + else + { + rt_kprintf("tca9539 test failed!\r\n"); + } +} +#endif + +static void i2c_sample(int argc, char *argv[]) +{ + eeprom_test(); +#if defined(HC32F472) || defined(HC32F4A0) || defined(HC32F448) + tca9539_test(); +#endif +} + +MSH_CMD_EXPORT(i2c_sample, i2c sample); + +#endif/* RT_USING_I2C */ + +/* + EOF +*/ diff --git a/bsp/hc32/tests/test_nand.c b/bsp/hc32/tests/test_nand.c new file mode 100644 index 00000000000..6c78314a8c7 --- /dev/null +++ b/bsp/hc32/tests/test_nand.c @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:NAND 设备使用例程,例程导出了nand_sample命令到控制终端 + * 命令调用格式:nand_sample + * 程序功能:对整个Nand存储空间进行擦除、写和读操作,比较数据是否一致 + * + * 注意: 修改函数SystemClock_Config,调用函数CLK_SetClockDiv参数, + * CLK_EXCLK_DIV2改为CLK_EXCLK_DIV4; + * + * menuconfig: + * Hardware Drivers Config ---> On-chip Peripheral Drivers ----> Enable EXMC ----> Using SDRAM or NAND ----> Using NAND (MT29F2G08AB) + */ + +#include +#include +#include +#include + +#if defined(BSP_USING_EXMC) && defined(BSP_USING_NAND) +#include "nand_port.h" + +#define NAND_DEVICE_NAME "nand" + +static rt_err_t nand_read_id(struct rt_mtd_nand_device *mtd_nand) +{ + if (mtd_nand == RT_NULL) + { + rt_kprintf("mtd_nand pointer = NULL!\n"); + return -RT_ERROR; + } + + return rt_mtd_nand_read_id(mtd_nand); +} + +static rt_err_t nand_read(struct rt_mtd_nand_device *mtd_nand, int block, rt_off_t page, rt_uint8_t *data) +{ + rt_err_t result; + + if ((mtd_nand == RT_NULL) || (block >= mtd_nand->block_total) || (data == RT_NULL)) + { + rt_kprintf("%s: parameters invallid!\n", __func__); + return -RT_ERROR; + } + + /* calculate the page number */ + page = block * mtd_nand->pages_per_block + page; + result = rt_mtd_nand_read(mtd_nand, page, data, mtd_nand->page_size, RT_NULL, mtd_nand->oob_size); + + return result; +} + +static rt_err_t nand_read_oob_free(struct rt_mtd_nand_device *mtd_nand, int block, rt_off_t page, rt_uint8_t *oob_free_data) +{ + rt_err_t result; + + if ((mtd_nand == RT_NULL) || (block >= mtd_nand->block_total) || (oob_free_data == RT_NULL)) + { + rt_kprintf("%s: parameters invallid!\n", __func__); + return -RT_ERROR; + } + + /* calculate the page number */ + page = block * mtd_nand->pages_per_block + page; + result = rt_mtd_nand_read(mtd_nand, page, RT_NULL, 0UL, oob_free_data, mtd_nand->oob_free); + + return result; +} + +static rt_err_t nand_write(struct rt_mtd_nand_device *mtd_nand, int block, rt_off_t page, + rt_uint8_t *data, rt_uint8_t *oob_free_data) +{ + rt_err_t result; + + if ((mtd_nand == RT_NULL) || (block >= mtd_nand->block_total) || ((data == RT_NULL) && (oob_free_data == RT_NULL))) + { + rt_kprintf("%s: parameters invallid!\n", __func__); + return -RT_ERROR; + } + + + /* calculate the page number */ + page = block * mtd_nand->pages_per_block + page; + result = rt_mtd_nand_write(mtd_nand, page, data, mtd_nand->page_size, oob_free_data, mtd_nand->oob_free); + if (result != RT_MTD_EOK) + { + rt_kprintf("write page failed!, rc=%d\n", result); + } + + return result; +} + +static rt_err_t nand_erase(struct rt_mtd_nand_device *mtd_nand, int block) +{ + if ((mtd_nand == RT_NULL) || (block >= mtd_nand->block_total)) + { + rt_kprintf("%s: parameters invallid!\n", __func__); + return -RT_ERROR; + } + + return rt_mtd_nand_erase_block(mtd_nand, block); +} + +static void nand_thread_entry(void *parameter) +{ + rt_err_t result; + rt_uint32_t i; + rt_uint32_t block = 0UL; + rt_uint32_t page = 0UL; + rt_uint32_t err_count = 0UL; + + rt_uint8_t *page_rbuf; + rt_uint8_t *page_wbuf; + rt_uint8_t *page_oob_free_wbuf; + rt_uint8_t *page_oob_free_rbuf; + struct rt_mtd_nand_device *mtd_nand; + + mtd_nand = RT_MTD_NAND_DEVICE(rt_device_find(NAND_DEVICE_NAME)); + if (mtd_nand == RT_NULL) + { + rt_kprintf("no nand device found!\n"); + return; + } + + /* read UID */ + if (nand_read_id(mtd_nand) != RT_EOK) + { + rt_kprintf("fail nand_read_id!\n"); + return; + } + + /* memory buffer */ + page_rbuf = rt_malloc(mtd_nand->page_size); + if (page_rbuf == RT_NULL) + { + rt_kprintf("out of memory!"); + return; + } + + page_wbuf = rt_malloc(mtd_nand->page_size); + if (page_wbuf == RT_NULL) + { + rt_free(page_rbuf); + rt_kprintf("out of memory!"); + return; + } + + page_oob_free_rbuf = rt_malloc(mtd_nand->oob_free); + if (page_oob_free_rbuf == RT_NULL) + { + rt_free(page_rbuf); + rt_free(page_wbuf); + rt_kprintf("out of memory!"); + return; + } + + page_oob_free_wbuf = rt_malloc(mtd_nand->oob_free); + if (page_oob_free_wbuf == RT_NULL) + { + rt_free(page_rbuf); + rt_free(page_wbuf); + rt_free(page_oob_free_rbuf); + rt_kprintf("out of memory!"); + return; + } + + while (1) + { + for (block = 0UL; block < mtd_nand->block_total; block++) + { + for (i = 0UL; i < mtd_nand->page_size; i++) + { + page_rbuf[i] = 0U; + page_wbuf[i] = (rt_uint8_t)rand(); + } + + for (i = 0UL; i < mtd_nand->oob_free; i++) + { + page_oob_free_rbuf[i] = 0; + page_oob_free_wbuf[i] = (rt_uint8_t)rand(); + } + + result = nand_erase(mtd_nand, block); + if (result == RT_EOK) + { + rt_kprintf("mtd_nand_erase block=0x%08X: ok !\r\n", block); + } + else + { + err_count++; + rt_kprintf("mtd_nand_erase block=0x%08X: error !\r\n", block); + } + + for (page = 0UL; page < mtd_nand->pages_per_block; page++) + { + rt_thread_mdelay(500); + + result = nand_write(mtd_nand, block, page, page_wbuf, page_oob_free_wbuf); + if (result == RT_EOK) + { + rt_kprintf("nand_write block=0x%08X page=%d(include oob free area): ok !\r\n", block, page); + } + else + { + err_count++; + rt_kprintf("nand_write block=0x%08X page=%d(include oob free area): error !\r\n", block, page); + break; + } + + result = nand_read(mtd_nand, block, page, page_rbuf); + if (result == RT_EOK) + { + rt_kprintf("nand_read block=0x%08X page=%d: ok !\r\n", block, page); + } + else + { + err_count++; + rt_kprintf("nand_read block=0x%08X page=%d: error !\r\n", block, page); + break; + } + + if (rt_memcmp(page_rbuf, page_wbuf, mtd_nand->page_size) == 0) + { + rt_kprintf("nand_write and nand_read block=0x%08X page=0x%d data consistency: ok !\r\n", block, page); + } + else + { + err_count++; + rt_kprintf("nand_write and nand_read block=0x%08X page=0x%d data consistency: error !\r\n", block, page); + break; + } + + result = nand_read_oob_free(mtd_nand, block, page, page_oob_free_rbuf); + if (result == RT_EOK) + { + rt_kprintf("nand_read_oob_free block=0x%08X page=%d: ok !\r\n", block, page); + } + else + { + err_count++; + rt_kprintf("nand_read_oob_free block=0x%08X page=%d: error !\r\n", block, page); + break; + } + + if (rt_memcmp(page_oob_free_rbuf, page_oob_free_wbuf, mtd_nand->oob_free) == 0) + { + rt_kprintf("nand_write and nand_read_oob_free block=0x%08X page=0x%d data consistency: ok !\r\n", block, page); + } + else + { + err_count++; + rt_kprintf("nand_write and nand_read_oob_free block=0x%08X page=0x%d data consistency: error !\r\n", block, page); + break; + } + + rt_kprintf("mtd_nand block=0x%08X, page=%d test result: ok...... !\r\n", block, page); + } + } + + rt_kprintf("mtd_nand test result: %s !\r\n", err_count ? "err" : "ok"); + rt_thread_mdelay(500); + } +} + +static void nand_sample(int argc, char *argv[]) +{ + rt_thread_t thread = rt_thread_create("nand", nand_thread_entry, RT_NULL, 2048, 15, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } +} +MSH_CMD_EXPORT(nand_sample, nand sample); + +#endif diff --git a/bsp/hc32/tests/test_pfc8563_i2c.c b/bsp/hc32/tests/test_pfc8563_i2c.c new file mode 100644 index 00000000000..93b29ac5e45 --- /dev/null +++ b/bsp/hc32/tests/test_pfc8563_i2c.c @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是一个 I2C 设备使用例程 + * 例程导出了 pcf8563 命令到控制终端 + * 命令调用格式:i2c_pcf8563_sample i2c1 + * 命令解释:命令第二个参数是要使用的I2C总线设备名称,为空则使用默认的I2C总线设备 + * 程序功能:通过 I2C 设备读取时间信息并打印 +*/ + +#include +#include + +#if defined(BSP_USING_I2C) + +#define PFC8563_I2C_BUS_NAME "i2c1" /* I2C总线设备名称 */ +#define PFC8563_ADDR 0x51 /* 从机地址 */ +#define PFC8563_REG_SEC 0x02 /* 校准命令 */ +#define PFC8563_REG_CTRL_SR1 0x00 /* 校准命令 */ + +#define PFC8563_TIME_LEN 0x7 /* 获取数据长度 */ + + +#define RTC_DEC2BCD(__DATA__) ((((__DATA__) / 10U) << 4U) + ((__DATA__) % 10U)) +#define RTC_BCD2DEC(__DATA__) ((((__DATA__) >> 4U) * 10U) + ((__DATA__) & 0x0FU)) + + +static struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */ +static rt_bool_t initialized = RT_FALSE; /* 传感器初始化状态 */ + +/* 写传感器寄存器 */ +static rt_err_t write_regs(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data, rt_uint8_t len) +{ + rt_uint8_t buf[16 + 1]; + struct rt_i2c_msg msgs; + rt_uint32_t buf_size = 1; + + buf[0] = reg; // cmd + if (data != RT_NULL) + { + memcpy(&buf[1], data, len); + buf_size += len; + } + + msgs.addr = PFC8563_ADDR; + msgs.flags = RT_I2C_WR; + msgs.buf = buf; + msgs.len = buf_size; + + /* 调用I2C设备接口传输数据 */ + if (rt_i2c_transfer(bus, &msgs, 1) == 1) + { + return RT_EOK; + } + else + { + rt_kprintf("write regs failed!\n"); + return -RT_ERROR; + } +} + +/* 读传感器寄存器数据 */ +static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data, rt_uint8_t len) +{ + struct rt_i2c_msg msgs[2]; + rt_uint8_t buf[16 + 1]; + rt_uint32_t buf_size = 1; + + buf[0] = reg; // cmd + msgs[0].addr = PFC8563_ADDR; + msgs[0].flags = RT_I2C_WR; + msgs[0].buf = buf; + msgs[0].len = buf_size; + + msgs[1].addr = PFC8563_ADDR; + msgs[1].flags = RT_I2C_RD; + msgs[1].buf = data; + msgs[1].len = len; + + /* 调用I2C设备接口传输数据 */ + if (rt_i2c_transfer(bus, &msgs[0], 2) == 2) + { + return RT_EOK; + } + else + { + rt_kprintf("read regs failed!\n"); + return -RT_ERROR; + } +} + +static void pcf8563_init(const char *name) +{ + rt_uint8_t temp[16]; + + /* 查找I2C总线设备,获取I2C总线设备句柄 */ + i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); + + if (i2c_bus == RT_NULL) + { + rt_kprintf("can't find %s device!\n", name); + } + else + { + rt_thread_mdelay(500); + temp[0] = 0x28U; + write_regs(i2c_bus, PFC8563_REG_CTRL_SR1, temp, 1); + rt_thread_mdelay(100); + temp[0] = 0x08U; + write_regs(i2c_bus, PFC8563_REG_CTRL_SR1, temp, 1); + rt_thread_mdelay(100); + + temp[0] = RTC_DEC2BCD(55); + temp[1] = RTC_DEC2BCD(59); + temp[2] = RTC_DEC2BCD(23); + temp[3] = RTC_DEC2BCD(1); + temp[4] = RTC_DEC2BCD(3); + temp[5] = RTC_DEC2BCD(1); + temp[6] = RTC_DEC2BCD(20); + write_regs(i2c_bus, PFC8563_REG_SEC, temp, PFC8563_TIME_LEN); + rt_thread_mdelay(100); + initialized = RT_TRUE; + } +} + +static void serial_thread_entry(void *parameter) +{ + rt_uint8_t time[16]; + + memset(time, 0, 16); + rt_thread_mdelay(500); + rt_thread_mdelay(500); + + while (1) + { + // if (RT_EOK == read_regs(i2c_bus, PFC8563_REG_SEC, time, PFC8563_TIME_LEN)) + if (RT_EOK == read_regs(i2c_bus, PFC8563_REG_SEC, time, 1)) + { + time[0] &= 0x7FU; + time[1] &= 0x7FU; + time[2] &= 0x3FU; + time[3] &= 0x3FU; + time[4] &= 0x7U; + time[5] &= 0x1FU; + time[6] &= 0xFFU; + /* Print current date and time */ + rt_kprintf("Time: 20%02d/%02d/%02d %02d:%02d:%02d\n", RTC_BCD2DEC(time[6]), RTC_BCD2DEC(time[5]), + RTC_BCD2DEC(time[3]), RTC_BCD2DEC(time[2]), RTC_BCD2DEC(time[1]), RTC_BCD2DEC(time[0])); + } + else + { + rt_kprintf("Get time failed!\n"); + } + rt_thread_mdelay(100); + } +} + +void i2c_pcf8563_sample(int argc, char *argv[]) +{ + char bus_name[RT_NAME_MAX]; + + if (argc == 2) + { + rt_strncpy(bus_name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(bus_name, PFC8563_I2C_BUS_NAME, RT_NAME_MAX); + } + + if (!initialized) + { + /* 传感器初始化 */ + pcf8563_init(bus_name); + } + if (initialized) + { + /* 创建 serial 线程 */ + rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); + /* 创建成功则启动线程 */ + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + rt_kprintf("startup thread failed!\n"); + } + } + else + { + rt_kprintf("initialize sensor failed!\n"); + } +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(i2c_pcf8563_sample, i2c aht10 sample); + +#endif diff --git a/bsp/hc32/tests/test_pm.c b/bsp/hc32/tests/test_pm.c new file mode 100644 index 00000000000..dd54ccde531 --- /dev/null +++ b/bsp/hc32/tests/test_pm.c @@ -0,0 +1,456 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* +* 功能 +* 程序清单:这是一个 PM 设备使用例程 +* 例程导出了 pm_sample_init 命令到控制终端 +* 命令调用格式:pm_sample_init +* +* 展示RTT休眠模式的进入和退出 +* hc32 drv_pm 支持的RTT休眠模式包括: idle、deep、standby、shutdown +* 每种休眠模式与芯片低功耗模式的对应关系是: +* RTT | HC32 +* -----------------------|---------- +* PM_SLEEP_MODE_IDLE | 睡眠模式 +* PM_SLEEP_MODE_DEEP | 停止模式 +* PM_SLEEP_MODE_STANDBY | 掉电模式1或2(可配,默认配置是模式1) +* PM_SLEEP_MODE_SHUTDOWN | 掉电模式3或4(可配,默认配置是模式3) +* +* 操作步骤: +* 1)按下按键K10: MCU进入休眠模式 +* 2)再按下按键K10:MCU退出休眠模式 +* 3)重复上述按键操作,MCU循环进入休眠模式(deep、standby、shutdown、idle)和退出对应的休眠模式。 +* 每次进入休眠模式前,MCU打印 "sleep:" + 休眠模式名称 +* 每次退出休眠模式后,MCU打印 "wake from sleep:" + 休眠模式名称 +*/ + +#include +#include +#include +#include + + +#if defined(BSP_USING_PM) + +#define EFM_ERASE_TIME_MAX_IN_MILLISECOND (20) + +#if defined (HC32F4A0) + #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) + #define BSP_KEY_PORT (GPIO_PORT_A) /* Key10 */ + #define BSP_KEY_PIN (GPIO_PIN_00) + #define BSP_KEY_EXTINT (EXTINT_CH00) + #define BSP_KEY_INT_SRC (INT_SRC_PORT_EIRQ0) + #define BSP_KEY_IRQn (INT001_IRQn) + #define BSP_KEY_INTC_STOP_WKUP_EXTINT (INTC_STOP_WKUP_EXTINT_CH0) + #define BSP_KEY_EVT (EVT_SRC_PORT_EIRQ0) + #define BSP_KEY_PWC_PD_WKUP_TRIG_WKUP (PWC_PD_WKUP_TRIG_WKUP0) + #define BSP_KEY_PWC_PD_WKUP_WKUP (PWC_PD_WKUP_WKUP00) + + #define MCO_PORT (GPIO_PORT_A) + #define MCO_PIN (GPIO_PIN_08) + #define MCO_GPIO_FUNC (GPIO_FUNC_1) + +#elif defined (HC32F460) + #define PLL_SRC ((CM_CMU->PLLCFGR & CMU_PLLCFGR_PLLSRC) >> CMU_PLLCFGR_PLLSRC_POS) + #define BSP_KEY_PORT (GPIO_PORT_B) /* Key10 */ + #define BSP_KEY_PIN (GPIO_PIN_01) + #define BSP_KEY_EXTINT (EXTINT_CH01) + #define BSP_KEY_INT_SRC (INT_SRC_PORT_EIRQ1) + #define BSP_KEY_IRQn (INT001_IRQn) + #define BSP_KEY_INTC_STOP_WKUP_EXTINT (INTC_STOP_WKUP_EXTINT_CH1) + #define BSP_KEY_EVT (EVT_SRC_PORT_EIRQ1) + #define BSP_KEY_PWC_PD_WKUP_TRIG_WKUP (PWC_PD_WKUP_TRIG_WKUP1) + #define BSP_KEY_PWC_PD_WKUP_WKUP (PWC_PD_WKUP_WKUP01) + + #define MCO_PORT (GPIO_PORT_A) + #define MCO_PIN (GPIO_PIN_08) + #define MCO_GPIO_FUNC (GPIO_FUNC_1) + +#elif defined (HC32F448) + #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) + #define BSP_KEY_PORT (GPIO_PORT_B) /* Key5 */ + #define BSP_KEY_PIN (GPIO_PIN_06) + #define BSP_KEY_EXTINT (EXTINT_CH06) + #define BSP_KEY_INT_SRC (INT_SRC_PORT_EIRQ6) + #define BSP_KEY_IRQn (INT001_IRQn) + #define BSP_KEY_INTC_STOP_WKUP_EXTINT (INTC_STOP_WKUP_EXTINT_CH6) + #define BSP_KEY_EVT (EVT_SRC_PORT_EIRQ6) + #define BSP_KEY_PWC_PD_WKUP_TRIG_WKUP (PWC_PD_WKUP_TRIG_WKUP1) + #define BSP_KEY_PWC_PD_WKUP_WKUP (PWC_PD_WKUP_WKUP12) + + #define MCO_PORT (GPIO_PORT_A) + #define MCO_PIN (GPIO_PIN_08) + #define MCO_GPIO_FUNC (GPIO_FUNC_1) + +#elif defined (HC32F472) + #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) + #define BSP_KEY_PORT (GPIO_PORT_B) /* Key5 */ + #define BSP_KEY_PIN (GPIO_PIN_05) + #define BSP_KEY_EXTINT (EXTINT_CH05) + #define BSP_KEY_INT_SRC (INT_SRC_PORT_EIRQ5) + #define BSP_KEY_IRQn (INT001_IRQn) + #define BSP_KEY_INTC_STOP_WKUP_EXTINT (INTC_STOP_WKUP_EXTINT_CH5) + #define BSP_KEY_EVT (EVT_SRC_PORT_EIRQ5) + #define BSP_KEY_PWC_PD_WKUP_TRIG_WKUP (PWC_PD_WKUP_TRIG_WKUP1) + #define BSP_KEY_PWC_PD_WKUP_WKUP (PWC_PD_WKUP_WKUP11) + + #define MCO_PORT (GPIO_PORT_A) + #define MCO_PIN (GPIO_PIN_08) + #define MCO_GPIO_FUNC (GPIO_FUNC_1) +#endif + +#define KEYCNT_BACKUP_ADDR (uint32_t *)(0x200F0010) +#define KEYCNT_CMD_SLEEP_NONE (0) +#define KEYCNT_CMD_SLEEP_IDLE (1) +#define KEYCNT_CMD_SLEEP_DEEP (3) +#define KEYCNT_CMD_SLEEP_STANDBY (5) +#define KEYCNT_CMD_SLEEP_SHUTDOWN (7) + +#define PM_DBG +#if defined PM_DBG + #define pm_dbg rt_kprintf +#else + #define pm_dbg +#endif + +static volatile uint32_t g_keycnt_cmd; +static volatile rt_bool_t g_wkup_flag = RT_FALSE; + +static void KEY_IrqHandler(void) +{ + if (SET == EXTINT_GetExtIntStatus(BSP_KEY_EXTINT)) + { + EXTINT_ClearExtIntStatus(BSP_KEY_EXTINT); + __DSB(); + __ISB(); + } + + if (g_wkup_flag) + { + g_wkup_flag = RT_FALSE; + return; + } + + g_keycnt_cmd++; + pm_dbg("g_keycnt_cmd =%d, ", g_keycnt_cmd); + pm_dbg("recv sleep request\n"); + NVIC_DisableIRQ(BSP_KEY_IRQn); + NVIC_ClearPendingIRQ(BSP_KEY_IRQn); +} + +static void _key_int_init(void) +{ + stc_extint_init_t stcExtIntInit; + stc_irq_signin_config_t stcIrqSignConfig; + stc_gpio_init_t stcGpioInit; + + /* configuration structure initialization */ + (void)GPIO_StructInit(&stcGpioInit); + stcGpioInit.u16ExtInt = PIN_EXTINT_ON; + stcGpioInit.u16PullUp = PIN_PU_ON; + /* GPIO config */ + (void)GPIO_Init(BSP_KEY_PORT, BSP_KEY_PIN, &stcGpioInit); + + /* Extint config */ + (void)EXTINT_StructInit(&stcExtIntInit); + stcExtIntInit.u32Edge = EXTINT_TRIG_FALLING; + (void)EXTINT_Init(BSP_KEY_EXTINT, &stcExtIntInit); + + /* IRQ sign-in */ + stcIrqSignConfig.enIntSrc = BSP_KEY_INT_SRC; + stcIrqSignConfig.enIRQn = BSP_KEY_IRQn; + stcIrqSignConfig.pfnCallback = KEY_IrqHandler; + (void)INTC_IrqSignIn(&stcIrqSignConfig); + + /* NVIC config */ + NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn); + NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT); + NVIC_EnableIRQ(stcIrqSignConfig.enIRQn); +} + + +static void _wkup_cfg_sleep_deep() +{ + INTC_WakeupSrcCmd(BSP_KEY_INTC_STOP_WKUP_EXTINT, ENABLE); +} + +static void _wkup_cfg_sleep_standby(void) +{ + PWC_PD_SetWakeupTriggerEdge(BSP_KEY_PWC_PD_WKUP_TRIG_WKUP, PWC_PD_WKUP_TRIG_FALLING); + PWC_PD_WakeupCmd(BSP_KEY_PWC_PD_WKUP_WKUP, ENABLE); + + PWC_PD_ClearWakeupStatus(PWC_PD_WKUP_FLAG_ALL); +} +static void _wkup_cfg_sleep_shutdown(void) +{ + PWC_PD_SetWakeupTriggerEdge(BSP_KEY_PWC_PD_WKUP_TRIG_WKUP, PWC_PD_WKUP_TRIG_FALLING); + PWC_PD_WakeupCmd(BSP_KEY_PWC_PD_WKUP_WKUP, ENABLE); +} + +static void _sleep_enter_event_idle(void) +{ + rt_kprintf("sleep: idle\n"); +} + +static void _sleep_enter_event_deep(void) +{ + _wkup_cfg_sleep_deep(); + rt_kprintf("sleep: deep\n"); + DDL_DelayMS(50); +} + +static void _sleep_enter_event_standby(void) +{ + _wkup_cfg_sleep_standby(); +#if defined (HC32F4A0) + PWC_BKR_Write(0, g_keycnt_cmd & 0xFF); +#endif + *KEYCNT_BACKUP_ADDR = g_keycnt_cmd; + rt_kprintf("sleep: standby\n"); + DDL_DelayMS(50); +} + +static void _sleep_enter_event_shutdown(void) +{ + _wkup_cfg_sleep_shutdown(); + *KEYCNT_BACKUP_ADDR = g_keycnt_cmd; + rt_kprintf("sleep: shutdown\n"); + DDL_DelayMS(50); +} + +static void _sleep_exit_event_idle(void) +{ + rt_pm_release(PM_SLEEP_MODE_IDLE); + rt_pm_request(PM_SLEEP_MODE_NONE); + rt_kprintf("wakeup from sleep: idle\n"); +} + +static void _sleep_exit_event_deep(void) +{ +#if defined (HC32F460) + PWC_STOP_ClockRecover(); +#endif + rt_pm_release(PM_SLEEP_MODE_DEEP); + rt_pm_request(PM_SLEEP_MODE_NONE); + rt_kprintf("wakeup from sleep: deep\n"); +} + +typedef void (*notify)(void); +static notify sleep_enter_func[PM_SLEEP_MODE_MAX] = +{ + RT_NULL, + _sleep_enter_event_idle, + RT_NULL, + _sleep_enter_event_deep, + _sleep_enter_event_standby, + _sleep_enter_event_shutdown, +}; + +static notify sleep_exit_func[PM_SLEEP_MODE_MAX] = +{ + RT_NULL, + _sleep_exit_event_idle, + RT_NULL, + _sleep_exit_event_deep, + RT_NULL, + RT_NULL, +}; + +static void _notify_func(uint8_t event, uint8_t mode, void *data) +{ + if (event == RT_PM_ENTER_SLEEP) + { + SysTick_Suspend(); + if (sleep_enter_func[mode] == RT_NULL) + { + return; + } + sleep_enter_func[mode](); + } + else + { + SysTick_Resume(); + if (sleep_exit_func[mode] != RT_NULL) + { + sleep_exit_func[mode](); + } + g_keycnt_cmd++; + g_wkup_flag = RT_TRUE; + pm_dbg("g_keycnt_cmd =%d, ", g_keycnt_cmd); + + NVIC_EnableIRQ(BSP_KEY_IRQn); + } +} + +static void pm_cmd_handler(void *parameter) +{ + rt_uint8_t sleep_mode = PM_SLEEP_MODE_NONE; + + while (1) + { + if ((KEYCNT_CMD_SLEEP_IDLE == g_keycnt_cmd) || (KEYCNT_CMD_SLEEP_DEEP == g_keycnt_cmd) || \ + (KEYCNT_CMD_SLEEP_STANDBY == g_keycnt_cmd) || (KEYCNT_CMD_SLEEP_SHUTDOWN == g_keycnt_cmd)) + { + switch (g_keycnt_cmd) + { + case KEYCNT_CMD_SLEEP_IDLE: + sleep_mode = PM_SLEEP_MODE_IDLE; + break; + case KEYCNT_CMD_SLEEP_DEEP: + sleep_mode = PM_SLEEP_MODE_DEEP; + break; + case KEYCNT_CMD_SLEEP_STANDBY: + sleep_mode = PM_SLEEP_MODE_STANDBY; + break; + case KEYCNT_CMD_SLEEP_SHUTDOWN: + sleep_mode = PM_SLEEP_MODE_SHUTDOWN; + break; + default: + break; + } + rt_pm_request(sleep_mode); + rt_pm_release(PM_SLEEP_MODE_NONE); + rt_thread_mdelay(500); + } + else + { + rt_thread_mdelay(50); + } + } +} + +static void pm_run_main(void *parameter) +{ + static rt_uint8_t run_index = 0; + char *speed[] = {"low", "high"}; + const rt_uint8_t run_mode[] = {PM_RUN_MODE_LOW_SPEED, PM_RUN_MODE_HIGH_SPEED}; + + GPIO_SetFunc(MCO_PORT, MCO_PIN, MCO_GPIO_FUNC); + /* Configure clock output system clock */ + CLK_MCOConfig(CLK_MCO1, CLK_MCO_SRC_HCLK, CLK_MCO_DIV8); + /* MCO1 output enable */ + CLK_MCOCmd(CLK_MCO1, ENABLE); + + while (1) + { + rt_pm_run_enter(run_mode[run_index]); + + rt_thread_mdelay(100); + + rt_kprintf("system clock switch to %s speed\n\n", speed[run_index]); + if (++run_index >= ARRAY_SZ(run_mode)) + { + run_index = 0; + } + + rt_thread_mdelay(3000); + } +} + +static void _keycnt_cmd_init_after_power_on(void) +{ + en_flag_status_t wkup_from_ptwk = PWC_PD_GetWakeupStatus(PWC_PD_WKUP_FLAG_WKUP0); +#if defined (HC32F4A0) + en_flag_status_t bakram_pd = PWC_BKR_GetStatus(PWC_BACKUP_RAM_FLAG_RAMPDF); + uint8_t bkr0 = PWC_BKR_Read(0); + + if (bakram_pd == RT_TRUE) + { + g_keycnt_cmd = KEYCNT_CMD_SLEEP_NONE; + } + else +#endif + { + g_keycnt_cmd = *KEYCNT_BACKUP_ADDR; + if (g_keycnt_cmd == KEYCNT_CMD_SLEEP_STANDBY) + { + if (wkup_from_ptwk) + { + g_keycnt_cmd++; + pm_dbg("g_keycnt_cmd =%d, ", g_keycnt_cmd); + rt_kprintf("wakeup from sleep: standby\n\n"); + } + else + { + g_keycnt_cmd = KEYCNT_CMD_SLEEP_NONE; + } + } + else if (g_keycnt_cmd >= KEYCNT_CMD_SLEEP_SHUTDOWN) + { + if ((g_keycnt_cmd == KEYCNT_CMD_SLEEP_SHUTDOWN) && wkup_from_ptwk) + { + pm_dbg("g_keycnt_cmd =%d \n", KEYCNT_CMD_SLEEP_NONE); + rt_kprintf("wakeup from sleep: shutdown\n\n"); + } + g_keycnt_cmd = KEYCNT_CMD_SLEEP_NONE; + } + } + + pm_dbg("KEYCNT_BACKUP_ADDR addr =0x%p,value = %d\n", KEYCNT_BACKUP_ADDR, *KEYCNT_BACKUP_ADDR); + pm_dbg("wkup_from_ptwk = %d\n", wkup_from_ptwk); +#if defined (HC32F4A0) + pm_dbg("bakram_pd = %d\n", bakram_pd); + pm_dbg("bkr0 = %d\n", bkr0); +#endif +} + +static void _vbat_init(void) +{ +#if defined (HC32F4A0) + while (PWC_BKR_GetStatus(PWC_BACKUP_RAM_FLAG_RAMVALID) == RESET) + { + rt_thread_delay(10); + } + FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SRAMB, ENABLE); +#elif defined (HC32F448) + FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SRAMB, ENABLE); +#elif defined (HC32F460) + FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SRAMRET, ENABLE); +#elif defined (HC32F472) + FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SRAMRET, ENABLE); +#endif + pm_dbg("vbat init success\n"); +} + +int pm_sample_init(void) +{ + pm_dbg("pm_sample_init\n\n"); + + _keycnt_cmd_init_after_power_on(); + _vbat_init(); + _key_int_init(); + + rt_pm_notify_set(_notify_func, NULL); + + rt_thread_t thread = rt_thread_create("pm_cmd_handler", pm_cmd_handler, RT_NULL, 1024, 25, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + rt_kprintf("create pm sample thread failed!\n"); + } + + thread = rt_thread_create("pm_run_main", pm_run_main, RT_NULL, 1024, 25, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + rt_kprintf("create pm run thread failed!\n"); + } + return RT_EOK; +} +MSH_CMD_EXPORT(pm_sample_init, pm sample init); + +#endif /* end of BSP_USING_PM */ diff --git a/bsp/hc32/tests/test_pulse_encoder.c b/bsp/hc32/tests/test_pulse_encoder.c new file mode 100644 index 00000000000..000699e85e2 --- /dev/null +++ b/bsp/hc32/tests/test_pulse_encoder.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单: Pulse encoder 设备使用例程, 请在图形化配置界面打开pulse encoder device, + * 并使能tmra_1和tmr6_1. + * 例程导出了 encoder_sample 命令到控制终端, 通过串口可查看当前的count数值 + * 命令调用格式:pulse_encoder_sample devname [option1] [option2] + * devname: [pulse_a1/pulse_61] 编码器单元名称 + * option1: 正转脉冲数 + * option2: 反转脉冲数 + * eg:encoder_sample pulse_a1 2000 1000 + * 编码器的分辨率是1000 + * 硬件IO查看对应board/board_config.h中相关端口定义,并且需要正确连接到对应模拟脉冲生成的端口 + * 程序功能: + */ + +#include +#include +#include +#include "board_config.h" +#include + +#ifdef BSP_USING_PULSE_ENCODER + +#if defined (HC32F4A0) + #define TEST_IO_A_PIN GET_PIN(A, 5) + #define TEST_IO_B_PIN GET_PIN(A, 6) +#else + #define TEST_IO_A_PIN GET_PIN(B, 0) + #define TEST_IO_B_PIN GET_PIN(B, 1) +#endif + +static rt_device_t pulse_encoder_dev = RT_NULL; + +static void printf_connect(void) +{ +#if defined (HC32F4A0) +#if defined(BSP_USING_PULSE_ENCODER_TMRA_1) + rt_kprintf(" [tmra]*connect PA5-->PA8 PA6-->PA9\n"); +#endif +#if defined(BSP_USING_PULSE_ENCODER_TMR6_1) + rt_kprintf(" [tmr6]*connect PA5-->PB9 PA6-->PB8\n"); +#endif +#endif +#if defined (HC32F460) +#if defined(BSP_USING_PULSE_ENCODER_TMRA_1) + rt_kprintf(" [tmra]*connect PB0-->PA8 PB1-->PA9\n"); +#endif +#if defined(BSP_USING_PULSE_ENCODER_TMR6_1) + rt_kprintf(" [tmr6]*connect PB0-->PE9 PB1-->PE8\n"); +#endif +#endif +#if defined (HC32F448) +#if defined(BSP_USING_PULSE_ENCODER_TMRA_1) + rt_kprintf(" [tmra]*connect PB0-->PA8 PB1-->PA9\n"); +#endif +#if defined(BSP_USING_PULSE_ENCODER_TMR6_1) + rt_kprintf(" [tmr6]*connect PB0-->PB5 PB1-->PB13\n"); +#endif +#endif +#if defined (HC32F472) +#if defined(BSP_USING_PULSE_ENCODER_TMRA_1) + rt_kprintf(" [tmra]*connect PB0-->PA0 PB1-->PA1\n"); +#endif +#if defined(BSP_USING_PULSE_ENCODER_TMR6_1) + rt_kprintf(" [tmr6]*connect PB0-->PA3 PB1-->PA7\n"); +#endif +#endif +} + +static void _pulse_cmd_print_usage(void) +{ + rt_kprintf("encoder_sample devname [option1] [option2]\n"); + rt_kprintf(" devname: [pulse_a1/pulse_61..] pulse uint\n"); + rt_kprintf(" option1: number of positive pulses\n"); + rt_kprintf(" option2: number of reversal pulses\n"); + rt_kprintf(" e.g. MSH >encoder_sample pulse_a1 2000 1000\n"); + printf_connect(); +} + +static void GenClkUp(const uint16_t cnt) +{ + uint32_t i, j; + rt_int32_t count; + const uint8_t bAin[4U] = {1U, 1U, 0U, 0U}; + const uint8_t bBin[4U] = {0U, 1U, 1U, 0U}; + for (j = 0UL; j < cnt; j++) + { + for (i = 0UL; i < 4UL; i++) + { + if (0U == bAin[i]) + { + rt_pin_write(TEST_IO_A_PIN, PIN_LOW); + } + else + { + rt_pin_write(TEST_IO_A_PIN, PIN_HIGH); + } + if (0U == bBin[i]) + { + rt_pin_write(TEST_IO_B_PIN, PIN_LOW); + } + else + { + rt_pin_write(TEST_IO_B_PIN, PIN_HIGH); + } + rt_thread_mdelay(1UL); + } + rt_device_read(pulse_encoder_dev, 0, &count, 1); + rt_kprintf("%d\r\n", count); + } +} + +static void GenClkDown(const uint16_t cnt) +{ + uint32_t i, j; + rt_int32_t count; + const uint8_t bAin[4U] = {0U, 1U, 1U, 0U}; + const uint8_t bBin[4U] = {1U, 1U, 0U, 0U}; + for (j = 0UL; j < cnt; j++) + { + for (i = 0UL; i < 4UL; i++) + { + if (0U == bAin[i]) + { + rt_pin_write(TEST_IO_A_PIN, PIN_LOW); + } + else + { + rt_pin_write(TEST_IO_A_PIN, PIN_HIGH); + } + if (0U == bBin[i]) + { + rt_pin_write(TEST_IO_B_PIN, PIN_LOW); + } + else + { + rt_pin_write(TEST_IO_B_PIN, PIN_HIGH); + } + rt_thread_mdelay(1UL); + } + rt_device_read(pulse_encoder_dev, 0, &count, 1); + rt_kprintf("%d\r\n", count); + } +} + +static int encoder_sample(int argc, char **argv) +{ + rt_int32_t count; + + if ((argc != 4)) + { + _pulse_cmd_print_usage(); + return -RT_ERROR; + } + + rt_pin_mode(TEST_IO_A_PIN, PIN_MODE_OUTPUT); + rt_pin_mode(TEST_IO_B_PIN, PIN_MODE_OUTPUT); + + pulse_encoder_dev = rt_device_find(argv[1]); + if (pulse_encoder_dev == RT_NULL) + { + rt_kprintf("encoder_sample run failed! can't find %s device!\n", argv[1]); + _pulse_cmd_print_usage(); + return -RT_ERROR; + } + rt_device_open(pulse_encoder_dev, RT_DEVICE_OFLAG_RDONLY); + rt_device_control(pulse_encoder_dev, PULSE_ENCODER_CMD_CLEAR_COUNT, RT_NULL); + rt_device_control(pulse_encoder_dev, PULSE_ENCODER_CMD_ENABLE, RT_NULL); + + /* 自测DISABLE和CLEAR功能 */ + GenClkUp(100); + rt_device_control(pulse_encoder_dev, PULSE_ENCODER_CMD_DISABLE, RT_NULL); + /* 测试DISABLE后是否还会计数 */ + GenClkUp(10); + rt_device_read(pulse_encoder_dev, 0, &count, 1); + rt_device_control(pulse_encoder_dev, PULSE_ENCODER_CMD_CLEAR_COUNT, RT_NULL); + if (count != 100) + { + rt_kprintf("**************Self-test failed**************\n"); + rt_device_close(pulse_encoder_dev); + _pulse_cmd_print_usage(); + return -RT_ERROR; + } + else + { + rt_kprintf("**************Self-test success**************\n"); + rt_device_control(pulse_encoder_dev, PULSE_ENCODER_CMD_ENABLE, RT_NULL); + GenClkUp(atoi(argv[2])); + GenClkDown(atoi(argv[3])); + + rt_device_read(pulse_encoder_dev, 0, &count, 1); + if (count == (atoi(argv[2]) - atoi(argv[3]))) + { + rt_kprintf("encoder_sample test success\n"); + } + else + { + rt_kprintf("encoder_sample test failed\n"); + } + + rt_device_close(pulse_encoder_dev); + } + + return RT_EOK; +} + +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(encoder_sample, encoder sample devname [option1] [option2]); +#endif diff --git a/bsp/hc32/tests/test_pwm.c b/bsp/hc32/tests/test_pwm.c new file mode 100644 index 00000000000..d675dd89737 --- /dev/null +++ b/bsp/hc32/tests/test_pwm.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是 PWM 设备使用例程 + * 例程导出了 pwm_sample 命令到控制终端。 + * 命令调用格式:pwm_sample x + * 命令解释:x 对应的是设备名称,可以通过 list device 获取,例如:pwm_sample pwm_a1 +*/ + +#include +#include +#include + +#ifdef BSP_USING_PWM + +#define PWM_DEV_CHANNEL 1 + +struct rt_device_pwm *pwm_dev; + + +static rt_int32_t pwm_sample(int argc, char *argv[]) +{ + rt_uint32_t period = 50000; + rt_uint32_t pulse = 45000; + + if (argc != 2) + { + return -RT_ERROR; + } + + pwm_dev = (struct rt_device_pwm *)rt_device_find(argv[1]); + if (pwm_dev == RT_NULL) + { + rt_kprintf("pwm sample run failed! can't find %s device!\n", argv[1]); + return -RT_ERROR; + } + + rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); + rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); + rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL + 1, period, pulse); + rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL + 1); +// rt_pwm_set_period(pwm_dev,PWM_DEV_CHANNEL,100000); + + while (1) + { + rt_thread_mdelay(50); + pulse += 5000; + rt_pwm_set_pulse(pwm_dev, PWM_DEV_CHANNEL, pulse); + rt_pwm_set_pulse(pwm_dev, PWM_DEV_CHANNEL + 1, pulse); + if (pulse >= period) + { + pulse = 0; + } + } +} +MSH_CMD_EXPORT(pwm_sample, pwm_sample [opt]) +#endif +/* + EOF +*/ diff --git a/bsp/hc32/tests/test_qspi.c b/bsp/hc32/tests/test_qspi.c new file mode 100644 index 00000000000..f7f76766805 --- /dev/null +++ b/bsp/hc32/tests/test_qspi.c @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是一个 QSPI 设备使用例程 + * 例程导出了 qspi_w25q_sample 命令到控制终端 + * 命令调用格式:qspi_w25q_sample qspi10 + * 命令解释:命令第二个参数是要使用的QSPI设备名称,为空则使用默认的QSPI设备 + * 程序功能:通过QSPI设备读取 w25q 的 ID 数据 +*/ + +#include +#include +#include "board_config.h" + + +#if defined(BSP_USING_QSPI) +#include "drv_qspi.h" + +#define W25Q_QSPI_DEVICE_NAME "qspi10" + +#define W25Q_FLAG_BUSY (0x01) +#define W25Q_WR_ENABLE (0x06) +#define W25Q_SECTOR_ERASE (0x20) +#define W25Q_RD_STATUS_REG1 (0x05) +#define W25Q_PAGE_PROGRAM (0x02) +#define W25Q64_QUAD_INPUT_PAGE_PROGRAM (0x32) + +#define W25Q_STD_RD (0x03) +#define W25Q_FAST_RD (0x0B) +#define W25Q_FAST_RD_DUAL_OUTPUT (0x3B) +#define W25Q_FAST_RD_DUAL_IO (0xBB) +#define W25Q_FAST_RD_QUAD_OUTPUT (0x6B) +#define W25Q_FAST_RD_QUAD_IO (0xEB) + +#define W25Q64_RD_STATUS_REG1 (0x05) +#define W25Q64_WR_STATUS_REG1 (0x01) +#define W25Q64_RD_STATUS_REG2 (0x35) +#define W25Q64_WR_STATUS_REG2 (0x31) +#define W25Q64_RD_STATUS_REG3 (0x15) +#define W25Q64_WR_STATUS_REG3 (0x11) + +#define W25Q_PAGE_SIZE (256UL) +#define W25Q_SECTOR_SIZE (1024UL * 4UL) +#define W25Q_PAGE_PER_SECTOR (W25Q_SECTOR_SIZE / W25Q_PAGE_SIZE) +#define W25Q_MAX_ADDR (0x800000UL) + +#define W25Q_QSPI_DATA_LINE_WIDTH 1 +#define W25Q_QSPI_RD_MD (W25Q_FAST_RD_QUAD_IO) + +#define W25Q_QSPI_WR_RD_ADDR 0x4000 +#define W25Q_QSPI_DATA_BUF_LEN 0x2000 +#define W25Q_QSPI_WR_CMD W25Q64_QUAD_INPUT_PAGE_PROGRAM + +#if defined (HC32F460) || defined (HC32F4A0) || defined (HC32F472) + #ifndef BSP_QSPI_USING_SOFT_CS + #if (W25Q_QSPI_WR_CMD == W25Q64_QUAD_INPUT_PAGE_PROGRAM) + #error "QUAD PAGE PROGRAM must use soft CS pin!!" + #endif + #endif +#endif + +#if W25Q_QSPI_RD_MD == W25Q_STD_RD + #define W25Q_QSPI_RD_DUMMY_CYCLE 0 +#elif W25Q_QSPI_RD_MD == W25Q_FAST_RD_DUAL_IO + #define W25Q_QSPI_RD_DUMMY_CYCLE 4 +#elif W25Q_QSPI_RD_MD == W25Q_FAST_RD_QUAD_IO + #define W25Q_QSPI_RD_DUMMY_CYCLE 6 +#else + #define W25Q_QSPI_RD_DUMMY_CYCLE 8 +#endif + +#if (W25Q_QSPI_RD_MD == W25Q_FAST_RD_QUAD_IO) + #define W25Q_QSPI_ADDR_LINE 4 +#elif (W25Q_QSPI_RD_MD == W25Q_FAST_RD_DUAL_IO) + #define W25Q_QSPI_ADDR_LINE 2 +#else + #define W25Q_QSPI_ADDR_LINE 1 +#endif + +#if (W25Q_QSPI_RD_MD == W25Q_STD_RD) || (W25Q_QSPI_RD_MD == W25Q_FAST_RD) + #define W25Q_QSPI_DATA_LINE 1 +#elif (W25Q_QSPI_RD_MD == W25Q_FAST_RD_DUAL_OUTPUT) || (W25Q_QSPI_RD_MD == W25Q_FAST_RD_DUAL_IO) + #define W25Q_QSPI_DATA_LINE 2 +#else + #define W25Q_QSPI_DATA_LINE 4 +#endif + + +struct rt_qspi_device *qspi_dev_w25q; /* QSPI 设备句柄 */ + +static uint8_t u8WrBuf[W25Q_QSPI_DATA_BUF_LEN]; +static uint8_t u8RdBuf[W25Q_QSPI_DATA_BUF_LEN]; + + +static int rt_hw_qspi_flash_init(void) +{ +#ifndef BSP_QSPI_USING_SOFT_CS + if (RT_EOK != rt_hw_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, W25Q_QSPI_DATA_LINE_WIDTH, RT_NULL, RT_NULL)) +#else +#if defined (HC32F472) + if (RT_EOK != rt_hw_qspi_bus_attach_device("qspi1", "qspi10", GET_PIN(B, 12), W25Q_QSPI_DATA_LINE_WIDTH, RT_NULL, RT_NULL)) +#elif defined (HC32F4A0) || defined (HC32F460) || defined (HC32F448) + if (RT_EOK != rt_hw_qspi_bus_attach_device("qspi1", "qspi10", GET_PIN(C, 7), W25Q_QSPI_DATA_LINE_WIDTH, RT_NULL, RT_NULL)) +#endif +#endif + { + rt_kprintf("Failed to attach the qspi device."); + return -RT_ERROR; + } + + return RT_EOK; +} +/* 导出到自动初始化 */ +INIT_COMPONENT_EXPORT(rt_hw_qspi_flash_init); + + +void w25q_read_uid(struct rt_qspi_device *device) +{ + rt_uint8_t w25x_read_uid = 0x4B; /* 命令 */ + rt_uint8_t u8UID[8] = {0}; + rt_uint8_t txBuf[5] = {0}; + + rt_memset(txBuf, 0xFF, 5); + txBuf[0] = w25x_read_uid; + + if (8 != rt_qspi_send_then_recv(device, txBuf, 5, u8UID, 8)) + { + rt_kprintf("qspi get uid failed!\n"); + } + else + { + rt_kprintf("w25q UID is: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n", + u8UID[0], u8UID[1], u8UID[2], u8UID[3], u8UID[4], u8UID[5], u8UID[6], u8UID[7]); + } +} + + +int32_t w25q_check_process_done(struct rt_qspi_device *device, uint32_t u32Timeout) +{ + __IO uint32_t u32Count = 0U; + int32_t i32Ret = LL_ERR_TIMEOUT; + rt_uint8_t rxBuf[5] = {0}; + rt_uint8_t txBuf[5] = {0}; + + txBuf[0] = W25Q_RD_STATUS_REG1; + while (u32Count < u32Timeout) + { + if (1 != rt_qspi_send_then_recv(device, txBuf, 1, rxBuf, 1)) + { + rt_kprintf("qspi get SR failed!\n"); + } + else + { + if (W25Q_FLAG_BUSY != (rxBuf[0] & W25Q_FLAG_BUSY)) + { + i32Ret = LL_OK; + break; + } + } + rt_thread_mdelay(1); + u32Count++; + } + + return i32Ret; +} + +rt_err_t bsp_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_buf, rt_size_t send_length, void *recv_buf, rt_size_t recv_length) +{ + RT_ASSERT(send_buf); + RT_ASSERT(recv_buf); + RT_ASSERT(send_length != 0); + + struct rt_qspi_message message; + unsigned char *ptr = (unsigned char *)send_buf; + rt_size_t count = 0; + rt_err_t result = 0; + + message.instruction.content = ptr[0]; + message.instruction.qspi_lines = 1; + count++; + + /* get address */ + if (send_length > 1) + { + if (send_length >= 4) + { + /* address size is 3 Byte */ + message.address.content = (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]); + message.address.size = 24; + count += 3; + } + else + { + return -RT_ERROR; + } + message.address.qspi_lines = W25Q_QSPI_ADDR_LINE; + } + else + { + /* no address stage */ + message.address.content = 0 ; + message.address.qspi_lines = 0; + message.address.size = 0; + } + + message.alternate_bytes.content = 0; + message.alternate_bytes.size = 0; + message.alternate_bytes.qspi_lines = 0; + + /* set dummy cycles */ + message.dummy_cycles = W25Q_QSPI_RD_DUMMY_CYCLE; + + /* set recv buf and recv size */ + message.parent.recv_buf = recv_buf; + message.parent.send_buf = RT_NULL; + message.parent.length = recv_length; + message.parent.cs_take = 1; + message.parent.cs_release = 1; + message.qspi_data_lines = W25Q_QSPI_DATA_LINE; + + result = rt_qspi_transfer_message(device, &message); + if (result == 0) + { + result = -RT_EIO; + } + else + { + result = recv_length; + } + + return result; +} + + +rt_err_t bsp_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_size_t length, uint8_t dataLine) +{ + RT_ASSERT(send_buf); + RT_ASSERT(length != 0); + + struct rt_qspi_message message; + unsigned char *ptr = (unsigned char *)send_buf; + rt_size_t count = 0; + rt_err_t result = 0; + + message.instruction.content = ptr[0]; + message.instruction.qspi_lines = 1; + count++; + + /* get address */ + if (length > 1) + { + if (device->config.medium_size > 0x1000000 && length >= 5) + { + /* medium size greater than 16Mb, address size is 4 Byte */ + message.address.content = (ptr[1] << 24) | (ptr[2] << 16) | (ptr[3] << 8) | (ptr[4]); + message.address.size = 32; + message.address.qspi_lines = 1; + count += 4; + } + else if (length >= 4) + { + /* address size is 3 Byte */ + message.address.content = (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]); + message.address.size = 24; + message.address.qspi_lines = 1; + count += 3; + } + else + { + /* no address stage */ + message.address.content = 0 ; + message.address.qspi_lines = 0; + message.address.size = 0; + } + + } + else + { + /* no address stage */ + message.address.content = 0 ; + message.address.qspi_lines = 0; + message.address.size = 0; + } + + message.alternate_bytes.content = 0; + message.alternate_bytes.size = 0; + message.alternate_bytes.qspi_lines = 0; + + message.dummy_cycles = 0; + + /* determine if there is data to send */ + if (length - count > 0) + { + message.qspi_data_lines = dataLine; + } + else + { + message.qspi_data_lines = 0; + } + + /* set send buf and send size */ + message.parent.send_buf = ptr + count; + message.parent.recv_buf = RT_NULL; + message.parent.length = length - count; + message.parent.cs_take = 1; + message.parent.cs_release = 1; + + result = rt_qspi_transfer_message(device, &message); + if (result == 0) + { + result = -RT_EIO; + } + else + { + result = length; + } + + return result; +} + + + +void w25q_write_sr(struct rt_qspi_device *device, uint8_t reg, uint8_t value) +{ + rt_uint8_t txBuf[5] = {0}; + + txBuf[0] = W25Q_WR_ENABLE; + if (1 != rt_qspi_send(device, txBuf, 1)) + { + rt_kprintf("qspi send cmd failed!\n"); + } + txBuf[0] = reg; + txBuf[1] = value; + if (2 != bsp_qspi_send(device, txBuf, 2, 1)) + { + rt_kprintf("qspi send addr failed!\n"); + } + if (LL_OK != w25q_check_process_done(device, 500U)) + { + rt_kprintf("qspi wait busy failed!\n"); + } +} + + +int32_t w25q_read_data(struct rt_qspi_device *device, uint32_t u32Addr, uint8_t *pu8ReadBuf, uint32_t u32Size) +{ + int32_t i32Ret = LL_OK; + rt_uint8_t txBuf[5] = {0}; + + txBuf[0] = W25Q_QSPI_RD_MD; + txBuf[1] = (u32Addr >> 16) & 0xFFU; + txBuf[2] = (u32Addr >> 8) & 0xFFU; + txBuf[3] = u32Addr & 0xFFU; + if (u32Size != bsp_qspi_send_then_recv(device, txBuf, 4, pu8ReadBuf, u32Size)) + { + i32Ret = LL_ERR; + } + + return i32Ret; +} + + +int32_t w25q_write_data(struct rt_qspi_device *device, uint32_t u32Addr, uint8_t *pu8WriteBuf, uint32_t u32Size) +{ + int32_t i32Ret = LL_OK; + uint32_t u32TempSize, u32AddrOffset = 0U; + uint8_t w25q_txBuf[W25Q_PAGE_SIZE + 10]; + + if ((u32Addr % W25Q_PAGE_SIZE) != 0U) + { + return LL_ERR_INVD_PARAM; + } + while (u32Size != 0UL) + { + if (u32Size >= W25Q_PAGE_SIZE) + { + u32TempSize = W25Q_PAGE_SIZE; + } + else + { + u32TempSize = u32Size; + } + + w25q_txBuf[0] = W25Q_WR_ENABLE; + if (1 != rt_qspi_send(device, w25q_txBuf, 1)) + { + rt_kprintf("qspi send cmd failed!\n"); + } + w25q_txBuf[0] = W25Q_QSPI_WR_CMD; + w25q_txBuf[1] = (u32Addr >> 16) & 0xFFU; + w25q_txBuf[2] = (u32Addr >> 8) & 0xFFU; + w25q_txBuf[3] = u32Addr & 0xFFU; + rt_memcpy(&w25q_txBuf[4], &pu8WriteBuf[u32AddrOffset], u32TempSize); + if (W25Q64_QUAD_INPUT_PAGE_PROGRAM == w25q_txBuf[0]) + { + if ((u32TempSize + 4) != bsp_qspi_send(device, w25q_txBuf, u32TempSize + 4, 4)) + { + rt_kprintf("qspi send addr failed!\n"); + } + } + else + { + if ((u32TempSize + 4) != bsp_qspi_send(device, w25q_txBuf, u32TempSize + 4, 1)) + { + rt_kprintf("qspi send addr failed!\n"); + } + } + i32Ret = w25q_check_process_done(device, 500U); + if (i32Ret != LL_OK) + { + break; + } + + u32Addr += u32TempSize; + u32AddrOffset += u32TempSize; + u32Size -= u32TempSize; + } + + return i32Ret; +} + +int32_t w25q_erase_sector(struct rt_qspi_device *device, uint32_t u32Addr, uint32_t u32Size) +{ + uint8_t txBuf[10]; + uint32_t u32SectorNum, u32Cnt; + int32_t i32Ret = LL_OK; + + if ((u32Addr % W25Q_SECTOR_SIZE) != 0U) + { + return LL_ERR_INVD_PARAM; + } + u32SectorNum = u32Size / W25Q_SECTOR_SIZE; + if ((u32Size % W25Q_SECTOR_SIZE) != 0U) + { + u32SectorNum += 1; + } + for (u32Cnt = 0; u32Cnt < u32SectorNum; u32Cnt++) + { + txBuf[0] = W25Q_WR_ENABLE; + if (1 != rt_qspi_send(device, txBuf, 1)) + { + rt_kprintf("qspi send cmd failed!\n"); + } + txBuf[0] = W25Q_SECTOR_ERASE; + txBuf[1] = (u32Addr >> 16) & 0xFFU; + txBuf[2] = (u32Addr >> 8) & 0xFFU; + txBuf[3] = u32Addr & 0xFFU; + if (4 != rt_qspi_send(device, txBuf, 4)) + { + rt_kprintf("qspi send addr failed!\n"); + } + if (LL_OK != w25q_check_process_done(device, 500U)) + { + i32Ret = LL_ERR; + break; + } + u32Addr += W25Q_SECTOR_SIZE; + } + + return i32Ret; +} + +void w25q_write_read_data(struct rt_qspi_device *device, uint32_t u32Addr) +{ + uint32_t u32Cnt; + + for (u32Cnt = 0; u32Cnt < W25Q_QSPI_DATA_BUF_LEN; u32Cnt++) + { + u8WrBuf[u32Cnt] = u32Cnt & 0xFFUL; + u8RdBuf[u32Cnt] = 0U; + } + if (LL_OK != w25q_erase_sector(device, u32Addr, W25Q_QSPI_DATA_BUF_LEN)) + { + rt_kprintf("qspi erase sector failed!\n"); + } + if (LL_OK != w25q_write_data(device, u32Addr, u8WrBuf, W25Q_QSPI_DATA_BUF_LEN)) + { + rt_kprintf("qspi write data failed!\n"); + } + if (LL_OK != w25q_read_data(device, u32Addr, u8RdBuf, W25Q_QSPI_DATA_BUF_LEN)) + { + rt_kprintf("qspi read data failed!\n"); + } + if (rt_memcmp(u8WrBuf, u8RdBuf, W25Q_QSPI_DATA_BUF_LEN) == 0) + { + rt_kprintf("qspi write and read test ok: addr=0x%06X\n", u32Addr); + } + else + { + rt_kprintf("qspi write and read failed!\n"); + } +} + +static void qspi_thread_entry(void *parameter) +{ + rt_err_t ret; + struct rt_qspi_configuration qcfg = {0}; + uint32_t u32Addr = W25Q_QSPI_WR_RD_ADDR; + + qcfg.medium_size = W25Q_MAX_ADDR; + qcfg.qspi_dl_width = W25Q_QSPI_DATA_LINE_WIDTH; + qcfg.parent.mode = RT_SPI_MODE_0; + qcfg.parent.data_width = 8; + qcfg.parent.max_hz = 10000000UL; + ret = rt_qspi_configure(qspi_dev_w25q, &qcfg); + if ((RT_EOK != ret) && (-RT_EBUSY != ret)) + { + rt_kprintf("qspi config failed!\n"); + } + + /* 读取UID */ + w25q_read_uid(qspi_dev_w25q); + /* Set QE = 1 */ + w25q_write_sr(qspi_dev_w25q, W25Q64_WR_STATUS_REG2, 0x02); + + while (1) + { + /* 读写对比数据 */ + w25q_write_read_data(qspi_dev_w25q, u32Addr); + u32Addr += W25Q_QSPI_DATA_BUF_LEN; + if (u32Addr >= (W25Q_MAX_ADDR - W25Q_QSPI_DATA_BUF_LEN)) + { + u32Addr = W25Q_QSPI_WR_RD_ADDR; + } + rt_thread_mdelay(500); + } +} + + +void qspi_w25q_sample(int argc, char *argv[]) +{ + char name[RT_NAME_MAX]; + + if (argc == 2) + { + rt_strncpy(name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(name, W25Q_QSPI_DEVICE_NAME, RT_NAME_MAX); + } + + /* 查找 qspi 设备获取设备句柄 */ + qspi_dev_w25q = (struct rt_qspi_device *)rt_device_find(name); + if (!qspi_dev_w25q) + { + rt_kprintf("qspi sample run failed! can't find %s device!\n", name); + } + else + { + /* 创建 线程 */ + rt_thread_t thread = rt_thread_create("qspi", qspi_thread_entry, RT_NULL, 2048, 15, 10); + /* 创建成功则启动线程 */ + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + } +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(qspi_w25q_sample, qspi w25q sample); + +#endif diff --git a/bsp/hc32/tests/test_rtc.c b/bsp/hc32/tests/test_rtc.c new file mode 100644 index 00000000000..8aa0bde8d87 --- /dev/null +++ b/bsp/hc32/tests/test_rtc.c @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是 RTC 设备使用例程和 Alarm 使用示例。 + * 例程导出了 rtc_sample 命令到控制终端。 + * 命令调用格式:rtc_sample x + * 命令解释:命令第二个参数是要使用的功能对应的编号, + * RTC 基本功能对应的编号为 0~3,Alarm 功能对应的编号为 4~9 +*/ + +#include +#include +#include +#include "rtconfig.h" +#include "rtdef.h" +// #include "alarm.h" + +#if defined(BSP_USING_RTC) + +/* macros define */ +#define SAMPLE_RTC_NAME "rtc" + +/* variables define */ +static rt_device_t rtc_dev; +#if defined(RT_USING_ALARM) + extern void rt_alarm_dump(void); + + static rt_uint16_t callback_counter, alarm_idx = 0; + static struct rt_alarm *ptr_alarm = RT_NULL; + static struct rt_alarm_setup alarm_setup; +#endif /* RT_USING_ALARM */ + +/* command type */ +enum RTC_CMD +{ + CMD_OPEN_RTC = 0x00, + CMD_SET_TIME = 0x01, + CMD_SET_DATE = 0x02, + CMD_GET_DATE_TIME, +#if defined(RT_USING_ALARM) + CMD_SET_ALARM, + CMD_SET_START_ALARM, + CMD_STOP_ALARM, + CMD_CTRL_ALARM, + CMD_DUMP_ALARM, + CMD_DEL_ALARM, +}; + +void alarm_callback_fun(rt_alarm_t alarm, time_t timestamp) +{ + rt_kprintf("\nuser alarm %d callback function.\n", alarm_idx); + if ((0 == (--callback_counter)) && (alarm_idx)) + { + rt_kprintf("stop alarm %d \n", alarm_idx); + if (RT_EOK != rt_alarm_stop(alarm)) + { + rt_kprintf("failed to stop alarm\n"); + } + /* enter callback 2 times */ + callback_counter = 2; + --alarm_idx; + } +} +#else +}; +#endif /* RT_USING_ALARM */ + +static int rtc_sample(int argc, char *argv[]) +{ + rt_uint8_t idx; + rt_uint16_t temp1, temp2, temp3; + time_t now; +#if defined(RT_USING_ALARM) + struct tm p_tm; +#endif + + if (argc < 2) + { + rt_kprintf("unkown rtc command, rtc [usage] as the following: \n"); + rt_kprintf("\'0\': find and open rtc \n"); + rt_kprintf("\'1 xx:xx:xx\': set time with \n"); + rt_kprintf("\'2 xxxx-xx-xx\': set date with \n"); + rt_kprintf("\'3\': get time and date \n"); +#if defined(RT_USING_ALARM) + rt_kprintf("\'4\': set current time + 10s as alarm \n"); + rt_kprintf("\'5\': start alarm \n"); + rt_kprintf("\'6\': stop alarm \n"); + rt_kprintf("cmd-7 based on cmd-4\n"); + rt_kprintf("\'7\' o: oneshot,\n\'7\' s: second,\n\'7\' m: minute \n"); + rt_kprintf("\'8\': dump all alarm \n"); + rt_kprintf("\'9\': delete all alarm \n"); +#endif /* RT_USING_ALARM */ + return -RT_ERROR; + } + + idx = *(argv[1]) - '0'; + switch (idx) + { + case CMD_OPEN_RTC: + /* find and open device with standard interface */ + rtc_dev = rt_device_find(SAMPLE_RTC_NAME); + if (!rtc_dev) + { + rt_kprintf("find %s failed\n", SAMPLE_RTC_NAME); + return -RT_ERROR; + } + if (RT_EOK != rt_device_open(rtc_dev, RT_NULL)) + { + rt_kprintf("failed to open %s\n", SAMPLE_RTC_NAME); + return -RT_ERROR; + } + rt_kprintf("rtc opened\n"); + break; + case CMD_SET_TIME: + /* set time with xx:xx:xx format characters */ + if (argc < 3) + { + rt_kprintf("unsurpported command\n"); + return -RT_ERROR; + } + temp1 = ((argv[2][0] - '0') * 10) + \ + (argv[2][1] - '0'); + temp2 = ((argv[2][3] - '0') * 10) + \ + (argv[2][4] - '0'); + temp3 = ((argv[2][6] - '0') * 10) + \ + (argv[2][7] - '0'); + if (RT_EOK != set_time(temp1, temp2, temp3)) + { + rt_kprintf("set RTC time failed\n"); + return -RT_ERROR; + } + rt_kprintf("\nset RTC time as %2d:%2d:%2d\n", temp1, temp2, temp3); + break; + case CMD_SET_DATE: + /* set data xxxx-xx-xx format characters */ + temp1 = ((argv[2][0] - '0') * 1000) + \ + ((argv[2][1] - '0') * 100) + \ + ((argv[2][2] - '0') * 10) + \ + (argv[2][3] - '0'); + temp2 = ((argv[2][5] - '0') * 10) + \ + (argv[2][6] - '0'); + temp3 = ((argv[2][8] - '0') * 10) + \ + (argv[2][9] - '0'); + if (RT_EOK != set_date(temp1, temp2, temp3)) + { + rt_kprintf("failed to set date for %s\n", SAMPLE_RTC_NAME); + return -RT_ERROR; + } + rt_kprintf("\nset RTC date as %4d-%2d-%2d\n", temp1, temp2, temp3); + break; + case CMD_GET_DATE_TIME: + /* get current time and print it */ + now = time(NULL); + rt_kprintf("GMT time is: %s\n", ctime(&now)); + break; +#if defined(RT_USING_ALARM) + case CMD_SET_ALARM: + /* get current time (uint: second) from 1970-01-01 */ + now = time(NULL); + rt_kprintf("GMT time is: \n%s\n", ctime(&now)); + now += 60; + gmtime_r(&now, &p_tm); + // localtime_r(&now, &p_tm); + alarm_setup.flag = RT_ALARM_MINUTE; + alarm_setup.wktime.tm_year = p_tm.tm_year; + alarm_setup.wktime.tm_mon = p_tm.tm_mon; + alarm_setup.wktime.tm_mday = p_tm.tm_mday; + alarm_setup.wktime.tm_yday = p_tm.tm_yday; + alarm_setup.wktime.tm_wday = p_tm.tm_wday; + alarm_setup.wktime.tm_hour = p_tm.tm_hour; + alarm_setup.wktime.tm_min = p_tm.tm_min; + alarm_setup.wktime.tm_sec = p_tm.tm_sec; + alarm_setup.wktime.tm_isdst = -1; + rt_kprintf("UTC alarm Time: \n%d-%02d-%02d %02d:%02d:%02d\n\n", + p_tm.tm_year + 1900, + p_tm.tm_mon + 1, + p_tm.tm_mday, + p_tm.tm_hour, + p_tm.tm_min, + p_tm.tm_sec); + ptr_alarm = rt_alarm_create(alarm_callback_fun, &alarm_setup); + if (RT_NULL == ptr_alarm) + { + rt_kprintf("failed to create rtc alarm\n"); + return -RT_ERROR; + } + callback_counter = 2; + ++alarm_idx; + rt_alarm_dump(); + break; + case CMD_SET_START_ALARM: + if (RT_EOK != rt_alarm_start(ptr_alarm)) + { + rt_kprintf("failed to start rtc alarm\n"); + return -RT_ERROR; + } + rt_kprintf("rtc alarm started\n"); + break; + case CMD_STOP_ALARM: + if (RT_EOK != rt_alarm_stop(ptr_alarm)) + { + rt_kprintf("failed to stop rtc alarm\n"); + return -RT_ERROR; + } + rt_kprintf("rtc alarm stopped\n"); + break; + case CMD_CTRL_ALARM: + if (argc < 3) + { + rt_kprintf("unkown para to control rtc alarm\n"); + return -RT_ERROR; + } + switch (argv[2][0]) + { + case 's': + alarm_setup.flag = RT_ALARM_SECOND; + break; + case 'm': + alarm_setup.flag = RT_ALARM_MINUTE; + break; + case 'o': + default: + alarm_setup.flag = RT_ALARM_ONESHOT; + break; + } + if (RT_EOK != rt_alarm_control(ptr_alarm, RT_ALARM_CTRL_MODIFY, &alarm_setup)) + { + rt_kprintf("failed to control rtc alarm\n"); + } + rt_alarm_dump(); + break; + case CMD_DUMP_ALARM: + rt_alarm_dump(); + break; + case CMD_DEL_ALARM: + if (RT_EOK != rt_alarm_delete(ptr_alarm)) + { + rt_kprintf("failed to delete alarm\n"); + } + alarm_idx = 0; + rt_kprintf("alarm deleted\n"); + break; +#endif /* RT_USING_ALARM */ + default: + if (RT_EOK != rt_device_close(rtc_dev)) + { + rt_kprintf("failed to close RTC\n"); + return -RT_ERROR; + } + rt_kprintf("unkown rtc command, rtc closed \n"); + break; + } + /* fetch and print current time and date each second until next year */ + return RT_EOK; +} + +MSH_CMD_EXPORT(rtc_sample, rtc option); + +#endif /* BSP_USING_RTC */ + +/* + EOF +*/ diff --git a/bsp/hc32/tests/test_sdmmc.c b/bsp/hc32/tests/test_sdmmc.c new file mode 100644 index 00000000000..f1a2fae89a1 --- /dev/null +++ b/bsp/hc32/tests/test_sdmmc.c @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:SD/MMC卡 设备使用例程 + * 例程导出了 sample_sdmmc 命令到控制终端 + * 命令调用格式:sdmmc_sample + * 程序功能:对整个SD/MMC卡进行写和读操作,比较数据是否一致 + * + * 注意: 修改函数SystemClock_Config下面参数, + * stcPLLHInit.PLLCFGR_f.PLLN = 120UL - 1UL; + * 改为 + * stcPLLHInit.PLLCFGR_f.PLLN = 100UL - 1UL; + */ + +#include +#include +#include +#include + +#if defined(BSP_USING_SDIO) + +#define SDMMC_DEVICE_NAME "sd" +#define SDMMC_SECTOR_SIZE 512UL + +#define SDMMC_TEST_SECTORS_PER_TIME 100UL +#define SDMMC_TEST_TIME 10UL + +#define SDMMC_TEST_SECTORS (SDMMC_TEST_TIME * SDMMC_TEST_SECTORS_PER_TIME) +#define SDMMC_TEST_BUF_SIZE (SDMMC_SECTOR_SIZE * SDMMC_TEST_SECTORS_PER_TIME) + +static void sdmmc_thread_entry(void *parameter) +{ + rt_ssize_t size; + rt_uint32_t err_count = 0; + rt_device_t sd_device; + rt_uint32_t sector_start; + rt_uint32_t sector_end;; + rt_uint32_t sector_cur_start; + rt_uint32_t sector_cur_end; + rt_uint8_t *sector_rbuf; + rt_uint8_t *sector_wbuf; + + sd_device = rt_device_find(SDMMC_DEVICE_NAME); + if (sd_device == RT_NULL) + { + rt_kprintf("no nand device found!\n"); + return; + } + + if (rt_device_open(sd_device, RT_DEVICE_FLAG_RDWR) != RT_EOK) + { + rt_kprintf("fail to open!\n"); + return; + } + + sector_rbuf = rt_malloc(SDMMC_TEST_BUF_SIZE); + if (sector_rbuf == RT_NULL) + { + rt_kprintf("out of memory!"); + return; + } + + sector_wbuf = rt_malloc(SDMMC_TEST_BUF_SIZE); + if (sector_wbuf == RT_NULL) + { + rt_free(sector_rbuf); + rt_kprintf("out of memory!"); + return; + } + + sector_start = ((rt_uint32_t)rand() & 0x00000FFFUL); + sector_end = (sector_start + SDMMC_TEST_SECTORS - 1); + + rt_kprintf("sector=[%d, %d]: ......test start...... !\r\n", sector_start, sector_end); + + for (sector_cur_start = sector_start; sector_cur_start <= sector_end; sector_cur_start += SDMMC_TEST_SECTORS_PER_TIME) + { + sector_cur_end = sector_cur_start + SDMMC_TEST_SECTORS_PER_TIME - 1UL; + + /* initialize buffer data */ + rt_memset(sector_rbuf, 0, SDMMC_TEST_BUF_SIZE); + rt_memset(sector_wbuf, (rt_uint8_t)rand(), SDMMC_TEST_BUF_SIZE); + + /* write sdmmc */ + size = rt_device_write(sd_device, sector_cur_start, sector_wbuf, SDMMC_TEST_SECTORS_PER_TIME); + if (size == SDMMC_TEST_SECTORS_PER_TIME) + { + rt_kprintf("sector=[%d, %d]: ok wr !\r\n", sector_cur_start, sector_cur_end); + } + else + { + err_count++; + rt_kprintf("sector=[%d, %d]: error wr !\r\n", sector_cur_start, sector_cur_end); + continue; + } + + /* read sdmmc */ + size = rt_device_read(sd_device, sector_cur_start, sector_rbuf, SDMMC_TEST_SECTORS_PER_TIME); + if (size == SDMMC_TEST_SECTORS_PER_TIME) + { + rt_kprintf("sector=[%d, %d]: ok rd !\r\n", sector_cur_start, sector_cur_end); + } + else + { + err_count++; + rt_kprintf("sector=[%d, %d]: error rd !\r\n", sector_cur_start, sector_cur_end); + continue; + } + + /* compare data */ + if (rt_memcmp(sector_wbuf, sector_rbuf, SDMMC_TEST_BUF_SIZE) == 0) + { + rt_kprintf("sector=[%d, %d]: ok cmp !\r\n", sector_cur_start, sector_cur_end); + } + else + { + err_count++; + rt_kprintf("sector=[%d, %d]: error cmp !\r\n", sector_cur_start, sector_cur_end); + } + } + + if (rt_device_close(sd_device) != RT_EOK) + { + rt_kprintf("fail to close!\n"); + } + + rt_free(sector_rbuf); + rt_free(sector_wbuf); + + if (err_count == 0) + { + rt_kprintf("sector=[%d, %d]: ...... test ok...... !\r\n\r\n", sector_start, sector_end); + + } + else + { + rt_kprintf("sector=[%d, %d]: ...... test error...... !\r\n\r\n", sector_start, sector_end); + } +} + +static void sdmmc_sample(int argc, char *argv[]) +{ + rt_thread_t thread = rt_thread_create("sdmmc", sdmmc_thread_entry, RT_NULL, 2048, 15, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } +} +MSH_CMD_EXPORT(sdmmc_sample, sdmmc sample); + +#endif \ No newline at end of file diff --git a/bsp/hc32/tests/test_sdram.c b/bsp/hc32/tests/test_sdram.c new file mode 100644 index 00000000000..231e9135a73 --- /dev/null +++ b/bsp/hc32/tests/test_sdram.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:SDRAM 设备使用例程,例程导出了sdram_sample命令到控制终端 + * 命令调用格式:sdram_sample + * 程序功能:以8/16/32bit方式分别对整个SDRAM存储空间进行写和读操作,比较数据是否一致 + * + * 注意: 修改函数SystemClock_Config,调用函数CLK_SetClockDiv参数, + * CLK_EXCLK_DIV2改为CLK_EXCLK_DIV8(EXCLK: 30MHz); + * + * menuconfig: + * Hardware Drivers Config ---> On-chip Peripheral Drivers ----> Enable EXMC ----> Using SDRAM or NAND ----> Using SDRAM (IS42S16400J7TLI) + */ + +#include +#include +#include + +#if defined(BSP_USING_EXMC) && defined(BSP_USING_SDRAM) +#include "sdram_port.h" + +static rt_err_t sdram_8bit_test(void) +{ + rt_uint32_t i; + rt_uint32_t start_time; + rt_uint32_t time_cast; + const char data_width = 1; + rt_uint8_t data = 0; + rt_err_t err = RT_EOK; + + rt_kprintf("\r\n************************* %s *************************\r\n", __func__); + + /* write data */ + rt_kprintf("writing the 0x%08X bytes data, waiting....\r\n", SDRAM_SIZE); + start_time = rt_tick_get(); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { + *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint8_t)(i % 100); + } + time_cast = rt_tick_get() - start_time; + rt_kprintf("write data success, total time: %d.%03dS.\r\n", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + + /* read data */ + rt_kprintf("start reading and verifying data, waiting....\r\n"); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { + data = *(__IO uint8_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 100) + { + err = -RT_ERROR; + rt_kprintf("SDRAM test failed!\r\n"); + break; + } + } + + if (i >= SDRAM_SIZE / data_width) + { + rt_kprintf("SDRAM test success!\r\n"); + } + + return err; +} + +static rt_err_t sdram_16bit_test(void) +{ + rt_uint32_t i; + rt_uint32_t start_time; + rt_uint32_t time_cast; + const char data_width = 2; + rt_uint16_t data = 0; + rt_err_t err = RT_EOK; + + rt_kprintf("\r\n************************* %s *************************\r\n", __func__); + + /* write data */ + rt_kprintf("writing the 0x%08X haflword data, waiting....\r\n", SDRAM_SIZE / data_width); + start_time = rt_tick_get(); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { + *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint16_t)(i % 1000); + } + time_cast = rt_tick_get() - start_time; + rt_kprintf("write data success, total time: %d.%03dS.\r\n", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + + /* read data */ + rt_kprintf("start reading and verifying data, waiting....\r\n"); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { + data = *(__IO uint16_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 1000) + { + err = -RT_ERROR; + rt_kprintf("SDRAM test failed!\r\n"); + break; + } + } + + if (i >= SDRAM_SIZE / data_width) + { + rt_kprintf("SDRAM test success!\r\n"); + } + + return err; +} + +static rt_err_t sdram_32bit_test(void) +{ + rt_uint32_t i; + rt_uint32_t start_time; + rt_uint32_t time_cast; + const char data_width = 4; + rt_uint32_t data = 0; + rt_err_t err = RT_EOK; + + rt_kprintf("\r\n************************* %s *************************\r\n", __func__); + + /* write data */ + rt_kprintf("writing the 0x%08X bytes data, waiting....\r\n", SDRAM_SIZE / data_width); + start_time = rt_tick_get(); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { + *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width) = (uint32_t)(i % 10000); + } + time_cast = rt_tick_get() - start_time; + rt_kprintf("write data success, total time: %d.%03dS.\r\n", time_cast / RT_TICK_PER_SECOND, + time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000)); + + /* read data */ + rt_kprintf("start reading and verifying data, waiting....\r\n"); + for (i = 0; i < SDRAM_SIZE / data_width; i++) + { + data = *(__IO uint32_t *)(SDRAM_BANK_ADDR + i * data_width); + if (data != i % 10000) + { + err = -RT_ERROR; + rt_kprintf("SDRAM test failed!\r\n"); + break; + } + } + + if (i >= SDRAM_SIZE / data_width) + { + rt_kprintf("SDRAM test success!\r\n"); + } + + return err; +} + +static void sdram_thread_entry(void *parameter) +{ + while (1) + { + sdram_8bit_test(); + rt_thread_mdelay(1000); + + sdram_16bit_test(); + rt_thread_mdelay(1000); + + sdram_32bit_test(); + rt_thread_mdelay(1000); + } +} + +static void sdram_sample(int argc, char *argv[]) +{ + rt_thread_t thread = rt_thread_create("sdram", sdram_thread_entry, RT_NULL, 2048, 15, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } +} +MSH_CMD_EXPORT(sdram_sample, sdram sample); + +#endif diff --git a/bsp/hc32/tests/test_soft_i2c.c b/bsp/hc32/tests/test_soft_i2c.c new file mode 100644 index 00000000000..4cce95dabde --- /dev/null +++ b/bsp/hc32/tests/test_soft_i2c.c @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是 Soft I2C 设备使用例程。 + * 例程导出了 sw_i2c_sample 到控制终端。 + * 命令调用格式:sw_i2c_sample cmd_id [options] + * 命令解释:命令第二个参数是要使用的Soft I2C设备的命令,为空则打印命令使用说明 + * 程序功能:查找Soft I2C设备,读写I2C设备寄存器。 + * 注意:测试要用逻辑分析仪或示波器抓取信号 +*/ + +#include +#include +#include +#include "rtconfig.h" +#include "rtdef.h" + +#if defined(RT_USING_I2C) + +#if defined(BSP_USING_I2C1_SW) + +/* using i2c1 control oled12864 */ +#define SW_I2C_NAME "i2c1_sw" +#define SSD1306_ADDR (0x78U >> 1) +#define SSD1306_MD_CMD (0x00U) +#define SSD1306_MD_DATA (0x40U) + +/* symbol parameters: width pixles, lenght pixels */ +#define SYM_W_PIX (8U) +#define SYM_H_PIX (8U) +/* ssd ohysical parameters */ +#define SSD_PAGE_SIZE (8U) +#define SSD_COL_SIZE (128U) +/* each page 8 pix */ +#define PAGE_PIX_SIZE (8U) + +/* each byte set horizontal 1 pix */ +#define SYM_W_BYTE (SYM_W_PIX / 1) +/* each byte set vertical 8 pix */ +#define SYM_H_BYTE (SYM_H_PIX / 8) +/* each character occupis */ +#define SYM_BYTE_SIZE (SYM_W_BYTE * SYM_H_BYTE) + +/* soft i2c command defines */ +enum SW_I2C_CMD +{ + SW_I2C_INIT = 0x01, + SSD1306_CMD_INIT, + SSD1306_CMD_DISPLAY, + SSD1306_CMD_DEINIT, +}; + +/* local variables */ +struct rt_i2c_msg msg; +rt_uint8_t ssd_init_array[30]; +rt_uint8_t logo_array[5][SYM_BYTE_SIZE]; + +/* local functions */ +static void ssd1306_init(struct rt_i2c_bus_device *i2c_dev); +static void ssd1306_roll_display(struct rt_i2c_bus_device *i2c_dev); +static void ssd1306_deinit(struct rt_i2c_bus_device *i2c_dev); + +/* write_reg ssd1306 basic opertion */ +static void ssd1306_write_single_reg(struct rt_i2c_bus_device *i2c_dev, + rt_bool_t is_write_cmd, rt_uint8_t data) +{ + rt_uint8_t buff[2]; + struct rt_i2c_msg msgs; + + msgs.addr = SSD1306_ADDR; + msgs.flags = RT_I2C_WR; + + if (RT_TRUE == is_write_cmd) + { + buff[0] = SSD1306_MD_CMD; + } + else + { + buff[0] = SSD1306_MD_DATA; + } + + buff[1] = data; + msgs.buf = buff; + msgs.len = 2; + + if (1 != rt_i2c_transfer(i2c_dev, &msgs, 1)) + { + rt_kprintf("failed to send cmd\n"); + } +} + +/* write_reg ssd1306 basic opertion */ +static void ssd1306_write_mult_reg(struct rt_i2c_bus_device *i2c_dev, + rt_bool_t is_write_cmd, rt_uint8_t len, rt_uint8_t *data + /*rt_uint8_t data*/) +{ + rt_uint8_t *buff = NULL; + struct rt_i2c_msg msgs; + + msgs.addr = SSD1306_ADDR; + msgs.flags = RT_I2C_WR; + buff = (rt_uint8_t *)rt_malloc((len + 1) * sizeof(rt_uint8_t)); + + if (RT_TRUE == is_write_cmd) + { + buff[0] = SSD1306_MD_CMD; + } + else + { + buff[0] = SSD1306_MD_DATA; + } + rt_memcpy(buff + 1, data, len); + msgs.buf = buff; + msgs.len = len + 1; + + if (1 != rt_i2c_transfer(i2c_dev, &msgs, 1)) + { + rt_kprintf("failed to send cmd\n"); + } + rt_free(buff); + buff = NULL; +} + +static int sw_i2c_sample(int argc, char *argv[]) +{ + static struct rt_i2c_bus_device *rt_i2c_dev; + /* print soft i2c usage */ + if (argc <= 1) + { + rt_kprintf("soft i2c usage as following:\n"); + rt_kprintf("sw_i2c_sample %d: soft i2c init\n", SW_I2C_INIT); + rt_kprintf("sw_i2c_sample %d: oled ssd1306 init\n", SSD1306_CMD_INIT); + rt_kprintf("sw_i2c_sample %d: write ssd1306 \n", SSD1306_CMD_DISPLAY); + rt_kprintf("sw_i2c_sample %d: turn off ssd1306\n", SSD1306_CMD_DEINIT); + return -RT_ERROR; + } + + switch (*argv[1] - '0') + { + case SW_I2C_INIT: + rt_i2c_dev = (struct rt_i2c_bus_device *)rt_device_find(SW_I2C_NAME); + if (NULL == rt_i2c_dev) + { + rt_kprintf("failed to find i2c device %s\n", SW_I2C_NAME); + return -RT_ERROR; + } + break; + /* communicate with eeprom to soft i2c read function */ + case SSD1306_CMD_INIT: + ssd1306_init(rt_i2c_dev); + break; + /* communicate with ssd1306 to soft i2c read function */ + case SSD1306_CMD_DISPLAY: + ssd1306_roll_display(rt_i2c_dev); + break; + case SSD1306_CMD_DEINIT: + ssd1306_deinit(rt_i2c_dev); + break; + default: + rt_kprintf("unkwon command\n"); + break; + } + + return RT_EOK; +} + +/* ssd1306 de-init and turn off */ +static void ssd1306_deinit(struct rt_i2c_bus_device *i2c_dev) +{ + rt_uint8_t ssd_deinit_array[] = + { + 0X8D, /* set charge pump */ + 0X10, /* turn off charge pump */ + 0XAE, /* OLED sleep */ + }; + + ssd1306_write_mult_reg(i2c_dev, RT_TRUE, + sizeof(ssd_deinit_array) / sizeof(ssd_deinit_array[0]), + ssd_deinit_array); +} + +/* ssd oled initialize */ +static void ssd1306_init(struct rt_i2c_bus_device *i2c_dev) +{ + ssd1306_write_mult_reg(i2c_dev, RT_TRUE, + sizeof(ssd_init_array) / sizeof(ssd_init_array[0]), + ssd_init_array); +} + +/* + Function: write a heigh * width = 16 *16 --->pixel: 16 * 8character + Input: void + Output: void + Data: 20210828 +*/ + +void mOledWriteCharHnWm(struct rt_i2c_bus_device *i2c_dev, + uint8_t page, uint8_t col, uint8_t *ArrChar) +{ + if (ArrChar == NULL) + return; + rt_kprintf("x=%3d, y=%d\n", col, page); + for (uint8_t page_idx = 0; page_idx < SYM_H_BYTE; page_idx++) + { + /* set start page: page0-page1 */ + ssd1306_write_single_reg(i2c_dev, RT_TRUE, 0xb0 + page + page_idx); + /* lower 4-bit address of column start */ + ssd1306_write_single_reg(i2c_dev, RT_TRUE, 0x00 + ((col & 0x0F) >> 0)); + /* higher 4-bit address of column start */ + ssd1306_write_single_reg(i2c_dev, RT_TRUE, 0x10 + ((col & 0xF0) >> 4)); + /* send a character(total BYTE_CHAR byte) from array */ + ssd1306_write_mult_reg(i2c_dev, RT_FALSE, SYM_W_BYTE, + ArrChar + SYM_W_BYTE * page_idx); + } +} + +/* fill oled with character "XHSC" */ +static void ssd1306_roll_display(struct rt_i2c_bus_device *i2c_dev) +{ + rt_uint8_t base_col, base_page; + rt_uint8_t offset_page, offset_col; + rt_uint16_t idx; + /* using a write times related variable control position */ + static rt_uint16_t u16WriteTimes = 0; + + if (u16WriteTimes >= (SSD_COL_SIZE / SYM_W_PIX) * (SSD_PAGE_SIZE / (SYM_H_PIX / PAGE_PIX_SIZE))) + { + u16WriteTimes = 0; + } + /* each page write, eg. base_page = 7 / (128 / 8) = 0 */ + base_page = u16WriteTimes / (SSD_COL_SIZE / SYM_W_PIX); + /* eg. base_col = (7 % (128 / 8)) * 8 = 56 */ + base_col = (u16WriteTimes % (SSD_COL_SIZE / SYM_W_PIX)) * SYM_W_PIX; + offset_page = 0; + offset_col = 0; + /* each write cycle finish the data writing in array */ + for (idx = 0; idx < sizeof(logo_array) / sizeof(logo_array[0]); idx++) + { + offset_col = idx * SYM_W_PIX; + if (base_col + offset_col >= SSD_COL_SIZE) + { + /* + base_col + offset_col = [128, 256), page_offset = 1, + base_col + offset_col = [256, 384), page_offset = 2, + ... + */ + offset_page = (base_col + offset_col) / SSD_COL_SIZE; + } + mOledWriteCharHnWm(i2c_dev, ((base_page + offset_page) * SYM_H_BYTE) % SSD_PAGE_SIZE, (base_col + offset_col) % SSD_COL_SIZE, *(logo_array + idx)); + } + u16WriteTimes++; +} + +rt_uint8_t ssd_init_array[] = +{ + 0xAE, /* display off */ + 0x20, /* Set Memory Addressing Mode */ + 0x10, /* Set addressing orient */ + 0xB0, /* Set Page Start Address for Page Addressing Mode,0-7 */ + 0xC8, /* Set COM Output Scan Direction */ + 0x00, /* set low column address */ + 0x10, /* set high column address */ + 0x40, /* set start line address */ + 0x81, /* set contrast control register */ + 0xFF, /* breightness 0x00~0xff */ + 0xA1, /* set segment re-map 0 to 127 */ + 0xA6, /* set normal display */ + 0xA8, /* set multiplex ratio(1 to 64) */ + 0x3F, /* */ + 0xC8, /* */ + 0xA4, /* 0xa4,Output follows RAM content;0xa5,Output ignores RAM content */ + 0xD3, /* set display offset */ + 0x00, /* not offset */ + 0xD5, /* set display clock divide ratio/oscillator frequency */ + 0xF0, /* set divide ratio */ + 0xD9, /* set pre-charge period */ + 0x22, /* */ + 0xDA, /* set com pins hardware configuration */ + 0x12, /* */ + 0xDB, /* set vcomh */ + 0x20, /* 0x20,0.77xVcc */ + 0x8D, /* set DC-DC enable */ + 0x14, /* */ + 0xAF, /* --turn on oled panel */ +}; + + +rt_uint8_t logo_array[][SYM_BYTE_SIZE] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x6C, 0x74, 0x54, 0x6C, 0x44, 0x44, /*"X"*/ + 0x44, 0x7C, 0x54, 0x10, 0x10, 0x54, 0x7C, 0x44, /*"H"*/ + 0x00, 0x68, 0x54, 0x54, 0x54, 0x54, 0x24, 0x00, /*"S"*/ + 0x38, 0x6C, 0x44, 0x44, 0x44, 0x44, 0x24, 0x00, /*"C"*/ +}; + +MSH_CMD_EXPORT(sw_i2c_sample, soft i2c sample); + +#endif /* BSP_USING_I2C1_SW */ + +#endif/* RT_USING_I2C */ +/* +EOF +*/ diff --git a/bsp/hc32/tests/test_spi.c b/bsp/hc32/tests/test_spi.c new file mode 100644 index 00000000000..2f7a05812ed --- /dev/null +++ b/bsp/hc32/tests/test_spi.c @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是一个 SPI 设备使用例程 + * 例程导出了 spi_w25q_sample 命令到控制终端 + * 命令调用格式:spi_w25q_sample spi10 + * 命令解释:命令第二个参数是要使用的SPI设备名称,为空则使用默认的SPI设备 + * 程序功能:通过SPI设备读取 w25q 的 ID 数据 +*/ + +#include +#include +#include "board_config.h" +#include + +#if defined(BSP_USING_SPI) +#include "drv_spi.h" + +#define W25Q_FLAG_BUSY (0x01) +#define W25Q_WR_ENABLE (0x06) +#define W25Q_SECTOR_ERASE (0x20) +#define W25Q_RD_STATUS_REG1 (0x05) +#define W25Q_PAGE_PROGRAM (0x02) +#define W25Q_STD_RD (0x03) + +#define W25Q_PAGE_SIZE (256UL) +#define W25Q_SECTOR_SIZE (1024UL * 4UL) +#define W25Q_PAGE_PER_SECTOR (W25Q_SECTOR_SIZE / W25Q_PAGE_SIZE) +#define W25Q_MAX_ADDR (0x800000UL) + +#define W25Q_SPI_WR_RD_ADDR 0x4000 +#define W25Q_SPI_DATA_BUF_LEN 0x2000 + + +#if defined(HC32F4A0) || defined(HC32F448) + #define SPI_CS_PORT SPI1_CS_PORT + #define SPI_CS_PIN SPI1_CS_PIN + #define SPI_CS_PORT_PIN GET_PIN(C, 7) + + #define W25Q_SPI_BUS_NAME "spi1" + #define W25Q_SPI_DEVICE_NAME "spi10" +#elif defined(HC32F472) + #define SPI_CS_PORT SPI1_CS_PORT + #define SPI_CS_PIN SPI1_CS_PIN + #define SPI_CS_PORT_PIN GET_PIN(B, 12) + + #define W25Q_SPI_BUS_NAME "spi1" + #define W25Q_SPI_DEVICE_NAME "spi10" +#elif defined(HC32F460) + #define SPI_CS_PORT SPI3_CS_PORT + #define SPI_CS_PIN SPI3_CS_PIN + #define SPI_CS_PORT_PIN GET_PIN(C, 7) + + #define W25Q_SPI_BUS_NAME "spi3" + #define W25Q_SPI_DEVICE_NAME "spi30" +#endif + + +struct rt_spi_device *spi_dev_w25q; /* SPI 设备句柄 */ + +static uint8_t u8WrBuf[W25Q_SPI_DATA_BUF_LEN]; +static uint8_t u8RdBuf[W25Q_SPI_DATA_BUF_LEN]; + + +static int rt_hw_spi_flash_init(void) +{ + if (RT_EOK != rt_hw_spi_device_attach(W25Q_SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, SPI_CS_PORT_PIN)) + { + rt_kprintf("Failed to attach the spi device."); + return -RT_ERROR; + } + + return RT_EOK; +} +/* 导出到自动初始化 */ +INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); + +void w25q_read_uid(struct rt_spi_device *device) +{ + rt_uint8_t w25x_read_uid = 0x4B; /* 命令 */ + rt_uint8_t u8UID[8] = {0}; + rt_uint8_t txBuf[5] = {0}; + + memset(txBuf, 0xFF, 5); + txBuf[0] = w25x_read_uid; + /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */ + if (RT_EOK != rt_spi_send_then_recv(device, txBuf, 5, u8UID, 8)) + { + rt_kprintf("spi get uid failed!\n"); + } + else + { + rt_kprintf("w25q UID is: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n", + u8UID[0], u8UID[1], u8UID[2], u8UID[3], u8UID[4], u8UID[5], u8UID[6], u8UID[7]); + } + + /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */ + struct rt_spi_message msg1, msg2; + + msg1.send_buf = txBuf; + msg1.recv_buf = RT_NULL; + msg1.length = 5; + msg1.cs_take = 1; + msg1.cs_release = 0; + msg1.next = &msg2; + + msg2.send_buf = RT_NULL; + msg2.recv_buf = u8UID; + msg2.length = 8; + msg2.cs_take = 0; + msg2.cs_release = 1; + msg2.next = RT_NULL; + + rt_spi_transfer_message(device, &msg1); + rt_kprintf("use rt_spi_transfer_message() read w25q ID is: UID is: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n", + u8UID[0], u8UID[1], u8UID[2], u8UID[3], u8UID[4], u8UID[5], u8UID[6], u8UID[7]); +} + + +int32_t w25q_check_process_done(struct rt_spi_device *device, uint32_t u32Timeout) +{ + __IO uint32_t u32Count = 0U; + int32_t i32Ret = LL_ERR_TIMEOUT; + rt_uint8_t rxBuf[5] = {0}; + rt_uint8_t txBuf[5] = {0}; + + txBuf[0] = W25Q_RD_STATUS_REG1; + while (u32Count < u32Timeout) + { + if (RT_EOK != rt_spi_send_then_recv(device, txBuf, 1, rxBuf, 1)) + { + rt_kprintf("spi get SR failed!\n"); + } + else + { + if (W25Q_FLAG_BUSY != (rxBuf[0] & W25Q_FLAG_BUSY)) + { + i32Ret = LL_OK; + break; + } + } + rt_thread_mdelay(1); + u32Count++; + } + + return i32Ret; +} + +int32_t w25q_read_data(struct rt_spi_device *device, uint32_t u32Addr, uint8_t *pu8ReadBuf, uint32_t u32Size) +{ + int32_t i32Ret = LL_OK; + rt_uint8_t txBuf[5] = {0}; + + txBuf[0] = W25Q_STD_RD; + txBuf[1] = (u32Addr >> 16) & 0xFFU; + txBuf[2] = (u32Addr >> 8) & 0xFFU; + txBuf[3] = u32Addr & 0xFFU; + if (RT_EOK != rt_spi_send_then_recv(device, txBuf, 4, pu8ReadBuf, u32Size)) + { + i32Ret = LL_ERR; + } + + return i32Ret; +} + + +int32_t w25q_write_data(struct rt_spi_device *device, uint32_t u32Addr, uint8_t *pu8WriteBuf, uint32_t u32Size) +{ + int32_t i32Ret = LL_OK; + uint32_t u32TempSize, u32AddrOffset = 0U; + uint8_t w25q_txBuf[W25Q_PAGE_SIZE + 10]; + + if ((u32Addr % W25Q_PAGE_SIZE) != 0U) + { + return LL_ERR_INVD_PARAM; + } + while (u32Size != 0UL) + { + if (u32Size >= W25Q_PAGE_SIZE) + { + u32TempSize = W25Q_PAGE_SIZE; + } + else + { + u32TempSize = u32Size; + } + + w25q_txBuf[0] = W25Q_WR_ENABLE; + if (1 != rt_spi_send(device, w25q_txBuf, 1)) + { + rt_kprintf("spi send cmd failed!\n"); + } + w25q_txBuf[0] = W25Q_PAGE_PROGRAM; + w25q_txBuf[1] = (u32Addr >> 16) & 0xFFU; + w25q_txBuf[2] = (u32Addr >> 8) & 0xFFU; + w25q_txBuf[3] = u32Addr & 0xFFU; + memcpy(&w25q_txBuf[4], &pu8WriteBuf[u32AddrOffset], u32TempSize); + if ((u32TempSize + 4) != rt_spi_send(device, w25q_txBuf, u32TempSize + 4)) + { + rt_kprintf("spi send addr failed!\n"); + } + i32Ret = w25q_check_process_done(device, 500U); + if (i32Ret != LL_OK) + { + break; + } + + u32Addr += u32TempSize; + u32AddrOffset += u32TempSize; + u32Size -= u32TempSize; + } + + return i32Ret; +} + +int32_t w25q_erase_sector(struct rt_spi_device *device, uint32_t u32Addr, uint32_t u32Size) +{ + uint8_t txBuf[10]; + uint32_t u32SectorNum, u32Cnt; + int32_t i32Ret = LL_OK; + + if ((u32Addr % W25Q_SECTOR_SIZE) != 0U) + { + return LL_ERR_INVD_PARAM; + } + u32SectorNum = u32Size / W25Q_SECTOR_SIZE; + if ((u32Size % W25Q_SECTOR_SIZE) != 0U) + { + u32SectorNum += 1; + } + for (u32Cnt = 0; u32Cnt < u32SectorNum; u32Cnt++) + { + txBuf[0] = W25Q_WR_ENABLE; + if (1 != rt_spi_send(device, txBuf, 1)) + { + rt_kprintf("spi send cmd failed!\n"); + } + txBuf[0] = W25Q_SECTOR_ERASE; + txBuf[1] = (u32Addr >> 16) & 0xFFU; + txBuf[2] = (u32Addr >> 8) & 0xFFU; + txBuf[3] = u32Addr & 0xFFU; + if (4 != rt_spi_send(device, txBuf, 4)) + { + rt_kprintf("spi send addr failed!\n"); + } + if (LL_OK != w25q_check_process_done(device, 500U)) + { + i32Ret = LL_ERR; + break; + } + u32Addr += W25Q_SECTOR_SIZE; + } + + return i32Ret; +} + +void w25q_write_read_data(struct rt_spi_device *device, uint32_t u32Addr) +{ + uint32_t u32Cnt; + + for (u32Cnt = 0; u32Cnt < W25Q_SPI_DATA_BUF_LEN; u32Cnt++) + { + u8WrBuf[u32Cnt] = u32Cnt & 0xFFUL; + u8RdBuf[u32Cnt] = 0U; + } + if (LL_OK != w25q_erase_sector(device, u32Addr, W25Q_SPI_DATA_BUF_LEN)) + { + rt_kprintf("spi erase sector failed!\n"); + } + if (LL_OK != w25q_write_data(device, u32Addr, u8WrBuf, W25Q_SPI_DATA_BUF_LEN)) + { + rt_kprintf("spi write data failed!\n"); + } + if (LL_OK != w25q_read_data(device, u32Addr, u8RdBuf, W25Q_SPI_DATA_BUF_LEN)) + { + rt_kprintf("spi read data failed!\n"); + } + if (memcmp(u8WrBuf, u8RdBuf, W25Q_SPI_DATA_BUF_LEN) == 0) + { + rt_kprintf("spi write and read test ok! addr=%06x\n", u32Addr); + } + else + { + rt_kprintf("spi write and read failed!\n"); + } +} + +static void spi_thread_entry(void *parameter) +{ + uint32_t u32Addr = W25Q_SPI_WR_RD_ADDR; + struct rt_spi_configuration cfg; + + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; + cfg.max_hz = 80 * 1000 * 1000; /* 80M */ + rt_spi_configure(spi_dev_w25q, &cfg); + /* 读取UID */ + w25q_read_uid(spi_dev_w25q); + + while (1) + { + /* 读写对比数据 */ + w25q_write_read_data(spi_dev_w25q, u32Addr); + u32Addr += W25Q_SPI_DATA_BUF_LEN; + if (u32Addr >= (W25Q_MAX_ADDR - W25Q_SPI_DATA_BUF_LEN)) + { + u32Addr = W25Q_SPI_WR_RD_ADDR; + } + rt_thread_mdelay(500); + } +} + +static void spi_w25q_sample(int argc, char *argv[]) +{ + char name[RT_NAME_MAX]; + + if (argc == 2) + { + rt_strncpy(name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX); + } + /* 查找 spi 设备获取设备句柄 */ + spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name); + if (!spi_dev_w25q) + { + rt_kprintf("spi sample run failed! can't find %s device!\n", name); + } + else + { + /* 创建 线程 */ + rt_thread_t thread = rt_thread_create("spi", spi_thread_entry, RT_NULL, 2048, 15, 10); + /* 创建成功则启动线程 */ + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + } +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample); + +#endif diff --git a/bsp/hc32/tests/test_tmr_capture.c b/bsp/hc32/tests/test_tmr_capture.c new file mode 100644 index 00000000000..fd89cd8c502 --- /dev/null +++ b/bsp/hc32/tests/test_tmr_capture.c @@ -0,0 +1,297 @@ +/* + * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. + + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-10 CDT first version + */ + +/* +* 功能 +* 展示捕获单元 ic1、ic2、ic3 的捕获输入功能 +* 当捕获单元捕获到设定数量(watermark)的数据(微秒级别的电平宽度)后,终端将输出这些已捕获的数据 +* +* 默认配置 +* input pin: +* ic1: INPUT_CAPTURE_TMR6_1_PORT, INPUT_CAPTURE_TMR6_1_PIN +* ic2: INPUT_CAPTURE_TMR6_2_PORT, INPUT_CAPTURE_TMR6_2_PIN +* ic3: INPUT_CAPTURE_TMR6_3_PORT, INPUT_CAPTURE_TMR6_3_PIN +* watermark: +* ic1:5 +* ic2:5 +* ic3: 5 +* +* 命令行命令 +* 1)开启捕获单元: +* 格式: +* ic open +* 示例: +* MSH >ic open 3(开启 ic3) +* 2)关闭捕获单元: +* 格式: +* ic close +* 示例: +* MSH >ic close 3 (关闭 ic3) +* 3)设置捕获单元的 watermark: +* 格式: +* ic wm +* 示例: +* MSH >ic wm 3 11 (设置 ic3 的 watermark 为 11) +* 4)清除捕获单元的捕获数据: +* 格式: +* ic clr +* 示例: +* MSH >ic clr 3 (清除 ic3 的捕获数据) +* 5)显示命令的使用方法说明: +* 格式: +* ic +* 示例: +* MSH >ic +*/ + +#include +#include +#include +#include + +#define MSH_USAGE_IC_OPEN " ic open - e.g., open ic3: ic open 3 \n" +#define MSH_USAGE_IC_CLOSE " ic close - e.g., close ic3: ic close 3\n" +#define MSH_USAGE_IC_SET_WM " ic wm - e.g., set warter mark of ic3 to 11: ic wm 3 11\n" +#define MSH_USAGE_IC_CLR " ic clr - e.g., clear data buffer of ic3: ic clr 3 \n" + +#if defined (HC32F4A0) + #define IC_DEV_CNT (8) +#elif defined (HC32F460) + #define IC_DEV_CNT (3) +#endif +#define IC_NAME_LEN (3) +#define DEFAULT_WATER_MARK (5) + +#ifdef BSP_USING_INPUT_CAPTURE + +typedef struct +{ + rt_device_t ic_dev; + rt_sem_t rx_sem; + rt_mutex_t mutex; + __IO rt_size_t ic_data_size; + rt_thread_t thread; +} test_ic_t; + +static test_ic_t g_arr_test_ic[IC_DEV_CNT] = {0}; + +static int32_t _get_test_id(rt_device_t ic_dev) +{ + for (int i = 0; i < IC_DEV_CNT; i++) + { + if (ic_dev == g_arr_test_ic[i].ic_dev) + { + return i; + } + } + + return -1; +} + +static rt_err_t ic_rx_all(rt_device_t dev, rt_size_t size) +{ + uint32_t id = _get_test_id(dev); + + g_arr_test_ic[id].ic_data_size = size; + rt_sem_release((g_arr_test_ic[id].rx_sem)); + + return RT_EOK; +} + +static void ic_rx_thread(void *parameter) +{ + rt_size_t size; + rt_device_t ic_dev; + rt_uint32_t id = *(uint32_t *)parameter; + test_ic_t *p_test_ic = &g_arr_test_ic[id]; + ic_dev = p_test_ic->ic_dev; + struct rt_inputcapture_data *pData = RT_NULL; + struct rt_inputcapture_data *pItem = RT_NULL; + int i = 0; + while (1) + { + rt_sem_take((p_test_ic->rx_sem), RT_WAITING_FOREVER); + pData = (struct rt_inputcapture_data *)rt_malloc(sizeof(struct rt_inputcapture_data) * p_test_ic->ic_data_size); + if (pData) + { + rt_mutex_take(p_test_ic->mutex, RT_WAITING_FOREVER); + size = rt_device_read(ic_dev, 0, pData, p_test_ic->ic_data_size); + rt_mutex_release(p_test_ic->mutex); + if (size == 0) + { + rt_free(pData); + pData = RT_NULL; + continue; + } + rt_kprintf("ic%d captured %d data:\n", id + 1, size); + for (i = 0; i < size; i++) + { + pItem = pData + i; + rt_kprintf("%d : h = %d, w =%d\n", i, pItem->is_high, pItem->pulsewidth_us); + } + rt_free(pData); + pData = RT_NULL; + } + rt_kprintf("-------------------\n"); + + } +} + +static rt_int32_t _ic_test_open(rt_int32_t id) +{ + rt_err_t ret = RT_EOK; + uint32_t def_wm = DEFAULT_WATER_MARK; + rt_device_t ic_dev; + + + char ic_name[IC_NAME_LEN] = "ic"; + ic_name[IC_NAME_LEN - 1] = 0x30 + id + 1; + + ic_dev = rt_device_find(ic_name); + RT_ASSERT(ic_dev != RT_NULL); + g_arr_test_ic[id].ic_dev = ic_dev; + g_arr_test_ic[id].rx_sem = rt_sem_create(ic_name, 0, RT_IPC_FLAG_FIFO); + g_arr_test_ic[id].mutex = rt_mutex_create(ic_name, RT_IPC_FLAG_FIFO); + + ret = rt_device_init(ic_dev); + RT_ASSERT(ret == RT_EOK); + rt_device_set_rx_indicate(ic_dev, ic_rx_all); + + g_arr_test_ic[id].thread = rt_thread_create(ic_name, ic_rx_thread, &id, 2048, 5, 10); + RT_ASSERT(g_arr_test_ic[id].thread != RT_NULL); + rt_thread_startup(g_arr_test_ic[id].thread); + + ret = rt_device_open(ic_dev, 0); + RT_ASSERT(ret == RT_EOK); + ret = rt_device_control(ic_dev, INPUTCAPTURE_CMD_SET_WATERMARK, &def_wm); + RT_ASSERT(ret == RT_EOK); + + return RT_EOK; +} + +static rt_int32_t _ic_test_close(rt_int32_t id) +{ + rt_err_t ret = RT_EOK; + + ret = rt_device_close(g_arr_test_ic[id].ic_dev); + RT_ASSERT(ret == RT_EOK); + rt_sem_delete(g_arr_test_ic[id].rx_sem); + rt_mutex_delete(g_arr_test_ic[id].mutex); + rt_thread_delete(g_arr_test_ic[id].thread); + rt_memset(&g_arr_test_ic[id], 0, sizeof(test_ic_t)); + + return RT_EOK; +} + +static rt_int32_t _ic_ctrl(rt_int32_t id, rt_int32_t cmd, char *param) +{ + rt_err_t ret = RT_EOK; + uint32_t int_param = (param == RT_NULL) ? 0 : atoi(param); + + rt_mutex_take(g_arr_test_ic[id].mutex, RT_WAITING_FOREVER); + ret = rt_device_control(g_arr_test_ic[id].ic_dev, cmd, &int_param); + rt_mutex_release(g_arr_test_ic[id].mutex); + + return ret; +} + +static rt_err_t _msh_cmd_parse_unit(char *n, uint32_t *u_out) +{ + rt_err_t result = -RT_ERROR; + uint32_t u_temp = atoi(n) - 1; + if (u_temp >= IC_DEV_CNT) + { + rt_kprintf("param error: channel exceed max value %d \n", IC_DEV_CNT); + return result; + } + *u_out = u_temp; + + return RT_EOK; +} + +void _show_usage(void) +{ + rt_kprintf("Usage: \n"); + rt_kprintf(MSH_USAGE_IC_OPEN); + rt_kprintf(MSH_USAGE_IC_CLOSE); + rt_kprintf(MSH_USAGE_IC_SET_WM); + rt_kprintf(MSH_USAGE_IC_CLR); +} + +static rt_int32_t ic(int argc, char *argv[]) +{ + uint32_t id = 0; + + if (argc == 1) + { + _show_usage(); + return 0; + } + + switch (argc) + { + case 1: + _show_usage(); + return 0; + + case 3: + case 4: + if (_msh_cmd_parse_unit(argv[2], &id) != RT_EOK) + { + return 0; + } + if (!rt_strcmp(argv[1], "open")) + { + if (g_arr_test_ic[id].ic_dev != RT_NULL) + { + return 0; + } + _ic_test_open(id); + break; + } + + if (g_arr_test_ic[id].ic_dev == RT_NULL) + { + return 0; + } + if (!rt_strcmp(argv[1], "close")) + { + _ic_test_close(id); + } + else if (!rt_strcmp(argv[1], "wm")) + { + _ic_ctrl(id, INPUTCAPTURE_CMD_SET_WATERMARK, argv[3]); + } + else if (!rt_strcmp(argv[1], "clr")) + { + _ic_ctrl(id, INPUTCAPTURE_CMD_CLEAR_BUF, RT_NULL); + } + else + { + rt_kprintf("usage error, input \"ic\" to show cmd info\n"); + return 0; + } + break; + default: + rt_kprintf("usage error, input \"ic\" to show cmd info\n"); + return 0; + } + + rt_kprintf("done \n"); + + return 0; +} + + +MSH_CMD_EXPORT(ic, ic [opt]) +#endif +/* + EOF +*/ diff --git a/bsp/hc32/tests/test_uart_v1.c b/bsp/hc32/tests/test_uart_v1.c new file mode 100644 index 00000000000..10b9f7e024d --- /dev/null +++ b/bsp/hc32/tests/test_uart_v1.c @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是一个 串口 设备使用例程 + * 例程导出了 uart_sample_v1 命令到控制终端 + * 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备(uart1) + * 程序功能:通过串口输出字符串: + * drv_usart: drv_usart_v1 + * commnucation:using DMA/interrupt, + * uart_ch: uartx (x对应测试通道) + * 输出输入的字符 + * + * 修改rtconfig.h + * #define RT_SERIAL_USING_DMA + * #define BSP_USING_UART + * #define BSP_USING_UART1 + * #define BSP_UART1_RX_USING_DMA + * #define BSP_UART1_TX_USING_DMA + * #define BSP_USING_UART2 + * #define BSP_UART2_RX_USING_DMA + * #define BSP_UART2_TX_USING_DMA + * #define BSP_USING_UART5 + * + * 命令调用格式: + * uart1 中断,命令调用格式:uart_sample_v1 uart1 int + * uart1 DMA,命令调用格式:uart_sample_v1 uart1 dma + */ + +#include +#include + +#if defined(HC32F460) && defined(BSP_USING_UART2) + #define SAMPLE_DEFAULT_UART_NAME "uart2" +#elif defined(HC32F4A0) && defined (BSP_USING_UART6) + #define SAMPLE_DEFAULT_UART_NAME "uart6" +#elif defined(HC32F448) && defined (BSP_USING_UART1) + #define SAMPLE_DEFAULT_UART_NAME "uart1" +#elif defined(HC32F472) && defined (BSP_USING_UART1) + #define SAMPLE_DEFAULT_UART_NAME "uart1" +#endif + +#if defined(SAMPLE_DEFAULT_UART_NAME) + +/* 串口接收消息结构*/ +struct rx_msg +{ + rt_device_t dev; + rt_size_t size; +}; + +/* 消息队列控制块 */ +static struct rt_messagequeue rx_mq; + +/* 用于接收消息的信号量 */ +static struct rt_semaphore rx_sem; + +static rt_device_t serial; +static struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + +/* DMA接收数据回调函数 */ +static rt_err_t uart_input_dma(rt_device_t dev, rt_size_t size) +{ + struct rx_msg msg; + rt_err_t result; + + msg.dev = dev; + msg.size = size; + + result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); + if (result == -RT_EFULL) + { + /* 消息队列满 */ + rt_kprintf("message queue full!\n"); + } + return result; +} + +/* INT接收数据回调函数 */ +static rt_err_t uart_input_int(rt_device_t dev, rt_size_t size) +{ + /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ + rt_sem_release(&rx_sem); + + return RT_EOK; +} + +/* 发送完成回调函数 */ +static rt_err_t uart_ouput(rt_device_t dev, void *buffer) +{ + return RT_EOK; +} + +static void serial_thread_entry_dma(void *parameter) +{ + struct rx_msg msg; + rt_err_t result; + rt_uint32_t rx_length; + static char rx_buffer[256]; + static rt_uint32_t buf_size = sizeof(rx_buffer); + static rt_uint32_t put_index = 0; + + while (1) + { + rt_memset(&msg, 0, sizeof(msg)); + /* 从消息队列中读取消息*/ + result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); + if (result > 0U) + { + /* 从串口读取数据*/ + while (msg.size) + { + if (msg.size > (buf_size - put_index)) + { + rx_length = rt_device_read(msg.dev, 0, rx_buffer + put_index, buf_size - put_index); + msg.size -= rx_length; + } + else + { + rx_length = rt_device_read(msg.dev, 0, rx_buffer + put_index, msg.size); + msg.size = 0UL; + } + rt_device_write(serial, 0, rx_buffer + put_index, rx_length); + put_index += rx_length; + put_index %= sizeof(rx_buffer); + } + } + } +} + +static void serial_thread_entry_int(void *parameter) +{ + char ch; + + while (1) + { + /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ + while (rt_device_read(serial, -1, &ch, 1) != 1) + { + /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + } + /* 读取到的数据通过串口错位输出 */ + rt_device_write(serial, 0, &ch, 1); + } +} + +int uart_sample_v1(int argc, char *argv[]) +{ + rt_thread_t thread; + rt_err_t ret = RT_EOK; + rt_size_t n; + rt_err_t open_flag = 0UL; + static char uart_name[RT_NAME_MAX]; + static char comm_mode[RT_NAME_MAX]; + const static char comm_mode_int[] = "int"; + const static char comm_mode_dma[] = "dma"; + const static char comm_info_dma[] = "\r\n drv_version: drv_usart_v1 \r\n communication: using DMA \r\n uart_ch: "; + const static char comm_info_int[] = "\r\n drv_version: drv_usart_v1 \r\n communication: using interrupt \r\n uart_ch: "; + static char comm_info[150]; + + rt_memset(uart_name, 0, sizeof(uart_name)); + rt_memset(comm_mode, 0, sizeof(comm_mode)); + + if (argc == 1) + { + rt_strncpy(uart_name, SAMPLE_DEFAULT_UART_NAME, RT_NAME_MAX); + rt_strncpy(comm_mode, comm_mode_int, sizeof(comm_mode_int)); + } + else if (argc == 2) + { + rt_strncpy(uart_name, argv[1], RT_NAME_MAX); + rt_strncpy(comm_mode, comm_mode_int, sizeof(comm_mode_int)); + } + else if (argc == 3) + { + rt_strncpy(uart_name, argv[1], RT_NAME_MAX); + rt_strncpy(comm_mode, argv[2], RT_NAME_MAX); + } + else + { + rt_kprintf("argc error!\n"); + return -RT_ERROR; + } + + /* 查找系统中的串口设备 */ + serial = rt_device_find(uart_name); + if (!serial) + { + rt_kprintf("find %s failed!\n", uart_name); + return -RT_ERROR; + } + + /* modify configure */ + config.baud_rate = BAUD_RATE_115200; //baudrate 115200 + config.data_bits = DATA_BITS_8; //data bit 8 + config.stop_bits = STOP_BITS_1; //stop bit 1 + config.parity = PARITY_NONE; + rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); + + if (0 == rt_strncmp(comm_mode, comm_mode_dma, 3)) + { + static char msg_pool[256U]; + /* 初始化消息队列 */ + rt_mq_init(&rx_mq, "rx_mq", + msg_pool, /* 存放消息的缓冲区 */ + sizeof(struct rx_msg), /* 一条消息的最大长度 */ + sizeof(msg_pool), /* 存放消息的缓冲区大小 */ + RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ + + /* 以DMA接收和发送模式打开串口设备 */ + open_flag |= RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX; + rt_device_open(serial, open_flag); + + /* 设置回调函数 */ + rt_device_set_rx_indicate(serial, uart_input_dma); + rt_device_set_tx_complete(serial, uart_ouput); + + /* 发送字符串 */ + n = rt_strlen(comm_info_dma); + rt_strncpy(comm_info, comm_info_dma, n); + rt_strncpy(comm_info + n, uart_name, rt_strlen(uart_name)); + rt_device_write(serial, 0, comm_info, rt_strlen(comm_info)); + + /* 创建 serial 线程 */ + thread = rt_thread_create("serial", serial_thread_entry_dma, RT_NULL, 1024, 25, 10); + } + else if (0 == rt_strncmp(comm_mode, comm_mode_int, 3)) + { + /* 以中断模式打开串口设备 */ + open_flag = RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX; + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + + rt_device_open(serial, open_flag); + + /* 设置回调函数 */ + rt_device_set_rx_indicate(serial, uart_input_int); + rt_device_set_tx_complete(serial, uart_ouput); + + /* 发送字符串 */ + n = rt_strlen(comm_info_int); + rt_strncpy(comm_info, comm_info_int, n); + rt_strncpy(comm_info + n, uart_name, rt_strlen(uart_name)); + rt_device_write(serial, 0, comm_info, rt_strlen(comm_info)); + + /* 创建 serial 线程 */ + thread = rt_thread_create("serial", serial_thread_entry_int, RT_NULL, 1024, 25, 10); + } + else + { + rt_kprintf("communication mode error, please input cmd: uart_sample_v1 %s int or uart_sample_v1 uartx dma!\n", uart_name); + return -RT_ERROR; + } + + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + ret = -RT_ERROR; + } + + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(uart_sample_v1, uart device sample); + +#endif diff --git a/bsp/hc32/tests/test_uart_v2.c b/bsp/hc32/tests/test_uart_v2.c new file mode 100644 index 00000000000..02e5169ef60 --- /dev/null +++ b/bsp/hc32/tests/test_uart_v2.c @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是一个串口设备 + * 例程导出了 uart_sample_v2 命令到控制终端 + * 程序功能:通过串口输出字符串 "hello RT-Thread!",并通过串口输出接收到的数据,然后打印接收到的数据。 + * + * 中断方式,rtconfig.h修改如下 + * #define BSP_USING_GPIO + * #define BSP_USING_UART + * #define BSP_USING_UART1 + * //#define BSP_UART1_RX_USING_DMA + * //#define BSP_UART1_TX_USING_DMA + * #define BSP_UART1_RX_BUFSIZE 256 + * #define BSP_UART1_TX_BUFSIZE 256 + * #define BSP_USING_UART2 + * #define BSP_UART2_RX_USING_DMA + * #define BSP_UART2_TX_USING_DMA + * #define BSP_UART2_RX_BUFSIZE 256 + * #define BSP_UART2_TX_BUFSIZE 0 + * #define BSP_USING_UART5 + * //#define BSP_UART5_RX_USING_DMA + * //#define BSP_UART5_TX_USING_DMA + * #define BSP_UART5_RX_BUFSIZE 256 + * #define BSP_UART5_TX_BUFSIZE 256 + * + * DMA方式,rtconfig.h修改如下 + * #define BSP_USING_GPIO + * #define BSP_USING_UART + * #define BSP_USING_UART1 + * #define BSP_UART1_RX_USING_DMA + * #define BSP_UART1_TX_USING_DMA + * #define BSP_UART1_RX_BUFSIZE 256 + * #define BSP_UART1_TX_BUFSIZE 256 + * #define BSP_USING_UART2 + * #define BSP_UART2_RX_USING_DMA + * #define BSP_UART2_TX_USING_DMA + * #define BSP_UART2_RX_BUFSIZE 256 + * #define BSP_UART2_TX_BUFSIZE 0 + * #define BSP_USING_UART5 + * #define BSP_UART5_RX_USING_DMA + * #define BSP_UART5_TX_USING_DMA + * #define BSP_UART5_RX_BUFSIZE 256 + * #define BSP_UART5_TX_BUFSIZE 256 + * + * 命令调用格式: + * uart1 中断,命令调用格式:uart_sample_v2 uart1 int + * uart1 DMA,命令调用格式:uart_sample_v2 uart1 dma + */ + +#include +#include + +#if defined(HC32F460) && defined(BSP_USING_UART2) + #define SAMPLE_DEFAULT_UART_NAME "uart2" +#elif defined(HC32F4A0) && defined (BSP_USING_UART6) + #define SAMPLE_DEFAULT_UART_NAME "uart6" +#elif defined(HC32F448) && defined (BSP_USING_UART1) + #define SAMPLE_DEFAULT_UART_NAME "uart1" +#elif defined(HC32F472) && defined (BSP_USING_UART1) + #define SAMPLE_DEFAULT_UART_NAME "uart1" +#endif + +#if defined(SAMPLE_DEFAULT_UART_NAME) + +/* 串口接收消息结构 */ +struct rx_msg +{ + rt_device_t dev; + rt_size_t size; +}; +/* 串口设备句柄 */ +static rt_device_t serial; +/* 消息队列控制块 */ +static struct rt_messagequeue rx_mq; + +/* 用于接收消息的信号量 */ +static struct rt_semaphore rx_sem; + +static rt_device_t serial; +static struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + +/* DMA接收数据回调函数 */ +static rt_err_t uart_input_dma(rt_device_t dev, rt_size_t size) +{ + struct rx_msg msg; + rt_err_t result; + msg.dev = dev; + msg.size = size; + + result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); + if (result == -RT_EFULL) + { + /* 消息队列满 */ + rt_kprintf("message queue full!\n"); + } + return result; +} + +/* INT接收数据回调函数 */ +static rt_err_t uart_input_int(rt_device_t dev, rt_size_t size) +{ + /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ + rt_sem_release(&rx_sem); + + return RT_EOK; +} + +/* 发送完成回调函数 */ +static rt_err_t uart_ouput(rt_device_t dev, void *buffer) +{ + return RT_EOK; +} + +static void serial_thread_entry_dma(void *parameter) +{ + struct rx_msg msg; + rt_err_t result; + rt_uint32_t rx_length; + static char rx_buffer[256]; + static rt_uint32_t buf_size = sizeof(rx_buffer); + static rt_uint32_t put_index = 0; + + while (1) + { + rt_memset(&msg, 0, sizeof(msg)); + /* 从消息队列中读取消息 */ + result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); + if (result > 0UL) + { + while (msg.size) + { + if (msg.size > (buf_size - put_index)) + { + rx_length = rt_device_read(msg.dev, 0, rx_buffer + put_index, buf_size - put_index); + msg.size -= rx_length; + } + else + { + rx_length = rt_device_read(msg.dev, 0, rx_buffer + put_index, msg.size); + msg.size = 0UL; + } + rt_device_write(serial, 0, rx_buffer + put_index, rx_length); + put_index += rx_length; + put_index %= sizeof(rx_buffer); + } + } + } +} + +static void serial_thread_entry_int(void *parameter) +{ + char ch; + + while (1) + { + /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ + while (rt_device_read(serial, -1, &ch, 1) != 1) + { + /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + } + /* 读取到的数据通过串口错位输出 */ + rt_device_write(serial, 0, &ch, 1); + } +} + +int uart_sample_v2(int argc, char *argv[]) +{ + rt_thread_t thread; + rt_err_t ret = RT_EOK; + rt_size_t n; + rt_err_t open_flag = 0UL; + static char uart_name[RT_NAME_MAX]; + static char comm_mode[RT_NAME_MAX]; + const static char comm_mode_int[] = "int"; + const static char comm_mode_dma[] = "dma"; + const static char comm_info_dma[] = "\r\n drv_version: drv_usart_v2 \r\n communication: using DMA \r\n uart_ch: "; + const static char comm_info_int[] = "\r\n drv_version: drv_usart_v2 \r\n communication: using interrupt \r\n uart_ch: "; + static char comm_info[150]; + + rt_memset(uart_name, 0, sizeof(uart_name)); + rt_memset(comm_mode, 0, sizeof(comm_mode)); + + if (argc == 1) + { + rt_strncpy(uart_name, SAMPLE_DEFAULT_UART_NAME, RT_NAME_MAX); + rt_strncpy(comm_mode, comm_mode_int, sizeof(comm_mode_int)); + } + else if (argc == 2) + { + rt_strncpy(uart_name, argv[1], RT_NAME_MAX); + rt_strncpy(comm_mode, comm_mode_int, sizeof(comm_mode_int)); + } + else if (argc == 3) + { + rt_strncpy(uart_name, argv[1], RT_NAME_MAX); + rt_strncpy(comm_mode, argv[2], RT_NAME_MAX); + } + else + { + rt_kprintf("argc error!\n"); + return -RT_ERROR; + } + + /* 查找串口设备 */ + serial = rt_device_find(uart_name); + if (!serial) + { + rt_kprintf("find %s failed!\n", uart_name); + return -RT_ERROR; + } + + /* modify configure */ + config.baud_rate = BAUD_RATE_115200; //baudrate 115200 + config.data_bits = DATA_BITS_8; //data bit 8 + config.stop_bits = STOP_BITS_1; //stop bit 1 + config.parity = PARITY_NONE; + rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); + + if (0 == rt_strncmp(comm_mode, comm_mode_dma, 3)) + { + static char msg_pool[256U]; + /* 初始化消息队列 */ + rt_mq_init(&rx_mq, "rx_mq", + msg_pool, /* 存放消息的缓冲区 */ + sizeof(struct rx_msg), /* 一条消息的最大长度 */ + sizeof(msg_pool), /* 存放消息的缓冲区大小 */ + RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ + + /* 以DMA接收和发送模式打开串口设备 */ + open_flag |= RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX; + rt_device_open(serial, open_flag); + + /* 设置回调函数 */ + rt_device_set_rx_indicate(serial, uart_input_dma); + rt_device_set_tx_complete(serial, uart_ouput); + + /* 发送字符串 */ + n = rt_strlen(comm_info_dma); + rt_strncpy(comm_info, comm_info_dma, n); + rt_strncpy(comm_info + n, uart_name, rt_strlen(uart_name)); + rt_device_write(serial, 0, comm_info, rt_strlen(comm_info)); + + /* 创建 serial 线程 */ + thread = rt_thread_create("serial", serial_thread_entry_dma, RT_NULL, 1024, 25, 10); + } + else if (0 == rt_strncmp(comm_mode, comm_mode_int, 3)) + { + /* 以中断模式打开串口设备 */ + open_flag = RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX; + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + + rt_device_open(serial, open_flag); + + /* 设置回调函数 */ + rt_device_set_rx_indicate(serial, uart_input_int); + rt_device_set_tx_complete(serial, uart_ouput); + + /* 发送字符串 */ + n = rt_strlen(comm_info_int); + rt_strncpy(comm_info, comm_info_int, n); + rt_strncpy(comm_info + n, uart_name, rt_strlen(uart_name)); + rt_device_write(serial, 0, comm_info, rt_strlen(comm_info)); + + /* 创建 serial 线程 */ + thread = rt_thread_create("serial", serial_thread_entry_int, RT_NULL, 1024, 25, 10); + } + else + { + rt_kprintf("communication mode error, please input cmd: uart_sample_v2 %s int or uart_sample_v1 uartx dma!\n", uart_name); + return -RT_ERROR; + } + + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + ret = -RT_ERROR; + } + + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(uart_sample_v2, uart device sample); + +#endif diff --git a/bsp/hc32/tests/test_usbd.c b/bsp/hc32/tests/test_usbd.c new file mode 100644 index 00000000000..11cb23851fd --- /dev/null +++ b/bsp/hc32/tests/test_usbd.c @@ -0,0 +1,332 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +#include +#include + +#ifdef RT_USB_DEVICE_CDC +/* menuconfig: + 1.Hardware Drivers Config--->On-Chip Peripheral Driver--->Enable USB---> + [*]Use USBFS Core + Select USB Mode(USB Device Mode) + [*]Enable VBUS Sensing for Device + 2.RT-Thread Components---> + Using USB legacy version---> + Using USB device--->Device type---> + [*]Enable to use device as CDC device +*/ +/* + * 程序清单:这是一个 usb device 设备使用例程 + * 例程导出了 cdc_sample 命令到控制终端 + * PC上需要使用串口助手以DTR[√]方式打开USB的虚拟串口(比如 SSCOM 有这个功能) + * 命令调用格式:cdc_sample + * 程序功能:首先会打印三次str_write字符串内容,同时虚拟串口可输入发送任意小于255个字符的字符串, + * 发送内容可在Finsh串口显示。 + */ + +#define USBD_DEV_NAME "vcom" /* 名称 */ +rt_uint8_t str_read[255]; + +static rt_err_t cdc_rx_handle(rt_device_t dev, rt_size_t size) +{ + /* 读取虚拟串口接收内容 */ + rt_device_read(dev, 0, str_read, size); + rt_kprintf("Read message: %s\n", str_read); + + return RT_EOK; +} + +static int cdc_sample(void) +{ + rt_uint8_t i; + rt_err_t ret = RT_EOK; + rt_device_t cdc_dev = RT_NULL; /* usb device设备句柄 */ + rt_uint8_t str_write[] = "This is a usb cdc device test!\r\n"; + + + /* 查找USB虚拟串口设备 */ + cdc_dev = rt_device_find(USBD_DEV_NAME); + if (cdc_dev == RT_NULL) + { + rt_kprintf("cdc sample run failed! can't find %s device!\n", USBD_DEV_NAME); + return -RT_ERROR; + } + + /* 以读写方式打开设备 */ + ret = rt_device_open(cdc_dev, RT_DEVICE_FLAG_INT_RX); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", USBD_DEV_NAME); + return ret; + } + rt_device_set_rx_indicate(cdc_dev, cdc_rx_handle); + + for (i = 1; i < 4; i++) + { + rt_kprintf("Start to send test message 3 timers :%d.\n", i); + if (rt_device_write(cdc_dev, 0, str_write, sizeof(str_write)) != sizeof(str_write)) + { + rt_kprintf("send test message failed\n"); + return -RT_ERROR; + } + /* 延时1000ms */ + rt_thread_mdelay(1000); + } + + // for (;;); + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(cdc_sample, usbd cdc sample); +#endif + + +#if defined(RT_USB_DEVICE_MSTORAGE) + +/* F4A0 only FS can used with spi flash */ +#if (defined(HC32F4A0) && defined(BSP_USING_USBFS)) || \ + defined(HC32F460) || defined(HC32F472) + +/* Enable spibus1, SFUD, usb msc */ +/* menuconfig: +1. Hardware Drivers Config--->On-Chip Peripheral Driver--->Enable SPI BUS--->Enable SPI1 BUS +2. Hardware Drivers Config--->On-Chip Peripheral Driver--->Enable USB---> + [*]Use USBFS Core + Select USB Mode(USB Device Mode) + [*]Enable VBUS Sensing for Device +3. RT-Thread Components--->Device Drivers--->Using SPI Bus/Device device drivers + [*]Using Serial Flash Universal Driver + [*]Using auto probe flash JEDEC SFDP parameters + [*]Using defined supported flash chip information table + (50000000)Default spi maximum speed(HZ) +4. RT-Thread Components--->Using USB legacy version + [*]Using USB device---> + Device type--->...Mass Storage device + (spiflash)msc class disk name + +*/ +#include "drv_gpio.h" +#include "drv_spi.h" +#include "dev_spi_flash_sfud.h" + +#define SPI_FLASH_CHIP RT_USB_MSTORAGE_DISK_NAME /* msc class disk name */ +#if defined(HC32F4A0) + #define SPI_FLASH_SS_PORT GPIO_PORT_C + #define SPI_FLASH_SS_PIN GPIO_PIN_07 + #define SPI_BUS_NAME "spi1" + #define SPI_FLASH_DEVICE_NAME "spi10" +#elif defined(HC32F460) + #define SPI_FLASH_SS_PORT GPIO_PORT_C + #define SPI_FLASH_SS_PIN GPIO_PIN_07 + #define SPI_BUS_NAME "spi3" + #define SPI_FLASH_DEVICE_NAME "spi30" +#elif defined(HC32F472) + #define SPI_FLASH_SS_PORT GPIO_PORT_B + #define SPI_FLASH_SS_PIN GPIO_PIN_12 + #define SPI_BUS_NAME "spi1" + #define SPI_FLASH_DEVICE_NAME "spi10" +#endif + +static void rt_hw_spi_flash_reset(char *spi_dev_name) +{ + struct rt_spi_device *spi_dev_w25; + rt_uint8_t w25_en_reset = 0x66; + rt_uint8_t w25_reset_dev = 0x99; + + spi_dev_w25 = (struct rt_spi_device *)rt_device_find(spi_dev_name); + if (!spi_dev_w25) + { + rt_kprintf("Can't find %s device!\n", spi_dev_name); + } + else + { + rt_spi_send(spi_dev_w25, &w25_en_reset, 1U); + rt_spi_send(spi_dev_w25, &w25_reset_dev, 1U); + DDL_DelayMS(1U); + rt_kprintf("Reset ext flash!\n"); + } +} + + +static int rt_hw_spi_flash_with_sfud_init(void) +{ +#if defined(HC32F4A0) || defined(HC32F460) + rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_FLASH_DEVICE_NAME, GET_PIN(C, 7)); +#elif defined(HC32F472) + rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_FLASH_DEVICE_NAME, GET_PIN(B, 12)); +#endif + if (RT_NULL == rt_sfud_flash_probe(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME)) + { + rt_hw_spi_flash_reset(SPI_FLASH_DEVICE_NAME); + if (RT_NULL == rt_sfud_flash_probe(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME)) + { + return -RT_ERROR; + } + } + + return RT_EOK; +} +INIT_COMPONENT_EXPORT(rt_hw_spi_flash_with_sfud_init); +#endif + +#endif + +#ifdef RT_USB_DEVICE_HID +#include "drv_gpio.h" + +/* menuconfig: +1. Hardware Drivers Config--->On-Chip Peripheral Driver--->Enable USB---> + [*]Use USBFS Core + Select USB Mode(USB Device Mode) + [*]Enable VBUS Sensing for Device +2. RT-Thread Components---> + Using USB legacy version---> + Using USB device--->Device type---> + [*]Enable to use device as HID device +*/ +/* + * 程序清单:这是一个 usb hid device 设备使用例程 + * 例程导出了 hid_sample 命令到控制终端 + * 命令调用格式:hid_sample + * 程序功能:首先会打印str_write[0]字符串内容,然后按下按键WKUP,hid设备将发送按键keyn,n是按下次数,可 + * 通过bus hound查看数据。 + * 发送内容可在Finsh串口显示。 +*/ + +#define USBD_DEV_NAME "hidd" /* 名称 */ +#if defined(HC32F4A0) + #define KEY_PIN_NUM GET_PIN(A,0) /* PA0 */ +#elif defined(HC32F460) + #define KEY_PIN_NUM GET_PIN(B,1) /* PB1 */ +#elif defined(HC32F472) + #define KEY_PIN_NUM GET_PIN(B,5) /* PB5 */ +#endif + +static int hid_sample(void) +{ + rt_err_t ret = RT_EOK; + rt_device_t hid_dev = RT_NULL; /* usb device设备句柄 */ + char str_write[2][5] = {"test", "Key0"}; + + + /* 查找设备 */ + hid_dev = rt_device_find(USBD_DEV_NAME); + if (hid_dev == RT_NULL) + { + rt_kprintf("hid sample run failed! can't find %s device!\n", USBD_DEV_NAME); + return -RT_ERROR; + } + + /* 以收中断方式打开设备 */ + ret = rt_device_open(hid_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", USBD_DEV_NAME); + return ret; + } + + rt_kprintf("This is a usb hid device test!\r\n"); + rt_device_write(hid_dev, 0, str_write[0], sizeof(str_write[0])); + rt_pin_mode(KEY_PIN_NUM, PIN_MODE_INPUT); + + for (;;) + { + rt_thread_mdelay(200); + if (PIN_LOW == rt_pin_read(KEY_PIN_NUM)) + { + rt_device_write(hid_dev, 0, str_write[1], sizeof(str_write[1])); + str_write[1][3] += 0x01; + } + } + + //return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(hid_sample, usbd hid sample); +#endif + +#ifdef RT_USB_DEVICE_WINUSB +/* menuconfig: +1. Hardware Drivers Config--->On-Chip Peripheral Driver--->Enable USB---> + [*]Use USBFS Core + Select USB Mode(USB Device Mode) + [*]Enable VBUS Sensing for Device +2. RT-Thread Components---> + Using USB legacy version---> + Using USB device--->Device type---> + [*]Enable to use device as winusb device +*/ +/* + * 程序清单:这是一个 usb WINUSB device 设备使用例程 + * RTT 的WINUSB Windows无法免驱,需要使用zadig安装winusb驱动程序(如设备管理器-通用串行总线设备-RTT Win USB已识别则不需要安装)。 + * 例程导出了 winusb_sample 命令到控制终端 + * 命令调用格式:winusb_sample + * 软件:llcom.exe + * 程序功能:MSH命令发送winusb_sample,运行测试程序。 + * 打开llcom.exe软件,选择小工具-WinUSB设备-选择对应RTT Win USB设备-打开-勾选Hex发送-发送数据。 + * 通过llcom.exe可发送bulk数据(100字符以内)到设备,设备收到后会回发给主机(llcom.exe),同时通过MSH终端显示收到的HEX数据。 + * 注意:1、llcom.exe中的GUID与驱动程序中设定保持一致(通过设备管理器选择RTT Win USB设备的属性来查看); + * 2、win_usb_read()函数中的UIO_REQUEST_READ_FULL改为UIO_REQUEST_READ_BEST,实现数据即读即取; + * 否则需要接满传入的size数量,才会回调接收函数。 + * + */ +#define WINUSB_DEV_NAME "winusb" /* 名称 */ +uint8_t str_read[100]; + +static rt_err_t winusb_rx_handle(rt_device_t dev, rt_size_t size) +{ + uint8_t i; + /* 读取定时器当前值 */ + rt_kprintf("Rx:"); + for (i = 0; i < size; i++) + { + rt_kprintf("%x", str_read[i]); + } + rt_kprintf("\r\n"); + rt_device_write(dev, 0, str_read, size); + /* prepare read config */ + rt_device_read(dev, 0, str_read, sizeof(str_read)); + return RT_EOK; +} + +static int winusb_sample(void) +{ + rt_err_t ret = RT_EOK; + rt_device_t winusb_dev = RT_NULL; /* usb device设备句柄 */ + + /* 查找设备 */ + winusb_dev = rt_device_find(WINUSB_DEV_NAME); + if (winusb_dev == RT_NULL) + { + rt_kprintf("winusb sample run failed! can't find %s device!\n", WINUSB_DEV_NAME); + return -RT_ERROR; + } + + /* 以读写方式打开设备 */ + ret = rt_device_open(winusb_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", WINUSB_DEV_NAME); + return ret; + } + rt_kprintf("Found and open success %s device!\n", WINUSB_DEV_NAME); + + ret = rt_device_set_rx_indicate(winusb_dev, winusb_rx_handle); + if (ret == RT_EOK) + { + /* prepare read config,set once,read once, */ + rt_device_read(winusb_dev, 0, str_read, sizeof(str_read)); + } + return ret; +} + +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(winusb_sample, usbd winusb sample); +#endif diff --git a/bsp/hc32/tests/test_usbh.c b/bsp/hc32/tests/test_usbh.c new file mode 100644 index 00000000000..c4877b59761 --- /dev/null +++ b/bsp/hc32/tests/test_usbh.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +#include +#include + +#if defined(RT_USING_USB_HOST) + +#ifdef RT_USBH_MSTORAGE + +/* menuconfig: + 1. Hardware Drivers Config ---> On-Chip Peripheral Drivers ---> Enable USB ---> + Select USB Mode (USB Host Mode) + [*] Enable Udisk Drivers --> + (/) Udisk mount dir + 2. RT-Thread Components ---> DFS: device virtual files system ---> + ...... + [*] Enable elm0chan fatfs + ...... + 3.如果命令执行不成功,需参考对应Board目录下的README.md文件(注意事项中的USB Host部分) + */ + +/* + * 程序清单:这是一个 usb host 读写U盘 使用例程 + * 例程导出了 usbh_readwrite 命令到控制终端 + * 命令调用格式:usbh_readwrite + * 软件:串口助手 + * 程序功能:MSH命令发送 usbh_readwrite,运行测试程序。通过文件系统的命令查看写入的文件,并进行读写删除等操作。 + * +*/ +#include +#include +#define TEST_FN "/test_usbh.c" +static char test_data[120], buffer[120]; + +void usbh_readwrite(const char *filename) +{ + int fd; + int index, length; + + fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0); + if (fd < 0) + { + rt_kprintf("open file for write failed\n"); + return; + } + + for (index = 0; index < sizeof(test_data); index ++) + { + test_data[index] = index + 27; + } + + length = write(fd, test_data, sizeof(test_data)); + if (length != sizeof(test_data)) + { + rt_kprintf("write data failed\n"); + close(fd); + return; + } + + close(fd); + + fd = open(TEST_FN, O_RDONLY, 0); + if (fd < 0) + { + rt_kprintf("check: open file for read failed\n"); + return; + } + + length = read(fd, buffer, sizeof(buffer)); + if (length != sizeof(buffer)) + { + rt_kprintf("check: read file failed\n"); + close(fd); + return; + } + + for (index = 0; index < sizeof(test_data); index ++) + { + if (test_data[index] != buffer[index]) + { + rt_kprintf("check: check data failed at %d\n", index); + close(fd); + return; + } + } + + rt_kprintf("usb host read/write udisk successful\r\n"); + + close(fd); +} + +MSH_CMD_EXPORT(usbh_readwrite, usb host read write test); + +#endif /* RT_USBH_MSTORAGE */ + +#ifdef RT_USBH_HID + +#endif /* RT_USBH_HID */ + +#ifdef RT_USBH_HID_MOUSE + +#endif /* RT_USBH_HID_MOUSE */ + +#ifdef RT_USBH_HID_KEYBOARD + +#endif /* RT_USBH_HID_KEYBOARD */ + +#endif /* RT_USING_USB_HOST */ diff --git a/bsp/hc32/tests/test_wdt.c b/bsp/hc32/tests/test_wdt.c new file mode 100644 index 00000000000..5827be269b7 --- /dev/null +++ b/bsp/hc32/tests/test_wdt.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-12-30 CDT first version + */ + +/* + * 程序清单:这是 WDT 设备使用例程 + * 例程导出了 wdt_sample 命令到控制终端。 + * 命令调用格式:wdt_sample set_timeout x + * 命令解释:x 对应的是超时时间,以实际计算的接近值为准 + * 终端先打印N次设置的超时,然后依次递减等待N秒后复位系统(N等于设置的超时秒数) + */ + +#include +#include +#include + +#ifdef BSP_USING_WDT_TMR + +#if defined(BSP_USING_WDT) + #define WDT_DEVICE_NAME "wdt" +#elif defined(BSP_USING_SWDT) + #define WDT_DEVICE_NAME "swdt" +#endif + +static rt_device_t wdg_dev; +static rt_uint32_t valid_timeout = 0; +static rt_uint32_t wdt_cnt = 0; + +static void idle_hook(void) +{ + if (wdt_cnt < valid_timeout) + { + /* Feed watch dog */ + rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL); + } +} + +static void _wdt_cmd_print_usage(void) +{ + rt_kprintf("wdt_sample [option]\n"); + rt_kprintf(" set_timeout: set wdt timeout(S)\n"); + rt_kprintf(" e.g. MSH >wdt_sample set_timeout 10\n"); +} + +static int wdt_sample(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + rt_uint32_t timeleft; + rt_uint32_t timeout = atoi(argv[2]); + + if (argc != 3) + { + _wdt_cmd_print_usage(); + return -RT_ERROR; + } + + if (!rt_strcmp("set_timeout", argv[1])) + { + wdg_dev = rt_device_find(WDT_DEVICE_NAME); + if (!wdg_dev) + { + rt_kprintf("find %s failed!\n", WDT_DEVICE_NAME); + return -RT_ERROR; + } + + ret = rt_device_init(wdg_dev); + if (ret != RT_EOK) + { + rt_kprintf("init %s failed!\n", WDT_DEVICE_NAME); + return -RT_ERROR; + } + + /* Set timeout (Unit:S) */ + ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout); + if (ret != RT_EOK) + { + rt_kprintf("set %s timeout failed!\n", WDT_DEVICE_NAME); + return -RT_ERROR; + } + + /* Get the time when it real effective */ + ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_GET_TIMEOUT, &valid_timeout); + if (ret != RT_EOK) + { + rt_kprintf("start %s failed!\n", WDT_DEVICE_NAME); + return -RT_ERROR; + } + rt_kprintf("valid_timeout = %d S\n", valid_timeout); + + /* Start WDT */ + ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); + if (ret != RT_EOK) + { + rt_kprintf("start %s failed!\n", WDT_DEVICE_NAME); + return -RT_ERROR; + } + + rt_thread_idle_sethook(idle_hook); + + for (;;) + { + rt_thread_mdelay(1000); + rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_GET_TIMELEFT, &timeleft); + rt_kprintf("timeleft = %d S\n", timeleft); + wdt_cnt++; + } + } + else + { + _wdt_cmd_print_usage(); + return -RT_ERROR; + } + + return ret; +} + +MSH_CMD_EXPORT(wdt_sample, wdt_sample [option]); + +#endif From 680333fc18b41d24c3da9ae736af9471aa03ff04 Mon Sep 17 00:00:00 2001 From: imcu Date: Thu, 16 Jan 2025 11:01:12 +0800 Subject: [PATCH 14/51] [bsp][cvitek] fix c906_little build warning in cache.c build warning: passing argument 1 of 'inv_icache_range' makes integer from pointer without a cast [-Wint-conversion] Analyze: The passed parameter type is void*, which is a pointer type, but the required type is uintptr_t, which is an integer type. Therefore, there will be a 'makes integer from pointer without a cast' warning. Solution: casting the void* pointer to uintptr_t, ensure that the function receives the correct type. Signed-off-by: zdtyuiop4444 --- bsp/cvitek/c906_little/board/cache.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bsp/cvitek/c906_little/board/cache.c b/bsp/cvitek/c906_little/board/cache.c index 8ca96365534..56ea9d49434 100644 --- a/bsp/cvitek/c906_little/board/cache.c +++ b/bsp/cvitek/c906_little/board/cache.c @@ -5,6 +5,7 @@ * * Change Logs: * Date Author Notes + * 2025/01/16 zdtyuiop4444 fix type cast warning * 2024/11/26 zdtyuiop4444 The first version */ @@ -33,10 +34,10 @@ inline void rt_hw_cpu_dcache_ops(int ops, void* addr, int size) switch (ops) { case RT_HW_CACHE_FLUSH: - flush_dcache_range(addr, size); + flush_dcache_range((uintptr_t)addr, size); break; case RT_HW_CACHE_INVALIDATE: - inv_dcache_range(addr, size); + inv_dcache_range((uintptr_t)addr, size); break; default: break; @@ -62,7 +63,7 @@ inline void rt_hw_cpu_icache_ops(int ops, void* addr, int size) switch (ops) { case RT_HW_CACHE_INVALIDATE: - inv_icache_range(addr, size); + inv_icache_range((uintptr_t)addr, size); break; default: break; From 9c164882e8bf301daafd3a357793af85af26169b Mon Sep 17 00:00:00 2001 From: zhujiale <945386260@qq.com> Date: Wed, 15 Jan 2025 14:07:21 +0800 Subject: [PATCH 15/51] fix when open samrt but using msh after run elf file the msh will down --- components/drivers/serial/serial_tty.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/drivers/serial/serial_tty.c b/components/drivers/serial/serial_tty.c index dae668a2ef8..b5c4549da29 100644 --- a/components/drivers/serial/serial_tty.c +++ b/components/drivers/serial/serial_tty.c @@ -131,7 +131,7 @@ static rt_err_t _serial_ty_bypass(struct rt_serial_device* serial, char ch,void rt_inline void _setup_serial(struct rt_serial_device* serial, lwp_tty_t tp, struct serial_tty_context *softc) { - rt_bypass_lower_register(serial, "tty",RT_BYPASS_PROTECT_LEVEL_1, _serial_ty_bypass,(void *)tp); + rt_bypass_lower_register(serial, "tty", RT_BYPASS_PROTECT_LEVEL_1, _serial_ty_bypass, (void *)tp); } rt_inline void _restore_serial(struct rt_serial_device *serial, lwp_tty_t tp, @@ -232,7 +232,7 @@ static void serial_tty_close(struct lwp_tty *tp) LOG_D("%s", __func__); - _restore_serial(serial, tp, softc); + rt_bypass_lower_unregister(serial, RT_BYPASS_PROTECT_LEVEL_1); rt_device_close(&serial->parent); } From 45bb1ddac9757b12d23b96c7b92cc7c28302e761 Mon Sep 17 00:00:00 2001 From: Evlers <1425295900@qq.com> Date: Sat, 4 Jan 2025 21:59:16 +0800 Subject: [PATCH 16/51] [components][netdev] add statistics and more inupt parameters to ping command --- components/net/netdev/src/netdev.c | 54 +++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 94f7613719a..f2998f158d8 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2019-03-18 ChenYong First version + * 2025-01-04 Evlers add statistics and more inupt parameters to ping command */ #include @@ -1286,7 +1287,7 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ struct netdev *netdev = RT_NULL; struct netdev_ping_resp ping_resp; - rt_uint32_t index; + rt_uint32_t index, received, loss, max_time, min_time, avg_time; int ret = 0; rt_bool_t isbind = RT_FALSE; @@ -1326,6 +1327,8 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ } } + max_time = avg_time = received = 0; + min_time = 0xFFFFFFFF; for (index = 0; index < times; index++) { int delay_tick = 0; @@ -1337,7 +1340,7 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ if (ret == -RT_ETIMEOUT) { rt_kprintf("ping: from %s icmp_seq=%d timeout\n", - (ip_addr_isany(&(ping_resp.ip_addr))) ? target_name : inet_ntoa(ping_resp.ip_addr), index); + (ip_addr_isany(&(ping_resp.ip_addr))) ? target_name : inet_ntoa(ping_resp.ip_addr), index + 1); } else if (ret == -RT_ERROR) { @@ -1350,13 +1353,23 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ if (ping_resp.ttl == 0) { rt_kprintf("%d bytes from %s icmp_seq=%d time=%d ms\n", - ping_resp.data_len, inet_ntoa(ping_resp.ip_addr), index, ping_resp.ticks); + ping_resp.data_len, inet_ntoa(ping_resp.ip_addr), index + 1, ping_resp.ticks); } else { rt_kprintf("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", - ping_resp.data_len, inet_ntoa(ping_resp.ip_addr), index, ping_resp.ttl, ping_resp.ticks); + ping_resp.data_len, inet_ntoa(ping_resp.ip_addr), index + 1, ping_resp.ttl, ping_resp.ticks); } + received += 1; + if (ping_resp.ticks > max_time) + { + max_time = ping_resp.ticks; + } + else if (ping_resp.ticks < min_time) + { + min_time = ping_resp.ticks; + } + avg_time += ping_resp.ticks; } /* if the response time is more than NETDEV_PING_DELAY, no need to delay */ @@ -1364,6 +1377,29 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ rt_thread_delay(delay_tick); } + /* print ping statistics */ + loss = (uint32_t)((1 - ((float)received) / index) * 100); + avg_time = (uint32_t)(avg_time / received); +#if NETDEV_IPV4 && NETDEV_IPV6 + if (IP_IS_V4_VAL(&ping_resp.ip_addr)) + { + rt_kprintf("\n--- %s ping statistics ---\n", inet_ntoa(*ip_2_ip4(&ping_resp.ip_addr))); + } + else + { + rt_kprintf("\n--- %s ping statistics ---\n", inet6_ntoa(*ip_2_ip6(&ping_resp.ip_addr))); + } +#elif NETDEV_IPV4 + rt_kprintf("\n--- %s ping statistics ---\n", inet_ntoa(ping_resp.ip_addr)); +#elif NETDEV_IPV6 + rt_kprintf("\n--- %s ping statistics ---\n", inet6_ntoa(ping_resp.ip_addr)); +#endif + rt_kprintf("%d packets transmitted, %d received, %d%% packet loss\n", index, received, loss); + if (received > 0) + { + rt_kprintf("minimum = %dms, maximum = %dms, average = %dms\n", min_time, max_time, avg_time); + } + return RT_EOK; } @@ -1371,7 +1407,7 @@ int netdev_ping(int argc, char **argv) { if (argc == 1) { - rt_kprintf("Please input: ping [netdev name]\n"); + rt_kprintf("Please input: ping [netdev name] [times] [data size]\n"); } else if (argc == 2) { @@ -1381,6 +1417,14 @@ int netdev_ping(int argc, char **argv) { netdev_cmd_ping(argv[1], argv[2], 4, 0); } + else if (argc == 4) + { + netdev_cmd_ping(argv[1], argv[2], atoi(argv[3]), 0); + } + else if (argc == 5) + { + netdev_cmd_ping(argv[1], argv[2], atoi(argv[3]), atoi(argv[4])); + } return 0; } From ed3222c2f8355ca55cd35640f4c417e7a31ad56a Mon Sep 17 00:00:00 2001 From: heyuanjie87 Date: Tue, 21 Jan 2025 13:01:58 +0800 Subject: [PATCH 17/51] =?UTF-8?q?[lwp]=E4=BF=AE=E6=AD=A3=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E6=96=87=E4=BB=B6=E5=90=8D=E6=9F=A5=E6=89=BE?= =?UTF-8?q?pid=E7=9A=84=E9=97=AE=E9=A2=98=20(#9935)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp_pid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index e45554434da..34285598dfb 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -813,7 +813,7 @@ pid_t lwp_name2pid(const char *name) if (lwp) { - process_name = strrchr(lwp->cmd, '/'); + process_name = strrchr(lwp->exe_file, '/'); process_name = process_name? process_name + 1: lwp->cmd; if (!rt_strncmp(name, process_name, RT_NAME_MAX)) { From 0800db1400f97b9ed8da43216189f596659b1357 Mon Sep 17 00:00:00 2001 From: Jamie <48308473+JamieTx@users.noreply.github.com> Date: Wed, 22 Jan 2025 07:43:46 +0800 Subject: [PATCH 18/51] Add pm driver for F472 and add lVD unlock in board_init --- bsp/hc32/ev_hc32f448_lqfp80/board/board.c | 2 +- bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c | 2 +- bsp/hc32/ev_hc32f472_lqfp100/board/board.c | 2 +- bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c | 2 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c | 2 +- bsp/hc32/libraries/hc32_drivers/drv_pm.c | 8 ++++++++ bsp/hc32/libraries/hc32_drivers/drv_pm.h | 2 +- bsp/hc32/tests/test_pm.c | 16 ++++++++-------- 8 files changed, 22 insertions(+), 14 deletions(-) diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board.c b/bsp/hc32/ev_hc32f448_lqfp80/board/board.c index 5e5aa64930c..3b821593e6d 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/board.c +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board.c @@ -15,7 +15,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM) /** System Base Configuration diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c index 49a8f4392d9..1e03c37f5ee 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c @@ -14,7 +14,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM) /** System Base Configuration diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/board.c b/bsp/hc32/ev_hc32f472_lqfp100/board/board.c index 6a82da8f95c..bb1fde8dbff 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/board.c +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/board.c @@ -15,7 +15,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG) /** System Base Configuration diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c index 54a661e0c03..d18b1402c57 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c @@ -14,7 +14,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM) /** System Base Configuration diff --git a/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c b/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c index 9f23f247f3b..c254a68b6ee 100644 --- a/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c +++ b/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/board.c @@ -13,7 +13,7 @@ /* unlock/lock peripheral */ #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \ - LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM) + LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD) #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM) #if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) diff --git a/bsp/hc32/libraries/hc32_drivers/drv_pm.c b/bsp/hc32/libraries/hc32_drivers/drv_pm.c index 00d2d2cc156..b9013b109d5 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_pm.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_pm.c @@ -108,6 +108,7 @@ static void _sleep_enter_deep(void) (void)PWC_STOP_Config(&sleep_deep_cfg.cfg); +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) if (PWC_PWRC2_DVS == (READ_REG8(CM_PWC->PWRC2) & PWC_PWRC2_DVS)) { CLR_REG8_BIT(CM_PWC->PWRC1, PWC_PWRC1_STPDAS); @@ -116,6 +117,7 @@ static void _sleep_enter_deep(void) { SET_REG8_BIT(CM_PWC->PWRC1, PWC_PWRC1_STPDAS); } +#endif PWC_STOP_Enter(sleep_deep_cfg.pwc_stop_type); } @@ -161,14 +163,20 @@ static void _run_switch_high_to_low(void) struct pm_run_mode_config st_run_mode_cfg = PM_RUN_MODE_CFG; st_run_mode_cfg.sys_clk_cfg(PM_RUN_MODE_LOW_SPEED); + +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) PWC_HighSpeedToLowSpeed(); +#endif } static void _run_switch_low_to_high(void) { struct pm_run_mode_config st_run_mode_cfg = PM_RUN_MODE_CFG; +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) PWC_LowSpeedToHighSpeed(); +#endif + st_run_mode_cfg.sys_clk_cfg(PM_RUN_MODE_HIGH_SPEED); } diff --git a/bsp/hc32/libraries/hc32_drivers/drv_pm.h b/bsp/hc32/libraries/hc32_drivers/drv_pm.h index e32dec436d2..40c10041894 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_pm.h +++ b/bsp/hc32/libraries/hc32_drivers/drv_pm.h @@ -91,7 +91,7 @@ struct pm_sleep_mode_shutdown_config ******************************************************************************/ #if defined(HC32F4A0) #define PM_CHECK_EFM() ((EFM_GetStatus(EFM_FLAG_RDY) == SET) && (EFM_GetStatus(EFM_FLAG_RDY1) == SET)) -#elif defined(HC32F460) || defined (HC32F448) +#elif defined(HC32F460) || defined (HC32F448) || defined (HC32F472) #define PM_CHECK_EFM() ((EFM_GetStatus(EFM_FLAG_RDY) == SET)) #endif #define PM_CHECK_XTAL() ((CM_CMU->XTALSTDCR & CLK_XTALSTD_ON) == 0) diff --git a/bsp/hc32/tests/test_pm.c b/bsp/hc32/tests/test_pm.c index dd54ccde531..bf463fa5dd0 100644 --- a/bsp/hc32/tests/test_pm.c +++ b/bsp/hc32/tests/test_pm.c @@ -24,12 +24,14 @@ * PM_SLEEP_MODE_STANDBY | 掉电模式1或2(可配,默认配置是模式1) * PM_SLEEP_MODE_SHUTDOWN | 掉电模式3或4(可配,默认配置是模式3) * -* 操作步骤: +* 操作步骤1: * 1)按下按键K10: MCU进入休眠模式 * 2)再按下按键K10:MCU退出休眠模式 * 3)重复上述按键操作,MCU循环进入休眠模式(deep、standby、shutdown、idle)和退出对应的休眠模式。 * 每次进入休眠模式前,MCU打印 "sleep:" + 休眠模式名称 * 每次退出休眠模式后,MCU打印 "wake from sleep:" + 休眠模式名称 +* 操作步骤2: +* 1)支持运行模式切换的芯片循环切换 低速->高速->低速 运行模式,对应时钟输出口输出对应模式下的时钟信号 */ #include @@ -37,11 +39,8 @@ #include #include - #if defined(BSP_USING_PM) -#define EFM_ERASE_TIME_MAX_IN_MILLISECOND (20) - #if defined (HC32F4A0) #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) #define BSP_KEY_PORT (GPIO_PORT_A) /* Key10 */ @@ -101,10 +100,6 @@ #define BSP_KEY_EVT (EVT_SRC_PORT_EIRQ5) #define BSP_KEY_PWC_PD_WKUP_TRIG_WKUP (PWC_PD_WKUP_TRIG_WKUP1) #define BSP_KEY_PWC_PD_WKUP_WKUP (PWC_PD_WKUP_WKUP11) - - #define MCO_PORT (GPIO_PORT_A) - #define MCO_PIN (GPIO_PIN_08) - #define MCO_GPIO_FUNC (GPIO_FUNC_1) #endif #define KEYCNT_BACKUP_ADDR (uint32_t *)(0x200F0010) @@ -327,6 +322,7 @@ static void pm_cmd_handler(void *parameter) } } +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) static void pm_run_main(void *parameter) { static rt_uint8_t run_index = 0; @@ -354,6 +350,7 @@ static void pm_run_main(void *parameter) rt_thread_mdelay(3000); } } +#endif static void _keycnt_cmd_init_after_power_on(void) { @@ -440,6 +437,7 @@ int pm_sample_init(void) rt_kprintf("create pm sample thread failed!\n"); } +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F448) thread = rt_thread_create("pm_run_main", pm_run_main, RT_NULL, 1024, 25, 10); if (thread != RT_NULL) { @@ -449,6 +447,8 @@ int pm_sample_init(void) { rt_kprintf("create pm run thread failed!\n"); } +#endif + return RT_EOK; } MSH_CMD_EXPORT(pm_sample_init, pm sample init); From 5886e262f9970abeb03336cb464934b3f36c7c24 Mon Sep 17 00:00:00 2001 From: hydevcode Date: Wed, 22 Jan 2025 02:49:25 +0800 Subject: [PATCH 19/51] [scons] ci.attachconfig.yml is used in combination with scons --- tools/attachconfig.py | 87 +++++++++++++++++++++++++++++++++++++++++++ tools/building.py | 6 ++- tools/options.py | 7 ++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 tools/attachconfig.py diff --git a/tools/attachconfig.py b/tools/attachconfig.py new file mode 100644 index 00000000000..df89fd23c3d --- /dev/null +++ b/tools/attachconfig.py @@ -0,0 +1,87 @@ +import os +import sys +import shutil +import yaml + +from SCons.Script import * + +# SCons AttachConfig Command Function +def GenAttachConfigProject(program = None): + Rtt_Root = os.getcwd() + config_file = os.path.join(os.getcwd(), 'rtt_root', Rtt_Root, '.config') + config_bacakup = config_file+'.origin' + rtconfig_file = os.path.join(os.getcwd(), 'rtt_root', Rtt_Root, 'rtconfig.h') + rtconfig__bacakup = rtconfig_file+'.origin' + if GetOption('attach') == '?': + attachconfig=[] + GetAttachConfig("get",attachconfig,0) + print("\033[32m✅ AttachConfig has: \033[0m") + prefix=attachconfig[0] + for line in attachconfig: + temp_prefix=line.split(".", 1) + if prefix!=temp_prefix[0]: + print("\033[42m \033[30m------"+temp_prefix[0]+"------\033[0m") + prefix=temp_prefix[0] + print(line) + + + elif GetOption('attach') == 'default': + if os.path.exists(config_bacakup): + shutil.copyfile(config_bacakup, config_file) + os.remove(config_bacakup) + if os.path.exists(rtconfig__bacakup): + shutil.copyfile(rtconfig__bacakup, rtconfig_file) + os.remove(rtconfig__bacakup) + print("\033[32m✅ Default .config and rtconfig.h recovery success!\033[0m") + else: + attachconfig=GetOption('attach') + attachconfig_result=[] + GetAttachConfig("search",attachconfig,attachconfig_result) + if attachconfig_result==[]: + print("❌\033[31m Without this AttachConfig:"+attachconfig+"\033[0m") + return + if os.path.exists(config_bacakup)==False: + shutil.copyfile(config_file, config_bacakup) + if os.path.exists(rtconfig__bacakup)==False: + shutil.copyfile(rtconfig_file, rtconfig__bacakup) + with open(config_file, 'a') as destination: + for line in attachconfig_result: + destination.write(line + '\n') + from env_utility import defconfig + defconfig(Rtt_Root) + print("\033[32m✅ AttachConfig add success!\033[0m") + +def GetAttachConfig(action,attachconfig,attachconfig_result): + rtt_root = os.getcwd() + yml_files_content = [] + directory = os.path.join(rtt_root, 'rtt_root', rtt_root, '.ci/attachconfig') + if os.path.exists(directory): + for root, dirs, files in os.walk(directory): + for filename in files: + if filename.endswith('attachconfig.yml'): + file_path = os.path.join(root, filename) + if os.path.exists(file_path): + try: + with open(file_path, 'r') as file: + content = yaml.safe_load(file) + if content is None: + continue + yml_files_content.append(content) + except yaml.YAMLError as e: + print(f"::error::Error parsing YAML file: {e}") + continue + except Exception as e: + print(f"::error::Error reading file: {e}") + continue + for projects in yml_files_content: + for name, details in projects.items(): + if details.get("kconfig") is None: + continue + if(projects.get(name) is not None): + if action == "get": + attachconfig.append(name) + if action == "search" and name == attachconfig: + from ci.bsp_buildings import get_details_and_dependencies + detail_list=get_details_and_dependencies([name],projects) + for line in detail_list: + attachconfig_result.append(line) \ No newline at end of file diff --git a/tools/building.py b/tools/building.py index c64c393ba00..6054490cf65 100644 --- a/tools/building.py +++ b/tools/building.py @@ -33,7 +33,6 @@ import rtconfig import platform import logging - from SCons.Script import * from utils import _make_path_relative from mkdist import do_copy_file @@ -336,6 +335,11 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ else: print('--global-macros arguments are illegal!') + if GetOption('attach'): + from attachconfig import GenAttachConfigProject + GenAttachConfigProject() + exit(0) + if GetOption('genconfig'): from env_utility import genconfig genconfig() diff --git a/tools/options.py b/tools/options.py index b77b6756122..2e92de8bd3e 100644 --- a/tools/options.py +++ b/tools/options.py @@ -141,3 +141,10 @@ def AddOptions(): action = 'store_true', default = False, help = 'make compile_commands.json') + AddOption('--attach', + dest = 'attach', + type = 'string', + help = 'View attachconfig or add attach to.config.'+\ + 'e.g. scons --attach=? View all attachconfig for the current bsp.'+\ + ' or scons --attach=component.cherryusb_cdc Set option component.cherryusb_cdc inside attachconfig to.config.'+\ + ' or scons --attach=default Restore.config and rtconfig to before attch was set.') \ No newline at end of file From d9947e50fad46aa4283ff3ecf3d546e9690a09ef Mon Sep 17 00:00:00 2001 From: Supper Thomas <78900636@qq.com> Date: Thu, 23 Jan 2025 09:32:38 +0800 Subject: [PATCH 20/51] [bsp/stm32f407-rt-spark/stm32l496zg-st-nucleo] add cherryusb support (#9929) [bsp/stm32f407-rt-spark/l496zg] add cherryusb support --- .gitignore | 7 +- .../.ci/attachconfig/ci.attachconfig.yml | 18 +- .../board/ports/cherryusb/SConscript | 16 + .../board/ports/cherryusb/cherryusb.c | 54 ++ .../board/ports/cherryusb/usb_config.h | 239 ++++++++ bsp/stm32/stm32f407-rt-spark/rtconfig.py | 5 +- .../.ci/attachconfig/ci.attachconfig.yml | 92 ++- .../board/CubeMX_Config/.mxproject | 4 +- .../board/CubeMX_Config/Inc/main.h | 3 +- .../CubeMX_Config/Inc/stm32l4xx_hal_conf.h | 208 ++++--- .../board/CubeMX_Config/Inc/stm32l4xx_it.h | 70 --- .../board/CubeMX_Config/STM32L496ZG.ioc | 178 ++++-- .../CubeMX_Config/Src/stm32l4xx_hal_msp.c | 557 +++++++++++++++++- .../board/CubeMX_Config/Src/stm32l4xx_it.c | 218 ------- .../stm32l496-st-nucleo/board/SConscript | 5 + .../stm32l496-st-nucleo/board/port/SConscript | 12 + .../board/port/cherryusb/SConscript | 16 + .../board/port/cherryusb/cherryusb.c | 54 ++ .../board/port/cherryusb/usb_config.h | 239 ++++++++ bsp/stm32/stm32l496-st-nucleo/rtconfig.py | 5 +- bsp/stm32/stm32l496-st-nucleo/template.uvoptx | 11 +- .../stm32l496-st-nucleo/template.uvprojx | 21 +- 22 files changed, 1585 insertions(+), 447 deletions(-) create mode 100644 bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/SConscript create mode 100644 bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/cherryusb.c create mode 100644 bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/usb_config.h delete mode 100644 bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h delete mode 100644 bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c create mode 100644 bsp/stm32/stm32l496-st-nucleo/board/port/SConscript create mode 100644 bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/SConscript create mode 100644 bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/cherryusb.c create mode 100644 bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/usb_config.h diff --git a/.gitignore b/.gitignore index 6cf26bf260d..7f7bab74a77 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ ncscope.* tags .idea +**/.cache/ .vscode *.code-workspace *.eide.* @@ -57,4 +58,8 @@ vdso.lds # cherryusb libraries !components/drivers/usb/cherryusb/port/pusb2/*.a -!components/drivers/usb/cherryusb/port/xhci/phytium/*.a \ No newline at end of file +!components/drivers/usb/cherryusb/port/xhci/phytium/*.a + +# stm32cubemx +**/CubeMX_Config/Drivers/ +**/CubeMX_Config/MDK-ARM/ diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml index 0ae089b8958..225e69772cc 100644 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml @@ -1,6 +1,11 @@ scons.args: &scons scons_arg: - '--strict' +# ------ nano CI ------ +nano: + <<: *scons + kconfig: + - CONFIG_RT_USING_NANO=y # ------ kernel CI ------ kernel.klibc-stdlib: <<: *scons @@ -182,8 +187,11 @@ peripheral.sram: peripheral.usb_mouse: kconfig: - CONFIG_BSP_USING_USB_MOUSE=y -# ------ nano CI ------ -nano: - <<: *scons - kconfig: - - CONFIG_RT_USING_NANO=y \ No newline at end of file +# ------ component CI ------ +component.cherryusb_cdc: + kconfig: + - CONFIG_RT_USING_CHERRYUSB=y + - CONFIG_RT_CHERRYUSB_DEVICE=y + - CONFIG_RT_CHERRYUSB_DEVICE_DWC2_ST=y + - CONFIG_RT_CHERRYUSB_DEVICE_CDC_ACM=y + - CONFIG_RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM=y diff --git a/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/SConscript b/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/SConscript new file mode 100644 index 00000000000..b4b2b5c6b4d --- /dev/null +++ b/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/SConscript @@ -0,0 +1,16 @@ +from building import * +import os + +cwd = GetCurrentDir() +group = [] +src = Glob('*.c') +CPPPATH = [cwd] + +list = os.listdir(cwd) +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + group = group + SConscript(os.path.join(d, 'SConscript')) + +group = group + DefineGroup('cherryusb-port', src, depend = ['RT_CHERRYUSB_DEVICE'], CPPPATH = CPPPATH) +Return('group') diff --git a/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/cherryusb.c b/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/cherryusb.c new file mode 100644 index 00000000000..208b1d382f9 --- /dev/null +++ b/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/cherryusb.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-17 Supperthomas first version + */ +#include "board.h" +#include "rtthread.h" +#include "drv_config.h" + +static PCD_HandleTypeDef hpcd_USB_OTG_FS; +void usb_dc_low_level_init(uint8_t busid) +{ + hpcd_USB_OTG_FS.Instance = USB_OTG_FS; + HAL_PCD_MspInit(&hpcd_USB_OTG_FS); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + HAL_PCD_MspDeInit(&hpcd_USB_OTG_FS); +} + +#ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM +/* Register the EMAC device */ +static int rt_hw_stm32_cherryusb_cdc_init(void) +{ + extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base); + cdc_acm_init(0, USB_OTG_FS_PERIPH_BASE); + + return 0; +} +INIT_COMPONENT_EXPORT(rt_hw_stm32_cherryusb_cdc_init); +static int cherry_usb_cdc_send(int argc, char **argv) +{ + extern void cdc_acm_data_send_with_dtr_test(uint8_t busid); + cdc_acm_data_send_with_dtr_test(0); + return 0; +} +MSH_CMD_EXPORT(cherry_usb_cdc_send, send the cdc data for test) +#endif + +#ifdef USBD_IRQ_HANDLER + void USBD_IRQ_HANDLER(void) +{ + extern void USBD_IRQHandler(uint8_t busid); + USBD_IRQHandler(0); +} +#else +#error USBD_IRQ_HANDLER need to USB IRQ like #define USBD_IRQ_HANDLER OTG_HS_IRQHandler +#endif + diff --git a/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/usb_config.h b/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/usb_config.h new file mode 100644 index 00000000000..23b6e865863 --- /dev/null +++ b/bsp/stm32/stm32f407-rt-spark/board/ports/cherryusb/usb_config.h @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-17 Supperthomas first version + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) + +#ifndef CONFIG_USB_DBG_LEVEL +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change with 2K,4K,8K,16K,default is 2K to get one TCP_MSS + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change with 2K,4K,8K,16K,default is 2K to get one TCP_MSS + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 4 +#endif + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +// #define CONFIG_USB_DWC2_RXALL_FIFO_SIZE (1024 / 4) +#define CONFIG_USB_DWC2_TX0_FIFO_SIZE (64 / 4) +#define CONFIG_USB_DWC2_TX1_FIFO_SIZE (64 / 4) +#define CONFIG_USB_DWC2_TX2_FIFO_SIZE (64 / 4) +#define CONFIG_USB_DWC2_TX3_FIFO_SIZE (64 / 4) +// #define CONFIG_USB_DWC2_TX4_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX5_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX6_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX7_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX8_FIFO_SIZE (0 / 4) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 1 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USBHOST_PIPE_NUM 12 +#endif + +/* ---------------- EHCI Configuration ---------------- */ + +#define CONFIG_USB_EHCI_HCCR_OFFSET (0x0) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 +#define CONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USB_EHCI_QTD_NUM 3 +#define CONFIG_USB_EHCI_ITD_NUM 20 +// #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE +// #define CONFIG_USB_EHCI_CONFIGFLAG +// #define CONFIG_USB_EHCI_ISO +// #define CONFIG_USB_EHCI_WITH_OHCI + +/* ---------------- OHCI Configuration ---------------- */ +#define CONFIG_USB_OHCI_HCOR_OFFSET (0x0) + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +/* ---------------- DWC2 Configuration ---------------- */ +/* largest non-periodic USB packet used / 4 */ +// #define CONFIG_USB_DWC2_NPTX_FIFO_SIZE (512 / 4) +/* largest periodic USB packet used / 4 */ +// #define CONFIG_USB_DWC2_PTX_FIFO_SIZE (1024 / 4) +/* + * (largest USB packet used / 4) + 1 for status information + 1 transfer complete + + * 1 location each for Bulk/Control endpoint for handling NAK/NYET scenario + */ +// #define CONFIG_USB_DWC2_RX_FIFO_SIZE ((1012 - CONFIG_USB_DWC2_NPTX_FIFO_SIZE - CONFIG_USB_DWC2_PTX_FIFO_SIZE)) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +#endif diff --git a/bsp/stm32/stm32f407-rt-spark/rtconfig.py b/bsp/stm32/stm32f407-rt-spark/rtconfig.py index 8195d720df5..d431276b007 100644 --- a/bsp/stm32/stm32f407-rt-spark/rtconfig.py +++ b/bsp/stm32/stm32f407-rt-spark/rtconfig.py @@ -19,7 +19,8 @@ PLATFORM = 'gcc' EXEC_PATH = r'C:\Users\XXYYZZ' elif CROSS_TOOL == 'keil': - PLATFORM = 'armcc' + PLATFORM = 'armclang' #KEIL AC6 + #PLATFORM = 'armcc' #KEIL AC5 EXEC_PATH = r'C:/Keil_v5' elif CROSS_TOOL == 'iar': PLATFORM = 'iccarm' @@ -28,7 +29,7 @@ PLATFORM = 'llvm-arm' EXEC_PATH = r'D:\Progrem\LLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64\bin' -if os.getenv('RTT_EXEC_PATH'): +if os.getenv('RTT_EXEC_PATH') and CROSS_TOOL == 'gcc': EXEC_PATH = os.getenv('RTT_EXEC_PATH') BUILD = 'debug' diff --git a/bsp/stm32/stm32l496-st-nucleo/.ci/attachconfig/ci.attachconfig.yml b/bsp/stm32/stm32l496-st-nucleo/.ci/attachconfig/ci.attachconfig.yml index 8715453924d..f140eaecb6b 100644 --- a/bsp/stm32/stm32l496-st-nucleo/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/stm32/stm32l496-st-nucleo/.ci/attachconfig/ci.attachconfig.yml @@ -3,8 +3,92 @@ nano: - '--strict' kconfig: - CONFIG_RT_USING_NANO=y +component.ulog: + kconfig: + - CONFIG_RT_USING_ULOG=y devices.on_chip: - kconfig: - - CONFIG_BSP_USING_ON_CHIP_FLASH=y - - CONFIG_BSP_USING_ON_CHIP_FLASH_FATFS=y - - CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=2048 \ No newline at end of file + kconfig: + - CONFIG_BSP_USING_ON_CHIP_FLASH=y + - CONFIG_BSP_USING_ON_CHIP_FLASH_FATFS=y + - CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=2048 +device.usb.cdc: + kconfig: + - CONFIG_RT_USB_DEVICE_CDC=y + - CONFIG_BSP_USING_USBD=y +pkg.tools.coremark: + kconfig: + - CONFIG_PKG_USING_COREMARK=y +pkg.kernel_sample: + kconfig: + - CONFIG_RT_USING_SIGNALS=y + - CONFIG_PKG_USING_KERNEL_SAMPLES=y + - CONFIG_PKG_USING_KERNEL_SAMPLES_ZH=y + - CONFIG_KERNEL_SAMPLES_USING_THREAD=y + - CONFIG_KERNEL_SAMPLES_USING_SEMAPHORE=y + - CONFIG_KERNEL_SAMPLES_USING_MUTEX=y + - CONFIG_KERNEL_SAMPLES_USING_MAILBOX=y + - CONFIG_KERNEL_SAMPLES_USING_EVENT=y + - CONFIG_KERNEL_SAMPLES_USING_MESSAGEQUEUE=y + - CONFIG_KERNEL_SAMPLES_USING_TIMER=y + - CONFIG_KERNEL_SAMPLES_USING_HEAP=y + - CONFIG_KERNEL_SAMPLES_USING_MEMHEAP=y + - CONFIG_KERNEL_SAMPLES_USING_MEMPOOL=y + - CONFIG_KERNEL_SAMPLES_USING_IDLEHOOK=y + - CONFIG_KERNEL_SAMPLES_USING_SIGNAL=y + - CONFIG_KERNEL_SAMPLES_USING_INTERRUPT=y + - CONFIG_KERNEL_SAMPLES_USING_PRI_INVERSION=y + - CONFIG_KERNEL_SAMPLES_USING_TIME_SLICE=y + - CONFIG_KERNEL_SAMPLES_USING_SCHEDULER_HOOK=y + - CONFIG_KERNEL_SAMPLES_USING_PRODUCER_CONSUMER=y +pkg.kernel_en_sample: + kconfig: + - CONFIG_RT_USING_SIGNALS=y + - CONFIG_PKG_USING_KERNEL_SAMPLES=y + - CONFIG_PKG_USING_KERNEL_SAMPLES_EN=y + - CONFIG_KERNEL_SAMPLES_USING_THREAD=y + - CONFIG_KERNEL_SAMPLES_USING_SEMAPHORE=y + - CONFIG_KERNEL_SAMPLES_USING_MUTEX=y + - CONFIG_KERNEL_SAMPLES_USING_MAILBOX=y + - CONFIG_KERNEL_SAMPLES_USING_EVENT=y + - CONFIG_KERNEL_SAMPLES_USING_MESSAGEQUEUE=y + - CONFIG_KERNEL_SAMPLES_USING_TIMER=y + - CONFIG_KERNEL_SAMPLES_USING_HEAP=y + - CONFIG_KERNEL_SAMPLES_USING_MEMHEAP=y + - CONFIG_KERNEL_SAMPLES_USING_MEMPOOL=y + - CONFIG_KERNEL_SAMPLES_USING_IDLEHOOK=y + - CONFIG_KERNEL_SAMPLES_USING_SIGNAL=y + - CONFIG_KERNEL_SAMPLES_USING_INTERRUPT=y + - CONFIG_KERNEL_SAMPLES_USING_PRI_INVERSION=y + - CONFIG_KERNEL_SAMPLES_USING_TIME_SLICE=y + - CONFIG_KERNEL_SAMPLES_USING_SCHEDULER_HOOK=y + - CONFIG_KERNEL_SAMPLES_USING_PRODUCER_CONSUMER=y +pkg.peripheral.sample: + kconfig: + - CONFIG_PKG_USING_PERIPHERAL_SAMPLES=y + - CONFIG_PERIPHERAL_SAMPLES_USING_ADC=y + - CONFIG_PERIPHERAL_SAMPLES_USING_HWTIMER=y + - CONFIG_PERIPHERAL_SAMPLES_USING_I2C=y + - CONFIG_PERIPHERAL_SAMPLES_USING_IWDG=y + - CONFIG_PERIPHERAL_SAMPLES_USING_LED_BLINK=y + - CONFIG_PERIPHERAL_SAMPLES_USING_PIN=y + - CONFIG_PERIPHERAL_SAMPLES_USING_PWM=y + - CONFIG_PERIPHERAL_SAMPLES_USING_RTC=y + - CONFIG_PERIPHERAL_SAMPLES_USING_SD=y + - CONFIG_PERIPHERAL_SAMPLES_USING_SERIAL=y + - CONFIG_PERIPHERAL_SAMPLES_USING_SERIAL_DMA=y + - CONFIG_PERIPHERAL_SAMPLES_USING_SPI=y + - CONFIG_PERIPHERAL_SAMPLES_USING_CAN=y +# ------ component CI ------ +component.rtlink: + kconfig: + - CONFIG_RT_USING_ULOG=y + - CONFIG_RT_USING_RT_LINK=y + - CONFIG_PKG_USING_RT_LINK_HW=y + - CONFIG_PKG_PKG_RT_LINK_HW_DEVICE_NAME="lpuart1" +component.cherryusb_cdc: + kconfig: + - CONFIG_RT_USING_CHERRYUSB=y + - CONFIG_RT_CHERRYUSB_DEVICE=y + - CONFIG_RT_CHERRYUSB_DEVICE_DWC2_ST=y + - CONFIG_RT_CHERRYUSB_DEVICE_CDC_ACM=y + - CONFIG_RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM=y diff --git a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/.mxproject index ba9ddfda685..7b80e205d69 100644 --- a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/.mxproject +++ b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/.mxproject @@ -1,8 +1,8 @@ [PreviousLibFiles] -LibFiles=Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_uart.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_uart_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_def.h;Drivers\STM32L4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_i2c.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_i2c_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rcc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rcc_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash_ramfunc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_gpio.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_gpio_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dma.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dma_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pwr.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pwr_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_cortex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_exti.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_tim.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_tim_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pcd.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pcd_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_usb.h;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usb.c;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_uart.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_uart_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_def.h;Drivers\STM32L4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_i2c.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_i2c_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rcc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rcc_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash_ramfunc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_gpio.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_gpio_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dma.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dma_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pwr.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pwr_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_cortex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_exti.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_tim.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_tim_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pcd.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pcd_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_usb.h;Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l496xx.h;Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h;Drivers\CMSIS\Device\ST\STM32L4xx\Include\system_stm32l4xx.h;Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; +LibFiles=Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_tim.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_tim_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_adc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_adc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_adc_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_def.h;Drivers\STM32L4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rcc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rcc_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_bus.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_rcc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_crs.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_system.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_utils.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash_ramfunc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_gpio.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_gpio_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_gpio.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_i2c.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_i2c_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dma.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dma_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_dma.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_dmamux.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pwr.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pwr_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_pwr.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_cortex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_cortex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_exti.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_exti.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_can.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dac.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_dac.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dac_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_i2c.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_iwdg.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_iwdg.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_uart.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_usart.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_lpuart.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_uart_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_qspi.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rtc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_rtc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rtc_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_sai.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_sai_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_spi.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_spi.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_spi_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_tim.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pcd.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pcd_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_usb.h;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_can.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_iwdg.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_qspi.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd_ex.c;Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usb.c;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_tim.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_tim_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_adc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_adc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_adc_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_def.h;Drivers\STM32L4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rcc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rcc_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_bus.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_rcc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_crs.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_system.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_utils.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_flash_ramfunc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_gpio.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_gpio_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_gpio.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_i2c.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_i2c_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dma.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dma_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_dma.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_dmamux.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pwr.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pwr_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_pwr.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_cortex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_cortex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_exti.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_exti.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_can.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dac.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_dac.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_dac_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_i2c.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_iwdg.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_iwdg.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_uart.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_usart.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_lpuart.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_uart_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_qspi.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rtc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_rtc.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_rtc_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_sai.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_sai_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_spi.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_spi.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_spi_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_tim.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pcd.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal_pcd_ex.h;Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_ll_usb.h;Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l496xx.h;Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h;Drivers\CMSIS\Device\ST\STM32L4xx\Include\system_stm32l4xx.h;Drivers\CMSIS\Device\ST\STM32L4xx\Include\system_stm32l4xx.h;Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv81mml.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; [PreviousUsedKeilFiles] -SourceFiles=..\Src\main.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;..\Src\stm32l4xx_hal_timebase_tim.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usb.c;..\Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c;..\\Src\system_stm32l4xx.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usb.c;..\Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c;..\\Src\system_stm32l4xx.c;;; +SourceFiles=..\Src\main.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;..\Src\stm32l4xx_hal_timebase_tim.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_can.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_iwdg.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_qspi.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usb.c;..\Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c;..\\Src\system_stm32l4xx.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_can.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_iwdg.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_qspi.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd_ex.c;..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usb.c;..\Drivers\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c;..\\Src\system_stm32l4xx.c;;; HeaderPath=..\Drivers\STM32L4xx_HAL_Driver\Inc;..\Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L4xx\Include;..\Drivers\CMSIS\Include;..\Inc; CDefines=USE_HAL_DRIVER;STM32L496xx;USE_HAL_DRIVER;USE_HAL_DRIVER; diff --git a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/main.h index afbeccdb74d..7b101e80ea0 100644 --- a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/main.h +++ b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -90,6 +90,7 @@ void Error_Handler(void); #define SWO_GPIO_Port GPIOB #define LD2_Pin GPIO_PIN_7 #define LD2_GPIO_Port GPIOB + /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ @@ -99,5 +100,3 @@ void Error_Handler(void); #endif #endif /* __MAIN_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h index 6b3a93f3875..b32f241317e 100644 --- a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h +++ b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h @@ -1,40 +1,28 @@ +/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file stm32l4xx_hal_conf.h - * @brief HAL configuration file. + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32l4xx_hal_conf.h. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2023 STMicroelectronics

+ * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ +/* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32L4xx_HAL_CONF_H -#define __STM32L4xx_HAL_CONF_H +#ifndef STM32L4xx_HAL_CONF_H +#define STM32L4xx_HAL_CONF_H #ifdef __cplusplus extern "C" { @@ -47,12 +35,12 @@ /** * @brief This is the list of modules to be used in the HAL driver */ - #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED /*#define HAL_CRYP_MODULE_ENABLED */ -/*#define HAL_CAN_MODULE_ENABLED */ +#define HAL_CAN_MODULE_ENABLED /*#define HAL_COMP_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED /*#define HAL_CRC_MODULE_ENABLED */ /*#define HAL_CRYP_MODULE_ENABLED */ #define HAL_DAC_MODULE_ENABLED @@ -78,11 +66,11 @@ /*#define HAL_OSPI_MODULE_ENABLED */ #define HAL_PCD_MODULE_ENABLED /*#define HAL_PKA_MODULE_ENABLED */ -#define HAL_QSPI_MODULE_ENABLED /*#define HAL_QSPI_MODULE_ENABLED */ +#define HAL_QSPI_MODULE_ENABLED /*#define HAL_RNG_MODULE_ENABLED */ #define HAL_RTC_MODULE_ENABLED -/*#define HAL_SAI_MODULE_ENABLED */ +#define HAL_SAI_MODULE_ENABLED /*#define HAL_SD_MODULE_ENABLED */ /*#define HAL_SMBUS_MODULE_ENABLED */ /*#define HAL_SMARTCARD_MODULE_ENABLED */ @@ -98,7 +86,6 @@ /*#define HAL_PSSI_MODULE_ENABLED */ #define HAL_GPIO_MODULE_ENABLED #define HAL_EXTI_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED #define HAL_DMA_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED #define HAL_FLASH_MODULE_ENABLED @@ -151,7 +138,7 @@ * @brief Internal Low Speed oscillator (LSI) value. */ #if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ + #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/ #endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz The real value may vary depending on the variations in voltage and temperature.*/ @@ -161,11 +148,11 @@ * This value is used by the UART, RTC HAL module to compute the system frequency */ #if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/ + #define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/ #endif /* LSE_VALUE */ #if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ + #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ #endif /* HSE_STARTUP_TIMEOUT */ /** @@ -174,7 +161,7 @@ * frequency. */ #if !defined (EXTERNAL_SAI1_CLOCK_VALUE) - #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000U) /*!< Value of the SAI1 External clock source in Hz*/ + #define EXTERNAL_SAI1_CLOCK_VALUE 2097000U /*!< Value of the SAI1 External clock source in Hz*/ #endif /* EXTERNAL_SAI1_CLOCK_VALUE */ /** @@ -183,7 +170,7 @@ * frequency. */ #if !defined (EXTERNAL_SAI2_CLOCK_VALUE) - #define EXTERNAL_SAI2_CLOCK_VALUE ((uint32_t)2097000U) /*!< Value of the SAI2 External clock source in Hz*/ + #define EXTERNAL_SAI2_CLOCK_VALUE 2097000U /*!< Value of the SAI2 External clock source in Hz*/ #endif /* EXTERNAL_SAI2_CLOCK_VALUE */ /* Tip: To avoid modifying this file each time you need to use different HSE, @@ -194,8 +181,8 @@ * @brief This is the HAL system configuration section */ -#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */ #define USE_RTOS 0U #define PREFETCH_ENABLE 0U #define INSTRUCTION_CACHE_ENABLE 1U @@ -208,6 +195,51 @@ */ /* #define USE_FULL_ASSERT 1U */ +/* ################## Register callback feature configuration ############### */ +/** + * @brief Set below the peripheral configuration to "1U" to add the support + * of HAL callback registration/deregistration feature for the HAL + * driver(s). This allows user application to provide specific callback + * functions thanks to HAL_PPP_RegisterCallback() rather than overwriting + * the default weak callback functions (see each stm32l4xx_hal_ppp.h file + * for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef + * for each PPP peripheral). + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U +#define USE_HAL_GFXMMU_REGISTER_CALLBACKS 0U +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U +#define USE_HAL_OSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U +#define USE_HAL_SD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U +#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U +#define USE_HAL_TSC_REGISTER_CALLBACKS 0U +#define USE_HAL_UART_REGISTER_CALLBACKS 0U +#define USE_HAL_USART_REGISTER_CALLBACKS 0U +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U + /* ################## SPI peripheral configuration ########################## */ /* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver @@ -224,20 +256,14 @@ #ifdef HAL_RCC_MODULE_ENABLED #include "stm32l4xx_hal_rcc.h" - #include "stm32l4xx_hal_rcc_ex.h" #endif /* HAL_RCC_MODULE_ENABLED */ -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32l4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - #ifdef HAL_GPIO_MODULE_ENABLED #include "stm32l4xx_hal_gpio.h" #endif /* HAL_GPIO_MODULE_ENABLED */ #ifdef HAL_DMA_MODULE_ENABLED #include "stm32l4xx_hal_dma.h" - #include "stm32l4xx_hal_dma_ex.h" #endif /* HAL_DMA_MODULE_ENABLED */ #ifdef HAL_DFSDM_MODULE_ENABLED @@ -256,6 +282,10 @@ #include "stm32l4xx_hal_can.h" #endif /* HAL_CAN_MODULE_ENABLED */ +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "Legacy/stm32l4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + #ifdef HAL_COMP_MODULE_ENABLED #include "stm32l4xx_hal_comp.h" #endif /* HAL_COMP_MODULE_ENABLED */ @@ -284,6 +314,14 @@ #include "stm32l4xx_hal_dsi.h" #endif /* HAL_DSI_MODULE_ENABLED */ +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32l4xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + #ifdef HAL_FIREWALL_MODULE_ENABLED #include "stm32l4xx_hal_firewall.h" #endif /* HAL_FIREWALL_MODULE_ENABLED */ @@ -296,26 +334,18 @@ #include "stm32l4xx_hal_hash.h" #endif /* HAL_HASH_MODULE_ENABLED */ -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32l4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32l4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32l4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32l4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32l4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ #ifdef HAL_I2C_MODULE_ENABLED #include "stm32l4xx_hal_i2c.h" #endif /* HAL_I2C_MODULE_ENABLED */ +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + #ifdef HAL_IWDG_MODULE_ENABLED #include "stm32l4xx_hal_iwdg.h" #endif /* HAL_IWDG_MODULE_ENABLED */ @@ -332,6 +362,18 @@ #include "stm32l4xx_hal_ltdc.h" #endif /* HAL_LTDC_MODULE_ENABLED */ +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32l4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32l4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32l4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + #ifdef HAL_OPAMP_MODULE_ENABLED #include "stm32l4xx_hal_opamp.h" #endif /* HAL_OPAMP_MODULE_ENABLED */ @@ -340,9 +382,17 @@ #include "stm32l4xx_hal_ospi.h" #endif /* HAL_OSPI_MODULE_ENABLED */ +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + #ifdef HAL_PKA_MODULE_ENABLED #include "stm32l4xx_hal_pka.h" -#endif /* HAL_PWR_MODULE_ENABLED */ +#endif /* HAL_PKA_MODULE_ENABLED */ + +#ifdef HAL_PSSI_MODULE_ENABLED + #include "stm32l4xx_hal_pssi.h" +#endif /* HAL_PSSI_MODULE_ENABLED */ #ifdef HAL_PWR_MODULE_ENABLED #include "stm32l4xx_hal_pwr.h" @@ -368,6 +418,10 @@ #include "stm32l4xx_hal_sd.h" #endif /* HAL_SD_MODULE_ENABLED */ +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + #ifdef HAL_SMBUS_MODULE_ENABLED #include "stm32l4xx_hal_smbus.h" #endif /* HAL_SMBUS_MODULE_ENABLED */ @@ -376,6 +430,10 @@ #include "stm32l4xx_hal_spi.h" #endif /* HAL_SPI_MODULE_ENABLED */ +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32l4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + #ifdef HAL_SWPMI_MODULE_ENABLED #include "stm32l4xx_hal_swpmi.h" #endif /* HAL_SWPMI_MODULE_ENABLED */ @@ -396,39 +454,15 @@ #include "stm32l4xx_hal_usart.h" #endif /* HAL_USART_MODULE_ENABLED */ -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32l4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32l4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - #ifdef HAL_WWDG_MODULE_ENABLED #include "stm32l4xx_hal_wwdg.h" #endif /* HAL_WWDG_MODULE_ENABLED */ -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32l4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32l4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_GFXMMU_MODULE_ENABLED - #include "stm32l4xx_hal_gfxmmu.h" -#endif /* HAL_GFXMMU_MODULE_ENABLED */ - -#ifdef HAL_PSSI_MODULE_ENABLED - #include "stm32l4xx_hal_pssi.h" -#endif /* HAL_PSSI_MODULE_ENABLED */ - /* Exported macro ------------------------------------------------------------*/ #ifdef USE_FULL_ASSERT /** * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function + * @param expr If expr is false, it calls assert_failed function * which reports the name of the source file and the source * line number of the call that failed. * If expr is true, it returns no value. @@ -436,7 +470,7 @@ */ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ - void assert_failed(char *file, uint32_t line); + void assert_failed(uint8_t *file, uint32_t line); #else #define assert_param(expr) ((void)0U) #endif /* USE_FULL_ASSERT */ @@ -445,6 +479,4 @@ } #endif -#endif /* __STM32L4xx_HAL_CONF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +#endif /* STM32L4xx_HAL_CONF_H */ diff --git a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h deleted file mode 100644 index 87507bd9f74..00000000000 --- a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h +++ /dev/null @@ -1,70 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32l4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32L4xx_IT_H -#define __STM32L4xx_IT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -void TIM1_UP_TIM16_IRQHandler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32L4xx_IT_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/STM32L496ZG.ioc b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/STM32L496ZG.ioc index b77fb19df9f..54c05d45aa2 100644 --- a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/STM32L496ZG.ioc +++ b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/STM32L496ZG.ioc @@ -1,62 +1,106 @@ #MicroXplorer Configuration settings - do not modify +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_1 +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,SingleDiff-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag +ADC1.NbrOfConversionFlag=1 +ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +ADC1.SingleDiff-0\#ChannelRegularConversion=ADC_DIFFERENTIAL_ENDED +ADC1.master=1 CAD.formats= CAD.pinconfig= CAD.provider= +CAN1.CalculateBaudRate=833333 +CAN1.CalculateTimeBit=1200 +CAN1.CalculateTimeQuantum=400.0 +CAN1.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate File.Version=6 GPIO.groupedBy=Group By Peripherals +I2C1.IPParameters=Timing +I2C1.Timing=0x00D09BE3 KeepUserPlacement=false LPUART1.BaudRate=115200 LPUART1.IPParameters=BaudRate,WordLength LPUART1.WordLength=UART_WORDLENGTH_8B Mcu.CPN=STM32L496ZGT3 Mcu.Family=STM32L4 -Mcu.IP0=LPUART1 -Mcu.IP1=NVIC -Mcu.IP2=RCC -Mcu.IP3=SYS -Mcu.IP4=TIM2 -Mcu.IP5=TIM4 -Mcu.IP6=USB_OTG_FS -Mcu.IPNb=7 +Mcu.IP0=ADC1 +Mcu.IP1=CAN1 +Mcu.IP10=SAI1 +Mcu.IP11=SPI1 +Mcu.IP12=SYS +Mcu.IP13=TIM2 +Mcu.IP14=TIM4 +Mcu.IP15=USB_OTG_FS +Mcu.IP2=DAC1 +Mcu.IP3=I2C1 +Mcu.IP4=IWDG +Mcu.IP5=LPUART1 +Mcu.IP6=NVIC +Mcu.IP7=QUADSPI +Mcu.IP8=RCC +Mcu.IP9=RTC +Mcu.IPNb=16 Mcu.Name=STM32L496Z(E-G)Tx Mcu.Package=LQFP144 -Mcu.Pin0=PC13 -Mcu.Pin1=PC14-OSC32_IN (PC14) -Mcu.Pin10=PD15 -Mcu.Pin11=PG5 -Mcu.Pin12=PG6 -Mcu.Pin13=PG7 -Mcu.Pin14=PG8 -Mcu.Pin15=PA8 -Mcu.Pin16=PA9 -Mcu.Pin17=PA10 -Mcu.Pin18=PA11 -Mcu.Pin19=PA12 -Mcu.Pin2=PC15-OSC32_OUT (PC15) -Mcu.Pin20=PA13 (JTMS/SWDIO) -Mcu.Pin21=PA14 (JTCK/SWCLK) -Mcu.Pin22=PB3 (JTDO/TRACESWO) -Mcu.Pin23=PB7 -Mcu.Pin24=VP_SYS_VS_tim1 -Mcu.Pin3=PH1-OSC_OUT (PH1) -Mcu.Pin4=PA2 -Mcu.Pin5=PA3 -Mcu.Pin6=PB14 -Mcu.Pin7=PD12 -Mcu.Pin8=PD13 -Mcu.Pin9=PD14 -Mcu.PinsNb=25 +Mcu.Pin0=PE4 +Mcu.Pin1=PE5 +Mcu.Pin10=PC0 +Mcu.Pin11=PC1 +Mcu.Pin12=PA1 +Mcu.Pin13=PA2 +Mcu.Pin14=PA3 +Mcu.Pin15=PA4 +Mcu.Pin16=PA6 +Mcu.Pin17=PA7 +Mcu.Pin18=PE11 +Mcu.Pin19=PB14 +Mcu.Pin2=PE6 +Mcu.Pin20=PD12 +Mcu.Pin21=PD13 +Mcu.Pin22=PD14 +Mcu.Pin23=PD15 +Mcu.Pin24=PG5 +Mcu.Pin25=PG6 +Mcu.Pin26=PG7 +Mcu.Pin27=PG8 +Mcu.Pin28=PA8 +Mcu.Pin29=PA9 +Mcu.Pin3=PC13 +Mcu.Pin30=PA10 +Mcu.Pin31=PA11 +Mcu.Pin32=PA12 +Mcu.Pin33=PA13 (JTMS/SWDIO) +Mcu.Pin34=PA14 (JTCK/SWCLK) +Mcu.Pin35=PD0 +Mcu.Pin36=PD1 +Mcu.Pin37=PG13 +Mcu.Pin38=PG14 +Mcu.Pin39=PB3 (JTDO/TRACESWO) +Mcu.Pin4=PC14-OSC32_IN (PC14) +Mcu.Pin40=PB7 +Mcu.Pin41=VP_IWDG_VS_IWDG +Mcu.Pin42=VP_RTC_VS_RTC_Activate +Mcu.Pin43=VP_SAI1_VP_$IpInstance_SAIA_SAI_BASIC +Mcu.Pin44=VP_SYS_VS_tim1 +Mcu.Pin5=PC15-OSC32_OUT (PC15) +Mcu.Pin6=PF8 +Mcu.Pin7=PF9 +Mcu.Pin8=PF10 +Mcu.Pin9=PH1-OSC_OUT (PH1) +Mcu.PinsNb=45 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32L496ZGTx -MxCube.Version=5.5.0 -MxDb.Version=DB.5.0.50 +MxCube.Version=6.13.0 +MxDb.Version=DB.6.0.130 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false NVIC.ForceEnableDMAVector=true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false +NVIC.OTG_FS_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false @@ -65,6 +109,8 @@ NVIC.TIM1_UP_TIM16_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true NVIC.TimeBase=TIM1_UP_TIM16_IRQn NVIC.TimeBaseIP=TIM1 NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false +PA1.Mode=Full_Duplex_Master +PA1.Signal=SPI1_SCK PA10.GPIOParameters=GPIO_Label PA10.GPIO_Label=USB_ID PA10.Locked=true @@ -91,6 +137,11 @@ PA14\ (JTCK/SWCLK).Mode=Trace_Asynchronous_SW PA14\ (JTCK/SWCLK).Signal=SYS_JTCK-SWCLK PA2.Signal=S_TIM2_CH3 PA3.Signal=S_TIM2_CH4 +PA4.Signal=COMP_DAC11_group +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI PA8.GPIOParameters=GPIO_Label PA8.GPIO_Label=USB_SOF [TP1] PA8.Locked=true @@ -114,6 +165,8 @@ PB7.GPIOParameters=GPIO_Label PB7.GPIO_Label=LD2 [Blue] PB7.Locked=true PB7.Signal=GPIO_Output +PC0.Signal=ADCx_IN1 +PC1.Signal=ADCx_IN2 PC13.GPIOParameters=GPIO_Label PC13.GPIO_Label=B1 PC13.Locked=true @@ -124,10 +177,32 @@ PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN PC15-OSC32_OUT\ (PC15).Locked=true PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PD0.Mode=CAN_Activate +PD0.Signal=CAN1_RX +PD1.Mode=CAN_Activate +PD1.Signal=CAN1_TX PD12.Signal=S_TIM4_CH1 PD13.Signal=S_TIM4_CH2 PD14.Signal=S_TIM4_CH3 PD15.Signal=S_TIM4_CH4 +PE11.Mode=Single Bank 1 2IOs +PE11.Signal=QUADSPI_BK1_NCS +PE4.Mode=SAI_A_Master +PE4.Signal=SAI1_FS_A +PE5.Mode=SAI_A_Master +PE5.Signal=SAI1_SCK_A +PE6.Mode=SAI_A_Master +PE6.Signal=SAI1_SD_A +PF10.Mode=Single Bank 1 2IOs +PF10.Signal=QUADSPI_CLK +PF8.Mode=Single Bank 1 2IOs +PF8.Signal=QUADSPI_BK1_IO0 +PF9.Mode=Single Bank 1 2IOs +PF9.Signal=QUADSPI_BK1_IO1 +PG13.Mode=I2C +PG13.Signal=I2C1_SDA +PG14.Mode=I2C +PG14.Signal=I2C1_SCL PG5.GPIOParameters=GPIO_Label PG5.GPIO_Label=USB_OverCurrent [STMPS2151STR_FAULT] PG5.Locked=true @@ -158,7 +233,7 @@ ProjectManager.CustomerFirmwarePackage= ProjectManager.DefaultFWLocation=true ProjectManager.DeletePrevious=true ProjectManager.DeviceId=STM32L496ZGTx -ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.15.1 +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.18.1 ProjectManager.FreePins=false ProjectManager.HalAssertFull=false ProjectManager.HeapSize=0x1000 @@ -176,8 +251,10 @@ ProjectManager.RegisterCallBack= ProjectManager.StackSize=0x1000 ProjectManager.TargetToolchain=MDK-ARM V5 ProjectManager.ToolChainLocation= +ProjectManager.UAScriptAfterPath= +ProjectManager.UAScriptBeforePath= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,4-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,4-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,5-MX_TIM2_Init-TIM2-false-HAL-true,6-MX_TIM4_Init-TIM4-false-HAL-true,7-MX_CAN1_Init-CAN1-false-HAL-true,8-MX_ADC1_Init-ADC1-false-HAL-true,9-MX_DAC1_Init-DAC1-false-HAL-true,10-MX_I2C1_Init-I2C1-false-HAL-true,11-MX_IWDG_Init-IWDG-false-HAL-true,12-MX_QUADSPI_Init-QUADSPI-false-HAL-true,13-MX_RTC_Init-RTC-false-HAL-true,14-MX_SAI1_Init-SAI1-false-HAL-true,15-MX_SPI1_Init-SPI1-false-HAL-true RCC.48MHZClocksFreq_Value=24000000 RCC.ADC12outputFreq_Value=72000000 RCC.ADC34outputFreq_Value=72000000 @@ -277,6 +354,20 @@ RCC.VCOSAI1OutputFreq_Value=96000000 RCC.VCOSAI2OutputFreq_Value=32000000 RCC.VcooutputI2S=48000000 RCC.WatchDogFreq_Value=32000 +SAI1.ErrorAudioFreq-SAI_A_Master=-2.34 % +SAI1.IPParameters=Instance-SAI_A_Master,VirtualMode-SAI_A_Master,MClockEnable-SAI_A_Master,RealAudioFreq-SAI_A_Master,ErrorAudioFreq-SAI_A_Master,InitProtocol-SAI_A_Master,VirtualProtocol-SAI_A_BASIC +SAI1.InitProtocol-SAI_A_Master=Enable +SAI1.Instance-SAI_A_Master=SAI$Index_Block_A +SAI1.MClockEnable-SAI_A_Master=SAI_MASTERCLOCK_DISABLE +SAI1.RealAudioFreq-SAI_A_Master=187.5 KHz +SAI1.VirtualMode-SAI_A_Master=VM_MASTER +SAI1.VirtualProtocol-SAI_A_BASIC=VM_BASIC_PROTOCOL +SH.ADCx_IN1.0=ADC1_IN1,IN1-Differential +SH.ADCx_IN1.ConfNb=1 +SH.ADCx_IN2.0=ADC1_IN2,IN1-Differential +SH.ADCx_IN2.ConfNb=1 +SH.COMP_DAC11_group.0=DAC1_OUT1,DAC_OUT1 +SH.COMP_DAC11_group.ConfNb=1 SH.GPXTI13.0=GPIO_EXTI13 SH.GPXTI13.ConfNb=1 SH.S_TIM2_CH3.0=TIM2_CH3,PWM Generation3 CH3 @@ -291,6 +382,11 @@ SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3 SH.S_TIM4_CH3.ConfNb=1 SH.S_TIM4_CH4.0=TIM4_CH4,PWM Generation4 CH4 SH.S_TIM4_CH4.ConfNb=1 +SPI1.CalculateBaudRate=40.0 MBits/s +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM2.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 @@ -301,6 +397,12 @@ TIM4.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM4.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 USB_OTG_FS.IPParameters=VirtualMode USB_OTG_FS.VirtualMode=Device_Only +VP_IWDG_VS_IWDG.Mode=IWDG_Activate +VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SAI1_VP_$IpInstance_SAIA_SAI_BASIC.Mode=SAI_A_BASIC +VP_SAI1_VP_$IpInstance_SAIA_SAI_BASIC.Signal=SAI1_VP_$IpInstance_SAIA_SAI_BASIC VP_SYS_VS_tim1.Mode=TIM1 VP_SYS_VS_tim1.Signal=SYS_VS_tim1 board=NUCLEO-L496ZG diff --git a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c index 05ea0bf14e8..55cfb26e358 100644 --- a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c +++ b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c @@ -65,6 +65,7 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); */ void HAL_MspInit(void) { + /* USER CODE BEGIN MspInit 0 */ /* USER CODE END MspInit 0 */ @@ -79,6 +80,277 @@ void HAL_MspInit(void) /* USER CODE END MspInit 1 */ } +/** +* @brief ADC MSP Initialization +* This function configures the hardware resources used in this example +* @param hadc: ADC handle pointer +* @retval None +*/ +void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hadc->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_ADC_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN1 + PC1 ------> ADC1_IN2 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + + } + +} + +/** +* @brief ADC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hadc: ADC handle pointer +* @retval None +*/ +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) +{ + if(hadc->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC_CLK_DISABLE(); + + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN1 + PC1 ------> ADC1_IN2 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } + +} + +/** +* @brief CAN MSP Initialization +* This function configures the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hcan->Instance==CAN1) + { + /* USER CODE BEGIN CAN1_MspInit 0 */ + + /* USER CODE END CAN1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_CAN1_CLK_ENABLE(); + + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**CAN1 GPIO Configuration + PD0 ------> CAN1_RX + PD1 ------> CAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN CAN1_MspInit 1 */ + + /* USER CODE END CAN1_MspInit 1 */ + + } + +} + +/** +* @brief CAN MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) +{ + if(hcan->Instance==CAN1) + { + /* USER CODE BEGIN CAN1_MspDeInit 0 */ + + /* USER CODE END CAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CAN1_CLK_DISABLE(); + + /**CAN1 GPIO Configuration + PD0 ------> CAN1_RX + PD1 ------> CAN1_TX + */ + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_0|GPIO_PIN_1); + + /* USER CODE BEGIN CAN1_MspDeInit 1 */ + + /* USER CODE END CAN1_MspDeInit 1 */ + } + +} + +/** +* @brief DAC MSP Initialization +* This function configures the hardware resources used in this example +* @param hdac: DAC handle pointer +* @retval None +*/ +void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hdac->Instance==DAC1) + { + /* USER CODE BEGIN DAC1_MspInit 0 */ + + /* USER CODE END DAC1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_DAC1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**DAC1 GPIO Configuration + PA4 ------> DAC1_OUT1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_4; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN DAC1_MspInit 1 */ + + /* USER CODE END DAC1_MspInit 1 */ + + } + +} + +/** +* @brief DAC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hdac: DAC handle pointer +* @retval None +*/ +void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac) +{ + if(hdac->Instance==DAC1) + { + /* USER CODE BEGIN DAC1_MspDeInit 0 */ + + /* USER CODE END DAC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_DAC1_CLK_DISABLE(); + + /**DAC1 GPIO Configuration + PA4 ------> DAC1_OUT1 + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4); + + /* USER CODE BEGIN DAC1_MspDeInit 1 */ + + /* USER CODE END DAC1_MspDeInit 1 */ + } + +} + +/** +* @brief I2C MSP Initialization +* This function configures the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1; + PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + + __HAL_RCC_GPIOG_CLK_ENABLE(); + HAL_PWREx_EnableVddIO2(); + /**I2C1 GPIO Configuration + PG13 ------> I2C1_SDA + PG14 ------> I2C1_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + + } + +} + +/** +* @brief I2C MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) +{ + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PG13 ------> I2C1_SDA + PG14 ------> I2C1_SCL + */ + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_13); + + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_14); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } + +} + /** * @brief UART MSP Initialization * This function configures the hardware resources used in this example @@ -88,11 +360,22 @@ void HAL_MspInit(void) void HAL_UART_MspInit(UART_HandleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; if(huart->Instance==LPUART1) { /* USER CODE BEGIN LPUART1_MspInit 0 */ /* USER CODE END LPUART1_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; + PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /* Peripheral clock enable */ __HAL_RCC_LPUART1_CLK_ENABLE(); @@ -112,6 +395,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) /* USER CODE BEGIN LPUART1_MspInit 1 */ /* USER CODE END LPUART1_MspInit 1 */ + } } @@ -145,6 +429,217 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) } +/** +* @brief QSPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hqspi: QSPI handle pointer +* @retval None +*/ +void HAL_QSPI_MspInit(QSPI_HandleTypeDef* hqspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hqspi->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspInit 0 */ + + /* USER CODE END QUADSPI_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_QSPI_CLK_ENABLE(); + + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + /**QUADSPI GPIO Configuration + PF8 ------> QUADSPI_BK1_IO0 + PF9 ------> QUADSPI_BK1_IO1 + PF10 ------> QUADSPI_CLK + PE11 ------> QUADSPI_BK1_NCS + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF3_QUADSPI; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* USER CODE BEGIN QUADSPI_MspInit 1 */ + + /* USER CODE END QUADSPI_MspInit 1 */ + + } + +} + +/** +* @brief QSPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hqspi: QSPI handle pointer +* @retval None +*/ +void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* hqspi) +{ + if(hqspi->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspDeInit 0 */ + + /* USER CODE END QUADSPI_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_QSPI_CLK_DISABLE(); + + /**QUADSPI GPIO Configuration + PF8 ------> QUADSPI_BK1_IO0 + PF9 ------> QUADSPI_BK1_IO1 + PF10 ------> QUADSPI_CLK + PE11 ------> QUADSPI_BK1_NCS + */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10); + + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_11); + + /* USER CODE BEGIN QUADSPI_MspDeInit 1 */ + + /* USER CODE END QUADSPI_MspDeInit 1 */ + } + +} + +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA1 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA1 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + +} + /** * @brief TIM_PWM MSP Initialization * This function configures the hardware resources used in this example @@ -310,9 +805,13 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd) { HAL_PWREx_EnableVddUSB(); } + /* USB_OTG_FS interrupt Init */ + HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(OTG_FS_IRQn); /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ /* USER CODE END USB_OTG_FS_MspInit 1 */ + } } @@ -354,6 +853,9 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) { HAL_PWREx_DisableVddUSB(); } + + /* USB_OTG_FS interrupt DeInit */ + HAL_NVIC_DisableIRQ(OTG_FS_IRQn); /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ /* USER CODE END USB_OTG_FS_MspDeInit 1 */ @@ -361,8 +863,59 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) } +static uint32_t SAI1_client =0; + +void HAL_SAI_MspInit(SAI_HandleTypeDef* hsai) +{ + + GPIO_InitTypeDef GPIO_InitStruct; +/* SAI1 */ + if(hsai->Instance==SAI1_Block_A) + { + /* Peripheral clock enable */ + if (SAI1_client == 0) + { + __HAL_RCC_SAI1_CLK_ENABLE(); + } + SAI1_client ++; + + /**SAI1_A_Block_A GPIO Configuration + PE4 ------> SAI1_FS_A + PE5 ------> SAI1_SCK_A + PE6 ------> SAI1_SD_A + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF13_SAI1; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + } +} + +void HAL_SAI_MspDeInit(SAI_HandleTypeDef* hsai) +{ +/* SAI1 */ + if(hsai->Instance==SAI1_Block_A) + { + SAI1_client --; + if (SAI1_client == 0) + { + /* Peripheral clock disable */ + __HAL_RCC_SAI1_CLK_DISABLE(); + } + + /**SAI1_A_Block_A GPIO Configuration + PE4 ------> SAI1_FS_A + PE5 ------> SAI1_SCK_A + PE6 ------> SAI1_SD_A + */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6); + + } +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c b/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c deleted file mode 100644 index 2138be8af5a..00000000000 --- a/bsp/stm32/stm32l496-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c +++ /dev/null @@ -1,218 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32l4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "stm32l4xx_it.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ -extern TIM_HandleTypeDef htim1; - -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @brief This function handles Non maskable interrupt. - */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - - /* USER CODE END NonMaskableInt_IRQn 1 */ -} - -/** - * @brief This function handles Hard fault interrupt. - */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Memory management fault. - */ -void MemManage_Handler(void) -{ - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } -} - -/** - * @brief This function handles Prefetch fault, memory access fault. - */ -void BusFault_Handler(void) -{ - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Undefined instruction or illegal state. - */ -void UsageFault_Handler(void) -{ - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } -} - -/** - * @brief This function handles System service call via SWI instruction. - */ -void SVC_Handler(void) -{ - /* USER CODE BEGIN SVCall_IRQn 0 */ - - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ - - /* USER CODE END SVCall_IRQn 1 */ -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ -} - -/** - * @brief This function handles Pendable request for system service. - */ -void PendSV_Handler(void) -{ - /* USER CODE BEGIN PendSV_IRQn 0 */ - - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ - - /* USER CODE END PendSV_IRQn 1 */ -} - -/** - * @brief This function handles System tick timer. - */ -void SysTick_Handler(void) -{ - /* USER CODE BEGIN SysTick_IRQn 0 */ - - /* USER CODE END SysTick_IRQn 0 */ - - /* USER CODE BEGIN SysTick_IRQn 1 */ - - /* USER CODE END SysTick_IRQn 1 */ -} - -/******************************************************************************/ -/* STM32L4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32l4xx.s). */ -/******************************************************************************/ - -/** - * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. - */ -void TIM1_UP_TIM16_IRQHandler(void) -{ - /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ - - /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ - HAL_TIM_IRQHandler(&htim1); - /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ - - /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l496-st-nucleo/board/SConscript b/bsp/stm32/stm32l496-st-nucleo/board/SConscript index 99630cb0d29..05654a9f9ca 100644 --- a/bsp/stm32/stm32l496-st-nucleo/board/SConscript +++ b/bsp/stm32/stm32l496-st-nucleo/board/SConscript @@ -19,4 +19,9 @@ CPPDEFINES = ['STM32L496xx'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + Return('group') diff --git a/bsp/stm32/stm32l496-st-nucleo/board/port/SConscript b/bsp/stm32/stm32l496-st-nucleo/board/port/SConscript new file mode 100644 index 00000000000..ca95be14e2b --- /dev/null +++ b/bsp/stm32/stm32l496-st-nucleo/board/port/SConscript @@ -0,0 +1,12 @@ +import os +from building import * + +objs = [] +cwd = GetCurrentDir() +list = os.listdir(cwd) + +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + objs = objs + SConscript(os.path.join(item, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/SConscript b/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/SConscript new file mode 100644 index 00000000000..b4b2b5c6b4d --- /dev/null +++ b/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/SConscript @@ -0,0 +1,16 @@ +from building import * +import os + +cwd = GetCurrentDir() +group = [] +src = Glob('*.c') +CPPPATH = [cwd] + +list = os.listdir(cwd) +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + group = group + SConscript(os.path.join(d, 'SConscript')) + +group = group + DefineGroup('cherryusb-port', src, depend = ['RT_CHERRYUSB_DEVICE'], CPPPATH = CPPPATH) +Return('group') diff --git a/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/cherryusb.c b/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/cherryusb.c new file mode 100644 index 00000000000..208b1d382f9 --- /dev/null +++ b/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/cherryusb.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-17 Supperthomas first version + */ +#include "board.h" +#include "rtthread.h" +#include "drv_config.h" + +static PCD_HandleTypeDef hpcd_USB_OTG_FS; +void usb_dc_low_level_init(uint8_t busid) +{ + hpcd_USB_OTG_FS.Instance = USB_OTG_FS; + HAL_PCD_MspInit(&hpcd_USB_OTG_FS); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + HAL_PCD_MspDeInit(&hpcd_USB_OTG_FS); +} + +#ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM +/* Register the EMAC device */ +static int rt_hw_stm32_cherryusb_cdc_init(void) +{ + extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base); + cdc_acm_init(0, USB_OTG_FS_PERIPH_BASE); + + return 0; +} +INIT_COMPONENT_EXPORT(rt_hw_stm32_cherryusb_cdc_init); +static int cherry_usb_cdc_send(int argc, char **argv) +{ + extern void cdc_acm_data_send_with_dtr_test(uint8_t busid); + cdc_acm_data_send_with_dtr_test(0); + return 0; +} +MSH_CMD_EXPORT(cherry_usb_cdc_send, send the cdc data for test) +#endif + +#ifdef USBD_IRQ_HANDLER + void USBD_IRQ_HANDLER(void) +{ + extern void USBD_IRQHandler(uint8_t busid); + USBD_IRQHandler(0); +} +#else +#error USBD_IRQ_HANDLER need to USB IRQ like #define USBD_IRQ_HANDLER OTG_HS_IRQHandler +#endif + diff --git a/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/usb_config.h b/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/usb_config.h new file mode 100644 index 00000000000..8918959bf72 --- /dev/null +++ b/bsp/stm32/stm32l496-st-nucleo/board/port/cherryusb/usb_config.h @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-17 Supperthomas first version + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +/* ================ USB common Configuration ================ */ + +#define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) + +#ifndef CONFIG_USB_DBG_LEVEL +#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Setup packet log for debug */ +// #define CONFIG_USBDEV_SETUP_LOG_PRINT + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change with 2K,4K,8K,16K,default is 2K to get one TCP_MSS + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change with 2K,4K,8K,16K,default is 2K to get one TCP_MSS + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE +#define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE +#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS +#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM +#define CONFIG_USBDEV_EP_NUM 6 +#endif + +/* ---------------- FSDEV Configuration ---------------- */ +//#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 // maybe 1 or 2, many chips may have a difference + +/* ---------------- DWC2 Configuration ---------------- */ +// #define CONFIG_USB_DWC2_RXALL_FIFO_SIZE (1024 / 4) +#define CONFIG_USB_DWC2_TX0_FIFO_SIZE (64 / 4) +#define CONFIG_USB_DWC2_TX1_FIFO_SIZE (64 / 4) +#define CONFIG_USB_DWC2_TX2_FIFO_SIZE (64 / 4) +#define CONFIG_USB_DWC2_TX3_FIFO_SIZE (64 / 4) +#define CONFIG_USB_DWC2_TX4_FIFO_SIZE (0 / 4) +#define CONFIG_USB_DWC2_TX5_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX6_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX7_FIFO_SIZE (0 / 4) +// #define CONFIG_USB_DWC2_TX8_FIFO_SIZE (0 / 4) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS +#define CONFIG_USBHOST_MAX_BUS 1 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USBHOST_PIPE_NUM 12 +#endif + +/* ---------------- EHCI Configuration ---------------- */ + +#define CONFIG_USB_EHCI_HCCR_OFFSET (0x0) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 +#define CONFIG_USB_EHCI_QH_NUM CONFIG_USBHOST_PIPE_NUM +#define CONFIG_USB_EHCI_QTD_NUM 3 +#define CONFIG_USB_EHCI_ITD_NUM 20 +// #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE +// #define CONFIG_USB_EHCI_CONFIGFLAG +// #define CONFIG_USB_EHCI_ISO +// #define CONFIG_USB_EHCI_WITH_OHCI + +/* ---------------- OHCI Configuration ---------------- */ +#define CONFIG_USB_OHCI_HCOR_OFFSET (0x0) + +/* ---------------- XHCI Configuration ---------------- */ +#define CONFIG_USB_XHCI_HCCR_OFFSET (0x0) + +/* ---------------- DWC2 Configuration ---------------- */ +/* largest non-periodic USB packet used / 4 */ +// #define CONFIG_USB_DWC2_NPTX_FIFO_SIZE (512 / 4) +/* largest periodic USB packet used / 4 */ +// #define CONFIG_USB_DWC2_PTX_FIFO_SIZE (1024 / 4) +/* + * (largest USB packet used / 4) + 1 for status information + 1 transfer complete + + * 1 location each for Bulk/Control endpoint for handling NAK/NYET scenario + */ +// #define CONFIG_USB_DWC2_RX_FIFO_SIZE ((1012 - CONFIG_USB_DWC2_NPTX_FIFO_SIZE - CONFIG_USB_DWC2_PTX_FIFO_SIZE)) + +/* ---------------- MUSB Configuration ---------------- */ +// #define CONFIG_USB_MUSB_SUNXI + +#endif diff --git a/bsp/stm32/stm32l496-st-nucleo/rtconfig.py b/bsp/stm32/stm32l496-st-nucleo/rtconfig.py index 13c34d6ba69..854005af192 100644 --- a/bsp/stm32/stm32l496-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32l496-st-nucleo/rtconfig.py @@ -19,13 +19,14 @@ PLATFORM = 'gcc' EXEC_PATH = r'.' elif CROSS_TOOL == 'keil': - PLATFORM = 'armcc' + PLATFORM = 'armclang' #KEIL A6 + #PLATFORM = 'armcc' #KEIL A5 EXEC_PATH = r'C:/Keil_v5' elif CROSS_TOOL == 'iar': PLATFORM = 'iccarm' EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' -if os.getenv('RTT_EXEC_PATH'): +if os.getenv('RTT_EXEC_PATH') and CROSS_TOOL == 'gcc': EXEC_PATH = os.getenv('RTT_EXEC_PATH') BUILD = 'debug' diff --git a/bsp/stm32/stm32l496-st-nucleo/template.uvoptx b/bsp/stm32/stm32l496-st-nucleo/template.uvoptx index 1a6a4989337..878ae0eab16 100644 --- a/bsp/stm32/stm32l496-st-nucleo/template.uvoptx +++ b/bsp/stm32/stm32l496-st-nucleo/template.uvoptx @@ -10,7 +10,7 @@ *.s*; *.src; *.a* *.obj; *.o *.lib - *.txt; *.h; *.inc + *.txt; *.h; *.inc; *.md *.plm *.cpp 0 @@ -103,7 +103,7 @@ 1 0 0 - 6 + 4 @@ -114,9 +114,14 @@ - STLink\ST-LINKIII-KEIL_SWO.dll + Segger\JL2CM3.dll + + 0 + JL2CM3 + -U260115105 -O78 -S8 -ZTIFSpeedSel50000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8008 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32L496ZGTx$CMSIS\Flash\STM32L4xx_1024.FLM) + 0 UL2CM3 diff --git a/bsp/stm32/stm32l496-st-nucleo/template.uvprojx b/bsp/stm32/stm32l496-st-nucleo/template.uvprojx index e70e8a688e9..61fcb9e0066 100644 --- a/bsp/stm32/stm32l496-st-nucleo/template.uvprojx +++ b/bsp/stm32/stm32l496-st-nucleo/template.uvprojx @@ -11,13 +11,13 @@ 0x4 ARM-ADS 5060750::V5.06 update 6 (build 750)::ARMCC - 0 + 1 STM32L496ZGTx STMicroelectronics - Keil.STM32L4xx_DFP.2.2.0 - http://www.keil.com/pack + Keil.STM32L4xx_DFP.2.6.1 + http://www.keil.com/pack/ IRAM(0x20000000,0x00040000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE @@ -52,9 +52,9 @@ rt-thread 1 0 - 0 + 1 1 - 0 + 1 .\build\keil\List\ 1 0 @@ -185,6 +185,7 @@ 0 2 0 + 0 1 0 8 @@ -312,7 +313,7 @@ 1 - 1 + 2 0 0 1 @@ -321,14 +322,14 @@ 0 0 0 - 0 + 3 0 0 1 0 0 - 1 - 1 + 3 + 3 1 1 0 @@ -351,7 +352,7 @@ 0 0 0 - 0 + 4 From 969e0e01ef603d3929a186e8bd03f3657ec8227c Mon Sep 17 00:00:00 2001 From: Supper Thomas <78900636@qq.com> Date: Thu, 23 Jan 2025 09:35:06 +0800 Subject: [PATCH 21/51] [action] add cvitek/c906_little ci (#9901) * [action] add cvitek/c906_little ci * Update bsp_buildings.yml * Update rtconfig.py --- .github/workflows/bsp_buildings.yml | 14 +++++++++++++- bsp/cvitek/c906_little/rtconfig.py | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index 488583e39b6..497c2fe04b6 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -346,6 +346,10 @@ jobs: - "raspberry-pi/raspi4-64" #- "rockchip/rk3568" too long - "phytium/aarch64" + - RTT_BSP: "xuantie-900" + RTT_TOOL_CHAIN: "sourcery-Xuantie-900-gcc-elf" + SUB_RTT_BSP: + - "cvitek/c906_little" - RTT_BSP: "riscv-none" RTT_TOOL_CHAIN: "sourcery-riscv-none-embed" SUB_RTT_BSP: @@ -438,7 +442,15 @@ jobs: sudo tar -xf gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf.tar.xz -C /opt /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc --version echo "RTT_EXEC_PATH=/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf/bin" >> $GITHUB_ENV - + + - name: Install Xuantie-900-gcc-elf Tools + if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'sourcery-Xuantie-900-gcc-elf' && success() }} + run: | + wget -q https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1705395512373/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1-20240115.tar.gz + sudo tar -zxvf Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1-20240115.tar.gz -C /opt + /opt/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1/bin/riscv64-unknown-elf-gcc --version + echo "RTT_EXEC_PATH=/opt/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1/bin" >> $GITHUB_ENV + - name: Install Mips ToolChains if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'sourcery-mips' && success() }} shell: bash diff --git a/bsp/cvitek/c906_little/rtconfig.py b/bsp/cvitek/c906_little/rtconfig.py index 50c32d55617..efe793e2194 100755 --- a/bsp/cvitek/c906_little/rtconfig.py +++ b/bsp/cvitek/c906_little/rtconfig.py @@ -64,4 +64,4 @@ DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n' POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' -POST_ACTION += 'cd .. && bash combine-fip.sh ' + os.getcwd() + ' rtthread.bin' + ' \n' \ No newline at end of file +#POST_ACTION += 'cd .. && bash combine-fip.sh ' + os.getcwd() + ' rtthread.bin' + ' \n' From 7432b0a01965c6623162a1858a45680d191b8958 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Thu, 23 Jan 2025 10:37:56 +0800 Subject: [PATCH 22/51] Revert "[action] add cvitek/c906_little ci" (#9945) Revert "[action] add cvitek/c906_little ci (#9901)" This reverts commit 969e0e01ef603d3929a186e8bd03f3657ec8227c. --- .github/workflows/bsp_buildings.yml | 14 +------------- bsp/cvitek/c906_little/rtconfig.py | 2 +- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index 497c2fe04b6..488583e39b6 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -346,10 +346,6 @@ jobs: - "raspberry-pi/raspi4-64" #- "rockchip/rk3568" too long - "phytium/aarch64" - - RTT_BSP: "xuantie-900" - RTT_TOOL_CHAIN: "sourcery-Xuantie-900-gcc-elf" - SUB_RTT_BSP: - - "cvitek/c906_little" - RTT_BSP: "riscv-none" RTT_TOOL_CHAIN: "sourcery-riscv-none-embed" SUB_RTT_BSP: @@ -442,15 +438,7 @@ jobs: sudo tar -xf gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf.tar.xz -C /opt /opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gcc --version echo "RTT_EXEC_PATH=/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf/bin" >> $GITHUB_ENV - - - name: Install Xuantie-900-gcc-elf Tools - if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'sourcery-Xuantie-900-gcc-elf' && success() }} - run: | - wget -q https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1705395512373/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1-20240115.tar.gz - sudo tar -zxvf Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1-20240115.tar.gz -C /opt - /opt/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1/bin/riscv64-unknown-elf-gcc --version - echo "RTT_EXEC_PATH=/opt/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1/bin" >> $GITHUB_ENV - + - name: Install Mips ToolChains if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'sourcery-mips' && success() }} shell: bash diff --git a/bsp/cvitek/c906_little/rtconfig.py b/bsp/cvitek/c906_little/rtconfig.py index efe793e2194..50c32d55617 100755 --- a/bsp/cvitek/c906_little/rtconfig.py +++ b/bsp/cvitek/c906_little/rtconfig.py @@ -64,4 +64,4 @@ DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n' POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' -#POST_ACTION += 'cd .. && bash combine-fip.sh ' + os.getcwd() + ' rtthread.bin' + ' \n' +POST_ACTION += 'cd .. && bash combine-fip.sh ' + os.getcwd() + ' rtthread.bin' + ' \n' \ No newline at end of file From 4d4c9660ce9323fef34f3601662c5863cbc1de15 Mon Sep 17 00:00:00 2001 From: wumingzi <62127946+1078249029@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:14:43 +0800 Subject: [PATCH 23/51] [doxygen] add doxygen comment for blk.h (#9947) Signed-off-by: 1078249029 <1078249029@qq.com> --- components/drivers/include/drivers/blk.h | 53 +++++++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/components/drivers/include/drivers/blk.h b/components/drivers/include/drivers/blk.h index 42159c4688b..b0463e0a5c0 100644 --- a/components/drivers/include/drivers/blk.h +++ b/components/drivers/include/drivers/blk.h @@ -1,11 +1,12 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-02-25 GuEe-GUI first version + * 2025-01-24 wumingzi add doxygen comment */ #ifndef __BLK_H__ @@ -15,10 +16,22 @@ #include #include +/** + * @addtogroup Drivers RTTHREAD Driver + * @defgroup blk blk + * @brief blk driver api + * @ingroup Drivers + * @addtogroup blk + * @{ + */ + struct rt_dm_ida; struct rt_blk_device; struct rt_blk_disk_ops; +/** + * @brief Physical blk device + */ struct rt_blk_disk { struct rt_device parent; @@ -44,6 +57,9 @@ struct rt_blk_disk struct rt_semaphore usr_lock; }; +/** + * @brief Configure the blk device. + */ struct rt_blk_disk_ops { rt_ssize_t (*read)(struct rt_blk_disk *disk, rt_off_t sector, void *buffer, @@ -60,6 +76,9 @@ struct rt_blk_disk_ops #ifndef __DFS_H__ #include +/** + * @brief Logical blk device, if you don't used DFS it will be defined by default. + */ struct rt_blk_device { struct rt_device parent; @@ -77,11 +96,41 @@ struct rt_blk_device struct rt_blk_device; #endif /* __DFS_H__ */ +/** + * @brief Register the blk disk device + * @param disk Point to blk disk + * @return rt_err_t error code + */ rt_err_t rt_hw_blk_disk_register(struct rt_blk_disk *disk); + +/** + * @brief Unregister the blk disk device + * @param disk Point to blk disk + * @return rt_err_t error code + */ rt_err_t rt_hw_blk_disk_unregister(struct rt_blk_disk *disk); +/** + * @brief Probe and register the blk disk partition + * @param disk Point to blk disk + * @return rt_err_t error code + */ rt_err_t rt_blk_disk_probe_partition(struct rt_blk_disk *disk); + +/** + * @brief Get the blk disk capacity + * @param disk Point to blk disk + * @return rt_ssize_t sector count or error code + */ rt_ssize_t rt_blk_disk_get_capacity(struct rt_blk_disk *disk); + +/** + * @brief Get the sector size + * @param disk Point to blk disk + * @return rt_ssize_t bytes per sector or error code + */ rt_ssize_t rt_blk_disk_get_logical_block_size(struct rt_blk_disk *disk); -#endif /* __BLK_H__ */ +/*! @}*/ + +#endif /* __BLK_H__ */ \ No newline at end of file From 2a18d6873b6f3b22e9900197f2ea480d1e0fa4f4 Mon Sep 17 00:00:00 2001 From: hydevcode Date: Fri, 24 Jan 2025 23:12:25 +0800 Subject: [PATCH 24/51] [bsp][nrf5x]added the cherryusb adapter for nrf52840 (#9939) --- .../.ci/attachconfig/ci.attachconfig.yml | 11 +- bsp/nrf5x/nrf52840/board/SConscript | 6 + bsp/nrf5x/nrf52840/board/port/SConscript | 21 + .../nrf52840/board/port/cherryusb/cherryusb.c | 70 + .../board/port/cherryusb/usb_config.h | 137 ++ bsp/nrf5x/nrf52840/board/sdk_config.h | 2 +- components/drivers/usb/cherryusb/Kconfig | 2 + components/drivers/usb/cherryusb/SConscript | 2 + .../usb/cherryusb/port/nrf5x/README.md | 9 + .../usb/cherryusb/port/nrf5x/usb_dc_nrf5x.c | 1321 +++++++++++++++++ 10 files changed, 1579 insertions(+), 2 deletions(-) create mode 100644 bsp/nrf5x/nrf52840/board/port/SConscript create mode 100644 bsp/nrf5x/nrf52840/board/port/cherryusb/cherryusb.c create mode 100644 bsp/nrf5x/nrf52840/board/port/cherryusb/usb_config.h create mode 100644 components/drivers/usb/cherryusb/port/nrf5x/README.md create mode 100644 components/drivers/usb/cherryusb/port/nrf5x/usb_dc_nrf5x.c diff --git a/bsp/nrf5x/nrf52840/.ci/attachconfig/ci.attachconfig.yml b/bsp/nrf5x/nrf52840/.ci/attachconfig/ci.attachconfig.yml index e923d7a470f..a170defb5a6 100644 --- a/bsp/nrf5x/nrf52840/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/nrf5x/nrf52840/.ci/attachconfig/ci.attachconfig.yml @@ -98,4 +98,13 @@ nimble.uart: segger: kconfig: - CONFIG_PKG_USING_SEGGER_RTT=y - - CONFIG_RT_USING_SERIAL_V2=y \ No newline at end of file + - CONFIG_RT_USING_SERIAL_V2=y +# ------ component CI ------ +component.cherryusb_hid_keyboard: + kconfig: + - CONFIG_RT_USING_CHERRYUSB=y + - CONFIG_RT_CHERRYUSB_DEVICE=y + - CONFIG_RT_CHERRYUSB_DEVICE_NRF5X=y + - CONFIG_RT_CHERRYUSB_DEVICE_HID=y + - CONFIG_RT_CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD=y + - CONFIG_RT_USING_MESSAGEQUEUE=y \ No newline at end of file diff --git a/bsp/nrf5x/nrf52840/board/SConscript b/bsp/nrf5x/nrf52840/board/SConscript index d74f1a8861f..3b5a2f09406 100644 --- a/bsp/nrf5x/nrf52840/board/SConscript +++ b/bsp/nrf5x/nrf52840/board/SConscript @@ -7,4 +7,10 @@ src = Glob('*.c') CPPPATH = [cwd] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + Return('group') diff --git a/bsp/nrf5x/nrf52840/board/port/SConscript b/bsp/nrf5x/nrf52840/board/port/SConscript new file mode 100644 index 00000000000..d15a67f3586 --- /dev/null +++ b/bsp/nrf5x/nrf52840/board/port/SConscript @@ -0,0 +1,21 @@ +import os +from building import * + +cwd = GetCurrentDir() + +# add general drivers +src = [] +path = [] + +if GetDepend(['RT_USING_CHERRYUSB']): + src += Glob('cherryusb/cherryusb.c') + path += [cwd + '/cherryusb'] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') \ No newline at end of file diff --git a/bsp/nrf5x/nrf52840/board/port/cherryusb/cherryusb.c b/bsp/nrf5x/nrf52840/board/port/cherryusb/cherryusb.c new file mode 100644 index 00000000000..3212e3ecc98 --- /dev/null +++ b/bsp/nrf5x/nrf52840/board/port/cherryusb/cherryusb.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include "nrf.h" +#include "nrfx_usbd.h" +#include "nrfx_clock.h" +#include "nrfx_power.h" + +void usb_dc_low_level_post_init(void) +{ + /* Enable interrupt globally */ + NRFX_IRQ_PRIORITY_SET(USBD_IRQn, NRFX_USBD_CONFIG_IRQ_PRIORITY); + NRFX_IRQ_ENABLE(USBD_IRQn); +} + +extern void cherry_usb_hal_nrf_power_event(uint32_t event); +static void power_event_handler(nrfx_power_usb_evt_t event) +{ + cherry_usb_hal_nrf_power_event((uint32_t)event); +} + +void usb_dc_low_level_pre_init(void) +{ + uint32_t usb_reg; + const nrfx_power_usbevt_config_t config = {.handler = power_event_handler}; + nrfx_power_usbevt_init(&config); + nrfx_power_usbevt_enable(); + usb_reg = NRF_POWER->USBREGSTATUS; + + if (usb_reg & POWER_USBREGSTATUS_VBUSDETECT_Msk) + { + cherry_usb_hal_nrf_power_event(NRFX_POWER_USB_EVT_DETECTED); + } + + if (usb_reg & POWER_USBREGSTATUS_OUTPUTRDY_Msk) + { + cherry_usb_hal_nrf_power_event(NRFX_POWER_USB_EVT_READY); + } +} + +void usb_low_clear_pending_irq(void) +{ + NVIC_ClearPendingIRQ(USBD_IRQn); +} + +void usb_low_disable_irq(void) +{ + NVIC_DisableIRQ(USBD_IRQn); +} + +int cherryusb_protocol_stack_init(void) +{ +#ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM + extern void cdc_acm_init(void); + cdc_acm_init(); + rt_kprintf("cdc acm example started. \r\n"); +#elif defined RT_CHERRYUSB_DEVICE_TEMPLATE_MSC + extern void msc_ram_init(void); + msc_ram_init(); + rt_kprintf("msc ram example started. \r\n"); +#elif defined RT_CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD + extern void hid_keyboard_init(uint8_t busid, uintptr_t reg_base); + hid_keyboard_init(0,NULL); + rt_kprintf("hid keyboard example started. \r\n"); +#endif +} + +INIT_APP_EXPORT(cherryusb_protocol_stack_init); \ No newline at end of file diff --git a/bsp/nrf5x/nrf52840/board/port/cherryusb/usb_config.h b/bsp/nrf5x/nrf52840/board/port/cherryusb/usb_config.h new file mode 100644 index 00000000000..84acee78d0e --- /dev/null +++ b/bsp/nrf5x/nrf52840/board/port/cherryusb/usb_config.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2022, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + + +#include + +/* ================ USB common Configuration ================ */ +#define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) +#define usb_malloc(size) malloc(size) +#define usb_free(ptr) free(ptr) + +#ifndef CONFIG_USB_DBG_LEVEL +//#define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#define CONFIG_USB_DBG_LEVEL 3 +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +/* data align size when use dma */ +#ifndef CONFIG_USB_ALIGN_SIZE +#define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 max transfer buffer, specially for receiving data from ep0 out */ +#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 256 + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN +#define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE +#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING +#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING +#define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING +#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRIO +#define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE +#define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE +#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1536 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID +#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC +#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO +#define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE +#define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 + +/* Ep0 max transfer buffer */ +#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT +#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT +#define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* ================ USB Device Port Configuration ================*/ +#define CONFIG_USBDEV_MAX_BUS 1 + +#define CONFIG_USBDEV_EP_NUM 8 +#define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 + +/* ================ USB Host Port Configuration ==================*/ + +#define CONFIG_USBHOST_PIPE_NUM 10 + +/* ================ EHCI Configuration ================ */ + +#define CONFIG_USB_EHCI_HCCR_BASE (0x20072000) +#define CONFIG_USB_EHCI_HCOR_BASE (0x20072000 + 0x10) +#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024 + +#endif \ No newline at end of file diff --git a/bsp/nrf5x/nrf52840/board/sdk_config.h b/bsp/nrf5x/nrf52840/board/sdk_config.h index 25fa4938fa5..0f0d9c1854e 100644 --- a/bsp/nrf5x/nrf52840/board/sdk_config.h +++ b/bsp/nrf5x/nrf52840/board/sdk_config.h @@ -2472,7 +2472,7 @@ // NRFX_POWER_ENABLED - nrfx_power - POWER peripheral driver //========================================================== #ifndef NRFX_POWER_ENABLED -#define NRFX_POWER_ENABLED 0 +#define NRFX_POWER_ENABLED 1 #endif // NRFX_POWER_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority diff --git a/components/drivers/usb/cherryusb/Kconfig b/components/drivers/usb/cherryusb/Kconfig index 67c6ad543a1..256690cbab6 100644 --- a/components/drivers/usb/cherryusb/Kconfig +++ b/components/drivers/usb/cherryusb/Kconfig @@ -68,6 +68,8 @@ if RT_USING_CHERRYUSB bool "aic" config RT_CHERRYUSB_DEVICE_PUSB2 bool "pusb2" + config RT_CHERRYUSB_DEVICE_NRF5X + bool "nrf5x" endchoice config RT_CHERRYUSB_DEVICE_CDC_ACM diff --git a/components/drivers/usb/cherryusb/SConscript b/components/drivers/usb/cherryusb/SConscript index 58d0aa01c2c..29cbd4ae805 100644 --- a/components/drivers/usb/cherryusb/SConscript +++ b/components/drivers/usb/cherryusb/SConscript @@ -28,6 +28,8 @@ if GetDepend(['RT_CHERRYUSB_DEVICE']): if GetDepend(['RT_CHERRYUSB_DEVICE_SPEED_HS']): CPPDEFINES+=['CONFIG_USB_HS'] + if GetDepend(['RT_CHERRYUSB_DEVICE_NRF5X']): + src += Glob('port/nrf5x/usb_dc_nrf5x.c') if GetDepend(['RT_CHERRYUSB_DEVICE_FSDEV']): src += Glob('port/fsdev/usb_dc_fsdev.c') if GetDepend(['RT_CHERRYUSB_DEVICE_DWC2_ST']): diff --git a/components/drivers/usb/cherryusb/port/nrf5x/README.md b/components/drivers/usb/cherryusb/port/nrf5x/README.md new file mode 100644 index 00000000000..5f976a0272d --- /dev/null +++ b/components/drivers/usb/cherryusb/port/nrf5x/README.md @@ -0,0 +1,9 @@ +# Note + +## Support Chip List + +- NRF5x + +## Before Use + +- Your should implement `usb_dc_low_level_pre_init`,`usb_dc_low_level_post_init`,`usb_dc_low_level_deinit`. \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/port/nrf5x/usb_dc_nrf5x.c b/components/drivers/usb/cherryusb/port/nrf5x/usb_dc_nrf5x.c new file mode 100644 index 00000000000..6e42c690c66 --- /dev/null +++ b/components/drivers/usb/cherryusb/port/nrf5x/usb_dc_nrf5x.c @@ -0,0 +1,1321 @@ +#include +#include +#include "nrf52840.h" +#include "usb_def.h" +#include "usb_dc.h" +#include "usbd_core.h" + +#ifndef USBD_IRQHandler +#define USBD_IRQHandler USBD_IRQHandler /*!< Use actual usb irq name instead */ +#endif + +#ifndef USBD_CONFIG_ISO_IN_ZLP +#define USBD_CONFIG_ISO_IN_ZLP 0 +#endif + +/*!< The default platform is NRF52840 */ +#define NRF52_SERIES +/*!< Ep nums */ +#define EP_NUMS 9 +/*!< Ep mps */ +#define EP_MPS 64 +/*!< Nrf5x special */ +#define EP_ISO_NUM 8 + +/*!< USBD peripheral address base */ +#define NRF_USBD_BASE 0x40027000UL +/*!< Clock peripheral address base */ +#define NRF_CLOCK_BASE 0x40000000UL + +#define USBD_IRQn 39 + +#ifndef EP_ISO_MPS +#define EP_ISO_MPS 64 +#endif + +#define CHECK_ADD_IS_RAM(address) ((((uint32_t)address) & 0xE0000000u) == 0x20000000u) ? 1 : 0 + +/** + * @brief Endpoint information structure + */ +typedef struct _usbd_ep_info +{ + uint16_t mps; /*!< Maximum packet length of endpoint */ + uint8_t eptype; /*!< Endpoint Type */ + uint8_t ep_stalled; /* Endpoint stall flag */ + uint8_t ep_enable; /* Endpoint enable */ + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t actual_xfer_len; + uint8_t ep_buffer[EP_MPS]; + /*!< Other endpoint parameters that may be used */ + volatile uint8_t is_using_dma; + volatile uint8_t add_flag; +} usbd_ep_info; + +/*!< nrf52840 usb */ +struct _nrf52840_core_prvi +{ + uint8_t address; /*!< address */ + usbd_ep_info ep_in[EP_NUMS]; /*!< ep in */ + usbd_ep_info ep_out[EP_NUMS]; /*!< ep out */ + struct usb_setup_packet setup; /*!< Setup package that may be used in interrupt processing (outside the protocol stack) */ + volatile uint8_t dma_running; + int8_t in_count; + volatile uint8_t iso_turn; + volatile uint8_t iso_tx_is_ready; + /** + * For nrf5x, easydma will not move the setup packet into RAM. + * We use a flag bit to judge whether the host sends setup, + * and then notify usbd_ep_read to and from the register to read the setup package + */ + volatile uint8_t is_setup_packet; +} usb_dc_cfg; + +__WEAK void usb_dc_low_level_pre_init(void) +{ +} + +__WEAK void usb_dc_low_level_post_init(void) +{ +} + +__WEAK void usb_dc_low_level_deinit(void) +{ +} + + +/**@brief Usbds the set remote wakeup. + * + * @param[in] busid do not used + * + * @retval + */ +int usbd_set_remote_wakeup (uint8_t busid) +{ + //TOGGLE_GPIOA9(); + //#TASK 1.唤醒使能+挂起标志+休眠标志 + // USB->CNTR |= (uint16_t)USB_CNTR_RESUME; + return -1; +} + +/** + * @brief Get setup package + * @pre None + * @param[in] setup Pointer to the address where the setup package is stored + * @retval None + */ +static inline void get_setup_packet(struct usb_setup_packet *setup) +{ + setup->bmRequestType = (uint8_t)(NRF_USBD->BMREQUESTTYPE); + setup->bRequest = (uint8_t)(NRF_USBD->BREQUEST); + setup->wIndex = (uint16_t)(NRF_USBD->WINDEXL | ((NRF_USBD->WINDEXH) << 8)); + setup->wLength = (uint16_t)(NRF_USBD->WLENGTHL | ((NRF_USBD->WLENGTHH) << 8)); + setup->wValue = (uint16_t)(NRF_USBD->WVALUEL | ((NRF_USBD->WVALUEH) << 8)); +} + +/** + * @brief Set tx easydma + * @pre None + * @param[in] ep End point address + * @param[in] ptr Data ram ptr + * @param[in] maxcnt Max length + * @retval None + */ +static void nrf_usbd_ep_easydma_set_tx(uint8_t ep, uint32_t ptr, uint32_t maxcnt) +{ + uint8_t epid = USB_EP_GET_IDX(ep); + if (epid == EP_ISO_NUM) + { + NRF_USBD->ISOIN.PTR = ptr; + NRF_USBD->ISOIN.MAXCNT = maxcnt; + return; + } + NRF_USBD->EPIN[epid].PTR = ptr; + NRF_USBD->EPIN[epid].MAXCNT = maxcnt; +} + +/** + * @brief Set rx easydma + * @pre None + * @param[in] ep End point address + * @param[in] ptr Data ram ptr + * @param[in] maxcnt Max length + * @retval None + */ +static void nrf_usbd_ep_easydma_set_rx(uint8_t ep, uint32_t ptr, uint32_t maxcnt) +{ + uint8_t epid = USB_EP_GET_IDX(ep); + if (epid == EP_ISO_NUM) + { + NRF_USBD->ISOOUT.PTR = ptr; + NRF_USBD->ISOOUT.MAXCNT = maxcnt; + return; + } + NRF_USBD->EPOUT[epid].PTR = ptr; + NRF_USBD->EPOUT[epid].MAXCNT = maxcnt; +} + +/**@brief Usbds the set address. + * + * @param[in] usbid do not used + * @param[in] address 8-bit valid address + * + * @retval >=0 success otherwise failureSet addressNone + */ +int usbd_set_address(uint8_t usbid, const uint8_t address) +{ + if (address == 0) + { + /*!< init 0 address */ + } + else + { + /*!< For non-0 addresses, write the address to the register in the state phase of setting the address */ + } + + NRF_USBD->EVENTCAUSE |= NRF_USBD->EVENTCAUSE; + NRF_USBD->EVENTS_USBEVENT = 0; + + NRF_USBD->INTENSET = USBD_INTEN_USBEVENT_Msk; + /*!< nothing to do, handled by hardware; but don't STALL */ + usb_dc_cfg.address = address; + return 0; +} + +uint8_t usbd_get_port_speed(const uint8_t port) +{ + return USB_SPEED_FULL; +} + +/**@brief Usbds the ep open. + * + * @param[in] busid do not used + * @param[in] ep_cfg Endpoint configuration structure pointer + * + * @retval >=0 success otherwise failureOpen endpointNone + */ +int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep_cfg) +{ + /*!< ep id */ + uint8_t epid = USB_EP_GET_IDX(ep_cfg->bEndpointAddress); + /*!< ep max packet length */ + uint16_t mps = ep_cfg->wMaxPacketSize; + if (USB_EP_DIR_IS_IN(ep_cfg->bEndpointAddress)) + { + /*!< In */ + usb_dc_cfg.ep_in[epid].mps = mps; + usb_dc_cfg.ep_in[epid].eptype = ep_cfg->bmAttributes; + usb_dc_cfg.ep_in[epid].ep_enable = true; + /*!< Open ep */ + if (ep_cfg->bmAttributes != USB_ENDPOINT_TYPE_ISOCHRONOUS) + { + /*!< Enable endpoint interrupt */ + NRF_USBD->INTENSET = (1 << (USBD_INTEN_ENDEPIN0_Pos + epid)); + /*!< Enable the in endpoint host to respond when sending in token */ + NRF_USBD->EPINEN |= (1 << (epid)); + __ISB(); + __DSB(); + } + else + { + NRF_USBD->EVENTS_ENDISOIN = 0; + /*!< SPLIT ISO buffer when ISO OUT endpoint is already opened. */ + if (usb_dc_cfg.ep_out[EP_ISO_NUM].mps) + NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_HalfIN; + + /*!< Clear SOF event in case interrupt was not enabled yet. */ + if ((NRF_USBD->INTEN & USBD_INTEN_SOF_Msk) == 0) + NRF_USBD->EVENTS_SOF = 0; + + /*!< Enable SOF and ISOIN interrupts, and ISOIN endpoint. */ + NRF_USBD->INTENSET = USBD_INTENSET_ENDISOIN_Msk | USBD_INTENSET_SOF_Msk; + NRF_USBD->EPINEN |= USBD_EPINEN_ISOIN_Msk; + } + } + else if (USB_EP_DIR_IS_OUT(ep_cfg->bEndpointAddress)) + { + /*!< Out */ + usb_dc_cfg.ep_out[epid].mps = mps; + usb_dc_cfg.ep_out[epid].eptype = ep_cfg->bmAttributes; + usb_dc_cfg.ep_out[epid].ep_enable = true; + /*!< Open ep */ + if (ep_cfg->bmAttributes != USB_ENDPOINT_TYPE_ISOCHRONOUS) + { + NRF_USBD->INTENSET = (1 << (USBD_INTEN_ENDEPOUT0_Pos + epid)); + NRF_USBD->EPOUTEN |= (1 << (epid)); + __ISB(); + __DSB(); + /*!< Write any value to SIZE register will allow nRF to ACK/accept data */ + NRF_USBD->SIZE.EPOUT[epid] = 0; + } + else + { + /*!< SPLIT ISO buffer when ISO IN endpoint is already opened. */ + if (usb_dc_cfg.ep_in[EP_ISO_NUM].mps) + NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_HalfIN; + + /*!< Clear old events */ + NRF_USBD->EVENTS_ENDISOOUT = 0; + + /*!< Clear SOF event in case interrupt was not enabled yet. */ + if ((NRF_USBD->INTEN & USBD_INTEN_SOF_Msk) == 0) + NRF_USBD->EVENTS_SOF = 0; + + /*!< Enable SOF and ISOOUT interrupts, and ISOOUT endpoint. */ + NRF_USBD->INTENSET = USBD_INTENSET_ENDISOOUT_Msk | USBD_INTENSET_SOF_Msk; + NRF_USBD->EPOUTEN |= USBD_EPOUTEN_ISOOUT_Msk; + } + } + + /*!< Clear stall and reset DataToggle */ + NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_UnStall << USBD_EPSTALL_STALL_Pos) | (ep_cfg->bEndpointAddress); + NRF_USBD->DTOGGLE = (USBD_DTOGGLE_VALUE_Data0 << USBD_DTOGGLE_VALUE_Pos) | (ep_cfg->bEndpointAddress); + + __ISB(); + __DSB(); + + return 0; +} + +/**@brief Usbds the ep close. + * + * @param[in] busid do not used + * @param[in] ep ep : Endpoint address + * + * @retval >=0 success otherwise failureClose endpointNone + */ +int usbd_ep_close(uint8_t busid, const uint8_t ep) +{ + /*!< ep id */ + uint8_t epid = USB_EP_GET_IDX(ep); + if (epid != EP_ISO_NUM) + { + + if (USB_EP_DIR_IS_OUT(ep)) + { + usb_dc_cfg.ep_out[epid].ep_enable = false; + NRF_USBD->INTENCLR = (1 << (USBD_INTEN_ENDEPOUT0_Pos + epid)); + NRF_USBD->EPOUTEN &= ~(1 << (epid)); + } + else + { + usb_dc_cfg.ep_in[epid].ep_enable = false; + NRF_USBD->INTENCLR = (1 << (USBD_INTEN_ENDEPIN0_Pos + epid)); + NRF_USBD->EPINEN &= ~(1 << (epid)); + } + } + else + { + /*!< ISO EP */ + if (USB_EP_DIR_IS_OUT(ep)) + { + usb_dc_cfg.ep_out[epid].ep_enable = false; + usb_dc_cfg.ep_out[EP_ISO_NUM].mps = 0; + NRF_USBD->INTENCLR = USBD_INTENCLR_ENDISOOUT_Msk; + NRF_USBD->EPOUTEN &= ~USBD_EPOUTEN_ISOOUT_Msk; + NRF_USBD->EVENTS_ENDISOOUT = 0; + } + else + { + usb_dc_cfg.ep_in[epid].ep_enable = false; + usb_dc_cfg.ep_in[EP_ISO_NUM].mps = 0; + NRF_USBD->INTENCLR = USBD_INTENCLR_ENDISOIN_Msk; + NRF_USBD->EPINEN &= ~USBD_EPINEN_ISOIN_Msk; + } + /*!< One of the ISO endpoints closed, no need to split buffers any more. */ + NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_OneDir; + /*!< When both ISO endpoint are close there is no need for SOF any more. */ + if (usb_dc_cfg.ep_in[EP_ISO_NUM].mps + usb_dc_cfg.ep_out[EP_ISO_NUM].mps == 0) + { + NRF_USBD->INTENCLR = USBD_INTENCLR_SOF_Msk; + } + } + __ISB(); + __DSB(); + + return 0; +} + +/** + * @brief Setup in ep transfer setting and start transfer. + * + * This function is asynchronous. + * This function is similar to uart with tx dma. + * + * This function is called to write data to the specified endpoint. The + * supplied usbd_endpoint_callback function will be called when data is transmitted + * out. + * + * @param[in] busid do not used + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] data Pointer to data to write + * @param[in] data_len Length of the data requested to write. This may + * be zero for a zero length status packet. + * @return 0 on success, negative errno code on fail. + */ +int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) + { + return -1; + } + if (!usb_dc_cfg.ep_in[ep_idx].ep_enable) + { + return -2; + } + if ((uint32_t)data & 0x03) + { + return -3; + } + + usb_dc_cfg.ep_in[ep_idx].xfer_buf = (uint8_t *)data; + usb_dc_cfg.ep_in[ep_idx].xfer_len = data_len; + usb_dc_cfg.ep_in[ep_idx].actual_xfer_len = 0; + + if (data_len == 0) + { + /*!< write 0 len data */ + nrf_usbd_ep_easydma_set_tx(ep_idx, (uint32_t)NULL, 0); + NRF_USBD->TASKS_STARTEPIN[ep_idx] = 1; + } + else + { + /*!< Not zlp */ + data_len = MIN(data_len, usb_dc_cfg.ep_in[ep_idx].mps); + if (!CHECK_ADD_IS_RAM(data)) + { + /*!< Data is not in ram */ + /*!< Memcpy data to ram */ + memcpy(usb_dc_cfg.ep_in[ep_idx].ep_buffer, data, data_len); + nrf_usbd_ep_easydma_set_tx(ep_idx, (uint32_t)usb_dc_cfg.ep_in[ep_idx].ep_buffer, data_len); + } + else + { + nrf_usbd_ep_easydma_set_tx(ep_idx, (uint32_t)data, data_len); + } + /** + * Note that starting DMA transmission is to transmit data to USB peripherals, + * and then wait for the host to get it + */ + /*!< Start dma transfer */ + if (ep_idx != EP_ISO_NUM) + { + NRF_USBD->TASKS_STARTEPIN[ep_idx] = 1; + } + else + { + // NRF_USBD->TASKS_STARTISOIN = 1; + usb_dc_cfg.iso_tx_is_ready = 1; + } + } + return 0; +} + +/** + * @brief Setup out ep transfer setting and start transfer. + * + * This function is asynchronous. + * This function is similar to uart with rx dma. + * + * This function is called to read data to the specified endpoint. The + * supplied usbd_endpoint_callback function will be called when data is received + * in. + * + * @param[in] busid do not used + * @param[in] ep Endpoint address corresponding to the one + * listed in the device configuration table + * @param[in] data Pointer to data to read + * @param[in] data_len Max length of the data requested to read. + * + * @return 0 on success, negative errno code on fail. + */ +int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len) +{ + uint8_t ep_idx = USB_EP_GET_IDX(ep); + + if (!data && data_len) + { + return -1; + } + if (!usb_dc_cfg.ep_out[ep_idx].ep_enable) + { + return -2; + } + if ((uint32_t)data & 0x03) + { + return -3; + } + + usb_dc_cfg.ep_out[ep_idx].xfer_buf = (uint8_t *)data; + usb_dc_cfg.ep_out[ep_idx].xfer_len = data_len; + usb_dc_cfg.ep_out[ep_idx].actual_xfer_len = 0; + + if (data_len == 0) + { + return 0; + } + else + { + data_len = MIN(data_len, usb_dc_cfg.ep_out[ep_idx].mps); + if (!CHECK_ADD_IS_RAM(data)) + { + /*!< Data address is not in ram */ + // TODO: + } + else + { + if (ep_idx == 0) + { + NRF_USBD->TASKS_EP0RCVOUT = 1; + } + nrf_usbd_ep_easydma_set_rx(ep_idx, (uint32_t)data, data_len); + } + } + return 0; +} + +/** + * @brief Endpoint setting pause + * @pre None + * @param[in] busid do not used + * @param[in] ep : Endpoint address + * @retval >=0 success otherwise failure + */ +int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) +{ + /*!< ep id */ + uint8_t epid = USB_EP_GET_IDX(ep); + if (epid == 0) + { + NRF_USBD->TASKS_EP0STALL = 1; + } + else if (epid != EP_ISO_NUM) + { + NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_Stall << USBD_EPSTALL_STALL_Pos) | (ep); + } + __ISB(); + __DSB(); + return 0; +} + +/** + * @brief Endpoint clear pause + * @pre None + * @param[in] busid do not used + * @param[in] ep : Endpoint address + * @retval >=0 success otherwise failure + */ +int usbd_ep_clear_stall(uint8_t usbid, const uint8_t ep) +{ + /*!< ep id */ + uint8_t epid = USB_EP_GET_IDX(ep); + + if (epid != 0 && epid != EP_ISO_NUM) + { + /** + * reset data toggle to DATA0 + * First write this register with VALUE=Nop to select the endpoint, then either read it to get the status from + * VALUE, or write it again with VALUE=Data0 or Data1 + */ + NRF_USBD->DTOGGLE = ep; + NRF_USBD->DTOGGLE = (USBD_DTOGGLE_VALUE_Data0 << USBD_DTOGGLE_VALUE_Pos) | ep; + + /*!< Clear stall */ + NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_UnStall << USBD_EPSTALL_STALL_Pos) | ep; + + /*!< Write any value to SIZE register will allow nRF to ACK/accept data */ + if (USB_EP_DIR_IS_OUT(ep)) + NRF_USBD->SIZE.EPOUT[epid] = 0; + + __ISB(); + __DSB(); + } + + return 0; +} + +/** + * @brief Check endpoint status + * @pre None + * @param[in] busid do not used + * @param[in] ep : Endpoint address + * @param[out] stalled : Outgoing endpoint status + * @retval >=0 success otherwise failure + */ +int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled) +{ + return 0; +} + +/** + * @brief USB initialization + * @pre None + * @param[in] busid do not used + * @retval >=0 success otherwise failure + */ +int usb_dc_init(uint8_t busid) +{ + /*!< dc init */ + usb_dc_low_level_pre_init(); + + memset(&usb_dc_cfg, 0, sizeof(usb_dc_cfg)); + /*!< Clear USB Event Interrupt */ + NRF_USBD->EVENTS_USBEVENT = 0; + NRF_USBD->EVENTCAUSE |= NRF_USBD->EVENTCAUSE; + + /*!< Reset interrupt */ + NRF_USBD->INTENCLR = NRF_USBD->INTEN; + NRF_USBD->INTENSET = USBD_INTEN_USBRESET_Msk | USBD_INTEN_USBEVENT_Msk | USBD_INTEN_EPDATA_Msk | + USBD_INTEN_EP0SETUP_Msk | USBD_INTEN_EP0DATADONE_Msk | USBD_INTEN_ENDEPIN0_Msk | USBD_INTEN_ENDEPOUT0_Msk | USBD_INTEN_STARTED_Msk; + + usb_dc_low_level_post_init(); + return 0; +} + +/** + * @brief USB deinit + * @pre None + * @param[in] busid do not used + * @retval >=0 success otherwise failure + */ +int usb_dc_deinit(uint8_t busid) +{ + /*!< dc deinit */ + return 0; +} + +/** + * @brief USB interrupt processing function + * @pre None + * @param[in] None + * @retval None + */ +void USBD_IRQHandler(void) +{ + uint32_t const inten = NRF_USBD->INTEN; + uint32_t int_status = 0; + volatile uint32_t usb_event = 0; + volatile uint32_t *regevt = &NRF_USBD->EVENTS_USBRESET; + + /*!< Traverse USB events */ + for (uint8_t i = 0; i < USBD_INTEN_EPDATA_Pos + 1; i++) + { + if ((inten & (1 << i)) && regevt[i]) + { + int_status |= (1 << (i)); + /*!< event clear */ + regevt[i] = 0; + __ISB(); + __DSB(); + } + } + + /*!< bit 24 */ + if (int_status & USBD_INTEN_EPDATA_Msk) + { + /*!< out ep */ + for (uint8_t ep_out_ct = 1; ep_out_ct <= 7; ep_out_ct++) + { + if ((NRF_USBD->EPDATASTATUS) & (1 << (16 + ep_out_ct))) + { + NRF_USBD->EPDATASTATUS |= (1 << (16 + ep_out_ct)); + /*!< The data arrives at the usb fifo, starts the dma transmission, and transfers it to the user ram */ + NRF_USBD->TASKS_STARTEPOUT[ep_out_ct] = 1; + } + } + /*!< in ep */ + for (uint8_t ep_in_ct = 1; ep_in_ct <= 7; ep_in_ct++) + { + if ((NRF_USBD->EPDATASTATUS) & (1 << (0 + ep_in_ct))) + { + /*!< in ep tranfer to host successfully */ + NRF_USBD->EPDATASTATUS |= (1 << (0 + ep_in_ct)); + if (usb_dc_cfg.ep_in[ep_in_ct].xfer_len > usb_dc_cfg.ep_in[ep_in_ct].mps) + { + /*!< Need start in again */ + usb_dc_cfg.ep_in[ep_in_ct].xfer_buf += usb_dc_cfg.ep_in[ep_in_ct].mps; + usb_dc_cfg.ep_in[ep_in_ct].xfer_len -= usb_dc_cfg.ep_in[ep_in_ct].mps; + usb_dc_cfg.ep_in[ep_in_ct].actual_xfer_len += usb_dc_cfg.ep_in[ep_in_ct].mps; + if (usb_dc_cfg.ep_in[ep_in_ct].xfer_len > usb_dc_cfg.ep_in[ep_in_ct].mps) + { + nrf_usbd_ep_easydma_set_tx(ep_in_ct, (uint32_t)usb_dc_cfg.ep_in[ep_in_ct].xfer_buf, usb_dc_cfg.ep_in[ep_in_ct].mps); + } + else + { + nrf_usbd_ep_easydma_set_tx(ep_in_ct, (uint32_t)usb_dc_cfg.ep_in[ep_in_ct].xfer_buf, usb_dc_cfg.ep_in[ep_in_ct].xfer_len); + } + NRF_USBD->TASKS_STARTEPIN[ep_in_ct] = 1; + } + else + { + usb_dc_cfg.ep_in[ep_in_ct].actual_xfer_len += usb_dc_cfg.ep_in[ep_in_ct].xfer_len; + usb_dc_cfg.ep_in[ep_in_ct].xfer_len = 0; + usbd_event_ep_in_complete_handler(0, ep_in_ct | 0x80, usb_dc_cfg.ep_in[ep_in_ct].actual_xfer_len); + } + } + } + } + + /*!< bit 23 */ + if (int_status & USBD_INTEN_EP0SETUP_Msk) + { + /* Setup */ + /*!< Storing this setup package will help the following procedures */ + get_setup_packet(&(usb_dc_cfg.setup)); + /*!< Nrf52840 will set the address automatically by hardware, + so the protocol stack of the address setting command sent by the host does not need to be processed */ + + if (usb_dc_cfg.setup.wLength == 0) + { + NRF_USBD->TASKS_EP0STATUS = 1; + } + + if (usb_dc_cfg.setup.bRequest != USB_REQUEST_SET_ADDRESS) + { + usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&(usb_dc_cfg.setup)); + } + } + + /*!< bit 22 */ + if (int_status & USBD_INTEN_USBEVENT_Msk) + { + usb_event = NRF_USBD->EVENTCAUSE; + NRF_USBD->EVENTCAUSE = usb_event; + if (usb_event & USBD_EVENTCAUSE_SUSPEND_Msk) + { + NRF_USBD->LOWPOWER = 1; + /*!< */ + } + if (usb_event & USBD_EVENTCAUSE_RESUME_Msk) + { + /*!< */ + } + if (usb_event & USBD_EVENTCAUSE_USBWUALLOWED_Msk) + { + NRF_USBD->DPDMVALUE = USBD_DPDMVALUE_STATE_Resume; + NRF_USBD->TASKS_DPDMDRIVE = 1; + /** + * There is no Resume interrupt for remote wakeup, enable SOF for to report bus ready state + * Clear SOF event in case interrupt was not enabled yet. + */ + if ((NRF_USBD->INTEN & USBD_INTEN_SOF_Msk) == 0) + NRF_USBD->EVENTS_SOF = 0; + NRF_USBD->INTENSET = USBD_INTENSET_SOF_Msk; + } + } + + /*!< bit 21 */ + if (int_status & USBD_INTEN_SOF_Msk) + { + bool iso_enabled = false; + /*!< ISOOUT: Transfer data gathered in previous frame from buffer to RAM */ + if (NRF_USBD->EPOUTEN & USBD_EPOUTEN_ISOOUT_Msk) + { + iso_enabled = true; + /*!< If ZERO bit is set, ignore ISOOUT length */ + if ((NRF_USBD->SIZE.ISOOUT) & USBD_SIZE_ISOOUT_ZERO_Msk) + { + } + else + { + /*!< Trigger DMA move data from Endpoint -> SRAM */ + NRF_USBD->TASKS_STARTISOOUT = 1; + /*!< EP_ISO_NUM out using dma */ + usb_dc_cfg.ep_out[EP_ISO_NUM].is_using_dma = 1; + } + } + + /*!< ISOIN: Notify client that data was transferred */ + if (NRF_USBD->EPINEN & USBD_EPINEN_ISOIN_Msk) + { + iso_enabled = true; + if (usb_dc_cfg.iso_tx_is_ready == 1) + { + usb_dc_cfg.iso_tx_is_ready = 0; + NRF_USBD->TASKS_STARTISOIN = 1; + } + } + + if (!iso_enabled) + { + /** + * ISO endpoint is not used, SOF is only enabled one-time for remote wakeup + * so we disable it now + */ + NRF_USBD->INTENCLR = USBD_INTENSET_SOF_Msk; + } + } + + /*!< bit 20 */ + if (int_status & USBD_INTEN_ENDISOOUT_Msk) + { + if (usb_dc_cfg.ep_out[EP_ISO_NUM].is_using_dma == 1) + { + usb_dc_cfg.ep_out[EP_ISO_NUM].is_using_dma = 0; + uint32_t read_count = NRF_USBD->SIZE.ISOOUT; + usb_dc_cfg.ep_out[EP_ISO_NUM].xfer_buf += read_count; + usb_dc_cfg.ep_out[EP_ISO_NUM].actual_xfer_len += read_count; + usb_dc_cfg.ep_out[EP_ISO_NUM].xfer_len -= read_count; + + if ((read_count < usb_dc_cfg.ep_out[EP_ISO_NUM].mps) || (usb_dc_cfg.ep_out[EP_ISO_NUM].xfer_len == 0)) + { + usbd_event_ep_out_complete_handler(0, ((EP_ISO_NUM)&0x7f), usb_dc_cfg.ep_out[EP_ISO_NUM].actual_xfer_len); + } + else + { + if (usb_dc_cfg.ep_out[EP_ISO_NUM].xfer_len > usb_dc_cfg.ep_out[EP_ISO_NUM].mps) + { + nrf_usbd_ep_easydma_set_rx(((EP_ISO_NUM)&0x7f), (uint32_t)usb_dc_cfg.ep_out[EP_ISO_NUM].xfer_buf, usb_dc_cfg.ep_out[EP_ISO_NUM].mps); + } + else + { + nrf_usbd_ep_easydma_set_rx(((EP_ISO_NUM)&0x7f), (uint32_t)usb_dc_cfg.ep_out[EP_ISO_NUM].xfer_buf, usb_dc_cfg.ep_out[EP_ISO_NUM].xfer_len); + } + } + } + } + + /** + * Traverse ordinary out endpoint events, starting from endpoint 1 to endpoint 7, + * and end 0 for special processing + */ + for (uint8_t offset = 0; offset < 7; offset++) + { + if (int_status & (USBD_INTEN_ENDEPOUT1_Msk << offset)) + { + /*!< Out 'offset' transfer complete */ + uint32_t read_count = NRF_USBD->SIZE.EPOUT[offset + 1]; + usb_dc_cfg.ep_out[offset + 1].xfer_buf += read_count; + usb_dc_cfg.ep_out[offset + 1].actual_xfer_len += read_count; + usb_dc_cfg.ep_out[offset + 1].xfer_len -= read_count; + + if ((read_count < usb_dc_cfg.ep_out[offset + 1].mps) || (usb_dc_cfg.ep_out[offset + 1].xfer_len == 0)) + { + usbd_event_ep_out_complete_handler(0, ((offset + 1) & 0x7f), usb_dc_cfg.ep_out[offset + 1].actual_xfer_len); + } + else + { + if (usb_dc_cfg.ep_out[offset + 1].xfer_len > usb_dc_cfg.ep_out[offset + 1].mps) + { + nrf_usbd_ep_easydma_set_rx(((offset + 1) & 0x7f), (uint32_t)usb_dc_cfg.ep_out[offset + 1].xfer_buf, usb_dc_cfg.ep_out[offset + 1].mps); + } + else + { + nrf_usbd_ep_easydma_set_rx(((offset + 1) & 0x7f), (uint32_t)usb_dc_cfg.ep_out[offset + 1].xfer_buf, usb_dc_cfg.ep_out[offset + 1].xfer_len); + } + } + } + } + + /*!< bit 12 */ + if (int_status & USBD_INTEN_ENDEPOUT0_Msk) + { + uint32_t read_count = NRF_USBD->SIZE.EPOUT[0]; + usb_dc_cfg.ep_out[0].actual_xfer_len += read_count; + usb_dc_cfg.ep_out[0].xfer_len -= read_count; + + if (usb_dc_cfg.ep_out[0].xfer_len == 0) + { + /*!< Enable the state phase of endpoint 0 */ + NRF_USBD->TASKS_EP0STATUS = 1; + } + + usbd_event_ep_out_complete_handler(0, 0x00, usb_dc_cfg.ep_out[0].actual_xfer_len); + } + + /*!< bit 11 */ + if (int_status & USBD_INTEN_ENDISOIN_Msk) + { + } + + /*!< bit 10 */ + if (int_status & USBD_INTEN_EP0DATADONE_Msk) + { + switch (usb_dc_cfg.setup.bmRequestType >> USB_REQUEST_DIR_SHIFT) + { + case 1: + /*!< IN */ + if (usb_dc_cfg.ep_in[0].xfer_len > usb_dc_cfg.ep_in[0].mps) + { + usb_dc_cfg.ep_in[0].xfer_len -= usb_dc_cfg.ep_in[0].mps; + usb_dc_cfg.ep_in[0].actual_xfer_len += usb_dc_cfg.ep_in[0].mps; + usbd_event_ep_in_complete_handler(0, 0 | 0x80, usb_dc_cfg.ep_in[0].actual_xfer_len); + } + else + { + usb_dc_cfg.ep_in[0].actual_xfer_len += usb_dc_cfg.ep_in[0].xfer_len; + usb_dc_cfg.ep_in[0].xfer_len = 0; + /*!< Enable the state phase of endpoint 0 */ + usbd_event_ep_in_complete_handler(0, 0 | 0x80, usb_dc_cfg.ep_in[0].actual_xfer_len); + NRF_USBD->TASKS_EP0STATUS = 1; + } + break; + case 0: + if (usb_dc_cfg.setup.bRequest != USB_REQUEST_SET_ADDRESS) + { + /*!< The data arrives at the usb fifo, starts the dma transmission, and transfers it to the user ram */ + NRF_USBD->TASKS_STARTEPOUT[0] = 1; + } + break; + } + } + + /** + * Traversing ordinary in endpoint events, starting from endpoint 1 to endpoint 7, + * endpoint 0 special processing + */ + for (uint8_t offset = 0; offset < 7; offset++) + { + if (int_status & (USBD_INTEN_ENDEPIN1_Msk << offset)) + { + /*!< DMA move data completed */ + } + } + + /*!< bit 1 */ + if (int_status & USBD_INTEN_STARTED_Msk) + { + /*!< Easy dma start transfer data */ + } + + /*!< bit 2 */ + if (int_status & USBD_INTEN_ENDEPIN0_Msk) + { + /*!< EP0 IN DMA move data completed */ + } + + /*!< bit 0 */ + if (int_status & USBD_INTEN_USBRESET_Msk) + { + NRF_USBD->EPOUTEN = 1UL; + NRF_USBD->EPINEN = 1UL; + + for (int i = 0; i < 8; i++) + { + NRF_USBD->TASKS_STARTEPIN[i] = 0; + NRF_USBD->TASKS_STARTEPOUT[i] = 0; + } + + NRF_USBD->TASKS_STARTISOIN = 0; + NRF_USBD->TASKS_STARTISOOUT = 0; + + /*!< Clear USB Event Interrupt */ + NRF_USBD->EVENTS_USBEVENT = 0; + NRF_USBD->EVENTCAUSE |= NRF_USBD->EVENTCAUSE; + + /*!< Reset interrupt */ + NRF_USBD->INTENCLR = NRF_USBD->INTEN; + NRF_USBD->INTENSET = USBD_INTEN_USBRESET_Msk | USBD_INTEN_USBEVENT_Msk | USBD_INTEN_EPDATA_Msk | + USBD_INTEN_EP0SETUP_Msk | USBD_INTEN_EP0DATADONE_Msk | USBD_INTEN_ENDEPIN0_Msk | USBD_INTEN_ENDEPOUT0_Msk | USBD_INTEN_STARTED_Msk; + + usbd_event_reset_handler(0); + } +} + +/** + * Errata: USB cannot be enabled. + */ +static bool chyu_nrf52_errata_187(void) +{ +#ifndef NRF52_SERIES + return false; +#else +#if defined(NRF52820_XXAA) || defined(DEVELOP_IN_NRF52820) || defined(NRF52833_XXAA) || defined(DEVELOP_IN_NRF52833) || defined(NRF52840_XXAA) || defined(DEVELOP_IN_NRF52840) + uint32_t var1 = *(uint32_t *)0x10000130ul; + uint32_t var2 = *(uint32_t *)0x10000134ul; +#endif +#if defined(NRF52840_XXAA) || defined(DEVELOP_IN_NRF52840) + if (var1 == 0x08) + { + switch (var2) + { + case 0x00ul: + return false; + case 0x01ul: + return true; + case 0x02ul: + return true; + case 0x03ul: + return true; + default: + return true; + } + } +#endif +#if defined(NRF52833_XXAA) || defined(DEVELOP_IN_NRF52833) + if (var1 == 0x0D) + { + switch (var2) + { + case 0x00ul: + return true; + case 0x01ul: + return true; + default: + return true; + } + } +#endif +#if defined(NRF52820_XXAA) || defined(DEVELOP_IN_NRF52820) + if (var1 == 0x10) + { + switch (var2) + { + case 0x00ul: + return true; + case 0x01ul: + return true; + case 0x02ul: + return true; + default: + return true; + } + } +#endif + return false; +#endif +} + +/** + * Errata: USBD might not reach its active state. + */ +static bool chyu_nrf52_errata_171(void) +{ +#ifndef NRF52_SERIES + return false; +#else +#if defined(NRF52840_XXAA) || defined(DEVELOP_IN_NRF52840) + uint32_t var1 = *(uint32_t *)0x10000130ul; + uint32_t var2 = *(uint32_t *)0x10000134ul; +#endif +#if defined(NRF52840_XXAA) || defined(DEVELOP_IN_NRF52840) + if (var1 == 0x08) + { + switch (var2) + { + case 0x00ul: + return true; + case 0x01ul: + return true; + case 0x02ul: + return true; + case 0x03ul: + return true; + default: + return true; + } + } +#endif + return false; +#endif +} + +/** + * Errata: ISO double buffering not functional. + */ +static bool chyu_nrf52_errata_166(void) +{ +#ifndef NRF52_SERIES + return false; +#else +#if defined(NRF52840_XXAA) || defined(DEVELOP_IN_NRF52840) + uint32_t var1 = *(uint32_t *)0x10000130ul; + uint32_t var2 = *(uint32_t *)0x10000134ul; +#endif +#if defined(NRF52840_XXAA) || defined(DEVELOP_IN_NRF52840) + if (var1 == 0x08) + { + switch (var2) + { + case 0x00ul: + return true; + case 0x01ul: + return true; + case 0x02ul: + return true; + case 0x03ul: + return true; + default: + return true; + } + } +#endif + return false; +#endif +} + +#ifdef SOFTDEVICE_PRESENT + +#include "nrf_mbr.h" +#include "nrf_sdm.h" +#include "nrf_soc.h" + +#ifndef SD_MAGIC_NUMBER +#define SD_MAGIC_NUMBER 0x51B1E5DB +#endif + +static inline bool is_sd_existed(void) +{ + return *((uint32_t *)(SOFTDEVICE_INFO_STRUCT_ADDRESS + 4)) == SD_MAGIC_NUMBER; +} + +/** + * check if SD is existed and enabled + */ +static inline bool is_sd_enabled(void) +{ + if (!is_sd_existed()) + return false; + + uint8_t sd_en = false; + (void)sd_softdevice_is_enabled(&sd_en); + return sd_en; +} +#endif + +static bool hfclk_running(void) +{ +#ifdef SOFTDEVICE_PRESENT + if (is_sd_enabled()) + { + uint32_t is_running = 0; + (void)sd_clock_hfclk_is_running(&is_running); + return (is_running ? true : false); + } +#endif + +#if defined(CLOCK_HFCLKSTAT_SRC_Xtal) || defined(__NRFX_DOXYGEN__) + return (NRF_CLOCK->HFCLKSTAT & (CLOCK_HFCLKSTAT_STATE_Msk | CLOCK_HFCLKSTAT_SRC_Msk)) == + (CLOCK_HFCLKSTAT_STATE_Msk | (CLOCK_HFCLKSTAT_SRC_Xtal << CLOCK_HFCLKSTAT_SRC_Pos)); +#else + return (NRF_CLOCK->HFCLKSTAT & (CLOCK_HFCLKSTAT_STATE_Msk | CLOCK_HFCLKSTAT_SRC_Msk)) == + (CLOCK_HFCLKSTAT_STATE_Msk | (CLOCK_HFCLKSTAT_SRC_HFXO << CLOCK_HFCLKSTAT_SRC_Pos)); +#endif +} + +enum +{ + NRF_CLOCK_EVENT_HFCLKSTARTED = offsetof(NRF_CLOCK_Type, EVENTS_HFCLKSTARTED), /*!< HFCLK oscillator started. */ +}; + +enum +{ + NRF_CLOCK_TASK_HFCLKSTART = offsetof(NRF_CLOCK_Type, TASKS_HFCLKSTART), /*!< Start HFCLK clock source. */ + NRF_CLOCK_TASK_HFCLKSTOP = offsetof(NRF_CLOCK_Type, TASKS_HFCLKSTOP), /*!< Stop HFCLK clock source. */ +}; + +static void hfclk_enable(void) +{ + /*!< already running, nothing to do */ + if (hfclk_running()) + return; + +#ifdef SOFTDEVICE_PRESENT + if (is_sd_enabled()) + { + (void)sd_clock_hfclk_request(); + return; + } +#endif + + *((volatile uint32_t *)((uint8_t *)NRF_CLOCK + NRF_CLOCK_EVENT_HFCLKSTARTED)) = 0x0UL; + volatile uint32_t dummy = *((volatile uint32_t *)((uint8_t *)NRF_CLOCK + (uint32_t)NRF_CLOCK_EVENT_HFCLKSTARTED)); + (void)dummy; + *((volatile uint32_t *)((uint8_t *)NRF_CLOCK + NRF_CLOCK_TASK_HFCLKSTART)) = 0x1UL; +} + +static void hfclk_disable(void) +{ +#ifdef SOFTDEVICE_PRESENT + if (is_sd_enabled()) + { + (void)sd_clock_hfclk_release(); + return; + } +#endif + + *((volatile uint32_t *)((uint8_t *)NRF_CLOCK + NRF_CLOCK_TASK_HFCLKSTOP)) = 0x1UL; +} + +/** + * Power & Clock Peripheral on nRF5x to manage USB + * USB Bus power is managed by Power module, there are 3 VBUS power events: + * Detected, Ready, Removed. Upon these power events, This function will + * enable ( or disable ) usb & hfclk peripheral, set the usb pin pull up + * accordingly to the controller Startup/Standby Sequence in USBD 51.4 specs. + * Therefore this function must be called to handle USB power event by + * - nrfx_power_usbevt_init() : if Softdevice is not used or enabled + * - SoftDevice SOC event : if SD is used and enabled + */ +void cherry_usb_hal_nrf_power_event(uint32_t event) +{ + enum + { + USB_EVT_DETECTED = 0, + USB_EVT_REMOVED = 1, + USB_EVT_READY = 2 + }; + + switch (event) + { + case USB_EVT_DETECTED: + if (!NRF_USBD->ENABLE) + { + /*!< Prepare for receiving READY event: disable interrupt since we will blocking wait */ + NRF_USBD->INTENCLR = USBD_INTEN_USBEVENT_Msk; + NRF_USBD->EVENTCAUSE = USBD_EVENTCAUSE_READY_Msk; + __ISB(); + __DSB(); + +#ifdef NRF52_SERIES /*!< NRF53 does not need this errata */ + /*!< ERRATA 171, 187, 166 */ + if (chyu_nrf52_errata_187()) + { + if (*((volatile uint32_t *)(0x4006EC00)) == 0x00000000) + { + *((volatile uint32_t *)(0x4006EC00)) = 0x00009375; + *((volatile uint32_t *)(0x4006ED14)) = 0x00000003; + *((volatile uint32_t *)(0x4006EC00)) = 0x00009375; + } + else + { + *((volatile uint32_t *)(0x4006ED14)) = 0x00000003; + } + } + + if (chyu_nrf52_errata_171()) + { + if (*((volatile uint32_t *)(0x4006EC00)) == 0x00000000) + { + *((volatile uint32_t *)(0x4006EC00)) = 0x00009375; + *((volatile uint32_t *)(0x4006EC14)) = 0x000000C0; + *((volatile uint32_t *)(0x4006EC00)) = 0x00009375; + } + else + { + *((volatile uint32_t *)(0x4006EC14)) = 0x000000C0; + } + } +#endif + + /*!< Enable the peripheral (will cause Ready event) */ + NRF_USBD->ENABLE = 1; + __ISB(); + __DSB(); + + /*!< Enable HFCLK */ + hfclk_enable(); + } + break; + + case USB_EVT_READY: + /** + * Skip if pull-up is enabled and HCLK is already running. + * Application probably call this more than necessary. + */ + if (NRF_USBD->USBPULLUP && hfclk_running()) + break; + + /*!< Waiting for USBD peripheral enabled */ + while (!(USBD_EVENTCAUSE_READY_Msk & NRF_USBD->EVENTCAUSE)) + { + } + + NRF_USBD->EVENTCAUSE = USBD_EVENTCAUSE_READY_Msk; + __ISB(); + __DSB(); + +#ifdef NRF52_SERIES + if (chyu_nrf52_errata_171()) + { + if (*((volatile uint32_t *)(0x4006EC00)) == 0x00000000) + { + *((volatile uint32_t *)(0x4006EC00)) = 0x00009375; + *((volatile uint32_t *)(0x4006EC14)) = 0x00000000; + *((volatile uint32_t *)(0x4006EC00)) = 0x00009375; + } + else + { + *((volatile uint32_t *)(0x4006EC14)) = 0x00000000; + } + } + + if (chyu_nrf52_errata_187()) + { + if (*((volatile uint32_t *)(0x4006EC00)) == 0x00000000) + { + *((volatile uint32_t *)(0x4006EC00)) = 0x00009375; + *((volatile uint32_t *)(0x4006ED14)) = 0x00000000; + *((volatile uint32_t *)(0x4006EC00)) = 0x00009375; + } + else + { + *((volatile uint32_t *)(0x4006ED14)) = 0x00000000; + } + } + + if (chyu_nrf52_errata_166()) + { + *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7E3; + *((volatile uint32_t *)(NRF_USBD_BASE + 0x804)) = 0x40; + + __ISB(); + __DSB(); + } +#endif + + /*!< ISO buffer Lower half for IN, upper half for OUT */ + NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_HalfIN; + + /*!< Enable bus-reset interrupt */ + NRF_USBD->INTENSET = USBD_INTEN_USBRESET_Msk; + + /*!< Enable interrupt, priorities should be set by application */ + /*!< clear pending irq */ + NVIC->ICPR[(((uint32_t)USBD_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)USBD_IRQn) & 0x1FUL)); + /** + * Don't enable USBD interrupt yet, if dcd_init() did not finish yet + * Interrupt will be enabled by tud_init(), when USB stack is ready + * to handle interrupts. + */ + /*!< Wait for HFCLK */ + while (!hfclk_running()) + { + } + + /*!< Enable pull up */ + NRF_USBD->USBPULLUP = 1; + __ISB(); + __DSB(); + break; + + case USB_EVT_REMOVED: + if (NRF_USBD->ENABLE) + { + /*!< Disable pull up */ + NRF_USBD->USBPULLUP = 0; + __ISB(); + __DSB(); + + /*!< Disable Interrupt */ + NVIC->ICER[(((uint32_t)USBD_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)USBD_IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + /*!< disable all interrupt */ + NRF_USBD->INTENCLR = NRF_USBD->INTEN; + + NRF_USBD->ENABLE = 0; + __ISB(); + __DSB(); + hfclk_disable(); + } + break; + + default: + break; + } +} \ No newline at end of file From 7e0acaa2541f8351744185da1dd8f1ede2067f23 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Thu, 16 Jan 2025 15:45:44 +0800 Subject: [PATCH 25/51] bsp: cvitek: use rttpkgtool to replace cvitek_bootloader Originally, for riscv big and little cores under bsp/cvitek, after generating rtthread.bin, the cvitek_bootloader tool would be used to package it and generate fip.bin and boot.sd files that can be burned into sdcard. However, the cvitek_bootloader tool repository is relatively large, and it compiles and generates firmware such as fsbl, opensbi and uboot from the source code level. And when using it, it needs to be downloaded to the bsp/cvitek directory, which will introduce pollution to source files in the RTT repository under the original working path. The new solution uses rttpkgtool, which is similar to cvitek_bootloader, but it uses prebuilt firmware, so it is very small and does not introduce pollution to the source file. Signed-off-by: Chen Wang --- bsp/cvitek/.gitignore | 6 +-- bsp/cvitek/build.sh | 68 ++++++++++++++++++++++++++++ bsp/cvitek/c906_little/rtconfig.py | 2 +- bsp/cvitek/cv18xx_risc-v/rtconfig.py | 2 +- bsp/cvitek/tools.sh | 53 ++++++++++++++++++++++ 5 files changed, 125 insertions(+), 6 deletions(-) create mode 100755 bsp/cvitek/build.sh create mode 100644 bsp/cvitek/tools.sh diff --git a/bsp/cvitek/.gitignore b/bsp/cvitek/.gitignore index c4ea9348dd3..adb46db0ab2 100755 --- a/bsp/cvitek/.gitignore +++ b/bsp/cvitek/.gitignore @@ -1,5 +1,3 @@ -cvitek_bootloader -fip.bin -boot.sd -output +rttpkgtool/ +output/ Image.lzma \ No newline at end of file diff --git a/bsp/cvitek/build.sh b/bsp/cvitek/build.sh new file mode 100755 index 00000000000..c163ccc7382 --- /dev/null +++ b/bsp/cvitek/build.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +source ./tools.sh + +function usage() { + echo "Usage:" + echo " ./build.sh [-h|-l|-b]" + echo " -h: display usage" + echo " -l: build c906L" + echo " -b: build c906B" +} + +function build_c906b() { + echo "build_c906b" + + BOARD_TYPE=`get_board_type $BSP_PATH/cv18xx_risc-v` + echo "BOARD_TYPE: $BOARD_TYPE" + + DPT_PATH_KERNEL=$BSP_PATH/../../ DPT_BOARD_TYPE=$BOARD_TYPE DPT_PATH_OUTPUT=$BSP_PATH/output ./rttpkgtool/script/mkpkg.sh -b +} + +function build_c906l() { + echo "build_c906l" + + BOARD_TYPE=`get_board_type $BSP_PATH/c906_little` + echo "BOARD_TYPE: $BOARD_TYPE" + + DPT_PATH_KERNEL=$BSP_PATH/../../ DPT_BOARD_TYPE=$BOARD_TYPE DPT_PATH_OUTPUT=$BSP_PATH/output ./rttpkgtool/script/mkpkg.sh -l +} + +while getopts ":hbl" opt +do + case $opt in + h) + O_HELP=y + ;; + b) + O_MAKE_BIG=y + ;; + l) + O_MAKE_LITTLE=y + ;; + ?) + echo "Unrecognized parameter." + usage + exit 1 + ;; + esac +done + +if [ "$O_HELP" = "y" ]; then + usage + exit 0 +fi + +BSP_PATH=$(realpath $(dirname $0)) +echo "BSP_PATH: $BSP_PATH" + +download_rttpkgtool $BSP_PATH + +if [ "$O_MAKE_BIG" = "y" ]; then + build_c906b +fi + +if [ "$O_MAKE_LITTLE" = "y" ]; then + build_c906l +fi + diff --git a/bsp/cvitek/c906_little/rtconfig.py b/bsp/cvitek/c906_little/rtconfig.py index 50c32d55617..9d139d9e94a 100755 --- a/bsp/cvitek/c906_little/rtconfig.py +++ b/bsp/cvitek/c906_little/rtconfig.py @@ -64,4 +64,4 @@ DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n' POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' -POST_ACTION += 'cd .. && bash combine-fip.sh ' + os.getcwd() + ' rtthread.bin' + ' \n' \ No newline at end of file +POST_ACTION += 'cd .. && bash ./build.sh -l' + ' \n' \ No newline at end of file diff --git a/bsp/cvitek/cv18xx_risc-v/rtconfig.py b/bsp/cvitek/cv18xx_risc-v/rtconfig.py index 8137d1d922f..91ccaa795b2 100755 --- a/bsp/cvitek/cv18xx_risc-v/rtconfig.py +++ b/bsp/cvitek/cv18xx_risc-v/rtconfig.py @@ -57,4 +57,4 @@ DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtthread.asm\n' POST_ACTION = OBJCPY + ' -O binary $TARGET Image \n' + SIZE + ' $TARGET \n' -POST_ACTION += 'cd .. && bash mksdimg.sh ' + os.getcwd() + ' Image \n' +POST_ACTION += 'cd .. && bash ./build.sh -b' + ' \n' diff --git a/bsp/cvitek/tools.sh b/bsp/cvitek/tools.sh new file mode 100644 index 00000000000..d022e2a8ca7 --- /dev/null +++ b/bsp/cvitek/tools.sh @@ -0,0 +1,53 @@ +# NOTE: Don't execute this script directly. It should be sourced by another script. +# Description: This script contains utility functions. + +function get_board_type() +{ + local project_path=$1 + local supported_board_configs=("CONFIG_BOARD_TYPE_MILKV_DUO" "CONFIG_BOARD_TYPE_MILKV_DUO256M" "CONFIG_BOARD_TYPE_MILKV_DUOS") + local supported_board_types=("duo" "duo256m" "duos") + + local board_type="N/A" + + for ((i=0; i< ${#supported_board_configs[@]}; i++)) + do + config_value=$(grep -w "${supported_board_configs[i]}" ${project_path}/.config | cut -d= -f2) + if [ "$config_value" == "y" ]; then + board_type=${supported_board_types[i]} + break + fi + done + + echo ${board_type} +} + +function download_rttpkgtool() +{ + local project_path=$1 + local restult=$(curl -m 10 -s http://www.ip-api.com/json) + local country=$(echo $restult | sed 's/.*"country":"\([^"]*\)".*/\1/') + #echo "Country: $country" + + if [ "$country" == "China" ]; then + local url_rttpkgtool="https://gitee.com/unicornx/rttpkgtool.git" + else + local url_rttpkgtool="https://github.com/plctlab/rttpkgtool.git" + fi + #echo "rttpkgtool URL: ${url_rttpkgtool}" + + if [ ! -d ${project_path}/rttpkgtool ]; then + echo "rttpkgtool does not exist, clone it from ${url_rttpkgtool}" + git clone ${url_rttpkgtool} ${project_path}/rttpkgtool + + if [ $? -ne 0 ]; then + echo "Failed to clone ${url_rttpkgtool} !" + exit 1 + fi + else + echo "rttpkgtool already exists" + pushd ${project_path}/rttpkgtool + git checkout main + git pull + popd + fi +} \ No newline at end of file From c3e5152c13086643ae42bdf588ca95e38c63108d Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Fri, 17 Jan 2025 17:26:49 +0800 Subject: [PATCH 26/51] bsp: cvitek: removed useless files after using rttpkgtool Based on the patch "bsp: cvitek: use rttpkgtool to replace cvitek_bootloader", continue cleanup useless files. Signed-off-by: Chen Wang --- bsp/cvitek/board_env.sh | 44 -------------- bsp/cvitek/combine-fip.sh | 47 --------------- .../cv1800b_milkv_duo_spinor.dtb | Bin 19789 -> 0 bytes .../dtb/milkv-duo-spinor/multi.its | 56 ------------------ .../dtb/milkv-duo/cv1800b_milkv_duo_sd.dtb | Bin 19297 -> 0 bytes .../cv18xx_risc-v/dtb/milkv-duo/multi.its | 56 ------------------ .../cv1812cp_milkv_duo256m_spinor.dtb | Bin 20475 -> 0 bytes .../dtb/milkv-duo256m-spinor/multi.its | 56 ------------------ .../cv1812cp_milkv_duo256m_sd.dtb | Bin 24599 -> 0 bytes .../cv18xx_risc-v/dtb/milkv-duo256m/multi.its | 56 ------------------ .../milkv-duos-sd/cv1813h_milkv_duos_sd.dtb | Bin 20656 -> 0 bytes .../cv18xx_risc-v/dtb/milkv-duos-sd/multi.its | 56 ------------------ bsp/cvitek/mkimage | Bin 366496 -> 0 bytes bsp/cvitek/mksdimg.sh | 24 -------- 14 files changed, 395 deletions(-) delete mode 100755 bsp/cvitek/board_env.sh delete mode 100755 bsp/cvitek/combine-fip.sh delete mode 100755 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo-spinor/cv1800b_milkv_duo_spinor.dtb delete mode 100755 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo-spinor/multi.its delete mode 100755 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo/cv1800b_milkv_duo_sd.dtb delete mode 100755 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo/multi.its delete mode 100755 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m-spinor/cv1812cp_milkv_duo256m_spinor.dtb delete mode 100755 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m-spinor/multi.its delete mode 100755 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m/cv1812cp_milkv_duo256m_sd.dtb delete mode 100755 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m/multi.its delete mode 100644 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duos-sd/cv1813h_milkv_duos_sd.dtb delete mode 100644 bsp/cvitek/cv18xx_risc-v/dtb/milkv-duos-sd/multi.its delete mode 100755 bsp/cvitek/mkimage delete mode 100755 bsp/cvitek/mksdimg.sh diff --git a/bsp/cvitek/board_env.sh b/bsp/cvitek/board_env.sh deleted file mode 100755 index 4a8cdfda51a..00000000000 --- a/bsp/cvitek/board_env.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -function get_board_type() -{ - BOARD_CONFIG=("CONFIG_BOARD_TYPE_MILKV_DUO" "CONFIG_BOARD_TYPE_MILKV_DUO256M" "CONFIG_BOARD_TYPE_MILKV_DUOS") - BOARD_VALUE=("milkv-duo" "milkv-duo256m" "milkv-duos-sd") - STORAGE_VAUE=("sd" "sd" "sd") - - for ((i=0;i<${#BOARD_CONFIG[@]};i++)) - do - config_value=$(grep -w "${BOARD_CONFIG[i]}" ${PROJECT_PATH}/.config | cut -d= -f2) - if [ "$config_value" == "y" ]; then - BOARD_TYPE=${BOARD_VALUE[i]} - STORAGE_TYPE=${STORAGE_VAUE[i]} - break - fi - done - export BOARD_TYPE=${BOARD_TYPE} - export STORAGE_TYPE=${STORAGE_TYPE} -} - -function check_bootloader() -{ - restult=$(curl -m 10 -s http://www.ip-api.com/json) - COUNTRY=$(echo $restult | sed 's/.*"country":"\([^"]*\)".*/\1/') - echo "Country: $COUNTRY" - - if [ "$COUNTRY" == "China" ]; then - BOOTLOADER_URL=https://gitee.com/flyingcys/cvitek_bootloader - else - BOOTLOADER_URL=https://github.com/flyingcys/cvitek_bootloader - fi - - if [ ! -d cvitek_bootloader ]; then - echo "cvitek_bootloader not exist, clone it from ${BOOTLOADER_URL}" - git clone ${BOOTLOADER_URL} - - if [ $? -ne 0 ]; then - echo "Failed to clone ${BOOTLOADER_URL} !" - exit 1 - fi -fi -} - diff --git a/bsp/cvitek/combine-fip.sh b/bsp/cvitek/combine-fip.sh deleted file mode 100755 index 22a151c58ea..00000000000 --- a/bsp/cvitek/combine-fip.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -PROJECT_PATH=$1 -IMAGE_NAME=$2 - -if [ -z "$PROJECT_PATH" ] || [ -z "$IMAGE_NAME" ]; then - echo "Usage: $0 " - exit 1 -fi - -ROOT_PATH=$(pwd) -echo $ROOT_PATH - -. board_env.sh - -get_board_type -echo "board_type: ${BOARD_TYPE}" - -check_bootloader || exit 0 - -export BLCP_2ND_PATH=${PROJECT_PATH}/${IMAGE_NAME} - -pushd cvitek_bootloader - -. env.sh - -get_build_board ${BOARD_TYPE} - -echo "board: ${MV_BOARD_LINK}" - -if [ ! -d opensbi/build/platform/generic ] || [ ! -d fsbl/build/${MV_BOARD_LINK} ] || [ ! -d u-boot-2021.10/build/${MV_BOARD_LINK} ]; then - do_build - -else - echo "Build already done, skip build" - - do_combine - - if [ $? -ne 0 ]; then - do_build - fi -fi - -popd - -mkdir -p output/${MV_BOARD} -cp -rf cvitek_bootloader/install/soc_${MV_BOARD_LINK}/fip.bin output/${MV_BOARD}/fip.bin diff --git a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo-spinor/cv1800b_milkv_duo_spinor.dtb b/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo-spinor/cv1800b_milkv_duo_spinor.dtb deleted file mode 100755 index 5275da07d2f7b4e9a7f6b241626ce2beb877a680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19789 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 - - images { - kernel-1 { - description = "cvitek kernel"; - data = /incbin/("./Image.lzma"); - type = "kernel"; - arch = "riscv"; - os = "linux"; - compression = "lzma"; - load = <0x0 0x80200000>; - entry = <0x0 0x80200000>; - hash-2 { - algo = "crc32"; - }; - }; - - - /*FDT*/ - - fdt-cv1800b_milkv_duo_spinor { - description = "cvitek device tree - cv1800b_milkv_duo_spinor"; - data = /incbin/("./cv1800b_milkv_duo_spinor.dtb"); - type = "flat_dt"; - arch = "riscv"; - compression = "none"; - hash-1 { - algo = "sha256"; - }; - }; - - - - }; - - /*CFG*/ - configurations { - - config-cv1800b_milkv_duo_spinor { - description = "boot cvitek system with board cv1800b_milkv_duo_spinor"; - kernel = "kernel-1"; - fdt = "fdt-cv1800b_milkv_duo_spinor"; - }; - - }; - - -}; diff --git a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo/cv1800b_milkv_duo_sd.dtb b/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo/cv1800b_milkv_duo_sd.dtb deleted file mode 100755 index ff3823c663b99814d7993dded984db76ede9af01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19297 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 RtzZ4hZA~I1i)*NY{|{11D&+tG diff --git a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo/multi.its b/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo/multi.its deleted file mode 100755 index 8403466927c..00000000000 --- a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo/multi.its +++ /dev/null @@ -1,56 +0,0 @@ -/* - * U-Boot uImage source file with multiple kernels, ramdisks and FDT blobs - */ - -/dts-v1/; - -/ { - description = "Various kernels, ramdisks and FDT blobs"; - #address-cells = <2>; - - images { - kernel-1 { - description = "cvitek kernel"; - data = /incbin/("./Image.lzma"); - type = "kernel"; - arch = "riscv"; - os = "linux"; - compression = "lzma"; - load = <0x0 0x80200000>; - entry = <0x0 0x80200000>; - hash-2 { - algo = "crc32"; - }; - }; - - - /*FDT*/ - - fdt-cv1800b_milkv_duo_sd { - description = "cvitek device tree - cv1800b_milkv_duo_sd"; - data = /incbin/("./cv1800b_milkv_duo_sd.dtb"); - type = "flat_dt"; - arch = "riscv"; - compression = "none"; - hash-1 { - algo = "sha256"; - }; - }; - - - - }; - - /*CFG*/ - configurations { - - config-cv1800b_milkv_duo_sd { - description = "boot cvitek system with board cv1800b_milkv_duo_sd"; - kernel = "kernel-1"; - fdt = "fdt-cv1800b_milkv_duo_sd"; - }; - - }; - - -}; diff --git a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m-spinor/cv1812cp_milkv_duo256m_spinor.dtb b/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m-spinor/cv1812cp_milkv_duo256m_spinor.dtb deleted file mode 100755 index e48fe8e3115caf1849fe8e16bb3145247b289bf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20475 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 Ox; - - images { - kernel-1 { - description = "cvitek kernel"; - data = /incbin/("./Image.lzma"); - type = "kernel"; - arch = "riscv"; - os = "linux"; - compression = "lzma"; - load = <0x0 0x80200000>; - entry = <0x0 0x80200000>; - hash-2 { - algo = "crc32"; - }; - }; - - - /*FDT*/ - - fdt-cv1812cp_milkv_duo256m_spinor { - description = "cvitek device tree - cv1812cp_milkv_duo256m_spinor"; - data = /incbin/("./cv1812cp_milkv_duo256m_spinor.dtb"); - type = "flat_dt"; - arch = "riscv"; - compression = "none"; - hash-1 { - algo = "sha256"; - }; - }; - - - - }; - - /*CFG*/ - configurations { - - config-cv1812cp_milkv_duo256m_spinor { - description = "boot cvitek system with board cv1812cp_milkv_duo256m_spinor"; - kernel = "kernel-1"; - fdt = "fdt-cv1812cp_milkv_duo256m_spinor"; - }; - - }; - - -}; diff --git a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m/cv1812cp_milkv_duo256m_sd.dtb b/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m/cv1812cp_milkv_duo256m_sd.dtb deleted file mode 100755 index 01af66027b5146ddb28e9341f0b954dd9bf56fa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24599 zcmeHPYm6k6egP61f&YLEiWMS|0AWBvfhbahc*z99_nmuA z_3fS>@67C4iqKr?_PytE&pG$pb078UuU+@Q-wuLvZx4cCJqSK}Kg!#YZ$Lhdj5PK2 zAb98%SHG&iHI+7w@-3{#t7(~>KN+u1pP7a+Or%X9A4MMXVA^Z&^{Bt^(X@R&e7t`D zN^j=W=|_PHf?C|Q{s?@bkzlkpC3RLUA-bs+wG|AISnTNZe=8V zjP=EIJ!yq;yBD7)XnYUXKD|Eg!B0Y-PwxPro!T$79^I$6veCe}K$mFRwGR?DX2*)^ zF_`w7e>kqRgEojA`|#~`Xk&IsGr~yJS27P{F?^QQyKkqVGVq?3PJOYvXFO-Ryw|0!D9d=RvaEGDYe z%4LE}C0oAGk_!54L@Wc~cDl}@6#v$!Rg(A<9iJb9&kezwL+}eeOk3$Y`rwnuly0~! z7-C%>+26G^S&F)?2HG%@$B#WFS2XI`@Q~zZC!}BFgd|D7jAn82^B~d3zko~{$4260 zZK*3Uf^r%-Ceo?PV&riTCo#b`9*%vVN4CE27+1B~mwyHQbmOMm)NcLUggyK1=O?rc z`@UO0?*Z*{{hR?06ZKy~KkJl%^oHa4i(uGqKcCPxZ`99w!Lw^Wizts;F*uxVe-HOa zV%Kfp+2DTM>UE;D+f;g9#zPpDRY&RKSv&{G^*@*#+a`ci`GfXbd~?5|AGmHvTziHP z@5l3;$1CGJf|oJfLiYEpZNT&i=TQwkKvC(mwO-MJuY)dqnH)QZDwB)d{@yXNFGQNn z(icw``$5|{e`yQ(SZ-@6wz+*fOuh3B{bM!`k%QWD5@pRe%2$)#N;%&kE9HuDb_P(Y z(WvuPVHQBlIdcb_i3gb zwuiC)&GBID%P7f1_}_zTzKg=y2jk`&>vOYmA|%%F$(f?)X2nS`#Nh(Z2}}dFP0Tu^ z7k_N$VvW7#X6q8$`LX!{z{D|@{)Yr4wXb$W>q@WPEKaZZYws2AK758kkgWZKuA3&m z_Hhn`(xIwmdlG$NZI)5@Va_4WHqvPxbHG|f=nN6oKo0q{4ikJC^lqk9h~$}`}+O07vUFz z1>8<%-v&yRL{#MiTUR_AYTQF$^hyy*(R3R`S0J9#2;7WreGlLaWAnV{ZBk+@hmKxza_Ow^6nb z7KJQrMiW0w@JfTp&0*5m2b(uMAQDIYyk;kt!E&}&*!q1MuxD$q?ZMZg`8Qf=5iPWn z7Vu0etM)gjQ#Sq6N><(GrF8L6-dpaRY%R~s%$!+V1wm=hReLeG{@(dM?8Xe$wfuAD4g7=oS^Gxsd~`uIzL~K@*~9w$ zc$%fZ?mdXVe(#pw;fAxKnFlQliad= z=@*SbLqQ$SGwzq%p65V_Z$Vbz-azn3=rflQWRQD8?9{q}hD?5!5|-)p}v=c}C@R zD|N^kQu)xXDE93`@g2k+%!kuxiA4MM<--MOChbtWsy^iT|8hR0zjyl3u9Eic!#cz< z9n6P%<8R+SjGa=pL%OOy{80$JoDZ?~j_{#f`R&_>4R!+QU_R8_Ec^Ch%PD;`eE4G! zJ<5kead)aQbHKSfIVQe3u+QfDec#vIP5SLnyQ*>bAOw!`8OMisu7BJgDj%jZF%Ey+ zKx_+h6YL|;%wdLGP+y8kD8GnpA@ytxV54|If@L!n^DOu8x4{Oi805t8P4HkbK zYvRmDy4_TKmq6q4c^Mzw@PfxfdFrDZeq#ilKH~l$_x?~Cf2?@9$AY@=Bk%UQ@L!pa zs8Q08kNR`i_t6i5l`YIicGsRb^3g|g$d~caaj_YEY{zVK)b4uuc$=ft$z=R7>WnR% zHzoN#sxERtA^(;6h`o`tCm+2Vtkh{fqCc33GasEo{c=9~4tUrnwqrIQ{o4q<%{5y! zj6Vi1b=piIe%Ey@DVLjZk=vbO@^bBdas-~XKm3+|`rS>Gw>$FFMCw|IQ}b9z-YmB07t*!v|4#qQtA5#dHY-B$YWv`{+l5KaIML1J=>8Uj|HD z=vN5{lzuYXD96^tTD~4Wy^^dX#em96$CtqC>6HEZI^v{JL&VbtvA=v{Suc%{#dTz) zEcidkyGc1e*QhS;!OK2K-}Jenu>oDtP7;`~)!juN+r1U}Ip1nj!AXbejjzSh3HagES~l1j6b$v@!R~7 zYB2s4ul|Q#{S~kN7g~p&@xOlClSj8b_@4*Qg0)LWzx78TSMvX}U!Q=V1<&>TV$oWT z)#2KgiJO5Z&ER*B2lY&0jOE1pQRldD94#(vOl||t{J?VCgIS%!kBm<`Q#3oa8aZ9` z?~^0&l=El1GTVI=`8g=02aualBWt&%Ca)euD|nlVc!Q<~pqT;4KN~>* z#N87T3Ot zxDnDM)%i;u`}K$Rhqg`Z<`4RFhd;_8e|RwF^u(vid_~<+*>wqW7=yd|11~`FmS^K0 zgb4VUXy33uX4WHnRZ8d_GsZN47g-?D+)A&_3B&CcAD@|U{*7P{Ub9>*A2e!J$nj_LLIVc;#P>3 zv@idN?xMHSZ8Zn{F5dF=Vq8LFpk0W?iC@3(@#!-&PuxST#IbLeXe5|TnkRq2m!sqx z!=B_Tv&dgd7t>~zc4-I_+jFdJ-61(tvf24nkm*~tXEOXY>cn$jViNfaWhI?_at)`x zStw0%Uxvx%KEot3V)wcO+w+WMwkcZlp9NZC{m8L8S&-`TdxSfnB{0Z^YQXp2QK^8vtgL9p}%{S%uDo{^M;*7@p`shzg`(*;xlWp;9orl6@Zl|Tl0AS-GU#*t75s+Px`j<(WV-8HQl00nXR~x5;EIy zETmsFS9a=_d+`K#(c`^$?#G;+ON3`3vaL;IVh&faX(a2n#^xqjnCi%+abMb4O|zy7 z7P+e_u#Qf@SiCE`>YI~E1|~{!Z8*l(??+Lm%#Uelw2IUE_p&5C>N`vA_Bg+x$!v?e7+pvm{=d6v?tpe%9>^ z7jD-v%$REYAuscW`xHj%X8~VsJU$5?+VgW-HnlvbWu)bTmN81|X(8`n9MaBGv*nzP z+N#v>&60T?RYyf-RmTuDJ;I_k3pJu|H=o}EI_IkOf6MDX@!LulpQoz{K;iZ0mZAku zr#gSj3?O^8o^k!$0CUqO8DQ$=$ZQd>7ox=Zx{Zf1LVuFxVxWhblQA&g99m>IKp#E+ z$2QrP=>`6bhzItC@nF-ug_WADw1=^3vEi>#w2Mw64`OoSTPV3^iM<~FKNOEblJS2J z5cwr2QJSuuYaVCa0xyM~Y<}p3m$O?TuAh5(WhZ^bv7&y;BK&p_Ms<=qZ4GPj;sPp2 zu(1$1VBqn^$rsw!qc5 zk8&oFDMw@t+2)V6Z!>Lp6`3|@A8hP5fnws23XSqNWDg-m^|aO)UPAZdThT)@F}f~Q zGO2&VlhFWdF><-}{LA2FUt7qu{lmz6SReZ9G;4FRKA5>82R4mdYk3Btz0}2W%d?yC zw&KPAdH-7;-!F=GW3(Fg@RBK7Ihi-IqWgPPq;WVzKMS(V%cIo5q!EAABHv(ID9Is? zPHqmt3Q9MmKko--V|nKEsQ^E7!K(YllVyST_EALqEUf`M8!p zspTiM{J55%(eiUzeikKV@~(=EA@ka;hL<9f4}TmuNxPM+auBo6hF&RKNj7!P$$ouDU)jzjF<`IOH?(alF`npKoi3Z^yV`t}!lJIZt>_ zC)Yt6pCR(l_`LCW1V?G9B&wCRx1!t_8XAB@GfUUiyzCXtxYK%?Bev7FA+pFn4nB#U z+UKPWeuxqpeYAlu#o7zKbstB+CCKJC^5OpW0N)P3trQEmXEi(gtZmSDyu1&=No~%C zI!dum?z$4I>(zL0ju6um$n-39PQIsC%G6L#Pkz9o;gB}Qd1}1(qFz@R_({YyNepe~ z+9rN1lW;q-&4v3>C({F3KB(nKw0sC9+fcv7zO6!1PS2d`NM&}`-94S2(d9teO+x?h zd(!mtC1gHVrGK>_gL?=c(RBFo?rh_Mq4zhqHud9Fo*O7P2~J)W593^|n4G_ttZm>hPIfHz|Nb zsuevP*InOny(Nh{s1t{@@o%DT@bexFeUrZl8f7!p$~?_R$s}F{o1B+|{<{Ix^Lr5U zS;)}7O}?B(_*%oA<;8B_Mv*ryIz4$WZE5>`%Zu|ejidH(-(ll_e{E1^r4!c)lP|}4 zDh&nO4}RJ!He*42<7Bu0Nw{0vsvoN7B%(iR zr?`tCBSJc&a`I2^*!hBz(f-_ML(k0E?(0VLUL3J@e`Pf9rn=Go)@a`1MH=S7VzdSO}HV{M%}a)&*Q9eil( z#&)@L%A6nL&;xThZwtJe;RI)7Ts)EN4~K33#fm|9er3vz1UkKgIuctQ2LE z>(s<`5W-0T`hx9dRW9{frVRg`V)ESy99SxQWPeb2)VeuE<{bY);EJ%VbBXyt#sO=G&%-ewUVS%k?J46?@Qz~=F6iiy56NAFjn6VnR412oTGk?!d$EIELr}A1y$iWj#9=WBL;~9g2eWqO+Ab9rtcxKMCQE;wXO1x ztQF2bSvz&F_L+YA)bBU_z@&89C#X_<7PryU`8#D^de1#7JG33`us&7xmq1GD?|-u9 z>9|pHLpjv`sf&QA*Xfo&(7~$N11r5)`JmcEe^q(eU&^2zvX?Txc_g;~4N*GIC{tgV z`JMmTy!FqL;Fia}JJ09mEWLYtBldXT1oP9>A3$bhtGkskFP|Q21kfJ%Wa`fTZ4PN$ z`DYUhOxM3Ah4gtbD#|7%)RNmMD8oPB$@#NS7J2OZh7kHUE!eKo^ZaXonCkLN8rOh7 zt(_Ct`fzRB>ts=x;E)(g@hW#d8~fow5|1;EfziUdJW> z-J^i3FXjner|HHQFcSP{9(;|Tt(0Lm>R>a^k$N1ens`M} zRfkDohSzGlW#Ald_j2N8)VP+SU9+>Y?(Xd=5a65lFosRtgk2U$`o)^`qbQ4j49%#G z-oQ`zH%e?6TVGkku z1it51_hH2eyDOcbfYVy(D$8bP`I&&9#df0gu_m--y644-!O*uT!3l>DSIB$I-8>}9_rCWpQh1Sp58UA0plC%^6K&}Ihs&G9Vf$}pDHe#ubg>t}ZX(`(r7Jb{T zLcuyk@j)6VQV>TO-aHDI)1~DiOYl7~5uHx#VL)D4F2I#f&%mn&%$)LoQwi01rjvF(==7Xi3uA_Jm6f@Mr(ex{y~&%%c)Zq3yRBqhYMk~svW9U> zhY|9p!!zM(;NslPDSWvcrY$TYd~hAMBJkT>!bHG?a#I;yjTX{2Ck-P(4!2p1 zb{Z#5(d@Q%eA^y$IxC@|PV|>)*IUPfkXqFf9GA3e`K-8$Fj+4Xu<@}GuqT%ztctzx z^xQ&PBB(Loj5Cfa7Ej%w)uFtDF9RYQ+~Lom2M#@O=z&8I9D3l;1BV_s^uVD94n1(_ QfkO`*df?Cl|F1ppe*^2I)Bpeg diff --git a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m/multi.its b/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m/multi.its deleted file mode 100755 index 5e01397d554..00000000000 --- a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duo256m/multi.its +++ /dev/null @@ -1,56 +0,0 @@ -/* - * U-Boot uImage source file with multiple kernels, ramdisks and FDT blobs - */ - -/dts-v1/; - -/ { - description = "Various kernels, ramdisks and FDT blobs"; - #address-cells = <2>; - - images { - kernel-1 { - description = "cvitek kernel"; - data = /incbin/("./Image.lzma"); - type = "kernel"; - arch = "riscv"; - os = "linux"; - compression = "lzma"; - load = <0x0 0x80200000>; - entry = <0x0 0x80200000>; - hash-2 { - algo = "crc32"; - }; - }; - - - /*FDT*/ - - fdt-cv1812cp_milkv_duo256m_sd { - description = "cvitek device tree - cv1812cp_milkv_duo256m_sd"; - data = /incbin/("./cv1812cp_milkv_duo256m_sd.dtb"); - type = "flat_dt"; - arch = "riscv"; - compression = "none"; - hash-1 { - algo = "sha256"; - }; - }; - - - - }; - - /*CFG*/ - configurations { - - config-cv1812cp_milkv_duo256m_sd { - description = "boot cvitek system with board cv1812cp_milkv_duo256m_sd"; - kernel = "kernel-1"; - fdt = "fdt-cv1812cp_milkv_duo256m_sd"; - }; - - }; - - -}; diff --git a/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duos-sd/cv1813h_milkv_duos_sd.dtb b/bsp/cvitek/cv18xx_risc-v/dtb/milkv-duos-sd/cv1813h_milkv_duos_sd.dtb deleted file mode 100644 index 35f375a773e9ea38b80d0862f3e2efc1ec813257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20656 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 - - images { - kernel-1 { - description = "cvitek kernel"; - data = /incbin/("./Image.lzma"); - type = "kernel"; - arch = "riscv"; - os = "linux"; - compression = "lzma"; - load = <0x0 0x80200000>; - entry = <0x0 0x80200000>; - hash-2 { - algo = "crc32"; - }; - }; - - - /*FDT*/ - - fdt-cv1813h_milkv_duos_sd { - description = "cvitek device tree - cv1813h_milkv_duos_sd"; - data = /incbin/("./cv1813h_milkv_duos_sd.dtb"); - type = "flat_dt"; - arch = "riscv"; - compression = "none"; - hash-1 { - algo = "sha256"; - }; - }; - - - - }; - - /*CFG*/ - configurations { - - config-cv1813h_milkv_duos_sd { - description = "boot cvitek system with board cv1813h_milkv_duos_sd"; - kernel = "kernel-1"; - fdt = "fdt-cv1813h_milkv_duos_sd"; - }; - - }; - - -}; diff --git a/bsp/cvitek/mkimage b/bsp/cvitek/mkimage deleted file mode 100755 index 6a720c3fb04ba13782cc6cf75ccaf7835cf3e5b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366496 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 diff --git a/bsp/cvitek/mksdimg.sh b/bsp/cvitek/mksdimg.sh deleted file mode 100755 index 838beaeda66..00000000000 --- a/bsp/cvitek/mksdimg.sh +++ /dev/null @@ -1,24 +0,0 @@ -#/bin/sh -set -e - -PROJECT_PATH=$1 -IMAGE_NAME=$2 - -if [ -z "$PROJECT_PATH" ] || [ -z "$IMAGE_NAME" ]; then - echo "Usage: $0 " - exit 1 -fi - -ROOT_PATH=$(pwd) -echo ${ROOT_PATH} - -. board_env.sh - -get_board_type - -echo "start compress kernel..." - -lzma -c -9 -f -k ${PROJECT_PATH}/${IMAGE_NAME} > ${PROJECT_PATH}/dtb/${BOARD_TYPE}/Image.lzma - -mkdir -p ${ROOT_PATH}/output/${BOARD_TYPE} -./mkimage -f ${PROJECT_PATH}/dtb/${BOARD_TYPE}/multi.its -r ${ROOT_PATH}/output/${BOARD_TYPE}/boot.${STORAGE_TYPE} From 40f3b6a569d0b94c54a9436bc96c76977c5424e3 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Sun, 26 Jan 2025 11:44:39 +0800 Subject: [PATCH 27/51] doxygen: create framework to unify markdown and source code part (#9946) * doxygen: adjust documentation directory structure - Rename documentation/doxygen to documentation/0.doxygen and cleanup some unused files. - Add/rename folders for each sub sections, such as 1.introduction/...... Each sub section will be created as a subpage. - Generate initial Doxyfile, this Doxyfile will be used to unify doxygen generated API documents and those markdown files under documentation folder. This patch just add the default Doxyfile generated by running "doxygen -g". It is used as baseline to add more features/configurations. - Rename documentation/README.md to documentation/INDEX.md, and use it as mainpage. - Move 0.doxygen/readme.md to documentation/README.md. * doxygen: update configurations These configurations are from old documentation/doxygen/Doxyfile. Try best to compatible exixting design. * doxygen: add run script Add a script to automatic some operations. Updated the README.md. --------- Signed-off-by: Chen Wang Co-authored-by: Supper Thomas <78900636@qq.com> --- .github/workflows/doxygen.yml | 4 +- README.md | 2 +- README_de.md | 2 +- README_es.md | 2 +- README_zh.md | 4 +- .../{doxygen => 0.doxygen}/basicdef.h | 0 .../{doxygen => 0.doxygen}/filesystem.h | 0 documentation/{doxygen => 0.doxygen}/finsh.h | 0 .../{doxygen => 0.doxygen}/hardware.h | 0 .../images/Kernel_Object.png | Bin .../images/System_Arch.png | Bin .../images/Thread_Scheduler.png | Bin .../{doxygen => 0.doxygen}/images/dfs.png | Bin .../{doxygen => 0.doxygen}/images/finsh.png | Bin .../images/rtthread_logo.png | Bin documentation/{doxygen => 0.doxygen}/kernel.h | 0 .../{doxygen => 0.doxygen}/mainpage.h | 0 documentation/{doxygen => 0.doxygen}/module.h | 0 .../{doxygen => 0.doxygen}/systeminit.h | 0 documentation/{doxygen => 0.doxygen}/thread.h | 0 .../figures/02Software_framework_diagram.png | Bin .../introduction.md | 8 +- .../figures/10.png | Bin .../figures/11.png | Bin .../figures/14.png | Bin .../figures/5.png | Bin .../figures/6.png | Bin .../figures/7.png | Bin .../figures/8.png | Bin .../figures/9.png | Bin .../figures/compile.jpg | Bin .../figures/debug.jpg | Bin .../keil-installation/figures/1.png | Bin .../keil-installation/figures/12.png | Bin .../keil-installation/figures/13.png | Bin .../keil-installation/figures/2.png | Bin .../keil-installation/figures/3.png | Bin .../keil-installation/figures/4.png | Bin .../keil-installation/keil-installation.md | 2 +- .../quick-start.md | 16 +- .../quick_start_qemu/figures/echo-cat.png | Bin .../quick_start_qemu/figures/env.png | Bin .../quick_start_qemu/figures/env_menu.png | Bin .../figures/env_menu_ubuntu.png | Bin .../quick_start_qemu/figures/finsh-cmd.png | Bin .../quick_start_qemu/figures/finsh-thread.png | Bin .../quick_start_qemu/figures/gnu-arm.png | Bin .../figures/macos-env-menu.png | Bin .../figures/macos-filesys.png | Bin .../figures/macos-mkfs-sd0.png | Bin .../figures/macos-msh-help.png | Bin .../figures/macos-pkgs-add-to-menu.png | Bin .../figures/macos-qemu-bsp.png | Bin .../figures/macos-qemu-sh.png | Bin .../quick_start_qemu/figures/macos-save.png | Bin .../figures/macos-select-pkg.png | Bin .../figures/macos-thread-timer.png | Bin .../figures/macos-update-pkg.png | Bin .../quick_start_qemu/figures/menuconfig.png | Bin .../figures/menuconfig_menu.png | Bin .../quick_start_qemu/figures/mkfs-sd0.png | Bin .../figures/python3-version.png | Bin .../quick_start_qemu/figures/qemu.bat.png | Bin .../quick_start_qemu/figures/qemu.png | Bin .../quick_start_qemu/figures/qemubsp.png | Bin .../quick_start_qemu/figures/scons.png | Bin .../figures/ubuntu-env-menu.png | Bin .../figures/ubuntu-filesys.png | Bin .../figures/ubuntu-menuconfig.png | Bin .../figures/ubuntu-mkfs-sd0.png | Bin .../figures/ubuntu-msh-help.png | Bin .../figures/ubuntu-pkg-menuconfig.png | Bin .../figures/ubuntu-pkg-set.png | Bin .../figures/ubuntu-pkgs-add-to-menu.png | Bin .../figures/ubuntu-qemu-bsp.png | Bin .../figures/ubuntu-qume-sh.png | Bin .../figures/ubuntu-rtconfig-py.png | Bin .../quick_start_qemu/figures/ubuntu-save.png | Bin .../quick_start_qemu/figures/ubuntu-scons.png | Bin .../figures/ubuntu-select-pkg.png | Bin .../figures/ubuntu-thread-timer.png | Bin .../figures/ubuntu-update-pkg.png | Bin .../figures/win-menuconfig.png | Bin .../quick_start_qemu_linux.md | 0 .../quick_start_qemu_macos.md | 0 .../quick_start_qemu_windows.md | 0 .../rtthread_simulator_v0.1.0.7z | Bin .../rtthread_simulator_v0.1.0.zip | Bin documentation/3.kernel/INDEX.md | 10 + documentation/4.tool/INDEX.md | 5 + documentation/5.device/INDEX.md | 14 ++ documentation/6.components/INDEX.md | 12 + documentation/7.contribution/INDEX.md | 9 + documentation/{doxygen => }/Doxyfile | 53 ++-- documentation/INDEX.md | 52 ++++ documentation/README.md | 102 ++++---- documentation/at/at.md | 80 +++---- documentation/basic/basic.md | 51 ++-- .../contribution_guide/coding_style_en.md | 30 +-- documentation/device/adc/adc.md | 26 +- documentation/device/device.md | 28 +-- documentation/device/hwtimer/hwtimer.md | 23 +- documentation/device/i2c/i2c.md | 12 +- documentation/device/pin/pin.md | 26 +- documentation/device/pwm/pwm.md | 18 +- documentation/device/rtc/rtc.md | 22 +- documentation/device/sensor/sensor.md | 36 +-- documentation/device/spi/spi.md | 48 ++-- documentation/device/uart/uart.md | 28 +-- documentation/device/watchdog/watchdog.md | 16 +- documentation/device/wlan/wlan.md | 36 +-- documentation/dlmodule/README.md | 40 ++-- documentation/doxygen/.gitignore | 2 - documentation/doxygen/readme.md | 48 ---- documentation/env/env.md | 68 +++--- documentation/filesystem/README.md | 108 ++++----- documentation/finsh/finsh.md | 74 +++--- documentation/interrupt/interrupt.md | 50 ++-- .../kernel-porting/kernel-porting.md | 31 ++- documentation/memory/memory.md | 48 ++-- documentation/network/network.md | 68 +++--- documentation/pm/pm.md | 58 ++--- documentation/posix/README.md | 226 +++++++++--------- documentation/run.sh | 8 + documentation/sal/sal.md | 55 +++-- .../figures/{scons.png => scons_compile.png} | Bin documentation/scons/scons.md | 74 +++--- documentation/thread-comm/thread-comm.md | 72 +++--- documentation/thread-sync/thread-sync.md | 75 +++--- documentation/thread/thread.md | 67 +++--- documentation/timer/timer.md | 41 ++-- documentation/ulog/ulog.md | 106 ++++---- documentation/utest/utest.md | 34 +-- 133 files changed, 1078 insertions(+), 1052 deletions(-) rename documentation/{doxygen => 0.doxygen}/basicdef.h (100%) rename documentation/{doxygen => 0.doxygen}/filesystem.h (100%) rename documentation/{doxygen => 0.doxygen}/finsh.h (100%) rename documentation/{doxygen => 0.doxygen}/hardware.h (100%) rename documentation/{doxygen => 0.doxygen}/images/Kernel_Object.png (100%) rename documentation/{doxygen => 0.doxygen}/images/System_Arch.png (100%) rename documentation/{doxygen => 0.doxygen}/images/Thread_Scheduler.png (100%) rename documentation/{doxygen => 0.doxygen}/images/dfs.png (100%) rename documentation/{doxygen => 0.doxygen}/images/finsh.png (100%) rename documentation/{doxygen => 0.doxygen}/images/rtthread_logo.png (100%) rename documentation/{doxygen => 0.doxygen}/kernel.h (100%) rename documentation/{doxygen => 0.doxygen}/mainpage.h (100%) rename documentation/{doxygen => 0.doxygen}/module.h (100%) rename documentation/{doxygen => 0.doxygen}/systeminit.h (100%) rename documentation/{doxygen => 0.doxygen}/thread.h (100%) rename documentation/{introduction => 1.introduction}/figures/02Software_framework_diagram.png (100%) rename documentation/{introduction => 1.introduction}/introduction.md (98%) rename documentation/{quick-start => 2.quick-start}/figures/10.png (100%) rename documentation/{quick-start => 2.quick-start}/figures/11.png (100%) rename documentation/{quick-start => 2.quick-start}/figures/14.png (100%) rename documentation/{quick-start => 2.quick-start}/figures/5.png (100%) rename documentation/{quick-start => 2.quick-start}/figures/6.png (100%) rename documentation/{quick-start => 2.quick-start}/figures/7.png (100%) rename documentation/{quick-start => 2.quick-start}/figures/8.png (100%) rename documentation/{quick-start => 2.quick-start}/figures/9.png (100%) rename documentation/{quick-start => 2.quick-start}/figures/compile.jpg (100%) rename documentation/{quick-start => 2.quick-start}/figures/debug.jpg (100%) rename documentation/{quick-start => 2.quick-start}/keil-installation/figures/1.png (100%) rename documentation/{quick-start => 2.quick-start}/keil-installation/figures/12.png (100%) rename documentation/{quick-start => 2.quick-start}/keil-installation/figures/13.png (100%) rename documentation/{quick-start => 2.quick-start}/keil-installation/figures/2.png (100%) rename documentation/{quick-start => 2.quick-start}/keil-installation/figures/3.png (100%) rename documentation/{quick-start => 2.quick-start}/keil-installation/figures/4.png (100%) rename documentation/{quick-start => 2.quick-start}/keil-installation/keil-installation.md (98%) rename documentation/{quick-start => 2.quick-start}/quick-start.md (97%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/echo-cat.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/env.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/env_menu.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/env_menu_ubuntu.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/finsh-cmd.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/finsh-thread.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/gnu-arm.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-env-menu.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-filesys.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-mkfs-sd0.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-msh-help.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-pkgs-add-to-menu.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-qemu-bsp.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-qemu-sh.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-save.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-select-pkg.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-thread-timer.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/macos-update-pkg.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/menuconfig.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/menuconfig_menu.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/mkfs-sd0.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/python3-version.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/qemu.bat.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/qemu.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/qemubsp.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/scons.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-env-menu.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-filesys.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-menuconfig.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-mkfs-sd0.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-msh-help.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-pkg-menuconfig.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-pkg-set.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-pkgs-add-to-menu.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-qemu-bsp.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-qume-sh.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-rtconfig-py.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-save.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-scons.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-select-pkg.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-thread-timer.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/ubuntu-update-pkg.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/figures/win-menuconfig.png (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/quick_start_qemu_linux.md (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/quick_start_qemu_macos.md (100%) rename documentation/{quick-start => 2.quick-start}/quick_start_qemu/quick_start_qemu_windows.md (100%) rename documentation/{quick-start => 2.quick-start}/rtthread_simulator_v0.1.0.7z (100%) rename documentation/{quick-start => 2.quick-start}/rtthread_simulator_v0.1.0.zip (100%) create mode 100644 documentation/3.kernel/INDEX.md create mode 100644 documentation/4.tool/INDEX.md create mode 100644 documentation/5.device/INDEX.md create mode 100644 documentation/6.components/INDEX.md create mode 100644 documentation/7.contribution/INDEX.md rename documentation/{doxygen => }/Doxyfile (98%) create mode 100644 documentation/INDEX.md delete mode 100644 documentation/doxygen/.gitignore delete mode 100644 documentation/doxygen/readme.md create mode 100755 documentation/run.sh rename documentation/scons/figures/{scons.png => scons_compile.png} (100%) diff --git a/.github/workflows/doxygen.yml b/.github/workflows/doxygen.yml index 2b57a00bdf1..697ce412d97 100644 --- a/.github/workflows/doxygen.yml +++ b/.github/workflows/doxygen.yml @@ -50,7 +50,7 @@ jobs: - name: generate doxygen html shell: bash run: | - cd documentation/doxygen + cd documentation doxygen Doxyfile cat Doxyfile @@ -58,7 +58,7 @@ jobs: id: deployment uses: actions/upload-pages-artifact@main # or specific "vX.X.X" version tag for this action with: - path: documentation/doxygen/html/ + path: documentation/html/ deploy: if: github.event_name == 'push' diff --git a/README.md b/README.md index f0e7d25093f..45e88cb1771 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ Based on [STM32F103 BluePill](https://github.com/RT-Thread/rt-thread/tree/master ## Simulator RT-Thread BSP can be compiled directly and downloaded to the corresponding development board for use. In addition, RT-Thread also provides qemu-vexpress-a9 BSP, which can be used without hardware platform. See the getting started guide below for details. Getting Started of QEMU with Env: -[Windows](documentation/quick-start/quick_start_qemu/quick_start_qemu.md) | [Linux Ubuntu](documentation/quick-start/quick_start_qemu/quick_start_qemu_linux.md) | [Mac OS](documentation/quick-start/quick_start_qemu/quick_start_qemu_macos.md) +[Windows](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_windows.md) | [Linux Ubuntu](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_linux.md) | [Mac OS](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_macos.md) # License diff --git a/README_de.md b/README_de.md index d4b3477e107..57211f87c96 100644 --- a/README_de.md +++ b/README_de.md @@ -122,7 +122,7 @@ Basierend auf [STM32F103 BluePill](https://github.com/RT-Thread/rt-thread/tree/m ## Simulator Das RT-Thread BSP kann direkt kompiliert und zur Verwendung auf das entsprechende Entwicklungsboard heruntergeladen werden. Darüber hinaus bietet RT-Thread auch das qemu-vexpress-a9 BSP, das ohne Hardware-Plattform verwendet werden kann. Weitere Informationen finden Sie in der Anleitung für die ersten Schritte unten. -[Windows](documentation/quick-start/quick_start_qemu/quick_start_qemu.md) | [Linux Ubuntu](documentation/quick-start/quick_start_qemu/quick_start_qemu_linux.md) | [Mac OS](documentation/quick-start/quick_start_qemu/quick_start_qemu_macos.md) +[Windows](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_windows.md) | [Linux Ubuntu](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_linux.md) | [Mac OS](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_macos.md) # Lizenz diff --git a/README_es.md b/README_es.md index 8e723b692ed..a75173132b5 100644 --- a/README_es.md +++ b/README_es.md @@ -121,7 +121,7 @@ Basado en [STM32F103 BluePill](https://github.com/RT-Thread/rt-thread/tree/maste ## Simulator -El BSP de RT-Thread puede compilarse directamente y descargarse en la placa de desarrollo correspondiente para su uso. Además, RT-Thread también proporciona el BSP qemu-vexpress-a9, que puede utilizarse sin plataforma de hardware. Consulte la guía de inicio más abajo para más detalles. [Windows](documentation/quick-start/quick_start_qemu/quick_start_qemu.md) | [Linux Ubuntu](documentation/quick-start/quick_start_qemu/quick_start_qemu_linux.md) | [Mac OS](documentation/quick-start/quick_start_qemu/quick_start_qemu_macos.md) +El BSP de RT-Thread puede compilarse directamente y descargarse en la placa de desarrollo correspondiente para su uso. Además, RT-Thread también proporciona el BSP qemu-vexpress-a9, que puede utilizarse sin plataforma de hardware. Consulte la guía de inicio más abajo para más detalles. [Windows](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_windows.md) | [Linux Ubuntu](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_linux.md) | [Mac OS](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_macos.md) # Licencia diff --git a/README_zh.md b/README_zh.md index f19821edac2..cba276f41f1 100644 --- a/README_zh.md +++ b/README_zh.md @@ -124,9 +124,9 @@ RT-Thread Studio演示: RT-Thread BSP可以直接编译并下载到相应的开发板使用。此外,RT-Thread还提供 qemu-vexpress-a9 BSP,无需硬件平台即可使用。有关详细信息,请参阅下面的入门指南。 -[QEMU 入门指南(Windows)](documentation/quick-start/quick_start_qemu/quick_start_qemu.md) +[QEMU 入门指南(Windows)](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_windows.md) -[QEMU 入门指南(Ubuntu)](documentation/quick-start/quick_start_qemu/quick_start_qemu_linux.md) +[QEMU 入门指南(Ubuntu)](documentation/2.quick-start/quick_start_qemu/quick_start_qemu_linux.md) ## 文档 diff --git a/documentation/doxygen/basicdef.h b/documentation/0.doxygen/basicdef.h similarity index 100% rename from documentation/doxygen/basicdef.h rename to documentation/0.doxygen/basicdef.h diff --git a/documentation/doxygen/filesystem.h b/documentation/0.doxygen/filesystem.h similarity index 100% rename from documentation/doxygen/filesystem.h rename to documentation/0.doxygen/filesystem.h diff --git a/documentation/doxygen/finsh.h b/documentation/0.doxygen/finsh.h similarity index 100% rename from documentation/doxygen/finsh.h rename to documentation/0.doxygen/finsh.h diff --git a/documentation/doxygen/hardware.h b/documentation/0.doxygen/hardware.h similarity index 100% rename from documentation/doxygen/hardware.h rename to documentation/0.doxygen/hardware.h diff --git a/documentation/doxygen/images/Kernel_Object.png b/documentation/0.doxygen/images/Kernel_Object.png similarity index 100% rename from documentation/doxygen/images/Kernel_Object.png rename to documentation/0.doxygen/images/Kernel_Object.png diff --git a/documentation/doxygen/images/System_Arch.png b/documentation/0.doxygen/images/System_Arch.png similarity index 100% rename from documentation/doxygen/images/System_Arch.png rename to documentation/0.doxygen/images/System_Arch.png diff --git a/documentation/doxygen/images/Thread_Scheduler.png b/documentation/0.doxygen/images/Thread_Scheduler.png similarity index 100% rename from documentation/doxygen/images/Thread_Scheduler.png rename to documentation/0.doxygen/images/Thread_Scheduler.png diff --git a/documentation/doxygen/images/dfs.png b/documentation/0.doxygen/images/dfs.png similarity index 100% rename from documentation/doxygen/images/dfs.png rename to documentation/0.doxygen/images/dfs.png diff --git a/documentation/doxygen/images/finsh.png b/documentation/0.doxygen/images/finsh.png similarity index 100% rename from documentation/doxygen/images/finsh.png rename to documentation/0.doxygen/images/finsh.png diff --git a/documentation/doxygen/images/rtthread_logo.png b/documentation/0.doxygen/images/rtthread_logo.png similarity index 100% rename from documentation/doxygen/images/rtthread_logo.png rename to documentation/0.doxygen/images/rtthread_logo.png diff --git a/documentation/doxygen/kernel.h b/documentation/0.doxygen/kernel.h similarity index 100% rename from documentation/doxygen/kernel.h rename to documentation/0.doxygen/kernel.h diff --git a/documentation/doxygen/mainpage.h b/documentation/0.doxygen/mainpage.h similarity index 100% rename from documentation/doxygen/mainpage.h rename to documentation/0.doxygen/mainpage.h diff --git a/documentation/doxygen/module.h b/documentation/0.doxygen/module.h similarity index 100% rename from documentation/doxygen/module.h rename to documentation/0.doxygen/module.h diff --git a/documentation/doxygen/systeminit.h b/documentation/0.doxygen/systeminit.h similarity index 100% rename from documentation/doxygen/systeminit.h rename to documentation/0.doxygen/systeminit.h diff --git a/documentation/doxygen/thread.h b/documentation/0.doxygen/thread.h similarity index 100% rename from documentation/doxygen/thread.h rename to documentation/0.doxygen/thread.h diff --git a/documentation/introduction/figures/02Software_framework_diagram.png b/documentation/1.introduction/figures/02Software_framework_diagram.png similarity index 100% rename from documentation/introduction/figures/02Software_framework_diagram.png rename to documentation/1.introduction/figures/02Software_framework_diagram.png diff --git a/documentation/introduction/introduction.md b/documentation/1.introduction/introduction.md similarity index 98% rename from documentation/introduction/introduction.md rename to documentation/1.introduction/introduction.md index 1ba59bbb09a..9d3dcc754b4 100644 --- a/documentation/introduction/introduction.md +++ b/documentation/1.introduction/introduction.md @@ -1,8 +1,8 @@ -# RT-Thread Introduction +@page introduction Introduction As a beginner of Real-time Operating Systems (RTOS), you might be new to RT-Thread. However, with a better understanding of it over time, you will gradually discover the charm of RT-Thread and its advantages over other RTOSs of the same type. RT-Thread is an RTOS. With over 16 years of experience accumulated, along with the rise of the Internet of Things (IoT), it is evolving into a powerful, component-rich IoT operating system. -## RT-Thread Overview +# RT-Thread Overview RT-Thread, short for Real Time-Thread, is an embedded real-time multi-threaded operating system. One of its main purposes is to support multi-tasking. Allowing multiple tasks to run simultaneously does not mean that the processor actually performs multiple tasks at the same time - a processor core can only run one task at a time. Every task is executed quickly, and through the task scheduler which determines the sequence according to priority, the tasks are switched rapidly, giving the illusion that multiple tasks are running at the same time. In the RT-Thread system, tasks are implemented by threads, and scheduled by the task scheduler. @@ -10,11 +10,11 @@ RT-Thread is mainly written in the C programming language, making it easy to und Compared with the Linux operating system, RT-Thread is small in size, low in cost, low in power consumption and fast in startup. In addition, RT-Thread is highly responsible, with low resource usage, which is ideally suitable for various resource constraints such as cost, power consumption, etc. Although the 32-bit MCU is its main operating platform, other CPUs, such as ones with MMU, ones based on ARM9, ARM11 and even the Cortex-A series CPUs are suitable for RT-Thread in specific applications. -## License Agreement +# License Agreement The RT-Thread system is a completely open source system, which follows the Apache License 2.0 open source license agreement. The RT-Thread system can be used free of charge in commercial products and does not require opening private code up to the public. -## RT-Thread Frame +# RT-Thread Frame In recent years, the concept of the Internet of Things has become widely known, and the IoT market has developed rapidly. The networking of embedded devices is the trend of the times. Terminal networking has greatly increased the complexity of software, and traditional RTOS kernels can hardly meet the needs of the market. For this reason, the concept of the Internet of Things Operating System (IoT OS) came into being. **IoT operating system refers to the software platform that is based on operating system kernel (like RTOS, Linux, etc.) and includes relatively complete middleware components such as a file system, graphics library, etc. It has low overhead and high security, abides by the Communication Protocol and is capable of connecting to the cloud.** RT-Thread is an IoT OS. diff --git a/documentation/quick-start/figures/10.png b/documentation/2.quick-start/figures/10.png similarity index 100% rename from documentation/quick-start/figures/10.png rename to documentation/2.quick-start/figures/10.png diff --git a/documentation/quick-start/figures/11.png b/documentation/2.quick-start/figures/11.png similarity index 100% rename from documentation/quick-start/figures/11.png rename to documentation/2.quick-start/figures/11.png diff --git a/documentation/quick-start/figures/14.png b/documentation/2.quick-start/figures/14.png similarity index 100% rename from documentation/quick-start/figures/14.png rename to documentation/2.quick-start/figures/14.png diff --git a/documentation/quick-start/figures/5.png b/documentation/2.quick-start/figures/5.png similarity index 100% rename from documentation/quick-start/figures/5.png rename to documentation/2.quick-start/figures/5.png diff --git a/documentation/quick-start/figures/6.png b/documentation/2.quick-start/figures/6.png similarity index 100% rename from documentation/quick-start/figures/6.png rename to documentation/2.quick-start/figures/6.png diff --git a/documentation/quick-start/figures/7.png b/documentation/2.quick-start/figures/7.png similarity index 100% rename from documentation/quick-start/figures/7.png rename to documentation/2.quick-start/figures/7.png diff --git a/documentation/quick-start/figures/8.png b/documentation/2.quick-start/figures/8.png similarity index 100% rename from documentation/quick-start/figures/8.png rename to documentation/2.quick-start/figures/8.png diff --git a/documentation/quick-start/figures/9.png b/documentation/2.quick-start/figures/9.png similarity index 100% rename from documentation/quick-start/figures/9.png rename to documentation/2.quick-start/figures/9.png diff --git a/documentation/quick-start/figures/compile.jpg b/documentation/2.quick-start/figures/compile.jpg similarity index 100% rename from documentation/quick-start/figures/compile.jpg rename to documentation/2.quick-start/figures/compile.jpg diff --git a/documentation/quick-start/figures/debug.jpg b/documentation/2.quick-start/figures/debug.jpg similarity index 100% rename from documentation/quick-start/figures/debug.jpg rename to documentation/2.quick-start/figures/debug.jpg diff --git a/documentation/quick-start/keil-installation/figures/1.png b/documentation/2.quick-start/keil-installation/figures/1.png similarity index 100% rename from documentation/quick-start/keil-installation/figures/1.png rename to documentation/2.quick-start/keil-installation/figures/1.png diff --git a/documentation/quick-start/keil-installation/figures/12.png b/documentation/2.quick-start/keil-installation/figures/12.png similarity index 100% rename from documentation/quick-start/keil-installation/figures/12.png rename to documentation/2.quick-start/keil-installation/figures/12.png diff --git a/documentation/quick-start/keil-installation/figures/13.png b/documentation/2.quick-start/keil-installation/figures/13.png similarity index 100% rename from documentation/quick-start/keil-installation/figures/13.png rename to documentation/2.quick-start/keil-installation/figures/13.png diff --git a/documentation/quick-start/keil-installation/figures/2.png b/documentation/2.quick-start/keil-installation/figures/2.png similarity index 100% rename from documentation/quick-start/keil-installation/figures/2.png rename to documentation/2.quick-start/keil-installation/figures/2.png diff --git a/documentation/quick-start/keil-installation/figures/3.png b/documentation/2.quick-start/keil-installation/figures/3.png similarity index 100% rename from documentation/quick-start/keil-installation/figures/3.png rename to documentation/2.quick-start/keil-installation/figures/3.png diff --git a/documentation/quick-start/keil-installation/figures/4.png b/documentation/2.quick-start/keil-installation/figures/4.png similarity index 100% rename from documentation/quick-start/keil-installation/figures/4.png rename to documentation/2.quick-start/keil-installation/figures/4.png diff --git a/documentation/quick-start/keil-installation/keil-installation.md b/documentation/2.quick-start/keil-installation/keil-installation.md similarity index 98% rename from documentation/quick-start/keil-installation/keil-installation.md rename to documentation/2.quick-start/keil-installation/keil-installation.md index 9eb6ad32ac3..951f360ed93 100644 --- a/documentation/quick-start/keil-installation/keil-installation.md +++ b/documentation/2.quick-start/keil-installation/keil-installation.md @@ -1,4 +1,4 @@ -# Keil MDK Installation +@page quickstart_keil Keil MDK Installation Before running the RT-Thread operating system, we need to install MDK-ARM 5.24 (either official or evaluation version, version 5.14 and above), this version is also a relatively new version. This version can provide relatively complete debugging functions. Here, we are using evaluation version 5.24 of 16k compiled code limit. If you want to remove the 16k compiled code limit, please purchase the official MDK-ARM. diff --git a/documentation/quick-start/quick-start.md b/documentation/2.quick-start/quick-start.md similarity index 97% rename from documentation/quick-start/quick-start.md rename to documentation/2.quick-start/quick-start.md index ea8a4154d12..88a46ea5b8f 100644 --- a/documentation/quick-start/quick-start.md +++ b/documentation/2.quick-start/quick-start.md @@ -1,4 +1,4 @@ -# Start Guide: Simulate STM32F103 on Keil Simulator +@page quick_start Start Guide Because of its particularity, the embedded operating system is often closely related to the hardware platform, and specific embedded operating systems can only run on specific hardware. For those who might not have an RT-Thread compatible hardware module, or want to test out their ideas, a complete RT-Thread system can be developed in the simulation environment MDK-ARM. @@ -8,11 +8,11 @@ Because of its full STM32F103 software simulation environment, the MDK-ARM integ What will follow is a demonstration of RT-Thread running on a simulated STM32F103 microcontroller through MDK-ARM. -## Preparation +# Preparation -MDK development environment: MDK-ARM 5.24 (official or evaluation version, version 5.14 and above) needs to be installed. This version is a relatively new version, which can provide relatively complete debugging functions. An installation guide can be found here: [Keil MDK Installation](./keil-installation/keil-installation.md). +MDK development environment: MDK-ARM 5.24 (official or evaluation version, version 5.14 and above) needs to be installed. This version is a relatively new version, which can provide relatively complete debugging functions. An installation guide can be found here: @subpage quickstart_keil. -## First acquaintance with RT-Thread +# First acquaintance with RT-Thread To see the code size of RT-Thread we first need to get an example of RT-Thread that is suited for this environment, which can be obtained from the following link: @@ -69,7 +69,7 @@ After compiling RT-Thread/STM32, we can simulate running RT-Thread through the M ![simulate RT-Thread2](./figures/6.png) -## User Entry Code +# User Entry Code The above startup code is related to the RT-Thread system, so how do users add initialization code for their own applications? RT-Thread uses main function as the user code entry, all you need to do is just add your own code to the main function. @@ -83,7 +83,7 @@ int main(void) >Note: In order to complete the initialization for the system functions before entering the main program, you can use the `$sub$$` and `$super$$` function identifiers to call another sample before entering the main program, this was, users can ignore the initialization operations before the main() function. See [ARM® Compiler v5.06 for µVision® armlink User Guide](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0377g/pge1362065967698.html) for details. -## Example of a Marquee +# Example of a Marquee For technical engineers working on electronics, marquee is probably the simplest example, the equivalent of Hello World in every programming language programmers learn. So we will start with a marquee in the following example, to make it periodically update (turn on or off) the LED. @@ -123,13 +123,13 @@ int led(void) MSH_CMD_EXPORT(led, RT-Thread first led sample); ``` -## Other Examples +# Other Examples Additional kernel examples can be found in the kernel-sample-0.1.0 directory. ![more kernel samples](./figures/14.png) -## Frequently Asked Question +# Frequently Asked Question * Compilation error occurred as following: diff --git a/documentation/quick-start/quick_start_qemu/figures/echo-cat.png b/documentation/2.quick-start/quick_start_qemu/figures/echo-cat.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/echo-cat.png rename to documentation/2.quick-start/quick_start_qemu/figures/echo-cat.png diff --git a/documentation/quick-start/quick_start_qemu/figures/env.png b/documentation/2.quick-start/quick_start_qemu/figures/env.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/env.png rename to documentation/2.quick-start/quick_start_qemu/figures/env.png diff --git a/documentation/quick-start/quick_start_qemu/figures/env_menu.png b/documentation/2.quick-start/quick_start_qemu/figures/env_menu.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/env_menu.png rename to documentation/2.quick-start/quick_start_qemu/figures/env_menu.png diff --git a/documentation/quick-start/quick_start_qemu/figures/env_menu_ubuntu.png b/documentation/2.quick-start/quick_start_qemu/figures/env_menu_ubuntu.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/env_menu_ubuntu.png rename to documentation/2.quick-start/quick_start_qemu/figures/env_menu_ubuntu.png diff --git a/documentation/quick-start/quick_start_qemu/figures/finsh-cmd.png b/documentation/2.quick-start/quick_start_qemu/figures/finsh-cmd.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/finsh-cmd.png rename to documentation/2.quick-start/quick_start_qemu/figures/finsh-cmd.png diff --git a/documentation/quick-start/quick_start_qemu/figures/finsh-thread.png b/documentation/2.quick-start/quick_start_qemu/figures/finsh-thread.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/finsh-thread.png rename to documentation/2.quick-start/quick_start_qemu/figures/finsh-thread.png diff --git a/documentation/quick-start/quick_start_qemu/figures/gnu-arm.png b/documentation/2.quick-start/quick_start_qemu/figures/gnu-arm.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/gnu-arm.png rename to documentation/2.quick-start/quick_start_qemu/figures/gnu-arm.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-env-menu.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-env-menu.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-env-menu.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-env-menu.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-filesys.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-filesys.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-filesys.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-filesys.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-mkfs-sd0.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-mkfs-sd0.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-mkfs-sd0.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-mkfs-sd0.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-msh-help.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-msh-help.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-msh-help.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-msh-help.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-pkgs-add-to-menu.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-pkgs-add-to-menu.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-pkgs-add-to-menu.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-pkgs-add-to-menu.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-qemu-bsp.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-qemu-bsp.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-qemu-bsp.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-qemu-bsp.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-qemu-sh.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-qemu-sh.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-qemu-sh.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-qemu-sh.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-save.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-save.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-save.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-save.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-select-pkg.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-select-pkg.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-select-pkg.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-select-pkg.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-thread-timer.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-thread-timer.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-thread-timer.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-thread-timer.png diff --git a/documentation/quick-start/quick_start_qemu/figures/macos-update-pkg.png b/documentation/2.quick-start/quick_start_qemu/figures/macos-update-pkg.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/macos-update-pkg.png rename to documentation/2.quick-start/quick_start_qemu/figures/macos-update-pkg.png diff --git a/documentation/quick-start/quick_start_qemu/figures/menuconfig.png b/documentation/2.quick-start/quick_start_qemu/figures/menuconfig.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/menuconfig.png rename to documentation/2.quick-start/quick_start_qemu/figures/menuconfig.png diff --git a/documentation/quick-start/quick_start_qemu/figures/menuconfig_menu.png b/documentation/2.quick-start/quick_start_qemu/figures/menuconfig_menu.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/menuconfig_menu.png rename to documentation/2.quick-start/quick_start_qemu/figures/menuconfig_menu.png diff --git a/documentation/quick-start/quick_start_qemu/figures/mkfs-sd0.png b/documentation/2.quick-start/quick_start_qemu/figures/mkfs-sd0.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/mkfs-sd0.png rename to documentation/2.quick-start/quick_start_qemu/figures/mkfs-sd0.png diff --git a/documentation/quick-start/quick_start_qemu/figures/python3-version.png b/documentation/2.quick-start/quick_start_qemu/figures/python3-version.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/python3-version.png rename to documentation/2.quick-start/quick_start_qemu/figures/python3-version.png diff --git a/documentation/quick-start/quick_start_qemu/figures/qemu.bat.png b/documentation/2.quick-start/quick_start_qemu/figures/qemu.bat.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/qemu.bat.png rename to documentation/2.quick-start/quick_start_qemu/figures/qemu.bat.png diff --git a/documentation/quick-start/quick_start_qemu/figures/qemu.png b/documentation/2.quick-start/quick_start_qemu/figures/qemu.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/qemu.png rename to documentation/2.quick-start/quick_start_qemu/figures/qemu.png diff --git a/documentation/quick-start/quick_start_qemu/figures/qemubsp.png b/documentation/2.quick-start/quick_start_qemu/figures/qemubsp.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/qemubsp.png rename to documentation/2.quick-start/quick_start_qemu/figures/qemubsp.png diff --git a/documentation/quick-start/quick_start_qemu/figures/scons.png b/documentation/2.quick-start/quick_start_qemu/figures/scons.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/scons.png rename to documentation/2.quick-start/quick_start_qemu/figures/scons.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-env-menu.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-env-menu.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-env-menu.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-env-menu.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-filesys.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-filesys.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-filesys.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-filesys.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-menuconfig.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-menuconfig.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-menuconfig.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-menuconfig.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-mkfs-sd0.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-mkfs-sd0.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-mkfs-sd0.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-mkfs-sd0.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-msh-help.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-msh-help.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-msh-help.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-msh-help.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-pkg-menuconfig.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-pkg-menuconfig.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-pkg-menuconfig.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-pkg-menuconfig.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-pkg-set.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-pkg-set.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-pkg-set.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-pkg-set.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-pkgs-add-to-menu.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-pkgs-add-to-menu.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-pkgs-add-to-menu.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-pkgs-add-to-menu.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-qemu-bsp.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-qemu-bsp.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-qemu-bsp.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-qemu-bsp.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-qume-sh.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-qume-sh.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-qume-sh.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-qume-sh.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-rtconfig-py.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-rtconfig-py.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-rtconfig-py.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-rtconfig-py.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-save.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-save.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-save.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-save.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-scons.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-scons.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-scons.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-scons.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-select-pkg.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-select-pkg.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-select-pkg.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-select-pkg.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-thread-timer.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-thread-timer.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-thread-timer.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-thread-timer.png diff --git a/documentation/quick-start/quick_start_qemu/figures/ubuntu-update-pkg.png b/documentation/2.quick-start/quick_start_qemu/figures/ubuntu-update-pkg.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/ubuntu-update-pkg.png rename to documentation/2.quick-start/quick_start_qemu/figures/ubuntu-update-pkg.png diff --git a/documentation/quick-start/quick_start_qemu/figures/win-menuconfig.png b/documentation/2.quick-start/quick_start_qemu/figures/win-menuconfig.png similarity index 100% rename from documentation/quick-start/quick_start_qemu/figures/win-menuconfig.png rename to documentation/2.quick-start/quick_start_qemu/figures/win-menuconfig.png diff --git a/documentation/quick-start/quick_start_qemu/quick_start_qemu_linux.md b/documentation/2.quick-start/quick_start_qemu/quick_start_qemu_linux.md similarity index 100% rename from documentation/quick-start/quick_start_qemu/quick_start_qemu_linux.md rename to documentation/2.quick-start/quick_start_qemu/quick_start_qemu_linux.md diff --git a/documentation/quick-start/quick_start_qemu/quick_start_qemu_macos.md b/documentation/2.quick-start/quick_start_qemu/quick_start_qemu_macos.md similarity index 100% rename from documentation/quick-start/quick_start_qemu/quick_start_qemu_macos.md rename to documentation/2.quick-start/quick_start_qemu/quick_start_qemu_macos.md diff --git a/documentation/quick-start/quick_start_qemu/quick_start_qemu_windows.md b/documentation/2.quick-start/quick_start_qemu/quick_start_qemu_windows.md similarity index 100% rename from documentation/quick-start/quick_start_qemu/quick_start_qemu_windows.md rename to documentation/2.quick-start/quick_start_qemu/quick_start_qemu_windows.md diff --git a/documentation/quick-start/rtthread_simulator_v0.1.0.7z b/documentation/2.quick-start/rtthread_simulator_v0.1.0.7z similarity index 100% rename from documentation/quick-start/rtthread_simulator_v0.1.0.7z rename to documentation/2.quick-start/rtthread_simulator_v0.1.0.7z diff --git a/documentation/quick-start/rtthread_simulator_v0.1.0.zip b/documentation/2.quick-start/rtthread_simulator_v0.1.0.zip similarity index 100% rename from documentation/quick-start/rtthread_simulator_v0.1.0.zip rename to documentation/2.quick-start/rtthread_simulator_v0.1.0.zip diff --git a/documentation/3.kernel/INDEX.md b/documentation/3.kernel/INDEX.md new file mode 100644 index 00000000000..6aeddfa6b84 --- /dev/null +++ b/documentation/3.kernel/INDEX.md @@ -0,0 +1,10 @@ +@page kernel Kenrel + +- @subpage kernel_basics +- @subpage thread_management +- @subpage clock_management +- @subpage thread_sync +- @subpage thread_comm +- @subpage memory_management +- @subpage interrupt_management +- @subpage kernel_porting diff --git a/documentation/4.tool/INDEX.md b/documentation/4.tool/INDEX.md new file mode 100644 index 00000000000..05454e19918 --- /dev/null +++ b/documentation/4.tool/INDEX.md @@ -0,0 +1,5 @@ +@page tool Tool + +- @subpage env + +- @subpage scons diff --git a/documentation/5.device/INDEX.md b/documentation/5.device/INDEX.md new file mode 100644 index 00000000000..95baa04ade3 --- /dev/null +++ b/documentation/5.device/INDEX.md @@ -0,0 +1,14 @@ +@page device Device + +- @subpage device_framework +- @subpage device_pin +- @subpage device_uart +- @subpage device_adc +- @subpage device_i2c +- @subpage device_spi +- @subpage device_pwm +- @subpage device_rtc +- @subpage device_hwtimer +- @subpage device_watchdog +- @subpage device_wlan +- @subpage device_sensor diff --git a/documentation/6.components/INDEX.md b/documentation/6.components/INDEX.md new file mode 100644 index 00000000000..3ee86cde59e --- /dev/null +++ b/documentation/6.components/INDEX.md @@ -0,0 +1,12 @@ +@page components Components + +- @subpage component_finsh +- @subpage component_vfs +- @subpage component_utest +- @subpage component_dlmodule +- @subpage component_sal +- @subpage component_at +- @subpage component_posix +- @subpage component_ulog +- @subpage component_pm +- @subpage component_network \ No newline at end of file diff --git a/documentation/7.contribution/INDEX.md b/documentation/7.contribution/INDEX.md new file mode 100644 index 00000000000..17a4ea83e80 --- /dev/null +++ b/documentation/7.contribution/INDEX.md @@ -0,0 +1,9 @@ +@page code_contribution Contribution + +# Contribution Guide + +We sincerely thank you for your contribution, and welcome to submit the code through GitHub's fork and Pull Request processes. RT-Thread 3.1.0 version and its earlier versions follow the GPL V2 open source license agreement. Versions from the 3.1.0 version onwards follow the Apache License 2.0 open source license agreement. + +All the real-time operating system kernel and open source components can be used free of charge for commercial products, there is no potential commercial risk and you will not being request to publish application source. + +@subpage rtt_code_style_en \ No newline at end of file diff --git a/documentation/doxygen/Doxyfile b/documentation/Doxyfile similarity index 98% rename from documentation/doxygen/Doxyfile rename to documentation/Doxyfile index 44a09c85d10..b6c3a1e2d29 100644 --- a/documentation/doxygen/Doxyfile +++ b/documentation/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "RT-Thread RTOS" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.2.0 +PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -51,14 +51,14 @@ PROJECT_BRIEF = "An open source embedded real-time operating system" # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = ./images/rtthread_logo.png +PROJECT_LOGO = ./0.doxygen/images/rtthread_logo.png # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = . +OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -864,13 +864,13 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = ../../src \ - ../../include \ - . \ - ../../components/finsh \ - ../../components/drivers/include/drivers \ - ../../components/dfs/dfs_v2/src \ - ../../components/dfs/dfs_v2/include +INPUT = . \ + ../src \ + ../include \ + ../components/finsh \ + ../components/drivers/include/drivers \ + ../components/dfs/dfs_v2/src \ + ../components/dfs/dfs_v2/include # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -903,13 +903,14 @@ FILE_PATTERNS = *.c \ *.cc \ *.cpp \ *.h \ - *.inc + *.inc \ + *.md # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a @@ -918,7 +919,11 @@ RECURSIVE = NO # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = .svn +EXCLUDE = ./0.doxygen/mainpage.h \ + ./README.md \ + ./2.quick-start/quick_start_qemu \ + ./env/env-vscode.md \ + ./contribution_guide/coding_style_cn.md # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -971,7 +976,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = ./images +IMAGE_PATH = . # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -1643,7 +1648,7 @@ MATHJAX_FORMAT = HTML-CSS # The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_RELPATH = http://www.mathjax.org/mathjax +MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example @@ -1776,7 +1781,7 @@ LATEX_OUTPUT = latex # the output language. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_CMD_NAME = latex +LATEX_CMD_NAME = # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate # index for LaTeX. @@ -1880,7 +1885,7 @@ LATEX_EXTRA_FILES = # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. -PDF_HYPERLINKS = NO +PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as # specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX @@ -1890,7 +1895,7 @@ PDF_HYPERLINKS = NO # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. -USE_PDFLATEX = NO +USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running @@ -2125,10 +2130,6 @@ DOCBOOK_PROGRAMLISTING = NO GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# Configuration options related to Sqlite3 output -#--------------------------------------------------------------------------- - #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- @@ -2337,7 +2338,7 @@ HIDE_UNDOC_RELATIONS = YES # http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO -# The default value is: NO. +# The default value is: YES. HAVE_DOT = YES @@ -2515,7 +2516,9 @@ DIRECTORY_GRAPH = YES # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). -# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, +# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, +# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, +# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, # png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and # png:gdiplus:gdiplus. # The default value is: png. @@ -2546,7 +2549,7 @@ DOT_PATH = # command). # This tag requires that the tag HAVE_DOT is set to YES. -DOTFILE_DIRS = ../doxygen/images +DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the \mscfile diff --git a/documentation/INDEX.md b/documentation/INDEX.md new file mode 100644 index 00000000000..84dde62904a --- /dev/null +++ b/documentation/INDEX.md @@ -0,0 +1,52 @@ +@mainpage RT-Thread User Guide + +@subpage introduction + +@subpage quick_start + +@subpage kernel + +- @ref kernel_basics +- @ref thread_management +- @ref clock_management +- @ref thread_sync +- @ref thread_comm +- @ref memory_management +- @ref interrupt_management +- @ref kernel_porting + +@subpage tool + +- @ref env +- @ref scons + +@subpage device + +- @ref device_framework +- @ref device_pin +- @ref device_uart +- @ref device_adc +- @ref device_i2c +- @ref device_spi +- @ref device_pwm +- @ref device_rtc +- @ref device_hwtimer +- @ref device_watchdog +- @ref device_wlan +- @ref device_sensor + +@subpage components + +- @ref component_finsh +- @ref component_vfs +- @ref component_utest +- @ref component_dlmodule +- @ref component_sal +- @ref component_at +- @ref component_posix +- @ref component_ulog +- @ref component_pm +- @ref component_network + +@subpage code_contribution + diff --git a/documentation/README.md b/documentation/README.md index d27cec13669..55a0043d462 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -1,49 +1,55 @@ -# Manual Catalogue - -- [RT-Thread Introduction](introduction/introduction.md) -- [Start Guide: Simulate STM32F103 on KEIL simulator](quick-start/quick-start.md) - -**Kernel** - -- [Kernel Basics](basic/basic.md) -- [Thread Management](thread/thread.md) -- [Clock&Timer Management](timer/timer.md) -- [Inter-thread Synchronization](thread-sync/thread-sync.md) -- [Inter-thread Communication](thread-comm/thread-comm.md) -- [Memory Management](memory/memory.md) -- [Interrupt Management](interrupt/interrupt.md) -- [Kernel Porting](kernel-porting/kernel-porting.md) - -**Tool** - -- [User Manual of Env](env/env.md) -- [SCons](scons/scons.md) - -**Device** - -- [I/O Device Framework](device/device.md) -- [PIN Device](device/pin/pin.md) -- [UART Device](device/uart/uart.md) -- [ADC Device](device/adc/adc.md) -- [I2C Bus Device](device/i2c/i2c.md) -- [SPI Device](device/spi/spi.md) -- [PWM Device](device/pwm/pwm.md) -- [RTC Device](device/rtc/rtc.md) -- [HWTIMER Device](device/hwtimer/hwtimer.md) -- [WATCHDOG Device](device/watchdog/watchdog.md) -- [WLAN Device](device/wlan/wlan.md) -- [Sensor Device](device/sensor/sensor.md) - -**Components** - -- [FinSH Console](finsh/finsh.md) -- [Virtual File System](filesystem/README.md) -- [utest Framework](utest/utest.md) -- [Dynamic Module: dlmodule](dlmodule/README.md) -- [Socket Abstraction Layer: SAL](sal/sal.md) -- [AT Commands](at/at.md) -- [POSIX Interface](posix/README.md) -- [Ulog Log](ulog/ulog.md) -- [Power Management: PM](pm/pm.md) -- [Network Framework](network/network.md) +# How to build doxygen html +1. download from https://doxygen.nl/index.html +2. open `Doxywizard` +3. `File` -> `Open` +4. Open the file ./Doxyfile +5. To tab `Run` , Click `Run doxygen` + +# How to build & run doxygen html on Ubuntu + +The following steps are verified on Ubuntu 22.04: + +```shell +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 22.04.5 LTS +Release: 22.04 +Codename: jammy +``` + +The following packages (and dependents) need to be installed: + +```shell +$ sudo apt update +$ sudo apt install doxygen +$ sudo apt install graphviz +``` + +Assume that the path of RT-Thead code tree is $RTT, execute the following command to build html. + +```shell +$ cd $RTT/documentation +$ rm -rf html +$ doxygen +``` + +A new html directory will be created and all the html files will be placed in this directory. + +If you want to quickly browse HTML locally (in Ubuntu environment), you can enter the html directory and start a local HTML server through Python. + +```shell +$ cd html +$ python3 -m http.server +Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... +``` + +A bash script `run.sh` is provided to automatic upon operations. + +```shell +$ cd $RTT/documentation +$ ./run.sh +``` + +Then open the browser and enter `http://:8000/index.html` to access the created html web pages. If it is a local access, then `` should be replaced by `localhost`. If it is a remote access, then `` should be replaced by the actual accessible IP address of the machine where HTML is located. diff --git a/documentation/at/at.md b/documentation/at/at.md index c807ec70d36..905fc44365a 100644 --- a/documentation/at/at.md +++ b/documentation/at/at.md @@ -1,6 +1,6 @@ -# AT Commands # +@page component_at AT Commands -## Introduction to AT Commands +# Introduction to AT Commands The AT command set was originally a control protocol invented by Dennis Hayes, initially used to control dial-up modems. Later, with the upgrade of network bandwidth, low-speed dial-up modems with very low speed essentially exited the general market, but the AT command set was retained. However, the AT command set lived on when major mobile phone manufacturers jointly developed a set of commands to control the GSM modules of mobile phones. The AT command set evolved on this basis and added the GSM 07.05 standard and the later GSM 07.07 standard to achieve more robust standardization. @@ -32,7 +32,7 @@ Although the AT command set has standardization to a certain degree, the AT comm In order to facilitate the user to use AT commands which can be easily adapted to different AT modules, RT-Thread provides AT components for AT Device connectivity and data communication. The implementation of the AT components consists of both a client and a server. -## Introduction to AT Components +# Introduction to AT Components The AT component is based on the implementation of the `AT Server` and `AT Client` of the RT-Thread system. The component completes the AT command transmission, command format and parameter parsing, command response, response data reception, response data parsing, URC data processing, etc.. @@ -66,9 +66,9 @@ Overall, the AT component resources are extremely small, making them ideal for u - AT Socket: An extension of AT Client function, it uses the AT command set to send and receive as the basis. This is implemented through the standard BSD Socket API, which completes the data sending and receiving function, and enables users to implement complete device networking and data communication through AT commands. - Multi-client support: The AT component supports multiple clients running simultaneously. -## AT Server ## +# AT Server -### AT Server Configuration ### +## AT Server Configuration ### When we use the AT Server feature in the AT component, we need to define the following configuration in rtconfig.h: @@ -110,7 +110,7 @@ RT-Thread Components ---> After the add configuration is complete, you can use the command line to rebuild the project, or use `scons` to compile. -### AT Server Initialization ### +## AT Server Initialization After enabling the AT Server in Env, you need to initialize it at startup to enable the AT Server function. If the component has been initialized automatically, no additional initialization is required. Otherwise, you need to call the following function in the initialization task: @@ -121,7 +121,7 @@ The AT Server initialization function, which belongs to the application layer fu After the AT Server is successfully initialized, the device can be used as an AT Server to connect to an AT Client's serial device for data communication, or use a serial-to-USB conversion tool to connect to a PC, so that the PC-side serial debugging assistant can communicate with the AT Client. -### Add custom AT commands ### +## Add custom AT commands At present, the format of the AT command set used by AT devices of different manufacturers does not have a completely uniform standard, so the AT Server in the AT component only supports some basic general AT commands, such as ATE, AT+RST, etc. These commands can only be used to meet the basic operation of the device. If users want to use more functions, they need to implement custom AT Server commands for different AT devices. The AT component provides an AT command addition method similar to the FinSH/msh command addition method, which is convenient for users to implement the required commands. @@ -175,9 +175,9 @@ static at_result_t at_test_query(void) AT_CMD_EXPORT("AT+TEST", =[,], NULL, at_test_query, NULL, at_test_exec); ``` -### AT Server APIs +## AT Server APIs -#### Send Data to the Client (no newline) +### Send Data to the Client (no newline) ```c void at_server_printf(const char *format, ...); @@ -190,7 +190,7 @@ This function is used by the AT Server to send fixed-format data to the correspo | format | Customize the expression of the input data | | ... | Input data list, variable parameters | -#### Send Data to the Client (newline) +### Send Data to the Client (newline) ```c void at_server_printfln(const char *format, ...); @@ -203,7 +203,7 @@ This function is used by the AT Server to send fixed-format data to the correspo | format | Customize the expression of the input data | | ... | Input data list, variable parameters | -#### Send Command Execution Results to the Client +### Send Command Execution Results to the Client ```c void at_server_print_result(at_result_t result); @@ -252,7 +252,7 @@ static at_result_t at_test_exec(void) AT_CMD_EXPORT("AT+TEST", =,, NULL, NULL, at_test_setup, at_test_exec); ``` -#### Parsing Input Command Parameters +### Parsing Input Command Parameters ```c int at_req_parse_args(const char *req_args, const char *req_expr, ...); @@ -299,7 +299,7 @@ static at_result_t at_test_setup(const char *args) AT_CMD_EXPORT("AT+TEST", =,, NULL, NULL, at_test_setup, NULL); ``` -#### Porting-related interfaces +### Porting-related interfaces The AT Server supports a variety of basic commands (ATE, ATZ, etc.) by default. The function implementation of some commands is related to hardware or platform and requires user-defined implementation. The AT component source code `src/at_server.c` file gives the weak function definition of the migration file. The user can create a new migration file in the project to implement the following function to complete the migration interface, or modify the weak function to complete the migration interface directly in the file. @@ -326,9 +326,9 @@ If you use the gcc toolchain in your project, you need to add the *section* corr } > CODE ``` -## AT Client +# AT Client -### AT Client Configuration +## AT Client Configuration When using the AT Client feature in the AT component, the following configuration in rtconfig.h needs to be defined: @@ -371,7 +371,7 @@ RT-Thread Components ---> After the configuration is complete, you can use the command line to rebuild the project, or use `scons` to compile. -### AT Client Initialization ### +## AT Client Initialization After configuring the AT Client, you need to initialize it at startup to enable the AT Client function. If the component has been initialized automatically, no additional initialization is required. Otherwise, you need to call the following function in the initialization task: @@ -381,7 +381,7 @@ int at_client_init(const char *dev_name, rt_size_t recv_bufsz); The AT Client initialization function, which belongs to the application layer function, needs to be called before using the AT Client function or using the AT Client CLI function. The `at_client_init()` function completes the initialization of the AT Client device, the initialization of the AT Client porting function, the semaphore and mutex used by the AT Client, and other resources, and creates the `at_client` thread for parsing the data received in the AT Client and for processing the URC data. -### AT Client data receiving and sending ### +## AT Client data receiving and sending The main function of the AT Client is to send AT commands, receive data, and parse data. The following is an introduction to the processes and APIs related to AT Client data reception and transmission. @@ -418,7 +418,7 @@ In the AT component, this structure is used to define a control block for AT com Introduction to related API interfaces: -#### Create a Response Structure +### Create a Response Structure ```c at_response_t at_create_resp(rt_size_t buf_size, rt_size_t line_num, rt_int32_t timeout); @@ -435,7 +435,7 @@ at_response_t at_create_resp(rt_size_t buf_size, rt_size_t line_num, rt_int32_t This function is used to create a custom response data receiving structure for later receiving and parsing the send command response data. -#### Delete a Response Structure +### Delete a Response Structure ```c void at_delete_resp(at_response_t resp); @@ -447,7 +447,7 @@ void at_delete_resp(at_response_t resp); This function is used to delete the created response structure object, which is generally paired with the **at_create_resp** creation function. -#### Set the Parameters of Response Structure +### Set the Parameters of Response Structure ```c at_response_t at_resp_set_info(at_response_t resp, rt_size_t buf_size, rt_size_t line_num, rt_int32_t timeout); @@ -465,7 +465,7 @@ at_response_t at_resp_set_info(at_response_t resp, rt_size_t buf_size, rt_size_t This function is used to set the response structure information that has been created. It mainly sets the restriction information on the response data. It is generally used after creating the structure and before sending the AT command. This function is mainly used to send commands when the device is initialized, which can reduce the number of times the response structure is created and reduce the code resource occupation. -#### Send a Command and Receive a Response +### Send a Command and Receive a Response ```c rt_err_t at_exec_cmd(at_response_t resp, const char *cmd_expr, ...); @@ -535,11 +535,11 @@ MSH_CMD_EXPORT(at_Client_send, AT Client send commands to AT Server and get resp The implementation principle of sending and receiving data is relatively simple. It mainly reads and writes the serial port device bound by the AT client, and sets the relevant number of rows and timeout to limit the response data. It is worth noting that the `res` response needs to be created first. The structure passed `in_exec_cmd` function is for data reception. When the `at_exec_cmd` function's parameter `resp` is NULL, it means that the data sent this time **does not consider processing the response data and directly returns the result**. -### AT Client Data Parsing Method ### +## AT Client Data Parsing Method After the data is normally acquired, the response data needs to be parsed, which is one of the important functions of the AT Client. Parsing of data in the AT Client provides a parsed form of a custom parsing expression whose parsing syntax uses the standard `sscanf` parsing syntax. Developers can use the custom data parsing expression to respond to useful information in the data, provided that the developer needs to review the relevant manual in advance to understand the basic format of the AT Server device response data that the AT Client connects to. The following is a simple AT Client data parsing method through several functions and routines. -#### Get Response Data for the Specified Line Number +### Get Response Data for the Specified Line Number ```c const char *at_resp_get_line(at_response_t resp, rt_size_t resp_line); @@ -555,7 +555,7 @@ const char *at_resp_get_line(at_response_t resp, rt_size_t resp_line); This function is used to get a row of data with the specified line number in the AT Server response data. The line number is judged by the standard data terminator. The above send and receive functions `at_exec_cmd` have recorded and processed the data and line numbers of the response data in the `resp` response structure, where the data information of the corresponding line number can be directly obtained. -#### Get Response Data by the Specified Keyword +### Get Response Data by the Specified Keyword ```c const char *at_resp_get_line_by_kw(at_response_t resp, const char *keyword); @@ -571,7 +571,7 @@ const char *at_resp_get_line_by_kw(at_response_t resp, const char *keyword); This function is used to get a corresponding row of data by keyword in the AT Server response data. -#### Parse Response Data for the Specified Line Number +### Parse Response Data for the Specified Line Number ```c int at_resp_parse_line_args(at_response_t resp, rt_size_t resp_line, const char *resp_expr, ...); @@ -590,7 +590,7 @@ int at_resp_parse_line_args(at_response_t resp, rt_size_t resp_line, const char This function is used to get a row of data with the specified line number in the AT Server response data, and parse the parameters in the row data. -#### Parse Response Data for a Row with Specified Keyword +### Parse Response Data for a Row with Specified Keyword ```c int at_resp_parse_line_args_by_kw(at_response_t resp, const char *keyword, const char *resp_expr, ...); @@ -611,7 +611,7 @@ This function is used to get a row of data containing a keyword in the AT Server The data parsing syntax uses the standard `sscanf` syntax, the content of the syntax is more, developers can search their parsing syntax, here two procedures are used to introduce the simple use method. -#### Serial Port Configuration Information Analysis Example +### Serial Port Configuration Information Analysis Example The data sent by the client: @@ -644,7 +644,7 @@ printf("baudrate=%d, databits=%d, stopbits=%d, parity=%d, control=%d\n", at_delete_resp(resp); ``` -#### IP and MAC Address Resolution Example #### +### IP and MAC Address Resolution Example The data sent by the client: @@ -678,7 +678,7 @@ at_delete_resp(resp); The key to parsing data is to correctly define the expression. Because the response data of the different device manufacturers is not unique to the response data of the AT device, only the form of the custom parsing expression can be obtained to obtain the required information. The design of the `at_resp_parse_line_args` parsing parameter function is based on the `sscanf` data parsing method. Before using it, the developer needs to understand the basic parsing syntax and then design the appropriate parsing syntax in combination with the response data. If the developer does not need to parse the specific parameters, you can use the `at_resp_get_line` function to get the specific data of a row. -### AT Client URC Data Processing ### +## AT Client URC Data Processing The processing of URC data is another important feature of AT Client. URC data is the data that is actively sent by the server. It cannot be received by the above data sending and receiving functions. The URC data format and function are different for different devices. Therefore, the URC data processing mode needs to be customized. The AT component provides a list management method for the processing of URC data. Users can customize the addition of URC data and its execution functions to the management list, so the processing of URC data is also the main porting work of AT Client. @@ -697,7 +697,7 @@ typedef struct at_urc *at_urc_t; Each URC data has a structure control block that defines and determines the prefix and suffix of the URC data, as well as the execution function of the URC data. A piece of data can be defined as URC data only if it matches the prefix and suffix of the URC exactly. The URC data execution function is executed immediately after the matching URC data is obtained. So developers adding a URC data requires a custom matching prefix, suffix, and execution function. -#### URC Data List Initialization +### URC Data List Initialization ```c void at_set_urc_table(const struct at_urc *table, rt_size_t size); @@ -745,9 +745,9 @@ int at_client_port_init(void) } ``` -### AT Client Other APIs Introduction +## AT Client Other APIs Introduction -#### Send Specified Length Data +### Send Specified Length Data ```c rt_size_t at_client_send(const char *buf, rt_size_t size); @@ -763,7 +763,7 @@ rt_size_t at_client_send(const char *buf, rt_size_t size); This function is used to send the specified length data to the AT Server device through the AT Client device, which is mostly used for the AT Socket function. -#### Receive Specified Length Data +### Receive Specified Length Data ```c rt_size_t at_client_recv(char *buf, rt_size_t size,rt_int32_t timeout); @@ -780,7 +780,7 @@ rt_size_t at_client_recv(char *buf, rt_size_t size,rt_int32_t timeout); This function is used to receive data of a specified length through the AT Client device, and is mostly used for the AT Socket function. This function can only be used in URC callback handlers. -#### Set the line terminator for receiving data #### +### Set the line terminator for receiving data ```c void at_set_end_sign(char ch); @@ -794,7 +794,7 @@ void at_set_end_sign(char ch); This function is used to set the line terminator, which is used to judge the end of a row of data received by the client, and is mostly used for the AT Socket function. -#### Waiting for module initialization to complete #### +### Waiting for module initialization to complete ```c int at_client_wait_connect(rt_uint32_t timeout); @@ -809,7 +809,7 @@ int at_client_wait_connect(rt_uint32_t timeout); This function is used to cyclically send AT commands when the AT module starts, until the module responds to the data, indicating that the module is successfully started. -### AT Client Multi-Client Support ### +## AT Client Multi-Client Support In general, the device as the AT Client only connects to one AT module (the AT module acts as the AT Server) and can directly use the above functions of data transmission and reception and command parsing. In a few cases, the device needs to connect multiple AT modules as the AT Client. In this case, the multi-client support function of the device is required. @@ -882,16 +882,16 @@ at_delete_resp(resp); The process differences used by other functions are similar to the above `at_obj_exec_cmd()` function. The main function is to obtain the client object through the `at_client_get()` function, and then determine which client is the client through the incoming object to achieve multi-client support. -## FAQs +# FAQs -### Q: What should I do if the log on the shell shows an error when enabling the AT command to send and receive data real-time printing function. ? +## Q: What should I do if the log on the shell shows an error when enabling the AT command to send and receive data real-time printing function. ? **A:** Increase the baudrate of the serial port device corresponding to the shell to 921600, improve the serial port printing speed, and prevent the printing error when the data is too large. -### Q: When the AT Socket function is started, the compile prompt "The AT socket device is not selected, please select it through the env menuconfig". +## Q: When the AT Socket function is started, the compile prompt "The AT socket device is not selected, please select it through the env menuconfig". **A:** After the AT Socket function is enabled, the corresponding device model is enabled in the at device package by default. Enter the at device package, configure the device as an ESP8266 device, configure WIFI information, re-generate the project, compile and download. -### Q: AT Socket function data reception timeout or data reception is not complete. +## Q: AT Socket function data reception timeout or data reception is not complete. **A:** The error may be that the receive data buffer in the serial device used by the AT is too small (RT_SERIAL_RB_BUFSZ default is 64 bytes), and the data is overwritten after the data is not received in time. The buffer size of the serial port receiving data (such as 256 bytes) is appropriately increased. diff --git a/documentation/basic/basic.md b/documentation/basic/basic.md index ec5215b1323..9fa2deebd26 100644 --- a/documentation/basic/basic.md +++ b/documentation/basic/basic.md @@ -1,4 +1,4 @@ -# Kernel Basics +@page kernel_basics Kernel Basics This chapter gives a brief introduction to the software architecture of the RT-Thread kernel, beginning with its composition and implementation. While also introducing RT-Thread kernel-related concepts for beginners. After understanding this chapter, readers will have an elementary understanding of the RT Thread kernel and will be able to answer questions such as - @@ -10,15 +10,7 @@ After understanding this chapter, readers will have an elementary understanding In the nutshell, this is only a brief introduction to software architecture decomposition and implementation of the real-time kernel. This will give understanding and concepts of how RT-Thread kernel works togther. After learning from this chapter, readers will have basic knowledge of each kernel components, system booting up proccesses, memory allocation and distrubtion, and methods of kernel configuration. -## **Table of Contents** - -1. [Introduction to RT-Thread Kernel](#introduction-to-rt-thread-kernel) -2. [RT-Thread Startup Process](#rt-thread-startup-process) -3. [RT-Thread Program Memory Distribution](#rt-thread-program-memory-distribution) -4. [RT-Thread Automatic Initialization Mechanism](#rt-thread-automatic-initialization-mechanism) -5. [RT-Thread Kernel Object Model](#rt-thread-kernel-object-model) - -## Introduction to RT-Thread Kernel +# Introduction to RT-Thread Kernel Kernel is the most basic and fundenmental part of an Operating System. Kernel service library and RT-Thread kernel libraries are interfacing between hardware and components/service layer. This includes the implementation of real-time kernel service library (rtservice.h/kservice.c) and other RT-Thread kernel libraries such as object management, thread management and scheduler, inter-thread communication management, clock management and memory management respectively. Below diagram is the core architecture diagram of the core kernel. @@ -30,7 +22,7 @@ Implementation of core kernel libraries are similar to a small set of standard C The built of the Kernel will be vary depending on the complier. For example, using GNU GCC compiler, it will use more implementation from the standard C library. Last but not least, the minimum resource requirements of the Kernel is 3KB ROM and 1.2KB RAM. -### Thread Scheduling +## Thread Scheduling Thread is the smallest scheduling unit in the RT-Thread operating system. The thread scheduling algorithm is a **Priority-based Full Preemptive Multi-Thread** scheduling algorithm. The system can support up to 256(0 - 255) thread priorities. For systems with tight resources, configurations with 8 or 32 thread priorities can be chosen(For example, STM32 has 32 thread priorities as per the default configuration). Lower numbers have a higher priority where 0 represents the highest priority furthermore the lowest priority(highest number) is reserved for idle threads. @@ -39,7 +31,7 @@ The number of threads is bounded by the memory of the hardware platform and not Thread management will be covered in detail in the "Thread Management" chapter. -### Clock Management +## Clock Management RT-Thread's Clock management is based upon a **clock beat**, which is the smallest clock unit in the RT-Thread operating system. The RT-Thread timer provides two types of timer mechanisms: @@ -52,7 +44,7 @@ The timer service is concluded using a timer timing callback i.e. a timeout func Timer will be explained further in the "Clock Management" chapter. -### Synchronization between Threads +## Synchronization between Threads RT-Thread uses thread semaphores, mutexes, and event sets to achieve inter-thread synchronization. Thread synchronizations happen through the acquisition and release of semaphore and mutexes. @@ -61,13 +53,13 @@ Event sets are primarily used for synchronization between threads, they can achi The concepts of semaphores, mutexes, and event sets are detailed in the "Inter-Thread Synchronization" chapter. -### Inter-Thread Communication +## Inter-Thread Communication RT-Thread supports communication mechanisms such as mailbox, message queue, etc. The mailbox's message length is fixed to 4 bytes. Whereas, message queue can receive messages in variable size and cache the messages in its own memory space. Compared to a message queue, a mailbox is more efficient. The sending action of the mailbox and message queue can be safely used in an ISR (Interrupt Service Routine). The communication mechanism allows threads to wait by priority or to acquire by the First In First Out (FIFO) method. The concept of mailbox and message queue will be explained in detail in the "Inter-Thread Communication" chapter. -### Memory Management +## Memory Management RT-Thread allows: 1. Static Memory Pool @@ -82,13 +74,13 @@ There is also a dynamic memory heap management called memheap, suitable for memo The concept of memory management will be explained in the "Memory Management" chapter. -### I/O Device Management +## I/O Device Management RT-Thread uses I2C, SPI, USB, UART, etc., as peripheral devices and is uniformly registered through the device. It realized a device management subsystem accessed by the name, and it can access hardware devices according to a unified API interface. On the device driver interface, depending on the characteristics of the embedded system, corresponding events can be attached to different devices. The driver notifies the upper application program when the device event is triggered. The concept of I/O device management will be explained in the "Device Model" and "General Equipment" chapters. -## RT-Thread Startup Process +# RT-Thread Startup Process The understanding of most codes usually starts from learning the startup process. We will firstly look for the source of the startup. Taking MDK-ARM as an example, the user program entry for MDK-ARM is the main() function located in the main.c file. The launching of the system starts from the assembly code startup_stm32f103xe.s, jumps to the C code, initializes the RT-Thread system function, and finally enters the user program entry main(). @@ -172,7 +164,7 @@ int main(void) } ``` -## RT-Thread Program Memory Distribution +# RT-Thread Program Memory Distribution The general MCU contains storage space that includes the on-chip Flash and the on-chip RAM. RAM is equivalent to memory, and Flash is comparable to a hard disk. The compiler classifies a program into several parts stored in different memory areas of the MCU. @@ -239,7 +231,7 @@ void sensor_init() ``` The `sensor_value` is stored in the ZI segment and is automatically initialized to zero after system startup (some library functions provided by the user program or compiler are initialized to zero). The sensor_inited variable is stored in the RW segment, and the sensor_enable is stored in the RO segment. -## RT-Thread Automatic Initialization Mechanism +# RT-Thread Automatic Initialization Mechanism The automatic initialization mechanism means that the initialization function does not need to be called by explicit function. It only needs to be declared by macro definition at the function definition, and it will be executed during system startup. @@ -288,10 +280,9 @@ The macro interface definitions used to implement the automatic initialization f Initialization function actively declares through these macro interfaces, such as INIT_BOARD_EXPORT (rt_hw_usart_init), the linker will automatically collect all the declared initialization functions, placed in the RTI symbol segment, the symbol segment is located in the RO segment of the memory distribution. All functions in this RTI symbol segment are automatically called when the system is initialized. -RT-Thread Kernel Object Model ---------------------- +# RT-Thread Kernel Object Model -### Static and Dynamic Objects +## Static and Dynamic Objects The RT-Thread kernel is designed with object-oriented method. The system-level infrastructures are all kernel objects such as threads, semaphores, mutexes, timers, and more. Kernel objects fall into two categories: static kernel objects and dynamic kernel objects. Static kernel objects are usually placed in RW and ZI segments, initialized in the program after system startup; dynamic kernel objects are created from the memory heap and then manually initialized. @@ -372,7 +363,7 @@ In this example, thread1 is a static thread object and thread2 is a dynamic thre Static objects take up RAM space and is not depend on the memory heap manager. When allocating static objects, the time needed is determined. Dynamic objects depend on the memory heap manager. It requests RAM space while running. When the object is deleted, the occupied RAM space is released. These two methods have their own advantages and disadvantages, and can be selected according to actual needs. -### Kernel Object Management Structure +## Kernel Object Management Structure RT-Thread uses the kernel object management system to access/manage all kernel objects. Kernel objects contain most of the facilities in the kernel. These kernel objects can be statically allocated static objects and dynamic objects allocated from the system memory heap. . @@ -396,7 +387,7 @@ The advantages of this design approach are: Derivations from object control block rt_object in the above figure includes: thread object, memory pool object, timer object, device object and IPC object (IPC: Inter-Process Communication. In RT-Thread real-time operating system, IPC objects is used for synchronization and communicate between threads); derivations from IPC objects includes: semaphores, mutexes, events, mailboxes, message queues, signals, etc. -### Object Control Block +## Object Control Block Data structure of kernel object control block: @@ -452,7 +443,7 @@ enum rt_object_class_type From the above type specification, we can see that if it is a static object, the highest bit of the object type will be 1 (which is the OR operation of RT_Object_Class_Static and other object types and operations). Otherwise it will be dynamic object, and the maximum number of object classes that the system can accommodate is 127. -### Kernel Object Management +## Kernel Object Management Data structure of kernel object container: @@ -470,7 +461,7 @@ struct rt_object_information A class of objects is managed by an rt_object_information structure, and each practical instance of such type of object is mounted to the object_list in the form of a linked list. The memory block size of this type of object is identified by object_size (the memory block each practical instance of each type of object is the same size). -#### Initialization Object +### Initialization Object An uninitialized static object must be initialized before it can be used. The initialization object uses the following interfaces: @@ -489,7 +480,7 @@ When this function is called to initialize the object, the system will place the | type | The type of the object must be a enumeration type listed in rt_object_class_type, RT_Object_Class_Static excluded. (For static objects, or objects initialized with the rt_object_init interface, the system identifies it as an RT_Object_Class_Static type) | | name | Name of the object. Each object can be set to a name, and the maximum length for the name is specified by RT_NAME_MAX. The system does not care if it uses ’`\0`’as a terminal symbol. | -#### Detach Object +### Detach Object Detach an object from the kernel object manager. The following interfaces are used to detach objects: @@ -499,7 +490,7 @@ void rt_object_detach(rt_object_t object); Calling this interface makes a static kernel object to be detached from the kernel object container, meaning the corresponding object node is deleted from the kernel object container linked list. After the object is detached, the memory occupied by the object will not be released. -#### Allocate object +### Allocate object The above descriptions are interfaces of objects initialization and detachment, both of which are under circumstances that object-oriented memory blocks already exist. But dynamic objects can be requested when needed. The memory space is freed for other applications when not needed. To request assigning new objects, you can use the following interfaces: @@ -519,7 +510,7 @@ When calling the above interface, the system first needs to obtain object inform | object handle allocated successfully | Allocate successfully | | RT_NULL | Fail to allocate | -#### Delete Object +### Delete Object For a dynamic object, when it is no longer used, you can call the following interface to delete the object and release the corresponding system resources: @@ -534,7 +525,7 @@ When the above interface is called, the object is first detached from the object |----------|------------| | object | object handle | -#### Identify objects +### Identify objects Identify whether the specified object is a system object (static kernel object). The following interface is used to identify the object: diff --git a/documentation/contribution_guide/coding_style_en.md b/documentation/contribution_guide/coding_style_en.md index 9b1a03fc584..4daa430fb4c 100644 --- a/documentation/contribution_guide/coding_style_en.md +++ b/documentation/contribution_guide/coding_style_en.md @@ -1,4 +1,4 @@ - RT-Thread Coding Style +@page rtt_code_style_en RT-Thread Coding Style This is an developing instruction for RT-Thread developers. As open source software, RT-Thread is created by the cooperation of different people. This @@ -7,7 +7,7 @@ RT-Thread users should also get to know some conventions in the code through it and thus easier to understand the implementations of RT-Thread. -1. Directory Naming +# 1. Directory Naming In normal conditions, please name directories in lowercase. Directories should have descriptive names. For example, the port of a chip should be composed of @@ -15,14 +15,14 @@ the name of the chip and the category of the chip. Directories under components/ should name what the component does. -2. File Naming +# 2. File Naming In normal conditions, please name files in lowercase. If the file is referencing other places, it can have the original name. To avoid naming collision, do not use general names or the names that are frequently used. -3. Header Files +# 3. Header Files To avoid include the same header file for multiple times, you need to define a symbol like this: @@ -36,7 +36,7 @@ The symbol should begin and end with "__" to avoid naming collision. The words of the file name should be connected by "_". (This convention is called "snake case".) -4. Header File Comments +# 4. Header File Comments In every header file, there should be copyright information and Change Log record like this: @@ -52,7 +52,7 @@ record like this: * 2006-04-26 Bernard add semaphore APIs */ -5. Structure Defines +# 5. Structure Defines Please name structures in lowercase and connect words with "_". For example: @@ -76,7 +76,7 @@ example: typedef struct rt_timer* rt_timer_t; -6. Macros +# 6. Macros In RT-Thread, please use uppercase names for macro definitions. Words are connected by "_". Like: @@ -84,7 +84,7 @@ connected by "_". Like: #define RT_TRUE 1 -7. Function Naming and Declaration +# 7. Function Naming and Declaration Please name functions in lowercase. Separate words with "_". The API provided to upper application should be declared in header files. If the function don't have @@ -93,7 +93,7 @@ parameters, it should be declared as void: rt_thread_t rt_thread_self(void); -8. Commenting +# 8. Commenting Please use English to comment. There shouldn't be many comments as the comments should describe what the code does. It should describe complicated @@ -101,7 +101,7 @@ algorithms, for example. Comments for statements should be placed before the statements or to the right of them. Any other locations are invalid. -9. Indent +# 9. Indent Please use TAB or 4 spaces to indent. It's preferred to use 4 spaces. If no other special meanings, the indent should begin right after "{": @@ -123,7 +123,7 @@ aligned with "switch": "case" is aligned with "switch". The following code block should be indented. -10. Braces and Spaces +# 10. Braces and Spaces For ease of reading, it is advised that braces should occupy the whole line instead of following other statements. Like: @@ -160,7 +160,7 @@ operators and the strings. There should be no spaces around(inside) parentheses, This is a bad practice. -11. trace, log Information +# 11. trace, log Information In RT-Thread, rt_kprintf is a commonly used logging routine. In RT-Thread rt_kprintf is implemented as a polling, non-interrupting string output. It is @@ -175,14 +175,14 @@ variable or a macro). When logging, it should be easy to understand and easy to determine where the problem is. -12. Functions +# 12. Functions Functions in kernel should be K.I.S.S. ("Keep it simple, stupid.") If the function is too long, you should split it into smaller ones, with each of them simplified to be easy to understand. -13. Objects +# 13. Objects The kernel of RT-Thread uses object-oriented techniques in C. The naming convention is: structure names are the object names, object names + verb phrases are the @@ -211,7 +211,7 @@ When creating a new object, think twice on memory allocations: whether a static object could be created or it could only created dynamically on the heap. Allocations can be slower, but may be necessary in dynamic environments. -14. Use astyle to format the code automatically +# 14. Use astyle to format the code automatically parameters: --style=allman --indent=spaces=4 --indent-preproc-block diff --git a/documentation/device/adc/adc.md b/documentation/device/adc/adc.md index 9ded20ae7fc..84c43a98218 100644 --- a/documentation/device/adc/adc.md +++ b/documentation/device/adc/adc.md @@ -1,10 +1,10 @@ -# ADC Device +@page device_adc ADC Device -## An Introduction to ADC +# An Introduction to ADC An ADC (analog-to-digital converter) is a hardware device that converts continuously changing analog signals to discrete digital signals. Usually, these analog signals include temperature, pressure, sound, video and many other types of signals. Converting them is important, as digital signals are easier to store, process, and transmit. This conversion can be achieved by using an ADC device which is commonly integrated in various platforms. Historically, ADCs were first used to convert received wireless signals to digital signals, for example, television signals, or signals from long-short broadcast stations. -### Conversion Process +## Conversion Process As shown in the figure below, the analog-to-digital conversion generally involves steps of sampling, holding, quantifying, and encoding. In actual circuits, some processes are combined, such as sampling and holding, while quantization and encoding are implemented simultaneously in the conversion process. @@ -14,19 +14,19 @@ Sampling is the conversion of analog signals that changes continuously over time The process of converting a numerically continuous analog quantity into a digital quantity is called quantization. Digital signals are discrete numerically. The output voltage of the sample-and-hold circuit also needs to be naturalized to a corresponding discrete level in a similar way, and any digital quantity can only be an integer multiple of a certain minimum quantity unit. The quantized value also requires the encoding process, which is the digital output of the A/D converter. -### Resolution +## Resolution Resolution is represented as binary (or decimal) numbers. Generally, it comes in 8 bits, 10 bits, 12 bits, 16 bits, etc. A larger resolution, in bits, means more accuracy in the conversion of analog to digital signals. -### Precision +## Precision Precision is the maximum error value between analog signals and real ADC device numerical points’ values.An ADC with a high resolution might have a low precision, meaning that factors like noise can affect the numerical ADC reading more than small changes in the input signal. -### Conversion Rate +## Conversion Rate The conversion rate is the reciprocal of time taken for an ADC device to complete conversion from an analog to a digital signal. For example, an ADC device with a conversion rate of 1MHz means that the ADC conversion time is 1 microsecond. -## Access ADC Device +# Access ADC Device The application accesses the ADC hardware through the ADC device management interface provided by RT-Thread. The relevant interfaces are as follows: @@ -37,7 +37,7 @@ The application accesses the ADC hardware through the ADC device management inte | rt_adc_read() | Read ADC device data | | rt_adc_disable() | Close the ADC device | -### Find ADC Devices +## Find ADC Devices The application gets the device handler based on the ADC device name to operate the ADC device. Following is the interface function to find the devices: @@ -62,7 +62,7 @@ rt_adc_device_t adc_dev; /* ADC device handle */ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); ``` -### Enable ADC Channel +## Enable ADC Channel It is required to enable the ADC device with the following interface function before reading and operating the ADC device. @@ -91,7 +91,7 @@ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); rt_adc_enable(adc_dev, ADC_DEV_CHANNEL); ``` -### Read ADC Channel Sample Values +## Read ADC Channel Sample Values Reading the ADC channel sample values can be done by the following function: @@ -129,7 +129,7 @@ rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100); The calculation formula of the actual voltage value is: `sampling value * reference voltage/(1 << resolution digit)`. In the above example, variable *vol* was enlarged 100 times, so finally the integer part of voltage is obtained through *vol / 100*, and the decimal part of voltage is obtained through *vol % 100*. -### Disabling the ADC Channel +## Disabling the ADC Channel An ADC channel can be disabled through the following function: @@ -166,7 +166,7 @@ rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100); rt_adc_disable(adc_dev, ADC_DEV_CHANNEL); ``` -### FinSH Command +## FinSH Command To find out the registered device, you can use the command adc probe followed by the registered ADC device name as following, @@ -198,7 +198,7 @@ adc1 channel 5 disable success msh > ``` -## ADC Device Usage Example +# ADC Device Usage Example The specific usage of the ADC device can refer to the following sample code. The main steps of the sample code are as follows: diff --git a/documentation/device/device.md b/documentation/device/device.md index 4c8c026c185..0e31d463dc7 100644 --- a/documentation/device/device.md +++ b/documentation/device/device.md @@ -1,12 +1,12 @@ -# I/O Device Framework +@page device_framework I/O Device Framework Most embedded systems include some I/O (Input/Output) devices, data displays on instruments, serial communication on industrial devices, Flash or SD cards for saving data on data acquisition devices,as well as Ethernet interfaces for network devices, are examples of I/O devices that are commonly seen in embedded systems. This chapter describes how RT-Thread manages different I/O devices. -## I/O Device Introduction +# I/O Device Introduction -### I/O Device Framework +## I/O Device Framework RT-Thread provides a set of I/O device framework, as shown in the following figure. It is located between the hardware and the application. It is divided into three layers. From top to bottom, they are I/O device management layer, device driver framework layer, and device driver layer. @@ -35,7 +35,7 @@ Usage of Watchdog device: ![Watchdog Device Use Sequence Diagram](figures/wtd-uml.png) -### I/O Device Model +## I/O Device Model The device model of RT-Thread is based on the kernel object model, which is considered a kind of objects and is included in the scope of the object manager. Each device object is derived from the base object. Each concrete device can inherit the properties of its parent class object and derive its own properties. The following figure is a schematic diagram of the inheritance and derivation relationship of device object. @@ -66,7 +66,7 @@ typedef struct rt_device *rt_device_t; ``` -### I/O Device Type +## I/O Device Type RT-Thread supports multiple I/O device types, the main device types are as follows: @@ -95,7 +95,7 @@ A block device transfers one data block at a time, for example 512 bytes data at When the system serves a write operation with a large amount of data, the device driver must first divide the data into multiple packets, each with the data size specified by the device. In the actual process, the last part of the data size may be smaller than the normal device block size. Each block in the above figure is written to the device using a separate write request, and the first three are directly written. However, the last data block size is smaller than the device block size, and the device driver must process the last data block differently than the first 3 blocks. Normally, the device driver needs to first perform a read operation of the corresponding device block, then overwrite the write data onto the read data, and then write the "composited" data block back to the device as a whole block. . For example, for block 4 in the above figure, the driver needs to read out the device block corresponding to block 4, and then overwrite the data to be written to the data read from the device block, and merge them into a new block. Finally write back to the block device. -## Create and Register I/O Device +# Create and Register I/O Device The driver layer is responsible for creating device instances and registering them in the I/O Device Manager. You can create device instances in a statically declared manner or dynamically create them with the following interfaces: @@ -245,13 +245,13 @@ rt_err_t rt_hw_watchdog_register(struct rt_watchdog_device *wtd, ``` -## Access I/O Devices +# Access I/O Devices The application accesses the hardware device through the I/O device management interface, which is accessible to the application when the device driver is implemented. The mapping relationship between the I/O device management interface and the operations on the I/O device is as follows: ![Mapping between the I/O Device Management Interface and the Operations on the I/O Device](figures/io-fun-call.png) -### Find Device +## Find Device The application obtains the device handle based on the device name, which in turn allows the device to operate. To find device, use function below: @@ -266,7 +266,7 @@ rt_device_t rt_device_find(const char* name); | device handle | finding the corresponding device will return the corresponding device handle | | RT_NULL | no corresponding device object found | -### Initialize Device +## Initialize Device Once the device handle is obtained, the application can initialize the device using the following functions: @@ -283,7 +283,7 @@ rt_err_t rt_device_init(rt_device_t dev); >When a device has been successfully initialized, calling this interface will not repeat initialization. -### Open and Close Device +## Open and Close Device Through the device handle, the application can open and close the device. When the device is opened, it will detect whether the device has been initialized. If it is not initialized, it will call the initialization interface to initialize the device by default. Open the device with the following function: @@ -333,7 +333,7 @@ rt_err_t rt_device_close(rt_device_t dev); >Device interfaces `rt_device_open()` and `rt_device_close()` need to used in pairs. Open a device requires close the device, so that the device will be completely closed, otherwise the device will remain on. -### Control Device +## Control Device By commanding the control word, the application can also control the device with the following function: @@ -362,7 +362,7 @@ The generic device command for the parameter `cmd` can be defined as follows: #define RT_DEVICE_CTRL_GET_INT 0x12 /* obtain interrupt status */ ``` -### Read and Write Device +## Read and Write Device Application can read data from the device by the following function: @@ -400,7 +400,7 @@ rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos,const void* buffer, rt_s Calling this function will write the data in the buffer to the *dev* device . The maximum length of the written data is *size*, and *pos* has different meanings depending on the device class. -### Data Transceiving and Call-back +## Data Transceiving and Call-back When the hardware device receives the data, the following function can be used to call back another function to set the data receiving indication to notify the upper application thread that the data arrives: @@ -432,7 +432,7 @@ rt_err_t rt_device_set_tx_complete(rt_device_t dev, rt_err_t (*tx_done)(rt_devic When this function is called, the callback function is provided by the user. When the hardware device sends the data, the driver calls back the function and passes the sent data block address buffer as a parameter to the upper application. When the upper layer application (thread) receives the indication, it will release the buffer memory block or use it as the buffer for the next write data according to the condition of sending the buffer. -### Access Device Sample +## Access Device Sample The following code is an example of accessing a device. First, find the watchdog device through the `rt_device_find()` port, obtain the device handle, then initialize the device through the `rt_device_init()` port, and set the watchdog device timeout through the `rt_device_control()`port. diff --git a/documentation/device/hwtimer/hwtimer.md b/documentation/device/hwtimer/hwtimer.md index da8903a5472..0a7135c43fd 100644 --- a/documentation/device/hwtimer/hwtimer.md +++ b/documentation/device/hwtimer/hwtimer.md @@ -1,7 +1,6 @@ -# HWTIMER Device +@page device_hwtimer HWTIMER Device - -## Introduction to the Timer +# Introduction to the Timer Hardware timers generally have two modes of operation, timer mode and counter mode. No matter which mode is operated, it works by counting the pulse signal counted by the internal counter module. Here are some important concepts of timers. @@ -11,7 +10,7 @@ Hardware timers generally have two modes of operation, timer mode and counter mo **Counting frequency**:Since the input frequency is usually fixed, the time it takes for the counter to reach its desired count number can be calculated from just the given frequency - `time = count value / count frequency`. For example, if the counting frequency is 1 MHz, the counter counts once every 1 / 1000000 seconds. That is, every 1 microsecond, the counter is incremented by one (or subtracted by one), at this time, the maximum timing capability of the 16-bit counter is 65535 microseconds, or 65.535 milliseconds. -## Access Hardware Timer Device +# Access Hardware Timer Device The application accesses the hardware timer device through the I/O device management interface provided by RT-Thread. The related interfaces are as follows: @@ -25,7 +24,7 @@ The application accesses the hardware timer device through the I/O device manage | rt_device_read() | to get the current value of the timer | | rt_device_close() | to turn off the timer device. | -### Find Timer Device +## Find Timer Device The application obtains the device handle based on the hardware timer device name, and thus can operate the hardware timer device. The device function is as follows: @@ -49,7 +48,7 @@ rt_device_t hw_dev; /* timer device handle */ hw_dev = rt_device_find(HWTIMER_DEV_NAME); ``` -### Open Timer Device +## Open Timer Device With the device handle, the application can open the device. When the device is open, it will detect whether the device has been initialized. If it is not initialized, it will call the initialization interface to initialize the device by default. Open the device with the following function: @@ -76,7 +75,7 @@ hw_dev = rt_device_find(HWTIMER_DEV_NAME); rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); ``` -### Set the Timeout Callback Function +## Set the Timeout Callback Function Set the timer timeout callback function with the following function - this is the function that will be called when the timer reaches its set count value: @@ -117,7 +116,7 @@ static int hwtimer_sample(int argc, char *argv[]) } ``` -### Control the Timer Device +## Control the Timer Device By sending control words, the application can configure the hardware timer device with the following function: @@ -189,7 +188,7 @@ static int hwtimer_sample(int argc, char *argv[]) } ``` -### Set the Timer Timeout Value +## Set the Timer Timeout Value The timer timeout value can be set by the following function: @@ -253,7 +252,7 @@ static int hwtimer_sample(int argc, char *argv[]) } ``` -### Obtain the Current Value of the Timer +## Obtain the Current Value of the Timer The current value of the timer can be obtained by the following function: @@ -279,7 +278,7 @@ rt_hwtimerval_t timeout_s; /* Used to save the time the timer has elapsed * rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); ``` -### Close the Timer Device +## Close the Timer Device The timer device can be closed with the following function: @@ -310,7 +309,7 @@ rt_device_close(hw_dev); >Timing errors may occur. Assume that the counter has a maximum value of 0xFFFF, a counting frequency of 1Mhz, and a timing time of 1 second and 1 microsecond. Since the timer can only count up to 65535us at a time, the timing requirement for 1000001us can be completed 20 times at 50000us, and the calculation error will be 1us. -## Hardware Timer Device Usage Example +# Hardware Timer Device Usage Example The specific use of the hardware timer device can refer to the following sample code. The main steps of the sample code are as follows: diff --git a/documentation/device/i2c/i2c.md b/documentation/device/i2c/i2c.md index a275e9e803d..a1ee1bfe23f 100644 --- a/documentation/device/i2c/i2c.md +++ b/documentation/device/i2c/i2c.md @@ -1,6 +1,6 @@ -# I2C Bus Device +@page device_i2c I2C Bus Device -## Introduction of I2C +# Introduction of I2C The I2C (Inter Integrated Circuit) bus is a half-duplex, bidirectional two-wire synchronous serial bus developed by Philips. The I2C bus has only two signal lines, one is the bidirectional data line SDA (serial data), and the other is the bidirectional clock line SCL (serial clock). Compared to the SPI bus, which has two lines for receiving data and transmitting data between the master and slave devices, the I2C bus uses only one line for data transmission and reception. @@ -28,7 +28,7 @@ When the bus is idle, both SDA and SCL are in a high state. When the host wants * **Stop Condition:** When SDA is low, the master pulls SCL high and stays high, then pulls SDA high to indicate the end of the transfer. -## Access to I2C Bus Devices +# Access to I2C Bus Devices In general, the MCU's I2C device communicates as a master and slave. In the RT-Thread, the I2C master is virtualized as an I2C bus device. The I2C slave communicates with the I2C bus through the I2C device interface. The related interfaces are as follows: @@ -37,7 +37,7 @@ In general, the MCU's I2C device communicates as a master and slave. In the RT-T | rt_device_find() | Find device handles based on I2C bus device name | | rt_i2c_transfer() | transfer data | -### Finding I2C Bus Device +## Finding I2C Bus Device Before using the I2C bus device, you need to obtain the device handle according to the I2C bus device name, so that you can operate the I2C bus device. The device function is as follows. @@ -62,7 +62,7 @@ struct rt_i2c_bus_device *i2c_bus; /* I2C bus device handle */ i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); ``` -### Data Transmission +## Data Transmission You can use `rt_i2c_transfer()` for data transfer by getting the I2C bus device handle. The function prototype is as follows: @@ -144,7 +144,7 @@ static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint } ``` -## I2C Bus Device Usage Example +# I2C Bus Device Usage Example The specific usage of the I2C device can be referred to the following sample code. The main steps of the sample code are as follows: diff --git a/documentation/device/pin/pin.md b/documentation/device/pin/pin.md index b0dd95033a8..136bfe4f341 100644 --- a/documentation/device/pin/pin.md +++ b/documentation/device/pin/pin.md @@ -1,6 +1,6 @@ -# PIN Device +@page device_pin PIN Device -## Introduction of Pin +# Introduction of Pin The pins on the chip are generally divided into four categories: power supply, clock, control, and I/O. The I/O pins are further divided into General Purpose Input Output (GPIO) and function-multiplexed I/O (such as SPI/I2C/UART, etc.) pins, referring to their usage mode. @@ -16,7 +16,7 @@ Most MCU pins have more than one function. Their internal structure is different * Input modes generally include: Input floating, Input pull-up, Input pull-down, and Analog. When the pin is in the input mode, the level state of the pin can be read, that is, high level or low level. -## Access PIN Device +# Access PIN Device The application accesses the GPIO through the PIN device management interface provided by RT-Thread. The related interfaces are as follows: @@ -29,11 +29,11 @@ The application accesses the GPIO through the PIN device management interface pr | rt_pin_irq_enable() | Enable pin interrupt | | rt_pin_detach_irq() | Detach pin interrupt callback function | -### Obtain Pin Number +## Obtain Pin Number The pin numbers provided by RT-Thread need to be distinguished from the chip pin numbers, which not the same. The pin numbers are defined by the PIN device driver and are related to the specific chip used. There are two ways to obtain the pin number: use the macro definition or view the PIN driver file. -#### Use Macro Definition +### Use Macro Definition If you use the BSP in the `rt-thread/bsp/stm32` directory, you can use the following macro to obtain the pin number: @@ -47,7 +47,7 @@ The sample code for the pin number corresponding to LED0 with pin number PF9 is #define LED0_PIN GET_PIN(F, 9) ``` -#### View Driver Files +### View Driver Files If you use a different BSP, you will need to check the PIN driver code `drv_gpio.c` file to confirm the pin number. There is an array in this file that holds the number information for each PIN pin, as shown below: @@ -70,7 +70,7 @@ static const rt_uint16_t pins[] = Take `__STM32_PIN(2, A, 15)` as an example, 2 is the pin number used by RT-Thread, A is the port number, and 15 is the pin number, so the pin number corresponding to PA15 is 2. -### Set Pin Mode +## Set Pin Mode Before the pin is used, you need to set the input or output mode first, and the following functions are used: @@ -102,7 +102,7 @@ An example of use is as follows: rt_pin_mode(BEEP_PIN_NUM, PIN_MODE_OUTPUT); ``` -### Set The Pin Level +## Set The Pin Level The function to set the pin output level is as follows: @@ -126,7 +126,7 @@ rt_pin_mode(BEEP_PIN_NUM, PIN_MODE_OUTPUT); rt_pin_write(BEEP_PIN_NUM, PIN_LOW); ``` -### Read Pin Level +## Read Pin Level The functions to read the pin level are as follows: @@ -155,7 +155,7 @@ rt_pin_write(BEEP_PIN_NUM, PIN_LOW); status = rt_pin_read(BEEP_PIN_NUM); ``` -### Bind Pin Interrupt Callback Function +## Bind Pin Interrupt Callback Function To use the interrupt functionality of a pin, you can use the following function to configure the pin to some interrupt trigger mode and bind an interrupt callback function to the corresponding pin. When the pin interrupt occurs, the callback function will be executed.: @@ -204,7 +204,7 @@ static void pin_beep_sample(void) } ``` -### Enable Pin Interrupt +## Enable Pin Interrupt After binding the pin interrupt callback function, use the following function to enable pin interrupt: @@ -242,7 +242,7 @@ static void pin_beep_sample(void) } ``` -### Detach Pin Interrupt Callback Function +## Detach Pin Interrupt Callback Function You can use the following function to detach the pin interrupt callback function: @@ -281,7 +281,7 @@ static void pin_beep_sample(void) } ``` -## PIN Device Usage Example +# PIN Device Usage Example The following sample code is the pin device usage example. The main steps of the sample code are as follows: diff --git a/documentation/device/pwm/pwm.md b/documentation/device/pwm/pwm.md index 792078289ee..96c9fc2af55 100644 --- a/documentation/device/pwm/pwm.md +++ b/documentation/device/pwm/pwm.md @@ -1,6 +1,6 @@ -# PWM Device +@page device_pwm PWM Device -## Introduction to PWM +# Introduction to PWM PWM (Pulse Width Modulation) is a method of digitally encoding the level of an analog signal. The frequency of the square wave is used to encode the level of a specific analog signal by pulses of different frequencies. The output receives a series of pulses of equal magnitude and uses these pulses to replace the device with the desired waveform. @@ -12,7 +12,7 @@ One of the common PWM control scenarios is to adjust the brightness of a light o ![PWM Brightness Adjustment](figures/pwm-l.png) -## Access to PWM Devices +# Access to PWM Devices The application accesses the PWM device hardware through the PWM device management interface provided by RT-Thread. The related interfaces are as follows: @@ -23,7 +23,7 @@ The application accesses the PWM device hardware through the PWM device manageme | rt_pwm_enable() | Enable PWM device | | rt_pwm_disable() | Disable the PWM device | -### Find the PWM Device +## Find the PWM Device The application obtains the device handle based on the name of PWM device, which in turn can operate the PWM device. The function is as follows: @@ -47,7 +47,7 @@ struct rt_device_pwm *pwm_dev; /* PWM device handle */ pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); ``` -### Set PWM Period and Pulse Width +## Set PWM Period and Pulse Width Set the PWM period and duty cycle by using the following function: @@ -88,7 +88,7 @@ pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); ``` -### Enable the PWM Device +## Enable the PWM Device After setting the PWM period and pulse width, you can enable the PWM device by the following function: @@ -123,7 +123,7 @@ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); ``` -### Disable the PWM device Channel +## Disable the PWM device Channel Use the following function to turn off the corresponding channel of the PWM device. @@ -160,7 +160,7 @@ rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); rt_pwm_disable(pwm_dev,PWM_DEV_CHANNEL); ``` -## FinSH Command +# FinSH Command To set the period and duty cycle of a channel of a PWM device, use the command `pwm_set pwm1 1 500000 5000`. The first parameter is the command, the second parameter is the PWM device name, the third parameter is the PWM channel, and the fourth parameter is PWM period (ns), the fifth parameter is the pulse width (ns). @@ -183,7 +183,7 @@ msh />pwm_disable pwm1 1 msh /> ``` -## PWM Device Usage Example +# PWM Device Usage Example The following sample code is a PWM device usage sample . The main steps of the sample code are as follows: diff --git a/documentation/device/rtc/rtc.md b/documentation/device/rtc/rtc.md index d01ef76d88d..f29f7db41d9 100644 --- a/documentation/device/rtc/rtc.md +++ b/documentation/device/rtc/rtc.md @@ -1,13 +1,13 @@ -# RTC Device +@page device_rtc RTC Device -## Introduction of RTC +# Introduction of RTC The RTC (Real-Time Clock) provides accurate real-time clock time, which can be used to generate information such as year, month, day, hour, minute, and second. At present, most real-time clock chips use a higher precision crystal oscillator as a clock source. In order to work when the main power supply is powered down, some clock chips will be powered by a battery to keep the time information valid. The RT-Thread RTC device provides the basic services for the operating system's time system. RTCs find many uses in IoT scenarios, and even in secure transmission processes such as SSL, RTC has become an indispensable part. -## Access RTC Devices +# Access RTC Devices The application accesses the RTC hardware through the RTC device management interface, and the relevant interfaces are as follows: @@ -17,7 +17,7 @@ The application accesses the RTC hardware through the RTC device management inte | set_time() | Set time, hour, minute, second | | time() | Obtain current time | -### Set Date +## Set Date Set the current date value of the RTC device by the following functions: @@ -42,7 +42,7 @@ An example of use is as follows: set_date(2018, 12, 3); ``` -### Set Time +## Set Time Set the current time value of the RTC device by the following function: @@ -67,7 +67,7 @@ An example of use is as follows: set_time(11, 15, 50); ``` -### Obtain Current Time +## Obtain Current Time Obtain time using the time API in the C standard library: @@ -93,9 +93,9 @@ rt_kprintf("%s\n", ctime(&now)); >Currently only one RTC device is allowed in the system and the name is `"rtc"`. -## Functional Configuration +# Functional Configuration -### Enable Soft RTC (Software Emulation RTC) +## Enable Soft RTC (Software Emulation RTC) You can use the function of enabling RTC software emulation, which is ideal for products that do not require high time precision and have no hardware RTC. The configuration options of menuconfig are as follows: @@ -106,7 +106,7 @@ RT-Thread Components → [ ] Using software simulation RTC device /* Use software simulation RTC device */ ``` -### Enable NTP Time Automatic Synchronization +## Enable NTP Time Automatic Synchronization If the RT-Thread is connected to the Internet, you can enable automatic NTP time synchronization to synchronize local time periodically. @@ -131,7 +131,7 @@ RT-Thread Components → (3600) NTP auto sync period(second) /* NTP The synchronization period is automatically synchronized in seconds, and the default period is one hour (ie 3600S). */ ``` -## FinSH Command +# FinSH Command Enter `date` to view the current time. @@ -148,7 +148,7 @@ msh />date 2018 02 16 01 15 30 msh /> ``` -## RTC Device Usage Examples +# RTC Device Usage Examples For the specific usage of the RTC device, refer to the following example code. First, set the year, month, date, hour, minute and second information, and then delay the data for 3 seconds to get the current time information. diff --git a/documentation/device/sensor/sensor.md b/documentation/device/sensor/sensor.md index 68a7fc85ce7..4b31c91ee0d 100644 --- a/documentation/device/sensor/sensor.md +++ b/documentation/device/sensor/sensor.md @@ -1,6 +1,6 @@ -# Sensor Device +@page device_sensor Sensor Device -## Introduction +# Introduction Sensors are an important part of the Internet of Things, and sensors in an IoT system are equivalent to the eyes of humans. Without eyes, human beings can not see and interpret the world around them. The same is true for the Internet of Things. @@ -8,13 +8,13 @@ Nowadays, with the development of IoT, a large number of sensors are available f The function of the Sensor device is to provide a unified operation interface for the upper layer and improve the reusability of the upper code. -### Characteristics of the Sensor Device +## Characteristics of the Sensor Device - **Interface:** Standard device interface (open/close/read/control) - **Work mode:** Supports polling, interrupts, three FIFO (First In, First Out) modes - **Power mode:** support four modes: power failure, common, low power consumption and high power consumption -## Access Sensor Device +# Access Sensor Device The application accesses the sensor device through the I/O device management interface provided by RT-Thread. The related interfaces are as follows: @@ -27,7 +27,7 @@ The application accesses the sensor device through the I/O device management int | rt_device_set_rx_indicate() | setting reveive callback fuction | | rt_device_close() | close sensor device | -### Find Sensor Device +## Find Sensor Device The application obtains the device handle according to the name of the sensor device, and then can operate the sensor device. The function of finding the device is as follows: @@ -51,7 +51,7 @@ static rt_device_t sensor_dev; /* sensor device handle */ sensor_dev = rt_device_find(SENSOR_DEVICE_NAME); ``` -### Open Sensor Device +## Open Sensor Device Through the device handle, the application can open and close the device. When the device is opened, it will check whether the device has been initialized or not. If it is not initialized, it will call the initialization interface by default. Open the device through the following functions: @@ -107,7 +107,7 @@ int main(void) } ``` -### Control Sensor Device +## Control Sensor Device By command control words, the application program can configure the sensor device through the following functions: @@ -137,7 +137,7 @@ rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg); #define RT_SEN_CTRL_SELF_TEST (6) /* selfcheck */ ``` -#### Get device information +### Get device information ```c struct rt_sensor_info info; @@ -149,7 +149,7 @@ LOG_I("intf_type :%d", info.intf_type); LOG_I("period_min:%d", info.period_min); ``` -#### Read Device ID +### Read Device ID ```c rt_uint8_t reg = 0xFF; @@ -157,7 +157,7 @@ rt_device_control(dev, RT_SEN_CTRL_GET_ID, ®); LOG_I("device id: 0x%x!", reg); ``` -#### Setting the measuring range of the sensor +### Setting the measuring range of the sensor The unit that sets the measuring range of the sensor is the unit that is provided when the device is registered. @@ -165,7 +165,7 @@ The unit that sets the measuring range of the sensor is the unit that is provide rt_device_control(dev, RT_SEN_CTRL_SET_RANGE, (void *)1000); ``` -#### Setting the Output Rate of Sensor Data +### Setting the Output Rate of Sensor Data Set the output rate to 100Hz and call the following interface. @@ -173,7 +173,7 @@ Set the output rate to 100Hz and call the following interface. rt_device_control(dev, RT_SEN_CTRL_SET_ODR, (void *)100); ``` -#### Setting up working mode +### Setting up working mode ```c /* Set the working mode to polling mode */ @@ -184,7 +184,7 @@ rt_device_control(dev, RT_SEN_CTRL_SET_MODE, (void *)RT_SEN_MODE_INT); rt_device_control(dev, RT_SEN_CTRL_SET_MODE, (void *)RT_SEN_MODE_FIFO); ``` -#### Setting up power mode +### Setting up power mode ```c /* Set power mode to power-off mode */ @@ -197,7 +197,7 @@ rt_device_control(dev, RT_SEN_CTRL_SET_POWER, (void *)RT_SEN_POWER_LOW); rt_device_control(dev, RT_SEN_CTRL_SET_POWER, (void *)RT_SEN_POWER_HIGH); ``` -#### Device self-inspection +### Device self-inspection ```c int test_res; @@ -205,7 +205,7 @@ int test_res; rt_device_control(dev, RT_SEN_CTRL_SELF_TEST, &test_res); ``` -### Setting Reveive Callback Fuction +## Setting Reveive Callback Fuction Data reception instructions can be set by following functions. When the sensor receives data, it notifies the upper application thread that data arrives: @@ -255,7 +255,7 @@ static int sensor_sample(int argc, char *argv[]) ``` -### Read Data of Sensor Device +## Read Data of Sensor Device The following functions can be called to read the data received by the sensor: @@ -349,7 +349,7 @@ int main(void) } ``` -### Close Sensor Device +## Close Sensor Device When the application completes the sensor operation, the sensor device can be closed by the following functions: @@ -367,7 +367,7 @@ rt_err_t rt_device_close(rt_device_t dev); Closing the device interface and opening the device interface should be used in pairs, opening the primary device should close the primary device, so that the device will be completely closed, otherwise the device is still in an open state. -## Example Code for Sensor Device +# Example Code for Sensor Device The specific use of sensor devices can be referred to the following sample code, the main steps of the sample code are as follows: diff --git a/documentation/device/spi/spi.md b/documentation/device/spi/spi.md index de56a20823e..a86a316efc8 100644 --- a/documentation/device/spi/spi.md +++ b/documentation/device/spi/spi.md @@ -1,6 +1,6 @@ -# SPI Device +@page device_spi SPI Device -## Introduction to SPI +# Introduction to SPI SPI (Serial Peripheral Interface) is a high-speed, full-duplex, synchronous communication bus commonly used for short-range communication. It is mainly used in EEPROM, FLASH, real-time clock, AD converter, and digital signal processing and between the device and the digital signal decoder. SPI generally uses 4 lines of communication, as shown in the following figure: @@ -34,7 +34,7 @@ The slave's clock is provided by the master through SCLK, and MOSI and MISO comp So for SPI Flash, there are three types of standard SPI Flash, Dual SPI Flash, Quad SPI Flash. At the same clock, the higher the number of lines, the higher the transmission rate. -## Mount SPI Device +# Mount SPI Device The SPI driver registers the SPI bus and the SPI device needs to be mounted to the SPI bus that has already been registered. @@ -84,7 +84,7 @@ static int rt_hw_spi_flash_init(void) INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); ``` -## Configuring SPI Device +# Configuring SPI Device The SPI device's transmission parameters need to be configured after the SPI device is mounted to the SPI bus. @@ -152,7 +152,7 @@ The example for configuration is as follows: rt_spi_configure(spi_dev, &cfg); ``` -## QSPI Configuration +# QSPI Configuration To configure the transmission parameters of a QSPI device, use the following function: @@ -181,7 +181,7 @@ struct rt_qspi_configuration }; ``` -## Access SPI Device +# Access SPI Device In general, the MCU's SPI device communicates as a master and slave. In the RT-Thread, the SPI master is virtualized as an SPI bus device. The application uses the SPI device management interface to access the SPI slave device. The main interfaces are as follows: @@ -197,7 +197,7 @@ In general, the MCU's SPI device communicates as a master and slave. In the RT-T >The SPI data transfer related interface will call rt_mutex_take(). This function cannot be called in the interrupt service routine, which will cause the assertion to report an error. -### Find SPI Device +## Find SPI Device Before using the SPI device, you need to find and obtain the device handle according to the SPI device name, so that you can operate the SPI device. The device function is as follows. @@ -222,7 +222,7 @@ struct rt_spi_device *spi_dev_w25q; /* SPI device handle */ spi_dev_w25q = (struct rt_spi_device *)rt_device_find(W25Q_SPI_DEVICE_NAME); ``` -### Transfer Custom Data +## Transfer Custom Data By obtaining the SPI device handle, the SPI device management interface can be used to access the SPI device device for data transmission and reception. You can transfer messages by the following function: @@ -298,7 +298,7 @@ rt_spi_transfer_message(spi_dev_w25q, &msg1); rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x\n", id[3], id[4]); ``` -### Transfer Data Once +## Transfer Data Once If only transfer data for once, use the following function: @@ -332,7 +332,7 @@ msg.cs_release = 1; msg.next = RT_NULL; ``` -### Send Data Once +## Send Data Once If only send data once and ignore the received data, use the following function: @@ -366,7 +366,7 @@ msg.cs_release = 1; msg.next = RT_NULL; ``` -### Receive Data Once +## Receive Data Once If only receive data once, use the following function: @@ -400,7 +400,7 @@ msg.cs_release = 1; msg.next = RT_NULL; ``` -### Send Data Twice in Succession +## Send Data Twice in Succession If need to send data of 2 buffers in succession and the CS is not released within the process, you can call the following function: @@ -447,7 +447,7 @@ msg2.cs_release = 1; msg2.next = RT_NULL; ``` -### Receive Data After Sending Data +## Receive Data After Sending Data If need to send data to the slave device first, then receive the data sent from the slave device, and the CS is not released within the process, call the following function to implement: @@ -496,7 +496,7 @@ msg2.next = RT_NULL; The SPI device management module also provides `rt_spi_sendrecv8()` and `rt_spi_sendrecv16()` functions, both are wrapper of the `rt_spi_send_then_recv()`. `rt_spi_sendrecv8()` sends a byte data and receives one byte data, and`rt_spi_sendrecv16()` sends 2 bytes. The section data receives 2 bytes of data at the same time. -## Access QSPI Device +# Access QSPI Device The data transfer interface of QSPI is as follows: @@ -508,7 +508,7 @@ The data transfer interface of QSPI is as follows: >The QSPI data transfer related interface will call rt_mutex_take(). This function cannot be called in the interrupt service routine, which will cause the assertion to report an error. -### Transfer Data +## Transfer Data Transfer messages by the following function: @@ -548,7 +548,7 @@ struct rt_qspi_message }; ``` -### Receive Data +## Receive Data Use the following function to receive data: @@ -573,7 +573,7 @@ rt_err_t rt_qspi_send_then_recv(struct rt_qspi_device *device, The send_buf parameter contains the sequence of commands that will be sent. -### Send Data +## Send Data ```c rt_err_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_size_t length) @@ -590,11 +590,11 @@ rt_err_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_si The send_buf parameter contains the sequence of commands and data to be sent. -## Special Usage Scenarios +# Special Usage Scenarios In some special usage scenarios, a device wants to monopolize the bus for a period of time, and the CS is always valid during the period, during which the data transmission may be intermittent, then the relevant interface can be used as shown. The transfer data function must use `rt_spi_transfer_message()`, and this function must set the cs_take and cs_release of the message to be transmitted to 0 value, because the CS has already used other interface control, and does not need to control during data transmission. -### Acquire the SPI bus +## Acquire the SPI bus In the case of multi-threading, the same SPI bus may be used in different threads. In order to prevent the data being transmitted by the SPI bus from being lost, the slave device needs to acquire the right to use the SPI bus before starting to transfer data. To transfer data using the bus, use the following function to acquire the SPI bus: @@ -609,7 +609,7 @@ rt_err_t rt_spi_take_bus(struct rt_spi_device *device); | RT_EOK | Successful | | Other Errors | Failed | -### Select CS +## Select CS After obtaining the usage right of the bus from the device, you need to set the corresponding chip selection signal to be valid. You can use the following function to select the CS: @@ -624,7 +624,7 @@ rt_err_t rt_spi_take(struct rt_spi_device *device); | 0 | Successful | | Other Errors | Failed | -### Add a New Message +## Add a New Message When using `rt_spi_transfer_message()` to transfer messages, all messages to be transmitted are connected in the form of a singly linked list. Use the following function to add a new message to be sent to the message list: @@ -638,7 +638,7 @@ void rt_spi_message_append(struct rt_spi_message *list, | list | Message link node to be transmitted | | message | New message pointer | -### Release CS +## Release CS After the device data transfer is completed, CS need to be released. Use the following function to release the CS: @@ -653,7 +653,7 @@ rt_err_t rt_spi_release(struct rt_spi_device *device); | 0 | Successful | | Other Errors | Failed | -### Release Data Bus +## Release Data Bus The slave device does not use the SPI bus to transfer data. The bus must be released as soon as possible so that other slave devices can use the SPI bus to transfer data. The following function can be used to release the bus: @@ -667,7 +667,7 @@ rt_err_t rt_spi_release_bus(struct rt_spi_device *device); | **Return** | —— | | RT_EOK | Successful | -## SPI Device Usage Example +# SPI Device Usage Example The specific use of the SPI device can be referred to the following sample code. The sample code first finds the SPI device to get the device handle, and then uses the rt_spi_transfer_message() send command to read the ID information. diff --git a/documentation/device/uart/uart.md b/documentation/device/uart/uart.md index 92ca9b4bf85..b7e4c5f35a4 100644 --- a/documentation/device/uart/uart.md +++ b/documentation/device/uart/uart.md @@ -1,6 +1,6 @@ -# UART Device +@page device_uart UART Device -## UART Introduction +# UART Introduction UART (Universal Asynchronous Receiver/Transmitter), as a kind of asynchronous serial communication protocol, the working principle is to transmit each character of the transmitted data one by one. It is the most frequently used data bus during application development. @@ -14,7 +14,7 @@ The UART serial port is characterized by sequentially transmitting data one bit - Stop Bit: Indicates the end of one frame of data. The level logic is "1". - Baudrate: It is the rate at which a serial port communicates, which expressed in bits per second (bps) of the binary code transmitted in unit time. The common baud rate values are 4800, 9600, 14400, 38400, 115200, etc. The higher the value is, the faster the data transmission will be. -## Access UART Device +# Access UART Device The application accesses the serial port hardware through the I/O device management interface provided by RT-Thread. The related interfaces are as follows: @@ -29,7 +29,7 @@ The application accesses the serial port hardware through the I/O device managem | rt_device_set_tx_complete() | set send complete callback function | | rt_device_close() | close device | -### Find UART Device +## Find UART Device The application obtains the device handle according to the uart device name, and then can operate the uart device.The device find function is shown below @@ -53,7 +53,7 @@ static rt_device_t serial; /* uart device handle */ serial = rt_device_find(SAMPLE_UART_NAME); ``` -### Open UART Device +## Open UART Device Through the device handle, the application can open and close the device. When the device is opened, it will detect whether the device has been initialized. If it is not initialized, it will call the initialization interface to initialize the device by default. Open the device through the following functions: @@ -114,7 +114,7 @@ serial = rt_device_find(SAMPLE_UART_NAME); rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX); ``` -### Control UART Device +## Control UART Device Through command control word, the application can configure the uart device by the following function: @@ -231,7 +231,7 @@ config.parity = PARITY_NONE; rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); ``` -### Send Data +## Send Data To write data to the serial port, the following functions can be used: @@ -267,7 +267,7 @@ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); rt_device_write(serial, 0, str, (sizeof(str) - 1)); ``` -### Set The Send completion Callback Function +## Set The Send completion Callback Function When the application calls `rt_device_write()` to write data, if the underlying hardware can support automatic transmission, the upper application can set a callback function. This callback function is called after the underlying hardware data has been sent (for example, when the DMA transfer is complete or the FIFO has been written to complete the completion interrupt). You can set the device to send completion instructions by the following function: @@ -284,7 +284,7 @@ rt_err_t rt_device_set_tx_complete(rt_device_t dev, rt_err_t (*tx_done)(rt_devic When this function is called, the callback function is provided by the user. When the hardware device sends the data, the device driver calls back this function and passes the sent data block address buffer as a parameter to the upper application. When the application (thread) receives the indication, it will release the buffer memory block or use it as the buffer for the next write data according to the condition of sending the buffer. -### Set The Receive Callback Function +## Set The Receive Callback Function The data receiving instruction can be set by the following function. When the serial port receives the data, it will inform the upper application thread that the data has arrived: @@ -337,7 +337,7 @@ static int uart_sample(int argc, char *argv[]) ``` -### Receive Data +## Receive Data You can call the following function to read the data received by the uart: @@ -383,7 +383,7 @@ static void serial_thread_entry(void *parameter) } ``` -### Close The UART Device +## Close The UART Device After the application completes the serial port operation, the uart device can be closed by the following functions: @@ -401,9 +401,9 @@ rt_err_t rt_device_close(rt_device_t dev); Use the `rt_device_close()` interface and `rt_device_open()` interface in pair. When you open the device, you need to close the device once, so that the device will be completely shut down, otherwise the device will remain open. -## Examples Of Using UART Device +# Examples Of Using UART Device -### Interrupt Receiving And Polling Send +## Interrupt Receiving And Polling Send The main steps of the sample code are as follows: @@ -512,7 +512,7 @@ static int uart_sample(int argc, char *argv[]) MSH_CMD_EXPORT(uart_sample, uart device sample); ``` -### DMA Reception And Polling Transmission +## DMA Reception And Polling Transmission When the serial port receives a batch of data, it will call the receive callback function. The receive callback function will send the data size of the buffer at this time to the waiting data processing thread through the message queue. After the thread gets the message, it is activated and reads the data. In general, the DMA receive mode completes data reception in conjunction with the DMA receive completion interrupt and the serial port idle interrupt. diff --git a/documentation/device/watchdog/watchdog.md b/documentation/device/watchdog/watchdog.md index e300f5a798e..4f0273643b9 100644 --- a/documentation/device/watchdog/watchdog.md +++ b/documentation/device/watchdog/watchdog.md @@ -1,6 +1,6 @@ -# WATCHDOG Device +@page device_watchdog WATCHDOG Device -## An Introduction to WATCHDOG +# An Introduction to WATCHDOG The hardware watchdog timer is a timer whose timing output is connected to the reset terminal of the circuit. In a productized embedded system, in order to automatically reset the system under abnormal conditions, it generally needs a watchdog. @@ -8,7 +8,7 @@ When the watchdog was started, the counter starts counting automatically. If it In general, users can feed the dog in the idlehook function and key function of RT-Thread. -## Access to the WATCHDOG Device +# Access to the WATCHDOG Device The application accesses the watchdog hardware through the I/O device management interface provided by RT-Thread. The related interfaces are as follows: @@ -19,7 +19,7 @@ The application accesses the watchdog hardware through the I/O device management | rt_device_control() |Control the watchdog device | | rt_device_close() | Close the watchdog device | -### Find the Watchdog Device +## Find the Watchdog Device The application obtains the device handle based on the watchdog device's name, and then it can operate the watchdog device. The function for finding a device is as follows: @@ -44,7 +44,7 @@ static rt_device_t wdg_dev; /* device handle of the watchdog */ wdg_dev = rt_device_find(IWDG_DEVICE_NAME); ``` -### Initialize the Watchdog Device +## Initialize the Watchdog Device The watchdog device need to be initialized before using, which can be done by the following function: @@ -73,7 +73,7 @@ wdg_dev = rt_device_find(IWDG_DEVICE_NAME); rt_device_init(wdg_dev); ``` -### Control the Watchdog Device +## Control the Watchdog Device The application can configure the watchdog device using the command control word, which can be done by the following function: @@ -130,7 +130,7 @@ static void idle_hook(void) } ``` -### Close the Watchdog Device +## Close the Watchdog Device When the application completes the operation of the watchdog, it can close the watchdog device: @@ -148,7 +148,7 @@ rt_err_t rt_device_close(rt_device_t dev); Closing the device interface and opening the device interface need to match each other. When you open the device, you need to close the device once correspondingly, so that the device will be completely shut down, otherwise the device will remain unclosed. -## Watchdog Device usage example +# Watchdog Device usage example The specific use of the watchdog device can be referred to the following sample code. The main steps of the sample code are as follows: diff --git a/documentation/device/wlan/wlan.md b/documentation/device/wlan/wlan.md index cbde241ea4b..36fd1461de6 100644 --- a/documentation/device/wlan/wlan.md +++ b/documentation/device/wlan/wlan.md @@ -1,8 +1,8 @@ -# WLAN Device +@page device_wlan WLAN Device With the rapid development of the Internet of Things, more and more embedded devices are equipped with WIFI wireless network devices. In order to be able to manage WIFI network devices, RT-Thread introduces a WLAN device management framework. This framework has many features to control and manage WIFI, providing developers with many conveniences for using WIFI devices. -## Introduction to the WLAN Framework +# Introduction to the WLAN Framework The WLAN framework is a set of middleware developed by RT-Thread for managing WIFI. Connect to the specific WIFI driver, control the WIFI connection disconnection, scan and other operations. Support different applications, provide WIFI control, events, data diversion and other operations for the application, and provide a unified WIFI control interface for the upper application. The WLAN framework consists of three main parts. The DEV driver interface layer provides a unified API for the WLAN framework. Manage layer provides users with specific functions such as WIFI scanning, connection, and disconnection. Protocol is responsible for processing the data stream generated on the WIFI. Different protocols such as LWIP can be mounted according to different usage scenarios. It has the characteristics of simple use, complete functions, convenient docking and strong compatibility. @@ -22,14 +22,14 @@ The Fifth Part: `WLAN Config`, the parameter management layer. Manage hotspot in The Sixth Part: `WLAN Device`, the driver interface layer. Connect to specific WLAN hardware and provide unified APIs for management. -### Functions +## Functions * Automatic Connection: After using automatic connection function, as long as the WIFI is disconnected, the hotspot information of the previous successful connection will be automatically read, and the hotspot will be connected. If a hotspot connection fails, switch to the next hotspot to connect until the connection is successful. The hotspot information used by the automatic connection is sequentially tried in the order of the success of the connection, and the hotspot information of the latest connection success is preferentially used. After the connection is successful, the hotspot information is cached first, and use it first when reconnecting after the next disconnection. * Parameter storage: Stores the WIFI parameters for successful connection. The WIFI parameter will be cached in the memory. If the external non-volatile storage interface is configured, it will be stored in the external storage medium. Users can implement the `struct rt_wlan_cfg_ops` structure according to his actual situation and save the parameters anywhere. The cached parameters mainly provide hotspot information for automatic connections. When WIFI is unconnected, it will read the cached parameters and try to connect. * WIFI control: Provide complete WIFI control APIs, scanning, connection, hotspot, etc. Provide WIFI related status callback events, disconnect, connection, connection failure, etc. Provide users with an easy to use WIFI management APIs. * Shell command: You can enter the command in Msh to control WIFI to perform scanning, connecting, disconnecting and other actions. Print debugging information such as WIFI status. -### Configuration +## Configuration Use `menuconfig` command in ENV to enter the WLAN configuration interface by following the menu: @@ -58,7 +58,7 @@ Configuration options are described in detail as follows: [ ] Enable WLAN Debugging Options /* Enable WLAN Debugging Options */ ``` -## Access Wi-Fi Devices +# Access Wi-Fi Devices The application accesses the WLAN device hardware through the WLAN device management interface, and the relevant interfaces are as follows: @@ -70,7 +70,7 @@ The application accesses the WLAN device hardware through the WLAN device manage | rt_wlan_disconnect() | Synchronized Hotspot Disconnection | | rt_wlan_config_autoreconnect() | Configuration automatic reconnection mode | -### Specify Protocol +## Specify Protocol ```c rt_err_t rt_wlan_prot_attach(const char *dev_name, const char *prot_name); @@ -84,7 +84,7 @@ rt_err_t rt_wlan_prot_attach(const char *dev_name, const char *prot_name); | -RT_ERROR | Execution failed | | RT_EOK | Execution succeed | -### Synchronized WLAN Scan +## Synchronized WLAN Scan ```c struct rt_wlan_scan_result *rt_wlan_scan_sync(void); @@ -104,7 +104,7 @@ struct rt_wlan_scan_result }; ``` -### Synchronized Hotspot Connection +## Synchronized Hotspot Connection ```c rt_err_t rt_wlan_connect(const char *ssid, const char *password); @@ -120,7 +120,7 @@ rt_err_t rt_wlan_connect(const char *ssid, const char *password); | -RT_ERROR | Connection failed | | RT_EOK | Connection successful | -### Synchronized Hotspot Disconnection +## Synchronized Hotspot Disconnection ```c rt_err_t rt_wlan_disconnect(void); @@ -133,7 +133,7 @@ rt_err_t rt_wlan_disconnect(void); | -RT_ERROR | Disconnection failed | | RT_EOK | Disconnection successful | -### Automatic Reconnection Mode Configuration +## Automatic Reconnection Mode Configuration ```c void rt_wlan_config_autoreconnect(rt_bool_t enable); @@ -143,7 +143,7 @@ void rt_wlan_config_autoreconnect(rt_bool_t enable); | ----------------------------- | ---------------------------------- | | enable | enable or disable automatic reconnection | -## FinSH Command +# FinSH Command Using shell commands can help us quickly debug WiFi-related features. The wifi related shell commands are as follows: @@ -159,7 +159,7 @@ wifi status /* Print wifi status sta + ap */ wifi smartconfig /* Start to configure network function */ ``` -### WiFi Scan +## WiFi Scan The wifi scan command is `wifi scan`. After the wifi scan command is executed, the surrounding hotspot information will be printed on the terminal. Through the printed hotspot information, you can see multiple attributes such as SSID and MAC address. @@ -175,7 +175,7 @@ rtt_test_ssid_2 ec:88:8f:88:aa:9a WPA2_MIXED_PSK -47 6 144 rtt_test_ssid_3 c0:3d:46:00:41:ca WPA2_MIXED_PSK -48 3 300 ``` -### WiFi Connection +## WiFi Connection The wifi scan command is `wifi join`. The command needs to be followed by the hotspot name and hotspot password. If the hotspot does not have a password, you may not enter this item. After the WiFi connection command is executed, if the hotspot exists and the password is correct, the board will connect to the hotspot and obtain the IP address. After the network connection is successful, you can use `socket` sockets for network communication. @@ -187,7 +187,7 @@ wifi join ssid_test 12345678 [I/WLAN.lwip] Got IP address : 192.168.1.110 ``` -### WiFi Disconnection +## WiFi Disconnection The command to disconnect WiFi is `wifi disc`. After the WiFi disconnect command is executed, the development board will disconnect from the hotspot. @@ -198,9 +198,9 @@ wifi disc [I/WLAN.mgnt] disconnect success! ``` -## Example for WLAN Device Usage +# Example for WLAN Device Usage -### WiFi Scan +## WiFi Scan The following code will show a WiFi sync scan, and then print the results on the terminal. First perform WIFI initialization, and then execute the WIFI scan function `rt_wlan_scan_sync`, this function is synchronous, the number of scans and results returned by the function. In this example, the scanned hotspot name will be printed. @@ -241,7 +241,7 @@ The results are as follows: ![Scan](figures/an0026_3.png) -### WiFi Connection and Disconnection +## WiFi Connection and Disconnection The code below will show a WiFi sync connection. Initialize WIFI first, and then create a semaphore for waiting for the `RT_WLAN_EVT_READY` event. Register the callback function of the event that needs attention, execute the `rt_wlan_connect` wifi connection function, and return value will indicate whether the connection has been successful. If the WiFi connection succeeds, it needs to wait for the network to get the IP address before communication. Use the semaphore created in advance to wait for the network to be ready. Once the network is ready, it will be able to communicate. @@ -364,7 +364,7 @@ The results are as follows: ![Disconnection](figures/an0026_4.png) -### WiFi Auto Reconnection when Turn On +## WiFi Auto Reconnection when Turn On First enable the automatic reconnection function, use the command line to connect to the hotspot A, and connect another hotspot B. After waiting for a few seconds, power off hotspot B, the system will automatically retry connecting B hotspot. At this time, B hotspot connection can not be connected, and the system automatically switches hotspot A to connect. After the connection is successful, the system stops connecting. diff --git a/documentation/dlmodule/README.md b/documentation/dlmodule/README.md index de6b1928a92..1ffa5ad328a 100644 --- a/documentation/dlmodule/README.md +++ b/documentation/dlmodule/README.md @@ -1,10 +1,10 @@ -# Dynamic Module: dlmodule # +@page component_dlmodule Dynamic Module: dlmodule In traditional desktop operating systems, user space and kernel space are separate. The application runs in user space, and the kernel and kernel modules run in kernel space. The kernel module can be dynamically loaded and deleted to extend the kernel functionality. `dlmodule` is a software component of the dynamic module loading mechanism provided in kernel space of RT-Thread. In versions of RT-Thread v3.1.0, this was also called the `Application Module`. After RT-Thread v3.1.0 and later, it returned to the tradition and was named after the `dynamic module`. `dlmodule` is more of an ELF format loader. The code segment and data segment of a separately compiled elf file are loaded into memory, and the symbols are parsed and bound to the API address exported by the kernel. The elf files are primarily placed on file systems under RT-Thread. -## Introduction ## +# Introduction The dynamic module provides a mechanism for dynamically loading program modules for RT-Thread. Because it is also compiled independently of the kernel, it is more flexible to use. In terms of implementation, this is a mechanism to separate the kernel from the dynamic modules. Through this mechanism, the kernel and dynamic modules can be compiled separately, and at runtime, the compiled dynamic modules are loaded into the kernel through the module loader in the kernel. @@ -15,11 +15,11 @@ In the dynamic module of RT-Thread, two formats are currently supported: The current RT-Thread architecture supporting dynamic modules mainly includes ARM architecture and x86 architecture, and will be extended to MIPS and RISC-V architecture in the future. The RT-Thread kernel firmware section can use a variety of compiler toolchains, such as GCC, ARMCC, IAR and other toolchains; however, dynamic module partial compilation currently only supports GNU GCC toolchain compilation. Therefore, compiling the RT-Thread module requires downloading GCC tools, such as CodeSourcery's arm-none-eabi toolchain. In general, it's best to use kernel and dynamic modules to compile with the same toolchain (so that it doesn't produce inconsistent behavior in *libc*). In addition, dynamic modules can only be loaded into RAM and used for symbol resolution binding to the API address exported by the kernel. Instead of running directly in XIP mode based on Flash (because Flash can't modify the code segment again). -## Using Dynamic Module ## +# Using Dynamic Module When you want to use the dynamic modules in your system, you need to compile a firmware that supports dynamic modules, as well as dynamic modules that need to be run. The following two parts are compiling firmware and compiling dynamic modules. -### Compile Firmware ### +## Compile Firmware When you want to use the dynamic module, you need to open the corresponding option in the firmware configuration, use menuconfig to open the following configuration: @@ -82,7 +82,7 @@ Then execute the `scons` under the BSP project directory and generate the firmwa to generate the kernel header file search path and global macro definitions that need to be included when compiling the dynamic module. -### Compile Dynamic Module ### +## Compile Dynamic Module There is a separate repository on github: [rtthread-apps](https://github.com/RT-Thread/rtthread-apps) , which contains some examples of dynamic modules and dynamic libraries. @@ -151,11 +151,11 @@ int main(int argc, char *argv[]) } ``` -## APIs of Dynamic Module +# APIs of Dynamic Module In addition to dynamically loading and executing dynamic modules via msh, dynamic modules can be loaded or unloaded using the dynamic module API provided by RT-Thread in the main program. -### Load Dynamic Module +## Load Dynamic Module ```c struct rt_dlmodule *dlmodule_load(const char* pgname); @@ -170,7 +170,7 @@ struct rt_dlmodule *dlmodule_load(const char* pgname); This function loads the dynamic module from the file system into memory, and if it is loaded correctly, returns a pointer to the module. This function does not create a thread to execute this dynamic module, just load the module into memory and parse the symbolic address. -### Execute Dynamic Module +## Execute Dynamic Module ```c struct rt_dlmodule *dlmodule_exec(const char* pgname, const char* cmd, int cmd_size); @@ -187,7 +187,7 @@ struct rt_dlmodule *dlmodule_exec(const char* pgname, const char* cmd, int cmd_s This function loads the dynamic module according to the `pgname` path and starts a thread to execute `main` of the dynamic module. At the same time, `cmd` is passed as the command line Parameter to `main` entry of the dynamic module. -### Exit Dynamic Module +## Exit Dynamic Module ```c void dlmodule_exit(int ret_code); @@ -199,7 +199,7 @@ void dlmodule_exit(int ret_code); This function is called by the module runtime, it can set the return value of the module exit `ret_code`, and then exit from the module. -### Find Dynamic Modules +## Find Dynamic Modules ```c struct rt_dlmodule *dlmodule_find(const char *name); @@ -214,7 +214,7 @@ struct rt_dlmodule *dlmodule_find(const char *name); This function uses `name` to find out if there is already a dynamic module loaded in the system. -### Return Dynamic Module +## Return Dynamic Module ```c struct rt_dlmodule *dlmodule_self(void); @@ -227,7 +227,7 @@ struct rt_dlmodule *dlmodule_self(void); This function returns a pointer of the dynamic module in the calling context. -### Find Symbol +## Find Symbol ```c rt_uint32_t dlmodule_symbol_find(const char *sym_str); @@ -242,11 +242,11 @@ rt_uint32_t dlmodule_symbol_find(const char *sym_str); This function returns the symbol address based on the symbol name. -## Libdl API of POSIX Standard ## +# Libdl API of POSIX Standard The POSIX standard libdl API is also supported in RT-Thread dlmodule. It is similar to loading a dynamic library into memory (and parsing some of the symbol information). This dynamic library provides the corresponding set of function operations. The libdl API needs to include the header files: `#include ` -### Open Dynamic Library +## Open Dynamic Library ```c void * dlopen (const char * pathname, int mode); @@ -262,7 +262,7 @@ void * dlopen (const char * pathname, int mode); This function is similar to the `dlmodule_load` , which loads the dynamic library from the file system and returns the handle pointer of the dynamic library. -### Find Symbol +## Find Symbol ```c void* dlsym(void *handle, const char *symbol); @@ -278,7 +278,7 @@ void* dlsym(void *handle, const char *symbol); This function looks in the dynamic library `handle` for the presence of the symbol of `symbol` , if there is an address that returns it. -### Close Dynamic Library +## Close Dynamic Library ``` int dlclose (void *handle); @@ -293,15 +293,15 @@ int dlclose (void *handle); This function closes the dynamic library pointed to by `handle` and unloads it from memory. It should be noted that when the dynamic library is closed, the symbolic address originally returned by `dlsym` will no longer be available. If you still try to access it, it may cause a fault error. -## FAQs +# FAQs -Please refer to [*User Manual of Env*](../env/env.md) for issues related to the Env tool. +Please refer to @ref env for issues related to the Env tool. -### Q: Dynamic modules cannot be run successfully according to the documentation. +## Q: Dynamic modules cannot be run successfully according to the documentation. **A:** Please update the RT-Thread source code to version 3.1.0 and above. -### Q: Compile the project with the scons command, prompting "undefined reference to __rtmsymtab_start". +## Q: Compile the project with the scons command, prompting "undefined reference to __rtmsymtab_start". **A:** Please refer to the qemu-vexpress-a9 BSP GCC link script file *link.lds* to add the following to the TEXT section of the project's GCC link script. diff --git a/documentation/doxygen/.gitignore b/documentation/doxygen/.gitignore deleted file mode 100644 index fe056cc69f4..00000000000 --- a/documentation/doxygen/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -html/ -latex/ \ No newline at end of file diff --git a/documentation/doxygen/readme.md b/documentation/doxygen/readme.md deleted file mode 100644 index 5228645937c..00000000000 --- a/documentation/doxygen/readme.md +++ /dev/null @@ -1,48 +0,0 @@ -# How to build doxygen html - -1. download from https://doxygen.nl/index.html -2. open `Doxywizard` -3. `File` -> `Open` -4. Open the file ./Doxyfile -5. To tab `Run` , Click `Run doxygen` - -# How to build & run doxygen html on Ubuntu - -The following steps are verified on Ubuntu 22.04: - -```shell -$ lsb_release -a -No LSB modules are available. -Distributor ID: Ubuntu -Description: Ubuntu 22.04.5 LTS -Release: 22.04 -Codename: jammy -``` - -The following packages (and dependents) need to be installed: - -```shell -$ sudo apt update -$ sudo apt install doxygen -$ sudo apt install graphviz -``` - -Assume that the path of RT-Thead code tree is $RTT, execute the following command to build html. - -```shell -$ cd $RTT/documentation/doxygen -$ rm -rf html -$ doxygen -``` - -A new html directory will be created and all the html files will be placed in this directory. - -If you want to quickly browse HTML locally (in Ubuntu environment), you can enter the html directory and start a local HTML server through Python. - -```shell -$ cd html -$ python3 -m http.server -Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... -``` - -Open the browser and enter `http://:8000/index.html` to access the created html web pages. If it is a local access, then `` should be replaced by `localhost`. If it is a remote access, then `` should be replaced by the actual accessible IP address of the machine where HTML is located. diff --git a/documentation/env/env.md b/documentation/env/env.md index 3f2daaf4b80..a8ca57f4200 100644 --- a/documentation/env/env.md +++ b/documentation/env/env.md @@ -1,4 +1,4 @@ -# User Manual of Env +@page env User Manual of Env Env is a handy utility tool developed by RT-Thread team to build environment, graphical system configuration, and packages management for software projects that intend to run on RT-Thread operating system. Env tool come with source code builder, compilation environment and package management system. @@ -6,7 +6,7 @@ It is a wrapper tool for build-in menuconfig, which is an open source GUI tool w Env for Windows repository: https://github.com/RT-Thread/env-windows -## Main Features +# Main Features - menuconfig provides graphical interface to interact with operational logic and configuration parameters - Each configuration option come with help session by default. @@ -16,24 +16,24 @@ Env for Windows repository: https://github.com/RT-Thread/env-windows - Modular software packages and decoupling design make it easier to maintain. - It also featured with point and click to download additional software packages and dependencies directly from Internet. -## Download +# Download - [Download the Env tool](https://github.com/RT-Thread/env-windows/releases), e.g. `env-windows-v1.3.5.7z`. - Extract the .7z file and the path shouldn't contain any non-ascii or space characters. -## User Guide of Env +# User Guide of Env -### Open the control Console +## Open the control Console The rt-thread software package environment is mainly based on the command line console so that the rt-thread development environment can be set up by minimizing the modification of configuration files. There are two ways to open the console: -#### 1. click the Env directory executable file +### 1. click the Env directory executable file To enter the Env directory, you can run `env.exe` in this directory. If it fails to open, you can try to use `env.bat`. -#### 2. open the Env console from the right-click menu in the folder +### 2. open the Env console from the right-click menu in the folder Add Env to the right-click menu: @@ -49,11 +49,11 @@ Follow the steps from the image to launch the Env console from the right-click m > Due to the need for the environment variables of the Env process to be set, the anti-virus software may misreport at the first startup. If the anti-virus software misreport is encountered, allow Env related programs to run, and then add related programs to the white list. -### Compile +## Compile Scons is a compile building tool used by RT-Thread to compile RT-Threads using the scons related commands. -#### Step One: Switch to the BSP root directory +### Step One: Switch to the BSP root directory If you use Method 1 to open Env console, you need to switch to the target BSP using the `cd` command. @@ -61,11 +61,11 @@ For example, the target BSP is `rt-thread\bsp\stm32\stm32f103-dofly-lyc8`: ![stm32f429-apollo project directory](figures/cd_cmd.png) -#### Step Two: Compile the BSP +### Step Two: Compile the BSP Env for Windows carries Python2.7 & Scons . To compile BSP, just use the default ARM_GCC toolchain by running `scons` or `scons -j12` (12 CPU cores compiling) command in the target BSP directory. -Env for Windows carries ARM GCC toolchain by default. When users compile ARM BSPs, users can directly type `scons` or `scons -j12` command to compile the BSP. However, if the BSP is other architecture, e.g. RISC-V, users need to use `scons --exec-path='C:\xxx\sdk-toolchain-RISC-V-GCC-WCH-1.0.0\bin' -j12` command to specify the toolchain when compiling. +Env for Windows carries ARM GCC toolchain by default. When users compile ARM BSPs, users can directly type `scons` or `scons -j12` command to compile the BSP. However, if the BSP is other architecture, e.g. RISC-V, users need to use `scons --exec-path='C:\\xxx\\sdk-toolchain-RISC-V-GCC-WCH-1.0.0\\bin' -j12` command to specify the toolchain when compiling. ![compilation project using scons command](figures/use_scons.png) @@ -82,30 +82,30 @@ scons --target=mdk4 scons --target=mdk5 ``` -For more scons tutorials, please refer to [*Scons*](../scons/scons.md). +For more scons tutorials, please refer to @ref scons. -### BSP configuration: menuconfig +## BSP configuration: menuconfig Menuconfig is a graphical configuration tool that RT-Thread uses to configure and tailor the entire system. -#### Instruction for Shortcuts +### Instruction for Shortcuts Go to the BSP root directory and open the interface by entering `menuconfig`. The menuconfig common shortcuts are as shown: ![Commonly-used Shortcuts for menuconfig](figures/hotkey.png) -#### Modify Settings +### Modify Settings There are many types of configuration items in menuconfig, and the modification methods are different. The common types are: - On/Off Type: Use the space bar to select or close - Value, string type: After pressing the Enter key, a dialog box will appear, and the configuration items will be modified in the dialog box. -#### Save Settings +### Save Settings After selecting the configuration item, press `ESC` to exit, and select `Save` to automatically generate the `rtconfig.h` file. At this point, using the `scons` command again will recompile the project according to the new rtconfig.h file. -### Package Management +## Package Management RT-Thread provides a package management platform where the officially available or developer-supplied packages are stored. The platform provides developers with a choice of reusable software packages that are an important part of RT-Thread. @@ -141,7 +141,7 @@ optional arguments: --printenv print environmental variables to check ``` -#### Download, update, and delete packages +### Download, update, and delete packages Before downloading and updating the software package, you need to **open** the target package in `menuconfig`. @@ -155,13 +155,13 @@ Find the package you need and open, then save and exit menuconfig. The package w - **update**: if the selected package has a latest update on the server and the version is selected **latest**, then enter `pkgs --update` , the package will be updated in local; - **delete**: if a software package is not needed, deselect it in menuconfig and then use `pkgs --update` command. Then locally downloaded but unselected packages will be deleted. -#### Update local package information and index +### Update local package information and index As the package system grows, more and more packages will be added, so the list of packages in menuconfig may be **unsynchronized** with the server. This can be fixed by using `pkgs --upgrade` or `pkgs --upgrade-force` command (recommended), which not only synchronizes updates to local software packages [information and index](https://github.com/RT-Thread/packages), which are recommended for regular use. If there is a upgrade failure or merge failure, please use `pkgs --upgrade-force` command to force upgrade the local software packages index (recommended to use). If wants to upgrade the [Env script](https://github.com/RT-Thread/env) as well, please use `pkgs --upgrade-script-force` command. This command not only can upgrade the software packages index, but also can upgrade the Env script. -### Env Tool Configuration +## Env Tool Configuration - The new version of the Env tool includes an automatic update package and an option to automatically generate mdk/iar projects. The default is not enabled. It can be configured using `menuconfig -s/--setting` . @@ -180,13 +180,13 @@ The three options are: - **Send usage data for improve product**: For user number statistic. -## Use Env in Your Project +# Use Env in Your Project -### How to Modify Options in Menuconfig +## How to Modify Options in Menuconfig If you want to add a macro definition in the configuration item of menuconfig, you can modify the `Kconfig` file under BSP. The modification method can search Kconfig syntax on the Internet for detailed documentation, or refer to the Kconfig file in RT-Thread or The Kconfig file in the BSP that supports menuconfig. -### To Add menuconfig function to New Project +## To Add menuconfig function to New Project New project here refers to a newly developed project that has not yet generated `.config` and `rtconfig.h`. Because these two files are only created when menuconfig is first saved. The specific process is as follows: @@ -194,7 +194,7 @@ New project here refers to a newly developed project that has not yet generated 2. Note that modifying the RTT_ROOT value in Kconfig is the directory where RT-Thread is located, otherwise RTT_ROOT may be not found. 3. Start the configuration with the menuconfig command. -### To Add menuconfig function to old Project +## To Add menuconfig function to old Project Old project here refers to the development that has been going on for a while, and there is a modified `rtconfig.h` file in the project, but there is no project configured with menuconfig. The specific process is as follows: @@ -205,41 +205,41 @@ Old project here refers to the development that has been going on for a while, a 5. Use the menuconfig command to configure the old project we want to modify. Menuconfig will read the `.config` file generated in the second step and generate a new `.config` file and rtconfig.h file based on the configuration parameters of the old project. 6. Check the old and new rtconfig.h files. If there are any inconsistencies, you can use the menuconfig command to adjust the configuration items. -## Notes for Using Env +# Notes for Using Env - For the first time, Env is recommended to go to the official website to download the latest version of the Env tool. The new version of Env will have better compatibility and also support automatic update commands. - You can use the Env built-in command `pkgs --upgrade` or `pkgs --upgrade-force` (recommended to use) to update the package list and Env's function code to minimize the problems you have fixed. - Do not have Chinese or spaces in the routes of Env. - Do not have Chinese or spaces in the routes where the BSP project is located. -## FAQs +# FAQs -### Q: It prompts that the git command cannot be found. +## Q: It prompts that the git command cannot be found. 'git' is not recognized as an internal or external command, possible program or batch file. **A:** Git is not installed. You need to install git and add environment variables. -### Q: It prompts that the CMD command cannot be found. +## Q: It prompts that the CMD command cannot be found. **A:** Right-click–>> Property—>> Advanced System Settings—>> Environment Variable, Add `C:\Windows\System32` to system environment variables. -### Q: Prompt "no module named site" when running python. +## Q: Prompt "no module named site" when running python. **A:** Computer right button –>> Properties—>> Advanced System Settings—>> Environment Variable, in the user variable of the administrator, create a new variable named PYTHONHOME, and the variable value is: `F:\git_repositories\env\tools\Python27` (the installation route of Python in Env), do not add ";" afterwards, otherwise it will be invalid. If add PYTHONHOME can not solve theproblem, try to add PYTHONPATH in the same way. -### Q: What types of projects can I generate under Env? +## Q: What types of projects can I generate under Env? **A:** 1. Currently, you can use the scons tool to generate mdk/iar projects under Env. There is no automatic generation of eclipse projects. 2. Generally, using gcc's toolchain, using an editor such as source insight or VS Code to edit the code and compile with `scons` command. -### Q:How can my own BSP support menuconfig? +## Q: How can my own BSP support menuconfig? **A:** You can refer to this chapter **Use Env in Your Project**. -### Q: What is the difference between the pkgs --upgrade/--upgrade-force command and the pkgs --update command? +## Q: What is the difference between the pkgs --upgrade/--upgrade-force command and the pkgs --update command? **A:** @@ -247,11 +247,11 @@ Old project here refers to the development that has been going on for a while, a 2. The `pkgs --update` command is used to update the package itself. For example, if you selected json and mqtt packages in menuconfig, you did not download them when you exit menuconfig. You need to use the `pkgs --update` command, at which point Env will download the package you selected and add it to your project. 3. The new version of Env supports the `menuconfig -s/--setting` command. If you don't want to use the `pkgs --update` command after replacing the package, configure Env after using the `menuconfig -s/--setting` command. Select each time you use menuconfig. After the package is automatically updated. -### Q: Prompt "can't find file Kconfig" while using menuconfig. +## Q: Prompt "can't find file Kconfig" while using menuconfig. **A:** The Kconfig file is missing from the current working BSP directory. Please refer *To Add menuconfig function to New Project* and *To Add menuconfig function to Old Project*. -### Q: There's unintelligible texts appear in Env. +## Q: There's unintelligible texts appear in Env. **A:** First check if there is a Chinese route. diff --git a/documentation/filesystem/README.md b/documentation/filesystem/README.md index 15a2601487c..6fef5c16704 100644 --- a/documentation/filesystem/README.md +++ b/documentation/filesystem/README.md @@ -1,17 +1,17 @@ -# Virtual File System +@page component_vfs Virtual File System In early days, the amount of data to be stored in embedded systems was relatively small and data types were relatively simple. The data were stored by directly writing to a specific address in storage devices. However, with today modern technology, embedded device's functions are getting complicated and required more data storage. Therefore, we need new data management methods to simplify and organize the data storage. A file system is made up of abstract data types and also a mechanism for providing data access, retrieve, implements, and store them in hierarchical structure. A folder contains multiple files and a file contains multiple organized data on the file system. This chapter explains about the RT-Thread file system, architecture, features and usage of virtual file system in RT-Thread OS. -## An Introduction to DFS +# An Introduction to DFS Device File System (DFS) is a virtual file system component and name structure is similar to UNIX files and folders. Following is the files and folders structure: The root directory is represented by "/". For example, if users want to access to f1.bin file under root directory, it can be accessed by "/f1.bin". If users want to access to f1.bin file under /2019 folder, it can be accessed by "/data/2019/f1.bin" according to their folder paths as in UNIX/Linux unlike Windows System. -### The Architecture of DFS +## The Architecture of DFS The main features of the RT-Thread DFS component are: @@ -23,7 +23,7 @@ The hierarchical structure of DFS is shown in the following figure, which is mai ![The hierarchical structure of DFS](figures/fs-layer.png) -### POSIX Interface Layer +## POSIX Interface Layer POSIX stands for Portable Operating System Interface of UNIX (POSIX). The POSIX standard defines the interface standard that the operating system should provide for applications. It is a general term for a series of API standards defined by IEEE for software to run on various UNIX operating systems. @@ -33,7 +33,7 @@ On UNIX-like systems, normal files, device files, and network file descriptors a Using the `poll/select` interface to block and simultaneously detect whether a group of I/O devices which support non-blocking have events (such as readable, writable, high-priority error output, errors, etc.) until a device trigger the event was or exceed the specified wait time. This mechanism can help callers find devices that are currently ready, reducing the complexity of programming. -### Virtual File System Layer +## Virtual File System Layer Users can register specific file systems to DFS, such as FatFS, RomFS, DevFS, etc. Here are some common file system types: @@ -44,13 +44,13 @@ Users can register specific file systems to DFS, such as FatFS, RomFS, DevFS, et * NFS (Network File System) is a technology for sharing files over a network between different machines and different operating systems. In the development and debugging phase of the operating system, this technology can be used to build an NFS-based root file system on the host and mount it on the embedded device, which can easily modify the contents of the root file system. * UFFS is short for Ultra-low-cost Flash File System. It is an open source file system developed by Chinese people and used for running Nand Flash in small memory environments such as embedded devices. Compared with the Yaffs file system which often used in embedded devices, it has the advantages of less resource consumption, faster startup speed and free. -### Device Abstraction Layer +## Device Abstraction Layer The device abstraction layer abstracts physical devices such as SD Card, SPI Flash, and Nand Flash into devices that are accessible to the file system. For example, the FAT file system requires that the storage device be a block device type. Different file system types are implemented independently of the storage device driver, so the file system function can be correctly used after the drive interface of the underlying storage device is docked with the file system. -## Mount Management +# Mount Management The initialization process of the file system is generally divided into the following steps: @@ -61,11 +61,11 @@ The initialization process of the file system is generally divided into the foll 5. Mount the block device to the DFS directory. 6. When the file system is no longer in use, you can unmount it. -### Initialize the DFS Component +## Initialize the DFS Component The initialization of the DFS component is done by the dfs_init() function. The dfs_init() function initializes the relevant resources required by DFS and creates key data structures that allow DFS to find a specific file system in the system and get a way to manipulate files within a particular storage device. This function will be called automatically if auto-initialization is turned on (enabled by default). -### Registered File System +## Registered File System After the DFS component is initialized, you also need to initialize the specific type of file system used, that is, register a specific type of file system into DFS. The interface to register the file system is as follows: @@ -86,13 +86,13 @@ The `elm_init()` function initializes the elm-FAT file system, which calls the ` ![Register file system](figures/fs-reg.png) -### Register a Storage Device as a Block Device +## Register a Storage Device as a Block Device Only block devices can be mounted to the file system, so you need to create the required block devices on the storage device. If the storage device is SPI Flash, you can use the "Serial Flash Universal Driver Library SFUD" component, which provides various SPI Flash drivers, and abstracts the SPI Flash into a block device for mounting. The process of registering block device is shown as follows: ![The timing diagram of registering block device](figures/fs-reg-block.png) -### Format the file system +## Format the file system After registering a block device, you also need to create a file system of the specified type on the block device, that is, format the file system. You can use the `dfs_mkfs()` function to format the specified storage device and create a file system. The interface to format the file system is as follows: @@ -132,7 +132,7 @@ msh /> msh />mkfs -t elm sd0 # Use the -t parameter to specify the file system type as elm-FAT file system ``` -### Mount file system +## Mount file system In RT-Thread, mounting refers to attaching a storage device to an existing path. To access a file on a storage device, we must mount the partition where the file is located to an existing path and then access the storage device through this path. The interface to mount the file system is as follows: @@ -157,7 +157,7 @@ int dfs_mount(const char *device_name, If there is only one storage device, it can be mounted directly to the root directory `/`. -### Unmount a file system +## Unmount a file system When a file system does not need to be used anymore, it can be unmounted. The interface to unmount the file system is as follows: @@ -172,13 +172,13 @@ int dfs_unmount(const char *specialfile); | 0 | unmount the file system successfully | | -1 | fail to unmount the file system | -## Document Management +# Document Management This section introduces the functions that are related to the operation of the file. The operation of the file is generally based on the file descriptor fd, as shown in the following figure: ![common function of file management](figures/fs-mg.png) -### Open and Close Files +## Open and Close Files To open or create a file, you can call the following open() function: @@ -218,7 +218,7 @@ int close(int fd); | 0 | file closed successfully | | -1 | fail to close the file | -### Read and Write Data +## Read and Write Data To read the contents of a file, use the `read()` function: @@ -255,7 +255,7 @@ int write(int fd, const void *buf, size_t len); This function writes `len` bytes in the memory pointed out by the `buf pointer` into the file pointed out by the parameter `fd`. In addition, the read and write location pointer of the file moves with the bytes written. -### Rename +## Rename To rename a file, use the `rename()` function: @@ -273,7 +273,7 @@ int rename(const char *old, const char *new); This function changes the file name specified by the parameter `old` to the file name pointed to by the parameter `new`. If the file specified by `new` already exists, the file will be overwritten. -### Get Status +## Get Status To get the file status, use the following `stat()` function: @@ -289,7 +289,7 @@ int stat(const char *file, struct stat *buf); | 0 | access status successfully | | -1 | fail to access to status | -### Delete Files +## Delete Files Delete a file in the specified directory using the `unlink()` function: @@ -304,7 +304,7 @@ int unlink(const char *pathname); | 0 | deleted the file successfully | | -1 | fail to deleted the file | -### Synchronize File Data to Storage Devices +## Synchronize File Data to Storage Devices Synchronize all modified file data in memory to the storage device using the `fsync()` function: @@ -319,7 +319,7 @@ int fsync(int fildes); | 0 | synchronize files successfully | | -1 | fail to synchronize files | -### Query file system related information +## Query file system related information Use the `statfs()` function to query file system related information. @@ -335,7 +335,7 @@ int statfs(const char *path, struct statfs *buf); | 0 | query file system information successfully | | -1 | fail to query file system information | -### Monitor I/O device status +## Monitor I/O device status To monitor the I/O device for events, use the `select()` function: @@ -361,13 +361,13 @@ int select( int nfds, Use the `select()` interface to block and simultaneously detect whether a group of non-blocking I/O devices have events (such as readable, writable, high-priority error output, errors, etc.) until a device triggered an event or exceeded a specified wait time. -## Directory management +# Directory management This section describes functions that directory management often uses, and operations on directories are generally based on directory addresses, as shown in the following image: ![functions that directory management often uses](figures/fs-dir-mg.png) -### Create and Delete Directories +## Create and Delete Directories To create a directory, you can use the mkdir() function: @@ -398,7 +398,7 @@ int rmdir(const char *pathname); | 0 | delete the directory successfully | | -1 | fail to delete the directory | -### Open and Close the Directory +## Open and Close the Directory Open the directory to use the `opendir()` function: @@ -428,7 +428,7 @@ int closedir(DIR* d); This function is used to close a directory and must be used with the `opendir()` function. -### Read Directory +## Read Directory To read the directory, use the `readdir()` function: @@ -445,7 +445,7 @@ struct dirent* readdir(DIR *d); This function is used to read the directory, and the parameter d is the directory stream pointer. In addition, each time a directory is read, the pointer position of the directory stream is automatically recursed by 1 position backward. -### Get the Read Position of the Directory Stream +## Get the Read Position of the Directory Stream To get the read location of the directory stream, use the `telldir()` function: @@ -461,7 +461,7 @@ long telldir(DIR *d); The return value of this function records the current position of a directory stream. This return value represents the offset from the beginning of the directory file. You can use this value in the following `seekdir()` to reset the directory to the current position. In other words, the `telldir()` function can be used with the `seekdir()` function to reset the read position of the directory stream to the specified offset. -### Set the Location to Read the Directory Next Time +## Set the Location to Read the Directory Next Time Set the location to read the directory next time using the `seekdir()` function: @@ -476,7 +476,7 @@ void seekdir(DIR *d, off_t offset); This is used to set the read position of the parameter d directory stream, and starts reading from this new position when readdir() is called. -### Reset the Position of Reading Directory to the Beginning +## Reset the Position of Reading Directory to the Beginning To reset the directory stream's read position to the beginning, use the `rewinddir()` function: @@ -490,7 +490,7 @@ void rewinddir(DIR *d); This function can be used to set the current read position of the `d` directory stream to the initial position of the directory stream. -## DFS Configuration Options +# DFS Configuration Options The specific configuration path of the file system in menuconfig is as follows: @@ -531,7 +531,7 @@ const struct dfs_mount_tbl mount_table[] = }; ``` -### elm-FatFs File System Configuration Option +## elm-FatFs File System Configuration Option Elm-FatFs can be further configured after opening the elm-FatFs file system in menuconfig. The configuration menu description and corresponding macro definitions are as follows: @@ -546,7 +546,7 @@ Elm-FatFs can be further configured after opening the elm-FatFs file system in m |[ ] Enable sector erase feature |RT_DFS_ELM_USE_ERASE | | |[*] Enable the reentrancy (thread safe) of the FatFs module |RT_DFS_ELM_REENTRANT |open reentrant| -#### Long File Name +### Long File Name By default, FatFs file naming has the following disadvantages: @@ -562,7 +562,7 @@ If you need to support long filenames, you need to turn on the option to support |( ) 2: LFN with dynamic LFN working buffer on the stack |RT_DFS_ELM_USE_LFN_2 |long file names are supported by temporary buffers in the stack. Larger demand for stack space. | |(X) 3: LFN with dynamic LFN working buffer on the heap |RT_DFS_ELM_USE_LFN_3 |use the heap (malloc request) buffer to store long filenames, it is the safest (default) | -#### Encoding Mode +### Encoding Mode When long file name support is turned on, you can set the encoding mode for the file name. RT-Thread/FatFs uses 437 encoding (American English) by default. If you need to store the Chinese file name, you can use 936 encoding (GBK encoding). The 936 encoding requires a font library of approximately 180KB. If you only use English characters as a file, we recommend using 437 encoding (American English), this will save this 180KB of Flash space. @@ -597,17 +597,17 @@ The file encodings supported by FatFs are as follows: */ ``` -#### File System Sector Size +### File System Sector Size Specify the internal sector size of FatFs, which needs to be greater than or equal to the sector size of the actual hardware driver. For example, if a spi flash chip sector is 4096 bytes, the above macro needs to be changed to 4096. Otherwise, when the FatFs reads data from the driver, the array will be out of bounds and the system will crash (the new version gives a warning message when the system is executed) . Usually Flash device can be set to 4096, and the common TF card and SD card have a sector size of 512. -#### Reentrant +### Reentrant FatFs fully considers the situation of multi-threaded safe read and write security. When reading and writing FafFs in multi-threading, in order to avoid the problems caused by re-entry, you need to open the macro above. If the system has only one thread to operate the file system and there is no reentrancy problem, you can turn it off to save resources. -#### More Configuration +### More Configuration FatFs itself supports a lot of configuration options and the configuration is very flexible. The following file is a FatFs configuration file that can be modified to customize FatFs. @@ -615,9 +615,9 @@ FatFs itself supports a lot of configuration options and the configuration is ve components/dfs/filesystems/elmfat/ffconf.h ``` -## DFS Application Example +# DFS Application Example -### FinSH Command +## FinSH Command After the file system is successfully mounted, the files and directories can be operated. The commonly used FinSH commands for file system operations are shown in the following table: @@ -687,7 +687,7 @@ Directory /: msh /> ``` -### Read and Write File Examples +## Read and Write File Examples Once the file system is working, you can run the application example. In the sample code, you first create a file `text.txt` using the `open()` function and write the string `"RT -Thread Programmer!\n"` in the file using the `write()` function, and then close the file. Use the ` open()` function again to open the `text.txt` file, read the contents and print it out, and close the file finally. @@ -729,7 +729,7 @@ MSH_CMD_EXPORT(readwrite_sample, readwrite sample); ``` -### An Example of Changing the File Name +## An Example of Changing the File Name The sample code in this section shows how to modify the file name. The program creates a function `rename_sample()` that manipulates the file and exports it to the msh command list. This function calls the `rename()` function to rename the file named `text.txt` to `text1.txt`. The sample code is as follows: @@ -766,7 +766,7 @@ text1.txt 5 In the example demonstration, we first create a file named `text.txt` using the echo command, and then run the sample code to change the file name of the file `text.txt` to `text1.txt`. -### Get File Status Example +## Get File Status Example The sample code shows how to get the file status. The program creates a function `stat_sample()` that manipulates the file and exports it to the msh command list. This function calls the `stat()` function to get the file size information of the text.txt file. The sample code is as follows: @@ -798,7 +798,7 @@ text.txt file size = 5 During the example run, the file `text.txt` is first created with the `echo` command, then the sample code is run, and the file size information for the file `text.txt` is printed. -### Create a Directory Example +## Create a Directory Example The sample code in this section shows how to create a directory. The program creates a function file `mkdir_sample()` that manipulates the file and exports it to the msh command list, which calls the `mkdir()` function to create a folder called `dir_test`. The sample code is as follows: @@ -839,7 +839,7 @@ dir_test
# it indicates that the type of the dire This example demonstrates creating a folder named `dir_test` in the root directory. -### Read directory Example +## Read directory Example The sample code shows how to read the directory. The program creates a function `readdir_sample()` that manipulates the file and exports it to the msh command list. This function calls the `readdir()` function to get the contents of the `dir_test` folder and print it out. The sample code is as follows: @@ -889,7 +889,7 @@ found hello.txt In this example, first create a hello.txt file under the dir_test folder and exit the dir_test folder. At this point, run the sample program to print out the contents of the dir_test folder. -### An Example of Setting the location of the read directory +## An Example of Setting the location of the read directory The sample code in this section shows how to set the location to read the directory next time. The program creates a function `telldir_sample()` that manipulates the file and exports it to the msh command list. This function first opens the root directory, then reads all the directory information in the root directory and prints the directory information. Meanwhile, use the `telldir()` function to record the location information of the third directory entry. Before reading the directory information in the root directory for the second time, use the `seekdir()` function to set the read location to the address of the third directory entry previously recorded. At this point, read the information in the root directory again, and the directory information is printed out. The sample code is as follows: @@ -971,28 +971,28 @@ hello_5 After running the sample, you can see that the first time you read the root directory information, it starts from the first folder and prints out all the directory information in the root directory. When the directory information is printed for the second time, since the starting position of the reading is set to the position of the third folder by using the `seekdir()` function, the second time when reading the root directory is from the third folder. Start reading until the last folder, only the directory information from `hello_3` to `hello_5` is printed. -## FAQ +# FAQ -### Q: What should I do if I find that the file name or folder name is not displayed properly? +## Q: What should I do if I find that the file name or folder name is not displayed properly? **A:** Check if long file name support is enabled, DFS feature configuration section. -### Q: What should I do if the file system fails to initialize? +## Q: What should I do if the file system fails to initialize? **A:** Check if the type and number of file systems allowed to be mounted in the file system configuration project are sufficient. -### Q: What should I do if the file system *mkfs* command fails? +## Q: What should I do if the file system *mkfs* command fails? **A:** Check if the storage device exists. If it exists, check to see if the device driver can pass the function test, if it fails, check the driver error. Check if the libc function is enabled. -### Q: What should I do if the file system fails to mount? +## Q: What should I do if the file system fails to mount? **A:** - Check if the specified mount path exists. The file system can be mounted directly to the root directory ("/"), but if you want to mount it on another path, such as ("/sdcard"). You need to make sure that the ("/sdcard") path exists. Otherwise, you need to create the `sdcard` folder in the root directory before the mount is successful. - Check if the file system is created on the storage device. If there is no file system on the storage device, you need to create a file system on the storage using the `mkfs` command. -### Q: What should I do if SFUD cannot detect the Flash specific model? +## Q: What should I do if SFUD cannot detect the Flash specific model? **A:** @@ -1002,22 +1002,22 @@ After running the sample, you can see that the first time you read the root dire - Check the `Using auto probe flash JEDEC SFDP parameter` and the `Using defined supported flash chip information table' under the 'RT-Thread Components → Device Drivers -> Using SPI Bus/Device device drivers -> Using Serial Flash Universal Driver` menu, to see whether the configuration item is selected, if it is not selected then you need to enable these two options. - If the storage device is still not recognized with the above option turned on, then issues can be raised in the [SFUD](https://github.com/armink/SFUD) project. - ### Q: Why does the benchmark test of the storage device take too long? +## Q: Why does the benchmark test of the storage device take too long? **A:** - Compare the [benchmark test data](https://github.com/armink/SFUD/blob/master/docs/zh/benchmark.txt) when the `system tick` is 1000 and the length of time required for this test. If the time lag is too large, you can think that the test work is not working properly. - Check the settings of the system tick, because some delay operations will be determined according to the tick time, so you need to set the appropriate `system tick` value according to the system conditions. If the system's `system tick` value is no less than 1000, you will need to use a logic analyzer to check the waveform to determine that the communication rate is normal. -### Q: SPI Flash implements elmfat file system, and how to keep some sectors not used by file system? +## Q: SPI Flash implements elmfat file system, and how to keep some sectors not used by file system? **A:** You can create multiple block devices for the entire storage device using the [partition](https://github.com/RT-Thread-packages/partition) tool package provided by RT-Thread. And block devices can be assigned different functions. -### Q: What should I do if the program gets stuck during the test file system? +## Q: What should I do if the program gets stuck during the test file system? **A:** Try using the debugger or print some necessary debugging information to determine where the program is stuck and ask questions. -### Q: How can I check the problem of the file system step by step? +## Q: How can I check the problem of the file system step by step? **A:** You can step through the problem from the bottom to the top. diff --git a/documentation/finsh/finsh.md b/documentation/finsh/finsh.md index 1d882d60327..d5aed8cb606 100644 --- a/documentation/finsh/finsh.md +++ b/documentation/finsh/finsh.md @@ -1,4 +1,4 @@ -# FinSH Console +@page component_finsh FinSH Console In the early days of computer development, before the advent of graphics systems, there was no mouse or even a keyboard. How did people interact with computers at the time? The earliest computers used a punched note to enter commands into the computer and write the program. Later, with the continuous development of computers, monitors and keyboards became the standard configuration of computers, but the operating system at this time did not support the graphical interface. Computer pioneers developed a software that accepts commands entered by the user, and after interpretation, passes it to The operating system and return the results of the operating system execution to the user. This program wraps around the operating system like a layer of shell, so it's called a shell. @@ -6,7 +6,7 @@ Embedded devices usually need to connect the development board to the PC for com FinSH is the command line component (shell) of RT-Thread. It is based on the above considerations. FinSH is pronounced [ˈfɪnʃ]. After reading this chapter, we will have a deeper understanding of how FinSH works and how to export your own commands to FinSH. -## Introduction of FinSH +# Introduction of FinSH FinSH is the command line component of RT-Thread. It provides a set of operation interfaces for users to call from the command line. It is mainly used to debug or view system information. It can communicate with a PC using serial/Ethernet/USB, etc. The hardware topology is shown below: @@ -31,7 +31,7 @@ FinSH supports auto-completion, and viewing history commands, etc. These functio FinSH supports two input modes, the traditional command line mode and the C language interpreter mode. -### Traditional Command Line Mode +## Traditional Command Line Mode This mode is also known as msh(module shell). In msh mode, FinSH is implemented in the same way as the traditional shell (dos/bash). For example, you can switch directories to the root directory with the `cd /` command. @@ -43,7 +43,7 @@ command [arg1] [arg2] [...] The command can be either a built-in command in RT-Thread or an executable file. -### C Language Interpreter Mode +## C Language Interpreter Mode This mode is also known as C-Style mode. In C language interpreter mode, FinSH can solve and parse most C language expressions, and use functions like C to access functions and global variables in the system. In addition, it can create variables through the command line. In this mode, the command entered must be similar to the function call in C language, that is, you must carry the `()` symbol. For example, to output all current threads and their status in the system, type `list_thread()` in FinSH to print out the required information. The output of the FinSH command is the return value of this function. For some functions that do not have a return value (void return value), this printout has no meaning. @@ -51,7 +51,7 @@ Initially FinSH only supported C-Style mode. Later, with the development of RT-T If both modes are enabled in the RT-Thread, they can be dynamically switched. Enter the `exit` in msh mode and press `Enter` to switch to C-Style mode. Enter `msh()` in C-Style mode and press `Enter` to enter msh mode. The commands of the two modes are not common, and the msh command cannot be used in C-Style mode, and vice versa. -## FinSH Built-in Commands +# FinSH Built-in Commands Some FinSH commands are built in by default in RT-Thread. You can print all commands supported by the current system by entering help in FinSH and pressing Enter or directly pressing Tab. The built-in commands in C-Style and msh mode are basically the same, so msh is taken as an example here. @@ -79,7 +79,7 @@ free - Show the memory usage in the system. Here lists the field information returned after entering the common commands, so that the developer can understand the content of the returned information. -### Display Thread Status +## Display Thread Status Use the `ps` or `list_thread` command to list all thread information in the system, including thread priority, state, maximum stack usage, and more. @@ -104,7 +104,7 @@ list_thread Return field description: | left tick | The number of remaining ticks of the thread | | error | Thread error code | -### Display Semaphore Status +## Display Semaphore Status Use the `list_sem` command to display all semaphore information in the system, including the name of the semaphore, the value of the semaphore, and the number of threads waiting for this semaphore. @@ -124,7 +124,7 @@ list_sem Return field description: | v | The current value of semaphore | | suspend thread | The number of threads waiting for this semaphore | -### Display Event Status +## Display Event Status Use the `list_event` command to display all event information in the system, including the event name, the value of the event, and the number of threads waiting for this event. @@ -142,7 +142,7 @@ list_event Return field description: | set | The current event in the event set | | suspend thread | The number of threads waiting for an event in this event set | -### Display Mutex Status +## Display Mutex Status Use the `list_mutex` command to display all mutex information in the system, including the mutex name, the owner of the mutex, and the number of nestings the owner holds on the mutex. @@ -163,7 +163,7 @@ list_mutex Return field description: | hold | The number of times the holder is nested on this mutex | | suspend thread | The number of threads waiting for this mutex | -### Display Mailbox Status +## Display Mailbox Status Use the `list_mailbox` command to display all mailbox information in the system, including the mailbox name, the number of messages in the mailbox, and the maximum number of messages the mailbox can hold. @@ -184,7 +184,7 @@ list_mailbox Return field description: | size | The maximum number of messages a mailbox can hold | | suspend thread | The number of threads waiting for this mailbox | -### Display Message Queue Status +## Display Message Queue Status Use the `list_msgqueue` command to display all message queue information in the system, including the name of the message queue, the number of messages it contains, and the number of threads waiting for this message queue. @@ -202,7 +202,7 @@ list_msgqueue Return field description: | entry | The number of messages currently included in the message queue | | suspend thread | Number of threads waiting for this message queue | -### Display Memory Pool Status +## Display Memory Pool Status Use the `list_mempool` command to display all the memory pool information in the system, including the name of the memory pool, the size of the memory pool, and the maximum memory size used. @@ -223,7 +223,7 @@ list_mempool Return field description: | free | Free memory block | | suspend thread | The number of threads waiting for this memory pool | -### Display Timer Status +## Display Timer Status Use the `list_timer` command to display all the timer information in the system, including the name of the timer, whether it is the periodic timer, and the number of beats of the timer timeout. @@ -245,7 +245,7 @@ list_timer Return field description: | timeout | The number of beats when the timer expires | | flag | The state of the timer, activated indicates active, and deactivated indicates inactive | -### Display Device Status +## Display Device Status Use the `list_device` command to display all device information in the system, including the device name, device type, and the number of times the device was opened. @@ -265,7 +265,7 @@ list_device Return field description: | type | Device type | | ref count | The number of times the device was opened | -### Display Dynamic Memory Status +## Display Dynamic Memory Status Use the `free` command to display all memory information in the system. @@ -284,11 +284,11 @@ free Return field description: | used memory | Used memory size | | maximum allocated memory | Maximum allocated memory | -## Custom FinSH Command +# Custom FinSH Command In addition to the commands that come with FinSH, FinSH also provides multiple macro interfaces to export custom commands. The exported commands can be executed directly in FinSH. -### Custom msh Command +## Custom msh Command The custom msh command can be run in msh mode. To export a command to msh mode, you can use the following macro interface: @@ -323,7 +323,7 @@ static void atcmd(int argc, char**argv) MSH_CMD_EXPORT(atcmd, atcmd sample: atcmd ); ``` -### Custom C-Style Commands and Variables +## Custom C-Style Commands and Variables Export custom commands to C-Style mode can use the following interface: @@ -365,7 +365,7 @@ The following example defines a `dummy` variable and exports it to a variable co static int dummy = 0; FINSH_VAR_EXPORT(dummy, finsh_type_int, dummy variable for finsh) ``` -### Custom Command Rename +## Custom Command Rename The function name length of FinSH is limited. It is controlled by the macro definition `FINSH_NAME_MAX` in `finsh.h`. The default is 16 bytes, which means that the FinSH command will not exceed 16 bytes in length. There is a potential problem here: when a function name is longer than FINSH_NAME_MAX, after using FINSH_FUNCTION_EXPORT to export the function to the command table, the full function name is seen in the FinSH symbol table, but a full node execution will result in a *null node* error. This is because although the full function name is displayed, in fact FinSH saves the first 16 bytes as a command. Too many inputs will result in the command not being found correctly. In this case, you can use `FINSH_FUNCTION_EXPORT_ALIAS` to re-export the command name. @@ -389,23 +389,23 @@ void hello(void) FINSH_FUNCTION_EXPORT_ALIAS(hello , ho, say hello to RT-Thread); ``` -## FinSH Function Configuration +# FinSH Function Configuration The FinSH function can be cropped, and the macro configuration options are defined in the rtconfig.h file. The specific configuration items are shown in the following table. -| **Macro Definition** | **Value Type** | Description | Default | -|------------------------|----|------------|-------| -| #define RT_USING_FINSH | None | Enable FinSH | on | -| #define FINSH_THREAD_NAME | String | FinSH thread name | "tshell" | -| #define FINSH_USING_HISTORY | None | Turn on historical traceback | on | -| #define FINSH_HISTORY_LINES | Integer type | Number of historical command lines that can be traced back | 5| -| #define FINSH_USING_SYMTAB | None | Symbol table can be used in FinSH | on | -|#define FINSH_USING_DESCRIPTION | None | Add a description to each FinSH symbol | on | -| #define FINSH_USING_MSH| None | Enable msh mode | on | -| #define FINSH_USING_MSH_ONLY | None | Use only msh mode | on | -| #define FINSH_ARG_MAX | Integer type | Maximum number of input parameters | 10 | -| #define FINSH_USING_AUTH | None | Enable permission verification | off | -| #define FINSH_DEFAULT_PASSWORD | String | Authority verification password | off | +| **Macro Definition** | **Value Type** | Description | Default | +|-----------------------------------|----------------|------------------------------------------------------------|---------| +| `#define RT_USING_FINSH` | None | Enable FinSH | on | +| `#define FINSH_THREAD_NAME` | String | FinSH thread name | "tshell"| +| `#define FINSH_USING_HISTORY` | None | Turn on historical traceback | on | +| `#define FINSH_HISTORY_LINES` | Integer type | Number of historical command lines that can be traced back | 5 | +| `#define FINSH_USING_SYMTAB` | None | Symbol table can be used in FinSH | on | +| `#define FINSH_USING_DESCRIPTION` | None | Add a description to each FinSH symbol | on | +| `#define FINSH_USING_MSH` | None | Enable msh mode | on | +| `#define FINSH_USING_MSH_ONLY` | None | Use only msh mode | on | +| `#define FINSH_ARG_MAX` | Integer type | Maximum number of input parameters | 10 | +| `#define FINSH_USING_AUTH` | None | Enable permission verification | off | +| `#define FINSH_DEFAULT_PASSWORD` | String | Authority verification password | off | The reference configuration example in rtconfig.h is as follows, and can be configured according to actual functional requirements. @@ -441,9 +441,9 @@ The reference configuration example in rtconfig.h is as follows, and can be conf #define FINSH_ARG_MAX 10 ``` -## FinSH Application Examples +# FinSH Application Examples -### Examples of msh Command without Arguments +## Examples of msh Command without Arguments This section demonstrates how to export a custom command to msh. The sample code is as follows, the hello function is created in the code, and the `hello` function can be exported to the FinSH command list via the `MSH_CMD_EXPORT` command. @@ -477,7 +477,7 @@ hello RT_Thread! msh /> ``` -### Example of msh Command with Parameters +## Example of msh Command with Parameters This section demonstrates how to export a custom command with parameters to FinSH. The sample code is as follows, the `atcmd()` function is created in the code, and the `atcmd()` function can be exported to the msh command list via the MSH_CMD_EXPORT command. @@ -545,7 +545,7 @@ AT client! msh /> ``` -## FinSH Porting +# FinSH Porting FinSH is written entirely in ANSI C and has excellent portability; it has a small memory footprint, and FinSH will not dynamically request memory if you do not use the functions described in the previous section to dynamically add symbols to FinSH. The FinSH source is located in the `components/finsh` directory. Porting FinSH requires attention to the following aspects: diff --git a/documentation/interrupt/interrupt.md b/documentation/interrupt/interrupt.md index 7fe328188f9..2e7f677dc00 100644 --- a/documentation/interrupt/interrupt.md +++ b/documentation/interrupt/interrupt.md @@ -1,5 +1,4 @@ -Interrupt Management -============== +@page interrupt_management Interrupt Management Interrupts often occur in embedded operating systems. When the CPU is processing a normal task, an external urgent event has occurred, requiring the CPU to suspend the current task to handle the asynchronous event. After the external event has been handled, CPU then returns to the interrupted address to continue working on the previous task. The system that implements this function is called the interrupt system, and the source of the request requesting for the CPU interrupt is called the interrupt source. An interrupt is an exception. An exception is any event that causes the processor to move away from normal operation and execute special code. If it is not processed in time, the system will either encounter an error or face a complete breakdown. So appropriately handling exceptions to avoid errors is a very important part of improving software robustness (stability). The following picture is a simple interrupt diagram. @@ -7,12 +6,11 @@ Interrupts often occur in embedded operating systems. When the CPU is processing Interrupt processing is closely related to the CPU architecture. Therefore, this chapter first introduces the ARM Cortex-M CPU architecture, and then introduces the RT-Thread interrupt management mechanism in conjunction with the Cortex-M CPU architecture. After reading this chapter, you will learn more about the interrupt handling process of RT-Thread, how to add an interrupt service routine (ISR) and other matters related. -Cortex-M CPU Architecture Foundation --------------------- +# Cortex-M CPU Architecture Foundation Unlike older classic ARM processors (like ARM7, ARM9), the ARM Cortex-M processor has a very different architecture. Cortex-M is serious which Cortex M0/M3/M4/M7 models. There will be some differences between each model. For example, the Cortex-M4 has more floating point calculation functions than the Cortex-M3, but their programming models are basically the same, so the parts of the book that describe interrupt management and porting are not going to be too finely differentiated for the Cortex M0/M3/M4/M7. This section focuses on the architectural aspects related to RT-Thread interrupt management. -### Introduction to Register +## Introduction to Register The register set of Cortex-M series CPU has 16 general register sets and several special function registers from R0~R15, as shown in the figure below. @@ -31,7 +29,7 @@ The program status word registers stores arithmetic and logic flags, such as neg In the case of a Cortex-M4 or Cortex-M7 with a floating point unit, the control register is also used to indicate whether the floating point unit is currently in use. The floating point unit contains 32 floating point general-purpose registers S0~S31 and a special FPSCR register (Floating point status and control register). -### Operating  Scheme and Privilege Level +## Operating  Scheme and Privilege Level Cortex-M introduces the concept of operation scheme and privilege level, which are thread mode and processing mode respectively. If it enters exception or interrupt processing, it enters processing mode, otherwise it is thread mode. @@ -41,7 +39,7 @@ Cortex-M has two running levels, privilege-level and user-level. Thread mode can Cortex-M's stack register SP corresponds to two physical registers MSP and PSP, MSP is the main stack, PSP is the process stack. Processing mode always uses MSP as the stack; thread mode can choose to use MSP or PSP as the stack, also controlled through special register CONTROL. After reset, Cortex-M enters thread mode, privilege-level, and uses the MSP stack by default. -### Nested Vector Interrupt Controller +## Nested Vector Interrupt Controller The Cortex-M interrupt controller is called NVIC (nested vectored interrupt controller) and supports interrupt nesting. When an interrupt is triggered and the system responds, the processor hardware automatically pushes the context register of the current location of running into the interrupt stack. The registers in this section include the PSR, PC, LR, R12, and R3-R0 registers. @@ -49,14 +47,13 @@ The Cortex-M interrupt controller is called NVIC (nested vectored interrupt cont When the system is servicing an interrupt, if a higher priority interrupt is triggered, then the processor will also interrupt the currently running interrupt service routine, and then save the context of the interrupt service program register PSR, PC, LR, R12, R3-R0 to the interrupt stack. -### PendSV System Call +## PendSV System Call PendSV, also known as a suspendable system call, is an exception that can be suspended like a normal interrupt. It is specifically designed to assist the operating system in context switching. PendSV exceptions are initialized as lowest priority exceptions. Each time a context switch is required, the PendSV exception is triggered manually, and the context switch is performed in the PendSV exception handler. The detailed process of operating system context switching using the PendSV mechanism will be illustrated in the next chapter, *Kernel Porting*. -RT-Thread Interruption Mechanism ---------------------- +# RT-Thread Interruption Mechanism -### Interrupt Vector Table +## Interrupt Vector Table The interrupt vector table is the entry point for all interrupt handlers. The following figure shows the Cortex-M serious of interrupt handlers: linking a function (user interrupt service routine) to the interrupt vector in a virtual interrupt vector table. When the interrupt vector corresponds to an interrupt, the hooked user interrupt service routine is called. @@ -112,13 +109,13 @@ void SysTick_Handler(void) } ``` -### Interrupt Processing +## Interrupt Processing In RT-Thread interrupt management, interrupt handler is divided into three parts: interrupt preamble, user interrupt service routine, and interrupt follow-up procedure, as shown in the following figure: ![3 Parts of the Interrupt Handler](figures/09interrupt_work_process.png) -#### Interrupt Preamble +### Interrupt Preamble The main job of interrupt preamble is as follows: @@ -139,7 +136,7 @@ void rt_interrupt_enter(void) } ``` -#### User Interrupt Service Routine +### User Interrupt Service Routine In the user interrupt service routine (ISR), there are two cases. The first case is that no thread switching is performed. In this case, after user interrupt service routine and interrupt subsequent program finished running, it exits and return to the interrupted thread. . @@ -149,7 +146,7 @@ In Cortex-M architecture, the function implementation of rt_hw_context_switch_in ![Function rt_hw_context_switch_interrupt() Implementation Process](figures/09fun1.png) -#### Interrupt Follow-up Procedure +### Interrupt Follow-up Procedure The main work done by interrupt follow-up procedure is: @@ -170,13 +167,13 @@ void rt_interrupt_leave(void) ![Function rt_hw_context_switch_interrupt() Implementation Process](figures/09fun2.png) -### Interrupt Nesting +## Interrupt Nesting In the case of interrupt nesting, in the process of executing the interrupt service routine, if a high priority interrupt occurs, the execution of the current interrupt service routine will be interrupted to execute the interrupt service routine of the high priority interrupt. After the processing of the high priority interrupt is completed, the interrupted interrupt service routine is resumed. If thread scheduling is required, the thread context switch will occur when all interrupt handlers finish running, as shown in the following figure. ![Thread Switching during Interrupt](figures/09ths_switch.png) -### Interrupt Stack +## Interrupt Stack During the interrupt processing, before the system responds to the interrupt, the software code (or processor) needs to save the context of the current thread (usually stored in the thread stack of the current thread), and then call the interrupt service routine for interrupt response and processing. During interrupt processing (essentially calling the user's interrupt service routine function), the interrupt handler function is likely to have its own local variables, which require the corresponding stack space to save, so the interrupt response still needs a stack space as the context to run the interrupt handler. The interrupt stack can be saved in the stack of the interrupted thread. When exiting from the interrupt, the corresponding thread is resumed to be executed. @@ -186,7 +183,7 @@ RT-Thread adopts interrupt stack that provides independence. When an interrupt o There are two stack pointers in the Cortex-M processor core. One is the main stack pointer (MSP) which is the stack pointer by default. It is used before the first thread and in the interrupt and exception handlers. The other is the thread stack pointer (PSP), used in threads. When the interrupt and exception service routine exits, modify the value of the second bit of LR register as 1, and the SP of the thread is switched from MSP to PSP. -### Processing of the Bottom Half of the Interruption +## Processing of the Bottom Half of the Interruption RT-Thread does not make any assumptions or restrictions on the processing time required by the interrupt service routine, but like other real-time operating systems or non-real-time operating systems, users need to ensure that all interrupt service routines are completed in the shortest possible time (the interrupt service routine is equivalent to having the highest priority in the system and will preempt all threads to execute first). In the process of interrupt nesting or masking the corresponding interrupt source, the other nested interrupt processing and the next interrupt signal of its own interrupt source will not delayed. @@ -258,14 +255,13 @@ void demo_nw_isr(int vector, void *param) As can be seen from the two code snippets of the above example, the interrupt service routine completes the start and end of the interrupt Bottom Half by waiting and releasing a semaphore object. Since the interrupt processing is divided into two parts, Top and Bottom, the interrupt processing becomes an asynchronous process. This part of the system overhead requires the user to seriously consider whether the interrupt service processing time is greater than the time to send notifications to Bottom Half and process when using RT-Thread. -RT-Thread Interrupt Management Interface ---------------------- +# RT-Thread Interrupt Management Interface In order to isolate the operating system from the underlying exceptions and interrupt hardware, RT-Thread encapsulates interrupts and exceptions into a set of abstract interfaces, as shown in the following figure: ![Interrupt Related Interfaces](figures/09interrupt_ops.png) -### Mount Interrupt Service Routine +## Mount Interrupt Service Routine The system associates the user's interrupt handler with the specified interrupt number. You can call the following interface to mount a new interrupt service routine: @@ -293,7 +289,7 @@ Input parameters and return values of rt_hw_interrupt_install() The interrupt service routine is a kind of runtime environment that requires special attention. It runs in a non-threaded execution environment (generally a special operating mode of the chip (privileged mode)). In this runtime environment, the current thread cannot be suspended because the current thread does not exist. During the execution of related operations, information similar to print prompt information will appear, "Function [abc_func] shall not used in ISR", meaning a function that should not be called in the interrupt service routine. -### Interrupt Source Management +## Interrupt Source Management Usually before the ISR is ready to process an interrupt signal, we need to mask the interrupt source and open the previously blocked interrupt source in time after the ISR finishes processing the status or data. @@ -329,7 +325,7 @@ Input parameters of rt_hw_interrupt_umask() >This API does not appear in every migration branch. For example, there is usually no such API in the migration branch of Cortex-M0/M3/M4. -### Global Interrupt Switch +## Global Interrupt Switch The global interrupt switch, also known as the interrupt lock, is the easiest way to disable multi-threaded access to critical sections by shutting down the interrupts to ensure that the current thread is not interrupted by other events (because the entire system no longer responds to those external events that could trigger a thread rescheduling), that is, the current thread will not be preempted unless the thread voluntarily gives up control of the processor. When you need to shut off the interrupt of the entire system , you can call the following function interface: @@ -413,7 +409,7 @@ void global_interrupt_demo(void) This feature can bring great convenience to the development of the code. For example, if interrupt is turned off in a function, call some sub-functions and then turn on the interrupt. There may also be code for interrupt switch in these subfunctions. Since the API for global interrupts allows the use of nest, users do not need to do special processing for this code. -### Interrupt Notification +## Interrupt Notification When the entire system is interrupted by an interrupt and enters the interrupt handler function, it needs to inform the kernel that it has entered the interrupt state. In this case, the following interfaces can be used: @@ -446,8 +442,7 @@ The following table describes the return value of rt_interrupt_get_nest() | 1 | the current system is in an interrupt context | | Bigger Than 1 | current interrupt nesting level | -Interrupt and Polling ----------- +# Interrupt and Polling When the drive peripheral is working, whether the programming mode is triggered by interrupt mode or polling mode is often the first problem to be considered by the driver developer, and there is a difference between the real-time operating system and the time-sharing operating system when it comes to this problem. Because the polling mode itself adopts the sequential execution mode: corresponding processing is done after finding corresponding event. Therefore, the polling mode is relatively simple and clear in terms of implementation. For example, to write data to the serial port, the program code writes the next data only when the serial controller finishes writing a data (otherwise the data is discarded). The corresponding code can look like this: @@ -480,8 +475,7 @@ Through the above calculation process, we can see some of the key factors: the s 2) Change the interrupt mode to polling mode if necessary. At the same time, in order to solve the problem that the processor is always preempted with polling mode and other low-priority threads cannot be operated, the priority of the polling thread can be lowered accordingly. -Global Interrupt Switch Usage Example --------------------- +# Global Interrupt Switch Usage Example This is an interrupted application routine: when multiple threads access the same variable, use the switch global interrupt to protect the variable, as shown in the following code: diff --git a/documentation/kernel-porting/kernel-porting.md b/documentation/kernel-porting/kernel-porting.md index b8ae87e421d..cfa14efa502 100644 --- a/documentation/kernel-porting/kernel-porting.md +++ b/documentation/kernel-porting/kernel-porting.md @@ -1,12 +1,10 @@ -Kernel Porting -=============== +@page kernel_porting Kernel Porting After learning the previous chapters, everyone has a better understanding of RT-Thread, but many people are not familiar with how to port the RT-Thread kernel to different hardware platforms. Kernel porting refers to the RT-Thread kernel running on different chip architectures and different boards. It can have functions such as thread management and scheduling, memory management, inter-thread synchronization and communication, and timer management. Porting can be divided into two parts: CPU architecture porting and BSP (Board support package) porting . -This chapter will introduce CPU architecture porting and BSP porting. The CPU architecture porting part will be introduced in conjunction with the Cortex-M CPU architecture. Therefore, it is necessary to review "Cortex-M CPU Architecture Foundation" in the previous chapter ["Interrupt Management"](../interrupt/interrupt.md). After reading this chapter, how to complete the RT-Thread kernel porting will be learned. +This chapter will introduce CPU architecture porting and BSP porting. The CPU architecture porting part will be introduced in conjunction with the Cortex-M CPU architecture. Therefore, it is necessary to review "Cortex-M CPU Architecture Foundation" in the previous chapter @ref interrupt_management. After reading this chapter, how to complete the RT-Thread kernel porting will be learned. -CPU Architecture Porting ------------ +# CPU Architecture Porting There are many different CPU architectures in the embedded world, for example, Cortex-M, ARM920T, MIPS32, RISC-V, etc. In order to enable RT-Thread to run on different CPU architecture chips, RT-Thread provides a libcpu abstraction layer to adapt to different CPU architectures. The libcpu layer provides unified interfaces to the kernel, including global interrupt switches, thread stack initialization, context switching, and more. @@ -25,7 +23,7 @@ libcpu porting related API | rt_uint32_t rt_thread_switch_interrupt_flag; | A flag indicating that a switch is needed in the interrupt. | | rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; | Used to save *from* and *to* threads when the thread is context switching. | -### Implement Global Interrupt Enable/Disable +## Implement Global Interrupt Enable/Disable Regardless of kernel code or user code, there may be some variables that need to be used in multiple threads or interrupts. If there is no corresponding protection mechanism, it may lead to critical section problems. In order to solve this problem, RT-Thread provides a series of inter-thread synchronization and communication mechanism. But these mechanisms require the global interrupt enable/disable function provided in libcpu. They are, respectively: @@ -44,7 +42,7 @@ CPSID I ;PRIMASK=1, ; disable global interrupt CPSIE I ;PRIMASK=0, ; enable global interrupt ``` -#### Disable Global Interrupt +### Disable Global Interrupt The functions that need to be done in order in the rt_hw_interrupt_disable() function are: @@ -72,7 +70,7 @@ The above code first uses the MRS instruction to save the value of the PRIMASK r There are different conventions for different CPU architectures regarding how registers are managed during function calls and in interrupt handlers. A more detailed introduction to the use of registers for Cortex-M can be found in the official ARM manual, "*Procedure Call Standard for the ARM ® Architecture*." -#### Enable Global Interrupt +### Enable Global Interrupt In `rt_hw_interrupt_enable(rt_base_t level)`, the variable *level* is used as the state to be restored, overriding the global interrupt status of the chip. @@ -93,7 +91,7 @@ rt_hw_interrupt_enable PROC ; PROC pseudoinstruction definition function The above code first uses the MSR instruction to write the value register of r0 to the PRIMASK register, thus restoring the previous interrupt status. -### Implement Thread Stack Initialization +## Implement Thread Stack Initialization When dynamically creating threads and initializing threads, the internal thread initialization function *_rt_thread_init()* is used. The _rt_thread_init() function calls the stack initialization function *rt_hw_stack_init()*, which manually constructs a context in the stack initialization function. The context will be used as the initial value for each thread's first execution. The layout of the context on the stack is shown below: @@ -147,7 +145,7 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, } ``` -### Implement Context Switching +## Implement Context Switching In different CPU architectures, context switches between threads and context switches from interrupts to context, the register portion of the context may be different or the same. In Cortex-M, context switching is done uniformly using PendSV exceptions, and there is no difference in the switching parts. However, in order to adapt to different CPU architectures, RT-Thread's libcpu abstraction layer still needs to implement three thread switching related functions: @@ -167,7 +165,7 @@ Context switching between threads, as shown in the following figure: ![Context Switch between Threads](figures/10ths_env1.png) -The hardware automatically saves the PSR, PC, LR, R12, R3-R0 registers of the *from* thread before entering the PendSV interrupt, then saves the R11\~R4 registers of the *from* thread in PendSV, and restores the R4\~R11 registers of the *to* thread, and finally the hardware automatically restores the R0\~R3, R12, LR, PC, PSR registers of the *to* thread after exiting the PendSV interrupt. +The hardware automatically saves the PSR, PC, LR, R12, R3-R0 registers of the *from* thread before entering the PendSV interrupt, then saves the R11~R4 registers of the *from* thread in PendSV, and restores the R4~R11 registers of the *to* thread, and finally the hardware automatically restores the R0~R3, R12, LR, PC, PSR registers of the *to* thread after exiting the PendSV interrupt. The context switch from interrupt to thread can be represented by the following figure: @@ -177,7 +175,7 @@ The hardware automatically saves the PSR, PC, LR, R12, R3-R0 registers of the *f Obviously, in the Cortex-M kernel, the rt_hw_context_switch() and rt_hw_context_switch_interrupt() have same functions, which is finishing saving and replying the remaining contexts in PendSV. So we just need to implement a piece of code to simplify the porting. -#### Implement rt_hw_context_switch_to() +### Implement rt_hw_context_switch_to() rt_hw_context_switch_to() has only the target thread and no source thread. This function implements the function of switching to the specified thread. The following figure is a flowchart: @@ -236,7 +234,7 @@ rt_hw_context_switch_to PROC ENDP ``` -#### Implement rt_hw_context_switch()/ rt_hw_context_switch_interrupt() +### Implement rt_hw_context_switch()/ rt_hw_context_switch_interrupt() The function rt_hw_context_switch() and the function rt_hw_context_switch_interrupt() have two parameters, the *from* thread and the *to* thread. They implement the function to switch from the *from* thread to the *to* thread. The following figure is a specific flow chart: @@ -285,7 +283,7 @@ _reswitch BX LR ``` -#### Implement PendSV Interrupt +### Implement PendSV Interrupt In Cortex-M3, the PendSV interrupt handler is PendSV_Handler(). The actual thread switching is done in PendSV_Handler(). The following figure is a specific flow chart: @@ -345,7 +343,7 @@ pendsv_exit ENDP ``` -### Impalement OS Tick +## Impalement OS Tick With the basics of switching global interrupts and context switching, RTOS can perform functions such as creating, running, and scheduling threads. With OS Tick, RT-Thread can schedule time-to-roll rotations for threads of the same priority, implementing timer functions, implementing rt_thread_delay() delay functions, and so on. @@ -366,8 +364,7 @@ void SysTick_Handler(void) } ``` -BSP Porting -------- +# BSP Porting In a practical project, for the same CPU architecture, different boards may use the same CPU architecture, carry different peripheral resources, and complete different products, so we also need to adapt to the board. RT-Thread provides a BSP abstraction layer to fit boards commonly seen. If you want to use the RT-Thread kernel on a board, in addition to the need to have the corresponding chip architecture porting, you need to port the corresponding board, that is, implement a basic BSP. The job is to establish a basic environment for the operating system to run. The main tasks that need to be completed are: diff --git a/documentation/memory/memory.md b/documentation/memory/memory.md index 2ac9fe30efb..3a7fa20915d 100644 --- a/documentation/memory/memory.md +++ b/documentation/memory/memory.md @@ -1,5 +1,4 @@ -Memory Management -============== +@page memory_management Memory Management In a computing system, there are usually two types of memory space: internal memory space and external memory space. Internal memory can be quickly accessed, its contents can be read to and changed and only an address is required. The contents of internal memory are deleted after each power off. It is what would usually be called RAM (Random Access Memory) and is analogous to the RAM in a desktop computer. On the other hand, external memory has relatively fixed contents, retains data even after power off. It is usually called ROM (Read-Only Memory) and is analogous to the hard disk in a desktop computer. @@ -7,8 +6,7 @@ In a computer system, variables and intermediate data are generally stored in RA This chapter introduces two kinds of memory management methods in RT-Thread, namely dynamic memory heap management and static memory pool management. After studying this chapter, readers will understand the memory management principle and usage of RT-Thread. -Memory Management Functional Features ------------------- +# Memory Management Functional Features Because time requirements are very strict in real-time systems, memory management is often much more demanding than in general-purpose operating systems: @@ -26,8 +24,7 @@ The second is allocation management for large memory blocks (slab management alg The third is allocation management for multiple memory heaps (memheap management algorithm) -Memory Heap Management ----------- +# Memory Heap Management Memory heap management is used to manage a contiguous memory space. We introduced the memory distribution of RT-Thread in chapter "Kernel Basics". As shown in the following figure, RT-Thread uses the space at "the end of the ZI segment" to the end of the memory as the memory heap. @@ -41,7 +38,7 @@ Any or none of these memory heap management algorithms can be chosen when the sy >Because the memory heap manager needs to meet the security allocation in multi-threaded conditions, which means mutual exclusion between multiple threads needs to be taken into consideration, please do not allocate or release dynamic memory blocks in interrupt service routines, as that may result in the current context being suspended. -### Small Memory Management Algorithm +## Small Memory Management Algorithm The small memory management algorithm is a simple memory allocation algorithm. Initially, it is a large piece of memory. When a memory block needs to be allocated, the matching memory block is segmented from the large memory block, and then this matching free memory block is returned to the heap management system. Each memory block contains data head for management use through which the used block and the free block are linked by a doubly linked list. @@ -87,7 +84,7 @@ In addition, a 12-byte data head is reserved for `magic, used` information, and As for releasing, it is the reverse process, but the allocator will check if the adjacent memory blocks are free, and if they are free, the allocator will merge them into one large free memory block. -### Slab Management Algorithm +## Slab Management Algorithm RT-Thread's slab allocator is an optimized memory allocation algorithm for embedded systems based on the slab allocator implemented by DragonFly BSD founder Matthew Dillon. The most primitive slab algorithm is Jeff Bonwick's efficient kernel memory allocation algorithm introduced for the Solaris operating system. @@ -109,7 +106,7 @@ Assuming a 32-byte memory is allocated, the slab memory allocator first finds th The allocator needs to find the zone node where the memory block is located, and then link the memory block to the zone's free memory block linked list. If the free linked list of the zone indicates that all the memory blocks of the zone have been released, it means that the zone is completely free. The system will release the fully free zone to the page allocator when the number of free zones in the zone linked list reaches a certain number. -### memheap Management Algorithm +## memheap Management Algorithm The memheap management algorithm is suitable for systems with multiple memory heaps that are not contiguous. Using memheap memory management can simplify the use of multiple memory heaps in the system: when there are multiple memory heaps in the system, the user only needs to initialize multiple needed memheaps during system initialization and turn on the memheap function to attach multiple memheaps (addresses can be discontinuous) for the system's heap allocation. @@ -119,7 +116,7 @@ The working mechanism of memheap is shown in the figure below. First, add multip ![memheap Handling Multiple Memory Heaps](figures/08memheap.png) -### Memory Heap Configuration and Initialization +## Memory Heap Configuration and Initialization When using the memory heap, heap initialization must be done at system initialization, which can be done through the following function interface: @@ -158,13 +155,13 @@ Input parameters and return values of rt_memheap_init() |**Return** | —— | | RT_EOK | Successful | -### Memory Heap Management +## Memory Heap Management Operations of the memory heap are as shown in the following figure, including: initialization, application for memory blocks, release of memory. After use, all dynamic memory should be released for future use by other programs. ![Operations of the Memory Heap ](figures/08heap_ops.png) -#### Allocate and Release Memory Block +### Allocate and Release Memory Block Allocate a memory block of user-specified size from the memory heap. The function interface is as follows: @@ -197,7 +194,7 @@ Input parameters of rt_free() |----------|--------------------| | ptr | to-be-released memory block pointer | -#### Re-allocate Memory Block +### Re-allocate Memory Block Re-allocating the size of the memory block (increase or decrease) based on the allocated memory block can be done through the following function interface: @@ -216,7 +213,7 @@ Input parameters and return values of rt_realloc() |**Return** | —— | | Re-allocated memory block address | Successful | -#### Allocate Multiple Memory Blocks +### Allocate Multiple Memory Blocks Allocating multiple memory blocks with contiguous memory addresses from the memory heap can be done through the following function interface: @@ -236,7 +233,7 @@ Input parameters and return values of rt_calloc() | Pointer pointing to the first memory block address | Successful, all allocated memory blocks are initialized to zero. | | RT_NULL | Allocation failed | -#### Set Memory Hook Function +### Set Memory Hook Function When allocating memory blocks, user can set a hook function. The function interface called is as follows: @@ -295,7 +292,7 @@ Input parameters of the hook function |----------|--------------------| | ptr | Memory block pointer to be released | -### Memory Heap Management Application Example +## Memory Heap Management Application Example This is an example of a memory heap application. This program creates a dynamic thread that dynamically requests memory and releases it. Each time it apples for more memory, it ends when it can't apply for it, as shown in the following code: @@ -377,8 +374,7 @@ try to get 65536 byte memory failed! The memory is successfully allocated in the routine and the information is printed; when trying to apply 65536 byte, 64KB, of memory, the allocation fails because the total RAM size is only 64K and the available RAM is less than 64K. -Memory Pool ------- +# Memory Pool The memory heap manager can allocate blocks of any size, which is very flexible and convenient. However, it also has obvious shortcomings. Firstly, the allocation efficiency is not high because free memory blocks need to be looked up for each allocation. Secondly, it is easy to generate memory fragmentation. In order to improve the memory allocation efficiency and avoid memory fragmentation, RT-Thread provides another method of memory management: Memory Pool. @@ -394,9 +390,9 @@ The player thread then writes the memory block containing the decoded data to th After the sound card device is written, the callback function set by the player thread is called to release the written memory block. If the player thread is suspended because there is no memory block in the memory pool available, then it will be awakened to continue to decode. -### Memory Pool Working Mechanism +## Memory Pool Working Mechanism -#### Memory Pool Control Block +### Memory Pool Control Block The memory pool control block is a data structure used by the operating system to manage the memory pool. It stores some information about the memory pool, such as the start address of the data area in the memory pool, the memory block size and the memory block list. It also includes memory blocks, a linked list structure used for the connection between memory blocks, event set of the thread suspended due to the memory block being unavailable, and so on. @@ -425,7 +421,7 @@ struct rt_mempool typedef struct rt_mempool* rt_mp_t; ``` -#### Memory Block Allocation Mechanism +### Memory Block Allocation Mechanism When the memory pool is created, it first asks for a large amount of memory from the system. Then it divides the memory into multiple small memory blocks of the same size. The small memory blocks are directly connected by a linked list (this linked list is also called a free linked list). At each allocation, the first memory block is taken from the head of the free linked list and provided to the applicant. As you can see from the figure below, there are multiple memory pools of different sizes allowed in physical memory. Each memory pool is composed of multiple free memory blocks, which are used by the kernel for memory management. When a memory pool object is created, the memory pool object is assigned to a memory pool control block. The parameters of the memory control block include the memory pool name, memory buffer, memory block size, number of blocks, and a queue of threads waiting. @@ -435,13 +431,13 @@ The kernel is responsible for allocating memory pool control blocks to the memor Each memory pool object consists of the above structure, where suspend_thread forms a list for thread waiting for memory blocks, that is, when there is no memory block available in the memory pool, and the request thread allows waiting, the thread applying for the memory block will suspend on the suspend_thread linked list. -### Memory Pool Management +## Memory Pool Management The memory pool control block is a structure that contains important parameters related to the memory pool and acts as a link between various states of the memory pool. The related interfaces of the memory pool are as shown in the following figure. The operation of the memory pool includes: creating/initializing the memory pool, appling for memory blocks, releasing memory blocks and deleting/detaching memory pools. It needs to noted that not all memory pools will be deleted. The deletion is relegated to the user, but the used memory blocks should be released. ![Related Interfaces of Memory Pool](figures/08mempool_ops.png) -#### Create and Delete Memory Pool +### Create and Delete Memory Pool To create a memory pool, a memory pool object is created first and then a memory heap is allocated from the heap. Creating a memory pool is a prerequisite for allocating and releasing memory blocks from the corresponding memory pool. After the memory pool is created, a thread can perform operations like application, release and so on. To create a memory pool, use the following function interface. This function returns a created memory pool object. @@ -480,7 +476,7 @@ Input parameters and return values of rt_mp_delete() |**Return**| —— | | RT_EOK | Deletion successful | -#### Initialize and Detach Memory Pool +### Initialize and Detach Memory Pool Memory pool initialization is similar to memory pool creation, except that the memory pool initialization is used for static memory management, and the memory pool control block is derived from static objects that the user applies in the system. In addition, unlike memory pool creation, the memory space used by the memory pool object here is a buffer space specified by user. The user passes the pointer of the buffer to the memory pool control block, the rest of the initialization is the same as the creation of the memory pool. The function interface is as follows: @@ -527,7 +523,7 @@ Input parameters and return values for rt_mp_detach() |**Return**| —— | | RT_EOK | Successful | -#### Allocate and Release Memory Block +### Allocate and Release Memory Block To allocate a memory block from the specified memory pool, use the following interface: @@ -561,7 +557,7 @@ Input parameters of rt_mp_free() |----------|------------| | block | memory block pointer | -### Memory Pool Application Example +## Memory Pool Application Example This is a static internal memory pool application routine that creates a static memory pool object and 2 dynamic threads. One thread will try to get the memory block from the memory pool, and the other thread will release the memory block, as shown in the following code: diff --git a/documentation/network/network.md b/documentation/network/network.md index c9a137f4b19..f5232155519 100644 --- a/documentation/network/network.md +++ b/documentation/network/network.md @@ -1,4 +1,4 @@ -# Network Framework +@page component_network Network Framework With the popularity of the Internet, people's lives are increasingly dependent on the application of the network. More and more products need to connect to the Internet, and device networking has become a trend. To achieve the connection between the device and the network, you need to follow the TCP/IP protocol, you can run the network protocol stack on the device to connect to the network, or you can use devices (chips with hardware network protocol stack interfaces) to connect to the Internet. @@ -6,15 +6,15 @@ When the device is connected to the network, it is like plugging in the wings. Y This chapter will explain the related content of the RT-Thread network framework, and introduce you to the concept, function and usage of the network framework. After reading this chapter, you will be familiar with the concept and implementation principle of the RT-Thread network framework and familiar with network programming using Socket API. -## TCP/IP Introduction to Network Protocols +# TCP/IP Introduction to Network Protocols TCP/IP is short for Transmission Control Protocol/Internet Protocol. It is not a single protocol, but a general term for a protocol family. It includes IP protocol, ICMP protocol, TCP protocol, and http and ftp, pop3, https protocol, etc., which define how electronic devices connect to the Internet and the standards by which data is transferred between them. -### OSI Reference Model +## OSI Reference Model OSI (Open System Interconnect), which is an open system interconnection. Generally referred to as the OSI reference model, it is a network interconnection model studied by the ISO (International Organization for Standardization) in 1985. The architecture standard defines a seven-layer framework for the network interconnection (physical layer, data link layer, network layer, transport layer, session layer, presentation layer, and application layer), that is, the ISO open system interconnection reference model. The first to third layers belong to the lower three layers of the OSI Reference Model and are responsible for creating links for network communication connections; the fourth to seventh layers are the upper four layers of the OSI reference model and is responsible for end-to-end data communication. The capabilities of each layer are further detailed in this framework to achieve interconnectivity, interoperability, and application portability in an open system environment. -### TCP/IP Reference Model +## TCP/IP Reference Model The TCP/IP communication protocol uses a four-layer hierarchical structure, and each layer calls the network provided by its next layer to fulfill its own needs. The four layers are: @@ -23,7 +23,7 @@ The TCP/IP communication protocol uses a four-layer hierarchical structure, and * **Network layer**: responsible for providing basic data packet transfer functions, so that each packet can reach the destination host (but not check whether it is received correctly), such as Internet Protocol (IP). * **Network interface layer**: Management of actual network media, defining how to use actual networks (such as Ethernet, Serial Line, etc.) to transmit data. -### Difference between TCP/IP Reference Model and OSI Reference Model +## Difference between TCP/IP Reference Model and OSI Reference Model The following figure shows the TCP/IP reference model and the OSI reference model diagram: @@ -31,19 +31,19 @@ The following figure shows the TCP/IP reference model and the OSI reference mode Both the OSI reference model and the TCP/IP reference model are hierarchical, based on the concept of a separate protocol stack. The OSI reference model has 7 layers, while the TCP/IP reference model has only 4 layers, that is, the TCP/IP reference model has no presentation layer and session layer, and the data link layer and physical layer are merged into a network interface layer. However, there is a certain correspondence between the two layers. Due to the complexity of the OSI system and the design prior to implementation, many designs are too ideal and not very convenient for software implementation. Therefore, there are not many systems that fully implement the OSI reference model, and the scope of application is limited. The TCP/IP reference model was first implemented in a computer system. It has a stable implementation on UNIX and Windows platforms, and provides a simple and convenient programming interface (API) on which a wide range of applications are developed. The TCP/IP reference model has become the international standard and industry standard for Internet connectivity. -### IP Address +## IP Address The IP address refers to the Internet Protocol Address (also translated as the Internet Protocol Address) and is a uniform address format that assigns a logical address to each network and each host on the Internet to mask physical address differences provided by Internet Protocol. The common LAN IP address is 192.168.X.X. -### Subnet Mask +## Subnet Mask Subnet mask (also called netmask, address mask), which is used to indicate which bits of an IP address identify the subnet where the host is located, and which bits are identified as the bit mask of the host. The subnet mask cannot exist alone, it must be used in conjunction with an IP address. Subnet mask has only one effect, which is to divide an IP address into two parts: network address and host address. The subnet mask is the bit of 1, the IP address is the network address, the subnet mask is the bit of 0, and the IP address is the host address. Taking the IP address 192.168.1.10 and the subnet mask 255.255.255.0 as an example, the first 24 bits of the subnet mask (converting decimal to binary) is 1, so the first 24 bits of the IP address 192.168.1 represent the network address. The remaining 0 is the host address. -### MAC Address +## MAC Address MAC (figures Access Control or Medium Access Control) address, which is translated as media access control, or physical address, hardware address, used to define the location of network devices. In OSI model, the third layer network Layer is responsible for IP address, the second layer data link layer is responsible for the MAC address. A host will have at least one MAC address. -## Introduction to the Network Framework of RT-Thread +# Introduction to the Network Framework of RT-Thread In order to support various network protocol stacks, RT-Thread has developed a **SAL** component, the full name of the **Socket abstraction layer**. RT-Thread can seamlessly access various protocol stacks, including several commonly used TCP/IP protocol stack, such as the LwIP protocol stack commonly used in embedded development and the AT Socket protocol stack component developed by RT-Thread, which complete the conversion of data from the network layer to the transport layer. @@ -92,11 +92,11 @@ In addition, based on the network framework, RT-Thread provides a large number o | netutils | A collection of useful network debugging gadgets, including: ping, TFTP, iperf, NetIO, NTP, Telnet, etc. | | OneNet | Software for accessing China Mobile OneNet Cloud | -## Network Framework Workflow +# Network Framework Workflow Using the RT-Thread network framework, you first need to initialize the SAL, then register various network protocol clusters to ensure that the application can communicate using the socket network socket interface. This section mainly uses LwIP as an example. -### Register the Network Protocol Cluster +## Register the Network Protocol Cluster First use the `sal_init()` interface to initialize resources such as mutex locks used in the component. The interface looks like this: @@ -141,23 +141,23 @@ int sal_proto_family_register(const struct proto_family *pf); | 0 | registration success | | -1 | registration failed | -### Network Data Receiving Process +## Network Data Receiving Process After the LwIP is registered to the SAL, the application can send and receive network data through the network socket interface. In LwIP, several main threads are created, and they are `tcpip` thread, `erx` receiving thread and `etx` sending thread. The network data receiving process is as shown in the following picture. The application receives data by calling the standard socket interface `recv()` with blocking mode. When the Ethernet hardware device receives the network data packet, it stores the packet in the receiving buffer, and then sends an email to notify the `erx` thread that the data arrives through the Ethernet interrupt program. The `erx` thread applies for the `pbuf` memory block according to the received data length and put the data into the pbuf's `payload` data, then send the `pbuf` memory block to the `tcpip` thread via mailbox, and the `tcpip` thread returns the data to the application that is blocking the receiving data. ![Data receiving function call flow chart](figures/net-recv.png) -### Network Data Sending Process +## Network Data Sending Process The network data sending process is shown in the figure below. When there is data to send, the application calls the standard network socket interface `send()` to hand the data to the `tcpip` thread. The `tcpip` thread sends a message to wake up the `etx` thread. The `etx` thread first determines if the Ethernet is sending data. If data is not being sent, it will put the data to be sent into the send buffer, and then send the data through the Ethernet device. If data is being sent, the `etx` thread suspends itself until the Ethernet device is idle before sending the data out. ![Data sending function call flow chart](figures/net-send.png) -## Network Socket Programming +# Network Socket Programming The application uses Socket (network socket) interface programming to implement network communication functions. Socket is a set of application program interface (API), which shields the communication details of each protocol, so that the application does not need to pay attention to the protocol itself, directly using the interfaces provide by socket to communicate between different hosts interconnected. -### TCP socket Communication Process +## TCP socket Communication Process TCP(Tranfer Control Protocol) is a connection-oriented protocol to ensure reliable data transmission. Through the TCP protocol transmission, a sequential error-free data stream is obtained. The TCP-based socket programming flow diagram is shown in the following figure. A connection must be established between the sender and the receiver's two sockets in order to communicate on the basis of the TCP protocol. When a socket (usually a server socket) waits for a connection to be established. Another socket can request a connection. Once the two sockets are connected, they can perform two-way data transmission, and both sides can send or receive data. A TCP connection is a reliable connection that guarantees that packets arrive in order, and if a packet loss occurs, the packet is automatically resent. @@ -165,7 +165,7 @@ For example, TCP is equivalent to calling in life. When you call the other party ![TCP-based socket programming flow chart](figures/net-tcp.png) -### UDP socket Communication Process +## UDP socket Communication Process UDP is short for User Datagram Protocol. It is a connectionless protocol. Each datagram is a separate information, including the complete source address and destination address. It is transmitted to the destination on the network in any possible path. Therefore, whether the destination can be reached, the time to reach the destination, and the correctness of the content cannot be guaranteed. The UDP-based socket programming flow is shown in the following figure. @@ -173,7 +173,7 @@ UDP is short for User Datagram Protocol. It is a connectionless protocol. Each d For example, UDP is equivalent to the walkie-talkie communication in life. After you set up the channel, you can directly say the information you want to express. The data is sent out by the walkie-talkie, but you don't know if your message has been received by others. By the way, unless someone else responds to you with a walkie-talkie. So this method is not reliable. -### Create a Socket +## Create a Socket Before communicating, the communicating parties first use the `socket()` interface to create a socket, assigning a socket descriptor and its resources based on the specified address family, data type, and protocol. The interface is as follows: @@ -209,7 +209,7 @@ The sample code for creating a TCP type socket is as follows: } ``` -### Binding Socket +## Binding Socket A binding socket is used to bind a port number and an IP address to a specified socket. When using socket() to create a socket, only the protocol family is given, and no address is assigned. Before the socket receives a connection from another host, it must bind it with an address and port number using bind(). The interface is as follows: @@ -226,11 +226,11 @@ int bind(int s, const struct sockaddr *name, socklen_t namelen); | 0 | Successful | | -1 | Fail | -### Establishing a TCP Connection +## Establishing a TCP Connection For server-side programs, after using `bind()` to bind the socket, you also need to use the `listen()` function to make the socket enter the passive listening state, and then call the `accept()` function to respond to the client at any time. -#### Listening Socket +### Listening Socket The listening socket is used by the TCP server to listen for the specified socket connection. The interface is as follows: @@ -246,7 +246,7 @@ int listen(int s, int backlog); | 0 | Successful | | -1 | Fail | -#### Accept the Connection +### Accept the Connection When the application listens for connections from other clients, the connection must be initialized with the `accept()` function, which creates a new socket for each connection and removes the connection from the listen queue. The interface is as follows: @@ -263,7 +263,7 @@ int accept(int s, struct sockaddr *addr, socklen_t *addrlen); | >=0 | Successful, return the newly created socket descriptor | | -1 | Fail | -#### Establish Connection +### Establish Connection Used by the client to establish a connection with the specified server. The interface is as follows: @@ -300,11 +300,11 @@ if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == - } ``` -### Data Transmission +## Data Transmission TCP and UDP have different data transmission methods. TCP needs to establish a connection before data transmission, use `send()` function for data transmission, use `recv()` function for data reception, and UDP does not need to establish connection. It uses `sendto()` function sends data and receives data using the `recvfrom()` function. -#### TCP Data Transmission +### TCP Data Transmission After the TCP connection is established, the data is sent using the `send()` function. The interface is as follows: @@ -322,7 +322,7 @@ int send(int s, const void *dataptr, size_t size, int flags); | >0 | Successful, return the length of the sent data | | <=0 | Failed | -#### TCP Data Reception +### TCP Data Reception After the TCP connection is established, use `recv()` to receive the data. The interface is as follows: @@ -341,7 +341,7 @@ int recv(int s, void *mem, size_t len, int flags); | =0 | The destination address has been transferred and the connection is closed | | <0 | Fail | -#### UDP Data transmission +### UDP Data transmission In the case where a connection is not established, you can use the `sendto()` function to send UDP data to the specified destination address, as shown below: @@ -362,7 +362,7 @@ int sendto(int s, const void *dataptr, size_t size, int flags, | >0 | Successful, return the length of the sent data | | <=0 | Fail | -#### UDP Data Reception +### UDP Data Reception To receive UDP data, use the `recvfrom()` function, and the interface is: @@ -384,7 +384,7 @@ int recvfrom(int s, void *mem, size_t len, int flags, | 0 | The receiving address has been transferred and the connection is closed | | <0 | Fail | -### Close Network Connection +## Close Network Connection After the network communication is over, you need to close the network connection. There are two ways to use `closesocket()` and `shutdown()`. @@ -415,7 +415,7 @@ int shutdown(int s, int how); | 0 | Successful | | -1 | Fail | -## Network Function Configuration +# Network Function Configuration The main functional configuration options of the network framework are shown in the following table, which can be configured according to different functional requirements: @@ -462,9 +462,9 @@ LwIP Configuration options: | RT_LWIP_ETHTHREAD_STACKSIZE | Integer | Receive/send thread's stack size | | RT_LwIP_ETHTHREAD_MBOX_SIZE | Integer | Receive/send thread's mailbox size | -## Network Application Example +# Network Application Example -### View IP Address +## View IP Address In the console, you can use the ifconfig command to check the network status. The IP address is 192.168.12.26, and the FLAGS status is LINK_UP, indicating that the network is configured: @@ -481,7 +481,7 @@ dns server #0: 192.168.10.1 dns server #1: 223.5.5.5 ``` -### Ping Network Test +## Ping Network Test Use the ping command for network testing: @@ -501,7 +501,7 @@ msh /> Getting the above output indicates that the connection network is successful! -### TCP Client Example +## TCP Client Example After the network is successfully connected, you can run the network example, first run the TCP client example. This example will open a TCP server on the PC, open a TCP client on the IoT Board, and both parties will communicate on the network. @@ -683,7 +683,7 @@ msh > The above information indicates that the TCP client received 5 "hello world" data sent from the server. Finally, the exit command 'q' was received from the TCP server, and the TCP client program exited the operation and returned to the FinSH console. -### UDP Client Example +## UDP Client Example This is an example of a UDP client. This example will open a UDP server on the PC and open a UDP client on the IoT Board for network communication. A UDP client program has been implemented in the sample project. The function is to send data to the server. The sample code is as follows: diff --git a/documentation/pm/pm.md b/documentation/pm/pm.md index ff4c1b802a1..509b99a37d9 100644 --- a/documentation/pm/pm.md +++ b/documentation/pm/pm.md @@ -1,4 +1,4 @@ -# Power Management: PM +@page component_pm Power Management: PM The purpose of low power management of embedded system is to reduce system energy consumption as much as possible to prolong the standby time of equipment on the premise of satisfying users'performance requirements. The contradiction between high performance and limited battery energy is most prominent in embedded systems. The combination of hardware low power design and software low power management has become an effective means to solve the contradiction. Nowadays, all kinds of MCUs provide management interfaces in low power consumption more or less. For example, adjusting the frequency of the main control clock, changing the working voltage, adjusting or even closing the bus frequency, closing the working clock of peripheral equipment, etc. With the support of hardware, reasonable software design becomes the key to energy saving. Generally, low power management can be divided into three categories: @@ -18,13 +18,13 @@ With the rise of the Internet of Things (IoT), the demand for power consumption In the initial stage of product development, the first consideration is to complete the development of product functions as soon as possible. After the function of the product is gradually improved, it is necessary to add the power management (PM) function. To meet this need of IoT, RT-Thread provides power management components. The idea of power management components is to be as transparent as possible, making it easier for products to add low power functions. -## Introduction of PM Components +# Introduction of PM Components RT-Thread's PM components adopt a layered design idea, separating architecture and chip-related parts, and extracting common parts as the core. While providing a common interface to the upper layer, it also makes it easier for the bottom driver to adapt components. ![PM Component Overview](figures/pm_system.png) -### Main Features +## Main Features The main features of RT-Thread PM components are as follows: @@ -35,7 +35,7 @@ The main features of RT-Thread PM components are as follows: - Optional sleep time compensation is supported to make OS Tick dependent applications transparent. - Provide the device interface to the upper layer. If the devfs component is opened, it can also be accessed through the file system interface. -### Working Principle +## Working Principle The essence of low power consumption is that when the system is idle, the CPU stops working, interrupts or resumes working after the event wakes up. In RTOS, there is usually an IDLE task, which has the lowest priority and remains ready. When the high priority task is not ready, the OS executes the IDLE task. Generally, the CPU executes empty instructions in IDLE tasks without low power processing. The power management component of RT-Thread can effectively reduce the power consumption of the system by managing CPU, clock and equipment in IDLE tasks. @@ -43,13 +43,13 @@ The essence of low power consumption is that when the system is idle, the CPU st As shown in the figure above, when the high priority thread runs out or is suspended, the system enters the IDLE thread . After the IDLE thread is executed, it will determine whether the system can go to sleep (to save power). If the system goes to sleep, Some hardware modules will be shut down depending on the chip condition, and OS Tick is also very likely to enter a pause state. At this time, the power management framework will calculate the next timeout point according to the system timer situation, and set a low-power timer, so that the device can wake up at that point, and carry out follow-up work. When the system is awakened (low power timer interrupt or other wake-up interrupt source), the system also needs to know how long it sleeps, and compensate for OS Tick, so that the OS tick value of the system is adjusted to a correct value. -## PM Framework +# PM Framework In RT-Thrad PM components, peripherals or applications vote on the required power consumption mode by voting mechanism. When the system is idle, the appropriate power consumption mode is decided according to the voting number, and the abstract interface is called to control the chip to enter a low power consumption state, so as to reduce the power consumption of the system. When no vote is taken, it is entered in the default mode (usually idle mode). Unlike applications, some peripherals may perform specific operations when they enter a low-power state and take measures to recover when they exit a low-power state, which can be achieved by registering PM devices. By registering PM devices, `suspend` callbacks of registered devices will be triggered before entering a low power state. Developers can perform their own operations in the callbacks. Similarly, `resume` callbacks will be triggered when exiting from a low power state. ![PM Framework](figures/pm_architecture.png) -## Low Power State and Mode +# Low Power State and Mode The RT-Thread PM component divides the system into two states: RUN(running state) and Sleep(sleeping state). @@ -83,23 +83,23 @@ Running state is usually used to change the running frequency of CPU, independen | PM_RUN_MODE_MEDIUM_SPEED | Medium-speed mode, reduce CPU running speed, thereby reducing power consumption | | PM_RUN_MODE_LOW_SPEED | Low-speed mode, CPU frequency further reduced | -### Request and release of patterns +## Request and release of patterns In PM components, upper applications can actively participate in power management by requesting and releasing sleep modes. Applications can request different sleep modes according to scenarios and release them after processing. As long as any application or device requests higher-level power mode, it will not switch to a lower mode. Therefore, the requests and releases of sleep mode usually occur in pairs and can be used to protect a certain stage, such as the peripheral DMA transmission process. -### Device Sensitive to Mode Changes +## Device Sensitive to Mode Changes In PM components, switching to a new mode of operation may lead to changes in CPU frequency. If peripherals and CPUs share a part of the clock, the peripheral clock will be affected. When entering the new sleep mode, most clock sources will be stopped. If the peripheral does not support the freezing function of sleep, then the peripheral clock needs to be reconfigured when waking up from sleep. So PM components support PM mode sensitive PM devices. It enables the device to work normally when switching to a new operation mode or a new sleep mode. This function requires the underlying driver to implement the relevant interface and register as a device sensitive to mode changes. -## The calling process +# The calling process ![PM Sequence](figures/pm_sequence.png) Firstly, the application layer sets the callback function of entering and exiting the dormancy state, and then calls `rt_pm_request` to request the sleeping mode to trigger the sleeping operation. The PM component checks the number of sleeping modes when the system is idle, and gives the recommended mode according to the number of votes. Then the PM component calls `notfiy` to inform the application that it is going to enter the sleep mode, and then suspends the registered PM device and executes the sleep mode implemented by SOC after returning to OK. The system enters the sleep state (if the enabling time is compensated, the low-power timer will be started before the sleep). At this point, the CPU stops working and waits for an event or interrupt to wake up. When the system is awakened, because the global interruption is closed, the system continues to execute from there, gets the sleep time to compensate the OS tick of the system, wakes up the device in turn, and notifies the application to exit from the sleep mode. Such a cycle is completed, exits, and waits for the system to be idle next time. -## Introduction to APIs +# Introduction to APIs -### Request Sleep Mode +## Request Sleep Mode ```c void rt_pm_request(uint8_t sleep_mode); @@ -127,7 +127,7 @@ enum Calling this function adds the corresponding pattern count to 1 and locks the pattern. At this point, if a lower level of power mode is requested, it will not be accessible. Only after releasing (unlocking) the previously requested mode, the system can enter a lower level of power mode; requests to higher power mode are not affected by this. This function needs to be used in conjunction with `rt_pm_release` to protect a certain stage or process. -### Release Sleep Mode +## Release Sleep Mode ```c void rt_pm_release(uint8_t sleep_mode); @@ -139,7 +139,7 @@ void rt_pm_release(uint8_t sleep_mode); Calling this function decreases the corresponding pattern count by 1, and releases the previously requested pattern in conjunction with `rt_pm_request`. -### Setting up Running Mode +## Setting up Running Mode ```c int rt_pm_run_enter(uint8_t run_mode); @@ -165,7 +165,7 @@ enum Calling this function changes the CPU's running frequency, thereby reducing the power consumption at runtime. This function only provides levels, and the specific CPU frequency should depend on the actual situation during the migration phase. -### Setting up callback notifications for entering/exiting sleep mode +## Setting up callback notifications for entering/exiting sleep mode ```c void rt_pm_notify_set(void (*notify)(uint8_t event, uint8_t mode, void *data), void *data); @@ -187,9 +187,9 @@ enum ``` -## Instruction for Use +# Instruction for Use -### Setting Low Power Level +## Setting Low Power Level If the system needs to enter a specified level of low power consumption, it can be achieved by calling rt_pm_request. For example, into deep sleep mode: @@ -200,7 +200,7 @@ rt_pm_request(PM_SLEEP_MODE_DEEP); > Note: If higher power consumption modes, such as Light Mode or Idle Mode, are requested elsewhere in the program, then the corresponding mode needs to be released before the deep sleep mode can be entered. -### Protect a stage or process +## Protect a stage or process In special cases, for example, the system is not allowed to enter a lower power mode at a certain stage, which can be protected by rt_pm_request and rt_pm_release. For example, deep sleep mode (which may cause peripherals to stop working) is not allowed during I2C reading data, so the following processing can be done: @@ -215,7 +215,7 @@ rt_pm_release(PM_SLEEP_MODE_LIGHT); ``` -### Changing CPU Running Frequency +## Changing CPU Running Frequency Reducing the running frequency can effectively reduce the power consumption of the system, and the running frequency of the CPU can be changed through the `rt_pm_run_enter` interface. Generally speaking, frequency reduction means that CPU performance decreases and processing speed decreases, which may lead to the increase of task execution time and need to be weighed reasonably. @@ -224,7 +224,7 @@ Reducing the running frequency can effectively reduce the power consumption of t rt_pm_run_enter(PM_RUN_MODE_MEDIUM_SPEED); ``` -## Migration instructions +# Migration instructions Low power management is a very meticulous task. Developers need not only to fully understand the power management of the chip itself, but also to be familiar with the peripheral circuit of the board and deal with it one by one when they enter the low power state, so as to avoid leakage of the peripheral circuit and pull up the overall power consumption. @@ -261,7 +261,7 @@ struct rt_device_pm_ops void rt_pm_device_register(struct rt_device *device, const struct rt_device_pm_ops *ops); ``` -### Power Consumption Characteristics of Chips +## Power Consumption Characteristics of Chips ```c void (*sleep)(struct rt_pm *pm, uint8_t mode); @@ -269,7 +269,7 @@ void (*sleep)(struct rt_pm *pm, uint8_t mode); Each chip has different definitions and management of low power mode. PM component abstracts chip-related characteristics into sleep interface. The interface adapts to low power management related to chips. When entering different `sleep` modes, some hardware-related configurations, storage and other related processing are needed. -### Time Compensation for Sleep Mode +## Time Compensation for Sleep Mode ```c void (*timer_start)(struct rt_pm *pm, rt_uint32_t timeout); @@ -296,7 +296,7 @@ rt_system_pm_init(&_ops, timer_mask, RT_NULL); ``` -### Frequency Conversion in Running Mode +## Frequency Conversion in Running Mode ``` void (*run)(struct rt_pm *pm, uint8_t mode); @@ -304,7 +304,7 @@ void (*run)(struct rt_pm *pm, uint8_t mode); The frequency conversion of operation mode is realized by adapting the `run` interface in `rt_pm_ops`, and the appropriate frequency is selected according to the use scenario. -### Power management of peripherals +## Power management of peripherals Power processing of peripherals is an important part of low power management system. When entering some level of sleep mode, it is usually necessary to process some peripherals, such as emptying DMA, closing clock or setting IO to reset state, and recover after quitting sleep. @@ -312,9 +312,9 @@ In this case, PM devices can be registered through rt_pm_device_register interfa A more detailed migration case can be referred to stm32l476-nucleo BSP in the RT-Thread repository. -## MSH Commands +# MSH Commands -### Request Sleep Mode +## Request Sleep Mode The `pm_request` command can be used to request related patterns, using an example as follows: @@ -339,7 +339,7 @@ enum }; ``` -### Release Sleep Mode +## Release Sleep Mode You can use the `pm_release` command to release the sleep mode. The range of parameters is 0-5, and the examples are as follows: @@ -348,7 +348,7 @@ msh />pm_release 0 msh /> ``` -### Setting up Running Mode +## Setting up Running Mode You can use the `pm_run` command to switch the mode of operation with parameters ranging from 0 to 3, as shown in the following example @@ -371,7 +371,7 @@ enum }; ``` -### View mode status +## View mode status You can use the `pm_dump` command to view the mode state of the PM component, as shown in the following example @@ -400,7 +400,7 @@ The `Timer` column identifies whether to turn on sleep time compensation. In the The bottom part identifies the current sleep mode and running mode level respectively. -## Common problems and debugging methods +# Common problems and debugging methods - When the system enters the low power mode, the power consumption is too high. diff --git a/documentation/posix/README.md b/documentation/posix/README.md index 57e49198c02..4254caec9ca 100644 --- a/documentation/posix/README.md +++ b/documentation/posix/README.md @@ -1,6 +1,6 @@ -# POSIX Interface +@page component_posix POSIX Interface -## Introduction to Pthreads +# Introduction to Pthreads POSIX Threads is abbreviated as Pthreads. POSIX is the abbreviation of "Portable Operating System Interface". POSIX is a set of standards established by IEEE Computer Society to improve the compatibility of different operating systems and the portability of applications. Pthreads is a threaded POSIX standard defined in the POSIX.1c, Threads extensions (IEEE Std1003.1c-1995) standard, which defines a set of C programming language types, functions, and constants. Defined in the `pthread.h` header file and a thread library, there are about 100 APIs, all of which have a "`pthread_`" prefix and can be divided into 4 categories: @@ -34,7 +34,7 @@ Message queues, like semaphores, are used with Pthreads and are not part of the Most Pthreads functions return a value of 0 if they succeed, and an error code contained in the `errno.h` header file if unsuccessful. Many operating systems support Pthreads, such as Linux, MacOSX, Android, and Solaris, so applications written using Pthreads functions are very portable and can be compiled and run directly on many platforms that support Pthreads. -### Use POSIX in RT-Thread +## Use POSIX in RT-Thread Using the POSIX API interface in RT-Thread includes several parts: libc (for example, newlib), filesystem, pthread, and so on. Need to open the relevant options in rtconfig.h: @@ -47,17 +47,17 @@ Using the POSIX API interface in RT-Thread includes several parts: libc (for exa RT-Thread implements most of the functions and constants of Pthreads, defined in the pthread.h, mqueue.h, semaphore.h, and sched.h header files according to the POSIX standard. Pthreads is a sublibrary of libc, and Pthreads in RT-Thread are based on the encapsulation of RT-Thread kernel functions, making them POSIX compliant. The Pthreads functions and related functions implemented in RT-Thread are described in detail in the following sections. -## Thread +# Thread -### Thread Handle +## Thread Handle ``` c typedef rt_thread_t pthread_t; ``` -`Pthread_t` is a redefinition of the `rt_thread_t` type, defined in the `pthread.h` header file. rt_thread_t is the thread handle (or thread identifier) of the RT-Thread and is a pointer to the thread control block. You need to define a variable of type pthread_t before creating a thread. Each thread corresponds to its own thread control block, which is a data structure used by the operating system to control threads. It stores some information about the thread, such as priority, thread name, and thread stack address. Thread control blocks and thread specific information are described in detail in the [Thread Management](../thread/thread.md) chapter. +`Pthread_t` is a redefinition of the `rt_thread_t` type, defined in the `pthread.h` header file. rt_thread_t is the thread handle (or thread identifier) of the RT-Thread and is a pointer to the thread control block. You need to define a variable of type pthread_t before creating a thread. Each thread corresponds to its own thread control block, which is a data structure used by the operating system to control threads. It stores some information about the thread, such as priority, thread name, and thread stack address. Thread control blocks and thread specific information are described in detail in the @ref thread_management chapter. -### Create Thread +## Create Thread ``` c int pthread_create (pthread_t *tid, @@ -82,7 +82,7 @@ Thread properties and related functions are described in detail in the *Thread A > After the pthread thread is created, if the thread needs to be created repeatedly, you need to set the pthread thread to detach mode, or use pthread_join to wait for the created pthread thread to finish. -#### Example Code for Creating Thread +### Example Code for Creating Thread The following program initializes two threads, which have a common entry function, but their entry parameters are not the same. Others, they have the same priority and are scheduled for rotation in time slices. @@ -140,7 +140,7 @@ int rt_application_init() } ``` -### Detach Thread +## Detach Thread ``` c int pthread_detach (pthread_t thread); @@ -158,7 +158,7 @@ Usage: The child thread calls `pthread_detach(pthread_self())` (*pthread_self()* > Once the detach state of the thread property is set to detached, the thread cannot be waited by the pthread_join() function or re-set to detached. -#### Example Code for Detaching Thread +### Example Code for Detaching Thread The following program initializes 2 threads, which have the same priority and are scheduled according to the time slice. Both threads will be set to the detached state. The 2 threads will automatically exit after printing 3 times of information. After exiting, the system will automatically reclaim its resources. @@ -237,7 +237,7 @@ int rt_application_init() } ``` -### Waiting for Thread to End +## Waiting for Thread to End ``` c int pthread_join (pthread_t thread, void**value_ptr); @@ -257,7 +257,7 @@ The thread calling this function blocks and waits for the thread with the joinab The pthread_join() and pthread_detach() functions are similar in that they are used to reclaim the resources occupied by threads after the thread running ends. A thread cannot wait for itself to end. The detached state of the thread thread must be `joinable`, and one thread only corresponds to the `pthread_join()` call. A thread with a split state of joinable will only release the resources it occupies when other threads execute `pthread_join()` on it. So in order to avoid memory leaks, all threads that will end up running, either detached or set to detached, or use pthread_join() to reclaim the resources they consume. -#### Example Code for Waiting for the Thread to End +### Example Code for Waiting for the Thread to End The following program code initializes 2 threads, they have the same priority, and the threads of the same priority are scheduled according to the time slice. The separation status of the 2 thread attributes is the default value joinable, and thread 1 starts running first, and ends after printing 3 times of information. Thread 2 calls pthread_join() to block waiting for thread 1 to end, and reclaims the resources occupied by thread 1, and thread 2 prints the message every 2 seconds. @@ -336,7 +336,7 @@ int rt_application_init() } ``` -### Exit Thread +## Exit Thread ``` c void pthread_exit(void *value_ptr); @@ -350,7 +350,7 @@ Calling this function by the pthread thread terminates execution, just as the pr > If the split state of the thread is joinable, the resources occupied by the thread will not be released after the thread exits. The pthread_join() function must be called to release the resources occupied by the thread. -#### Example Code for Exiting Thread +### Example Code for Exiting Thread This program initializes 2 threads, they have the same priority, and the threads of the same priority are scheduled according to the time slice. The separation state of the two thread attributes is the default value joinable, and thread 1 starts running first, sleeps for 2 seconds after printing the information once, and then prints the exit information and then ends the operation. Thread 2 calls pthread_join() to block waiting for thread 1 to end, and reclaims the resources occupied by thread 1, and thread 2 prints the message every 2 seconds. @@ -426,7 +426,7 @@ int rt_application_init() } ``` -## Mutex +# Mutex Mutexes, also known as mutually exclusive semaphores, are a special binary semaphore. Mutexes are used to ensure the integrity of shared resources. Only one thread can access the shared resource at any time. To access shared resources, the thread must first obtain the mutex. After the access is complete, the mutex must be released. Embedded shared resources include memory, IO, SCI, SPI, etc. If two threads access shared resources at the same time, there may be problems because one thread may use the resource while another thread modifies the shared resource and consider sharing. @@ -436,9 +436,9 @@ The main APIs of the mutex include: calling `pthread_mutex_init()` to initialize The rt-thread operating system implements a priority inheritance algorithm to prevent priority inversion.Priority inheritance is the practice of raising the priority of a low-priority thread that occupies a resource to the same level as the highest-priority thread of all the threads waiting for the resource, then executing, and then returning to the initial setting when the low-priority thread releases the resource.Thus, threads that inherit priority prevent system resources from being preempted by any intermediate priority thread. -For a detailed introduction to priority reversal, please refer to the [Inter-thread Synchronization](../thread-sync/thread-sync.md) Mutex section. +For a detailed introduction to priority reversal, please refer to the @ref thread_sync Mutex section. -### Mutex Lock Control Block +## Mutex Lock Control Block Each mutex corresponds to a mutex control block that contains some information about the control of the mutex. Before creating a mutex, you must first define a variable of type `pthread_mutex_t`. pthread_mutex_t is a redefinition of pthread_mutex. The pthread_mutex data structure is defined in the pthread.h header file. The data structure is as follows: @@ -463,7 +463,7 @@ struct rt_mutex typedef struct rt_mutex* rt_mutex_t; /* Rt_mutext_t is a pointer to the mutex structure */ ``` -### Initialize the Mutex +## Initialize the Mutex ``` c int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); @@ -483,7 +483,7 @@ In addition to calling the pthread_mutex_init() function to create a mutex, you The mutex lock properties and related functions are described in detail in the *thread advanced programming* chapter. In general, the default properties can be used. -### Destroy Mutex +## Destroy Mutex ``` c int pthread_mutex_destroy(pthread_mutex_t *mutex); @@ -501,7 +501,7 @@ This function destroys the mutex `mutex`. Mutex is mutable in an uninitialized s The mutex can be destroyed when it is determined that the mutex is not locked and no thread is blocked on the mutex. -### Blocking Mode Locks the Mutex +## Blocking Mode Locks the Mutex ``` c int pthread_mutex_lock(pthread_mutex_t *mutex); @@ -517,7 +517,7 @@ int pthread_mutex_lock(pthread_mutex_t *mutex); This function locks the mutex `mutex`, which is a wrapper of the rt_mutex_take() function. If the mutex has not been locked yet, the thread applying for the mutex will successfully lock the mutex. If the mutex has been locked by the current thread and the mutex type is a nested lock, the mutex's holding count is incremented by one, and the current thread will not suspend waiting (deadlock), but the thread must corresponds to the same number of unlocks. If the mutex is held by another thread, the current thread will be blocked until the other thread unlocks the mutex, and the thread waiting for the mutex will acquire the mutex according to the *first in first out* principle. . -### Non-blocking Mode Locks the Mutex +## Non-blocking Mode Locks the Mutex ``` c int pthread_mutex_trylock(pthread_mutex_t *mutex); @@ -534,7 +534,7 @@ int pthread_mutex_trylock(pthread_mutex_t *mutex); This function is a non-blocking version of the pthread_mutex_lock() function. The difference is that if the mutex has been locked, the thread will not be blocked, but the error code will be returned immediately. -### Unlock the Mutex +## Unlock the Mutex ``` c int pthread_mutex_unlock(pthread_mutex_t *mutex); @@ -551,7 +551,7 @@ int pthread_mutex_unlock(pthread_mutex_t *mutex); Calling this function to unlock the mutex. This function is a wrapper of the rt_mutex_release() function. When the thread completes the access of the shared resource, it should release the possessed mutex as soon as possible, so that other threads can acquire the mutex in time. Only a thread that already has a mutex can release it, and its holding count is decremented by one each time the mutex is released. When the mutex's holding count is zero (ie, the holding thread has released all holding operations), the mutex becomes available, and the thread waiting on the mutex is placed in a first-in-first-out manner. If the thread's run priority is promoted by the mutex lock, then when the mutex is released, the thread reverts to the priority before holding the mutex. -### Example Code for Mutex Lock +## Example Code for Mutex Lock This program will initialize 2 threads, they have the same priority, 2 threads will call the same printer() function to output their own string, the printer() function will output only one character at a time, then sleep for 1 second, call printer The thread of the () function also sleeps. If you do not use a mutex, thread 1 prints a character, and after hibernation, thread 2 is executed, and thread 2 prints a character, so that the thread 1 and thread 2 strings cannot be completely printed, and the printed string is confusing. If a mutex is used to protect the print function printer() shared by 2 threads, thread 1 takes the mutex and executes the printer() print function to print a character, then sleeps for 1 second, which is switched to thread 2 because The nick lock has been locked by thread 1, and thread 2 will block until thread 1 of thread 1 is fully released and the thread 2 is woken up after the mutex is actively released. @@ -636,7 +636,7 @@ int rt_application_init() } ``` -## Conditional Variable +# Conditional Variable A condition variable is actually a semaphore used for synchronization between threads. A condition variable is used to block a thread. When a condition is met, a condition is sent to the blocked thread. The blocking thread is woken up. The condition variable needs to be used with the mutex. The mutex is used to protect the shared data. @@ -644,7 +644,7 @@ Condition variables can be used to inform shared data status. For example, if a The main operations of the condition variable include: calling `pthread_cond_init()` to initialize the condition variable, calling `pthread_cond_destroy()` to destroy a condition variable, calling `pthread_cond_wait()` to wait for a condition variable, and calling `pthread_cond_signal()` to send a condition variable. -### Condition Variable Control Block +## Condition Variable Control Block Each condition variable corresponds to a condition variable control block, including some information about the operation of the condition variable. A `pthread_cond_t` condition variable control block needs to be defined before initializing a condition variable. `pthread_cond_t` is a redefinition of the `pthread_cond` structure type, defined in the pthread.h header file. @@ -665,7 +665,7 @@ struct rt_semaphore }; ``` -### Initialization Condition Variable +## Initialization Condition Variable ``` c int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); @@ -685,7 +685,7 @@ You can also statically initialize a condition variable with the macro PTHREAD_C Attr General setting NULL use the default value, as described in the thread advanced programming chapter. -### Destroy Condition Variables +## Destroy Condition Variables ``` c int pthread_cond_destroy(pthread_cond_t *cond); @@ -704,7 +704,7 @@ This function destroys the `cond` condition variable, and the `cond` is uninitia Before destroying a condition variable, you need to make sure that no threads are blocked on the condition variable and will not wait to acquire, signal, or broadcast. -### Blocking Mode to Obtain Condition Variables +## Blocking Mode to Obtain Condition Variables ``` c int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); @@ -720,7 +720,7 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); This function gets the `cond` condition variable in blocking mode. The thread needs to lock the mutex before waiting for the condition variable. This function first determines whether the condition variable is available. If it is not available, initializes a condition variable, then unlocks the mutex and then tries to acquire a semaphore when the semaphore's value is greater than zero, it indicates that the semaphore is available, the thread will get the semaphore, and the condition variable will be obtained, and the corresponding semaphore value will be decremented by 1. If the value of the semaphore is equal to zero, indicating that the semaphore is not available, the thread will block until the semaphore is available, after which the mutex will be locked again. -### Specify Blocking Time to Obtain Condition Variables +## Specify Blocking Time to Obtain Condition Variables ``` c int pthread_cond_timedwait(pthread_cond_t *cond, @@ -741,7 +741,7 @@ int pthread_cond_timedwait(pthread_cond_t *cond, The only difference between this function and the `pthread_cond_wait()` function is that if the condition variable is not available, the thread will be blocked for the `abstime` duration. After the timeout, the function will directly return the ETIMEDOUT error code and the thread will be woken up to the ready state. -### Send a Conditional Semaphore +## Send a Conditional Semaphore ``` c int pthread_cond_signal(pthread_cond_t *cond); @@ -755,7 +755,7 @@ int pthread_cond_signal(pthread_cond_t *cond); This function sends a signal and wakes up only one thread waiting for the `cond` condition variable, which encapsulates the rt_sem_release() function, which is to send a semaphore. When the value of the semaphore is equal to zero, and a thread waits for this semaphore, it will wake up the first thread waiting in the queue of the semaphore to get the semaphore. Otherwise the value of the semaphore will be increased by 1. -### Broadcast +## Broadcast ``` c int pthread_cond_broadcast(pthread_cond_t *cond); @@ -770,7 +770,7 @@ int pthread_cond_broadcast(pthread_cond_t *cond); Calling this function will wake up all threads waiting for the `cond` condition variable. -### Example Code for Condition Variable +## Example Code for Condition Variable This example is a producer consumer model with a producer thread and a consumer thread that have the same priority. The producer will produce a number every 2 seconds, put it in the list pointed to by the `head`, and then call pthread_cond_signal() to send signal to the consumer thread to inform the consumer that there is data in the thread list. The consumer thread calls pthread_cond_wait() to wait for the producer thread to send a signal. @@ -885,7 +885,7 @@ int rt_application_init() } ``` -## Read-write Lock +# Read-write Lock Read-write locks are also known as multi-reader single-writer locks. The read-write lock divides the visitors of the shared resource into readers and writers. The reader only reads and accesses the shared resources, and the writer needs to write the shared resources. Only one thread can occupy the read-write lock of the write mode at the same time, but there can be multiple threads simultaneously occupying the read-write lock of the read mode. Read-write locks are suitable for reading data structures much more often than writes because read patterns can be shared when locked, and write mode locks are exclusive. @@ -893,7 +893,7 @@ Read-write locks are usually implemented based on mutex locks and condition vari The main operations of the read-write lock include: calling `pthread_rwlock_init()` to initialize a read-write lock, the write thread calling `pthread_rwlock_wrlock()` to lock the read-write lock, and the read thread calling `pthread_rwlock_rdlock()` to lock the read-write lock , when this read-write lock is not required, calling `pthread_rwlock_destroy()` to destroys the read-write lock. -### Read-write Lock Control Block +## Read-write Lock Control Block Each read-write lock corresponds to a read-write lock control block, including some information about the operation of the read-write lock. `pthread_rwlock_t` is a redefinition of the `pthread_rwlock` data structure, defined in the `pthread.h` header file. Before creating a read-write lock, you need to define a data structure of type `pthread_rwlock_t`. @@ -912,7 +912,7 @@ struct pthread_rwlock typedef struct pthread_rwlock pthread_rwlock_t; /* Type redefinition */ ``` -### Initialize Read-write Lock +## Initialize Read-write Lock ``` c int pthread_rwlock_init (pthread_rwlock_t *rwlock, @@ -933,7 +933,7 @@ You can also use the macro PTHREAD_RWLOCK_INITIALIZER to statically initialize t `attr` generally sets NULL to the default value, as described in the chapter on advanced threading. -### Destroy Read-write Lock +## Destroy Read-write Lock ``` c int pthread_rwlock_destroy (pthread_rwlock_t *rwlock); @@ -950,9 +950,9 @@ int pthread_rwlock_destroy (pthread_rwlock_t *rwlock); This function destroys a `rwlock` read-write lock, which destroys the mutex and condition variables in the read-write lock. After the destruction, the properties of the read-write lock and the control block parameters will not be valid, but you can call pthread_rwlock_init() or re-initialize the read-write lock in static mode. -### Read-Lock of Read-Write Lock +## Read-Lock of Read-Write Lock -#### Blocking mode Read-lock the read-write locks +### Blocking mode Read-lock the read-write locks ``` c int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock); @@ -968,7 +968,7 @@ int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock); The reader thread can call this function to read-lock the `rwlock` read-write lock. If the read-write lock is not write-locked and no writer thread is blocked on the read-write lock, the read-write thread will successfully acquire the read-write lock. If the read-write lock has been write-locked, the reader thread will block until the thread that executes the write-lock unlocks the read-write lock. -#### Non-blocking Mode Read-lock Read-write Locks +### Non-blocking Mode Read-lock Read-write Locks ``` c int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock); @@ -985,7 +985,7 @@ int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock); This function differs from the pthread_rwlock_rdlock() function in that if the read-write lock is already write-locked, the reader thread is not blocked, but instead returns an error code EBUSY. -#### Specify Blocking Time for the Read-write Lock to be Read-Locked +### Specify Blocking Time for the Read-write Lock to be Read-Locked ``` c int pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock, @@ -1004,9 +1004,9 @@ int pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock, The difference between this function and the pthread_rwlock_rdlock() function is that if the read-write lock has been write-locked, the reader thread will block the specified abstime duration. After the timeout, the function will return the error code ETIMEDOUT and the thread will be woken up to the ready state. -### Write-Lock of Read-Write Lock +## Write-Lock of Read-Write Lock -#### Blocking Mode Write-Locks a Read-write Lock +### Blocking Mode Write-Locks a Read-write Lock ``` c int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock); @@ -1022,7 +1022,7 @@ int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock); The writer thread calls this function to write-lock the `rwlock` read-write lock. A write-lock read-write lock is similar to a mutex, and only one thread can write-lock a read-write lock at a time. If no thread locks the read-write lock, that is, the read-write lock value is 0, the writer thread that calls this function will write-lock the read-write lock, and other threads cannot acquire the read-write lock at this time. If there is already a thread locked the read-write lock, ie the read/write lock value is not 0, then the writer thread will be blocked until the read-write lock is unlocked. -#### Non-blocking Mode Write-Lock a Read-write Lock +### Non-blocking Mode Write-Lock a Read-write Lock ``` c int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock); @@ -1039,7 +1039,7 @@ int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock); The only difference between this function and the pthread_rwlock_wrlock() function is that if a thread has locked the read-write lock, ie the read-write lock value is not 0, the writer thread that called the function will directly return an error code, and the thread will not be Blocked. -#### Specify Blocking Time for the Read-write Lock to be Write-Lock +### Specify Blocking Time for the Read-write Lock to be Write-Lock ``` c int pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock, @@ -1057,7 +1057,7 @@ int pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock, The only difference between this function and the pthread_rwlock_wrlock() function is that if a thread locks the read-write lock, that is, the read-write lock value is not 0, the calling thread blocks the specified `abstime` duration. After the timeout, the function returns the error code ETIMEDOUT, and the thread will be woken up to the ready state. -### Unlock the Read-write Lock +## Unlock the Read-write Lock ``` c int pthread_rwlock_unlock (pthread_rwlock_t *rwlock); @@ -1073,7 +1073,7 @@ int pthread_rwlock_unlock (pthread_rwlock_t *rwlock); This function unlocks the `rwlock` read-write lock. A thread locks the same read-write lock multiple times and must have the same number of unlocks. If multiple threads wait for the read-write lock to lock after unlocking, the system will activate the waiting thread according to the first-in-first-out rule. -### Example Code for Read-write Lock +## Example Code for Read-write Lock This program has two reader threads, one reader thread. The two reader threads read-lock the read-write lock first, then sleep for 2 seconds. This time the other reader threads can read-lock the read-write lock, and then read the shared data. @@ -1165,13 +1165,13 @@ int rt_application_init() } ``` -## Barrier +# Barrier Barriers are a way to synchronize multithreading. Barrier means a barrier or railing that blocks multiple threads that arrive in the same railing until all threads arrived, then remove the railings and let them go at the same time. The thread that arrives first will block, and when all the threads that call the pthread_barrier_wait() function (the number equal to the count specified by the barrier initialization) arrive, the threads will enter the ready state from the blocked state and participate in the system scheduling again. Barriers are implemented based on condition variables and mutex locks. The main operations include: calling `pthread_barrier_init()` to initialize a barrier, and other threads calling `pthread_barrier_wait()`. After all threads arrived, the thread wakes up to the ready state. Destroy a barrier by calling pthread_barrier_destroy() when the barrier will not be used. -### Barrier Control Block +## Barrier Control Block Before creating a barrier, you need to define a `pthread_barrier_t` barrier control block. `pthread_barrier_t` is a redefinition of the `pthread_barrier` structure type, defined in the pthread.h header file. @@ -1185,7 +1185,7 @@ struct pthread_barrier typedef struct pthread_barrier pthread_barrier_t; ``` -### Create a Barrier +## Create a Barrier ``` c int pthread_barrier_init(pthread_barrier_t *barrier, @@ -1206,7 +1206,7 @@ This function creates a `barrier` barrier and initializes the conditional variab attr generally sets NULL to the default value, as described in the chapter on *thread advanced programming*. -### Destruction of Barrier +## Destruction of Barrier ``` c int pthread_barrier_destroy(pthread_barrier_t *barrier); @@ -1221,7 +1221,7 @@ int pthread_barrier_destroy(pthread_barrier_t *barrier); This function destroys a barrier. The barrier's properties and control block parameters will not be valid after destruction, but can be reinitialized by calling pthread_barrier_init(). -### Wait for Barrier +## Wait for Barrier ``` c int pthread_barrier_wait(pthread_barrier_t *barrier); @@ -1236,7 +1236,7 @@ int pthread_barrier_wait(pthread_barrier_t *barrier); This function synchronizes the threads waiting in front of the barrier and called by each thread. If the number of queue waiting threads is not 0, count will be decremented by 1. If the count is 0, indicating that all threads have reached the railing. All arriving threads will be woken up and re-entered into the ready state to participate in system scheduling. If count is not 0 after the decrease, it indicates that there is still threads that do not reach the barrier, and the calling thread will block until all threads reach the barrier. -### Example Code for Barrier +## Example Code for Barrier This program will create 3 threads, initialize a barrier, and the barrier waits for 3 threads. 3 threads will call pthread_barrier_wait() to wait in front of the barrier. When all 3 threads are arrived, 3 threads will enter the ready state. The output count information is printed every 2 seconds. @@ -1335,7 +1335,7 @@ int rt_application_init() } ``` -## Semaphore +# Semaphore Semaphores can be used for communication between processes and processes, or between in-process threads. Each semaphore has a semaphore value that is not less than 0, corresponding to the available amount of semaphore. Call sem_init() or sem_open() to assign an initial value to the semaphore . Call sem_post() to increment the semaphore value by 1. Call sem_wait() to decrement the semaphore value by 1. If the current semaphore is 0, call sem_wait(), the thread will suspended on the wait queue for this semaphore until the semaphore value is greater than 0 and is available. @@ -1353,7 +1353,7 @@ POSIX semaphores are also divided into named semaphores and unnamed semaphores: The POSIX semaphore of the RT-Thread operating system is mainly based on a package of RT-Thread kernel semaphores, mainly used for communication between threads in the system. It is used in the same way as the semaphore of the RT-Thread kernel. -### Semaphore Control Block +## Semaphore Control Block Each semaphore corresponds to a semaphore control block. Before creating a semaphore, you need to define a sem_t semaphore control block. Sem_t is a redefinition of the posix_sem structure type, defined in the semaphore.h header file. @@ -1380,11 +1380,11 @@ typedef struct rt_semaphore* rt_sem_t; ``` -### Unnamed semaphore +## Unnamed semaphore The value of an unnamed semaphore is stored in memory and is generally used for inter-thread synchronization or mutual exclusion. Before using it, you must first call sem_init() to initialize it. -#### Initialize the unnamed semaphore +### Initialize the unnamed semaphore ``` c int sem_init(sem_t *sem, int pshared, unsigned int value); @@ -1401,7 +1401,7 @@ int sem_init(sem_t *sem, int pshared, unsigned int value); This function initializes an unnamed semaphore sem, initializes the semaphore related data structure according to the given or default parameters, and puts the semaphore into the semaphore list. The semaphore value after initialization is the given initial value. This function is a wrapper of the rt_sem_create() function. -#### Destroy Unnamed Semaphore +### Destroy Unnamed Semaphore ``` c int sem_destroy(sem_t *sem); @@ -1416,11 +1416,11 @@ int sem_destroy(sem_t *sem); This function destroys an unnamed semaphore sem and releases the resources occupied by the semaphore. -### Named Semaphore +## Named Semaphore A named semaphore whose value is stored in a file and is generally used for inter-process synchronization or mutual exclusion. Two processes can operate on named semaphores of the same name. The well-known semaphore implementation in the RT-Thread operating system is similar to the unnamed semaphore. It is designed for communication between threads and is similar in usage. -#### Create or Open a Named Semaphore +### Create or Open a Named Semaphore ``` c sem_t *sem_open(const char *name, int oflag, ...); @@ -1436,7 +1436,7 @@ sem_t *sem_open(const char *name, int oflag, ...); This function creates a new semaphore based on the semaphore name or opens an existing semaphore. The optional values for Oflag are `0`, `O_CREAT` or `O_CREAT|O_EXCL`. If Oflag is set to `O_CREAT` , a new semaphore is created. If Oflag sets to `O_CREAT|O_EXCL`, it returns NULL if the semaphore already exists, and creates a new semaphore if it does not exist. If Oflag is set to 0, a semaphore does not exist and NULL is returned. -#### Detach the Named Semaphore +### Detach the Named Semaphore ``` c int sem_unlink(const char *name); @@ -1451,7 +1451,7 @@ int sem_unlink(const char *name); This function looks up the semaphore based on the semaphore name, and marks the semaphore as a detached state if the semaphore is present. Then check the reference count. If the value is 0, the semaphore is deleted immediately. If the value is not 0, it will not be deleted until all threads holding the semaphore close the semaphore. -#### Close the Named Semaphore +### Close the Named Semaphore ``` c int sem_close(sem_t *sem); @@ -1466,7 +1466,7 @@ int sem_close(sem_t *sem); When a thread terminates,it closes the semaphore it occupies. Whether the thread terminates voluntarily or involuntarily, this closing operation is performed. This is equivalent to a reduction of 1 in the number of semaphores held. If the holding count is zero after subtracting 1 and the semaphore is in separated state, the `sem` semaphore will be deleted and the resources it occupies will be released. -### Obtain Semaphore Value +## Obtain Semaphore Value ``` c int sem_getvalue(sem_t *sem, int *sval); @@ -1482,7 +1482,7 @@ int sem_getvalue(sem_t *sem, int *sval); This function obtains the value of the semaphore and saves it in the memory pointed to by `sval` to know the amount of semaphore resources. -### Blocking Mode to Wait Semaphore +## Blocking Mode to Wait Semaphore ``` c int sem_wait(sem_t *sem); @@ -1497,7 +1497,7 @@ int sem_wait(sem_t *sem); The thread calls this function to get the semaphore, which is a wrapper of the `rt_sem_take(sem,RT_WAITING_FOREVER)` function. If the semaphore value is greater than zero, the semaphore is available, the thread gets the semaphore, and the semaphore value is decremented by one. If the semaphore value is equal to 0, indicating that the semaphore is not available, the thread is blocked and entering the suspended state and queued in a first-in, first-out manner until the semaphore is available. -### Non-blocking Mode to Wait Semaphore +## Non-blocking Mode to Wait Semaphore ``` c int sem_trywait(sem_t *sem); @@ -1512,7 +1512,7 @@ int sem_trywait(sem_t *sem); This function is a non-blocking version of the sem_wait() function and is a wrapper of the `rt_sem_take(sem,0)` function. When the semaphore is not available, the thread does not block, but returns directly. -### Specify the Blocking Time Waiting for the Semaphore +## Specify the Blocking Time Waiting for the Semaphore ``` c int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); @@ -1528,7 +1528,7 @@ int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); The difference between this function and `the sem_wait()` function is that if the semaphore is not available, the thread will block the duration of `abs_timeout`. After the timeout, the function returns -1, and the thread will be awakened from the blocking state to the ready state. -### Send Semaphore +## Send Semaphore ``` c int sem_post(sem_t *sem); @@ -1543,7 +1543,7 @@ int sem_post(sem_t *sem); This function will release a sem semaphore, which is a wrapper of the rt_sem_release() function. If the thread queue waiting for the semaphore is not empty, indicating that there are threads waiting for the semaphore, the first thread waiting for the semaphore will switch from the suspended state to the ready state, waiting for system scheduling. If no thread is waiting for the semaphore, the semaphore value will be incremented by one. -### Example Code for Unnamed Semaphore +## Example Code for Unnamed Semaphore A typical case of semaphore usage is the producer consumer model. A producer thread and a consumer thread operate on the same block of memory, the producer fills the shared memory, and the consumer reads the data from the shared memory. @@ -1662,7 +1662,7 @@ int rt_application_init() } ``` -## Message Queue +# Message Queue Message Queuing is another commonly used inter-thread communication method that accepts messages of unfixed length from threads or interrupt service routines and caches the messages in their own memory space. Other threads can also read the corresponding message from the message queue, and when the message queue is empty, the reader thread can be suspended. When a new message arrives, the suspended thread will be woken up to receive and process the message. @@ -1670,7 +1670,7 @@ The main operations of the message queue include: creating or opening by the fun POSIX message queue is mainly used for inter-process communication. The POSIX message queue of RT-Thread operating system is mainly based on a package of RT-Thread kernel message queue, mainly used for communication between threads in the system. It is used in the same way as the message queue of the RT-Thread kernel. -### Message Queue Control Block +## Message Queue Control Block Each message queue corresponds to a message queue control block. Before creating a message queue, you need to define a message queue control block. The message queue control block is defined in the mqueue.h header file. @@ -1685,7 +1685,7 @@ struct mqdes typedef struct mqdes* mqd_t; /* Message queue control block pointer type redefinition */ ``` -### Create or Open a Message Queue +## Create or Open a Message Queue ``` c mqd_t mq_open(const char *name, int oflag, ...); @@ -1701,7 +1701,7 @@ mqd_t mq_open(const char *name, int oflag, ...); This function creates a new message queue or opens an existing message queue based on the name of the message queue. The optional values for Oflag are `0`, `O_CREAT` or `O_CREAT\|O_EXCL`. If Oflag is set to `O_CREAT` then a new message queue is created. If Oflag sets `O_CREAT\|O_EXCL`, it returns NULL if the message queue already exists, and creates a new message queue if it does not exist. If Oflag is set to `0`, the message queue does not exist and returns NULL. -### Detach Message Queue +## Detach Message Queue ``` c int mq_unlink(const char *name); @@ -1716,7 +1716,7 @@ int mq_unlink(const char *name); This function finds the message queue based on the message queue name name. If found, it sets the message queue to a detached state. If the hold count is 0, the message queue is deleted and the resources occupied by the message queue are released. -### Close the Message Queue +## Close the Message Queue ``` c int mq_close(mqd_t mqdes); @@ -1731,7 +1731,7 @@ int mq_close(mqd_t mqdes); When a thread terminates,it closes the message queue it occupies. Whether the thread terminates voluntarily or involuntarily, this closure is performed. This is equivalent to the message queue holding count minus 1. If the holding count is 0 after the minus 1 and the message queue is in the separated state, the `mqdes` message queue will be deleted and released the resources it occupies. -### Block Mode to Send a Message +## Block Mode to Send a Message ``` c int mq_send(mqd_t mqdes, @@ -1754,7 +1754,7 @@ This function is used to send a message to the `mqdes` message queue, which is a If the message queue is full, that is, the number of messages in the message queue is equal to the maximum number of messages, the thread that sent the message or the interrupt program will receive an error code (-RT_EFULL). -### Specify Blocking Time to Send a Message +## Specify Blocking Time to Send a Message ``` c int mq_timedsend(mqd_t mqdes, @@ -1777,7 +1777,7 @@ int mq_timedsend(mqd_t mqdes, Currently RT-Thread does not support sending messages with the specified blocking time, but the function interface has been implemented, which is equivalent to calling mq_send(). -### Blocking Mode to Receive Message +## Blocking Mode to Receive Message ``` c ssize_t mq_receive(mqd_t mqdes, @@ -1798,7 +1798,7 @@ ssize_t mq_receive(mqd_t mqdes, This function removes the oldest message from the `mqdes` message queue and puts the message in the memory pointed to by `msg_ptr`. If the message queue is empty, the thread that called the mq_receive() function will block until the message in the message queue is available. -### Specify Blocking Time to Receive Message +## Specify Blocking Time to Receive Message ``` c ssize_t mq_timedreceive(mqd_t mqdes, @@ -1821,7 +1821,7 @@ ssize_t mq_timedreceive(mqd_t mqdes, The difference between this function and the mq_receive() function is that if the message queue is empty, the thread will block the `abs_timeout` duration. After the timeout, the function will return `-1`, and the thread will be awakened from the blocking state to the ready state. -### Example Code for Message Queue +## Example Code for Message Queue This program creates 3 threads, thread2 accepts messages from the message queue, and thread2 and thread3 send messages to the message queue. @@ -1953,7 +1953,7 @@ int rt_application_init() } ``` -## Thread Advanced Programming +# Thread Advanced Programming This section provides a detailed introduction to some of the rarely used property objects and related functions. @@ -1976,7 +1976,7 @@ struct pthread_attr }; ``` -#### Thread Property Initialization and Deinitialization +## Thread Property Initialization and Deinitialization The thread property initialization and deinitialization functions are as follows: @@ -1995,7 +1995,7 @@ Using the pthread_attr_init() function initializes the thread attribute structur The pthread_attr_destroy() function deinitializes the property pointed to by `attr` and can then reinitialize this property object by calling the pthread_attr_init() function again. -#### Thread Detached State +## Thread Detached State Setting or getting the separation state of a thread is as follows. By default, the thread is non-separated. @@ -2015,7 +2015,7 @@ The thread separation state property value state can be `PTHREAD_CREATE_JOINABL` The detached state of a thread determines how a thread reclaims the resources it occupies after the end of its run. There are two types of thread separation: joinable or detached. When the thread is created, you should call pthread_join() or pthread_detach() to reclaim the resources occupied by the thread after it finishes running. If the thread's detached state is joinable, other threads can call the pthread_join() function to wait for the thread to finish and get the thread return value, and then reclaim the resources occupied by the thread. A thread with a detached state cannot be joined by another thread. Immediately after the end of its operation, the system resources are released. -#### Thread Scheduling Policy +## Thread Scheduling Policy Setting \ Obtaining thread scheduling policy function is as follows: @@ -2026,7 +2026,7 @@ int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy); Only the function interface is implemented. The default different priorities are based on priority scheduling, and the same priority time slice polling scheduling -#### Thread Scheduling Parameter +## Thread Scheduling Parameter Set / Obtain the thread's priority function as follows: @@ -2057,7 +2057,7 @@ struct sched_param The member `sched_paraority` of the `sched_param` controls the priority value of the thread. -#### Thread Stack Size +## Thread Stack Size Set / Obtain the stack size of a thread is as follows: @@ -2075,7 +2075,7 @@ int pthread_attr_getstacksize(pthread_attr_t const *attr, size_t *stack_size); The `pthread_attr_setstacksize()` function sets the stack size in bytes. Stack space address alignment is required on most systems (for example, the ARM architecture needs to be aligned to a 4-byte address). -#### Thread Stack Size and Address +## Thread Stack Size and Address Set / Obtain the stack address and stack size of a thread is as follows: @@ -2096,7 +2096,7 @@ int pthread_attr_getstack(pthread_attr_t const *attr, |**return**| —— | | 0 | Succeeded | -#### Thread Attribute Related Function +## Thread Attribute Related Function The function that sets / obtains the scope of the thread is as follows: @@ -2114,7 +2114,7 @@ int pthread_attr_getscope(pthread_attr_t const *attr); | EOPNOTSUPP | scope is PTHREAD_SCOPE_PROCESS | | EINVAL | scope is PTHREAD_SCOPE_SYSTEM | -#### Example Code for Thread Property +## Example Code for Thread Property This program will initialize 2 threads, they have a common entry function, but their entry parameters are not the same. The first thread created will use the provided `attr` thread attribute, and the other thread will use the system default attribute. Thread priority is a very important parameter, so this program will modify the first created thread to have a priority of 8, and the system default priority of 24. @@ -2178,11 +2178,11 @@ int rt_application_init() } ``` -### Thread Cancellation +## Thread Cancellation Cancellation is a mechanism that allows one thread to end other threads. A thread can send a cancel request to another thread. Depending on the settings, the target thread may ignore it and may end immediately or postpone it until the next cancellation point. -#### Send Cancellation Request +### Send Cancellation Request The cancellation request can be sent using the following function: @@ -2198,7 +2198,7 @@ int pthread_cancel(pthread_t thread); This function sends a cancel request to the `thread` thread. Whether the thread will respond to the cancellation request and when it responds depends on the state and type of thread cancellation. -#### Set Cancel Status +### Set Cancel Status The cancellation request can be set using the following function: @@ -2216,7 +2216,7 @@ int pthread_setcancelstate(int state, int *oldstate); This function sets the cancel state and is called by the thread itself. Canceling the enabled thread will react to the cancel request, and canceling the disabled thread will not react to the cancel request. -#### Set Cancellation Type +### Set Cancellation Type You can use the following function to set the cancellation type, which is called by the thread itself: @@ -2232,7 +2232,7 @@ int pthread_setcanceltype(int type, int *oldtype); | 0 | Succeeded | | EINVAL | state is neither PTHREAD_CANCEL_DEFFERED nor PTHREAD_CANCEL_ASYNCHRONOUS | -#### Set Cancellation Point +### Set Cancellation Point The cancellation point can be set using the following function: @@ -2242,7 +2242,7 @@ void pthread_testcancel(void); This function creates a cancellation point where the thread is called. Called primarily by a thread that does not contain a cancellation point, it can respond to a cancellation request. This function does not work if pthread_testcancel() is called while the cancel state is disabled. -#### Cancellation Point +### Cancellation Point The cancellation point is where the thread ends when it accepts the cancellation request. According to the POSIX standard, system calls that cause blocking, such as pthread_join(), pthread_testcancel(), pthread_cond_wait(), pthread_cond_timedwait(), and sem_wait(), are cancellation points. @@ -2282,7 +2282,7 @@ All cancellation points included in RT-Thread are as follows: - pthread_rwlock_wrlock() -#### Example Code for Thread Cancel +### Example Code for Thread Cancel This program creates 2 threads. After thread2 starts running, it sleeps for 8 seconds. Thread1 sets its own cancel state and type, and then prints the run count information in an infinite loop. After thread2 wakes up, it sends a cancel request to thread1, and thread1 ends the run immediately after receiving the cancel request. @@ -2356,7 +2356,7 @@ int rt_application_init() } ``` -### One-time Initialization +## One-time Initialization It can be initialized once using the following function: @@ -2373,7 +2373,7 @@ int pthread_once(pthread_once_t * once_control, void (*init_routine) (void)); Sometimes we need to initialize some variables only once. If we do multiple initialization procedures, it will get an error. In traditional sequential programming, one-time initialization is often managed by using Boolean variables. The control variable is statically initialized to 0, and any code that relies on initialization can test the variable. If the variable value is still 0, it can be initialized and then set the variable to 1. Codes that are checked later will skip initialization. -### Clean up after the Thread Ends +## Clean up after the Thread Ends The thread cleanup function interface: @@ -2390,9 +2390,9 @@ void pthread_cleanup_push(void (*routine)(void*), void *arg); pthread_cleanup_push() puts the specified cleanup `routine` into the thread's cleanup function list. pthread_cleanup_pop() takes the first function from the header of the cleanup function list. If `execute` is a non-zero value, then this function is executed. -### Other Thread Related Functions +## Other Thread Related Functions -#### Determine if two Threads are Equal +### Determine if two Threads are Equal ``` c int pthread_equal (pthread_t t1, pthread_t t2); @@ -2405,14 +2405,14 @@ int pthread_equal (pthread_t t1, pthread_t t2); | 0 | Not equal | | 1 | Equal | -#### Obtain Thread Handle +### Obtain Thread Handle ``` c pthread_t pthread_self (void); ``` pthread_self() returns the handle of the calling thread. -#### Get the Maximum and Minimum Priority +### Get the Maximum and Minimum Priority ``` c int sched_get_priority_min(int policy); @@ -2425,11 +2425,11 @@ int sched_get_priority_max(int policy); sched_get_priority_min() returns a value of 0, with the highest priority in RT-Thread and sched_get_priority_max() with the lowest priority. -### Mutex Attribute +## Mutex Attribute The mutex properties implemented by RT-Thread include the mutex type and the mutex scope. -#### Mutex Lock Attribute Initialization and Deinitialization +### Mutex Lock Attribute Initialization and Deinitialization ``` c int pthread_mutexattr_init(pthread_mutexattr_t *attr); @@ -2447,7 +2447,7 @@ The pthread_mutexattr_init() function initializes the property object pointed to The pthread_mutexattr_destroy() function will initialize the property object pointed to by `attr` and can be reinitialized by calling the pthread_mutexattr_init() function. -#### Mutex Lock Scope +### Mutex Lock Scope ``` c int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared); @@ -2462,7 +2462,7 @@ int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared); | 0 | Succeeded | | EINVAL | Invalid parameter | -#### Mutex Type +### Mutex Type ``` c int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type); @@ -2485,7 +2485,7 @@ The type of mutex determines how a thread behaves when it acquires a mutex. RT-T - **PTHREAD_MUTEX_ERRORCHECK**: Error checking lock, if a thread tries to regain the mutex without first releasing the mutex, an error is returned. This ensures that deadlocks do not occur when multiple locks are not allowed. -### Condition Variable Attribute +## Condition Variable Attribute Use the default value PTHREAD_PROCESS_PRIVATE to initialize the condition variable attribute attr to use the following function: @@ -2500,7 +2500,7 @@ int pthread_condattr_init(pthread_condattr_t *attr); | 0 | Succeeded | | EINVAL | Invalid parameter | -#### Obtain Condition Variable Scope +### Obtain Condition Variable Scope ``` c int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared); @@ -2513,9 +2513,9 @@ int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared); | 0 | Succeeded | | EINVAL | Invalid parameter | -### Read-write Lock Attribute +## Read-write Lock Attribute -#### Initialize Property +### Initialize Property ``` c int pthread_rwlockattr_init (pthread_rwlockattr_t *attr); @@ -2530,7 +2530,7 @@ int pthread_rwlockattr_init (pthread_rwlockattr_t *attr); This function initializes the read-write lock attribute `attr` with the default value PTHREAD_PROCESS_PRIVATE. -#### Obtain Scope +### Obtain Scope ``` c int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared); @@ -2546,9 +2546,9 @@ int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshare The memory pointed to by pshared is saved as PTHREAD_PROCESS_PRIVATE. -### Barrier Attribute +## Barrier Attribute -#### Initialize Property +### Initialize Property ``` c int pthread_barrierattr_init(pthread_barrierattr_t *attr); @@ -2563,7 +2563,7 @@ int pthread_barrierattr_init(pthread_barrierattr_t *attr); The modified function initializes the barrier attribute `attr` with the default value PTHREAD_PROCESS_PRIVATE. -#### Obtain Scope +### Obtain Scope ``` c int pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr, int *pshared); @@ -2577,7 +2577,7 @@ int pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr, int *pshar | 0 | Succeeded | |-1 | Invalid parameter | -### Message Queue Property +## Message Queue Property The message queue attribute control block is as follows: @@ -2590,7 +2590,7 @@ struct mq_attr long mq_curmsgs; /* Message queue current message number */ }; ``` -#### Obtain Attribute +### Obtain Attribute ``` c int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat); ``` diff --git a/documentation/run.sh b/documentation/run.sh new file mode 100755 index 00000000000..35959d680bb --- /dev/null +++ b/documentation/run.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +rm -rf ./html + +doxygen + +pushd html +python3 -m http.server \ No newline at end of file diff --git a/documentation/sal/sal.md b/documentation/sal/sal.md index 8e768f4f063..f2ee12c7a82 100644 --- a/documentation/sal/sal.md +++ b/documentation/sal/sal.md @@ -1,6 +1,6 @@ -# Socket Abstraction Layer: SAL +@page component_sal Socket Abstraction Layer: SAL -## SAL Introduction +# SAL Introduction In order to adapt to more network protocol stack types and avoid the system's dependence on a single network protocol stack, the RT-Thread system provides a SAL (Socket Abstraction Layer) components that implement different network protocol stacks or network implementations. The abstraction of the interface provides a set of standard BSD Socket APIs to the upper layer, so that developers only need to care about and use the network interface provided by the network application layer, without concern for the underlying specific network protocol stack type and implementation, which greatly improves the system's compatibility makes it easy for developers to complete protocol stack adaptation and network-related development. Main features of the SAL component are as follows: @@ -9,7 +9,7 @@ In order to adapt to more network protocol stack types and avoid the system's de - Support standard BSD Socket APIs; - Unified FD management for easy operation of network functions using read/write poll/select; -### SAL Network Framework +## SAL Network Framework The SAL network framework of RT-Thread is mainly shown in the following structure: @@ -25,14 +25,14 @@ The fourth part is the protocol stack layer, which includes several commonly use The network application layer of RT-thread provides interfaces mainly based on the standard BSD Socket API, which ensures that programs can be written on PC, debugged, and then ported to the RT-thread operating system. -### Working Principles +## Working Principles The working principle of SAL component is mainly divided into the following three parts: - Unified abstract functions of multi-protocol stack access and interface functions; - SAL TLS encryption transmission function; -#### Multi-Protocol Stack Access and Unified Abstract Function Of Interface Function +### Multi-Protocol Stack Access and Unified Abstract Function Of Interface Function For different protocol stacks or network function implementations, the names of network interfaces may be different. Take the `connect` connection function as an example. The interface name in the lwIP protocol stack is `lwip_connect`, and the interface name in the AT Socket network implementation is `at_connect`. The SAL component provides abstraction and unification of the interface of different protocol stacks or networks. When the socket is created, the component **judges the protocol stack or network function used by judging the incoming protocol domain type**, and completes the RT-Thread. @@ -46,8 +46,7 @@ The above is the definition of the socket creation function in the standard BSD For different software packages, the protocol domain type passed to the socket may be fixed and will not change depending on how the SAL component is accessed. **In order to dynamically adapt access to different protocol stacks or network implementations**, the SAL component provides two protocol domain type matching methods for each protocol stack or network implementation: **Primary protocol domain type and secondary protocol domain type**. When socket is created, it first determines whether the incoming protocol domain type has the supported primary protocol type. If it is, it uses the corresponding protocol stack or network implementation, if not, determine whether the subprotocol cluster type supports. The current system support protocol domain types are as follows: -1. - lwIP Protocol stack: family = AF_INET、sec_family = AF_INET +1. lwIP Protocol stack: family = AF_INET、sec_family = AF_INET 2. AT Socket Protocol stack: family = AF_AT、sec_family = AF_INET @@ -109,7 +108,7 @@ int lwip_connect(int socket, const struct sockaddr *name, socklen_t namelen) } ``` -#### SAL TLS Encrypted Transmission Function +### SAL TLS Encrypted Transmission Function **1. SAL TLS Feature** @@ -221,7 +220,7 @@ MSH_CMD_EXPORT(sal_tls_test, SAL TLS function test); #endif /* FINSH_USING_MSH */ ``` -### Configuration Options +## Configuration Options When we use the SAL component we need to define the following macro definition in rtconfig.h: @@ -251,7 +250,7 @@ RT-Thread Components ---> After the configuration is complete, you can use the `scons` command to regenerate the function and complete the addition of the SAL component. -## Initialization ## +# Initialization 配置开启 SAL 选项之后,需要在启动时对它进行初始化,开启 SAL 功能,如果程序中已经使用了组件自动初始化,则不再需要额外进行单独的初始化,否则需要在初始化任务中调用如下函数: @@ -262,11 +261,11 @@ int sal_init(void); The initialization function is mainly for initializing the SAL component, supporting the component to repeatedly initialize the judgment, and completing the initialization of the resource such as the mutex used in the component. There is no new thread created in the SAL component, which means that the SAL component resource is very small. Currently, the **SAL component resource is occupied by ROM 2.8K and RAM 0.6K**. -## BSD Socket API Introduction ## +# BSD Socket API Introduction The SAL component abstracts the standard BSD Socket API interface. The following is an introduction to common network interfaces: -### Create a Socket (socket) +## Create a Socket (socket) ``` c int socket(int domain, int type, int protocol); @@ -294,7 +293,7 @@ This function is used to assign a socket descriptor and the resources it USES ba - SOCK_DGRAM: Datagram socket - SOCK_RAW: Raw socket -### Bind Socket (bind) +## Bind Socket (bind) ```c int bind(int s, const struct sockaddr *name, socklen_t namelen); @@ -392,7 +391,7 @@ MSH_CMD_EXPORT(bing_test, bind network interface device test); #endif /* FINSH_USING_MSH */ ``` -### Listen Socket (listen) +## Listen Socket (listen) ```c int listen(int s, int backlog); @@ -408,7 +407,7 @@ int listen(int s, int backlog); This function is used by the TCP server to listen for a specified socket connection。 -### Accept Connection (accept) +## Accept Connection (accept) ```c int accept(int s, struct sockaddr *addr, socklen_t *addrlen); @@ -425,7 +424,7 @@ int accept(int s, struct sockaddr *addr, socklen_t *addrlen); When the application listens for connections from other hosts, the connection is initialized with the `accept()` function, and `accept()` creates a new socket for each connection and removes the connection from the listen queue. -### Establish Connection (connect) +## Establish Connection (connect) ```c int connect(int s, const struct sockaddr *name, socklen_t namelen); @@ -442,7 +441,7 @@ int connect(int s, const struct sockaddr *name, socklen_t namelen); This function is used to establish a connection to the specified socket. -### Send TCP Data (send) +## Send TCP Data (send) ```c int send(int s, const void *dataptr, size_t size, int flags); @@ -460,7 +459,7 @@ int send(int s, const void *dataptr, size_t size, int flags); This function is commonly used to send data over a TCP connection。 -### Receive TCP Data (recv) +## Receive TCP Data (recv) ```c int recv(int s, void *mem, size_t len, int flags); @@ -479,7 +478,7 @@ int recv(int s, void *mem, size_t len, int flags); This function is used to receive data over a TCP connection。 -### Send UDP Data (sendto) +## Send UDP Data (sendto) ```c int sendto(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen); @@ -499,7 +498,7 @@ int sendto(int s, const void *dataptr, size_t size, int flags, const struct sock This function is used for UDP connections to send data。 -### Receive UDP Data (recvfrom) +## Receive UDP Data (recvfrom) ```c int recvfrom(int s, void *mem, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); @@ -520,7 +519,7 @@ int recvfrom(int s, void *mem, size_t len, int flags, struct sockaddr *from, soc This function is used to receive data on a UDP connection。 -### Close Socket (closesocket) +## Close Socket (closesocket) ```c int closesocket(int s); @@ -535,7 +534,7 @@ int closesocket(int s); This function is used to close the connection and release the resource.。 -### Shutdown The Socket By Setting(shutdown) +## Shutdown The Socket By Setting(shutdown) ```c int shutdown(int s, int how); @@ -557,7 +556,7 @@ This function provides more permissions to control the closing process of the so - 1: Stop sending data and discard unsent data; - 2: Stop receiving and sending data。 -### Set Socket Options(setsockopt) +## Set Socket Options(setsockopt) ```c int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); @@ -588,7 +587,7 @@ This function is used to set the socket mode and modify the socket configuration - SO_RCVTIMEO:Set socket data reception timeout - SO_SNDTIMEO:Set socket data sending timeout -### Get Socket Options(getsockopt) +## Get Socket Options(getsockopt) ```c int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); @@ -607,7 +606,7 @@ int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); This function is used to get the socket configuration options。 -### Get Remote Address Information (getpeername) +## Get Remote Address Information (getpeername) ```c int getpeername(int s, struct sockaddr *name, socklen_t *namelen); @@ -624,7 +623,7 @@ int getpeername(int s, struct sockaddr *name, socklen_t *namelen); This function is used to get the remote address information associated with the socket。 -### Get Local Address Information (getsockname) +## Get Local Address Information (getsockname) ```c int getsockname(int s, struct sockaddr *name, socklen_t *namelen); @@ -641,7 +640,7 @@ int getsockname(int s, struct sockaddr *name, socklen_t *namelen); This function is used to get local socket address information。 -### Configure Socket Parameters (ioctlsocket)) +## Configure Socket Parameters (ioctlsocket)) ```c int ioctlsocket(int s, long cmd, void *arg); @@ -662,7 +661,7 @@ This function sets the socket control mode。 - FIONBIO: Turns on or off the socket's non-blocking mode. Arg parameter 1 is open non-blocking and 0 is closed non-blocking. -## Network Protocol Stack Access +# Network Protocol Stack Access Access to the network protocol stack or network function implementation is mainly to initialize and register the protocol cluster structure, and add it to the protocol cluster list in SAL component. The protocol cluster structure is defined as follows: diff --git a/documentation/scons/figures/scons.png b/documentation/scons/figures/scons_compile.png similarity index 100% rename from documentation/scons/figures/scons.png rename to documentation/scons/figures/scons_compile.png diff --git a/documentation/scons/scons.md b/documentation/scons/scons.md index d3956d67cc3..809d35e5d52 100644 --- a/documentation/scons/scons.md +++ b/documentation/scons/scons.md @@ -1,12 +1,12 @@ -# SCons +@page scons SCons -## Introduction to SCons +# Introduction to SCons SCons is an open source build system written in the Python language, similar to GNU Make. It uses a different approach than the usual Makefile, but instead uses SConstruct and SConscript files instead. These files are also Python scripts that can be written using standard Python syntax, so the Python standard library can be called in SConstruct, SConscript files for a variety of complex processing, not limited to the rules set by the Makefile. A detailed [SCons user manual](http://www.scons.org/doc/production/HTML/scons-user/index.html) can be found on the SCons website. This section describes the basic usage of SCons and how to use the SCons tool in RT-Thread. -### What is Construction Tool +## What is Construction Tool A software construction tool is a piece of software that compiles source code into an executable binary program according to certain rules or instructions. This is the most basic and important feature of building tools. In fact, these are not the only functions of construction tools. Usually these rules have a certain syntax and are organized into files. These files are used to control the behavior of the build tool, and you can do other things besides software building. @@ -14,13 +14,13 @@ The most popular build tool today is GNU Make. Many well-known open source softw Due to historical reasons, the syntax of the Makefile is confusing, which is not conducive to beginners. In addition, it is not convenient to use Make on the Windows platform, you need to install the Cygwin environment. To overcome the shortcomings of Make, other build tools have been developed, such as CMake and SCons. -### RT-Thread Construciton Tool +## RT-Thread Construciton Tool RT-Thread was built using Make/Makefile in the earlier stage. Starting from 0.3.x, the RT-Thread development team gradually introduced the SCons build system. The only goal of introducing SCons is to get everyone out of the complex Makefile configuration, IDE configuration, and focus on RT-Thread function development. Some may doubt the difference between the build tools described here and the IDE. The IDE completes the build through the operation of the graphical interface. Most IDEs generate script files like Makefile or SConscript based on the source code added by the user, and call the tools like Make or SCons to build the source code. -### Install SCons +## Install SCons It needs to be installed on the PC host before using the SCons system because it is written in the Python language, so you need to install the Python runtime environment before using SCons. @@ -30,13 +30,13 @@ In Linux and BSD environments, Python should already be installed by default, wh `sudo apt-get install scons` -## Basic Functions of SCons +# Basic Functions of SCons The RT-Thread build system supports multiple compilers, including ARM GCC, MDK, IAR, VisualStudio, and Visual DSP. The mainstream ARM Cortex M0, M3, M4 platforms, basically all support ARM GCC, MDK, IAR. Some BSPs may only support one compiler, and readers can read the currently supported compiler by reading the CROSS_TOOL option in rtconfig.py under the BSP directory. If it is a chip on the ARM platform, you can use the Env tool and enter the scons command to compile the BSP directly. At this time, the ARM GCC compiler is used by default because the Env tool comes with the ARM GCC compiler. Compile a BSP using the scons command as shown below, and the SCons will be based on this BSP. -![Compile BSP using scons](figures/scons.png) +![Compile BSP using scons](figures/scons_compile.png) If the user wants to use another compiler that the BSP already supports to compile the project, or if the BSP is a non-ARM platform chip, then you can't compile the project directly with the scons command. You need to install the corresponding compiler yourself and specify the compiler path to use. Before compiling the project, you can use the following two commands in the Env command line interface to specify the compiler path for the MDK and the compiler path to MDK. @@ -45,22 +45,22 @@ set RTT_CC=keil set RTT_EXEC_PATH=C:/Keilv5 ``` -### Commonly Used SCons Commands +## Commonly Used SCons Commands This section describes the SCons commands that are commonly used in RT-Thread. SCons not only completes basic compilation, but also generates MDK/IAR/VS projects. -#### scons +### scons Go to the BSP project directory to be compiled in the Env command line window, and then use this command to compile the project directly. If some source files are modified after executing the `scons` command, and the scons command is executed again, SCons will incrementally compile and compile only the modified source files and link them. `scons` can also be followed by a `-s` parameter, the command `scons -s`, which differs from the `scons` command in that it does not print specific internal commands. -#### scons -c +### scons -c Clear the compilation target. This command clears the temporary and target files generated when `scons` is executed. -#### scons --target=XXX +### scons --target=XXX If you use mdk/iar for project development, when you open or close some components, you need to use one of the following commands to regenerate the corresponding customized project, then compile and download in mdk/iar. @@ -85,17 +85,17 @@ This command can also be followed by a `-s` parameter, such as the command `sco > To generate a MDK or IAR project file, the prerequisite is that there is a project template file in the BSP directory, and then the scons will add relevant source code, header file search path, compilation parameters, link parameters, etc. according to the template file. As for which chip this project is for, it is directly specified by this engineering template file. So in most cases, this template file is an empty project file that is used to assist SCons in generating project.uvprojx or project.eww. -#### scons -jN +### scons -jN Multi-threaded compilation target, you can use this command to speed up compilation on multi-core computers. In general, a cpu core can support 2 threads. Use the `scons -j4` command on a dual-core machine. > If you just want to look at compilation errors or warnings, it's best not to use the -j parameter so that the error message won't be mixed with multiple files in parallel. -#### scons --dist +### scons --dist Build a project framework. Using this command will generate the `dist` directory in the BSP directory, this is the directory structure of the development project, including RT-Thread source code and BSP related projects, irrelevant BSP folder and libcpu will be removed, and you can freely copy this work to any directory. -#### scons --verbose +### scons --verbose By default, output compiled with the scons command does not display compilation parameters as follows: @@ -124,7 +124,7 @@ er\inc -ILibraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x -IF:\Project\git\rt-thre ... ``` -## SCons Advanced +# SCons Advanced SCons uses SConscript and SConstruct files to organize the source structure. Usually a project has only one SConstruct, but there will be multiple SConscripts. In general, an SConscript will be placed in each subdirectory where the source code is stored. @@ -132,29 +132,29 @@ In order to make RT-Thread better support multiple compilers and to easily adjus RT-Thread SConscript files are also present in most source folders. These files are "found" by the SConscript file in the BSP directory to add the source code corresponding to the macro defined in rtconfig.h to the compiler. The following article will take stm32f10x-HAL BSP as an example to explain how SCons builds the project. -### SCons Build-In Functions +## SCons Build-In Functions If you want to add some of your own source code to the SCons build environment, you can usually create or modify an existing SConscript file. The SConscript file can control the addition of source files and can specify the group of files (similar to the concept of Groups in IDEs such as MDK/IAR). SCons provides a lot of built-in functions to help us quickly add source code, and with these simple Python statements we can add or remove source code to our project. The following is a brief introduction to some common functions. -#### GetCurrentDir() +### GetCurrentDir() Get current directory. -#### Glob('\*.c') +### Glob('\*.c') Get all C files in the current directory. Modify the value of the parameter to match the suffix to match all files of the current directory. -#### GetDepend(macro) +### GetDepend(macro) This function is defined in the script file in the `tools` directory. It reads the configuration information from the rtconfig.h file with the macro name in rtconfig.h. This method (function) returns true if rtconfig.h has a macro turned on, otherwise it returns false. -#### Split(str) +### Split(str) Split the string str into a list list. -#### DefineGroup(name, src, depend,**parameters) +### DefineGroup(name, src, depend,**parameters) This is a method (function) of RT-Thread based on the SCons extension. DefineGroup is used to define a component. A component can be a directory (under a file or subdirectory) and a Group or folder in some subsequent IDE project files. @@ -176,7 +176,7 @@ parameters that could be added: | CPPDEFINES | Link parameter | | LIBRARY | Include this parameter, the object file generated by the component will be packaged into a library file | -#### SConscript(dirs,variant_dir,duplicate) +### SConscript(dirs,variant_dir,duplicate) Read the new SConscript file, and the parameter description of the SConscript() function is as follows: @@ -186,11 +186,11 @@ Read the new SConscript file, and the parameter description of the SConscript() | variant_dir | Specify the path to store the generated target file | | duiplicate | Set whether to copy or link the source file to variant_dir | -## SConscript Examples +# SConscript Examples Below we will use a few SConscript as an example to explain how to use the scons tool. -### SConscript Example 1 +## SConscript Example 1 Let's start with the SConcript file in the stm32f10x-HAL BSP directory. This file manages all the other SConscript files under the BSP, as shown below. @@ -218,7 +218,7 @@ Return('objs') With this SConscript file, the source code required by the BSP project is added to the compilation list. -### SConscript Example 2 +## SConscript Example 2 So what about stm32f10x-HAL BSP other SConcript files? Let's take a look at the SConcript file in the drivers directory, which will manage the source code under the drivers directory. The drivers directory is used to store the underlying driver code implemented by the driver framework provided by RT-Thread. @@ -274,7 +274,7 @@ The last line uses DefineGroup to create a group called Drivers, which correspon `CPPPATH =CPPPATH` means to add the current path to the system's header file path. The CPPPATH on the left is a built-in parameter in the DefineGroup that represents the header file path. The CPPPATH on the right is defined in the previous line of this document. This way we can reference the header files in the drivers directory in other source code. -### SConscript Example 3 +## SConscript Example 3 Let's take a look at the SConcript file in the applications directory, which will manage the source code under the applications directory for the user's own application code. @@ -298,7 +298,7 @@ The last line uses DefineGroup to create a group called `Applications`. The sour To sum up, this source program will add all c programs in the current directory to the group `Applications`, so if you add or delete files in this directory, you can add files to the project or delete them from the project. It is suitable for adding source files in batches. -### SConscript Example 4 +## SConscript Example 4 Below is the contents of the RT-Thread source code `component/finsh/SConscript` file, which will manage the source code under the finsh directory. @@ -359,11 +359,11 @@ Then add the finsh directory to the system header directory so that we can refer `LINKFLAGS = LINKFLAGS` has the same meaning as `CPPPATH = CPPPATH` . The LINKFLAGS on the left represents the link parameter, and the LINKFLAGS on the right is the value defined by the previous if else statement. That is, specify the link parameters for the project. -## Manage Projects with SCons +# Manage Projects with SCons The previous section on the SConscript related to the RT-Thread source code is explained in detail, you should also know some common ways to write SConscript files, this section will guide you how to use SCons to manage your own projects. -### Add App Code +## Add App Code As mentioned earlier, the Applications folder under BSP is used to store the user's own application code. Currently there is only one main.c file. If the user's application code is not a lot, it is recommended that the relevant source files be placed under this folder. Two simple files hello.c and hello.h have been added under the Applications folder, as shown below. @@ -394,7 +394,7 @@ MSH_CMD_EXPORT(hello_world, Hello world!) The SConcript file in the applications directory will add all source files in the current directory to the project. You need to use the `scons --target=xxx` command to add the 2 new files to your project. Note that the project will be regenerated each time a new file is added. -### Add Module +## Add Module As mentioned above, in the case that there are not many source code files, it is recommended that all source code files be placed in the applications folder. If the user has a lot of source code and wants to create your own project module, or need to use other modules that you have obtained, what would be appropriate? @@ -460,9 +460,9 @@ After saving the configuration, exit the configuration interface and open the rt Because the RT_USING_HELLO macro has been defined in rtconfig.h, the source file for hello.c is added to the new project when the project is newly built. -The above simply enumerates the configuration options for adding your own modules to the Kconfig file. Users can also refer to [*User Manual of Env*](../env/env.md), which also explains how to modify and add configuration options. They can also view the Kconfig documentation in your own Baidu to implement other more complex configuration options. +The above simply enumerates the configuration options for adding your own modules to the Kconfig file. Users can also refer to @ref env, which also explains how to modify and add configuration options. They can also view the Kconfig documentation in your own Baidu to implement other more complex configuration options. -### Add Library +## Add Library If you want to add an extra library to your project, you need to pay attention to the naming of the binary library by different toolchains. For example, the GCC toolchain, which recognizes library names such as `libabc.a`, specifies `abc` instead of `libabc` when specifying a library. So you need to pay special attention to the SConscript file when linking additional libraries. In addition, when specifying additional libraries, it is also a good idea to specify the corresponding library search path. Here is an example: @@ -482,7 +482,7 @@ group = DefineGroup('ABC', src, depend = [''], LIBS = LIBS, LIBPATH=LIBP LIBPATH specifies the path to the library, and LIBS specifies the name of the library. If the toolchain is GCC, the name of the library should be libabc.a; if the toolchain is armcc, the name of the library should be abc.lib.`LIBPATH = [cwd + '/libs']` indicates that the search path for the library is the 'libs' directory in the current directory. -### Compiler Options +## Compiler Options `rtconfig.py` is a RT-Thread standard compiler configuration file that controls most of the compilation options. It is a script file written in Python and is used to do the following: @@ -562,13 +562,13 @@ As mentioned earlier, if the user wants to compile the project with another comp Suppose a compiler is installed under `D:\Dir1\Dir2`. The following are the correct ways to write: -* EXEC_PATH = `r'D:\Dir1\Dir2'` Note that with the string `r` in front of the string, `“\”`can be used normally. +* EXEC_PATH = `r'D:\\Dir1\\Dir2'` Note that with the string `r` in front of the string, `“\”`can be used normally. * EXEC_PATH = `'D:/Dir1/Dir2'` Note that instead of `“/”`, there is no `r` in front. * EXEC_PATH = `'D:\\Dir1\\Dir2'` Note that the escapement of `“\”` s used here to escape `“\”` itself. -* This is the wrong way to write: EXEC_PATH = `'D:\Dir1\Dir2'`。 +* This is the wrong way to write: EXEC_PATH = `'D:\\Dir1\\Dir2'`。 If the rtconfig.py file has the following code, comment out the following code when configuring your own compiler. @@ -584,11 +584,11 @@ The above 2 `if` judgments will set CROSS_TOOL and EXEC_PATH to the default valu After the compiler is configured, we can use SCons to compile the BSP of RT-Thread. Open a command line window in the BSP directory and execute the `scons` command to start the compilation process. -### RT-Thread Auxiliary Compilation Script +## RT-Thread Auxiliary Compilation Script In the tools directory of the RT-Thread source code, there are some auxiliary compiled scripts defined by RT-Thread, such as the project files for automatically generating RT-Thread for some IDE. The most important of these is the building.py script. -### SCons Further Usage +## SCons Further Usage For a complex, large-scale system, it is obviously more than just a few files in a directory. It is probably a combination of several folders at the first level. diff --git a/documentation/thread-comm/thread-comm.md b/documentation/thread-comm/thread-comm.md index 758c8defa50..b65f225d565 100644 --- a/documentation/thread-comm/thread-comm.md +++ b/documentation/thread-comm/thread-comm.md @@ -1,16 +1,14 @@ -Inter-thread Communication -========== +@page thread_comm Inter-thread Communication In the last chapter, we talked about inter-thread synchronization, concepts such as semaphores, mutexes, and event sets were mentioned. Following the last chapter, this chapter is going to explain inter-thread communication. In bare-metal programming, global variables are often used for communication between functions. For example, some functions may change the value of a global variable due to some operations. Another function reads the global variable and will perform corresponding actions to achieve communication and collaboration according to the global variable values it read. More tools are available in RT-Thread to help pass information between different threads. These tools are covered in more detail in this chapter. After reading this chapter, you will learn how to use mailboxes, message queues, and signals for communication between threads. -Mailbox ----- +# Mailbox Mailbox service is a typical inter-thread communication method in real-time operating systems.For example, there are two threads, thread 1 detects the state of the button and sends it's state, and thread 2 reads the state of the button and turns on or off the LED according to the state of the button. Here, a mailbox can be used to communicate. Thread 1 sends the status of the button as an email to the mailbox. Thread 2 reads the message in the mailbox to get the button status and turn on or off the LED accordingly. Thread 1 here can also be extended to multiple threads. For example, there are three threads, thread 1 detects and sends the button state, thread 2 detects and sends the ADC information, and thread 3 performs different operations according to the type of information received. -### Mailbox Working Mechanism +## Mailbox Working Mechanism The mailbox of the RT-Thread operating system is used for inter-thread communication, which is characterized by low overhead and high efficiency. Each message in the mailbox can only hold a fixed 4 bytes(for a 32-bit processing system, the pointer is 4 bytes in size, so an email can hold only one pointer). A typical mailbox is also called message exchange. As shown in the following figure, a thread or an interrupt service routine sends a 4-byte message to a mailbox, and one or more threads can receive and process the message from the mailbox. @@ -22,7 +20,7 @@ When a thread sends a message to a mailbox, if the mailbox is not full, the mess When a thread receives a message from a mailbox, if the mailbox is empty, the thread receiving the message can choose whether to set a timeout or wait and suspend until a new message is received to be awaken. When the set timeout is up and the mailbox still hasn't received the message, the thread that chose to wait till timeout will be awaken and return -RT_ETIMEOUT. If there are messages in the mailbox, then the thread receiving the message will copy the 4-byte message in the mailbox to the receiving cache. -### Mailbox Control Block +## Mailbox Control Block In RT-Thread, the mailbox control block is a data structure used by the operating system to manage mailboxes, represented by the structure `struct rt_mailbox`. Another C expression, `rt_mailbox_t`, represents the handle of the mailbox, and the implementation in C language is a pointer to the mailbox control block. See the following code for a detailed definition of the mailbox control block structure: @@ -44,13 +42,13 @@ typedef struct rt_mailbox* rt_mailbox_t; The `rt_mailbox` object is derived from `rt_ipc_object` and is managed by the IPC container. -### Management of Mailbox +## Management of Mailbox The mailbox control block is a structure that contains important parameters related to mailbox and it plays an important role in the function implementation of the mailbox. The relevant interfaces of the mailbox are as shown in the following figure. The operation on a mailbox includes: create/initiate a mailbox, send a mail, receive a mail, and delete/detach a mailbox. ![Mailbox Related Interface](figures/07mb_ops.png) -#### Create and Delete Mailbox +### Create and Delete Mailbox To dynamically create a mailbox object, call the following function interface: @@ -87,7 +85,7 @@ Input parameters and return values of rt_mb_delete() |**Return**| —— | | RT_EOK | Successful | -#### Initialize and Detach Mailbox +### Initialize and Detach Mailbox Initializing a mailbox is similar to creating a mailbox, except that the mailbox initialized is for static mailbox objects. Different from creating a mailbox, the memory of a static mailbox object is allocated by the compiler during system compilation which is usually placed in a read-write data segment or an uninitialized data segment. The rest of the initialization is the same as the creation of a mailbox. The function interface is as follows: @@ -131,7 +129,7 @@ Input parameters and return values for rt_mb_detach() |**Return**| —— | | RT_EOK | Successful | -#### Send Mail +### Send Mail The thread or ISR can send mail to other threads through the mailbox. The function interface of sending mails is as follows: @@ -151,7 +149,7 @@ Input parameters and return values of rt_mb_send() | RT_EOK | Sent successfully | | \-RT_EFULL | The mailbox is filled | -#### Send Mails with Waiting +### Send Mails with Waiting Users can also send mails to specified mailbox through the following function interface: @@ -175,7 +173,7 @@ Input parameters and return values of rt_mb_send_wait() | \-RT_ETIMEOUT | Timeout | | \-RT_ERROR | Failed, return error | -#### Receive Mails +### Receive Mails Only when there is a mail in the mailbox, the recipient can receive the mail immediately and return RT_EOK. Otherwise, the thread receiving the message will suspend on the waiting thread queue of the mailbox or return directly according to the set timeout. The receiving mail function interface is as follows: @@ -197,7 +195,7 @@ Input parameters and return values of rt_mb_recv() | \-RT_ETIMEOUT | Timeout | | \-RT_ERROR | Failed, return error | -### Mail Usage Sample +## Mail Usage Sample This is a mailbox application routine that initializes 2 static threads, 1 static mailbox object, one of the threads sends mail to the mailbox, and one thread receives mail from the mailbox. As shown in the following code: @@ -339,7 +337,7 @@ thread1: get a mail from mailbox, the content:over The routine demonstrates how to use the mailbox. Thread 2 sends the mails, for a total of 11 times; thread 1 receives the mails, for a total of 11 mails, prints the contents of the mail, and determines end. -### Occasions to Use Mails +## Occasions to Use Mails Mailbox is a simple inter-thread messaging method, which is characterized by low overhead and high efficiency. In the implementation of the RT-Thread operating system, a 4-byte message can be delivered at a time, and the mailbox has certain storage capabilities, which can cache a certain number of messages (the number of messages is determined by the capacity specified when creating and initializing the mailbox). The maximum length of a message in a mailbox is 4 bytes, so the mailbox can be used for messages less than 4 bytes. Since on the 32 system, 4 bytes can be placed right on a pointer, when a larger message needs to be transferred between threads, a pointer pointing to a buffer can be sent as an mail to the mailbox, which means the mailbox can also delivery a pointer. For example, @@ -374,12 +372,11 @@ if (rt_mb_recv(mb, (rt_uint32_t*)&msg_ptr) == RT_EOK) } ``` -Message Queue --------- +# Message Queue Message Queuing is another commonly used inter-thread communication method, which is an extension of the mailbox. Can be used in a variety of occasions, like message exchange between threads, use the serial port to receive variable length data, etc. -### Message Queue Working Mechanism +## Message Queue Working Mechanism Message queue can receive messages with unfixed length from threads or ISR and cache messages in their own memory space. Other threads can also read the corresponding message from the message queue, and when the message queue is empty, the thread reading the messages can be suspended. When a new message arrives, the suspended thread will be awaken to receive and process the message. Message queue is an asynchronous way of communication. @@ -389,7 +386,7 @@ As shown in the following figure, a thread or interrupt service routine can put The message queue object of the RT-Thread operating system consists of multiple elements. When a message queue is created, it is assigned a message queue control block: name, memory buffer, message size, and queue length. At the same time, each message queue object contains multiple message boxes, and each message box can store one message. The first and last message boxes in the message queue are respectively called the message linked list header and the message linked list tail, corresponding to `msg_queue_head` and `msg_queue_tail` in the queue control block. Some message boxes may be empty, they form a linked list of idle message boxes via `msg_queue_free`. The total number of message boxes in all message queues is the length of the message queue, which can be specified when creating the message queue. -### Message Queue Control Block +## Message Queue Control Block In RT-Thread, a message queue control block is a data structure used by the operating system to manage message queues, represented by the structure `struct rt_messagequeue`. Another C expression, `rt_mq_t`, represents the handle of the message queue. The implementation in C language is a pointer to the message queue control block. See the following code for a detailed definition of the message queue control block structure: @@ -414,13 +411,13 @@ typedef struct rt_messagequeue* rt_mq_t; rt_messagequeue object is derived from rt_ipc_object and is managed by the IPC container. -### Management of Message Queue +## Management of Message Queue The message queue control block is a structure that contains important parameters related to the message queue and plays an important role in the implementation of functions of the message queue. The relevant interfaces of the message queue are shown in the figure below. Operations on a message queue include: create a message queue - send a message - receive a message - delete a message queue. ![Message Queue Related Interfaces](figures/07msg_ops.png) -#### Create and Delete Message Queue +### Create and Delete Message Queue The message queue should be created before it is used, or the existing static message queue objects should be initialized. The function interface for creating the message queue is as follows: @@ -460,7 +457,7 @@ Input parameters and return values of rt_mq_delete() |**Return**| —— | | RT_EOK | Successful | -#### Initialize and Detach Message Queue +### Initialize and Detach Message Queue Initializing a static message queue object is similar to creating a message queue object, except that the memory of a static message queue object is allocated by the compiler during system compilation and is typically placed in a read data segment or an uninitialized data segment. Initialization is required before using such static message queue objects. The function interface for initializing a message queue object is as follows: @@ -501,7 +498,7 @@ Input parameters and return values for rt_mq_detach() |**Return**| —— | | RT_EOK | Successful | -#### Send Message +### Send Message A thread or ISR can send a message to the message queue. When sending a message, the message queue object first takes an idle message block from the idle message list, then copies the content of the message sent by the thread or the interrupt service program to the message block, and then suspends the message block to the end of the message queue. The sender can successfully send a message if and only if there is an idle message block available on the idle message list; when there is no message block available on the idle message list, it means that the message queue is full, at this time, the thread or interrupt program that sent the message will receive an error code (-RT_EFULL). The function interface for sending messages is as follows: @@ -523,7 +520,7 @@ Input parameters and return values of rt_mq_send() | \-RT_EFULL | Message queue is full | | \-RT_ERROR | Failed, indicating that the length of the sent message is greater than the maximum length of the message in the message queue. | -#### Send an Emergency Message +### Send an Emergency Message The process of sending an emergency message is almost the same as sending a message. The only difference is that when an emergency message is sent, the message block taken from the idle message list is not put in the end of the message queue, but the head of the queue. The recipient can receive the emergency message preferentially, so that the message can be processed in time. The function interface for sending an emergency message is as follows: @@ -545,7 +542,7 @@ Input parameters and return values of rt_mq_urgent() | \-RT_EFULL | Message queue is full | | \-RT_ERROR | Fail | -#### Receive Message +### Receive Message Only when there is a message in the message queue, can the receiver receive message, otherwise the receiver will set according to the timeout, or suspend on the waiting queue of the message queue, or return directly. The function interface to receive message is as follows: @@ -569,7 +566,7 @@ Input parameters and return values of rt_mq_recv() | \-RT_ETIMEOUT | Timeout | | \-RT_ERROR | Fail, return error | -### Message Queue Application Example +## Message Queue Application Example This is a message queue application routine. Two static threads are initialized in the routine, one thread will receive messages from the message queue; and another thread will periodically send regular messages and emergency messages to the message queue, as shown in the following code: @@ -745,11 +742,11 @@ thread1: detach mq The routine demonstrates how to use message queue. Thread 1 receives messages from the message queue; thread 2 periodically sends regular and emergency messages to the message queue. Since the message "I" that thread 2 sent is an emergency message, it will be inserted directly into the front of the message queue. So after receiving the message "B", thread 1 receives the emergency message and then receives the message "C". -### Occasions to Use Message Queue +## Occasions to Use Message Queue Message Queue can be used where occasional long messages are sent, including exchanging message between threads and threads and sending message to threads in interrupt service routines (interrupt service routines cannot receive messages). The following sections describe the use of message queues from two perspectives, sending messages and synchronizing messages. -#### Sending Messages +### Sending Messages The obvious difference between message queue and mailbox is that the length of the message is not limited to 4 bytes. In addition, message queue also includes a function interface for sending emergency messages. But when you create a message queue with a maximum length of 4 bytes for all messages, the message queue object will be reduced to a mailbox. This unrestricted message is also reflected in the case of code writing which is also a mailbox-like code: @@ -793,7 +790,7 @@ void message_handler() Because message queue is a direct copy of data content, so in the above example, local structure is used to save the message structure, which eliminates the trouble of dynamic memory allocation (and no need to worry, because message memory space has already been released when the thread receives the message). -#### Synchronizing Messages +### Synchronizing Messages In general system designs, the problem of sending synchronous messages is often encountered. At this time, corresponding implementations can be selected according to the state of the time: two threads can be implemented in the form of [message queue + semaphore or mailbox]. The thread sending messages sends the corresponding message to the message queue in the form of message sending. After the message is sent, it is hoping to receive the confirmation from the threads receiving messages. The working diagram is as shown below: @@ -817,12 +814,11 @@ struct msg The first type of message uses a mailbox as a confirmation flag, while the second type of message uses a semaphore as a confirmation flag. The mailbox is used as a confirmation flag, which means that the receiving thread can notify some status values to the thread sending messages; and the semaphore is used as a confirmation flag that can only notify the thread sending messages in a single way, and the message has been confirmed to be received. -Signal ----- +# Signal A signal (also known as a soft interrupt signal), from a software perspective, is a simulation of interrupt mechanism. When it comes to its principle, thread receiving a signal is similar to processor receiving an interrupt request. -### Signal Working Mechanism +## Signal Working Mechanism Signals are used for asynchronous communication in RT-Thread. The POSIX standard defines that sigset_t type defines a signal set. However, the sigset_t type may be defined differently in different systems. In RT-Thread, sigset_t is defined as unsigned long and named rt_sigset_t, the signals that the application can use are SIGUSR1(10) and SIGUSR2(12). @@ -842,13 +838,13 @@ As shown in the following figure, suppose that thread 1 needs to process the sig When the signal is passed to thread 1, if it is suspended, it will be switched to ready to process the corresponding signal. If it is running, it will create a new stack frame space on its current thread stack to process the corresponding signal. It should be noted that the thread stack size used will also increase accordingly. -### Management of Signals +## Management of Signals Operations on signals include: install signal, block signal, unblock signal, send signal, and wait for signal. The interfaces of the signal are shown in the following figure: ![Signal Related Interface](figures/07signal_ops.png) -#### Install Signal +### Install Signal If the thread is to process a signal, then the signal needs to be installed in the thread. Signal installation is primarily used to determine the mapping relation between the signal value and the actions of the thread on that signal value, that is what signal is to be processed, what actions will be taken when the signal is passed to the thread. See the following code for a detailed definition: @@ -876,7 +872,7 @@ Setting the handler parameter during signal installation determines the differen 3) The parameter is set to SIG_DFL, and the system will call the default function _signal_default_handler() to process. -#### Block Signal +### Block Signal Blocking signal can also be understood as shielding signals. If the signal is blocked, the signal will not be delivered to the thread that installed the signal and will not cause soft interrupt processing. Call rt_signal_mask() to block the signal: @@ -892,7 +888,7 @@ rt_signal_mask() function parameters |----------|----------| | signo | Signal value | -#### Unblock Signal +### Unblock Signal Several signals can be installed in the thread. Using this function can give some "attention" to some of the signals, then sending these signals will cause a soft interrupt for the thread. Calling rt_signal_unmask() to unblock the signal: @@ -908,7 +904,7 @@ rt_signal_unmask() function parameters |----------|----------| | signo | Signal value | -#### Send Signals +### Send Signals When we need to process abnormality, a signal can be sent to the thread that has been set to process abnormality. Call rt_thread_kill() to send a signal to any thread: @@ -928,7 +924,7 @@ Input parameters and return values for rt_thread_kill() | RT_EOK | Sent successfully | | \-RT_EINVAL | Parameter error | -#### Wait for Signal +### Wait for Signal Wait for the arrival of the set signal. If this signal did not arrive, suspend the thread until the signal arrival or the wait until time exceeds the specified timeout. If the signal arrived, the pointer pointing to the signal body is stored in si, as follows is the function to wait for signal. @@ -951,7 +947,7 @@ Input parameters and return values for rt_signal_wait() | \-RT_ETIMEOUT | Timeout | | \-RT_EINVAL | Parameter error | -### Signal Application Example +## Signal Application Example This is a signal application routine, as shown in the following code. This routine creates one thread. When the signal is installed, the signal processing mode is set to custom processing. The processing function of the signal is defined to be thread1_signal_handler(). After the thread is running and the signal is installed, a signal is sent to this thread. This thread will receive the signal and print the message. diff --git a/documentation/thread-sync/thread-sync.md b/documentation/thread-sync/thread-sync.md index 9a6196c22d6..3d101eb38cb 100644 --- a/documentation/thread-sync/thread-sync.md +++ b/documentation/thread-sync/thread-sync.md @@ -1,4 +1,4 @@ -# Inter-thread Synchronization +@page thread_sync Inter-thread Synchronization In a multi-threaded real-time system, the completion of a task can often be accomplished through coordination of multiple threads, so how do these multiple threads collaborate well with each other to perform without errors? Here is an example. @@ -22,8 +22,7 @@ There are many ways to synchronize threads. The core idea is that **only one (or This chapter introduces several synchronization methods: **semaphores,** **mutex**, and **event**. After learning this chapter, you will learn how to use semaphores, mutex, and event to synchronize threads. -Semaphores ------- +# Semaphores Take parking lot as an example to understand the concept of semaphore: @@ -35,7 +34,7 @@ Take parking lot as an example to understand the concept of semaphore: In this example, the administrator is equivalent to the semaphore. The number of empty parking spaces that the administrator is in charge of is the value of the semaphore (non-negative, dynamic change); the parking space is equivalent to the common resource (critical section), and the cars are equivalent to the threads. Cars access the parking spaces by obtaining permission from the administrator, which is similar to thread accessing public resource by obtaining the semaphore. -### Semaphore Working Mechanism +## Semaphore Working Mechanism Semaphore is a light-duty kernel object that can solve the problems of synchronization between threads. By obtaining or releasing semaphore, a thread can achieve synchronization or mutual exclusion. @@ -43,7 +42,7 @@ Schematic diagram of semaphore is shown in the figure below. Each semaphore obje ![Schematic Diagram of Semaphore](figures/06sem_work.png) -### Semaphore Control Block +## Semaphore Control Block In RT-Thread, semaphore control block is a data structure used by the operating system to manage semaphores, represented by struct rt rt_semaphore. Another C expression is rt_sem_t, which represents the handle of the semaphore, and the implementation in C language is a pointer to the semaphore control block. The detailed definition of semaphore control block structure is as follows: @@ -59,13 +58,13 @@ typedef struct rt_semaphore* rt_sem_t; rt_semaphore object is derived from rt_ipc_object and is managed by the IPC container. The maximum semaphore is 65535. -### Semaphore Management +## Semaphore Management Semaphore control block contains important parameters related to the semaphore and acts as a link between various states of the semaphore. Interfaces related to semaphore are shown in the figure below. Operations on a semaphore includes: creating/initializing the semaphore, obtaining the semaphore, releasing the semaphore, and deleting/detaching the semaphore. ![Interfaces Related to Semaphore](figures/06sem_ops.png) -#### Create and Delete Semaphore +### Create and Delete Semaphore When creating a semaphore, the kernel first creates a semaphore control block, then performs basic initialization on the control block. The following function interface is used to create a semaphore: @@ -104,7 +103,7 @@ Input parameters and return values of rt_sem_delete() |**Return**| —— | | RT_EOK | Successfully deleted | -#### Initialize and Detach Semaphore +### Initialize and Detach Semaphore For a static semaphore object, its memory space is allocated by the compiler during compiling and placed on the read-write data segment or on the uninitialized data segment. In this case,rt_sem_create interface is no longer needed to create the semaphore to use it, just initialize it before using it. To initialize the semaphore object, use the following function interface: @@ -144,7 +143,7 @@ After using this function, the kernel wakes up all threads suspended in the sema |**Return**| —— | | RT_EOK | Successfully detached | -#### Obtain Semaphore +### Obtain Semaphore Thread obtains semaphore resource instances by obtaining semaphores. When the semaphore value is greater than zero, the thread will get the semaphore, and the corresponding semaphore value will be reduced by 1. The semaphore is obtained using the following function interface: @@ -165,7 +164,7 @@ When calling this function, if the value of the semaphore is zero, it means the | \-RT_ETIMEOUT | Did not received semaphore after timeout | | \-RT_ERROR | Other errors | -#### Obtain Semaphore without Waiting +### Obtain Semaphore without Waiting When user does not want to suspend thread on the applied semaphore and wait, the semaphore can be obtained using the wait-free mode , and the following function interface is used for obtaining the semaphore without waiting: @@ -184,7 +183,7 @@ This function has the same effect as rt_sem_take(sem, 0), which means when the | RT_EOK | Semaphore successfully obtained | | \-RT_ETIMEOUT | Semaphore obtainment failed | -#### Interrupt Service Routine +### Semaphore Release Semaphore is released to wake up the thread that suspends on the semaphore. To release the semaphore, use the following function interface: @@ -202,7 +201,7 @@ For example, when semaphore value is zero and a thread is waiting for this semap |**Return**| —— | | RT_EOK | Semaphore successfully released | -### Semaphore Application Sample +## Semaphore Application Sample This is a sample of semaphore usage routine. This routine creates a dynamic semaphore and initializes two threads, one thread sends the semaphore, and one thread receives the semaphore and performs the corresponding operations. As shown in the following code: @@ -548,23 +547,23 @@ This routine can be understood as the process of producers producing products an The producer generates 10 numbers in turn, and the consumers take them away in turn and sum the values of the 10 numbers. Semaphore lock protects array critical region resources, ensuring the exclusivity of number taking for the consumers each time and achieving inter-thread synchronization. -### Semaphore Usage Occasion +## Semaphore Usage Occasion Semaphores is a very flexible way to synchronize and can be used in a variety of situations, like forming locks, synchronization, resource counts, etc. It can also be conveniently used for synchronization between threads and threads, interrupts and threads. -#### Thread Synchronization +### Thread Synchronization Thread synchronization is one of the simplest types of semaphore applications. For example, using semaphores to synchronize between two threads, the value of the semaphore is initialized to 0, indicating that there are 0 semaphore resource instances; and the thread attempting to acquire the semaphore will wait directly on this semaphore. When the thread holding the semaphore completes the work it is processing, it will release this semaphore. Thread waiting on this semaphore can be awaken, and it can then perform the next part of the work. This occasion can also be seen as using the semaphore for the work completion flag: the thread holding the semaphore completes its own work, and then notifies the thread waiting for the semaphore to continue the next part of the work. -#### Lock +### Lock Locks, a single lock is often applied to multiple threads accessing the same shared resource (in other words, critical region). When semaphore is used as a lock, the semaphore resource instance should normally be initialized to 1, indicating that the system has one resource available by default. Because the semaphore value always varies between 1 and 0, so this type of lock is also called binary semaphore. As shown in the following figure, when a thread needs to access shared resource, it needs to obtain the resource lock first. When this thread successfully obtains the resource lock, other threads that intend to access the shared resource will suspend because they cannot obtain the resource. This is because it is already locked (semaphore value is 0) when other threads are trying to obtain the lock. When thread holding the semaphore is processed and exiting the critical region, it will release the semaphore and unlock the lock, and the first waiting thread that is suspending on the lock will be awaken to gain access to the critical region. ![Lock](figures/06sem_lock.png) -#### Interrupt Synchronization between Threads +### Interrupt Synchronization between Threads Semaphore can also be easily applied to interrupting synchronization between threads, such as an interrupt trigger. When interrupting service routine, thread needs to be notifies to perform corresponding data processing. At this time, the initial value of the semaphore can be set to 0. When the thread tries to hold this semaphore, since the initial value of the semaphore is 0, the thread will then suspends on this semaphore until the semaphore is released. When the interrupt is triggered, hardware-related actions are firstly performed, such as reading corresponding data from the hardware I/O port, and confirming the interrupt to clear interrupt source, and then releasing a semaphore to wake up the corresponding thread for subsequent data processing. For example, the processing of FinSH threads is as shown in the following figure. @@ -574,18 +573,17 @@ The value of the semaphore is initially 0. When the FinSH thread attempts to obt >The mutual exclusion between interrupts and threads cannot be done by means of semaphores (locks), but by means of switch interrupts. -#### Resource Count +### Resource Count Semaphore can also be considered as an incrementing or decrementing counter. It should be noted that the semaphore value is non-negative. For example, if the value of a semaphore is initialized to 5, then the semaphore can be reduced by a maximum of 5 consecutive times until the counter is reduced to zero. Resource count is suitable for occasions where the processing speeds between threads do not match. At this time, the semaphore can be counted as the number of completed tasks of the previous thread, and when dispatched to the next thread, it can also be used in a continuous manner handling multiple events each time. For example, in the producer and consumer problem, the producer can release the semaphore multiple times, and then the consumer can process multiple semaphore resources each time when dispatched. >Generally, resource count is mostly inter-thread synchronization in a hybrid mode, because there are still multiple accesses from threads for a single resource processing, which requires accessing and processing for a single resource, and operate lock mutex operation. -Mutex ------- +# Mutex Mutexes, also known as mutually exclusive semaphores, are a special binary semaphore. Mutex is similar to a parking lot with only one parking space: when one car enters, the parking lot gate is locked and other vehicles are waiting outside. When the car inside comes out, parking lot gate will open and the next car can enter. -### Mutex Working Mechanism +## Mutex Working Mechanism The difference between a mutex and a semaphore is that the thread with a mutex has ownership of the mutex, mutex supports recursive access and prevents thread priority from reversing; and mutex can only be released by the thread holding it, whereas semaphore can be released by any thread. @@ -603,7 +601,7 @@ In the RT-Thread operating system, mutex can solve the priority inversion proble >After the mutex is obtained, release the mutex as soon as possible. During the time when holding the mutex, you must not change the priority of the thread holding the mutex. -### Mutex Control Block +## Mutex Control Block In RT-Thread, mutex control block is a data structure used by the operating system to manage mutexes, represented by the struct rt rt_mutex. Another C expression, rt_mutex_t, represents the handle of the mutex, and the implementation in C language refers to the pointer of the mutex control block. See the following code for a detailed definition of the mutex control block structure: @@ -623,13 +621,13 @@ struct rt_mutex The rt_mutex object is derived from rt_ipc_object and is managed by the IPC container. -### Mutex Management +## Mutex Management The mutex control block contains important parameters related to mutex and it plays an important role in the implementation of the mutex function. The mutex-related interface is as shown in the following figure. The operation of a mutex includes: creating/initiating a mutex, obtaining a mutex, releasing a mutex, and deleting/detaching a mutex. ![Mutex Related Interface](figures/06mutex_ops.png) -#### Create and Delete Mutex +### Create and Delete Mutex When creating a mutex, the kernel first creates a mutex control block and then completes the initialization of the control block. Create a mutex using the following function interface: @@ -665,7 +663,7 @@ Input parameters and return values of rt_mutex_delete() |**Return**| —— | | RT_EOK | Deleted successfully | -#### Initialize and Detach Mutex +### Initialize and Detach Mutex The memory of a static mutex object is allocated by the compiler during system compilation, and is usually placed in a read-write data segment or an uninitialized data segment. Before using such static mutex objects, you need to initialize them first. To initialize the mutex, use the following function interface: @@ -701,7 +699,7 @@ Input parameters and return values for rt_mutex_detach() |**Return**| —— | | RT_EOK | Successful | -#### Obtain Mutex +### Obtain Mutex Once the thread obtains the mutex, the thread has ownership of the mutex, that is, a mutex can only be held by one thread at a time. To obtain the mutex, use the following function interface: @@ -722,7 +720,7 @@ Input parameters and return values of rt_mutex_take() | \-RT_ETIMEOUT | Timeout | | \-RT_ERROR | Failed to obtain | -#### Release Mutex +### Release Mutex When a thread completes the access to a mutually exclusive resource, it should release the mutex it occupies as soon as possible, so that other threads can obtain the mutex in time. To release the mutex, use the following function interface: @@ -740,7 +738,7 @@ Input parameters and return values of rt_mutex_release() |**Return**| —— | | RT_EOK | Success | -### Mutex Application Sample +## Mutex Application Sample This is a mutex application routine, and a mutex lock is a way to protect shared resources. When a thread has the mutex lock, it can protect shared resources from being destroyed by other threads. The following example can be used to illustrate. There are two threads: thread 1 and thread 2, thread 1 adds 1 to each of the two numbers; thread 2 also adds 1 to each of the two numbers. mutex is used to ensure that the operation of the thread changing the values of the 2 numbers is not interrupted. As shown in the following code: @@ -1003,7 +1001,7 @@ The routine demonstrates how to use the mutex. Thread 3 holds the mutex first, a >It is important to remember that mutexes cannot be used in interrupt service routines. -### Occasions to Use Mutex +## Occasions to Use Mutex The use of a mutex is relatively simple because it is a type of semaphore and it exists in the form of a lock. At the time of initialization, the mutex is always unlocked, and when it is held by the thread, it immediately becomes locked. Mutex is more suitable for: @@ -1011,8 +1009,7 @@ The use of a mutex is relatively simple because it is a type of semaphore and it (2) A situation in which priority inversion may occur due to multi-thread synchronization. -Event ------- +# Event Event set is also one of the mechanisms for synchronization between threads. An event set can contain multiple events. Event set can be used to complete one-to-many, many-to-many thread synchronization. Let's take taking bus as an example to illustrate event. There may be the following situations when waiting for a bus at a bus stop: @@ -1024,7 +1021,7 @@ Event set is also one of the mechanisms for synchronization between threads. An Here, P1 leaving for a certain place can be regarded as a thread, and “bus arrives at the bus stop” and “P2 arrives at the bus stop” are regarded as the occurrence of events. Situation ① is a specific event to wakes up the thread; situation ② is any single event to wake up the thread; situation ③ is when multiple events must occur simultaneously to wake up the thread. -### Event Set Working Mechanism +## Event Set Working Mechanism The event set is mainly used for synchronization between threads. Unlike the semaphore, it can achieve one-to-many, many-to-many synchronization. That is, the relationship between a thread and multiple events can be set as follows: any one of the events wakes up the thread, or several events wake up the thread for subsequent processing; likewise, the event can be multiple threads to synchronize multiple events. This collection of multiple events can be represented by a 32-bit unsigned integer variable, each bit of the variable representing an event, and the thread associates one or more events by "logical AND" or "logical OR" to form event combination. The "logical OR" of an event is also called independent synchronization, which means that the thread is synchronized with one of the events; the event "logical AND" is also called associative synchronization, which means that the thread is synchronized with several events. @@ -1042,7 +1039,7 @@ In RT-Thread, each thread has an event information tag with three attributes. Th As shown in the figure above, the first and 30th bits of the event flag of thread #1 are set. If the event information flag is set to logical AND, it means that thread #1 will be triggered to wake up only after both event 1 and event 30 occur. If the event information flag is set to logical OR, the occurrence of either event 1 or event 30 will trigger to wake up thread #1. If the message flag also sets the clear flag bit, this means event 1 and event 30 will be automatically cleared to zero when thread #1 wakes up, otherwise the event flag will still be present (set to 1). -### Event Set Control Block +## Event Set Control Block In RT-Thread, event set control block is a data structure used by the operating system to manage events, represented by the structure struct rt_event. Another C expression, rt_event_t, represents the handle of the event set, and the implementation in C language is a pointer to the event set control block. See the following code for a detailed definition of the event set control block structure: @@ -1060,13 +1057,13 @@ typedef struct rt_event* rt_event_t; rt_event object is derived from rt_ipc_object and is managed by the IPC container. -### Management of Event Sets +## Management of Event Sets Event set control block contains important parameters related to the event set and plays an important role in the implementation of the event set function. The event set related interfaces are as shown in the following figure. The operations on an event set include: create/initiate event sets, send events, receive events, and delete/detach event sets. ![Event Related Interface](figures/06event_ops.png) -#### Create and Delete Event Set +### Create and Delete Event Set When creating an event set, the kernel first creates an event set control block, and then performs basic initialization on the event set control block. The event set is created using the following function interface: @@ -1102,7 +1099,7 @@ Input parameters and return values of rt_event_delete() |**Return**| —— | | RT_EOK | Success | -#### Initialize and Detach Event Set +### Initialize and Detach Event Set The memory of a static event set object is allocated by the compiler during system compilation, and is usually placed in a read-write data segment or an uninitialized data segment. Before using a static event set object, you need to initialize it first. The initialization event set uses the following function interface: @@ -1138,7 +1135,7 @@ Input parameters and return values for rt_event_detach() |**Return**| —— | | RT_EOK | Success | -#### Send Event +### Send Event The send event function can send one or more events in the event set as follows: @@ -1157,7 +1154,7 @@ Input parameters and return values of rt_event_send() |**Return**| —— | | RT_EOK | Success | -#### Receive Event +### Receive Event The kernel uses a 32-bit unsigned integer to identify the event set, each bit represents an event, so an event set object can wait to receive 32 events at the same time, and the kernel can decide how to activate the thread by specifying the parameter "logical AND" or "logical OR". Using the "logical AND" parameter indicates that the thread is only activated when all waiting events occur, and using the "logical OR" parameter means that the thread is activated as soon as one waiting event occurs. To receive events, use the following function interface: @@ -1196,7 +1193,7 @@ RT_EVENT_FLAG_AND RT_EVENT_FLAG_CLEAR ``` -### Event Set Application Sample +## Event Set Application Sample This is the application routine for the event set, which initializes an event set, two threads. One thread waits for an event of interest to it, and another thread sends an event, as shown in code listing 6-5: @@ -1322,7 +1319,7 @@ thread1 leave. The routine demonstrates how to use the event set. Thread 1 receives events twice before and after, using the "logical OR" and "logical AND" respectively. -### Occasions to Use Event Set +## Occasions to Use Event Set Event sets can be used in a variety of situations, and it can replace semaphores to some extent for inter-thread synchronization. A thread or interrupt service routine sends an event to the event set object, and the waiting thread is awaken and the corresponding event is processed. However, unlike semaphore, the event transmission operation is not cumulative until the event is cleared, and the release actions of semaphore are cumulative. Another feature of the event is that the receiving thread can wait for multiple events, meaning multiple events correspond to one thread or multiple threads. At the same time, according to thread waiting parameters, you can choose between a "logical OR" trigger or a "logical AND" trigger. This feature is not available for semaphores, etc. The semaphore can only recognize a single release action, and cannot wait for multiple types of release at the same time. The following figure shows the multi-event receiving diagram: diff --git a/documentation/thread/thread.md b/documentation/thread/thread.md index 4c384cd747b..e7244faa812 100644 --- a/documentation/thread/thread.md +++ b/documentation/thread/thread.md @@ -1,5 +1,4 @@ -Thread Management -======================== +@page thread_management Thread Management When we are facing a big task in our daily life, we usually break it down into a number of simple, easy-to-manage smaller tasks. Then, we would deal with these smaller tasks one by one, gradually, the big task is worked out. In a multi-threaded operating system, developers also need to break down a complex application into multiple small, schedulable, and serialized program units. When tasks are reasonably divided and properly executed, this design allows the system to meet the capacity and time requirements of the real-time system. For example, to have the embedded system to perform such tasks, the system would collect data through sensors and display the data on the screen. In a multi-threaded real-time system, the task can be decomposed into two subtasks. The subtask, as shown in the following figure, reads the sensor data continuously and writes the data into the shared memory. The other subtask periodically reads the data from the shared memory and outputs the sensor data onto the screen. @@ -11,8 +10,7 @@ When a thread runs, it thinks it is has sole access to the CPU as it is running. This chapter will be divided into five sections to introduce thread management in RT-Thread. After reading this chapter, readers will have a deeper understanding of the thread management mechanism of RT-Thread. They will have clear answers to questions like what states does a thread have, how to create a thread, why do idle threads exist, etc. -Thread Management Features ------------------- +# Thread Management Features The main function of RT-Thread's thread management is to manage and schedule threads. There are two types of threads in the system, namely system threads and user threads. System threads are threads created by the RT-Thread kernel. User threads are the thread created by the application. Both types of threads will allocate thread objects from the kernel object container. When a thread is deleted, it will also be deleted from the object container. As shown in the following figure, each thread has important attributes, such as a thread control block, thread stack, entry function, and so on. @@ -26,10 +24,9 @@ If it is the interrupt service routine that makes the running condition ready fo When the scheduler schedules threads and switches them, the current thread context is first saved. When it is switched back to this thread, the scheduler restores the context information of the thread. -Working Mechanism of Thread --------------- +# Working Mechanism of Thread -### Thread Control Block +## Thread Control Block In RT-Thread, the thread control block is represented by structure `struct rt_thread`, which is a data structure used by the operating system to manage threads. It stores information about the thread, such as priority, thread name, thread status, etc. It also includes a linked list structure for connecting threads, event collection of thread waiting, etc., which is defined as follows: @@ -75,9 +72,9 @@ struct rt_thread `init_priority` is the thread priority specified when the thread was created, and will not be changed while the thread is running (unless the user executes the thread control function to manually adjust the thread priority). `cleanup` will be called back by the idle thread when the thread exits to perform the user-setup cleanup site and so on. The last member, `user_data`, can be used by the user to send some data into the thread control block to provide an implementation similar to thread private data. -### Thread Important Attributes +## Thread Important Attributes -#### Thread Stack +### Thread Stack RT-Thread's threads have a dependent stack. When the thread is switched, the context of the current thread is stored in the stack. When the thread is about to resume operation, the context information is read from the stack and recovered. @@ -91,7 +88,7 @@ The growth direction of the thread stack is closely related to the CPU architect When setting the size for thread stack, a larger thread stack can be designed for an MCU with a relatively large resource pool; or a larger stack can be set initially, for example, a size of 1K or 2K bytes, then in FinSH, use `list_thread` command to check the size of the stack used by the thread during the running of the thread. With this command, you can see the maximum stack depth used by the thread from the start of the thread to the current point in time, and then add the appropriate margin to form the final thread stack size, and finally modify the size of the stack space. -#### Thread State +### Thread State Only one thread is allowed to run on a processor at any time. Apart from the running process, threads have various different operating states, such as initial state, suspended state, ready state, etc. In RT-Thread, a thread can have five states, and the operating system would automatically adjust its state based on its running condition. @@ -105,19 +102,19 @@ The five states of a thread in RT-Thread are shown in the following table: | Suspended State | Also known as the blocking state. It may be suspended and paused because the resource is unavailable, or the thread is suspended because it is voluntarily delayed. In suspended state, threads do not participate in scheduling. In RT-Thread, the macro definition of this state is RT_THREAD_SUSPEND | | Closed State | It will be turned to closed state when the thread finishes running. The thread in closed state does not participate in the thread's scheduling. In RT-Thread, the macro definition of this state is RT_THREAD_CLOSE | -#### Thread Priority +### Thread Priority The priority of the RT-Thread thread indicates the thread's priority of being scheduled. Each thread has its priority. The more important the thread, the higher priority it should be given, resulting in a higher chance of being scheduled. RT-Thread supports a maximum of 256 thread priorities (0~255). The lower the number, the higher the priority, with 0 being the highest priority. In some systems with tight resources, you can choose system configurations that only support 8 or 32 priorities according to the actual situation; for the ARM Cortex-M series, 32 priorities are commonly used. The lowest priority is assigned to idle threads by default and is not used by users. In the system, when a thread with a higher priority is ready, the current thread with the lower priority will be swapped out immediately, and the high-priority thread will preempt the processor. -#### Time Slice +### Time Slice Each thread has a time slice parameter, but time slice is only valid for ready-state threads of the same priority. The system schedules the ready-state threads with the same priority using time slice rotation scheduling method. In this case, time slice plays the role of constraining thread's single running time and the unit is a system tick (OS Tick). Suppose there are 2 ready-state threads, A and B with the same priority. Time slice of A thread is set to 10, and time slice of B thread is set to 5. When there is no ready-state thread with higher priority than A in the system, the system will switch back and forth between thread A and B. Each time the system performs 10 OS Ticks on thread A, and 5 OS Ticks on thread B, as shown below. ![Same Priority Time Slice Round Robin](figures/04time_slience.png) -#### Thread Entry Function +### Thread Entry Function "Entry" in Thread Control Block is the thread's entry function, which is the thread's main function. The thread's entry function is created by the user. There are generally two forms of code: @@ -154,7 +151,7 @@ static void thread_entry(void* parameter) } ``` -#### Thread Error Code +### Thread Error Code Each thread is one execution scenario. Error codes are closely related to the execution environment, so each thread is equipped with a variable to store the error code. These error codes are as follows: @@ -172,7 +169,7 @@ Each thread is one execution scenario. Error codes are closely related to the ex #define RT_EINVAL 10 /* Invalid Parameter */ ``` -### Switching Thread State +## Switching Thread State RT-Thread provides a set of operating system call interfaces that make the state of a thread to switch back and forth between these five states. The conversion relationship between these states is shown in the following figure: @@ -184,11 +181,11 @@ If a thread in suspended state calls the functions `rt_thread_delete()` or `rt_t >In RT-Thread, a thread does not actually have a running state; the ready state and the running state are equivalent. -### System thread +## System thread As mentioned previously, system threads refers to threads created by the system and user threads are threads created by the user program calling the thread management interface. System threads In RT-Thread kernel include the idle thread and the main thread. -#### Idle Thread +### Idle Thread An idle thread is the lowest priority thread created by the system, and its thread state is always ready. When no other ready thread exists in the system, the scheduler will schedule the idle thread, which is usually an infinite loop and can never be suspended. In addition, idle threads have special functions in RT-Thread: @@ -196,14 +193,13 @@ If a thread finishes running, the system will automatically delete the thread by The idle thread also provides an interface to run a hook function set by the user. The hook function is called when idle thread is running, which is suitable for operations like hooking into power management, watchdog feeding, etc. -#### Main Thread +### Main Thread When the system starts, it will create the main thread. Its entry function is `main_thread_entry()`. User's application entry function `main()` starts from here. After the system scheduler starts, the main thread starts running. The process is as follows. Users can add their own application initialization code to the `main()` function. ![Main Thread Calling Process](figures/04main_thread.png) -Thread Management --------------- +# Thread Management The first two sections of this chapter conceptually explain the function and working mechanism of threads. This section will delve into the various interfaces of threads and give some source code to help the reader understand threads. @@ -211,7 +207,7 @@ The following figure depicts related operations to threads, including creating / ![Thread Related Operations](figures/04thread_ops.png) -### Create and Delete Thread +## Create and Delete Thread To become an executable object, a thread must be created by the kernel of the operating system. You can create a dynamic thread through the following interface: @@ -246,8 +242,6 @@ rt_err_t rt_thread_delete(rt_thread_t thread); After calling this function, the thread object will be moved out of the thread list and removed from the kernel object manager. Consequently, the stack space occupied by the thread will also be freed, and the reclaimed space will be reused for other memory allocations. In fact, using the `rt_thread_delete()` function to delete the thread interface is just changing the corresponding thread state to RT_THREAD_CLOSE state and then putting it into rt_thread_defunct queue; the actual delete action (releasing the thread control block and releasing the thread stack) needs to be completed later by an idle thread when it is being executed. -### Thread deletion - The parameters and return values of thread deleting `rt_thread_delete()` interface are shown in the following table: |**Parameter** |**Description** | @@ -259,7 +253,7 @@ The parameters and return values of thread deleting `rt_thread_delete()` interfa This function is only valid when the system dynamic heap is enabled (meaning RT_USING_HEAP macro definition is already defined). -### Initialize and Detach Thread +## Initialize and Detach Thread The initialization of a thread can be done using the following function interface, to initialize a static thread object: @@ -304,7 +298,7 @@ Parameters and return values of the thread detached from the interface `rt_threa This function interface corresponds to the `rt_thread_delete()` function. The object operated by the rt_thread_delete() function is the handle created by rt_thread_create(), and the object operated by the rt_thread_detach() function is the thread control block initialized with the rt_thread_init() function. Again, the thread itself should not call this interface to detach thread itself. -### Start Thread +## Start Thread The thread created (initialized) is in initial state and does not enter the scheduling queue of the ready thread. We can call the following function interface to make the thread enter the ready state after the thread is initialized/created successfully: @@ -321,7 +315,7 @@ When this function is called, the state of the thread is changed to the ready st | RT_EOK | Thread started successfully. | | \-RT_ERROR | Thread start failed. | -### Obtaining Current Thread +## Obtaining Current Thread During the running of the program, the same piece of code may be executed by multiple threads. At the time of execution, the currently executed thread handle can be obtained through the following function interface: @@ -336,7 +330,7 @@ The return value of this interface is shown in the following table: | thread | The currently running thread handle. | | RT_NULL | Failed, the scheduler has not started yet. | -### Making Thread Release Processor Resources +## Making Thread Release Processor Resources When the current thread's time slice runs out or the thread actively requests to release the processor resource, it will no longer occupy the processor, and the scheduler will select the next thread of the same priority to execute. After the thread calls this interface, the thread is still in the ready queue. The thread gives up the processor using the following function interface: @@ -348,7 +342,7 @@ After calling this function, the current thread first removes itself from its re The `rt_thread_yield()` function is similar to the `rt_schedule()` function, but the behavior of the system is completely different when other ready-state threads of the same priority exist. After executing the `rt_thread_yield()` function, the current thread is swapped out and the next ready thread of the same priority will be executed. After the `rt_schedule()` function is executed, the current thread is not necessarily swapped out. Even if it is swapped out, it will not be placed at the end of the ready thread list. Instead, the thread with the highest priority is selected in the system and executed. If there is no thread in the system with a higher priority than the current thread, the system will continue to execute the current thread after the `rt_schedule()` function is executed. -### Thread Sleep +## Thread Sleep In practical applications, we sometimes need to delay the current thread running for a period of time and re-run at a specified time. This is called "thread sleep". Thread sleep can use the following three function interfaces: @@ -365,7 +359,7 @@ These three function interfaces have the same effect. Calling them can cause the |**Return**| —— | | RT_EOK | Successful operation. | -### Suspend and Resume Thread +## Suspend and Resume Thread When a thread calls `rt_thread_delay()`, the thread will voluntarily suspend; when a function such as `rt_sem_take()`, `rt_mb_recv()` is called, the resource is not available for use and will cause the thread to suspend. A thread in a suspended state, if it waits for resources longer than the set time, then the thread will no longer wait for these resources and will return to the ready state; or, when other threads release the resource the thread is waiting for, the thread will also return to the ready state. @@ -403,7 +397,7 @@ The parameters and return values of the thread recovery interface `rt_thread_res | RT_EOK | Thread resumed successfully. | | \-RT_ERROR | Thread recovery failed because the state of the thread is not RT_THREAD_SUSPEND state | -### Control Thread +## Control Thread When you need other control over a thread, such as dynamically changing the priority of a thread, you can call the following function interface: @@ -430,7 +424,7 @@ Demands supported by control command demand cmd include: •RT_THREAD_CTRL_CLOSE:Close a thread, equivalent to the `rt_thread_delete()` function call. -### Set and Delete Idle Hooks +## Set and Delete Idle Hooks The idle hook function is a hook function of the idle thread. If the idle hook function is set, the idle hook function can be automatically executed to perform other things, such as the LED of system indicator , when the system executes the idle thread. The interface for setting/deleting idle hooks is as follows: @@ -459,7 +453,7 @@ Input parameters and return values of deleting the idle hook function `rt_thread >An idle thread is a thread whose state is always ready. Therefore, hook function must ensure that idle threads will not be suspended at any time. Functions like rt_thread_delay(), rt_sem_take(), etc can't be used because they may cause the thread to suspend. -### Set the Scheduler Hook +## Set the Scheduler Hook During the time when the system is running, it is in the process of thread running, interrupt triggering, responding to interrupts, switching to other threads, and switching between threads. In other words, context switching is the most common event in the system. Sometimes the user may want to know what kind of thread switch has occurred at times, you can set a corresponding hook function by calling the following function interface. This hook function will be called when the system thread switches: @@ -488,12 +482,11 @@ Input parameters for the scheduler hook function hook() are shown in the followi >Please carefully compile your hook function, any carelessness is likely to cause the entire system to run abnormally (in this hook function, it is basically not allowed to call the system API, and should not cause the current running context to suspend). -Thread Application Sample ------------- +# Thread Application Sample An application example in Keil simulator environment is given below. -### Create Thread Sample +## Create Thread Sample This sample is creating a dynamic thread and initializing a static thread. A thread is automatically deleted by the system after it has finished running. The other thread is always printing the counts, as follows: @@ -597,7 +590,7 @@ When thread 2 counts to a certain value, it will stop running. Then thread 2 is >About deleting threads: Most threads are executed cyclically without needing to be deleted. For thread that can finish running, RT-Thread automatically deletes the thread after the thread finishes running, and deletes it in rt_thread_exit(). User only needs to understand the role of the interface. It is not recommended to use this interface (this interface can be called by other threads or call this interface in the timer timeout function to delete a thread which is not used very often). -### Thread Time Slice Round-Robin Scheduling Sample +## Thread Time Slice Round-Robin Scheduling Sample This sample is creating two threads that will always print counts when executing, as follows: @@ -689,7 +682,7 @@ thread 2 is running ,thread 2 count = 205 As can be seen from the running count results, thread 2 runs half the time of thread 1. -### Thread Scheduler Hook Sample +## Thread Scheduler Hook Sample When thread is scheduling switch, it executes the schedule. We can set a scheduler hook so that we can do other things when the thread is being switched. This sample is printing switch information between the threads in the scheduler hook function, as shown in the following code. diff --git a/documentation/timer/timer.md b/documentation/timer/timer.md index 921719dd7e0..3004c7a3ad9 100644 --- a/documentation/timer/timer.md +++ b/documentation/timer/timer.md @@ -1,16 +1,14 @@ -Clock Management -======== +@page clock_management Clock & Timer Management The concept of time is very important. You need to set a time to go out with friends and it takes time to complete tasks. Life is inseparable from time. The same is true for operating systems, which require time to regulate the execution of their tasks. The smallest time unit in operating system is clock tick (OS Tick). This chapter focuses on introduction of clock ticks and clock-based timers. After reading this chapter, we will learn how clock ticks are generated and how to use RT-Thread timers. -Clock Tick(OS Tick) --------- +# Clock Tick(OS Tick) Any operating system needs to provide a clock tick for the system to handle all time-related events, such as thread latency, thread time slice rotation scheduling, timer timeout, etc. Clock tick is a specific periodic interrupt. This interrupt can be regarded as the system heartbeat. The time interval between interrupts depends on different applications, generally it is 1ms–100ms. The faster the clock tick rate, the greater the overhead of the system. The number of clock ticks counted from the start of the system is called the system time. In RT-Thread, the length of clock tick can be adjusted according to the value of RT_TICK_PER_SECOND, which is equal to 1/RT_TICK_PER_SECOND second. -### Clock Tick Implementation +## Clock Tick Implementation Clock tick is generated by a hardware timer configured in interrupt trigger mode. `void rt_tick_increase(void)` will be called when an interrupt occurs,notifying the operating system that a system clock has passed; different hardware driver have different timer interrupt implementations. Here is an example of using STM32 `SysTick_Handler` to achieve clock Tick. @@ -58,7 +56,7 @@ You can see that global variable rt_tick is incremented by one on every clock ti >In interrupt, rt_timer_check() is used to check the system hardware timer linked list. If there is a timer timeout, the corresponding timeout function will be called. All timers are removed from the timer linked list if it timed out, and periodic timer is added to the timer linked list when it is started again. -### Obtain Clock Tick +## Obtain Clock Tick Since global variable rt_tick is incremented by one on every clock tick, the value of the current rt_tick will be returned by calling `rt_tick_get`, which is the current clock tick value. This interface can be used to record the length of time a system is running, or to measure the time it takes for a task to run. The interface function is as follows: @@ -72,8 +70,7 @@ The following table describes the return values of `rt_tick_get()` function: |----------|----------------| | rt_tick | Current clock tick value | -Timer Management ----------- +# Timer Management Timer refers to triggering an event after a certain specified time from a specified moment, for example, setting a timer to wake up yourself the next morning. Timer includes hardware timer and software timer: @@ -83,7 +80,7 @@ Timer refers to triggering an event after a certain specified time from a specif RT-Thread operating system provides software-implemented timers in units of clock tick (OS Tick), that is, the timing value must be an integer multiple of OS Tick. For example, an OS Tick is 10ms, then the software timer can only be timed 10ms, 20ms, 100ms, etc., but not 15ms. RT-Thread timer is also based on the clock tick, providing timing capabilities based on integral multiples of the clock tick. -### RT-Thread Timer Introduction +## RT-Thread Timer Introduction RT-Thread timer provides two types of timer mechanisms: the first type is a one-shot timer, which only triggers a timer event for onetime after startup, and then the timer stops automatically. The second type is a periodic trigger timer, which periodically triggers a timer event until the user manually stops it, otherwise it will continue to execute forever. @@ -91,7 +88,7 @@ In addition, according to the context in which the timeout function is executed, ![Timer Context](figures/05timer_env.png) -#### HARD_TIMER Mode +### HARD_TIMER Mode The timer timeout function of HARD_TIMER mode is executed in the interrupt context and can be specified with the parameter RT_TIMER_FLAG_HARD_TIMER when initializing/creating the timer. @@ -99,11 +96,11 @@ When executed in interrupt context, the requirements for timeout function are th The default mode of RT-Thread timer is HARD_TIMER mode which means after the timer timeout, the timeout function runs in the context of the system clock interrupt. The execution mode in the interrupt context determines that the timer's timeout function should not call any system function that will cause the current context to suspend; nor can it be executing for a very long time, otherwise the response time of other interrupts will be lengthened or the running time of other threads will be preempted. -#### SOFT_TIMER Mode +### SOFT_TIMER Mode The SOFT_TIMER mode is configurable and macro definition RT_USING_TIMER_SOFT is used to determine whether the mode should be enabled. When this mode is enabled, the system will create a timer thread at initialization, and then the timer timeout function of SOFT_TIMER mode will be executed in the context of the timer thread. SOFT_TIMER mode can be specified using the parameter RT_TIMER_FLAG_SOFT_TIMER when initializing/creating the timer. -### Timer Working Mechanism +## Timer Working Mechanism The following is an example to illustrate the working mechanism of RT-Thread timer. Two important global variables are maintained in the RT-Thread timer module: @@ -121,7 +118,7 @@ If after system's 10 ticks (current rt_tick=30), a new task has created Timer4 ![Timer linked List Insertion Diagram](figures/05timer_linked_list2.png) -#### Timer Control Block +### Timer Control Block In RT-Thread operating system, timer control block is defined by structure `struct rt_timer` and forms a timer kernel object, which is then linked to the kernel object container for management. It is a data structure used by the operating system to manage timers. It stores information about timers, such as the initial number of ticks, the number of timeout ticks, the linked list structure used to connect timers, timeout callback functions, etc. @@ -141,7 +138,7 @@ typedef struct rt_timer *rt_timer_t; Timer control block is defined by structure `struct rt_timer` and forms a timer kernel object, which is then linked to the kernel object container for management. The `list` member is used to link an active (already started) timer to the `rt_timer_list` linked list. -#### Timer Skip List Algorithm +### Timer Skip List Algorithm In the introduction of working mechanics of the timer above, we have talked about that the newly created and activated timers are inserted into the rt_timer_list linked list in the order of the timeout, that is, rt_timer_list linked list is an ordered list. RT-Thread uses a skip list algorithm to speed up the search for linked list elements. @@ -161,7 +158,7 @@ In this structure, {3, 18, 77} is extracted as first-level index, so that the nu Therefore, the timer skip list can pass the index of the upper layer, reducing the number of comparisons during the search and improving the efficiency of the search. This is an algorithm of "space in exchange of time", macro definition RT_TIMER_SKIP_LIST_LEVEL is used to configure the number of layers in skip list. The default value is 1, which means that ordered linked list algorithm for first-order ordered list graph is used. Each additional one means that another level of index is added to the original list. -### Timer Management +## Timer Management RT-Thread timer is introduced in the previous sections and the working mechanism of the timer is conceptually explained. This section will go deep into the various interfaces of the timer to help the reader understand the RT-Thread timer at the code level. @@ -181,7 +178,7 @@ Timer control block contains important parameters related to the timer and acts ![Timer Related Operations](figures/05timer_ops.png) -#### Create and Delete Timer +### Create and Delete Timer When dynamically creating a timer, the following function interface can be used: @@ -236,7 +233,7 @@ Input parameters and return values of rt_timer_delete() |**Return**| —— | | RT_EOK | Deletion is successful (if the parameter timer handle is RT_NULL, it will result in an ASSERT assertion) | -#### Initialize and Detach Timer +### Initialize and Detach Timer When creating a timer statically , the timer can be initialized by using `rt_timer_init` interface. The function interface is as follows: @@ -277,7 +274,7 @@ Input parameters and return values for `rt_timer_detach()` |**Return **| —— | | RT_EOK | Successfully detached | -#### Start and Stop Timer +### Start and Stop Timer When the timer is created or initialized, it will not be started immediately. It will start after timer function interface is called. The timer function interface is started as follows: @@ -314,7 +311,7 @@ After the timer stop function interface is called, the timer state will change t | RT_EOK | Timer successfully stopped | | \- RT_ERROR | timer is in stopped state | -#### Control Timer +### Control Timer In addition to some of the programming interfaces provided above, RT-Thread additionally provides a timer control function interface to obtain or set more timer information. The control timer function interface is as follows: @@ -345,8 +342,7 @@ Commands supported by function parameters cmd: See "dynamic timer routine" for code that uses the timer control interface. -Timer Application Sample --------------- +# Timer Application Sample This is an example of creating a timer that creates two dynamic timers, one for one shot timing, another one for periodic timing and for the periodic timer to run for a while and then stop running, as shown below: @@ -498,8 +494,7 @@ periodic timer is timeout The timeout function of periodic timer1 runs once every 10 OS Ticks for 10 times (After 10 times rt_timer_stop is called to stop timer1); the timeout function of one-shot timer2 runs once on the 30th OS Tick. -High Precision Delay ----------- +# High Precision Delay The minimum precision of the RT-Thread timer is determined by the system clock tick (1 OS Tick = 1/RT_TICK_PER_SECOND second, RT_TICK_PER_SECOND value is defined in the rtconfig.h file), and the timer must be set to an integer multiple of the OS Tick. When it is necessary to implement system timing for a shorter time length. For example, the OS Tick is 10ms but the program needs to implement a timing or delay of 1ms. In this case, the operating system timer can't meet the requirements. This problem can be solved by reading the counter of a hardware timer of the system or using hardware timer directly. diff --git a/documentation/ulog/ulog.md b/documentation/ulog/ulog.md index 78d1e0a1d69..3b300f1fc7c 100644 --- a/documentation/ulog/ulog.md +++ b/documentation/ulog/ulog.md @@ -1,6 +1,6 @@ -# Ulog Log +@page component_ulog Ulog Log -## Ulog Introduction +# Ulog Introduction **Log definition**:The log is to output the status, process and other information of the software to different media (for example: file, console, display, etc.), display and save. Provide reference for software traceability, performance analysis, system monitoring, fault warning and other functions during software debugging and maintenance. It can be said that the use of logs consumes at least 80% of the software life cycle. @@ -26,7 +26,7 @@ Ulog is a very simple and easy to use C/C++ log component. The first letter u st * Compatible with `rtdbg` (RTT's early log header file) and EasyLogger's log output API. -### Ulog Architecture +## Ulog Architecture The following figure shows the ulog log component architecture diagram: @@ -38,7 +38,7 @@ The following figure shows the ulog log component architecture diagram: * **Back end**:After receiving the log frames sent from the core layer, the logs are output to the registered log backend devices, such as files, consoles, log servers, and so on. -### Configuration Options ### +## Configuration Options The path to configure ulog using menuconfig in the ENV tool is as follows: @@ -72,7 +72,7 @@ The path to configure ulog using menuconfig in the ENV tool is as follows: [ ] Enable thread information. /* Thread information */ ``` -### Log Level +## Log Level The log level represents the importance of the log, from high to low in ulog, with the following log levels: @@ -102,7 +102,7 @@ As can be seen from the above classification, the output level of the log can be Their scope of action is:**Global Static**>**Global Dynamics**>**Module Static**>**Module Dynamic**. -### Log Label +## Log Label Due to the increasing log output, in order to avoid the log being outputted indiscriminately, it is necessary to use a tag to classify each log. The definition of the label is in the form of **modular**, for example: Wi-Fi components include device driver (wifi_driver), device management (wifi_mgnt) and other modules, Wi-Fi component internal module can use `wifi.driver`, `wifi.mgnt` is used as a label to perform classified output of logs. @@ -120,9 +120,9 @@ Note that the definition log tag must be above `#include `, otherwise th The scope of the log tag is the current source file, and the project source code will usually be classified according to the module. Therefore, when defining a label, you can specify the module name and sub-module name as the label name. This is not only clear and intuitive when the log output is displayed, but also facilitates subsequent dynamic adjustment of the level or filtering by label. -## Log Initialization +# Log Initialization -### Initialization +## Initialization ```c int ulog_init(void) @@ -135,7 +135,7 @@ int ulog_init(void) This function must be called to complete ulog initialization before using ulog. This function will also be called automatically if component auto-initialization is turned on. -### Deinitialization +## Deinitialization ```c void ulog_deinit(void) @@ -143,7 +143,7 @@ void ulog_deinit(void) This deinit release resource can be executed when ulog is no longer used. -## Log Output API +# Log Output API Ulog mainly has two log output macro APIs, which are defined in the source code as follows: @@ -197,9 +197,9 @@ void show_string(const char *str) } ``` -## ULog Usage Example +# ULog Usage Example -### Example +## Example The following is a description of the ulog routine. Open `rt-thread\examples\ulog_example.c` and you can see that there are labels and static priorities defined at the top. @@ -233,7 +233,7 @@ The following will show the effect of the ulog routine on qemu: You can see that each log is displayed in rows, and different levels of logs have different colors. At the top of the log is the tick of the current system, with the log level and label displayed in the middle, and the specific log content at the end. These log formats and configuration instructions are also highlighted later in this article. -### Used in Interrupt ISR +## Used in Interrupt ISR Many times you need to output a log in the interrupt ISR, but the ISR may interrupt the thread that is doing the log output. To ensure that the interrupt log and the thread log do not interfere with each other, special handling must be performed for the interrupt condition. @@ -263,7 +263,7 @@ Here are the different strategies for interrupt logging in ulog in synchronous m **In asynchronous mode**:If the above situation occurs, the log in the interrupt will be put into the buffer first, and finally sent to the log output thread for processing together with the thread log. -### Set the Log Format +## Set the Log Format The log format supported by ulog can be configured in menuconfig, located in `RT-Thread Components` → `Utilities` → `ulog` → `log format`. The specific configuration is as follows: @@ -275,7 +275,7 @@ They can be configured separately: floating-point number support (traditional rt It can be seen that the time information has been changed from the tick value of the system to the timestamp information compared to the first run routine, and the thread information has also been output. -### Hexdump Output Using +## Hexdump Output Using Hexdump is also a more common function when logging output. hexdump can output a piece of data in hex format. The corresponding API is: `void ulog_hexdump(const char *tag, rt_size_t width, rt_uint8_t *buf, rt_size_t size)` , see below the specific use method and operation effect: @@ -297,13 +297,13 @@ You can copy the above code into the ulog routine, and then look at the actual r It can be seen that the middle is the hexadecimal information of the buf data, and the rightmost is the character information corresponding to each data. -## Log Advanced Features +# Log Advanced Features After understanding the introduction of the log in the previous section, the basic functions of ulog can be mastered. In order to let everyone better use ulog, this application note will focus on the advanced features of ulog and some experience and skills in log debugging. After learning these advanced uses, developers can also greatly improve the efficiency of log debugging. It also introduces the advanced mode of ulog: syslog mode, which is fully compatible with the Linux syslog from the front-end API to the log format, greatly facilitating the migration of software from Linux. -### Log Backend +## Log Backend ![Ulog framework](figures/ulog_framework_backend.png) @@ -311,7 +311,7 @@ Speaking of the backend, let's review the ulog's framework. As can be seen from Currently ulog has integrated the console backend, the traditional device that outputs `rt_kprintf` print logs. Ulog also supports the Flash backend, which seamlessly integrates with EasyFlash. See its package for details.([Click to view](https://github.com/armink-rtt-pkgs/ulog_easyflash_be))。Later ulog will also increase the implementation of backends such as file backends and network backends. Of course, if there are special needs, users can also implement the backend themselves. -#### Register Backend Device +### Register Backend Device ```c rt_err_t ulog_backend_register(ulog_backend_t backend, const char *name, rt_bool_t support_color) @@ -327,7 +327,7 @@ rt_err_t ulog_backend_register(ulog_backend_t backend, const char *name, rt_bool This function is used to register the backend device into the ulog, ensuring that the function members in the backend device structure are set before registration. -#### Logout Backend Device +### Logout Backend Device ```c rt_err_t ulog_backend_unregister(ulog_backend_t backend); @@ -341,7 +341,7 @@ rt_err_t ulog_backend_unregister(ulog_backend_t backend); This function is used to unregister a backend device that has already been registered. -#### Backend Implementation and Registration Examples +### Backend Implementation and Registration Examples The console backend is taken as an example to briefly introduce the implementation method and registration method of the backend. @@ -400,7 +400,7 @@ From the perspective of this structure, the requirements for implementing the ba * `flush` is also optional, and some internal output cached backends need to implement this interface. For example, some file systems with RAM cache. The flush of the backend is usually called by `ulog_flush` in the case of an exception such as assertion or hardfault. -### Asynchronous Log +## Asynchronous Log In ulog, the default output mode is synchronous mode, and in many scenarios users may also need asynchronous mode. When the user calls the log output API, the log is cached in the buffer, and the thread dedicated to the log output takes out the log and outputs it to the back end. @@ -420,7 +420,7 @@ The advantages and disadvantages of asynchronous mode are as follows: **Disadvantage**:First, the asynchronous mode requires a log buffer. Furthermore, the output of the asynchronous log needs to be completed by a special thread, such as an idle thread or a user-defined thread, which is slightly more complicated to use. The overall sense of asynchronous mode resource occupancy will be higher than the synchronous mode. -#### Configuration Option +### Configuration Option Use menuconfig in the Env tool to enter the ulog configuration options: @@ -444,7 +444,7 @@ When using the idle thread output, the implementation is simple, just call `rt_t * Because thread suspend operations are not allowed inside idle threads, backends such as Flash and networking may not be available based on idle threads. -#### Use Example +### Use Example Save the asynchronous output option configuration and copy `rt-thread\examples\ulog_example.c` to the `rt-thread\bsp\qemu-vexpress-a9\applications` folder. @@ -455,13 +455,13 @@ Enter the `ulog_example` command to see the results of the ulog routine. The app If you look carefully, you can see that after the asynchronous mode is turned on, the time information of these logs that are very close in code is almost the same. However, in synchronous mode, the log is output using the user thread. Since the log output takes a certain amount of time, there is a certain interval between each log. It also fully shows that the asynchronous log output is very efficient, and it takes almost no time for the caller. -### Log Dynamic Filter +## Log Dynamic Filter In the previous section, some static filtering functions have been introduced. Static filtering has its advantages such as saving resources, but in many cases, users need to dynamically adjust the filtering mode of the log while the software is running. This allows the dynamic filter function of ulog to be used. To use the dynamic filter feature, turn on the `Enable runtime log filter.` option in menuconfig, which is **turned off by default**. There are four types of dynamic filtering supported by ulog, and there are corresponding API functions and Finsh/MSH commands, which will be introduced one by one. -#### Filter by Module Level +### Filter by Module Level ```c int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) @@ -499,7 +499,7 @@ An example of a function call and command is as follows: | Open all logs of `wifi` module | `ulog_tag_lvl_filter_set("wifi", LOG_FILTER_LVL_ALL);` | `ulog_tag_lvl wifi 7` | | Set the `wifi` module log level to warning | `ulog_tag_lvl_filter_set("wifi", LOG_LVL_WARNING);` | `ulog_tag_lvl wifi 4` | -#### Global Filtering by Label +### Global Filtering by Label ```c void ulog_global_filter_tag_set(const char *tag) @@ -521,7 +521,7 @@ For example: there are 3 kinds of tags for `wifi.driver`, `wifi.mgnt`, `audio.dr | Set the filter tag to `driver` | `ulog_global_filter_tag_set("driver");` | `ulog_tag driver` | | Cancel label filtering | `ulog_global_filter_tag_set("");` | `ulog_tag` | -#### Global Filtering by Level +### Global Filtering by Level ```c void ulog_global_filter_lvl_set(rt_uint32_t level) @@ -549,7 +549,7 @@ After setting the global filter level by function or command, the log below **se | Open all logs | `ulog_global_filter_lvl_set(LOG_FILTER_LVL_ALL);` | `ulog_lvl 7` | | Set the log level to warning | `ulog_global_filter_lvl_set(LOG_LVL_WARNING);` | `ulog_lvl 4` | -#### Global Filtering by Keyword +### Global Filtering by Keyword ```c void ulog_global_filter_kw_set(const char *keyword) @@ -568,7 +568,7 @@ This filtering method can filter all the logs by keyword, and the log **containi | Set the filter keyword to `wifi` | `ulog_global_filter_kw_set("wifi");` | `ulog_kw wifi` | | Clear filter keywords | `ulog_global_filter_kw_set("");` | `ulog_kw` | -#### View Filter Information +### View Filter Information After setting the filter parameters, if you want to view the current filter information, you can enter the `ulog_filter` command. The approximate effect is as follows: @@ -588,7 +588,7 @@ msh /> > Filter parameters are also supported storing in Flash and also support boot autoload configuration. If you need this feature, please see the instructions for the **ulog_easyflash** package.([Click to check](https://github.com/armink-rtt-pkgs/ulog_easyflash_be)) -#### Use Example +### Use Example Still executing in qemu BSP, first open dynamic filter in menuconfig, then save the configuration and compile and run the routine. After the log output is about **20** times, the corresponding filter code in ulog_example.c will be executed: @@ -642,7 +642,7 @@ At this time, the log output level of the `test` module is adjusted to `LOG_FILT ![ulog filter routine 40](figures/ulog_example_filter40.png) -### Usage when the System is Abnormal +## Usage when the System is Abnormal Since the asynchronous mode of ulog has a caching mechanism, the registered backend may also have a cache inside. If there are error conditions such as hardfault and assertion in the system, but there are still logs in the cache that are not output, which may cause the log to be lost. It is impossible to find the cause of the exception. @@ -650,7 +650,7 @@ For this scenario, ulog provides a unified log flush function: `void ulog_flush( The following is an example of RT-Thread assertion and CmBacktrace: -#### Assertion +### Assertion RT-Thread assertions support assertion callbacks. We define an assertion hook function similar to the following, and then set it to the system via the `rt_assert_set_hook(rtt_user_assert_hook);` function. @@ -666,7 +666,7 @@ static void rtt_user_assert_hook(const char* ex, const char* func, rt_size_t lin } ``` -#### CmBacktrace +### CmBacktrace CmBacktrace is a fault diagnosis library for ARM Cortex-M series MCUs. It also has a corresponding RT-Thread package, and the latest version of the package has been adapted for ulog. The adaptation code is located in `cmb_cfg.h` : @@ -685,7 +685,7 @@ CmBacktrace is a fault diagnosis library for ARM Cortex-M series MCUs. It also h It can be seen that when ulog is enabled, each log output of CmBacktrace will use the error level, and `ulog_flush` will be executed at the same time, and the user does not need to make any modifications. -### Syslog Mode +## Syslog Mode On Unix-like operating systems, syslog is widely used in system logs. The common backends of syslog are files and networks. The syslog logs can be recorded in local files or sent over the network to the server that receives the syslog. @@ -693,7 +693,7 @@ Ulog provides support for the syslog mode, not only the front-end API is exactly To use the syslog configuration you need to enable the `Enable syslog format log and API.` option. -#### Log Format +### Log Format ![ulog syslog format](figures/ulog_syslog_format.png) @@ -706,7 +706,7 @@ As shown in the figure above, the ulog syslog log format is divided into the fol | TAG | The current log label can be passed in via the `openlog` function. If not specified, `rtt` will be used as the default label. | | Content | The specific content of the log | -#### Instruction +### Instruction The syslog option needs to be enabled in menuconfig before use. The main commonly used APIs are: @@ -721,15 +721,15 @@ syslog() is very simple to use. The input format is the same as the printf funct ![ulog syslog routine](figures/ulog_example_syslog.png) -### Migrate from *rt_dbg.h* or elog to ulog +## Migrate from *rt_dbg.h* or elog to ulog If the two types of log components were used in the project before, when ulog is to be used, it will involve how to make the previous code also support ulog. The following will focus on the migration process. -#### Migrate from rt_dbg.h +### Migrate from rt_dbg.h Currently rtdbg has completed **seamless docking** ulog. After ulog is turned on, the code of rtdbg in the old project can be used to complete the log output without any modification. -#### Migrate from Elog(EasyLogger) +### Migrate from Elog(EasyLogger) If you are not sure that a source code file is running on a target platform that will use ulog, then it is recommended to add the following changes to the file: @@ -743,58 +743,58 @@ If you are not sure that a source code file is running on a target platform that If you explicitly only use the ulog component, then simply change the header file reference from `elog.h` to `ulog .h`, and no other code needs to be changed. -### Log Usage Tip +## Log Usage Tip With the logging tool, if it is used improperly, it will also cause the log to be abused, and the log information cannot be highlighted. Here we will focus on sharing some tips on the use of the log component to make the log information more intuitive. The main concerns are: -#### Rational Use of Label Classification +### Rational Use of Label Classification Reasonably use the label function. For each module code before the use of the log, first clear the module, sub-module name. This also allows the logs to be categorized at the very beginning and ready for later log filtering. -#### Rational Use of Log Levels +### Rational Use of Log Levels When you first use the log library, you will often encounter warnings and errors. The logs cannot be distinguished. The information cannot be distinguished from the debug logs, which makes the log level selection inappropriate. Some important logs may not be visible, and unimportant logs are full of problems. Therefore, be sure to read the log level section carefully before using it. For each level, there are clear standards. -#### Avoid Repetitive and Redundant Logs +### Avoid Repetitive and Redundant Logs In some cases, repeated or cyclic execution of code occurs, and the same, similar log problems are output multiple times. Such a log not only takes up a lot of system resources, but also affects the developer's positioning of the problem. Therefore, in this case, it is recommended to add special processing for repetitive logs, such as: let the upper layer output some business-related logs, the bottom layer only returns the specific result status; the same log at the same time point, can increase to deal with the re-processing, only output once and so on when the error state has not changed. -#### Open More Log Formats +### Open More Log Formats The timestamp and thread information are not turned on in the default log format of ulog. These two log messages are useful on RTOS. They can help developers to understand the running time and time difference of each log, and clearly see which thread is executing the current code. So if conditions permit, it is still recommended to open. -#### Close Unimportant Logs +### Close Unimportant Logs Ulog provides log switch and filtering functions in various dimensions, which can completely control the refinement. Therefore, if you debug a function module, you can properly close the log output of other unrelated modules, so that you can focus on the current debugging on the module. -## Common Problems +# Common Problems -### Q: The log code has been executed, but there is no output. +## Q: The log code has been executed, but there is no output. **A:** Refer to the Log Levels section for the log level classification and check the log filtering parameters. There is also the possibility of accidentally closing the console backend and re-opening `Enable console backend`. -### Q: After ulog is turned on, the system crashes, for example: thread stack overflow. +## Q: After ulog is turned on, the system crashes, for example: thread stack overflow. **A:** Ulog will occupy more part of the thread stack space than the previous rtdbg or `rt_kprintf` printout function. If floating-point printing support is enabled, it is recommended because it uses the internal memory of libc with a large amount of `vsnprintf`. Reserve more than 250 bytes. If the timestamp function is turned on, the stack recommends a reserve of 100 bytes. -### Q: The end of the log content is missing. +## Q: The end of the log content is missing. **A:** This is because the log content exceeds the maximum width of the set log. Check the `The log's max width` option and increase it to the appropriate size. -### Q: After turning on the timestamp, why can't I see the millisecond time? +## Q: After turning on the timestamp, why can't I see the millisecond time? **A:** This is because ulog currently only supports millisecond timestamps when the software emulation RTC state is turned on. To display, just turn on the RT-Thread software to simulate the RTC function. -### Q: Define LOG_TAG and LOG_LVL before each include ulog header file, can it be simplified? +## Q: Define LOG_TAG and LOG_LVL before each include ulog header file, can it be simplified? **A:** If `LOG_TAG` is not defined, the `NO_TAG` tag will be used by default, so the output log will be easily misunderstood. Therefore the tag macro is not recommended to be omitted. If `LOG_LVL` is not defined, the debug level is used by default. If the module is in the development stage, this process can be omitted, but if the module code is stable, it is recommended to define the macro and modify the level to information level. -### Q: Warning when running:Warning: There is no enough buffer for saving async log, please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option。 +## Q: Warning when running:Warning: There is no enough buffer for saving async log, please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option。 **A:** When this prompt is encountered, it indicates that the buffer in the asynchronous mode has overflowed, which will cause some of the log to be lost. Increasing the ULOG_ASYNC_OUTPUT_BUF_SIZE option can solve the problem. -### Q: Compile time prompt:The idle thread stack size must more than 384 when using async output by idle (ULOG_ASYNC_OUTPUT_BY_IDLE)。 +## Q: Compile time prompt:The idle thread stack size must more than 384 when using async output by idle (ULOG_ASYNC_OUTPUT_BY_IDLE)。 **A:** When using an idle thread as the output thread, the stack size of the idle thread needs to be increased, depending on the specific backend device. For example, when the console being a backend, the idle thread must be at least 384 bytes. diff --git a/documentation/utest/utest.md b/documentation/utest/utest.md index d496fbed074..708a1d18939 100644 --- a/documentation/utest/utest.md +++ b/documentation/utest/utest.md @@ -1,10 +1,10 @@ -# utest Framework +@page component_utest utest Framework -## utest Introduction +# utest Introduction utest (unit test) is a unit testing framework developed by RT-Thread. The original intention of designing utest is to make it easier for RT-Thread developers to write test programs using a unified framework interface for unit testing, coverage testing, and integration testing. -### Test Case Definition +## Test Case Definition A test case (tc) is a single test performed to achieve a specific test objective. It is a specification that includes test input, execution conditions, test procedures, and expected results. It is a infinite loop with clear end conditions and test results. @@ -12,21 +12,21 @@ The utest (unit test) framework defines user-written test programs as **test cas The test code for a function, specifically through the API provided by the utest framework, is a test case. -### Test Unit Definition +## Test Unit Definition The test unit is a test point subdivided by the function to be tested. Each test point can be the smallest measurable unit of the function to be tested. Of course, different classification methods will subdivide different test units. -### utest Application Block Diagram +## utest Application Block Diagram ![utest Application Block Diagram](./figures/UtestAppStruct-1.png) As shown in the figure above, the test case is designed based on the service interface provided by the test framework utest, which supports compiling multiple test cases together for testing. In addition, as you can see from the figure, a test case corresponds to a unique *testcase* function, and multiple test units are included in *testcase*. -## utest API +# utest API To enable uniform test case code, the test framework utest provides a common API interface for test case writing. -### Macros of assertion +## Macros of assertion > NOTE: > Here assert only records the number of passes and failures, it does not generate assertions or terminates program execution. Its function is not equivalent to RT_ASSERT. @@ -45,7 +45,7 @@ To enable uniform test case code, the test framework utest provides a common API | uassert_in_range(value, min, max) | If the value is in the range of min and max, the test passes, otherwise the test fails. | | uassert_not_in_range(value, min, max)| If the value is not in the range of min and max, the test passes, otherwise the test fails. | -### Macros for Running Test Units +## Macros for Running Test Units ```c UTEST_UNIT_RUN(test_unit_func) @@ -53,7 +53,7 @@ UTEST_UNIT_RUN(test_unit_func) In the test case, the specified test unit function `test_unit_func` is executed using the `UTEST_UNIT_RUN` macro. The test unit must be executed using the `UTEST_UNIT_RUN` macro. -### Macros for Exporting Test Cases +## Macros for Exporting Test Cases ```c UTEST_TC_EXPORT(testcase, name, init, cleanup, timeout) @@ -75,7 +75,7 @@ Test cases need to be named in the prescribed format. Specifies the naming forma Assuming that there is a `testcases\components\filesystem\dfs\dfs_api_tc.c` test case file in the test case `testcases` directory, the test case name in the `dfs_api_tc.c` is named `components.filesystem.dfs.dfs_api_tc`. -### Test Case LOG Output Interface +## Test Case LOG Output Interface The utest framework relies on the *ulog log module* for log output and the log output level in the utest framework. So just add `#include "utest.h"` to the test case to use all level interfaces (LOG_D/LOG_I/LOG_E) of the ulog log module. @@ -90,7 +90,7 @@ void utest_log_lv_set(rt_uint8_t lv); Users can use the `utest_log_lv_set` interface to control the log output level in test cases. The `UTEST_LOG_ALL` configuration outputs all logs, and the `UTEST_LOG_ASSERT` configuration only outputs logs after the failure of uassert. -## Configuration Enable +# Configuration Enable Using the utest framework requires the following configuration in the ENV tool using menuconfig: @@ -105,7 +105,7 @@ RT-Thread Components ---> (20) The utest thread priority /* Set utest thread priority (required for -thread mode) */ ``` -## Application Paradigm +# Application Paradigm The utest framework and related APIs were introduced earlier. The basic test case code structure is described here. @@ -185,7 +185,7 @@ A basic test case must contain the following: Export the test case testcase function to the test framework. -## Requirements for running test cases +# Requirements for running test cases The test framework utest exports all test cases to the `UtestTcTab` code segment. The `UtestTcTab` section is not required to be defined in the link script in the IAR and MDK compilers, but it needs to be explicitly set in the link script when GCC is compiled. @@ -201,7 +201,7 @@ KEEP(*(UtestTcTab)) __rt_utest_tc_tab_end = .; ``` -## Running Test Cases +# Running Test Cases The test framework provides the following commands to make it easy for users to run test cases on the RT-Thread MSH command line. The commands are as follows: @@ -250,13 +250,13 @@ msh />utest_run components.filesystem.dfs.dfs_api_tc msh /> ``` -### Test result analysis +## Test result analysis ![utest log display](./figures/UtestRunLogShow.png) As shown in the figure above, the log of the test case run is divided into four columns from left to right, which are `(1) log header information`, `(2) result bar`, `(3) property bar`, and `(4) detail information display bar`. The test case test result (PASSED or FAILED) is identified in the log using the `result` attribute. -## Test Case Run Process +# Test Case Run Process ![Test Case Run Process](./figures/testcase-runflowchart.jpg) @@ -265,7 +265,7 @@ From the above flow chart you can get the following: * The utest framework is a sequential execution of all **test units** in the *testcase* function * Assert of the previous UTEST_UNIT_RUN macro has occurred, and all subsequent UTEST_UNIT_RUN will skip execution. -## NOTE +# NOTE - Determine whether the link script has the `UtestTcTab` section added before compiling with GCC. - Make sure `RT-Thread Kernel -> Kernel Device Object -> (256) the buffer size for console log printf` is at least 256 bytes before compiling. From 9be28dbc67523d39404a05cb70b8a2f98853082f Mon Sep 17 00:00:00 2001 From: Supper Thomas <78900636@qq.com> Date: Sun, 26 Jan 2025 15:34:36 +0800 Subject: [PATCH 28/51] =?UTF-8?q?[tools/mdk5]=20=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E8=AE=BE=E7=BD=AE=E4=BA=86UV4.exe=20?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=EF=BC=8C=E5=88=99=E8=BF=9B=E8=A1=8CMDK?= =?UTF-8?q?=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/keil.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/tools/keil.py b/tools/keil.py index 8cd58c03994..c878f5f5080 100644 --- a/tools/keil.py +++ b/tools/keil.py @@ -25,6 +25,7 @@ import os import sys import string +import shutil import xml.etree.ElementTree as etree from xml.etree.ElementTree import SubElement @@ -337,7 +338,26 @@ def MDK4Project(target, script): if os.path.exists('template.uvopt'): import shutil shutil.copy2('template.uvopt', '{}.uvopt'.format(os.path.splitext(target)[0])) - +import threading +import time +def monitor_log_file(log_file_path): + if not os.path.exists(log_file_path): + open(log_file_path, 'w').close() + empty_line_count = 0 + with open(log_file_path, 'r') as log_file: + while True: + line = log_file.readline() + if line: + print(line.strip()) + if 'Build Time Elapsed' in line: + break + empty_line_count = 0 + else: + empty_line_count += 1 + time.sleep(1) + if empty_line_count > 30: + print("Timeout reached or too many empty lines, exiting log monitoring thread.") + break def MDK5Project(target, script): if os.path.isfile('template.uvprojx') is False: @@ -356,6 +376,22 @@ def MDK5Project(target, script): if os.path.exists('template.uvoptx'): import shutil shutil.copy2('template.uvoptx', '{}.uvoptx'.format(os.path.splitext(target)[0])) + # build with UV4.exe + + if shutil.which('UV4.exe') is not None: + target_name = template_tree.find('Targets/Target/TargetName') + print('target_name:', target_name.text) + log_file_path = 'keil.log' + if os.path.exists(log_file_path): + os.remove(log_file_path) + log_thread = threading.Thread(target=monitor_log_file, args=(log_file_path,)) + log_thread.start() + cmd = 'UV4.exe -b project.uvprojx -q -j0 -t '+ target_name.text +' -o '+log_file_path + print('Start to build keil project') + print(cmd) + os.system(cmd) + else: + print('UV4.exe is not available, please check your keil installation') def MDK2Project(target, script): template = open('template.Uv2', "r") From 599cefe8341c1e606caea1fb480c76a89d42d232 Mon Sep 17 00:00:00 2001 From: CYFS <2805686936@qq.com> Date: Mon, 27 Jan 2025 08:35:11 +0800 Subject: [PATCH 29/51] [components][drivers]:fix spi bug and add software spi (#9944) * fix:spi bus issue * [components][drivers]add software SPI bus support --- components/drivers/spi/Kconfig | 177 +++++++++++++++ components/drivers/spi/SConscript | 3 + components/drivers/spi/dev_soft_spi.c | 269 +++++++++++++++++++++++ components/drivers/spi/dev_spi_bit_ops.c | 97 ++++++-- components/drivers/spi/dev_spi_core.c | 4 +- 5 files changed, 526 insertions(+), 24 deletions(-) create mode 100644 components/drivers/spi/dev_soft_spi.c diff --git a/components/drivers/spi/Kconfig b/components/drivers/spi/Kconfig index 8925d8e9e8a..f2fbd7edada 100644 --- a/components/drivers/spi/Kconfig +++ b/components/drivers/spi/Kconfig @@ -14,6 +14,183 @@ config RT_USING_SPI default n endif + menuconfig RT_USING_SOFT_SPI + bool "Use GPIO to soft simulate SPI" + default n + select RT_USING_PIN + select RT_USING_SPI_BITOPS + if RT_USING_SOFT_SPI + menuconfig RT_USING_SOFT_SPI0 + bool "Enable SPI0 Bus (software simulation)" + default y + if RT_USING_SOFT_SPI0 + config RT_SOFT_SPI0_SCK_PIN + int "SCK pin number" + range 0 32767 + default 1 + config RT_SOFT_SPI0_MISO_PIN + int "MISO pin number" + range 0 32767 + default 2 + config RT_SOFT_SPI0_MOSI_PIN + int "MOSI pin number" + range 0 32767 + default 3 + config RT_SOFT_SPI0_BUS_NAME + string "Bus name" + default "spi0" + config RT_SOFT_SPI0_TIMING_DELAY + int "Timing delay (us)" + range 0 32767 + default 1 + endif + menuconfig RT_USING_SOFT_SPI1 + bool "Enable SPI1 Bus (software simulation)" + default y + if RT_USING_SOFT_SPI1 + config RT_SOFT_SPI1_SCK_PIN + int "SCK pin number" + range 0 32767 + default 4 + config RT_SOFT_SPI1_MISO_PIN + int "MISO pin number" + range 0 32767 + default 5 + config RT_SOFT_SPI1_MOSI_PIN + int "MOSI pin number" + range 0 32767 + default 6 + config RT_SOFT_SPI1_BUS_NAME + string "Bus name" + default "spi1" + config RT_SOFT_SPI1_TIMING_DELAY + int "Timing delay (us)" + range 0 32767 + default 1 + endif + menuconfig RT_USING_SOFT_SPI2 + bool "Enable SPI2 Bus (software simulation)" + default n + if RT_USING_SOFT_SPI2 + config RT_SOFT_SPI2_SCK_PIN + int "SCK pin number" + range 0 32767 + default 7 + config RT_SOFT_SPI2_MISO_PIN + int "MISO pin number" + range 0 32767 + default 8 + config RT_SOFT_SPI2_MOSI_PIN + int "MOSI pin number" + range 0 32767 + default 9 + config RT_SOFT_SPI2_BUS_NAME + string "Bus name" + default "spi2" + config RT_SOFT_SPI2_TIMING_DELAY + int "Timing delay (us)" + range 0 32767 + default 1 + endif + menuconfig RT_USING_SOFT_SPI3 + bool "Enable SPI3 Bus (software simulation)" + default n + if RT_USING_SOFT_SPI3 + config RT_SOFT_SPI3_SCK_PIN + int "SCK pin number" + range 0 32767 + default 10 + config RT_SOFT_SPI3_MISO_PIN + int "MISO pin number" + range 0 32767 + default 11 + config RT_SOFT_SPI3_MOSI_PIN + int "MOSI pin number" + range 0 32767 + default 12 + config RT_SOFT_SPI3_BUS_NAME + string "Bus name" + default "spi3" + config RT_SOFT_SPI3_TIMING_DELAY + int "Timing delay (us)" + range 0 32767 + default 1 + endif + menuconfig RT_USING_SOFT_SPI4 + bool "Enable SPI4 Bus (software simulation)" + default n + if RT_USING_SOFT_SPI4 + config RT_SOFT_SPI4_SCK_PIN + int "SCK pin number" + range 0 32767 + default 13 + config RT_SOFT_SPI4_MISO_PIN + int "MISO pin number" + range 0 32767 + default 14 + config RT_SOFT_SPI4_MOSI_PIN + int "MOSI pin number" + range 0 32767 + default 15 + config RT_SOFT_SPI4_BUS_NAME + string "Bus name" + default "spi4" + config RT_SOFT_SPI4_TIMING_DELAY + int "Timing delay (us)" + range 0 32767 + default 1 + endif + menuconfig RT_USING_SOFT_SPI5 + bool "Enable SPI5 Bus (software simulation)" + default n + if RT_USING_SOFT_SPI5 + config RT_SOFT_SPI5_SCK_PIN + int "SCK pin number" + range 0 32767 + default 16 + config RT_SOFT_SPI5_MISO_PIN + int "MISO pin number" + range 0 32767 + default 17 + config RT_SOFT_SPI5_MOSI_PIN + int "MOSI pin number" + range 0 32767 + default 18 + config RT_SOFT_SPI5_BUS_NAME + string "Bus name" + default "spi5" + config RT_SOFT_SPI5_TIMING_DELAY + int "Timing delay (us)" + range 0 32767 + default 1 + endif + menuconfig RT_USING_SOFT_SPI6 + bool "Enable SPI6 Bus (software simulation)" + default n + if RT_USING_SOFT_SPI6 + config RT_SOFT_SPI6_SCK_PIN + int "SCK pin number" + range 0 32767 + default 19 + config RT_SOFT_SPI6_MISO_PIN + int "MISO pin number" + range 0 32767 + default 20 + config RT_SOFT_SPI6_MOSI_PIN + int "MOSI pin number" + range 0 32767 + default 21 + config RT_SOFT_SPI6_BUS_NAME + string "Bus name" + default "spi6" + config RT_SOFT_SPI6_TIMING_DELAY + int "Timing delay (us)" + range 0 32767 + default 1 + endif + + endif + config RT_USING_QSPI bool "Enable QSPI mode" default n diff --git a/components/drivers/spi/SConscript b/components/drivers/spi/SConscript index 6897dab6d31..fc608c46aeb 100644 --- a/components/drivers/spi/SConscript +++ b/components/drivers/spi/SConscript @@ -10,6 +10,9 @@ LOCAL_CFLAGS = '' if GetDepend('RT_USING_SPI_BITOPS'): src += ['dev_spi_bit_ops.c'] +if GetDepend('RT_USING_SOFT_SPI'): + src += ['dev_soft_spi.c'] + if GetDepend('RT_USING_QSPI'): src += ['dev_qspi_core.c'] diff --git a/components/drivers/spi/dev_soft_spi.c b/components/drivers/spi/dev_soft_spi.c new file mode 100644 index 00000000000..a308299f6c3 --- /dev/null +++ b/components/drivers/spi/dev_soft_spi.c @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2006-2025 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-23 CYFS first version + */ +#include +#include +#include + +#ifdef RT_USING_SOFT_SPI +#if !defined(RT_USING_SOFT_SPI0) &&\ + !defined(RT_USING_SOFT_SPI1) && !defined(RT_USING_SOFT_SPI2) &&\ + !defined(RT_USING_SOFT_SPI3) && !defined(RT_USING_SOFT_SPI4) &&\ + !defined(RT_USING_SOFT_SPI5) && !defined(RT_USING_SOFT_SPI6) + #error "Please define at least one RT_USING_SOFT_SPIx" + /* + This driver can be disabled at: + menuconfig -> RT-Thread Components -> Device Drivers -> Using I2C device drivers + */ +#endif + +#define DBG_ENABLE +#define DBG_TAG "SPI_S" +#ifdef RT_SPI_BITOPS_DEBUG + #define DBG_LEVEL DBG_LOG +#endif +#include + +/* spi config class */ +struct rt_soft_spi_config +{ + rt_base_t sck; + rt_base_t miso; + rt_base_t mosi; + rt_uint32_t timing_delay; + const char *bus_name; +}; + +/* spi dirver class */ +struct rt_soft_spi +{ + struct rt_spi_bit_obj spi; + struct rt_spi_bit_ops ops; + struct rt_soft_spi_config *cfg; +}; + +static struct rt_soft_spi_config soft_spi_config[] = +{ +#ifdef RT_USING_SOFT_SPI0 + { + .sck = RT_SOFT_SPI0_SCK_PIN, + .miso = RT_SOFT_SPI0_MISO_PIN, + .mosi = RT_SOFT_SPI0_MOSI_PIN, + .timing_delay = RT_SOFT_SPI0_TIMING_DELAY, + .bus_name = RT_SOFT_SPI0_BUS_NAME, + }, +#endif /*RT_USING_SOFT_SPI0*/ +#ifdef RT_USING_SOFT_SPI1 + { + .sck = RT_SOFT_SPI1_SCK_PIN, + .miso = RT_SOFT_SPI1_MISO_PIN, + .mosi = RT_SOFT_SPI1_MOSI_PIN, + .timing_delay = RT_SOFT_SPI1_TIMING_DELAY, + .bus_name = RT_SOFT_SPI1_BUS_NAME, + }, +#endif /*RT_USING_SOFT_SPI1*/ +#ifdef RT_USING_SOFT_SPI2 + { + .sck = RT_SOFT_SPI2_SCK_PIN, + .miso = RT_SOFT_SPI2_MISO_PIN, + .mosi = RT_SOFT_SPI2_MOSI_PIN, + .timing_delay = RT_SOFT_SPI2_TIMING_DELAY, + .bus_name = RT_SOFT_SPI2_BUS_NAME, + }, +#endif /*RT_USING_SOFT_SPI2*/ +#ifdef RT_USING_SOFT_SPI3 + { + .sck = RT_SOFT_SPI3_SCK_PIN, + .miso = RT_SOFT_SPI3_MISO_PIN, + .mosi = RT_SOFT_SPI3_MOSI_PIN, + .timing_delay = RT_SOFT_SPI3_TIMING_DELAY, + .bus_name = RT_SOFT_SPI3_BUS_NAME, + }, +#endif /*RT_USING_SOFT_SPI3*/ +#ifdef RT_USING_SOFT_SPI4 + { + .sck = RT_SOFT_SPI4_SCK_PIN, + .miso = RT_SOFT_SPI4_MISO_PIN, + .mosi = RT_SOFT_SPI4_MOSI_PIN, + .timing_delay = RT_SOFT_SPI4_TIMING_DELAY, + .bus_name = RT_SOFT_SPI4_BUS_NAME, + }, +#endif /*RT_USING_SOFT_SPI4*/ +#ifdef RT_USING_SOFT_SPI5 + { + .sck = RT_SOFT_SPI5_SCK_PIN, + .miso = RT_SOFT_SPI5_MISO_PIN, + .mosi = RT_SOFT_SPI5_MOSI_PIN, + .timing_delay = RT_SOFT_SPI5_TIMING_DELAY, + .bus_name = RT_SOFT_SPI5_BUS_NAME, + }, +#endif /*RT_USING_SOFT_SPI5*/ +#ifdef RT_USING_SOFT_SPI6 + { + .sck = RT_SOFT_SPI6_SCK_PIN, + .miso = RT_SOFT_SPI6_MISO_PIN, + .mosi = RT_SOFT_SPI6_MOSI_PIN, + .timing_delay = RT_SOFT_SPI6_TIMING_DELAY, + .bus_name = RT_SOFT_SPI6_BUS_NAME, + }, +#endif /*RT_USING_SOFT_SPI6*/ + +}; + +static struct rt_soft_spi spi_obj[sizeof(soft_spi_config) / sizeof(soft_spi_config[0])]; + +static void spi_soft_pin_init(struct rt_soft_spi * soft_spi) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)soft_spi->cfg; + rt_pin_mode(cfg->sck, PIN_MODE_OUTPUT); + rt_pin_mode(cfg->miso, PIN_MODE_INPUT); + rt_pin_mode(cfg->mosi, PIN_MODE_OUTPUT); + + rt_pin_write(cfg->miso, PIN_HIGH); + rt_pin_write(cfg->sck, PIN_HIGH); + rt_pin_write(cfg->mosi, PIN_HIGH); +} + + +static void spi_soft_tog_sclk(void *data) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + if(rt_pin_read(cfg->sck) == PIN_HIGH) + { + rt_pin_write(cfg->sck, PIN_LOW); + } + else + { + rt_pin_write(cfg->sck, PIN_HIGH); + } +} + +static void spi_soft_set_sclk(void *data, rt_int32_t state) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + if (state) + { + rt_pin_write(cfg->sck, PIN_HIGH); + } + else + { + rt_pin_write(cfg->sck, PIN_LOW); + } +} + +static void spi_soft_set_mosi(void *data, rt_int32_t state) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + if (state) + { + rt_pin_write(cfg->mosi, PIN_HIGH); + } + else + { + rt_pin_write(cfg->mosi, PIN_LOW); + } +} + +static void spi_soft_set_miso(void *data, rt_int32_t state) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + if (state) + { + rt_pin_write(cfg->miso, PIN_HIGH); + } + else + { + rt_pin_write(cfg->miso, PIN_LOW); + } +} + +static rt_int32_t spi_soft_get_sclk(void *data) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + return rt_pin_read(cfg->sck); +} + +static rt_int32_t spi_soft_get_mosi(void *data) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + return rt_pin_read(cfg->mosi); +} + +static rt_int32_t spi_soft_get_miso(void *data) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + return rt_pin_read(cfg->miso); +} + +static void spi_soft_dir_mosi(void *data, rt_int32_t state) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + if (state) + { + rt_pin_mode(cfg->mosi, PIN_MODE_INPUT); + } + else + { + rt_pin_mode(cfg->mosi, PIN_MODE_OUTPUT); + } +} + +static void spi_soft_dir_miso(void *data, rt_int32_t state) +{ + struct rt_soft_spi_config *cfg = (struct rt_soft_spi_config *)data; + if (state) + { + rt_pin_mode(cfg->miso, PIN_MODE_INPUT); + } + else + { + rt_pin_mode(cfg->miso, PIN_MODE_OUTPUT); + } +} + +static struct rt_spi_bit_ops soft_spi_ops= +{ + .data = RT_NULL, + .pin_init = RT_NULL, + .tog_sclk = spi_soft_tog_sclk, + .set_sclk = spi_soft_set_sclk, + .set_mosi = spi_soft_set_mosi, + .set_miso = spi_soft_set_miso, + .get_sclk = spi_soft_get_sclk, + .get_mosi = spi_soft_get_mosi, + .get_miso = spi_soft_get_miso, + .dir_mosi = spi_soft_dir_mosi, + .dir_miso = spi_soft_dir_miso, + .udelay = rt_hw_us_delay, +}; + +/* Soft SPI initialization function */ +int rt_soft_spi_init(void) +{ + rt_size_t obj_num = sizeof(spi_obj) / sizeof(struct rt_soft_spi); + rt_err_t result; + + for (rt_size_t i = 0; i < obj_num; i++) + { + rt_memcpy(&spi_obj[i].ops, &soft_spi_ops, sizeof(struct rt_spi_bit_ops)); + spi_obj[i].ops.data = (void *)&soft_spi_config[i]; + spi_obj[i].spi.ops = &soft_spi_ops; + spi_obj[i].cfg = (void *)&soft_spi_config[i]; + spi_soft_pin_init(&spi_obj[i]); + spi_obj[i].spi.ops->delay_us = soft_spi_config[i].timing_delay; + result = rt_spi_bit_add_bus(&spi_obj[i].spi, soft_spi_config[i].bus_name, &spi_obj[i].ops); + RT_ASSERT(result == RT_EOK); + } + + return RT_EOK; +} +INIT_PREV_EXPORT(rt_soft_spi_init); + +#endif /* RT_USING_SOFT_SPI */ + diff --git a/components/drivers/spi/dev_spi_bit_ops.c b/components/drivers/spi/dev_spi_bit_ops.c index d2a26a766dc..4f216a9a3b2 100644 --- a/components/drivers/spi/dev_spi_bit_ops.c +++ b/components/drivers/spi/dev_spi_bit_ops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2025 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -87,11 +87,23 @@ rt_inline rt_ssize_t spi_xfer_4line_data8(struct rt_spi_bit_ops *ops, TOG_SCLK(ops); - if (config->mode & RT_SPI_MSB) { rx_data <<= 1; bit = 0x01; } - else { rx_data >>= 1; bit = 0x80; } + if (config->mode & RT_SPI_MSB) + { + rx_data <<= 1; bit = 0x01; + } + else + { + rx_data >>= 1; bit = 0x80; + } - if (GET_MISO(ops)) { rx_data |= bit; } - else { rx_data &= ~bit; } + if (GET_MISO(ops)) + { + rx_data |= bit; + } + else + { + rx_data &= ~bit; + } spi_delay2(ops); @@ -150,11 +162,23 @@ rt_inline rt_ssize_t spi_xfer_4line_data16(struct rt_spi_bit_ops *ops, TOG_SCLK(ops); - if (config->mode & RT_SPI_MSB) { rx_data <<= 1; bit = 0x0001; } - else { rx_data >>= 1; bit = 0x8000; } + if (config->mode & RT_SPI_MSB) + { + rx_data <<= 1; bit = 0x0001; + } + else + { + rx_data >>= 1; bit = 0x8000; + } - if (GET_MISO(ops)) { rx_data |= bit; } - else { rx_data &= ~bit; } + if (GET_MISO(ops)) + { + rx_data |= bit; + } + else + { + rx_data &= ~bit; + } spi_delay2(ops); @@ -244,11 +268,23 @@ rt_inline rt_ssize_t spi_xfer_3line_data8(struct rt_spi_bit_ops *ops, TOG_SCLK(ops); - if (config->mode & RT_SPI_MSB) { rx_data <<= 1; bit = 0x01; } - else { rx_data >>= 1; bit = 0x80; } + if (config->mode & RT_SPI_MSB) + { + rx_data <<= 1; bit = 0x01; + } + else + { + rx_data >>= 1; bit = 0x80; + } - if (GET_MOSI(ops)) { rx_data |= bit; } - else { rx_data &= ~bit; } + if (GET_MOSI(ops)) + { + rx_data |= bit; + } + else + { + rx_data &= ~bit; + } spi_delay2(ops); @@ -345,11 +381,23 @@ rt_inline rt_ssize_t spi_xfer_3line_data16(struct rt_spi_bit_ops *ops, TOG_SCLK(ops); - if (config->mode & RT_SPI_MSB) { rx_data <<= 1; bit = 0x0001; } - else { rx_data >>= 1; bit = 0x8000; } + if (config->mode & RT_SPI_MSB) + { + rx_data <<= 1; bit = 0x0001; + } + else + { + rx_data >>= 1; bit = 0x8000; + } - if (GET_MOSI(ops)) { rx_data |= bit; } - else { rx_data &= ~bit; } + if (GET_MOSI(ops)) + { + rx_data |= bit; + } + else + { + rx_data &= ~bit; + } spi_delay2(ops); @@ -456,15 +504,14 @@ rt_ssize_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *mes rt_pin_write(cs_pin, PIN_LOW); } spi_delay(ops); + } /* spi phase */ - if (config->mode & RT_SPI_CPHA) + if ((config->mode & RT_SPI_CPHA)) { spi_delay(ops); TOG_SCLK(ops); } - } - if (config->mode & RT_SPI_3WIRE) { if (config->data_width <= 8) @@ -487,10 +534,15 @@ rt_ssize_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *mes length = spi_xfer_4line_data16(ops, config, message->send_buf, message->recv_buf, message->length); } } - /* release CS */ - if (message->cs_take && !(device->config.mode & RT_SPI_NO_CS) && (cs_pin != PIN_NONE)) + if (message->cs_release && !(device->config.mode & RT_SPI_NO_CS) && (cs_pin != PIN_NONE)) { + + if ((config->mode & RT_SPI_CPOL) && !GET_SCLK(ops)) + { + spi_delay(ops); + TOG_SCLK(ops); + } spi_delay(ops); if (device->config.mode & RT_SPI_CS_HIGH) { @@ -501,6 +553,7 @@ rt_ssize_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *mes rt_pin_write(cs_pin, PIN_HIGH); } LOG_I("spi release cs\n"); + } return length; diff --git a/components/drivers/spi/dev_spi_core.c b/components/drivers/spi/dev_spi_core.c index d84aaac0556..3a3008d6e7c 100644 --- a/components/drivers/spi/dev_spi_core.c +++ b/components/drivers/spi/dev_spi_core.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2023, RT-Thread Development Team + * Copyright (c) 2006-2025 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -140,7 +140,7 @@ rt_err_t rt_spi_bus_configure(struct rt_spi_device *device) result = rt_mutex_take(&(device->bus->lock), RT_WAITING_FOREVER); if (result == RT_EOK) { - if (device->bus->owner == device) + if (device->bus->owner == RT_NULL || device->bus->owner == device) { /* current device is using, re-configure SPI bus */ result = device->bus->ops->configure(device, &device->config); From 6481633ec641620dcf98e0f3255cfc8f61fd818d Mon Sep 17 00:00:00 2001 From: wumingzi <62127946+1078249029@users.noreply.github.com> Date: Mon, 27 Jan 2025 15:54:13 +0800 Subject: [PATCH 30/51] [doxygen] add doxygen comment for clk.c and clk.h (#9950) Accroding to #9947 and #9424, adding doxygen comment for function in .c files and data structure, macro in .h file is a solution.For this pr, I encountered problem following situations. - rt_clk_unprepare function return value type is different from rt_clk_ops so I change type of rt_clk_unprepare and its dependencies. - clk_get function may be similar as rt_clk_unprepare but I'm not sure so not modify. - clk_release implements may be incomplete, so I just marked in comment. Signed-off-by: 1078249029 <1078249029@qq.com> --- components/drivers/clk/clk.c | 378 ++++++++++++++++++++++- components/drivers/include/drivers/clk.h | 62 ++-- documentation/Doxyfile | 1 + 3 files changed, 422 insertions(+), 19 deletions(-) diff --git a/components/drivers/clk/clk.c b/components/drivers/clk/clk.c index 2bb45f8d68d..909130553e7 100644 --- a/components/drivers/clk/clk.c +++ b/components/drivers/clk/clk.c @@ -1,17 +1,27 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2022-11-26 GuEe-GUI first version + * 2025-01-24 wumingzi add doxygen comment */ #include #include #include +/** + * @addtogroup Drivers RTTHREAD Driver + * @defgroup clk clk + * @brief clk driver api + * @ingroup Drivers + * @addtogroup clk + * @{ + */ + #define DBG_TAG "rtdm.clk" #define DBG_LVL DBG_INFO #include @@ -20,6 +30,12 @@ static struct rt_spinlock _clk_lock = { 0 }; static rt_list_t _clk_nodes = RT_LIST_OBJECT_INIT(_clk_nodes); static rt_list_t _clk_notifier_nodes = RT_LIST_OBJECT_INIT(_clk_notifier_nodes); +/** + * @brief Release clock node + * + * @param r point to reference count of clock node + * @warning The function only can print log and MORE DETAILS SHOULD BE IMPLEMENTED. + */ static void clk_release(struct rt_ref *r) { struct rt_clk_node *clk_np = rt_container_of(r, struct rt_clk_node, ref); @@ -30,6 +46,13 @@ static void clk_release(struct rt_ref *r) RT_ASSERT(0); } +/** + * @brief Increase reference count for clock node + * + * @param clk_np point to clock node + * + * @return struct rt_clk_node * point to clock node whose reference count has increased + */ rt_inline struct rt_clk_node *clk_get(struct rt_clk_node *clk_np) { rt_ref_get(&clk_np->ref); @@ -37,11 +60,27 @@ rt_inline struct rt_clk_node *clk_get(struct rt_clk_node *clk_np) return clk_np; } +/** + * @brief Decrease reference count for clock node + * + * @param clk_np point to clock node + * + */ rt_inline void clk_put(struct rt_clk_node *clk_np) { rt_ref_put(&clk_np->ref, &clk_release); } +/** + * @brief Allocate memory space for struct clock and return it + * + * @param clk_np point to clock node + * @param dev_id device identifier for the clock + * @param con_id connection identifier for the clock + * @param fw_node point to the firmware node associated with the clock + * + * @return struct rt_clk* point to clock + */ static struct rt_clk *clk_alloc(struct rt_clk_node *clk_np, const char *dev_id, const char *con_id, void *fw_node) { @@ -63,6 +102,12 @@ static struct rt_clk *clk_alloc(struct rt_clk_node *clk_np, const char *dev_id, return clk; } +/** + * @brief Free memory space of clock object + * + * @param clk point to clock + * + */ static void clk_free(struct rt_clk *clk) { struct rt_clk_node *clk_np = clk->clk_np; @@ -75,6 +120,17 @@ static void clk_free(struct rt_clk *clk) rt_free(clk); } +/** + * @brief Allocate memory space and creat clock object + * + * @param clk_np point to clock node + * @param dev_id device identifier for the clock + * @param con_id connection identifier for the clock + * @param fw_data point to the firmware data associated with the clock + * @param fw_node point to the firmware node associated with the clock + * + * @return struct rt_clk* point to clock + */ static struct rt_clk *clk_create(struct rt_clk_node *clk_np, const char *dev_id, const char *con_id, void *fw_data, void *fw_node) { @@ -96,6 +152,16 @@ static struct rt_clk *clk_create(struct rt_clk_node *clk_np, const char *dev_id, return clk; } +/** + * @brief Notify corresponding clock from all + * + * @param clk_np point to clock node + * @param msg message identifier for the event + * @param old_rate old rate of the clock before the event + * @param new_rate new rate of the clock after the event + * + * @return rt_err_t RT_EOK on notify clock sucessfully, and other value is failed. + */ static rt_err_t clk_notify(struct rt_clk_node *clk_np, rt_ubase_t msg, rt_ubase_t old_rate, rt_ubase_t new_rate) { rt_err_t err = RT_EOK; @@ -118,6 +184,13 @@ static rt_err_t clk_notify(struct rt_clk_node *clk_np, rt_ubase_t msg, rt_ubase_ return err; } +/** + * @brief Set parent clock + * + * @param clk_np point to clock node + * @param parent_np point to parent rt_clk + * + */ static void clk_set_parent(struct rt_clk_node *clk_np, struct rt_clk_node *parent_np) { rt_hw_spin_lock(&_clk_lock.lock); @@ -133,6 +206,15 @@ static const struct rt_clk_ops unused_clk_ops = { }; +/** + * @brief Register clock node into clock list + * + * @param clk_np point to child node that will be registered node. + * @param parent_np point to parent rt_clk. If it is RT_NULL, clock node will be linked to init node. + * + * @retval RT_EOK + * @retval -RT_ENOMEM + */ rt_err_t rt_clk_register(struct rt_clk_node *clk_np, struct rt_clk_node *parent_np) { rt_err_t err = RT_EOK; @@ -190,6 +272,15 @@ rt_err_t rt_clk_register(struct rt_clk_node *clk_np, struct rt_clk_node *parent_ return err; } +/** + * @brief Unregister clock node from clock list + * + * @param clk_np point to child node that will be Unregistered node. + * + * @retval RT_EOK + * @retval -RT_EBUSY + * @retval -RT_EINVAL + */ rt_err_t rt_clk_unregister(struct rt_clk_node *clk_np) { rt_err_t err = RT_EOK; @@ -221,6 +312,15 @@ rt_err_t rt_clk_unregister(struct rt_clk_node *clk_np) return err; } +/** + * @brief Register clock notifier into notifier list + * + * @param clk point to clock + * @param notifier point to notifier for register + * + * @retval RT_EOK + * @retval -RT_EINVAL + */ rt_err_t rt_clk_notifier_register(struct rt_clk *clk, struct rt_clk_notifier *notifier) { if (!clk || !clk->clk_np || !notifier) @@ -239,6 +339,15 @@ rt_err_t rt_clk_notifier_register(struct rt_clk *clk, struct rt_clk_notifier *no return RT_EOK; } +/** + * @brief Unregister clock notifier into notifier list + * + * @param clk point to clock + * @param notifier point to notifier for unregister + * + * @retval RT_EOK + * @retval -RT_EINVAL + */ rt_err_t rt_clk_notifier_unregister(struct rt_clk *clk, struct rt_clk_notifier *notifier) { struct rt_clk_notifier *notifier_find; @@ -266,6 +375,14 @@ rt_err_t rt_clk_notifier_unregister(struct rt_clk *clk, struct rt_clk_notifier * return RT_EOK; } +/** + * @brief Recursively prepare clock + * + * @param clk Ponit to clock that will be prepared + * @param clk_np Ponit to clock node that will be prepared + * + * @return rt_err_t RT_EOK on prepare clock sucessfully, and other value is failed. + */ static rt_err_t clk_prepare(struct rt_clk *clk, struct rt_clk_node *clk_np) { rt_err_t err = RT_EOK; @@ -288,6 +405,13 @@ static rt_err_t clk_prepare(struct rt_clk *clk, struct rt_clk_node *clk_np) return err; } +/** + * @brief Prepare clock + * + * @param clk + * + * @return rt_err_t RT_EOK on prepare clock sucessfully, and other value is failed. + */ rt_err_t rt_clk_prepare(struct rt_clk *clk) { rt_err_t err = RT_EOK; @@ -306,6 +430,13 @@ rt_err_t rt_clk_prepare(struct rt_clk *clk) return err; } +/** + * @brief Recursively unprepare clock + * + * @param clk Ponit to clock that will be unprepared + * @param clk_np Ponit to clock node that will be unprepared + * + */ static void clk_unprepare(struct rt_clk *clk, struct rt_clk_node *clk_np) { if (clk_np->parent) @@ -341,6 +472,13 @@ rt_err_t rt_clk_unprepare(struct rt_clk *clk) return err; } +/** + * @brief Enable clock + * + * @param clk point to clock + * + * @return rt_err_t RT_EOK on enable clock FOREVER. + */ static rt_err_t clk_enable(struct rt_clk *clk, struct rt_clk_node *clk_np) { rt_err_t err = RT_EOK; @@ -363,6 +501,13 @@ static rt_err_t clk_enable(struct rt_clk *clk, struct rt_clk_node *clk_np) return err; } +/** + * @brief Enable clock + * + * @param clk point to clock + * + * @return rt_err_t RT_EOK on enable clock sucessfully, and other value is failed. + */ rt_err_t rt_clk_enable(struct rt_clk *clk) { rt_err_t err = RT_EOK; @@ -379,6 +524,13 @@ rt_err_t rt_clk_enable(struct rt_clk *clk) return err; } +/** + * @brief Recursively disable clock + * + * @param clk Ponit to clock that will be disabled + * @param clk_np Ponit to clock node that will be disabled + * + */ static void clk_disable(struct rt_clk *clk, struct rt_clk_node *clk_np) { if (clk_np->parent) @@ -396,6 +548,12 @@ static void clk_disable(struct rt_clk *clk, struct rt_clk_node *clk_np) } } +/** + * @brief Disable clock + * + * @param clk point to clock + * + */ void rt_clk_disable(struct rt_clk *clk) { if (clk && clk->clk_np) @@ -408,6 +566,13 @@ void rt_clk_disable(struct rt_clk *clk) } } +/** + * @brief Prepare and enable clock + * + * @param clk point to clock + * + * @return rt_err_t RT_EOK on prepare and enable clock sucessfully, and other value is failed. + */ rt_err_t rt_clk_prepare_enable(struct rt_clk *clk) { rt_err_t err = RT_EOK; @@ -432,6 +597,12 @@ rt_err_t rt_clk_prepare_enable(struct rt_clk *clk) return err; } +/** + * @brief Disable and unprepare clock + * + * @param clk point to clock + * + */ void rt_clk_disable_unprepare(struct rt_clk *clk) { RT_DEBUG_NOT_IN_INTERRUPT; @@ -443,6 +614,13 @@ void rt_clk_disable_unprepare(struct rt_clk *clk) } } +/** + * @brief Prepare clock array for mutipule out clock + * + * @param clk_arr point to clock array + * + * @return rt_err_t RT_EOK on prepare clock array sucessfully, and other value is failed. + */ rt_err_t rt_clk_array_prepare(struct rt_clk_array *clk_arr) { rt_err_t err = RT_EOK; @@ -490,6 +668,13 @@ rt_err_t rt_clk_array_unprepare(struct rt_clk_array *clk_arr) return err; } +/** + * @brief Enable clock array for mutipule out clock + * + * @param clk_arr point to clock array + * + * @return rt_err_t RT_EOK on Enable clock array sucessfully, and other value is failed. + */ rt_err_t rt_clk_array_enable(struct rt_clk_array *clk_arr) { rt_err_t err = RT_EOK; @@ -516,6 +701,12 @@ rt_err_t rt_clk_array_enable(struct rt_clk_array *clk_arr) return err; } +/** + * @brief Enable clock array for mutipule out clock + * + * @param clk_arr point to clock array + * + */ void rt_clk_array_disable(struct rt_clk_array *clk_arr) { if (clk_arr) @@ -527,6 +718,14 @@ void rt_clk_array_disable(struct rt_clk_array *clk_arr) } } +/** + * @brief Prepare and enable clock array + * + * @param clk_arr point to clock array + * + * @return rt_err_t RT_EOK on prepare and enable clock array sucessfully, and other + value is failed. + */ rt_err_t rt_clk_array_prepare_enable(struct rt_clk_array *clk_arr) { rt_err_t err; @@ -544,12 +743,27 @@ rt_err_t rt_clk_array_prepare_enable(struct rt_clk_array *clk_arr) return err; } +/** + * @brief Disable and unprepare clock array + * + * @param clk_arr point to clock array + * + */ void rt_clk_array_disable_unprepare(struct rt_clk_array *clk_arr) { rt_clk_array_disable(clk_arr); rt_clk_array_unprepare(clk_arr); } +/** + * @brief Set clock rate range + * + * @param clk point to clock + * @param min minimum clock rate + * @param max minimum clock rate + * + * @return rt_err_t RT_EOK on set clock rate range sucessfully, and other value is failed. + */ rt_err_t rt_clk_set_rate_range(struct rt_clk *clk, rt_ubase_t min, rt_ubase_t max) { rt_err_t err = RT_EOK; @@ -590,6 +804,14 @@ rt_err_t rt_clk_set_rate_range(struct rt_clk *clk, rt_ubase_t min, rt_ubase_t ma return err; } +/** + * @brief Set minimum clock rate + * + * @param clk point to clock + * @param rate miminum clock rate + * + * @return rt_err_t RT_EOK on set minimum clock rate sucessfully, and other value is failed. + */ rt_err_t rt_clk_set_min_rate(struct rt_clk *clk, rt_ubase_t rate) { rt_err_t err = RT_EOK; @@ -604,6 +826,14 @@ rt_err_t rt_clk_set_min_rate(struct rt_clk *clk, rt_ubase_t rate) return err; } +/** + * @brief Set maximum clock rate + * + * @param clk point to clock + * @param rate maximum clock rate + * + * @return rt_err_t RT_EOK on set maximum clock rate sucessfully, and other value is failed. + */ rt_err_t rt_clk_set_max_rate(struct rt_clk *clk, rt_ubase_t rate) { rt_err_t err = RT_EOK; @@ -618,6 +848,14 @@ rt_err_t rt_clk_set_max_rate(struct rt_clk *clk, rt_ubase_t rate) return err; } +/** + * @brief Set clock rate + * + * @param clk point to clock + * @param rate target rate + * + * @return rt_err_t RT_EOK on set clock rate sucessfully, and other value is failed. + */ rt_err_t rt_clk_set_rate(struct rt_clk *clk, rt_ubase_t rate) { rt_err_t err = RT_EOK; @@ -666,6 +904,13 @@ rt_err_t rt_clk_set_rate(struct rt_clk *clk, rt_ubase_t rate) return err; } +/** + * @brief Get clock rate + * + * @param clk point to clock + * + * @return rt_ubase_t clock rate or error code + */ rt_ubase_t rt_clk_get_rate(struct rt_clk *clk) { rt_ubase_t rate = 0; @@ -685,6 +930,14 @@ rt_ubase_t rt_clk_get_rate(struct rt_clk *clk) return rate; } +/** + * @brief Set clock phase + * + * @param clk point to clock + * @param degrees target phase and the unit of phase is degree + * + * @return rt_err_t RT_EOK on set clock phase sucessfully, and other value is failed. + */ rt_err_t rt_clk_set_phase(struct rt_clk *clk, int degrees) { rt_err_t err = RT_EOK; @@ -701,6 +954,13 @@ rt_err_t rt_clk_set_phase(struct rt_clk *clk, int degrees) return err; } +/** + * @brief Get clock phase + * + * @param clk point to clock + * + * @return rt_base_t clock phase or error code + */ rt_base_t rt_clk_get_phase(struct rt_clk *clk) { rt_base_t res = RT_EOK; @@ -717,6 +977,16 @@ rt_base_t rt_clk_get_phase(struct rt_clk *clk) return res; } +/** + * @brief Check if clock rate is in the minimum to maximun and get it + * + * @param clk point to clock + * @param rate rate will be checked + * + * @return rt_base_t get the correct rate + * @note if parameter rate less than the minimum or more than maximum, the + retrun rate will be set to minimum ormaximum value + */ rt_base_t rt_clk_round_rate(struct rt_clk *clk, rt_ubase_t rate) { rt_base_t res = -RT_EINVAL; @@ -761,6 +1031,14 @@ rt_base_t rt_clk_round_rate(struct rt_clk *clk, rt_ubase_t rate) return res; } +/** + * @brief Set clock parent object + * + * @param clk point to clock + * @param clk_parent point to parent clock + * + * @return rt_err_t RT_EOK on set clock parent sucessfully, and other value is failed. + */ rt_err_t rt_clk_set_parent(struct rt_clk *clk, struct rt_clk *clk_parent) { rt_err_t err = RT_EOK; @@ -777,6 +1055,14 @@ rt_err_t rt_clk_set_parent(struct rt_clk *clk, struct rt_clk *clk_parent) return err; } +/** + * @brief Get parent clock pointer + * + * @param clk child clock + * + * @return struct rt_clk* parent clock object pointer will be return, unless child + clock node havn't parent node instead return RT_NULL + */ struct rt_clk *rt_clk_get_parent(struct rt_clk *clk) { struct rt_clk *parent = RT_NULL; @@ -795,6 +1081,14 @@ struct rt_clk *rt_clk_get_parent(struct rt_clk *clk) return parent; } +/** + * @brief Get clock array pointer from ofw device node + * + * @param dev point to dev + * + * @return struct rt_clk_array* if use ofw and under normal circumstance, it will return + clock array pointer and other value is RT_NULL + */ struct rt_clk_array *rt_clk_get_array(struct rt_device *dev) { struct rt_clk_array *clk_arr = RT_NULL; @@ -806,6 +1100,15 @@ struct rt_clk_array *rt_clk_get_array(struct rt_device *dev) return clk_arr; } +/** + * @brief Get clock pointer from ofw device node by index + * + * @param dev point to dev + * @param index index of clock object + * + * @return struct rt_clk* if use ofw and under normal circumstance, it will return clock + pointer and other value is RT_NULL + */ struct rt_clk *rt_clk_get_by_index(struct rt_device *dev, int index) { struct rt_clk *clk = RT_NULL; @@ -817,6 +1120,15 @@ struct rt_clk *rt_clk_get_by_index(struct rt_device *dev, int index) return clk; } +/** + * @brief Get clock pointer from ofw device node by name + * + * @param dev point to dev + * @param name name of clock object + * + * @return struct rt_clk* if use ofw and under normal circumstance, it will return clock + pointer and other value is RT_NULL + */ struct rt_clk *rt_clk_get_by_name(struct rt_device *dev, const char *name) { struct rt_clk *clk = RT_NULL; @@ -828,6 +1140,12 @@ struct rt_clk *rt_clk_get_by_name(struct rt_device *dev, const char *name) return clk; } +/** + * @brief Put reference count of all colock in the clock array + * + * @param clk_arr point to clock array + * + */ void rt_clk_array_put(struct rt_clk_array *clk_arr) { if (clk_arr) @@ -848,6 +1166,12 @@ void rt_clk_array_put(struct rt_clk_array *clk_arr) } } +/** + * @brief Put reference count of clock + * + * @param clk point to clock + * + */ void rt_clk_put(struct rt_clk *clk) { if (clk) @@ -858,6 +1182,16 @@ void rt_clk_put(struct rt_clk *clk) } #ifdef RT_USING_OFW +/** + * @brief Get a clock object from a device tree node without acquiring a lock + * + * @param np point to ofw node + * @param index index of clock in ofw + * @param name connection identifier for the clock + * @param locked lock flag for indicating whether the caller holds the lock + * + * @return struct rt_clk* point to the newly created clock object, or an error pointer + */ static struct rt_clk *ofw_get_clk_no_lock(struct rt_ofw_node *np, int index, const char *name, rt_bool_t locked) { struct rt_clk *clk = RT_NULL; @@ -914,6 +1248,15 @@ static struct rt_clk *ofw_get_clk_no_lock(struct rt_ofw_node *np, int index, con return clk; } +/** + * @brief Get clock from ofw with acquiring a spin lock + * + * @param np point to ofw node + * @param index index of clock in ofw + * @param name connection identifier for the clock + * + * @return struct rt_clk* point to the newly created clock object, or an error pointer + */ static struct rt_clk *ofw_get_clk(struct rt_ofw_node *np, int index, const char *name) { struct rt_clk *clk; @@ -927,6 +1270,13 @@ static struct rt_clk *ofw_get_clk(struct rt_ofw_node *np, int index, const char return clk; } +/** + * @brief Get clock array from ofw + * + * @param np point to ofw node + * + * @return struct rt_clk_array* point to the newly created clock array, or an error pointer + */ struct rt_clk_array *rt_ofw_get_clk_array(struct rt_ofw_node *np) { int count; @@ -984,6 +1334,14 @@ struct rt_clk_array *rt_ofw_get_clk_array(struct rt_ofw_node *np) return clk_arr; } +/** + * @brief Get clock from ofw with acquiring a spin lock by index and node pointer + * + * @param np point to ofw node + * @param index index of clock in ofw + * + * @return struct rt_clk* point to the newly created clock object, or an error pointer + */ struct rt_clk *rt_ofw_get_clk(struct rt_ofw_node *np, int index) { struct rt_clk *clk = RT_NULL; @@ -996,6 +1354,14 @@ struct rt_clk *rt_ofw_get_clk(struct rt_ofw_node *np, int index) return clk; } +/** + * @brief Get clock from ofw with acquiring a spin lock by name + * + * @param np point to ofw node + * @param name name of clock will be returned + * + * @return struct rt_clk* point to the newly created clock object, or an error pointer + */ struct rt_clk *rt_ofw_get_clk_by_name(struct rt_ofw_node *np, const char *name) { struct rt_clk *clk = RT_NULL; @@ -1013,6 +1379,13 @@ struct rt_clk *rt_ofw_get_clk_by_name(struct rt_ofw_node *np, const char *name) return clk; } +/** + * @brief Count number of clocks in ofw + * + * @param clk_ofw_np point to ofw node + * + * @return rt_ssize_t number of clocks + */ rt_ssize_t rt_ofw_count_of_clk(struct rt_ofw_node *clk_ofw_np) { if (clk_ofw_np) @@ -1080,4 +1453,7 @@ rt_ssize_t rt_ofw_count_of_clk(struct rt_ofw_node *clk_ofw_np) return -RT_EINVAL; } + #endif /* RT_USING_OFW */ + +/**@}*/ \ No newline at end of file diff --git a/components/drivers/include/drivers/clk.h b/components/drivers/include/drivers/clk.h index 97491bf8beb..9ecf4c3bdff 100644 --- a/components/drivers/include/drivers/clk.h +++ b/components/drivers/include/drivers/clk.h @@ -1,11 +1,12 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2025 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2022-11-26 GuEe-GUI first version + * 2025-01-24 wumingzi add doxygen comment */ #ifndef __CLK_H__ @@ -16,29 +17,40 @@ #include #include +/** + * @addtogroup Drivers RTTHREAD Driver + * @defgroup clk clk + * @brief clk driver api + * @ingroup Drivers + * @addtogroup clk + * @{ + */ + #define RT_CLK_NODE_OBJ_NAME "CLKNP" struct rt_clk_ops; struct rt_reset_control_node; +/** + * @brief Clk node, it is a pat of clk source or controller + * @note Defined as the array like this if the CLK have multi out clocks: + * @code{.c} + * struct XYZ_single_clk + * { + * struct rt_clk_node parent; + * ... + * }; + * + * struct XYZ_multi_clk + * { + * struct rt_clk_node parent[N]; + * ... + * }; + * @endcode + * We assume the 'N' is the max value of element in 'clock-indices' if OFW. + */ struct rt_clk_node { - /* - * Defined as the array like this if if the CLK have multi out clocks: - * - * struct XYZ_single_clk - * { - * struct rt_clk_node parent; - * ... - * }; - * - * struct XYZ_multi_clk - * { - * struct rt_clk_node parent[N]; - * ... - * }; - * We assume the 'N' is the max value of element in 'clock-indices' if OFW. - */ struct rt_object rt_parent; rt_list_t list; @@ -62,6 +74,9 @@ struct rt_clk_node rt_size_t multi_clk; }; +/** + * @brief Constant rate clk + */ struct rt_clk_fixed_rate { struct rt_clk_node clk; @@ -70,6 +85,9 @@ struct rt_clk_fixed_rate rt_ubase_t fixed_accuracy; }; +/** + * @brief Clk object, it can be clk source or controller + */ struct rt_clk { struct rt_clk_node *clk_np; @@ -85,6 +103,9 @@ struct rt_clk void *priv; }; +/** + * @brief Clk array + */ struct rt_clk_array { rt_size_t count; @@ -118,6 +139,9 @@ struct rt_clk_notifier; typedef rt_err_t (*rt_clk_notifier_callback)(struct rt_clk_notifier *notifier, rt_ubase_t msg, rt_ubase_t old_rate, rt_ubase_t new_rate); +/** + * @brief Clock notifier, it containers of clock list and callback function + */ struct rt_clk_notifier { rt_list_t list; @@ -192,4 +216,6 @@ rt_inline rt_ssize_t rt_ofw_count_of_clk(struct rt_ofw_node *clk_ofw_np) } #endif /* RT_USING_OFW */ -#endif /* __CLK_H__ */ +/*! @}*/ + +#endif /* __CLK_H__ */ \ No newline at end of file diff --git a/documentation/Doxyfile b/documentation/Doxyfile index b6c3a1e2d29..a3b98424d67 100644 --- a/documentation/Doxyfile +++ b/documentation/Doxyfile @@ -869,6 +869,7 @@ INPUT = . \ ../include \ ../components/finsh \ ../components/drivers/include/drivers \ + ../components/drivers/clk \ ../components/dfs/dfs_v2/src \ ../components/dfs/dfs_v2/include From b3bf4c6c3b43ce0b53ede15742bcef989fe1e29d Mon Sep 17 00:00:00 2001 From: yekai <2857693944@qq.com> Date: Wed, 29 Jan 2025 21:09:43 +0800 Subject: [PATCH 31/51] [bsp][doc] add PeriphCommonClock_Config and MPU_Config --- .../How to make a STM32 BSP for RT-Thread.md | 10 +++++++++- ...266\344\275\234\346\225\231\347\250\213.md" | 10 +++++++++- bsp/stm32/docs/figures/board_mpu.png | Bin 0 -> 131354 bytes bsp/stm32/docs/figures/board_pclock.png | Bin 0 -> 283502 bytes bsp/stm32/docs/figures_en/board_mpu.png | Bin 0 -> 131354 bytes bsp/stm32/docs/figures_en/board_pclock.png | Bin 0 -> 283502 bytes 6 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 bsp/stm32/docs/figures/board_mpu.png create mode 100644 bsp/stm32/docs/figures/board_pclock.png create mode 100644 bsp/stm32/docs/figures_en/board_mpu.png create mode 100644 bsp/stm32/docs/figures_en/board_pclock.png diff --git a/bsp/stm32/docs/How to make a STM32 BSP for RT-Thread.md b/bsp/stm32/docs/How to make a STM32 BSP for RT-Thread.md index ff0ead3e28c..d8afb417334 100644 --- a/bsp/stm32/docs/How to make a STM32 BSP for RT-Thread.md +++ b/bsp/stm32/docs/How to make a STM32 BSP for RT-Thread.md @@ -100,10 +100,18 @@ Configure the system clock, peripheral pins, etc. The steps are shown in the fig #### 3.2.2 Copy initialization function -The function `SystemClock_Config()` is placed in the **board.c** file, which is responsible for initializing the system clock. When using the CubeMX tool to reconfigure the system clock, this function needs to be updated. This function is generated by the CubeMX tool and is placed in the file `board/CubeMX_Config/Src/main.c` by default. However, this file does not include in our project, so we need to copy this function from main.c to the board.c file. In the entire BSP making process, this function is the only function to be copied. The content of this function is as follows: +The function `SystemClock_Config()` is placed in the **board.c** file, which is responsible for initializing the system clock. When using the CubeMX tool to reconfigure the system clock, this function needs to be updated. This function is generated by the CubeMX tool and is placed in the file `board/CubeMX_Config/Src/main.c` by default. However, this file does not include in our project, so we need to copy this function from main.c to the board.c file. The content of this function is as follows: ![board_1](./figures_en/board_1.png) +If your MCU clock tree is relatively advanced and you have configured peripherals to use PLL2, PLL3, or other non-default settings, resulting in the generation of the `PeriphCommonClock_Config()` function, please copy it as well. Since `rt-thread` does not explicitly call this function, you can manually add a call to it within `SystemClock_Config()`. The function content may look like the following: + +![board_pclock](figures_en/board_pclock.png) + +If your MCU includes an MPU peripheral and you do not want to use the `Memory Protection` provided by `rt-thread`, but instead prefer the configuration generated by `CubeMX`, you can copy `MPU_Config()`. Similarly, since `rt-thread` does not explicitly call this function, you can use `INIT_BOARD_EXPORT` or other methods to ensure it is called automatically. The function content may look like the following (it is recommended to configure it carefully in sections for actual use): + +![board_mpu](figures_en/board_mpu.png) + The relevant parameters of FLASH and RAM are configured in the **board.h** file. What needs to be modified in this file is the parameters controlled by the two macros `STM32_FLASH_SIZE` and `STM32_SRAM_SIZE`. The flash size of the STM32F103C8Tx chip used in the BSP produced this time is 64k, and the size of the ram is 20k, so the file is modified as follows: ![Modified board.h](./figures_en/board_h.png) diff --git "a/bsp/stm32/docs/STM32\347\263\273\345\210\227BSP\345\210\266\344\275\234\346\225\231\347\250\213.md" "b/bsp/stm32/docs/STM32\347\263\273\345\210\227BSP\345\210\266\344\275\234\346\225\231\347\250\213.md" index b70fa1439b7..4fb48c67579 100644 --- "a/bsp/stm32/docs/STM32\347\263\273\345\210\227BSP\345\210\266\344\275\234\346\225\231\347\250\213.md" +++ "b/bsp/stm32/docs/STM32\347\263\273\345\210\227BSP\345\210\266\344\275\234\346\225\231\347\250\213.md" @@ -141,10 +141,18 @@ BSP 的制作过程分为如下五个步骤: 在 **board.c** 文件中存放了函数 `SystemClock_Config()` ,该函数负责初始化系统时钟。当使用 CubeMX 工具对系统时钟重新配置的时候,需要更新这个函数。 -该函数由 CubeMX 工具生成,默认存放在`board/CubeMX_Config/Src/main.c` 文件中。但是该文件并没有被包含到我们的工程中,因此需要将这个函数从 main.c 中拷贝到 board.c 文件中。在整个 BSP 的制作过程中,这个函数是唯一要要拷贝的函数,该函数内容如下所示: +该函数由 CubeMX 工具生成,默认存放在`board/CubeMX_Config/Src/main.c` 文件中。但是该文件并没有被包含到我们的工程中,因此需要将这个函数从 main.c 中拷贝到 board.c 文件中。该函数内容如下所示: ![board_1](./figures/board_1.png) +如果你的MCU时钟树较为高级,且配置了外设使用PLL2、PLL3等非默认情况,生成了`PeriphCommonClock_Config()`函数,请也拷贝它。由于`rt-thread`并不会显式调用它,可在`SystemClock_Config()`中手动增加调用它。该函数内容可能如下所示: + +![board_pclock](figures/board_pclock.png) + +如果你的MCU包含MPU外设且并不想使用`rt-thread`提供的`Memory Protection`,想使用`cubemx`配置的内容时,可以拷贝生成的`MPU_Config()`。同样`rt-thread`不会显式调用它,你可以修改一下后使用`INIT_BOARD_EXPORT`等方式让其自动调用。该函数内容可能如下所示(实际使用建议分块仔细配置): + +![board_mpu](figures/board_mpu.png) + 在 **board.h** 文件中配置了 FLASH 和 RAM 的相关参数,这个文件中需要修改的是 `STM32_FLASH_SIZE` 和 `STM32_SRAM_SIZE` 这两个宏控制的参数。本次制作的 BSP 所用的 STM32F103RBTx 芯片的 flash 大小为 128k,ram 的大小为 20k,因此对该文件作出如下的修改: ![修改 board.h](./figures/board_h.png) diff --git a/bsp/stm32/docs/figures/board_mpu.png b/bsp/stm32/docs/figures/board_mpu.png new file mode 100644 index 0000000000000000000000000000000000000000..655aafce627dc7490010dac39d8ee791b393633c GIT binary patch literal 131354 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 literal 0 HcmV?d00001 diff --git a/bsp/stm32/docs/figures/board_pclock.png b/bsp/stm32/docs/figures/board_pclock.png new file mode 100644 index 0000000000000000000000000000000000000000..69f4e78a3b3cfe40f528a3ab897bbc7da404d51c GIT binary patch literal 283502 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 cQ1)C%^eOpNtuQpx3wn1&qC4 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

i1Jh1Onf_gsYVGD%>$Bt43G;qUORoq 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

BaO$S>Ai%Lb@~l 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 literal 0 HcmV?d00001 diff --git a/bsp/stm32/docs/figures_en/board_pclock.png b/bsp/stm32/docs/figures_en/board_pclock.png new file mode 100644 index 0000000000000000000000000000000000000000..69f4e78a3b3cfe40f528a3ab897bbc7da404d51c GIT binary patch literal 283502 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 cQ1)C%^eOpNtuQpx3wn1&qC4 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

i1Jh1Onf_gsYVGD%>$Bt43G;qUORoq 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

BaO$S>Ai%Lb@~l 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 pgrzsE%d&4Z Date: Wed, 29 Jan 2025 21:22:35 +0800 Subject: [PATCH 32/51] [bsp][doc]use the default mpu conf of cubemx --- bsp/stm32/docs/figures/board_mpu.png | Bin 131354 -> 129972 bytes bsp/stm32/docs/figures_en/board_mpu.png | Bin 131354 -> 129972 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bsp/stm32/docs/figures/board_mpu.png b/bsp/stm32/docs/figures/board_mpu.png index 655aafce627dc7490010dac39d8ee791b393633c..64efb350c0facf77a871103afe65747be2c37f0c 100644 GIT binary patch literal 129972 zcmbrl1#lceuqD`H21}M@3oWpiEM{h~m|3!znaLK*VzQVlW@ct)W~LGIh)(w3zxVg{ z_G0fYW+u9$x+l9TD?2MQ->VS0Z(=BjIEVlMph$=dD*ynL?%U5F9`dbaausjt?SNn_ zuI>N;7&3o<5Lbyk`EQNy97WU|6>W?iUG(jZ07YvvTYU#dBW>)lRRH)5NC*okxu$|v zU0gM1AK1_DRy=BHY}8}!(nB!G?QT&Q!=!O2zQoCA8eK~b2kK_YA)@4frV_NB1#ij1 zqVUJr2`+Rlqi6L=MjP?S#m`jN~^y@!vKgwh`2Ke_Nt(jf36}=z;?%)k6QS>;x_n z{k?*2-wi_ldj-DHP6)qaW5|hNVun#k;#_TxgY>brEtteD0ygEL=o`$w*mqQupV7!l za@^4!>(=tibcUEi{J)^h6&<+|nZ^d;kgW}@-_tY|BJ}s+>C{;KCFO4?%n9xE`pHOodo1Gv9x&@tRX#_R{NzzbTW4eK`?g>a0l9VXG%ph}|8geH z)xniO{e$}YO6F^s9Xt+ht^nGL_0URSDob<9iY(aH$9u&`yW(Va|3*`zJj@63P2Uqn z7wq662*Ai|w^D*p*PKDEXKU@tNKq)2wiqokHfdPQh4jgsK=4hV*!u^teC!j6z&s<@ z=e(kmI03x5XD6rS!pM~CvZph?CFSL5vR4&?2kq9aquXRp4>kX4r(t~TZ^eKw0dM?y zPji*JR53Lx%E(h=fjn=jLgQU--%;5TESbq=%1$+B9KmagmAFE;6p`p-O2$WWUh0<< zLFeIm)YPBB=z<4*-4MR)%o0?L)WgFw**!I3RYF0HrK`vQzxr#%cgppGf)aB(G$#EuT)9LKW=Vpb2-{4WC9(NKN zq9UN~ymmH?A{(eIOYg5tda-m;(Gw_5OWV{FJ`~H1!B61PTVfBvz03?mvbhyn!}_ezr`RVfzxw2k!oT$KWvS;S0ga2W5u&sdo(x9?W?8r z8DlfV7CdQhe^2+4Lprj)sFBHgt{|f$a~BtE3ki!iGwIRJ{IWRmICsG{R$aSWY=;HI z^X(l%JFWFDzJR{M#2&NtdXMg1V9jM^^*ZQmA+_rla$CpuMei7ASvE@Xm$NnrCguIJ z6|L#DPog6`pKN6R==!`|-El$!E&LDQB#CL_C&-V@8igw!*{0Rmh7S_2s)T^2kfApp zHJuQ#?ST?k>v z7ZMn9D#~+c0}Y!|ldM+U#uxy zsSERoWkD2lgeF1LskYc~vU@<KJSLQ=)3?_8Xs zcz?^X4J8|q{QfwEis09ULq1}>g`nsBpN8J3d{~*vPOMHxMiw5hebJ#$_|yT5^wr#X z-xTl_eJDBN;(Gr{D)MPJ6$WT))N{LIlVF;H@P)zz_1-GbI` z{$M23Vi7RWwee_}&w9p7#kle4?l)|FB!cSzUmB_ikB<4y5zZ*9djDC|>suv3Q=sGn zJ1IB90Po4^f4M#-Reah`sW)=@5MsMiO2NAb0HL1BeS~MR#t~(zJHF$gJLKt?XWX_A z_{}>2z<+pgX>zK{<#!-U?Zb%zFcVR2WrLz5bcx;_YqUMd^tzD%%&8vS+nYP-BEjN7 zX5Ny{IK}{_4QpPYOt1-R!rRJcx8V9|Cd16~Gc@2iwYC4KiE7F7;!O(!B(L9I+Dxnd zLRzyEMoKShqxfo`-QlTsJa}gT0kl!ey1mZvYQonf*GGg?tw!f9HHdCc9SGSl^z9=c-C7` z`~A5-pd%q=xx8y8h5&pO%x#twAD;QHBRWs=um%l-bL3Rl>{>Fp3RQ*vFh@_&EJZ)e z9u8sQm$RnN)vuEy1p@;RSCdQS8m<7ki|XYJ!%cd7F;`%Y=2EK~Bq=;9iQJru^#S|% zP5zR!i@1A&K0I)3=OCadqu55vNFvauV``6%5l0~fbk~Klswzhdw3R3-${mA(7bg^E z5J{lC0+bAI<9dP~9??yUO%FZ}JG0iuX<+Pl#s7H^z%!*jPP{FASyC6QT+D@3=F0qj z*m!)L#Ee~HnnrkaifBBQnk$9n-A90NruAbt0}vmc@ggad9RA+Zy-nOK-294515++& zGLMdhm2J9{uyg;uZG)L>Rq=7;8?J9h#z|^Cyq=v#Q>bPE6#OtGU^iEfJp%=t+rYxt zshm#FY4;Vq55xo(3Y*cEcCOp_mdd!b_kUy1j(?U}j7!3!*S}UK=iFBYBe-rjYOIRw zRB-yjvw!vN7g@rS0t!acRyj+tNArc>T#vPD;+-ZXw53Kk?}{$X*3S#rQyx5NRI8A8 zV7y<}ObMXrBRJRHvzw499sFN3jTA60>=5w!lqa>&q3G<|WmUaWtA? z+RJBDctpTAuDyuAvV{qndMS2={i;5HZC_?W1&lkIrlYX&SgC=G1|~ONeLs!XCjG2w zbBGP`eV9LS*cBVAJMqJAage^NOQ^ppmf;JdHX+omf2Q54Ine^qkm~z}>%#KoWlEXu zB)){vx3!Ix*@rDcQJ)A$B4Z=AM%1yA%MzDpSoJ=(JqD}sBFz}ExxS0<7Jz^sU#*nu8O6C3w`AV1-0u;i1U zv_DH7P=@p?YbwlKmg+;=eI%FGu5nGak#`6W&q%GGCsb_06I0s!_}qkvf) zpu%jp__t}J)`t%R94E%rMJ-tZYztmeKgp>m59@PQp5+lpL`na8>B_!0E%upPDSxp^ z-+Z-p94X&YOF&auVXYIJ9)@nRHIn@EPP2w)Pi%W9fp9aa7d)WFswh2Z- zc*_coutOq32#-FNMX|MKaer*D28CPH=}IP&wqBaUFLTLc)nr{f!_+!;lXzwE)`z>E zn!QvmU%Fu5y6W`s+>5>5Tx3#IK0W%JJSq#hvBw#Cdqtk%8@fVp9tYMh)v=)I)BFv% z(}^E;Hsn8d(F!JkgQAL1#7- z#;ZHk-ef){$hT-G?=BiHLTq33mc^QBbMrQ%ok`xZB~{=N6|PtA#N}g_8NF?Tcr4Vms&0x0Nu9I?yZVfKwziW7Pd5~&%~k$ z+S|u({e8>PNTgHVZhOnxmQmJR*b|&2|0B=y`)_&Pg3DhiME)xbTz`Evx}f#{M!I(^ zHI7P|OYDPjDi*|v{x{#tI_^U8ZtwP%lT_Tl=c(3;+LP7rvDQ8h@G2nrD;^!ky?q6Q zPAp8nLKUTyvcB}aR8jBW0EnO`;_($W9sE&UO9l-b2?nJt5LxkrTis;9J#pxj>pk&+?JRz;1n)0>;kNl3{*L%|qx< zAfT5G`AT@V?tr@M~UBrS!BxV^#}T)k zK#4y5m+YdT|Cexi#)U}ofhbyE(856^He}@^eh{Gd2NtOG1vY*d{Tn?h9`IW;{uz5q zVr$2sIj?FAx|@sTPaGKbD+Vt*K}gDHaYuF^3WqKRK8k<$L+rSXG8+BtB7rouaH}3e z@DI*m+U^;;%+|Q7011;0pQ5}tAZEqkB$w*8`TY_Z~u#~=F^K(pGvFp7g%<>e~Tr7GKUH7KwDVQNk0zxIjQibSXR>NNHJ&z8qw ze40YpW+wk*5ZEmm)t*Ac{yS&ZnqI#o!VI96KtlMa|J3WWnV5p#v~WG<5HOY%0r|Io z2ksY01nO_=-`hEM=YLi=^#2C?Z*Bjt-kSfpNb+CBsD@o7!h{USiP^aY8jcKjaKECr zv_S^rP*-OTn>``A_I=1#$w+Et9`>`Cdmfk{%XJ?vYfvSffaCeiHA!8-VoohJ5{E07`O^oCs8G0lym+hm{y|F6`~g|kcPnyQt` zR!&=A_)YISLFXEoN_9{4gmjV4$<=H3?P#)cfT3?f9G^Yy@1YS|gAKa*)X_#;{cIC$OhNER;?pi+ zu>t(f%ki2^_1g$NUTRqo@B{FTTbl|QJ^Jrb#v3#&7lsmFoU0F0f^>N&CJnZIp21gF z?+I70=El==WVBz$$@gGyxo3BAU+?c$HEhrprt;V{el9uYwYiu75T$RV%%!#1o;;nO z4~Uh~@>;Hv7~E_tkx))*eSNfvR7q)Fah5}w^@achyD?S#&yV6+nwLgo0?YCXJ%8vu zK+>t8ro!ORsoh!EXq$fV2Yj~$y$+h|}_Z{v~5OiMe}{>VD>hk~}O8db^tA}q^FAy~1Gv^xajh>ew}t*(rWb?TWa zcjzh2V~7?Ie*d1!>?pfGBNTimWpg^Kb>ntglw|9@Nn#?~coG2L8Cwo2^7Cu>@yBfc zIP%o-+3lv*E%$I|j4%%J^H;^QkA!lLuCfWR{F*bTUNF!7cyXLQlRxtEO5rT+Lia+S9M|7K_FVkrRBx%XlbhSYPGWhUK3lZGc%-QLLtygZiM?9{k!y*`=Vb|LASrJjTq#(Q#FaLBCGB8nF4?vJ``~Et=miATfO(jSw2zop-uOx`!X6^m;w%dKeOJ6g0A0Ed+S=Mr(U;YJhH6xOBZN zZ?`z?g1ifEZwtT?b+rfQr^J#;Nrm;&=yMs1wZ%`#p6_-|#!}w@;d>a9BHUMp&|Chx ztNU7KehOOX#)aF^-C!`bXZJON=1C_}+`sCfI)3zV$^AK(gOyD_cV!Y;uaZutjZH1y z0asBpiai^QjswdMpa+pjh!`8WC27R{p1W%?ES8^NT6^Zf;XvK0A4fWF2(XzCTEbt>badN1nA0PoG;?;}RVqPaX?*&w-T6f4PC0g!w z*C>)VD$CbaAJCA!^mLT4G3z4z3&GKpy4uD2{&|qo!({WNT+pR%3p1dpcRD-9cdi-H zbtPf!<{M~W}#wOEXezU zPnMQev~@k5{&eoGvN!t-ZE4PblM0CoK55DeEzw@L=9)Go>Dl&%yAXDnT(s&qfBFdA zvGYVr2>8tD93Ge&gDo{j@k^L%JorhaKSNt+R_BbD6EoXho@KO}loZ&ld(d0cb&iSn zmvP|%>?ol}WVxLXC8h=4jagqyXzx4^n<_EMB*l)AbW|?;Zxz|urN`h5AB}z`x(6uu zN#g)@h-vQtU&Q{EmwQabhRc!+R<`9QLq?O*2g90;Sw5TcEPy`%bN=;W?V@FAC1)AS zd2v8<9-*my+~wCfq&OLEO4@{n*vfz|5BPv4V`(L$o}vUIBzCXFoxKO#H4V4A?bu~k zJdcCLhfjkboyO{M+B&`v_gdfR&TmYw)3oPpU_H3hE<+D_PFU&b97AXFIO#s0ukR7k z|6mP`7@204+Njs3v{=VO1ptzUm?SQZv-0%)We>~sTbt_8vpWpo;fvtWxJz)X;%ZN?&usZea(Gm27+P(KmE39-5 zF^>K(D=CuJN_+u7yZ=BkAiIX0gfTeWNak$y_{I3nm`(4kz81(lfbt@ak8$E*;Rm&N zx$62wi&|PWmxTcck`H4N*5hm5En~BDOT*gps*2^NK@!_}0r+dv2X8@|)nW*V(VErr zr@7=@D<^Vqn#+(RW~)7IG)FbIK?ERfl^%Cb!#I@MaQ-8S_F+7f5-K< zo#RC3^iF~O6+PrUyIEo3dK72c$g`Dg2@gn(g0hYL_>~4uMQUD15Txe>*&S_7Ns3MS zS&vEAoY8iwp%Q~Pvd1_gVns{g#EJnv%OU^@a44P(%L|?z1nUBNwZ5 zUqo!AedYVI609TjLoFkUfdkF=BARqey^%e@{5FH~({CP^nGvL4crL?5$O6lU8JCm* zL^~yQJ}eu^_j63%49Fz;j^tq+^r!Z`<5my|zDnXHSC4NuT)s%3 zPu#OvS7E-r)os0(H12Ht;m~OE4VyKob!AS(fb(Vsm+uH6>$>77X?{LDBlY|yz+M)v zJEOriZzkq(GVCnP6bfi!GI^#RA4%rhEe1V{p51y-4i>+x8&>~x=aCq0f1X}E2Cg~#iC>1b7lQ^tp zq?xSD@a@B#9vjjURQ6ctx`BFhTCgi08+PEF9)GZ*5|vLA?3W; zVP(pWiW0_S&nsFfsEA!GD2cPlcOv4TDH9!CM4;?LG5f`?m@f8md1rn99@4%hXSt2M z`f}(e3`+h*WfjTbqYX`;SvqwNpUdB$sQbs&?KHOw%hw+63#N{7s|tofZ~Os(XsIY! zMI0HCXyYqa+@KNOO#IHVwwN#o+xhkG8HqPs)rsLvmmc@AcSvrn87wpIldZ$zHu(4{ z{1i@{8rR{3iL7(C>NGL03)4><7+1RMt@kV@>L&qKEpbK?hivbFOwri@?4s+maty^y zG~D#Z&c~ku@Y!H|3n~X(D1)1b% z=P*-7pHF7Yt0B6ppcLpUi|y-Q*-UVQzZWK5&6lOP+z~1%(_5C_**jR&SK!E6JylJr zo%E{U^+PPsoPIz$nqo5l=-aq@Qv0yzW$cu0kypx>5T6d+bs_vo|6P4w@_Nw(4&7SO z8hDT|E&D@rWjPu~A&s}$XC-E({iG6Sa(0@&u;I`CWvV)!z~U&Z$9@yj&ozD#5`!Pl z_lPWInr*~+2}d{wS13yht}nuMw~T!4tyA(2?|d$2Jo3hp?(Hrp?*s+Sht_Wn+Xx7K z194Q(e*BzD_hUr%CTU<^9V8L4ApFF~vdzV5T{5FpvDCSBAdRih?k z__Ek(Rw)#M&QL5F;dS$Y@2PZMI-Q_;H-%d5byCOe$o32J2}k3WTadqRt>pfYDvPq^ zhNAq`WbIO{R|!55Efy*;rE1j@-D!|s=$#^1*!XMG)_=mOOUPNA(w11at=sYlBw(*G z!is+7IX$^5ZI1sBNJhH@;S+PGk^(4>DEX@7pBm~69UEHJjePHYGmG1-d>74OHm;zxO@s#afA(71^HeOK0G@so z+xYPc@c1m$i}`f>jscrTbX!>CT%b;b_rAM#!99l+Q0rc?xRM+jOdAzWx*{T_?|spq zT4DSH$;U~o+w{#45Euzg?t{h=M7ZZu_?lFh!^2sF#idWgN5zHRv-t{==^yDvdZK;K z)o4>HHu4%G?%YLkx(1~_u}B`ci#J}U5W2tk!Qc#VgdT0KC`i2MvOE2ID-=RiieSU1n9cEg6>{ zueb=ZI7El{OrL4#K3*S*&V$C^B5V4V8Z#28%&anGI-g|=(bWY@zjJ?P-FYF5=;R$V zS{W#Y#M2{nT2|mT``F^o3qnrbcnaxR3lwT1GZ`)VOp)mLvU{ePDWibv&;c+nL}sm2 zMaazNbbU*e67L)=jl22~2GueX;Iitq54t}szALwEuMOgJdwq6sf4=M7D;Yjkz1_Y5 zEKhhen3Rh;_yWSt@Fwm?cY4uHtwHJdOS8sY@X%AkVV{T`(>DGW^*R1#QL8Yd$dI22 zDonc%5`s{sn&E5i-M>gspsrWaGg9)`9Uq5%f;p6JP^8lt$yeN8QZkClH*jX~mvrmS z*9x!5t)9mzxrnUD>(VryKsAqS!I2q7EDypFNi1|Dw)cAb-*W@4UY8j!?}|UH-P{vP zj^6ND)Be($cfw82tP#O93;=+bj|Aw82g*oB08rZNA*-4~o6kz9eK`eseBE?-D(S+B zVzB$hNDIF0&n~uMW44`1r9^luHxL0o4nm|Ay3oBzzIyHZH;_(c4!H%C=b!P_Zem?w>F&2#&_={}!yZLmzlKaS6ym&$m@HqQGo_OD8kIBC07 zo@S#pY|401@a(2%)QA|qVgLd=J-Je`0J8|(H&sm@Yg}f7(;YPkfM5JQVKBGhp}{A> zx9)zUuqa}0Qb~OkH5Pm2)#8=vCnhkne@9SU@h+y>M%HRCd3L-N-QiLzXOW!KVM$Hh z9q4;AXf`{W>m&}#Z@YyBBHC4Rr+p?aIF`pNis zGL=ARgsK|rqda{3xIUR=(&6jfdNUJFJY{vv%t;B6ZK5Nh9Xi3h_EpIn_Ze6qt-gR%;}>4v#CQd_j3n z1O0^7#rDpr``+b{06H;l_0t%#dHpBm&}^Ak@XK<`SjOa4!%5WV+t9N$*JbB}a@r;w2Jj6f9CI`Zx^1y}t?quUOR?5iv-3I;i&Q=UGL0Vt6IrO|X$F4Rn9{75 zSWzuLtj%*(v8;~oe5pTqwd7w-VAHLB1t%0@e#otSEAw|}cs`#{dhKJ?Bzitv!rqix zFZ5^GP^~|1)-P8rmwC5C{UkzW$LAU6`TAX*S8rnvW~B!P+0ZZ0^VkKqR5^lR zF>A~i2L0hC4Ii?nSJ*C-x_!bQ9|c}JQruDcNv_{Ez#bnN_+`Yi!lzCgU#Oh^#;359 z=iKgm<>gE`d47>ByzEarTUKL8Qiv6!EJc0+-Frr)vIm2vqya-TN0t%+@< zshmXKsQ7o>+w_JBRUi0HUJL-BSiS0O&Ihw&CFJE<5F%d+FDl*S_-wTt%rG1LE7G44 zzJem~6B*od`EtKm*jcR}w)se)ZRK zlR1b5Q|Fwm90u3W_?C1|@Mh$P1^BWBgbF>6{J$%-ANs3a9eZcNPpTN3Xdm@j;2>T? z66vvPCHshOVA5@TYB}V9?hgPXWiUC%cV;?j9kmiukWHb*^-D3kPQGj6-5g;2hm_C< z_amE6_z3;ONZ?Wazi~wWEBx^fVENy{9{UU~7W3 zaG->SPq+Ali|fyO&o_KHL|`#93!3Xc*sj)U|D{ZHfRXFJnbql8oTp#~)3Ni9>w3`F z3*p<0eGU?)shyD_HBNf(a{o+8cIbDdVIwHv>o1OxSmy>K`(Zr%yJ_MM+CtB zMDQmuB*kd^X4d=x;vZs}Wihb5TJb3mqIhuQAlc58B^lIV_d@^``7d$>j{*_7m^Emb z=UGW8#zl@3`qYD0t1~4R%faZ-BJ7!2cUW z`u`bQ`zQN<$G8F)HzzWcIK6LH+jW=~#1Cs1N#2Euv{+PAJEk?=mZH9)&bI!Go9GBK z!Iw^~stG9wjj$d$0)~mD+V$=?Aovf{KXfZBmXH2wTyaGX?p#Wk(!aMC%#J%g`x~O{ z)%z<vNAM3&jn7El4%zXJILLqAzEbKX`n= zh`K)zm?3yx?{pVzDtiaW1&yw(6%~z+4;EXyU;yXiYL(pG-nY$ZxgQ{bxWHe!4h}`9 z`Q@l8$fi+Hi+{Vn+QC^R^gmLp7cVviD4~00e<6aN)dg>qdv`}sL4FO4mcm-UB6BuD z{9e+EODZm9;zow|24+fK3yWb;-b-!`YoM~^gD^BtT@cs-xZMwtu%lZhg9OgQhQ(1E zU_C%0?-Lm9zo*cZYaO>ZbFmz1K4fj$7g%RM4Gf@{s$k;nc-LOxK%l3~ic1TES42Ad zU0&4;T8v+VVVh>(45~@q?u|yQ>t-1VgoPzN2vO3ka{%CezzC;|6WDt})oy94fhkfGXB_Zlr7vl%* zIXh`@7J?L3Cr5K>kUX249GSDs$;x)l_oR z-RBvC*{KYt8ra>UqSV51M9fYLv&onagQta*5(RTHRq4NBySztAb?$GS)*3$^J6W?A zU2f#Kh|FO25Ol2Q(3hLt!5=TQ?_ZHsBDe^a%#!{VdTru3S#=9W+B;XOxb_11v(8eV zP+q)&nNV@~w>A};Z|caxMSugo{mgEXFtY`yn;HNs3#u~6u;T3~1q=#=y+w^0&d|k8 ztStjW;`@Xp`+%Hn!(>5zVH#bBtN6<*lYvD`XFYaaD1Hcj zUG1pVF$iB9&_P_(nh})Pc=A_`6&*#LOlA)C*Wj5RN+k8GzE~$`AhXN=@X91$35QCm z82Oukt+Ya4s@q7q)&2?s3U+LgnN=x;*$4j~GICj6z3Jx-8IzB@#ALLo*yBY-Qdi4( zKQubdMOq?BYB+Qr!C-v&8hb5VWrpru)4|? zIe}3>nA)m4auwT6cyF=F@XuW*XXzUv8S8s=VBh0dw#!k0H7_J z|4s&G5cG8hKDTizYIhd?V4Agp224Y&*J!7=wn+DxkH!$6PU2Hg<3B<8Ce)1SaQPNya=3wkzm%odRK``+UAwR#m zdkdt-Rg>Atv{3_Nl8tSs+L+5VzY+d*!RSr?!L}z5PAW;-kz{Phk4bHnSSg{YOWa;mQS3-%q+#r0;l`3raArZNf{`j7BrSX z-fiAx+^*P|$DCbhK!W;iJa$8edKALI8!5r%8#nQLUku@h$5 zph6BFh@JGOMC{2$l70aXYMWJ22rI6|Pzgl{5J3?j=hs2kZ^xOX?nNYPiw7b~ojW zw0+KAn#DzxTb}Y({oLF`(7DoSES#)r15Mqw468!+oGU+DQORNSK7Htz1{fHSrS2;g zRr;NMV(J)5u;sN`f>!rlmN$VZH{oZo-B0>}V*p&;3?nRUKxR6wn^am)Y!jgxot}o*ZoVV(^Mmk)c$vEY#c?4Z#zs(FrywcRx5mt?Q$WiT zJ3V9U1j)~T8Fz6BvBXkKg&2W-_j}T0@;8qN3qMzTOhL%IY^79mauV>Ba?x6TlmeaS)5!PrIS0P@ znR?u!tvwTI!qSEK^7a_T(QUhp8qHQbVN%rUyfQ&WIDlV(Q~&1jPXk2(6&!r z$6ABk(7z|Fpk>RJ9Z)-E^dYZ$Er5*_D6baEWLBEEU}w-eg$iUnvsOK<+`XRuH~nq4 zKnEgJkKhO3<2yK@3kczZsi->)KYdWws-W?$tf@J$-I~He`W1-=?c|-ix5bOMCAW79 zF7sW|DvZws@8hF5r;I)-(#GWd`Vp}%8S)O7dOYDs%i~=@UY{g80IchM=-{(gN+tw+ z3oHL<7_t>O_1JvhgM=@c{+*Uu&duAoUe+|hk3ghXRwy4ahWFJ1qP?mR#h*xCpV!&2 z{29l8P-+iawe~kmOv87MNv!xgt%?$BB@NNHDiv2>{h}ZQuyllU)@g}zl0 zkb?1JleXG=8%fP#im6M!G&gBXpIUNy>_C6YAc$q>Oh-cvlP@0Ni&vhpYd@~*65_ka z`y~@B6Z<2#cC%{`@8Va0AJ462=@8W=ZekJ+jV+FbWaM*d{!!(*--1O|#GXB-qC#KK zxf&#Jv)AR0|HZlY@HvPElgR*+iMYdjh9#BDGcR*+bE)pNpk=d!&jFNbDkynWARa;F zPldmWMHMNu_AJKY8mt(9wGGk#r?T=Qr|VO3R_!H7Hh<{X+G$Nj!gl392Z&8F`Sn5w zzZ>gq>mb08aC0uzgi$D6+O&g$U;YV)QGYhZQStWf5wZN}B>>(H?O$XO<~EW^=V1Jy zN#U}Ay;4zKd2`cy3?AjPrPEv7Uk2R%$M(hNAA0NmL6mJm{@uGp{7flzmis~n-^v52qW5tk*`{njm()Cu_+$v@I*1DDZ85rJDE}S zGoGhTbxHB_nD!?_Wn{k+;3>%;xs>m}2`|itlFAxTOMCoYNg& zg5E^hsG+31JarLRonc}%g3svbA|0P)3NL!N?tD^RzN{u_vA>q`J<4n>qMcYQYb`#M zEP@yB^47<&c^>|JzFA*t-@j9Z`l~vg;{jC4^QW%ZobLu7u0tJqHS!-7V-+@Fg#Cww zdU!qi%vcUnQr?G)KHB1=w4~da4ccYS*FTcy^$2?3@GBSp&#WegPosH}F_T%y5l|;50m}a)*X9(c?w(1CSdzB=` zF!#0ZI&>d+j~aZ2BcZwjeUJpzH%(shcNgdCs(0`Baed8J`@6SE?Z$ut;%?%}|MW|` z8UNhf!Vt#8!p5evH&3ykI!e*#i39(P%Hv8Vuk)~f(*3x4l z?2hMaD(!AysGiige+&*KX}$%mwVLejm9Keiwvtd?4D>o|!G0evOLnn*Szq??+V|zO zy}V56g8ic-YnnkmF6V4He!A-6e72T0f6y>h^i1|pf|}dUR_istAa*JC>z0l0s|vz> zyY|2qp77uPzW*Qdnx0mvd*}f8)a0YkWarO7vU3mvi^d01ONHBLiEL`ILS`1q0WEFM z0y5*tqMdi1>}I&XlLMqh1P*JGK4o#Mi&h=2Y}VC0Osttm2!cdlj1m?V1%)7r;Ed1c z=C-Q$ovw_9d!ekL1x=5@KD=Mqq8eaJtW0R~=U1ByBn?b6f2-ZlD!VZV$IpC#W_ zV}sJ$s)LyN^k{PSiQ0VSZY?ZD3Y2IE{u{zu1VaG%0`l5gCCpk|+o1}!oT+KgpHYLt z4ax`f&?6;79aVHFtSPA!D?gpd8{vP z&oX?J=|B|bp3liE!B1&hZn#(u4;lvFC%kKXLPMjG(5H$xTd6TyUgOq2xW4hx;rq7X z9t|tqepcy`7j%Ra0a|H%b>y+x2@QI+G19ubQT}mJUlPrd`eL_Ui4&aRaF(Ic=TQp| zMHE}T*damMvciryU8y~j&N*w)B=E{M86_1J&FoC~IcyUX%&h1`P#}BR0(~`GQA5Ze zj~KAR% zmVbfCP+yd^KNifhzbv4xV67Dshk>$x4Ew#DrvK1>Y_?pxf@&uHQJ=#`xEvI9gAhIJ z29$`$uzTIakQVWH=6&bC^_2MYk5~AQG-A?!>#m%d{Gpf1x#e|iP81Swl+`(DI`q?e zV`>4v(d9MQ*2e36yd)(6-AJzu!0KHWgJvCOwSA+7L`Z0z7|QFKcfUP5xLF zQN6|P>oX$LKT>Yn&Zp4+a&^|S;n=vjP1X)d37ty65)niACYwK&=Fjc`f}WnhFCJa? z*Xfs-^UCbKZgLB5*uVQVP_V`=5<(gq^O6ZMW8+B4<2bFXP*`Rq>H81mT>OP;y)SQi zSJMx9AsD`XQO_KuHiPxuLW;i~93*)*EA{3dW9qIND!Cf1r$J#)P(>zf71NN6sU8mf zPcFcJaw~v1&hSu7UGHnBi>NZrs*lpn!D0CLC(~*c(1LjJLG7m+xX3kI{j$`)@Q|eT zL}Cyf1#E)Z!iaCXE?9Nh%Mb6tQyLn%fjj7*#E^Jcmx6=g`xJ7SrFI$TF^|ZwzDss{ zndx}!*C9gyh|ek_lmPl(HgS*AeRtr#_xTatUrxPHUl>U4&1X@=rDdxuf8$usoH+jt zt)ZO9V7R|&lwEVUleoTrq#a3YvR+Ho`K%zWQPrbSJOK>{2gN+g7UM=)*urB1``sR= zn{lFH|75=^q%J}5T0|cIb?foT8OT?kFDXzqEfMlEI#GYTrTSsUU6cay2M!!z#U;a{;8uOabYi1EWaS$3Ezyv#&L-Q+J$ef*T9Wp4L%A>J%v?T=;RX3miO3nS}gGWeO= ziqj8i8F)n}FL7CArOPBin7-%<3jMjwXdHq->MgYn_TLQ=D3p<2LBxJh3(T;01*wgr z2cHeH&a)+y4~D+Jt#-m*M`7c#E+eL4X|Ekee`Y8s$_Tp(N?37$$bLA6hV%^wyoD0g zIyG$&31m?3&Mv2=!My73i&i`mz)y6@R?fp_aj9kxHbKzvY*pB?F3!3U1^9?zOq(2eF!*3WsI7L!>X%AHxO-@9cLgr1Y-58Xr`V=8+-M?y3h}UA}$ZzV>L?a{{jR$*$t6 zLB+T!wCL$kd&lnL#0s%bS-FK5h(%lZGSX;(h_=xy)2-G{7=g#`EL>hFS7cf;E$e5R zw~ef7B`Sd5Kz=ojj+T42O*x{V;?z&B7i8&(SYMseqpyb(mX&~P$Jy#V77EHYI=AbC zvEE6oqfjw|*Y50vGD!ak1(*Qw7vae-Kl9@Tr42GCd2LtQ{(3l;UI>61868O-&=bZ3 z;Gsxg-ghkJu`R(@9x0itTYk6XmMvvrcirMQE9fXPH+9nMAK=eoCZ*-@p99gKw1f~4 zfvbi-Fj9YsU(Q%%;s3;Ku!$&e*H+&LI#CbpLxe6yCbsO= z{Xb}X%c!`Trd@b|APE}W2^QQvSb_%)?hxE{a2p5#LeSt&fZ*;7?(Xgm0}SrYH@WZU z`PRG6I)BcO_t(tYy`{UWcI~dZ>Z&FyytHVyuD8tEEw&B4Sc0O5tddNiVAFIk;w!5q&J+~3Ow4M$EZ-tgyT~m;~E-2=;UHh^Ndbp`Bx*h)&4NSeC z5d5B)nRx5-tIR%qcU8ru1&dtJfdSGPDf%#BF{fkjI2g;OUHAZdX~1Hk05wTho}j_~ zs5dqwsBi-d-sb&q?+y-6#MQN(K7Cdw#EN?5yK8je@iF_PE;q+uMeFs0Zc8iCS@(MT z*UQ=7_z3<4FEARDb=yP0b@KiPvT{-)oQPb{15YVJ+RUzF-Q|ZG?UENwSYF?4Oi<+WV+fny z{e(Ur4CbIU0elcHr=UpG+M5PFO--#vtu(pzt=J^33Ha^i=7X+`HBHSI_x9I8X&O&g zN5SQh-mPZ=+z=MWMZk+jQ>3|=?rJa%Rh zi)dp4-ET$xcD=dIl77kG&Tln}>e2BvQm@^Y-AF>4UpqXXPi2;z+-?xGy1(lZXMvgX ze%g4RZ-dWLB+h1nH;b69?v@!c)Iz^Dz@fz+O+!(LCTlMV7kdgRO2=w71X~J%fRC*9 zw(a}%EuwxrKCBHNw>1sbN76tXD)4uD89M3b*K4WTcRwdQnj=@{?Z=f_js=Prl4 zeD{PPD$rf7%w`*EF6WHefzi_1(Ji~$Ti9jA1d<`&_1>3hww>J;{~nKqbqkLbN@52y zAh5q7D6m$TCQ{NwWQ)UozGKBmO~9T8JM=kc4|X!_&>v+NnSainr2p{uD}_R7g-iC= zW&9q^{S)Ia)m2P}`2XcL-QA+3&c2?i>XjNuQFq(g`Q3SQ>!fc?BtL)tWk7AA!oOFk zJ(BP-oF)3-o`8S81~kZPRvEk6{Sw;7%xnv`EGaH#o9iaU>3Z6IO)#fE!!ujZ!RD>} zPiOjR=>X#iy!eIUb*)p>qu>cj$a!;&7#QT@_;r5Yx#5Uf93i2i>d!olZsg>@FuEB}ffWVRWrI^ix^50vVQNg2tZBfhLo$+ro@@)BK zpkVDV=A!BSG|Yql_f|vnP_7}7dM0MV;$pdT+-&+HdD>ca9sD!TZ;3fB|4iTZIW`xY zIok7ChLf49l_wC0xK)`%6YKQSA4l;!KjEJzl?iBPiv!TI3IlKy!8!~f(Q{uksob?o zr>3y}?MW?7e!US_uLm=3xFsqo&$3NjW3HS&^FK1IVs?Hi#U0IJC}i&!i#68`NBUPx zWy(~57S`g{e7NlneKN`d9k>JhHETGZqyys40Tf zw3f6`WJXuH#3Q@u(ztv*gYZQz8Uj@<|IrHPBW$=^X+fn3bDdC*W0GTjVKlEV$$zzE zdocmp{I61-8-4s=*Q)=aoUA0HVEe5|{mcbro6RBpgu@2;vPqP60@dlBKl){9pN|Xh z%6z7!zDJ`{vAV;FbgSXjvNZ0=Knf7P4(TU_H8p;8z(~DnEJ@{cj;JnZ zx&3MV{GK5`^Qm)goH7ko~ z0%)L-d@|5npu`2m>^&Up&Ardr7f|^R^b`=HaToE+62idlgK4q#DHvm z0Qf@+m>5{tCJOPygs@$--!s=mcdMkP)pBnqSA^?|pB0zrm-83>T*N=xA?9~cBHhn; z#l_1*z(6Ohs37J4qbJte3%}0o>3pOcG-g;-s;@kCa797U`lIF|2F#2god)>ITx>Im zw7lUtWgs!CiJ7hw)zBmQl3{2-dVjyfr@@exPzLNEY)4Q%cBw3D`8zxf5+2Umz_Q%6 z?9PIC>aW5dHh%#=WtA2(+N}Nl(X!^mSVMDXxMSzi;k$8Ozh29D0e;#nh#)5N2`H|> zW0kaHwi=atETx41n(}io*g4sulXo)_x3@E<@dNGX)e^Rej=a9X(ih76lIypIdSz_% zrKOtddYP^RWj3NdoM@zjI=p&q5m%2lZ{=(=4n~??D4Dl2_;+^o=p3wrr(neiJYGvP z30QoHCC+$l=rhpjwHb?J5({`|sK0!=A(YDGLd^5cUbG3@OIurA+rYVP*{=#l+1VR6!@cBYOyv6e!%=x5^)pJP&I4KW!N{>$)qG*Erysp%m1IFc)6@yZMd z9aBjW?f9rF|M=sMT~noRE+e?gV!gk->8WtL7wT4On5(!`V>|@Wpm~NIEqh-ku>o}e zq=TIb#n9Aqb(9a0=`OPlHY%5Xr#^;`y&rS}@ts1}gzFPHw}%A=?c03KW=i@>`EM|u z?N2IF;nvfvNK!Ov;)%|2tF*dBjmU-Op{Mz?ar?4--0CyQ)5HQ{(w!I&rvXzqk!ic< z7V|kJSHoHCrTW@yYQL4MPrE;kF$BF?hFn`LuV1cy(%09l&+ClN*La6rqm6`lrReEt z%`i31GhNQWLpUwQyhlOC?{3MArKBdAph8;^hW5roSVJVAsH%pI;Hp@MSOb6GMQoaP za*Ec_6A0eAX*(e@OS6HJH@EWon4cW~>YnHiORZnkhx*<`aKQ+kTGeJtQoN@Jzq4Bk z8)SOEk$d;;uNqKTBvv4DQH-Sx@kqUG1sGOZA2qWiRjLuCDyfmgo!(DEdpkE!+B<;# z0^-7uaj7t2Ui{_4ojuf{nQsLSZGMUD*PogTTB0M;MVvIIe8gKK1(DW-cr&ijV#ODO z7Ey@2Wveo_Rvrw=!}GirT;1pHRay?SZ8&WTIc4g;(b3nGX}2|M6-#*xa^612T;^;$ z%`D^=+ObX9c+88ezWCj!G1|>m4~lum$=R76W}#+e5~N;GwemPqauF(I(}#KI>vdQf z%X~Cme1!L%wmXv~f{YWWlVodDb46c`TXBp0-SFS0{X|$qVMw;Ip`H9C%IcMh;EzWnZri@@)0$H}Z&G`;91)9Pdo;7YC~t z7q%A$=m{ZuEzVuR>3G>o=43T@G_HQ)u7w?3ynAChj0JJlwR&Z^7bzOJ)-AI@`_Bx6 z@!9R0XCAZHLFPxj=&51JL!1+$L@M!#Gez7*Kb~$21Umt$J-eI}oI;$$^1POw3ceBS zEp5TU2`Z|3=Ik=Dydf+!_yhzq)?LC|t@E_D9kzWygZ48cd8nz{07K4MOVp`$+r33q#wP8{CmRa~j2Gl)PkBRn zyJ!$d&vtXa1Nt`Br_gZ9Jwj9}-+Gy{iT<~5LU2GFy@1gULI}WPGabdHX=}5P@gSx4 zS299~vDHx-PY_B|h;(n>ACK=tHY6IQWvt9<=M%BsYYEowrMi~;t$ZUweZBot1z4$R zTp>!O>I@ytu@Hj;On)a4VlbpP7(NF>W_c7n5-kcYjerEkoL{N#C5sJ{k1!)yr#K*k zChXd>i|bexAEef9WOPa2C^+@5TQ2$KFz|CjwzH@9C)yY6ekmUh-m0bJYFvK#`W{%eAY+4}?T58p#f ztXtm5$3X}*?5xLwOD&YV0ST@kt{LDiZ{xfP^@Bu|*}-2!Nt}aJ8Tu;_LMnwjtJa{H zNnAtRbH51>Sa2Rq;{}qK9W#7^s>!|*Zryh-Le~j+Nc{bti$Wlop@x{})ye$AN??bC z&QWQpnI}>>KmJ10^oMwCMBtr6+n3FeLTUpk-i%BYwy!|2W8buE(O|!F znOrV@9jHMoZrK}ZPCPVK@YbynKZAqAP$#SE3)`z+ue_L?`vA+dv)|rs&z$KxVW(fd zcG&z1l0)8rm)AP=;I*1wKL+MZx#FSc>axofa&lSE_?urPKs68m5S3{jr{mh#S*)Q9;I3B& zuLFtxW96@&sw+f5Vhf^xrZqZMn!P6JcyV0Jkl^cnZblxl=a0K-)p;Y6QbgWw&TFh? zSe5A270X~Nuq2&tDZ?s7;qt^h4b|Q>N%CP@u#RBgRO8P?$?Nbm6noRe*&32Z$Z{E+ zCRdg@&*ubLQ_CfDWo8n@USxaAYE);7W2ignw*&}E!_xFb8nDtyp=Ylvv82x?ZST51 z>uaoKN1(Y6r#bZ#8e=TYQ!eejRo(JU9lS!hCKdEz_p~2r=62T!#5gMy0N!>B)nW&{ z*5$quE>*K4@`3m^ZCk1TQ1III#Fw?3Mme?c0@$_IEDEK+^Yks`J77}{@_ zp)q2v|F9bagok8XLGyNrJ6ums7XnUQ9DlR$4kXvzkCGJU&xIo&Jv^j`as`8&tvOq> z&9>@xJ-D&Zz`~=g0Uf{$y`m2=6I*6c`BbWqjaGTCOo#$7@}zbw>4Cv`=B4)|Ot`XNQYP<#=&- zI*2~c1N*|01>8TpW4qd&bEHI|Vv@PDsHeBF(&+_LmT!q26*9lQ3IU(^_i!QV4Z>7l z&jUYP2M>Oh$TfHR&p#S~El*4fzxB{WC(d3|R?JZ2);2CcyW`SrUIwZ0T-q~^iYQ4a zW~0%&#-A>_LP5XfHyIR)*mJ$#`q-+$(!E@U($2Y^#$&h3JGiXcEffLY;cwIUe#Sbm zf`%tKSB;2P$HJRZJZ$$;O}5R8lX4I2tJ$;tNoQ5VlMQLMYxG8 znVg^u=~Sz)lEACEzG@uvrb*!F?#ki^EKJ%xiU$Mt7Ku?M*1q(0-zlL3S=kn9%T#zK zY7_Ymb>^&>+|A#`Y)z8#vdj_goZdsymS?C)^jP@h>DYV{bXZqe#2al%SqQhc* z*A6j4Ic(3=tBEsRD(ckInNZ7Ooa*>8->~q{+}_*DhZxnca2+13B#!9el~{Z}fZM)~ zxtS_0BR zZX?>g8)T!0!TUQ!xLWHp6?qLz44rdJi<}HGN@iI!)(txg8_jM6@GGmphefrhN z5pj&AfVQa*mih&#l^*@V><8okfPKN*rDJT}M?~N(7JTPh z&xFK$ES&}fjEk+cp#H&20u;pk>^5vHn&gBFSWi37nl8Y?l*C67B4CVfc2-}y#uo88 z=oWdnivl~n9=BF2jN0KDv2!nBoB#sSphcopCR+)e`-P11rO}l51|IXw5aB_+F?lQi zSTA9bP1PnDztUeY5zGq!)T+c2PbAK9mo9^gWHOU17+|$!S(Wt0o%VDFFHhysk%9E; zj1DdMF>Dp>$)GF^6z{Gt_;Yp)T-(rd4enA~wm3>$$KKe`_N*`TW&@((OiV7z0s^=S z_7er8r&Y^xv)=|H*c^pyxRH39%4)cvjN*k=%2wg(>)TC=T=3%XzWr|36O`Qi3>kX{KJ08)fTE+bOV1T5rI!4XxLanWoj8d~5& ziQ>7vBB(|kLFf-8*rE+4W$K9D_IH{;23p5v(9MuurJD?Nf!;pJudXV)|1eV|2^{0X6Zf@)vV2=%7%JwI>hmoqvTFHEC^8O_Z((2{ zMHAOhYw-cU=s|s`ByDHpP z)S1s5eH+1l8}{?+!@GKSf3EieQlw{9=Lt#-UXEsE8;evmmpbD{BXfd|Fr82|^we?Z+(7rh#0Wj_-F- zkZ%2=3fCN4UlzAC1{YeL|Z+&e4h)s8j_ZkQC&L$`|Jm?C>hFtmstuX zY_OaV;X~cuhCGh)Lm1OPg?k5f*#4_(oL9Jjj*N_n#;X|^TxSrJWa0C5-cXMob@y?r z5Ov0MR>kbk)ZW``s{?z7naEosdPbYUs0g>nMYy^Kzit<6;cu$vi%qk8Qt-^>zyI)x zW(*1d^>^x|QD>y`{_zu7Aw4&7Fx`_a)iC{*WT=^#X|T@cjy6vP@No1gP-0|aV=ZER zn=3QUCB)6^B>8v^oe6}k5;SmsWOUpiVc@{5SnrYq9XOYf=d`%Q&b|b( z-c8$^6!3L?*fU1iW?Jn0RWqPnwwQ!3K6EN~CZT*@596JP*W@xpF`iNA`IE!y^NCJ$ypjCmwQieuNE)1Pz9-f@)~aJL@>y)TPx7>gNE;g2)ytJ_8_9Up){ zS+ImwoWv}(C)Bhm^JvIVy&DxV+>#IqEr{XiA~O?eXZhmP@hCT4mqhuwr{lf0^y^e; zMW*(Wx39*)Wbs$?U*UA;F1&-^TrpB^R(oD8IY`cP3Rk}O$-DStJoB^nJmu<#m)%Hc%E=#fYxK=K9MgRLY<&6SIru&4bRheagVF~`iEF%T6zBB+?|w>N$LUoZq}GSUie=Gz zuq@$VT}@m+l~Kska_S2H2_i-P&y@ST5k!FT#+QC0sCP@BEky2W>C}{XhD-ZLUTaq6 z3W|SUj#1Q7BESo@1x$PYN#qXkFSC8W-6qwXiKEKT$+NeXv&=&fZMPv9&Ph59V>kr1ly1@>42fA2a=9)Uq0lX(GC<%baN+6E z!2`%(16V(=lN$Ru`DL+tE0h^lXZ!z)Mpns7^kTV$Bf|YLehZd@eVx*X>CwQpL+TAS zAzC_3HVTxT#~Z&Y85qbn&KHB#i;GcF<6%K7Sdh-=1D2ZlG>;86_trlM^^io`1s{RJ z4()wI(;8Xsp6PyfZwr+M%1(SDVm`GzPo(aU4uogQ^NCgX8 zuK)XJTH*Z&aibz#?d&%?$X+WPKNS+lA?GprP)2o}6>paFS=Umgxavf)xmm4u_q~Ge z>AC6t%FOw*R7hIb{XsllaDngdC33x0D*ftzeF_WdsM?q1Xi56TMUCv_GXoM=E8j3) z&SkkMMjV)SnG(GQ@DtSRu<*P;COxdX&)s32tPKT%v*a=5l$11oR91Md2@s&&CirDs-W*S8wI?S^-)(|t)s!Vk-J+wpXX9_@jle)}z$ z4RXc+`P7AcKBFZz2QKEIh?kKe8C z64E;dIrHK>Od#pVe`4#lsiw@YlSjmSn4fbXp8g!8l}{#}_zsG&`1vq+dpO?X)+s9` z3mSh*(zWlC2mJ{ok7^h0Q6i7~&>PVG?A&^#yfFLY@?`96+!NVxHihQ99;|F&n)q~l zTtedB^cza@*Nx0L__{K(8StEJv|yl4Z|#U33;$$~D|E?PN=n+Mcv4QF-o5$J4Md2g zmbZAdbaJ~HtNwCVd(yn6wGH;z+#703SNl}3@ZA62WNfM2?E{>2qUa4;($0v((?DwI zOGX=ax$9hd{lfbUZxFu-6j-M7G{6S(OSQhdU0vDrm?%0D6uoMbH8p(LB^Mk@xmMBb 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

CF~3gub0&^ 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 literal 131354 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 diff --git a/bsp/stm32/docs/figures_en/board_mpu.png b/bsp/stm32/docs/figures_en/board_mpu.png index 655aafce627dc7490010dac39d8ee791b393633c..64efb350c0facf77a871103afe65747be2c37f0c 100644 GIT binary patch literal 129972 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%0D6uoMbH8p(LB^Mk@xmMBb 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

CF~3gub0&^ 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 literal 131354 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 From 3383352cdc96238b9e967a8ded7189a563359ba6 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Mon, 27 Jan 2025 10:43:59 +0800 Subject: [PATCH 33/51] bsp: cvitek: c906_littel: fixed build warnings for board.c When building bsp/cvitek/c906_little, compiler warns: ``` board/board.c: In function 'rt_hw_board_init': board/board.c:26:5: warning: implicit declaration of function 'rt_hw_tick_init'; did you mean 'rt_hw_stack_init'? [-Wimplicit-function-declaration] 26 | rt_hw_tick_init(); | ^~~~~~~~~~~~~~~ | rt_hw_stack_init board/board.c:29:5: warning: implicit declaration of function 'rt_hw_uart_init'; did you mean 'rt_hw_board_init'? [-Wimplicit-function-declaration] 29 | rt_hw_uart_init(); | ^~~~~~~~~~~~~~~ | rt_hw_board_init ``` To remove these build warnings, include header files which declare these functions. Plus, remove the decalartion of `tick_isr()`, this function does not exist. Signed-off-by: Chen Wang --- bsp/cvitek/c906_little/board/board.c | 2 ++ bsp/cvitek/c906_little/board/tick.h | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bsp/cvitek/c906_little/board/board.c b/bsp/cvitek/c906_little/board/board.c index 8bcc0418022..414d2663ff4 100755 --- a/bsp/cvitek/c906_little/board/board.c +++ b/bsp/cvitek/c906_little/board/board.c @@ -11,6 +11,8 @@ #include #include "board.h" +#include "tick.h" +#include "drv_uart.h" void rt_hw_board_init(void) { diff --git a/bsp/cvitek/c906_little/board/tick.h b/bsp/cvitek/c906_little/board/tick.h index 7e0d0add4cb..7c5ca9dd1fb 100755 --- a/bsp/cvitek/c906_little/board/tick.h +++ b/bsp/cvitek/c906_little/board/tick.h @@ -11,8 +11,6 @@ #ifndef __TICK_H__ #define __TICK_H__ - -int tick_isr(void); int rt_hw_tick_init(void); #endif /* __TICK_H__ */ From 2dfbae28532303526f6bf4b60a54794c845d444a Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Mon, 27 Jan 2025 10:58:05 +0800 Subject: [PATCH 34/51] libcpu: riscv: common: fixed build warnings When building bsp/cvitek/c906_little, compiler warns: ``` .../rt-thread/libcpu/risc-v/common/trap_common.c: In function 'rt_hw_interrupt_install': .../rt-thread/libcpu/risc-v/common/trap_common.c:50:11: warning: unused variable 'user_param' [-Wunused-variable] 50 | void *user_param = param; | ^~~~~~~~~~ .../rt-thread/libcpu/risc-v/common/trap_common.c: In function 'rt_rv32_system_irq_handler': .../rt-thread/libcpu/risc-v/common/trap_common.c:77:25: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 77 | s_stack_frame = (rt_hw_stack_frame_t *)mscratch; | ^ ``` Fixed these warnings as per indication from gcc. Signed-off-by: Chen Wang --- libcpu/risc-v/common/trap_common.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libcpu/risc-v/common/trap_common.c b/libcpu/risc-v/common/trap_common.c index 6f7352cd569..0dbd7f2c75c 100644 --- a/libcpu/risc-v/common/trap_common.c +++ b/libcpu/risc-v/common/trap_common.c @@ -47,7 +47,6 @@ rt_weak rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t ha void *param, const char *name) { rt_isr_handler_t old_handler = RT_NULL; - void *user_param = param; if(vector < ISR_NUMBER) { @@ -74,7 +73,7 @@ rt_weak void rt_rv32_system_irq_handler(rt_uint32_t mcause) rt_uint32_t exception = !(mcause & 0x80000000); if(exception) { - s_stack_frame = (rt_hw_stack_frame_t *)mscratch; + s_stack_frame = (volatile rt_hw_stack_frame_t *)(uintptr_t)mscratch; rt_show_stack_frame(); } else From c66374705a05d1f780c66aeefabe1c88c563e065 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Mon, 27 Jan 2025 14:18:08 +0800 Subject: [PATCH 35/51] libcpu: riscv: rv64: fixed warnings When building bsp/cvitek/c906_little, compiler reports: ``` .../rt-thread/libcpu/risc-v/rv64/trap.c: In function 'handle_trap': .../rt-thread/libcpu/risc-v/rv64/trap.c:106:13: warning: implicit declaration of function 'rt_hw_tick_isr'; did you mean 'rt_hw_stack_init'? [-Wimplicit-function-declaration] 106 | rt_hw_tick_isr(); | ^~~~~~~~~~~~~~ | rt_hw_stack_init .../rt-thread/libcpu/risc-v/rv64/trap.c:110:13: warning: implicit declaration of function 'rt_hw_irq_isr'; did you mean 'rt_hw_soft_irq_isr'? [-Wimplicit-function-declaration] 110 | rt_hw_irq_isr(); | ^~~~~~~~~~~~~ | rt_hw_soft_irq_isr ``` rt_hw_tick_isr()/rt_hw_irq_isr() are implemented by bsp, but libcpu/risc-v/rv64 doesn't declare them, so compiler warns. There are three BSPs using 'rv64' (libcpu/risc-v/rv64): - `bsp/cvitek/c906_little/rtconfig.py` - `bsp/juicevm/rtconfig.py` - `bsp/k210/rtconfig.py` `handle_trap` in `libcpu/risc-v/rv64` is defined as weak. BSP can use this function directly or define and overload it by itself. If bsp use this function directly, bsp need to pay attention to the fact that three functions will be called in this function: - `rt_hw_soft_irq_isr` - `rt_hw_tick_isr` - `rt_hw_irq_isr` In `libcpu/risc-v/rv64`, `rt_hw_soft_irq_isr` has a weak definition, while the other two do not. This means that if the bsp does not overload `handle_trap`, bsp must define `rt_hw_tick_isr` and `rt_hw_irq_isr` itself. This is also the practice of `bsp/cvitek/c906_little`. There is also a similar bsp `bsp/k210`, and the form of `bsp/juicevm` implements `handle_trap` by itself. It seems that `rt_hw_tick_isr` and `rt_hw_irq_isr` are not required to be implemented by all BSPs using `libcpu/risc-v/rv64`. The premise for BSP to implement them is that it does not overload `handle_trap`. So declaring `rt_hw_tick_isr` and `rt_hw_irq_isr` with extern in `libcpu/risc-v/rv64` is not proper. In addition, the `rt_hw_tick_isr/rt_hw_irq_isr` are only used by `libcpu/risc-v/rv64`, so it is not worth putting the declaration in `./include/rthw.h`. Sum up, the best solution is to add weak definition to `rt_hw_tick_isr/rt_hw_irq_isr` as existing `rt_hw_soft_irq_isr`. Signed-off-by: Chen Wang --- libcpu/risc-v/rv64/trap.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libcpu/risc-v/rv64/trap.c b/libcpu/risc-v/rv64/trap.c index 781fbed72aa..f0144157db3 100755 --- a/libcpu/risc-v/rv64/trap.c +++ b/libcpu/risc-v/rv64/trap.c @@ -92,6 +92,15 @@ rt_weak void rt_hw_soft_irq_isr(void) } +rt_weak int rt_hw_tick_isr(void) +{ + return 0; +} + +rt_weak void rt_hw_irq_isr(void) +{ + +} rt_weak rt_size_t handle_trap(rt_size_t cause, rt_size_t epc, rt_size_t *sp) { From cfb44d1f7f184308dd9b936e5388317874166594 Mon Sep 17 00:00:00 2001 From: BernardXiong Date: Mon, 27 Jan 2025 03:29:23 +0000 Subject: [PATCH 36/51] [tools] Add requirements.txt for python packages Add requirements.txt for python packages installation. --- tools/requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 tools/requirements.txt diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 00000000000..f45940e63e8 --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1,4 @@ +scons>=4.0.1 +requests>=2.27.1 +tqdm>=4.67.1 +kconfiglib>=13.7.1 From ffe25c58b91e12a9a75ed4e47e611ce1427237e4 Mon Sep 17 00:00:00 2001 From: qilian <87816729+ziyu04@users.noreply.github.com> Date: Thu, 30 Jan 2025 20:15:18 +0800 Subject: [PATCH 37/51] Update README.md (#9959) Fixed the issue where the absence of the u-boot-tools package caused rttpkgtools to fail to compile normally. --- bsp/cvitek/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp/cvitek/README.md b/bsp/cvitek/README.md index 864d54d43b2..91b99895deb 100755 --- a/bsp/cvitek/README.md +++ b/bsp/cvitek/README.md @@ -128,7 +128,7 @@ export RTT_EXEC_PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin ## 4.2. 依赖安装 ```shell -$ sudo apt install -y scons libncurses5-dev device-tree-compiler +$ sudo apt install -y scons libncurses5-dev device-tree-compiler u-boot-tools ``` ## 4.3. 构建 From 0cc4dc4a3dd5bbb3b95ffdc7cd7f4e740a9c6b23 Mon Sep 17 00:00:00 2001 From: Supper Thomas <78900636@qq.com> Date: Sat, 1 Feb 2025 12:39:22 +0800 Subject: [PATCH 38/51] [action] add ci menuconfig check (#9961) --- .github/workflows/action_tools.yml | 9 ++++++++- components/drivers/usb/cherryusb/Kconfig | 5 ----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/action_tools.yml b/.github/workflows/action_tools.yml index c861027cda0..413122f21bd 100644 --- a/.github/workflows/action_tools.yml +++ b/.github/workflows/action_tools.yml @@ -26,6 +26,8 @@ on: - '**/*.c' - '**/*.h' - '**/*.cpp' + workflow_dispatch: + repository_dispatch: permissions: contents: read # to fetch code (actions/checkout) @@ -60,7 +62,12 @@ jobs: - name: Build Tools run: | - scons --pyconfig-silent -C $TEST_BSP_ROOT + scons --pyconfig-silent -C $TEST_BSP_ROOT 2>menuconfig.log + cat menuconfig.log + if grep -q "warning:" menuconfig.log; then + echo "Errors found in menuconfig, failing the build." + exit 1 + fi scons -j$(nproc) -C $TEST_BSP_ROOT - name: Project generate Tools diff --git a/components/drivers/usb/cherryusb/Kconfig b/components/drivers/usb/cherryusb/Kconfig index 256690cbab6..2b7ce806790 100644 --- a/components/drivers/usb/cherryusb/Kconfig +++ b/components/drivers/usb/cherryusb/Kconfig @@ -229,7 +229,6 @@ if RT_USING_CHERRYUSB bool prompt "Enable usb cdc ecm driver" select RT_USING_LWIP - select RT_USING_LWIP212 select CONFIG_USBHOST_PLATFORM_CDC_ECM default n @@ -237,7 +236,6 @@ if RT_USING_CHERRYUSB bool prompt "Enable usb rndis driver" select RT_USING_LWIP - select RT_USING_LWIP212 select CONFIG_USBHOST_PLATFORM_CDC_RNDIS default n @@ -245,7 +243,6 @@ if RT_USING_CHERRYUSB bool prompt "Enable usb cdc ncm driver" select RT_USING_LWIP - select RT_USING_LWIP212 select CONFIG_USBHOST_PLATFORM_CDC_NCM default n @@ -268,7 +265,6 @@ if RT_USING_CHERRYUSB bool prompt "Enable usb asix driver" select RT_USING_LWIP - select RT_USING_LWIP212 select CONFIG_USBHOST_PLATFORM_ASIX default n @@ -276,7 +272,6 @@ if RT_USING_CHERRYUSB bool prompt "Enable usb rtl8152 driver" select RT_USING_LWIP - select RT_USING_LWIP212 select CONFIG_USBHOST_PLATFORM_RTL8152 default n From 2fdb9381bb93cc8e89887ef4b49104257cc991ff Mon Sep 17 00:00:00 2001 From: Kai <60053077+kaidegit@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:42:49 +0800 Subject: [PATCH 39/51] ci: fix dep miss (#9965) --- .github/workflows/bsp_buildings.yml | 1 + tools/requirements.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index 488583e39b6..9bcb070fb30 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -405,6 +405,7 @@ jobs: wget https://raw.githubusercontent.com/RT-Thread/env/master/install_ubuntu.sh chmod 777 install_ubuntu.sh ./install_ubuntu.sh + pip install -r tools/requirements.txt git config --global http.postBuffer 524288000 echo "RTT_ROOT=${{ github.workspace }}" >> $GITHUB_ENV echo "RTT_CC=gcc" >> $GITHUB_ENV diff --git a/tools/requirements.txt b/tools/requirements.txt index f45940e63e8..33b60c4c741 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -2,3 +2,4 @@ scons>=4.0.1 requests>=2.27.1 tqdm>=4.67.1 kconfiglib>=13.7.1 +PyYAML>=6.0 \ No newline at end of file From 562e15b11876f99886df1e09272e947a3979bbf1 Mon Sep 17 00:00:00 2001 From: Kai <60053077+kaidegit@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:04:49 +0800 Subject: [PATCH 40/51] [bsp][stm32]Add an STM32H730 Board (#9962) * Add an STM32H730 bsp --- .github/workflows/bsp_buildings.yml | 1 + bsp/stm32/stm32h730-esphosted-evb/.config | 1292 ++++++++++ bsp/stm32/stm32h730-esphosted-evb/.gitignore | 42 + bsp/stm32/stm32h730-esphosted-evb/Kconfig | 22 + bsp/stm32/stm32h730-esphosted-evb/README.md | 162 ++ bsp/stm32/stm32h730-esphosted-evb/SConscript | 14 + bsp/stm32/stm32h730-esphosted-evb/SConstruct | 60 + .../applications/SConscript | 15 + .../applications/main.c | 25 + .../board/.ignore_format.yml | 6 + .../board/CubeMX_Config/.mxproject | 25 + .../board/CubeMX_Config/Core/Inc/main.h | 71 + .../Core/Inc/stm32h7xx_hal_conf.h | 514 ++++ .../Core/Src/stm32h7xx_hal_msp.c | 358 +++ .../board/CubeMX_Config/CubeMX_Config.ioc | 231 ++ .../stm32h730-esphosted-evb/board/Kconfig | 67 + .../stm32h730-esphosted-evb/board/SConscript | 29 + .../stm32h730-esphosted-evb/board/board.c | 216 ++ .../stm32h730-esphosted-evb/board/board.h | 48 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 213 ++ .../board/linker_scripts/link.sct | 19 + .../stm32h730-esphosted-evb/custom.cmake | 20 + .../stm32h730-esphosted-evb/figures/board.png | Bin 0 -> 435239 bytes .../stm32h730-esphosted-evb/project.uvoptx | 1204 +++++++++ .../stm32h730-esphosted-evb/project.uvprojx | 2221 +++++++++++++++++ bsp/stm32/stm32h730-esphosted-evb/rtconfig.h | 396 +++ bsp/stm32/stm32h730-esphosted-evb/rtconfig.py | 221 ++ .../stm32h730-ospi1.cfg | 85 + .../stm32h730-esphosted-evb/template.uvoptx | 184 ++ .../stm32h730-esphosted-evb/template.uvprojx | 402 +++ 31 files changed, 8191 insertions(+) create mode 100644 bsp/stm32/stm32h730-esphosted-evb/.config create mode 100644 bsp/stm32/stm32h730-esphosted-evb/.gitignore create mode 100644 bsp/stm32/stm32h730-esphosted-evb/Kconfig create mode 100644 bsp/stm32/stm32h730-esphosted-evb/README.md create mode 100644 bsp/stm32/stm32h730-esphosted-evb/SConscript create mode 100644 bsp/stm32/stm32h730-esphosted-evb/SConstruct create mode 100644 bsp/stm32/stm32h730-esphosted-evb/applications/SConscript create mode 100644 bsp/stm32/stm32h730-esphosted-evb/applications/main.c create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/.ignore_format.yml create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Inc/main.h create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Inc/stm32h7xx_hal_conf.h create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/Kconfig create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/SConscript create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/board.c create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/board.h create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32h730-esphosted-evb/custom.cmake create mode 100644 bsp/stm32/stm32h730-esphosted-evb/figures/board.png create mode 100644 bsp/stm32/stm32h730-esphosted-evb/project.uvoptx create mode 100644 bsp/stm32/stm32h730-esphosted-evb/project.uvprojx create mode 100644 bsp/stm32/stm32h730-esphosted-evb/rtconfig.h create mode 100644 bsp/stm32/stm32h730-esphosted-evb/rtconfig.py create mode 100644 bsp/stm32/stm32h730-esphosted-evb/stm32h730-ospi1.cfg create mode 100644 bsp/stm32/stm32h730-esphosted-evb/template.uvoptx create mode 100644 bsp/stm32/stm32h730-esphosted-evb/template.uvprojx diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index 9bcb070fb30..7e4c4790750 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -190,6 +190,7 @@ jobs: - "stm32/stm32h563-st-nucleo" - "stm32/stm32h503-st-nucleo" - "stm32/stm32h723-st-nucleo" + - "stm32/stm32h730-esphosted-evb" - "stm32/stm32h743-armfly-v7" - "stm32/stm32h743-atk-apollo" - "stm32/stm32h743-openmv-h7plus" diff --git a/bsp/stm32/stm32h730-esphosted-evb/.config b/bsp/stm32/stm32h730-esphosted-evb/.config new file mode 100644 index 00000000000..980baba4c8f --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/.config @@ -0,0 +1,1292 @@ +CONFIG_SOC_STM32H730VB=y + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_CI_ACTION is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +CONFIG_RT_VER_NUM=0x50200 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +CONFIG_RT_USING_CACHE=y +CONFIG_RT_USING_HW_ATOMIC=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M7=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +# CONFIG_RT_USING_SERIAL_V1 is not set +CONFIG_RT_USING_SERIAL_V2=y +CONFIG_RT_SERIAL_USING_DMA=y +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_RT_TRACE is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# CONFIG_PKG_USING_GET_IRQ_PRIORITY is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32H7=y + +# +# Hardware Drivers Config +# + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_SCB_ENABLE_I_CACHE=y +CONFIG_BSP_SCB_ENABLE_D_CACHE=y +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_UART2_RX_USING_DMA is not set +# CONFIG_BSP_UART2_TX_USING_DMA is not set +CONFIG_BSP_UART2_RX_BUFSIZE=256 +CONFIG_BSP_UART2_TX_BUFSIZE=0 +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_CRC is not set +# CONFIG_BSP_USING_RNG is not set +# CONFIG_BSP_USING_UDID is not set +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/stm32/stm32h730-esphosted-evb/.gitignore b/bsp/stm32/stm32h730-esphosted-evb/.gitignore new file mode 100644 index 00000000000..7221bde019d --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32h730-esphosted-evb/Kconfig b/bsp/stm32/stm32h730-esphosted-evb/Kconfig new file mode 100644 index 00000000000..0776bde42b8 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/Kconfig @@ -0,0 +1,22 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../.. + +PKGS_DIR := packages + +config SOC_STM32H730VB + bool + select SOC_SERIES_STM32H7 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" + +if !RT_USING_NANO +rsource "board/Kconfig" +endif diff --git a/bsp/stm32/stm32h730-esphosted-evb/README.md b/bsp/stm32/stm32h730-esphosted-evb/README.md new file mode 100644 index 00000000000..eada91732f8 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/README.md @@ -0,0 +1,162 @@ +# STM32H730-EspHostedEVB开发板BSP说明 + +## 简介 + +本文档 为**STM32H730-EspHostedEVB**开发板提供的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +**STM32H730-EspHostedEVB**是本人用于测试及调试`ESP-Hosted`而制作的一块测试板。 + +开发板外观如下图所示: + +![board](figures/board.png) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32H730VBT6 + - 主频 550MHz + - 432KB RAM, 64KB ITCM, 128KB DTCM, 32KB I-Cache, 32KB D-Cache + - 128KB FLASH, QSPI Flash, SPI Flash, Support XiP & OTFDEC + +- Network Adapter: ESP32-C3-WROOM-02, 使用ESP-Hosted固件 +- Debugger: ST-Link V2-1 + +开发板更多详细信息请参考 + +* [OSHWHUB](https://oshwhub.com/baobaoa/stm32h730_esp-hosted_evb) +* [GITHUB](https://github.com/kaidegit/ESPHostedEVB) + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------- | :----------------: | :--------------- | +| LED | | | +| QSPI FLASH | 不支持也不建议操作 | 用于运行程序 | +| SPI FLASH | 待支持 | | +| ESP32-C3 | 待支持 | WIFI & BLUETOOTH | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | | +| UART | 支持 | UART2 | +| SPI | 支持 | SPI | +| QSPI | 不支持 | 已被占用 | +| USB | 待支持 | | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +### 快速上手 + +#### 硬件连接 + +使用数据线连接靠上的USB-C。 + +MDK: + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 STLink下载程序,在通过 STLink连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LED 常亮、绿色 LED 会周期性闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 5.2.0 build Feb 3 2025 13:14:21 + 2006 - 2024 Copyright by RT-Thread team +msh > +``` + +GCC: + +可以使用命令行进行编译,下载 + +```shell +mkdir build +scons --target=cmake --project-name=EspHostedEVBDemo +cd build +cmake .. -G Ninja +ninja -j8 +ninja flash +``` + +也可生成cmake后使用CLion打开 + +```shell +scons --target=cmake --project-name=EspHostedEVBDemo +clion . +``` + +串口输出信息 + +```shell +... some bootloader log... +\ | / +- RT - Thread Operating System + / | \ 5.2.0 build Feb 3 2025 13:16:15 + 2006 - 2024 Copyright by RT-Thread team +msh > +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口2 的功能,如果需使用更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5/cmake` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 由于下载算法还未制作完,暂GCC为使用外部Flash,MDK为使用内部Flash。 + +- 调试串口为串口2,默认接到STLink。 + +- Bootloader下载:参考[ESPHostedEVB/Software/Bootloader at main · kaidegit/ESPHostedEVB](https://github.com/kaidegit/ESPHostedEVB/tree/main/Software/Bootloader), 可使用**STM32CubeProgrammer**下载。 + +- STLink固件下载:参考oshwhub各项目教程。 + +- ESP-Hosted固件下载:参考[esp-hosted/esp_hosted_fg/README.md at master · espressif/esp-hosted](https://github.com/espressif/esp-hosted/blob/master/esp_hosted_fg/README.md) + +- 外部 flash 下载算法 + - OpenOCD:所需cfg已提供。 + - MDK: TODO + - CubeProg: TODO + + +## 联系人信息 + +维护人: + +- [kaidegit (Kai)](https://github.com/kaidegit) \ No newline at end of file diff --git a/bsp/stm32/stm32h730-esphosted-evb/SConscript b/bsp/stm32/stm32h730-esphosted-evb/SConscript new file mode 100644 index 00000000000..c7ef7659ece --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/SConscript @@ -0,0 +1,14 @@ +# for module compiling +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/stm32/stm32h730-esphosted-evb/SConstruct b/bsp/stm32/stm32h730-esphosted-evb/SConstruct new file mode 100644 index 00000000000..02c0e78cd2d --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/SConstruct @@ -0,0 +1,60 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $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) + +stm32_library = 'STM32H7xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32h730-esphosted-evb/applications/SConscript b/bsp/stm32/stm32h730-esphosted-evb/applications/SConscript new file mode 100644 index 00000000000..9bb9abae897 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/stm32/stm32h730-esphosted-evb/applications/main.c b/bsp/stm32/stm32h730-esphosted-evb/applications/main.c new file mode 100644 index 00000000000..78193d8f7ef --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/applications/main.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-2-2 yekai first version + */ + +#include +#include +#include + +#define LED_PIN GET_PIN(E, 2) + +int main(void) { + /* set GPIO pin mode to output */ + rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); + + while (1) { + rt_pin_write(LED_PIN, !rt_pin_read(LED_PIN)); + rt_thread_mdelay(1000); + } +} diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/.ignore_format.yml b/bsp/stm32/stm32h730-esphosted-evb/board/.ignore_format.yml new file mode 100644 index 00000000000..0d7f3e360c6 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/.ignore_format.yml @@ -0,0 +1,6 @@ +# files format check exclude path, please follow the instructions below to modify; +# If you need to exclude an entire folder, add the folder path in dir_path; +# If you need to exclude a file, add the path to the file in file_path. + +dir_path: +- CubeMX_Config diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/.mxproject new file mode 100644 index 00000000000..931156500be --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/.mxproject @@ -0,0 +1,25 @@ +[PreviousLibFiles] +LibFiles=Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_bus.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_crs.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_system.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_utils.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dmamux.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_mdma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_def.h;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_ospi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_spi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_spi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_spi_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_usart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_lpuart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ospi.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_spi.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_spi_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_bus.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_crs.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_system.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_utils.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dmamux.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_mdma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_def.h;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_ospi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_spi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_spi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_spi_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_usart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_lpuart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h730xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\system_stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\system_stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv81mml.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; + +[PreviousUsedCubeIDEFiles] +SourceFiles=Core\Src\main.c;Core\Src\stm32h7xx_it.c;Core\Src\stm32h7xx_hal_msp.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ospi.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_spi.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_spi_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;Core\Src\system_stm32h7xx.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ospi.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_spi.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_spi_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;Core\Src\system_stm32h7xx.c;;; +HeaderPath=C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Inc;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\STM32H7xx_HAL_Driver\Inc\Legacy;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\CMSIS\Device\ST\STM32H7xx\Include;C:\Users\yekai\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.1\Drivers\CMSIS\Include;Core\Inc; +CDefines=USE_PWR_EXTERNAL_SOURCE_SUPPLY;USE_PWR_EXTERNAL_SOURCE_SUPPLY;USE_HAL_DRIVER;STM32H730xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + +[PreviousGenFiles] +AdvancedFolderStructure=true +HeaderFileListSize=3 +HeaderFiles#0=..\Core\Inc\stm32h7xx_it.h +HeaderFiles#1=..\Core\Inc\stm32h7xx_hal_conf.h +HeaderFiles#2=..\Core\Inc\main.h +HeaderFolderListSize=1 +HeaderPath#0=..\Core\Inc +HeaderFiles=; +SourceFileListSize=3 +SourceFiles#0=..\Core\Src\stm32h7xx_it.c +SourceFiles#1=..\Core\Src\stm32h7xx_hal_msp.c +SourceFiles#2=..\Core\Src\main.c +SourceFolderListSize=1 +SourcePath#0=..\Core\Src +SourceFiles=; + diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Inc/main.h b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Inc/main.h new file mode 100644 index 00000000000..be9579fb494 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Inc/main.h @@ -0,0 +1,71 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32h7xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define LED_Pin GPIO_PIN_2 +#define LED_GPIO_Port GPIOE + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Inc/stm32h7xx_hal_conf.h b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Inc/stm32h7xx_hal_conf.h new file mode 100644 index 00000000000..f890d493f06 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Inc/stm32h7xx_hal_conf.h @@ -0,0 +1,514 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h7xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32H7xx_HAL_CONF_H +#define STM32H7xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + /* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_FDCAN_MODULE_ENABLED */ +/* #define HAL_FMAC_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_COMP_MODULE_ENABLED */ +/* #define HAL_CORDIC_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_ETH_LEGACY_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_OTFDEC_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_HRTIM_MODULE_ENABLED */ +/* #define HAL_HSEM_MODULE_ENABLED */ +/* #define HAL_GFXMMU_MODULE_ENABLED */ +/* #define HAL_JPEG_MODULE_ENABLED */ +/* #define HAL_OPAMP_MODULE_ENABLED */ +#define HAL_OSPI_MODULE_ENABLED +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_RAMECC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +/* #define HAL_SWPMI_MODULE_ENABLED */ +/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_JPEG_MODULE_ENABLED */ +/* #define HAL_MDIOS_MODULE_ENABLED */ +/* #define HAL_PSSI_MODULE_ENABLED */ +/* #define HAL_DTS_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_MDMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_HSEM_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE (25000000UL) /*!< Value of the External oscillator in Hz : FPGA case fixed to 60MHZ */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal oscillator (CSI) default value. + * This value is the default CSI value after Reset. + */ +#if !defined (CSI_VALUE) + #define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE (64000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE (32768UL) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +#if !defined (LSI_VALUE) + #define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000UL /*!< Value of the External clock in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority */ +#define USE_RTOS 0 +#define USE_SD_TRANSCEIVER 0U /*!< use uSD Transceiver */ +#define USE_SPI_CRC 0U /*!< use CRC in SPI */ + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */ +#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U /* CORDIC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_DTS_REGISTER_CALLBACKS 0U /* DTS register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U /* FDCAN register callback disabled */ +#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U /* FMAC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_GFXMMU_REGISTER_CALLBACKS 0U /* GFXMMU register callback disabled */ +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U /* HRTIM register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_JPEG_REGISTER_CALLBACKS 0U /* JPEG register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MDIOS_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */ +#define USE_HAL_OSPI_REGISTER_CALLBACKS 0U /* OSPI register callback disabled */ +#define USE_HAL_OTFDEC_REGISTER_CALLBACKS 0U /* OTFDEC register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U /* SWPMI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################### Ethernet Configuration ######################### */ +#define ETH_TX_DESC_CNT 4U /* number of Ethernet Tx DMA descriptors */ +#define ETH_RX_DESC_CNT 4U /* number of Ethernet Rx DMA descriptors */ + +#define ETH_MAC_ADDR0 (0x02UL) +#define ETH_MAC_ADDR1 (0x00UL) +#define ETH_MAC_ADDR2 (0x00UL) +#define ETH_MAC_ADDR3 (0x00UL) +#define ETH_MAC_ADDR4 (0x00UL) +#define ETH_MAC_ADDR5 (0x00UL) + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32h7xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32h7xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32h7xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_MDMA_MODULE_ENABLED + #include "stm32h7xx_hal_mdma.h" +#endif /* HAL_MDMA_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32h7xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32h7xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32h7xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32h7xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32h7xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_DTS_MODULE_ENABLED + #include "stm32h7xx_hal_dts.h" +#endif /* HAL_DTS_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32h7xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_ETH_LEGACY_MODULE_ENABLED + #include "stm32h7xx_hal_eth_legacy.h" +#endif /* HAL_ETH_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32h7xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32h7xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32h7xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED + #include "stm32h7xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32h7xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32h7xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CORDIC_MODULE_ENABLED + #include "stm32h7xx_hal_cordic.h" +#endif /* HAL_CORDIC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32h7xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32h7xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32h7xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32h7xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32h7xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + +#ifdef HAL_FMAC_MODULE_ENABLED + #include "stm32h7xx_hal_fmac.h" +#endif /* HAL_FMAC_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED + #include "stm32h7xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_HSEM_MODULE_ENABLED + #include "stm32h7xx_hal_hsem.h" +#endif /* HAL_HSEM_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32h7xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32h7xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32h7xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32h7xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32h7xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32h7xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_JPEG_MODULE_ENABLED + #include "stm32h7xx_hal_jpeg.h" +#endif /* HAL_JPEG_MODULE_ENABLED */ + +#ifdef HAL_MDIOS_MODULE_ENABLED + #include "stm32h7xx_hal_mdios.h" +#endif /* HAL_MDIOS_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32h7xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32h7xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32h7xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED +#include "stm32h7xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "stm32h7xx_hal_ospi.h" +#endif /* HAL_OSPI_MODULE_ENABLED */ + +#ifdef HAL_OTFDEC_MODULE_ENABLED +#include "stm32h7xx_hal_otfdec.h" +#endif /* HAL_OTFDEC_MODULE_ENABLED */ + +#ifdef HAL_PSSI_MODULE_ENABLED + #include "stm32h7xx_hal_pssi.h" +#endif /* HAL_PSSI_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32h7xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32h7xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RAMECC_MODULE_ENABLED + #include "stm32h7xx_hal_ramecc.h" +#endif /* HAL_RAMECC_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32h7xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32h7xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32h7xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32h7xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32h7xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32h7xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32h7xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32h7xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32h7xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32h7xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32h7xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32h7xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32h7xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32h7xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32h7xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32h7xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32h7xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t *file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32H7xx_HAL_CONF_H */ diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c new file mode 100644 index 00000000000..175c7024b03 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c @@ -0,0 +1,358 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h7xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ +#include "drv_common.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief OSPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hospi: OSPI handle pointer +* @retval None +*/ +void HAL_OSPI_MspInit(OSPI_HandleTypeDef* hospi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hospi->Instance==OCTOSPI1) + { + /* USER CODE BEGIN OCTOSPI1_MspInit 0 */ + + /* USER CODE END OCTOSPI1_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_OSPI; + PeriphClkInitStruct.OspiClockSelection = RCC_OSPICLKSOURCE_D1HCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_OCTOSPIM_CLK_ENABLE(); + __HAL_RCC_OSPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + /**OCTOSPI1 GPIO Configuration + PA6 ------> OCTOSPIM_P1_IO3 + PA7 ------> OCTOSPIM_P1_IO2 + PB0 ------> OCTOSPIM_P1_IO1 + PB1 ------> OCTOSPIM_P1_IO0 + PB2 ------> OCTOSPIM_P1_CLK + PE11 ------> OCTOSPIM_P1_NCS + */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_OCTOSPIM_P1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPIM_P1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_OCTOSPIM_P1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPIM_P1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF11_OCTOSPIM_P1; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* USER CODE BEGIN OCTOSPI1_MspInit 1 */ + + /* USER CODE END OCTOSPI1_MspInit 1 */ + + } + +} + +/** +* @brief OSPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hospi: OSPI handle pointer +* @retval None +*/ +void HAL_OSPI_MspDeInit(OSPI_HandleTypeDef* hospi) +{ + if(hospi->Instance==OCTOSPI1) + { + /* USER CODE BEGIN OCTOSPI1_MspDeInit 0 */ + + /* USER CODE END OCTOSPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_OCTOSPIM_CLK_DISABLE(); + __HAL_RCC_OSPI1_CLK_DISABLE(); + + /**OCTOSPI1 GPIO Configuration + PA6 ------> OCTOSPIM_P1_IO3 + PA7 ------> OCTOSPIM_P1_IO2 + PB0 ------> OCTOSPIM_P1_IO1 + PB1 ------> OCTOSPIM_P1_IO0 + PB2 ------> OCTOSPIM_P1_CLK + PE11 ------> OCTOSPIM_P1_NCS + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_6|GPIO_PIN_7); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); + + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_11); + + /* USER CODE BEGIN OCTOSPI1_MspDeInit 1 */ + + /* USER CODE END OCTOSPI1_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspInit 0 */ + + /* USER CODE END SPI2_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI2; + PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PB13 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspDeInit 0 */ + + /* USER CODE END SPI2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI2_CLK_DISABLE(); + + /**SPI2 GPIO Configuration + PB13 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ + } + +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 00000000000..c0f683d7e3c --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,231 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats= +CAD.pinconfig= +CAD.provider= +File.Version=6 +GPIO.groupedBy=Group By Peripherals +KeepUserPlacement=false +MMTAppRegionsCount=0 +MMTConfigApplied=false +Mcu.CPN=STM32H730VBT6 +Mcu.Family=STM32H7 +Mcu.IP0=CORTEX_M7 +Mcu.IP1=MEMORYMAP +Mcu.IP2=NVIC +Mcu.IP3=OCTOSPI1 +Mcu.IP4=RCC +Mcu.IP5=SPI2 +Mcu.IP6=SYS +Mcu.IP7=USART2 +Mcu.IPNb=8 +Mcu.Name=STM32H730VBTx +Mcu.Package=LQFP100 +Mcu.Pin0=PE2 +Mcu.Pin1=PH0-OSC_IN +Mcu.Pin10=PE11 +Mcu.Pin11=PB12 +Mcu.Pin12=PB13 +Mcu.Pin13=PB14 +Mcu.Pin14=PB15 +Mcu.Pin15=VP_OCTOSPI1_VS_quad +Mcu.Pin16=VP_SYS_VS_Systick +Mcu.Pin17=VP_MEMORYMAP_VS_MEMORYMAP +Mcu.Pin2=PH1-OSC_OUT +Mcu.Pin3=PA2 +Mcu.Pin4=PA3 +Mcu.Pin5=PA6 +Mcu.Pin6=PA7 +Mcu.Pin7=PB0 +Mcu.Pin8=PB1 +Mcu.Pin9=PB2 +Mcu.PinsNb=18 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32H730VBTx +MxCube.Version=6.13.0 +MxDb.Version=DB.6.0.130 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.Locked=true +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA6.Locked=true +PA6.Mode=OCTOSPI1_IOL_Port1L +PA6.Signal=OCTOSPIM_P1_IO3 +PA7.Locked=true +PA7.Mode=OCTOSPI1_IOL_Port1L +PA7.Signal=OCTOSPIM_P1_IO2 +PB0.Locked=true +PB0.Mode=OCTOSPI1_IOL_Port1L +PB0.Signal=OCTOSPIM_P1_IO1 +PB1.Locked=true +PB1.Mode=OCTOSPI1_IOL_Port1L +PB1.Signal=OCTOSPIM_P1_IO0 +PB12.GPIOParameters=GPIO_Speed +PB12.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PB12.Locked=true +PB12.Signal=GPIO_Output +PB13.GPIOParameters=GPIO_Speed +PB13.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PB13.Locked=true +PB13.Mode=Full_Duplex_Master +PB13.Signal=SPI2_SCK +PB14.GPIOParameters=GPIO_Speed +PB14.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PB14.Locked=true +PB14.Mode=Full_Duplex_Master +PB14.Signal=SPI2_MISO +PB15.GPIOParameters=GPIO_Speed +PB15.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PB15.Locked=true +PB15.Mode=Full_Duplex_Master +PB15.Signal=SPI2_MOSI +PB2.Locked=true +PB2.Mode=O1_P1_CLK +PB2.Signal=OCTOSPIM_P1_CLK +PE11.Locked=true +PE11.Mode=OCTOSPI1_Port1_NCS +PE11.Signal=OCTOSPIM_P1_NCS +PE2.GPIOParameters=GPIO_Label +PE2.GPIO_Label=LED +PE2.Locked=true +PE2.Signal=GPIO_Output +PH0-OSC_IN.Mode=HSE-External-Oscillator +PH0-OSC_IN.Signal=RCC_OSC_IN +PH1-OSC_OUT.Mode=HSE-External-Oscillator +PH1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32H730VBTx +ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.12.1 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=2 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain=STM32CubeIDE +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.ProjectStructure= +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UAScriptAfterPath= +ProjectManager.UAScriptBeforePath= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_SPI2_Init-SPI2-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_OCTOSPI1_Init-OCTOSPI1-true-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true +RCC.ADCFreq_Value=50390625 +RCC.AHB12Freq_Value=275000000 +RCC.AHB4Freq_Value=275000000 +RCC.APB1Freq_Value=137500000 +RCC.APB2Freq_Value=137500000 +RCC.APB3Freq_Value=137500000 +RCC.APB4Freq_Value=137500000 +RCC.AXIClockFreq_Value=275000000 +RCC.CECFreq_Value=32000 +RCC.CKPERFreq_Value=64000000 +RCC.CortexFreq_Value=550000000 +RCC.CpuClockFreq_Value=550000000 +RCC.D1CPREFreq_Value=550000000 +RCC.D1PPRE=RCC_APB3_DIV2 +RCC.D2PPRE1=RCC_APB1_DIV2 +RCC.D2PPRE2=RCC_APB2_DIV2 +RCC.D3PPRE=RCC_APB4_DIV2 +RCC.DFSDMACLkFreq_Value=110000000 +RCC.DFSDMFreq_Value=137500000 +RCC.DIVM1=5 +RCC.DIVN1=110 +RCC.DIVP1=1 +RCC.DIVP1Freq_Value=550000000 +RCC.DIVP2Freq_Value=50390625 +RCC.DIVP3Freq_Value=50390625 +RCC.DIVQ1=5 +RCC.DIVQ1Freq_Value=110000000 +RCC.DIVQ2Freq_Value=50390625 +RCC.DIVQ3Freq_Value=50390625 +RCC.DIVR1Freq_Value=275000000 +RCC.DIVR2Freq_Value=50390625 +RCC.DIVR3Freq_Value=50390625 +RCC.FDCANFreq_Value=110000000 +RCC.FMCFreq_Value=275000000 +RCC.FamilyName=M +RCC.HCLK3ClockFreq_Value=275000000 +RCC.HCLKFreq_Value=275000000 +RCC.HPRE=RCC_HCLK_DIV2 +RCC.I2C123Freq_Value=137500000 +RCC.I2C4Freq_Value=137500000 +RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVN1,DIVP1,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLSourceVirtual,PWR_Regulator_Voltage_Scale,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,SupplySource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value +RCC.LPTIM1Freq_Value=137500000 +RCC.LPTIM2Freq_Value=137500000 +RCC.LPTIM345Freq_Value=137500000 +RCC.LPUART1Freq_Value=137500000 +RCC.LTDCFreq_Value=50390625 +RCC.MCO1PinFreq_Value=64000000 +RCC.MCO2PinFreq_Value=550000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.PWR_Regulator_Voltage_Scale=PWR_REGULATOR_VOLTAGE_SCALE0 +RCC.QSPIFreq_Value=275000000 +RCC.RNGFreq_Value=48000000 +RCC.RTCFreq_Value=32000 +RCC.SAI1Freq_Value=110000000 +RCC.SAI4AFreq_Value=110000000 +RCC.SAI4BFreq_Value=110000000 +RCC.SDMMCFreq_Value=110000000 +RCC.SPDIFRXFreq_Value=110000000 +RCC.SPI123Freq_Value=110000000 +RCC.SPI45Freq_Value=137500000 +RCC.SPI6Freq_Value=137500000 +RCC.SWPMI1Freq_Value=137500000 +RCC.SYSCLKFreq_VALUE=550000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.SupplySource=PWR_EXTERNAL_SOURCE_SUPPLY +RCC.Tim1OutputFreq_Value=275000000 +RCC.Tim2OutputFreq_Value=275000000 +RCC.TraceFreq_Value=64000000 +RCC.USART16Freq_Value=137500000 +RCC.USART234578Freq_Value=137500000 +RCC.USBFreq_Value=110000000 +RCC.VCO1OutputFreq_Value=550000000 +RCC.VCO2OutputFreq_Value=100781250 +RCC.VCO3OutputFreq_Value=100781250 +RCC.VCOInput1Freq_Value=5000000 +RCC.VCOInput2Freq_Value=781250 +RCC.VCOInput3Freq_Value=781250 +SPI2.CalculateBaudRate=55.0 MBits/s +SPI2.Direction=SPI_DIRECTION_2LINES +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI2.Mode=SPI_MODE_MASTER +SPI2.VirtualType=VM_MASTER +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_MEMORYMAP_VS_MEMORYMAP.Mode=CurAppReg +VP_MEMORYMAP_VS_MEMORYMAP.Signal=MEMORYMAP_VS_MEMORYMAP +VP_OCTOSPI1_VS_quad.Mode=quad_mode +VP_OCTOSPI1_VS_quad.Signal=OCTOSPI1_VS_quad +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/Kconfig b/bsp/stm32/stm32h730-esphosted-evb/board/Kconfig new file mode 100644 index 00000000000..0c0b80a2bff --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/Kconfig @@ -0,0 +1,67 @@ +menu "Hardware Drivers Config" + +menu "Onboard Peripheral Drivers" + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_SCB_ENABLE_I_CACHE + bool "Enable ICACHE" + default y + + config BSP_SCB_ENABLE_D_CACHE + bool "Enable DCACHE" + default y + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART2 + bool "Enable UART2" + default y + if BSP_USING_UART2 + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_UART2_TX_USING_DMA + bool "Enable UART2 TX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default t + + config BSP_UART2_RX_BUFSIZE + int "Set UART2 RX buffer size" + range 64 65535 + depends on BSP_USING_UART2 + default 256 + + config BSP_UART2_TX_BUFSIZE + int "Set UART2 TX buffer size" + range 0 65535 + depends on BSP_USING_UART2 + default 0 + endif + config BSP_USING_UART3 + bool "Enable UART3" + default n + + endif + + source "$(BSP_DIR)/../libraries/HAL_Drivers/drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/SConscript b/bsp/stm32/stm32h730-esphosted-evb/board/SConscript new file mode 100644 index 00000000000..32281541cba --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/SConscript @@ -0,0 +1,29 @@ +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add the general drivers. +src = Glob('board.c') +src += Glob('CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Core/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.PLATFORM in ['gcc']: + src += Glob(startup_path_prefix + '/STM32H7xx_HAL/CMSIS/Device/ST/STM32H7xx/Source/Templates/gcc/startup_stm32h730xx.s') +elif rtconfig.PLATFORM in ['armcc', 'armclang']: + src += [startup_path_prefix + '/STM32H7xx_HAL/CMSIS/Device/ST/STM32H7xx/Source/Templates/arm/startup_stm32h730xx.s'] +elif rtconfig.PLATFORM in ['iccarm']: + src += [startup_path_prefix + '/STM32H7xx_HAL/CMSIS/Device/ST/STM32H7xx/Source/Templates/iar/startup_stm32h730xx.s'] + +# STM32H743xx || STM32H750xx || STM32F753xx +# You can select chips from the list above +CPPDEFINES = ['STM32H730xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/board.c b/bsp/stm32/stm32h730-esphosted-evb/board/board.c new file mode 100644 index 00000000000..dc64bf2a1fe --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/board.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2006-2025 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-2-3 yekai first version + */ + +#include "board.h" + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) { + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Supply configuration update enable + */ + HAL_PWREx_ConfigSupply(PWR_EXTERNAL_SOURCE_SUPPLY); + + /** Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); + + while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 5; + RCC_OscInitStruct.PLL.PLLN = 110; + RCC_OscInitStruct.PLL.PLLP = 1; + RCC_OscInitStruct.PLL.PLLQ = 5; + RCC_OscInitStruct.PLL.PLLR = 2; + RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; + RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; + RCC_OscInitStruct.PLL.PLLFRACN = 0; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 + | RCC_CLOCKTYPE_D3PCLK1 | RCC_CLOCKTYPE_D1PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; + RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; + RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) { + Error_Handler(); + } +} + +int MPU_Config(void) { + MPU_Region_InitTypeDef MPU_InitStruct = {0}; + + /* Disables the MPU */ + HAL_MPU_Disable(); + + MPU_InitStruct.Enable = MPU_REGION_ENABLE; + + // ITCM 0x00000000 64K ReadOnly + MPU_InitStruct.Number = MPU_REGION_NUMBER0; + MPU_InitStruct.BaseAddress = 0x00000000; + MPU_InitStruct.Size = MPU_REGION_SIZE_64KB; + MPU_InitStruct.SubRegionDisable = 0x0; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; + MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RO_URO; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; + HAL_MPU_ConfigRegion(&MPU_InitStruct); + + // DTCM 0x20000000 128K ReadWrite + MPU_InitStruct.Number = MPU_REGION_NUMBER1; + MPU_InitStruct.BaseAddress = 0x20000000; + MPU_InitStruct.Size = MPU_REGION_SIZE_128KB; + MPU_InitStruct.SubRegionDisable = 0x0; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; + MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RW_URO; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; + HAL_MPU_ConfigRegion(&MPU_InitStruct); + + // RAMD1 0x24000000 320K ReadWrite + MPU_InitStruct.Number = MPU_REGION_NUMBER2; + MPU_InitStruct.BaseAddress = 0x24000000; + MPU_InitStruct.Size = MPU_REGION_SIZE_512KB; + MPU_InitStruct.SubRegionDisable = 0x0; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; + MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RW_URO; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; + HAL_MPU_ConfigRegion(&MPU_InitStruct); + + // RAMD2 0x30000000 32K ReadWrite DMABuffer + MPU_InitStruct.Number = MPU_REGION_NUMBER3; + MPU_InitStruct.BaseAddress = 0x30000000; + MPU_InitStruct.Size = MPU_REGION_SIZE_32KB; + MPU_InitStruct.SubRegionDisable = 0x0; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; + MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RW_URO; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; + HAL_MPU_ConfigRegion(&MPU_InitStruct); + + // RAMD3 0x38000000 16K ReadWrite DMABuffer + MPU_InitStruct.Number = MPU_REGION_NUMBER4; + MPU_InitStruct.BaseAddress = 0x38000000; + MPU_InitStruct.Size = MPU_REGION_SIZE_16KB; + MPU_InitStruct.SubRegionDisable = 0x0; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; + MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RW_URO; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; + HAL_MPU_ConfigRegion(&MPU_InitStruct); + + // FLASH 0x90000000 128M ReadOnly + MPU_InitStruct.Number = MPU_REGION_NUMBER5; + MPU_InitStruct.BaseAddress = 0x90000000; + MPU_InitStruct.Size = MPU_REGION_SIZE_128MB; + MPU_InitStruct.SubRegionDisable = 0x0; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; + MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RO_URO; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; + HAL_MPU_ConfigRegion(&MPU_InitStruct); + + /* Enables the MPU */ + HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); + + return 0; +} + +INIT_BOARD_EXPORT(MPU_Config); + +#if defined(__GNUC__) && !defined(__ARMCC_VERSION) + +extern void SystemInit(void); + +extern int entry(void); + +#pragma GCC push_options +#pragma GCC optimize ("O0") + +extern volatile uint32_t _ramfunc_start_lma; +extern volatile uint32_t _ramfunc_start_vma; +extern volatile uint32_t _ramfunc_end; + +extern volatile uint32_t _data_start_lma; +extern volatile uint32_t _data_start_vma; +extern volatile uint32_t _data_end; + +extern volatile uint32_t _sbss; +extern volatile uint32_t _ebss; + +__attribute__((used, section(".text.reset_handler"))) +void Reset_Handler(void) { + __asm volatile ("ldr sp, =_estack"); + volatile uint32_t *pui32Src; + volatile uint32_t *pui32Dest; + + // copy itcm + for (pui32Src = &_ramfunc_start_lma, pui32Dest = &_ramfunc_start_vma; + pui32Dest < &_ramfunc_end; + pui32Src++, pui32Dest++) { + *pui32Dest = *pui32Src; + } + + // copy data + for (pui32Src = &_data_start_lma, pui32Dest = &_data_start_vma; + pui32Dest < &_data_end; + pui32Src++, pui32Dest++) { + *pui32Dest = *pui32Src; + } + + // init bss + for (pui32Dest = &_sbss; + pui32Dest < &_ebss; + pui32Dest++) { + *pui32Dest = 0; + } + + SystemInit(); + + entry(); +} + +#pragma GCC pop_options + +#endif \ No newline at end of file diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/board.h b/bsp/stm32/stm32h730-esphosted-evb/board/board.h new file mode 100644 index 00000000000..76e78b83ddd --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/board.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2006-2025 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-2-3 yekai first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (128 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM_SIZE (64*5) +#define STM32_SRAM_END (0x24000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__ARMCC_VERSION) +// use IRAM2(RAM D1) +extern int Image$$RW_IRAM2$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM2$$ZI$$Limit) +#define HEAP_END STM32_SRAM_END +#elif defined(__GNUC__) +extern uint8_t _heap_start[]; +extern uint8_t _heap_end[]; +#define HEAP_BEGIN _heap_start +#define HEAP_END _heap_end +#endif + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.icf b/bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.icf new file mode 100644 index 00000000000..14ec1960192 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x081FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x24000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2407FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x800; +define symbol __ICFEDIT_size_heap__ = 0x000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; diff --git a/bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.lds b/bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.lds new file mode 100644 index 00000000000..23408dd32ca --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.lds @@ -0,0 +1,213 @@ +/* + * linker script for STM32F4xx with GNU ld + * bernard.xiong 2009-10-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K + DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K + FLASH (rx) : ORIGIN = 0x90000000, LENGTH = 1M + RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 320K + RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 32K + RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 16K +} +ENTRY(Reset_Handler) +_system_stack_size = 0x400; + +SECTIONS +{ + .ram_d1(NOLOAD) : { + . = ALIGN(4); + *(.ram_d1) + *(.ram_d1.*) + . = ALIGN(4); + } >RAM_D1 + + .ram_d2(NOLOAD) : { + . = ALIGN(4); + *(.ram_d2) + *(.ram_d2.*) + . = ALIGN(4); + } >RAM_D2 + + .ram_d3(NOLOAD) : { + . = ALIGN(4); + *(.ram_d3) + *(.ram_d3.*) + . = ALIGN(4); + } >RAM_D3 + + _ramfunc_start_lma = LOADADDR(.ramfunc); + .ramfunc : { + . = ALIGN(4); + _ramfunc_start_vma = .; + *(.RamFunc) /* .RamFunc sections */ + *(.RamFunc*) /* .RamFunc* sections */ + . = ALIGN(4); + _ramfunc_end = .; /* define a global symbol at data end */ + } >ITCMRAM AT>FLASH + + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for utest */ + . = ALIGN(4); + __rt_utest_tc_tab_start = .; + KEEP(*(UtestTcTab)) + __rt_utest_tc_tab_end = .; + + /* section information for at server */ + . = ALIGN(4); + __rtatcmdtab_start = .; + KEEP(*(RtAtCmdTab)) + __rtatcmdtab_end = .; + . = ALIGN(4); + + /* section information for modules */ + . = ALIGN(4); + __rtmsymtab_start = .; + KEEP(*(RTMSymTab)) + __rtmsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + PROVIDE(__dtors_start__ = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } >FLASH + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + .ARM.exidx : + { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + *(.ARM.extab*) + . = ALIGN(4); + __exidx_end = .; + } >FLASH + + /* .data section which is used for initialized data */ + + _sidata = LOADADDR(.data); + _data_start_lma = LOADADDR(.data); + .data : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + _data_start_vma = .; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + _data_end = .; + } >DTCMRAM AT>FLASH + + __bss_start = .; + .bss (NOLOAD): + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > DTCMRAM + __bss_end = .; + _heap_start = .; + _end = .; + + _heap_end = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM) - _system_stack_size; + _sstack = _heap_end; + _estack = _heap_end + _system_stack_size; + + /* 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/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.sct b/bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.sct new file mode 100644 index 00000000000..0207c4f408d --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/board/linker_scripts/link.sct @@ -0,0 +1,19 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x20000 { ; load region size_region + ER_IROM1 0x08000000 0x20000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data + .ANY (+RW +ZI) + } + RW_IRAM2 0x24000000 0x00050000 { + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32h730-esphosted-evb/custom.cmake b/bsp/stm32/stm32h730-esphosted-evb/custom.cmake new file mode 100644 index 00000000000..02b6e114731 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/custom.cmake @@ -0,0 +1,20 @@ +set(OPENOCD_PATH_WIN "C:/Softwares/xpack-openocd-0.12.0-1/bin") +set(OPENOCD_PATH_MACOS "/Users/kai/DevTools/xpack-openocd-0.12.0-4/bin") +if ("${CMAKE_HOST_SYSTEM_NAME}" MATCHES "Windows") + set(OPENOCD_PATH ${OPENOCD_PATH_WIN}) +elseif ("${CMAKE_HOST_SYSTEM_NAME}" MATCHES "Darwin") + set(OPENOCD_PATH ${OPENOCD_PATH_MACOS}) +else () + message(STATUS "Unknown OS: ${CMAKE_HOST_SYSTEM_NAME}") +endif () + +set(OPENOCD_CFG ${PROJECT_SOURCE_DIR}/stm32h730-ospi1.cfg) +add_custom_target(flash ALL + COMMAND ${OPENOCD_PATH}/openocd + -s ${OPENOCD_PATH}/../scripts + -f ${OPENOCD_CFG} + -c "tcl_port disabled" -c "gdb_port disabled" + -c "program ${CMAKE_PROJECT_NAME}.elf" + -c reset -c shutdown + DEPENDS ${CMAKE_PROJECT_NAME}.elf +) \ No newline at end of file diff --git a/bsp/stm32/stm32h730-esphosted-evb/figures/board.png b/bsp/stm32/stm32h730-esphosted-evb/figures/board.png new file mode 100644 index 0000000000000000000000000000000000000000..9bc0669313ed808058b3effba987f44aa4bf25fb GIT binary patch literal 435239 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

|!AchV3 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Ë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 literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32h730-esphosted-evb/project.uvoptx b/bsp/stm32/stm32h730-esphosted-evb/project.uvoptx new file mode 100644 index 00000000000..c721b9bbbe1 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/project.uvoptx @@ -0,0 +1,1204 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC8000 -FD20000000 -FF0STM32H730xx_128 -FL020000 -FS08000000 -FP0($$Device:STM32H730VBTx$CMSIS\Flash\STM32H730xx_128.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("") -D00(00000000) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC8000 -FN1 -FF0STM32H730xx_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32H730VBTx$CMSIS\Flash\STM32H730xx_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Applications + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\dev_serial_v2.c + dev_serial_v2.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 22 + 2 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\arm\startup_stm32h730xx.s + startup_stm32h730xx.s + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Core\Src\stm32h7xx_hal_msp.c + stm32h7xx_hal_msp.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drivers\drv_usart_v2.c + drv_usart_v2.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + klibc + 0 + 0 + 0 + 0 + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 52 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 8 + 55 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m7\context_rvds.S + context_rvds.S + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m7\cpu_cache.c + cpu_cache.c + 0 + 0 + + + 8 + 57 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m7\cpuport.c + cpuport.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 9 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c + stm32h7xx_hal_pwr.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c + stm32h7xx_hal.c + 0 + 0 + + + 9 + 60 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c + stm32h7xx_hal_cortex.c + 0 + 0 + + + 9 + 61 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c + stm32h7xx_hal_rcc_ex.c + 0 + 0 + + + 9 + 62 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c + system_stm32h7xx.c + 0 + 0 + + + 9 + 63 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp_ex.c + stm32h7xx_hal_cryp_ex.c + 0 + 0 + + + 9 + 64 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c + stm32h7xx_hal_uart_ex.c + 0 + 0 + + + 9 + 65 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp.c + stm32h7xx_hal_cryp.c + 0 + 0 + + + 9 + 66 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rng.c + stm32h7xx_hal_rng.c + 0 + 0 + + + 9 + 67 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_comp.c + stm32h7xx_hal_comp.c + 0 + 0 + + + 9 + 68 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c + stm32h7xx_hal_dma.c + 0 + 0 + + + 9 + 69 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sram.c + stm32h7xx_hal_sram.c + 0 + 0 + + + 9 + 70 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c + stm32h7xx_hal_pwr_ex.c + 0 + 0 + + + 9 + 71 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c + stm32h7xx_hal_rcc.c + 0 + 0 + + + 9 + 72 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c + stm32h7xx_hal_gpio.c + 0 + 0 + + + 9 + 73 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c + stm32h7xx_hal_uart.c + 0 + 0 + + + 9 + 74 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc_ex.c + stm32h7xx_hal_crc_ex.c + 0 + 0 + + + 9 + 75 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c + stm32h7xx_hal_mdma.c + 0 + 0 + + + 9 + 76 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c + stm32h7xx_hal_dma_ex.c + 0 + 0 + + + 9 + 77 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_usart.c + stm32h7xx_hal_usart.c + 0 + 0 + + + 9 + 78 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc.c + stm32h7xx_hal_crc.c + 0 + 0 + + + 9 + 79 + 1 + 0 + 0 + 0 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cec.c + stm32h7xx_hal_cec.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32h730-esphosted-evb/project.uvprojx b/bsp/stm32/stm32h730-esphosted-evb/project.uvprojx new file mode 100644 index 00000000000..a5f25745345 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/project.uvprojx @@ -0,0 +1,2221 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 6190000::V6.19::ARMCLANG + 1 + + + STM32H730VBTx + STMicroelectronics + Keil.STM32H7xx_DFP.3.1.1 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00050000) IROM(0x08000000,0x00020000) XRAM(0x30000000,0x00008000) XRAM2(0x38000000,0x00004000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0STM32H730xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32H730VBTx$CMSIS\Flash\STM32H730xx_128.FLM)) + 0 + $$Device:STM32H730VBTx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h + + + + + + + + + + $$Device:STM32H730VBTx$CMSIS\SVD\STM32H730.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 3 + 0 + 0 + 0 + 1 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x30000000 + 0x8000 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x30000000 + 0x8000 + + + 0 + 0x38000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x24000000 + 0x50000 + + + + + + 1 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 3 + 5 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, __STDC_LIMIT_MACROS, __RTTHREAD__, RT_USING_ARMLIBC, STM32H730xx, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_LIBC + + ..\..\..\components\libc\posix\io\eventfd;..\..\..\components\drivers\include;..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Inc;..\libraries\HAL_Drivers;board\CubeMX_Config\Core\Inc;..\..\..\components\libc\posix\io\epoll;..\..\..\components\finsh;..\..\..\components\libc\posix\ipc;.;..\..\..\components\drivers\phy;..\libraries\HAL_Drivers\drivers\config;..\libraries\HAL_Drivers\drivers;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\cortex-m7;..\..\..\include;..\..\..\components\drivers\include;board;..\..\..\libcpu\arm\common;..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\poll;applications;..\libraries\HAL_Drivers\CMSIS\Include;..\..\..\components\drivers\include;..\..\..\components\drivers\smp_call + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\..\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\..\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\..\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_pin.c + 1 + ..\..\..\components\drivers\pin\dev_pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_serial_v2.c + 1 + ..\..\..\components\drivers\serial\dev_serial_v2.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + startup_stm32h730xx.s + 2 + ..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\arm\startup_stm32h730xx.s + + + stm32h7xx_hal_msp.c + 1 + board\CubeMX_Config\Core\Src\stm32h7xx_hal_msp.c + + + board.c + 1 + board\board.c + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drivers\drv_gpio.c + + + drv_usart_v2.c + 1 + ..\libraries\HAL_Drivers\drivers\drv_usart_v2.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + Finsh + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_parse.c + 1 + ..\..\..\components\finsh\msh_parse.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\..\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\..\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\..\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\..\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\..\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\..\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\..\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\..\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + kstdio.c + 1 + ..\..\..\src\klibc\kstdio.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kstring.c + 1 + ..\..\..\src\klibc\kstring.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + + + libcpu + + + atomic_arm.c + 1 + ..\..\..\libcpu\arm\common\atomic_arm.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m7\context_rvds.S + + + cpu_cache.c + 1 + ..\..\..\libcpu\arm\cortex-m7\cpu_cache.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m7\cpuport.c + + + + + Libraries + + + stm32h7xx_hal_pwr.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c + + + stm32h7xx_hal.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c + + + stm32h7xx_hal_cortex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c + + + stm32h7xx_hal_rcc_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c + + + system_stm32h7xx.c + 1 + ..\libraries\STM32H7xx_HAL\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c + + + stm32h7xx_hal_cryp_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp_ex.c + + + stm32h7xx_hal_uart_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c + + + stm32h7xx_hal_cryp.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cryp.c + + + stm32h7xx_hal_rng.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rng.c + + + stm32h7xx_hal_comp.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_comp.c + + + stm32h7xx_hal_dma.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c + + + stm32h7xx_hal_sram.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sram.c + + + stm32h7xx_hal_pwr_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c + + + stm32h7xx_hal_rcc.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c + + + stm32h7xx_hal_gpio.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c + + + stm32h7xx_hal_uart.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c + + + stm32h7xx_hal_crc_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc_ex.c + + + stm32h7xx_hal_mdma.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c + + + stm32h7xx_hal_dma_ex.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c + + + stm32h7xx_hal_usart.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_usart.c + + + stm32h7xx_hal_crc.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc.c + + + stm32h7xx_hal_cec.c + 1 + ..\libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cec.c + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
diff --git a/bsp/stm32/stm32h730-esphosted-evb/rtconfig.h b/bsp/stm32/stm32h730-esphosted-evb/rtconfig.h new file mode 100644 index 00000000000..870f3c03ca3 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/rtconfig.h @@ -0,0 +1,396 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +#define SOC_STM32H730VB + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 8 +#define RT_CPUS_NR 1 +#define RT_ALIGN_SIZE 8 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 + +/* kservice options */ + +/* end of kservice options */ +#define RT_USING_DEBUG +#define RT_DEBUGING_ASSERT +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x50200 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ +#define RT_USING_CACHE +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M7 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V2 +#define RT_SERIAL_USING_DMA +#define RT_USING_PIN +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32H7 + +/* Hardware Drivers Config */ + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_SCB_ENABLE_I_CACHE +#define BSP_SCB_ENABLE_D_CACHE +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART2 +#define BSP_UART2_RX_BUFSIZE 256 +#define BSP_UART2_TX_BUFSIZE 0 +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/bsp/stm32/stm32h730-esphosted-evb/rtconfig.py b/bsp/stm32/stm32h730-esphosted-evb/rtconfig.py new file mode 100644 index 00000000000..a2488720bf6 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/rtconfig.py @@ -0,0 +1,221 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m7' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\yekai\DevTools\arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi\bin' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armclang' #KEIL AC6 + #PLATFORM = 'armcc' #KEIL AC5 + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + print("Not support IAR yet!") + # PLATFORM = 'iccarm' + # EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' +elif CROSS_TOOL == 'llvm-arm': + print("Have not tested yet!") + PLATFORM = 'llvm-arm' + EXEC_PATH = r'D:\Progrem\LLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64\bin' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M7.fp.sp' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'armclang': + # toolchains + CC = 'armclang' + CXX = 'armclang' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M7.fp.sp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-M7 ' + CFLAGS += ' -mcpu=cortex-M7 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar ' + CFLAGS += ' -gdwarf-3 -ffunction-sections ' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers ' + LFLAGS += ' --list rt-thread.map ' + LFLAGS += r' --strict --scatter "board\linker_scripts\link.sct" ' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib' + + EXEC_PATH += '/ARM/ARMCLANG/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O1' # armclang recommend + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M7' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv5_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M7' + AFLAGS += ' --fpu VFPv5_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' +elif PLATFORM == 'llvm-arm': + # toolchains + PREFIX = 'llvm-' + CC = 'clang' + AS = 'clang' + AR = PREFIX + 'ar' + CXX = 'clang++' + LINK = 'clang' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + DEVICE = ' --target=arm-none-eabihf -mfloat-abi=hard -march=armv7em -mfpu=fpv4-sp-d16' + DEVICE += ' -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti' + CFLAGS = DEVICE + AFLAGS = ' -c' + DEVICE + ' -Wa,-mimplicit-it=thumb ' ## -x assembler-with-cpp + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-u,Reset_Handler -lcrt0 -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O3' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + 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/stm32/stm32h730-esphosted-evb/stm32h730-ospi1.cfg b/bsp/stm32/stm32h730-esphosted-evb/stm32h730-ospi1.cfg new file mode 100644 index 00000000000..d20d111a632 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/stm32h730-ospi1.cfg @@ -0,0 +1,85 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +# This is a stm32h735g-dk with a single STM32H735IGK6 chip. +# https://www.st.com/en/evaluation-tools/stm32h735g-dk.html +# + +# This is for using the onboard STLINK +source [find interface/stlink.cfg] + +transport select hla_swd + +set CHIPNAME stm32h730vbt6 + +set OCTOSPI1 1 + +source [find target/stm32h7x.cfg] + +# OCTOSPI initialization +# octo: 4-line mode +proc octospi_init { octo } { + global a b + mmw 0x58024540 0x000006FF 0 ;# RCC_AHB4ENR |= GPIOAEN-GPIOKEN (enable clocks) + mmw 0x58024534 0x00284000 0 ;# RCC_AHB3ENR |= IOMNGREN, OSPI2EN, OSPI1EN (enable clocks) + sleep 1 ;# Wait for clock startup + + mww 0x5200B404 0x03010111 ;# OCTOSPIM_P1CR: enable port 1 + mww 0x5200B408 0x00000000 ;# OCTOSPIM_P2CR: disable Port 2 + + +# PA07:AF10:V, PA06:AF06:V, PB02:AF09:V, PB01:AF04:V, PB00:AF04:V, PE11:AF11:V + # Port A: PA07:AF10:V, PA06:AF06:V + mmw 0x58020000 0x0000A000 0x00005000 ;# MODER + mmw 0x58020008 0x0000F000 0x00000000 ;# OSPEEDR + mmw 0x5802000C 0x00000000 0x0000F000 ;# PUPDR + mmw 0x58020020 0xA6000000 0x59000000 ;# AFRL + # Port B: PB02:AF09:V, PB01:AF04:V, PB00:AF04:V + mmw 0x58020400 0x0000002A 0x00000015 ;# MODER + mmw 0x58020408 0x0000003F 0x00000000 ;# OSPEEDR + mmw 0x5802040C 0x00000000 0x0000003F ;# PUPDR + mmw 0x58020420 0x00000944 0x000006BB ;# AFRL + # Port E: PE11:AF11:V + mmw 0x58021000 0x00800000 0x00400000 ;# MODER + mmw 0x58021008 0x00C00000 0x00000000 ;# OSPEEDR + mmw 0x5802100C 0x00000000 0x00C00000 ;# PUPDR + mmw 0x58021024 0x0000B000 0x00004000 ;# AFRH + + + # OCTOSPI1: memory-mapped 1-line read mode with 4-byte addresses + mww 0x52005130 0x00001000 + mww 0x52005000 0x3040000B + mww 0x52005008 0x01160100 + mww 0x5200500c 0x00000005 + + mww 0x52005108 0x00000000 + mww 0x52005100 0x01012101 + mww 0x52005110 0x00000013 + + sleep 1 + + flash probe $a ;# load configuration from CR, TCR, CCR, IR register values +} + +$_CHIPNAME.cpu0 configure -event reset-init { + global OCTOSPI1 + global OCTOSPI2 + + mmw 0x52002000 0x00000004 0x0000000B ;# FLASH_ACR: 4 WS for 192 MHZ HCLK + + mmw 0x58024400 0x00000001 0x00000018 ;# RCC_CR: HSIDIV=1, HSI on + mmw 0x58024410 0x10000000 0xEE000007 ;# RCC_CFGR: MCO2=system, MCO2PRE=8, HSI as system clock + mww 0x58024418 0x00000040 ;# RCC_D1CFGR: D1CPRE=1, D1PPRE=2, HPRE=1 + mww 0x5802441C 0x00000440 ;# RCC_D2CFGR: D2PPRE2=2, D2PPRE1=2 + mww 0x58024420 0x00000040 ;# RCC_D3CFGR: D3PPRE=2 + mww 0x58024428 0x00000040 ;# RCC_PPLCKSELR: DIVM3=0, DIVM2=0, DIVM1=4, PLLSRC=HSI + mmw 0x5802442C 0x0001000C 0x00000002 ;# RCC_PLLCFGR: PLL1RGE=8MHz to 16MHz, PLL1VCOSEL=wide + mww 0x58024430 0x01070217 ;# RCC_PLL1DIVR: 192 MHz: DIVR1=2, DIVQ=8, DIVP1=2, DIVN1=24 + mmw 0x58024400 0x01000000 0 ;# RCC_CR: PLL1ON=1 + sleep 1 + mmw 0x58024410 0x00000003 0 ;# RCC_CFGR: PLL1 as system clock + sleep 1 + + adapter speed 24000 + + octospi_init 1 +} \ No newline at end of file diff --git a/bsp/stm32/stm32h730-esphosted-evb/template.uvoptx b/bsp/stm32/stm32h730-esphosted-evb/template.uvoptx new file mode 100644 index 00000000000..822c1257bf4 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/template.uvoptx @@ -0,0 +1,184 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC8000 -FD20000000 -FF0STM32H730xx_128 -FL020000 -FS08000000 -FP0($$Device:STM32H730VBTx$CMSIS\Flash\STM32H730xx_128.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("") -D00(00000000) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC8000 -FN1 -FF0STM32H730xx_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32H730VBTx$CMSIS\Flash\STM32H730xx_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + +
diff --git a/bsp/stm32/stm32h730-esphosted-evb/template.uvprojx b/bsp/stm32/stm32h730-esphosted-evb/template.uvprojx new file mode 100644 index 00000000000..13b873fe537 --- /dev/null +++ b/bsp/stm32/stm32h730-esphosted-evb/template.uvprojx @@ -0,0 +1,402 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 1 + + + STM32H730VBTx + STMicroelectronics + Keil.STM32H7xx_DFP.3.1.1 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IRAM2(0x24000000,0x00050000) IROM(0x08000000,0x00020000) XRAM(0x30000000,0x00008000) XRAM2(0x38000000,0x00004000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0STM32H730xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32H730VBTx$CMSIS\Flash\STM32H730xx_128.FLM)) + 0 + $$Device:STM32H730VBTx$Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h + + + + + + + + + + $$Device:STM32H730VBTx$CMSIS\SVD\STM32H730.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M7" + + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 3 + 0 + 0 + 0 + 1 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x30000000 + 0x8000 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x30000000 + 0x8000 + + + 0 + 0x38000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x24000000 + 0x50000 + + + + + + 1 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 3 + 5 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
From 94952b18fcc05e2495c953384025a404ee604724 Mon Sep 17 00:00:00 2001 From: Chasel <70518174+Maihuanyi@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:29:27 +0800 Subject: [PATCH 41/51] [bsp][mm32f526x] 1.add mm32f526x bsp; (#9940) [bsp][mm32f526x] 1.add a bsp for mm32f526x; --- .github/workflows/bsp_buildings.yml | 1 + .../.ci/attachconfig/ci.attachconfig.yml | 22 + bsp/mm32f526x/.config | 1314 +++++++++ bsp/mm32f526x/.ignore_format.yml | 6 + bsp/mm32f526x/Kconfig | 17 + bsp/mm32f526x/Makefile | 20 + bsp/mm32f526x/README.md | 154 + bsp/mm32f526x/SConscript | 11 + bsp/mm32f526x/SConstruct | 48 + bsp/mm32f526x/applications/SConscript | 15 + bsp/mm32f526x/applications/main.c | 38 + bsp/mm32f526x/board/Kconfig | 58 + bsp/mm32f526x/board/SConscript | 18 + bsp/mm32f526x/board/board.c | 87 + bsp/mm32f526x/board/board.h | 42 + bsp/mm32f526x/board/linker_scripts/link.icf | 34 + bsp/mm32f526x/board/linker_scripts/link.lds | 268 ++ bsp/mm32f526x/board/linker_scripts/link.sct | 114 + bsp/mm32f526x/board/mm32_msp.c | 121 + bsp/mm32f526x/board/mm32_msp.h | 17 + bsp/mm32f526x/drivers/SConscript | 33 + bsp/mm32f526x/drivers/drv_adc.c | 163 ++ bsp/mm32f526x/drivers/drv_adc.h | 16 + bsp/mm32f526x/drivers/drv_flash.c | 145 + bsp/mm32f526x/drivers/drv_flash.h | 27 + bsp/mm32f526x/drivers/drv_gpio.c | 489 ++++ bsp/mm32f526x/drivers/drv_gpio.h | 17 + bsp/mm32f526x/drivers/drv_uart.c | 231 ++ bsp/mm32f526x/drivers/drv_uart.h | 16 + bsp/mm32f526x/drivers/fal_cfg.h | 37 + bsp/mm32f526x/drivers/linker_scripts/link.icf | 34 + bsp/mm32f526x/drivers/linker_scripts/link.lds | 268 ++ bsp/mm32f526x/drivers/linker_scripts/link.sct | 114 + bsp/mm32f526x/figures/Mini-F5265-OB.jpg | Bin 0 -> 568072 bytes bsp/mm32f526x/project.ewp | 2489 +++++++++++++++++ bsp/mm32f526x/project.eww | 10 + bsp/mm32f526x/project.uvoptx | 177 ++ bsp/mm32f526x/project.uvprojx | 1467 ++++++++++ bsp/mm32f526x/rtconfig.h | 409 +++ bsp/mm32f526x/rtconfig.py | 144 + bsp/mm32f526x/template.ewp | 2088 ++++++++++++++ bsp/mm32f526x/template.eww | 10 + bsp/mm32f526x/template.uvopt | 184 ++ bsp/mm32f526x/template.uvoptx | 177 ++ bsp/mm32f526x/template.uvprojx | 391 +++ 45 files changed, 11541 insertions(+) create mode 100644 bsp/mm32f526x/.ci/attachconfig/ci.attachconfig.yml create mode 100644 bsp/mm32f526x/.config create mode 100644 bsp/mm32f526x/.ignore_format.yml create mode 100644 bsp/mm32f526x/Kconfig create mode 100644 bsp/mm32f526x/Makefile create mode 100644 bsp/mm32f526x/README.md create mode 100644 bsp/mm32f526x/SConscript create mode 100644 bsp/mm32f526x/SConstruct create mode 100644 bsp/mm32f526x/applications/SConscript create mode 100644 bsp/mm32f526x/applications/main.c create mode 100644 bsp/mm32f526x/board/Kconfig create mode 100644 bsp/mm32f526x/board/SConscript create mode 100644 bsp/mm32f526x/board/board.c create mode 100644 bsp/mm32f526x/board/board.h create mode 100644 bsp/mm32f526x/board/linker_scripts/link.icf create mode 100644 bsp/mm32f526x/board/linker_scripts/link.lds create mode 100644 bsp/mm32f526x/board/linker_scripts/link.sct create mode 100644 bsp/mm32f526x/board/mm32_msp.c create mode 100644 bsp/mm32f526x/board/mm32_msp.h create mode 100644 bsp/mm32f526x/drivers/SConscript create mode 100644 bsp/mm32f526x/drivers/drv_adc.c create mode 100644 bsp/mm32f526x/drivers/drv_adc.h create mode 100644 bsp/mm32f526x/drivers/drv_flash.c create mode 100644 bsp/mm32f526x/drivers/drv_flash.h create mode 100644 bsp/mm32f526x/drivers/drv_gpio.c create mode 100644 bsp/mm32f526x/drivers/drv_gpio.h create mode 100644 bsp/mm32f526x/drivers/drv_uart.c create mode 100644 bsp/mm32f526x/drivers/drv_uart.h create mode 100644 bsp/mm32f526x/drivers/fal_cfg.h create mode 100644 bsp/mm32f526x/drivers/linker_scripts/link.icf create mode 100644 bsp/mm32f526x/drivers/linker_scripts/link.lds create mode 100644 bsp/mm32f526x/drivers/linker_scripts/link.sct create mode 100644 bsp/mm32f526x/figures/Mini-F5265-OB.jpg create mode 100644 bsp/mm32f526x/project.ewp create mode 100644 bsp/mm32f526x/project.eww create mode 100644 bsp/mm32f526x/project.uvoptx create mode 100644 bsp/mm32f526x/project.uvprojx create mode 100644 bsp/mm32f526x/rtconfig.h create mode 100644 bsp/mm32f526x/rtconfig.py create mode 100644 bsp/mm32f526x/template.ewp create mode 100644 bsp/mm32f526x/template.eww create mode 100644 bsp/mm32f526x/template.uvopt create mode 100644 bsp/mm32f526x/template.uvoptx create mode 100644 bsp/mm32f526x/template.uvprojx diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index 7e4c4790750..a36bbe26110 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -93,6 +93,7 @@ jobs: - "hc32l196" - "mm32/mm32f3270-100ask-pitaya" - "mm32f327x" + - "mm32f526x" - "mm32l07x" - "sam7x" - "hk32/hk32f030c8-mini" diff --git a/bsp/mm32f526x/.ci/attachconfig/ci.attachconfig.yml b/bsp/mm32f526x/.ci/attachconfig/ci.attachconfig.yml new file mode 100644 index 00000000000..7e03ff6c7b6 --- /dev/null +++ b/bsp/mm32f526x/.ci/attachconfig/ci.attachconfig.yml @@ -0,0 +1,22 @@ +scons.args: &scons + scons_arg: + - '--strict' +devices.gpio: + <<: *scons + kconfig: + - CONFIG_RT_USING_PIN=y + - CONFIG_BSP_USING_GPIO=y +devices.uart: + kconfig: + - CONFIG_RT_USING_SERIAL=y + - CONFIG_RT_USING_SERIAL_V1=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_BSP_USING_UART2=y + - CONFIG_BSP_USING_UART3=y +devices.adc: + kconfig: + - CONFIG_RT_USING_ADC=y + - CONFIG_BSP_USING_ADC=y + - CONFIG_BSP_USING_ADC1=y + - CONFIG_BSP_USING_ADC2=y + diff --git a/bsp/mm32f526x/.config b/bsp/mm32f526x/.config new file mode 100644 index 00000000000..eb88e11fed4 --- /dev/null +++ b/bsp/mm32f526x/.config @@ -0,0 +1,1314 @@ + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options +# end of klibc options + +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=512 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 +# CONFIG_RT_USING_TIMER_ALL_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart3" +CONFIG_RT_VER_NUM=0x50200 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_I2C=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_SOFT_I2C=y +CONFIG_RT_USING_SOFT_I2C1=y +CONFIG_RT_SOFT_I2C1_SCL_PIN=38 +CONFIG_RT_SOFT_I2C1_SDA_PIN=39 +CONFIG_RT_SOFT_I2C1_BUS_NAME="i2c1" +CONFIG_RT_SOFT_I2C1_TIMING_DELAY=10 +CONFIG_RT_SOFT_I2C1_TIMING_TIMEOUT=10 +# CONFIG_RT_USING_SOFT_I2C2 is not set +# CONFIG_RT_USING_SOFT_I2C3 is not set +# CONFIG_RT_USING_SOFT_I2C4 is not set +# CONFIG_RT_USING_SOFT_I2C5 is not set +# CONFIG_RT_USING_SOFT_I2C6 is not set +# CONFIG_RT_USING_SOFT_I2C7 is not set +# CONFIG_RT_USING_SOFT_I2C8 is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# CONFIG_PKG_USING_RYAN_JSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# CONFIG_PKG_USING_RVBACKTRACE is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_UART_FRAMEWORK is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32F4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +CONFIG_PKG_USING_AT24CXX=y +CONFIG_PKG_AT24CXX_PATH="/packages/peripherals/at24cxx" +CONFIG_PKG_USING_AT24CXX_LATEST_VERSION=y +CONFIG_PKG_AT24CXX_VER="latest" +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_BT_MX02 is not set +CONFIG_PKG_USING_MM32=y +CONFIG_PKG_MM32_PATH="/packages/peripherals/mm32" +# CONFIG_PKG_USING_MM32_V100 is not set +CONFIG_PKG_USING_MM32_LATEST_VERSION=y +CONFIG_PKG_MM32_VER="latest" +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +# +# Hardware Drivers Config +# + +# +# On-chip Peripheral Drivers +# + +# +# GPIO Drivers +# +CONFIG_BSP_USING_GPIO=y +# end of GPIO Drivers + +# +# UART Drivers +# +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART2 is not set +CONFIG_BSP_USING_UART3=y +# end of UART Drivers + +CONFIG_BSP_USING_ADC=y +CONFIG_BSP_USING_ADC1=y +# CONFIG_BSP_USING_ADC2 is not set + +# +# Flash Drivers +# +# CONFIG_BSP_USING_OCFLASH is not set +# end of Flash Drivers +# end of On-chip Peripheral Drivers +# end of Hardware Drivers Config + +CONFIG_SOC_MM32F526x=y diff --git a/bsp/mm32f526x/.ignore_format.yml b/bsp/mm32f526x/.ignore_format.yml new file mode 100644 index 00000000000..9aaf5416885 --- /dev/null +++ b/bsp/mm32f526x/.ignore_format.yml @@ -0,0 +1,6 @@ +# files format check exclude path, please follow the instructions below to modify; +# If you need to exclude an entire folder, add the folder path in dir_path; +# If you need to exclude a file, add the path to the file in file_path. + +dir_path: +- Libraries diff --git a/bsp/mm32f526x/Kconfig b/bsp/mm32f526x/Kconfig new file mode 100644 index 00000000000..844dcaf97d4 --- /dev/null +++ b/bsp/mm32f526x/Kconfig @@ -0,0 +1,17 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "board/Kconfig" + +config SOC_MM32F526x + bool + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y diff --git a/bsp/mm32f526x/Makefile b/bsp/mm32f526x/Makefile new file mode 100644 index 00000000000..17a4c600111 --- /dev/null +++ b/bsp/mm32f526x/Makefile @@ -0,0 +1,20 @@ +ifeq ($(shell uname), Linux) + # Linux-specific settings + toolchain=/home/mhy/gcc-arm-none-eabi-10.3-2021.10/bin +else + # Windows-specific settings + # toolchain=F:\work\TOOLS\sdk-toolchain-RISC-V-GCC-WCH\bin + ifndef toolchain + $(warning Please rewrite the toolchain in windows local directory") + exit 0 + endif +endif + +all: + scons -j 8 --exec-path=$(toolchain) + +PHONY: clean +clean: + scons -c --exec-path=$(toolchain) + rm -f *.bin *.hex *.map > /dev/null 2>&1 + diff --git a/bsp/mm32f526x/README.md b/bsp/mm32f526x/README.md new file mode 100644 index 00000000000..8469e8352f7 --- /dev/null +++ b/bsp/mm32f526x/README.md @@ -0,0 +1,154 @@ +# MM32F5265-OB开发板BSP 说明 + +标签: MM32、Cortex-M33、MM32F5265、国产MCU + +--- + +## 1. 简介 + +本文档为MM32F5265-OB 评估板bsp适配说明 + +### 1.1 开发板介绍 + +MM32F5265-OB 是为了用户快速上手、了解学习MM32系列MCU的一块入门级开发板,可满足基础测试及高端开发需求。 + +开发板外观如下图所示: + +MM32F5265-OB + +![Mini-F5265-OB](figures/Mini-F5265-OB.jpg) + +#### MM32F5265-OB 开发板特性: + +#### 内核与系统 +- 工作频率可达 120MHz +- 搭载 “星辰”STAR-MC1 (兼容 Cortex-M33)处理器,采用 Armv8-M Mainline 架构,内置单精度浮点运算单元(FPU),支持 DSP 扩展 +- 4KB L1 指令缓存(I-Cache)和 4KB L1 数据缓存(D-Cache) +- 三角函数加速单元(CORDIC),支持 Sin,Cos 和 Atan 操作 +- 外设互联矩阵 MindSwitch,支持定时器、GPIOs、EXTI、ADC、DAC 和比较器等模块信号间的直接连接或触发连接 +- 2 个 8 通道 DMA 控制器,支持外设类型包括定时器、ADC、DAC、UART、LPUART、I2C、SPI、QSPI 和 FlexCAN + +#### 存储器 +- 多达 256KB 的 Flash 存储器 +- 多达 128KB 的 SRAM +- Boot loader 支持片内 Flash 在线系统编程(ISP) +- QSPI 接口,支持扩展外部 NOR Flash 存储,支持在线执行模式(eXecute-In-Place,XIP) +- FSMC 接口,支持外扩 SRAM/PSRAM/NOR Flash 类型,兼容 8080/6800 通信总线模式 + +#### 时钟、复位和电源管理 +- 2.0V ∼ 5.5V 供电 +- 上电/断电复位(POR/PDR)、可编程电压监测器(PVD) +- 外部 4 ∼ 24MHz 高速晶体振荡器 +- 内置经出厂调校的 8MHz 高速 RC 振荡器 +- 内置的 PLL1 可产生系统时钟,支持多种分频模式,为总线矩阵和外设提供时钟 +- 内置的 PLL2 可产生最高 100MHz 的系统时钟,支持多种分频模式,为 USB 和ADC 提供时钟 +- 内置 40KHz 低速振荡器 +- 外部 32.768KHz 低速振荡器,支持旁路功能 + +#### 低功耗 +- 多种低功耗模式,包括:低功耗运行(Lower Power Run)、睡眠(Sleep)、低功耗睡眠(Low Power Sleep)、停机(Stop)、深度停机(Deep Stop)和待机模式(Standby) +- VBAT 为 RTC 和后备寄存器(20 x 16 位)供电 +- 内置LPUART、LPTimer,支持从低功耗模式下触发唤醒 + +#### 多达 14 个通信接口 +- 5 个 UART 接口 +- 1 个 LPUART 接口 +- 2 个 I2C 接口 +- 3 个 SPI 接口(支持 I2S 模式) +- 1 个 USB 2.0,支持 Device & Host 模式 +- 2 个 FlexCAN 接口,兼容 CAN 2.0B 协议 + +#### 13 个定时器 +- 2 个 16 位 4 通道高级定时器(TIM1 / TIM8),有 4 组包含互补输出功能的 PWM输出通道,并支持硬件死区插入和故障检测后的紧急停止功能 +- 2 个 16 位 4 通道通用定时器(TIM3 / TIM4)和 2 个 32 位 4 通道通用定时器(TIM2 / TIM5),每个通道配有 1 个 PWM 输出,并支持输入捕捉和输出比较,可用于红外、霍尔传感器或者编码器信号的解码 +- 2 个 16 位基础定时器(TIM6 / TIM7)可用作通用定时和产生中断 +- 1 个 16 位低功耗定时器(LPTIM)能在除了 Standby 以外的所有低功耗模式下唤醒处理器 +- 2 个看门狗定时器,包括独立型的 IWDG 和窗口型的 WWDG +- 1 个 24 位 Systick 定时器 +- 1 个 RTC 实时时钟 + +#### 2 个 12 位 ADC,共支持 19 个外部输入通道和 2 个内部输入通道,其中每个 ADC 支持最快 3MSPS 转换率,硬件支持过采样到 16 位分辨率 +- 转换范围:0 ∼ VDDA +- 支持采样时间和分辨率配置 +- 支持硬件过采样,过采样次数从 2 到 256 次可选 +- 片上温度传感器 +- 片上电压传感器 +- VBAT 电压传感器 + +#### 2 个 12 位 DAC + +#### 3 个 高速模拟比较器 + +#### 多达 86 个快速 I/O 端口 +- 所有 I/O 口可以映像到 16 个外部中断 +- 所有端口均可输入输出电压不高于 VDD 的信号 +- 多达 61 个 5V 容忍 I/O 端口 + +#### CRC 计算单元 + +#### 96 位芯片唯一 ID(UID) + +#### 调试模式 +- 串行调试接口(SWD) +- JTAG 接口 + +#### 采用 LQFP100、LQFP64 和 LQFP48 封装 +#### 全系列支持 -40℃ ∼ +105℃ 扩展工业型工作温度范围 + +#### 板载主控:MM32F5265E7PV + +板载资源: +- 2 个用户LED +- 2 个用户按键 +- 1 个复位按键 +- 1 个可调电位器 +- 8M SPI FLASH 和 2K EEPROM + +板载接口: +- 1 x USB Type-C (USB-DBG) + +供电方式: +- USB TYPE-C + +更多详细信息请咨询[上海灵动微电子](https://www.mindmotion.com.cn/) + +## 2. 编译说明 + +推荐熟悉 RT_Thread 的用户使用[env工具](https://www.rt-thread.org/download.html#download-rt-thread-env-tool),可以在console下进入到 `bsp/mm32f526x` 目录中,运行以下命令: + +``` +pkgs --update +make +``` + +来编译这个板级支持包。如果编译正确无误,会产生rtthread.elf、rtthread.bin、rtthread.hex文件。其中 rtthread.bin、rtthread.hex 都可以烧写到设备中运行。 + +## 3. 驱动支持情况及计划 + +| 驱动 | 支持情况 | 备注 | +| ---------- | :------: | :--------------------------: | +| UART | 支持 | UART1/2/3 | +| GPIO | 支持 | / | +| ADC | 支持 | ADC1/2 | +| FLASH | 支持 | / | + +## 4. 联系人信息 + +维护人: + +- [Chasel](https://github.com/Maihuanyi) email: m19825309307@163.com + +## 5. 参考 + +- [MM32F5260系列产品手册](https://www.mindmotion.com.cn/download/products/DS_MM32F5260_SC.pdf) + +- [MM32F5260系列用户手册](https://www.mindmotion.com.cn/download/products/UM_MM32F5260_SC.pdf) + +- [MiniBoard(MM32F5260)资料包](https://www.mindmotion.com.cn/support/development_tools/evaluation_boards/miniboard/mm32f5265e7pv/) + +- [KEIL Pack 设备支持包](https://www.mindmotion.com.cn/support/software/keil_pack/) + +- [IAR Pack 设备支持包](https://www.mindmotion.com.cn/support/software/iar_pack/) + +- [J-Link Pack 设备支持包](https://www.mindmotion.com.cn/support/software/jlink_pack/) + diff --git a/bsp/mm32f526x/SConscript b/bsp/mm32f526x/SConscript new file mode 100644 index 00000000000..1b1c7506a42 --- /dev/null +++ b/bsp/mm32f526x/SConscript @@ -0,0 +1,11 @@ +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/mm32f526x/SConstruct b/bsp/mm32f526x/SConstruct new file mode 100644 index 00000000000..f80eba527f5 --- /dev/null +++ b/bsp/mm32f526x/SConstruct @@ -0,0 +1,48 @@ +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, CFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.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' + + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/mm32f526x/applications/SConscript b/bsp/mm32f526x/applications/SConscript new file mode 100644 index 00000000000..9bb9abae897 --- /dev/null +++ b/bsp/mm32f526x/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/mm32f526x/applications/main.c b/bsp/mm32f526x/applications/main.c new file mode 100644 index 00000000000..86a84e55f72 --- /dev/null +++ b/bsp/mm32f526x/applications/main.c @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#include +#include +#include "hal_rcc.h" +#include "hal_gpio.h" + +#define LED1_PIN 31 +#define LED2_PIN 30 + +int main(void) +{ + /* set LED1 pin mode to output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + + /* set LED2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (1) { + rt_pin_write(LED1_PIN, PIN_HIGH); + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED1_PIN, PIN_LOW); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} + diff --git a/bsp/mm32f526x/board/Kconfig b/bsp/mm32f526x/board/Kconfig new file mode 100644 index 00000000000..c86a5a08eb7 --- /dev/null +++ b/bsp/mm32f526x/board/Kconfig @@ -0,0 +1,58 @@ +menu "Hardware Drivers Config" + menu "On-chip Peripheral Drivers" + + menu "GPIO Drivers" + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default n + endmenu + + menu "UART Drivers" + config BSP_USING_UART1 + bool "Enable UART1 PA9/10(T/R)" + select RT_USING_SERIAL + default n + config BSP_USING_UART2 + bool "Enable UART2 PA2/3(T/R)" + select RT_USING_SERIAL + default n + config BSP_USING_UART3 + bool "Enable UART3 PC10/11(T/R)" + select RT_USING_SERIAL + default y + endmenu + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + endif + + menu "Flash Drivers" + config BSP_USING_OCFLASH + bool "Enable On Chip Flash" + default n + config OCFLASH_USE_FAL + bool "Enable On Chip Flash FAL Driver" + depends on BSP_USING_OCFLASH + select RT_USING_FAL + default n + config OCFLASH_USE_LFS + bool "Enable On Chip Flash DFS Driver" + depends on OCFLASH_USE_FAL + select RT_USING_DFS + select RT_USING_MTD_NOR + select PKG_USING_LITTLEFS + default n + endmenu + endmenu +endmenu diff --git a/bsp/mm32f526x/board/SConscript b/bsp/mm32f526x/board/SConscript new file mode 100644 index 00000000000..65bc8de5494 --- /dev/null +++ b/bsp/mm32f526x/board/SConscript @@ -0,0 +1,18 @@ +# RT-Thread building script for component + +import os +import rtconfig +from building import * + +cwd = GetCurrentDir() + +# add the general drivers. +src = ['board.c'] +src += ['mm32_msp.c'] + +CPPPATH = [cwd] + + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/mm32f526x/board/board.c b/bsp/mm32f526x/board/board.c new file mode 100644 index 00000000000..6e01351bdcc --- /dev/null +++ b/bsp/mm32f526x/board/board.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#include +extern uint32_t SystemCoreClock; +extern void SystemInit(void); + +/** + * this function will delay for some us. + * + * @param us the delay time of us + */ +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; + } + } + } +} + +static void bsp_clock_config(void) +{ + SystemInit(); + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + SysTick->CTRL |= 0x00000004UL; +} + +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +void rt_hw_board_init() +{ + bsp_clock_config(); + +#if defined(RT_USING_HEAP) + rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); +#endif + +#ifdef RT_USING_PIN + extern int rt_hw_pin_init(void); + rt_hw_pin_init(); +#endif + +#ifdef RT_USING_SERIAL + extern int rt_hw_uart_init(void); + rt_hw_uart_init(); +#endif + +#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif +} diff --git a/bsp/mm32f526x/board/board.h b/bsp/mm32f526x/board/board.h new file mode 100644 index 00000000000..2318f0d24b4 --- /dev/null +++ b/bsp/mm32f526x/board/board.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ +#include +#include +#include +#include "mm32_device.h" +#include +#include "mm32_msp.h" + +#define SRAM_SIZE 0x1C000 + +#define SRAM_BASE (0x30000000) + +#define SRAM_END (SRAM_BASE + SRAM_SIZE) +#ifdef __CC_ARM + extern int Image$$RW_IRAM1$$ZI$$Limit; + #define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ + #pragma section = "HEAP" + #define HEAP_BEGIN (__segment_end("HEAP")) +#else + extern int __bss_end__; + #define HEAP_BEGIN ((void *)&__bss_end__) +#endif +#define HEAP_END SRAM_END +#define HEAP_SIZE (HEAP_END - (rt_uint32_t)HEAP_BEGIN) +extern void rt_hw_board_init(void); + +#define CLOCK_SYS_FREQ 120000000u +#define CLOCK_SYSTICK_FREQ (CLOCK_SYS_FREQ/8u) + +#endif diff --git a/bsp/mm32f526x/board/linker_scripts/link.icf b/bsp/mm32f526x/board/linker_scripts/link.icf new file mode 100644 index 00000000000..0bf4088b258 --- /dev/null +++ b/bsp/mm32f526x/board/linker_scripts/link.icf @@ -0,0 +1,34 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_IROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_IROM_end__ = 0x0003FFFF; +define symbol __ICFEDIT_region_IRAM_start__ = 0x30000000; +define symbol __ICFEDIT_region_IRAM_end__ = 0x3001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0800; +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +define symbol __ICFEDIT_size_heap__ = 0x0800; +/**** End of ICF editor section. ###ICF###*/ +define memory mem with size = 4G; +define region IROM_region = mem:[from __ICFEDIT_region_IROM_start__ to __ICFEDIT_region_IROM_end__]; +define region IRAM_region = mem:[from __ICFEDIT_region_IRAM_start__ to __ICFEDIT_region_IRAM_end__]; +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +do not initialize { section .noinit }; +initialize by copy { readwrite }; +if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) +{ + // Required in a multi-threaded application + initialize by copy with packing = none { section __DLIB_PERTHREAD }; +} + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in IROM_region { readonly }; +place in IRAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP }; diff --git a/bsp/mm32f526x/board/linker_scripts/link.lds b/bsp/mm32f526x/board/linker_scripts/link.lds new file mode 100644 index 00000000000..d32c5247671 --- /dev/null +++ b/bsp/mm32f526x/board/linker_scripts/link.lds @@ -0,0 +1,268 @@ + + +/* + *-------- <<< Use Configuration Wizard in Context Menu >>> ------------------- + */ + +/*---------------------- Flash Configuration ---------------------------------- + Flash Configuration + Flash Base Address <0x0-0xFFFFFFFF:8> + Flash Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__ROM_BASE = 0x08000000; +__ROM_SIZE = 0x00040000; + +/*--------------------- Embedded RAM Configuration ---------------------------- + RAM Configuration + RAM Base Address <0x0-0xFFFFFFFF:8> + RAM Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__RAM_BASE = 0x30000000; +__RAM_SIZE = 0x0001C000; + +/*--------------------- Stack / Heap Configuration ---------------------------- + Stack / Heap Configuration + Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> + Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__STACK_SIZE = 0x00001000; +/*__HEAP_SIZE = 0x00001000;*/ + +/* + *-------------------- <<< end of configuration section >>> ------------------- + */ + +/* ARMv8-M stack sealing: + to use ARMv8-M stack sealing set __STACKSEAL_SIZE to 8 otherwise keep 0 + */ +__STACKSEAL_SIZE = 0; + + +MEMORY +{ + FLASH (rx) : ORIGIN = __ROM_BASE, LENGTH = __ROM_SIZE + RAM (rwx) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __StackSeal (only if ARMv8-M stack sealing is used) + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + . = ALIGN(4); + KEEP(*(.vectors)) + . = 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 = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > FLASH + + /* + * SG veneers: + * All SG veneers are placed in the special output section .gnu.sgstubs. Its start address + * must be set, either with the command line option ��--section-start�� or in a linker script, + * to indicate where to place these veneers in memory. + */ +/* + .gnu.sgstubs : + { + . = ALIGN(32); + } > FLASH +*/ + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > FLASH + __exidx_end = .; + + __etext = ALIGN (4); + + .data : AT (__etext) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + + } > RAM + + /* + * Secondary data section, optional + * + * Remember to add each additional data section + * to the .copy.table above to asure proper + * initialization during startup. + */ +/* + __etext2 = ALIGN (4); + + .data2 : AT (__etext2) + { + . = ALIGN(4); + __data2_start__ = .; + *(.data2) + *(.data2.*) + . = ALIGN(4); + __data2_end__ = .; + + } > RAM2 +*/ + +/* + .heap (COPY) : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + . = . + __HEAP_SIZE; + . = ALIGN(8); + __HeapLimit = .; + } > RAM + */ + + + /* ARMv8-M stack sealing: + to use ARMv8-M stack sealing uncomment '.stackseal' section + */ +/* + .stackseal : + { + . = ALIGN(8); + __StackSeal = .; + . = . + 8; + . = ALIGN(8); + } > RAM +*/ + + .stack : + { + . = ALIGN(8); + _sstack = .; + . = . + __STACK_SIZE; + . = ALIGN(8); + _estack = .; + } > RAM + + __bss_start__ = .; + .bss : + { + . = ALIGN(4); + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end__ = .; + + /* + * Secondary bss section, optional + * + * Remember to add each additional bss section + * to the .zero.table above to asure proper + * initialization during startup. + */ +/* + .bss2 : + { + . = ALIGN(4); + __bss2_start__ = .; + *(.bss2) + *(.bss2.*) + . = ALIGN(4); + __bss2_end__ = .; + } > RAM2 AT > RAM2 +*/ +} diff --git a/bsp/mm32f526x/board/linker_scripts/link.sct b/bsp/mm32f526x/board/linker_scripts/link.sct new file mode 100644 index 00000000000..59105a68037 --- /dev/null +++ b/bsp/mm32f526x/board/linker_scripts/link.sct @@ -0,0 +1,114 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +#! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m33 -xc +; command above MUST be in first line (no comment above!) + +/* +;-------- <<< Use Configuration Wizard in Context Menu >>> ------------------- +*/ + +/*--------------------- Flash Configuration ---------------------------------- +; Flash Configuration +; Flash Base Address <0x0-0xFFFFFFFF:8> +; Flash Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __ROM_BASE 0x008000000 +#define __ROM_SIZE 0x000040000 + +/*---------------------------- ITCM Configuration ----------------------------- +; ITCM Configuration +; ITCM Base Address <0x0-0xFFFFFFFF:8> +; ITCM Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __ITCM_BASE 0x00000000 +#define __ITCM_SIZE 0x00008000 + +/*---------------------------- DTCM Configuration ----------------------------- +; DTCM Configuration +; DTCM Base Address <0x0-0xFFFFFFFF:8> +; DTCM Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __DTCM_BASE 0x20000000 +#define __DTCM_SIZE 0x00008000 + +/*--------------------- Embedded RAM1 Configuration --------------------------- +; RAM Configuration +; RAM1 Base Address <0x0-0xFFFFFFFF:8> +; RAM1 Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __RAM1_BASE 0x30000000 +#define __RAM1_SIZE 0x0001C000 + +/*--------------------- Embedded RAM2 Configuration --------------------------- +; RAM Configuration +; RAM2 Base Address <0x0-0xFFFFFFFF:8> +; RAM2 Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __RAM2_BASE 0x3001C000 +#define __RAM2_SIZE 0x00004000 + + +/*--------------------- Stack / Heap Configuration --------------------------- +; Stack / Heap Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __STACK_SIZE 0x00000800 +#define __HEAP_SIZE 0x00000C00 + + +/*---------------------------------------------------------------------------- + User Stack & Heap boundary definition + *----------------------------------------------------------------------------*/ +#define __STACK_TOP (__RAM1_BASE + __RAM1_SIZE) /* starts at end of RAM */ +#define __HEAP_BASE (AlignExpr(+0, 8)) /* starts after RW_RAM section, 8 byte aligned */ + + +/*---------------------------------------------------------------------------- + Scatter File Definitions definition + *----------------------------------------------------------------------------*/ +#define __RO_BASE __ROM_BASE +#define __RO_SIZE __ROM_SIZE + +LR_ROM __RO_BASE __RO_SIZE { ; load region size_region + ER_ROM __RO_BASE __RO_SIZE { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) +; *(Veneer$$CMSE) ; uncomment for secure applications + .ANY (+RO) + .ANY (+XO) + } + + RW_ITCM __ITCM_BASE __ITCM_SIZE { ; RW data + .ANY (+RW +ZI) + } + + RW_DTCM __DTCM_BASE __DTCM_SIZE { ; RW data + .ANY (+RW +ZI) + } + + RW_RAM1 __RAM1_BASE (__RAM1_SIZE - __STACK_SIZE - __HEAP_SIZE) { ; RW data + .ANY (+RW +ZI) + } + + RW_RAM2 __RAM2_BASE __RAM2_SIZE { ; RW data + .ANY (+RW +ZI) + } + +#if __HEAP_SIZE > 0 + ARM_LIB_HEAP __HEAP_BASE EMPTY __HEAP_SIZE { ; Reserve empty region for heap + } +#endif + + ARM_LIB_STACK __STACK_TOP EMPTY -__STACK_SIZE { ; Reserve empty region for stack + } +} + diff --git a/bsp/mm32f526x/board/mm32_msp.c b/bsp/mm32f526x/board/mm32_msp.c new file mode 100644 index 00000000000..a6bfba89a0d --- /dev/null +++ b/bsp/mm32f526x/board/mm32_msp.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#include +#include "mm32_device.h" +#include "mm32_msp.h" + +void mm32_msp_uart_init(void *instance) +{ + GPIO_InitTypeDef GPIO_InitStructure; + UART_TypeDef *uart_x = (UART_TypeDef *)instance; + +#ifdef BSP_USING_UART1 + if(UART1 == uart_x) + { + /* Enable UART clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + + /* Configure USART Rx/tx PIN */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_High; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7); + } +#endif +#ifdef BSP_USING_UART2 + if(UART2 == uart_x) + { + /* Enable UART clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART2, ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + + /* Configure USART Rx/tx PIN */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_High; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7); + } +#endif +#ifdef BSP_USING_UART3 + if(UART3 == uart_x) + { + /* Enable UART clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART3, ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); + + GPIO_InitTypeDef GPIO_InitStructure; + /* Configure USART Rx/tx PIN */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_High; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_7); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_7); + } +#endif + /* add others */ +} + +#ifdef BSP_USING_ADC +void mm32_msp_adc_init(void *instance) +{ + GPIO_InitTypeDef GPIO_InitStruct; + ADC_TypeDef *adc_x = (ADC_TypeDef *)instance; + +#ifdef BSP_USING_ADC1 + if(adc_x == ADC1) + { + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //Enable ADC1 clock + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + + /* configure adc channel as analog input */ + GPIO_StructInit(&GPIO_InitStruct); + GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; + GPIO_Init(GPIOA, &GPIO_InitStruct); + } +#endif + +#ifdef BSP_USING_ADC2 + if(adc_x == ADC2) + { + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); //Enable ADC2 clock + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); + + /* configure adc channel as analog input */ + GPIO_StructInit(&GPIO_InitStruct); + GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; + GPIO_Init(GPIOA, &GPIO_InitStruct); + } +#endif +} +#endif /* BSP_USING_ADC */ + diff --git a/bsp/mm32f526x/board/mm32_msp.h b/bsp/mm32f526x/board/mm32_msp.h new file mode 100644 index 00000000000..8be835a52a4 --- /dev/null +++ b/bsp/mm32f526x/board/mm32_msp.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#ifndef __MM32_MSP_H__ +#define __MM32_MSP_H__ + +void mm32_msp_uart_init(void *instance); +void mm32_msp_adc_init(void *instance); + +#endif /* __MM32_MSP_H__ */ diff --git a/bsp/mm32f526x/drivers/SConscript b/bsp/mm32f526x/drivers/SConscript new file mode 100644 index 00000000000..cf1314a9b80 --- /dev/null +++ b/bsp/mm32f526x/drivers/SConscript @@ -0,0 +1,33 @@ +# RT-Thread building script for component + +import os +import rtconfig +from building import * + +cwd = GetCurrentDir() + +# add the general drivers. +src = [] + +# add serial driver code +if GetDepend('BSP_USING_UART1') or GetDepend('BSP_USING_UART2') or GetDepend('BSP_USING_UART3'): + src += ['drv_uart.c'] + +# add gpio driver code +if GetDepend(['BSP_USING_GPIO']): + src += ['drv_gpio.c'] + +# add adc driver code +if GetDepend(['BSP_USING_ADC']): + src += ['drv_adc.c'] + +# add flash driver code +if GetDepend(['BSP_USING_OCFLASH']): + src += ['drv_flash.c'] + +CPPPATH = [cwd] + + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/mm32f526x/drivers/drv_adc.c b/bsp/mm32f526x/drivers/drv_adc.c new file mode 100644 index 00000000000..0ed76c8168a --- /dev/null +++ b/bsp/mm32f526x/drivers/drv_adc.c @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ +#include +#include "board.h" +#include "drv_adc.h" +#include +#include +#include +#include + +#if defined(BSP_USING_ADC) + +struct mm32_adc +{ + struct rt_adc_device mm32_adc_device; + ADC_TypeDef *adc_x; + char *name; +}; + +#if defined(BSP_USING_ADC1) +struct mm32_adc mm32_adc1_config = { + .adc_x = ADC1, + .name = "adc1", +}; +#endif /* BSP_USING_ADC1 */ + +#if defined(BSP_USING_ADC2) +struct mm32_adc mm32_adc2_config = { + .adc_x = ADC2, + .name = "adc2", +}; +#endif /* BSP_USING_ADC2 */ + +static void ADCxChannelEnable(ADC_TypeDef* ADCn, rt_uint32_t channel) +{ + ADCn->ADCHS &= ~(1 << channel); + ADCn->ADCHS |= (1 << channel); +} + +static rt_err_t mm32_adc_init(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled) +{ + ADC_InitTypeDef ADC_InitStruct; + ADC_TypeDef *adc_x; + RT_ASSERT(device != RT_NULL); + adc_x = device->parent.user_data; + + if (enabled) { + mm32_msp_adc_init((void *)adc_x); + + ADC_CalibrationConfig(adc_x, 0x1FE); + + ADC_StructInit(&ADC_InitStruct); + ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; + ADC_InitStruct.ADC_Prescaler = ADC_Prescaler_16; //ADC prescale factor + ADC_InitStruct.ADC_Mode = ADC_Mode_Scan; //Set ADC mode to scan conversion mode + ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; //AD data right-justified + ADC_Init(adc_x, &ADC_InitStruct); + + ADC_SampleTimeConfig(adc_x, channel, ADC_SampleTime_240_5); + + ADC_ChannelCmd(adc_x, channel, ENABLE); + + ADC_DifferentialConversionConfig(adc_x, ADC_Pseudo_Differential_Conversion_4_5); + + ADC_Cmd(adc_x, ENABLE); + } else { + #if defined(BSP_USING_ADC1) + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); //disable ADC1 clock + #endif /* BSP_USING_ADC1 */ + + #if defined(BSP_USING_ADC2) + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, DISABLE); //disable ADC2 clock + #endif /* BSP_USING_ADC2 */ + + ADC_DeInit(adc_x); + ADC_Cmd(adc_x, DISABLE); + } + + return RT_EOK; +} + +static rt_err_t mm32_get_adc_value(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value) +{ + ADC_TypeDef *adc_x; + RT_ASSERT(device != RT_NULL); + adc_x = device->parent.user_data; + + ADC_SoftwareStartConvCmd(adc_x, ENABLE); + + rt_uint32_t cnt = 0; + /* @warning There is a bug here, please fix me. */ + while(ADC_GetFlagStatus(adc_x, ADC_FLAG_EOS) == 0) { + rt_thread_mdelay(1); + if (cnt++ > 5) + break; + } + ADC_ClearFlag(adc_x, ADC_FLAG_EOS); + + *value = ADC_GetChannelConvertedValue(adc_x, channel); + return RT_EOK; +} + +static rt_uint8_t mm32_adc_get_resolution(struct rt_adc_device *device) +{ + ADC_TypeDef *adc_x = device->parent.user_data; + + RT_ASSERT(device != RT_NULL); + + switch( ((adc_x->ADCFG)&(0x00000380)) ) + { + case ADC_Resolution_12b: + return 12; + case ADC_Resolution_11b: + return 11; + case ADC_Resolution_10b: + return 10; + case ADC_Resolution_9b: + return 9; + case ADC_Resolution_8b: + return 8; + default: + return 12; + } +} + +static rt_int16_t mm32_adc_get_vref(struct rt_adc_device *device) +{ + if(device == RT_NULL) + return -RT_ERROR; + + return 3300; +} + +static const struct rt_adc_ops mm32_adc_ops = +{ + .enabled = mm32_adc_init, + .convert = mm32_get_adc_value, + .get_resolution = mm32_adc_get_resolution, + .get_vref = mm32_adc_get_vref, +}; + +int rt_hw_adc_init(void) +{ + #if defined(BSP_USING_ADC1) + rt_hw_adc_register(&mm32_adc1_config.mm32_adc_device, mm32_adc1_config.name, &mm32_adc_ops, mm32_adc1_config.adc_x); + #endif /* BSP_USING_ADC1 */ + + #if defined(BSP_USING_ADC2) + rt_hw_adc_register(&mm32_adc2_config.mm32_adc_device, mm32_adc2_config.name, &mm32_adc_ops, mm32_adc2_config.adc_x); + #endif /* BSP_USING_ADC2 */ + + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_hw_adc_init); + +#endif /* BSP_USING_ADC */ diff --git a/bsp/mm32f526x/drivers/drv_adc.h b/bsp/mm32f526x/drivers/drv_adc.h new file mode 100644 index 00000000000..1987ae551a5 --- /dev/null +++ b/bsp/mm32f526x/drivers/drv_adc.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#ifndef __DRV_ADC_H__ +#define __DRV_ADC_H__ + +int rt_hw_adc_init(void); + +#endif diff --git a/bsp/mm32f526x/drivers/drv_flash.c b/bsp/mm32f526x/drivers/drv_flash.c new file mode 100644 index 00000000000..6b69cad87eb --- /dev/null +++ b/bsp/mm32f526x/drivers/drv_flash.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + + +#include +#include "hal_flash.h" +#include "drv_flash.h" + +#define OCFLASH_BLK_SIZE 1024 +#define OCFLASH_LEN 1024*256 +#define OCFLASH_ADDR 0x08000000 + +#ifdef OCFLASH_USE_FAL + #include +#endif + +#ifdef OCFLASH_USE_LFS + #include + #define FS_PARTITION_NAME "filesystem" +#endif + +static int init(void) +{ + /* do nothing now */ + return 0; +} + +static int read(long offset, uint8_t *buf, size_t size) +{ + size_t i; + uint32_t addr = OCFLASH_ADDR + offset; + for (i = 0; i < size; i++) + { + *buf = *(__IO uint8_t *)addr; + buf++; + addr++; + } + return size; +} + +static int write(long offset, const uint8_t *buf, size_t size) +{ + size_t i; + uint32_t addr = OCFLASH_ADDR + offset; + + FLASH->KEYR = 0x45670123; + FLASH->KEYR = 0xCDEF89AB; + FLASH->SR = 0x00000001 | 0x00000004 | 0x00000010; + FLASH->CR |= 0x1; + + i = 0; + while (i < size) + { + *(__IO uint16_t *)addr = *buf | *(buf + 1) << 8; + addr = addr + 2; + buf += 2; + i += 2; + } + //Lock flash + FLASH->CR |= 0x00000080; + + return size; +} + +static int erase(long offset, size_t size) +{ + int len; + RT_ASSERT(offset > 0 && offset < OCFLASH_LEN); + int page_addr = (offset >> 10) << 10; + len = size + (offset - page_addr); + while (len > 0) + { + FLASH_Unlock(); + FLASH_ErasePage(page_addr); + FLASH_Lock(); + len -= OCFLASH_BLK_SIZE; + page_addr += OCFLASH_BLK_SIZE; + } + + return size; +} + +#ifdef OCFLASH_USE_FAL +const struct fal_flash_dev mm32_onchip_flash = +{ + .name = "mm32_onchip", + .addr = 0x08000000, + .len = 1024 * 512, + .blk_size = 1024, + .ops = {init, read, write, erase}, + .write_gran = 2 +}; +#endif + +int flash_init(void) +{ +#ifdef OCFLASH_USE_FAL + fal_init(); +#endif +#ifdef OCFLASH_USE_LFS + struct rt_device *flash_dev = fal_mtd_nor_device_create(FS_PARTITION_NAME); + + if (flash_dev == NULL) + { + rt_kprintf("Can't create a mtd device on '%s' partition.\n", FS_PARTITION_NAME); + } + else + { + rt_kprintf("Create a mtd device on the %s partition of flash successful.\n", FS_PARTITION_NAME); + } + + if (rt_device_find(FS_PARTITION_NAME) != RT_NULL) + { + if (dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0) == RT_EOK) + { + rt_kprintf("onchip lfs filesystem mount to '/'\n"); + } + else + { + dfs_mkfs("lfs", FS_PARTITION_NAME); + if (dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0) == RT_EOK) + { + rt_kprintf("onchip lfs filesystem mount to '/' with mkfs\n"); + } + else + { + rt_kprintf("onchip lfs filesystem mount to '/' failed!\n"); + } + } + } + else + { + rt_kprintf("find filesystem portion failed\r\n"); + } +#endif + return 0; +} +INIT_APP_EXPORT(flash_init); diff --git a/bsp/mm32f526x/drivers/drv_flash.h b/bsp/mm32f526x/drivers/drv_flash.h new file mode 100644 index 00000000000..0eb44eb726e --- /dev/null +++ b/bsp/mm32f526x/drivers/drv_flash.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#ifndef __DRV_FLASH_H__ +#define __DRV_FLASH_H__ + +#include + +struct spi_flash_device +{ + struct rt_device flash_device; + struct rt_device_blk_geometry geometry; + struct rt_spi_device *rt_spi_device; + struct rt_mutex lock; + void *user_data; +}; + +int flash_init(void); + +#endif diff --git a/bsp/mm32f526x/drivers/drv_gpio.c b/bsp/mm32f526x/drivers/drv_gpio.c new file mode 100644 index 00000000000..4f27103d581 --- /dev/null +++ b/bsp/mm32f526x/drivers/drv_gpio.c @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#include +#include +#include "drv_gpio.h" +#include +#include +#include +#include +#include +#include + +#define PIN_NUM(port, no) (((((port) & 0xFu) << 4) | ((no) & 0xFu))) +#define PIN_PORT(pin) ((uint8_t)(((pin) >> 4) & 0xFu)) +#define PIN_NO(pin) ((uint8_t)((pin) & 0xFu)) +#define RCC_PIN_PORT(pin) ((uint32_t)(0x01u << (PIN_PORT(pin)))) + +#define PIN_ATPORTSOURCE(pin) ((uint8_t)(((pin) & 0xF0u) >> 4)) +#define PIN_ATPINSOURCE(pin) ((uint8_t)((pin) & 0xFu)) + +#define PIN_ATPORT(pin) ((GPIO_TypeDef *)(GPIOA_BASE + (0x400u * PIN_PORT(pin)))) +#define PIN_ATPIN(pin) ((uint16_t)(1u << PIN_NO(pin))) + +/* mm32f5265 pin port */ +#define __MM32_PORT_MAX 6u + +#define PIN_ATPORT_MAX __MM32_PORT_MAX + +struct pin_irq_map +{ + rt_uint16_t pinbit; + rt_uint32_t irqbit; + enum IRQn irqno; +}; +const struct pin_irq_map mm32_pin_irq_map[] = +{ + {GPIO_Pin_0, EXTI_Line0, EXTI0_IRQn}, + {GPIO_Pin_1, EXTI_Line1, EXTI1_IRQn}, + {GPIO_Pin_2, EXTI_Line2, EXTI2_IRQn}, + {GPIO_Pin_3, EXTI_Line3, EXTI3_IRQn}, + {GPIO_Pin_4, EXTI_Line4, EXTI4_IRQn}, + {GPIO_Pin_5, EXTI_Line5, EXTI9_5_IRQn}, + {GPIO_Pin_6, EXTI_Line6, EXTI9_5_IRQn}, + {GPIO_Pin_7, EXTI_Line7, EXTI9_5_IRQn}, + {GPIO_Pin_8, EXTI_Line8, EXTI9_5_IRQn}, + {GPIO_Pin_9, EXTI_Line9, EXTI9_5_IRQn}, + {GPIO_Pin_10, EXTI_Line10, EXTI15_10_IRQn}, + {GPIO_Pin_11, EXTI_Line11, EXTI15_10_IRQn}, + {GPIO_Pin_12, EXTI_Line12, EXTI15_10_IRQn}, + {GPIO_Pin_13, EXTI_Line13, EXTI15_10_IRQn}, + {GPIO_Pin_14, EXTI_Line14, EXTI15_10_IRQn}, + {GPIO_Pin_15, EXTI_Line15, EXTI15_10_IRQn}, +}; +struct rt_pin_irq_hdr mm32_pin_irq_hdr_tab[] = +{ + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, +}; + +#define ITEM_NUM(items) sizeof(items) / sizeof(items[0]) + +static rt_base_t mm32_pin_get(const char *name) +{ + rt_base_t pin = 0; + int hw_port_num, hw_pin_num = 0; + int i, name_len; + + name_len = rt_strlen(name); + + if ((name_len < 4) || (name_len >= 6)) { + return -RT_EINVAL; + } + + if ((name[0] != 'P') || (name[2] != '.')) { + return -RT_EINVAL; + } + + if ((name[1] >= 'A') && (name[1] <= 'Z')) { + hw_port_num = (int)(name[1] - 'A'); + } else { + return -RT_EINVAL; + } + + for (i = 3; i < name_len; i++) { + hw_pin_num *= 10; + hw_pin_num += name[i] - '0'; + } + + pin = PIN_NUM(hw_port_num, hw_pin_num); + + return pin; +} + +void mm32_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value) +{ + GPIO_TypeDef *gpio_port; + + uint16_t gpio_pin; + if (PIN_PORT(pin) < PIN_ATPORT_MAX) { + gpio_port = PIN_ATPORT(pin); + gpio_pin = PIN_ATPIN(pin); + } else { + return; + } + + GPIO_WriteBit(gpio_port, gpio_pin, (PIN_LOW == value) ? Bit_RESET : Bit_SET); +} + +rt_ssize_t mm32_pin_read(rt_device_t dev, rt_base_t pin) +{ + GPIO_TypeDef *gpio_port; + uint16_t gpio_pin; + int value; + + value = PIN_LOW; + + if (PIN_PORT(pin) < PIN_ATPORT_MAX) { + gpio_port = PIN_ATPORT(pin); + gpio_pin = PIN_ATPIN(pin); + value = GPIO_ReadInputDataBit(gpio_port, gpio_pin); + } else { + return -RT_EINVAL; + } + + return value; +} + +void mm32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) +{ + GPIO_TypeDef *gpio_port; + uint16_t gpio_pin; + GPIO_InitTypeDef GPIO_InitStructure; + + if (PIN_PORT(pin) < PIN_ATPORT_MAX) { + gpio_port = PIN_ATPORT(pin); + gpio_pin = PIN_ATPIN(pin); + } else { + return; + } + + /* GPIO Periph clock enable */ + RCC_AHBPeriphClockCmd(RCC_PIN_PORT(pin), ENABLE); + + /* Configure GPIO_InitStructure */ + GPIO_InitStructure.GPIO_Pin = gpio_pin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_High; + + if (mode == PIN_MODE_OUTPUT) { + /* output setting */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + } else if (mode == PIN_MODE_OUTPUT_OD) { + /* output setting: od. */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; + } else if (mode == PIN_MODE_INPUT) { + /* input setting: not pull. */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_FLOATING; + } else if (mode == PIN_MODE_INPUT_PULLUP) { + /* input setting: pull up. */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + } else { + /* input setting:default. */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; + } + + GPIO_Init(gpio_port, &GPIO_InitStructure); +} + +rt_inline rt_int32_t bit2bitno(rt_uint32_t bit) +{ + int i; + for (i = 0; i < 32; i++) { + if ((0x01 << i) == bit) { + return i; + } + } + + return -1; +} + +rt_inline const struct pin_irq_map *get_pin_irq_map(uint32_t pinbit) +{ + rt_int32_t mapindex = bit2bitno(pinbit); + if (mapindex < 0 || mapindex >= ITEM_NUM(mm32_pin_irq_map)) { + return RT_NULL; + } + return &mm32_pin_irq_map[mapindex]; +}; + +rt_err_t mm32_pin_attach_irq(struct rt_device *device, rt_base_t pin, + rt_uint8_t mode, void (*hdr)(void *args), void *args) +{ + uint16_t gpio_pin; + rt_base_t level; + rt_int32_t irqindex = -1; + + if (PIN_PORT(pin) < PIN_ATPORT_MAX) { + gpio_pin = PIN_ATPIN(pin); + } else { + return -RT_EINVAL; + } + + irqindex = bit2bitno(gpio_pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(mm32_pin_irq_map)) { + return -RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + if (mm32_pin_irq_hdr_tab[irqindex].pin == pin && + mm32_pin_irq_hdr_tab[irqindex].hdr == hdr && + mm32_pin_irq_hdr_tab[irqindex].mode == mode && + mm32_pin_irq_hdr_tab[irqindex].args == args) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + + if (mm32_pin_irq_hdr_tab[irqindex].pin != -1) { + rt_hw_interrupt_enable(level); + return -RT_EBUSY; + } + + mm32_pin_irq_hdr_tab[irqindex].pin = pin; + mm32_pin_irq_hdr_tab[irqindex].hdr = hdr; + mm32_pin_irq_hdr_tab[irqindex].mode = mode; + mm32_pin_irq_hdr_tab[irqindex].args = args; + rt_hw_interrupt_enable(level); + + return RT_EOK; +} +rt_err_t mm32_pin_detach_irq(struct rt_device *device, rt_base_t pin) +{ + uint16_t gpio_pin; + rt_base_t level; + rt_int32_t irqindex = -1; + + if (PIN_PORT(pin) < PIN_ATPORT_MAX) { + gpio_pin = PIN_ATPIN(pin); + } else { + return -RT_EINVAL; + } + + irqindex = bit2bitno(gpio_pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(mm32_pin_irq_map)) { + return -RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + if (mm32_pin_irq_hdr_tab[irqindex].pin == -1) { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + + mm32_pin_irq_hdr_tab[irqindex].pin = -1; + mm32_pin_irq_hdr_tab[irqindex].hdr = RT_NULL; + mm32_pin_irq_hdr_tab[irqindex].mode = 0; + mm32_pin_irq_hdr_tab[irqindex].args = RT_NULL; + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +rt_err_t mm32_pin_irq_enable(struct rt_device *device, rt_base_t pin, + rt_uint8_t enabled) +{ + GPIO_TypeDef *gpio_port; + uint16_t gpio_pin; + const struct pin_irq_map *irqmap; + rt_base_t level; + rt_int32_t irqindex = -1; + GPIO_InitTypeDef GPIO_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + EXTI_InitTypeDef EXTI_InitStructure; + + if (PIN_PORT(pin) < PIN_ATPORT_MAX) { + gpio_port = PIN_ATPORT(pin); + gpio_pin = PIN_ATPIN(pin); + } else { + return -RT_EINVAL; + } + + if (enabled == PIN_IRQ_ENABLE) + { + irqindex = bit2bitno(gpio_pin); + if (irqindex < 0 || irqindex >= ITEM_NUM(mm32_pin_irq_map)) { + return -RT_ENOSYS; + } + level = rt_hw_interrupt_disable(); + if (mm32_pin_irq_hdr_tab[irqindex].pin == -1) { + rt_hw_interrupt_enable(level); + return -RT_ENOSYS; + } + irqmap = &mm32_pin_irq_map[irqindex]; + + /* GPIO Periph clock enable */ + RCC_AHBPeriphClockCmd(RCC_PIN_PORT(pin), ENABLE); + + /* Configure GPIO_InitStructure */ + GPIO_InitStructure.GPIO_Pin = gpio_pin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_High; + GPIO_Init(gpio_port, &GPIO_InitStructure); + + NVIC_InitStructure.NVIC_IRQChannel = irqmap->irqno; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + EXTI_InitStructure.EXTI_Line = irqmap->irqbit; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + switch (mm32_pin_irq_hdr_tab[irqindex].mode) { + case PIN_IRQ_MODE_RISING: + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + break; + case PIN_IRQ_MODE_FALLING: + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; + break; + case PIN_IRQ_MODE_RISING_FALLING: + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + break; + } + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + rt_hw_interrupt_enable(level); + } else if (enabled == PIN_IRQ_DISABLE) { + irqmap = get_pin_irq_map(gpio_pin); + if (irqmap == RT_NULL) { + return -RT_ENOSYS; + } + EXTI_InitStructure.EXTI_Line = irqmap->irqbit; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = DISABLE; + EXTI_Init(&EXTI_InitStructure); + } else { + return -RT_ENOSYS; + } + + return RT_EOK; +} +const static struct rt_pin_ops _mm32_pin_ops = +{ + mm32_pin_mode, + mm32_pin_write, + mm32_pin_read, + mm32_pin_attach_irq, + mm32_pin_detach_irq, + mm32_pin_irq_enable, + mm32_pin_get, +}; + +int rt_hw_pin_init(void) +{ + int result; + + result = rt_device_pin_register("pin", &_mm32_pin_ops, RT_NULL); + return result; +} + +rt_inline void pin_irq_hdr(int irqno) +{ + EXTI_ClearITPendingBit(mm32_pin_irq_map[irqno].irqbit); + if (mm32_pin_irq_hdr_tab[irqno].hdr) + { + mm32_pin_irq_hdr_tab[irqno].hdr(mm32_pin_irq_hdr_tab[irqno].args); + } +} +void EXTI0_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(0); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(1); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(2); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI3_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(3); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI4_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + pin_irq_hdr(4); + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI9_5_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + if (EXTI_GetITStatus(EXTI_Line5) != RESET) + { + pin_irq_hdr(5); + } + if (EXTI_GetITStatus(EXTI_Line6) != RESET) + { + pin_irq_hdr(6); + } + if (EXTI_GetITStatus(EXTI_Line7) != RESET) + { + pin_irq_hdr(7); + } + if (EXTI_GetITStatus(EXTI_Line8) != RESET) + { + pin_irq_hdr(8); + } + if (EXTI_GetITStatus(EXTI_Line9) != RESET) + { + pin_irq_hdr(9); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +void EXTI15_10_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + if (EXTI_GetITStatus(EXTI_Line10) != RESET) + { + pin_irq_hdr(10); + } + if (EXTI_GetITStatus(EXTI_Line11) != RESET) + { + pin_irq_hdr(11); + } + if (EXTI_GetITStatus(EXTI_Line12) != RESET) + { + pin_irq_hdr(12); + } + if (EXTI_GetITStatus(EXTI_Line13) != RESET) + { + pin_irq_hdr(13); + } + if (EXTI_GetITStatus(EXTI_Line14) != RESET) + { + pin_irq_hdr(14); + } + if (EXTI_GetITStatus(EXTI_Line15) != RESET) + { + pin_irq_hdr(15); + } + /* leave interrupt */ + rt_interrupt_leave(); +} + diff --git a/bsp/mm32f526x/drivers/drv_gpio.h b/bsp/mm32f526x/drivers/drv_gpio.h new file mode 100644 index 00000000000..22350a6f4d0 --- /dev/null +++ b/bsp/mm32f526x/drivers/drv_gpio.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#ifndef __DRV_GPIO_H__ +#define __DRV_GPIO_H__ + +int rt_hw_pin_init(void); + +#endif + diff --git a/bsp/mm32f526x/drivers/drv_uart.c b/bsp/mm32f526x/drivers/drv_uart.c new file mode 100644 index 00000000000..f801f87125d --- /dev/null +++ b/bsp/mm32f526x/drivers/drv_uart.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ +#include "board.h" +#include +#include +#include "drv_uart.h" +#include +#include +#include +#include + +/* uart driver */ +struct mm32_uart +{ + UART_TypeDef *uart; + IRQn_Type irq; +}; + +static rt_err_t mm32_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + struct mm32_uart *uart; + UART_InitTypeDef UART_InitStructure; + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + uart = (struct mm32_uart *)serial->parent.user_data; + UART_InitStructure.BaudRate = cfg->baud_rate; + if (cfg->data_bits == DATA_BITS_8) + UART_InitStructure.WordLength = UART_WordLength_8b; + if (cfg->stop_bits == STOP_BITS_1) + UART_InitStructure.StopBits = UART_StopBits_1; + else if (cfg->stop_bits == STOP_BITS_2) + UART_InitStructure.StopBits = UART_StopBits_2; + UART_InitStructure.Parity = UART_Parity_No; + UART_InitStructure.HWFlowControl = UART_HWFlowControl_None; + UART_InitStructure.Mode = UART_Mode_Rx | UART_Mode_Tx; + UART_Init(uart->uart, &UART_InitStructure); + + /* Enable UART */ + UART_Cmd(uart->uart, ENABLE); + + return RT_EOK; +} + +static rt_err_t mm32_uart_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + struct mm32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = (struct mm32_uart *)serial->parent.user_data; + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: + /* disable rx irq */ + NVIC_DisableIRQ(uart->irq); + UART_ITConfig(uart->uart, UART_IT_RX, DISABLE); + break; + case RT_DEVICE_CTRL_SET_INT: + /* enable rx irq */ + NVIC_EnableIRQ(uart->irq); + /* enable interrupt */ + UART_ITConfig(uart->uart, UART_IT_RX, ENABLE); + break; + } + return RT_EOK; +} + +static int mm32_uart_putc(struct rt_serial_device *serial, char c) +{ + struct mm32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = (struct mm32_uart *)serial->parent.user_data; + while ((uart->uart->CSR & UART_CSR_TXC_Msk) == 0) + ; + uart->uart->TDR = c; + return 1; +} + +static int mm32_uart_getc(struct rt_serial_device *serial) +{ + int ch; + struct mm32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = (struct mm32_uart *)serial->parent.user_data; + ch = -1; + if (uart->uart->CSR & UART_FLAG_RXAVL) + { + ch = uart->uart->RDR & 0xff; + } + return ch; +} + +static const struct rt_uart_ops mm32_uart_ops = +{ + mm32_uart_configure, + mm32_uart_control, + mm32_uart_putc, + mm32_uart_getc, +}; + +#if defined(BSP_USING_UART1) +/* UART1 device driver structure */ +static struct mm32_uart uart1; +struct rt_serial_device serial1; +void UART1_IRQHandler(void) +{ + struct mm32_uart *uart; + uart = &uart1; + /* enter interrupt */ + rt_interrupt_enter(); + if (UART_GetITStatus(uart->uart, UART_IT_RX) != RESET) + { + UART_ClearITPendingBit(uart->uart, UART_IT_RX); + rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND); + } + if (UART_GetITStatus(uart->uart, UART_IT_TX) != RESET) + { + /* clear interrupt */ + UART_ClearITPendingBit(uart->uart, UART_IT_TX); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART1 */ + +#if defined(BSP_USING_UART2) +/* UART2 device driver structure */ +static struct mm32_uart uart2; +struct rt_serial_device serial2; +void UART2_IRQHandler(void) +{ + struct mm32_uart *uart; + uart = &uart2; + /* enter interrupt */ + rt_interrupt_enter(); + if (UART_GetITStatus(uart->uart, UART_IT_RX) != RESET) + { + UART_ClearITPendingBit(uart->uart, UART_IT_RX); + rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND); + } + if (UART_GetITStatus(uart->uart, UART_IT_TX) != RESET) + { + /* clear interrupt */ + UART_ClearITPendingBit(uart->uart, UART_IT_TX); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART2 */ + +#if defined(BSP_USING_UART3) +/* UART3 device driver structure */ +static struct mm32_uart uart3; +struct rt_serial_device serial3; +void UART3_IRQHandler(void) +{ + struct mm32_uart *uart; + uart = &uart3; + /* enter interrupt */ + rt_interrupt_enter(); + if (UART_GetITStatus(uart->uart, UART_IT_RX) != RESET) + { + UART_ClearITPendingBit(uart->uart, UART_IT_RX); + rt_hw_serial_isr(&serial3, RT_SERIAL_EVENT_RX_IND); + } + if (UART_GetITStatus(uart->uart, UART_IT_TX) != RESET) + { + /* clear interrupt */ + UART_ClearITPendingBit(uart->uart, UART_IT_TX); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART3 */ + +int rt_hw_uart_init(void) +{ + struct mm32_uart *uart; + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; +#ifdef BSP_USING_UART1 + mm32_msp_uart_init((void *)UART1); + + uart = &uart1; + uart->uart = UART1; + uart->irq = UART1_IRQn; + config.baud_rate = BAUD_RATE_115200; + serial1.ops = &mm32_uart_ops; + serial1.config = config; + /* register UART1 device */ + rt_hw_serial_register(&serial1, "uart1", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + uart); +#endif /* BSP_USING_UART1 */ + +#ifdef BSP_USING_UART2 + mm32_msp_uart_init((void *)UART2); + + uart = &uart2; + uart->uart = UART2; + uart->irq = UART2_IRQn; + config.baud_rate = BAUD_RATE_115200; + serial2.ops = &mm32_uart_ops; + serial2.config = config; + /* register UART2 device */ + rt_hw_serial_register(&serial2, "uart2", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + uart); +#endif /* BSP_USING_UART2 */ + +#ifdef BSP_USING_UART3 + mm32_msp_uart_init((void *)UART3); + + uart = &uart3; + uart->uart = UART3; + uart->irq = UART3_IRQn; + config.baud_rate = BAUD_RATE_115200; + serial3.ops = &mm32_uart_ops; + serial3.config = config; + /* register UART2 device */ + rt_hw_serial_register(&serial3, "uart3", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + uart); +#endif /* BSP_USING_UART3 */ + + return 0; +} diff --git a/bsp/mm32f526x/drivers/drv_uart.h b/bsp/mm32f526x/drivers/drv_uart.h new file mode 100644 index 00000000000..523598a0a34 --- /dev/null +++ b/bsp/mm32f526x/drivers/drv_uart.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2022-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-22 chasel first version + */ + +#ifndef __DRV_UART_H__ +#define __DRV_UART_H__ + +int rt_hw_uart_init(void); + +#endif diff --git a/bsp/mm32f526x/drivers/fal_cfg.h b/bsp/mm32f526x/drivers/fal_cfg.h new file mode 100644 index 00000000000..22e77992a75 --- /dev/null +++ b/bsp/mm32f526x/drivers/fal_cfg.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-05 mazhiyuan first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ + +#include +#include + + +/* ===================== Flash device Configuration ========================= */ +extern const struct fal_flash_dev mm32_onchip_flash; +extern struct fal_flash_dev nor_flash0; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ +{ \ + &mm32_onchip_flash, \ +} +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG +/* partition table */ +#define FAL_PART_TABLE \ +{ \ + {FAL_PART_MAGIC_WORD, "bl", "mm32_onchip", 0, 128*1024, 0}, \ + {FAL_PART_MAGIC_WORD, "filesystem", "mm32_onchip", 128*1024, 255*1024, 0}, \ +} +#endif /* FAL_PART_HAS_TABLE_CFG */ + +#endif /* _FAL_CFG_H_ */ diff --git a/bsp/mm32f526x/drivers/linker_scripts/link.icf b/bsp/mm32f526x/drivers/linker_scripts/link.icf new file mode 100644 index 00000000000..0bf4088b258 --- /dev/null +++ b/bsp/mm32f526x/drivers/linker_scripts/link.icf @@ -0,0 +1,34 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_IROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_IROM_end__ = 0x0003FFFF; +define symbol __ICFEDIT_region_IRAM_start__ = 0x30000000; +define symbol __ICFEDIT_region_IRAM_end__ = 0x3001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0800; +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +define symbol __ICFEDIT_size_heap__ = 0x0800; +/**** End of ICF editor section. ###ICF###*/ +define memory mem with size = 4G; +define region IROM_region = mem:[from __ICFEDIT_region_IROM_start__ to __ICFEDIT_region_IROM_end__]; +define region IRAM_region = mem:[from __ICFEDIT_region_IRAM_start__ to __ICFEDIT_region_IRAM_end__]; +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +do not initialize { section .noinit }; +initialize by copy { readwrite }; +if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) +{ + // Required in a multi-threaded application + initialize by copy with packing = none { section __DLIB_PERTHREAD }; +} + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in IROM_region { readonly }; +place in IRAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP }; diff --git a/bsp/mm32f526x/drivers/linker_scripts/link.lds b/bsp/mm32f526x/drivers/linker_scripts/link.lds new file mode 100644 index 00000000000..d32c5247671 --- /dev/null +++ b/bsp/mm32f526x/drivers/linker_scripts/link.lds @@ -0,0 +1,268 @@ + + +/* + *-------- <<< Use Configuration Wizard in Context Menu >>> ------------------- + */ + +/*---------------------- Flash Configuration ---------------------------------- + Flash Configuration + Flash Base Address <0x0-0xFFFFFFFF:8> + Flash Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__ROM_BASE = 0x08000000; +__ROM_SIZE = 0x00040000; + +/*--------------------- Embedded RAM Configuration ---------------------------- + RAM Configuration + RAM Base Address <0x0-0xFFFFFFFF:8> + RAM Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__RAM_BASE = 0x30000000; +__RAM_SIZE = 0x0001C000; + +/*--------------------- Stack / Heap Configuration ---------------------------- + Stack / Heap Configuration + Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> + Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> + + -----------------------------------------------------------------------------*/ +__STACK_SIZE = 0x00001000; +/*__HEAP_SIZE = 0x00001000;*/ + +/* + *-------------------- <<< end of configuration section >>> ------------------- + */ + +/* ARMv8-M stack sealing: + to use ARMv8-M stack sealing set __STACKSEAL_SIZE to 8 otherwise keep 0 + */ +__STACKSEAL_SIZE = 0; + + +MEMORY +{ + FLASH (rx) : ORIGIN = __ROM_BASE, LENGTH = __ROM_SIZE + RAM (rwx) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __StackSeal (only if ARMv8-M stack sealing is used) + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + . = ALIGN(4); + KEEP(*(.vectors)) + . = 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 = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > FLASH + + /* + * SG veneers: + * All SG veneers are placed in the special output section .gnu.sgstubs. Its start address + * must be set, either with the command line option ��--section-start�� or in a linker script, + * to indicate where to place these veneers in memory. + */ +/* + .gnu.sgstubs : + { + . = ALIGN(32); + } > FLASH +*/ + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > FLASH + __exidx_end = .; + + __etext = ALIGN (4); + + .data : AT (__etext) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + + } > RAM + + /* + * Secondary data section, optional + * + * Remember to add each additional data section + * to the .copy.table above to asure proper + * initialization during startup. + */ +/* + __etext2 = ALIGN (4); + + .data2 : AT (__etext2) + { + . = ALIGN(4); + __data2_start__ = .; + *(.data2) + *(.data2.*) + . = ALIGN(4); + __data2_end__ = .; + + } > RAM2 +*/ + +/* + .heap (COPY) : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + . = . + __HEAP_SIZE; + . = ALIGN(8); + __HeapLimit = .; + } > RAM + */ + + + /* ARMv8-M stack sealing: + to use ARMv8-M stack sealing uncomment '.stackseal' section + */ +/* + .stackseal : + { + . = ALIGN(8); + __StackSeal = .; + . = . + 8; + . = ALIGN(8); + } > RAM +*/ + + .stack : + { + . = ALIGN(8); + _sstack = .; + . = . + __STACK_SIZE; + . = ALIGN(8); + _estack = .; + } > RAM + + __bss_start__ = .; + .bss : + { + . = ALIGN(4); + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end__ = .; + + /* + * Secondary bss section, optional + * + * Remember to add each additional bss section + * to the .zero.table above to asure proper + * initialization during startup. + */ +/* + .bss2 : + { + . = ALIGN(4); + __bss2_start__ = .; + *(.bss2) + *(.bss2.*) + . = ALIGN(4); + __bss2_end__ = .; + } > RAM2 AT > RAM2 +*/ +} diff --git a/bsp/mm32f526x/drivers/linker_scripts/link.sct b/bsp/mm32f526x/drivers/linker_scripts/link.sct new file mode 100644 index 00000000000..59105a68037 --- /dev/null +++ b/bsp/mm32f526x/drivers/linker_scripts/link.sct @@ -0,0 +1,114 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +#! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m33 -xc +; command above MUST be in first line (no comment above!) + +/* +;-------- <<< Use Configuration Wizard in Context Menu >>> ------------------- +*/ + +/*--------------------- Flash Configuration ---------------------------------- +; Flash Configuration +; Flash Base Address <0x0-0xFFFFFFFF:8> +; Flash Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __ROM_BASE 0x008000000 +#define __ROM_SIZE 0x000040000 + +/*---------------------------- ITCM Configuration ----------------------------- +; ITCM Configuration +; ITCM Base Address <0x0-0xFFFFFFFF:8> +; ITCM Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __ITCM_BASE 0x00000000 +#define __ITCM_SIZE 0x00008000 + +/*---------------------------- DTCM Configuration ----------------------------- +; DTCM Configuration +; DTCM Base Address <0x0-0xFFFFFFFF:8> +; DTCM Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __DTCM_BASE 0x20000000 +#define __DTCM_SIZE 0x00008000 + +/*--------------------- Embedded RAM1 Configuration --------------------------- +; RAM Configuration +; RAM1 Base Address <0x0-0xFFFFFFFF:8> +; RAM1 Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __RAM1_BASE 0x30000000 +#define __RAM1_SIZE 0x0001C000 + +/*--------------------- Embedded RAM2 Configuration --------------------------- +; RAM Configuration +; RAM2 Base Address <0x0-0xFFFFFFFF:8> +; RAM2 Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __RAM2_BASE 0x3001C000 +#define __RAM2_SIZE 0x00004000 + + +/*--------------------- Stack / Heap Configuration --------------------------- +; Stack / Heap Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + *----------------------------------------------------------------------------*/ +#define __STACK_SIZE 0x00000800 +#define __HEAP_SIZE 0x00000C00 + + +/*---------------------------------------------------------------------------- + User Stack & Heap boundary definition + *----------------------------------------------------------------------------*/ +#define __STACK_TOP (__RAM1_BASE + __RAM1_SIZE) /* starts at end of RAM */ +#define __HEAP_BASE (AlignExpr(+0, 8)) /* starts after RW_RAM section, 8 byte aligned */ + + +/*---------------------------------------------------------------------------- + Scatter File Definitions definition + *----------------------------------------------------------------------------*/ +#define __RO_BASE __ROM_BASE +#define __RO_SIZE __ROM_SIZE + +LR_ROM __RO_BASE __RO_SIZE { ; load region size_region + ER_ROM __RO_BASE __RO_SIZE { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) +; *(Veneer$$CMSE) ; uncomment for secure applications + .ANY (+RO) + .ANY (+XO) + } + + RW_ITCM __ITCM_BASE __ITCM_SIZE { ; RW data + .ANY (+RW +ZI) + } + + RW_DTCM __DTCM_BASE __DTCM_SIZE { ; RW data + .ANY (+RW +ZI) + } + + RW_RAM1 __RAM1_BASE (__RAM1_SIZE - __STACK_SIZE - __HEAP_SIZE) { ; RW data + .ANY (+RW +ZI) + } + + RW_RAM2 __RAM2_BASE __RAM2_SIZE { ; RW data + .ANY (+RW +ZI) + } + +#if __HEAP_SIZE > 0 + ARM_LIB_HEAP __HEAP_BASE EMPTY __HEAP_SIZE { ; Reserve empty region for heap + } +#endif + + ARM_LIB_STACK __STACK_TOP EMPTY -__STACK_SIZE { ; Reserve empty region for stack + } +} + diff --git a/bsp/mm32f526x/figures/Mini-F5265-OB.jpg b/bsp/mm32f526x/figures/Mini-F5265-OB.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09130d8bd918009f3e1f48f1cf2a724904b6e3b5 GIT binary patch literal 568072 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
5`>0w0D%;^Za?-%y=%@D zJpFTXb5tr7KJ=jv@ue@_j#3I^46pt9*WsP#;hm3ADpwHFV{JkhhM2U&iQ@+eq-XW$ z7}coC%;Yf|i>I)zNuWX;9wh^^+!E*z>5J(K?>#{jkmMQj3zq$J6Byxfvf#LJjwK0d z2c>9)@?h;WwaL?Vz_NqY`=VT(r76!mvk#liAw_{l=#|w)m%+`u0FUD2sbf@!8#rMx zGN+Qxp@n0lRz?X+sC9Rz+AauDA{2hu5iT5Ffn&+TO@)0hTB7g36UBGN%n zu_tQ2mRJ&FVvA`eBvI5D3<{`GY#5cQw4t{dUFrLt{hq$dTI>7AKDW#;ph?U( zCcoe3^_sbJ=iYP9-fOMB%JX?X&+{ZwNm8j4?|tuk*|B{)wQBWc)zR#fKLC|#l}j%_ zi|Ny6aO1yxl^rjvrgPd-R4Pj>%3OB&Tj^+T=fJ+*IF7@v-8&hv@Y-RGKdOi#gB2P# z2$<;<*|=*2DFX_AhEQu3E?vs`=f8pK=rF7Ayqkv}dz>9Rc4Cd8y{!$~yr)bilaLUd z|GdnN1QILYNo#SMNhfP%^3c5OD}Vi}J2kDQjV6kt1c_8~f=4ipoJ^q?nj~*2UwNYWpA*e`QmZgV5rkEAltN_+MD+$i z8T_12Dw84#BQohcK~zCUV1+}_&_q#^k9DQOIx!MU6bC4grWQuzkVwy^5n6tZ|5~H(`ybO^k9}eCZ;EM;L&x4vEF*OWXEkTYc(2;0V7VoHW{a#9@`3 zN<=)Kdi+6x_;Ff_ZFsJO>$;RmB?blu>1b1tJbbeCIdzD^!M^3CyD~fl?Ly9-zPYF!EEZ)GDwA#ilAO){9)g) z>QSD2>S=-?z-oz=i5ZDQ4Dk@pK6x)&H}v5b98wt{$MIEyC`Mn?uYIJg7fOW5df9HLE<67f8mht9-0T1v25Q^>&aOON67Q_iH= z(wV@&ej2F~5~}O?q|-U>zwaSduibQnRz1=LX)#97-qy{&zB*RrCl&x{lJt!=mIPi+ z;QiP%*mq!i69v-D$XIsn+{wTJO*)-QQXsYo^NOjBs1g`hDk_x*qa#%YhXz1Ibeamq zmM-d{!j;}cYUFTCs;9S?7himlZ{F}t{@?>2;L5A6q|s>L`#zgDZRUqR{1H(cBju3? z*Tj0!{93Em34(wyj99T^C2Lnc#>_c`6x+I~#-p5h)_J(DAeBmy&1R^S%M5JVLaGi0 z?c?j1P)kzUB8{SSuui?;knbu|byED|7yri2b)mYGvW1NsHt_SG z{hS~OsMqUwUQ(+se=E5B)B`{Qkqdj|1Hq9SY5cG8KS%HxX#PYhl}J#lrs>fUP(&lf zDUPqaK>ugM8UIw<#B9eed#bb0e|Fj7B zB?_P;dfGcsZcJa_b{b(s6bfceUxb%Vqudm;W*<#1*M-)jm~fQ-{kv#XLh`Lex_jqg zJcnF+9>?)0wiZxYGc-6r|GX*~-L|TnaHkc$ylHQjCrT zbk8}1_PO&I9P4LV=TQ_gdD7`beNS1#$tRvb$X9vj$$fP6&PJOt1YYuUVydNm?B97H zAyYaoj`RrQhG>KdRb_3YWr!TI5EB{m&*L>zkZkD;bC-~Jj25yBb3S& zdU|>Y>ea;2&J&c&6$S?TnBLV(-fyKeJWQ$F&w1yaN@r&gY>FT*qnwa*w!o$>J9u{G zI`nwENEZ`pdRwxbecn~P=B#&6%;vFH5*kUp7SY$Yk8)*{MaM1W+08@P=l7vra!@l( zcd;hv3<*|ZjU<~Y($?C`=;+>NpE6;PKF(>8!eV6NR_Dtc8kuOchXdSt=W?d^E@Ig+ z$5X3~a45pm%=e=)+Tbe5?!E)8-?j(OOA~}u4i0R?$e2uK22u*_5e}IaK@fyU*I`fJ zUS8b1iPdYXJaGSVIy%}J9T`nhLx(F^Hb4E4EphWy+uG97BumzrGiNpjcE3PdYYUE_ z;&ta<%2Bh9A_(rqTFcmIh^J=q+Se?jbiZOocAo6}zXYOcHPIx3Y4-}~P8c>3w5lTtbCA-s?OOiVmhVyb!0 zZxB;+=r1#WB=2o;T^Gk4&#g~hxNRP+CYTdq{Jrc%3hg(#gF_DRuiP-dBM|)*B7$HF zIpKd>BzrlnLtM}0oO90N(n~HNYSeM@ait^-%e1y-_|liY$oIbYedfJBNtgCHD5>pDTb%%?y7XRKcJEN{E?YOa3QyU?Nq&nqBsiE1OHUBil}9^^BB`scK? z7x~nmewO1-confp6Pb|ERLSLX)arGv{qk2>yJij9T!s@*d^NLX&1ClM+037RG%Hs; z!_MuydFGkb#POu^lSrDEq_n76T4VW*CkBf^DxbFY=}2PgV_T^N5tXqTS`gR&0Fx=5k1z^I>P!MvFSQ6quE z$L(lefea{=M)?V+qFmPu4A)4jkf;{W(VoVUF-97?rZ3@&t3Jevwf}&QY6umhw8F89 zC`=J+k4#SC`#xbDq2mbOm3UsBkl9wPf(naRZ15D|NECTNi`R=-#!IDnoQz zMI(;T(tvfqszmCz*@niLiFq%MLa4_G&qYa(dRStxe=pOzQ+VlaAPqz?g%d8UL#p z5Eg9>QaZRsqS9INg;pxn8U~m-b0(WNZQ|$!3#e2oluD(^@m?(&x@vqiGV~{ zst#5+&-EeJ##j>}Y~rA4q}PP@4~Nz*)+FCcVX^Tj+C*sOC$iH7BmVy@htvGHUlT`q!{0JFVM1Tt9s+6p?}>5o$An-MM~0o-wsF&q z-{HW%eO!3{`4saxzJ1e;Ty@nYOrJRy>A2K_I=9~ObE2Oc3a#yY@o)cu>%aLE4(#va z4QHK69QovP8Mbfl;~Uq1lfb~`S6#)dS+n@7FZ?x27cF7#QQg?)pi1&^larjQTwdI` zg`L~3$4Za4zw7rXl`H)C$3Nn@WlP9rIzhQak>R%6?x9})6|<(#sTItaK8wq* zyoAo~cJ8?C&g3SVH=3AwJWL}TK{*B!ClkLBqPdW~ z%o8ahAi$W2C<=%g0VaqOgPkx&xFO1kh-`*>oG|E>uwWw`!*BgTv5l$AfSRq4A_TJNxQmDsjaU(w7#)}C>Nt*KdLe-h5iS^A zMeBg}_9f&py;x1cPA4Wd8Z=#1Ok7>NZgKbG?oM%s;%)=Qp;&Qur#OSVOK~V2+}))V zcXxLy4rhNS`7h>%WJ0oGul2rzK?;23ZQsh82G z@rjwRKQdFuj^GU5O-7ce#tb3^Cnt_Kl6sfiJCC1C3=~+wphmO**6GMRsp`rF+<(<} z&+Z&c%v~(v4VGAPR;=eWQ`-4*7D>PS?O<9=a@Q*jgA)8aITDaakp}A+)h&|uxij_) z93*}fwq4C6ddFM5y?mG5sS(aEi_R z_}r9v5fC+!llu*-jjgvooA179gAv=p$(lz8UYrSa4Zt_u`Bb zy2d!@e9JDv0m+sCwFQN7B7dsR-)NkOP3omDxd6{N5DVxzvtDTYENL-<+ zNe&Sw46LDehWFTRHFQ3s?3JI<@1|kXg4omtW0B6Z>Sl0ughuNXbFwj*!-QtX?I0#Q zfN#k?UXFo*Xl=Jv#(2lJ_5neH_UljGSW5?nP3>yhT)zC~TnVF363-P8^>KMtk<--E zhT--5e1GDj=`Ic8Txt6b7xAB;p7^dpupe$F0s=_{JwVL3HR^^go;NCsqJ;=b(0c=t zPBG-M-Q3#pzja?Rp6|Q9{FHEno#*;8tJC2h0$EYs+STenWD<6@b<`84gw#0Y$|J^R zF3I~)gio#f0dRdW?&EbxqRCYwCSprK#!ZOZ4YZ8theAl#KFuihHc#do9*MfDC3!uko zi%>j4%zpai;`BArLX)jjcYUm<^X|8PL$LhMtJ!4nW^*}o;%KPhbvVc8=n3$+cr#SD8QEQnht#dBF_gGe|UGu3*_WOI&%KIo;uy|96bAASFdNt)ERjX zSDMnM64acRgyiL;!D@dpEa{ehQy~Y%dqboh94;vMx#kor!Boi|(GHSy7?)Hc*kj>? zjLagH&cmfqo`#B4k+Lo0Fb-m}i8EC@39QYMJOhi4Df*S6^pVvZ@{*rjO=x~OCBlAG zP!G(}SRQhL0T0v58e`q@R-`k2eV%qQUFz`T4s``L^Yp$YymSS4?eb9|Dg z@+s3mt7QvYuWT7hs-TE8;dpdSLjTM!g>M=m4s=wGapha3c7Yi(P1Otd8Hzy+z`9as zTIlNLc73E0kV%*48T5TLwWibo{f}EZuMeE__6OIHLA=jsQTNI=7Nd=Ks}F0>7@bkB zQ2S%U3C=_ajMNwn0}*iY11MQ*liqosMVK;rnV0xG;FA)VAF(Su7K*+pkOn-E`robv z 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
    *;kEFANwYkO>*>(-6HEX6<3$g3&V|6-#v9n61A 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 z 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

    wLX&)77f`skl3y)wzCD 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 x$gZPXkoNeui;Yk7Sop#q8}I + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 33 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 33 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + + Applications + + $PROJ_DIR$\applications/main.c + + + + at24cxx + + $PROJ_DIR$\packages/at24cxx-latest/at24cxx.c + + + + Compiler + + $PROJ_DIR$\../../components/libc/compilers/common/cctype.c + + + $PROJ_DIR$\../../components/libc/compilers/common/cstdlib.c + + + $PROJ_DIR$\../../components/libc/compilers/common/cstring.c + + + $PROJ_DIR$\../../components/libc/compilers/common/ctime.c + + + $PROJ_DIR$\../../components/libc/compilers/common/cunistd.c + + + $PROJ_DIR$\../../components/libc/compilers/common/cwchar.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/environ.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/syscall_close.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/syscall_lseek.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/syscall_mem.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/syscall_open.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/syscall_read.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/syscall_remove.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/syscall_write.c + + + $PROJ_DIR$\../../components/libc/compilers/dlib/syscalls.c + + + + DeviceDrivers + + $PROJ_DIR$\../../components/drivers/core/device.c + + + $PROJ_DIR$\../../components/drivers/i2c/dev_i2c_bit_ops.c + + + $PROJ_DIR$\../../components/drivers/i2c/dev_i2c_core.c + + + $PROJ_DIR$\../../components/drivers/i2c/dev_i2c_dev.c + + + $PROJ_DIR$\../../components/drivers/i2c/dev_soft_i2c.c + + + $PROJ_DIR$\../../components/drivers/ipc/completion_comm.c + + + $PROJ_DIR$\../../components/drivers/ipc/completion_up.c + + + $PROJ_DIR$\../../components/drivers/ipc/condvar.c + + + $PROJ_DIR$\../../components/drivers/ipc/dataqueue.c + + + $PROJ_DIR$\../../components/drivers/ipc/pipe.c + + + $PROJ_DIR$\../../components/drivers/ipc/ringblk_buf.c + + + $PROJ_DIR$\../../components/drivers/ipc/ringbuffer.c + + + $PROJ_DIR$\../../components/drivers/ipc/waitqueue.c + + + $PROJ_DIR$\../../components/drivers/ipc/workqueue.c + + + $PROJ_DIR$\../../components/drivers/misc/adc.c + + + $PROJ_DIR$\../../components/drivers/pin/dev_pin.c + + + $PROJ_DIR$\../../components/drivers/serial/dev_serial.c + + + + Drivers + + $PROJ_DIR$\board/board.c + + + $PROJ_DIR$\drivers/drv_adc.c + + + $PROJ_DIR$\drivers/drv_gpio.c + + + $PROJ_DIR$\drivers/drv_uart.c + + + + Finsh + + $PROJ_DIR$\../../components/finsh/shell.c + + + $PROJ_DIR$\../../components/finsh/cmd.c + + + $PROJ_DIR$\../../components/finsh/msh.c + + + $PROJ_DIR$\../../components/finsh/msh_parse.c + + + + Kernel + + $PROJ_DIR$\../../src/clock.c + + + $PROJ_DIR$\../../src/components.c + + + $PROJ_DIR$\../../src/cpu_up.c + + + $PROJ_DIR$\../../src/defunct.c + + + $PROJ_DIR$\../../src/idle.c + + + $PROJ_DIR$\../../src/ipc.c + + + $PROJ_DIR$\../../src/irq.c + + + $PROJ_DIR$\../../src/kservice.c + + + $PROJ_DIR$\../../src/mem.c + + + $PROJ_DIR$\../../src/mempool.c + + + $PROJ_DIR$\../../src/object.c + + + $PROJ_DIR$\../../src/scheduler_comm.c + + + $PROJ_DIR$\../../src/scheduler_up.c + + + $PROJ_DIR$\../../src/thread.c + + + $PROJ_DIR$\../../src/timer.c + + + + klibc + + $PROJ_DIR$\../../src/klibc/rt_vsnprintf_tiny.c + + + $PROJ_DIR$\../../src/klibc/kstring.c + + + $PROJ_DIR$\../../src/klibc/kstdio.c + + + $PROJ_DIR$\../../src/klibc/rt_vsscanf.c + + + $PROJ_DIR$\../../src/klibc/kerrno.c + + + + libcpu + + $PROJ_DIR$\../../libcpu/arm/common/div0.c + + + $PROJ_DIR$\../../libcpu/arm/common/showmem.c + + + $PROJ_DIR$\../../libcpu/arm/cortex-m33/context_iar.S + + + $PROJ_DIR$\../../libcpu/arm/cortex-m33/cpuport.c + + + $PROJ_DIR$\../../libcpu/arm/cortex-m33/syscall_iar.S + + + $PROJ_DIR$\../../libcpu/arm/cortex-m33/trustzone.c + + + + Libraries + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_comp.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_misc.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_rtc.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_tim.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_wwdg.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_pwr.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_iwdg.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_rcc.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_uart.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_mds.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_dma.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_adc.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_syscfg.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_dbg.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_i2c.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_flexcan.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_lptim.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_crcpoly.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_bkp.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_enet.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_gpio.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_uid.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_crs.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_exti.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_lpuart.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_spi.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_usbfs.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_fsmc.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_cordic.c + + + $PROJ_DIR$\packages/mm32/System/startup_mm32f5260_iar.s + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_dac.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_flash.c + + + $PROJ_DIR$\packages/mm32/System/system_mm32f526x.c + + + $PROJ_DIR$\packages/mm32/HAL_Lib/Src/hal_qspi.c + + + + POSIX + + + smp + + diff --git a/bsp/mm32f526x/project.eww b/bsp/mm32f526x/project.eww new file mode 100644 index 00000000000..faa93f37cdf --- /dev/null +++ b/bsp/mm32f526x/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/mm32f526x/project.uvoptx b/bsp/mm32f526x/project.uvoptx new file mode 100644 index 00000000000..9bf941784d0 --- /dev/null +++ b/bsp/mm32f526x/project.uvoptx @@ -0,0 +1,177 @@ + + + + 1.0 + +

    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rtthread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 19 + + + + + + + + + + + BIN\MM32LINKCM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0MM32F3270_512 -FL080000 -FS08000000 -FP0($$Device:MM32F3277G9P$Flash\MM32F3270_512.FLM) + + + 0 + MM32LINKCM3 + -U0028089 -O206 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0MM32L3xx_128.FLM -FS08000000 -FL020000 -FP0($$Device:MM32L373PF$Flash\MM32L3xx_128.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + diff --git a/bsp/mm32f526x/project.uvprojx b/bsp/mm32f526x/project.uvprojx new file mode 100644 index 00000000000..b6e57153d91 --- /dev/null +++ b/bsp/mm32f526x/project.uvprojx @@ -0,0 +1,1467 @@ + + + 2.1 +
    ### uVision Project, (C) Keil Software
    + + + rtthread + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + MM32F3277G9P + MindMotion + MindMotion.MM32F3270_DFP.1.0.4 + http://www.mindmotion.com.cn/Download/MDK_KEIL/ + IRAM(0x20000000,0x20000) IROM(0x08000000,0x80000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0MM32F3270_512 -FS08000000 -FL080000 -FP0($$Device:MM32F3277G9P$Flash\MM32F3270_512.FLM)) + 0 + $$Device:MM32F3277G9P$Device\MM32F327x\Include\mm32_device.h + + + + + + + + + + $$Device:MM32F3277G9P$SVD\MM32F3270.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 1 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + RT_USING_ARMLIBC, __STDC_LIMIT_MACROS, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, RT_USING_LIBC + + ../../components/drivers/include;../../components/drivers/include;packages/at24cxx-latest;../../components/drivers/include;../../components/drivers/smp_call;../../components/drivers/include;../../components/drivers/include;../../components/finsh;../../components/libc/posix/io/poll;board;../../components/drivers/include;applications;packages/mm32/HAL_Lib/Inc;../../components/libc/compilers/common/extension;../../components/libc/posix/ipc;../../components/libc/compilers/common/include;../../include;../../components/libc/posix/io/eventfd;../../libcpu/arm/cortex-m33;drivers;packages/mm32/Include;../../libcpu/arm/common;.;../../components/drivers/include;packages/mm32/CMSIS/Core;../../components/libc/posix/io/epoll;../../components/drivers/phy;../../components/libc/compilers/common/extension/fcntl/octal;packages/mm32/Soc/mm32f5260 + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + .\drivers\linker_scripts\link.sct + + + + + + + + + + + Applications + + + main.c + 1 + applications/main.c + + + + + at24cxx + + + at24cxx.c + 1 + packages/at24cxx-latest/at24cxx.c + + + + + Compiler + + + syscall_mem.c + 1 + ../../components/libc/compilers/armlibc/syscall_mem.c + + + + + syscalls.c + 1 + ../../components/libc/compilers/armlibc/syscalls.c + + + + + cctype.c + 1 + ../../components/libc/compilers/common/cctype.c + + + + + cstdlib.c + 1 + ../../components/libc/compilers/common/cstdlib.c + + + + + cstring.c + 1 + ../../components/libc/compilers/common/cstring.c + + + + + ctime.c + 1 + ../../components/libc/compilers/common/ctime.c + + + + + cunistd.c + 1 + ../../components/libc/compilers/common/cunistd.c + + + + + cwchar.c + 1 + ../../components/libc/compilers/common/cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ../../components/drivers/core/device.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_bit_ops.c + 1 + ../../components/drivers/i2c/dev_i2c_bit_ops.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_core.c + 1 + ../../components/drivers/i2c/dev_i2c_core.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_dev.c + 1 + ../../components/drivers/i2c/dev_i2c_dev.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_soft_i2c.c + 1 + ../../components/drivers/i2c/dev_soft_i2c.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + completion_comm.c + 1 + ../../components/drivers/ipc/completion_comm.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + completion_up.c + 1 + ../../components/drivers/ipc/completion_up.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + condvar.c + 1 + ../../components/drivers/ipc/condvar.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dataqueue.c + 1 + ../../components/drivers/ipc/dataqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + pipe.c + 1 + ../../components/drivers/ipc/pipe.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + ringblk_buf.c + 1 + ../../components/drivers/ipc/ringblk_buf.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + ringbuffer.c + 1 + ../../components/drivers/ipc/ringbuffer.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + waitqueue.c + 1 + ../../components/drivers/ipc/waitqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + workqueue.c + 1 + ../../components/drivers/ipc/workqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + adc.c + 1 + ../../components/drivers/misc/adc.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_pin.c + 1 + ../../components/drivers/pin/dev_pin.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_serial.c + 1 + ../../components/drivers/serial/dev_serial.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board/board.c + + + + + drv_adc.c + 1 + drivers/drv_adc.c + + + + + drv_gpio.c + 1 + drivers/drv_gpio.c + + + + + drv_uart.c + 1 + drivers/drv_uart.c + + + + + Finsh + + + cmd.c + 1 + ../../components/finsh/cmd.c + + + + + shell.c + 1 + ../../components/finsh/shell.c + + + + + msh.c + 1 + ../../components/finsh/msh.c + + + + + msh_parse.c + 1 + ../../components/finsh/msh_parse.c + + + + + Kernel + + + clock.c + 1 + ../../src/clock.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + components.c + 1 + ../../src/components.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + cpu_up.c + 1 + ../../src/cpu_up.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + defunct.c + 1 + ../../src/defunct.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + idle.c + 1 + ../../src/idle.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + ipc.c + 1 + ../../src/ipc.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + irq.c + 1 + ../../src/irq.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + kservice.c + 1 + ../../src/kservice.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + mem.c + 1 + ../../src/mem.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + mempool.c + 1 + ../../src/mempool.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + object.c + 1 + ../../src/object.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + scheduler_comm.c + 1 + ../../src/scheduler_comm.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + scheduler_up.c + 1 + ../../src/scheduler_up.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + thread.c + 1 + ../../src/thread.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + timer.c + 1 + ../../src/timer.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + rt_vsnprintf_tiny.c + 1 + ../../src/klibc/rt_vsnprintf_tiny.c + + + + + kstring.c + 1 + ../../src/klibc/kstring.c + + + + + kerrno.c + 1 + ../../src/klibc/kerrno.c + + + + + rt_vsscanf.c + 1 + ../../src/klibc/rt_vsscanf.c + + + + + kstdio.c + 1 + ../../src/klibc/kstdio.c + + + + + libcpu + + + div0.c + 1 + ../../libcpu/arm/common/div0.c + + + + + showmem.c + 1 + ../../libcpu/arm/common/showmem.c + + + + + context_rvds.S + 2 + ../../libcpu/arm/cortex-m33/context_rvds.S + + + + + cpuport.c + 1 + ../../libcpu/arm/cortex-m33/cpuport.c + + + + + syscall_rvds.S + 2 + ../../libcpu/arm/cortex-m33/syscall_rvds.S + + + + + trustzone.c + 1 + ../../libcpu/arm/cortex-m33/trustzone.c + + + + + Libraries + + + hal_comp.c + 1 + packages/mm32/HAL_Lib/Src/hal_comp.c + + + + + hal_misc.c + 1 + packages/mm32/HAL_Lib/Src/hal_misc.c + + + + + hal_rtc.c + 1 + packages/mm32/HAL_Lib/Src/hal_rtc.c + + + + + hal_tim.c + 1 + packages/mm32/HAL_Lib/Src/hal_tim.c + + + + + hal_wwdg.c + 1 + packages/mm32/HAL_Lib/Src/hal_wwdg.c + + + + + hal_pwr.c + 1 + packages/mm32/HAL_Lib/Src/hal_pwr.c + + + + + hal_iwdg.c + 1 + packages/mm32/HAL_Lib/Src/hal_iwdg.c + + + + + hal_rcc.c + 1 + packages/mm32/HAL_Lib/Src/hal_rcc.c + + + + + hal_uart.c + 1 + packages/mm32/HAL_Lib/Src/hal_uart.c + + + + + hal_mds.c + 1 + packages/mm32/HAL_Lib/Src/hal_mds.c + + + + + hal_dma.c + 1 + packages/mm32/HAL_Lib/Src/hal_dma.c + + + + + hal_adc.c + 1 + packages/mm32/HAL_Lib/Src/hal_adc.c + + + + + hal_syscfg.c + 1 + packages/mm32/HAL_Lib/Src/hal_syscfg.c + + + + + hal_dbg.c + 1 + packages/mm32/HAL_Lib/Src/hal_dbg.c + + + + + hal_flexcan.c + 1 + packages/mm32/HAL_Lib/Src/hal_flexcan.c + + + + + hal_lptim.c + 1 + packages/mm32/HAL_Lib/Src/hal_lptim.c + + + + + hal_i2c.c + 1 + packages/mm32/HAL_Lib/Src/hal_i2c.c + + + + + hal_crcpoly.c + 1 + packages/mm32/HAL_Lib/Src/hal_crcpoly.c + + + + + hal_bkp.c + 1 + packages/mm32/HAL_Lib/Src/hal_bkp.c + + + + + hal_enet.c + 1 + packages/mm32/HAL_Lib/Src/hal_enet.c + + + + + hal_gpio.c + 1 + packages/mm32/HAL_Lib/Src/hal_gpio.c + + + + + hal_uid.c + 1 + packages/mm32/HAL_Lib/Src/hal_uid.c + + + + + hal_crs.c + 1 + packages/mm32/HAL_Lib/Src/hal_crs.c + + + + + hal_exti.c + 1 + packages/mm32/HAL_Lib/Src/hal_exti.c + + + + + hal_lpuart.c + 1 + packages/mm32/HAL_Lib/Src/hal_lpuart.c + + + + + startup_mm32f5260_keil.c + 1 + packages/mm32/System/startup_mm32f5260_keil.c + + + + + hal_spi.c + 1 + packages/mm32/HAL_Lib/Src/hal_spi.c + + + + + system_mm32f526x.c + 1 + packages/mm32/System/system_mm32f526x.c + + + + + hal_usbfs.c + 1 + packages/mm32/HAL_Lib/Src/hal_usbfs.c + + + + + hal_fsmc.c + 1 + packages/mm32/HAL_Lib/Src/hal_fsmc.c + + + + + hal_cordic.c + 1 + packages/mm32/HAL_Lib/Src/hal_cordic.c + + + + + hal_dac.c + 1 + packages/mm32/HAL_Lib/Src/hal_dac.c + + + + + hal_flash.c + 1 + packages/mm32/HAL_Lib/Src/hal_flash.c + + + + + hal_qspi.c + 1 + packages/mm32/HAL_Lib/Src/hal_qspi.c + + + + + + + + + + + +
    diff --git a/bsp/mm32f526x/rtconfig.h b/bsp/mm32f526x/rtconfig.h new file mode 100644 index 00000000000..6ee79d7e1ab --- /dev/null +++ b/bsp/mm32f526x/rtconfig.h @@ -0,0 +1,409 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 8 +#define RT_CPUS_NR 1 +#define RT_ALIGN_SIZE 8 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 512 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* kservice options */ + +/* end of kservice options */ +#define RT_USING_DEBUG +#define RT_DEBUGING_ASSERT +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart3" +#define RT_VER_NUM 0x50200 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_I2C +#define RT_USING_I2C_BITOPS +#define RT_USING_SOFT_I2C +#define RT_USING_SOFT_I2C1 +#define RT_SOFT_I2C1_SCL_PIN 38 +#define RT_SOFT_I2C1_SDA_PIN 39 +#define RT_SOFT_I2C1_BUS_NAME "i2c1" +#define RT_SOFT_I2C1_TIMING_DELAY 10 +#define RT_SOFT_I2C1_TIMING_TIMEOUT 10 +#define RT_USING_ADC +#define RT_USING_PIN +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +#define PKG_USING_AT24CXX +#define PKG_USING_AT24CXX_LATEST_VERSION +#define PKG_AT24CXX_FINSH +#define PKG_USING_MM32 +#define PKG_USING_MM32_LATEST_VERSION +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ + +/* Hardware Drivers Config */ + +/* On-chip Peripheral Drivers */ + +/* GPIO Drivers */ + +#define BSP_USING_GPIO +/* end of GPIO Drivers */ + +/* UART Drivers */ + +#define BSP_USING_UART3 +/* end of UART Drivers */ +#define BSP_USING_ADC +#define BSP_USING_ADC1 + +/* Flash Drivers */ + +/* end of Flash Drivers */ +/* end of On-chip Peripheral Drivers */ +/* end of Hardware Drivers Config */ +#define SOC_MM32F526x + +#endif diff --git a/bsp/mm32f526x/rtconfig.py b/bsp/mm32f526x/rtconfig.py new file mode 100644 index 00000000000..8a01efb8d5e --- /dev/null +++ b/bsp/mm32f526x/rtconfig.py @@ -0,0 +1,144 @@ +# BSP Note: For TI EK-TM4C1294XL Tiva C Series Connected LancuhPad (REV D) + +import os +import sys +# toolchains options +CROSS_TOOL = 'gcc' + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +# device options +ARCH = 'arm' +CPU = 'cortex-m33' + + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = 'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = 'C:/Program Files (x86)/IAR Systems/Embedded Workbench 7.2' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' +#BUILD = 'release' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m33 -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + POST_ACTION += OBJCPY + ' -O ihex $TARGET rtthread.hex\n' + POST_ACTION += SIZE + ' $TARGET\n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu ' + CPU + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + CFLAGS += ' -mfpu=fpv5-sp-d16 -mfloat-abi=hard ' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board/linker_scripts/link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/INC' + LFLAGS += ' --libpath ' + EXEC_PATH + '/ARM/ARMCC/LIB' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/arm/armcc/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' # + ' -D' + PART_TYPE + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M33' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu ' + CPU + AFLAGS += ' --fpu VFPv5_sp' + + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + #LFLAGS += ' --silent' + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = '' diff --git a/bsp/mm32f526x/template.ewp b/bsp/mm32f526x/template.ewp new file mode 100644 index 00000000000..0ee0f2df906 --- /dev/null +++ b/bsp/mm32f526x/template.ewp @@ -0,0 +1,2088 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 33 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 33 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + diff --git a/bsp/mm32f526x/template.eww b/bsp/mm32f526x/template.eww new file mode 100644 index 00000000000..bd036bb4c98 --- /dev/null +++ b/bsp/mm32f526x/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/mm32f526x/template.uvopt b/bsp/mm32f526x/template.uvopt new file mode 100644 index 00000000000..0a9bea69e41 --- /dev/null +++ b/bsp/mm32f526x/template.uvopt @@ -0,0 +1,184 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + rtthread + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + + 0 + Datasheet + DATASHTS\ST\STM32F4xx\DM00053488.pdf + + + 1 + Reference Manual + DATASHTS\ST\STM32F4xx\DM00031020.pdf + + + 2 + Technical Reference Manual + datashts\arm\cortex_m4\r0p1\DDI0439C_CORTEX_M4_R0P1_TRM.PDF + + + 3 + Generic User Guide + datashts\arm\cortex_m4\r0p1\DUI0553A_CORTEX_M4_DGUG.PDF + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 6 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U20090928 -O207 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 + + + 0 + UL2CM3 + UL2CM3(-O207 -S0 -C0 -FO7 -FN1 -FC800 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + +
    diff --git a/bsp/mm32f526x/template.uvoptx b/bsp/mm32f526x/template.uvoptx new file mode 100644 index 00000000000..9bf941784d0 --- /dev/null +++ b/bsp/mm32f526x/template.uvoptx @@ -0,0 +1,177 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rtthread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 19 + + + + + + + + + + + BIN\MM32LINKCM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0MM32F3270_512 -FL080000 -FS08000000 -FP0($$Device:MM32F3277G9P$Flash\MM32F3270_512.FLM) + + + 0 + MM32LINKCM3 + -U0028089 -O206 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0MM32L3xx_128.FLM -FS08000000 -FL020000 -FP0($$Device:MM32L373PF$Flash\MM32L3xx_128.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + +
    diff --git a/bsp/mm32f526x/template.uvprojx b/bsp/mm32f526x/template.uvprojx new file mode 100644 index 00000000000..19c76020ec9 --- /dev/null +++ b/bsp/mm32f526x/template.uvprojx @@ -0,0 +1,391 @@ + + + + 2.1 + +
    ### uVision Project, (C) Keil Software
    + + + + rtthread + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + MM32F3277G9P + MindMotion + MindMotion.MM32F3270_DFP.1.0.4 + http://www.mindmotion.com.cn/Download/MDK_KEIL/ + IRAM(0x20000000,0x20000) IROM(0x08000000,0x80000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0MM32F3270_512 -FS08000000 -FL080000 -FP0($$Device:MM32F3277G9P$Flash\MM32F3270_512.FLM)) + 0 + $$Device:MM32F3277G9P$Device\MM32F327x\Include\mm32_device.h + + + + + + + + + + $$Device:MM32F3277G9P$SVD\MM32F3270.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 1 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + USE_STDPERIPH_DRIVER + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + .\drivers\linker_scripts\link.sct + + + + + + + + + + + + + + + + + +
    From a77a86d6b2f59491e43c1954fed38631f3f7231b Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Mon, 3 Feb 2025 20:03:10 +0800 Subject: [PATCH 42/51] bsp: cvitek: fix build error for aarch64 This patch fixed the error "bash: mksdimg.sh: No such file or directory" when building cv18xx_aarch64. The issue is introduced by commit "bsp: cvitek: removed useless files after using rttpkgtool". In addition, in order to unify the logic with riscv as much as possible, the name of the "milkv-duo256m" directory under cv18xx_aarch64 is uniformly changed to "duo256m". This patch also improve the README, adding instructions to install xz-utils. Signed-off-by: Chen Wang --- bsp/cvitek/README.md | 4 ++- bsp/cvitek/cv18xx_aarch64/combine.sh | 4 +-- .../dtb/{milkv-duo256m => duo256m}/multi.its | 0 .../sg2002_milkv_duo256m_arm_sd.dtb | Bin bsp/cvitek/cv18xx_aarch64/mksdimg.sh | 25 ++++++++++++++++++ .../{milkv-duo256m => duo256m}/bl2.bin | Bin .../{milkv-duo256m => duo256m}/bl31.bin | Bin .../{milkv-duo256m => duo256m}/blmacros.env | 0 .../{milkv-duo256m => duo256m}/chip_conf.bin | Bin .../{milkv-duo256m => duo256m}/ddr_param.bin | Bin .../{milkv-duo256m => duo256m}/empty.bin | 0 .../{milkv-duo256m => duo256m}/fip.bin | Bin .../{milkv-duo256m => duo256m}/fiptool.py | 0 .../{milkv-duo256m => duo256m}/u-boot-raw.bin | Bin bsp/cvitek/cv18xx_aarch64/rtconfig.py | 2 +- 15 files changed, 31 insertions(+), 4 deletions(-) mode change 100755 => 100644 bsp/cvitek/README.md rename bsp/cvitek/cv18xx_aarch64/dtb/{milkv-duo256m => duo256m}/multi.its (100%) rename bsp/cvitek/cv18xx_aarch64/dtb/{milkv-duo256m => duo256m}/sg2002_milkv_duo256m_arm_sd.dtb (100%) create mode 100755 bsp/cvitek/cv18xx_aarch64/mksdimg.sh rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/bl2.bin (100%) mode change 100755 => 100644 rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/bl31.bin (100%) rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/blmacros.env (100%) rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/chip_conf.bin (100%) rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/ddr_param.bin (100%) rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/empty.bin (100%) rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/fip.bin (100%) rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/fiptool.py (100%) rename bsp/cvitek/cv18xx_aarch64/prebuild/{milkv-duo256m => duo256m}/u-boot-raw.bin (100%) diff --git a/bsp/cvitek/README.md b/bsp/cvitek/README.md old mode 100755 new mode 100644 index 91b99895deb..913c9218836 --- a/bsp/cvitek/README.md +++ b/bsp/cvitek/README.md @@ -128,9 +128,11 @@ export RTT_EXEC_PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin ## 4.2. 依赖安装 ```shell -$ sudo apt install -y scons libncurses5-dev device-tree-compiler u-boot-tools +$ sudo apt install -y scons libncurses5-dev device-tree-compiler u-boot-tools xz-utils ``` +其中 u-boot-tools 包含了打包需要的 mkimage, xz-utils 包含了打包需要的 lzma。 + ## 4.3. 构建 异构芯片需单独编译每个核的 OS,在大/小核对应的目录下,依次执行: diff --git a/bsp/cvitek/cv18xx_aarch64/combine.sh b/bsp/cvitek/cv18xx_aarch64/combine.sh index af539690044..07767e8bba8 100755 --- a/bsp/cvitek/cv18xx_aarch64/combine.sh +++ b/bsp/cvitek/cv18xx_aarch64/combine.sh @@ -1,7 +1,7 @@ #!/bin/bash C906_LITTLE_BIN_PATH=../c906_little/rtthread.bin -GEN_FIP_PATH=../output/milkv-duo256m/ -DEPENDS_FILE_PATH=./prebuild/milkv-duo256m +GEN_FIP_PATH=../output/duo256m/ +DEPENDS_FILE_PATH=./prebuild/duo256m BLCP_IMG_RUNADDR=0x05200200 BLCP_PARAM_LOADADDR=0 diff --git a/bsp/cvitek/cv18xx_aarch64/dtb/milkv-duo256m/multi.its b/bsp/cvitek/cv18xx_aarch64/dtb/duo256m/multi.its similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/dtb/milkv-duo256m/multi.its rename to bsp/cvitek/cv18xx_aarch64/dtb/duo256m/multi.its diff --git a/bsp/cvitek/cv18xx_aarch64/dtb/milkv-duo256m/sg2002_milkv_duo256m_arm_sd.dtb b/bsp/cvitek/cv18xx_aarch64/dtb/duo256m/sg2002_milkv_duo256m_arm_sd.dtb similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/dtb/milkv-duo256m/sg2002_milkv_duo256m_arm_sd.dtb rename to bsp/cvitek/cv18xx_aarch64/dtb/duo256m/sg2002_milkv_duo256m_arm_sd.dtb diff --git a/bsp/cvitek/cv18xx_aarch64/mksdimg.sh b/bsp/cvitek/cv18xx_aarch64/mksdimg.sh new file mode 100755 index 00000000000..75c7caf1945 --- /dev/null +++ b/bsp/cvitek/cv18xx_aarch64/mksdimg.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -e + +PROJECT_PATH=$1 +IMAGE_NAME=$2 + +if [ -z "$PROJECT_PATH" ] || [ -z "$IMAGE_NAME" ]; then + echo "Usage: $0 " + exit 1 +fi + +ROOT_PATH=$PROJECT_PATH/.. + +source ${ROOT_PATH}/tools.sh + +BOARD_TYPE=`get_board_type $PROJECT_PATH` + +echo "start compress kernel..." + +lzma -c -9 -f -k ${PROJECT_PATH}/${IMAGE_NAME} > ${PROJECT_PATH}/dtb/${BOARD_TYPE}/Image.lzma + +mkdir -p ${ROOT_PATH}/output/${BOARD_TYPE} +mkimage -f ${PROJECT_PATH}/dtb/${BOARD_TYPE}/multi.its -r ${ROOT_PATH}/output/${BOARD_TYPE}/boot.sd + +rm -rf ${PROJECT_PATH}/dtb/${BOARD_TYPE}/Image.lzma diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/bl2.bin b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/bl2.bin old mode 100755 new mode 100644 similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/bl2.bin rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/bl2.bin diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/bl31.bin b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/bl31.bin similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/bl31.bin rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/bl31.bin diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/blmacros.env b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/blmacros.env similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/blmacros.env rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/blmacros.env diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/chip_conf.bin b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/chip_conf.bin similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/chip_conf.bin rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/chip_conf.bin diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/ddr_param.bin b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/ddr_param.bin similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/ddr_param.bin rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/ddr_param.bin diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/empty.bin b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/empty.bin similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/empty.bin rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/empty.bin diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/fip.bin b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/fip.bin similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/fip.bin rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/fip.bin diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/fiptool.py b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/fiptool.py similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/fiptool.py rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/fiptool.py diff --git a/bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/u-boot-raw.bin b/bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/u-boot-raw.bin similarity index 100% rename from bsp/cvitek/cv18xx_aarch64/prebuild/milkv-duo256m/u-boot-raw.bin rename to bsp/cvitek/cv18xx_aarch64/prebuild/duo256m/u-boot-raw.bin diff --git a/bsp/cvitek/cv18xx_aarch64/rtconfig.py b/bsp/cvitek/cv18xx_aarch64/rtconfig.py index 9ebc3491fa9..16f5706bb7e 100644 --- a/bsp/cvitek/cv18xx_aarch64/rtconfig.py +++ b/bsp/cvitek/cv18xx_aarch64/rtconfig.py @@ -46,4 +46,4 @@ DUMP_ACTION = OBJDUMP + ' -D -S $TARGET > rtt.asm\n' POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' POST_ACTION += OBJCPY + ' -O binary $TARGET Image \n' + SIZE + ' $TARGET \n' -POST_ACTION += './combine.sh && cd .. && bash mksdimg.sh ' + os.getcwd() + ' Image \n' +POST_ACTION += './combine.sh && ./mksdimg.sh ' + os.getcwd() + ' Image \n' From 8629c9572a90f9d56cea55d69784ca69c5994274 Mon Sep 17 00:00:00 2001 From: Rbb666 <64397326+Rbb666@users.noreply.github.com> Date: Wed, 5 Feb 2025 00:07:13 +0800 Subject: [PATCH 43/51] [action]add online packages checking in rt-spark. (#9969) --- .../.ci/attachconfig/ci.attachconfig.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml index 225e69772cc..206761fcc2c 100644 --- a/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/stm32/stm32f407-rt-spark/.ci/attachconfig/ci.attachconfig.yml @@ -146,6 +146,14 @@ online-packages.system.os-wrappers: <<: *scons kconfig: - CONFIG_PKG_USING_FREERTOS_WRAPPER=y +online-packages.ai.llmchat: + <<: *scons + kconfig: + - CONFIG_BSP_USING_RW007_WLAN=y + - CONFIG_WEBCLIENT_USING_MBED_TLS=y + - CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=6144 + - CONFIG_PKG_USING_LLMCHAT=y + - CONFIG_PKG_USING_LLMCHAT_LATEST_VERSION=y # ------ peripheral CI ------ peripheral.aht21: kconfig: From a63b97e3161bb6a768d538e0d89ce8c819f07a45 Mon Sep 17 00:00:00 2001 From: Rbb666 <64397326+Rbb666@users.noreply.github.com> Date: Fri, 7 Feb 2025 09:45:56 +0800 Subject: [PATCH 44/51] [bsp][nxp]support FRDM-MCXA156 (#9971) support FRDM-MCXA156 Co-authored-by: shannon --- .github/workflows/bsp_buildings.yml | 1 + .../mcxa/Libraries/MCXA156/MCXA156/MCXA156.h | 38660 ++++++++++++++++ .../MCXA156/MCXA156/MCXA156_features.h | 793 + .../MCXA156/MCXA156/arm/MCXA156_flash.scf | 71 + .../MCXA156/MCXA156/arm/MCXA156_ram.scf | 68 + .../MCXA156/MCXA156/arm/MCXA15X.dbgconf | 18 + .../MCXA156/MCXA156/arm/MCXA15X_1024.FLM | Bin 0 -> 19216 bytes .../MCXA156/MCXA156/arm/startup_MCXA156.S | 1121 + .../MCXA156/MCXA156/drivers/fsl_aoi.c | 230 + .../MCXA156/MCXA156/drivers/fsl_aoi.h | 186 + .../MCXA156/MCXA156/drivers/fsl_cdog.c | 378 + .../MCXA156/MCXA156/drivers/fsl_cdog.h | 329 + .../MCXA156/MCXA156/drivers/fsl_clock.c | 1353 + .../MCXA156/MCXA156/drivers/fsl_clock.h | 983 + .../MCXA156/MCXA156/drivers/fsl_cmc.c | 310 + .../MCXA156/MCXA156/drivers/fsl_cmc.h | 929 + .../MCXA156/MCXA156/drivers/fsl_common.c | 85 + .../MCXA156/MCXA156/drivers/fsl_common.h | 345 + .../MCXA156/MCXA156/drivers/fsl_common_arm.c | 257 + .../MCXA156/MCXA156/drivers/fsl_common_arm.h | 898 + .../MCXA156/MCXA156/drivers/fsl_crc.c | 371 + .../MCXA156/MCXA156/drivers/fsl_crc.h | 181 + .../MCXA156/MCXA156/drivers/fsl_ctimer.c | 604 + .../MCXA156/MCXA156/drivers/fsl_ctimer.h | 682 + .../MCXA156/MCXA156/drivers/fsl_dac.c | 236 + .../MCXA156/MCXA156/drivers/fsl_dac.h | 442 + .../MCXA156/MCXA156/drivers/fsl_edma.c | 2654 ++ .../MCXA156/MCXA156/drivers/fsl_edma.h | 1893 + .../MCXA156/MCXA156/drivers/fsl_edma_core.h | 357 + .../MCXA156/MCXA156/drivers/fsl_edma_soc.c | 112 + .../MCXA156/MCXA156/drivers/fsl_edma_soc.h | 64 + .../MCXA156/MCXA156/drivers/fsl_eim.c | 312 + .../MCXA156/MCXA156/drivers/fsl_eim.h | 144 + .../MCXA156/MCXA156/drivers/fsl_eqdc.c | 301 + .../MCXA156/MCXA156/drivers/fsl_eqdc.h | 1211 + .../MCXA156/MCXA156/drivers/fsl_erm.c | 317 + .../MCXA156/MCXA156/drivers/fsl_erm.h | 235 + .../MCXA156/MCXA156/drivers/fsl_flexcan.c | 4927 ++ .../MCXA156/MCXA156/drivers/fsl_flexcan.h | 2360 + .../MCXA156/drivers/fsl_flexcan_edma.c | 381 + .../MCXA156/drivers/fsl_flexcan_edma.h | 188 + .../MCXA156/MCXA156/drivers/fsl_flexio.c | 511 + .../MCXA156/MCXA156/drivers/fsl_flexio.h | 917 + .../MCXA156/drivers/fsl_flexio_i2c_master.c | 1377 + .../MCXA156/drivers/fsl_flexio_i2c_master.h | 485 + .../MCXA156/drivers/fsl_flexio_mculcd.c | 1334 + .../MCXA156/drivers/fsl_flexio_mculcd.h | 686 + .../MCXA156/drivers/fsl_flexio_mculcd_edma.c | 568 + .../MCXA156/drivers/fsl_flexio_mculcd_edma.h | 153 + .../MCXA156/MCXA156/drivers/fsl_flexio_spi.c | 1565 + .../MCXA156/MCXA156/drivers/fsl_flexio_spi.h | 718 + .../MCXA156/drivers/fsl_flexio_spi_edma.c | 565 + .../MCXA156/drivers/fsl_flexio_spi_edma.h | 207 + .../MCXA156/MCXA156/drivers/fsl_flexio_uart.c | 1023 + .../MCXA156/MCXA156/drivers/fsl_flexio_uart.h | 588 + .../MCXA156/drivers/fsl_flexio_uart_edma.c | 407 + .../MCXA156/drivers/fsl_flexio_uart_edma.h | 178 + .../MCXA156/MCXA156/drivers/fsl_freqme.c | 155 + .../MCXA156/MCXA156/drivers/fsl_freqme.h | 441 + .../MCXA156/MCXA156/drivers/fsl_glikey.c | 403 + .../MCXA156/MCXA156/drivers/fsl_glikey.h | 311 + .../MCXA156/MCXA156/drivers/fsl_gpio.c | 444 + .../MCXA156/MCXA156/drivers/fsl_gpio.h | 799 + .../MCXA156/MCXA156/drivers/fsl_i3c.c | 3572 ++ .../MCXA156/MCXA156/drivers/fsl_i3c.h | 1899 + .../MCXA156/MCXA156/drivers/fsl_i3c_edma.c | 1057 + .../MCXA156/MCXA156/drivers/fsl_i3c_edma.h | 279 + .../MCXA156/MCXA156/drivers/fsl_inputmux.c | 194 + .../MCXA156/MCXA156/drivers/fsl_inputmux.h | 103 + .../drivers/fsl_inputmux_connections.h | 3635 ++ .../MCXA156/MCXA156/drivers/fsl_lpadc.c | 977 + .../MCXA156/MCXA156/drivers/fsl_lpadc.h | 1529 + .../MCXA156/MCXA156/drivers/fsl_lpcmp.c | 372 + .../MCXA156/MCXA156/drivers/fsl_lpcmp.h | 585 + .../MCXA156/MCXA156/drivers/fsl_lpi2c.c | 2715 ++ .../MCXA156/MCXA156/drivers/fsl_lpi2c.h | 1389 + .../MCXA156/MCXA156/drivers/fsl_lpi2c_edma.c | 659 + .../MCXA156/MCXA156/drivers/fsl_lpi2c_edma.h | 163 + .../MCXA156/MCXA156/drivers/fsl_lpspi.c | 2604 ++ .../MCXA156/MCXA156/drivers/fsl_lpspi.h | 1231 + .../MCXA156/MCXA156/drivers/fsl_lpspi_edma.c | 1324 + .../MCXA156/MCXA156/drivers/fsl_lpspi_edma.h | 353 + .../MCXA156/MCXA156/drivers/fsl_lptmr.c | 183 + .../MCXA156/MCXA156/drivers/fsl_lptmr.h | 384 + .../MCXA156/MCXA156/drivers/fsl_lpuart.c | 2742 ++ .../MCXA156/MCXA156/drivers/fsl_lpuart.h | 1128 + .../MCXA156/MCXA156/drivers/fsl_lpuart_edma.c | 522 + .../MCXA156/MCXA156/drivers/fsl_lpuart_edma.h | 189 + .../MCXA156/MCXA156/drivers/fsl_opamp.c | 193 + .../MCXA156/MCXA156/drivers/fsl_opamp.h | 301 + .../MCXA156/MCXA156/drivers/fsl_ostimer.c | 384 + .../MCXA156/MCXA156/drivers/fsl_ostimer.h | 273 + .../MCXA156/MCXA156/drivers/fsl_port.h | 684 + .../MCXA156/MCXA156/drivers/fsl_pwm.c | 1491 + .../MCXA156/MCXA156/drivers/fsl_pwm.h | 1372 + .../MCXA156/MCXA156/drivers/fsl_reset.c | 141 + .../MCXA156/MCXA156/drivers/fsl_reset.h | 251 + .../MCXA156/MCXA156/drivers/fsl_romapi.h | 507 + .../MCXA156/MCXA156/drivers/fsl_spc.c | 1680 + .../MCXA156/MCXA156/drivers/fsl_spc.h | 2433 + .../MCXA156/MCXA156/drivers/fsl_trdc.c | 854 + .../MCXA156/MCXA156/drivers/fsl_trdc.h | 1131 + .../MCXA156/MCXA156/drivers/fsl_trdc_core.h | 489 + .../MCXA156/MCXA156/drivers/fsl_trdc_soc.h | 60 + .../MCXA156/MCXA156/drivers/fsl_utick.c | 230 + .../MCXA156/MCXA156/drivers/fsl_utick.h | 118 + .../MCXA156/MCXA156/drivers/fsl_vbat.c | 498 + .../MCXA156/MCXA156/drivers/fsl_vbat.h | 1386 + .../MCXA156/MCXA156/drivers/fsl_waketimer.c | 253 + .../MCXA156/MCXA156/drivers/fsl_waketimer.h | 212 + .../MCXA156/MCXA156/drivers/fsl_wuu.c | 312 + .../MCXA156/MCXA156/drivers/fsl_wuu.h | 294 + .../MCXA156/MCXA156/drivers/fsl_wwdt.c | 275 + .../MCXA156/MCXA156/drivers/fsl_wwdt.h | 276 + .../MCXA156/MCXA156/fsl_device_registers.h | 33 + .../MCXA156/MCXA156/gcc/MCXA156_flash.ld | 200 + .../MCXA156/MCXA156/gcc/MCXA156_ram.ld | 199 + .../MCXA156/MCXA156/gcc/startup_MCXA156.S | 1211 + .../MCXA156/MCXA156/iar/MCXA156_flash.icf | 84 + .../MCXA156/MCXA156/iar/MCXA156_ram.icf | 80 + .../MCXA156/MCXA156/iar/startup_MCXA156.s | 953 + .../MCXA156/MCXA156/system_MCXA156.c | 139 + .../MCXA156/MCXA156/system_MCXA156.h | 107 + bsp/nxp/mcx/mcxa/Libraries/MCXA156/SConscript | 54 + bsp/nxp/mcx/mcxa/frdm-mcxa156/.config | 1340 + bsp/nxp/mcx/mcxa/frdm-mcxa156/Kconfig | 18 + bsp/nxp/mcx/mcxa/frdm-mcxa156/SConscript | 14 + bsp/nxp/mcx/mcxa/frdm-mcxa156/SConstruct | 67 + .../mcxa/frdm-mcxa156/applications/SConscript | 15 + .../mcx/mcxa/frdm-mcxa156/applications/main.c | 39 + bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig | 173 + .../board/MCUX_Config/board/clock_config.c | 482 + .../board/MCUX_Config/board/clock_config.h | 170 + .../board/MCUX_Config/board/pin_mux.c | 121 + .../board/MCUX_Config/board/pin_mux.h | 51 + .../mcx/mcxa/frdm-mcxa156/board/SConscript | 17 + bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.c | 105 + bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.h | 54 + .../board/linker_scripts/MCXA156_flash.ld | 200 + .../board/linker_scripts/MCXA156_flash.scf | 71 + bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx | 1355 + bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx | 2387 + bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.h | 420 + bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.py | 198 + bsp/nxp/mcx/mcxa/frdm-mcxa156/template.uvoptx | 179 + .../mcx/mcxa/frdm-mcxa156/template.uvprojx | 401 + 146 files changed, 135645 insertions(+) create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/MCXA156.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/MCXA156_features.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA156_flash.scf create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA156_ram.scf create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA15X.dbgconf create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA15X_1024.FLM create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/startup_MCXA156.S create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_aoi.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_aoi.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cdog.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cdog.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_clock.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_clock.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cmc.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cmc.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common_arm.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common_arm.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_crc.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_crc.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ctimer.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ctimer.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_dac.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_dac.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_core.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_soc.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_soc.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eim.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eim.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eqdc.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eqdc.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_erm.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_erm.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_i2c_master.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_i2c_master.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_freqme.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_freqme.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_glikey.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_glikey.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_gpio.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_gpio.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux_connections.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpadc.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpadc.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpcmp.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpcmp.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lptmr.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lptmr.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart_edma.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart_edma.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_opamp.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_opamp.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ostimer.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ostimer.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_port.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_pwm.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_pwm.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_reset.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_reset.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_romapi.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_spc.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_spc.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc_core.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc_soc.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_utick.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_utick.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_vbat.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_vbat.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_waketimer.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_waketimer.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wuu.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wuu.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wwdt.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wwdt.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/fsl_device_registers.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/MCXA156_flash.ld create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/MCXA156_ram.ld create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/startup_MCXA156.S create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/MCXA156_flash.icf create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/MCXA156_ram.icf create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/startup_MCXA156.s create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/system_MCXA156.c create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/system_MCXA156.h create mode 100644 bsp/nxp/mcx/mcxa/Libraries/MCXA156/SConscript create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/.config create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/Kconfig create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/SConscript create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/SConstruct create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/applications/SConscript create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/applications/main.c create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/clock_config.c create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/clock_config.h create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/pin_mux.c create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/pin_mux.h create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/SConscript create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.c create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.h create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/linker_scripts/MCXA156_flash.ld create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/board/linker_scripts/MCXA156_flash.scf create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.h create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.py create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/template.uvoptx create mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa156/template.uvprojx diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index a36bbe26110..dd14e2505b7 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -234,6 +234,7 @@ jobs: - "nxp/mcx/mcxn/frdm-mcxn947" - "nxp/mcx/mcxn/frdm-mcxn236" - "nxp/mcx/mcxa/frdm-mcxa153" + - "nxp/mcx/mcxa/frdm-mcxa156" - "renesas/ebf_qi_min_6m5" - "renesas/ra6m4-cpk" - "renesas/ra6m4-iot" diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/MCXA156.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/MCXA156.h new file mode 100644 index 00000000000..000600c5453 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/MCXA156.h @@ -0,0 +1,38660 @@ +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compilers: GNU C Compiler +** IAR ANSI C/C++ Compiler for ARM +** Keil ARM C/C++ Compiler +** MCUXpresso Compiler +** +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240403 +** +** Abstract: +** CMSIS Peripheral Access Layer for MCXA156 +** +** Copyright 1997-2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2022-03-29) +** Initial version based on v0.1UM +** +** ################################################################### +*/ + +/*! + * @file MCXA156.h + * @version 1.0 + * @date 2022-03-29 + * @brief CMSIS Peripheral Access Layer for MCXA156 + * + * CMSIS Peripheral Access Layer for MCXA156 + */ + +#if !defined(MCXA156_H_) +#define MCXA156_H_ /**< Symbol preventing repeated inclusion */ + +/** Memory map major version (memory maps with equal major version number are + * compatible) */ +#define MCU_MEM_MAP_VERSION 0x0100U +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0000U + + +/* ---------------------------------------------------------------------------- + -- Interrupt vector numbers + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers Interrupt vector numbers + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 105 /**< Number of interrupts in the Vector table */ + +typedef enum IRQn { + /* Auxiliary constants */ + NotAvail_IRQn = -128, /**< Not available device specific interrupt */ + + /* Core interrupts */ + NonMaskableInt_IRQn = -14, /**< Non Maskable Interrupt */ + HardFault_IRQn = -13, /**< Cortex-M33 SV Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /**< Cortex-M33 Memory Management Interrupt */ + BusFault_IRQn = -11, /**< Cortex-M33 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /**< Cortex-M33 Usage Fault Interrupt */ + SecureFault_IRQn = -9, /**< Cortex-M33 Secure Fault Interrupt */ + SVCall_IRQn = -5, /**< Cortex-M33 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /**< Cortex-M33 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /**< Cortex-M33 Pend SV Interrupt */ + SysTick_IRQn = -1, /**< Cortex-M33 System Tick Interrupt */ + + /* Device specific interrupts */ + Reserved16_IRQn = 0, /**< OR IRQ1 to IRQ53 */ + CMC_IRQn = 1, /**< Core Mode Controller interrupt */ + DMA_CH0_IRQn = 2, /**< DMA3_0_CH0 error or transfer complete */ + DMA_CH1_IRQn = 3, /**< DMA3_0_CH1 error or transfer complete */ + DMA_CH2_IRQn = 4, /**< DMA3_0_CH2 error or transfer complete */ + DMA_CH3_IRQn = 5, /**< DMA3_0_CH3 error or transfer complete */ + DMA_CH4_IRQn = 6, /**< DMA3_0_CH4 error or transfer complete */ + DMA_CH5_IRQn = 7, /**< DMA3_0_CH5 error or transfer complete */ + DMA_CH6_IRQn = 8, /**< DMA3_0_CH6 error or transfer complete */ + DMA_CH7_IRQn = 9, /**< DMA3_0_CH7 error or transfer complete */ + ERM0_SINGLE_BIT_IRQn = 10, /**< ERM Single Bit error interrupt */ + ERM0_MULTI_BIT_IRQn = 11, /**< ERM Multi Bit error interrupt */ + FMU0_IRQn = 12, /**< Flash Management Unit interrupt */ + GLIKEY0_IRQn = 13, /**< GLIKEY Interrupt */ + MBC0_IRQn = 14, /**< MBC secure violation interrupt */ + SCG0_IRQn = 15, /**< System Clock Generator interrupt */ + SPC0_IRQn = 16, /**< System Power Controller interrupt */ + VBAT0_IRQn = 17, /**< VBAT interrupt */ + WUU0_IRQn = 18, /**< Wake Up Unit interrupt */ + CAN0_IRQn = 19, /**< Controller Area Network 0 interrupt */ + Reserved36_IRQn = 20, /**< Reserved interrupt */ + Reserved37_IRQn = 21, /**< Reserved interrupt */ + Reserved38_IRQn = 22, /**< Reserved interrupt */ + FLEXIO_IRQn = 23, /**< Flexible Input/Output interrupt */ + I3C0_IRQn = 24, /**< Improved Inter Integrated Circuit interrupt 0 */ + Reserved41_IRQn = 25, /**< Reserved interrupt */ + LPI2C0_IRQn = 26, /**< Low-Power Inter Integrated Circuit interrupt */ + LPI2C1_IRQn = 27, /**< Low-Power Inter Integrated Circuit interrupt */ + LPSPI0_IRQn = 28, /**< Low-Power Serial Peripheral Interface interrupt */ + LPSPI1_IRQn = 29, /**< Low-Power Serial Peripheral Interface interrupt */ + Reserved46_IRQn = 30, /**< Reserved interrupt */ + LPUART0_IRQn = 31, /**< Low-Power Universal Asynchronous Receive/Transmit interrupt */ + LPUART1_IRQn = 32, /**< Low-Power Universal Asynchronous Receive/Transmit interrupt */ + LPUART2_IRQn = 33, /**< Low-Power Universal Asynchronous Receive/Transmit interrupt */ + LPUART3_IRQn = 34, /**< Low-Power Universal Asynchronous Receive/Transmit interrupt */ + LPUART4_IRQn = 35, /**< Low-Power Universal Asynchronous Receive/Transmit interrupt */ + USB0_IRQn = 36, /**< Universal Serial Bus - Full Speed interrupt */ + Reserved53_IRQn = 37, /**< Reserved interrupt */ + CDOG0_IRQn = 38, /**< Code Watchdog Timer 0 interrupt */ + CTIMER0_IRQn = 39, /**< Standard counter/timer 0 interrupt */ + CTIMER1_IRQn = 40, /**< Standard counter/timer 1 interrupt */ + CTIMER2_IRQn = 41, /**< Standard counter/timer 2 interrupt */ + CTIMER3_IRQn = 42, /**< Standard counter/timer 3 interrupt */ + CTIMER4_IRQn = 43, /**< Standard counter/timer 4 interrupt */ + FLEXPWM0_RELOAD_ERROR_IRQn = 44, /**< FlexPWM0_reload_error interrupt */ + FLEXPWM0_FAULT_IRQn = 45, /**< FlexPWM0_fault interrupt */ + FLEXPWM0_SUBMODULE0_IRQn = 46, /**< FlexPWM0 Submodule 0 capture/compare/reload interrupt */ + FLEXPWM0_SUBMODULE1_IRQn = 47, /**< FlexPWM0 Submodule 1 capture/compare/reload interrupt */ + FLEXPWM0_SUBMODULE2_IRQn = 48, /**< FlexPWM0 Submodule 2 capture/compare/reload interrupt */ + Reserved65_IRQn = 49, /**< Reserved interrupt */ + QDC0_COMPARE_IRQn = 50, /**< Compare */ + QDC0_HOME_IRQn = 51, /**< Home */ + QDC0_WATCHDOG_IRQn = 52, /**< Watchdog / Simultaneous A and B Change */ + QDC0_INDEX_IRQn = 53, /**< Index / Roll Over / Roll Under */ + FREQME0_IRQn = 54, /**< Frequency Measurement interrupt */ + LPTMR0_IRQn = 55, /**< Low Power Timer 0 interrupt */ + Reserved72_IRQn = 56, /**< Reserved interrupt */ + OS_EVENT_IRQn = 57, /**< OS event timer interrupt */ + WAKETIMER0_IRQn = 58, /**< Wake Timer Interrupt */ + UTICK0_IRQn = 59, /**< Micro-Tick Timer interrupt */ + WWDT0_IRQn = 60, /**< Windowed Watchdog Timer 0 interrupt */ + Reserved77_IRQn = 61, /**< Reserved interrupt */ + ADC0_IRQn = 62, /**< Analog-to-Digital Converter interrupt */ + ADC1_IRQn = 63, /**< Analog-to-Digital Converter interrupt */ + CMP0_IRQn = 64, /**< Comparator interrupt */ + CMP1_IRQn = 65, /**< Comparator interrupt */ + Reserved82_IRQn = 66, /**< Reserved interrupt */ + DAC0_IRQn = 67, /**< Digital-to-Analog Converter 0 - General Purpose interrupt */ + Reserved84_IRQn = 68, /**< Reserved interrupt */ + Reserved85_IRQn = 69, /**< Reserved interrupt */ + Reserved86_IRQn = 70, /**< Reserved interrupt */ + GPIO0_IRQn = 71, /**< General Purpose Input/Output interrupt 0 */ + GPIO1_IRQn = 72, /**< General Purpose Input/Output interrupt 1 */ + GPIO2_IRQn = 73, /**< General Purpose Input/Output interrupt 2 */ + GPIO3_IRQn = 74, /**< General Purpose Input/Output interrupt 3 */ + GPIO4_IRQn = 75, /**< General Purpose Input/Output interrupt 4 */ + Reserved92_IRQn = 76, /**< Reserved interrupt */ + LPI2C2_IRQn = 77, /**< Low-Power Inter Integrated Circuit interrupt */ + LPI2C3_IRQn = 78, /**< Low-Power Inter Integrated Circuit interrupt */ + FLEXPWM1_RELOAD_ERROR_IRQn = 79, /**< FlexPWM1_reload_error interrupt */ + FLEXPWM1_FAULT_IRQn = 80, /**< FlexPWM1_fault interrupt */ + FLEXPWM1_SUBMODULE0_IRQn = 81, /**< FlexPWM1 Submodule 0 capture/compare/reload interrupt */ + FLEXPWM1_SUBMODULE1_IRQn = 82, /**< FlexPWM1 Submodule 1 capture/compare/reload interrupt */ + FLEXPWM1_SUBMODULE2_IRQn = 83, /**< FlexPWM1 Submodule 2 capture/compare/reload interrupt */ + Reserved100_IRQn = 84, /**< Reserved interrupt */ + QDC1_COMPARE_IRQn = 85, /**< Compare */ + QDC1_HOME_IRQn = 86, /**< Home */ + QDC1_WATCHDOG_IRQn = 87, /**< Watchdog / Simultaneous A and B Change */ + QDC1_INDEX_IRQn = 88 /**< Index / Roll Over / Roll Under */ +} IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers */ + + +/* ---------------------------------------------------------------------------- + -- Cortex M33 Core Configuration + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Cortex_Core_Configuration Cortex M33 Core Configuration + * @{ + */ + +#define __MPU_PRESENT 0 /**< Defines if an MPU is present or not */ +#define __NVIC_PRIO_BITS 3 /**< Number of priority bits implemented in the NVIC */ +#define __Vendor_SysTickConfig 0 /**< Vendor specific implementation of SysTickConfig is defined */ +#define __FPU_PRESENT 1 /**< Defines if an FPU is present or not */ +#define __DSP_PRESENT 1 /**< Defines if Armv8-M Mainline core supports DSP instructions */ +#define __SAUREGION_PRESENT 0 /**< Defines if an SAU is present or not */ + +#include "core_cm33.h" /* Core Peripheral Access Layer */ +#include "system_MCXA156.h" /* Device specific configuration file */ + +/*! + * @} + */ /* end of group Cortex_Core_Configuration */ + + +/* ---------------------------------------------------------------------------- + -- Mapping Information + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Mapping_Information Mapping Information + * @{ + */ + +/** Mapping Information */ +/*! + * @addtogroup dma_request + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @brief Structure for the DMA hardware request + * + * Defines the structure for the DMA hardware request collections. The user can configure the + * hardware request to trigger the DMA transfer accordingly. The index + * of the hardware request varies according to the to SoC. + */ +typedef enum _dma_request_source +{ + kDma0RequestDisabled = 0U, /**< Disabled */ + kDma0RequestWUU0 = 1U, /**< WUU Wake up event */ + kDma0RequestMuxFlexCan0DmaRequest = 2U, /**< CAN0 DMA request */ + kDma0RequestLPI2C2Rx = 3U, /**< LPI2C2 Receive request */ + kDma0RequestLPI2C2Tx = 4U, /**< LPI2C2 Transmit request */ + kDma0RequestLPI2C3Rx = 5U, /**< LPI2C3 Receive request */ + kDma0RequestLPI2C3Tx = 6U, /**< LPI2C3 Transmit request */ + kDma0RequestMuxI3c0Rx = 7U, /**< I3C0 Receive request */ + kDma0RequestMuxI3c0Tx = 8U, /**< I3C0 Transmit request */ + kDma0RequestLPI2C0Rx = 11U, /**< LPI2C0 Receive request */ + kDma0RequestLPI2C0Tx = 12U, /**< LPI2C0 Transmit request */ + kDma0RequestLPI2C1Rx = 13U, /**< LPI2C1 Receive request */ + kDma0RequestLPI2C1Tx = 14U, /**< LPI2C1 Transmit request */ + kDma0RequestLPSPI0Rx = 15U, /**< LPSPI0 Receive request */ + kDma0RequestLPSPI0Tx = 16U, /**< LPSPI0 Transmit request */ + kDma0RequestLPSPI1Rx = 17U, /**< LPSPI1 Receive request */ + kDma0RequestLPSPI1Tx = 18U, /**< LPSPI1 Transmit request */ + kDma0RequestLPUART0Rx = 21U, /**< LPUART0 Receive request */ + kDma0RequestLPUART0Tx = 22U, /**< LPUART0 Transmit request */ + kDma0RequestLPUART1Rx = 23U, /**< LPUART1 Receive request */ + kDma0RequestLPUART1Tx = 24U, /**< LPUART1 Transmit request */ + kDma0RequestLPUART2Rx = 25U, /**< LPUART2 Receive request */ + kDma0RequestLPUART2Tx = 26U, /**< LPUART2 Transmit request */ + kDma0RequestLPUART3Rx = 27U, /**< LPUART3 Receive request */ + kDma0RequestLPUART3Tx = 28U, /**< LPUART3 Transmit request */ + kDma0RequestLPUART4Rx = 29U, /**< LPUART4 Receive request */ + kDma0RequestLPUART4Tx = 30U, /**< LPUART4 Transmit request */ + kDma0RequestMuxCtimer0M0 = 31U, /**< CTIMER0 Match channel 0 request */ + kDma0RequestMuxCtimer0M1 = 32U, /**< CTIMER0 Match channel 1 request */ + kDma0RequestMuxCtimer1M0 = 33U, /**< CTIMER1 Match channel 0 request */ + kDma0RequestMuxCtimer1M1 = 34U, /**< CTIMER1 Match channel 1 request */ + kDma0RequestMuxCtimer2M0 = 35U, /**< CTIMER2 Match channel 0 request */ + kDma0RequestMuxCtimer2M1 = 36U, /**< CTIMER2 Match channel 1 request */ + kDma0RequestMuxCtimer3M0 = 37U, /**< CTIMER3 Match channel 0 request */ + kDma0RequestMuxCtimer3M1 = 38U, /**< CTIMER3 Match channel 1 request */ + kDma0RequestMuxCtimer4M0 = 39U, /**< CTIMER4 Match channel 0 request */ + kDma0RequestMuxCtimer4M1 = 40U, /**< CTIMER4 Match channel 1 request */ + kDma0RequestMuxFlexPWM0ReqCapt0 = 41U, /**< FlexPWM0 capture0 request */ + kDma0RequestMuxFlexPWM0ReqCapt1 = 42U, /**< FlexPWM0 capture1 request */ + kDma0RequestMuxFlexPWM0ReqCapt2 = 43U, /**< FlexPWM0 capture2 request */ + kDma0RequestMuxFlexPWM0ReqVal0 = 45U, /**< FlexPWM0 value0 request */ + kDma0RequestMuxFlexPWM0ReqVal1 = 46U, /**< FlexPWM0 value1 request */ + kDma0RequestMuxFlexPWM0ReqVal2 = 47U, /**< FlexPWM0 value2 request */ + kDma0RequestMuxLptmr0 = 49U, /**< LPTMR0 Counter match event */ + kDma0RequestMuxAdc0FifoRequest = 51U, /**< ADC0 FIFO request */ + kDma0RequestMuxAdc1FifoRequest = 52U, /**< ADC1 FIFO request */ + kDma0RequestMuxHsCmp0DmaRequest = 53U, /**< CMP0 DMA_request */ + kDma0RequestMuxHsCmp1DmaRequest = 54U, /**< CMP1 DMA_request */ + kDma0RequestMuxDac0FifoRequest = 56U, /**< DAC0 FIFO request */ + kDma0RequestMuxGpio0PinEventRequest0 = 60U, /**< GPIO0 Pin event request 0 */ + kDma0RequestMuxGpio1PinEventRequest0 = 61U, /**< GPIO1 Pin event request 0 */ + kDma0RequestMuxGpio2PinEventRequest0 = 62U, /**< GPIO2 Pin event request 0 */ + kDma0RequestMuxGpio3PinEventRequest0 = 63U, /**< GPIO3 Pin event request 0 */ + kDma0RequestMuxGpio4PinEventRequest0 = 64U, /**< GPIO4 Pin event request 0 */ + kDma0RequestMuxQdc0 = 65U, /**< DMA request for new buffered value */ + kDma0RequestMuxQdc1 = 66U, /**< DMA request for new buffered value */ + kDma0RequestMuxFlexIO0ShiftRegister0Request = 71U, /**< FlexIO0 Shifter0 Status DMA request OR Timer0 Status DMA request */ + kDma0RequestMuxFlexIO0ShiftRegister1Request = 72U, /**< FlexIO0 Shifter1 Status DMA request OR Timer1 Status DMA request */ + kDma0RequestMuxFlexIO0ShiftRegister2Request = 73U, /**< FlexIO0 Shifter2 Status DMA request OR Timer2 Status DMA request */ + kDma0RequestMuxFlexIO0ShiftRegister3Request = 74U, /**< FlexIO0 Shifter3 Status DMA request OR Timer3 Status DMA request */ + kDma0RequestMuxFlexPWM1ReqCapt0 = 79U, /**< FlexPWM1 capture0 request */ + kDma0RequestMuxFlexPWM1ReqCapt1 = 80U, /**< FlexPWM1 capture1 request */ + kDma0RequestMuxFlexPWM1ReqCapt2 = 81U, /**< FlexPWM1 capture2 request */ + kDma0RequestMuxFlexPWM1ReqVal0 = 83U, /**< FlexPWM1 value0 request */ + kDma0RequestMuxFlexPWM1ReqVal1 = 84U, /**< FlexPWM1 value1 request */ + kDma0RequestMuxFlexPWM1ReqVal2 = 85U, /**< FlexPWM1 value2 request */ +} dma_request_source_t; + +/* @} */ + +/*! + * @addtogroup eim_memory_channel + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @brief Structure for the eim_memory_channel + * + * Defines the structure for the EIM resource collections. + */ + +typedef enum _eim_memory_channel +{ + kEIM_MemoryChannelRAMA0 = 0U, /**< Memory RAMA0 */ +} eim_memory_channel_t; + +/* @} */ + +/*! + * @addtogroup eim_error_injection_channel_enable + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @brief Structure for the eim_error_injection_channel_enable + * + * Defines the structure for the EIM error injection resource collections. + */ + +typedef enum _eim_error_injection_channel_enable +{ + kEIM_MemoryChannelRAMAEnable = 0x80000000U, /**< Memory channel 0(RAMA0) error injection enable */ +} eim_error_injection_channel_enable_t; + +/* @} */ + +/*! + * @addtogroup erm_memory_channel + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @brief Structure for the erm_memory_channel + * + * Defines the structure for the ERM resource collections. + */ + +typedef enum _erm_memory_channel +{ + kERM_MemoryChannelRAMA0 = 0U, /**< Memory RAMA0 */ + kERM_MemoryChannelFLASH = 1U, /**< Memory FLASH */ +} erm_memory_channel_t; + +/* @} */ + + +/*! + * @} + */ /* end of group Mapping_Information */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer Device Peripheral Access Layer + * @{ + */ + + +/* +** Start of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #if (__ARMCC_VERSION >= 6010050) + #pragma clang diagnostic push + #else + #pragma push + #pragma anon_unions + #endif +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#elif defined(__IAR_SYSTEMS_ICC__) + #pragma language=extended +#else + #error Not supported compiler type +#endif + +/* ---------------------------------------------------------------------------- + -- ADC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Peripheral_Access_Layer ADC Peripheral Access Layer + * @{ + */ + +/** ADC - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ + uint8_t RESERVED_0[8]; + __IO uint32_t CTRL; /**< Control Register, offset: 0x10 */ + __IO uint32_t STAT; /**< Status Register, offset: 0x14 */ + __IO uint32_t IE; /**< Interrupt Enable Register, offset: 0x18 */ + __IO uint32_t DE; /**< DMA Enable Register, offset: 0x1C */ + __IO uint32_t CFG; /**< Configuration Register, offset: 0x20 */ + __IO uint32_t PAUSE; /**< Pause Register, offset: 0x24 */ + uint8_t RESERVED_1[12]; + __O uint32_t SWTRIG; /**< Software Trigger Register, offset: 0x34 */ + __IO uint32_t TSTAT; /**< Trigger Status Register, offset: 0x38 */ + uint8_t RESERVED_2[4]; + __IO uint32_t OFSTRIM; /**< Offset Trim Register, offset: 0x40 */ + uint8_t RESERVED_3[4]; + __IO uint32_t HSTRIM; /**< High Speed Trim Register, offset: 0x48 */ + uint8_t RESERVED_4[84]; + __IO uint32_t TCTRL[4]; /**< Trigger Control Register, array offset: 0xA0, array step: 0x4 */ + uint8_t RESERVED_5[48]; + __IO uint32_t FCTRL; /**< FIFO Control Register, offset: 0xE0 */ + uint8_t RESERVED_6[12]; + __I uint32_t GCC[1]; /**< Gain Calibration Control, array offset: 0xF0, array step: 0x4 */ + uint8_t RESERVED_7[4]; + __IO uint32_t GCR[1]; /**< Gain Calculation Result, array offset: 0xF8, array step: 0x4 */ + uint8_t RESERVED_8[4]; + struct { /* offset: 0x100, array step: 0x8 */ + __IO uint32_t CMDL; /**< Command Low Buffer Register, array offset: 0x100, array step: 0x8 */ + __IO uint32_t CMDH; /**< Command High Buffer Register, array offset: 0x104, array step: 0x8 */ + } CMD[7]; + uint8_t RESERVED_9[200]; + __IO uint32_t CV[7]; /**< Compare Value Register, array offset: 0x200, array step: 0x4 */ + uint8_t RESERVED_10[228]; + __I uint32_t RESFIFO; /**< Data Result FIFO Register, offset: 0x300 */ + uint8_t RESERVED_11[252]; + __IO uint32_t CAL_GAR0; /**< Calibration General A-Side Registers, offset: 0x400 */ + __IO uint32_t CAL_GAR1; /**< Calibration General A-Side Registers, offset: 0x404 */ + __IO uint32_t CAL_GAR2; /**< Calibration General A-Side Registers, offset: 0x408 */ + __IO uint32_t CAL_GAR3; /**< Calibration General A-Side Registers, offset: 0x40C */ + __IO uint32_t CAL_GAR4; /**< Calibration General A-Side Registers, offset: 0x410 */ + __IO uint32_t CAL_GAR5; /**< Calibration General A-Side Registers, offset: 0x414 */ + __IO uint32_t CAL_GAR6; /**< Calibration General A-Side Registers, offset: 0x418 */ + __IO uint32_t CAL_GAR7; /**< Calibration General A-Side Registers, offset: 0x41C */ + __IO uint32_t CAL_GAR8; /**< Calibration General A-Side Registers, offset: 0x420 */ + __IO uint32_t CAL_GAR9; /**< Calibration General A-Side Registers, offset: 0x424 */ + __IO uint32_t CAL_GAR10; /**< Calibration General A-Side Registers, offset: 0x428 */ + __IO uint32_t CAL_GAR11; /**< Calibration General A-Side Registers, offset: 0x42C */ + __IO uint32_t CAL_GAR12; /**< Calibration General A-Side Registers, offset: 0x430 */ + __IO uint32_t CAL_GAR13; /**< Calibration General A-Side Registers, offset: 0x434 */ + __IO uint32_t CAL_GAR14; /**< Calibration General A-Side Registers, offset: 0x438 */ + __IO uint32_t CAL_GAR15; /**< Calibration General A-Side Registers, offset: 0x43C */ + __IO uint32_t CAL_GAR16; /**< Calibration General A-Side Registers, offset: 0x440 */ + __IO uint32_t CAL_GAR17; /**< Calibration General A-Side Registers, offset: 0x444 */ + __IO uint32_t CAL_GAR18; /**< Calibration General A-Side Registers, offset: 0x448 */ + __IO uint32_t CAL_GAR19; /**< Calibration General A-Side Registers, offset: 0x44C */ + __IO uint32_t CAL_GAR20; /**< Calibration General A-Side Registers, offset: 0x450 */ + __IO uint32_t CAL_GAR21; /**< Calibration General A-Side Registers, offset: 0x454 */ + __IO uint32_t CAL_GAR22; /**< Calibration General A-Side Registers, offset: 0x458 */ + __IO uint32_t CAL_GAR23; /**< Calibration General A-Side Registers, offset: 0x45C */ + __IO uint32_t CAL_GAR24; /**< Calibration General A-Side Registers, offset: 0x460 */ + __IO uint32_t CAL_GAR25; /**< Calibration General A-Side Registers, offset: 0x464 */ + __IO uint32_t CAL_GAR26; /**< Calibration General A-Side Registers, offset: 0x468 */ + __IO uint32_t CAL_GAR27; /**< Calibration General A-Side Registers, offset: 0x46C */ + __IO uint32_t CAL_GAR28; /**< Calibration General A-Side Registers, offset: 0x470 */ + __IO uint32_t CAL_GAR29; /**< Calibration General A-Side Registers, offset: 0x474 */ + __IO uint32_t CAL_GAR30; /**< Calibration General A-Side Registers, offset: 0x478 */ + __IO uint32_t CAL_GAR31; /**< Calibration General A-Side Registers, offset: 0x47C */ + __IO uint32_t CAL_GAR32; /**< Calibration General A-Side Registers, offset: 0x480 */ + __IO uint32_t CAL_GAR33; /**< Calibration General A-Side Registers, offset: 0x484 */ + uint8_t RESERVED_12[2928]; + __IO uint32_t CFG2; /**< Configuration 2 Register, offset: 0xFF8 */ +} ADC_Type; + +/* ---------------------------------------------------------------------------- + -- ADC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Register_Masks ADC Register Masks + * @{ + */ + +/*! @name VERID - Version ID Register */ +/*! @{ */ + +#define ADC_VERID_RES_MASK (0x1U) +#define ADC_VERID_RES_SHIFT (0U) +/*! RES - Resolution + * 0b0..Up to 12-bit single ended resolution supported (and 13-bit differential resolution if VERID[DIFFEN] = 1b). + * 0b1..Up to 16-bit single ended resolution supported (and 16-bit differential resolution if VERID[DIFFEN] = 1b). + */ +#define ADC_VERID_RES(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_RES_SHIFT)) & ADC_VERID_RES_MASK) + +#define ADC_VERID_DIFFEN_MASK (0x2U) +#define ADC_VERID_DIFFEN_SHIFT (1U) +/*! DIFFEN - Differential Supported + * 0b0..Differential operation not supported. + * 0b1..Differential operation supported. + */ +#define ADC_VERID_DIFFEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_DIFFEN_SHIFT)) & ADC_VERID_DIFFEN_MASK) + +#define ADC_VERID_MVI_MASK (0x8U) +#define ADC_VERID_MVI_SHIFT (3U) +/*! MVI - Multi Vref Implemented + * 0b0..Single voltage reference high (VREFH) input supported. + * 0b1..Multiple voltage reference high (VREFH) inputs supported. + */ +#define ADC_VERID_MVI(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_MVI_SHIFT)) & ADC_VERID_MVI_MASK) + +#define ADC_VERID_CSW_MASK (0x70U) +#define ADC_VERID_CSW_SHIFT (4U) +/*! CSW - Channel Scale Width + * 0b000..Channel scaling not supported. + * 0b001..Channel scaling supported. 1-bit CSCALE control field. + * 0b110..Channel scaling supported. 6-bit CSCALE control field. + */ +#define ADC_VERID_CSW(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_CSW_SHIFT)) & ADC_VERID_CSW_MASK) + +#define ADC_VERID_VR1RNGI_MASK (0x100U) +#define ADC_VERID_VR1RNGI_SHIFT (8U) +/*! VR1RNGI - Voltage Reference 1 Range Control Bit Implemented + * 0b0..Range control not required. CFG[VREF1RNG] is not implemented. + * 0b1..Range control required. CFG[VREF1RNG] is implemented. + */ +#define ADC_VERID_VR1RNGI(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_VR1RNGI_SHIFT)) & ADC_VERID_VR1RNGI_MASK) + +#define ADC_VERID_IADCKI_MASK (0x200U) +#define ADC_VERID_IADCKI_SHIFT (9U) +/*! IADCKI - Internal ADC Clock Implemented + * 0b0..Internal clock source not implemented. + * 0b1..Internal clock source (and CFG[ADCKEN]) implemented. + */ +#define ADC_VERID_IADCKI(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_IADCKI_SHIFT)) & ADC_VERID_IADCKI_MASK) + +#define ADC_VERID_CALOFSI_MASK (0x400U) +#define ADC_VERID_CALOFSI_SHIFT (10U) +/*! CALOFSI - Calibration Function Implemented + * 0b0..Calibration Not Implemented. + * 0b1..Calibration Implemented. + */ +#define ADC_VERID_CALOFSI(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_CALOFSI_SHIFT)) & ADC_VERID_CALOFSI_MASK) + +#define ADC_VERID_NUM_SEC_MASK (0x800U) +#define ADC_VERID_NUM_SEC_SHIFT (11U) +/*! NUM_SEC - Number of Single Ended Outputs Supported + * 0b0..This design supports one single ended conversion at a time. + * 0b1..This design supports two simultaneous single ended conversions. + */ +#define ADC_VERID_NUM_SEC(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_NUM_SEC_SHIFT)) & ADC_VERID_NUM_SEC_MASK) + +#define ADC_VERID_NUM_FIFO_MASK (0x7000U) +#define ADC_VERID_NUM_FIFO_SHIFT (12U) +/*! NUM_FIFO - Number of FIFOs + * 0b000..N/A + * 0b001..This design supports one result FIFO. + * 0b010..This design supports two result FIFOs. + * 0b011..This design supports three result FIFOs. + * 0b100..This design supports four result FIFOs. + */ +#define ADC_VERID_NUM_FIFO(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_NUM_FIFO_SHIFT)) & ADC_VERID_NUM_FIFO_MASK) + +#define ADC_VERID_MINOR_MASK (0xFF0000U) +#define ADC_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define ADC_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_MINOR_SHIFT)) & ADC_VERID_MINOR_MASK) + +#define ADC_VERID_MAJOR_MASK (0xFF000000U) +#define ADC_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define ADC_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << ADC_VERID_MAJOR_SHIFT)) & ADC_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter Register */ +/*! @{ */ + +#define ADC_PARAM_TRIG_NUM_MASK (0xFFU) +#define ADC_PARAM_TRIG_NUM_SHIFT (0U) +/*! TRIG_NUM - Trigger Number */ +#define ADC_PARAM_TRIG_NUM(x) (((uint32_t)(((uint32_t)(x)) << ADC_PARAM_TRIG_NUM_SHIFT)) & ADC_PARAM_TRIG_NUM_MASK) + +#define ADC_PARAM_FIFOSIZE_MASK (0xFF00U) +#define ADC_PARAM_FIFOSIZE_SHIFT (8U) +/*! FIFOSIZE - Result FIFO Depth + * 0b00000001..Result FIFO depth = 2 dataword. + * 0b00000100..Result FIFO depth = 4 datawords. + * 0b00001000..Result FIFO depth = 8 datawords. + * 0b00010000..Result FIFO depth = 16 datawords. + * 0b00100000..Result FIFO depth = 32 datawords. + * 0b01000000..Result FIFO depth = 64 datawords. + */ +#define ADC_PARAM_FIFOSIZE(x) (((uint32_t)(((uint32_t)(x)) << ADC_PARAM_FIFOSIZE_SHIFT)) & ADC_PARAM_FIFOSIZE_MASK) + +#define ADC_PARAM_CV_NUM_MASK (0xFF0000U) +#define ADC_PARAM_CV_NUM_SHIFT (16U) +/*! CV_NUM - Compare Value Number */ +#define ADC_PARAM_CV_NUM(x) (((uint32_t)(((uint32_t)(x)) << ADC_PARAM_CV_NUM_SHIFT)) & ADC_PARAM_CV_NUM_MASK) + +#define ADC_PARAM_CMD_NUM_MASK (0xFF000000U) +#define ADC_PARAM_CMD_NUM_SHIFT (24U) +/*! CMD_NUM - Command Buffer Number */ +#define ADC_PARAM_CMD_NUM(x) (((uint32_t)(((uint32_t)(x)) << ADC_PARAM_CMD_NUM_SHIFT)) & ADC_PARAM_CMD_NUM_MASK) +/*! @} */ + +/*! @name CTRL - Control Register */ +/*! @{ */ + +#define ADC_CTRL_ADCEN_MASK (0x1U) +#define ADC_CTRL_ADCEN_SHIFT (0U) +/*! ADCEN - ADC Enable + * 0b0..ADC is disabled. + * 0b1..ADC is enabled. + */ +#define ADC_CTRL_ADCEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_CTRL_ADCEN_SHIFT)) & ADC_CTRL_ADCEN_MASK) + +#define ADC_CTRL_RST_MASK (0x2U) +#define ADC_CTRL_RST_SHIFT (1U) +/*! RST - Software Reset + * 0b0..ADC logic is not reset. + * 0b1..ADC logic is reset. + */ +#define ADC_CTRL_RST(x) (((uint32_t)(((uint32_t)(x)) << ADC_CTRL_RST_SHIFT)) & ADC_CTRL_RST_MASK) + +#define ADC_CTRL_DOZEN_MASK (0x4U) +#define ADC_CTRL_DOZEN_SHIFT (2U) +/*! DOZEN - Doze Enable + * 0b0..ADC is enabled in low power mode. + * 0b1..ADC is disabled in low power mode. + */ +#define ADC_CTRL_DOZEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_CTRL_DOZEN_SHIFT)) & ADC_CTRL_DOZEN_MASK) + +#define ADC_CTRL_CAL_REQ_MASK (0x8U) +#define ADC_CTRL_CAL_REQ_SHIFT (3U) +/*! CAL_REQ - Auto-Calibration Request + * 0b0..No request for hardware calibration has been made + * 0b1..A request for hardware calibration has been made + */ +#define ADC_CTRL_CAL_REQ(x) (((uint32_t)(((uint32_t)(x)) << ADC_CTRL_CAL_REQ_SHIFT)) & ADC_CTRL_CAL_REQ_MASK) + +#define ADC_CTRL_CALOFS_MASK (0x10U) +#define ADC_CTRL_CALOFS_SHIFT (4U) +/*! CALOFS - Offset Calibration Request + * 0b0..No request for offset calibration has been made + * 0b1..Request for offset calibration function + */ +#define ADC_CTRL_CALOFS(x) (((uint32_t)(((uint32_t)(x)) << ADC_CTRL_CALOFS_SHIFT)) & ADC_CTRL_CALOFS_MASK) + +#define ADC_CTRL_CALHS_MASK (0x40U) +#define ADC_CTRL_CALHS_SHIFT (6U) +/*! CALHS - High Speed Mode Trim Request + * 0b0..No request for high speed mode trim has been made + * 0b1..Request for high speed mode trim has been made + */ +#define ADC_CTRL_CALHS(x) (((uint32_t)(((uint32_t)(x)) << ADC_CTRL_CALHS_SHIFT)) & ADC_CTRL_CALHS_MASK) + +#define ADC_CTRL_RSTFIFO0_MASK (0x100U) +#define ADC_CTRL_RSTFIFO0_SHIFT (8U) +/*! RSTFIFO0 - Reset FIFO 0 + * 0b0..No effect. + * 0b1..FIFO 0 is reset. + */ +#define ADC_CTRL_RSTFIFO0(x) (((uint32_t)(((uint32_t)(x)) << ADC_CTRL_RSTFIFO0_SHIFT)) & ADC_CTRL_RSTFIFO0_MASK) + +#define ADC_CTRL_CAL_AVGS_MASK (0xF0000U) +#define ADC_CTRL_CAL_AVGS_SHIFT (16U) +/*! CAL_AVGS - Auto-Calibration Averages + * 0b0000..Single conversion. + * 0b0001..2 conversions averaged. + * 0b0010..4 conversions averaged. + * 0b0011..8 conversions averaged. + * 0b0100..16 conversions averaged. + * 0b0101..32 conversions averaged. + * 0b0110..64 conversions averaged. + * 0b0111..128 conversions averaged. + * 0b1000..256 conversions averaged. + * 0b1001..512 conversions averaged. + * 0b1010..1024 conversions averaged. + */ +#define ADC_CTRL_CAL_AVGS(x) (((uint32_t)(((uint32_t)(x)) << ADC_CTRL_CAL_AVGS_SHIFT)) & ADC_CTRL_CAL_AVGS_MASK) +/*! @} */ + +/*! @name STAT - Status Register */ +/*! @{ */ + +#define ADC_STAT_RDY0_MASK (0x1U) +#define ADC_STAT_RDY0_SHIFT (0U) +/*! RDY0 - Result FIFO 0 Ready Flag + * 0b0..Result FIFO 0 data level not above watermark level. + * 0b1..Result FIFO 0 holding data above watermark level. + */ +#define ADC_STAT_RDY0(x) (((uint32_t)(((uint32_t)(x)) << ADC_STAT_RDY0_SHIFT)) & ADC_STAT_RDY0_MASK) + +#define ADC_STAT_FOF0_MASK (0x2U) +#define ADC_STAT_FOF0_SHIFT (1U) +/*! FOF0 - Result FIFO 0 Overflow Flag + * 0b0..No result FIFO 0 overflow has occurred since the last time the flag was cleared. + * 0b1..At least one result FIFO 0 overflow has occurred since the last time the flag was cleared. + */ +#define ADC_STAT_FOF0(x) (((uint32_t)(((uint32_t)(x)) << ADC_STAT_FOF0_SHIFT)) & ADC_STAT_FOF0_MASK) + +#define ADC_STAT_TEXC_INT_MASK (0x100U) +#define ADC_STAT_TEXC_INT_SHIFT (8U) +/*! TEXC_INT - Interrupt Flag For High Priority Trigger Exception + * 0b0..No trigger exceptions have occurred. + * 0b1..A trigger exception has occurred and is pending acknowledgement. + */ +#define ADC_STAT_TEXC_INT(x) (((uint32_t)(((uint32_t)(x)) << ADC_STAT_TEXC_INT_SHIFT)) & ADC_STAT_TEXC_INT_MASK) + +#define ADC_STAT_TCOMP_INT_MASK (0x200U) +#define ADC_STAT_TCOMP_INT_SHIFT (9U) +/*! TCOMP_INT - Interrupt Flag For Trigger Completion + * 0b0..Either IE[TCOMP_IE] is set to 0, or no trigger sequences have run to completion. + * 0b1..Trigger sequence has been completed and all data is stored in the associated FIFO. + */ +#define ADC_STAT_TCOMP_INT(x) (((uint32_t)(((uint32_t)(x)) << ADC_STAT_TCOMP_INT_SHIFT)) & ADC_STAT_TCOMP_INT_MASK) + +#define ADC_STAT_CAL_RDY_MASK (0x400U) +#define ADC_STAT_CAL_RDY_SHIFT (10U) +/*! CAL_RDY - Calibration Ready + * 0b0..Calibration is incomplete or hasn't been ran. + * 0b1..The ADC is calibrated. + */ +#define ADC_STAT_CAL_RDY(x) (((uint32_t)(((uint32_t)(x)) << ADC_STAT_CAL_RDY_SHIFT)) & ADC_STAT_CAL_RDY_MASK) + +#define ADC_STAT_ADC_ACTIVE_MASK (0x800U) +#define ADC_STAT_ADC_ACTIVE_SHIFT (11U) +/*! ADC_ACTIVE - ADC Active + * 0b0..The ADC is IDLE. There are no pending triggers to service and no active commands are being processed. + * 0b1..The ADC is processing a conversion, running through the power up delay, or servicing a trigger. + */ +#define ADC_STAT_ADC_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << ADC_STAT_ADC_ACTIVE_SHIFT)) & ADC_STAT_ADC_ACTIVE_MASK) + +#define ADC_STAT_TRGACT_MASK (0x30000U) +#define ADC_STAT_TRGACT_SHIFT (16U) +/*! TRGACT - Trigger Active + * 0b00..Command (sequence) associated with Trigger 0 currently being executed. + * 0b01..Command (sequence) associated with Trigger 1 currently being executed. + * 0b10..Command (sequence) associated with Trigger 2 currently being executed. + * 0b11..Command (sequence) associated with Trigger 3 currently being executed. + */ +#define ADC_STAT_TRGACT(x) (((uint32_t)(((uint32_t)(x)) << ADC_STAT_TRGACT_SHIFT)) & ADC_STAT_TRGACT_MASK) + +#define ADC_STAT_CMDACT_MASK (0x7000000U) +#define ADC_STAT_CMDACT_SHIFT (24U) +/*! CMDACT - Command Active + * 0b000..No command is currently in progress. + * 0b001..Command 1 currently being executed. + * 0b010..Command 2 currently being executed. + * 0b011-0b111..Associated command number is currently being executed. + */ +#define ADC_STAT_CMDACT(x) (((uint32_t)(((uint32_t)(x)) << ADC_STAT_CMDACT_SHIFT)) & ADC_STAT_CMDACT_MASK) +/*! @} */ + +/*! @name IE - Interrupt Enable Register */ +/*! @{ */ + +#define ADC_IE_FWMIE0_MASK (0x1U) +#define ADC_IE_FWMIE0_SHIFT (0U) +/*! FWMIE0 - FIFO 0 Watermark Interrupt Enable + * 0b0..FIFO 0 watermark interrupts are not enabled. + * 0b1..FIFO 0 watermark interrupts are enabled. + */ +#define ADC_IE_FWMIE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_IE_FWMIE0_SHIFT)) & ADC_IE_FWMIE0_MASK) + +#define ADC_IE_FOFIE0_MASK (0x2U) +#define ADC_IE_FOFIE0_SHIFT (1U) +/*! FOFIE0 - Result FIFO 0 Overflow Interrupt Enable + * 0b0..FIFO 0 overflow interrupts are not enabled. + * 0b1..FIFO 0 overflow interrupts are enabled. + */ +#define ADC_IE_FOFIE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_IE_FOFIE0_SHIFT)) & ADC_IE_FOFIE0_MASK) + +#define ADC_IE_TEXC_IE_MASK (0x100U) +#define ADC_IE_TEXC_IE_SHIFT (8U) +/*! TEXC_IE - Trigger Exception Interrupt Enable + * 0b0..Trigger exception interrupts are disabled. + * 0b1..Trigger exception interrupts are enabled. + */ +#define ADC_IE_TEXC_IE(x) (((uint32_t)(((uint32_t)(x)) << ADC_IE_TEXC_IE_SHIFT)) & ADC_IE_TEXC_IE_MASK) + +#define ADC_IE_TCOMP_IE_MASK (0xF0000U) +#define ADC_IE_TCOMP_IE_SHIFT (16U) +/*! TCOMP_IE - Trigger Completion Interrupt Enable + * 0b0000..Trigger completion interrupts are disabled. + * 0b0001..Trigger completion interrupts are enabled for trigger source 0 only. + * 0b0010..Trigger completion interrupts are enabled for trigger source 1 only. + * 0b0011-0b1110..Associated trigger completion interrupts are enabled. + * 0b1111..Trigger completion interrupts are enabled for every trigger source. + */ +#define ADC_IE_TCOMP_IE(x) (((uint32_t)(((uint32_t)(x)) << ADC_IE_TCOMP_IE_SHIFT)) & ADC_IE_TCOMP_IE_MASK) +/*! @} */ + +/*! @name DE - DMA Enable Register */ +/*! @{ */ + +#define ADC_DE_FWMDE0_MASK (0x1U) +#define ADC_DE_FWMDE0_SHIFT (0U) +/*! FWMDE0 - FIFO 0 Watermark DMA Enable + * 0b0..DMA request disabled. + * 0b1..DMA request enabled. + */ +#define ADC_DE_FWMDE0(x) (((uint32_t)(((uint32_t)(x)) << ADC_DE_FWMDE0_SHIFT)) & ADC_DE_FWMDE0_MASK) +/*! @} */ + +/*! @name CFG - Configuration Register */ +/*! @{ */ + +#define ADC_CFG_TPRICTRL_MASK (0x3U) +#define ADC_CFG_TPRICTRL_SHIFT (0U) +/*! TPRICTRL - ADC Trigger Priority Control + * 0b00..If a higher priority trigger is detected during command processing, the current conversion is aborted + * and the new command specified by the trigger is started. + * 0b01..If a higher priority trigger is received during command processing, the current command is stopped after + * completing the current conversion. If averaging is enabled, the averaging loop will be completed. + * However, CMDHa[LOOP] will be ignored and the higher priority trigger will be serviced. + * 0b10..If a higher priority trigger is received during command processing, the current command will be + * completed (averaging, looping, compare) before servicing the higher priority trigger. + * 0b11.. + */ +#define ADC_CFG_TPRICTRL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_TPRICTRL_SHIFT)) & ADC_CFG_TPRICTRL_MASK) + +#define ADC_CFG_PWRSEL_MASK (0x20U) +#define ADC_CFG_PWRSEL_SHIFT (5U) +/*! PWRSEL - Power Configuration Select + * 0b0..Low power + * 0b1..High power + */ +#define ADC_CFG_PWRSEL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_PWRSEL_SHIFT)) & ADC_CFG_PWRSEL_MASK) + +#define ADC_CFG_REFSEL_MASK (0xC0U) +#define ADC_CFG_REFSEL_SHIFT (6U) +/*! REFSEL - Voltage Reference Selection + * 0b00..(Default) Option 1 setting. + * 0b01..Option 2 setting. + * 0b10..Option 3 setting. + * 0b11..Reserved + */ +#define ADC_CFG_REFSEL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_REFSEL_SHIFT)) & ADC_CFG_REFSEL_MASK) + +#define ADC_CFG_TRES_MASK (0x100U) +#define ADC_CFG_TRES_SHIFT (8U) +/*! TRES - Trigger Resume Enable + * 0b0..Trigger sequences interrupted by a high priority trigger exception are not automatically resumed or restarted. + * 0b1..Trigger sequences interrupted by a high priority trigger exception are automatically resumed or restarted. + */ +#define ADC_CFG_TRES(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_TRES_SHIFT)) & ADC_CFG_TRES_MASK) + +#define ADC_CFG_TCMDRES_MASK (0x200U) +#define ADC_CFG_TCMDRES_SHIFT (9U) +/*! TCMDRES - Trigger Command Resume + * 0b0..Trigger sequences interrupted by a high priority trigger exception is automatically restarted. + * 0b1..Trigger sequences interrupted by a high priority trigger exception is resumed from the command executing before the exception. + */ +#define ADC_CFG_TCMDRES(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_TCMDRES_SHIFT)) & ADC_CFG_TCMDRES_MASK) + +#define ADC_CFG_HPT_EXDI_MASK (0x400U) +#define ADC_CFG_HPT_EXDI_SHIFT (10U) +/*! HPT_EXDI - High Priority Trigger Exception Disable + * 0b0..High priority trigger exceptions are enabled. + * 0b1..High priority trigger exceptions are disabled. + */ +#define ADC_CFG_HPT_EXDI(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_HPT_EXDI_SHIFT)) & ADC_CFG_HPT_EXDI_MASK) + +#define ADC_CFG_PUDLY_MASK (0xFF0000U) +#define ADC_CFG_PUDLY_SHIFT (16U) +/*! PUDLY - Power Up Delay */ +#define ADC_CFG_PUDLY(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_PUDLY_SHIFT)) & ADC_CFG_PUDLY_MASK) + +#define ADC_CFG_PWREN_MASK (0x10000000U) +#define ADC_CFG_PWREN_SHIFT (28U) +/*! PWREN - ADC Analog Pre-Enable + * 0b0..ADC analog circuits are only enabled while conversions are active. Performance is affected due to analog startup delays. + * 0b1..ADC analog circuits are pre-enabled and ready to execute conversions without startup delays (at the cost + * of higher DC current consumption). Note that a single power up delay (CFG[PUDLY]) is executed immediately + * once PWREN is set, and any detected trigger does not begin ADC operation until the power up delay time has + * passed. After this initial delay expires the analog remains pre-enabled and no additional delays are + * executed. + */ +#define ADC_CFG_PWREN(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG_PWREN_SHIFT)) & ADC_CFG_PWREN_MASK) +/*! @} */ + +/*! @name PAUSE - Pause Register */ +/*! @{ */ + +#define ADC_PAUSE_PAUSEDLY_MASK (0x1FFU) +#define ADC_PAUSE_PAUSEDLY_SHIFT (0U) +/*! PAUSEDLY - Pause Delay */ +#define ADC_PAUSE_PAUSEDLY(x) (((uint32_t)(((uint32_t)(x)) << ADC_PAUSE_PAUSEDLY_SHIFT)) & ADC_PAUSE_PAUSEDLY_MASK) + +#define ADC_PAUSE_PAUSEEN_MASK (0x80000000U) +#define ADC_PAUSE_PAUSEEN_SHIFT (31U) +/*! PAUSEEN - PAUSE Option Enable + * 0b0..Pause operation disabled + * 0b1..Pause operation enabled + */ +#define ADC_PAUSE_PAUSEEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_PAUSE_PAUSEEN_SHIFT)) & ADC_PAUSE_PAUSEEN_MASK) +/*! @} */ + +/*! @name SWTRIG - Software Trigger Register */ +/*! @{ */ + +#define ADC_SWTRIG_SWT0_MASK (0x1U) +#define ADC_SWTRIG_SWT0_SHIFT (0U) +/*! SWT0 - Software Trigger 0 Event + * 0b0..No trigger 0 event generated. + * 0b1..Trigger 0 event generated. + */ +#define ADC_SWTRIG_SWT0(x) (((uint32_t)(((uint32_t)(x)) << ADC_SWTRIG_SWT0_SHIFT)) & ADC_SWTRIG_SWT0_MASK) + +#define ADC_SWTRIG_SWT1_MASK (0x2U) +#define ADC_SWTRIG_SWT1_SHIFT (1U) +/*! SWT1 - Software Trigger 1 Event + * 0b0..No trigger 1 event generated. + * 0b1..Trigger 1 event generated. + */ +#define ADC_SWTRIG_SWT1(x) (((uint32_t)(((uint32_t)(x)) << ADC_SWTRIG_SWT1_SHIFT)) & ADC_SWTRIG_SWT1_MASK) + +#define ADC_SWTRIG_SWT2_MASK (0x4U) +#define ADC_SWTRIG_SWT2_SHIFT (2U) +/*! SWT2 - Software Trigger 2 Event + * 0b0..No trigger 2 event generated. + * 0b1..Trigger 2 event generated. + */ +#define ADC_SWTRIG_SWT2(x) (((uint32_t)(((uint32_t)(x)) << ADC_SWTRIG_SWT2_SHIFT)) & ADC_SWTRIG_SWT2_MASK) + +#define ADC_SWTRIG_SWT3_MASK (0x8U) +#define ADC_SWTRIG_SWT3_SHIFT (3U) +/*! SWT3 - Software Trigger 3 Event + * 0b0..No trigger 3 event generated. + * 0b1..Trigger 3 event generated. + */ +#define ADC_SWTRIG_SWT3(x) (((uint32_t)(((uint32_t)(x)) << ADC_SWTRIG_SWT3_SHIFT)) & ADC_SWTRIG_SWT3_MASK) +/*! @} */ + +/*! @name TSTAT - Trigger Status Register */ +/*! @{ */ + +#define ADC_TSTAT_TEXC_NUM_MASK (0xFU) +#define ADC_TSTAT_TEXC_NUM_SHIFT (0U) +/*! TEXC_NUM - Trigger Exception Number + * 0b0000..No triggers have been interrupted by a high priority exception. Or CFG[TRES] = 1. + * 0b0001..Trigger 0 has been interrupted by a high priority exception. + * 0b0010..Trigger 1 has been interrupted by a high priority exception. + * 0b0011-0b1110..Associated trigger sequence has interrupted by a high priority exception. + * 0b1111..Every trigger sequence has been interrupted by a high priority exception. + */ +#define ADC_TSTAT_TEXC_NUM(x) (((uint32_t)(((uint32_t)(x)) << ADC_TSTAT_TEXC_NUM_SHIFT)) & ADC_TSTAT_TEXC_NUM_MASK) + +#define ADC_TSTAT_TCOMP_FLAG_MASK (0xF0000U) +#define ADC_TSTAT_TCOMP_FLAG_SHIFT (16U) +/*! TCOMP_FLAG - Trigger Completion Flag + * 0b0000..No triggers have been completed. Trigger completion interrupts are disabled. + * 0b0001..Trigger 0 has been completed and trigger 0 has enabled completion interrupts. + * 0b0010..Trigger 1 has been completed and trigger 1 has enabled completion interrupts. + * 0b0011-0b1110..Associated trigger sequence has completed and has enabled completion interrupts. + * 0b1111..Every trigger sequence has been completed and every trigger has enabled completion interrupts. + */ +#define ADC_TSTAT_TCOMP_FLAG(x) (((uint32_t)(((uint32_t)(x)) << ADC_TSTAT_TCOMP_FLAG_SHIFT)) & ADC_TSTAT_TCOMP_FLAG_MASK) +/*! @} */ + +/*! @name OFSTRIM - Offset Trim Register */ +/*! @{ */ + +#define ADC_OFSTRIM_OFSTRIM_MASK (0x3FFU) +#define ADC_OFSTRIM_OFSTRIM_SHIFT (0U) +/*! OFSTRIM - Trim for Offset */ +#define ADC_OFSTRIM_OFSTRIM(x) (((uint32_t)(((uint32_t)(x)) << ADC_OFSTRIM_OFSTRIM_SHIFT)) & ADC_OFSTRIM_OFSTRIM_MASK) +/*! @} */ + +/*! @name HSTRIM - High Speed Trim Register */ +/*! @{ */ + +#define ADC_HSTRIM_HSTRIM_MASK (0x1FU) +#define ADC_HSTRIM_HSTRIM_SHIFT (0U) +/*! HSTRIM - Trim for High Speed Conversions */ +#define ADC_HSTRIM_HSTRIM(x) (((uint32_t)(((uint32_t)(x)) << ADC_HSTRIM_HSTRIM_SHIFT)) & ADC_HSTRIM_HSTRIM_MASK) +/*! @} */ + +/*! @name TCTRL - Trigger Control Register */ +/*! @{ */ + +#define ADC_TCTRL_HTEN_MASK (0x1U) +#define ADC_TCTRL_HTEN_SHIFT (0U) +/*! HTEN - Trigger Enable + * 0b0..Hardware trigger source disabled + * 0b1..Hardware trigger source enabled + */ +#define ADC_TCTRL_HTEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_TCTRL_HTEN_SHIFT)) & ADC_TCTRL_HTEN_MASK) + +#define ADC_TCTRL_TPRI_MASK (0x300U) +#define ADC_TCTRL_TPRI_SHIFT (8U) +/*! TPRI - Trigger Priority Setting + * 0b00..Set to highest priority, Level 1 + * 0b01-0b10..Set to corresponding priority level + * 0b11..Set to lowest priority, Level 4 + */ +#define ADC_TCTRL_TPRI(x) (((uint32_t)(((uint32_t)(x)) << ADC_TCTRL_TPRI_SHIFT)) & ADC_TCTRL_TPRI_MASK) + +#define ADC_TCTRL_RSYNC_MASK (0x8000U) +#define ADC_TCTRL_RSYNC_SHIFT (15U) +/*! RSYNC - Trigger Resync */ +#define ADC_TCTRL_RSYNC(x) (((uint32_t)(((uint32_t)(x)) << ADC_TCTRL_RSYNC_SHIFT)) & ADC_TCTRL_RSYNC_MASK) + +#define ADC_TCTRL_TDLY_MASK (0xF0000U) +#define ADC_TCTRL_TDLY_SHIFT (16U) +/*! TDLY - Trigger Delay Select */ +#define ADC_TCTRL_TDLY(x) (((uint32_t)(((uint32_t)(x)) << ADC_TCTRL_TDLY_SHIFT)) & ADC_TCTRL_TDLY_MASK) + +#define ADC_TCTRL_TSYNC_MASK (0x800000U) +#define ADC_TCTRL_TSYNC_SHIFT (23U) +/*! TSYNC - Trigger Synchronous Select */ +#define ADC_TCTRL_TSYNC(x) (((uint32_t)(((uint32_t)(x)) << ADC_TCTRL_TSYNC_SHIFT)) & ADC_TCTRL_TSYNC_MASK) + +#define ADC_TCTRL_TCMD_MASK (0x7000000U) +#define ADC_TCTRL_TCMD_SHIFT (24U) +/*! TCMD - Trigger Command Select + * 0b000..Not a valid selection from the command buffer. Trigger event is ignored. + * 0b001..CMD1 is executed + * 0b010-0b110..Corresponding CMD is executed + * 0b111..CMD7 is executed + */ +#define ADC_TCTRL_TCMD(x) (((uint32_t)(((uint32_t)(x)) << ADC_TCTRL_TCMD_SHIFT)) & ADC_TCTRL_TCMD_MASK) +/*! @} */ + +/* The count of ADC_TCTRL */ +#define ADC_TCTRL_COUNT (4U) + +/*! @name FCTRL - FIFO Control Register */ +/*! @{ */ + +#define ADC_FCTRL_FCOUNT_MASK (0xFU) +#define ADC_FCTRL_FCOUNT_SHIFT (0U) +/*! FCOUNT - Result FIFO Counter */ +#define ADC_FCTRL_FCOUNT(x) (((uint32_t)(((uint32_t)(x)) << ADC_FCTRL_FCOUNT_SHIFT)) & ADC_FCTRL_FCOUNT_MASK) + +#define ADC_FCTRL_FWMARK_MASK (0x70000U) +#define ADC_FCTRL_FWMARK_SHIFT (16U) +/*! FWMARK - Watermark Level Selection */ +#define ADC_FCTRL_FWMARK(x) (((uint32_t)(((uint32_t)(x)) << ADC_FCTRL_FWMARK_SHIFT)) & ADC_FCTRL_FWMARK_MASK) +/*! @} */ + +/*! @name GCC - Gain Calibration Control */ +/*! @{ */ + +#define ADC_GCC_GAIN_CAL_MASK (0xFFFFU) +#define ADC_GCC_GAIN_CAL_SHIFT (0U) +/*! GAIN_CAL - Gain Calibration Value */ +#define ADC_GCC_GAIN_CAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_GCC_GAIN_CAL_SHIFT)) & ADC_GCC_GAIN_CAL_MASK) + +#define ADC_GCC_RDY_MASK (0x1000000U) +#define ADC_GCC_RDY_SHIFT (24U) +/*! RDY - Gain Calibration Value Valid + * 0b0..The GAIN_CAL value is invalid. Run the hardware calibration routine for this value to be set. + * 0b1..The GAIN_CAL value is valid. GAIN_CAL should be used by software to derive GCRa[GCALR]. + */ +#define ADC_GCC_RDY(x) (((uint32_t)(((uint32_t)(x)) << ADC_GCC_RDY_SHIFT)) & ADC_GCC_RDY_MASK) +/*! @} */ + +/* The count of ADC_GCC */ +#define ADC_GCC_COUNT (1U) + +/*! @name GCR - Gain Calculation Result */ +/*! @{ */ + +#define ADC_GCR_GCALR_MASK (0x1FFFFU) +#define ADC_GCR_GCALR_SHIFT (0U) +/*! GCALR - Gain Calculation Result */ +#define ADC_GCR_GCALR(x) (((uint32_t)(((uint32_t)(x)) << ADC_GCR_GCALR_SHIFT)) & ADC_GCR_GCALR_MASK) + +#define ADC_GCR_RDY_MASK (0x1000000U) +#define ADC_GCR_RDY_SHIFT (24U) +/*! RDY - Gain Calculation Ready + * 0b0..The GCALR value is invalid. + * 0b1..The GCALR value is valid. + */ +#define ADC_GCR_RDY(x) (((uint32_t)(((uint32_t)(x)) << ADC_GCR_RDY_SHIFT)) & ADC_GCR_RDY_MASK) +/*! @} */ + +/* The count of ADC_GCR */ +#define ADC_GCR_COUNT (1U) + +/*! @name CMDL - Command Low Buffer Register */ +/*! @{ */ + +#define ADC_CMDL_ADCH_MASK (0x1FU) +#define ADC_CMDL_ADCH_SHIFT (0U) +/*! ADCH - Input Channel Select + * 0b00000..Select CH0A. + * 0b00001..Select CH1A. + * 0b00010..Select CH2A. + * 0b00011..Select CH3A. + * 0b00100-0b11101..Select corresponding channel CHnA. + * 0b11110..Select CH30A. + * 0b11111..Select CH31A. + */ +#define ADC_CMDL_ADCH(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDL_ADCH_SHIFT)) & ADC_CMDL_ADCH_MASK) + +#define ADC_CMDL_CTYPE_MASK (0x60U) +#define ADC_CMDL_CTYPE_SHIFT (5U) +/*! CTYPE - Conversion Type + * 0b00..Single-Ended Mode. Only A side channel is converted. + * 0b01-0b11..Reserved. + */ +#define ADC_CMDL_CTYPE(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDL_CTYPE_SHIFT)) & ADC_CMDL_CTYPE_MASK) + +#define ADC_CMDL_MODE_MASK (0x80U) +#define ADC_CMDL_MODE_SHIFT (7U) +/*! MODE - Select Resolution of Conversions + * 0b0..Standard resolution. Single-ended 12-bit conversion. + * 0b1..High resolution. Single-ended 16-bit conversion. + */ +#define ADC_CMDL_MODE(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDL_MODE_SHIFT)) & ADC_CMDL_MODE_MASK) +/*! @} */ + +/* The count of ADC_CMDL */ +#define ADC_CMDL_COUNT (7U) + +/*! @name CMDH - Command High Buffer Register */ +/*! @{ */ + +#define ADC_CMDH_CMPEN_MASK (0x3U) +#define ADC_CMDH_CMPEN_SHIFT (0U) +/*! CMPEN - Compare Function Enable + * 0b00..Compare disabled. + * 0b01..Reserved + * 0b10..Compare enabled. Store on true. + * 0b11..Compare enabled. Repeat channel acquisition (sample/convert/compare) until true. + */ +#define ADC_CMDH_CMPEN(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDH_CMPEN_SHIFT)) & ADC_CMDH_CMPEN_MASK) + +#define ADC_CMDH_WAIT_TRIG_MASK (0x4U) +#define ADC_CMDH_WAIT_TRIG_SHIFT (2U) +/*! WAIT_TRIG - Wait for Trigger Assertion before Execution. + * 0b0..This command will be automatically executed. + * 0b1..The active trigger must be asserted again before executing this command. + */ +#define ADC_CMDH_WAIT_TRIG(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDH_WAIT_TRIG_SHIFT)) & ADC_CMDH_WAIT_TRIG_MASK) + +#define ADC_CMDH_LWI_MASK (0x80U) +#define ADC_CMDH_LWI_SHIFT (7U) +/*! LWI - Loop with Increment + * 0b0..Auto channel increment disabled + * 0b1..Auto channel increment enabled + */ +#define ADC_CMDH_LWI(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDH_LWI_SHIFT)) & ADC_CMDH_LWI_MASK) + +#define ADC_CMDH_STS_MASK (0x700U) +#define ADC_CMDH_STS_SHIFT (8U) +/*! STS - Sample Time Select + * 0b000..Minimum sample time of 3.5 ADCK cycles. + * 0b001..3.5 + 21 ADCK cycles; 5.5 ADCK cycles total sample time. + * 0b010..3.5 + 22 ADCK cycles; 7.5 ADCK cycles total sample time. + * 0b011..3.5 + 23 ADCK cycles; 11.5 ADCK cycles total sample time. + * 0b100..3.5 + 24 ADCK cycles; 19.5 ADCK cycles total sample time. + * 0b101..3.5 + 25 ADCK cycles; 35.5 ADCK cycles total sample time. + * 0b110..3.5 + 26 ADCK cycles; 67.5 ADCK cycles total sample time. + * 0b111..3.5 + 27 ADCK cycles; 131.5 ADCK cycles total sample time. + */ +#define ADC_CMDH_STS(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDH_STS_SHIFT)) & ADC_CMDH_STS_MASK) + +#define ADC_CMDH_AVGS_MASK (0xF000U) +#define ADC_CMDH_AVGS_SHIFT (12U) +/*! AVGS - Hardware Average Select + * 0b0000..Single conversion. + * 0b0001..2 conversions averaged. + * 0b0010..4 conversions averaged. + * 0b0011..8 conversions averaged. + * 0b0100..16 conversions averaged. + * 0b0101..32 conversions averaged. + * 0b0110..64 conversions averaged. + * 0b0111..128 conversions averaged. + * 0b1000..256 conversions averaged. + * 0b1001..512 conversions averaged. + * 0b1010..1024 conversions averaged. + */ +#define ADC_CMDH_AVGS(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDH_AVGS_SHIFT)) & ADC_CMDH_AVGS_MASK) + +#define ADC_CMDH_LOOP_MASK (0xF0000U) +#define ADC_CMDH_LOOP_SHIFT (16U) +/*! LOOP - Loop Count Select + * 0b0000..Looping not enabled. Command executes 1 time. + * 0b0001..Loop 1 time. Command executes 2 times. + * 0b0010..Loop 2 times. Command executes 3 times. + * 0b0011-0b1110..Loop corresponding number of times. Command executes LOOP+1 times. + * 0b1111..Loop 15 times. Command executes 16 times. + */ +#define ADC_CMDH_LOOP(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDH_LOOP_SHIFT)) & ADC_CMDH_LOOP_MASK) + +#define ADC_CMDH_NEXT_MASK (0x7000000U) +#define ADC_CMDH_NEXT_SHIFT (24U) +/*! NEXT - Next Command Select + * 0b000..No next command defined. Terminate conversions at completion of current command. If lower priority + * trigger pending, begin command associated with lower priority trigger. + * 0b001..Select CMD1 command buffer register as next command. + * 0b010-0b110..Select corresponding CMD command buffer register as next command + * 0b111..Select CMD7 command buffer register as next command. + */ +#define ADC_CMDH_NEXT(x) (((uint32_t)(((uint32_t)(x)) << ADC_CMDH_NEXT_SHIFT)) & ADC_CMDH_NEXT_MASK) +/*! @} */ + +/* The count of ADC_CMDH */ +#define ADC_CMDH_COUNT (7U) + +/*! @name CV - Compare Value Register */ +/*! @{ */ + +#define ADC_CV_CVL_MASK (0xFFFFU) +#define ADC_CV_CVL_SHIFT (0U) +/*! CVL - Compare Value Low */ +#define ADC_CV_CVL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CV_CVL_SHIFT)) & ADC_CV_CVL_MASK) + +#define ADC_CV_CVH_MASK (0xFFFF0000U) +#define ADC_CV_CVH_SHIFT (16U) +/*! CVH - Compare Value High */ +#define ADC_CV_CVH(x) (((uint32_t)(((uint32_t)(x)) << ADC_CV_CVH_SHIFT)) & ADC_CV_CVH_MASK) +/*! @} */ + +/* The count of ADC_CV */ +#define ADC_CV_COUNT (7U) + +/*! @name RESFIFO - Data Result FIFO Register */ +/*! @{ */ + +#define ADC_RESFIFO_D_MASK (0xFFFFU) +#define ADC_RESFIFO_D_SHIFT (0U) +/*! D - Data Result */ +#define ADC_RESFIFO_D(x) (((uint32_t)(((uint32_t)(x)) << ADC_RESFIFO_D_SHIFT)) & ADC_RESFIFO_D_MASK) + +#define ADC_RESFIFO_TSRC_MASK (0x30000U) +#define ADC_RESFIFO_TSRC_SHIFT (16U) +/*! TSRC - Trigger Source + * 0b00..Trigger source 0 initiated this conversion. + * 0b01..Trigger source 1 initiated this conversion. + * 0b10..Trigger source 2 initiated this conversion. + * 0b11..Trigger source 3 initiated this conversion. + */ +#define ADC_RESFIFO_TSRC(x) (((uint32_t)(((uint32_t)(x)) << ADC_RESFIFO_TSRC_SHIFT)) & ADC_RESFIFO_TSRC_MASK) + +#define ADC_RESFIFO_LOOPCNT_MASK (0xF00000U) +#define ADC_RESFIFO_LOOPCNT_SHIFT (20U) +/*! LOOPCNT - Loop Count Value + * 0b0000..Result is from initial conversion in command. + * 0b0001..Result is from second conversion in command. + * 0b0010-0b1110..Result is from LOOPCNT+1 conversion in command. + * 0b1111..Result is from 16th conversion in command. + */ +#define ADC_RESFIFO_LOOPCNT(x) (((uint32_t)(((uint32_t)(x)) << ADC_RESFIFO_LOOPCNT_SHIFT)) & ADC_RESFIFO_LOOPCNT_MASK) + +#define ADC_RESFIFO_CMDSRC_MASK (0x7000000U) +#define ADC_RESFIFO_CMDSRC_SHIFT (24U) +/*! CMDSRC - Command Buffer Source + * 0b000..Not a valid value CMDSRC value for a dataword in RESFIFO. 0x0 is only found in initial FIFO state prior + * to an ADC conversion result dataword being stored to a RESFIFO buffer. + * 0b001..CMD1 buffer used as control settings for this conversion. + * 0b010-0b110..Corresponding command buffer used as control settings for this conversion. + * 0b111..CMD7 buffer used as control settings for this conversion. + */ +#define ADC_RESFIFO_CMDSRC(x) (((uint32_t)(((uint32_t)(x)) << ADC_RESFIFO_CMDSRC_SHIFT)) & ADC_RESFIFO_CMDSRC_MASK) + +#define ADC_RESFIFO_VALID_MASK (0x80000000U) +#define ADC_RESFIFO_VALID_SHIFT (31U) +/*! VALID - FIFO Entry is Valid + * 0b0..FIFO is empty. Discard any read from RESFIFO. + * 0b1..FIFO record read from RESFIFO is valid. + */ +#define ADC_RESFIFO_VALID(x) (((uint32_t)(((uint32_t)(x)) << ADC_RESFIFO_VALID_SHIFT)) & ADC_RESFIFO_VALID_MASK) +/*! @} */ + +/*! @name CAL_GAR0 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR0_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR0_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR0_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR0_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR0_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR1 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR1_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR1_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR1_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR1_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR1_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR2 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR2_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR2_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR2_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR2_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR2_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR3 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR3_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR3_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR3_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR3_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR3_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR4 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR4_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR4_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR4_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR4_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR4_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR5 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR5_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR5_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR5_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR5_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR5_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR6 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR6_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR6_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR6_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR6_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR6_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR7 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR7_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR7_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR7_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR7_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR7_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR8 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR8_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR8_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR8_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR8_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR8_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR9 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR9_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR9_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR9_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR9_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR9_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR10 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR10_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR10_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR10_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR10_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR10_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR11 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR11_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR11_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR11_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR11_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR11_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR12 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR12_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR12_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR12_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR12_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR12_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR13 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR13_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR13_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR13_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR13_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR13_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR14 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR14_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR14_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR14_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR14_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR14_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR15 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR15_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR15_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR15_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR15_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR15_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR16 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR16_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR16_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR16_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR16_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR16_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR17 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR17_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR17_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR17_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR17_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR17_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR18 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR18_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR18_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR18_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR18_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR18_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR19 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR19_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR19_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR19_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR19_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR19_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR20 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR20_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR20_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR20_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR20_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR20_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR21 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR21_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR21_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR21_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR21_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR21_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR22 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR22_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR22_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR22_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR22_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR22_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR23 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR23_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR23_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR23_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR23_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR23_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR24 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR24_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR24_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR24_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR24_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR24_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR25 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR25_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR25_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR25_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR25_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR25_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR26 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR26_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR26_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR26_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR26_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR26_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR27 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR27_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR27_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR27_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR27_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR27_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR28 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR28_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR28_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR28_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR28_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR28_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR29 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR29_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR29_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR29_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR29_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR29_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR30 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR30_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR30_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR30_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR30_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR30_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR31 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR31_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR31_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR31_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR31_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR31_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR32 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR32_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR32_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR32_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR32_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR32_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CAL_GAR33 - Calibration General A-Side Registers */ +/*! @{ */ + +#define ADC_CAL_GAR33_CAL_GAR_VAL_MASK (0xFFFFU) +#define ADC_CAL_GAR33_CAL_GAR_VAL_SHIFT (0U) +/*! CAL_GAR_VAL - Calibration General A Side Register Element */ +#define ADC_CAL_GAR33_CAL_GAR_VAL(x) (((uint32_t)(((uint32_t)(x)) << ADC_CAL_GAR33_CAL_GAR_VAL_SHIFT)) & ADC_CAL_GAR33_CAL_GAR_VAL_MASK) +/*! @} */ + +/*! @name CFG2 - Configuration 2 Register */ +/*! @{ */ + +#define ADC_CFG2_JLEFT_MASK (0x100U) +#define ADC_CFG2_JLEFT_SHIFT (8U) +/*! JLEFT - Justified Left Enable register */ +#define ADC_CFG2_JLEFT(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG2_JLEFT_SHIFT)) & ADC_CFG2_JLEFT_MASK) + +#define ADC_CFG2_HS_MASK (0x200U) +#define ADC_CFG2_HS_SHIFT (9U) +/*! HS - High Speed Enable register + * 0b0..High speed conversion mode disabled + * 0b1..High speed conversion mode enabled + */ +#define ADC_CFG2_HS(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG2_HS_SHIFT)) & ADC_CFG2_HS_MASK) + +#define ADC_CFG2_HSEXTRA_MASK (0x400U) +#define ADC_CFG2_HSEXTRA_SHIFT (10U) +/*! HSEXTRA - High Speed Extra register + * 0b0..No extra cycle added + * 0b1..Extra cycle added + */ +#define ADC_CFG2_HSEXTRA(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG2_HSEXTRA_SHIFT)) & ADC_CFG2_HSEXTRA_MASK) + +#define ADC_CFG2_TUNE_MASK (0x3000U) +#define ADC_CFG2_TUNE_SHIFT (12U) +/*! TUNE - Tune Mode register */ +#define ADC_CFG2_TUNE(x) (((uint32_t)(((uint32_t)(x)) << ADC_CFG2_TUNE_SHIFT)) & ADC_CFG2_TUNE_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group ADC_Register_Masks */ + + +/* ADC - Peripheral instance base addresses */ +/** Peripheral ADC0 base address */ +#define ADC0_BASE (0x400AF000u) +/** Peripheral ADC0 base pointer */ +#define ADC0 ((ADC_Type *)ADC0_BASE) +/** Peripheral ADC1 base address */ +#define ADC1_BASE (0x400B0000u) +/** Peripheral ADC1 base pointer */ +#define ADC1 ((ADC_Type *)ADC1_BASE) +/** Array initializer of ADC peripheral base addresses */ +#define ADC_BASE_ADDRS { ADC0_BASE, ADC1_BASE } +/** Array initializer of ADC peripheral base pointers */ +#define ADC_BASE_PTRS { ADC0, ADC1 } +/** Interrupt vectors for the ADC peripheral type */ +#define ADC_IRQS { ADC0_IRQn, ADC1_IRQn } +/* Backward compatibility */ +#define ADC_CTRL_RSTFIFO_MASK ADC_CTRL_RSTFIFO0_MASK +#define ADC_CTRL_RSTFIFO_SHIFT ADC_CTRL_RSTFIFO0_SHIFT +#define ADC_CTRL_RSTFIFO(x) ADC_CTRL_RSTFIFO0(x) +#define ADC_STAT_RDY_MASK ADC_STAT_RDY0_MASK +#define ADC_STAT_RDY_SHIFT ADC_STAT_RDY0_SHIFT +#define ADC_STAT_RDY(x) ADC_STAT_RDY0(x) +#define ADC_STAT_FOF_MASK ADC_STAT_FOF0_MASK +#define ADC_STAT_FOF_SHIFT ADC_STAT_FOF0_SHIFT +#define ADC_STAT_FOF(x) ADC_STAT_FOF0(x) +#define ADC_IE_FWMIE_MASK ADC_IE_FWMIE0_MASK +#define ADC_IE_FWMIE_SHIFT ADC_IE_FWMIE0_SHIFT +#define ADC_IE_FWMIE(x) ADC_IE_FWMIE0(x) +#define ADC_IE_FOFIE_MASK ADC_IE_FOFIE0_MASK +#define ADC_IE_FOFIE_SHIFT ADC_IE_FOFIE0_SHIFT +#define ADC_IE_FOFIE(x) ADC_IE_FOFIE0(x) +#define ADC_DE_FWMDE_MASK ADC_DE_FWMDE0_MASK +#define ADC_DE_FWMDE_SHIFT ADC_DE_FWMDE0_SHIFT +#define ADC_DE_FWMDE(x) ADC_DE_FWMDE0(x) + + +/*! + * @} + */ /* end of group ADC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- AOI Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup AOI_Peripheral_Access_Layer AOI Peripheral Access Layer + * @{ + */ + +/** AOI - Register Layout Typedef */ +typedef struct { + struct { /* offset: 0x0, array step: 0x4 */ + __IO uint16_t BFCRT01; /**< Boolean Function Term 0 and 1 Configuration for EVENT0..Boolean Function Term 0 and 1 Configuration for EVENT3, array offset: 0x0, array step: 0x4 */ + __IO uint16_t BFCRT23; /**< Boolean Function Term 2 and 3 Configuration for EVENT0..Boolean Function Term 2 and 3 Configuration for EVENT3, array offset: 0x2, array step: 0x4 */ + } BFCRT[4]; +} AOI_Type; + +/* ---------------------------------------------------------------------------- + -- AOI Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup AOI_Register_Masks AOI Register Masks + * @{ + */ + +/*! @name BFCRT01 - Boolean Function Term 0 and 1 Configuration for EVENT0..Boolean Function Term 0 and 1 Configuration for EVENT3 */ +/*! @{ */ + +#define AOI_BFCRT01_PT1_DC_MASK (0x3U) +#define AOI_BFCRT01_PT1_DC_SHIFT (0U) +/*! PT1_DC - Product Term 1, Input D Configuration + * 0b00..Force input D to become 0 + * 0b01..Pass input D + * 0b10..Complement input D + * 0b11..Force input D to become 1 + */ +#define AOI_BFCRT01_PT1_DC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT1_DC_SHIFT)) & AOI_BFCRT01_PT1_DC_MASK) + +#define AOI_BFCRT01_PT1_CC_MASK (0xCU) +#define AOI_BFCRT01_PT1_CC_SHIFT (2U) +/*! PT1_CC - Product Term 1, Input C Configuration + * 0b00..Force input C to become 0 + * 0b01..Pass input C + * 0b10..Complement input C + * 0b11..Force input C to become 1 + */ +#define AOI_BFCRT01_PT1_CC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT1_CC_SHIFT)) & AOI_BFCRT01_PT1_CC_MASK) + +#define AOI_BFCRT01_PT1_BC_MASK (0x30U) +#define AOI_BFCRT01_PT1_BC_SHIFT (4U) +/*! PT1_BC - Product Term 1, Input B Configuration + * 0b00..Force input B to become 0 + * 0b01..Pass input B + * 0b10..Complement input B + * 0b11..Force input B to become 1 + */ +#define AOI_BFCRT01_PT1_BC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT1_BC_SHIFT)) & AOI_BFCRT01_PT1_BC_MASK) + +#define AOI_BFCRT01_PT1_AC_MASK (0xC0U) +#define AOI_BFCRT01_PT1_AC_SHIFT (6U) +/*! PT1_AC - Product Term 1, Input A Configuration + * 0b00..Force input A to become 0 + * 0b01..Pass input A + * 0b10..Complement input A + * 0b11..Force input A to become 1 + */ +#define AOI_BFCRT01_PT1_AC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT1_AC_SHIFT)) & AOI_BFCRT01_PT1_AC_MASK) + +#define AOI_BFCRT01_PT0_DC_MASK (0x300U) +#define AOI_BFCRT01_PT0_DC_SHIFT (8U) +/*! PT0_DC - Product Term 0, Input D Configuration + * 0b00..Force input D to become 0 + * 0b01..Pass input D + * 0b10..Complement input D + * 0b11..Force input D to become 1 + */ +#define AOI_BFCRT01_PT0_DC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT0_DC_SHIFT)) & AOI_BFCRT01_PT0_DC_MASK) + +#define AOI_BFCRT01_PT0_CC_MASK (0xC00U) +#define AOI_BFCRT01_PT0_CC_SHIFT (10U) +/*! PT0_CC - Product Term 0, Input C Configuration + * 0b00..Force input C to become 0 + * 0b01..Pass input C + * 0b10..Complement input C + * 0b11..Force input C to become 1 + */ +#define AOI_BFCRT01_PT0_CC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT0_CC_SHIFT)) & AOI_BFCRT01_PT0_CC_MASK) + +#define AOI_BFCRT01_PT0_BC_MASK (0x3000U) +#define AOI_BFCRT01_PT0_BC_SHIFT (12U) +/*! PT0_BC - Product Term 0, Input B Configuration + * 0b00..Force input B to become 0 + * 0b01..Pass input B + * 0b10..Complement input B + * 0b11..Force input B to become 1 + */ +#define AOI_BFCRT01_PT0_BC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT0_BC_SHIFT)) & AOI_BFCRT01_PT0_BC_MASK) + +#define AOI_BFCRT01_PT0_AC_MASK (0xC000U) +#define AOI_BFCRT01_PT0_AC_SHIFT (14U) +/*! PT0_AC - Product Term 0, Input A Configuration + * 0b00..Force input A to become 0 + * 0b01..Pass input A + * 0b10..Complement input A + * 0b11..Force input A to become 1 + */ +#define AOI_BFCRT01_PT0_AC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT01_PT0_AC_SHIFT)) & AOI_BFCRT01_PT0_AC_MASK) +/*! @} */ + +/* The count of AOI_BFCRT01 */ +#define AOI_BFCRT01_COUNT (4U) + +/*! @name BFCRT23 - Boolean Function Term 2 and 3 Configuration for EVENT0..Boolean Function Term 2 and 3 Configuration for EVENT3 */ +/*! @{ */ + +#define AOI_BFCRT23_PT3_DC_MASK (0x3U) +#define AOI_BFCRT23_PT3_DC_SHIFT (0U) +/*! PT3_DC - Product Term 3, Input D Configuration + * 0b00..Force input D to become 0 + * 0b01..Pass input D + * 0b10..Complement input D + * 0b11..Force input D to become 1 + */ +#define AOI_BFCRT23_PT3_DC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT3_DC_SHIFT)) & AOI_BFCRT23_PT3_DC_MASK) + +#define AOI_BFCRT23_PT3_CC_MASK (0xCU) +#define AOI_BFCRT23_PT3_CC_SHIFT (2U) +/*! PT3_CC - Product Term 3, Input C Configuration + * 0b00..Force input C to become 0 + * 0b01..Pass input C + * 0b10..Complement input C + * 0b11..Force input C to become 1 + */ +#define AOI_BFCRT23_PT3_CC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT3_CC_SHIFT)) & AOI_BFCRT23_PT3_CC_MASK) + +#define AOI_BFCRT23_PT3_BC_MASK (0x30U) +#define AOI_BFCRT23_PT3_BC_SHIFT (4U) +/*! PT3_BC - Product Term 3, Input B Configuration + * 0b00..Force input B to become 0 + * 0b01..Pass input B + * 0b10..Complement input B + * 0b11..Force input B to become 1 + */ +#define AOI_BFCRT23_PT3_BC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT3_BC_SHIFT)) & AOI_BFCRT23_PT3_BC_MASK) + +#define AOI_BFCRT23_PT3_AC_MASK (0xC0U) +#define AOI_BFCRT23_PT3_AC_SHIFT (6U) +/*! PT3_AC - Product Term 3, Input A Configuration + * 0b00..Force input A to become 0 + * 0b01..Pass input A + * 0b10..Complement input A + * 0b11..Force input to become 1 + */ +#define AOI_BFCRT23_PT3_AC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT3_AC_SHIFT)) & AOI_BFCRT23_PT3_AC_MASK) + +#define AOI_BFCRT23_PT2_DC_MASK (0x300U) +#define AOI_BFCRT23_PT2_DC_SHIFT (8U) +/*! PT2_DC - Product Term 2, Input D Configuration + * 0b00..Force input D to become 0 + * 0b01..Pass input D + * 0b10..Complement input D + * 0b11..Force input D to become 1 + */ +#define AOI_BFCRT23_PT2_DC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT2_DC_SHIFT)) & AOI_BFCRT23_PT2_DC_MASK) + +#define AOI_BFCRT23_PT2_CC_MASK (0xC00U) +#define AOI_BFCRT23_PT2_CC_SHIFT (10U) +/*! PT2_CC - Product Term 2, Input C Configuration + * 0b00..Force input C to become 0 + * 0b01..Pass input C + * 0b10..Complement input C + * 0b11..Force input C to become 1 + */ +#define AOI_BFCRT23_PT2_CC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT2_CC_SHIFT)) & AOI_BFCRT23_PT2_CC_MASK) + +#define AOI_BFCRT23_PT2_BC_MASK (0x3000U) +#define AOI_BFCRT23_PT2_BC_SHIFT (12U) +/*! PT2_BC - Product Term 2, Input B Configuration + * 0b00..Force input B to become 0 + * 0b01..Pass input B + * 0b10..Complement input B + * 0b11..Force input B to become 1 + */ +#define AOI_BFCRT23_PT2_BC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT2_BC_SHIFT)) & AOI_BFCRT23_PT2_BC_MASK) + +#define AOI_BFCRT23_PT2_AC_MASK (0xC000U) +#define AOI_BFCRT23_PT2_AC_SHIFT (14U) +/*! PT2_AC - Product Term 2, Input A Configuration + * 0b00..Force input A to become 0 + * 0b01..Pass input A + * 0b10..Complement input A + * 0b11..Force input A to become 1 + */ +#define AOI_BFCRT23_PT2_AC(x) (((uint16_t)(((uint16_t)(x)) << AOI_BFCRT23_PT2_AC_SHIFT)) & AOI_BFCRT23_PT2_AC_MASK) +/*! @} */ + +/* The count of AOI_BFCRT23 */ +#define AOI_BFCRT23_COUNT (4U) + + +/*! + * @} + */ /* end of group AOI_Register_Masks */ + + +/* AOI - Peripheral instance base addresses */ +/** Peripheral AOI0 base address */ +#define AOI0_BASE (0x40089000u) +/** Peripheral AOI0 base pointer */ +#define AOI0 ((AOI_Type *)AOI0_BASE) +/** Peripheral AOI1 base address */ +#define AOI1_BASE (0x40097000u) +/** Peripheral AOI1 base pointer */ +#define AOI1 ((AOI_Type *)AOI1_BASE) +/** Array initializer of AOI peripheral base addresses */ +#define AOI_BASE_ADDRS { AOI0_BASE, AOI1_BASE } +/** Array initializer of AOI peripheral base pointers */ +#define AOI_BASE_PTRS { AOI0, AOI1 } + +/*! + * @} + */ /* end of group AOI_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- CAN Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CAN_Peripheral_Access_Layer CAN Peripheral Access Layer + * @{ + */ + +/** CAN - Register Layout Typedef */ +typedef struct { + __IO uint32_t MCR; /**< Module Configuration, offset: 0x0 */ + __IO uint32_t CTRL1; /**< Control 1, offset: 0x4 */ + __IO uint32_t TIMER; /**< Free-Running Timer, offset: 0x8 */ + uint8_t RESERVED_0[4]; + __IO uint32_t RXMGMASK; /**< RX Message Buffers Global Mask, offset: 0x10 */ + __IO uint32_t RX14MASK; /**< Receive 14 Mask, offset: 0x14 */ + __IO uint32_t RX15MASK; /**< Receive 15 Mask, offset: 0x18 */ + __IO uint32_t ECR; /**< Error Counter, offset: 0x1C */ + __IO uint32_t ESR1; /**< Error and Status 1, offset: 0x20 */ + uint8_t RESERVED_1[4]; + __IO uint32_t IMASK1; /**< Interrupt Masks 1, offset: 0x28 */ + uint8_t RESERVED_2[4]; + __IO uint32_t IFLAG1; /**< Interrupt Flags 1, offset: 0x30 */ + __IO uint32_t CTRL2; /**< Control 2, offset: 0x34 */ + __I uint32_t ESR2; /**< Error and Status 2, offset: 0x38 */ + uint8_t RESERVED_3[8]; + __I uint32_t CRCR; /**< Cyclic Redundancy Check, offset: 0x44 */ + __IO uint32_t RXFGMASK; /**< Legacy RX FIFO Global Mask, offset: 0x48 */ + __I uint32_t RXFIR; /**< Legacy RX FIFO Information, offset: 0x4C */ + __IO uint32_t CBT; /**< CAN Bit Timing, offset: 0x50 */ + uint8_t RESERVED_4[44]; + union { /* offset: 0x80 */ + struct { /* offset: 0x80, array step: 0x10 */ + __IO uint32_t CS; /**< Message Buffer 0 CS Register..Message Buffer 31 CS Register, array offset: 0x80, array step: 0x10 */ + __IO uint32_t ID; /**< Message Buffer 0 ID Register..Message Buffer 31 ID Register, array offset: 0x84, array step: 0x10 */ + __IO uint32_t WORD[2]; /**< Message Buffer 0 WORD_8B Register..Message Buffer 31 WORD_8B Register, array offset: 0x88, array step: index*0x10, index2*0x4 */ + } MB_8B[32]; + struct { /* offset: 0x80, array step: 0x18 */ + __IO uint32_t CS; /**< Message Buffer 0 CS Register..Message Buffer 20 CS Register, array offset: 0x80, array step: 0x18 */ + __IO uint32_t ID; /**< Message Buffer 0 ID Register..Message Buffer 20 ID Register, array offset: 0x84, array step: 0x18 */ + __IO uint32_t WORD[4]; /**< Message Buffer 0 WORD_16B Register..Message Buffer 20 WORD_16B Register, array offset: 0x88, array step: index*0x18, index2*0x4 */ + } MB_16B[21]; + struct { /* offset: 0x80, array step: 0x28 */ + __IO uint32_t CS; /**< Message Buffer 0 CS Register..Message Buffer 11 CS Register, array offset: 0x80, array step: 0x28 */ + __IO uint32_t ID; /**< Message Buffer 0 ID Register..Message Buffer 11 ID Register, array offset: 0x84, array step: 0x28 */ + __IO uint32_t WORD[8]; /**< Message Buffer 0 WORD_32B Register..Message Buffer 11 WORD_32B Register, array offset: 0x88, array step: index*0x28, index2*0x4 */ + } MB_32B[12]; + struct { /* offset: 0x80, array step: 0x48 */ + __IO uint32_t CS; /**< Message Buffer 0 CS Register..Message Buffer 6 CS Register, array offset: 0x80, array step: 0x48 */ + __IO uint32_t ID; /**< Message Buffer 0 ID Register..Message Buffer 6 ID Register, array offset: 0x84, array step: 0x48 */ + __IO uint32_t WORD[16]; /**< Message Buffer 0 WORD_64B Register..Message Buffer 6 WORD_64B Register, array offset: 0x88, array step: index*0x48, index2*0x4 */ + } MB_64B[7]; + struct { /* offset: 0x80, array step: 0x10 */ + __IO uint32_t CS; /**< Message Buffer 0 CS Register..Message Buffer 31 CS Register, array offset: 0x80, array step: 0x10 */ + __IO uint32_t ID; /**< Message Buffer 0 ID Register..Message Buffer 31 ID Register, array offset: 0x84, array step: 0x10 */ + __IO uint32_t WORD0; /**< Message Buffer 0 WORD0 Register..Message Buffer 31 WORD0 Register, array offset: 0x88, array step: 0x10 */ + __IO uint32_t WORD1; /**< Message Buffer 0 WORD1 Register..Message Buffer 31 WORD1 Register, array offset: 0x8C, array step: 0x10 */ + } MB[32]; + }; + uint8_t RESERVED_5[1536]; + __IO uint32_t RXIMR[32]; /**< Receive Individual Mask, array offset: 0x880, array step: 0x4 */ + uint8_t RESERVED_6[512]; + __IO uint32_t CTRL1_PN; /**< Pretended Networking Control 1, offset: 0xB00 */ + __IO uint32_t CTRL2_PN; /**< Pretended Networking Control 2, offset: 0xB04 */ + __IO uint32_t WU_MTC; /**< Pretended Networking Wake-Up Match, offset: 0xB08 */ + __IO uint32_t FLT_ID1; /**< Pretended Networking ID Filter 1, offset: 0xB0C */ + __IO uint32_t FLT_DLC; /**< Pretended Networking Data Length Code (DLC) Filter, offset: 0xB10 */ + __IO uint32_t PL1_LO; /**< Pretended Networking Payload Low Filter 1, offset: 0xB14 */ + __IO uint32_t PL1_HI; /**< Pretended Networking Payload High Filter 1, offset: 0xB18 */ + __IO uint32_t FLT_ID2_IDMASK; /**< Pretended Networking ID Filter 2 or ID Mask, offset: 0xB1C */ + __IO uint32_t PL2_PLMASK_LO; /**< Pretended Networking Payload Low Filter 2 and Payload Low Mask, offset: 0xB20 */ + __IO uint32_t PL2_PLMASK_HI; /**< Pretended Networking Payload High Filter 2 and Payload High Mask, offset: 0xB24 */ + uint8_t RESERVED_7[24]; + struct { /* offset: 0xB40, array step: 0x10 */ + __I uint32_t CS; /**< Wake-Up Message Buffer, array offset: 0xB40, array step: 0x10 */ + __I uint32_t ID; /**< Wake-Up Message Buffer for ID, array offset: 0xB44, array step: 0x10 */ + __I uint32_t D03; /**< Wake-Up Message Buffer for Data 0-3, array offset: 0xB48, array step: 0x10 */ + __I uint32_t D47; /**< Wake-Up Message Buffer Register Data 4-7, array offset: 0xB4C, array step: 0x10 */ + } WMB[4]; + uint8_t RESERVED_8[112]; + __IO uint32_t EPRS; /**< Enhanced CAN Bit Timing Prescalers, offset: 0xBF0 */ + __IO uint32_t ENCBT; /**< Enhanced Nominal CAN Bit Timing, offset: 0xBF4 */ + __IO uint32_t EDCBT; /**< Enhanced Data Phase CAN Bit Timing, offset: 0xBF8 */ + __IO uint32_t ETDC; /**< Enhanced Transceiver Delay Compensation, offset: 0xBFC */ + __IO uint32_t FDCTRL; /**< CAN FD Control, offset: 0xC00 */ + __IO uint32_t FDCBT; /**< CAN FD Bit Timing, offset: 0xC04 */ + __I uint32_t FDCRC; /**< CAN FD CRC, offset: 0xC08 */ + __IO uint32_t ERFCR; /**< Enhanced RX FIFO Control, offset: 0xC0C */ + __IO uint32_t ERFIER; /**< Enhanced RX FIFO Interrupt Enable, offset: 0xC10 */ + __IO uint32_t ERFSR; /**< Enhanced RX FIFO Status, offset: 0xC14 */ + uint8_t RESERVED_9[9192]; + __IO uint32_t ERFFEL[32]; /**< Enhanced RX FIFO Filter Element, array offset: 0x3000, array step: 0x4 */ +} CAN_Type; + +/* ---------------------------------------------------------------------------- + -- CAN Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CAN_Register_Masks CAN Register Masks + * @{ + */ + +/*! @name MCR - Module Configuration */ +/*! @{ */ + +#define CAN_MCR_MAXMB_MASK (0x7FU) +#define CAN_MCR_MAXMB_SHIFT (0U) +/*! MAXMB - Number of the Last Message Buffer */ +#define CAN_MCR_MAXMB(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_MAXMB_SHIFT)) & CAN_MCR_MAXMB_MASK) + +#define CAN_MCR_IDAM_MASK (0x300U) +#define CAN_MCR_IDAM_SHIFT (8U) +/*! IDAM - ID Acceptance Mode + * 0b00..Format A: One full ID (standard and extended) per ID filter table element. + * 0b01..Format B: Two full standard IDs or two partial 14-bit (standard and extended) IDs per ID filter table element. + * 0b10..Format C: Four partial 8-bit standard IDs per ID filter table element. + * 0b11..Format D: All frames rejected. + */ +#define CAN_MCR_IDAM(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_IDAM_SHIFT)) & CAN_MCR_IDAM_MASK) + +#define CAN_MCR_FDEN_MASK (0x800U) +#define CAN_MCR_FDEN_SHIFT (11U) +/*! FDEN - CAN FD Operation Enable + * 0b1..Enable + * 0b0..Disable + */ +#define CAN_MCR_FDEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_FDEN_SHIFT)) & CAN_MCR_FDEN_MASK) + +#define CAN_MCR_AEN_MASK (0x1000U) +#define CAN_MCR_AEN_SHIFT (12U) +/*! AEN - Abort Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define CAN_MCR_AEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_AEN_SHIFT)) & CAN_MCR_AEN_MASK) + +#define CAN_MCR_LPRIOEN_MASK (0x2000U) +#define CAN_MCR_LPRIOEN_SHIFT (13U) +/*! LPRIOEN - Local Priority Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_LPRIOEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_LPRIOEN_SHIFT)) & CAN_MCR_LPRIOEN_MASK) + +#define CAN_MCR_PNET_EN_MASK (0x4000U) +#define CAN_MCR_PNET_EN_SHIFT (14U) +/*! PNET_EN - Pretended Networking Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_PNET_EN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_PNET_EN_SHIFT)) & CAN_MCR_PNET_EN_MASK) + +#define CAN_MCR_DMA_MASK (0x8000U) +#define CAN_MCR_DMA_SHIFT (15U) +/*! DMA - DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_DMA(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_DMA_SHIFT)) & CAN_MCR_DMA_MASK) + +#define CAN_MCR_IRMQ_MASK (0x10000U) +#define CAN_MCR_IRMQ_SHIFT (16U) +/*! IRMQ - Individual RX Masking and Queue Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_IRMQ(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_IRMQ_SHIFT)) & CAN_MCR_IRMQ_MASK) + +#define CAN_MCR_SRXDIS_MASK (0x20000U) +#define CAN_MCR_SRXDIS_SHIFT (17U) +/*! SRXDIS - Self-Reception Disable + * 0b0..Enable + * 0b1..Disable + */ +#define CAN_MCR_SRXDIS(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_SRXDIS_SHIFT)) & CAN_MCR_SRXDIS_MASK) + +#define CAN_MCR_DOZE_MASK (0x40000U) +#define CAN_MCR_DOZE_SHIFT (18U) +/*! DOZE - Doze Mode Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_DOZE(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_DOZE_SHIFT)) & CAN_MCR_DOZE_MASK) + +#define CAN_MCR_WAKSRC_MASK (0x80000U) +#define CAN_MCR_WAKSRC_SHIFT (19U) +/*! WAKSRC - Wake-Up Source + * 0b0..No filter applied + * 0b1..Filter applied + */ +#define CAN_MCR_WAKSRC(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_WAKSRC_SHIFT)) & CAN_MCR_WAKSRC_MASK) + +#define CAN_MCR_LPMACK_MASK (0x100000U) +#define CAN_MCR_LPMACK_SHIFT (20U) +/*! LPMACK - Low-Power Mode Acknowledge + * 0b0..Not in a low-power mode + * 0b1..In a low-power mode + */ +#define CAN_MCR_LPMACK(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_LPMACK_SHIFT)) & CAN_MCR_LPMACK_MASK) + +#define CAN_MCR_WRNEN_MASK (0x200000U) +#define CAN_MCR_WRNEN_SHIFT (21U) +/*! WRNEN - Warning Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_WRNEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_WRNEN_SHIFT)) & CAN_MCR_WRNEN_MASK) + +#define CAN_MCR_SLFWAK_MASK (0x400000U) +#define CAN_MCR_SLFWAK_SHIFT (22U) +/*! SLFWAK - Self Wake-up + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_SLFWAK(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_SLFWAK_SHIFT)) & CAN_MCR_SLFWAK_MASK) + +#define CAN_MCR_FRZACK_MASK (0x1000000U) +#define CAN_MCR_FRZACK_SHIFT (24U) +/*! FRZACK - Freeze Mode Acknowledge + * 0b0..Not in Freeze mode, prescaler running. + * 0b1..In Freeze mode, prescaler stopped. + */ +#define CAN_MCR_FRZACK(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_FRZACK_SHIFT)) & CAN_MCR_FRZACK_MASK) + +#define CAN_MCR_SOFTRST_MASK (0x2000000U) +#define CAN_MCR_SOFTRST_SHIFT (25U) +/*! SOFTRST - Soft Reset + * 0b0..No reset + * 0b1..Soft reset affects reset registers + */ +#define CAN_MCR_SOFTRST(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_SOFTRST_SHIFT)) & CAN_MCR_SOFTRST_MASK) + +#define CAN_MCR_WAKMSK_MASK (0x4000000U) +#define CAN_MCR_WAKMSK_SHIFT (26U) +/*! WAKMSK - Wake-up Interrupt Mask + * 0b0..Disabled + * 0b1..Enabled + */ +#define CAN_MCR_WAKMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_WAKMSK_SHIFT)) & CAN_MCR_WAKMSK_MASK) + +#define CAN_MCR_NOTRDY_MASK (0x8000000U) +#define CAN_MCR_NOTRDY_SHIFT (27U) +/*! NOTRDY - FlexCAN Not Ready + * 0b0..FlexCAN is in Normal mode, Listen-Only mode, or Loopback mode. + * 0b1..FlexCAN is in Disable mode, Doze mode, Stop mode, or Freeze mode. + */ +#define CAN_MCR_NOTRDY(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_NOTRDY_SHIFT)) & CAN_MCR_NOTRDY_MASK) + +#define CAN_MCR_HALT_MASK (0x10000000U) +#define CAN_MCR_HALT_SHIFT (28U) +/*! HALT - Halt FlexCAN + * 0b0..No request + * 0b1..Enter Freeze mode, if MCR[FRZ] = 1. + */ +#define CAN_MCR_HALT(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_HALT_SHIFT)) & CAN_MCR_HALT_MASK) + +#define CAN_MCR_RFEN_MASK (0x20000000U) +#define CAN_MCR_RFEN_SHIFT (29U) +/*! RFEN - Legacy RX FIFO Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_RFEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_RFEN_SHIFT)) & CAN_MCR_RFEN_MASK) + +#define CAN_MCR_FRZ_MASK (0x40000000U) +#define CAN_MCR_FRZ_SHIFT (30U) +/*! FRZ - Freeze Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_MCR_FRZ(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_FRZ_SHIFT)) & CAN_MCR_FRZ_MASK) + +#define CAN_MCR_MDIS_MASK (0x80000000U) +#define CAN_MCR_MDIS_SHIFT (31U) +/*! MDIS - Module Disable + * 0b0..Enable + * 0b1..Disable + */ +#define CAN_MCR_MDIS(x) (((uint32_t)(((uint32_t)(x)) << CAN_MCR_MDIS_SHIFT)) & CAN_MCR_MDIS_MASK) +/*! @} */ + +/*! @name CTRL1 - Control 1 */ +/*! @{ */ + +#define CAN_CTRL1_PROPSEG_MASK (0x7U) +#define CAN_CTRL1_PROPSEG_SHIFT (0U) +/*! PROPSEG - Propagation Segment */ +#define CAN_CTRL1_PROPSEG(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PROPSEG_SHIFT)) & CAN_CTRL1_PROPSEG_MASK) + +#define CAN_CTRL1_LOM_MASK (0x8U) +#define CAN_CTRL1_LOM_SHIFT (3U) +/*! LOM - Listen-Only Mode + * 0b0..Listen-Only mode is deactivated. + * 0b1..FlexCAN module operates in Listen-Only mode. + */ +#define CAN_CTRL1_LOM(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_LOM_SHIFT)) & CAN_CTRL1_LOM_MASK) + +#define CAN_CTRL1_LBUF_MASK (0x10U) +#define CAN_CTRL1_LBUF_SHIFT (4U) +/*! LBUF - Lowest Buffer Transmitted First + * 0b0..Buffer with highest priority is transmitted first. + * 0b1..Lowest number buffer is transmitted first. + */ +#define CAN_CTRL1_LBUF(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_LBUF_SHIFT)) & CAN_CTRL1_LBUF_MASK) + +#define CAN_CTRL1_TSYN_MASK (0x20U) +#define CAN_CTRL1_TSYN_SHIFT (5U) +/*! TSYN - Timer Sync + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CTRL1_TSYN(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_TSYN_SHIFT)) & CAN_CTRL1_TSYN_MASK) + +#define CAN_CTRL1_BOFFREC_MASK (0x40U) +#define CAN_CTRL1_BOFFREC_SHIFT (6U) +/*! BOFFREC - Bus Off Recovery + * 0b0..Enabled + * 0b1..Disabled + */ +#define CAN_CTRL1_BOFFREC(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_BOFFREC_SHIFT)) & CAN_CTRL1_BOFFREC_MASK) + +#define CAN_CTRL1_SMP_MASK (0x80U) +#define CAN_CTRL1_SMP_SHIFT (7U) +/*! SMP - CAN Bit Sampling + * 0b0..One sample is used to determine the bit value. + * 0b1..Three samples are used to determine the value of the received bit: the regular one (sample point) and two + * preceding samples. A majority rule is used. + */ +#define CAN_CTRL1_SMP(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_SMP_SHIFT)) & CAN_CTRL1_SMP_MASK) + +#define CAN_CTRL1_RWRNMSK_MASK (0x400U) +#define CAN_CTRL1_RWRNMSK_SHIFT (10U) +/*! RWRNMSK - RX Warning Interrupt Mask + * 0b0..Disabled + * 0b1..Enabled + */ +#define CAN_CTRL1_RWRNMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_RWRNMSK_SHIFT)) & CAN_CTRL1_RWRNMSK_MASK) + +#define CAN_CTRL1_TWRNMSK_MASK (0x800U) +#define CAN_CTRL1_TWRNMSK_SHIFT (11U) +/*! TWRNMSK - TX Warning Interrupt Mask + * 0b0..Disabled + * 0b1..Enabled + */ +#define CAN_CTRL1_TWRNMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_TWRNMSK_SHIFT)) & CAN_CTRL1_TWRNMSK_MASK) + +#define CAN_CTRL1_LPB_MASK (0x1000U) +#define CAN_CTRL1_LPB_SHIFT (12U) +/*! LPB - Loopback Mode + * 0b0..Disabled + * 0b1..Enabled + */ +#define CAN_CTRL1_LPB(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_LPB_SHIFT)) & CAN_CTRL1_LPB_MASK) + +#define CAN_CTRL1_ERRMSK_MASK (0x4000U) +#define CAN_CTRL1_ERRMSK_SHIFT (14U) +/*! ERRMSK - Error Interrupt Mask + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CAN_CTRL1_ERRMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_ERRMSK_SHIFT)) & CAN_CTRL1_ERRMSK_MASK) + +#define CAN_CTRL1_BOFFMSK_MASK (0x8000U) +#define CAN_CTRL1_BOFFMSK_SHIFT (15U) +/*! BOFFMSK - Bus Off Interrupt Mask + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CAN_CTRL1_BOFFMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_BOFFMSK_SHIFT)) & CAN_CTRL1_BOFFMSK_MASK) + +#define CAN_CTRL1_PSEG2_MASK (0x70000U) +#define CAN_CTRL1_PSEG2_SHIFT (16U) +/*! PSEG2 - Phase Segment 2 */ +#define CAN_CTRL1_PSEG2(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PSEG2_SHIFT)) & CAN_CTRL1_PSEG2_MASK) + +#define CAN_CTRL1_PSEG1_MASK (0x380000U) +#define CAN_CTRL1_PSEG1_SHIFT (19U) +/*! PSEG1 - Phase Segment 1 */ +#define CAN_CTRL1_PSEG1(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PSEG1_SHIFT)) & CAN_CTRL1_PSEG1_MASK) + +#define CAN_CTRL1_RJW_MASK (0xC00000U) +#define CAN_CTRL1_RJW_SHIFT (22U) +/*! RJW - Resync Jump Width */ +#define CAN_CTRL1_RJW(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_RJW_SHIFT)) & CAN_CTRL1_RJW_MASK) + +#define CAN_CTRL1_PRESDIV_MASK (0xFF000000U) +#define CAN_CTRL1_PRESDIV_SHIFT (24U) +/*! PRESDIV - Prescaler Division Factor */ +#define CAN_CTRL1_PRESDIV(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PRESDIV_SHIFT)) & CAN_CTRL1_PRESDIV_MASK) +/*! @} */ + +/*! @name TIMER - Free-Running Timer */ +/*! @{ */ + +#define CAN_TIMER_TIMER_MASK (0xFFFFU) +#define CAN_TIMER_TIMER_SHIFT (0U) +/*! TIMER - Timer Value */ +#define CAN_TIMER_TIMER(x) (((uint32_t)(((uint32_t)(x)) << CAN_TIMER_TIMER_SHIFT)) & CAN_TIMER_TIMER_MASK) +/*! @} */ + +/*! @name RXMGMASK - RX Message Buffers Global Mask */ +/*! @{ */ + +#define CAN_RXMGMASK_MG_MASK (0xFFFFFFFFU) +#define CAN_RXMGMASK_MG_SHIFT (0U) +/*! MG - Global Mask for RX Message Buffers */ +#define CAN_RXMGMASK_MG(x) (((uint32_t)(((uint32_t)(x)) << CAN_RXMGMASK_MG_SHIFT)) & CAN_RXMGMASK_MG_MASK) +/*! @} */ + +/*! @name RX14MASK - Receive 14 Mask */ +/*! @{ */ + +#define CAN_RX14MASK_RX14M_MASK (0xFFFFFFFFU) +#define CAN_RX14MASK_RX14M_SHIFT (0U) +/*! RX14M - RX Buffer 14 Mask Bits */ +#define CAN_RX14MASK_RX14M(x) (((uint32_t)(((uint32_t)(x)) << CAN_RX14MASK_RX14M_SHIFT)) & CAN_RX14MASK_RX14M_MASK) +/*! @} */ + +/*! @name RX15MASK - Receive 15 Mask */ +/*! @{ */ + +#define CAN_RX15MASK_RX15M_MASK (0xFFFFFFFFU) +#define CAN_RX15MASK_RX15M_SHIFT (0U) +/*! RX15M - RX Buffer 15 Mask Bits */ +#define CAN_RX15MASK_RX15M(x) (((uint32_t)(((uint32_t)(x)) << CAN_RX15MASK_RX15M_SHIFT)) & CAN_RX15MASK_RX15M_MASK) +/*! @} */ + +/*! @name ECR - Error Counter */ +/*! @{ */ + +#define CAN_ECR_TXERRCNT_MASK (0xFFU) +#define CAN_ECR_TXERRCNT_SHIFT (0U) +/*! TXERRCNT - Transmit Error Counter */ +#define CAN_ECR_TXERRCNT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ECR_TXERRCNT_SHIFT)) & CAN_ECR_TXERRCNT_MASK) + +#define CAN_ECR_RXERRCNT_MASK (0xFF00U) +#define CAN_ECR_RXERRCNT_SHIFT (8U) +/*! RXERRCNT - Receive Error Counter */ +#define CAN_ECR_RXERRCNT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ECR_RXERRCNT_SHIFT)) & CAN_ECR_RXERRCNT_MASK) + +#define CAN_ECR_TXERRCNT_FAST_MASK (0xFF0000U) +#define CAN_ECR_TXERRCNT_FAST_SHIFT (16U) +/*! TXERRCNT_FAST - Transmit Error Counter for Fast Bits */ +#define CAN_ECR_TXERRCNT_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_ECR_TXERRCNT_FAST_SHIFT)) & CAN_ECR_TXERRCNT_FAST_MASK) + +#define CAN_ECR_RXERRCNT_FAST_MASK (0xFF000000U) +#define CAN_ECR_RXERRCNT_FAST_SHIFT (24U) +/*! RXERRCNT_FAST - Receive Error Counter for Fast Bits */ +#define CAN_ECR_RXERRCNT_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_ECR_RXERRCNT_FAST_SHIFT)) & CAN_ECR_RXERRCNT_FAST_MASK) +/*! @} */ + +/*! @name ESR1 - Error and Status 1 */ +/*! @{ */ + +#define CAN_ESR1_WAKINT_MASK (0x1U) +#define CAN_ESR1_WAKINT_SHIFT (0U) +/*! WAKINT - Wake-up Interrupt Flag + * 0b0..No such occurrence. + * 0b1..Indicates that a recessive-to-dominant transition was received on the CAN bus. + */ +#define CAN_ESR1_WAKINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_WAKINT_SHIFT)) & CAN_ESR1_WAKINT_MASK) + +#define CAN_ESR1_ERRINT_MASK (0x2U) +#define CAN_ESR1_ERRINT_SHIFT (1U) +/*! ERRINT - Error Interrupt Flag + * 0b0..No such occurrence. + * 0b1..Indicates setting of any error flag in the Error and Status register. + */ +#define CAN_ESR1_ERRINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_ERRINT_SHIFT)) & CAN_ESR1_ERRINT_MASK) + +#define CAN_ESR1_BOFFINT_MASK (0x4U) +#define CAN_ESR1_BOFFINT_SHIFT (2U) +/*! BOFFINT - Bus Off Interrupt Flag + * 0b0..No such occurrence. + * 0b1..FlexCAN module entered Bus Off state. + */ +#define CAN_ESR1_BOFFINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BOFFINT_SHIFT)) & CAN_ESR1_BOFFINT_MASK) + +#define CAN_ESR1_RX_MASK (0x8U) +#define CAN_ESR1_RX_SHIFT (3U) +/*! RX - FlexCAN in Reception Flag + * 0b0..Not receiving + * 0b1..Receiving + */ +#define CAN_ESR1_RX(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_RX_SHIFT)) & CAN_ESR1_RX_MASK) + +#define CAN_ESR1_FLTCONF_MASK (0x30U) +#define CAN_ESR1_FLTCONF_SHIFT (4U) +/*! FLTCONF - Fault Confinement State + * 0b00..Error Active + * 0b01..Error Passive + * 0b1x..Bus Off + */ +#define CAN_ESR1_FLTCONF(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_FLTCONF_SHIFT)) & CAN_ESR1_FLTCONF_MASK) + +#define CAN_ESR1_TX_MASK (0x40U) +#define CAN_ESR1_TX_SHIFT (6U) +/*! TX - FlexCAN In Transmission + * 0b0..Not transmitting + * 0b1..Transmitting + */ +#define CAN_ESR1_TX(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_TX_SHIFT)) & CAN_ESR1_TX_MASK) + +#define CAN_ESR1_IDLE_MASK (0x80U) +#define CAN_ESR1_IDLE_SHIFT (7U) +/*! IDLE - Idle + * 0b0..Not IDLE + * 0b1..IDLE + */ +#define CAN_ESR1_IDLE(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_IDLE_SHIFT)) & CAN_ESR1_IDLE_MASK) + +#define CAN_ESR1_RXWRN_MASK (0x100U) +#define CAN_ESR1_RXWRN_SHIFT (8U) +/*! RXWRN - RX Error Warning Flag + * 0b0..No such occurrence. + * 0b1..RXERRCNT is greater than or equal to 96. + */ +#define CAN_ESR1_RXWRN(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_RXWRN_SHIFT)) & CAN_ESR1_RXWRN_MASK) + +#define CAN_ESR1_TXWRN_MASK (0x200U) +#define CAN_ESR1_TXWRN_SHIFT (9U) +/*! TXWRN - TX Error Warning Flag + * 0b0..No such occurrence. + * 0b1..TXERRCNT is 96 or greater. + */ +#define CAN_ESR1_TXWRN(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_TXWRN_SHIFT)) & CAN_ESR1_TXWRN_MASK) + +#define CAN_ESR1_STFERR_MASK (0x400U) +#define CAN_ESR1_STFERR_SHIFT (10U) +/*! STFERR - Stuffing Error Flag + * 0b0..No error + * 0b1..Error occurred since last read of this register. + */ +#define CAN_ESR1_STFERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_STFERR_SHIFT)) & CAN_ESR1_STFERR_MASK) + +#define CAN_ESR1_FRMERR_MASK (0x800U) +#define CAN_ESR1_FRMERR_SHIFT (11U) +/*! FRMERR - Form Error Flag + * 0b0..No error + * 0b1..Error occurred since last read of this register. + */ +#define CAN_ESR1_FRMERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_FRMERR_SHIFT)) & CAN_ESR1_FRMERR_MASK) + +#define CAN_ESR1_CRCERR_MASK (0x1000U) +#define CAN_ESR1_CRCERR_SHIFT (12U) +/*! CRCERR - Cyclic Redundancy Check Error Flag + * 0b0..No error + * 0b1..Error occurred since last read of this register. + */ +#define CAN_ESR1_CRCERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_CRCERR_SHIFT)) & CAN_ESR1_CRCERR_MASK) + +#define CAN_ESR1_ACKERR_MASK (0x2000U) +#define CAN_ESR1_ACKERR_SHIFT (13U) +/*! ACKERR - Acknowledge Error Flag + * 0b0..No error + * 0b1..Error occurred since last read of this register. + */ +#define CAN_ESR1_ACKERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_ACKERR_SHIFT)) & CAN_ESR1_ACKERR_MASK) + +#define CAN_ESR1_BIT0ERR_MASK (0x4000U) +#define CAN_ESR1_BIT0ERR_SHIFT (14U) +/*! BIT0ERR - Bit0 Error Flag + * 0b0..No such occurrence. + * 0b1..At least one bit sent as dominant is received as recessive. + */ +#define CAN_ESR1_BIT0ERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BIT0ERR_SHIFT)) & CAN_ESR1_BIT0ERR_MASK) + +#define CAN_ESR1_BIT1ERR_MASK (0x8000U) +#define CAN_ESR1_BIT1ERR_SHIFT (15U) +/*! BIT1ERR - Bit1 Error Flag + * 0b0..No such occurrence. + * 0b1..At least one bit sent as recessive is received as dominant. + */ +#define CAN_ESR1_BIT1ERR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BIT1ERR_SHIFT)) & CAN_ESR1_BIT1ERR_MASK) + +#define CAN_ESR1_RWRNINT_MASK (0x10000U) +#define CAN_ESR1_RWRNINT_SHIFT (16U) +/*! RWRNINT - RX Warning Interrupt Flag + * 0b0..No such occurrence + * 0b1..RX error counter changed from less than 96 to greater than or equal to 96. + */ +#define CAN_ESR1_RWRNINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_RWRNINT_SHIFT)) & CAN_ESR1_RWRNINT_MASK) + +#define CAN_ESR1_TWRNINT_MASK (0x20000U) +#define CAN_ESR1_TWRNINT_SHIFT (17U) +/*! TWRNINT - TX Warning Interrupt Flag + * 0b0..No such occurrence + * 0b1..TX error counter changed from less than 96 to greater than or equal to 96. + */ +#define CAN_ESR1_TWRNINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_TWRNINT_SHIFT)) & CAN_ESR1_TWRNINT_MASK) + +#define CAN_ESR1_SYNCH_MASK (0x40000U) +#define CAN_ESR1_SYNCH_SHIFT (18U) +/*! SYNCH - CAN Synchronization Status Flag + * 0b0..Not synchronized + * 0b1..Synchronized + */ +#define CAN_ESR1_SYNCH(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_SYNCH_SHIFT)) & CAN_ESR1_SYNCH_MASK) + +#define CAN_ESR1_BOFFDONEINT_MASK (0x80000U) +#define CAN_ESR1_BOFFDONEINT_SHIFT (19U) +/*! BOFFDONEINT - Bus Off Done Interrupt Flag + * 0b0..No such occurrence + * 0b1..FlexCAN module has completed Bus Off process. + */ +#define CAN_ESR1_BOFFDONEINT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BOFFDONEINT_SHIFT)) & CAN_ESR1_BOFFDONEINT_MASK) + +#define CAN_ESR1_ERRINT_FAST_MASK (0x100000U) +#define CAN_ESR1_ERRINT_FAST_SHIFT (20U) +/*! ERRINT_FAST - Fast Error Interrupt Flag + * 0b0..No such occurrence. + * 0b1..Error flag set in the data phase of CAN FD frames that have BRS = 1. + */ +#define CAN_ESR1_ERRINT_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_ERRINT_FAST_SHIFT)) & CAN_ESR1_ERRINT_FAST_MASK) + +#define CAN_ESR1_ERROVR_MASK (0x200000U) +#define CAN_ESR1_ERROVR_SHIFT (21U) +/*! ERROVR - Error Overrun Flag + * 0b0..No overrun + * 0b1..Overrun + */ +#define CAN_ESR1_ERROVR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_ERROVR_SHIFT)) & CAN_ESR1_ERROVR_MASK) + +#define CAN_ESR1_STFERR_FAST_MASK (0x4000000U) +#define CAN_ESR1_STFERR_FAST_SHIFT (26U) +/*! STFERR_FAST - Fast Stuffing Error Flag + * 0b0..No such occurrence. + * 0b1..A stuffing error occurred since last read of this register. + */ +#define CAN_ESR1_STFERR_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_STFERR_FAST_SHIFT)) & CAN_ESR1_STFERR_FAST_MASK) + +#define CAN_ESR1_FRMERR_FAST_MASK (0x8000000U) +#define CAN_ESR1_FRMERR_FAST_SHIFT (27U) +/*! FRMERR_FAST - Fast Form Error Flag + * 0b0..No such occurrence. + * 0b1..A form error occurred since last read of this register. + */ +#define CAN_ESR1_FRMERR_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_FRMERR_FAST_SHIFT)) & CAN_ESR1_FRMERR_FAST_MASK) + +#define CAN_ESR1_CRCERR_FAST_MASK (0x10000000U) +#define CAN_ESR1_CRCERR_FAST_SHIFT (28U) +/*! CRCERR_FAST - Fast Cyclic Redundancy Check Error Flag + * 0b0..No such occurrence. + * 0b1..A CRC error occurred since last read of this register. + */ +#define CAN_ESR1_CRCERR_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_CRCERR_FAST_SHIFT)) & CAN_ESR1_CRCERR_FAST_MASK) + +#define CAN_ESR1_BIT0ERR_FAST_MASK (0x40000000U) +#define CAN_ESR1_BIT0ERR_FAST_SHIFT (30U) +/*! BIT0ERR_FAST - Fast Bit0 Error Flag + * 0b0..No such occurrence. + * 0b1..At least one bit transmitted as dominant is received as recessive. + */ +#define CAN_ESR1_BIT0ERR_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BIT0ERR_FAST_SHIFT)) & CAN_ESR1_BIT0ERR_FAST_MASK) + +#define CAN_ESR1_BIT1ERR_FAST_MASK (0x80000000U) +#define CAN_ESR1_BIT1ERR_FAST_SHIFT (31U) +/*! BIT1ERR_FAST - Fast Bit1 Error Flag + * 0b0..No such occurrence. + * 0b1..At least one bit transmitted as recessive is received as dominant. + */ +#define CAN_ESR1_BIT1ERR_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR1_BIT1ERR_FAST_SHIFT)) & CAN_ESR1_BIT1ERR_FAST_MASK) +/*! @} */ + +/*! @name IMASK1 - Interrupt Masks 1 */ +/*! @{ */ + +#define CAN_IMASK1_BUF31TO0M_MASK (0xFFFFFFFFU) +#define CAN_IMASK1_BUF31TO0M_SHIFT (0U) +/*! BUF31TO0M - Buffer MBi Mask */ +#define CAN_IMASK1_BUF31TO0M(x) (((uint32_t)(((uint32_t)(x)) << CAN_IMASK1_BUF31TO0M_SHIFT)) & CAN_IMASK1_BUF31TO0M_MASK) +/*! @} */ + +/*! @name IFLAG1 - Interrupt Flags 1 */ +/*! @{ */ + +#define CAN_IFLAG1_BUF0I_MASK (0x1U) +#define CAN_IFLAG1_BUF0I_SHIFT (0U) +/*! BUF0I - Buffer MB0 Interrupt or Clear Legacy FIFO bit + * 0b0..MB0 has no occurrence of successfully completed transmission or reception. + * 0b1..MB0 has successfully completed transmission or reception. + */ +#define CAN_IFLAG1_BUF0I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF0I_SHIFT)) & CAN_IFLAG1_BUF0I_MASK) + +#define CAN_IFLAG1_BUF4TO1I_MASK (0x1EU) +#define CAN_IFLAG1_BUF4TO1I_SHIFT (1U) +/*! BUF4TO1I - Buffer MBi Interrupt or Reserved */ +#define CAN_IFLAG1_BUF4TO1I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF4TO1I_SHIFT)) & CAN_IFLAG1_BUF4TO1I_MASK) + +#define CAN_IFLAG1_BUF5I_MASK (0x20U) +#define CAN_IFLAG1_BUF5I_SHIFT (5U) +/*! BUF5I - Buffer MB5 Interrupt or Frames available in Legacy RX FIFO + * 0b0..No occurrence of completed transmission or reception, or no frames available + * 0b1..MB5 completed transmission or reception, or frames available + */ +#define CAN_IFLAG1_BUF5I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF5I_SHIFT)) & CAN_IFLAG1_BUF5I_MASK) + +#define CAN_IFLAG1_BUF6I_MASK (0x40U) +#define CAN_IFLAG1_BUF6I_SHIFT (6U) +/*! BUF6I - Buffer MB6 Interrupt or Legacy RX FIFO Warning + * 0b0..No occurrence of MB6 completing transmission or reception, or FIFO not almost full. + * 0b1..MB6 completed transmission or reception, or FIFO almost full. + */ +#define CAN_IFLAG1_BUF6I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF6I_SHIFT)) & CAN_IFLAG1_BUF6I_MASK) + +#define CAN_IFLAG1_BUF7I_MASK (0x80U) +#define CAN_IFLAG1_BUF7I_SHIFT (7U) +/*! BUF7I - Buffer MB7 Interrupt or Legacy RX FIFO Overflow + * 0b0..No occurrence of MB7 completing transmission or reception, or no FIFO overflow. + * 0b1..MB7 completed transmission or reception, or FIFO overflow. + */ +#define CAN_IFLAG1_BUF7I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF7I_SHIFT)) & CAN_IFLAG1_BUF7I_MASK) + +#define CAN_IFLAG1_BUF31TO8I_MASK (0xFFFFFF00U) +#define CAN_IFLAG1_BUF31TO8I_SHIFT (8U) +/*! BUF31TO8I - Buffer MBi Interrupt */ +#define CAN_IFLAG1_BUF31TO8I(x) (((uint32_t)(((uint32_t)(x)) << CAN_IFLAG1_BUF31TO8I_SHIFT)) & CAN_IFLAG1_BUF31TO8I_MASK) +/*! @} */ + +/*! @name CTRL2 - Control 2 */ +/*! @{ */ + +#define CAN_CTRL2_PES_MASK (0x1U) +#define CAN_CTRL2_PES_SHIFT (0U) +/*! PES - Payload Byte and Bit Order Selection + * 0b0..Big-endian + * 0b1..Little-endian + */ +#define CAN_CTRL2_PES(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_PES_SHIFT)) & CAN_CTRL2_PES_MASK) + +#define CAN_CTRL2_ASD_MASK (0x2U) +#define CAN_CTRL2_ASD_SHIFT (1U) +/*! ASD - ACK Suppression Disable + * 0b0..Enabled + * 0b1..Disabled + */ +#define CAN_CTRL2_ASD(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_ASD_SHIFT)) & CAN_CTRL2_ASD_MASK) + +#define CAN_CTRL2_EDFLTDIS_MASK (0x800U) +#define CAN_CTRL2_EDFLTDIS_SHIFT (11U) +/*! EDFLTDIS - Edge Filter Disable + * 0b0..Enabled + * 0b1..Disabled + */ +#define CAN_CTRL2_EDFLTDIS(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_EDFLTDIS_SHIFT)) & CAN_CTRL2_EDFLTDIS_MASK) + +#define CAN_CTRL2_ISOCANFDEN_MASK (0x1000U) +#define CAN_CTRL2_ISOCANFDEN_SHIFT (12U) +/*! ISOCANFDEN - ISO CAN FD Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CTRL2_ISOCANFDEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_ISOCANFDEN_SHIFT)) & CAN_CTRL2_ISOCANFDEN_MASK) + +#define CAN_CTRL2_BTE_MASK (0x2000U) +#define CAN_CTRL2_BTE_SHIFT (13U) +/*! BTE - Bit Timing Expansion Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CTRL2_BTE(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_BTE_SHIFT)) & CAN_CTRL2_BTE_MASK) + +#define CAN_CTRL2_PREXCEN_MASK (0x4000U) +#define CAN_CTRL2_PREXCEN_SHIFT (14U) +/*! PREXCEN - Protocol Exception Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define CAN_CTRL2_PREXCEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_PREXCEN_SHIFT)) & CAN_CTRL2_PREXCEN_MASK) + +#define CAN_CTRL2_EACEN_MASK (0x10000U) +#define CAN_CTRL2_EACEN_SHIFT (16U) +/*! EACEN - Entire Frame Arbitration Field Comparison Enable for RX Message Buffers + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CTRL2_EACEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_EACEN_SHIFT)) & CAN_CTRL2_EACEN_MASK) + +#define CAN_CTRL2_RRS_MASK (0x20000U) +#define CAN_CTRL2_RRS_SHIFT (17U) +/*! RRS - Remote Request Storing + * 0b0..Generated + * 0b1..Stored + */ +#define CAN_CTRL2_RRS(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_RRS_SHIFT)) & CAN_CTRL2_RRS_MASK) + +#define CAN_CTRL2_MRP_MASK (0x40000U) +#define CAN_CTRL2_MRP_SHIFT (18U) +/*! MRP - Message Buffers Reception Priority + * 0b0..Matching starts from Legacy RX FIFO or Enhanced RX FIFO and continues on message buffers. + * 0b1..Matching starts from message buffers and continues on Legacy RX FIFO or Enhanced RX FIFO. + */ +#define CAN_CTRL2_MRP(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_MRP_SHIFT)) & CAN_CTRL2_MRP_MASK) + +#define CAN_CTRL2_TASD_MASK (0xF80000U) +#define CAN_CTRL2_TASD_SHIFT (19U) +/*! TASD - Transmission Arbitration Start Delay */ +#define CAN_CTRL2_TASD(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_TASD_SHIFT)) & CAN_CTRL2_TASD_MASK) + +#define CAN_CTRL2_RFFN_MASK (0xF000000U) +#define CAN_CTRL2_RFFN_SHIFT (24U) +/*! RFFN - Number of Legacy Receive FIFO Filters */ +#define CAN_CTRL2_RFFN(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_RFFN_SHIFT)) & CAN_CTRL2_RFFN_MASK) + +#define CAN_CTRL2_BOFFDONEMSK_MASK (0x40000000U) +#define CAN_CTRL2_BOFFDONEMSK_SHIFT (30U) +/*! BOFFDONEMSK - Bus Off Done Interrupt Mask + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CTRL2_BOFFDONEMSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_BOFFDONEMSK_SHIFT)) & CAN_CTRL2_BOFFDONEMSK_MASK) + +#define CAN_CTRL2_ERRMSK_FAST_MASK (0x80000000U) +#define CAN_CTRL2_ERRMSK_FAST_SHIFT (31U) +/*! ERRMSK_FAST - Error Interrupt Mask for Errors Detected in the Data Phase of Fast CAN FD Frames + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CTRL2_ERRMSK_FAST(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_ERRMSK_FAST_SHIFT)) & CAN_CTRL2_ERRMSK_FAST_MASK) +/*! @} */ + +/*! @name ESR2 - Error and Status 2 */ +/*! @{ */ + +#define CAN_ESR2_IMB_MASK (0x2000U) +#define CAN_ESR2_IMB_SHIFT (13U) +/*! IMB - Inactive Message Buffer + * 0b0..Message buffer indicated by ESR2[LPTM] is not inactive. + * 0b1..At least one message buffer is inactive. + */ +#define CAN_ESR2_IMB(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR2_IMB_SHIFT)) & CAN_ESR2_IMB_MASK) + +#define CAN_ESR2_VPS_MASK (0x4000U) +#define CAN_ESR2_VPS_SHIFT (14U) +/*! VPS - Valid Priority Status + * 0b0..Invalid + * 0b1..Valid + */ +#define CAN_ESR2_VPS(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR2_VPS_SHIFT)) & CAN_ESR2_VPS_MASK) + +#define CAN_ESR2_LPTM_MASK (0x7F0000U) +#define CAN_ESR2_LPTM_SHIFT (16U) +/*! LPTM - Lowest Priority TX Message Buffer */ +#define CAN_ESR2_LPTM(x) (((uint32_t)(((uint32_t)(x)) << CAN_ESR2_LPTM_SHIFT)) & CAN_ESR2_LPTM_MASK) +/*! @} */ + +/*! @name CRCR - Cyclic Redundancy Check */ +/*! @{ */ + +#define CAN_CRCR_TXCRC_MASK (0x7FFFU) +#define CAN_CRCR_TXCRC_SHIFT (0U) +/*! TXCRC - Transmitted CRC value */ +#define CAN_CRCR_TXCRC(x) (((uint32_t)(((uint32_t)(x)) << CAN_CRCR_TXCRC_SHIFT)) & CAN_CRCR_TXCRC_MASK) + +#define CAN_CRCR_MBCRC_MASK (0x7F0000U) +#define CAN_CRCR_MBCRC_SHIFT (16U) +/*! MBCRC - CRC Message Buffer */ +#define CAN_CRCR_MBCRC(x) (((uint32_t)(((uint32_t)(x)) << CAN_CRCR_MBCRC_SHIFT)) & CAN_CRCR_MBCRC_MASK) +/*! @} */ + +/*! @name RXFGMASK - Legacy RX FIFO Global Mask */ +/*! @{ */ + +#define CAN_RXFGMASK_FGM_MASK (0xFFFFFFFFU) +#define CAN_RXFGMASK_FGM_SHIFT (0U) +/*! FGM - Legacy RX FIFO Global Mask Bits */ +#define CAN_RXFGMASK_FGM(x) (((uint32_t)(((uint32_t)(x)) << CAN_RXFGMASK_FGM_SHIFT)) & CAN_RXFGMASK_FGM_MASK) +/*! @} */ + +/*! @name RXFIR - Legacy RX FIFO Information */ +/*! @{ */ + +#define CAN_RXFIR_IDHIT_MASK (0x1FFU) +#define CAN_RXFIR_IDHIT_SHIFT (0U) +/*! IDHIT - Identifier Acceptance Filter Hit Indicator */ +#define CAN_RXFIR_IDHIT(x) (((uint32_t)(((uint32_t)(x)) << CAN_RXFIR_IDHIT_SHIFT)) & CAN_RXFIR_IDHIT_MASK) +/*! @} */ + +/*! @name CBT - CAN Bit Timing */ +/*! @{ */ + +#define CAN_CBT_EPSEG2_MASK (0x1FU) +#define CAN_CBT_EPSEG2_SHIFT (0U) +/*! EPSEG2 - Extended Phase Segment 2 */ +#define CAN_CBT_EPSEG2(x) (((uint32_t)(((uint32_t)(x)) << CAN_CBT_EPSEG2_SHIFT)) & CAN_CBT_EPSEG2_MASK) + +#define CAN_CBT_EPSEG1_MASK (0x3E0U) +#define CAN_CBT_EPSEG1_SHIFT (5U) +/*! EPSEG1 - Extended Phase Segment 1 */ +#define CAN_CBT_EPSEG1(x) (((uint32_t)(((uint32_t)(x)) << CAN_CBT_EPSEG1_SHIFT)) & CAN_CBT_EPSEG1_MASK) + +#define CAN_CBT_EPROPSEG_MASK (0xFC00U) +#define CAN_CBT_EPROPSEG_SHIFT (10U) +/*! EPROPSEG - Extended Propagation Segment */ +#define CAN_CBT_EPROPSEG(x) (((uint32_t)(((uint32_t)(x)) << CAN_CBT_EPROPSEG_SHIFT)) & CAN_CBT_EPROPSEG_MASK) + +#define CAN_CBT_ERJW_MASK (0x1F0000U) +#define CAN_CBT_ERJW_SHIFT (16U) +/*! ERJW - Extended Resync Jump Width */ +#define CAN_CBT_ERJW(x) (((uint32_t)(((uint32_t)(x)) << CAN_CBT_ERJW_SHIFT)) & CAN_CBT_ERJW_MASK) + +#define CAN_CBT_EPRESDIV_MASK (0x7FE00000U) +#define CAN_CBT_EPRESDIV_SHIFT (21U) +/*! EPRESDIV - Extended Prescaler Division Factor */ +#define CAN_CBT_EPRESDIV(x) (((uint32_t)(((uint32_t)(x)) << CAN_CBT_EPRESDIV_SHIFT)) & CAN_CBT_EPRESDIV_MASK) + +#define CAN_CBT_BTF_MASK (0x80000000U) +#define CAN_CBT_BTF_SHIFT (31U) +/*! BTF - Bit Timing Format Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CBT_BTF(x) (((uint32_t)(((uint32_t)(x)) << CAN_CBT_BTF_SHIFT)) & CAN_CBT_BTF_MASK) +/*! @} */ + +/* The count of CAN_CS */ +#define CAN_CS_COUNT_MB8B (32U) + +/* The count of CAN_ID */ +#define CAN_ID_COUNT_MB8B (32U) + +/* The count of CAN_WORD */ +#define CAN_WORD_COUNT_MB8B (32U) + +/* The count of CAN_WORD */ +#define CAN_WORD_COUNT_MB8B2 (2U) + +/* The count of CAN_CS */ +#define CAN_CS_COUNT_MB16B (21U) + +/* The count of CAN_ID */ +#define CAN_ID_COUNT_MB16B (21U) + +/* The count of CAN_WORD */ +#define CAN_WORD_COUNT_MB16B (21U) + +/* The count of CAN_WORD */ +#define CAN_WORD_COUNT_MB16B2 (4U) + +/* The count of CAN_CS */ +#define CAN_CS_COUNT_MB32B (12U) + +/* The count of CAN_ID */ +#define CAN_ID_COUNT_MB32B (12U) + +/* The count of CAN_WORD */ +#define CAN_WORD_COUNT_MB32B (12U) + +/* The count of CAN_WORD */ +#define CAN_WORD_COUNT_MB32B2 (8U) + +/*! @name CS - Message Buffer 0 CS Register..Message Buffer 6 CS Register */ +/*! @{ */ + +#define CAN_CS_TIME_STAMP_MASK (0xFFFFU) +#define CAN_CS_TIME_STAMP_SHIFT (0U) +/*! TIME_STAMP - Free-Running Counter Time stamp. This 16-bit field is a copy of the Free-Running + * Timer, captured for Tx and Rx frames at the time when the beginning of the Identifier field + * appears on the CAN bus. + */ +#define CAN_CS_TIME_STAMP(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_TIME_STAMP_SHIFT)) & CAN_CS_TIME_STAMP_MASK) + +#define CAN_CS_DLC_MASK (0xF0000U) +#define CAN_CS_DLC_SHIFT (16U) +/*! DLC - Length of the data to be stored/transmitted. */ +#define CAN_CS_DLC(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_DLC_SHIFT)) & CAN_CS_DLC_MASK) + +#define CAN_CS_RTR_MASK (0x100000U) +#define CAN_CS_RTR_SHIFT (20U) +/*! RTR - Remote Transmission Request. One/zero for remote/data frame. */ +#define CAN_CS_RTR(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_RTR_SHIFT)) & CAN_CS_RTR_MASK) + +#define CAN_CS_IDE_MASK (0x200000U) +#define CAN_CS_IDE_SHIFT (21U) +/*! IDE - ID Extended. One/zero for extended/standard format frame. */ +#define CAN_CS_IDE(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_IDE_SHIFT)) & CAN_CS_IDE_MASK) + +#define CAN_CS_SRR_MASK (0x400000U) +#define CAN_CS_SRR_SHIFT (22U) +/*! SRR - Substitute Remote Request. Contains a fixed recessive bit. */ +#define CAN_CS_SRR(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_SRR_SHIFT)) & CAN_CS_SRR_MASK) + +#define CAN_CS_CODE_MASK (0xF000000U) +#define CAN_CS_CODE_SHIFT (24U) +/*! CODE - Message Buffer Code. This 4-bit field can be accessed (read or write) by the CPU and by + * the FlexCAN module itself, as part of the message buffer matching and arbitration process. + */ +#define CAN_CS_CODE(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_CODE_SHIFT)) & CAN_CS_CODE_MASK) + +#define CAN_CS_ESI_MASK (0x20000000U) +#define CAN_CS_ESI_SHIFT (29U) +/*! ESI - Error State Indicator. This bit indicates if the transmitting node is error active or error passive. */ +#define CAN_CS_ESI(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_ESI_SHIFT)) & CAN_CS_ESI_MASK) + +#define CAN_CS_BRS_MASK (0x40000000U) +#define CAN_CS_BRS_SHIFT (30U) +/*! BRS - Bit Rate Switch. This bit defines whether the bit rate is switched inside a CAN FD format frame. */ +#define CAN_CS_BRS(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_BRS_SHIFT)) & CAN_CS_BRS_MASK) + +#define CAN_CS_EDL_MASK (0x80000000U) +#define CAN_CS_EDL_SHIFT (31U) +/*! EDL - Extended Data Length. This bit distinguishes between CAN format and CAN FD format frames. + * The EDL bit must not be set for Message Buffers configured to RANSWER with code field 0b1010. + */ +#define CAN_CS_EDL(x) (((uint32_t)(((uint32_t)(x)) << CAN_CS_EDL_SHIFT)) & CAN_CS_EDL_MASK) +/*! @} */ + +/* The count of CAN_CS */ +#define CAN_CS_COUNT_MB64B (7U) + +/*! @name ID - Message Buffer 0 ID Register..Message Buffer 6 ID Register */ +/*! @{ */ + +#define CAN_ID_EXT_MASK (0x3FFFFU) +#define CAN_ID_EXT_SHIFT (0U) +/*! EXT - Contains extended (LOW word) identifier of message buffer. */ +#define CAN_ID_EXT(x) (((uint32_t)(((uint32_t)(x)) << CAN_ID_EXT_SHIFT)) & CAN_ID_EXT_MASK) + +#define CAN_ID_STD_MASK (0x1FFC0000U) +#define CAN_ID_STD_SHIFT (18U) +/*! STD - Contains standard/extended (HIGH word) identifier of message buffer. */ +#define CAN_ID_STD(x) (((uint32_t)(((uint32_t)(x)) << CAN_ID_STD_SHIFT)) & CAN_ID_STD_MASK) + +#define CAN_ID_PRIO_MASK (0xE0000000U) +#define CAN_ID_PRIO_SHIFT (29U) +/*! PRIO - Local priority. This 3-bit fieldis only used when LPRIO_EN bit is set in MCR and it only + * makes sense for Tx buffers. These bits are not transmitted. They are appended to the regular + * ID to define the transmission priority. + */ +#define CAN_ID_PRIO(x) (((uint32_t)(((uint32_t)(x)) << CAN_ID_PRIO_SHIFT)) & CAN_ID_PRIO_MASK) +/*! @} */ + +/* The count of CAN_ID */ +#define CAN_ID_COUNT_MB64B (7U) + +/*! @name WORD - Message Buffer 0 WORD_64B Register..Message Buffer 6 WORD_64B Register */ +/*! @{ */ + +#define CAN_WORD_DATA_BYTE_3_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_3_SHIFT (0U) +/*! DATA_BYTE_3 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_3(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_3_SHIFT)) & CAN_WORD_DATA_BYTE_3_MASK) + +#define CAN_WORD_DATA_BYTE_7_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_7_SHIFT (0U) +/*! DATA_BYTE_7 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_7(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_7_SHIFT)) & CAN_WORD_DATA_BYTE_7_MASK) + +#define CAN_WORD_DATA_BYTE_11_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_11_SHIFT (0U) +/*! DATA_BYTE_11 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_11(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_11_SHIFT)) & CAN_WORD_DATA_BYTE_11_MASK) + +#define CAN_WORD_DATA_BYTE_15_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_15_SHIFT (0U) +/*! DATA_BYTE_15 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_15(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_15_SHIFT)) & CAN_WORD_DATA_BYTE_15_MASK) + +#define CAN_WORD_DATA_BYTE_19_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_19_SHIFT (0U) +/*! DATA_BYTE_19 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_19(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_19_SHIFT)) & CAN_WORD_DATA_BYTE_19_MASK) + +#define CAN_WORD_DATA_BYTE_23_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_23_SHIFT (0U) +/*! DATA_BYTE_23 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_23(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_23_SHIFT)) & CAN_WORD_DATA_BYTE_23_MASK) + +#define CAN_WORD_DATA_BYTE_27_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_27_SHIFT (0U) +/*! DATA_BYTE_27 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_27(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_27_SHIFT)) & CAN_WORD_DATA_BYTE_27_MASK) + +#define CAN_WORD_DATA_BYTE_31_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_31_SHIFT (0U) +/*! DATA_BYTE_31 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_31(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_31_SHIFT)) & CAN_WORD_DATA_BYTE_31_MASK) + +#define CAN_WORD_DATA_BYTE_35_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_35_SHIFT (0U) +/*! DATA_BYTE_35 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_35(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_35_SHIFT)) & CAN_WORD_DATA_BYTE_35_MASK) + +#define CAN_WORD_DATA_BYTE_39_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_39_SHIFT (0U) +/*! DATA_BYTE_39 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_39(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_39_SHIFT)) & CAN_WORD_DATA_BYTE_39_MASK) + +#define CAN_WORD_DATA_BYTE_43_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_43_SHIFT (0U) +/*! DATA_BYTE_43 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_43(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_43_SHIFT)) & CAN_WORD_DATA_BYTE_43_MASK) + +#define CAN_WORD_DATA_BYTE_47_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_47_SHIFT (0U) +/*! DATA_BYTE_47 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_47(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_47_SHIFT)) & CAN_WORD_DATA_BYTE_47_MASK) + +#define CAN_WORD_DATA_BYTE_51_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_51_SHIFT (0U) +/*! DATA_BYTE_51 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_51(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_51_SHIFT)) & CAN_WORD_DATA_BYTE_51_MASK) + +#define CAN_WORD_DATA_BYTE_55_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_55_SHIFT (0U) +/*! DATA_BYTE_55 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_55(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_55_SHIFT)) & CAN_WORD_DATA_BYTE_55_MASK) + +#define CAN_WORD_DATA_BYTE_59_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_59_SHIFT (0U) +/*! DATA_BYTE_59 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_59(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_59_SHIFT)) & CAN_WORD_DATA_BYTE_59_MASK) + +#define CAN_WORD_DATA_BYTE_63_MASK (0xFFU) +#define CAN_WORD_DATA_BYTE_63_SHIFT (0U) +/*! DATA_BYTE_63 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_63(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_63_SHIFT)) & CAN_WORD_DATA_BYTE_63_MASK) + +#define CAN_WORD_DATA_BYTE_2_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_2_SHIFT (8U) +/*! DATA_BYTE_2 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_2(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_2_SHIFT)) & CAN_WORD_DATA_BYTE_2_MASK) + +#define CAN_WORD_DATA_BYTE_6_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_6_SHIFT (8U) +/*! DATA_BYTE_6 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_6(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_6_SHIFT)) & CAN_WORD_DATA_BYTE_6_MASK) + +#define CAN_WORD_DATA_BYTE_10_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_10_SHIFT (8U) +/*! DATA_BYTE_10 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_10(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_10_SHIFT)) & CAN_WORD_DATA_BYTE_10_MASK) + +#define CAN_WORD_DATA_BYTE_14_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_14_SHIFT (8U) +/*! DATA_BYTE_14 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_14(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_14_SHIFT)) & CAN_WORD_DATA_BYTE_14_MASK) + +#define CAN_WORD_DATA_BYTE_18_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_18_SHIFT (8U) +/*! DATA_BYTE_18 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_18(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_18_SHIFT)) & CAN_WORD_DATA_BYTE_18_MASK) + +#define CAN_WORD_DATA_BYTE_22_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_22_SHIFT (8U) +/*! DATA_BYTE_22 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_22(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_22_SHIFT)) & CAN_WORD_DATA_BYTE_22_MASK) + +#define CAN_WORD_DATA_BYTE_26_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_26_SHIFT (8U) +/*! DATA_BYTE_26 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_26(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_26_SHIFT)) & CAN_WORD_DATA_BYTE_26_MASK) + +#define CAN_WORD_DATA_BYTE_30_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_30_SHIFT (8U) +/*! DATA_BYTE_30 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_30(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_30_SHIFT)) & CAN_WORD_DATA_BYTE_30_MASK) + +#define CAN_WORD_DATA_BYTE_34_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_34_SHIFT (8U) +/*! DATA_BYTE_34 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_34(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_34_SHIFT)) & CAN_WORD_DATA_BYTE_34_MASK) + +#define CAN_WORD_DATA_BYTE_38_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_38_SHIFT (8U) +/*! DATA_BYTE_38 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_38(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_38_SHIFT)) & CAN_WORD_DATA_BYTE_38_MASK) + +#define CAN_WORD_DATA_BYTE_42_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_42_SHIFT (8U) +/*! DATA_BYTE_42 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_42(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_42_SHIFT)) & CAN_WORD_DATA_BYTE_42_MASK) + +#define CAN_WORD_DATA_BYTE_46_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_46_SHIFT (8U) +/*! DATA_BYTE_46 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_46(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_46_SHIFT)) & CAN_WORD_DATA_BYTE_46_MASK) + +#define CAN_WORD_DATA_BYTE_50_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_50_SHIFT (8U) +/*! DATA_BYTE_50 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_50(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_50_SHIFT)) & CAN_WORD_DATA_BYTE_50_MASK) + +#define CAN_WORD_DATA_BYTE_54_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_54_SHIFT (8U) +/*! DATA_BYTE_54 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_54(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_54_SHIFT)) & CAN_WORD_DATA_BYTE_54_MASK) + +#define CAN_WORD_DATA_BYTE_58_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_58_SHIFT (8U) +/*! DATA_BYTE_58 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_58(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_58_SHIFT)) & CAN_WORD_DATA_BYTE_58_MASK) + +#define CAN_WORD_DATA_BYTE_62_MASK (0xFF00U) +#define CAN_WORD_DATA_BYTE_62_SHIFT (8U) +/*! DATA_BYTE_62 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_62(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_62_SHIFT)) & CAN_WORD_DATA_BYTE_62_MASK) + +#define CAN_WORD_DATA_BYTE_1_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_1_SHIFT (16U) +/*! DATA_BYTE_1 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_1(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_1_SHIFT)) & CAN_WORD_DATA_BYTE_1_MASK) + +#define CAN_WORD_DATA_BYTE_5_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_5_SHIFT (16U) +/*! DATA_BYTE_5 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_5(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_5_SHIFT)) & CAN_WORD_DATA_BYTE_5_MASK) + +#define CAN_WORD_DATA_BYTE_9_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_9_SHIFT (16U) +/*! DATA_BYTE_9 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_9(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_9_SHIFT)) & CAN_WORD_DATA_BYTE_9_MASK) + +#define CAN_WORD_DATA_BYTE_13_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_13_SHIFT (16U) +/*! DATA_BYTE_13 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_13(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_13_SHIFT)) & CAN_WORD_DATA_BYTE_13_MASK) + +#define CAN_WORD_DATA_BYTE_17_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_17_SHIFT (16U) +/*! DATA_BYTE_17 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_17(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_17_SHIFT)) & CAN_WORD_DATA_BYTE_17_MASK) + +#define CAN_WORD_DATA_BYTE_21_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_21_SHIFT (16U) +/*! DATA_BYTE_21 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_21(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_21_SHIFT)) & CAN_WORD_DATA_BYTE_21_MASK) + +#define CAN_WORD_DATA_BYTE_25_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_25_SHIFT (16U) +/*! DATA_BYTE_25 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_25(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_25_SHIFT)) & CAN_WORD_DATA_BYTE_25_MASK) + +#define CAN_WORD_DATA_BYTE_29_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_29_SHIFT (16U) +/*! DATA_BYTE_29 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_29(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_29_SHIFT)) & CAN_WORD_DATA_BYTE_29_MASK) + +#define CAN_WORD_DATA_BYTE_33_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_33_SHIFT (16U) +/*! DATA_BYTE_33 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_33(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_33_SHIFT)) & CAN_WORD_DATA_BYTE_33_MASK) + +#define CAN_WORD_DATA_BYTE_37_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_37_SHIFT (16U) +/*! DATA_BYTE_37 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_37(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_37_SHIFT)) & CAN_WORD_DATA_BYTE_37_MASK) + +#define CAN_WORD_DATA_BYTE_41_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_41_SHIFT (16U) +/*! DATA_BYTE_41 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_41(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_41_SHIFT)) & CAN_WORD_DATA_BYTE_41_MASK) + +#define CAN_WORD_DATA_BYTE_45_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_45_SHIFT (16U) +/*! DATA_BYTE_45 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_45(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_45_SHIFT)) & CAN_WORD_DATA_BYTE_45_MASK) + +#define CAN_WORD_DATA_BYTE_49_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_49_SHIFT (16U) +/*! DATA_BYTE_49 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_49(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_49_SHIFT)) & CAN_WORD_DATA_BYTE_49_MASK) + +#define CAN_WORD_DATA_BYTE_53_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_53_SHIFT (16U) +/*! DATA_BYTE_53 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_53(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_53_SHIFT)) & CAN_WORD_DATA_BYTE_53_MASK) + +#define CAN_WORD_DATA_BYTE_57_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_57_SHIFT (16U) +/*! DATA_BYTE_57 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_57(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_57_SHIFT)) & CAN_WORD_DATA_BYTE_57_MASK) + +#define CAN_WORD_DATA_BYTE_61_MASK (0xFF0000U) +#define CAN_WORD_DATA_BYTE_61_SHIFT (16U) +/*! DATA_BYTE_61 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_61(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_61_SHIFT)) & CAN_WORD_DATA_BYTE_61_MASK) + +#define CAN_WORD_DATA_BYTE_0_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_0_SHIFT (24U) +/*! DATA_BYTE_0 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_0(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_0_SHIFT)) & CAN_WORD_DATA_BYTE_0_MASK) + +#define CAN_WORD_DATA_BYTE_4_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_4_SHIFT (24U) +/*! DATA_BYTE_4 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_4(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_4_SHIFT)) & CAN_WORD_DATA_BYTE_4_MASK) + +#define CAN_WORD_DATA_BYTE_8_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_8_SHIFT (24U) +/*! DATA_BYTE_8 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_8(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_8_SHIFT)) & CAN_WORD_DATA_BYTE_8_MASK) + +#define CAN_WORD_DATA_BYTE_12_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_12_SHIFT (24U) +/*! DATA_BYTE_12 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_12(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_12_SHIFT)) & CAN_WORD_DATA_BYTE_12_MASK) + +#define CAN_WORD_DATA_BYTE_16_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_16_SHIFT (24U) +/*! DATA_BYTE_16 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_16(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_16_SHIFT)) & CAN_WORD_DATA_BYTE_16_MASK) + +#define CAN_WORD_DATA_BYTE_20_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_20_SHIFT (24U) +/*! DATA_BYTE_20 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_20(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_20_SHIFT)) & CAN_WORD_DATA_BYTE_20_MASK) + +#define CAN_WORD_DATA_BYTE_24_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_24_SHIFT (24U) +/*! DATA_BYTE_24 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_24(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_24_SHIFT)) & CAN_WORD_DATA_BYTE_24_MASK) + +#define CAN_WORD_DATA_BYTE_28_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_28_SHIFT (24U) +/*! DATA_BYTE_28 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_28(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_28_SHIFT)) & CAN_WORD_DATA_BYTE_28_MASK) + +#define CAN_WORD_DATA_BYTE_32_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_32_SHIFT (24U) +/*! DATA_BYTE_32 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_32(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_32_SHIFT)) & CAN_WORD_DATA_BYTE_32_MASK) + +#define CAN_WORD_DATA_BYTE_36_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_36_SHIFT (24U) +/*! DATA_BYTE_36 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_36(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_36_SHIFT)) & CAN_WORD_DATA_BYTE_36_MASK) + +#define CAN_WORD_DATA_BYTE_40_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_40_SHIFT (24U) +/*! DATA_BYTE_40 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_40(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_40_SHIFT)) & CAN_WORD_DATA_BYTE_40_MASK) + +#define CAN_WORD_DATA_BYTE_44_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_44_SHIFT (24U) +/*! DATA_BYTE_44 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_44(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_44_SHIFT)) & CAN_WORD_DATA_BYTE_44_MASK) + +#define CAN_WORD_DATA_BYTE_48_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_48_SHIFT (24U) +/*! DATA_BYTE_48 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_48(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_48_SHIFT)) & CAN_WORD_DATA_BYTE_48_MASK) + +#define CAN_WORD_DATA_BYTE_52_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_52_SHIFT (24U) +/*! DATA_BYTE_52 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_52(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_52_SHIFT)) & CAN_WORD_DATA_BYTE_52_MASK) + +#define CAN_WORD_DATA_BYTE_56_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_56_SHIFT (24U) +/*! DATA_BYTE_56 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_56(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_56_SHIFT)) & CAN_WORD_DATA_BYTE_56_MASK) + +#define CAN_WORD_DATA_BYTE_60_MASK (0xFF000000U) +#define CAN_WORD_DATA_BYTE_60_SHIFT (24U) +/*! DATA_BYTE_60 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD_DATA_BYTE_60(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD_DATA_BYTE_60_SHIFT)) & CAN_WORD_DATA_BYTE_60_MASK) +/*! @} */ + +/* The count of CAN_WORD */ +#define CAN_WORD_COUNT_MB64B (7U) + +/* The count of CAN_WORD */ +#define CAN_WORD_COUNT_MB64B2 (16U) + +/* The count of CAN_CS */ +#define CAN_CS_COUNT (32U) + +/* The count of CAN_ID */ +#define CAN_ID_COUNT (32U) + +/*! @name WORD0 - Message Buffer 0 WORD0 Register..Message Buffer 31 WORD0 Register */ +/*! @{ */ + +#define CAN_WORD0_DATA_BYTE_3_MASK (0xFFU) +#define CAN_WORD0_DATA_BYTE_3_SHIFT (0U) +/*! DATA_BYTE_3 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD0_DATA_BYTE_3(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD0_DATA_BYTE_3_SHIFT)) & CAN_WORD0_DATA_BYTE_3_MASK) + +#define CAN_WORD0_DATA_BYTE_2_MASK (0xFF00U) +#define CAN_WORD0_DATA_BYTE_2_SHIFT (8U) +/*! DATA_BYTE_2 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD0_DATA_BYTE_2(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD0_DATA_BYTE_2_SHIFT)) & CAN_WORD0_DATA_BYTE_2_MASK) + +#define CAN_WORD0_DATA_BYTE_1_MASK (0xFF0000U) +#define CAN_WORD0_DATA_BYTE_1_SHIFT (16U) +/*! DATA_BYTE_1 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD0_DATA_BYTE_1(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD0_DATA_BYTE_1_SHIFT)) & CAN_WORD0_DATA_BYTE_1_MASK) + +#define CAN_WORD0_DATA_BYTE_0_MASK (0xFF000000U) +#define CAN_WORD0_DATA_BYTE_0_SHIFT (24U) +/*! DATA_BYTE_0 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD0_DATA_BYTE_0(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD0_DATA_BYTE_0_SHIFT)) & CAN_WORD0_DATA_BYTE_0_MASK) +/*! @} */ + +/* The count of CAN_WORD0 */ +#define CAN_WORD0_COUNT (32U) + +/*! @name WORD1 - Message Buffer 0 WORD1 Register..Message Buffer 31 WORD1 Register */ +/*! @{ */ + +#define CAN_WORD1_DATA_BYTE_7_MASK (0xFFU) +#define CAN_WORD1_DATA_BYTE_7_SHIFT (0U) +/*! DATA_BYTE_7 - Data byte 0 of Rx/Tx frame. */ +#define CAN_WORD1_DATA_BYTE_7(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD1_DATA_BYTE_7_SHIFT)) & CAN_WORD1_DATA_BYTE_7_MASK) + +#define CAN_WORD1_DATA_BYTE_6_MASK (0xFF00U) +#define CAN_WORD1_DATA_BYTE_6_SHIFT (8U) +/*! DATA_BYTE_6 - Data byte 1 of Rx/Tx frame. */ +#define CAN_WORD1_DATA_BYTE_6(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD1_DATA_BYTE_6_SHIFT)) & CAN_WORD1_DATA_BYTE_6_MASK) + +#define CAN_WORD1_DATA_BYTE_5_MASK (0xFF0000U) +#define CAN_WORD1_DATA_BYTE_5_SHIFT (16U) +/*! DATA_BYTE_5 - Data byte 2 of Rx/Tx frame. */ +#define CAN_WORD1_DATA_BYTE_5(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD1_DATA_BYTE_5_SHIFT)) & CAN_WORD1_DATA_BYTE_5_MASK) + +#define CAN_WORD1_DATA_BYTE_4_MASK (0xFF000000U) +#define CAN_WORD1_DATA_BYTE_4_SHIFT (24U) +/*! DATA_BYTE_4 - Data byte 3 of Rx/Tx frame. */ +#define CAN_WORD1_DATA_BYTE_4(x) (((uint32_t)(((uint32_t)(x)) << CAN_WORD1_DATA_BYTE_4_SHIFT)) & CAN_WORD1_DATA_BYTE_4_MASK) +/*! @} */ + +/* The count of CAN_WORD1 */ +#define CAN_WORD1_COUNT (32U) + +/*! @name RXIMR - Receive Individual Mask */ +/*! @{ */ + +#define CAN_RXIMR_MI_MASK (0xFFFFFFFFU) +#define CAN_RXIMR_MI_SHIFT (0U) +/*! MI - Individual Mask Bits */ +#define CAN_RXIMR_MI(x) (((uint32_t)(((uint32_t)(x)) << CAN_RXIMR_MI_SHIFT)) & CAN_RXIMR_MI_MASK) +/*! @} */ + +/* The count of CAN_RXIMR */ +#define CAN_RXIMR_COUNT (32U) + +/*! @name CTRL1_PN - Pretended Networking Control 1 */ +/*! @{ */ + +#define CAN_CTRL1_PN_FCS_MASK (0x3U) +#define CAN_CTRL1_PN_FCS_SHIFT (0U) +/*! FCS - Filtering Combination Selection + * 0b00..Message ID filtering only + * 0b01..Message ID filtering and payload filtering + * 0b10..Message ID filtering occurring a specified number of times + * 0b11..Message ID filtering and payload filtering a specified number of times + */ +#define CAN_CTRL1_PN_FCS(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PN_FCS_SHIFT)) & CAN_CTRL1_PN_FCS_MASK) + +#define CAN_CTRL1_PN_IDFS_MASK (0xCU) +#define CAN_CTRL1_PN_IDFS_SHIFT (2U) +/*! IDFS - ID Filtering Selection + * 0b00..Match ID contents to an exact target value + * 0b01..Match an ID value greater than or equal to a specified target value + * 0b10..Match an ID value smaller than or equal to a specified target value + * 0b11..Match an ID value within a range of values, inclusive + */ +#define CAN_CTRL1_PN_IDFS(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PN_IDFS_SHIFT)) & CAN_CTRL1_PN_IDFS_MASK) + +#define CAN_CTRL1_PN_PLFS_MASK (0x30U) +#define CAN_CTRL1_PN_PLFS_SHIFT (4U) +/*! PLFS - Payload Filtering Selection + * 0b00..Match payload contents to an exact target value + * 0b01..Match a payload value greater than or equal to a specified target value + * 0b10..Match a payload value smaller than or equal to a specified target value + * 0b11..Match upon a payload value within a range of values, inclusive + */ +#define CAN_CTRL1_PN_PLFS(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PN_PLFS_SHIFT)) & CAN_CTRL1_PN_PLFS_MASK) + +#define CAN_CTRL1_PN_NMATCH_MASK (0xFF00U) +#define CAN_CTRL1_PN_NMATCH_SHIFT (8U) +/*! NMATCH - Number of Messages Matching the Same Filtering Criteria + * 0b00000001..Once + * 0b00000010..Twice + * 0b11111111..255 times + */ +#define CAN_CTRL1_PN_NMATCH(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PN_NMATCH_SHIFT)) & CAN_CTRL1_PN_NMATCH_MASK) + +#define CAN_CTRL1_PN_WUMF_MSK_MASK (0x10000U) +#define CAN_CTRL1_PN_WUMF_MSK_SHIFT (16U) +/*! WUMF_MSK - Wake-up by Matching Flag Mask + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CTRL1_PN_WUMF_MSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PN_WUMF_MSK_SHIFT)) & CAN_CTRL1_PN_WUMF_MSK_MASK) + +#define CAN_CTRL1_PN_WTOF_MSK_MASK (0x20000U) +#define CAN_CTRL1_PN_WTOF_MSK_SHIFT (17U) +/*! WTOF_MSK - Wake-up by Timeout Flag Mask + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_CTRL1_PN_WTOF_MSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL1_PN_WTOF_MSK_SHIFT)) & CAN_CTRL1_PN_WTOF_MSK_MASK) +/*! @} */ + +/*! @name CTRL2_PN - Pretended Networking Control 2 */ +/*! @{ */ + +#define CAN_CTRL2_PN_MATCHTO_MASK (0xFFFFU) +#define CAN_CTRL2_PN_MATCHTO_SHIFT (0U) +/*! MATCHTO - Timeout for No Message Matching the Filtering Criteria */ +#define CAN_CTRL2_PN_MATCHTO(x) (((uint32_t)(((uint32_t)(x)) << CAN_CTRL2_PN_MATCHTO_SHIFT)) & CAN_CTRL2_PN_MATCHTO_MASK) +/*! @} */ + +/*! @name WU_MTC - Pretended Networking Wake-Up Match */ +/*! @{ */ + +#define CAN_WU_MTC_MCOUNTER_MASK (0xFF00U) +#define CAN_WU_MTC_MCOUNTER_SHIFT (8U) +/*! MCOUNTER - Number of Matches in Pretended Networking */ +#define CAN_WU_MTC_MCOUNTER(x) (((uint32_t)(((uint32_t)(x)) << CAN_WU_MTC_MCOUNTER_SHIFT)) & CAN_WU_MTC_MCOUNTER_MASK) + +#define CAN_WU_MTC_WUMF_MASK (0x10000U) +#define CAN_WU_MTC_WUMF_SHIFT (16U) +/*! WUMF - Wake-up by Match Flag + * 0b0..No event detected + * 0b1..Event detected + */ +#define CAN_WU_MTC_WUMF(x) (((uint32_t)(((uint32_t)(x)) << CAN_WU_MTC_WUMF_SHIFT)) & CAN_WU_MTC_WUMF_MASK) + +#define CAN_WU_MTC_WTOF_MASK (0x20000U) +#define CAN_WU_MTC_WTOF_SHIFT (17U) +/*! WTOF - Wake-up by Timeout Flag Bit + * 0b0..No event detected + * 0b1..Event detected + */ +#define CAN_WU_MTC_WTOF(x) (((uint32_t)(((uint32_t)(x)) << CAN_WU_MTC_WTOF_SHIFT)) & CAN_WU_MTC_WTOF_MASK) +/*! @} */ + +/*! @name FLT_ID1 - Pretended Networking ID Filter 1 */ +/*! @{ */ + +#define CAN_FLT_ID1_FLT_ID1_MASK (0x1FFFFFFFU) +#define CAN_FLT_ID1_FLT_ID1_SHIFT (0U) +/*! FLT_ID1 - ID Filter 1 for Pretended Networking filtering */ +#define CAN_FLT_ID1_FLT_ID1(x) (((uint32_t)(((uint32_t)(x)) << CAN_FLT_ID1_FLT_ID1_SHIFT)) & CAN_FLT_ID1_FLT_ID1_MASK) + +#define CAN_FLT_ID1_FLT_RTR_MASK (0x20000000U) +#define CAN_FLT_ID1_FLT_RTR_SHIFT (29U) +/*! FLT_RTR - Remote Transmission Request Filter + * 0b0..Reject remote frame (accept data frame) + * 0b1..Accept remote frame + */ +#define CAN_FLT_ID1_FLT_RTR(x) (((uint32_t)(((uint32_t)(x)) << CAN_FLT_ID1_FLT_RTR_SHIFT)) & CAN_FLT_ID1_FLT_RTR_MASK) + +#define CAN_FLT_ID1_FLT_IDE_MASK (0x40000000U) +#define CAN_FLT_ID1_FLT_IDE_SHIFT (30U) +/*! FLT_IDE - ID Extended Filter + * 0b0..Standard + * 0b1..Extended + */ +#define CAN_FLT_ID1_FLT_IDE(x) (((uint32_t)(((uint32_t)(x)) << CAN_FLT_ID1_FLT_IDE_SHIFT)) & CAN_FLT_ID1_FLT_IDE_MASK) +/*! @} */ + +/*! @name FLT_DLC - Pretended Networking Data Length Code (DLC) Filter */ +/*! @{ */ + +#define CAN_FLT_DLC_FLT_DLC_HI_MASK (0xFU) +#define CAN_FLT_DLC_FLT_DLC_HI_SHIFT (0U) +/*! FLT_DLC_HI - Upper Limit for Length of Data Bytes Filter */ +#define CAN_FLT_DLC_FLT_DLC_HI(x) (((uint32_t)(((uint32_t)(x)) << CAN_FLT_DLC_FLT_DLC_HI_SHIFT)) & CAN_FLT_DLC_FLT_DLC_HI_MASK) + +#define CAN_FLT_DLC_FLT_DLC_LO_MASK (0xF0000U) +#define CAN_FLT_DLC_FLT_DLC_LO_SHIFT (16U) +/*! FLT_DLC_LO - Lower Limit for Length of Data Bytes Filter */ +#define CAN_FLT_DLC_FLT_DLC_LO(x) (((uint32_t)(((uint32_t)(x)) << CAN_FLT_DLC_FLT_DLC_LO_SHIFT)) & CAN_FLT_DLC_FLT_DLC_LO_MASK) +/*! @} */ + +/*! @name PL1_LO - Pretended Networking Payload Low Filter 1 */ +/*! @{ */ + +#define CAN_PL1_LO_Data_byte_3_MASK (0xFFU) +#define CAN_PL1_LO_Data_byte_3_SHIFT (0U) +/*! Data_byte_3 - Data byte 3 */ +#define CAN_PL1_LO_Data_byte_3(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL1_LO_Data_byte_3_SHIFT)) & CAN_PL1_LO_Data_byte_3_MASK) + +#define CAN_PL1_LO_Data_byte_2_MASK (0xFF00U) +#define CAN_PL1_LO_Data_byte_2_SHIFT (8U) +/*! Data_byte_2 - Data byte 2 */ +#define CAN_PL1_LO_Data_byte_2(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL1_LO_Data_byte_2_SHIFT)) & CAN_PL1_LO_Data_byte_2_MASK) + +#define CAN_PL1_LO_Data_byte_1_MASK (0xFF0000U) +#define CAN_PL1_LO_Data_byte_1_SHIFT (16U) +/*! Data_byte_1 - Data byte 1 */ +#define CAN_PL1_LO_Data_byte_1(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL1_LO_Data_byte_1_SHIFT)) & CAN_PL1_LO_Data_byte_1_MASK) + +#define CAN_PL1_LO_Data_byte_0_MASK (0xFF000000U) +#define CAN_PL1_LO_Data_byte_0_SHIFT (24U) +/*! Data_byte_0 - Data byte 0 */ +#define CAN_PL1_LO_Data_byte_0(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL1_LO_Data_byte_0_SHIFT)) & CAN_PL1_LO_Data_byte_0_MASK) +/*! @} */ + +/*! @name PL1_HI - Pretended Networking Payload High Filter 1 */ +/*! @{ */ + +#define CAN_PL1_HI_Data_byte_7_MASK (0xFFU) +#define CAN_PL1_HI_Data_byte_7_SHIFT (0U) +/*! Data_byte_7 - Data byte 7 */ +#define CAN_PL1_HI_Data_byte_7(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL1_HI_Data_byte_7_SHIFT)) & CAN_PL1_HI_Data_byte_7_MASK) + +#define CAN_PL1_HI_Data_byte_6_MASK (0xFF00U) +#define CAN_PL1_HI_Data_byte_6_SHIFT (8U) +/*! Data_byte_6 - Data byte 6 */ +#define CAN_PL1_HI_Data_byte_6(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL1_HI_Data_byte_6_SHIFT)) & CAN_PL1_HI_Data_byte_6_MASK) + +#define CAN_PL1_HI_Data_byte_5_MASK (0xFF0000U) +#define CAN_PL1_HI_Data_byte_5_SHIFT (16U) +/*! Data_byte_5 - Data byte 5 */ +#define CAN_PL1_HI_Data_byte_5(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL1_HI_Data_byte_5_SHIFT)) & CAN_PL1_HI_Data_byte_5_MASK) + +#define CAN_PL1_HI_Data_byte_4_MASK (0xFF000000U) +#define CAN_PL1_HI_Data_byte_4_SHIFT (24U) +/*! Data_byte_4 - Data byte 4 */ +#define CAN_PL1_HI_Data_byte_4(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL1_HI_Data_byte_4_SHIFT)) & CAN_PL1_HI_Data_byte_4_MASK) +/*! @} */ + +/*! @name FLT_ID2_IDMASK - Pretended Networking ID Filter 2 or ID Mask */ +/*! @{ */ + +#define CAN_FLT_ID2_IDMASK_FLT_ID2_IDMASK_MASK (0x1FFFFFFFU) +#define CAN_FLT_ID2_IDMASK_FLT_ID2_IDMASK_SHIFT (0U) +/*! FLT_ID2_IDMASK - ID Filter 2 for Pretended Networking Filtering or ID Mask Bits for Pretended Networking ID Filtering */ +#define CAN_FLT_ID2_IDMASK_FLT_ID2_IDMASK(x) (((uint32_t)(((uint32_t)(x)) << CAN_FLT_ID2_IDMASK_FLT_ID2_IDMASK_SHIFT)) & CAN_FLT_ID2_IDMASK_FLT_ID2_IDMASK_MASK) + +#define CAN_FLT_ID2_IDMASK_RTR_MSK_MASK (0x20000000U) +#define CAN_FLT_ID2_IDMASK_RTR_MSK_SHIFT (29U) +/*! RTR_MSK - Remote Transmission Request Mask + * 0b0..The corresponding bit in the filter is "don't care." + * 0b1..The corresponding bit in the filter is checked. + */ +#define CAN_FLT_ID2_IDMASK_RTR_MSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_FLT_ID2_IDMASK_RTR_MSK_SHIFT)) & CAN_FLT_ID2_IDMASK_RTR_MSK_MASK) + +#define CAN_FLT_ID2_IDMASK_IDE_MSK_MASK (0x40000000U) +#define CAN_FLT_ID2_IDMASK_IDE_MSK_SHIFT (30U) +/*! IDE_MSK - ID Extended Mask + * 0b0..The corresponding bit in the filter is "don't care." + * 0b1..The corresponding bit in the filter is checked. + */ +#define CAN_FLT_ID2_IDMASK_IDE_MSK(x) (((uint32_t)(((uint32_t)(x)) << CAN_FLT_ID2_IDMASK_IDE_MSK_SHIFT)) & CAN_FLT_ID2_IDMASK_IDE_MSK_MASK) +/*! @} */ + +/*! @name PL2_PLMASK_LO - Pretended Networking Payload Low Filter 2 and Payload Low Mask */ +/*! @{ */ + +#define CAN_PL2_PLMASK_LO_Data_byte_3_MASK (0xFFU) +#define CAN_PL2_PLMASK_LO_Data_byte_3_SHIFT (0U) +/*! Data_byte_3 - Data Byte 3 */ +#define CAN_PL2_PLMASK_LO_Data_byte_3(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL2_PLMASK_LO_Data_byte_3_SHIFT)) & CAN_PL2_PLMASK_LO_Data_byte_3_MASK) + +#define CAN_PL2_PLMASK_LO_Data_byte_2_MASK (0xFF00U) +#define CAN_PL2_PLMASK_LO_Data_byte_2_SHIFT (8U) +/*! Data_byte_2 - Data Byte 2 */ +#define CAN_PL2_PLMASK_LO_Data_byte_2(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL2_PLMASK_LO_Data_byte_2_SHIFT)) & CAN_PL2_PLMASK_LO_Data_byte_2_MASK) + +#define CAN_PL2_PLMASK_LO_Data_byte_1_MASK (0xFF0000U) +#define CAN_PL2_PLMASK_LO_Data_byte_1_SHIFT (16U) +/*! Data_byte_1 - Data Byte 1 */ +#define CAN_PL2_PLMASK_LO_Data_byte_1(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL2_PLMASK_LO_Data_byte_1_SHIFT)) & CAN_PL2_PLMASK_LO_Data_byte_1_MASK) + +#define CAN_PL2_PLMASK_LO_Data_byte_0_MASK (0xFF000000U) +#define CAN_PL2_PLMASK_LO_Data_byte_0_SHIFT (24U) +/*! Data_byte_0 - Data Byte 0 */ +#define CAN_PL2_PLMASK_LO_Data_byte_0(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL2_PLMASK_LO_Data_byte_0_SHIFT)) & CAN_PL2_PLMASK_LO_Data_byte_0_MASK) +/*! @} */ + +/*! @name PL2_PLMASK_HI - Pretended Networking Payload High Filter 2 and Payload High Mask */ +/*! @{ */ + +#define CAN_PL2_PLMASK_HI_Data_byte_7_MASK (0xFFU) +#define CAN_PL2_PLMASK_HI_Data_byte_7_SHIFT (0U) +/*! Data_byte_7 - Data Byte 7 */ +#define CAN_PL2_PLMASK_HI_Data_byte_7(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL2_PLMASK_HI_Data_byte_7_SHIFT)) & CAN_PL2_PLMASK_HI_Data_byte_7_MASK) + +#define CAN_PL2_PLMASK_HI_Data_byte_6_MASK (0xFF00U) +#define CAN_PL2_PLMASK_HI_Data_byte_6_SHIFT (8U) +/*! Data_byte_6 - Data Byte 6 */ +#define CAN_PL2_PLMASK_HI_Data_byte_6(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL2_PLMASK_HI_Data_byte_6_SHIFT)) & CAN_PL2_PLMASK_HI_Data_byte_6_MASK) + +#define CAN_PL2_PLMASK_HI_Data_byte_5_MASK (0xFF0000U) +#define CAN_PL2_PLMASK_HI_Data_byte_5_SHIFT (16U) +/*! Data_byte_5 - Data Byte 5 */ +#define CAN_PL2_PLMASK_HI_Data_byte_5(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL2_PLMASK_HI_Data_byte_5_SHIFT)) & CAN_PL2_PLMASK_HI_Data_byte_5_MASK) + +#define CAN_PL2_PLMASK_HI_Data_byte_4_MASK (0xFF000000U) +#define CAN_PL2_PLMASK_HI_Data_byte_4_SHIFT (24U) +/*! Data_byte_4 - Data Byte 4 */ +#define CAN_PL2_PLMASK_HI_Data_byte_4(x) (((uint32_t)(((uint32_t)(x)) << CAN_PL2_PLMASK_HI_Data_byte_4_SHIFT)) & CAN_PL2_PLMASK_HI_Data_byte_4_MASK) +/*! @} */ + +/*! @name WMB_CS - Wake-Up Message Buffer */ +/*! @{ */ + +#define CAN_WMB_CS_DLC_MASK (0xF0000U) +#define CAN_WMB_CS_DLC_SHIFT (16U) +/*! DLC - Length of Data in Bytes */ +#define CAN_WMB_CS_DLC(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_CS_DLC_SHIFT)) & CAN_WMB_CS_DLC_MASK) + +#define CAN_WMB_CS_RTR_MASK (0x100000U) +#define CAN_WMB_CS_RTR_SHIFT (20U) +/*! RTR - Remote Transmission Request + * 0b0..Data + * 0b1..Remote + */ +#define CAN_WMB_CS_RTR(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_CS_RTR_SHIFT)) & CAN_WMB_CS_RTR_MASK) + +#define CAN_WMB_CS_IDE_MASK (0x200000U) +#define CAN_WMB_CS_IDE_SHIFT (21U) +/*! IDE - ID Extended Bit + * 0b0..Standard + * 0b1..Extended + */ +#define CAN_WMB_CS_IDE(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_CS_IDE_SHIFT)) & CAN_WMB_CS_IDE_MASK) + +#define CAN_WMB_CS_SRR_MASK (0x400000U) +#define CAN_WMB_CS_SRR_SHIFT (22U) +/*! SRR - Substitute Remote Request + * 0b0..Dominant + * 0b1..Recessive + */ +#define CAN_WMB_CS_SRR(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_CS_SRR_SHIFT)) & CAN_WMB_CS_SRR_MASK) +/*! @} */ + +/* The count of CAN_WMB_CS */ +#define CAN_WMB_CS_COUNT (4U) + +/*! @name WMB_ID - Wake-Up Message Buffer for ID */ +/*! @{ */ + +#define CAN_WMB_ID_ID_MASK (0x1FFFFFFFU) +#define CAN_WMB_ID_ID_SHIFT (0U) +/*! ID - Received ID in Pretended Networking Mode */ +#define CAN_WMB_ID_ID(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_ID_ID_SHIFT)) & CAN_WMB_ID_ID_MASK) +/*! @} */ + +/* The count of CAN_WMB_ID */ +#define CAN_WMB_ID_COUNT (4U) + +/*! @name WMB_D03 - Wake-Up Message Buffer for Data 0-3 */ +/*! @{ */ + +#define CAN_WMB_D03_Data_byte_3_MASK (0xFFU) +#define CAN_WMB_D03_Data_byte_3_SHIFT (0U) +/*! Data_byte_3 - Data Byte 3 */ +#define CAN_WMB_D03_Data_byte_3(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_D03_Data_byte_3_SHIFT)) & CAN_WMB_D03_Data_byte_3_MASK) + +#define CAN_WMB_D03_Data_byte_2_MASK (0xFF00U) +#define CAN_WMB_D03_Data_byte_2_SHIFT (8U) +/*! Data_byte_2 - Data Byte 2 */ +#define CAN_WMB_D03_Data_byte_2(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_D03_Data_byte_2_SHIFT)) & CAN_WMB_D03_Data_byte_2_MASK) + +#define CAN_WMB_D03_Data_byte_1_MASK (0xFF0000U) +#define CAN_WMB_D03_Data_byte_1_SHIFT (16U) +/*! Data_byte_1 - Data Byte 1 */ +#define CAN_WMB_D03_Data_byte_1(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_D03_Data_byte_1_SHIFT)) & CAN_WMB_D03_Data_byte_1_MASK) + +#define CAN_WMB_D03_Data_byte_0_MASK (0xFF000000U) +#define CAN_WMB_D03_Data_byte_0_SHIFT (24U) +/*! Data_byte_0 - Data Byte 0 */ +#define CAN_WMB_D03_Data_byte_0(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_D03_Data_byte_0_SHIFT)) & CAN_WMB_D03_Data_byte_0_MASK) +/*! @} */ + +/* The count of CAN_WMB_D03 */ +#define CAN_WMB_D03_COUNT (4U) + +/*! @name WMB_D47 - Wake-Up Message Buffer Register Data 4-7 */ +/*! @{ */ + +#define CAN_WMB_D47_Data_byte_7_MASK (0xFFU) +#define CAN_WMB_D47_Data_byte_7_SHIFT (0U) +/*! Data_byte_7 - Data Byte 7 */ +#define CAN_WMB_D47_Data_byte_7(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_D47_Data_byte_7_SHIFT)) & CAN_WMB_D47_Data_byte_7_MASK) + +#define CAN_WMB_D47_Data_byte_6_MASK (0xFF00U) +#define CAN_WMB_D47_Data_byte_6_SHIFT (8U) +/*! Data_byte_6 - Data Byte 6 */ +#define CAN_WMB_D47_Data_byte_6(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_D47_Data_byte_6_SHIFT)) & CAN_WMB_D47_Data_byte_6_MASK) + +#define CAN_WMB_D47_Data_byte_5_MASK (0xFF0000U) +#define CAN_WMB_D47_Data_byte_5_SHIFT (16U) +/*! Data_byte_5 - Data Byte 5 */ +#define CAN_WMB_D47_Data_byte_5(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_D47_Data_byte_5_SHIFT)) & CAN_WMB_D47_Data_byte_5_MASK) + +#define CAN_WMB_D47_Data_byte_4_MASK (0xFF000000U) +#define CAN_WMB_D47_Data_byte_4_SHIFT (24U) +/*! Data_byte_4 - Data Byte 4 */ +#define CAN_WMB_D47_Data_byte_4(x) (((uint32_t)(((uint32_t)(x)) << CAN_WMB_D47_Data_byte_4_SHIFT)) & CAN_WMB_D47_Data_byte_4_MASK) +/*! @} */ + +/* The count of CAN_WMB_D47 */ +#define CAN_WMB_D47_COUNT (4U) + +/*! @name EPRS - Enhanced CAN Bit Timing Prescalers */ +/*! @{ */ + +#define CAN_EPRS_ENPRESDIV_MASK (0x3FFU) +#define CAN_EPRS_ENPRESDIV_SHIFT (0U) +/*! ENPRESDIV - Extended Nominal Prescaler Division Factor */ +#define CAN_EPRS_ENPRESDIV(x) (((uint32_t)(((uint32_t)(x)) << CAN_EPRS_ENPRESDIV_SHIFT)) & CAN_EPRS_ENPRESDIV_MASK) + +#define CAN_EPRS_EDPRESDIV_MASK (0x3FF0000U) +#define CAN_EPRS_EDPRESDIV_SHIFT (16U) +/*! EDPRESDIV - Extended Data Phase Prescaler Division Factor */ +#define CAN_EPRS_EDPRESDIV(x) (((uint32_t)(((uint32_t)(x)) << CAN_EPRS_EDPRESDIV_SHIFT)) & CAN_EPRS_EDPRESDIV_MASK) +/*! @} */ + +/*! @name ENCBT - Enhanced Nominal CAN Bit Timing */ +/*! @{ */ + +#define CAN_ENCBT_NTSEG1_MASK (0xFFU) +#define CAN_ENCBT_NTSEG1_SHIFT (0U) +/*! NTSEG1 - Nominal Time Segment 1 */ +#define CAN_ENCBT_NTSEG1(x) (((uint32_t)(((uint32_t)(x)) << CAN_ENCBT_NTSEG1_SHIFT)) & CAN_ENCBT_NTSEG1_MASK) + +#define CAN_ENCBT_NTSEG2_MASK (0x7F000U) +#define CAN_ENCBT_NTSEG2_SHIFT (12U) +/*! NTSEG2 - Nominal Time Segment 2 */ +#define CAN_ENCBT_NTSEG2(x) (((uint32_t)(((uint32_t)(x)) << CAN_ENCBT_NTSEG2_SHIFT)) & CAN_ENCBT_NTSEG2_MASK) + +#define CAN_ENCBT_NRJW_MASK (0x1FC00000U) +#define CAN_ENCBT_NRJW_SHIFT (22U) +/*! NRJW - Nominal Resynchronization Jump Width */ +#define CAN_ENCBT_NRJW(x) (((uint32_t)(((uint32_t)(x)) << CAN_ENCBT_NRJW_SHIFT)) & CAN_ENCBT_NRJW_MASK) +/*! @} */ + +/*! @name EDCBT - Enhanced Data Phase CAN Bit Timing */ +/*! @{ */ + +#define CAN_EDCBT_DTSEG1_MASK (0x1FU) +#define CAN_EDCBT_DTSEG1_SHIFT (0U) +/*! DTSEG1 - Data Phase Segment 1 */ +#define CAN_EDCBT_DTSEG1(x) (((uint32_t)(((uint32_t)(x)) << CAN_EDCBT_DTSEG1_SHIFT)) & CAN_EDCBT_DTSEG1_MASK) + +#define CAN_EDCBT_DTSEG2_MASK (0xF000U) +#define CAN_EDCBT_DTSEG2_SHIFT (12U) +/*! DTSEG2 - Data Phase Time Segment 2 */ +#define CAN_EDCBT_DTSEG2(x) (((uint32_t)(((uint32_t)(x)) << CAN_EDCBT_DTSEG2_SHIFT)) & CAN_EDCBT_DTSEG2_MASK) + +#define CAN_EDCBT_DRJW_MASK (0x3C00000U) +#define CAN_EDCBT_DRJW_SHIFT (22U) +/*! DRJW - Data Phase Resynchronization Jump Width */ +#define CAN_EDCBT_DRJW(x) (((uint32_t)(((uint32_t)(x)) << CAN_EDCBT_DRJW_SHIFT)) & CAN_EDCBT_DRJW_MASK) +/*! @} */ + +/*! @name ETDC - Enhanced Transceiver Delay Compensation */ +/*! @{ */ + +#define CAN_ETDC_ETDCVAL_MASK (0xFFU) +#define CAN_ETDC_ETDCVAL_SHIFT (0U) +/*! ETDCVAL - Enhanced Transceiver Delay Compensation Value */ +#define CAN_ETDC_ETDCVAL(x) (((uint32_t)(((uint32_t)(x)) << CAN_ETDC_ETDCVAL_SHIFT)) & CAN_ETDC_ETDCVAL_MASK) + +#define CAN_ETDC_ETDCFAIL_MASK (0x8000U) +#define CAN_ETDC_ETDCFAIL_SHIFT (15U) +/*! ETDCFAIL - Transceiver Delay Compensation Fail + * 0b0..In range + * 0b1..Out of range + */ +#define CAN_ETDC_ETDCFAIL(x) (((uint32_t)(((uint32_t)(x)) << CAN_ETDC_ETDCFAIL_SHIFT)) & CAN_ETDC_ETDCFAIL_MASK) + +#define CAN_ETDC_ETDCOFF_MASK (0x7F0000U) +#define CAN_ETDC_ETDCOFF_SHIFT (16U) +/*! ETDCOFF - Enhanced Transceiver Delay Compensation Offset */ +#define CAN_ETDC_ETDCOFF(x) (((uint32_t)(((uint32_t)(x)) << CAN_ETDC_ETDCOFF_SHIFT)) & CAN_ETDC_ETDCOFF_MASK) + +#define CAN_ETDC_TDMDIS_MASK (0x40000000U) +#define CAN_ETDC_TDMDIS_SHIFT (30U) +/*! TDMDIS - Transceiver Delay Measurement Disable + * 0b0..Enable + * 0b1..Disable + */ +#define CAN_ETDC_TDMDIS(x) (((uint32_t)(((uint32_t)(x)) << CAN_ETDC_TDMDIS_SHIFT)) & CAN_ETDC_TDMDIS_MASK) + +#define CAN_ETDC_ETDCEN_MASK (0x80000000U) +#define CAN_ETDC_ETDCEN_SHIFT (31U) +/*! ETDCEN - Transceiver Delay Compensation Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_ETDC_ETDCEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_ETDC_ETDCEN_SHIFT)) & CAN_ETDC_ETDCEN_MASK) +/*! @} */ + +/*! @name FDCTRL - CAN FD Control */ +/*! @{ */ + +#define CAN_FDCTRL_TDCVAL_MASK (0x3FU) +#define CAN_FDCTRL_TDCVAL_SHIFT (0U) +/*! TDCVAL - Transceiver Delay Compensation Value */ +#define CAN_FDCTRL_TDCVAL(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCTRL_TDCVAL_SHIFT)) & CAN_FDCTRL_TDCVAL_MASK) + +#define CAN_FDCTRL_TDCOFF_MASK (0x1F00U) +#define CAN_FDCTRL_TDCOFF_SHIFT (8U) +/*! TDCOFF - Transceiver Delay Compensation Offset */ +#define CAN_FDCTRL_TDCOFF(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCTRL_TDCOFF_SHIFT)) & CAN_FDCTRL_TDCOFF_MASK) + +#define CAN_FDCTRL_TDCFAIL_MASK (0x4000U) +#define CAN_FDCTRL_TDCFAIL_SHIFT (14U) +/*! TDCFAIL - Transceiver Delay Compensation Fail + * 0b0..In range + * 0b1..Out of range + */ +#define CAN_FDCTRL_TDCFAIL(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCTRL_TDCFAIL_SHIFT)) & CAN_FDCTRL_TDCFAIL_MASK) + +#define CAN_FDCTRL_TDCEN_MASK (0x8000U) +#define CAN_FDCTRL_TDCEN_SHIFT (15U) +/*! TDCEN - Transceiver Delay Compensation Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_FDCTRL_TDCEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCTRL_TDCEN_SHIFT)) & CAN_FDCTRL_TDCEN_MASK) + +#define CAN_FDCTRL_MBDSR0_MASK (0x30000U) +#define CAN_FDCTRL_MBDSR0_SHIFT (16U) +/*! MBDSR0 - Message Buffer Data Size for Region 0 + * 0b00..8 bytes + * 0b01..16 bytes + * 0b10..32 bytes + * 0b11..64 bytes + */ +#define CAN_FDCTRL_MBDSR0(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCTRL_MBDSR0_SHIFT)) & CAN_FDCTRL_MBDSR0_MASK) + +#define CAN_FDCTRL_FDRATE_MASK (0x80000000U) +#define CAN_FDCTRL_FDRATE_SHIFT (31U) +/*! FDRATE - Bit Rate Switch Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_FDCTRL_FDRATE(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCTRL_FDRATE_SHIFT)) & CAN_FDCTRL_FDRATE_MASK) +/*! @} */ + +/*! @name FDCBT - CAN FD Bit Timing */ +/*! @{ */ + +#define CAN_FDCBT_FPSEG2_MASK (0x7U) +#define CAN_FDCBT_FPSEG2_SHIFT (0U) +/*! FPSEG2 - Fast Phase Segment 2 */ +#define CAN_FDCBT_FPSEG2(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCBT_FPSEG2_SHIFT)) & CAN_FDCBT_FPSEG2_MASK) + +#define CAN_FDCBT_FPSEG1_MASK (0xE0U) +#define CAN_FDCBT_FPSEG1_SHIFT (5U) +/*! FPSEG1 - Fast Phase Segment 1 */ +#define CAN_FDCBT_FPSEG1(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCBT_FPSEG1_SHIFT)) & CAN_FDCBT_FPSEG1_MASK) + +#define CAN_FDCBT_FPROPSEG_MASK (0x7C00U) +#define CAN_FDCBT_FPROPSEG_SHIFT (10U) +/*! FPROPSEG - Fast Propagation Segment */ +#define CAN_FDCBT_FPROPSEG(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCBT_FPROPSEG_SHIFT)) & CAN_FDCBT_FPROPSEG_MASK) + +#define CAN_FDCBT_FRJW_MASK (0x70000U) +#define CAN_FDCBT_FRJW_SHIFT (16U) +/*! FRJW - Fast Resync Jump Width */ +#define CAN_FDCBT_FRJW(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCBT_FRJW_SHIFT)) & CAN_FDCBT_FRJW_MASK) + +#define CAN_FDCBT_FPRESDIV_MASK (0x3FF00000U) +#define CAN_FDCBT_FPRESDIV_SHIFT (20U) +/*! FPRESDIV - Fast Prescaler Division Factor */ +#define CAN_FDCBT_FPRESDIV(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCBT_FPRESDIV_SHIFT)) & CAN_FDCBT_FPRESDIV_MASK) +/*! @} */ + +/*! @name FDCRC - CAN FD CRC */ +/*! @{ */ + +#define CAN_FDCRC_FD_TXCRC_MASK (0x1FFFFFU) +#define CAN_FDCRC_FD_TXCRC_SHIFT (0U) +/*! FD_TXCRC - Extended Transmitted CRC value */ +#define CAN_FDCRC_FD_TXCRC(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCRC_FD_TXCRC_SHIFT)) & CAN_FDCRC_FD_TXCRC_MASK) + +#define CAN_FDCRC_FD_MBCRC_MASK (0x7F000000U) +#define CAN_FDCRC_FD_MBCRC_SHIFT (24U) +/*! FD_MBCRC - CRC Message Buffer Number for FD_TXCRC */ +#define CAN_FDCRC_FD_MBCRC(x) (((uint32_t)(((uint32_t)(x)) << CAN_FDCRC_FD_MBCRC_SHIFT)) & CAN_FDCRC_FD_MBCRC_MASK) +/*! @} */ + +/*! @name ERFCR - Enhanced RX FIFO Control */ +/*! @{ */ + +#define CAN_ERFCR_ERFWM_MASK (0x1FU) +#define CAN_ERFCR_ERFWM_SHIFT (0U) +/*! ERFWM - Enhanced RX FIFO Watermark */ +#define CAN_ERFCR_ERFWM(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFCR_ERFWM_SHIFT)) & CAN_ERFCR_ERFWM_MASK) + +#define CAN_ERFCR_NFE_MASK (0x3F00U) +#define CAN_ERFCR_NFE_SHIFT (8U) +/*! NFE - Number of Enhanced RX FIFO Filter Elements */ +#define CAN_ERFCR_NFE(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFCR_NFE_SHIFT)) & CAN_ERFCR_NFE_MASK) + +#define CAN_ERFCR_NEXIF_MASK (0x7F0000U) +#define CAN_ERFCR_NEXIF_SHIFT (16U) +/*! NEXIF - Number of Extended ID Filter Elements */ +#define CAN_ERFCR_NEXIF(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFCR_NEXIF_SHIFT)) & CAN_ERFCR_NEXIF_MASK) + +#define CAN_ERFCR_DMALW_MASK (0x7C000000U) +#define CAN_ERFCR_DMALW_SHIFT (26U) +/*! DMALW - DMA Last Word */ +#define CAN_ERFCR_DMALW(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFCR_DMALW_SHIFT)) & CAN_ERFCR_DMALW_MASK) + +#define CAN_ERFCR_ERFEN_MASK (0x80000000U) +#define CAN_ERFCR_ERFEN_SHIFT (31U) +/*! ERFEN - Enhanced RX FIFO enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_ERFCR_ERFEN(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFCR_ERFEN_SHIFT)) & CAN_ERFCR_ERFEN_MASK) +/*! @} */ + +/*! @name ERFIER - Enhanced RX FIFO Interrupt Enable */ +/*! @{ */ + +#define CAN_ERFIER_ERFDAIE_MASK (0x10000000U) +#define CAN_ERFIER_ERFDAIE_SHIFT (28U) +/*! ERFDAIE - Enhanced RX FIFO Data Available Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_ERFIER_ERFDAIE(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFIER_ERFDAIE_SHIFT)) & CAN_ERFIER_ERFDAIE_MASK) + +#define CAN_ERFIER_ERFWMIIE_MASK (0x20000000U) +#define CAN_ERFIER_ERFWMIIE_SHIFT (29U) +/*! ERFWMIIE - Enhanced RX FIFO Watermark Indication Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_ERFIER_ERFWMIIE(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFIER_ERFWMIIE_SHIFT)) & CAN_ERFIER_ERFWMIIE_MASK) + +#define CAN_ERFIER_ERFOVFIE_MASK (0x40000000U) +#define CAN_ERFIER_ERFOVFIE_SHIFT (30U) +/*! ERFOVFIE - Enhanced RX FIFO Overflow Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_ERFIER_ERFOVFIE(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFIER_ERFOVFIE_SHIFT)) & CAN_ERFIER_ERFOVFIE_MASK) + +#define CAN_ERFIER_ERFUFWIE_MASK (0x80000000U) +#define CAN_ERFIER_ERFUFWIE_SHIFT (31U) +/*! ERFUFWIE - Enhanced RX FIFO Underflow Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CAN_ERFIER_ERFUFWIE(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFIER_ERFUFWIE_SHIFT)) & CAN_ERFIER_ERFUFWIE_MASK) +/*! @} */ + +/*! @name ERFSR - Enhanced RX FIFO Status */ +/*! @{ */ + +#define CAN_ERFSR_ERFEL_MASK (0x3FU) +#define CAN_ERFSR_ERFEL_SHIFT (0U) +/*! ERFEL - Enhanced RX FIFO Elements */ +#define CAN_ERFSR_ERFEL(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFSR_ERFEL_SHIFT)) & CAN_ERFSR_ERFEL_MASK) + +#define CAN_ERFSR_ERFF_MASK (0x10000U) +#define CAN_ERFSR_ERFF_SHIFT (16U) +/*! ERFF - Enhanced RX FIFO Full Flag + * 0b0..Not full + * 0b1..Full + */ +#define CAN_ERFSR_ERFF(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFSR_ERFF_SHIFT)) & CAN_ERFSR_ERFF_MASK) + +#define CAN_ERFSR_ERFE_MASK (0x20000U) +#define CAN_ERFSR_ERFE_SHIFT (17U) +/*! ERFE - Enhanced RX FIFO Empty Flag + * 0b0..Not empty + * 0b1..Empty + */ +#define CAN_ERFSR_ERFE(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFSR_ERFE_SHIFT)) & CAN_ERFSR_ERFE_MASK) + +#define CAN_ERFSR_ERFCLR_MASK (0x8000000U) +#define CAN_ERFSR_ERFCLR_SHIFT (27U) +/*! ERFCLR - Enhanced RX FIFO Clear + * 0b0..No effect + * 0b1..Clear enhanced RX FIFO content + */ +#define CAN_ERFSR_ERFCLR(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFSR_ERFCLR_SHIFT)) & CAN_ERFSR_ERFCLR_MASK) + +#define CAN_ERFSR_ERFDA_MASK (0x10000000U) +#define CAN_ERFSR_ERFDA_SHIFT (28U) +/*! ERFDA - Enhanced RX FIFO Data Available Flag + * 0b0..No such occurrence + * 0b1..At least one message stored in Enhanced RX FIFO + */ +#define CAN_ERFSR_ERFDA(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFSR_ERFDA_SHIFT)) & CAN_ERFSR_ERFDA_MASK) + +#define CAN_ERFSR_ERFWMI_MASK (0x20000000U) +#define CAN_ERFSR_ERFWMI_SHIFT (29U) +/*! ERFWMI - Enhanced RX FIFO Watermark Indication Flag + * 0b0..No such occurrence + * 0b1..Number of messages in FIFO is greater than the watermark + */ +#define CAN_ERFSR_ERFWMI(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFSR_ERFWMI_SHIFT)) & CAN_ERFSR_ERFWMI_MASK) + +#define CAN_ERFSR_ERFOVF_MASK (0x40000000U) +#define CAN_ERFSR_ERFOVF_SHIFT (30U) +/*! ERFOVF - Enhanced RX FIFO Overflow Flag + * 0b0..No such occurrence + * 0b1..Overflow + */ +#define CAN_ERFSR_ERFOVF(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFSR_ERFOVF_SHIFT)) & CAN_ERFSR_ERFOVF_MASK) + +#define CAN_ERFSR_ERFUFW_MASK (0x80000000U) +#define CAN_ERFSR_ERFUFW_SHIFT (31U) +/*! ERFUFW - Enhanced RX FIFO Underflow Flag + * 0b0..No such occurrence + * 0b1..Underflow + */ +#define CAN_ERFSR_ERFUFW(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFSR_ERFUFW_SHIFT)) & CAN_ERFSR_ERFUFW_MASK) +/*! @} */ + +/*! @name ERFFEL - Enhanced RX FIFO Filter Element */ +/*! @{ */ + +#define CAN_ERFFEL_FEL_MASK (0xFFFFFFFFU) +#define CAN_ERFFEL_FEL_SHIFT (0U) +/*! FEL - Filter Element Bits */ +#define CAN_ERFFEL_FEL(x) (((uint32_t)(((uint32_t)(x)) << CAN_ERFFEL_FEL_SHIFT)) & CAN_ERFFEL_FEL_MASK) +/*! @} */ + +/* The count of CAN_ERFFEL */ +#define CAN_ERFFEL_COUNT (32U) + + +/*! + * @} + */ /* end of group CAN_Register_Masks */ + + +/* CAN - Peripheral instance base addresses */ +/** Peripheral CAN0 base address */ +#define CAN0_BASE (0x400CC000u) +/** Peripheral CAN0 base pointer */ +#define CAN0 ((CAN_Type *)CAN0_BASE) +/** Array initializer of CAN peripheral base addresses */ +#define CAN_BASE_ADDRS { CAN0_BASE } +/** Array initializer of CAN peripheral base pointers */ +#define CAN_BASE_PTRS { CAN0 } +/** Interrupt vectors for the CAN peripheral type */ +#define CAN_Rx_Warning_IRQS { CAN0_IRQn } +#define CAN_Tx_Warning_IRQS { CAN0_IRQn } +#define CAN_Wake_Up_IRQS { CAN0_IRQn } +#define CAN_Error_IRQS { CAN0_IRQn } +#define CAN_Bus_Off_IRQS { CAN0_IRQn } +#define CAN_ORed_Message_buffer_IRQS { CAN0_IRQn } + +/*! + * @} + */ /* end of group CAN_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- CDOG Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CDOG_Peripheral_Access_Layer CDOG Peripheral Access Layer + * @{ + */ + +/** CDOG - Register Layout Typedef */ +typedef struct { + __IO uint32_t CONTROL; /**< Control Register, offset: 0x0 */ + __IO uint32_t RELOAD; /**< Instruction Timer Reload Register, offset: 0x4 */ + __I uint32_t INSTRUCTION_TIMER; /**< Instruction Timer Register, offset: 0x8 */ + uint8_t RESERVED_0[4]; + __I uint32_t STATUS; /**< Status 1 Register, offset: 0x10 */ + __I uint32_t STATUS2; /**< Status 2 Register, offset: 0x14 */ + __IO uint32_t FLAGS; /**< Flags Register, offset: 0x18 */ + __IO uint32_t PERSISTENT; /**< Persistent Data Storage Register, offset: 0x1C */ + __O uint32_t START; /**< START Command Register, offset: 0x20 */ + __O uint32_t STOP; /**< STOP Command Register, offset: 0x24 */ + __O uint32_t RESTART; /**< RESTART Command Register, offset: 0x28 */ + __O uint32_t ADD; /**< ADD Command Register, offset: 0x2C */ + __O uint32_t ADD1; /**< ADD1 Command Register, offset: 0x30 */ + __O uint32_t ADD16; /**< ADD16 Command Register, offset: 0x34 */ + __O uint32_t ADD256; /**< ADD256 Command Register, offset: 0x38 */ + __O uint32_t SUB; /**< SUB Command Register, offset: 0x3C */ + __O uint32_t SUB1; /**< SUB1 Command Register, offset: 0x40 */ + __O uint32_t SUB16; /**< SUB16 Command Register, offset: 0x44 */ + __O uint32_t SUB256; /**< SUB256 Command Register, offset: 0x48 */ + __O uint32_t ASSERT16; /**< ASSERT16 Command Register, offset: 0x4C */ +} CDOG_Type; + +/* ---------------------------------------------------------------------------- + -- CDOG Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CDOG_Register_Masks CDOG Register Masks + * @{ + */ + +/*! @name CONTROL - Control Register */ +/*! @{ */ + +#define CDOG_CONTROL_LOCK_CTRL_MASK (0x3U) +#define CDOG_CONTROL_LOCK_CTRL_SHIFT (0U) +/*! LOCK_CTRL - Lock control + * 0b01..Locked + * 0b10..Unlocked + */ +#define CDOG_CONTROL_LOCK_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_LOCK_CTRL_SHIFT)) & CDOG_CONTROL_LOCK_CTRL_MASK) + +#define CDOG_CONTROL_TIMEOUT_CTRL_MASK (0x1CU) +#define CDOG_CONTROL_TIMEOUT_CTRL_SHIFT (2U) +/*! TIMEOUT_CTRL - TIMEOUT fault control + * 0b100..Disable both reset and interrupt + * 0b001..Enable reset + * 0b010..Enable interrupt + */ +#define CDOG_CONTROL_TIMEOUT_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_TIMEOUT_CTRL_SHIFT)) & CDOG_CONTROL_TIMEOUT_CTRL_MASK) + +#define CDOG_CONTROL_MISCOMPARE_CTRL_MASK (0xE0U) +#define CDOG_CONTROL_MISCOMPARE_CTRL_SHIFT (5U) +/*! MISCOMPARE_CTRL - MISCOMPARE fault control + * 0b100..Disable both reset and interrupt + * 0b001..Enable reset + * 0b010..Enable interrupt + */ +#define CDOG_CONTROL_MISCOMPARE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_MISCOMPARE_CTRL_SHIFT)) & CDOG_CONTROL_MISCOMPARE_CTRL_MASK) + +#define CDOG_CONTROL_SEQUENCE_CTRL_MASK (0x700U) +#define CDOG_CONTROL_SEQUENCE_CTRL_SHIFT (8U) +/*! SEQUENCE_CTRL - SEQUENCE fault control + * 0b001..Enable reset + * 0b010..Enable interrupt + * 0b100..Disable both reset and interrupt + */ +#define CDOG_CONTROL_SEQUENCE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_SEQUENCE_CTRL_SHIFT)) & CDOG_CONTROL_SEQUENCE_CTRL_MASK) + +#define CDOG_CONTROL_STATE_CTRL_MASK (0x1C000U) +#define CDOG_CONTROL_STATE_CTRL_SHIFT (14U) +/*! STATE_CTRL - STATE fault control + * 0b001..Enable reset + * 0b010..Enable interrupt + * 0b100..Disable both reset and interrupt + */ +#define CDOG_CONTROL_STATE_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_STATE_CTRL_SHIFT)) & CDOG_CONTROL_STATE_CTRL_MASK) + +#define CDOG_CONTROL_ADDRESS_CTRL_MASK (0xE0000U) +#define CDOG_CONTROL_ADDRESS_CTRL_SHIFT (17U) +/*! ADDRESS_CTRL - ADDRESS fault control + * 0b001..Enable reset + * 0b010..Enable interrupt + * 0b100..Disable both reset and interrupt + */ +#define CDOG_CONTROL_ADDRESS_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_ADDRESS_CTRL_SHIFT)) & CDOG_CONTROL_ADDRESS_CTRL_MASK) + +#define CDOG_CONTROL_IRQ_PAUSE_MASK (0x30000000U) +#define CDOG_CONTROL_IRQ_PAUSE_SHIFT (28U) +/*! IRQ_PAUSE - IRQ pause control + * 0b01..Keep the timer running + * 0b10..Stop the timer + */ +#define CDOG_CONTROL_IRQ_PAUSE(x) (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_IRQ_PAUSE_SHIFT)) & CDOG_CONTROL_IRQ_PAUSE_MASK) + +#define CDOG_CONTROL_DEBUG_HALT_CTRL_MASK (0xC0000000U) +#define CDOG_CONTROL_DEBUG_HALT_CTRL_SHIFT (30U) +/*! DEBUG_HALT_CTRL - DEBUG_HALT control + * 0b01..Keep the timer running + * 0b10..Stop the timer + */ +#define CDOG_CONTROL_DEBUG_HALT_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_DEBUG_HALT_CTRL_SHIFT)) & CDOG_CONTROL_DEBUG_HALT_CTRL_MASK) +/*! @} */ + +/*! @name RELOAD - Instruction Timer Reload Register */ +/*! @{ */ + +#define CDOG_RELOAD_RLOAD_MASK (0xFFFFFFFFU) +#define CDOG_RELOAD_RLOAD_SHIFT (0U) +/*! RLOAD - Instruction Timer reload value */ +#define CDOG_RELOAD_RLOAD(x) (((uint32_t)(((uint32_t)(x)) << CDOG_RELOAD_RLOAD_SHIFT)) & CDOG_RELOAD_RLOAD_MASK) +/*! @} */ + +/*! @name INSTRUCTION_TIMER - Instruction Timer Register */ +/*! @{ */ + +#define CDOG_INSTRUCTION_TIMER_INSTIM_MASK (0xFFFFFFFFU) +#define CDOG_INSTRUCTION_TIMER_INSTIM_SHIFT (0U) +/*! INSTIM - Current value of the Instruction Timer */ +#define CDOG_INSTRUCTION_TIMER_INSTIM(x) (((uint32_t)(((uint32_t)(x)) << CDOG_INSTRUCTION_TIMER_INSTIM_SHIFT)) & CDOG_INSTRUCTION_TIMER_INSTIM_MASK) +/*! @} */ + +/*! @name STATUS - Status 1 Register */ +/*! @{ */ + +#define CDOG_STATUS_NUMTOF_MASK (0xFFU) +#define CDOG_STATUS_NUMTOF_SHIFT (0U) +/*! NUMTOF - Number of TIMEOUT faults since the last POR */ +#define CDOG_STATUS_NUMTOF(x) (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS_NUMTOF_SHIFT)) & CDOG_STATUS_NUMTOF_MASK) + +#define CDOG_STATUS_NUMMISCOMPF_MASK (0xFF00U) +#define CDOG_STATUS_NUMMISCOMPF_SHIFT (8U) +/*! NUMMISCOMPF - Number of MISCOMPARE faults since the last POR */ +#define CDOG_STATUS_NUMMISCOMPF(x) (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS_NUMMISCOMPF_SHIFT)) & CDOG_STATUS_NUMMISCOMPF_MASK) + +#define CDOG_STATUS_NUMILSEQF_MASK (0xFF0000U) +#define CDOG_STATUS_NUMILSEQF_SHIFT (16U) +/*! NUMILSEQF - Number of SEQUENCE faults since the last POR */ +#define CDOG_STATUS_NUMILSEQF(x) (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS_NUMILSEQF_SHIFT)) & CDOG_STATUS_NUMILSEQF_MASK) + +#define CDOG_STATUS_CURST_MASK (0xF0000000U) +#define CDOG_STATUS_CURST_SHIFT (28U) +/*! CURST - Current State */ +#define CDOG_STATUS_CURST(x) (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS_CURST_SHIFT)) & CDOG_STATUS_CURST_MASK) +/*! @} */ + +/*! @name STATUS2 - Status 2 Register */ +/*! @{ */ + +#define CDOG_STATUS2_NUMCNTF_MASK (0xFFU) +#define CDOG_STATUS2_NUMCNTF_SHIFT (0U) +/*! NUMCNTF - Number of CONTROL faults since the last POR */ +#define CDOG_STATUS2_NUMCNTF(x) (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS2_NUMCNTF_SHIFT)) & CDOG_STATUS2_NUMCNTF_MASK) + +#define CDOG_STATUS2_NUMILLSTF_MASK (0xFF00U) +#define CDOG_STATUS2_NUMILLSTF_SHIFT (8U) +/*! NUMILLSTF - Number of STATE faults since the last POR */ +#define CDOG_STATUS2_NUMILLSTF(x) (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS2_NUMILLSTF_SHIFT)) & CDOG_STATUS2_NUMILLSTF_MASK) + +#define CDOG_STATUS2_NUMILLA_MASK (0xFF0000U) +#define CDOG_STATUS2_NUMILLA_SHIFT (16U) +/*! NUMILLA - Number of ADDRESS faults since the last POR */ +#define CDOG_STATUS2_NUMILLA(x) (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS2_NUMILLA_SHIFT)) & CDOG_STATUS2_NUMILLA_MASK) +/*! @} */ + +/*! @name FLAGS - Flags Register */ +/*! @{ */ + +#define CDOG_FLAGS_TO_FLAG_MASK (0x1U) +#define CDOG_FLAGS_TO_FLAG_SHIFT (0U) +/*! TO_FLAG - TIMEOUT fault flag + * 0b0..A TIMEOUT fault has not occurred + * 0b1..A TIMEOUT fault has occurred + */ +#define CDOG_FLAGS_TO_FLAG(x) (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_TO_FLAG_SHIFT)) & CDOG_FLAGS_TO_FLAG_MASK) + +#define CDOG_FLAGS_MISCOM_FLAG_MASK (0x2U) +#define CDOG_FLAGS_MISCOM_FLAG_SHIFT (1U) +/*! MISCOM_FLAG - MISCOMPARE fault flag + * 0b0..A MISCOMPARE fault has not occurred + * 0b1..A MISCOMPARE fault has occurred + */ +#define CDOG_FLAGS_MISCOM_FLAG(x) (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_MISCOM_FLAG_SHIFT)) & CDOG_FLAGS_MISCOM_FLAG_MASK) + +#define CDOG_FLAGS_SEQ_FLAG_MASK (0x4U) +#define CDOG_FLAGS_SEQ_FLAG_SHIFT (2U) +/*! SEQ_FLAG - SEQUENCE fault flag + * 0b0..A SEQUENCE fault has not occurred + * 0b1..A SEQUENCE fault has occurred + */ +#define CDOG_FLAGS_SEQ_FLAG(x) (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_SEQ_FLAG_SHIFT)) & CDOG_FLAGS_SEQ_FLAG_MASK) + +#define CDOG_FLAGS_CNT_FLAG_MASK (0x8U) +#define CDOG_FLAGS_CNT_FLAG_SHIFT (3U) +/*! CNT_FLAG - CONTROL fault flag + * 0b0..A CONTROL fault has not occurred + * 0b1..A CONTROL fault has occurred + */ +#define CDOG_FLAGS_CNT_FLAG(x) (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_CNT_FLAG_SHIFT)) & CDOG_FLAGS_CNT_FLAG_MASK) + +#define CDOG_FLAGS_STATE_FLAG_MASK (0x10U) +#define CDOG_FLAGS_STATE_FLAG_SHIFT (4U) +/*! STATE_FLAG - STATE fault flag + * 0b0..A STATE fault has not occurred + * 0b1..A STATE fault has occurred + */ +#define CDOG_FLAGS_STATE_FLAG(x) (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_STATE_FLAG_SHIFT)) & CDOG_FLAGS_STATE_FLAG_MASK) + +#define CDOG_FLAGS_ADDR_FLAG_MASK (0x20U) +#define CDOG_FLAGS_ADDR_FLAG_SHIFT (5U) +/*! ADDR_FLAG - ADDRESS fault flag + * 0b0..An ADDRESS fault has not occurred + * 0b1..An ADDRESS fault has occurred + */ +#define CDOG_FLAGS_ADDR_FLAG(x) (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_ADDR_FLAG_SHIFT)) & CDOG_FLAGS_ADDR_FLAG_MASK) + +#define CDOG_FLAGS_POR_FLAG_MASK (0x10000U) +#define CDOG_FLAGS_POR_FLAG_SHIFT (16U) +/*! POR_FLAG - Power-on reset flag + * 0b0..A Power-on reset event has not occurred + * 0b1..A Power-on reset event has occurred + */ +#define CDOG_FLAGS_POR_FLAG(x) (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_POR_FLAG_SHIFT)) & CDOG_FLAGS_POR_FLAG_MASK) +/*! @} */ + +/*! @name PERSISTENT - Persistent Data Storage Register */ +/*! @{ */ + +#define CDOG_PERSISTENT_PERSIS_MASK (0xFFFFFFFFU) +#define CDOG_PERSISTENT_PERSIS_SHIFT (0U) +/*! PERSIS - Persistent Storage */ +#define CDOG_PERSISTENT_PERSIS(x) (((uint32_t)(((uint32_t)(x)) << CDOG_PERSISTENT_PERSIS_SHIFT)) & CDOG_PERSISTENT_PERSIS_MASK) +/*! @} */ + +/*! @name START - START Command Register */ +/*! @{ */ + +#define CDOG_START_STRT_MASK (0xFFFFFFFFU) +#define CDOG_START_STRT_SHIFT (0U) +/*! STRT - Start command */ +#define CDOG_START_STRT(x) (((uint32_t)(((uint32_t)(x)) << CDOG_START_STRT_SHIFT)) & CDOG_START_STRT_MASK) +/*! @} */ + +/*! @name STOP - STOP Command Register */ +/*! @{ */ + +#define CDOG_STOP_STP_MASK (0xFFFFFFFFU) +#define CDOG_STOP_STP_SHIFT (0U) +/*! STP - Stop command */ +#define CDOG_STOP_STP(x) (((uint32_t)(((uint32_t)(x)) << CDOG_STOP_STP_SHIFT)) & CDOG_STOP_STP_MASK) +/*! @} */ + +/*! @name RESTART - RESTART Command Register */ +/*! @{ */ + +#define CDOG_RESTART_RSTRT_MASK (0xFFFFFFFFU) +#define CDOG_RESTART_RSTRT_SHIFT (0U) +/*! RSTRT - Restart command */ +#define CDOG_RESTART_RSTRT(x) (((uint32_t)(((uint32_t)(x)) << CDOG_RESTART_RSTRT_SHIFT)) & CDOG_RESTART_RSTRT_MASK) +/*! @} */ + +/*! @name ADD - ADD Command Register */ +/*! @{ */ + +#define CDOG_ADD_AD_MASK (0xFFFFFFFFU) +#define CDOG_ADD_AD_SHIFT (0U) +/*! AD - ADD Write Value */ +#define CDOG_ADD_AD(x) (((uint32_t)(((uint32_t)(x)) << CDOG_ADD_AD_SHIFT)) & CDOG_ADD_AD_MASK) +/*! @} */ + +/*! @name ADD1 - ADD1 Command Register */ +/*! @{ */ + +#define CDOG_ADD1_AD1_MASK (0xFFFFFFFFU) +#define CDOG_ADD1_AD1_SHIFT (0U) +/*! AD1 - ADD 1 */ +#define CDOG_ADD1_AD1(x) (((uint32_t)(((uint32_t)(x)) << CDOG_ADD1_AD1_SHIFT)) & CDOG_ADD1_AD1_MASK) +/*! @} */ + +/*! @name ADD16 - ADD16 Command Register */ +/*! @{ */ + +#define CDOG_ADD16_AD16_MASK (0xFFFFFFFFU) +#define CDOG_ADD16_AD16_SHIFT (0U) +/*! AD16 - ADD 16 */ +#define CDOG_ADD16_AD16(x) (((uint32_t)(((uint32_t)(x)) << CDOG_ADD16_AD16_SHIFT)) & CDOG_ADD16_AD16_MASK) +/*! @} */ + +/*! @name ADD256 - ADD256 Command Register */ +/*! @{ */ + +#define CDOG_ADD256_AD256_MASK (0xFFFFFFFFU) +#define CDOG_ADD256_AD256_SHIFT (0U) +/*! AD256 - ADD 256 */ +#define CDOG_ADD256_AD256(x) (((uint32_t)(((uint32_t)(x)) << CDOG_ADD256_AD256_SHIFT)) & CDOG_ADD256_AD256_MASK) +/*! @} */ + +/*! @name SUB - SUB Command Register */ +/*! @{ */ + +#define CDOG_SUB_SB_MASK (0xFFFFFFFFU) +#define CDOG_SUB_SB_SHIFT (0U) +/*! SB - Subtract Write Value */ +#define CDOG_SUB_SB(x) (((uint32_t)(((uint32_t)(x)) << CDOG_SUB_SB_SHIFT)) & CDOG_SUB_SB_MASK) +/*! @} */ + +/*! @name SUB1 - SUB1 Command Register */ +/*! @{ */ + +#define CDOG_SUB1_SB1_MASK (0xFFFFFFFFU) +#define CDOG_SUB1_SB1_SHIFT (0U) +/*! SB1 - Subtract 1 */ +#define CDOG_SUB1_SB1(x) (((uint32_t)(((uint32_t)(x)) << CDOG_SUB1_SB1_SHIFT)) & CDOG_SUB1_SB1_MASK) +/*! @} */ + +/*! @name SUB16 - SUB16 Command Register */ +/*! @{ */ + +#define CDOG_SUB16_SB16_MASK (0xFFFFFFFFU) +#define CDOG_SUB16_SB16_SHIFT (0U) +/*! SB16 - Subtract 16 */ +#define CDOG_SUB16_SB16(x) (((uint32_t)(((uint32_t)(x)) << CDOG_SUB16_SB16_SHIFT)) & CDOG_SUB16_SB16_MASK) +/*! @} */ + +/*! @name SUB256 - SUB256 Command Register */ +/*! @{ */ + +#define CDOG_SUB256_SB256_MASK (0xFFFFFFFFU) +#define CDOG_SUB256_SB256_SHIFT (0U) +/*! SB256 - Subtract 256 */ +#define CDOG_SUB256_SB256(x) (((uint32_t)(((uint32_t)(x)) << CDOG_SUB256_SB256_SHIFT)) & CDOG_SUB256_SB256_MASK) +/*! @} */ + +/*! @name ASSERT16 - ASSERT16 Command Register */ +/*! @{ */ + +#define CDOG_ASSERT16_AST16_MASK (0xFFFFFFFFU) +#define CDOG_ASSERT16_AST16_SHIFT (0U) +/*! AST16 - ASSERT16 Command */ +#define CDOG_ASSERT16_AST16(x) (((uint32_t)(((uint32_t)(x)) << CDOG_ASSERT16_AST16_SHIFT)) & CDOG_ASSERT16_AST16_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group CDOG_Register_Masks */ + + +/* CDOG - Peripheral instance base addresses */ +/** Peripheral CDOG base address */ +#define CDOG_BASE (0x40100000u) +/** Peripheral CDOG base pointer */ +#define CDOG ((CDOG_Type *)CDOG_BASE) +/** Array initializer of CDOG peripheral base addresses */ +#define CDOG_BASE_ADDRS { CDOG_BASE } +/** Array initializer of CDOG peripheral base pointers */ +#define CDOG_BASE_PTRS { CDOG } +/** Interrupt vectors for the CDOG peripheral type */ +#define CDOG_IRQS { CDOG0_IRQn } + +/*! + * @} + */ /* end of group CDOG_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- CMC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CMC_Peripheral_Access_Layer CMC Peripheral Access Layer + * @{ + */ + +/** CMC - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + uint8_t RESERVED_0[12]; + __IO uint32_t CKCTRL; /**< Clock Control, offset: 0x10 */ + __IO uint32_t CKSTAT; /**< Clock Status, offset: 0x14 */ + __IO uint32_t PMPROT; /**< Power Mode Protection, offset: 0x18 */ + __O uint32_t GPMCTRL; /**< Global Power Mode Control, offset: 0x1C */ + __IO uint32_t PMCTRL[1]; /**< Power Mode Control, array offset: 0x20, array step: 0x4 */ + uint8_t RESERVED_1[92]; + __I uint32_t SRS; /**< System Reset Status, offset: 0x80 */ + __IO uint32_t RPC; /**< Reset Pin Control, offset: 0x84 */ + __IO uint32_t SSRS; /**< Sticky System Reset Status, offset: 0x88 */ + __IO uint32_t SRIE; /**< System Reset Interrupt Enable, offset: 0x8C */ + __IO uint32_t SRIF; /**< System Reset Interrupt Flag, offset: 0x90 */ + uint8_t RESERVED_2[8]; + __I uint32_t RSTCNT; /**< Reset Count Register, offset: 0x9C */ + __IO uint32_t MR[1]; /**< Mode, array offset: 0xA0, array step: 0x4 */ + uint8_t RESERVED_3[12]; + __IO uint32_t FM[1]; /**< Force Mode, array offset: 0xB0, array step: 0x4 */ + uint8_t RESERVED_4[44]; + __IO uint32_t FLASHCR; /**< Flash Control, offset: 0xE0 */ + uint8_t RESERVED_5[44]; + __IO uint32_t CORECTL; /**< Core Control, offset: 0x110 */ + uint8_t RESERVED_6[12]; + __IO uint32_t DBGCTL; /**< Debug Control, offset: 0x120 */ +} CMC_Type; + +/* ---------------------------------------------------------------------------- + -- CMC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CMC_Register_Masks CMC Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define CMC_VERID_FEATURE_MASK (0xFFFFU) +#define CMC_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number */ +#define CMC_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << CMC_VERID_FEATURE_SHIFT)) & CMC_VERID_FEATURE_MASK) + +#define CMC_VERID_MINOR_MASK (0xFF0000U) +#define CMC_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define CMC_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << CMC_VERID_MINOR_SHIFT)) & CMC_VERID_MINOR_MASK) + +#define CMC_VERID_MAJOR_MASK (0xFF000000U) +#define CMC_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define CMC_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << CMC_VERID_MAJOR_SHIFT)) & CMC_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name CKCTRL - Clock Control */ +/*! @{ */ + +#define CMC_CKCTRL_CKMODE_MASK (0xFU) +#define CMC_CKCTRL_CKMODE_SHIFT (0U) +/*! CKMODE - Clocking Mode + * 0b0000..No clock gating + * 0b1111..Core, platform, and peripheral clocks are gated, and core enters Low-Power mode. + */ +#define CMC_CKCTRL_CKMODE(x) (((uint32_t)(((uint32_t)(x)) << CMC_CKCTRL_CKMODE_SHIFT)) & CMC_CKCTRL_CKMODE_MASK) + +#define CMC_CKCTRL_LOCK_MASK (0x80000000U) +#define CMC_CKCTRL_LOCK_SHIFT (31U) +/*! LOCK - Lock + * 0b0..Allowed + * 0b1..Blocked + */ +#define CMC_CKCTRL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CMC_CKCTRL_LOCK_SHIFT)) & CMC_CKCTRL_LOCK_MASK) +/*! @} */ + +/*! @name CKSTAT - Clock Status */ +/*! @{ */ + +#define CMC_CKSTAT_CKMODE_MASK (0xFU) +#define CMC_CKSTAT_CKMODE_SHIFT (0U) +/*! CKMODE - Low Power Status + * 0b0000..Core clock not gated + * 0b1111..Core, platform, and peripheral clocks were gated, and power domain entered Low-Power mode + * *.. + */ +#define CMC_CKSTAT_CKMODE(x) (((uint32_t)(((uint32_t)(x)) << CMC_CKSTAT_CKMODE_SHIFT)) & CMC_CKSTAT_CKMODE_MASK) + +#define CMC_CKSTAT_WAKEUP_MASK (0xFF00U) +#define CMC_CKSTAT_WAKEUP_SHIFT (8U) +/*! WAKEUP - Wake-up Source */ +#define CMC_CKSTAT_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CMC_CKSTAT_WAKEUP_SHIFT)) & CMC_CKSTAT_WAKEUP_MASK) + +#define CMC_CKSTAT_VALID_MASK (0x80000000U) +#define CMC_CKSTAT_VALID_SHIFT (31U) +/*! VALID - Clock Status Valid + * 0b0..Core clock not gated + * 0b1..Core clock was gated due to Low-Power mode entry + */ +#define CMC_CKSTAT_VALID(x) (((uint32_t)(((uint32_t)(x)) << CMC_CKSTAT_VALID_SHIFT)) & CMC_CKSTAT_VALID_MASK) +/*! @} */ + +/*! @name PMPROT - Power Mode Protection */ +/*! @{ */ + +#define CMC_PMPROT_LPMODE_MASK (0xFU) +#define CMC_PMPROT_LPMODE_SHIFT (0U) +/*! LPMODE - Low-Power Mode + * 0b0000..Not allowed + * 0b0001..Allowed + * 0b0010..Allowed + * 0b0011..Allowed + * 0b0100..Allowed + * 0b0101..Allowed + * 0b0110..Allowed + * 0b0111..Allowed + * 0b1000..Allowed + * 0b1001..Allowed + * 0b1010..Allowed + * 0b1011..Allowed + * 0b1100..Allowed + * 0b1101..Allowed + * 0b1110..Allowed + * 0b1111..Allowed + */ +#define CMC_PMPROT_LPMODE(x) (((uint32_t)(((uint32_t)(x)) << CMC_PMPROT_LPMODE_SHIFT)) & CMC_PMPROT_LPMODE_MASK) + +#define CMC_PMPROT_LOCK_MASK (0x80000000U) +#define CMC_PMPROT_LOCK_SHIFT (31U) +/*! LOCK - Lock Register + * 0b0..Allowed + * 0b1..Blocked + */ +#define CMC_PMPROT_LOCK(x) (((uint32_t)(((uint32_t)(x)) << CMC_PMPROT_LOCK_SHIFT)) & CMC_PMPROT_LOCK_MASK) +/*! @} */ + +/*! @name GPMCTRL - Global Power Mode Control */ +/*! @{ */ + +#define CMC_GPMCTRL_LPMODE_MASK (0xFU) +#define CMC_GPMCTRL_LPMODE_SHIFT (0U) +/*! LPMODE - Low-Power Mode */ +#define CMC_GPMCTRL_LPMODE(x) (((uint32_t)(((uint32_t)(x)) << CMC_GPMCTRL_LPMODE_SHIFT)) & CMC_GPMCTRL_LPMODE_MASK) +/*! @} */ + +/*! @name PMCTRL - Power Mode Control */ +/*! @{ */ + +#define CMC_PMCTRL_LPMODE_MASK (0xFU) +#define CMC_PMCTRL_LPMODE_SHIFT (0U) +/*! LPMODE - Low-Power Mode + * 0b0000..Active/Sleep + * 0b0001..Deep Sleep + * 0b0011..Power Down + * 0b0111..Reserved + * 0b1111..Deep-Power Down + */ +#define CMC_PMCTRL_LPMODE(x) (((uint32_t)(((uint32_t)(x)) << CMC_PMCTRL_LPMODE_SHIFT)) & CMC_PMCTRL_LPMODE_MASK) +/*! @} */ + +/* The count of CMC_PMCTRL */ +#define CMC_PMCTRL_COUNT (1U) + +/*! @name SRS - System Reset Status */ +/*! @{ */ + +#define CMC_SRS_WAKEUP_MASK (0x1U) +#define CMC_SRS_WAKEUP_SHIFT (0U) +/*! WAKEUP - Wake-up Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_WAKEUP_SHIFT)) & CMC_SRS_WAKEUP_MASK) + +#define CMC_SRS_POR_MASK (0x2U) +#define CMC_SRS_POR_SHIFT (1U) +/*! POR - Power-on Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_POR(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_POR_SHIFT)) & CMC_SRS_POR_MASK) + +#define CMC_SRS_VD_MASK (0x4U) +#define CMC_SRS_VD_SHIFT (2U) +/*! VD - Voltage Detect Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_VD(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_VD_SHIFT)) & CMC_SRS_VD_MASK) + +#define CMC_SRS_WARM_MASK (0x10U) +#define CMC_SRS_WARM_SHIFT (4U) +/*! WARM - Warm Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_WARM(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_WARM_SHIFT)) & CMC_SRS_WARM_MASK) + +#define CMC_SRS_FATAL_MASK (0x20U) +#define CMC_SRS_FATAL_SHIFT (5U) +/*! FATAL - Fatal Reset + * 0b0..Reset was not generated + * 0b1..Reset was generated + */ +#define CMC_SRS_FATAL(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_FATAL_SHIFT)) & CMC_SRS_FATAL_MASK) + +#define CMC_SRS_PIN_MASK (0x100U) +#define CMC_SRS_PIN_SHIFT (8U) +/*! PIN - Pin Reset + * 0b0..Reset was not generated + * 0b1..Reset was generated + */ +#define CMC_SRS_PIN(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_PIN_SHIFT)) & CMC_SRS_PIN_MASK) + +#define CMC_SRS_DAP_MASK (0x200U) +#define CMC_SRS_DAP_SHIFT (9U) +/*! DAP - Debug Access Port Reset + * 0b0..Reset was not generated + * 0b1..Reset was generated + */ +#define CMC_SRS_DAP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_DAP_SHIFT)) & CMC_SRS_DAP_MASK) + +#define CMC_SRS_RSTACK_MASK (0x400U) +#define CMC_SRS_RSTACK_SHIFT (10U) +/*! RSTACK - Reset Timeout + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_RSTACK(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_RSTACK_SHIFT)) & CMC_SRS_RSTACK_MASK) + +#define CMC_SRS_LPACK_MASK (0x800U) +#define CMC_SRS_LPACK_SHIFT (11U) +/*! LPACK - Low Power Acknowledge Timeout Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_LPACK(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_LPACK_SHIFT)) & CMC_SRS_LPACK_MASK) + +#define CMC_SRS_SCG_MASK (0x1000U) +#define CMC_SRS_SCG_SHIFT (12U) +/*! SCG - System Clock Generation Reset + * 0b0..Reset is not generated + * 0b1..Reset is generated + */ +#define CMC_SRS_SCG(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_SCG_SHIFT)) & CMC_SRS_SCG_MASK) + +#define CMC_SRS_WWDT0_MASK (0x2000U) +#define CMC_SRS_WWDT0_SHIFT (13U) +/*! WWDT0 - Windowed Watchdog 0 Reset + * 0b0..Reset is not generated + * 0b1..Reset is generated + */ +#define CMC_SRS_WWDT0(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_WWDT0_SHIFT)) & CMC_SRS_WWDT0_MASK) + +#define CMC_SRS_SW_MASK (0x4000U) +#define CMC_SRS_SW_SHIFT (14U) +/*! SW - Software Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_SW(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_SW_SHIFT)) & CMC_SRS_SW_MASK) + +#define CMC_SRS_LOCKUP_MASK (0x8000U) +#define CMC_SRS_LOCKUP_SHIFT (15U) +/*! LOCKUP - Lockup Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_LOCKUP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_LOCKUP_SHIFT)) & CMC_SRS_LOCKUP_MASK) + +#define CMC_SRS_CDOG0_MASK (0x4000000U) +#define CMC_SRS_CDOG0_SHIFT (26U) +/*! CDOG0 - Code Watchdog 0 Reset + * 0b0..Reset is not generated + * 0b1..Reset is generated + */ +#define CMC_SRS_CDOG0(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_CDOG0_SHIFT)) & CMC_SRS_CDOG0_MASK) + +#define CMC_SRS_JTAG_MASK (0x10000000U) +#define CMC_SRS_JTAG_SHIFT (28U) +/*! JTAG - JTAG System Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SRS_JTAG(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRS_JTAG_SHIFT)) & CMC_SRS_JTAG_MASK) +/*! @} */ + +/*! @name RPC - Reset Pin Control */ +/*! @{ */ + +#define CMC_RPC_FILTCFG_MASK (0x1FU) +#define CMC_RPC_FILTCFG_SHIFT (0U) +/*! FILTCFG - Reset Filter Configuration */ +#define CMC_RPC_FILTCFG(x) (((uint32_t)(((uint32_t)(x)) << CMC_RPC_FILTCFG_SHIFT)) & CMC_RPC_FILTCFG_MASK) + +#define CMC_RPC_FILTEN_MASK (0x100U) +#define CMC_RPC_FILTEN_SHIFT (8U) +/*! FILTEN - Filter Enable + * 0b0..Disables + * 0b1..Enables + */ +#define CMC_RPC_FILTEN(x) (((uint32_t)(((uint32_t)(x)) << CMC_RPC_FILTEN_SHIFT)) & CMC_RPC_FILTEN_MASK) + +#define CMC_RPC_LPFEN_MASK (0x200U) +#define CMC_RPC_LPFEN_SHIFT (9U) +/*! LPFEN - Low-Power Filter Enable + * 0b0..Disables + * 0b1..Enables + */ +#define CMC_RPC_LPFEN(x) (((uint32_t)(((uint32_t)(x)) << CMC_RPC_LPFEN_SHIFT)) & CMC_RPC_LPFEN_MASK) +/*! @} */ + +/*! @name SSRS - Sticky System Reset Status */ +/*! @{ */ + +#define CMC_SSRS_WAKEUP_MASK (0x1U) +#define CMC_SSRS_WAKEUP_SHIFT (0U) +/*! WAKEUP - Wake-up Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_WAKEUP_SHIFT)) & CMC_SSRS_WAKEUP_MASK) + +#define CMC_SSRS_POR_MASK (0x2U) +#define CMC_SSRS_POR_SHIFT (1U) +/*! POR - Power-on Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_POR(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_POR_SHIFT)) & CMC_SSRS_POR_MASK) + +#define CMC_SSRS_VD_MASK (0x4U) +#define CMC_SSRS_VD_SHIFT (2U) +/*! VD - Voltage Detect Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_VD(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_VD_SHIFT)) & CMC_SSRS_VD_MASK) + +#define CMC_SSRS_WARM_MASK (0x10U) +#define CMC_SSRS_WARM_SHIFT (4U) +/*! WARM - Warm Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_WARM(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_WARM_SHIFT)) & CMC_SSRS_WARM_MASK) + +#define CMC_SSRS_FATAL_MASK (0x20U) +#define CMC_SSRS_FATAL_SHIFT (5U) +/*! FATAL - Fatal Reset + * 0b0..Reset was not generated + * 0b1..Reset was generated + */ +#define CMC_SSRS_FATAL(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_FATAL_SHIFT)) & CMC_SSRS_FATAL_MASK) + +#define CMC_SSRS_PIN_MASK (0x100U) +#define CMC_SSRS_PIN_SHIFT (8U) +/*! PIN - Pin Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_PIN(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_PIN_SHIFT)) & CMC_SSRS_PIN_MASK) + +#define CMC_SSRS_DAP_MASK (0x200U) +#define CMC_SSRS_DAP_SHIFT (9U) +/*! DAP - DAP Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_DAP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_DAP_SHIFT)) & CMC_SSRS_DAP_MASK) + +#define CMC_SSRS_RSTACK_MASK (0x400U) +#define CMC_SSRS_RSTACK_SHIFT (10U) +/*! RSTACK - Reset Timeout + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_RSTACK(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_RSTACK_SHIFT)) & CMC_SSRS_RSTACK_MASK) + +#define CMC_SSRS_LPACK_MASK (0x800U) +#define CMC_SSRS_LPACK_SHIFT (11U) +/*! LPACK - Low Power Acknowledge Timeout Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_LPACK(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_LPACK_SHIFT)) & CMC_SSRS_LPACK_MASK) + +#define CMC_SSRS_SCG_MASK (0x1000U) +#define CMC_SSRS_SCG_SHIFT (12U) +/*! SCG - System Clock Generation Reset + * 0b0..Reset is not generated + * 0b1..Reset is generated + */ +#define CMC_SSRS_SCG(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_SCG_SHIFT)) & CMC_SSRS_SCG_MASK) + +#define CMC_SSRS_WWDT0_MASK (0x2000U) +#define CMC_SSRS_WWDT0_SHIFT (13U) +/*! WWDT0 - Windowed Watchdog 0 Reset + * 0b0..Reset is not generated + * 0b1..Reset is generated + */ +#define CMC_SSRS_WWDT0(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_WWDT0_SHIFT)) & CMC_SSRS_WWDT0_MASK) + +#define CMC_SSRS_SW_MASK (0x4000U) +#define CMC_SSRS_SW_SHIFT (14U) +/*! SW - Software Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_SW(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_SW_SHIFT)) & CMC_SSRS_SW_MASK) + +#define CMC_SSRS_LOCKUP_MASK (0x8000U) +#define CMC_SSRS_LOCKUP_SHIFT (15U) +/*! LOCKUP - Lockup Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_LOCKUP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_LOCKUP_SHIFT)) & CMC_SSRS_LOCKUP_MASK) + +#define CMC_SSRS_CDOG0_MASK (0x4000000U) +#define CMC_SSRS_CDOG0_SHIFT (26U) +/*! CDOG0 - Code Watchdog 0 Reset + * 0b0..Reset is not generated + * 0b1..Reset is generated + */ +#define CMC_SSRS_CDOG0(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_CDOG0_SHIFT)) & CMC_SSRS_CDOG0_MASK) + +#define CMC_SSRS_JTAG_MASK (0x10000000U) +#define CMC_SSRS_JTAG_SHIFT (28U) +/*! JTAG - JTAG System Reset + * 0b0..Reset not generated + * 0b1..Reset generated + */ +#define CMC_SSRS_JTAG(x) (((uint32_t)(((uint32_t)(x)) << CMC_SSRS_JTAG_SHIFT)) & CMC_SSRS_JTAG_MASK) +/*! @} */ + +/*! @name SRIE - System Reset Interrupt Enable */ +/*! @{ */ + +#define CMC_SRIE_PIN_MASK (0x100U) +#define CMC_SRIE_PIN_SHIFT (8U) +/*! PIN - Pin Reset + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CMC_SRIE_PIN(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIE_PIN_SHIFT)) & CMC_SRIE_PIN_MASK) + +#define CMC_SRIE_DAP_MASK (0x200U) +#define CMC_SRIE_DAP_SHIFT (9U) +/*! DAP - DAP Reset + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CMC_SRIE_DAP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIE_DAP_SHIFT)) & CMC_SRIE_DAP_MASK) + +#define CMC_SRIE_LPACK_MASK (0x800U) +#define CMC_SRIE_LPACK_SHIFT (11U) +/*! LPACK - Low Power Acknowledge Timeout Reset + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CMC_SRIE_LPACK(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIE_LPACK_SHIFT)) & CMC_SRIE_LPACK_MASK) + +#define CMC_SRIE_SCG_MASK (0x1000U) +#define CMC_SRIE_SCG_SHIFT (12U) +/*! SCG - System Clock Generation Reset + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CMC_SRIE_SCG(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIE_SCG_SHIFT)) & CMC_SRIE_SCG_MASK) + +#define CMC_SRIE_WWDT0_MASK (0x2000U) +#define CMC_SRIE_WWDT0_SHIFT (13U) +/*! WWDT0 - Windowed Watchdog 0 Reset + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CMC_SRIE_WWDT0(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIE_WWDT0_SHIFT)) & CMC_SRIE_WWDT0_MASK) + +#define CMC_SRIE_SW_MASK (0x4000U) +#define CMC_SRIE_SW_SHIFT (14U) +/*! SW - Software Reset + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CMC_SRIE_SW(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIE_SW_SHIFT)) & CMC_SRIE_SW_MASK) + +#define CMC_SRIE_LOCKUP_MASK (0x8000U) +#define CMC_SRIE_LOCKUP_SHIFT (15U) +/*! LOCKUP - Lockup Reset + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CMC_SRIE_LOCKUP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIE_LOCKUP_SHIFT)) & CMC_SRIE_LOCKUP_MASK) + +#define CMC_SRIE_CDOG0_MASK (0x4000000U) +#define CMC_SRIE_CDOG0_SHIFT (26U) +/*! CDOG0 - Code Watchdog 0 Reset + * 0b0..Interrupt disabled + * 0b1..Interrupt enabled + */ +#define CMC_SRIE_CDOG0(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIE_CDOG0_SHIFT)) & CMC_SRIE_CDOG0_MASK) +/*! @} */ + +/*! @name SRIF - System Reset Interrupt Flag */ +/*! @{ */ + +#define CMC_SRIF_PIN_MASK (0x100U) +#define CMC_SRIF_PIN_SHIFT (8U) +/*! PIN - Pin Reset + * 0b0..Reset source not pending + * 0b1..Reset source pending + */ +#define CMC_SRIF_PIN(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIF_PIN_SHIFT)) & CMC_SRIF_PIN_MASK) + +#define CMC_SRIF_DAP_MASK (0x200U) +#define CMC_SRIF_DAP_SHIFT (9U) +/*! DAP - DAP Reset + * 0b0..Reset source not pending + * 0b1..Reset source pending + */ +#define CMC_SRIF_DAP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIF_DAP_SHIFT)) & CMC_SRIF_DAP_MASK) + +#define CMC_SRIF_LPACK_MASK (0x800U) +#define CMC_SRIF_LPACK_SHIFT (11U) +/*! LPACK - Low Power Acknowledge Timeout Reset + * 0b0..Reset source not pending + * 0b1..Reset source pending + */ +#define CMC_SRIF_LPACK(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIF_LPACK_SHIFT)) & CMC_SRIF_LPACK_MASK) + +#define CMC_SRIF_WWDT0_MASK (0x2000U) +#define CMC_SRIF_WWDT0_SHIFT (13U) +/*! WWDT0 - Windowed Watchdog 0 Reset + * 0b0..Reset source not pending + * 0b1..Reset source pending + */ +#define CMC_SRIF_WWDT0(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIF_WWDT0_SHIFT)) & CMC_SRIF_WWDT0_MASK) + +#define CMC_SRIF_SW_MASK (0x4000U) +#define CMC_SRIF_SW_SHIFT (14U) +/*! SW - Software Reset + * 0b0..Reset source not pending + * 0b1..Reset source pending + */ +#define CMC_SRIF_SW(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIF_SW_SHIFT)) & CMC_SRIF_SW_MASK) + +#define CMC_SRIF_LOCKUP_MASK (0x8000U) +#define CMC_SRIF_LOCKUP_SHIFT (15U) +/*! LOCKUP - Lockup Reset + * 0b0..Reset source not pending + * 0b1..Reset source pending + */ +#define CMC_SRIF_LOCKUP(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIF_LOCKUP_SHIFT)) & CMC_SRIF_LOCKUP_MASK) + +#define CMC_SRIF_CDOG0_MASK (0x4000000U) +#define CMC_SRIF_CDOG0_SHIFT (26U) +/*! CDOG0 - Code Watchdog 0 Reset + * 0b0..Reset source not pending + * 0b1..Reset source pending + */ +#define CMC_SRIF_CDOG0(x) (((uint32_t)(((uint32_t)(x)) << CMC_SRIF_CDOG0_SHIFT)) & CMC_SRIF_CDOG0_MASK) +/*! @} */ + +/*! @name RSTCNT - Reset Count Register */ +/*! @{ */ + +#define CMC_RSTCNT_COUNT_MASK (0xFFU) +#define CMC_RSTCNT_COUNT_SHIFT (0U) +/*! COUNT - Count */ +#define CMC_RSTCNT_COUNT(x) (((uint32_t)(((uint32_t)(x)) << CMC_RSTCNT_COUNT_SHIFT)) & CMC_RSTCNT_COUNT_MASK) +/*! @} */ + +/*! @name MR - Mode */ +/*! @{ */ + +#define CMC_MR_ISPMODE_n_MASK (0x1U) +#define CMC_MR_ISPMODE_n_SHIFT (0U) +/*! ISPMODE_n - In System Programming Mode */ +#define CMC_MR_ISPMODE_n(x) (((uint32_t)(((uint32_t)(x)) << CMC_MR_ISPMODE_n_SHIFT)) & CMC_MR_ISPMODE_n_MASK) +/*! @} */ + +/* The count of CMC_MR */ +#define CMC_MR_COUNT (1U) + +/*! @name FM - Force Mode */ +/*! @{ */ + +#define CMC_FM_FORCECFG_MASK (0x1U) +#define CMC_FM_FORCECFG_SHIFT (0U) +/*! FORCECFG - Boot Configuration + * 0b0..No effect + * 0b1..Asserts + */ +#define CMC_FM_FORCECFG(x) (((uint32_t)(((uint32_t)(x)) << CMC_FM_FORCECFG_SHIFT)) & CMC_FM_FORCECFG_MASK) +/*! @} */ + +/* The count of CMC_FM */ +#define CMC_FM_COUNT (1U) + +/*! @name FLASHCR - Flash Control */ +/*! @{ */ + +#define CMC_FLASHCR_FLASHDIS_MASK (0x1U) +#define CMC_FLASHCR_FLASHDIS_SHIFT (0U) +/*! FLASHDIS - Flash Disable + * 0b0..No effect + * 0b1..Flash memory is disabled + */ +#define CMC_FLASHCR_FLASHDIS(x) (((uint32_t)(((uint32_t)(x)) << CMC_FLASHCR_FLASHDIS_SHIFT)) & CMC_FLASHCR_FLASHDIS_MASK) + +#define CMC_FLASHCR_FLASHDOZE_MASK (0x2U) +#define CMC_FLASHCR_FLASHDOZE_SHIFT (1U) +/*! FLASHDOZE - Flash Doze + * 0b0..No effect + * 0b1..Flash memory is disabled when core is sleeping (CKMODE > 0) + */ +#define CMC_FLASHCR_FLASHDOZE(x) (((uint32_t)(((uint32_t)(x)) << CMC_FLASHCR_FLASHDOZE_SHIFT)) & CMC_FLASHCR_FLASHDOZE_MASK) + +#define CMC_FLASHCR_FLASHWAKE_MASK (0x4U) +#define CMC_FLASHCR_FLASHWAKE_SHIFT (2U) +/*! FLASHWAKE - Flash Wake + * 0b0..No effect + * 0b1..Flash memory is not disabled during flash memory accesses + */ +#define CMC_FLASHCR_FLASHWAKE(x) (((uint32_t)(((uint32_t)(x)) << CMC_FLASHCR_FLASHWAKE_SHIFT)) & CMC_FLASHCR_FLASHWAKE_MASK) +/*! @} */ + +/*! @name CORECTL - Core Control */ +/*! @{ */ + +#define CMC_CORECTL_NPIE_MASK (0x1U) +#define CMC_CORECTL_NPIE_SHIFT (0U) +/*! NPIE - Non-maskable Pin Interrupt Enable + * 0b0..Disables + * 0b1..Enables + */ +#define CMC_CORECTL_NPIE(x) (((uint32_t)(((uint32_t)(x)) << CMC_CORECTL_NPIE_SHIFT)) & CMC_CORECTL_NPIE_MASK) +/*! @} */ + +/*! @name DBGCTL - Debug Control */ +/*! @{ */ + +#define CMC_DBGCTL_SOD_MASK (0x1U) +#define CMC_DBGCTL_SOD_SHIFT (0U) +/*! SOD - Sleep Or Debug + * 0b0..Remains enabled + * 0b1..Disabled + */ +#define CMC_DBGCTL_SOD(x) (((uint32_t)(((uint32_t)(x)) << CMC_DBGCTL_SOD_SHIFT)) & CMC_DBGCTL_SOD_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group CMC_Register_Masks */ + + +/* CMC - Peripheral instance base addresses */ +/** Peripheral CMC base address */ +#define CMC_BASE (0x4008B000u) +/** Peripheral CMC base pointer */ +#define CMC ((CMC_Type *)CMC_BASE) +/** Array initializer of CMC peripheral base addresses */ +#define CMC_BASE_ADDRS { CMC_BASE } +/** Array initializer of CMC peripheral base pointers */ +#define CMC_BASE_PTRS { CMC } + +/*! + * @} + */ /* end of group CMC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- CRC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CRC_Peripheral_Access_Layer CRC Peripheral Access Layer + * @{ + */ + +/** CRC - Register Layout Typedef */ +typedef struct { + union { /* offset: 0x0 */ + struct { /* offset: 0x0 */ + __IO uint8_t DATALL; /**< CRC_DATALL register, offset: 0x0 */ + __IO uint8_t DATALU; /**< CRC_DATALU register, offset: 0x1 */ + __IO uint8_t DATAHL; /**< CRC_DATAHL register, offset: 0x2 */ + __IO uint8_t DATAHU; /**< CRC_DATAHU register, offset: 0x3 */ + } ACCESS8BIT; + struct { /* offset: 0x0 */ + __IO uint16_t DATAL; /**< CRC_DATAL register, offset: 0x0 */ + __IO uint16_t DATAH; /**< CRC_DATAH register, offset: 0x2 */ + } ACCESS16BIT; + __IO uint32_t DATA; /**< Data, offset: 0x0 */ + }; + union { /* offset: 0x4 */ + struct { /* offset: 0x4 */ + __IO uint8_t GPOLYLL; /**< CRC_GPOLYLL register, offset: 0x4 */ + __IO uint8_t GPOLYLU; /**< CRC_GPOLYLU register, offset: 0x5 */ + __IO uint8_t GPOLYHL; /**< CRC_GPOLYHL register, offset: 0x6 */ + __IO uint8_t GPOLYHU; /**< CRC_GPOLYHU register, offset: 0x7 */ + } GPOLY_ACCESS8BIT; + struct { /* offset: 0x4 */ + __IO uint16_t GPOLYL; /**< CRC_GPOLYL register, offset: 0x4 */ + __IO uint16_t GPOLYH; /**< CRC_GPOLYH register, offset: 0x6 */ + } GPOLY_ACCESS16BIT; + __IO uint32_t GPOLY; /**< Polynomial, offset: 0x4 */ + }; + union { /* offset: 0x8 */ + struct { /* offset: 0x8 */ + uint8_t RESERVED_0[3]; + __IO uint8_t CTRLHU; /**< CRC_CTRLHU register, offset: 0xB */ + } CTRL_ACCESS8BIT; + __IO uint32_t CTRL; /**< Control, offset: 0x8 */ + }; +} CRC_Type; + +/* ---------------------------------------------------------------------------- + -- CRC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CRC_Register_Masks CRC Register Masks + * @{ + */ + +/*! @name DATALL - CRC_DATALL register */ +/*! @{ */ + +#define CRC_DATALL_DATALL_MASK (0xFFU) +#define CRC_DATALL_DATALL_SHIFT (0U) +#define CRC_DATALL_DATALL(x) (((uint8_t)(((uint8_t)(x)) << CRC_DATALL_DATALL_SHIFT)) & CRC_DATALL_DATALL_MASK) +/*! @} */ + +/*! @name DATALU - CRC_DATALU register */ +/*! @{ */ + +#define CRC_DATALU_DATALU_MASK (0xFFU) +#define CRC_DATALU_DATALU_SHIFT (0U) +#define CRC_DATALU_DATALU(x) (((uint8_t)(((uint8_t)(x)) << CRC_DATALU_DATALU_SHIFT)) & CRC_DATALU_DATALU_MASK) +/*! @} */ + +/*! @name DATAHL - CRC_DATAHL register */ +/*! @{ */ + +#define CRC_DATAHL_DATAHL_MASK (0xFFU) +#define CRC_DATAHL_DATAHL_SHIFT (0U) +#define CRC_DATAHL_DATAHL(x) (((uint8_t)(((uint8_t)(x)) << CRC_DATAHL_DATAHL_SHIFT)) & CRC_DATAHL_DATAHL_MASK) +/*! @} */ + +/*! @name DATAHU - CRC_DATAHU register */ +/*! @{ */ + +#define CRC_DATAHU_DATAHU_MASK (0xFFU) +#define CRC_DATAHU_DATAHU_SHIFT (0U) +#define CRC_DATAHU_DATAHU(x) (((uint8_t)(((uint8_t)(x)) << CRC_DATAHU_DATAHU_SHIFT)) & CRC_DATAHU_DATAHU_MASK) +/*! @} */ + +/*! @name DATAL - CRC_DATAL register */ +/*! @{ */ + +#define CRC_DATAL_DATAL_MASK (0xFFFFU) +#define CRC_DATAL_DATAL_SHIFT (0U) +#define CRC_DATAL_DATAL(x) (((uint16_t)(((uint16_t)(x)) << CRC_DATAL_DATAL_SHIFT)) & CRC_DATAL_DATAL_MASK) +/*! @} */ + +/*! @name DATAH - CRC_DATAH register */ +/*! @{ */ + +#define CRC_DATAH_DATAH_MASK (0xFFFFU) +#define CRC_DATAH_DATAH_SHIFT (0U) +#define CRC_DATAH_DATAH(x) (((uint16_t)(((uint16_t)(x)) << CRC_DATAH_DATAH_SHIFT)) & CRC_DATAH_DATAH_MASK) +/*! @} */ + +/*! @name DATA - Data */ +/*! @{ */ + +#define CRC_DATA_LL_MASK (0xFFU) +#define CRC_DATA_LL_SHIFT (0U) +/*! LL - Lower Part of Low Byte */ +#define CRC_DATA_LL(x) (((uint32_t)(((uint32_t)(x)) << CRC_DATA_LL_SHIFT)) & CRC_DATA_LL_MASK) + +#define CRC_DATA_LU_MASK (0xFF00U) +#define CRC_DATA_LU_SHIFT (8U) +/*! LU - Upper Part of Low Byte */ +#define CRC_DATA_LU(x) (((uint32_t)(((uint32_t)(x)) << CRC_DATA_LU_SHIFT)) & CRC_DATA_LU_MASK) + +#define CRC_DATA_HL_MASK (0xFF0000U) +#define CRC_DATA_HL_SHIFT (16U) +/*! HL - Lower Part of High Byte */ +#define CRC_DATA_HL(x) (((uint32_t)(((uint32_t)(x)) << CRC_DATA_HL_SHIFT)) & CRC_DATA_HL_MASK) + +#define CRC_DATA_HU_MASK (0xFF000000U) +#define CRC_DATA_HU_SHIFT (24U) +/*! HU - Upper Part of High Byte */ +#define CRC_DATA_HU(x) (((uint32_t)(((uint32_t)(x)) << CRC_DATA_HU_SHIFT)) & CRC_DATA_HU_MASK) +/*! @} */ + +/*! @name GPOLYLL - CRC_GPOLYLL register */ +/*! @{ */ + +#define CRC_GPOLYLL_GPOLYLL_MASK (0xFFU) +#define CRC_GPOLYLL_GPOLYLL_SHIFT (0U) +#define CRC_GPOLYLL_GPOLYLL(x) (((uint8_t)(((uint8_t)(x)) << CRC_GPOLYLL_GPOLYLL_SHIFT)) & CRC_GPOLYLL_GPOLYLL_MASK) +/*! @} */ + +/*! @name GPOLYLU - CRC_GPOLYLU register */ +/*! @{ */ + +#define CRC_GPOLYLU_GPOLYLU_MASK (0xFFU) +#define CRC_GPOLYLU_GPOLYLU_SHIFT (0U) +#define CRC_GPOLYLU_GPOLYLU(x) (((uint8_t)(((uint8_t)(x)) << CRC_GPOLYLU_GPOLYLU_SHIFT)) & CRC_GPOLYLU_GPOLYLU_MASK) +/*! @} */ + +/*! @name GPOLYHL - CRC_GPOLYHL register */ +/*! @{ */ + +#define CRC_GPOLYHL_GPOLYHL_MASK (0xFFU) +#define CRC_GPOLYHL_GPOLYHL_SHIFT (0U) +#define CRC_GPOLYHL_GPOLYHL(x) (((uint8_t)(((uint8_t)(x)) << CRC_GPOLYHL_GPOLYHL_SHIFT)) & CRC_GPOLYHL_GPOLYHL_MASK) +/*! @} */ + +/*! @name GPOLYHU - CRC_GPOLYHU register */ +/*! @{ */ + +#define CRC_GPOLYHU_GPOLYHU_MASK (0xFFU) +#define CRC_GPOLYHU_GPOLYHU_SHIFT (0U) +#define CRC_GPOLYHU_GPOLYHU(x) (((uint8_t)(((uint8_t)(x)) << CRC_GPOLYHU_GPOLYHU_SHIFT)) & CRC_GPOLYHU_GPOLYHU_MASK) +/*! @} */ + +/*! @name GPOLYL - CRC_GPOLYL register */ +/*! @{ */ + +#define CRC_GPOLYL_GPOLYL_MASK (0xFFFFU) +#define CRC_GPOLYL_GPOLYL_SHIFT (0U) +#define CRC_GPOLYL_GPOLYL(x) (((uint16_t)(((uint16_t)(x)) << CRC_GPOLYL_GPOLYL_SHIFT)) & CRC_GPOLYL_GPOLYL_MASK) +/*! @} */ + +/*! @name GPOLYH - CRC_GPOLYH register */ +/*! @{ */ + +#define CRC_GPOLYH_GPOLYH_MASK (0xFFFFU) +#define CRC_GPOLYH_GPOLYH_SHIFT (0U) +#define CRC_GPOLYH_GPOLYH(x) (((uint16_t)(((uint16_t)(x)) << CRC_GPOLYH_GPOLYH_SHIFT)) & CRC_GPOLYH_GPOLYH_MASK) +/*! @} */ + +/*! @name GPOLY - Polynomial */ +/*! @{ */ + +#define CRC_GPOLY_LOW_MASK (0xFFFFU) +#define CRC_GPOLY_LOW_SHIFT (0U) +/*! LOW - Low Half-Word */ +#define CRC_GPOLY_LOW(x) (((uint32_t)(((uint32_t)(x)) << CRC_GPOLY_LOW_SHIFT)) & CRC_GPOLY_LOW_MASK) + +#define CRC_GPOLY_HIGH_MASK (0xFFFF0000U) +#define CRC_GPOLY_HIGH_SHIFT (16U) +/*! HIGH - High Half-Word */ +#define CRC_GPOLY_HIGH(x) (((uint32_t)(((uint32_t)(x)) << CRC_GPOLY_HIGH_SHIFT)) & CRC_GPOLY_HIGH_MASK) +/*! @} */ + +/*! @name CTRLHU - CRC_CTRLHU register */ +/*! @{ */ + +#define CRC_CTRLHU_TCRC_MASK (0x1U) +#define CRC_CTRLHU_TCRC_SHIFT (0U) +/*! TCRC - TCRC + * 0b0..16 bits + * 0b1..32 bits + */ +#define CRC_CTRLHU_TCRC(x) (((uint8_t)(((uint8_t)(x)) << CRC_CTRLHU_TCRC_SHIFT)) & CRC_CTRLHU_TCRC_MASK) + +#define CRC_CTRLHU_WAS_MASK (0x2U) +#define CRC_CTRLHU_WAS_SHIFT (1U) +/*! WAS - Write as Seed + * 0b0..Data values + * 0b1..Seed values + */ +#define CRC_CTRLHU_WAS(x) (((uint8_t)(((uint8_t)(x)) << CRC_CTRLHU_WAS_SHIFT)) & CRC_CTRLHU_WAS_MASK) + +#define CRC_CTRLHU_FXOR_MASK (0x4U) +#define CRC_CTRLHU_FXOR_SHIFT (2U) +/*! FXOR - Complement Read of CRC Data Register + * 0b0..Disables XOR on reading data. + * 0b1..Inverts or complements the read value of the CRC Data. + */ +#define CRC_CTRLHU_FXOR(x) (((uint8_t)(((uint8_t)(x)) << CRC_CTRLHU_FXOR_SHIFT)) & CRC_CTRLHU_FXOR_MASK) + +#define CRC_CTRLHU_TOTR_MASK (0x30U) +#define CRC_CTRLHU_TOTR_SHIFT (4U) +/*! TOTR - Transpose Type for Read + * 0b00..No transposition + * 0b01..Bits in bytes are transposed, but bytes are not transposed. + * 0b10..Both bits in bytes and bytes are transposed. + * 0b11..Only bytes are transposed, no bits in a byte are transposed. + */ +#define CRC_CTRLHU_TOTR(x) (((uint8_t)(((uint8_t)(x)) << CRC_CTRLHU_TOTR_SHIFT)) & CRC_CTRLHU_TOTR_MASK) + +#define CRC_CTRLHU_TOT_MASK (0xC0U) +#define CRC_CTRLHU_TOT_SHIFT (6U) +/*! TOT - Transpose Type for Write + * 0b00..No transposition + * 0b01..Bits in bytes are transposed, but bytes are not transposed. + * 0b10..Both bits in bytes and bytes are transposed. + * 0b11..Only bytes are transposed, no bits in a byte are transposed. + */ +#define CRC_CTRLHU_TOT(x) (((uint8_t)(((uint8_t)(x)) << CRC_CTRLHU_TOT_SHIFT)) & CRC_CTRLHU_TOT_MASK) +/*! @} */ + +/*! @name CTRL - Control */ +/*! @{ */ + +#define CRC_CTRL_TCRC_MASK (0x1000000U) +#define CRC_CTRL_TCRC_SHIFT (24U) +/*! TCRC - TCRC + * 0b0..16 bits + * 0b1..32 bits + */ +#define CRC_CTRL_TCRC(x) (((uint32_t)(((uint32_t)(x)) << CRC_CTRL_TCRC_SHIFT)) & CRC_CTRL_TCRC_MASK) + +#define CRC_CTRL_WAS_MASK (0x2000000U) +#define CRC_CTRL_WAS_SHIFT (25U) +/*! WAS - Write as Seed + * 0b0..Data values + * 0b1..Seed values + */ +#define CRC_CTRL_WAS(x) (((uint32_t)(((uint32_t)(x)) << CRC_CTRL_WAS_SHIFT)) & CRC_CTRL_WAS_MASK) + +#define CRC_CTRL_FXOR_MASK (0x4000000U) +#define CRC_CTRL_FXOR_SHIFT (26U) +/*! FXOR - Complement Read of CRC Data Register + * 0b0..Disables XOR on reading data. + * 0b1..Inverts or complements the read value of the CRC Data. + */ +#define CRC_CTRL_FXOR(x) (((uint32_t)(((uint32_t)(x)) << CRC_CTRL_FXOR_SHIFT)) & CRC_CTRL_FXOR_MASK) + +#define CRC_CTRL_TOTR_MASK (0x30000000U) +#define CRC_CTRL_TOTR_SHIFT (28U) +/*! TOTR - Transpose Type for Read + * 0b00..No transposition + * 0b01..Bits in bytes are transposed, but bytes are not transposed. + * 0b10..Both bits in bytes and bytes are transposed. + * 0b11..Only bytes are transposed, no bits in a byte are transposed. + */ +#define CRC_CTRL_TOTR(x) (((uint32_t)(((uint32_t)(x)) << CRC_CTRL_TOTR_SHIFT)) & CRC_CTRL_TOTR_MASK) + +#define CRC_CTRL_TOT_MASK (0xC0000000U) +#define CRC_CTRL_TOT_SHIFT (30U) +/*! TOT - Transpose Type for Write + * 0b00..No transposition + * 0b01..Bits in bytes are transposed, but bytes are not transposed. + * 0b10..Both bits in bytes and bytes are transposed. + * 0b11..Only bytes are transposed, no bits in a byte are transposed. + */ +#define CRC_CTRL_TOT(x) (((uint32_t)(((uint32_t)(x)) << CRC_CTRL_TOT_SHIFT)) & CRC_CTRL_TOT_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group CRC_Register_Masks */ + + +/* CRC - Peripheral instance base addresses */ +/** Peripheral CRC0 base address */ +#define CRC0_BASE (0x4008A000u) +/** Peripheral CRC0 base pointer */ +#define CRC0 ((CRC_Type *)CRC0_BASE) +/** Array initializer of CRC peripheral base addresses */ +#define CRC_BASE_ADDRS { CRC0_BASE } +/** Array initializer of CRC peripheral base pointers */ +#define CRC_BASE_PTRS { CRC0 } + +/*! + * @} + */ /* end of group CRC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- CTIMER Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CTIMER_Peripheral_Access_Layer CTIMER Peripheral Access Layer + * @{ + */ + +/** CTIMER - Register Layout Typedef */ +typedef struct { + __IO uint32_t IR; /**< Interrupt, offset: 0x0 */ + __IO uint32_t TCR; /**< Timer Control, offset: 0x4 */ + __IO uint32_t TC; /**< Timer Counter, offset: 0x8 */ + __IO uint32_t PR; /**< Prescale, offset: 0xC */ + __IO uint32_t PC; /**< Prescale Counter, offset: 0x10 */ + __IO uint32_t MCR; /**< Match Control, offset: 0x14 */ + __IO uint32_t MR[4]; /**< Match, array offset: 0x18, array step: 0x4 */ + __IO uint32_t CCR; /**< Capture Control, offset: 0x28 */ + __I uint32_t CR[4]; /**< Capture, array offset: 0x2C, array step: 0x4 */ + __IO uint32_t EMR; /**< External Match, offset: 0x3C */ + uint8_t RESERVED_0[48]; + __IO uint32_t CTCR; /**< Count Control, offset: 0x70 */ + __IO uint32_t PWMC; /**< PWM Control, offset: 0x74 */ + __IO uint32_t MSR[4]; /**< Match Shadow, array offset: 0x78, array step: 0x4 */ +} CTIMER_Type; + +/* ---------------------------------------------------------------------------- + -- CTIMER Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup CTIMER_Register_Masks CTIMER Register Masks + * @{ + */ + +/*! @name IR - Interrupt */ +/*! @{ */ + +#define CTIMER_IR_MR0INT_MASK (0x1U) +#define CTIMER_IR_MR0INT_SHIFT (0U) +/*! MR0INT - Interrupt Flag for Match Channel 0 Event */ +#define CTIMER_IR_MR0INT(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_MR0INT_SHIFT)) & CTIMER_IR_MR0INT_MASK) + +#define CTIMER_IR_MR1INT_MASK (0x2U) +#define CTIMER_IR_MR1INT_SHIFT (1U) +/*! MR1INT - Interrupt Flag for Match Channel 1 Event */ +#define CTIMER_IR_MR1INT(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_MR1INT_SHIFT)) & CTIMER_IR_MR1INT_MASK) + +#define CTIMER_IR_MR2INT_MASK (0x4U) +#define CTIMER_IR_MR2INT_SHIFT (2U) +/*! MR2INT - Interrupt Flag for Match Channel 2 Event */ +#define CTIMER_IR_MR2INT(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_MR2INT_SHIFT)) & CTIMER_IR_MR2INT_MASK) + +#define CTIMER_IR_MR3INT_MASK (0x8U) +#define CTIMER_IR_MR3INT_SHIFT (3U) +/*! MR3INT - Interrupt Flag for Match Channel 3 Event */ +#define CTIMER_IR_MR3INT(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_MR3INT_SHIFT)) & CTIMER_IR_MR3INT_MASK) + +#define CTIMER_IR_CR0INT_MASK (0x10U) +#define CTIMER_IR_CR0INT_SHIFT (4U) +/*! CR0INT - Interrupt Flag for Capture Channel 0 Event */ +#define CTIMER_IR_CR0INT(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_CR0INT_SHIFT)) & CTIMER_IR_CR0INT_MASK) + +#define CTIMER_IR_CR1INT_MASK (0x20U) +#define CTIMER_IR_CR1INT_SHIFT (5U) +/*! CR1INT - Interrupt Flag for Capture Channel 1 Event */ +#define CTIMER_IR_CR1INT(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_CR1INT_SHIFT)) & CTIMER_IR_CR1INT_MASK) + +#define CTIMER_IR_CR2INT_MASK (0x40U) +#define CTIMER_IR_CR2INT_SHIFT (6U) +/*! CR2INT - Interrupt Flag for Capture Channel 2 Event */ +#define CTIMER_IR_CR2INT(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_CR2INT_SHIFT)) & CTIMER_IR_CR2INT_MASK) + +#define CTIMER_IR_CR3INT_MASK (0x80U) +#define CTIMER_IR_CR3INT_SHIFT (7U) +/*! CR3INT - Interrupt Flag for Capture Channel 3 Event */ +#define CTIMER_IR_CR3INT(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_CR3INT_SHIFT)) & CTIMER_IR_CR3INT_MASK) +/*! @} */ + +/*! @name TCR - Timer Control */ +/*! @{ */ + +#define CTIMER_TCR_CEN_MASK (0x1U) +#define CTIMER_TCR_CEN_SHIFT (0U) +/*! CEN - Counter Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CTIMER_TCR_CEN(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_TCR_CEN_SHIFT)) & CTIMER_TCR_CEN_MASK) + +#define CTIMER_TCR_CRST_MASK (0x2U) +#define CTIMER_TCR_CRST_SHIFT (1U) +/*! CRST - Counter Reset Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CTIMER_TCR_CRST(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_TCR_CRST_SHIFT)) & CTIMER_TCR_CRST_MASK) + +#define CTIMER_TCR_AGCEN_MASK (0x10U) +#define CTIMER_TCR_AGCEN_SHIFT (4U) +/*! AGCEN - Allow Global Count Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CTIMER_TCR_AGCEN(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_TCR_AGCEN_SHIFT)) & CTIMER_TCR_AGCEN_MASK) + +#define CTIMER_TCR_ATCEN_MASK (0x20U) +#define CTIMER_TCR_ATCEN_SHIFT (5U) +/*! ATCEN - Allow Trigger Count Enable + * 0b0..Disable + * 0b1..Enable + */ +#define CTIMER_TCR_ATCEN(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_TCR_ATCEN_SHIFT)) & CTIMER_TCR_ATCEN_MASK) +/*! @} */ + +/*! @name TC - Timer Counter */ +/*! @{ */ + +#define CTIMER_TC_TCVAL_MASK (0xFFFFFFFFU) +#define CTIMER_TC_TCVAL_SHIFT (0U) +/*! TCVAL - Timer Counter Value */ +#define CTIMER_TC_TCVAL(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_TC_TCVAL_SHIFT)) & CTIMER_TC_TCVAL_MASK) +/*! @} */ + +/*! @name PR - Prescale */ +/*! @{ */ + +#define CTIMER_PR_PRVAL_MASK (0xFFFFFFFFU) +#define CTIMER_PR_PRVAL_SHIFT (0U) +/*! PRVAL - Prescale Reload Value */ +#define CTIMER_PR_PRVAL(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_PR_PRVAL_SHIFT)) & CTIMER_PR_PRVAL_MASK) +/*! @} */ + +/*! @name PC - Prescale Counter */ +/*! @{ */ + +#define CTIMER_PC_PCVAL_MASK (0xFFFFFFFFU) +#define CTIMER_PC_PCVAL_SHIFT (0U) +/*! PCVAL - Prescale Counter Value */ +#define CTIMER_PC_PCVAL(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_PC_PCVAL_SHIFT)) & CTIMER_PC_PCVAL_MASK) +/*! @} */ + +/*! @name MCR - Match Control */ +/*! @{ */ + +#define CTIMER_MCR_MR0I_MASK (0x1U) +#define CTIMER_MCR_MR0I_SHIFT (0U) +/*! MR0I - Interrupt on MR0 + * 0b0..Does not generate + * 0b1..Generates + */ +#define CTIMER_MCR_MR0I(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR0I_SHIFT)) & CTIMER_MCR_MR0I_MASK) + +#define CTIMER_MCR_MR0R_MASK (0x2U) +#define CTIMER_MCR_MR0R_SHIFT (1U) +/*! MR0R - Reset on MR0 + * 0b0..Does not reset + * 0b1..Resets + */ +#define CTIMER_MCR_MR0R(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR0R_SHIFT)) & CTIMER_MCR_MR0R_MASK) + +#define CTIMER_MCR_MR0S_MASK (0x4U) +#define CTIMER_MCR_MR0S_SHIFT (2U) +/*! MR0S - Stop on MR0 + * 0b0..Does not stop + * 0b1..Stops + */ +#define CTIMER_MCR_MR0S(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR0S_SHIFT)) & CTIMER_MCR_MR0S_MASK) + +#define CTIMER_MCR_MR1I_MASK (0x8U) +#define CTIMER_MCR_MR1I_SHIFT (3U) +/*! MR1I - Interrupt on MR1 + * 0b0..Does not generate + * 0b1..Generates + */ +#define CTIMER_MCR_MR1I(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR1I_SHIFT)) & CTIMER_MCR_MR1I_MASK) + +#define CTIMER_MCR_MR1R_MASK (0x10U) +#define CTIMER_MCR_MR1R_SHIFT (4U) +/*! MR1R - Reset on MR1 + * 0b0..Does not reset + * 0b1..Resets + */ +#define CTIMER_MCR_MR1R(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR1R_SHIFT)) & CTIMER_MCR_MR1R_MASK) + +#define CTIMER_MCR_MR1S_MASK (0x20U) +#define CTIMER_MCR_MR1S_SHIFT (5U) +/*! MR1S - Stop on MR1 + * 0b0..Does not stop + * 0b1..Stops + */ +#define CTIMER_MCR_MR1S(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR1S_SHIFT)) & CTIMER_MCR_MR1S_MASK) + +#define CTIMER_MCR_MR2I_MASK (0x40U) +#define CTIMER_MCR_MR2I_SHIFT (6U) +/*! MR2I - Interrupt on MR2 + * 0b0..Does not generate + * 0b1..Generates + */ +#define CTIMER_MCR_MR2I(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR2I_SHIFT)) & CTIMER_MCR_MR2I_MASK) + +#define CTIMER_MCR_MR2R_MASK (0x80U) +#define CTIMER_MCR_MR2R_SHIFT (7U) +/*! MR2R - Reset on MR2 + * 0b0..Does not reset + * 0b1..Resets + */ +#define CTIMER_MCR_MR2R(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR2R_SHIFT)) & CTIMER_MCR_MR2R_MASK) + +#define CTIMER_MCR_MR2S_MASK (0x100U) +#define CTIMER_MCR_MR2S_SHIFT (8U) +/*! MR2S - Stop on MR2 + * 0b0..Does not stop + * 0b1..Stops + */ +#define CTIMER_MCR_MR2S(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR2S_SHIFT)) & CTIMER_MCR_MR2S_MASK) + +#define CTIMER_MCR_MR3I_MASK (0x200U) +#define CTIMER_MCR_MR3I_SHIFT (9U) +/*! MR3I - Interrupt on MR3 + * 0b0..Does not generate + * 0b1..Generates + */ +#define CTIMER_MCR_MR3I(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR3I_SHIFT)) & CTIMER_MCR_MR3I_MASK) + +#define CTIMER_MCR_MR3R_MASK (0x400U) +#define CTIMER_MCR_MR3R_SHIFT (10U) +/*! MR3R - Reset on MR3 + * 0b0..Does not reset + * 0b1..Resets + */ +#define CTIMER_MCR_MR3R(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR3R_SHIFT)) & CTIMER_MCR_MR3R_MASK) + +#define CTIMER_MCR_MR3S_MASK (0x800U) +#define CTIMER_MCR_MR3S_SHIFT (11U) +/*! MR3S - Stop on MR3 + * 0b0..Does not stop + * 0b1..Stops + */ +#define CTIMER_MCR_MR3S(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR3S_SHIFT)) & CTIMER_MCR_MR3S_MASK) + +#define CTIMER_MCR_MR0RL_MASK (0x1000000U) +#define CTIMER_MCR_MR0RL_SHIFT (24U) +/*! MR0RL - Reload MR + * 0b0..Does not reload + * 0b1..Reloads + */ +#define CTIMER_MCR_MR0RL(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR0RL_SHIFT)) & CTIMER_MCR_MR0RL_MASK) + +#define CTIMER_MCR_MR1RL_MASK (0x2000000U) +#define CTIMER_MCR_MR1RL_SHIFT (25U) +/*! MR1RL - Reload MR + * 0b0..Does not reload + * 0b1..Reloads + */ +#define CTIMER_MCR_MR1RL(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR1RL_SHIFT)) & CTIMER_MCR_MR1RL_MASK) + +#define CTIMER_MCR_MR2RL_MASK (0x4000000U) +#define CTIMER_MCR_MR2RL_SHIFT (26U) +/*! MR2RL - Reload MR + * 0b0..Does not reload + * 0b1..Reloads + */ +#define CTIMER_MCR_MR2RL(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR2RL_SHIFT)) & CTIMER_MCR_MR2RL_MASK) + +#define CTIMER_MCR_MR3RL_MASK (0x8000000U) +#define CTIMER_MCR_MR3RL_SHIFT (27U) +/*! MR3RL - Reload MR + * 0b0..Does not reload + * 0b1..Reloads + */ +#define CTIMER_MCR_MR3RL(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR3RL_SHIFT)) & CTIMER_MCR_MR3RL_MASK) +/*! @} */ + +/*! @name MR - Match */ +/*! @{ */ + +#define CTIMER_MR_MATCH_MASK (0xFFFFFFFFU) +#define CTIMER_MR_MATCH_SHIFT (0U) +/*! MATCH - Timer Counter Match Value */ +#define CTIMER_MR_MATCH(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MR_MATCH_SHIFT)) & CTIMER_MR_MATCH_MASK) +/*! @} */ + +/* The count of CTIMER_MR */ +#define CTIMER_MR_COUNT (4U) + +/*! @name CCR - Capture Control */ +/*! @{ */ + +#define CTIMER_CCR_CAP0RE_MASK (0x1U) +#define CTIMER_CCR_CAP0RE_SHIFT (0U) +/*! CAP0RE - Rising Edge of Capture Channel 0 + * 0b0..Does not load + * 0b1..Loads + */ +#define CTIMER_CCR_CAP0RE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP0RE_SHIFT)) & CTIMER_CCR_CAP0RE_MASK) + +#define CTIMER_CCR_CAP0FE_MASK (0x2U) +#define CTIMER_CCR_CAP0FE_SHIFT (1U) +/*! CAP0FE - Falling Edge of Capture Channel 0 + * 0b0..Does not load + * 0b1..Loads + */ +#define CTIMER_CCR_CAP0FE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP0FE_SHIFT)) & CTIMER_CCR_CAP0FE_MASK) + +#define CTIMER_CCR_CAP0I_MASK (0x4U) +#define CTIMER_CCR_CAP0I_SHIFT (2U) +/*! CAP0I - Generate Interrupt on Channel 0 Capture Event + * 0b0..Does not generate + * 0b1..Generates + */ +#define CTIMER_CCR_CAP0I(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP0I_SHIFT)) & CTIMER_CCR_CAP0I_MASK) + +#define CTIMER_CCR_CAP1RE_MASK (0x8U) +#define CTIMER_CCR_CAP1RE_SHIFT (3U) +/*! CAP1RE - Rising Edge of Capture Channel 1 + * 0b0..Does not load + * 0b1..Loads + */ +#define CTIMER_CCR_CAP1RE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP1RE_SHIFT)) & CTIMER_CCR_CAP1RE_MASK) + +#define CTIMER_CCR_CAP1FE_MASK (0x10U) +#define CTIMER_CCR_CAP1FE_SHIFT (4U) +/*! CAP1FE - Falling Edge of Capture Channel 1 + * 0b0..Does not load + * 0b1..Loads + */ +#define CTIMER_CCR_CAP1FE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP1FE_SHIFT)) & CTIMER_CCR_CAP1FE_MASK) + +#define CTIMER_CCR_CAP1I_MASK (0x20U) +#define CTIMER_CCR_CAP1I_SHIFT (5U) +/*! CAP1I - Generate Interrupt on Channel 1 Capture Event + * 0b0..Does not generates + * 0b1..Generates + */ +#define CTIMER_CCR_CAP1I(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP1I_SHIFT)) & CTIMER_CCR_CAP1I_MASK) + +#define CTIMER_CCR_CAP2RE_MASK (0x40U) +#define CTIMER_CCR_CAP2RE_SHIFT (6U) +/*! CAP2RE - Rising Edge of Capture Channel 2 + * 0b0..Does not load + * 0b1..Loads + */ +#define CTIMER_CCR_CAP2RE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP2RE_SHIFT)) & CTIMER_CCR_CAP2RE_MASK) + +#define CTIMER_CCR_CAP2FE_MASK (0x80U) +#define CTIMER_CCR_CAP2FE_SHIFT (7U) +/*! CAP2FE - Falling Edge of Capture Channel 2 + * 0b0..Does not load + * 0b1..Loads + */ +#define CTIMER_CCR_CAP2FE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP2FE_SHIFT)) & CTIMER_CCR_CAP2FE_MASK) + +#define CTIMER_CCR_CAP2I_MASK (0x100U) +#define CTIMER_CCR_CAP2I_SHIFT (8U) +/*! CAP2I - Generate Interrupt on Channel 2 Capture Event + * 0b0..Does not generate + * 0b1..Generates + */ +#define CTIMER_CCR_CAP2I(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP2I_SHIFT)) & CTIMER_CCR_CAP2I_MASK) + +#define CTIMER_CCR_CAP3RE_MASK (0x200U) +#define CTIMER_CCR_CAP3RE_SHIFT (9U) +/*! CAP3RE - Rising Edge of Capture Channel 3 + * 0b0..Does not load + * 0b1..Loads + */ +#define CTIMER_CCR_CAP3RE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP3RE_SHIFT)) & CTIMER_CCR_CAP3RE_MASK) + +#define CTIMER_CCR_CAP3FE_MASK (0x400U) +#define CTIMER_CCR_CAP3FE_SHIFT (10U) +/*! CAP3FE - Falling Edge of Capture Channel 3 + * 0b0..Does not load + * 0b1..Loads + */ +#define CTIMER_CCR_CAP3FE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP3FE_SHIFT)) & CTIMER_CCR_CAP3FE_MASK) + +#define CTIMER_CCR_CAP3I_MASK (0x800U) +#define CTIMER_CCR_CAP3I_SHIFT (11U) +/*! CAP3I - Generate Interrupt on Channel 3 Capture Event + * 0b0..Does not generate + * 0b1..Generates + */ +#define CTIMER_CCR_CAP3I(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP3I_SHIFT)) & CTIMER_CCR_CAP3I_MASK) +/*! @} */ + +/*! @name CR - Capture */ +/*! @{ */ + +#define CTIMER_CR_CAP_MASK (0xFFFFFFFFU) +#define CTIMER_CR_CAP_SHIFT (0U) +/*! CAP - Timer Counter Capture Value */ +#define CTIMER_CR_CAP(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CR_CAP_SHIFT)) & CTIMER_CR_CAP_MASK) +/*! @} */ + +/* The count of CTIMER_CR */ +#define CTIMER_CR_COUNT (4U) + +/*! @name EMR - External Match */ +/*! @{ */ + +#define CTIMER_EMR_EM0_MASK (0x1U) +#define CTIMER_EMR_EM0_SHIFT (0U) +/*! EM0 - External Match 0 + * 0b0..Low + * 0b1..High + */ +#define CTIMER_EMR_EM0(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EM0_SHIFT)) & CTIMER_EMR_EM0_MASK) + +#define CTIMER_EMR_EM1_MASK (0x2U) +#define CTIMER_EMR_EM1_SHIFT (1U) +/*! EM1 - External Match 1 + * 0b0..Low + * 0b1..High + */ +#define CTIMER_EMR_EM1(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EM1_SHIFT)) & CTIMER_EMR_EM1_MASK) + +#define CTIMER_EMR_EM2_MASK (0x4U) +#define CTIMER_EMR_EM2_SHIFT (2U) +/*! EM2 - External Match 2 + * 0b0..Low + * 0b1..High + */ +#define CTIMER_EMR_EM2(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EM2_SHIFT)) & CTIMER_EMR_EM2_MASK) + +#define CTIMER_EMR_EM3_MASK (0x8U) +#define CTIMER_EMR_EM3_SHIFT (3U) +/*! EM3 - External Match 3 + * 0b0..Low + * 0b1..High + */ +#define CTIMER_EMR_EM3(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EM3_SHIFT)) & CTIMER_EMR_EM3_MASK) + +#define CTIMER_EMR_EMC0_MASK (0x30U) +#define CTIMER_EMR_EMC0_SHIFT (4U) +/*! EMC0 - External Match Control 0 + * 0b00..Does nothing + * 0b01..Goes low + * 0b10..Goes high + * 0b11..Toggles + */ +#define CTIMER_EMR_EMC0(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EMC0_SHIFT)) & CTIMER_EMR_EMC0_MASK) + +#define CTIMER_EMR_EMC1_MASK (0xC0U) +#define CTIMER_EMR_EMC1_SHIFT (6U) +/*! EMC1 - External Match Control 1 + * 0b00..Does nothing + * 0b01..Goes low + * 0b10..Goes high + * 0b11..Toggles + */ +#define CTIMER_EMR_EMC1(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EMC1_SHIFT)) & CTIMER_EMR_EMC1_MASK) + +#define CTIMER_EMR_EMC2_MASK (0x300U) +#define CTIMER_EMR_EMC2_SHIFT (8U) +/*! EMC2 - External Match Control 2 + * 0b00..Does nothing + * 0b01..Goes low + * 0b10..Goes high + * 0b11..Toggles + */ +#define CTIMER_EMR_EMC2(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EMC2_SHIFT)) & CTIMER_EMR_EMC2_MASK) + +#define CTIMER_EMR_EMC3_MASK (0xC00U) +#define CTIMER_EMR_EMC3_SHIFT (10U) +/*! EMC3 - External Match Control 3 + * 0b00..Does nothing + * 0b01..Goes low + * 0b10..Goes high + * 0b11..Toggles + */ +#define CTIMER_EMR_EMC3(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EMC3_SHIFT)) & CTIMER_EMR_EMC3_MASK) +/*! @} */ + +/*! @name CTCR - Count Control */ +/*! @{ */ + +#define CTIMER_CTCR_CTMODE_MASK (0x3U) +#define CTIMER_CTCR_CTMODE_SHIFT (0U) +/*! CTMODE - Counter Timer Mode + * 0b00..Timer mode + * 0b01..Counter mode rising edge + * 0b10..Counter mode falling edge + * 0b11..Counter mode dual edge + */ +#define CTIMER_CTCR_CTMODE(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CTCR_CTMODE_SHIFT)) & CTIMER_CTCR_CTMODE_MASK) + +#define CTIMER_CTCR_CINSEL_MASK (0xCU) +#define CTIMER_CTCR_CINSEL_SHIFT (2U) +/*! CINSEL - Count Input Select + * 0b00..Channel 0, CAPn[0] for CTIMERn + * 0b01..Channel 1, CAPn[1] for CTIMERn + * 0b10..Channel 2, CAPn[2] for CTIMERn + * 0b11..Channel 3, CAPn[3] for CTIMERn + */ +#define CTIMER_CTCR_CINSEL(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CTCR_CINSEL_SHIFT)) & CTIMER_CTCR_CINSEL_MASK) + +#define CTIMER_CTCR_ENCC_MASK (0x10U) +#define CTIMER_CTCR_ENCC_SHIFT (4U) +/*! ENCC - Capture Channel Enable */ +#define CTIMER_CTCR_ENCC(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CTCR_ENCC_SHIFT)) & CTIMER_CTCR_ENCC_MASK) + +#define CTIMER_CTCR_SELCC_MASK (0xE0U) +#define CTIMER_CTCR_SELCC_SHIFT (5U) +/*! SELCC - Edge Select + * 0b000..Capture channel 0 rising edge + * 0b001..Capture channel 0 falling edge + * 0b010..Capture channel 1 rising edge + * 0b011..Capture channel 1 falling edge + * 0b100..Capture channel 2 rising edge + * 0b101..Capture channel 2 falling edge + */ +#define CTIMER_CTCR_SELCC(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_CTCR_SELCC_SHIFT)) & CTIMER_CTCR_SELCC_MASK) +/*! @} */ + +/*! @name PWMC - PWM Control */ +/*! @{ */ + +#define CTIMER_PWMC_PWMEN0_MASK (0x1U) +#define CTIMER_PWMC_PWMEN0_SHIFT (0U) +/*! PWMEN0 - PWM Mode Enable for Channel 0 + * 0b0..Disable + * 0b1..Enable + */ +#define CTIMER_PWMC_PWMEN0(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_PWMC_PWMEN0_SHIFT)) & CTIMER_PWMC_PWMEN0_MASK) + +#define CTIMER_PWMC_PWMEN1_MASK (0x2U) +#define CTIMER_PWMC_PWMEN1_SHIFT (1U) +/*! PWMEN1 - PWM Mode Enable for Channel 1 + * 0b0..Disable + * 0b1..Enable + */ +#define CTIMER_PWMC_PWMEN1(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_PWMC_PWMEN1_SHIFT)) & CTIMER_PWMC_PWMEN1_MASK) + +#define CTIMER_PWMC_PWMEN2_MASK (0x4U) +#define CTIMER_PWMC_PWMEN2_SHIFT (2U) +/*! PWMEN2 - PWM Mode Enable for Channel 2 + * 0b0..Disable + * 0b1..Enable + */ +#define CTIMER_PWMC_PWMEN2(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_PWMC_PWMEN2_SHIFT)) & CTIMER_PWMC_PWMEN2_MASK) + +#define CTIMER_PWMC_PWMEN3_MASK (0x8U) +#define CTIMER_PWMC_PWMEN3_SHIFT (3U) +/*! PWMEN3 - PWM Mode Enable for Channel 3 + * 0b0..Disable + * 0b1..Enable + */ +#define CTIMER_PWMC_PWMEN3(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_PWMC_PWMEN3_SHIFT)) & CTIMER_PWMC_PWMEN3_MASK) +/*! @} */ + +/*! @name MSR - Match Shadow */ +/*! @{ */ + +#define CTIMER_MSR_MATCH_SHADOW_MASK (0xFFFFFFFFU) +#define CTIMER_MSR_MATCH_SHADOW_SHIFT (0U) +/*! MATCH_SHADOW - Timer Counter Match Shadow Value */ +#define CTIMER_MSR_MATCH_SHADOW(x) (((uint32_t)(((uint32_t)(x)) << CTIMER_MSR_MATCH_SHADOW_SHIFT)) & CTIMER_MSR_MATCH_SHADOW_MASK) +/*! @} */ + +/* The count of CTIMER_MSR */ +#define CTIMER_MSR_COUNT (4U) + + +/*! + * @} + */ /* end of group CTIMER_Register_Masks */ + + +/* CTIMER - Peripheral instance base addresses */ +/** Peripheral CTIMER0 base address */ +#define CTIMER0_BASE (0x40004000u) +/** Peripheral CTIMER0 base pointer */ +#define CTIMER0 ((CTIMER_Type *)CTIMER0_BASE) +/** Peripheral CTIMER1 base address */ +#define CTIMER1_BASE (0x40005000u) +/** Peripheral CTIMER1 base pointer */ +#define CTIMER1 ((CTIMER_Type *)CTIMER1_BASE) +/** Peripheral CTIMER2 base address */ +#define CTIMER2_BASE (0x40006000u) +/** Peripheral CTIMER2 base pointer */ +#define CTIMER2 ((CTIMER_Type *)CTIMER2_BASE) +/** Peripheral CTIMER3 base address */ +#define CTIMER3_BASE (0x40007000u) +/** Peripheral CTIMER3 base pointer */ +#define CTIMER3 ((CTIMER_Type *)CTIMER3_BASE) +/** Peripheral CTIMER4 base address */ +#define CTIMER4_BASE (0x40008000u) +/** Peripheral CTIMER4 base pointer */ +#define CTIMER4 ((CTIMER_Type *)CTIMER4_BASE) +/** Array initializer of CTIMER peripheral base addresses */ +#define CTIMER_BASE_ADDRS { CTIMER0_BASE, CTIMER1_BASE, CTIMER2_BASE, CTIMER3_BASE, CTIMER4_BASE } +/** Array initializer of CTIMER peripheral base pointers */ +#define CTIMER_BASE_PTRS { CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4 } +/** Interrupt vectors for the CTIMER peripheral type */ +#define CTIMER_IRQS { CTIMER0_IRQn, CTIMER1_IRQn, CTIMER2_IRQn, CTIMER3_IRQn, CTIMER4_IRQn } + +/*! + * @} + */ /* end of group CTIMER_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- DEBUGMAILBOX Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DEBUGMAILBOX_Peripheral_Access_Layer DEBUGMAILBOX Peripheral Access Layer + * @{ + */ + +/** DEBUGMAILBOX - Register Layout Typedef */ +typedef struct { + __IO uint32_t CSW; /**< Command and Status Word, offset: 0x0 */ + __IO uint32_t REQUEST; /**< Request Value, offset: 0x4 */ + __IO uint32_t RETURN; /**< Return Value, offset: 0x8 */ + uint8_t RESERVED_0[240]; + __I uint32_t ID; /**< Identification, offset: 0xFC */ +} DEBUGMAILBOX_Type; + +/* ---------------------------------------------------------------------------- + -- DEBUGMAILBOX Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DEBUGMAILBOX_Register_Masks DEBUGMAILBOX Register Masks + * @{ + */ + +/*! @name CSW - Command and Status Word */ +/*! @{ */ + +#define DEBUGMAILBOX_CSW_RESYNCH_REQ_MASK (0x1U) +#define DEBUGMAILBOX_CSW_RESYNCH_REQ_SHIFT (0U) +/*! RESYNCH_REQ - Resynchronization Request + * 0b0..No request + * 0b1..Request for resynchronization + */ +#define DEBUGMAILBOX_CSW_RESYNCH_REQ(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_CSW_RESYNCH_REQ_SHIFT)) & DEBUGMAILBOX_CSW_RESYNCH_REQ_MASK) + +#define DEBUGMAILBOX_CSW_REQ_PENDING_MASK (0x2U) +#define DEBUGMAILBOX_CSW_REQ_PENDING_SHIFT (1U) +/*! REQ_PENDING - Request Pending + * 0b0..No request pending + * 0b1..Request for resynchronization pending + */ +#define DEBUGMAILBOX_CSW_REQ_PENDING(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_CSW_REQ_PENDING_SHIFT)) & DEBUGMAILBOX_CSW_REQ_PENDING_MASK) + +#define DEBUGMAILBOX_CSW_DBG_OR_ERR_MASK (0x4U) +#define DEBUGMAILBOX_CSW_DBG_OR_ERR_SHIFT (2U) +/*! DBG_OR_ERR - DBGMB Overrun Error + * 0b0..No overrun + * 0b1..Overrun occurred + */ +#define DEBUGMAILBOX_CSW_DBG_OR_ERR(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_CSW_DBG_OR_ERR_SHIFT)) & DEBUGMAILBOX_CSW_DBG_OR_ERR_MASK) + +#define DEBUGMAILBOX_CSW_AHB_OR_ERR_MASK (0x8U) +#define DEBUGMAILBOX_CSW_AHB_OR_ERR_SHIFT (3U) +/*! AHB_OR_ERR - AHB Overrun Error + * 0b0..No overrun + * 0b1..Overrun occurred + */ +#define DEBUGMAILBOX_CSW_AHB_OR_ERR(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_CSW_AHB_OR_ERR_SHIFT)) & DEBUGMAILBOX_CSW_AHB_OR_ERR_MASK) + +#define DEBUGMAILBOX_CSW_SOFT_RESET_MASK (0x10U) +#define DEBUGMAILBOX_CSW_SOFT_RESET_SHIFT (4U) +/*! SOFT_RESET - Soft Reset */ +#define DEBUGMAILBOX_CSW_SOFT_RESET(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_CSW_SOFT_RESET_SHIFT)) & DEBUGMAILBOX_CSW_SOFT_RESET_MASK) + +#define DEBUGMAILBOX_CSW_CHIP_RESET_REQ_MASK (0x20U) +#define DEBUGMAILBOX_CSW_CHIP_RESET_REQ_SHIFT (5U) +/*! CHIP_RESET_REQ - Chip Reset Request */ +#define DEBUGMAILBOX_CSW_CHIP_RESET_REQ(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_CSW_CHIP_RESET_REQ_SHIFT)) & DEBUGMAILBOX_CSW_CHIP_RESET_REQ_MASK) +/*! @} */ + +/*! @name REQUEST - Request Value */ +/*! @{ */ + +#define DEBUGMAILBOX_REQUEST_REQUEST_MASK (0xFFFFFFFFU) +#define DEBUGMAILBOX_REQUEST_REQUEST_SHIFT (0U) +/*! REQUEST - Request Value */ +#define DEBUGMAILBOX_REQUEST_REQUEST(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_REQUEST_REQUEST_SHIFT)) & DEBUGMAILBOX_REQUEST_REQUEST_MASK) +/*! @} */ + +/*! @name RETURN - Return Value */ +/*! @{ */ + +#define DEBUGMAILBOX_RETURN_RET_MASK (0xFFFFFFFFU) +#define DEBUGMAILBOX_RETURN_RET_SHIFT (0U) +/*! RET - Return Value */ +#define DEBUGMAILBOX_RETURN_RET(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_RETURN_RET_SHIFT)) & DEBUGMAILBOX_RETURN_RET_MASK) +/*! @} */ + +/*! @name ID - Identification */ +/*! @{ */ + +#define DEBUGMAILBOX_ID_ID_MASK (0xFFFFFFFFU) +#define DEBUGMAILBOX_ID_ID_SHIFT (0U) +/*! ID - Identification Value */ +#define DEBUGMAILBOX_ID_ID(x) (((uint32_t)(((uint32_t)(x)) << DEBUGMAILBOX_ID_ID_SHIFT)) & DEBUGMAILBOX_ID_ID_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group DEBUGMAILBOX_Register_Masks */ + + +/* DEBUGMAILBOX - Peripheral instance base addresses */ +/** Peripheral DBGMAILBOX base address */ +#define DBGMAILBOX_BASE (0x40101000u) +/** Peripheral DBGMAILBOX base pointer */ +#define DBGMAILBOX ((DEBUGMAILBOX_Type *)DBGMAILBOX_BASE) +/** Array initializer of DEBUGMAILBOX peripheral base addresses */ +#define DEBUGMAILBOX_BASE_ADDRS { DBGMAILBOX_BASE } +/** Array initializer of DEBUGMAILBOX peripheral base pointers */ +#define DEBUGMAILBOX_BASE_PTRS { DBGMAILBOX } + +/*! + * @} + */ /* end of group DEBUGMAILBOX_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- DMA Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DMA_Peripheral_Access_Layer DMA Peripheral Access Layer + * @{ + */ + +/** DMA - Register Layout Typedef */ +typedef struct { + __IO uint32_t MP_CSR; /**< Management Page Control, offset: 0x0 */ + __I uint32_t MP_ES; /**< Management Page Error Status, offset: 0x4 */ + __I uint32_t MP_INT; /**< Management Page Interrupt Request Status, offset: 0x8 */ + __I uint32_t MP_HRS; /**< Management Page Hardware Request Status, offset: 0xC */ + uint8_t RESERVED_0[240]; + __IO uint32_t CH_GRPRI[8]; /**< Channel Arbitration Group, array offset: 0x100, array step: 0x4 */ + uint8_t RESERVED_1[3808]; + struct { /* offset: 0x1000, array step: 0x1000 */ + __IO uint32_t CH_CSR; /**< Channel Control and Status, array offset: 0x1000, array step: 0x1000 */ + __IO uint32_t CH_ES; /**< Channel Error Status, array offset: 0x1004, array step: 0x1000 */ + __IO uint32_t CH_INT; /**< Channel Interrupt Status, array offset: 0x1008, array step: 0x1000 */ + __IO uint32_t CH_SBR; /**< Channel System Bus, array offset: 0x100C, array step: 0x1000 */ + __IO uint32_t CH_PRI; /**< Channel Priority, array offset: 0x1010, array step: 0x1000 */ + __IO uint32_t CH_MUX; /**< Channel Multiplexor Configuration, array offset: 0x1014, array step: 0x1000 */ + uint8_t RESERVED_0[8]; + __IO uint32_t TCD_SADDR; /**< TCD Source Address, array offset: 0x1020, array step: 0x1000 */ + __IO uint16_t TCD_SOFF; /**< TCD Signed Source Address Offset, array offset: 0x1024, array step: 0x1000 */ + __IO uint16_t TCD_ATTR; /**< TCD Transfer Attributes, array offset: 0x1026, array step: 0x1000 */ + union { /* offset: 0x1028, array step: 0x1000 */ + __IO uint32_t TCD_NBYTES_MLOFFNO; /**< TCD Transfer Size Without Minor Loop Offsets, array offset: 0x1028, array step: 0x1000 */ + __IO uint32_t TCD_NBYTES_MLOFFYES; /**< TCD Transfer Size with Minor Loop Offsets, array offset: 0x1028, array step: 0x1000 */ + }; + __IO uint32_t TCD_SLAST_SDA; /**< TCD Last Source Address Adjustment / Store DADDR Address, array offset: 0x102C, array step: 0x1000 */ + __IO uint32_t TCD_DADDR; /**< TCD Destination Address, array offset: 0x1030, array step: 0x1000 */ + __IO uint16_t TCD_DOFF; /**< TCD Signed Destination Address Offset, array offset: 0x1034, array step: 0x1000 */ + union { /* offset: 0x1036, array step: 0x1000 */ + __IO uint16_t TCD_CITER_ELINKNO; /**< TCD Current Major Loop Count (Minor Loop Channel Linking Disabled), array offset: 0x1036, array step: 0x1000 */ + __IO uint16_t TCD_CITER_ELINKYES; /**< TCD Current Major Loop Count (Minor Loop Channel Linking Enabled), array offset: 0x1036, array step: 0x1000 */ + }; + __IO uint32_t TCD_DLAST_SGA; /**< TCD Last Destination Address Adjustment / Scatter Gather Address, array offset: 0x1038, array step: 0x1000 */ + __IO uint16_t TCD_CSR; /**< TCD Control and Status, array offset: 0x103C, array step: 0x1000 */ + union { /* offset: 0x103E, array step: 0x1000 */ + __IO uint16_t TCD_BITER_ELINKNO; /**< TCD Beginning Major Loop Count (Minor Loop Channel Linking Disabled), array offset: 0x103E, array step: 0x1000 */ + __IO uint16_t TCD_BITER_ELINKYES; /**< TCD Beginning Major Loop Count (Minor Loop Channel Linking Enabled), array offset: 0x103E, array step: 0x1000 */ + }; + uint8_t RESERVED_1[4032]; + } CH[8]; +} DMA_Type; + +/* ---------------------------------------------------------------------------- + -- DMA Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup DMA_Register_Masks DMA Register Masks + * @{ + */ + +/*! @name MP_CSR - Management Page Control */ +/*! @{ */ + +#define DMA_MP_CSR_EDBG_MASK (0x2U) +#define DMA_MP_CSR_EDBG_SHIFT (1U) +/*! EDBG - Enable Debug + * 0b0..Debug mode disabled + * 0b1..Debug mode is enabled. + */ +#define DMA_MP_CSR_EDBG(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_EDBG_SHIFT)) & DMA_MP_CSR_EDBG_MASK) + +#define DMA_MP_CSR_ERCA_MASK (0x4U) +#define DMA_MP_CSR_ERCA_SHIFT (2U) +/*! ERCA - Enable Round Robin Channel Arbitration + * 0b0..Round-robin channel arbitration disabled + * 0b1..Round-robin channel arbitration enabled + */ +#define DMA_MP_CSR_ERCA(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ERCA_SHIFT)) & DMA_MP_CSR_ERCA_MASK) + +#define DMA_MP_CSR_HAE_MASK (0x10U) +#define DMA_MP_CSR_HAE_SHIFT (4U) +/*! HAE - Halt After Error + * 0b0..Normal operation + * 0b1..Any error causes the HALT field to be set to 1 + */ +#define DMA_MP_CSR_HAE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_HAE_SHIFT)) & DMA_MP_CSR_HAE_MASK) + +#define DMA_MP_CSR_HALT_MASK (0x20U) +#define DMA_MP_CSR_HALT_SHIFT (5U) +/*! HALT - Halt DMA Operations + * 0b0..Normal operation + * 0b1..Stall the start of any new channels + */ +#define DMA_MP_CSR_HALT(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_HALT_SHIFT)) & DMA_MP_CSR_HALT_MASK) + +#define DMA_MP_CSR_GCLC_MASK (0x40U) +#define DMA_MP_CSR_GCLC_SHIFT (6U) +/*! GCLC - Global Channel Linking Control + * 0b0..Channel linking disabled for all channels + * 0b1..Channel linking available and controlled by each channel's link settings + */ +#define DMA_MP_CSR_GCLC(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_GCLC_SHIFT)) & DMA_MP_CSR_GCLC_MASK) + +#define DMA_MP_CSR_GMRC_MASK (0x80U) +#define DMA_MP_CSR_GMRC_SHIFT (7U) +/*! GMRC - Global Master ID Replication Control + * 0b0..Master ID replication disabled for all channels + * 0b1..Master ID replication available and controlled by each channel's CHn_SBR[EMI] setting + */ +#define DMA_MP_CSR_GMRC(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_GMRC_SHIFT)) & DMA_MP_CSR_GMRC_MASK) + +#define DMA_MP_CSR_ECX_MASK (0x100U) +#define DMA_MP_CSR_ECX_SHIFT (8U) +/*! ECX - Cancel Transfer With Error + * 0b0..Normal operation + * 0b1..Cancel the remaining data transfer + */ +#define DMA_MP_CSR_ECX(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ECX_SHIFT)) & DMA_MP_CSR_ECX_MASK) + +#define DMA_MP_CSR_CX_MASK (0x200U) +#define DMA_MP_CSR_CX_SHIFT (9U) +/*! CX - Cancel Transfer + * 0b0..Normal operation + * 0b1..Cancel the remaining data transfer + */ +#define DMA_MP_CSR_CX(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_CX_SHIFT)) & DMA_MP_CSR_CX_MASK) + +#define DMA_MP_CSR_ACTIVE_ID_MASK (0x7000000U) +#define DMA_MP_CSR_ACTIVE_ID_SHIFT (24U) +/*! ACTIVE_ID - Active Channel ID */ +#define DMA_MP_CSR_ACTIVE_ID(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ACTIVE_ID_SHIFT)) & DMA_MP_CSR_ACTIVE_ID_MASK) + +#define DMA_MP_CSR_ACTIVE_MASK (0x80000000U) +#define DMA_MP_CSR_ACTIVE_SHIFT (31U) +/*! ACTIVE - DMA Active Status + * 0b0..eDMA is idle + * 0b1..eDMA is executing a channel + */ +#define DMA_MP_CSR_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_CSR_ACTIVE_SHIFT)) & DMA_MP_CSR_ACTIVE_MASK) +/*! @} */ + +/*! @name MP_ES - Management Page Error Status */ +/*! @{ */ + +#define DMA_MP_ES_DBE_MASK (0x1U) +#define DMA_MP_ES_DBE_SHIFT (0U) +/*! DBE - Destination Bus Error + * 0b0..No destination bus error + * 0b1..Last recorded error was a bus error on a destination write + */ +#define DMA_MP_ES_DBE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_DBE_SHIFT)) & DMA_MP_ES_DBE_MASK) + +#define DMA_MP_ES_SBE_MASK (0x2U) +#define DMA_MP_ES_SBE_SHIFT (1U) +/*! SBE - Source Bus Error + * 0b0..No source bus error + * 0b1..Last recorded error was a bus error on a source read + */ +#define DMA_MP_ES_SBE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_SBE_SHIFT)) & DMA_MP_ES_SBE_MASK) + +#define DMA_MP_ES_SGE_MASK (0x4U) +#define DMA_MP_ES_SGE_SHIFT (2U) +/*! SGE - Scatter/Gather Configuration Error + * 0b0..No scatter/gather configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_DLAST_SGA field + */ +#define DMA_MP_ES_SGE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_SGE_SHIFT)) & DMA_MP_ES_SGE_MASK) + +#define DMA_MP_ES_NCE_MASK (0x8U) +#define DMA_MP_ES_NCE_SHIFT (3U) +/*! NCE - NBYTES/CITER Configuration Error + * 0b0..No NBYTES/CITER configuration error + * 0b1..The last recorded error was NBYTES equal to zero or a CITER not equal to BITER error + */ +#define DMA_MP_ES_NCE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_NCE_SHIFT)) & DMA_MP_ES_NCE_MASK) + +#define DMA_MP_ES_DOE_MASK (0x10U) +#define DMA_MP_ES_DOE_SHIFT (4U) +/*! DOE - Destination Offset Error + * 0b0..No destination offset configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_DOFF field + */ +#define DMA_MP_ES_DOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_DOE_SHIFT)) & DMA_MP_ES_DOE_MASK) + +#define DMA_MP_ES_DAE_MASK (0x20U) +#define DMA_MP_ES_DAE_SHIFT (5U) +/*! DAE - Destination Address Error + * 0b0..No destination address configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_DADDR field + */ +#define DMA_MP_ES_DAE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_DAE_SHIFT)) & DMA_MP_ES_DAE_MASK) + +#define DMA_MP_ES_SOE_MASK (0x40U) +#define DMA_MP_ES_SOE_SHIFT (6U) +/*! SOE - Source Offset Error + * 0b0..No source offset configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_SOFF field + */ +#define DMA_MP_ES_SOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_SOE_SHIFT)) & DMA_MP_ES_SOE_MASK) + +#define DMA_MP_ES_SAE_MASK (0x80U) +#define DMA_MP_ES_SAE_SHIFT (7U) +/*! SAE - Source Address Error + * 0b0..No source address configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_SADDR field + */ +#define DMA_MP_ES_SAE(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_SAE_SHIFT)) & DMA_MP_ES_SAE_MASK) + +#define DMA_MP_ES_ECX_MASK (0x100U) +#define DMA_MP_ES_ECX_SHIFT (8U) +/*! ECX - Transfer Canceled + * 0b0..No canceled transfers + * 0b1..Last recorded entry was a canceled transfer by the error cancel transfer input + */ +#define DMA_MP_ES_ECX(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_ECX_SHIFT)) & DMA_MP_ES_ECX_MASK) + +#define DMA_MP_ES_ERRCHN_MASK (0x7000000U) +#define DMA_MP_ES_ERRCHN_SHIFT (24U) +/*! ERRCHN - Error Channel Number or Canceled Channel Number */ +#define DMA_MP_ES_ERRCHN(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_ERRCHN_SHIFT)) & DMA_MP_ES_ERRCHN_MASK) + +#define DMA_MP_ES_VLD_MASK (0x80000000U) +#define DMA_MP_ES_VLD_SHIFT (31U) +/*! VLD - Valid + * 0b0..No CHn_ES[ERR] fields are set to 1 + * 0b1..At least one CHn_ES[ERR] field is set to 1, indicating a valid error exists that software has not cleared + */ +#define DMA_MP_ES_VLD(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_ES_VLD_SHIFT)) & DMA_MP_ES_VLD_MASK) +/*! @} */ + +/*! @name MP_INT - Management Page Interrupt Request Status */ +/*! @{ */ + +#define DMA_MP_INT_INT_MASK (0xFFU) +#define DMA_MP_INT_INT_SHIFT (0U) +/*! INT - Interrupt Request Status */ +#define DMA_MP_INT_INT(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_INT_INT_SHIFT)) & DMA_MP_INT_INT_MASK) +/*! @} */ + +/*! @name MP_HRS - Management Page Hardware Request Status */ +/*! @{ */ + +#define DMA_MP_HRS_HRS_MASK (0xFFFFFFFFU) +#define DMA_MP_HRS_HRS_SHIFT (0U) +/*! HRS - Hardware Request Status */ +#define DMA_MP_HRS_HRS(x) (((uint32_t)(((uint32_t)(x)) << DMA_MP_HRS_HRS_SHIFT)) & DMA_MP_HRS_HRS_MASK) +/*! @} */ + +/*! @name CH_GRPRI - Channel Arbitration Group */ +/*! @{ */ + +#define DMA_CH_GRPRI_GRPRI_MASK (0x1FU) +#define DMA_CH_GRPRI_GRPRI_SHIFT (0U) +/*! GRPRI - Arbitration Group For Channel n */ +#define DMA_CH_GRPRI_GRPRI(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_GRPRI_GRPRI_SHIFT)) & DMA_CH_GRPRI_GRPRI_MASK) +/*! @} */ + +/* The count of DMA_CH_GRPRI */ +#define DMA_CH_GRPRI_COUNT (8U) + +/*! @name CH_CSR - Channel Control and Status */ +/*! @{ */ + +#define DMA_CH_CSR_ERQ_MASK (0x1U) +#define DMA_CH_CSR_ERQ_SHIFT (0U) +/*! ERQ - Enable DMA Request + * 0b0..DMA hardware request signal for corresponding channel disabled + * 0b1..DMA hardware request signal for corresponding channel enabled + */ +#define DMA_CH_CSR_ERQ(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_CSR_ERQ_SHIFT)) & DMA_CH_CSR_ERQ_MASK) + +#define DMA_CH_CSR_EARQ_MASK (0x2U) +#define DMA_CH_CSR_EARQ_SHIFT (1U) +/*! EARQ - Enable Asynchronous DMA Request + * 0b0..Disable asynchronous DMA request for the channel + * 0b1..Enable asynchronous DMA request for the channel + */ +#define DMA_CH_CSR_EARQ(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_CSR_EARQ_SHIFT)) & DMA_CH_CSR_EARQ_MASK) + +#define DMA_CH_CSR_EEI_MASK (0x4U) +#define DMA_CH_CSR_EEI_SHIFT (2U) +/*! EEI - Enable Error Interrupt + * 0b0..Error signal for corresponding channel does not generate error interrupt + * 0b1..Assertion of error signal for corresponding channel generates error interrupt request + */ +#define DMA_CH_CSR_EEI(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_CSR_EEI_SHIFT)) & DMA_CH_CSR_EEI_MASK) + +#define DMA_CH_CSR_EBW_MASK (0x8U) +#define DMA_CH_CSR_EBW_SHIFT (3U) +/*! EBW - Enable Buffered Writes + * 0b0..Buffered writes on system bus disabled + * 0b1..Buffered writes on system bus enabled + */ +#define DMA_CH_CSR_EBW(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_CSR_EBW_SHIFT)) & DMA_CH_CSR_EBW_MASK) + +#define DMA_CH_CSR_DONE_MASK (0x40000000U) +#define DMA_CH_CSR_DONE_SHIFT (30U) +/*! DONE - Channel Done */ +#define DMA_CH_CSR_DONE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_CSR_DONE_SHIFT)) & DMA_CH_CSR_DONE_MASK) + +#define DMA_CH_CSR_ACTIVE_MASK (0x80000000U) +#define DMA_CH_CSR_ACTIVE_SHIFT (31U) +/*! ACTIVE - Channel Active */ +#define DMA_CH_CSR_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_CSR_ACTIVE_SHIFT)) & DMA_CH_CSR_ACTIVE_MASK) +/*! @} */ + +/* The count of DMA_CH_CSR */ +#define DMA_CH_CSR_COUNT (8U) + +/*! @name CH_ES - Channel Error Status */ +/*! @{ */ + +#define DMA_CH_ES_DBE_MASK (0x1U) +#define DMA_CH_ES_DBE_SHIFT (0U) +/*! DBE - Destination Bus Error + * 0b0..No destination bus error + * 0b1..Last recorded error was bus error on destination write + */ +#define DMA_CH_ES_DBE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_DBE_SHIFT)) & DMA_CH_ES_DBE_MASK) + +#define DMA_CH_ES_SBE_MASK (0x2U) +#define DMA_CH_ES_SBE_SHIFT (1U) +/*! SBE - Source Bus Error + * 0b0..No source bus error + * 0b1..Last recorded error was bus error on source read + */ +#define DMA_CH_ES_SBE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_SBE_SHIFT)) & DMA_CH_ES_SBE_MASK) + +#define DMA_CH_ES_SGE_MASK (0x4U) +#define DMA_CH_ES_SGE_SHIFT (2U) +/*! SGE - Scatter/Gather Configuration Error + * 0b0..No scatter/gather configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_DLAST_SGA field + */ +#define DMA_CH_ES_SGE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_SGE_SHIFT)) & DMA_CH_ES_SGE_MASK) + +#define DMA_CH_ES_NCE_MASK (0x8U) +#define DMA_CH_ES_NCE_SHIFT (3U) +/*! NCE - NBYTES/CITER Configuration Error + * 0b0..No NBYTES/CITER configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_NBYTES or TCDn_CITER fields + */ +#define DMA_CH_ES_NCE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_NCE_SHIFT)) & DMA_CH_ES_NCE_MASK) + +#define DMA_CH_ES_DOE_MASK (0x10U) +#define DMA_CH_ES_DOE_SHIFT (4U) +/*! DOE - Destination Offset Error + * 0b0..No destination offset configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_DOFF field + */ +#define DMA_CH_ES_DOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_DOE_SHIFT)) & DMA_CH_ES_DOE_MASK) + +#define DMA_CH_ES_DAE_MASK (0x20U) +#define DMA_CH_ES_DAE_SHIFT (5U) +/*! DAE - Destination Address Error + * 0b0..No destination address configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_DADDR field + */ +#define DMA_CH_ES_DAE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_DAE_SHIFT)) & DMA_CH_ES_DAE_MASK) + +#define DMA_CH_ES_SOE_MASK (0x40U) +#define DMA_CH_ES_SOE_SHIFT (6U) +/*! SOE - Source Offset Error + * 0b0..No source offset configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_SOFF field + */ +#define DMA_CH_ES_SOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_SOE_SHIFT)) & DMA_CH_ES_SOE_MASK) + +#define DMA_CH_ES_SAE_MASK (0x80U) +#define DMA_CH_ES_SAE_SHIFT (7U) +/*! SAE - Source Address Error + * 0b0..No source address configuration error + * 0b1..Last recorded error was a configuration error detected in the TCDn_SADDR field + */ +#define DMA_CH_ES_SAE(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_SAE_SHIFT)) & DMA_CH_ES_SAE_MASK) + +#define DMA_CH_ES_ERR_MASK (0x80000000U) +#define DMA_CH_ES_ERR_SHIFT (31U) +/*! ERR - Error In Channel + * 0b0..An error in this channel has not occurred + * 0b1..An error in this channel has occurred + */ +#define DMA_CH_ES_ERR(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_ES_ERR_SHIFT)) & DMA_CH_ES_ERR_MASK) +/*! @} */ + +/* The count of DMA_CH_ES */ +#define DMA_CH_ES_COUNT (8U) + +/*! @name CH_INT - Channel Interrupt Status */ +/*! @{ */ + +#define DMA_CH_INT_INT_MASK (0x1U) +#define DMA_CH_INT_INT_SHIFT (0U) +/*! INT - Interrupt Request + * 0b0..Interrupt request for corresponding channel cleared + * 0b1..Interrupt request for corresponding channel active + */ +#define DMA_CH_INT_INT(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_INT_INT_SHIFT)) & DMA_CH_INT_INT_MASK) +/*! @} */ + +/* The count of DMA_CH_INT */ +#define DMA_CH_INT_COUNT (8U) + +/*! @name CH_SBR - Channel System Bus */ +/*! @{ */ + +#define DMA_CH_SBR_MID_MASK (0xFU) +#define DMA_CH_SBR_MID_SHIFT (0U) +/*! MID - Master ID */ +#define DMA_CH_SBR_MID(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_SBR_MID_SHIFT)) & DMA_CH_SBR_MID_MASK) + +#define DMA_CH_SBR_PAL_MASK (0x8000U) +#define DMA_CH_SBR_PAL_SHIFT (15U) +/*! PAL - Privileged Access Level + * 0b0..User protection level for DMA transfers + * 0b1..Privileged protection level for DMA transfers + */ +#define DMA_CH_SBR_PAL(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_SBR_PAL_SHIFT)) & DMA_CH_SBR_PAL_MASK) + +#define DMA_CH_SBR_EMI_MASK (0x10000U) +#define DMA_CH_SBR_EMI_SHIFT (16U) +/*! EMI - Enable Master ID Replication + * 0b0..Master ID replication is disabled + * 0b1..Master ID replication is enabled + */ +#define DMA_CH_SBR_EMI(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_SBR_EMI_SHIFT)) & DMA_CH_SBR_EMI_MASK) +/*! @} */ + +/* The count of DMA_CH_SBR */ +#define DMA_CH_SBR_COUNT (8U) + +/*! @name CH_PRI - Channel Priority */ +/*! @{ */ + +#define DMA_CH_PRI_APL_MASK (0x7U) +#define DMA_CH_PRI_APL_SHIFT (0U) +/*! APL - Arbitration Priority Level */ +#define DMA_CH_PRI_APL(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_PRI_APL_SHIFT)) & DMA_CH_PRI_APL_MASK) + +#define DMA_CH_PRI_DPA_MASK (0x40000000U) +#define DMA_CH_PRI_DPA_SHIFT (30U) +/*! DPA - Disable Preempt Ability + * 0b0..Channel can suspend a lower-priority channel + * 0b1..Channel cannot suspend any other channel, regardless of channel priority + */ +#define DMA_CH_PRI_DPA(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_PRI_DPA_SHIFT)) & DMA_CH_PRI_DPA_MASK) + +#define DMA_CH_PRI_ECP_MASK (0x80000000U) +#define DMA_CH_PRI_ECP_SHIFT (31U) +/*! ECP - Enable Channel Preemption + * 0b0..Channel cannot be suspended by a higher-priority channel's service request + * 0b1..Channel can be temporarily suspended by a higher-priority channel's service request + */ +#define DMA_CH_PRI_ECP(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_PRI_ECP_SHIFT)) & DMA_CH_PRI_ECP_MASK) +/*! @} */ + +/* The count of DMA_CH_PRI */ +#define DMA_CH_PRI_COUNT (8U) + +/*! @name CH_MUX - Channel Multiplexor Configuration */ +/*! @{ */ + +#define DMA_CH_MUX_SRC_MASK (0x7FU) +#define DMA_CH_MUX_SRC_SHIFT (0U) +/*! SRC - Service Request Source */ +#define DMA_CH_MUX_SRC(x) (((uint32_t)(((uint32_t)(x)) << DMA_CH_MUX_SRC_SHIFT)) & DMA_CH_MUX_SRC_MASK) +/*! @} */ + +/* The count of DMA_CH_MUX */ +#define DMA_CH_MUX_COUNT (8U) + +/*! @name TCD_SADDR - TCD Source Address */ +/*! @{ */ + +#define DMA_TCD_SADDR_SADDR_MASK (0xFFFFFFFFU) +#define DMA_TCD_SADDR_SADDR_SHIFT (0U) +/*! SADDR - Source Address */ +#define DMA_TCD_SADDR_SADDR(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_SADDR_SADDR_SHIFT)) & DMA_TCD_SADDR_SADDR_MASK) +/*! @} */ + +/* The count of DMA_TCD_SADDR */ +#define DMA_TCD_SADDR_COUNT (8U) + +/*! @name TCD_SOFF - TCD Signed Source Address Offset */ +/*! @{ */ + +#define DMA_TCD_SOFF_SOFF_MASK (0xFFFFU) +#define DMA_TCD_SOFF_SOFF_SHIFT (0U) +/*! SOFF - Source Address Signed Offset */ +#define DMA_TCD_SOFF_SOFF(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_SOFF_SOFF_SHIFT)) & DMA_TCD_SOFF_SOFF_MASK) +/*! @} */ + +/* The count of DMA_TCD_SOFF */ +#define DMA_TCD_SOFF_COUNT (8U) + +/*! @name TCD_ATTR - TCD Transfer Attributes */ +/*! @{ */ + +#define DMA_TCD_ATTR_DSIZE_MASK (0x7U) +#define DMA_TCD_ATTR_DSIZE_SHIFT (0U) +/*! DSIZE - Destination Data Transfer Size */ +#define DMA_TCD_ATTR_DSIZE(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_ATTR_DSIZE_SHIFT)) & DMA_TCD_ATTR_DSIZE_MASK) + +#define DMA_TCD_ATTR_DMOD_MASK (0xF8U) +#define DMA_TCD_ATTR_DMOD_SHIFT (3U) +/*! DMOD - Destination Address Modulo */ +#define DMA_TCD_ATTR_DMOD(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_ATTR_DMOD_SHIFT)) & DMA_TCD_ATTR_DMOD_MASK) + +#define DMA_TCD_ATTR_SSIZE_MASK (0x700U) +#define DMA_TCD_ATTR_SSIZE_SHIFT (8U) +/*! SSIZE - Source Data Transfer Size + * 0b000..8-bit + * 0b001..16-bit + * 0b010..32-bit + * 0b011..64-bit + * 0b100..16-byte + * 0b101..32-byte + * 0b110.. + * 0b111.. + */ +#define DMA_TCD_ATTR_SSIZE(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_ATTR_SSIZE_SHIFT)) & DMA_TCD_ATTR_SSIZE_MASK) + +#define DMA_TCD_ATTR_SMOD_MASK (0xF800U) +#define DMA_TCD_ATTR_SMOD_SHIFT (11U) +/*! SMOD - Source Address Modulo + * 0b00000..Source address modulo feature disabled + * 0b00001..Source address modulo feature enabled for any non-zero value [1-31] + */ +#define DMA_TCD_ATTR_SMOD(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_ATTR_SMOD_SHIFT)) & DMA_TCD_ATTR_SMOD_MASK) +/*! @} */ + +/* The count of DMA_TCD_ATTR */ +#define DMA_TCD_ATTR_COUNT (8U) + +/*! @name TCD_NBYTES_MLOFFNO - TCD Transfer Size Without Minor Loop Offsets */ +/*! @{ */ + +#define DMA_TCD_NBYTES_MLOFFNO_NBYTES_MASK (0x3FFFFFFFU) +#define DMA_TCD_NBYTES_MLOFFNO_NBYTES_SHIFT (0U) +/*! NBYTES - Number of Bytes To Transfer Per Service Request */ +#define DMA_TCD_NBYTES_MLOFFNO_NBYTES(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_NBYTES_MLOFFNO_NBYTES_SHIFT)) & DMA_TCD_NBYTES_MLOFFNO_NBYTES_MASK) + +#define DMA_TCD_NBYTES_MLOFFNO_DMLOE_MASK (0x40000000U) +#define DMA_TCD_NBYTES_MLOFFNO_DMLOE_SHIFT (30U) +/*! DMLOE - Destination Minor Loop Offset Enable + * 0b0..Minor loop offset not applied to DADDR + * 0b1..Minor loop offset applied to DADDR + */ +#define DMA_TCD_NBYTES_MLOFFNO_DMLOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_NBYTES_MLOFFNO_DMLOE_SHIFT)) & DMA_TCD_NBYTES_MLOFFNO_DMLOE_MASK) + +#define DMA_TCD_NBYTES_MLOFFNO_SMLOE_MASK (0x80000000U) +#define DMA_TCD_NBYTES_MLOFFNO_SMLOE_SHIFT (31U) +/*! SMLOE - Source Minor Loop Offset Enable + * 0b0..Minor loop offset not applied to SADDR + * 0b1..Minor loop offset applied to SADDR + */ +#define DMA_TCD_NBYTES_MLOFFNO_SMLOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_NBYTES_MLOFFNO_SMLOE_SHIFT)) & DMA_TCD_NBYTES_MLOFFNO_SMLOE_MASK) +/*! @} */ + +/* The count of DMA_TCD_NBYTES_MLOFFNO */ +#define DMA_TCD_NBYTES_MLOFFNO_COUNT (8U) + +/*! @name TCD_NBYTES_MLOFFYES - TCD Transfer Size with Minor Loop Offsets */ +/*! @{ */ + +#define DMA_TCD_NBYTES_MLOFFYES_NBYTES_MASK (0x3FFU) +#define DMA_TCD_NBYTES_MLOFFYES_NBYTES_SHIFT (0U) +/*! NBYTES - Number of Bytes To Transfer Per Service Request */ +#define DMA_TCD_NBYTES_MLOFFYES_NBYTES(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_NBYTES_MLOFFYES_NBYTES_SHIFT)) & DMA_TCD_NBYTES_MLOFFYES_NBYTES_MASK) + +#define DMA_TCD_NBYTES_MLOFFYES_MLOFF_MASK (0x3FFFFC00U) +#define DMA_TCD_NBYTES_MLOFFYES_MLOFF_SHIFT (10U) +/*! MLOFF - Minor Loop Offset */ +#define DMA_TCD_NBYTES_MLOFFYES_MLOFF(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_NBYTES_MLOFFYES_MLOFF_SHIFT)) & DMA_TCD_NBYTES_MLOFFYES_MLOFF_MASK) + +#define DMA_TCD_NBYTES_MLOFFYES_DMLOE_MASK (0x40000000U) +#define DMA_TCD_NBYTES_MLOFFYES_DMLOE_SHIFT (30U) +/*! DMLOE - Destination Minor Loop Offset Enable + * 0b0..Minor loop offset not applied to DADDR + * 0b1..Minor loop offset applied to DADDR + */ +#define DMA_TCD_NBYTES_MLOFFYES_DMLOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_NBYTES_MLOFFYES_DMLOE_SHIFT)) & DMA_TCD_NBYTES_MLOFFYES_DMLOE_MASK) + +#define DMA_TCD_NBYTES_MLOFFYES_SMLOE_MASK (0x80000000U) +#define DMA_TCD_NBYTES_MLOFFYES_SMLOE_SHIFT (31U) +/*! SMLOE - Source Minor Loop Offset Enable + * 0b0..Minor loop offset not applied to SADDR + * 0b1..Minor loop offset applied to SADDR + */ +#define DMA_TCD_NBYTES_MLOFFYES_SMLOE(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_NBYTES_MLOFFYES_SMLOE_SHIFT)) & DMA_TCD_NBYTES_MLOFFYES_SMLOE_MASK) +/*! @} */ + +/* The count of DMA_TCD_NBYTES_MLOFFYES */ +#define DMA_TCD_NBYTES_MLOFFYES_COUNT (8U) + +/*! @name TCD_SLAST_SDA - TCD Last Source Address Adjustment / Store DADDR Address */ +/*! @{ */ + +#define DMA_TCD_SLAST_SDA_SLAST_SDA_MASK (0xFFFFFFFFU) +#define DMA_TCD_SLAST_SDA_SLAST_SDA_SHIFT (0U) +/*! SLAST_SDA - Last Source Address Adjustment / Store DADDR Address */ +#define DMA_TCD_SLAST_SDA_SLAST_SDA(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_SLAST_SDA_SLAST_SDA_SHIFT)) & DMA_TCD_SLAST_SDA_SLAST_SDA_MASK) +/*! @} */ + +/* The count of DMA_TCD_SLAST_SDA */ +#define DMA_TCD_SLAST_SDA_COUNT (8U) + +/*! @name TCD_DADDR - TCD Destination Address */ +/*! @{ */ + +#define DMA_TCD_DADDR_DADDR_MASK (0xFFFFFFFFU) +#define DMA_TCD_DADDR_DADDR_SHIFT (0U) +/*! DADDR - Destination Address */ +#define DMA_TCD_DADDR_DADDR(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_DADDR_DADDR_SHIFT)) & DMA_TCD_DADDR_DADDR_MASK) +/*! @} */ + +/* The count of DMA_TCD_DADDR */ +#define DMA_TCD_DADDR_COUNT (8U) + +/*! @name TCD_DOFF - TCD Signed Destination Address Offset */ +/*! @{ */ + +#define DMA_TCD_DOFF_DOFF_MASK (0xFFFFU) +#define DMA_TCD_DOFF_DOFF_SHIFT (0U) +/*! DOFF - Destination Address Signed Offset */ +#define DMA_TCD_DOFF_DOFF(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_DOFF_DOFF_SHIFT)) & DMA_TCD_DOFF_DOFF_MASK) +/*! @} */ + +/* The count of DMA_TCD_DOFF */ +#define DMA_TCD_DOFF_COUNT (8U) + +/*! @name TCD_CITER_ELINKNO - TCD Current Major Loop Count (Minor Loop Channel Linking Disabled) */ +/*! @{ */ + +#define DMA_TCD_CITER_ELINKNO_CITER_MASK (0x7FFFU) +#define DMA_TCD_CITER_ELINKNO_CITER_SHIFT (0U) +/*! CITER - Current Major Iteration Count */ +#define DMA_TCD_CITER_ELINKNO_CITER(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CITER_ELINKNO_CITER_SHIFT)) & DMA_TCD_CITER_ELINKNO_CITER_MASK) + +#define DMA_TCD_CITER_ELINKNO_ELINK_MASK (0x8000U) +#define DMA_TCD_CITER_ELINKNO_ELINK_SHIFT (15U) +/*! ELINK - Enable Link + * 0b0..Channel-to-channel linking disabled + * 0b1..Channel-to-channel linking enabled + */ +#define DMA_TCD_CITER_ELINKNO_ELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CITER_ELINKNO_ELINK_SHIFT)) & DMA_TCD_CITER_ELINKNO_ELINK_MASK) +/*! @} */ + +/* The count of DMA_TCD_CITER_ELINKNO */ +#define DMA_TCD_CITER_ELINKNO_COUNT (8U) + +/*! @name TCD_CITER_ELINKYES - TCD Current Major Loop Count (Minor Loop Channel Linking Enabled) */ +/*! @{ */ + +#define DMA_TCD_CITER_ELINKYES_CITER_MASK (0x1FFU) +#define DMA_TCD_CITER_ELINKYES_CITER_SHIFT (0U) +/*! CITER - Current Major Iteration Count */ +#define DMA_TCD_CITER_ELINKYES_CITER(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CITER_ELINKYES_CITER_SHIFT)) & DMA_TCD_CITER_ELINKYES_CITER_MASK) + +#define DMA_TCD_CITER_ELINKYES_LINKCH_MASK (0xE00U) +#define DMA_TCD_CITER_ELINKYES_LINKCH_SHIFT (9U) +/*! LINKCH - Minor Loop Link Channel Number */ +#define DMA_TCD_CITER_ELINKYES_LINKCH(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CITER_ELINKYES_LINKCH_SHIFT)) & DMA_TCD_CITER_ELINKYES_LINKCH_MASK) + +#define DMA_TCD_CITER_ELINKYES_ELINK_MASK (0x8000U) +#define DMA_TCD_CITER_ELINKYES_ELINK_SHIFT (15U) +/*! ELINK - Enable Link + * 0b0..Channel-to-channel linking disabled + * 0b1..Channel-to-channel linking enabled + */ +#define DMA_TCD_CITER_ELINKYES_ELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CITER_ELINKYES_ELINK_SHIFT)) & DMA_TCD_CITER_ELINKYES_ELINK_MASK) +/*! @} */ + +/* The count of DMA_TCD_CITER_ELINKYES */ +#define DMA_TCD_CITER_ELINKYES_COUNT (8U) + +/*! @name TCD_DLAST_SGA - TCD Last Destination Address Adjustment / Scatter Gather Address */ +/*! @{ */ + +#define DMA_TCD_DLAST_SGA_DLAST_SGA_MASK (0xFFFFFFFFU) +#define DMA_TCD_DLAST_SGA_DLAST_SGA_SHIFT (0U) +/*! DLAST_SGA - Last Destination Address Adjustment / Scatter Gather Address */ +#define DMA_TCD_DLAST_SGA_DLAST_SGA(x) (((uint32_t)(((uint32_t)(x)) << DMA_TCD_DLAST_SGA_DLAST_SGA_SHIFT)) & DMA_TCD_DLAST_SGA_DLAST_SGA_MASK) +/*! @} */ + +/* The count of DMA_TCD_DLAST_SGA */ +#define DMA_TCD_DLAST_SGA_COUNT (8U) + +/*! @name TCD_CSR - TCD Control and Status */ +/*! @{ */ + +#define DMA_TCD_CSR_START_MASK (0x1U) +#define DMA_TCD_CSR_START_SHIFT (0U) +/*! START - Channel Start + * 0b0..Channel not explicitly started + * 0b1..Channel explicitly started via a software-initiated service request + */ +#define DMA_TCD_CSR_START(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_START_SHIFT)) & DMA_TCD_CSR_START_MASK) + +#define DMA_TCD_CSR_INTMAJOR_MASK (0x2U) +#define DMA_TCD_CSR_INTMAJOR_SHIFT (1U) +/*! INTMAJOR - Enable Interrupt If Major count complete + * 0b0..End-of-major loop interrupt disabled + * 0b1..End-of-major loop interrupt enabled + */ +#define DMA_TCD_CSR_INTMAJOR(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_INTMAJOR_SHIFT)) & DMA_TCD_CSR_INTMAJOR_MASK) + +#define DMA_TCD_CSR_INTHALF_MASK (0x4U) +#define DMA_TCD_CSR_INTHALF_SHIFT (2U) +/*! INTHALF - Enable Interrupt If Major Counter Half-complete + * 0b0..Halfway point interrupt disabled + * 0b1..Halfway point interrupt enabled + */ +#define DMA_TCD_CSR_INTHALF(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_INTHALF_SHIFT)) & DMA_TCD_CSR_INTHALF_MASK) + +#define DMA_TCD_CSR_DREQ_MASK (0x8U) +#define DMA_TCD_CSR_DREQ_SHIFT (3U) +/*! DREQ - Disable Request + * 0b0..No operation + * 0b1..Clear the ERQ field to 0 upon major loop completion, thus disabling hardware service requests + */ +#define DMA_TCD_CSR_DREQ(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_DREQ_SHIFT)) & DMA_TCD_CSR_DREQ_MASK) + +#define DMA_TCD_CSR_ESG_MASK (0x10U) +#define DMA_TCD_CSR_ESG_SHIFT (4U) +/*! ESG - Enable Scatter/Gather Processing + * 0b0..Current channel's TCD is normal format + * 0b1..Current channel's TCD specifies scatter/gather format. + */ +#define DMA_TCD_CSR_ESG(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_ESG_SHIFT)) & DMA_TCD_CSR_ESG_MASK) + +#define DMA_TCD_CSR_MAJORELINK_MASK (0x20U) +#define DMA_TCD_CSR_MAJORELINK_SHIFT (5U) +/*! MAJORELINK - Enable Link When Major Loop Complete + * 0b0..Channel-to-channel linking disabled + * 0b1..Channel-to-channel linking enabled + */ +#define DMA_TCD_CSR_MAJORELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_MAJORELINK_SHIFT)) & DMA_TCD_CSR_MAJORELINK_MASK) + +#define DMA_TCD_CSR_EEOP_MASK (0x40U) +#define DMA_TCD_CSR_EEOP_SHIFT (6U) +/*! EEOP - Enable End-Of-Packet Processing + * 0b0..End-of-packet operation disabled + * 0b1..End-of-packet hardware input signal enabled + */ +#define DMA_TCD_CSR_EEOP(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_EEOP_SHIFT)) & DMA_TCD_CSR_EEOP_MASK) + +#define DMA_TCD_CSR_ESDA_MASK (0x80U) +#define DMA_TCD_CSR_ESDA_SHIFT (7U) +/*! ESDA - Enable Store Destination Address + * 0b0..Ability to store destination address to system memory disabled + * 0b1..Ability to store destination address to system memory enabled + */ +#define DMA_TCD_CSR_ESDA(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_ESDA_SHIFT)) & DMA_TCD_CSR_ESDA_MASK) + +#define DMA_TCD_CSR_MAJORLINKCH_MASK (0x700U) +#define DMA_TCD_CSR_MAJORLINKCH_SHIFT (8U) +/*! MAJORLINKCH - Major Loop Link Channel Number */ +#define DMA_TCD_CSR_MAJORLINKCH(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_MAJORLINKCH_SHIFT)) & DMA_TCD_CSR_MAJORLINKCH_MASK) + +#define DMA_TCD_CSR_BWC_MASK (0xC000U) +#define DMA_TCD_CSR_BWC_SHIFT (14U) +/*! BWC - Bandwidth Control + * 0b00..No eDMA engine stalls + * 0b01.. + * 0b10..eDMA engine stalls for 4 cycles after each R/W + * 0b11..eDMA engine stalls for 8 cycles after each R/W + */ +#define DMA_TCD_CSR_BWC(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_CSR_BWC_SHIFT)) & DMA_TCD_CSR_BWC_MASK) +/*! @} */ + +/* The count of DMA_TCD_CSR */ +#define DMA_TCD_CSR_COUNT (8U) + +/*! @name TCD_BITER_ELINKNO - TCD Beginning Major Loop Count (Minor Loop Channel Linking Disabled) */ +/*! @{ */ + +#define DMA_TCD_BITER_ELINKNO_BITER_MASK (0x7FFFU) +#define DMA_TCD_BITER_ELINKNO_BITER_SHIFT (0U) +/*! BITER - Starting Major Iteration Count */ +#define DMA_TCD_BITER_ELINKNO_BITER(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_BITER_ELINKNO_BITER_SHIFT)) & DMA_TCD_BITER_ELINKNO_BITER_MASK) + +#define DMA_TCD_BITER_ELINKNO_ELINK_MASK (0x8000U) +#define DMA_TCD_BITER_ELINKNO_ELINK_SHIFT (15U) +/*! ELINK - Enables Link + * 0b0..Channel-to-channel linking disabled + * 0b1..Channel-to-channel linking enabled + */ +#define DMA_TCD_BITER_ELINKNO_ELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_BITER_ELINKNO_ELINK_SHIFT)) & DMA_TCD_BITER_ELINKNO_ELINK_MASK) +/*! @} */ + +/* The count of DMA_TCD_BITER_ELINKNO */ +#define DMA_TCD_BITER_ELINKNO_COUNT (8U) + +/*! @name TCD_BITER_ELINKYES - TCD Beginning Major Loop Count (Minor Loop Channel Linking Enabled) */ +/*! @{ */ + +#define DMA_TCD_BITER_ELINKYES_BITER_MASK (0x1FFU) +#define DMA_TCD_BITER_ELINKYES_BITER_SHIFT (0U) +/*! BITER - Starting Major Iteration Count */ +#define DMA_TCD_BITER_ELINKYES_BITER(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_BITER_ELINKYES_BITER_SHIFT)) & DMA_TCD_BITER_ELINKYES_BITER_MASK) + +#define DMA_TCD_BITER_ELINKYES_LINKCH_MASK (0xE00U) +#define DMA_TCD_BITER_ELINKYES_LINKCH_SHIFT (9U) +/*! LINKCH - Link Channel Number */ +#define DMA_TCD_BITER_ELINKYES_LINKCH(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_BITER_ELINKYES_LINKCH_SHIFT)) & DMA_TCD_BITER_ELINKYES_LINKCH_MASK) + +#define DMA_TCD_BITER_ELINKYES_ELINK_MASK (0x8000U) +#define DMA_TCD_BITER_ELINKYES_ELINK_SHIFT (15U) +/*! ELINK - Enable Link + * 0b0..Channel-to-channel linking disabled + * 0b1..Channel-to-channel linking enabled + */ +#define DMA_TCD_BITER_ELINKYES_ELINK(x) (((uint16_t)(((uint16_t)(x)) << DMA_TCD_BITER_ELINKYES_ELINK_SHIFT)) & DMA_TCD_BITER_ELINKYES_ELINK_MASK) +/*! @} */ + +/* The count of DMA_TCD_BITER_ELINKYES */ +#define DMA_TCD_BITER_ELINKYES_COUNT (8U) + + +/*! + * @} + */ /* end of group DMA_Register_Masks */ + + +/* DMA - Peripheral instance base addresses */ +/** Peripheral DMA0 base address */ +#define DMA0_BASE (0x40080000u) +/** Peripheral DMA0 base pointer */ +#define DMA0 ((DMA_Type *)DMA0_BASE) +/** Array initializer of DMA peripheral base addresses */ +#define DMA_BASE_ADDRS { DMA0_BASE } +/** Array initializer of DMA peripheral base pointers */ +#define DMA_BASE_PTRS { DMA0 } + +/*! + * @} + */ /* end of group DMA_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- EIM Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup EIM_Peripheral_Access_Layer EIM Peripheral Access Layer + * @{ + */ + +/** EIM - Register Layout Typedef */ +typedef struct { + __IO uint32_t EIMCR; /**< Error Injection Module Configuration Register, offset: 0x0 */ + __IO uint32_t EICHEN; /**< Error Injection Channel Enable register, offset: 0x4 */ + uint8_t RESERVED_0[248]; + __IO uint32_t EICHD0_WORD0; /**< Error Injection Channel Descriptor 0, Word0, offset: 0x100 */ + __IO uint32_t EICHD0_WORD1; /**< Error Injection Channel Descriptor 0, Word1, offset: 0x104 */ +} EIM_Type; + +/* ---------------------------------------------------------------------------- + -- EIM Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup EIM_Register_Masks EIM Register Masks + * @{ + */ + +/*! @name EIMCR - Error Injection Module Configuration Register */ +/*! @{ */ + +#define EIM_EIMCR_GEIEN_MASK (0x1U) +#define EIM_EIMCR_GEIEN_SHIFT (0U) +/*! GEIEN - Global Error Injection Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EIM_EIMCR_GEIEN(x) (((uint32_t)(((uint32_t)(x)) << EIM_EIMCR_GEIEN_SHIFT)) & EIM_EIMCR_GEIEN_MASK) +/*! @} */ + +/*! @name EICHEN - Error Injection Channel Enable register */ +/*! @{ */ + +#define EIM_EICHEN_EICH0EN_MASK (0x80000000U) +#define EIM_EICHEN_EICH0EN_SHIFT (31U) +/*! EICH0EN - Error Injection Channel 0 Enable + * 0b0..Error injection is disabled on Error Injection Channel 0 + * 0b1..Error injection is enabled on Error Injection Channel 0 + */ +#define EIM_EICHEN_EICH0EN(x) (((uint32_t)(((uint32_t)(x)) << EIM_EICHEN_EICH0EN_SHIFT)) & EIM_EICHEN_EICH0EN_MASK) +/*! @} */ + +/*! @name EICHD0_WORD0 - Error Injection Channel Descriptor 0, Word0 */ +/*! @{ */ + +#define EIM_EICHD0_WORD0_CHKBIT_MASK_MASK (0xFE000000U) +#define EIM_EICHD0_WORD0_CHKBIT_MASK_SHIFT (25U) +/*! CHKBIT_MASK - Checkbit Mask */ +#define EIM_EICHD0_WORD0_CHKBIT_MASK(x) (((uint32_t)(((uint32_t)(x)) << EIM_EICHD0_WORD0_CHKBIT_MASK_SHIFT)) & EIM_EICHD0_WORD0_CHKBIT_MASK_MASK) +/*! @} */ + +/*! @name EICHD0_WORD1 - Error Injection Channel Descriptor 0, Word1 */ +/*! @{ */ + +#define EIM_EICHD0_WORD1_B0_3DATA_MASK_MASK (0xFFFFFFFFU) +#define EIM_EICHD0_WORD1_B0_3DATA_MASK_SHIFT (0U) +/*! B0_3DATA_MASK - Data Mask Bytes 0-3 */ +#define EIM_EICHD0_WORD1_B0_3DATA_MASK(x) (((uint32_t)(((uint32_t)(x)) << EIM_EICHD0_WORD1_B0_3DATA_MASK_SHIFT)) & EIM_EICHD0_WORD1_B0_3DATA_MASK_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group EIM_Register_Masks */ + + +/* EIM - Peripheral instance base addresses */ +/** Peripheral EIM0 base address */ +#define EIM0_BASE (0x4008C000u) +/** Peripheral EIM0 base pointer */ +#define EIM0 ((EIM_Type *)EIM0_BASE) +/** Array initializer of EIM peripheral base addresses */ +#define EIM_BASE_ADDRS { EIM0_BASE } +/** Array initializer of EIM peripheral base pointers */ +#define EIM_BASE_PTRS { EIM0 } + +/*! + * @} + */ /* end of group EIM_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- EQDC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup EQDC_Peripheral_Access_Layer EQDC Peripheral Access Layer + * @{ + */ + +/** EQDC - Register Layout Typedef */ +typedef struct { + __IO uint16_t CTRL; /**< Control Register, offset: 0x0 */ + __IO uint16_t CTRL2; /**< Control 2 Register, offset: 0x2 */ + __IO uint16_t FILT; /**< Input Filter Register, offset: 0x4 */ + __I uint16_t LASTEDGE; /**< Last Edge Time Register, offset: 0x6 */ + __I uint16_t POSDPER; /**< Position Difference Period Counter Register, offset: 0x8 */ + __I uint16_t POSDPERBFR; /**< Position Difference Period Buffer Register, offset: 0xA */ + __IO uint16_t UPOS; /**< Upper Position Counter Register, offset: 0xC */ + __IO uint16_t LPOS; /**< Lower Position Counter Register, offset: 0xE */ + __IO uint16_t POSD; /**< Position Difference Counter Register, offset: 0x10 */ + __I uint16_t POSDH; /**< Position Difference Hold Register, offset: 0x12 */ + __I uint16_t UPOSH; /**< Upper Position Hold Register, offset: 0x14 */ + __I uint16_t LPOSH; /**< Lower Position Hold Register, offset: 0x16 */ + __I uint16_t LASTEDGEH; /**< Last Edge Time Hold Register, offset: 0x18 */ + __I uint16_t POSDPERH; /**< Position Difference Period Hold Register, offset: 0x1A */ + __I uint16_t REVH; /**< Revolution Hold Register, offset: 0x1C */ + __IO uint16_t REV; /**< Revolution Counter Register, offset: 0x1E */ + __IO uint16_t UINIT; /**< Upper Initialization Register, offset: 0x20 */ + __IO uint16_t LINIT; /**< Lower Initialization Register, offset: 0x22 */ + __IO uint16_t UMOD; /**< Upper Modulus Register, offset: 0x24 */ + __IO uint16_t LMOD; /**< Lower Modulus Register, offset: 0x26 */ + __IO uint16_t UCOMP0; /**< Upper Position Compare Register 0, offset: 0x28 */ + __IO uint16_t LCOMP0; /**< Lower Position Compare Register 0, offset: 0x2A */ + union { /* offset: 0x2C */ + __O uint16_t UCOMP1; /**< Upper Position Compare 1, offset: 0x2C */ + __I uint16_t UPOSH1; /**< Upper Position Holder Register 1, offset: 0x2C */ + }; + union { /* offset: 0x2E */ + __O uint16_t LCOMP1; /**< Lower Position Compare 1, offset: 0x2E */ + __I uint16_t LPOSH1; /**< Lower Position Holder Register 1, offset: 0x2E */ + }; + union { /* offset: 0x30 */ + __O uint16_t UCOMP2; /**< Upper Position Compare 2, offset: 0x30 */ + __I uint16_t UPOSH2; /**< Upper Position Holder Register 3, offset: 0x30 */ + }; + union { /* offset: 0x32 */ + __O uint16_t LCOMP2; /**< Lower Position Compare 2, offset: 0x32 */ + __I uint16_t LPOSH2; /**< Lower Position Holder Register 2, offset: 0x32 */ + }; + union { /* offset: 0x34 */ + __O uint16_t UCOMP3; /**< Upper Position Compare 3, offset: 0x34 */ + __I uint16_t UPOSH3; /**< Upper Position Holder Register 3, offset: 0x34 */ + }; + union { /* offset: 0x36 */ + __O uint16_t LCOMP3; /**< Lower Position Compare 3, offset: 0x36 */ + __I uint16_t LPOSH3; /**< Lower Position Holder Register 3, offset: 0x36 */ + }; + __IO uint16_t INTCTRL; /**< Interrupt Control Register, offset: 0x38 */ + __IO uint16_t WTR; /**< Watchdog Timeout Register, offset: 0x3A */ + __IO uint16_t IMR; /**< Input Monitor Register, offset: 0x3C */ + __IO uint16_t TST; /**< Test Register, offset: 0x3E */ + uint8_t RESERVED_0[16]; + __I uint16_t UVERID; /**< Upper VERID, offset: 0x50 */ + __I uint16_t LVERID; /**< Lower VERID, offset: 0x52 */ +} EQDC_Type; + +/* ---------------------------------------------------------------------------- + -- EQDC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup EQDC_Register_Masks EQDC Register Masks + * @{ + */ + +/*! @name CTRL - Control Register */ +/*! @{ */ + +#define EQDC_CTRL_LDOK_MASK (0x1U) +#define EQDC_CTRL_LDOK_SHIFT (0U) +/*! LDOK - Load Okay + * 0b0..No loading action taken. Users can write new values to buffered registers (writing into outer-set of these buffered registers) + * 0b1..Outer-set values are ready to be loaded into inner-set and take effect. The loading time point depends on CTRL2[LDMOD]. + */ +#define EQDC_CTRL_LDOK(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_LDOK_SHIFT)) & EQDC_CTRL_LDOK_MASK) + +#define EQDC_CTRL_DMAEN_MASK (0x2U) +#define EQDC_CTRL_DMAEN_SHIFT (1U) +/*! DMAEN - DMA Enable + * 0b0..DMA is disabled + * 0b1..DMA is enabled. DMA request asserts automatically when the values in the outer-set of buffered compare + * registers (UCOMP0/LCOMP0;UCOMP1/LCOMP1;UCOMP2/LCOMP2;UCOMP3/LCOMP3), initial registers(UINIT/LINIT) and + * modulus registers (UMOD/LMOD) are loaded into the inner-set of buffer and then LDOK is cleared automatically. + * After the completion of this DMA transfer, LDOK is set automatically, it ensures outer-set values can be + * loaded into inner-set which in turn triggers DMA again. + */ +#define EQDC_CTRL_DMAEN(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_DMAEN_SHIFT)) & EQDC_CTRL_DMAEN_MASK) + +#define EQDC_CTRL_WDE_MASK (0x4U) +#define EQDC_CTRL_WDE_SHIFT (2U) +/*! WDE - Watchdog Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_CTRL_WDE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_WDE_SHIFT)) & EQDC_CTRL_WDE_MASK) + +#define EQDC_CTRL_WDIE_MASK (0x8U) +#define EQDC_CTRL_WDIE_SHIFT (3U) +/*! WDIE - Watchdog Timeout Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_CTRL_WDIE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_WDIE_SHIFT)) & EQDC_CTRL_WDIE_MASK) + +#define EQDC_CTRL_WDIRQ_MASK (0x10U) +#define EQDC_CTRL_WDIRQ_SHIFT (4U) +/*! WDIRQ - Watchdog Timeout Interrupt Request + * 0b0..No Watchdog timeout interrupt has occurred + * 0b1..Watchdog timeout interrupt has occurred + */ +#define EQDC_CTRL_WDIRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_WDIRQ_SHIFT)) & EQDC_CTRL_WDIRQ_MASK) + +#define EQDC_CTRL_XNE_MASK (0x20U) +#define EQDC_CTRL_XNE_SHIFT (5U) +/*! XNE - Select Positive/Negative Edge of INDEX/PRESET Pulse + * 0b0..Use positive edge of INDEX/PRESET pulse + * 0b1..Use negative edge of INDEX/PRESET pulse + */ +#define EQDC_CTRL_XNE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_XNE_SHIFT)) & EQDC_CTRL_XNE_MASK) + +#define EQDC_CTRL_XIP_MASK (0x40U) +#define EQDC_CTRL_XIP_SHIFT (6U) +/*! XIP - INDEX Triggered Initialization of Position Counters UPOS and LPOS + * 0b0..INDEX pulse does not initialize the position counter + * 0b1..INDEX pulse initializes the position counter + */ +#define EQDC_CTRL_XIP(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_XIP_SHIFT)) & EQDC_CTRL_XIP_MASK) + +#define EQDC_CTRL_XIE_MASK (0x80U) +#define EQDC_CTRL_XIE_SHIFT (7U) +/*! XIE - INDEX/PRESET Pulse Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_CTRL_XIE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_XIE_SHIFT)) & EQDC_CTRL_XIE_MASK) + +#define EQDC_CTRL_XIRQ_MASK (0x100U) +#define EQDC_CTRL_XIRQ_SHIFT (8U) +/*! XIRQ - INDEX/PRESET Pulse Interrupt Request + * 0b0..INDEX/PRESET pulse has not occurred + * 0b1..INDEX/PRESET pulse has occurred + */ +#define EQDC_CTRL_XIRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_XIRQ_SHIFT)) & EQDC_CTRL_XIRQ_MASK) + +#define EQDC_CTRL_PH1_MASK (0x200U) +#define EQDC_CTRL_PH1_SHIFT (9U) +/*! PH1 - Enable Single Phase Mode + * 0b0..Standard quadrature decoder, where PHASEA and PHASEB represent a two-phase quadrature signal. + * 0b1..Single phase mode, bypass the quadrature decoder, refer to CTRL2[CMODE] description + */ +#define EQDC_CTRL_PH1(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_PH1_SHIFT)) & EQDC_CTRL_PH1_MASK) + +#define EQDC_CTRL_REV_MASK (0x400U) +#define EQDC_CTRL_REV_SHIFT (10U) +/*! REV - Enable Reverse Direction Counting + * 0b0..Count normally and the position counter initialization uses upper/lower initialization register UINIT/LINIT + * 0b1..Count in the reverse direction and the position counter initialization uses upper/lower modulus register UMOD/LMOD + */ +#define EQDC_CTRL_REV(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_REV_SHIFT)) & EQDC_CTRL_REV_MASK) + +#define EQDC_CTRL_SWIP_MASK (0x800U) +#define EQDC_CTRL_SWIP_SHIFT (11U) +/*! SWIP - Software-Triggered Initialization of Position Counters UPOS and LPOS + * 0b0..No action + * 0b1..Initialize position counter + */ +#define EQDC_CTRL_SWIP(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_SWIP_SHIFT)) & EQDC_CTRL_SWIP_MASK) + +#define EQDC_CTRL_HNE_MASK (0x1000U) +#define EQDC_CTRL_HNE_SHIFT (12U) +/*! HNE - Use Negative Edge of HOME/ENABLE Input + * 0b0..When CTRL[OPMODE] = 0,use HOME positive edge to trigger initialization of position counters. When + * CTRL[OPMODE] = 1,use ENABLE high level to enable POS/POSD/WDG/REV counters + * 0b1..When CTRL[OPMODE] = 0,use HOME negative edge to trigger initialization of position counters. When + * CTRL[OPMODE] = 1,use ENABLE low level to enable POS/POSD/WDG/REV counters + */ +#define EQDC_CTRL_HNE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_HNE_SHIFT)) & EQDC_CTRL_HNE_MASK) + +#define EQDC_CTRL_HIP_MASK (0x2000U) +#define EQDC_CTRL_HIP_SHIFT (13U) +/*! HIP - Enable HOME to Initialize Position Counter UPOS/LPOS + * 0b0..No action + * 0b1..HOME signal initializes the position counter + */ +#define EQDC_CTRL_HIP(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_HIP_SHIFT)) & EQDC_CTRL_HIP_MASK) + +#define EQDC_CTRL_HIE_MASK (0x4000U) +#define EQDC_CTRL_HIE_SHIFT (14U) +/*! HIE - HOME/ENABLE Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_CTRL_HIE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_HIE_SHIFT)) & EQDC_CTRL_HIE_MASK) + +#define EQDC_CTRL_HIRQ_MASK (0x8000U) +#define EQDC_CTRL_HIRQ_SHIFT (15U) +/*! HIRQ - HOME/ENABLE Signal Transition Interrupt Request + * 0b0..No transition on the HOME/ENABLE signal has occurred + * 0b1..A transition on the HOME/ENABLE signal has occurred + */ +#define EQDC_CTRL_HIRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL_HIRQ_SHIFT)) & EQDC_CTRL_HIRQ_MASK) +/*! @} */ + +/*! @name CTRL2 - Control 2 Register */ +/*! @{ */ + +#define EQDC_CTRL2_UPDHLD_MASK (0x1U) +#define EQDC_CTRL2_UPDHLD_SHIFT (0U) +/*! UPDHLD - Update Hold Registers */ +#define EQDC_CTRL2_UPDHLD(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_UPDHLD_SHIFT)) & EQDC_CTRL2_UPDHLD_MASK) + +#define EQDC_CTRL2_UPDPOS_MASK (0x2U) +#define EQDC_CTRL2_UPDPOS_SHIFT (1U) +/*! UPDPOS - Update Position Registers */ +#define EQDC_CTRL2_UPDPOS(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_UPDPOS_SHIFT)) & EQDC_CTRL2_UPDPOS_MASK) + +#define EQDC_CTRL2_OPMODE_MASK (0x4U) +#define EQDC_CTRL2_OPMODE_SHIFT (2U) +/*! OPMODE - Operation Mode Select + * 0b0..Decode Mode: Input nodes INDEX/PRESET and HOME/ENABLE are assigned to function of INDEX and HOME. + * 0b1..Count Mode: Input nodes INDEX/PRESET and HOME/ENABLE are assigned to functions of PRESET and ENABLE. In + * this mode: (1)only when ENABLE=1, all counters (position/position difference/revolution/watchdog) can run, + * when ENABLE=0, all counters (position/position difference/revolution/watchdog) can't run. (2) the rising + * edge of PRESET input can initialize position/revolution/watchdog counters (position counter initialization + * also need referring to bit CTRL[REV]). + */ +#define EQDC_CTRL2_OPMODE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_OPMODE_SHIFT)) & EQDC_CTRL2_OPMODE_MASK) + +#define EQDC_CTRL2_LDMOD_MASK (0x8U) +#define EQDC_CTRL2_LDMOD_SHIFT (3U) +/*! LDMOD - Buffered Register Load (Update) Mode Select + * 0b0..Buffered registers are loaded and take effect immediately upon CTRL[LDOK] is set. + * 0b1..Buffered registers are loaded and take effect at the next roll-over or roll-under if CTRL[LDOK] is set. + */ +#define EQDC_CTRL2_LDMOD(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_LDMOD_SHIFT)) & EQDC_CTRL2_LDMOD_MASK) + +#define EQDC_CTRL2_REVMOD_MASK (0x100U) +#define EQDC_CTRL2_REVMOD_SHIFT (8U) +/*! REVMOD - Revolution Counter Modulus Enable + * 0b0..Use INDEX pulse to increment/decrement revolution counter (REV) + * 0b1..Use modulus counting roll-over/under to increment/decrement revolution counter (REV) + */ +#define EQDC_CTRL2_REVMOD(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_REVMOD_SHIFT)) & EQDC_CTRL2_REVMOD_MASK) + +#define EQDC_CTRL2_OUTCTL_MASK (0x200U) +#define EQDC_CTRL2_OUTCTL_SHIFT (9U) +/*! OUTCTL - Output Control + * 0b0..POS_MATCH[x](x range is 0-3) is asserted when the Position Counter is equal to according compare value + * (UCOMPx/LCOMPx)(x range is 0-3), and de-asserted when the Position Counter not equal to the compare value + * (UCOMPx/LCOMPx)(x range is 0-3) + * 0b1..All POS_MATCH[x](x range is 0-3) are asserted a pulse, when the UPOS, LPOS, REV, or POSD registers are read + */ +#define EQDC_CTRL2_OUTCTL(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_OUTCTL_SHIFT)) & EQDC_CTRL2_OUTCTL_MASK) + +#define EQDC_CTRL2_PMEN_MASK (0x400U) +#define EQDC_CTRL2_PMEN_SHIFT (10U) +/*! PMEN - Period measurement function enable + * 0b0..Period measurement functions are not used. POSD is loaded to POSDH and then cleared whenever POSD, UPOS, LPOS or REV is read. + * 0b1..Period measurement functions are used. POSD is loaded into POSDH and then cleared only when POSD is read. + */ +#define EQDC_CTRL2_PMEN(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_PMEN_SHIFT)) & EQDC_CTRL2_PMEN_MASK) + +#define EQDC_CTRL2_EMIP_MASK (0x800U) +#define EQDC_CTRL2_EMIP_SHIFT (11U) +/*! EMIP - Enables/disables the position counter to be initialized by Index Event Edge Mark + * 0b0..disables the position counter to be initialized by Index Event Edge Mark + * 0b1..enables the position counter to be initialized by Index Event Edge Mark. + */ +#define EQDC_CTRL2_EMIP(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_EMIP_SHIFT)) & EQDC_CTRL2_EMIP_MASK) + +#define EQDC_CTRL2_INITPOS_MASK (0x1000U) +#define EQDC_CTRL2_INITPOS_SHIFT (12U) +/*! INITPOS - Initial Position Register + * 0b0..Don't initialize position counter on rising edge of TRIGGER + * 0b1..Initialize position counter on rising edge of TRIGGER + */ +#define EQDC_CTRL2_INITPOS(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_INITPOS_SHIFT)) & EQDC_CTRL2_INITPOS_MASK) + +#define EQDC_CTRL2_ONCE_MASK (0x2000U) +#define EQDC_CTRL2_ONCE_SHIFT (13U) +/*! ONCE - Count Once + * 0b0..Position counter counts repeatedly + * 0b1..Position counter counts until roll-over or roll-under, then stop. + */ +#define EQDC_CTRL2_ONCE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_ONCE_SHIFT)) & EQDC_CTRL2_ONCE_MASK) + +#define EQDC_CTRL2_CMODE_MASK (0xC000U) +#define EQDC_CTRL2_CMODE_SHIFT (14U) +/*! CMODE - Counting Mode */ +#define EQDC_CTRL2_CMODE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_CTRL2_CMODE_SHIFT)) & EQDC_CTRL2_CMODE_MASK) +/*! @} */ + +/*! @name FILT - Input Filter Register */ +/*! @{ */ + +#define EQDC_FILT_FILT_PER_MASK (0xFFU) +#define EQDC_FILT_FILT_PER_SHIFT (0U) +/*! FILT_PER - Input Filter Sample Period */ +#define EQDC_FILT_FILT_PER(x) (((uint16_t)(((uint16_t)(x)) << EQDC_FILT_FILT_PER_SHIFT)) & EQDC_FILT_FILT_PER_MASK) + +#define EQDC_FILT_FILT_CNT_MASK (0x700U) +#define EQDC_FILT_FILT_CNT_SHIFT (8U) +/*! FILT_CNT - Input Filter Sample Count */ +#define EQDC_FILT_FILT_CNT(x) (((uint16_t)(((uint16_t)(x)) << EQDC_FILT_FILT_CNT_SHIFT)) & EQDC_FILT_FILT_CNT_MASK) + +#define EQDC_FILT_FILT_CS_MASK (0x800U) +#define EQDC_FILT_FILT_CS_SHIFT (11U) +/*! FILT_CS - Filter Clock Source selection + * 0b0..Peripheral Clock + * 0b1..Prescaled peripheral clock by PRSC + */ +#define EQDC_FILT_FILT_CS(x) (((uint16_t)(((uint16_t)(x)) << EQDC_FILT_FILT_CS_SHIFT)) & EQDC_FILT_FILT_CS_MASK) + +#define EQDC_FILT_PRSC_MASK (0xF000U) +#define EQDC_FILT_PRSC_SHIFT (12U) +/*! PRSC - Prescaler */ +#define EQDC_FILT_PRSC(x) (((uint16_t)(((uint16_t)(x)) << EQDC_FILT_PRSC_SHIFT)) & EQDC_FILT_PRSC_MASK) +/*! @} */ + +/*! @name LASTEDGE - Last Edge Time Register */ +/*! @{ */ + +#define EQDC_LASTEDGE_LASTEDGE_MASK (0xFFFFU) +#define EQDC_LASTEDGE_LASTEDGE_SHIFT (0U) +/*! LASTEDGE - Last Edge Time Counter */ +#define EQDC_LASTEDGE_LASTEDGE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LASTEDGE_LASTEDGE_SHIFT)) & EQDC_LASTEDGE_LASTEDGE_MASK) +/*! @} */ + +/*! @name POSDPER - Position Difference Period Counter Register */ +/*! @{ */ + +#define EQDC_POSDPER_POSDPER_MASK (0xFFFFU) +#define EQDC_POSDPER_POSDPER_SHIFT (0U) +/*! POSDPER - Position difference period */ +#define EQDC_POSDPER_POSDPER(x) (((uint16_t)(((uint16_t)(x)) << EQDC_POSDPER_POSDPER_SHIFT)) & EQDC_POSDPER_POSDPER_MASK) +/*! @} */ + +/*! @name POSDPERBFR - Position Difference Period Buffer Register */ +/*! @{ */ + +#define EQDC_POSDPERBFR_POSDPERBFR_MASK (0xFFFFU) +#define EQDC_POSDPERBFR_POSDPERBFR_SHIFT (0U) +/*! POSDPERBFR - Position difference period buffer */ +#define EQDC_POSDPERBFR_POSDPERBFR(x) (((uint16_t)(((uint16_t)(x)) << EQDC_POSDPERBFR_POSDPERBFR_SHIFT)) & EQDC_POSDPERBFR_POSDPERBFR_MASK) +/*! @} */ + +/*! @name UPOS - Upper Position Counter Register */ +/*! @{ */ + +#define EQDC_UPOS_POS_MASK (0xFFFFU) +#define EQDC_UPOS_POS_SHIFT (0U) +/*! POS - POS */ +#define EQDC_UPOS_POS(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UPOS_POS_SHIFT)) & EQDC_UPOS_POS_MASK) +/*! @} */ + +/*! @name LPOS - Lower Position Counter Register */ +/*! @{ */ + +#define EQDC_LPOS_POS_MASK (0xFFFFU) +#define EQDC_LPOS_POS_SHIFT (0U) +/*! POS - POS */ +#define EQDC_LPOS_POS(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LPOS_POS_SHIFT)) & EQDC_LPOS_POS_MASK) +/*! @} */ + +/*! @name POSD - Position Difference Counter Register */ +/*! @{ */ + +#define EQDC_POSD_POSD_MASK (0xFFFFU) +#define EQDC_POSD_POSD_SHIFT (0U) +/*! POSD - POSD */ +#define EQDC_POSD_POSD(x) (((uint16_t)(((uint16_t)(x)) << EQDC_POSD_POSD_SHIFT)) & EQDC_POSD_POSD_MASK) +/*! @} */ + +/*! @name POSDH - Position Difference Hold Register */ +/*! @{ */ + +#define EQDC_POSDH_POSDH_MASK (0xFFFFU) +#define EQDC_POSDH_POSDH_SHIFT (0U) +/*! POSDH - POSDH */ +#define EQDC_POSDH_POSDH(x) (((uint16_t)(((uint16_t)(x)) << EQDC_POSDH_POSDH_SHIFT)) & EQDC_POSDH_POSDH_MASK) +/*! @} */ + +/*! @name UPOSH - Upper Position Hold Register */ +/*! @{ */ + +#define EQDC_UPOSH_POSH_MASK (0xFFFFU) +#define EQDC_UPOSH_POSH_SHIFT (0U) +/*! POSH - POSH */ +#define EQDC_UPOSH_POSH(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UPOSH_POSH_SHIFT)) & EQDC_UPOSH_POSH_MASK) +/*! @} */ + +/*! @name LPOSH - Lower Position Hold Register */ +/*! @{ */ + +#define EQDC_LPOSH_LPOSH_MASK (0xFFFFU) +#define EQDC_LPOSH_LPOSH_SHIFT (0U) +/*! LPOSH - POSH */ +#define EQDC_LPOSH_LPOSH(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LPOSH_LPOSH_SHIFT)) & EQDC_LPOSH_LPOSH_MASK) +/*! @} */ + +/*! @name LASTEDGEH - Last Edge Time Hold Register */ +/*! @{ */ + +#define EQDC_LASTEDGEH_LASTEDGEH_MASK (0xFFFFU) +#define EQDC_LASTEDGEH_LASTEDGEH_SHIFT (0U) +/*! LASTEDGEH - Last Edge Time Hold */ +#define EQDC_LASTEDGEH_LASTEDGEH(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LASTEDGEH_LASTEDGEH_SHIFT)) & EQDC_LASTEDGEH_LASTEDGEH_MASK) +/*! @} */ + +/*! @name POSDPERH - Position Difference Period Hold Register */ +/*! @{ */ + +#define EQDC_POSDPERH_POSDPERH_MASK (0xFFFFU) +#define EQDC_POSDPERH_POSDPERH_SHIFT (0U) +/*! POSDPERH - Position difference period hold */ +#define EQDC_POSDPERH_POSDPERH(x) (((uint16_t)(((uint16_t)(x)) << EQDC_POSDPERH_POSDPERH_SHIFT)) & EQDC_POSDPERH_POSDPERH_MASK) +/*! @} */ + +/*! @name REVH - Revolution Hold Register */ +/*! @{ */ + +#define EQDC_REVH_REVH_MASK (0xFFFFU) +#define EQDC_REVH_REVH_SHIFT (0U) +/*! REVH - REVH */ +#define EQDC_REVH_REVH(x) (((uint16_t)(((uint16_t)(x)) << EQDC_REVH_REVH_SHIFT)) & EQDC_REVH_REVH_MASK) +/*! @} */ + +/*! @name REV - Revolution Counter Register */ +/*! @{ */ + +#define EQDC_REV_REV_MASK (0xFFFFU) +#define EQDC_REV_REV_SHIFT (0U) +/*! REV - REV */ +#define EQDC_REV_REV(x) (((uint16_t)(((uint16_t)(x)) << EQDC_REV_REV_SHIFT)) & EQDC_REV_REV_MASK) +/*! @} */ + +/*! @name UINIT - Upper Initialization Register */ +/*! @{ */ + +#define EQDC_UINIT_INIT_MASK (0xFFFFU) +#define EQDC_UINIT_INIT_SHIFT (0U) +/*! INIT - INIT */ +#define EQDC_UINIT_INIT(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UINIT_INIT_SHIFT)) & EQDC_UINIT_INIT_MASK) +/*! @} */ + +/*! @name LINIT - Lower Initialization Register */ +/*! @{ */ + +#define EQDC_LINIT_INIT_MASK (0xFFFFU) +#define EQDC_LINIT_INIT_SHIFT (0U) +/*! INIT - INIT */ +#define EQDC_LINIT_INIT(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LINIT_INIT_SHIFT)) & EQDC_LINIT_INIT_MASK) +/*! @} */ + +/*! @name UMOD - Upper Modulus Register */ +/*! @{ */ + +#define EQDC_UMOD_MOD_MASK (0xFFFFU) +#define EQDC_UMOD_MOD_SHIFT (0U) +/*! MOD - MOD */ +#define EQDC_UMOD_MOD(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UMOD_MOD_SHIFT)) & EQDC_UMOD_MOD_MASK) +/*! @} */ + +/*! @name LMOD - Lower Modulus Register */ +/*! @{ */ + +#define EQDC_LMOD_MOD_MASK (0xFFFFU) +#define EQDC_LMOD_MOD_SHIFT (0U) +/*! MOD - MOD */ +#define EQDC_LMOD_MOD(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LMOD_MOD_SHIFT)) & EQDC_LMOD_MOD_MASK) +/*! @} */ + +/*! @name UCOMP0 - Upper Position Compare Register 0 */ +/*! @{ */ + +#define EQDC_UCOMP0_UCOMP0_MASK (0xFFFFU) +#define EQDC_UCOMP0_UCOMP0_SHIFT (0U) +/*! UCOMP0 - UCOMP0 */ +#define EQDC_UCOMP0_UCOMP0(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UCOMP0_UCOMP0_SHIFT)) & EQDC_UCOMP0_UCOMP0_MASK) +/*! @} */ + +/*! @name LCOMP0 - Lower Position Compare Register 0 */ +/*! @{ */ + +#define EQDC_LCOMP0_LCOMP0_MASK (0xFFFFU) +#define EQDC_LCOMP0_LCOMP0_SHIFT (0U) +/*! LCOMP0 - LCOMP0 */ +#define EQDC_LCOMP0_LCOMP0(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LCOMP0_LCOMP0_SHIFT)) & EQDC_LCOMP0_LCOMP0_MASK) +/*! @} */ + +/*! @name UCOMP1 - Upper Position Compare 1 */ +/*! @{ */ + +#define EQDC_UCOMP1_UCOMP1_MASK (0xFFFFU) +#define EQDC_UCOMP1_UCOMP1_SHIFT (0U) +/*! UCOMP1 - UCOMP1 */ +#define EQDC_UCOMP1_UCOMP1(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UCOMP1_UCOMP1_SHIFT)) & EQDC_UCOMP1_UCOMP1_MASK) +/*! @} */ + +/*! @name UPOSH1 - Upper Position Holder Register 1 */ +/*! @{ */ + +#define EQDC_UPOSH1_UPOSH1_MASK (0xFFFFU) +#define EQDC_UPOSH1_UPOSH1_SHIFT (0U) +/*! UPOSH1 - UPOSH1 */ +#define EQDC_UPOSH1_UPOSH1(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UPOSH1_UPOSH1_SHIFT)) & EQDC_UPOSH1_UPOSH1_MASK) +/*! @} */ + +/*! @name LCOMP1 - Lower Position Compare 1 */ +/*! @{ */ + +#define EQDC_LCOMP1_LCOMP1_MASK (0xFFFFU) +#define EQDC_LCOMP1_LCOMP1_SHIFT (0U) +/*! LCOMP1 - LCOMP1 */ +#define EQDC_LCOMP1_LCOMP1(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LCOMP1_LCOMP1_SHIFT)) & EQDC_LCOMP1_LCOMP1_MASK) +/*! @} */ + +/*! @name LPOSH1 - Lower Position Holder Register 1 */ +/*! @{ */ + +#define EQDC_LPOSH1_LPOSH1_MASK (0xFFFFU) +#define EQDC_LPOSH1_LPOSH1_SHIFT (0U) +/*! LPOSH1 - LPOSH1 */ +#define EQDC_LPOSH1_LPOSH1(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LPOSH1_LPOSH1_SHIFT)) & EQDC_LPOSH1_LPOSH1_MASK) +/*! @} */ + +/*! @name UCOMP2 - Upper Position Compare 2 */ +/*! @{ */ + +#define EQDC_UCOMP2_UCOMP2_MASK (0xFFFFU) +#define EQDC_UCOMP2_UCOMP2_SHIFT (0U) +/*! UCOMP2 - UCOMP2 */ +#define EQDC_UCOMP2_UCOMP2(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UCOMP2_UCOMP2_SHIFT)) & EQDC_UCOMP2_UCOMP2_MASK) +/*! @} */ + +/*! @name UPOSH2 - Upper Position Holder Register 3 */ +/*! @{ */ + +#define EQDC_UPOSH2_UPOSH2_MASK (0xFFFFU) +#define EQDC_UPOSH2_UPOSH2_SHIFT (0U) +/*! UPOSH2 - UPOSH2 */ +#define EQDC_UPOSH2_UPOSH2(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UPOSH2_UPOSH2_SHIFT)) & EQDC_UPOSH2_UPOSH2_MASK) +/*! @} */ + +/*! @name LCOMP2 - Lower Position Compare 2 */ +/*! @{ */ + +#define EQDC_LCOMP2_LCOMP2_MASK (0xFFFFU) +#define EQDC_LCOMP2_LCOMP2_SHIFT (0U) +/*! LCOMP2 - LCOMP2 */ +#define EQDC_LCOMP2_LCOMP2(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LCOMP2_LCOMP2_SHIFT)) & EQDC_LCOMP2_LCOMP2_MASK) +/*! @} */ + +/*! @name LPOSH2 - Lower Position Holder Register 2 */ +/*! @{ */ + +#define EQDC_LPOSH2_LPOSH2_MASK (0xFFFFU) +#define EQDC_LPOSH2_LPOSH2_SHIFT (0U) +/*! LPOSH2 - LPOSH2 */ +#define EQDC_LPOSH2_LPOSH2(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LPOSH2_LPOSH2_SHIFT)) & EQDC_LPOSH2_LPOSH2_MASK) +/*! @} */ + +/*! @name UCOMP3 - Upper Position Compare 3 */ +/*! @{ */ + +#define EQDC_UCOMP3_UCOMP3_MASK (0xFFFFU) +#define EQDC_UCOMP3_UCOMP3_SHIFT (0U) +/*! UCOMP3 - UCOMP3 */ +#define EQDC_UCOMP3_UCOMP3(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UCOMP3_UCOMP3_SHIFT)) & EQDC_UCOMP3_UCOMP3_MASK) +/*! @} */ + +/*! @name UPOSH3 - Upper Position Holder Register 3 */ +/*! @{ */ + +#define EQDC_UPOSH3_UPOSH3_MASK (0xFFFFU) +#define EQDC_UPOSH3_UPOSH3_SHIFT (0U) +/*! UPOSH3 - UPOSH3 */ +#define EQDC_UPOSH3_UPOSH3(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UPOSH3_UPOSH3_SHIFT)) & EQDC_UPOSH3_UPOSH3_MASK) +/*! @} */ + +/*! @name LCOMP3 - Lower Position Compare 3 */ +/*! @{ */ + +#define EQDC_LCOMP3_LCOMP3_MASK (0xFFFFU) +#define EQDC_LCOMP3_LCOMP3_SHIFT (0U) +/*! LCOMP3 - LCOMP3 */ +#define EQDC_LCOMP3_LCOMP3(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LCOMP3_LCOMP3_SHIFT)) & EQDC_LCOMP3_LCOMP3_MASK) +/*! @} */ + +/*! @name LPOSH3 - Lower Position Holder Register 3 */ +/*! @{ */ + +#define EQDC_LPOSH3_LPOSH3_MASK (0xFFFFU) +#define EQDC_LPOSH3_LPOSH3_SHIFT (0U) +/*! LPOSH3 - LPOSH3 */ +#define EQDC_LPOSH3_LPOSH3(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LPOSH3_LPOSH3_SHIFT)) & EQDC_LPOSH3_LPOSH3_MASK) +/*! @} */ + +/*! @name INTCTRL - Interrupt Control Register */ +/*! @{ */ + +#define EQDC_INTCTRL_SABIE_MASK (0x1U) +#define EQDC_INTCTRL_SABIE_SHIFT (0U) +/*! SABIE - Simultaneous PHASEA and PHASEB Change Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_INTCTRL_SABIE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_SABIE_SHIFT)) & EQDC_INTCTRL_SABIE_MASK) + +#define EQDC_INTCTRL_SABIRQ_MASK (0x2U) +#define EQDC_INTCTRL_SABIRQ_SHIFT (1U) +/*! SABIRQ - Simultaneous PHASEA and PHASEB Change Interrupt Request + * 0b0..No simultaneous change of PHASEA and PHASEB has occurred + * 0b1..A simultaneous change of PHASEA and PHASEB has occurred + */ +#define EQDC_INTCTRL_SABIRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_SABIRQ_SHIFT)) & EQDC_INTCTRL_SABIRQ_MASK) + +#define EQDC_INTCTRL_DIRIE_MASK (0x4U) +#define EQDC_INTCTRL_DIRIE_SHIFT (2U) +/*! DIRIE - Count direction change interrupt enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_INTCTRL_DIRIE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_DIRIE_SHIFT)) & EQDC_INTCTRL_DIRIE_MASK) + +#define EQDC_INTCTRL_DIRIRQ_MASK (0x8U) +#define EQDC_INTCTRL_DIRIRQ_SHIFT (3U) +/*! DIRIRQ - Count direction change interrupt + * 0b0..Count direction unchanged + * 0b1..Count direction changed + */ +#define EQDC_INTCTRL_DIRIRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_DIRIRQ_SHIFT)) & EQDC_INTCTRL_DIRIRQ_MASK) + +#define EQDC_INTCTRL_RUIE_MASK (0x10U) +#define EQDC_INTCTRL_RUIE_SHIFT (4U) +/*! RUIE - Roll-under Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_INTCTRL_RUIE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_RUIE_SHIFT)) & EQDC_INTCTRL_RUIE_MASK) + +#define EQDC_INTCTRL_RUIRQ_MASK (0x20U) +#define EQDC_INTCTRL_RUIRQ_SHIFT (5U) +/*! RUIRQ - Roll-under Interrupt Request + * 0b0..No roll-under has occurred + * 0b1..Roll-under has occurred + */ +#define EQDC_INTCTRL_RUIRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_RUIRQ_SHIFT)) & EQDC_INTCTRL_RUIRQ_MASK) + +#define EQDC_INTCTRL_ROIE_MASK (0x40U) +#define EQDC_INTCTRL_ROIE_SHIFT (6U) +/*! ROIE - Roll-over Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_INTCTRL_ROIE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_ROIE_SHIFT)) & EQDC_INTCTRL_ROIE_MASK) + +#define EQDC_INTCTRL_ROIRQ_MASK (0x80U) +#define EQDC_INTCTRL_ROIRQ_SHIFT (7U) +/*! ROIRQ - Roll-over Interrupt Request + * 0b0..No roll-over has occurred + * 0b1..Roll-over has occurred + */ +#define EQDC_INTCTRL_ROIRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_ROIRQ_SHIFT)) & EQDC_INTCTRL_ROIRQ_MASK) + +#define EQDC_INTCTRL_CMP0IE_MASK (0x100U) +#define EQDC_INTCTRL_CMP0IE_SHIFT (8U) +/*! CMP0IE - Compare 0 Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_INTCTRL_CMP0IE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_CMP0IE_SHIFT)) & EQDC_INTCTRL_CMP0IE_MASK) + +#define EQDC_INTCTRL_CMP0IRQ_MASK (0x200U) +#define EQDC_INTCTRL_CMP0IRQ_SHIFT (9U) +/*! CMP0IRQ - Compare 0 Interrupt Request + * 0b0..No match has occurred (the position counter does not match the COMP0 value) + * 0b1..COMP match has occurred (the position counter matches the COMP0 value) + */ +#define EQDC_INTCTRL_CMP0IRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_CMP0IRQ_SHIFT)) & EQDC_INTCTRL_CMP0IRQ_MASK) + +#define EQDC_INTCTRL_CMP1IE_MASK (0x400U) +#define EQDC_INTCTRL_CMP1IE_SHIFT (10U) +/*! CMP1IE - Compare1 Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_INTCTRL_CMP1IE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_CMP1IE_SHIFT)) & EQDC_INTCTRL_CMP1IE_MASK) + +#define EQDC_INTCTRL_CMP1IRQ_MASK (0x800U) +#define EQDC_INTCTRL_CMP1IRQ_SHIFT (11U) +/*! CMP1IRQ - Compare1 Interrupt Request + * 0b0..No match has occurred (the position counter does not match the COMP1 value) + * 0b1..COMP1 match has occurred (the position counter matches the COMP1 value) + */ +#define EQDC_INTCTRL_CMP1IRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_CMP1IRQ_SHIFT)) & EQDC_INTCTRL_CMP1IRQ_MASK) + +#define EQDC_INTCTRL_CMP2IE_MASK (0x1000U) +#define EQDC_INTCTRL_CMP2IE_SHIFT (12U) +/*! CMP2IE - Compare2 Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_INTCTRL_CMP2IE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_CMP2IE_SHIFT)) & EQDC_INTCTRL_CMP2IE_MASK) + +#define EQDC_INTCTRL_CMP2IRQ_MASK (0x2000U) +#define EQDC_INTCTRL_CMP2IRQ_SHIFT (13U) +/*! CMP2IRQ - Compare2 Interrupt Request + * 0b0..No match has occurred (the position counter does not match the COMP2 value) + * 0b1..COMP2 match has occurred (the position counter matches the COMP2 value) + */ +#define EQDC_INTCTRL_CMP2IRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_CMP2IRQ_SHIFT)) & EQDC_INTCTRL_CMP2IRQ_MASK) + +#define EQDC_INTCTRL_CMP3IE_MASK (0x4000U) +#define EQDC_INTCTRL_CMP3IE_SHIFT (14U) +/*! CMP3IE - Compare3 Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_INTCTRL_CMP3IE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_CMP3IE_SHIFT)) & EQDC_INTCTRL_CMP3IE_MASK) + +#define EQDC_INTCTRL_CMP3IRQ_MASK (0x8000U) +#define EQDC_INTCTRL_CMP3IRQ_SHIFT (15U) +/*! CMP3IRQ - Compare3 Interrupt Request + * 0b0..No match has occurred (the position counter does not match the COMP3 value) + * 0b1..COMP3 match has occurred (the position counter matches the COMP3 value) + */ +#define EQDC_INTCTRL_CMP3IRQ(x) (((uint16_t)(((uint16_t)(x)) << EQDC_INTCTRL_CMP3IRQ_SHIFT)) & EQDC_INTCTRL_CMP3IRQ_MASK) +/*! @} */ + +/*! @name WTR - Watchdog Timeout Register */ +/*! @{ */ + +#define EQDC_WTR_WDOG_MASK (0xFFFFU) +#define EQDC_WTR_WDOG_SHIFT (0U) +/*! WDOG - WDOG */ +#define EQDC_WTR_WDOG(x) (((uint16_t)(((uint16_t)(x)) << EQDC_WTR_WDOG_SHIFT)) & EQDC_WTR_WDOG_MASK) +/*! @} */ + +/*! @name IMR - Input Monitor Register */ +/*! @{ */ + +#define EQDC_IMR_HOME_ENABLE_MASK (0x1U) +#define EQDC_IMR_HOME_ENABLE_SHIFT (0U) +/*! HOME_ENABLE - HOME_ENABLE */ +#define EQDC_IMR_HOME_ENABLE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_HOME_ENABLE_SHIFT)) & EQDC_IMR_HOME_ENABLE_MASK) + +#define EQDC_IMR_INDEX_PRESET_MASK (0x2U) +#define EQDC_IMR_INDEX_PRESET_SHIFT (1U) +/*! INDEX_PRESET - INDEX_PRESET */ +#define EQDC_IMR_INDEX_PRESET(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_INDEX_PRESET_SHIFT)) & EQDC_IMR_INDEX_PRESET_MASK) + +#define EQDC_IMR_PHB_MASK (0x4U) +#define EQDC_IMR_PHB_SHIFT (2U) +/*! PHB - PHB */ +#define EQDC_IMR_PHB(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_PHB_SHIFT)) & EQDC_IMR_PHB_MASK) + +#define EQDC_IMR_PHA_MASK (0x8U) +#define EQDC_IMR_PHA_SHIFT (3U) +/*! PHA - PHA */ +#define EQDC_IMR_PHA(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_PHA_SHIFT)) & EQDC_IMR_PHA_MASK) + +#define EQDC_IMR_FHOM_ENA_MASK (0x10U) +#define EQDC_IMR_FHOM_ENA_SHIFT (4U) +/*! FHOM_ENA - filter operation on HOME/ENABLE input */ +#define EQDC_IMR_FHOM_ENA(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_FHOM_ENA_SHIFT)) & EQDC_IMR_FHOM_ENA_MASK) + +#define EQDC_IMR_FIND_PRE_MASK (0x20U) +#define EQDC_IMR_FIND_PRE_SHIFT (5U) +/*! FIND_PRE - filter operation on INDEX/PRESET input */ +#define EQDC_IMR_FIND_PRE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_FIND_PRE_SHIFT)) & EQDC_IMR_FIND_PRE_MASK) + +#define EQDC_IMR_FPHB_MASK (0x40U) +#define EQDC_IMR_FPHB_SHIFT (6U) +/*! FPHB - filter operation on PHASEB input */ +#define EQDC_IMR_FPHB(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_FPHB_SHIFT)) & EQDC_IMR_FPHB_MASK) + +#define EQDC_IMR_FPHA_MASK (0x80U) +#define EQDC_IMR_FPHA_SHIFT (7U) +/*! FPHA - filter operation on PHASEA input */ +#define EQDC_IMR_FPHA(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_FPHA_SHIFT)) & EQDC_IMR_FPHA_MASK) + +#define EQDC_IMR_CMPF0_MASK (0x100U) +#define EQDC_IMR_CMPF0_SHIFT (8U) +/*! CMPF0 - Position Compare 0 Flag Output + * 0b0..When the position counter is less than value of COMP0 register + * 0b1..When the position counter is greater or equal than value of COMP0 register + */ +#define EQDC_IMR_CMPF0(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_CMPF0_SHIFT)) & EQDC_IMR_CMPF0_MASK) + +#define EQDC_IMR_CMP1F_MASK (0x200U) +#define EQDC_IMR_CMP1F_SHIFT (9U) +/*! CMP1F - Position Compare1 Flag Output + * 0b0..When the position counter is less than value of COMP1 register + * 0b1..When the position counter is greater or equal than value of COMP1 register + */ +#define EQDC_IMR_CMP1F(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_CMP1F_SHIFT)) & EQDC_IMR_CMP1F_MASK) + +#define EQDC_IMR_CMP2F_MASK (0x400U) +#define EQDC_IMR_CMP2F_SHIFT (10U) +/*! CMP2F - Position Compare2 Flag Output + * 0b0..When the position counter is less than value of COMP2 register + * 0b1..When the position counter is greater or equal than value of COMP2 register + */ +#define EQDC_IMR_CMP2F(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_CMP2F_SHIFT)) & EQDC_IMR_CMP2F_MASK) + +#define EQDC_IMR_CMP3F_MASK (0x800U) +#define EQDC_IMR_CMP3F_SHIFT (11U) +/*! CMP3F - Position Compare3 Flag Output + * 0b0..When the position counter value is less than value of COMP3 register + * 0b1..When the position counter is greater or equal than value of COMP3 register + */ +#define EQDC_IMR_CMP3F(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_CMP3F_SHIFT)) & EQDC_IMR_CMP3F_MASK) + +#define EQDC_IMR_DIRH_MASK (0x4000U) +#define EQDC_IMR_DIRH_SHIFT (14U) +/*! DIRH - Count Direction Flag Hold */ +#define EQDC_IMR_DIRH(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_DIRH_SHIFT)) & EQDC_IMR_DIRH_MASK) + +#define EQDC_IMR_DIR_MASK (0x8000U) +#define EQDC_IMR_DIR_SHIFT (15U) +/*! DIR - Count Direction Flag Output + * 0b0..Current count was in the down direction + * 0b1..Current count was in the up direction + */ +#define EQDC_IMR_DIR(x) (((uint16_t)(((uint16_t)(x)) << EQDC_IMR_DIR_SHIFT)) & EQDC_IMR_DIR_MASK) +/*! @} */ + +/*! @name TST - Test Register */ +/*! @{ */ + +#define EQDC_TST_TEST_COUNT_MASK (0xFFU) +#define EQDC_TST_TEST_COUNT_SHIFT (0U) +/*! TEST_COUNT - TEST_COUNT */ +#define EQDC_TST_TEST_COUNT(x) (((uint16_t)(((uint16_t)(x)) << EQDC_TST_TEST_COUNT_SHIFT)) & EQDC_TST_TEST_COUNT_MASK) + +#define EQDC_TST_TEST_PERIOD_MASK (0x1F00U) +#define EQDC_TST_TEST_PERIOD_SHIFT (8U) +/*! TEST_PERIOD - TEST_PERIOD */ +#define EQDC_TST_TEST_PERIOD(x) (((uint16_t)(((uint16_t)(x)) << EQDC_TST_TEST_PERIOD_SHIFT)) & EQDC_TST_TEST_PERIOD_MASK) + +#define EQDC_TST_QDN_MASK (0x2000U) +#define EQDC_TST_QDN_SHIFT (13U) +/*! QDN - Quadrature Decoder Negative Signal + * 0b0..Generates a positive quadrature decoder signal + * 0b1..Generates a negative quadrature decoder signal + */ +#define EQDC_TST_QDN(x) (((uint16_t)(((uint16_t)(x)) << EQDC_TST_QDN_SHIFT)) & EQDC_TST_QDN_MASK) + +#define EQDC_TST_TCE_MASK (0x4000U) +#define EQDC_TST_TCE_SHIFT (14U) +/*! TCE - Test Counter Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_TST_TCE(x) (((uint16_t)(((uint16_t)(x)) << EQDC_TST_TCE_SHIFT)) & EQDC_TST_TCE_MASK) + +#define EQDC_TST_TEN_MASK (0x8000U) +#define EQDC_TST_TEN_SHIFT (15U) +/*! TEN - Test Mode Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define EQDC_TST_TEN(x) (((uint16_t)(((uint16_t)(x)) << EQDC_TST_TEN_SHIFT)) & EQDC_TST_TEN_MASK) +/*! @} */ + +/*! @name UVERID - Upper VERID */ +/*! @{ */ + +#define EQDC_UVERID_UVERID_MASK (0xFFFFU) +#define EQDC_UVERID_UVERID_SHIFT (0U) +/*! UVERID - UVERID */ +#define EQDC_UVERID_UVERID(x) (((uint16_t)(((uint16_t)(x)) << EQDC_UVERID_UVERID_SHIFT)) & EQDC_UVERID_UVERID_MASK) +/*! @} */ + +/*! @name LVERID - Lower VERID */ +/*! @{ */ + +#define EQDC_LVERID_LVERID_MASK (0xFFFFU) +#define EQDC_LVERID_LVERID_SHIFT (0U) +/*! LVERID - LVERID */ +#define EQDC_LVERID_LVERID(x) (((uint16_t)(((uint16_t)(x)) << EQDC_LVERID_LVERID_SHIFT)) & EQDC_LVERID_LVERID_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group EQDC_Register_Masks */ + + +/* EQDC - Peripheral instance base addresses */ +/** Peripheral QDC0 base address */ +#define QDC0_BASE (0x400A7000u) +/** Peripheral QDC0 base pointer */ +#define QDC0 ((EQDC_Type *)QDC0_BASE) +/** Peripheral QDC1 base address */ +#define QDC1_BASE (0x400A8000u) +/** Peripheral QDC1 base pointer */ +#define QDC1 ((EQDC_Type *)QDC1_BASE) +/** Array initializer of EQDC peripheral base addresses */ +#define EQDC_BASE_ADDRS { QDC0_BASE, QDC1_BASE } +/** Array initializer of EQDC peripheral base pointers */ +#define EQDC_BASE_PTRS { QDC0, QDC1 } +/** Interrupt vectors for the EQDC peripheral type */ +#define EQDC_COMPARE_IRQS { QDC0_COMPARE_IRQn, QDC1_COMPARE_IRQn } +#define EQDC_HOME_IRQS { QDC0_HOME_IRQn, QDC1_HOME_IRQn } +#define EQDC_WDOG_IRQS { QDC0_WATCHDOG_IRQn, QDC1_WATCHDOG_IRQn } +#define EQDC_INDEX_IRQS { QDC0_INDEX_IRQn, QDC1_INDEX_IRQn } +#define EQDC_INPUT_SWITCH_IRQS { QDC0_WATCHDOG_IRQn, QDC1_WATCHDOG_IRQn } + +/*! + * @} + */ /* end of group EQDC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- ERM Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ERM_Peripheral_Access_Layer ERM Peripheral Access Layer + * @{ + */ + +/** ERM - Register Layout Typedef */ +typedef struct { + __IO uint32_t CR0; /**< ERM Configuration Register 0, offset: 0x0 */ + uint8_t RESERVED_0[12]; + __IO uint32_t SR0; /**< ERM Status Register 0, offset: 0x10 */ + uint8_t RESERVED_1[236]; + __I uint32_t EAR0; /**< ERM Memory 0 Error Address Register, offset: 0x100 */ + __I uint32_t SYN0; /**< ERM Memory 0 Syndrome Register, offset: 0x104 */ + __IO uint32_t CORR_ERR_CNT0; /**< ERM Memory 0 Correctable Error Count Register, offset: 0x108 */ + uint8_t RESERVED_2[12]; + __IO uint32_t CORR_ERR_CNT1; /**< ERM Memory 1 Correctable Error Count Register, offset: 0x118 */ +} ERM_Type; + +/* ---------------------------------------------------------------------------- + -- ERM Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ERM_Register_Masks ERM Register Masks + * @{ + */ + +/*! @name CR0 - ERM Configuration Register 0 */ +/*! @{ */ + +#define ERM_CR0_ENCIE1_MASK (0x4000000U) +#define ERM_CR0_ENCIE1_SHIFT (26U) +/*! ENCIE1 - ENCIE1 + * 0b0..Interrupt notification of Memory 1 non-correctable error events is disabled. + * 0b1..Interrupt notification of Memory 1 non-correctable error events is enabled. + */ +#define ERM_CR0_ENCIE1(x) (((uint32_t)(((uint32_t)(x)) << ERM_CR0_ENCIE1_SHIFT)) & ERM_CR0_ENCIE1_MASK) + +#define ERM_CR0_ESCIE1_MASK (0x8000000U) +#define ERM_CR0_ESCIE1_SHIFT (27U) +/*! ESCIE1 - ESCIE1 + * 0b0..Interrupt notification of Memory 1 single-bit correction events is disabled. + * 0b1..Interrupt notification of Memory 1 single-bit correction events is enabled. + */ +#define ERM_CR0_ESCIE1(x) (((uint32_t)(((uint32_t)(x)) << ERM_CR0_ESCIE1_SHIFT)) & ERM_CR0_ESCIE1_MASK) + +#define ERM_CR0_ENCIE0_MASK (0x40000000U) +#define ERM_CR0_ENCIE0_SHIFT (30U) +/*! ENCIE0 - ENCIE0 + * 0b0..Interrupt notification of Memory 0 non-correctable error events is disabled. + * 0b1..Interrupt notification of Memory 0 non-correctable error events is enabled. + */ +#define ERM_CR0_ENCIE0(x) (((uint32_t)(((uint32_t)(x)) << ERM_CR0_ENCIE0_SHIFT)) & ERM_CR0_ENCIE0_MASK) + +#define ERM_CR0_ESCIE0_MASK (0x80000000U) +#define ERM_CR0_ESCIE0_SHIFT (31U) +/*! ESCIE0 - ESCIE0 + * 0b0..Interrupt notification of Memory 0 single-bit correction events is disabled. + * 0b1..Interrupt notification of Memory 0 single-bit correction events is enabled. + */ +#define ERM_CR0_ESCIE0(x) (((uint32_t)(((uint32_t)(x)) << ERM_CR0_ESCIE0_SHIFT)) & ERM_CR0_ESCIE0_MASK) +/*! @} */ + +/*! @name SR0 - ERM Status Register 0 */ +/*! @{ */ + +#define ERM_SR0_NCE1_MASK (0x4000000U) +#define ERM_SR0_NCE1_SHIFT (26U) +/*! NCE1 - NCE1 + * 0b0..No non-correctable error event on Memory 1 detected. + * 0b1..Non-correctable error event on Memory 1 detected. + */ +#define ERM_SR0_NCE1(x) (((uint32_t)(((uint32_t)(x)) << ERM_SR0_NCE1_SHIFT)) & ERM_SR0_NCE1_MASK) + +#define ERM_SR0_SBC1_MASK (0x8000000U) +#define ERM_SR0_SBC1_SHIFT (27U) +/*! SBC1 - SBC1 + * 0b0..No single-bit correction event on Memory 1 detected. + * 0b1..Single-bit correction event on Memory 1 detected. + */ +#define ERM_SR0_SBC1(x) (((uint32_t)(((uint32_t)(x)) << ERM_SR0_SBC1_SHIFT)) & ERM_SR0_SBC1_MASK) + +#define ERM_SR0_NCE0_MASK (0x40000000U) +#define ERM_SR0_NCE0_SHIFT (30U) +/*! NCE0 - NCE0 + * 0b0..No non-correctable error event on Memory 0 detected. + * 0b1..Non-correctable error event on Memory 0 detected. + */ +#define ERM_SR0_NCE0(x) (((uint32_t)(((uint32_t)(x)) << ERM_SR0_NCE0_SHIFT)) & ERM_SR0_NCE0_MASK) + +#define ERM_SR0_SBC0_MASK (0x80000000U) +#define ERM_SR0_SBC0_SHIFT (31U) +/*! SBC0 - SBC0 + * 0b0..No single-bit correction event on Memory 0 detected. + * 0b1..Single-bit correction event on Memory 0 detected. + */ +#define ERM_SR0_SBC0(x) (((uint32_t)(((uint32_t)(x)) << ERM_SR0_SBC0_SHIFT)) & ERM_SR0_SBC0_MASK) +/*! @} */ + +/*! @name EAR0 - ERM Memory 0 Error Address Register */ +/*! @{ */ + +#define ERM_EAR0_EAR_MASK (0xFFFFFFFFU) +#define ERM_EAR0_EAR_SHIFT (0U) +/*! EAR - EAR */ +#define ERM_EAR0_EAR(x) (((uint32_t)(((uint32_t)(x)) << ERM_EAR0_EAR_SHIFT)) & ERM_EAR0_EAR_MASK) +/*! @} */ + +/*! @name SYN0 - ERM Memory 0 Syndrome Register */ +/*! @{ */ + +#define ERM_SYN0_SYNDROME_MASK (0xFF000000U) +#define ERM_SYN0_SYNDROME_SHIFT (24U) +/*! SYNDROME - SYNDROME */ +#define ERM_SYN0_SYNDROME(x) (((uint32_t)(((uint32_t)(x)) << ERM_SYN0_SYNDROME_SHIFT)) & ERM_SYN0_SYNDROME_MASK) +/*! @} */ + +/*! @name CORR_ERR_CNT0 - ERM Memory 0 Correctable Error Count Register */ +/*! @{ */ + +#define ERM_CORR_ERR_CNT0_COUNT_MASK (0xFFU) +#define ERM_CORR_ERR_CNT0_COUNT_SHIFT (0U) +/*! COUNT - Memory n Correctable Error Count */ +#define ERM_CORR_ERR_CNT0_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ERM_CORR_ERR_CNT0_COUNT_SHIFT)) & ERM_CORR_ERR_CNT0_COUNT_MASK) +/*! @} */ + +/*! @name CORR_ERR_CNT1 - ERM Memory 1 Correctable Error Count Register */ +/*! @{ */ + +#define ERM_CORR_ERR_CNT1_COUNT_MASK (0xFFU) +#define ERM_CORR_ERR_CNT1_COUNT_SHIFT (0U) +/*! COUNT - Memory n Correctable Error Count */ +#define ERM_CORR_ERR_CNT1_COUNT(x) (((uint32_t)(((uint32_t)(x)) << ERM_CORR_ERR_CNT1_COUNT_SHIFT)) & ERM_CORR_ERR_CNT1_COUNT_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group ERM_Register_Masks */ + + +/* ERM - Peripheral instance base addresses */ +/** Peripheral ERM0 base address */ +#define ERM0_BASE (0x4008D000u) +/** Peripheral ERM0 base pointer */ +#define ERM0 ((ERM_Type *)ERM0_BASE) +/** Array initializer of ERM peripheral base addresses */ +#define ERM_BASE_ADDRS { ERM0_BASE } +/** Array initializer of ERM peripheral base pointers */ +#define ERM_BASE_PTRS { ERM0 } + +/*! + * @} + */ /* end of group ERM_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- FLEXIO Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FLEXIO_Peripheral_Access_Layer FLEXIO Peripheral Access Layer + * @{ + */ + +/** FLEXIO - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + __IO uint32_t CTRL; /**< FLEXIO Control, offset: 0x8 */ + __I uint32_t PIN; /**< Pin State, offset: 0xC */ + __IO uint32_t SHIFTSTAT; /**< Shifter Status, offset: 0x10 */ + __IO uint32_t SHIFTERR; /**< Shifter Error, offset: 0x14 */ + __IO uint32_t TIMSTAT; /**< Timer Status Flag, offset: 0x18 */ + uint8_t RESERVED_0[4]; + __IO uint32_t SHIFTSIEN; /**< Shifter Status Interrupt Enable, offset: 0x20 */ + __IO uint32_t SHIFTEIEN; /**< Shifter Error Interrupt Enable, offset: 0x24 */ + __IO uint32_t TIMIEN; /**< Timer Interrupt Enable, offset: 0x28 */ + uint8_t RESERVED_1[4]; + __IO uint32_t SHIFTSDEN; /**< Shifter Status DMA Enable, offset: 0x30 */ + uint8_t RESERVED_2[4]; + __IO uint32_t TIMERSDEN; /**< Timer Status DMA Enable, offset: 0x38 */ + uint8_t RESERVED_3[4]; + __IO uint32_t SHIFTSTATE; /**< Shifter State, offset: 0x40 */ + uint8_t RESERVED_4[4]; + __IO uint32_t TRGSTAT; /**< Trigger Status, offset: 0x48 */ + __IO uint32_t TRIGIEN; /**< External Trigger Interrupt Enable, offset: 0x4C */ + __IO uint32_t PINSTAT; /**< Pin Status, offset: 0x50 */ + __IO uint32_t PINIEN; /**< Pin Interrupt Enable, offset: 0x54 */ + __IO uint32_t PINREN; /**< Pin Rising Edge Enable, offset: 0x58 */ + __IO uint32_t PINFEN; /**< Pin Falling Edge Enable, offset: 0x5C */ + __IO uint32_t PINOUTD; /**< Pin Output Data, offset: 0x60 */ + __IO uint32_t PINOUTE; /**< Pin Output Enable, offset: 0x64 */ + __O uint32_t PINOUTDIS; /**< Pin Output Disable, offset: 0x68 */ + __O uint32_t PINOUTCLR; /**< Pin Output Clear, offset: 0x6C */ + __O uint32_t PINOUTSET; /**< Pin Output Set, offset: 0x70 */ + __O uint32_t PINOUTTOG; /**< Pin Output Toggle, offset: 0x74 */ + uint8_t RESERVED_5[8]; + __IO uint32_t SHIFTCTL[4]; /**< Shifter Control, array offset: 0x80, array step: 0x4 */ + uint8_t RESERVED_6[112]; + __IO uint32_t SHIFTCFG[4]; /**< Shifter Configuration, array offset: 0x100, array step: 0x4 */ + uint8_t RESERVED_7[240]; + __IO uint32_t SHIFTBUF[4]; /**< Shifter Buffer, array offset: 0x200, array step: 0x4 */ + uint8_t RESERVED_8[112]; + __IO uint32_t SHIFTBUFBIS[4]; /**< Shifter Buffer Bit Swapped, array offset: 0x280, array step: 0x4 */ + uint8_t RESERVED_9[112]; + __IO uint32_t SHIFTBUFBYS[4]; /**< Shifter Buffer Byte Swapped, array offset: 0x300, array step: 0x4 */ + uint8_t RESERVED_10[112]; + __IO uint32_t SHIFTBUFBBS[4]; /**< Shifter Buffer Bit Byte Swapped, array offset: 0x380, array step: 0x4 */ + uint8_t RESERVED_11[112]; + __IO uint32_t TIMCTL[4]; /**< Timer Control, array offset: 0x400, array step: 0x4 */ + uint8_t RESERVED_12[112]; + __IO uint32_t TIMCFG[4]; /**< Timer Configuration, array offset: 0x480, array step: 0x4 */ + uint8_t RESERVED_13[112]; + __IO uint32_t TIMCMP[4]; /**< Timer Compare, array offset: 0x500, array step: 0x4 */ + uint8_t RESERVED_14[368]; + __IO uint32_t SHIFTBUFNBS[4]; /**< Shifter Buffer Nibble Byte Swapped, array offset: 0x680, array step: 0x4 */ + uint8_t RESERVED_15[112]; + __IO uint32_t SHIFTBUFHWS[4]; /**< Shifter Buffer Halfword Swapped, array offset: 0x700, array step: 0x4 */ + uint8_t RESERVED_16[112]; + __IO uint32_t SHIFTBUFNIS[4]; /**< Shifter Buffer Nibble Swapped, array offset: 0x780, array step: 0x4 */ + uint8_t RESERVED_17[112]; + __IO uint32_t SHIFTBUFOES[4]; /**< Shifter Buffer Odd Even Swapped, array offset: 0x800, array step: 0x4 */ + uint8_t RESERVED_18[112]; + __IO uint32_t SHIFTBUFEOS[4]; /**< Shifter Buffer Even Odd Swapped, array offset: 0x880, array step: 0x4 */ + uint8_t RESERVED_19[112]; + __IO uint32_t SHIFTBUFHBS[4]; /**< Shifter Buffer Halfword Byte Swapped, array offset: 0x900, array step: 0x4 */ +} FLEXIO_Type; + +/* ---------------------------------------------------------------------------- + -- FLEXIO Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FLEXIO_Register_Masks FLEXIO Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define FLEXIO_VERID_FEATURE_MASK (0xFFFFU) +#define FLEXIO_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number + * 0b0000000000000000..Standard features implemented + * 0b0000000000000001..State, logic, and parallel modes supported + * 0b0000000000000010..Pin control registers supported + * 0b0000000000000011..State, logic, and parallel modes, plus pin control registers supported + */ +#define FLEXIO_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_VERID_FEATURE_SHIFT)) & FLEXIO_VERID_FEATURE_MASK) + +#define FLEXIO_VERID_MINOR_MASK (0xFF0000U) +#define FLEXIO_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define FLEXIO_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_VERID_MINOR_SHIFT)) & FLEXIO_VERID_MINOR_MASK) + +#define FLEXIO_VERID_MAJOR_MASK (0xFF000000U) +#define FLEXIO_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define FLEXIO_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_VERID_MAJOR_SHIFT)) & FLEXIO_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define FLEXIO_PARAM_SHIFTER_MASK (0xFFU) +#define FLEXIO_PARAM_SHIFTER_SHIFT (0U) +/*! SHIFTER - Shifter Number */ +#define FLEXIO_PARAM_SHIFTER(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PARAM_SHIFTER_SHIFT)) & FLEXIO_PARAM_SHIFTER_MASK) + +#define FLEXIO_PARAM_TIMER_MASK (0xFF00U) +#define FLEXIO_PARAM_TIMER_SHIFT (8U) +/*! TIMER - Timer Number */ +#define FLEXIO_PARAM_TIMER(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PARAM_TIMER_SHIFT)) & FLEXIO_PARAM_TIMER_MASK) + +#define FLEXIO_PARAM_PIN_MASK (0xFF0000U) +#define FLEXIO_PARAM_PIN_SHIFT (16U) +/*! PIN - Pin Number */ +#define FLEXIO_PARAM_PIN(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PARAM_PIN_SHIFT)) & FLEXIO_PARAM_PIN_MASK) + +#define FLEXIO_PARAM_TRIGGER_MASK (0xFF000000U) +#define FLEXIO_PARAM_TRIGGER_SHIFT (24U) +/*! TRIGGER - Trigger Number */ +#define FLEXIO_PARAM_TRIGGER(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PARAM_TRIGGER_SHIFT)) & FLEXIO_PARAM_TRIGGER_MASK) +/*! @} */ + +/*! @name CTRL - FLEXIO Control */ +/*! @{ */ + +#define FLEXIO_CTRL_FLEXEN_MASK (0x1U) +#define FLEXIO_CTRL_FLEXEN_SHIFT (0U) +/*! FLEXEN - FLEXIO Enable + * 0b0..Disable + * 0b1..Enable + */ +#define FLEXIO_CTRL_FLEXEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_FLEXEN_SHIFT)) & FLEXIO_CTRL_FLEXEN_MASK) + +#define FLEXIO_CTRL_SWRST_MASK (0x2U) +#define FLEXIO_CTRL_SWRST_SHIFT (1U) +/*! SWRST - Software Reset + * 0b0..Disabled + * 0b1..Enabled + */ +#define FLEXIO_CTRL_SWRST(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_SWRST_SHIFT)) & FLEXIO_CTRL_SWRST_MASK) + +#define FLEXIO_CTRL_FASTACC_MASK (0x4U) +#define FLEXIO_CTRL_FASTACC_SHIFT (2U) +/*! FASTACC - Fast Access + * 0b0..Normal + * 0b1..Fast + */ +#define FLEXIO_CTRL_FASTACC(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_FASTACC_SHIFT)) & FLEXIO_CTRL_FASTACC_MASK) + +#define FLEXIO_CTRL_DBGE_MASK (0x40000000U) +#define FLEXIO_CTRL_DBGE_SHIFT (30U) +/*! DBGE - Debug Enable + * 0b0..Disable + * 0b1..Enable + */ +#define FLEXIO_CTRL_DBGE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_DBGE_SHIFT)) & FLEXIO_CTRL_DBGE_MASK) + +#define FLEXIO_CTRL_DOZEN_MASK (0x80000000U) +#define FLEXIO_CTRL_DOZEN_SHIFT (31U) +/*! DOZEN - Doze Enable + * 0b0..Enable + * 0b1..Disable + */ +#define FLEXIO_CTRL_DOZEN(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_CTRL_DOZEN_SHIFT)) & FLEXIO_CTRL_DOZEN_MASK) +/*! @} */ + +/*! @name PIN - Pin State */ +/*! @{ */ + +#define FLEXIO_PIN_PDI_MASK (0xFFFFFFFFU) +#define FLEXIO_PIN_PDI_SHIFT (0U) +/*! PDI - Pin Data Input */ +#define FLEXIO_PIN_PDI(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PIN_PDI_SHIFT)) & FLEXIO_PIN_PDI_MASK) +/*! @} */ + +/*! @name SHIFTSTAT - Shifter Status */ +/*! @{ */ + +#define FLEXIO_SHIFTSTAT_SSF_MASK (0xFU) +#define FLEXIO_SHIFTSTAT_SSF_SHIFT (0U) +/*! SSF - Shifter Status Flag + * 0b0000..Clear + * 0b0001..Set + * 0b0000..No effect + * 0b0001..Clear the flag + */ +#define FLEXIO_SHIFTSTAT_SSF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTSTAT_SSF_SHIFT)) & FLEXIO_SHIFTSTAT_SSF_MASK) +/*! @} */ + +/*! @name SHIFTERR - Shifter Error */ +/*! @{ */ + +#define FLEXIO_SHIFTERR_SEF_MASK (0xFU) +#define FLEXIO_SHIFTERR_SEF_SHIFT (0U) +/*! SEF - Shifter Error Flag + * 0b0000..Clear + * 0b0001..Set + * 0b0000..No effect + * 0b0001..Clear the flag + */ +#define FLEXIO_SHIFTERR_SEF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTERR_SEF_SHIFT)) & FLEXIO_SHIFTERR_SEF_MASK) +/*! @} */ + +/*! @name TIMSTAT - Timer Status Flag */ +/*! @{ */ + +#define FLEXIO_TIMSTAT_TSF_MASK (0xFU) +#define FLEXIO_TIMSTAT_TSF_SHIFT (0U) +/*! TSF - Timer Status Flag + * 0b0000..Clear + * 0b0001..Set + * 0b0000..No effect + * 0b0001..Clear the flag + */ +#define FLEXIO_TIMSTAT_TSF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMSTAT_TSF_SHIFT)) & FLEXIO_TIMSTAT_TSF_MASK) +/*! @} */ + +/*! @name SHIFTSIEN - Shifter Status Interrupt Enable */ +/*! @{ */ + +#define FLEXIO_SHIFTSIEN_SSIE_MASK (0xFU) +#define FLEXIO_SHIFTSIEN_SSIE_SHIFT (0U) +/*! SSIE - Shifter Status Interrupt Enable */ +#define FLEXIO_SHIFTSIEN_SSIE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTSIEN_SSIE_SHIFT)) & FLEXIO_SHIFTSIEN_SSIE_MASK) +/*! @} */ + +/*! @name SHIFTEIEN - Shifter Error Interrupt Enable */ +/*! @{ */ + +#define FLEXIO_SHIFTEIEN_SEIE_MASK (0xFU) +#define FLEXIO_SHIFTEIEN_SEIE_SHIFT (0U) +/*! SEIE - Shifter Error Interrupt Enable */ +#define FLEXIO_SHIFTEIEN_SEIE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTEIEN_SEIE_SHIFT)) & FLEXIO_SHIFTEIEN_SEIE_MASK) +/*! @} */ + +/*! @name TIMIEN - Timer Interrupt Enable */ +/*! @{ */ + +#define FLEXIO_TIMIEN_TEIE_MASK (0xFU) +#define FLEXIO_TIMIEN_TEIE_SHIFT (0U) +/*! TEIE - Timer Status Interrupt Enable */ +#define FLEXIO_TIMIEN_TEIE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMIEN_TEIE_SHIFT)) & FLEXIO_TIMIEN_TEIE_MASK) +/*! @} */ + +/*! @name SHIFTSDEN - Shifter Status DMA Enable */ +/*! @{ */ + +#define FLEXIO_SHIFTSDEN_SSDE_MASK (0xFU) +#define FLEXIO_SHIFTSDEN_SSDE_SHIFT (0U) +/*! SSDE - Shifter Status DMA Enable */ +#define FLEXIO_SHIFTSDEN_SSDE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTSDEN_SSDE_SHIFT)) & FLEXIO_SHIFTSDEN_SSDE_MASK) +/*! @} */ + +/*! @name TIMERSDEN - Timer Status DMA Enable */ +/*! @{ */ + +#define FLEXIO_TIMERSDEN_TSDE_MASK (0xFU) +#define FLEXIO_TIMERSDEN_TSDE_SHIFT (0U) +/*! TSDE - Timer Status DMA Enable */ +#define FLEXIO_TIMERSDEN_TSDE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMERSDEN_TSDE_SHIFT)) & FLEXIO_TIMERSDEN_TSDE_MASK) +/*! @} */ + +/*! @name SHIFTSTATE - Shifter State */ +/*! @{ */ + +#define FLEXIO_SHIFTSTATE_STATE_MASK (0x7U) +#define FLEXIO_SHIFTSTATE_STATE_SHIFT (0U) +/*! STATE - Current State Pointer */ +#define FLEXIO_SHIFTSTATE_STATE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTSTATE_STATE_SHIFT)) & FLEXIO_SHIFTSTATE_STATE_MASK) +/*! @} */ + +/*! @name TRGSTAT - Trigger Status */ +/*! @{ */ + +#define FLEXIO_TRGSTAT_ETSF_MASK (0xFU) +#define FLEXIO_TRGSTAT_ETSF_SHIFT (0U) +/*! ETSF - External Trigger Status Flag + * 0b0000..Clear + * 0b0001..Set + * 0b0000..No effect + * 0b0001..Clear the flag + */ +#define FLEXIO_TRGSTAT_ETSF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TRGSTAT_ETSF_SHIFT)) & FLEXIO_TRGSTAT_ETSF_MASK) +/*! @} */ + +/*! @name TRIGIEN - External Trigger Interrupt Enable */ +/*! @{ */ + +#define FLEXIO_TRIGIEN_TRIE_MASK (0xFU) +#define FLEXIO_TRIGIEN_TRIE_SHIFT (0U) +/*! TRIE - External Trigger Interrupt Enable */ +#define FLEXIO_TRIGIEN_TRIE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TRIGIEN_TRIE_SHIFT)) & FLEXIO_TRIGIEN_TRIE_MASK) +/*! @} */ + +/*! @name PINSTAT - Pin Status */ +/*! @{ */ + +#define FLEXIO_PINSTAT_PSF_MASK (0xFFFFFFFFU) +#define FLEXIO_PINSTAT_PSF_SHIFT (0U) +/*! PSF - Pin Status Flag + * 0b00000000000000000000000000000000..Clear + * 0b00000000000000000000000000000001..Set + * 0b00000000000000000000000000000000..No effect + * 0b00000000000000000000000000000001..Clear the flag + */ +#define FLEXIO_PINSTAT_PSF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINSTAT_PSF_SHIFT)) & FLEXIO_PINSTAT_PSF_MASK) +/*! @} */ + +/*! @name PINIEN - Pin Interrupt Enable */ +/*! @{ */ + +#define FLEXIO_PINIEN_PSIE_MASK (0xFFFFFFFFU) +#define FLEXIO_PINIEN_PSIE_SHIFT (0U) +/*! PSIE - Pin Status Interrupt Enable */ +#define FLEXIO_PINIEN_PSIE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINIEN_PSIE_SHIFT)) & FLEXIO_PINIEN_PSIE_MASK) +/*! @} */ + +/*! @name PINREN - Pin Rising Edge Enable */ +/*! @{ */ + +#define FLEXIO_PINREN_PRE_MASK (0xFFFFFFFFU) +#define FLEXIO_PINREN_PRE_SHIFT (0U) +/*! PRE - Pin Rising Edge */ +#define FLEXIO_PINREN_PRE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINREN_PRE_SHIFT)) & FLEXIO_PINREN_PRE_MASK) +/*! @} */ + +/*! @name PINFEN - Pin Falling Edge Enable */ +/*! @{ */ + +#define FLEXIO_PINFEN_PFE_MASK (0xFFFFFFFFU) +#define FLEXIO_PINFEN_PFE_SHIFT (0U) +/*! PFE - Pin Falling Edge */ +#define FLEXIO_PINFEN_PFE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINFEN_PFE_SHIFT)) & FLEXIO_PINFEN_PFE_MASK) +/*! @} */ + +/*! @name PINOUTD - Pin Output Data */ +/*! @{ */ + +#define FLEXIO_PINOUTD_OUTD_MASK (0xFFFFFFFFU) +#define FLEXIO_PINOUTD_OUTD_SHIFT (0U) +/*! OUTD - Output Data */ +#define FLEXIO_PINOUTD_OUTD(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINOUTD_OUTD_SHIFT)) & FLEXIO_PINOUTD_OUTD_MASK) +/*! @} */ + +/*! @name PINOUTE - Pin Output Enable */ +/*! @{ */ + +#define FLEXIO_PINOUTE_OUTE_MASK (0xFFFFFFFFU) +#define FLEXIO_PINOUTE_OUTE_SHIFT (0U) +/*! OUTE - Output Enable */ +#define FLEXIO_PINOUTE_OUTE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINOUTE_OUTE_SHIFT)) & FLEXIO_PINOUTE_OUTE_MASK) +/*! @} */ + +/*! @name PINOUTDIS - Pin Output Disable */ +/*! @{ */ + +#define FLEXIO_PINOUTDIS_OUTDIS_MASK (0xFFFFFFFFU) +#define FLEXIO_PINOUTDIS_OUTDIS_SHIFT (0U) +/*! OUTDIS - Output Disable */ +#define FLEXIO_PINOUTDIS_OUTDIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINOUTDIS_OUTDIS_SHIFT)) & FLEXIO_PINOUTDIS_OUTDIS_MASK) +/*! @} */ + +/*! @name PINOUTCLR - Pin Output Clear */ +/*! @{ */ + +#define FLEXIO_PINOUTCLR_OUTCLR_MASK (0xFFFFFFFFU) +#define FLEXIO_PINOUTCLR_OUTCLR_SHIFT (0U) +/*! OUTCLR - Output Clear */ +#define FLEXIO_PINOUTCLR_OUTCLR(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINOUTCLR_OUTCLR_SHIFT)) & FLEXIO_PINOUTCLR_OUTCLR_MASK) +/*! @} */ + +/*! @name PINOUTSET - Pin Output Set */ +/*! @{ */ + +#define FLEXIO_PINOUTSET_OUTSET_MASK (0xFFFFFFFFU) +#define FLEXIO_PINOUTSET_OUTSET_SHIFT (0U) +/*! OUTSET - Output Set */ +#define FLEXIO_PINOUTSET_OUTSET(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINOUTSET_OUTSET_SHIFT)) & FLEXIO_PINOUTSET_OUTSET_MASK) +/*! @} */ + +/*! @name PINOUTTOG - Pin Output Toggle */ +/*! @{ */ + +#define FLEXIO_PINOUTTOG_OUTTOG_MASK (0xFFFFFFFFU) +#define FLEXIO_PINOUTTOG_OUTTOG_SHIFT (0U) +/*! OUTTOG - Output Toggle */ +#define FLEXIO_PINOUTTOG_OUTTOG(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_PINOUTTOG_OUTTOG_SHIFT)) & FLEXIO_PINOUTTOG_OUTTOG_MASK) +/*! @} */ + +/*! @name SHIFTCTL - Shifter Control */ +/*! @{ */ + +#define FLEXIO_SHIFTCTL_SMOD_MASK (0x7U) +#define FLEXIO_SHIFTCTL_SMOD_SHIFT (0U) +/*! SMOD - Shifter Mode + * 0b000..Disable + * 0b001..Receive mode; capture the current shifter content into SHIFTBUF on expiration of the timer + * 0b010..Transmit mode; load SHIFTBUF contents into the shifter on expiration of the timer + * 0b011..Reserved + * 0b100..Match Store mode; shifter data is compared to SHIFTBUF content on expiration of the timer + * 0b101..Match Continuous mode; shifter data is continuously compared to SHIFTBUF contents + * 0b110..State mode; SHIFTBUF contents store programmable state attributes + * 0b111..Logic mode; SHIFTBUF contents implement programmable logic lookup table + */ +#define FLEXIO_SHIFTCTL_SMOD(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_SMOD_SHIFT)) & FLEXIO_SHIFTCTL_SMOD_MASK) + +#define FLEXIO_SHIFTCTL_PINPOL_MASK (0x80U) +#define FLEXIO_SHIFTCTL_PINPOL_SHIFT (7U) +/*! PINPOL - Shifter Pin Polarity + * 0b0..Active high + * 0b1..Active low + */ +#define FLEXIO_SHIFTCTL_PINPOL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_PINPOL_SHIFT)) & FLEXIO_SHIFTCTL_PINPOL_MASK) + +#define FLEXIO_SHIFTCTL_PINSEL_MASK (0x1F00U) +#define FLEXIO_SHIFTCTL_PINSEL_SHIFT (8U) +/*! PINSEL - Shifter Pin Select */ +#define FLEXIO_SHIFTCTL_PINSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_PINSEL_SHIFT)) & FLEXIO_SHIFTCTL_PINSEL_MASK) + +#define FLEXIO_SHIFTCTL_PINCFG_MASK (0x30000U) +#define FLEXIO_SHIFTCTL_PINCFG_SHIFT (16U) +/*! PINCFG - Shifter Pin Configuration + * 0b00..Shifter pin output disabled + * 0b01..Shifter pin open-drain or bidirectional output enable + * 0b10..Shifter pin bidirectional output data + * 0b11..Shifter pin output + */ +#define FLEXIO_SHIFTCTL_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_PINCFG_SHIFT)) & FLEXIO_SHIFTCTL_PINCFG_MASK) + +#define FLEXIO_SHIFTCTL_TIMPOL_MASK (0x800000U) +#define FLEXIO_SHIFTCTL_TIMPOL_SHIFT (23U) +/*! TIMPOL - Timer Polarity + * 0b0..Positive edge + * 0b1..Negative edge + */ +#define FLEXIO_SHIFTCTL_TIMPOL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_TIMPOL_SHIFT)) & FLEXIO_SHIFTCTL_TIMPOL_MASK) + +#define FLEXIO_SHIFTCTL_TIMSEL_MASK (0x3000000U) +#define FLEXIO_SHIFTCTL_TIMSEL_SHIFT (24U) +/*! TIMSEL - Timer Select */ +#define FLEXIO_SHIFTCTL_TIMSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCTL_TIMSEL_SHIFT)) & FLEXIO_SHIFTCTL_TIMSEL_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTCTL */ +#define FLEXIO_SHIFTCTL_COUNT (4U) + +/*! @name SHIFTCFG - Shifter Configuration */ +/*! @{ */ + +#define FLEXIO_SHIFTCFG_SSTART_MASK (0x3U) +#define FLEXIO_SHIFTCFG_SSTART_SHIFT (0U) +/*! SSTART - Shifter Start + * 0b00..Start bit disabled for Transmitter, Receiver, and Match Store modes; Transmitter mode loads data on enable + * 0b01..Start bit disabled for Transmitter, Receiver, and Match Store modes; Transmitter mode loads data on first shift + * 0b10..Transmitter mode outputs start bit value 0 before loading data on first shift; if start bit is not 0, + * Receiver and Match Store modes set error flag + * 0b11..Transmitter mode outputs start bit value 1 before loading data on first shift; if start bit is not 1, + * Receiver and Match Store modes set error flag + */ +#define FLEXIO_SHIFTCFG_SSTART(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_SSTART_SHIFT)) & FLEXIO_SHIFTCFG_SSTART_MASK) + +#define FLEXIO_SHIFTCFG_SSTOP_MASK (0x30U) +#define FLEXIO_SHIFTCFG_SSTOP_SHIFT (4U) +/*! SSTOP - Shifter Stop + * 0b00..Stop bit disabled for Transmitter, Receiver, and Match Store modes + * 0b01..Stop bit disabled for Transmitter, Receiver, and Match Store modes; when timer is in stop condition, + * Receiver and Match Store modes store receive data on the configured shift edge + * 0b10..Transmitter mode outputs stop bit value 0 in Match Store mode; if stop bit is not 0, Receiver and Match + * Store modes set error flag (when timer is in stop condition, these modes also store receive data on the + * configured shift edge) + * 0b11..Transmitter mode outputs stop bit value 1 in Match Store mode; if stop bit is not 1, Receiver and Match + * Store modes set error flag (when timer is in stop condition, these modes also store receive data on the + * configured shift edge) + */ +#define FLEXIO_SHIFTCFG_SSTOP(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_SSTOP_SHIFT)) & FLEXIO_SHIFTCFG_SSTOP_MASK) + +#define FLEXIO_SHIFTCFG_INSRC_MASK (0x100U) +#define FLEXIO_SHIFTCFG_INSRC_SHIFT (8U) +/*! INSRC - Input Source + * 0b0..Pin + * 0b1..Shifter n+1 output + */ +#define FLEXIO_SHIFTCFG_INSRC(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_INSRC_SHIFT)) & FLEXIO_SHIFTCFG_INSRC_MASK) + +#define FLEXIO_SHIFTCFG_LATST_MASK (0x200U) +#define FLEXIO_SHIFTCFG_LATST_SHIFT (9U) +/*! LATST - Late Store + * 0b0..Store the pre-shift register state + * 0b1..Store the post-shift register state + */ +#define FLEXIO_SHIFTCFG_LATST(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_LATST_SHIFT)) & FLEXIO_SHIFTCFG_LATST_MASK) + +#define FLEXIO_SHIFTCFG_SSIZE_MASK (0x1000U) +#define FLEXIO_SHIFTCFG_SSIZE_SHIFT (12U) +/*! SSIZE - Shifter Size + * 0b0..32-bit + * 0b1..24-bit + */ +#define FLEXIO_SHIFTCFG_SSIZE(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_SSIZE_SHIFT)) & FLEXIO_SHIFTCFG_SSIZE_MASK) + +#define FLEXIO_SHIFTCFG_PWIDTH_MASK (0x1F0000U) +#define FLEXIO_SHIFTCFG_PWIDTH_SHIFT (16U) +/*! PWIDTH - Parallel Width */ +#define FLEXIO_SHIFTCFG_PWIDTH(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTCFG_PWIDTH_SHIFT)) & FLEXIO_SHIFTCFG_PWIDTH_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTCFG */ +#define FLEXIO_SHIFTCFG_COUNT (4U) + +/*! @name SHIFTBUF - Shifter Buffer */ +/*! @{ */ + +#define FLEXIO_SHIFTBUF_SHIFTBUF_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUF_SHIFTBUF_SHIFT (0U) +/*! SHIFTBUF - Shift Buffer */ +#define FLEXIO_SHIFTBUF_SHIFTBUF(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUF_SHIFTBUF_SHIFT)) & FLEXIO_SHIFTBUF_SHIFTBUF_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUF */ +#define FLEXIO_SHIFTBUF_COUNT (4U) + +/*! @name SHIFTBUFBIS - Shifter Buffer Bit Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS_SHIFT (0U) +/*! SHIFTBUFBIS - Shift Buffer */ +#define FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS_SHIFT)) & FLEXIO_SHIFTBUFBIS_SHIFTBUFBIS_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFBIS */ +#define FLEXIO_SHIFTBUFBIS_COUNT (4U) + +/*! @name SHIFTBUFBYS - Shifter Buffer Byte Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS_SHIFT (0U) +/*! SHIFTBUFBYS - Shift Buffer */ +#define FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS_SHIFT)) & FLEXIO_SHIFTBUFBYS_SHIFTBUFBYS_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFBYS */ +#define FLEXIO_SHIFTBUFBYS_COUNT (4U) + +/*! @name SHIFTBUFBBS - Shifter Buffer Bit Byte Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS_SHIFT (0U) +/*! SHIFTBUFBBS - Shift Buffer */ +#define FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS_SHIFT)) & FLEXIO_SHIFTBUFBBS_SHIFTBUFBBS_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFBBS */ +#define FLEXIO_SHIFTBUFBBS_COUNT (4U) + +/*! @name TIMCTL - Timer Control */ +/*! @{ */ + +#define FLEXIO_TIMCTL_TIMOD_MASK (0x7U) +#define FLEXIO_TIMCTL_TIMOD_SHIFT (0U) +/*! TIMOD - Timer Mode + * 0b000..Timer disabled + * 0b001..Dual 8-bit counters baud mode + * 0b010..Dual 8-bit counters PWM high mode + * 0b011..Single 16-bit counter mode + * 0b100..Single 16-bit counter disable mode + * 0b101..Dual 8-bit counters word mode + * 0b110..Dual 8-bit counters PWM low mode + * 0b111..Single 16-bit input capture mode + */ +#define FLEXIO_TIMCTL_TIMOD(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_TIMOD_SHIFT)) & FLEXIO_TIMCTL_TIMOD_MASK) + +#define FLEXIO_TIMCTL_ONETIM_MASK (0x20U) +#define FLEXIO_TIMCTL_ONETIM_SHIFT (5U) +/*! ONETIM - Timer One Time Operation + * 0b0..Generate the timer enable event as normal + * 0b1..Block the timer enable event unless the timer status flag is clear + */ +#define FLEXIO_TIMCTL_ONETIM(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_ONETIM_SHIFT)) & FLEXIO_TIMCTL_ONETIM_MASK) + +#define FLEXIO_TIMCTL_PININS_MASK (0x40U) +#define FLEXIO_TIMCTL_PININS_SHIFT (6U) +/*! PININS - Timer Pin Input Select + * 0b0..PINSEL selects timer pin input and output + * 0b1..PINSEL + 1 selects the timer pin input; timer pin output remains selected by PINSEL + */ +#define FLEXIO_TIMCTL_PININS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_PININS_SHIFT)) & FLEXIO_TIMCTL_PININS_MASK) + +#define FLEXIO_TIMCTL_PINPOL_MASK (0x80U) +#define FLEXIO_TIMCTL_PINPOL_SHIFT (7U) +/*! PINPOL - Timer Pin Polarity + * 0b0..Active high + * 0b1..Active low + */ +#define FLEXIO_TIMCTL_PINPOL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_PINPOL_SHIFT)) & FLEXIO_TIMCTL_PINPOL_MASK) + +#define FLEXIO_TIMCTL_PINSEL_MASK (0x1F00U) +#define FLEXIO_TIMCTL_PINSEL_SHIFT (8U) +/*! PINSEL - Timer Pin Select */ +#define FLEXIO_TIMCTL_PINSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_PINSEL_SHIFT)) & FLEXIO_TIMCTL_PINSEL_MASK) + +#define FLEXIO_TIMCTL_PINCFG_MASK (0x30000U) +#define FLEXIO_TIMCTL_PINCFG_SHIFT (16U) +/*! PINCFG - Timer Pin Configuration + * 0b00..Timer pin output disabled + * 0b01..Timer pin open-drain or bidirectional output enable + * 0b10..Timer pin bidirectional output data + * 0b11..Timer pin output + */ +#define FLEXIO_TIMCTL_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_PINCFG_SHIFT)) & FLEXIO_TIMCTL_PINCFG_MASK) + +#define FLEXIO_TIMCTL_TRGSRC_MASK (0x400000U) +#define FLEXIO_TIMCTL_TRGSRC_SHIFT (22U) +/*! TRGSRC - Trigger Source + * 0b0..External + * 0b1..Internal + */ +#define FLEXIO_TIMCTL_TRGSRC(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_TRGSRC_SHIFT)) & FLEXIO_TIMCTL_TRGSRC_MASK) + +#define FLEXIO_TIMCTL_TRGPOL_MASK (0x800000U) +#define FLEXIO_TIMCTL_TRGPOL_SHIFT (23U) +/*! TRGPOL - Trigger Polarity + * 0b0..Active high + * 0b1..Active low + */ +#define FLEXIO_TIMCTL_TRGPOL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_TRGPOL_SHIFT)) & FLEXIO_TIMCTL_TRGPOL_MASK) + +#define FLEXIO_TIMCTL_TRGSEL_MASK (0x3F000000U) +#define FLEXIO_TIMCTL_TRGSEL_SHIFT (24U) +/*! TRGSEL - Trigger Select */ +#define FLEXIO_TIMCTL_TRGSEL(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCTL_TRGSEL_SHIFT)) & FLEXIO_TIMCTL_TRGSEL_MASK) +/*! @} */ + +/* The count of FLEXIO_TIMCTL */ +#define FLEXIO_TIMCTL_COUNT (4U) + +/*! @name TIMCFG - Timer Configuration */ +/*! @{ */ + +#define FLEXIO_TIMCFG_TSTART_MASK (0x2U) +#define FLEXIO_TIMCFG_TSTART_SHIFT (1U) +/*! TSTART - Timer Start + * 0b0..Disabled + * 0b1..Enabled + */ +#define FLEXIO_TIMCFG_TSTART(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TSTART_SHIFT)) & FLEXIO_TIMCFG_TSTART_MASK) + +#define FLEXIO_TIMCFG_TSTOP_MASK (0x30U) +#define FLEXIO_TIMCFG_TSTOP_SHIFT (4U) +/*! TSTOP - Timer Stop + * 0b00..Disabled + * 0b01..Enabled on timer compare + * 0b10..Enabled on timer disable + * 0b11..Enabled on timer compare and timer disable + */ +#define FLEXIO_TIMCFG_TSTOP(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TSTOP_SHIFT)) & FLEXIO_TIMCFG_TSTOP_MASK) + +#define FLEXIO_TIMCFG_TIMENA_MASK (0x700U) +#define FLEXIO_TIMCFG_TIMENA_SHIFT (8U) +/*! TIMENA - Timer Enable + * 0b000..Timer always enabled + * 0b001..Timer enabled on timer n-1 enable + * 0b010..Timer enabled on trigger high + * 0b011..Timer enabled on trigger high and pin high + * 0b100..Timer enabled on pin rising edge + * 0b101..Timer enabled on pin rising edge and trigger high + * 0b110..Timer enabled on trigger rising edge + * 0b111..Timer enabled on trigger rising or falling edge + */ +#define FLEXIO_TIMCFG_TIMENA(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMENA_SHIFT)) & FLEXIO_TIMCFG_TIMENA_MASK) + +#define FLEXIO_TIMCFG_TIMDIS_MASK (0x7000U) +#define FLEXIO_TIMCFG_TIMDIS_SHIFT (12U) +/*! TIMDIS - Timer Disable + * 0b000..Timer never disabled + * 0b001..Timer disabled on timer n-1 disable + * 0b010..Timer disabled on timer compare (upper 8 bits match and decrement) + * 0b011..Timer disabled on timer compare (upper 8 bits match and decrement) and trigger low + * 0b100..Timer disabled on pin rising or falling edge + * 0b101..Timer disabled on pin rising or falling edge provided trigger is high + * 0b110..Timer disabled on trigger falling edge + * 0b111..Reserved + */ +#define FLEXIO_TIMCFG_TIMDIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMDIS_SHIFT)) & FLEXIO_TIMCFG_TIMDIS_MASK) + +#define FLEXIO_TIMCFG_TIMRST_MASK (0x70000U) +#define FLEXIO_TIMCFG_TIMRST_SHIFT (16U) +/*! TIMRST - Timer Reset + * 0b000..Never reset timer + * 0b001..Timer reset on timer output high. + * 0b010..Timer reset on timer pin equal to timer output + * 0b011..Timer reset on timer trigger equal to timer output + * 0b100..Timer reset on timer pin rising edge + * 0b101..Reserved + * 0b110..Timer reset on trigger rising edge + * 0b111..Timer reset on trigger rising or falling edge + */ +#define FLEXIO_TIMCFG_TIMRST(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMRST_SHIFT)) & FLEXIO_TIMCFG_TIMRST_MASK) + +#define FLEXIO_TIMCFG_TIMDEC_MASK (0x700000U) +#define FLEXIO_TIMCFG_TIMDEC_SHIFT (20U) +/*! TIMDEC - Timer Decrement + * 0b000..Decrement counter on FLEXIO clock; shift clock equals timer output + * 0b001..Decrement counter on trigger input (both edges); shift clock equals timer output + * 0b010..Decrement counter on pin input (both edges); shift clock equals pin input + * 0b011..Decrement counter on trigger input (both edges); shift clock equals trigger input + * 0b100..Decrement counter on FLEXIO clock divided by 16; shift clock equals timer output + * 0b101..Decrement counter on FLEXIO clock divided by 256; shift clock equals timer output + * 0b110..Decrement counter on pin input (rising edge); shift clock equals pin input + * 0b111..Decrement counter on trigger input (rising edge); shift clock equals trigger input + */ +#define FLEXIO_TIMCFG_TIMDEC(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMDEC_SHIFT)) & FLEXIO_TIMCFG_TIMDEC_MASK) + +#define FLEXIO_TIMCFG_TIMOUT_MASK (0x3000000U) +#define FLEXIO_TIMCFG_TIMOUT_SHIFT (24U) +/*! TIMOUT - Timer Output + * 0b00..Logic one when enabled; not affected by timer reset + * 0b01..Logic zero when enabled; not affected by timer reset + * 0b10..Logic one when enabled and on timer reset + * 0b11..Logic zero when enabled and on timer reset + */ +#define FLEXIO_TIMCFG_TIMOUT(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCFG_TIMOUT_SHIFT)) & FLEXIO_TIMCFG_TIMOUT_MASK) +/*! @} */ + +/* The count of FLEXIO_TIMCFG */ +#define FLEXIO_TIMCFG_COUNT (4U) + +/*! @name TIMCMP - Timer Compare */ +/*! @{ */ + +#define FLEXIO_TIMCMP_CMP_MASK (0xFFFFU) +#define FLEXIO_TIMCMP_CMP_SHIFT (0U) +/*! CMP - Timer Compare Value */ +#define FLEXIO_TIMCMP_CMP(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_TIMCMP_CMP_SHIFT)) & FLEXIO_TIMCMP_CMP_MASK) +/*! @} */ + +/* The count of FLEXIO_TIMCMP */ +#define FLEXIO_TIMCMP_COUNT (4U) + +/*! @name SHIFTBUFNBS - Shifter Buffer Nibble Byte Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS_SHIFT (0U) +/*! SHIFTBUFNBS - Shift Buffer */ +#define FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS_SHIFT)) & FLEXIO_SHIFTBUFNBS_SHIFTBUFNBS_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFNBS */ +#define FLEXIO_SHIFTBUFNBS_COUNT (4U) + +/*! @name SHIFTBUFHWS - Shifter Buffer Halfword Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS_SHIFT (0U) +/*! SHIFTBUFHWS - Shift Buffer */ +#define FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS_SHIFT)) & FLEXIO_SHIFTBUFHWS_SHIFTBUFHWS_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFHWS */ +#define FLEXIO_SHIFTBUFHWS_COUNT (4U) + +/*! @name SHIFTBUFNIS - Shifter Buffer Nibble Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS_SHIFT (0U) +/*! SHIFTBUFNIS - Shift Buffer */ +#define FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS_SHIFT)) & FLEXIO_SHIFTBUFNIS_SHIFTBUFNIS_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFNIS */ +#define FLEXIO_SHIFTBUFNIS_COUNT (4U) + +/*! @name SHIFTBUFOES - Shifter Buffer Odd Even Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFOES_SHIFTBUFOES_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFOES_SHIFTBUFOES_SHIFT (0U) +/*! SHIFTBUFOES - Shift Buffer */ +#define FLEXIO_SHIFTBUFOES_SHIFTBUFOES(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFOES_SHIFTBUFOES_SHIFT)) & FLEXIO_SHIFTBUFOES_SHIFTBUFOES_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFOES */ +#define FLEXIO_SHIFTBUFOES_COUNT (4U) + +/*! @name SHIFTBUFEOS - Shifter Buffer Even Odd Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFEOS_SHIFTBUFEOS_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFEOS_SHIFTBUFEOS_SHIFT (0U) +/*! SHIFTBUFEOS - Shift Buffer */ +#define FLEXIO_SHIFTBUFEOS_SHIFTBUFEOS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFEOS_SHIFTBUFEOS_SHIFT)) & FLEXIO_SHIFTBUFEOS_SHIFTBUFEOS_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFEOS */ +#define FLEXIO_SHIFTBUFEOS_COUNT (4U) + +/*! @name SHIFTBUFHBS - Shifter Buffer Halfword Byte Swapped */ +/*! @{ */ + +#define FLEXIO_SHIFTBUFHBS_SHIFTBUFHBS_MASK (0xFFFFFFFFU) +#define FLEXIO_SHIFTBUFHBS_SHIFTBUFHBS_SHIFT (0U) +/*! SHIFTBUFHBS - Shift Buffer */ +#define FLEXIO_SHIFTBUFHBS_SHIFTBUFHBS(x) (((uint32_t)(((uint32_t)(x)) << FLEXIO_SHIFTBUFHBS_SHIFTBUFHBS_SHIFT)) & FLEXIO_SHIFTBUFHBS_SHIFTBUFHBS_MASK) +/*! @} */ + +/* The count of FLEXIO_SHIFTBUFHBS */ +#define FLEXIO_SHIFTBUFHBS_COUNT (4U) + + +/*! + * @} + */ /* end of group FLEXIO_Register_Masks */ + + +/* FLEXIO - Peripheral instance base addresses */ +/** Peripheral FLEXIO0 base address */ +#define FLEXIO0_BASE (0x40099000u) +/** Peripheral FLEXIO0 base pointer */ +#define FLEXIO0 ((FLEXIO_Type *)FLEXIO0_BASE) +/** Array initializer of FLEXIO peripheral base addresses */ +#define FLEXIO_BASE_ADDRS { FLEXIO0_BASE } +/** Array initializer of FLEXIO peripheral base pointers */ +#define FLEXIO_BASE_PTRS { FLEXIO0 } +/** Interrupt vectors for the FLEXIO peripheral type */ +#define FLEXIO_IRQS { FLEXIO_IRQn } + +/*! + * @} + */ /* end of group FLEXIO_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- FMC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FMC_Peripheral_Access_Layer FMC Peripheral Access Layer + * @{ + */ + +/** FMC - Register Layout Typedef */ +typedef struct { + uint8_t RESERVED_0[32]; + __IO uint32_t REMAP; /**< Data Remap, offset: 0x20 */ +} FMC_Type; + +/* ---------------------------------------------------------------------------- + -- FMC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FMC_Register_Masks FMC Register Masks + * @{ + */ + +/*! @name REMAP - Data Remap */ +/*! @{ */ + +#define FMC_REMAP_REMAPLK_MASK (0x1U) +#define FMC_REMAP_REMAPLK_SHIFT (0U) +/*! REMAPLK - Remap Lock Enable + * 0b1..Lock enabled: cannot write to REMAP + * 0b0..Lock disabled: can write to REMAP + */ +#define FMC_REMAP_REMAPLK(x) (((uint32_t)(((uint32_t)(x)) << FMC_REMAP_REMAPLK_SHIFT)) & FMC_REMAP_REMAPLK_MASK) + +#define FMC_REMAP_LIM_MASK (0x7F0000U) +#define FMC_REMAP_LIM_SHIFT (16U) +/*! LIM - LIM Remapping Address */ +#define FMC_REMAP_LIM(x) (((uint32_t)(((uint32_t)(x)) << FMC_REMAP_LIM_SHIFT)) & FMC_REMAP_LIM_MASK) + +#define FMC_REMAP_LIMDP_MASK (0x7F000000U) +#define FMC_REMAP_LIMDP_SHIFT (24U) +/*! LIMDP - LIMDP Remapping Address */ +#define FMC_REMAP_LIMDP(x) (((uint32_t)(((uint32_t)(x)) << FMC_REMAP_LIMDP_SHIFT)) & FMC_REMAP_LIMDP_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group FMC_Register_Masks */ + + +/* FMC - Peripheral instance base addresses */ +/** Peripheral FMC0 base address */ +#define FMC0_BASE (0x40094000u) +/** Peripheral FMC0 base pointer */ +#define FMC0 ((FMC_Type *)FMC0_BASE) +/** Array initializer of FMC peripheral base addresses */ +#define FMC_BASE_ADDRS { FMC0_BASE } +/** Array initializer of FMC peripheral base pointers */ +#define FMC_BASE_PTRS { FMC0 } + +/*! + * @} + */ /* end of group FMC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- FMU Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FMU_Peripheral_Access_Layer FMU Peripheral Access Layer + * @{ + */ + +/** FMU - Register Layout Typedef */ +typedef struct { + __IO uint32_t FSTAT; /**< Flash Status Register, offset: 0x0 */ + __IO uint32_t FCNFG; /**< Flash Configuration Register, offset: 0x4 */ + __IO uint32_t FCTRL; /**< Flash Control Register, offset: 0x8 */ + uint8_t RESERVED_0[4]; + __IO uint32_t FCCOB[8]; /**< Flash Common Command Object Registers, array offset: 0x10, array step: 0x4 */ +} FMU_Type; + +/* ---------------------------------------------------------------------------- + -- FMU Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FMU_Register_Masks FMU Register Masks + * @{ + */ + +/*! @name FSTAT - Flash Status Register */ +/*! @{ */ + +#define FMU_FSTAT_FAIL_MASK (0x1U) +#define FMU_FSTAT_FAIL_SHIFT (0U) +/*! FAIL - Command Fail Flag + * 0b0..Error not detected + * 0b1..Error detected + */ +#define FMU_FSTAT_FAIL(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_FAIL_SHIFT)) & FMU_FSTAT_FAIL_MASK) + +#define FMU_FSTAT_CMDABT_MASK (0x4U) +#define FMU_FSTAT_CMDABT_SHIFT (2U) +/*! CMDABT - Command Abort Flag + * 0b0..No command abort detected + * 0b1..Command abort detected + */ +#define FMU_FSTAT_CMDABT(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_CMDABT_SHIFT)) & FMU_FSTAT_CMDABT_MASK) + +#define FMU_FSTAT_PVIOL_MASK (0x10U) +#define FMU_FSTAT_PVIOL_SHIFT (4U) +/*! PVIOL - Command Protection Violation Flag + * 0b0..No protection violation detected + * 0b1..Protection violation detected + */ +#define FMU_FSTAT_PVIOL(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_PVIOL_SHIFT)) & FMU_FSTAT_PVIOL_MASK) + +#define FMU_FSTAT_ACCERR_MASK (0x20U) +#define FMU_FSTAT_ACCERR_SHIFT (5U) +/*! ACCERR - Command Access Error Flag + * 0b0..No access error detected + * 0b1..Access error detected + */ +#define FMU_FSTAT_ACCERR(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_ACCERR_SHIFT)) & FMU_FSTAT_ACCERR_MASK) + +#define FMU_FSTAT_CWSABT_MASK (0x40U) +#define FMU_FSTAT_CWSABT_SHIFT (6U) +/*! CWSABT - Command Write Sequence Abort Flag + * 0b0..Command write sequence not aborted + * 0b1..Command write sequence aborted + */ +#define FMU_FSTAT_CWSABT(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_CWSABT_SHIFT)) & FMU_FSTAT_CWSABT_MASK) + +#define FMU_FSTAT_CCIF_MASK (0x80U) +#define FMU_FSTAT_CCIF_SHIFT (7U) +/*! CCIF - Command Complete Interrupt Flag + * 0b0..Flash command, initialization, or power mode recovery in progress + * 0b1..Flash command, initialization, or power mode recovery has completed + */ +#define FMU_FSTAT_CCIF(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_CCIF_SHIFT)) & FMU_FSTAT_CCIF_MASK) + +#define FMU_FSTAT_CMDPRT_MASK (0x300U) +#define FMU_FSTAT_CMDPRT_SHIFT (8U) +/*! CMDPRT - Command protection level + * 0b00..Secure, normal access + * 0b01..Secure, privileged access + * 0b10..Nonsecure, normal access + * 0b11..Nonsecure, privileged access + */ +#define FMU_FSTAT_CMDPRT(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_CMDPRT_SHIFT)) & FMU_FSTAT_CMDPRT_MASK) + +#define FMU_FSTAT_CMDP_MASK (0x800U) +#define FMU_FSTAT_CMDP_SHIFT (11U) +/*! CMDP - Command protection status flag + * 0b0..Command protection level and domain ID are stale + * 0b1..Command protection level (CMDPRT) and domain ID (CMDDID) are set + */ +#define FMU_FSTAT_CMDP(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_CMDP_SHIFT)) & FMU_FSTAT_CMDP_MASK) + +#define FMU_FSTAT_CMDDID_MASK (0xF000U) +#define FMU_FSTAT_CMDDID_SHIFT (12U) +/*! CMDDID - Command domain ID */ +#define FMU_FSTAT_CMDDID(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_CMDDID_SHIFT)) & FMU_FSTAT_CMDDID_MASK) + +#define FMU_FSTAT_DFDIF_MASK (0x10000U) +#define FMU_FSTAT_DFDIF_SHIFT (16U) +/*! DFDIF - Double Bit Fault Detect Interrupt Flag + * 0b0..Double bit fault not detected during a valid flash read access + * 0b1..Double bit fault detected (or FCTRL[FDFD] is set) during a valid flash read access + */ +#define FMU_FSTAT_DFDIF(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_DFDIF_SHIFT)) & FMU_FSTAT_DFDIF_MASK) + +#define FMU_FSTAT_SALV_USED_MASK (0x20000U) +#define FMU_FSTAT_SALV_USED_SHIFT (17U) +/*! SALV_USED - Salvage Used for Erase operation + * 0b0..Salvage not used during last operation + * 0b1..Salvage used during the last erase operation + */ +#define FMU_FSTAT_SALV_USED(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_SALV_USED_SHIFT)) & FMU_FSTAT_SALV_USED_MASK) + +#define FMU_FSTAT_PEWEN_MASK (0x3000000U) +#define FMU_FSTAT_PEWEN_SHIFT (24U) +/*! PEWEN - Program-Erase Write Enable Control + * 0b00..Writes are not enabled + * 0b01..Writes are enabled for one flash or IFR phrase (phrase programming, sector erase) + * 0b10..Writes are enabled for one flash or IFR page (page programming) + * 0b11..Reserved + */ +#define FMU_FSTAT_PEWEN(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_PEWEN_SHIFT)) & FMU_FSTAT_PEWEN_MASK) + +#define FMU_FSTAT_PERDY_MASK (0x80000000U) +#define FMU_FSTAT_PERDY_SHIFT (31U) +/*! PERDY - Program-Erase Ready Control/Status Flag + * 0b0..Program or sector erase command operation not stalled + * 0b1..Program or sector erase command operation ready to execute + */ +#define FMU_FSTAT_PERDY(x) (((uint32_t)(((uint32_t)(x)) << FMU_FSTAT_PERDY_SHIFT)) & FMU_FSTAT_PERDY_MASK) +/*! @} */ + +/*! @name FCNFG - Flash Configuration Register */ +/*! @{ */ + +#define FMU_FCNFG_CCIE_MASK (0x80U) +#define FMU_FCNFG_CCIE_SHIFT (7U) +/*! CCIE - Command Complete Interrupt Enable + * 0b0..Command complete interrupt disabled + * 0b1..Command complete interrupt enabled + */ +#define FMU_FCNFG_CCIE(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCNFG_CCIE_SHIFT)) & FMU_FCNFG_CCIE_MASK) + +#define FMU_FCNFG_ERSREQ_MASK (0x100U) +#define FMU_FCNFG_ERSREQ_SHIFT (8U) +/*! ERSREQ - Mass Erase Request + * 0b0..No request or request complete + * 0b1..Request to run the Mass Erase operation + */ +#define FMU_FCNFG_ERSREQ(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCNFG_ERSREQ_SHIFT)) & FMU_FCNFG_ERSREQ_MASK) + +#define FMU_FCNFG_DFDIE_MASK (0x10000U) +#define FMU_FCNFG_DFDIE_SHIFT (16U) +/*! DFDIE - Double Bit Fault Detect Interrupt Enable + * 0b0..Double bit fault detect interrupt disabled + * 0b1..Double bit fault detect interrupt enabled + */ +#define FMU_FCNFG_DFDIE(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCNFG_DFDIE_SHIFT)) & FMU_FCNFG_DFDIE_MASK) + +#define FMU_FCNFG_ERSIEN0_MASK (0xF000000U) +#define FMU_FCNFG_ERSIEN0_SHIFT (24U) +/*! ERSIEN0 - Erase IFR Sector Enable - Block 0 + * 0b0000..Block 0 IFR Sector X is protected from erase by ERSSCR command + * 0b0001..Block 0 IFR Sector X is not protected from erase by ERSSCR command + */ +#define FMU_FCNFG_ERSIEN0(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCNFG_ERSIEN0_SHIFT)) & FMU_FCNFG_ERSIEN0_MASK) + +#define FMU_FCNFG_ERSIEN1_MASK (0xF0000000U) +#define FMU_FCNFG_ERSIEN1_SHIFT (28U) +/*! ERSIEN1 - Erase IFR Sector Enable - Block 1 (for dual block configs) + * 0b0000..Block 1 IFR Sector X is protected from erase by ERSSCR command + * 0b0001..Block 1 IFR Sector X is not protected from erase by ERSSCR command + */ +#define FMU_FCNFG_ERSIEN1(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCNFG_ERSIEN1_SHIFT)) & FMU_FCNFG_ERSIEN1_MASK) +/*! @} */ + +/*! @name FCTRL - Flash Control Register */ +/*! @{ */ + +#define FMU_FCTRL_RWSC_MASK (0xFU) +#define FMU_FCTRL_RWSC_SHIFT (0U) +/*! RWSC - Read Wait-State Control */ +#define FMU_FCTRL_RWSC(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCTRL_RWSC_SHIFT)) & FMU_FCTRL_RWSC_MASK) + +#define FMU_FCTRL_LSACTIVE_MASK (0x100U) +#define FMU_FCTRL_LSACTIVE_SHIFT (8U) +/*! LSACTIVE - Low speed active mode + * 0b0..Full speed active mode requested + * 0b1..Low speed active mode requested + */ +#define FMU_FCTRL_LSACTIVE(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCTRL_LSACTIVE_SHIFT)) & FMU_FCTRL_LSACTIVE_MASK) + +#define FMU_FCTRL_FDFD_MASK (0x10000U) +#define FMU_FCTRL_FDFD_SHIFT (16U) +/*! FDFD - Force Double Bit Fault Detect + * 0b0..FSTAT[DFDIF] sets only if a double bit fault is detected during a valid flash read access from the platform flash controller + * 0b1..FSTAT[DFDIF] sets during any valid flash read access from the platform flash controller. An interrupt + * request is generated if the DFDIE bit is set. + */ +#define FMU_FCTRL_FDFD(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCTRL_FDFD_SHIFT)) & FMU_FCTRL_FDFD_MASK) + +#define FMU_FCTRL_ABTREQ_MASK (0x1000000U) +#define FMU_FCTRL_ABTREQ_SHIFT (24U) +/*! ABTREQ - Abort Request + * 0b0..No request to abort a command write sequence + * 0b1..Request to abort a command write sequence + */ +#define FMU_FCTRL_ABTREQ(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCTRL_ABTREQ_SHIFT)) & FMU_FCTRL_ABTREQ_MASK) +/*! @} */ + +/*! @name FCCOB - Flash Common Command Object Registers */ +/*! @{ */ + +#define FMU_FCCOB_CCOBn_MASK (0xFFFFFFFFU) +#define FMU_FCCOB_CCOBn_SHIFT (0U) +/*! CCOBn - CCOBn */ +#define FMU_FCCOB_CCOBn(x) (((uint32_t)(((uint32_t)(x)) << FMU_FCCOB_CCOBn_SHIFT)) & FMU_FCCOB_CCOBn_MASK) +/*! @} */ + +/* The count of FMU_FCCOB */ +#define FMU_FCCOB_COUNT (8U) + + +/*! + * @} + */ /* end of group FMU_Register_Masks */ + + +/* FMU - Peripheral instance base addresses */ +/** Peripheral FMU0 base address */ +#define FMU0_BASE (0x40095000u) +/** Peripheral FMU0 base pointer */ +#define FMU0 ((FMU_Type *)FMU0_BASE) +/** Array initializer of FMU peripheral base addresses */ +#define FMU_BASE_ADDRS { FMU0_BASE } +/** Array initializer of FMU peripheral base pointers */ +#define FMU_BASE_PTRS { FMU0 } + +/*! + * @} + */ /* end of group FMU_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- FMUTEST Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FMUTEST_Peripheral_Access_Layer FMUTEST Peripheral Access Layer + * @{ + */ + +/** FMUTEST - Register Layout Typedef */ +typedef struct { + __IO uint32_t FSTAT; /**< Flash Status Register, offset: 0x0 */ + __IO uint32_t FCNFG; /**< Flash Configuration Register, offset: 0x4 */ + __IO uint32_t FCTRL; /**< Flash Control Register, offset: 0x8 */ + __I uint32_t FTEST; /**< Flash Test Register, offset: 0xC */ + __IO uint32_t FCCOB0; /**< Flash Command Control 0 Register, offset: 0x10 */ + __IO uint32_t FCCOB1; /**< Flash Command Control 1 Register, offset: 0x14 */ + __IO uint32_t FCCOB2; /**< Flash Command Control 2 Register, offset: 0x18 */ + __IO uint32_t FCCOB3; /**< Flash Command Control 3 Register, offset: 0x1C */ + __IO uint32_t FCCOB4; /**< Flash Command Control 4 Register, offset: 0x20 */ + __IO uint32_t FCCOB5; /**< Flash Command Control 5 Register, offset: 0x24 */ + __IO uint32_t FCCOB6; /**< Flash Command Control 6 Register, offset: 0x28 */ + __IO uint32_t FCCOB7; /**< Flash Command Control 7 Register, offset: 0x2C */ + uint8_t RESERVED_0[208]; + __IO uint32_t RESET_STATUS; /**< FMU Initialization Tracking Register, offset: 0x100 */ + __IO uint32_t MCTL; /**< FMU Control Register, offset: 0x104 */ + __I uint32_t BSEL_GEN; /**< FMU Block Select Generation Register, offset: 0x108 */ + __IO uint32_t PWR_OPT; /**< Power Mode Options Register, offset: 0x10C */ + __I uint32_t CMD_CHECK; /**< FMU Command Check Register, offset: 0x110 */ + uint8_t RESERVED_1[12]; + __IO uint32_t BSEL; /**< FMU Block Select Register, offset: 0x120 */ + __IO uint32_t MSIZE; /**< FMU Memory Size Register, offset: 0x124 */ + __IO uint32_t FLASH_RD_ADD; /**< Flash Read Address Register, offset: 0x128 */ + uint8_t RESERVED_2[4]; + __IO uint32_t FLASH_STOP_ADD; /**< Flash Stop Address Register, offset: 0x130 */ + __IO uint32_t FLASH_RD_CTRL; /**< Flash Read Control Register, offset: 0x134 */ + __IO uint32_t MM_ADDR; /**< Memory Map Address Register, offset: 0x138 */ + uint8_t RESERVED_3[4]; + __IO uint32_t MM_WDATA; /**< Memory Map Write Data Register, offset: 0x140 */ + __IO uint32_t MM_CTL; /**< Memory Map Control Register, offset: 0x144 */ + __IO uint32_t UINT_CTL; /**< User Interface Control Register, offset: 0x148 */ + __IO uint32_t RD_DATA0; /**< Read Data 0 Register, offset: 0x14C */ + __IO uint32_t RD_DATA1; /**< Read Data 1 Register, offset: 0x150 */ + __IO uint32_t RD_DATA2; /**< Read Data 2 Register, offset: 0x154 */ + __IO uint32_t RD_DATA3; /**< Read Data 3 Register, offset: 0x158 */ + __IO uint32_t PARITY; /**< Parity Register, offset: 0x15C */ + __IO uint32_t RD_PATH_CTRL_STATUS; /**< Read Path Control and Status Register, offset: 0x160 */ + __IO uint32_t SMW_DIN0; /**< SMW DIN 0 Register, offset: 0x164 */ + __IO uint32_t SMW_DIN1; /**< SMW DIN 1 Register, offset: 0x168 */ + __IO uint32_t SMW_DIN2; /**< SMW DIN 2 Register, offset: 0x16C */ + __IO uint32_t SMW_DIN3; /**< SMW DIN 3 Register, offset: 0x170 */ + __IO uint32_t SMW_ADDR; /**< SMW Address Register, offset: 0x174 */ + __IO uint32_t SMW_CMD_WAIT; /**< SMW Command and Wait Register, offset: 0x178 */ + __I uint32_t SMW_STATUS; /**< SMW Status Register, offset: 0x17C */ + __IO uint32_t SOCTRIM0_0; /**< SoC Trim Phrase 0 Word 0 Register, offset: 0x180 */ + __IO uint32_t SOCTRIM0_1; /**< SoC Trim Phrase 0 Word 1 Register, offset: 0x184 */ + __IO uint32_t SOCTRIM0_2; /**< SoC Trim Phrase 0 Word 2 Register, offset: 0x188 */ + __IO uint32_t SOCTRIM0_3; /**< SoC Trim Phrase 0 Word 3 Register, offset: 0x18C */ + __IO uint32_t SOCTRIM1_0; /**< SoC Trim Phrase 1 Word 0 Register, offset: 0x190 */ + __IO uint32_t SOCTRIM1_1; /**< SoC Trim Phrase 1 Word 1 Register, offset: 0x194 */ + __IO uint32_t SOCTRIM1_2; /**< SoC Trim Phrase 1 Word 2 Register, offset: 0x198 */ + __IO uint32_t SOCTRIM1_3; /**< SoC Trim Phrase 1 Word 3 Register, offset: 0x19C */ + __IO uint32_t SOCTRIM2_0; /**< SoC Trim Phrase 2 Word 0 Register, offset: 0x1A0 */ + __IO uint32_t SOCTRIM2_1; /**< SoC Trim Phrase 2 Word 1 Register, offset: 0x1A4 */ + __IO uint32_t SOCTRIM2_2; /**< SoC Trim Phrase 2 Word 2 Register, offset: 0x1A8 */ + __IO uint32_t SOCTRIM2_3; /**< SoC Trim Phrase 2 Word 3 Register, offset: 0x1AC */ + __IO uint32_t SOCTRIM3_0; /**< SoC Trim Phrase 3 Word 0 Register, offset: 0x1B0 */ + __IO uint32_t SOCTRIM3_1; /**< SoC Trim Phrase 3 Word 1 Register, offset: 0x1B4 */ + __IO uint32_t SOCTRIM3_2; /**< SoC Trim Phrase 3 Word 2 Register, offset: 0x1B8 */ + __IO uint32_t SOCTRIM3_3; /**< SoC Trim Phrase 3 Word 3 Register, offset: 0x1BC */ + __IO uint32_t SOCTRIM4_0; /**< SoC Trim Phrase 4 Word 0 Register, offset: 0x1C0 */ + __IO uint32_t SOCTRIM4_1; /**< SoC Trim Phrase 4 Word 1 Register, offset: 0x1C4 */ + __IO uint32_t SOCTRIM4_2; /**< SoC Trim Phrase 4 Word 2 Register, offset: 0x1C8 */ + __IO uint32_t SOCTRIM4_3; /**< SoC Trim Phrase 4 Word 3 Register, offset: 0x1CC */ + __IO uint32_t SOCTRIM5_0; /**< SoC Trim Phrase 5 Word 0 Register, offset: 0x1D0 */ + __IO uint32_t SOCTRIM5_1; /**< SoC Trim Phrase 5 Word 1 Register, offset: 0x1D4 */ + __IO uint32_t SOCTRIM5_2; /**< SoC Trim Phrase 5 Word 2 Register, offset: 0x1D8 */ + __IO uint32_t SOCTRIM5_3; /**< SoC Trim Phrase 5 Word 3 Register, offset: 0x1DC */ + __IO uint32_t SOCTRIM6_0; /**< SoC Trim Phrase 6 Word 0 Register, offset: 0x1E0 */ + __IO uint32_t SOCTRIM6_1; /**< SoC Trim Phrase 6 Word 1 Register, offset: 0x1E4 */ + __IO uint32_t SOCTRIM6_2; /**< SoC Trim Phrase 6 Word 2 Register, offset: 0x1E8 */ + __IO uint32_t SOCTRIM6_3; /**< SoC Trim Phrase 6 Word 3 Register, offset: 0x1EC */ + __IO uint32_t SOCTRIM7_0; /**< SoC Trim Phrase 7 Word 0 Register, offset: 0x1F0 */ + __IO uint32_t SOCTRIM7_1; /**< SoC Trim Phrase 7 Word 1 Register, offset: 0x1F4 */ + __IO uint32_t SOCTRIM7_2; /**< SoC Trim Phrase 7 Word 2 Register, offset: 0x1F8 */ + __IO uint32_t SOCTRIM7_3; /**< SoC Trim Phrase 7 Word 3 Register, offset: 0x1FC */ + uint8_t RESERVED_4[4]; + __IO uint32_t R_IP_CONFIG; /**< BIST Configuration Register, offset: 0x204 */ + __IO uint32_t R_TESTCODE; /**< BIST Test Code Register, offset: 0x208 */ + __IO uint32_t R_DFT_CTRL; /**< BIST DFT Control Register, offset: 0x20C */ + __IO uint32_t R_ADR_CTRL; /**< BIST Address Control Register, offset: 0x210 */ + __IO uint32_t R_DATA_CTRL0; /**< BIST Data Control 0 Register, offset: 0x214 */ + __IO uint32_t R_PIN_CTRL; /**< BIST Pin Control Register, offset: 0x218 */ + __IO uint32_t R_CNT_LOOP_CTRL; /**< BIST Loop Count Control Register, offset: 0x21C */ + __IO uint32_t R_TIMER_CTRL; /**< BIST Timer Control Register, offset: 0x220 */ + __IO uint32_t R_TEST_CTRL; /**< BIST Test Control Register, offset: 0x224 */ + __O uint32_t R_ABORT_LOOP; /**< BIST Abort Loop Register, offset: 0x228 */ + __I uint32_t R_ADR_QUERY; /**< BIST Address Query Register, offset: 0x22C */ + __I uint32_t R_DOUT_QUERY0; /**< BIST DOUT Query 0 Register, offset: 0x230 */ + uint8_t RESERVED_5[8]; + __I uint32_t R_SMW_QUERY; /**< BIST SMW Query Register, offset: 0x23C */ + __IO uint32_t R_SMW_SETTING0; /**< BIST SMW Setting 0 Register, offset: 0x240 */ + __IO uint32_t R_SMW_SETTING1; /**< BIST SMW Setting 1 Register, offset: 0x244 */ + __IO uint32_t R_SMP_WHV0; /**< BIST SMP WHV Setting 0 Register, offset: 0x248 */ + __IO uint32_t R_SMP_WHV1; /**< BIST SMP WHV Setting 1 Register, offset: 0x24C */ + __IO uint32_t R_SME_WHV0; /**< BIST SME WHV Setting 0 Register, offset: 0x250 */ + __IO uint32_t R_SME_WHV1; /**< BIST SME WHV Setting 1 Register, offset: 0x254 */ + __IO uint32_t R_SMW_SETTING2; /**< BIST SMW Setting 2 Register, offset: 0x258 */ + __I uint32_t R_D_MISR0; /**< BIST DIN MISR 0 Register, offset: 0x25C */ + __I uint32_t R_A_MISR0; /**< BIST Address MISR 0 Register, offset: 0x260 */ + __I uint32_t R_C_MISR0; /**< BIST Control MISR 0 Register, offset: 0x264 */ + __IO uint32_t R_SMW_SETTING3; /**< BIST SMW Setting 3 Register, offset: 0x268 */ + __IO uint32_t R_DATA_CTRL1; /**< BIST Data Control 1 Register, offset: 0x26C */ + __IO uint32_t R_DATA_CTRL2; /**< BIST Data Control 2 Register, offset: 0x270 */ + __IO uint32_t R_DATA_CTRL3; /**< BIST Data Control 3 Register, offset: 0x274 */ + uint8_t RESERVED_6[8]; + __I uint32_t R_REPAIR0_0; /**< BIST Repair 0 for Block 0 Register, offset: 0x280 */ + __I uint32_t R_REPAIR0_1; /**< BIST Repair 1 Block 0 Register, offset: 0x284 */ + __I uint32_t R_REPAIR1_0; /**< BIST Repair 0 Block 1 Register, offset: 0x288 */ + __I uint32_t R_REPAIR1_1; /**< BIST Repair 1 Block 1 Register, offset: 0x28C */ + uint8_t RESERVED_7[132]; + __IO uint32_t R_DATA_CTRL0_EX; /**< BIST Data Control 0 Extension Register, offset: 0x314 */ + uint8_t RESERVED_8[8]; + __IO uint32_t R_TIMER_CTRL_EX; /**< BIST Timer Control Extension Register, offset: 0x320 */ + uint8_t RESERVED_9[12]; + __I uint32_t R_DOUT_QUERY1; /**< BIST DOUT Query 1 Register, offset: 0x330 */ + uint8_t RESERVED_10[40]; + __I uint32_t R_D_MISR1; /**< BIST DIN MISR 1 Register, offset: 0x35C */ + __I uint32_t R_A_MISR1; /**< BIST Address MISR 1 Register, offset: 0x360 */ + __I uint32_t R_C_MISR1; /**< BIST Control MISR 1 Register, offset: 0x364 */ + uint8_t RESERVED_11[4]; + __IO uint32_t R_DATA_CTRL1_EX; /**< BIST Data Control 1 Extension Register, offset: 0x36C */ + __IO uint32_t R_DATA_CTRL2_EX; /**< BIST Data Control 2 Extension Register, offset: 0x370 */ + __IO uint32_t R_DATA_CTRL3_EX; /**< BIST Data Control 3 Extension Register, offset: 0x374 */ + uint8_t RESERVED_12[136]; + __IO uint32_t SMW_TIMER_OPTION; /**< SMW Timer Option Register, offset: 0x400 */ + __IO uint32_t SMW_SETTING_OPTION0; /**< SMW Setting Option 0 Register, offset: 0x404 */ + __IO uint32_t SMW_SETTING_OPTION2; /**< SMW Setting Option 2 Register, offset: 0x408 */ + __IO uint32_t SMW_SETTING_OPTION3; /**< SMW Setting Option 3 Register, offset: 0x40C */ + __IO uint32_t SMW_SMP_WHV_OPTION0; /**< SMW SMP WHV Option 0 Register, offset: 0x410 */ + __IO uint32_t SMW_SME_WHV_OPTION0; /**< SMW SME WHV Option 0 Register, offset: 0x414 */ + __IO uint32_t SMW_SETTING_OPTION1; /**< SMW Setting Option 1 Register, offset: 0x418 */ + __IO uint32_t SMW_SMP_WHV_OPTION1; /**< SMW SMP WHV Option 1 Register, offset: 0x41C */ + __IO uint32_t SMW_SME_WHV_OPTION1; /**< SMW SME WHV Option 1 Register, offset: 0x420 */ + uint8_t RESERVED_13[220]; + __IO uint32_t REPAIR0_0; /**< FMU Repair 0 Block 0 Register, offset: 0x500 */ + __IO uint32_t REPAIR0_1; /**< FMU Repair 1 Block 0 Register, offset: 0x504 */ + __IO uint32_t REPAIR1_0; /**< FMU Repair 0 Block 1 Register, offset: 0x508 */ + __IO uint32_t REPAIR1_1; /**< FMU Repair 1 Block 1 Register, offset: 0x50C */ + uint8_t RESERVED_14[240]; + __IO uint32_t SMW_HB_SIGNALS; /**< SMW HB Signals Register, offset: 0x600 */ + __IO uint32_t BIST_DUMP_CTRL; /**< BIST Datadump Control Register, offset: 0x604 */ + uint8_t RESERVED_15[4]; + __IO uint32_t ATX_PIN_CTRL; /**< ATX Pin Control Register, offset: 0x60C */ + __IO uint32_t FAILCNT; /**< Fail Count Register, offset: 0x610 */ + __IO uint32_t PGM_PULSE_CNT0; /**< Block 0 Program Pulse Count Register, offset: 0x614 */ + __IO uint32_t PGM_PULSE_CNT1; /**< Block 1 Program Pulse Count Register, offset: 0x618 */ + __IO uint32_t ERS_PULSE_CNT; /**< Erase Pulse Count Register, offset: 0x61C */ + __IO uint32_t MAX_PULSE_CNT; /**< Maximum Pulse Count Register, offset: 0x620 */ + __IO uint32_t PORT_CTRL; /**< Port Control Register, offset: 0x624 */ +} FMUTEST_Type; + +/* ---------------------------------------------------------------------------- + -- FMUTEST Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FMUTEST_Register_Masks FMUTEST Register Masks + * @{ + */ + +/*! @name FSTAT - Flash Status Register */ +/*! @{ */ + +#define FMUTEST_FSTAT_FAIL_MASK (0x1U) +#define FMUTEST_FSTAT_FAIL_SHIFT (0U) +/*! FAIL - Command Fail Flag + * 0b0..Error not detected + * 0b1..Error detected + */ +#define FMUTEST_FSTAT_FAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_FAIL_SHIFT)) & FMUTEST_FSTAT_FAIL_MASK) + +#define FMUTEST_FSTAT_CMDABT_MASK (0x4U) +#define FMUTEST_FSTAT_CMDABT_SHIFT (2U) +/*! CMDABT - Command Abort Flag + * 0b0..No command abort detected + * 0b1..Command abort detected + */ +#define FMUTEST_FSTAT_CMDABT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_CMDABT_SHIFT)) & FMUTEST_FSTAT_CMDABT_MASK) + +#define FMUTEST_FSTAT_PVIOL_MASK (0x10U) +#define FMUTEST_FSTAT_PVIOL_SHIFT (4U) +/*! PVIOL - Command Protection Violation Flag + * 0b0..No protection violation detected + * 0b1..Protection violation detected + */ +#define FMUTEST_FSTAT_PVIOL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_PVIOL_SHIFT)) & FMUTEST_FSTAT_PVIOL_MASK) + +#define FMUTEST_FSTAT_ACCERR_MASK (0x20U) +#define FMUTEST_FSTAT_ACCERR_SHIFT (5U) +/*! ACCERR - Command Access Error Flag + * 0b0..No access error detected + * 0b1..Access error detected + */ +#define FMUTEST_FSTAT_ACCERR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_ACCERR_SHIFT)) & FMUTEST_FSTAT_ACCERR_MASK) + +#define FMUTEST_FSTAT_CWSABT_MASK (0x40U) +#define FMUTEST_FSTAT_CWSABT_SHIFT (6U) +/*! CWSABT - Command Write Sequence Abort Flag + * 0b0..Command write sequence not aborted + * 0b1..Command write sequence aborted + */ +#define FMUTEST_FSTAT_CWSABT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_CWSABT_SHIFT)) & FMUTEST_FSTAT_CWSABT_MASK) + +#define FMUTEST_FSTAT_CCIF_MASK (0x80U) +#define FMUTEST_FSTAT_CCIF_SHIFT (7U) +/*! CCIF - Command Complete Interrupt Flag + * 0b0..Flash command or initialization in progress + * 0b1..Flash command or initialization has completed + */ +#define FMUTEST_FSTAT_CCIF(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_CCIF_SHIFT)) & FMUTEST_FSTAT_CCIF_MASK) + +#define FMUTEST_FSTAT_CMDPRT_MASK (0x300U) +#define FMUTEST_FSTAT_CMDPRT_SHIFT (8U) +/*! CMDPRT - Command Protection Level + * 0b00..Secure, normal access + * 0b01..Secure, privileged access + * 0b10..Nonsecure, normal access + * 0b11..Nonsecure, privileged access + */ +#define FMUTEST_FSTAT_CMDPRT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_CMDPRT_SHIFT)) & FMUTEST_FSTAT_CMDPRT_MASK) + +#define FMUTEST_FSTAT_CMDP_MASK (0x800U) +#define FMUTEST_FSTAT_CMDP_SHIFT (11U) +/*! CMDP - Command Protection Status Flag + * 0b0..Command protection level and domain ID are stale + * 0b1..Command protection level (CMDPRT) and domain ID (CMDDID) are set + */ +#define FMUTEST_FSTAT_CMDP(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_CMDP_SHIFT)) & FMUTEST_FSTAT_CMDP_MASK) + +#define FMUTEST_FSTAT_CMDDID_MASK (0xF000U) +#define FMUTEST_FSTAT_CMDDID_SHIFT (12U) +/*! CMDDID - Command Domain ID */ +#define FMUTEST_FSTAT_CMDDID(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_CMDDID_SHIFT)) & FMUTEST_FSTAT_CMDDID_MASK) + +#define FMUTEST_FSTAT_DFDIF_MASK (0x10000U) +#define FMUTEST_FSTAT_DFDIF_SHIFT (16U) +/*! DFDIF - Double Bit Fault Detect Interrupt Flag + * 0b0..Double bit fault not detected during a valid flash read access from the FMC + * 0b1..Double bit fault detected (or FCTRL[FDFD] is set) during a valid flash read access from the FMC + */ +#define FMUTEST_FSTAT_DFDIF(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_DFDIF_SHIFT)) & FMUTEST_FSTAT_DFDIF_MASK) + +#define FMUTEST_FSTAT_SALV_USED_MASK (0x20000U) +#define FMUTEST_FSTAT_SALV_USED_SHIFT (17U) +/*! SALV_USED - Salvage Used for Erase operation + * 0b0..Salvage not used during the last operation + * 0b1..Salvage used during the last erase operation + */ +#define FMUTEST_FSTAT_SALV_USED(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_SALV_USED_SHIFT)) & FMUTEST_FSTAT_SALV_USED_MASK) + +#define FMUTEST_FSTAT_PEWEN_MASK (0x3000000U) +#define FMUTEST_FSTAT_PEWEN_SHIFT (24U) +/*! PEWEN - Program-Erase Write Enable Control + * 0b00..Writes are not enabled + * 0b01..Writes are enabled for one flash or IFR phrase (phrase programming, sector erase) + * 0b10..Writes are enabled for one flash or IFR page (page programming) + * 0b11..Reserved + */ +#define FMUTEST_FSTAT_PEWEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_PEWEN_SHIFT)) & FMUTEST_FSTAT_PEWEN_MASK) + +#define FMUTEST_FSTAT_PERDY_MASK (0x80000000U) +#define FMUTEST_FSTAT_PERDY_SHIFT (31U) +/*! PERDY - Program/Erase Ready Control/Status Flag + * 0b0..Program or sector erase command operation is not stalled + * 0b1..Program or sector erase command operation is stalled + */ +#define FMUTEST_FSTAT_PERDY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FSTAT_PERDY_SHIFT)) & FMUTEST_FSTAT_PERDY_MASK) +/*! @} */ + +/*! @name FCNFG - Flash Configuration Register */ +/*! @{ */ + +#define FMUTEST_FCNFG_CCIE_MASK (0x80U) +#define FMUTEST_FCNFG_CCIE_SHIFT (7U) +/*! CCIE - Command Complete Interrupt Enable + * 0b0..Command complete interrupt disabled + * 0b1..Command complete interrupt enabled. An interrupt request is generated whenever the FSTAT[CCIF] flag is set. + */ +#define FMUTEST_FCNFG_CCIE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCNFG_CCIE_SHIFT)) & FMUTEST_FCNFG_CCIE_MASK) + +#define FMUTEST_FCNFG_ERSREQ_MASK (0x100U) +#define FMUTEST_FCNFG_ERSREQ_SHIFT (8U) +/*! ERSREQ - Mass Erase (Erase All) Request + * 0b0..No request or request complete + * 0b1..Request to run the Mass Erase operation + */ +#define FMUTEST_FCNFG_ERSREQ(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCNFG_ERSREQ_SHIFT)) & FMUTEST_FCNFG_ERSREQ_MASK) + +#define FMUTEST_FCNFG_DFDIE_MASK (0x10000U) +#define FMUTEST_FCNFG_DFDIE_SHIFT (16U) +/*! DFDIE - Double Bit Fault Detect Interrupt Enable + * 0b0..Double bit fault detect interrupt disabled + * 0b1..Double bit fault detect interrupt enabled; an interrupt request is generated whenever the FSTAT[DFDIF] flag is set + */ +#define FMUTEST_FCNFG_DFDIE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCNFG_DFDIE_SHIFT)) & FMUTEST_FCNFG_DFDIE_MASK) + +#define FMUTEST_FCNFG_ERSIEN0_MASK (0xF000000U) +#define FMUTEST_FCNFG_ERSIEN0_SHIFT (24U) +/*! ERSIEN0 - Erase IFR Sector Enable - Block 0 + * 0b0000..Block 0 IFR Sector X is protected from erase by ERSSCR command + * 0b0001..Block 0 IFR Sector X is not protected from erase by ERSSCR command + */ +#define FMUTEST_FCNFG_ERSIEN0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCNFG_ERSIEN0_SHIFT)) & FMUTEST_FCNFG_ERSIEN0_MASK) + +#define FMUTEST_FCNFG_ERSIEN1_MASK (0xF0000000U) +#define FMUTEST_FCNFG_ERSIEN1_SHIFT (28U) +/*! ERSIEN1 - Erase IFR Sector Enable - Block 1 (for dual block configs) + * 0b0000..Block 1 IFR Sector X is protected from erase by ERSSCR command + * 0b0001..Block 1 IFR Sector X is not protected from erase by ERSSCR command + */ +#define FMUTEST_FCNFG_ERSIEN1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCNFG_ERSIEN1_SHIFT)) & FMUTEST_FCNFG_ERSIEN1_MASK) +/*! @} */ + +/*! @name FCTRL - Flash Control Register */ +/*! @{ */ + +#define FMUTEST_FCTRL_RWSC_MASK (0xFU) +#define FMUTEST_FCTRL_RWSC_SHIFT (0U) +/*! RWSC - Read Wait-State Control + * 0b0000..no additional wait-states are added (single cycle access) + * 0b0001..1 additional wait-state is added + * 0b0010..2 additional wait-states are added + * 0b0011..3 additional wait-states are added + * 0b0100..4 additional wait-states are added + * 0b0101..5 additional wait-states are added + * 0b0110..6 additional wait-states are added + * 0b0111..7 additional wait-states are added + * 0b1000..8 additional wait-states are added + * 0b1001..9 additional wait-states are added + * 0b1010..10 additional wait-states are added + * 0b1011..11 additional wait-states are added + * 0b1100..12 additional wait-states are added + * 0b1101..13 additional wait-states are added + * 0b1110..14 additional wait-states are added + * 0b1111..15 additional wait-states are added + */ +#define FMUTEST_FCTRL_RWSC(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCTRL_RWSC_SHIFT)) & FMUTEST_FCTRL_RWSC_MASK) + +#define FMUTEST_FCTRL_LSACTIVE_MASK (0x100U) +#define FMUTEST_FCTRL_LSACTIVE_SHIFT (8U) +/*! LSACTIVE - Low Speed Active Mode + * 0b0..Full speed active mode requested + * 0b1..Low speed active mode requested + */ +#define FMUTEST_FCTRL_LSACTIVE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCTRL_LSACTIVE_SHIFT)) & FMUTEST_FCTRL_LSACTIVE_MASK) + +#define FMUTEST_FCTRL_FDFD_MASK (0x10000U) +#define FMUTEST_FCTRL_FDFD_SHIFT (16U) +/*! FDFD - Force Double Bit Fault Detect + * 0b0..FSTAT[DFDIF] sets only if a double bit fault is detected during a valid flash read access from the FMC + * 0b1..FSTAT[DFDIF] sets during any valid flash read access from the FMC; an interrupt request is generated if the DFDIE bit is set + */ +#define FMUTEST_FCTRL_FDFD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCTRL_FDFD_SHIFT)) & FMUTEST_FCTRL_FDFD_MASK) + +#define FMUTEST_FCTRL_ABTREQ_MASK (0x1000000U) +#define FMUTEST_FCTRL_ABTREQ_SHIFT (24U) +/*! ABTREQ - Abort Request + * 0b0..No request to abort a command write sequence + * 0b1..Request to abort a command write sequence + */ +#define FMUTEST_FCTRL_ABTREQ(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCTRL_ABTREQ_SHIFT)) & FMUTEST_FCTRL_ABTREQ_MASK) +/*! @} */ + +/*! @name FTEST - Flash Test Register */ +/*! @{ */ + +#define FMUTEST_FTEST_TMECTL_MASK (0x1U) +#define FMUTEST_FTEST_TMECTL_SHIFT (0U) +/*! TMECTL - Test Mode Entry Control + * 0b0..FTEST register always reads 0 and writes to FTEST are ignored + * 0b1..FTEST register is readable and can be written to enable writability of TME + */ +#define FMUTEST_FTEST_TMECTL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FTEST_TMECTL_SHIFT)) & FMUTEST_FTEST_TMECTL_MASK) + +#define FMUTEST_FTEST_TMEWR_MASK (0x2U) +#define FMUTEST_FTEST_TMEWR_SHIFT (1U) +/*! TMEWR - Test Mode Entry Writable + * 0b0..TME bit is not writable + * 0b1..TME bit is writable + */ +#define FMUTEST_FTEST_TMEWR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FTEST_TMEWR_SHIFT)) & FMUTEST_FTEST_TMEWR_MASK) + +#define FMUTEST_FTEST_TME_MASK (0x4U) +#define FMUTEST_FTEST_TME_SHIFT (2U) +/*! TME - Test Mode Entry + * 0b0..Test mode entry not requested + * 0b1..Test mode entry requested + */ +#define FMUTEST_FTEST_TME(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FTEST_TME_SHIFT)) & FMUTEST_FTEST_TME_MASK) + +#define FMUTEST_FTEST_TMODE_MASK (0x8U) +#define FMUTEST_FTEST_TMODE_SHIFT (3U) +/*! TMODE - Test Mode Status + * 0b0..Test mode not active + * 0b1..Test mode active + */ +#define FMUTEST_FTEST_TMODE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FTEST_TMODE_SHIFT)) & FMUTEST_FTEST_TMODE_MASK) + +#define FMUTEST_FTEST_TMELOCK_MASK (0x10U) +#define FMUTEST_FTEST_TMELOCK_SHIFT (4U) +/*! TMELOCK - Test Mode Entry Lock + * 0b0..FTEST register not locked from accepting writes + * 0b1..FTEST register locked from accepting writes + */ +#define FMUTEST_FTEST_TMELOCK(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FTEST_TMELOCK_SHIFT)) & FMUTEST_FTEST_TMELOCK_MASK) +/*! @} */ + +/*! @name FCCOB0 - Flash Command Control 0 Register */ +/*! @{ */ + +#define FMUTEST_FCCOB0_CMDCODE_MASK (0xFFU) +#define FMUTEST_FCCOB0_CMDCODE_SHIFT (0U) +/*! CMDCODE - Command code */ +#define FMUTEST_FCCOB0_CMDCODE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCCOB0_CMDCODE_SHIFT)) & FMUTEST_FCCOB0_CMDCODE_MASK) +/*! @} */ + +/*! @name FCCOB1 - Flash Command Control 1 Register */ +/*! @{ */ + +#define FMUTEST_FCCOB1_CMDOPT_MASK (0xFFU) +#define FMUTEST_FCCOB1_CMDOPT_SHIFT (0U) +/*! CMDOPT - Command options */ +#define FMUTEST_FCCOB1_CMDOPT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCCOB1_CMDOPT_SHIFT)) & FMUTEST_FCCOB1_CMDOPT_MASK) +/*! @} */ + +/*! @name FCCOB2 - Flash Command Control 2 Register */ +/*! @{ */ + +#define FMUTEST_FCCOB2_CMDADDR_MASK (0xFFFFFFFFU) +#define FMUTEST_FCCOB2_CMDADDR_SHIFT (0U) +/*! CMDADDR - Command starting address */ +#define FMUTEST_FCCOB2_CMDADDR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCCOB2_CMDADDR_SHIFT)) & FMUTEST_FCCOB2_CMDADDR_MASK) +/*! @} */ + +/*! @name FCCOB3 - Flash Command Control 3 Register */ +/*! @{ */ + +#define FMUTEST_FCCOB3_CMDADDRE_MASK (0xFFFFFFFFU) +#define FMUTEST_FCCOB3_CMDADDRE_SHIFT (0U) +/*! CMDADDRE - Command ending address */ +#define FMUTEST_FCCOB3_CMDADDRE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCCOB3_CMDADDRE_SHIFT)) & FMUTEST_FCCOB3_CMDADDRE_MASK) +/*! @} */ + +/*! @name FCCOB4 - Flash Command Control 4 Register */ +/*! @{ */ + +#define FMUTEST_FCCOB4_CMDDATA0_MASK (0xFFFFFFFFU) +#define FMUTEST_FCCOB4_CMDDATA0_SHIFT (0U) +/*! CMDDATA0 - Command data word 0 */ +#define FMUTEST_FCCOB4_CMDDATA0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCCOB4_CMDDATA0_SHIFT)) & FMUTEST_FCCOB4_CMDDATA0_MASK) +/*! @} */ + +/*! @name FCCOB5 - Flash Command Control 5 Register */ +/*! @{ */ + +#define FMUTEST_FCCOB5_CMDDATA1_MASK (0xFFFFFFFFU) +#define FMUTEST_FCCOB5_CMDDATA1_SHIFT (0U) +/*! CMDDATA1 - Command data word 1 */ +#define FMUTEST_FCCOB5_CMDDATA1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCCOB5_CMDDATA1_SHIFT)) & FMUTEST_FCCOB5_CMDDATA1_MASK) +/*! @} */ + +/*! @name FCCOB6 - Flash Command Control 6 Register */ +/*! @{ */ + +#define FMUTEST_FCCOB6_CMDDATA2_MASK (0xFFFFFFFFU) +#define FMUTEST_FCCOB6_CMDDATA2_SHIFT (0U) +/*! CMDDATA2 - Command data word 2 */ +#define FMUTEST_FCCOB6_CMDDATA2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCCOB6_CMDDATA2_SHIFT)) & FMUTEST_FCCOB6_CMDDATA2_MASK) +/*! @} */ + +/*! @name FCCOB7 - Flash Command Control 7 Register */ +/*! @{ */ + +#define FMUTEST_FCCOB7_CMDDATA3_MASK (0xFFFFFFFFU) +#define FMUTEST_FCCOB7_CMDDATA3_SHIFT (0U) +/*! CMDDATA3 - Command data word 3 */ +#define FMUTEST_FCCOB7_CMDDATA3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FCCOB7_CMDDATA3_SHIFT)) & FMUTEST_FCCOB7_CMDDATA3_MASK) +/*! @} */ + +/*! @name RESET_STATUS - FMU Initialization Tracking Register */ +/*! @{ */ + +#define FMUTEST_RESET_STATUS_ARY_TRIM_DONE_MASK (0x1U) +#define FMUTEST_RESET_STATUS_ARY_TRIM_DONE_SHIFT (0U) +/*! ARY_TRIM_DONE - Array Trim Complete + * 0b0..Recall register load operation has not been completed + * 0b1..Recall register load operation has completed + */ +#define FMUTEST_RESET_STATUS_ARY_TRIM_DONE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_ARY_TRIM_DONE_SHIFT)) & FMUTEST_RESET_STATUS_ARY_TRIM_DONE_MASK) + +#define FMUTEST_RESET_STATUS_FMU_PARM_EN_MASK (0x2U) +#define FMUTEST_RESET_STATUS_FMU_PARM_EN_SHIFT (1U) +/*! FMU_PARM_EN - Status of the C0DE_C0DEh check to enable loading of the FMU parameters + * 0b0..C0DE_C0DEh check not attempted + * 0b1..C0DE_C0DEh check completed + */ +#define FMUTEST_RESET_STATUS_FMU_PARM_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_FMU_PARM_EN_SHIFT)) & FMUTEST_RESET_STATUS_FMU_PARM_EN_MASK) + +#define FMUTEST_RESET_STATUS_FMU_PARM_DONE_MASK (0x4U) +#define FMUTEST_RESET_STATUS_FMU_PARM_DONE_SHIFT (2U) +/*! FMU_PARM_DONE - FMU Register Load Complete + * 0b0..FMU registers have not been loaded + * 0b1..FMU registers have been loaded + */ +#define FMUTEST_RESET_STATUS_FMU_PARM_DONE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_FMU_PARM_DONE_SHIFT)) & FMUTEST_RESET_STATUS_FMU_PARM_DONE_MASK) + +#define FMUTEST_RESET_STATUS_SOC_TRIM_EN_MASK (0x8U) +#define FMUTEST_RESET_STATUS_SOC_TRIM_EN_SHIFT (3U) +/*! SOC_TRIM_EN - Status of the C0DE_C0DEh check to enable loading of the SoC trim settings + * 0b0..C0DE_C0DEh check not attempted + * 0b1..C0DE_C0DEh check completed + */ +#define FMUTEST_RESET_STATUS_SOC_TRIM_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_SOC_TRIM_EN_SHIFT)) & FMUTEST_RESET_STATUS_SOC_TRIM_EN_MASK) + +#define FMUTEST_RESET_STATUS_SOC_TRIM_ECC_MASK (0x10U) +#define FMUTEST_RESET_STATUS_SOC_TRIM_ECC_SHIFT (4U) +/*! SOC_TRIM_ECC - Status of the C0DE_C0DEh check for enabling ECC decoder during reads of SoC trim settings + * 0b0..C0DE_C0DEh check failed + * 0b1..C0DE_C0DEh check passed + */ +#define FMUTEST_RESET_STATUS_SOC_TRIM_ECC(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_SOC_TRIM_ECC_SHIFT)) & FMUTEST_RESET_STATUS_SOC_TRIM_ECC_MASK) + +#define FMUTEST_RESET_STATUS_SOC_TRIM_DONE_MASK (0x20U) +#define FMUTEST_RESET_STATUS_SOC_TRIM_DONE_SHIFT (5U) +/*! SOC_TRIM_DONE - SoC Trim Complete + * 0b0..SoC Trim registers have not been updated + * 0b1..All SoC Trim registers have been updated + */ +#define FMUTEST_RESET_STATUS_SOC_TRIM_DONE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_SOC_TRIM_DONE_SHIFT)) & FMUTEST_RESET_STATUS_SOC_TRIM_DONE_MASK) + +#define FMUTEST_RESET_STATUS_RPR_DONE_MASK (0x40U) +#define FMUTEST_RESET_STATUS_RPR_DONE_SHIFT (6U) +/*! RPR_DONE - Array Repair Complete + * 0b0..Repair registers have not been loaded + * 0b1..Repair registers have been loaded + */ +#define FMUTEST_RESET_STATUS_RPR_DONE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_RPR_DONE_SHIFT)) & FMUTEST_RESET_STATUS_RPR_DONE_MASK) + +#define FMUTEST_RESET_STATUS_INIT_DONE_MASK (0x80U) +#define FMUTEST_RESET_STATUS_INIT_DONE_SHIFT (7U) +/*! INIT_DONE - Initialization Done + * 0b0..All initialization steps did not complete + * 0b1..All initialization steps completed + */ +#define FMUTEST_RESET_STATUS_INIT_DONE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_INIT_DONE_SHIFT)) & FMUTEST_RESET_STATUS_INIT_DONE_MASK) + +#define FMUTEST_RESET_STATUS_RST_SF_ERR_MASK (0x100U) +#define FMUTEST_RESET_STATUS_RST_SF_ERR_SHIFT (8U) +/*! RST_SF_ERR - ECC Single Fault during Reset Recovery + * 0b0..No single-bit faults detected during initialization + * 0b1..At least one single ECC fault was detected during initialization + */ +#define FMUTEST_RESET_STATUS_RST_SF_ERR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_RST_SF_ERR_SHIFT)) & FMUTEST_RESET_STATUS_RST_SF_ERR_MASK) + +#define FMUTEST_RESET_STATUS_RST_DF_ERR_MASK (0x200U) +#define FMUTEST_RESET_STATUS_RST_DF_ERR_SHIFT (9U) +/*! RST_DF_ERR - ECC Double Fault during Reset Recovery + * 0b0..No double-bit faults detected during initialization + * 0b1..Double-bit ECC fault was detected during initialization + */ +#define FMUTEST_RESET_STATUS_RST_DF_ERR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_RST_DF_ERR_SHIFT)) & FMUTEST_RESET_STATUS_RST_DF_ERR_MASK) + +#define FMUTEST_RESET_STATUS_SOC_TRIM_DF_ERR_MASK (0x3FC00U) +#define FMUTEST_RESET_STATUS_SOC_TRIM_DF_ERR_SHIFT (10U) +/*! SOC_TRIM_DF_ERR - ECC Double Fault during load of SoC Trim phrases */ +#define FMUTEST_RESET_STATUS_SOC_TRIM_DF_ERR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_SOC_TRIM_DF_ERR_SHIFT)) & FMUTEST_RESET_STATUS_SOC_TRIM_DF_ERR_MASK) + +#define FMUTEST_RESET_STATUS_RST_PATCH_LD_MASK (0x40000U) +#define FMUTEST_RESET_STATUS_RST_PATCH_LD_SHIFT (18U) +/*! RST_PATCH_LD - Reset Patch Required + * 0b0..No patch required to be loaded during reset + * 0b1..Patch loaded during reset + */ +#define FMUTEST_RESET_STATUS_RST_PATCH_LD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_RST_PATCH_LD_SHIFT)) & FMUTEST_RESET_STATUS_RST_PATCH_LD_MASK) + +#define FMUTEST_RESET_STATUS_RECALL_DATA_MISMATCH_MASK (0x80000U) +#define FMUTEST_RESET_STATUS_RECALL_DATA_MISMATCH_SHIFT (19U) +/*! RECALL_DATA_MISMATCH - Recall Data Mismatch + * 0b0..Data read towards end of reset matched data read for Recall + * 0b1..Data read towards end of reset did not match data read for recall + */ +#define FMUTEST_RESET_STATUS_RECALL_DATA_MISMATCH(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RESET_STATUS_RECALL_DATA_MISMATCH_SHIFT)) & FMUTEST_RESET_STATUS_RECALL_DATA_MISMATCH_MASK) +/*! @} */ + +/*! @name MCTL - FMU Control Register */ +/*! @{ */ + +#define FMUTEST_MCTL_COREHLD_MASK (0x1U) +#define FMUTEST_MCTL_COREHLD_SHIFT (0U) +/*! COREHLD - Core Hold + * 0b0..CPU access is allowed + * 0b1..CPU access must be blocked + */ +#define FMUTEST_MCTL_COREHLD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_COREHLD_SHIFT)) & FMUTEST_MCTL_COREHLD_MASK) + +#define FMUTEST_MCTL_LSACT_EN_MASK (0x4U) +#define FMUTEST_MCTL_LSACT_EN_SHIFT (2U) +/*! LSACT_EN - LSACTIVE Feature Enable + * 0b0..LSACTIVE feature disabled completely: FCTRL[LSACTIVE] is forced low and no longer writable, LVE cannot assert at the TSMC array interface. + * 0b1..LSACTIVE feature fully enabled and controllable by SoC and internal UINT SM. + */ +#define FMUTEST_MCTL_LSACT_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_LSACT_EN_SHIFT)) & FMUTEST_MCTL_LSACT_EN_MASK) + +#define FMUTEST_MCTL_LSACTWREN_MASK (0x8U) +#define FMUTEST_MCTL_LSACTWREN_SHIFT (3U) +/*! LSACTWREN - LSACTIVE Write Enable + * 0b0..Unrestricted write access allowed + * 0b1..Write access while CMP set must match CMDDID and CMDPRT + */ +#define FMUTEST_MCTL_LSACTWREN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_LSACTWREN_SHIFT)) & FMUTEST_MCTL_LSACTWREN_MASK) + +#define FMUTEST_MCTL_MASTER_REPAIR_EN_MASK (0x10U) +#define FMUTEST_MCTL_MASTER_REPAIR_EN_SHIFT (4U) +/*! MASTER_REPAIR_EN - Master Repair Enable + * 0b0..Repair disabled + * 0b1..Repair enable determined by bit 0 of each REPAIR register + */ +#define FMUTEST_MCTL_MASTER_REPAIR_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_MASTER_REPAIR_EN_SHIFT)) & FMUTEST_MCTL_MASTER_REPAIR_EN_MASK) + +#define FMUTEST_MCTL_RFCMDEN_MASK (0x20U) +#define FMUTEST_MCTL_RFCMDEN_SHIFT (5U) +/*! RFCMDEN - RF Active Command Enable Control + * 0b0..Flash commands blocked (CCIF not writable) + * 0b1..Flash commands allowed + */ +#define FMUTEST_MCTL_RFCMDEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_RFCMDEN_SHIFT)) & FMUTEST_MCTL_RFCMDEN_MASK) + +#define FMUTEST_MCTL_CWSABTEN_MASK (0x40U) +#define FMUTEST_MCTL_CWSABTEN_SHIFT (6U) +/*! CWSABTEN - Command Write Sequence Abort Enable + * 0b0..CWS abort feature is disabled + * 0b1..CWS abort feature is enabled + */ +#define FMUTEST_MCTL_CWSABTEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_CWSABTEN_SHIFT)) & FMUTEST_MCTL_CWSABTEN_MASK) + +#define FMUTEST_MCTL_MRGRDDIS_MASK (0x80U) +#define FMUTEST_MCTL_MRGRDDIS_SHIFT (7U) +/*! MRGRDDIS - Margin Read Disable + * 0b0..Margin Read Settings are enabled + * 0b1..Margin Read Settings are disabled + */ +#define FMUTEST_MCTL_MRGRDDIS(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_MRGRDDIS_SHIFT)) & FMUTEST_MCTL_MRGRDDIS_MASK) + +#define FMUTEST_MCTL_MRGRD0_MASK (0xF00U) +#define FMUTEST_MCTL_MRGRD0_SHIFT (8U) +/*! MRGRD0 - Margin Read Setting for Program */ +#define FMUTEST_MCTL_MRGRD0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_MRGRD0_SHIFT)) & FMUTEST_MCTL_MRGRD0_MASK) + +#define FMUTEST_MCTL_MRGRD1_MASK (0xF000U) +#define FMUTEST_MCTL_MRGRD1_SHIFT (12U) +/*! MRGRD1 - Margin Read Setting for Erase */ +#define FMUTEST_MCTL_MRGRD1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_MRGRD1_SHIFT)) & FMUTEST_MCTL_MRGRD1_MASK) + +#define FMUTEST_MCTL_ERSAACK_MASK (0x10000U) +#define FMUTEST_MCTL_ERSAACK_SHIFT (16U) +/*! ERSAACK - Mass Erase (Erase All) Acknowledge + * 0b0..Mass Erase operation is not active (operation has completed or has not started) + * 0b1..Mass Erase operation is active (controller acknowledges that the soc_ersall_req input is asserted and will continue with the operation) + */ +#define FMUTEST_MCTL_ERSAACK(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_ERSAACK_SHIFT)) & FMUTEST_MCTL_ERSAACK_MASK) + +#define FMUTEST_MCTL_SCAN_OBS_MASK (0x80000U) +#define FMUTEST_MCTL_SCAN_OBS_SHIFT (19U) +/*! SCAN_OBS - Scan Observability Control + * 0b0..Normal functional behavior + * 0b1..Enables observation of signals that may otherwise be ATPG untestable + */ +#define FMUTEST_MCTL_SCAN_OBS(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_SCAN_OBS_SHIFT)) & FMUTEST_MCTL_SCAN_OBS_MASK) + +#define FMUTEST_MCTL_BIST_CTL_MASK (0x100000U) +#define FMUTEST_MCTL_BIST_CTL_SHIFT (20U) +/*! BIST_CTL - BIST IP Control + * 0b0..BIST IP disabled + * 0b1..BIST IP enabled + */ +#define FMUTEST_MCTL_BIST_CTL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_BIST_CTL_SHIFT)) & FMUTEST_MCTL_BIST_CTL_MASK) + +#define FMUTEST_MCTL_SMWR_CTL_MASK (0x200000U) +#define FMUTEST_MCTL_SMWR_CTL_SHIFT (21U) +/*! SMWR_CTL - SMWR IP Control + * 0b0..SMWR IP disabled + * 0b1..SMWR IP enabled + */ +#define FMUTEST_MCTL_SMWR_CTL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_SMWR_CTL_SHIFT)) & FMUTEST_MCTL_SMWR_CTL_MASK) + +#define FMUTEST_MCTL_SALV_DIS_MASK (0x1000000U) +#define FMUTEST_MCTL_SALV_DIS_SHIFT (24U) +/*! SALV_DIS - Salvage Disable + * 0b0..Salvage enabled (ECC used during erase verify) + * 0b1..Salvage disabled (ECC not used during erase verify) + */ +#define FMUTEST_MCTL_SALV_DIS(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_SALV_DIS_SHIFT)) & FMUTEST_MCTL_SALV_DIS_MASK) + +#define FMUTEST_MCTL_SOC_ECC_CTL_MASK (0x2000000U) +#define FMUTEST_MCTL_SOC_ECC_CTL_SHIFT (25U) +/*! SOC_ECC_CTL - SOC ECC Control + * 0b0..ECC is enabled for SOC read access + * 0b1..ECC is disabled for SOC read access + */ +#define FMUTEST_MCTL_SOC_ECC_CTL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_SOC_ECC_CTL_SHIFT)) & FMUTEST_MCTL_SOC_ECC_CTL_MASK) + +#define FMUTEST_MCTL_FMU_ECC_CTL_MASK (0x4000000U) +#define FMUTEST_MCTL_FMU_ECC_CTL_SHIFT (26U) +/*! FMU_ECC_CTL - FMU ECC Control + * 0b0..ECC is enabled for FMU program operations + * 0b1..ECC is disabled for FMU program operations + */ +#define FMUTEST_MCTL_FMU_ECC_CTL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_FMU_ECC_CTL_SHIFT)) & FMUTEST_MCTL_FMU_ECC_CTL_MASK) + +#define FMUTEST_MCTL_BIST_PWR_DIS_MASK (0x20000000U) +#define FMUTEST_MCTL_BIST_PWR_DIS_SHIFT (29U) +/*! BIST_PWR_DIS - BIST Power Mode Disable + * 0b0..BIST DFT logic has full control of SLM and LVE when BIST is enabled (including during commands) + * 0b1..BIST DFT logic has no control of SLM and LVE; power mode RTL is in complete control of SLM and LVE values + */ +#define FMUTEST_MCTL_BIST_PWR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_BIST_PWR_DIS_SHIFT)) & FMUTEST_MCTL_BIST_PWR_DIS_MASK) + +#define FMUTEST_MCTL_OSC_H_MASK (0x80000000U) +#define FMUTEST_MCTL_OSC_H_SHIFT (31U) +/*! OSC_H - Oscillator control + * 0b0..Use APB clock + * 0b1..Use a known fixed-frequency clock, e.g. 12 MHz + */ +#define FMUTEST_MCTL_OSC_H(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MCTL_OSC_H_SHIFT)) & FMUTEST_MCTL_OSC_H_MASK) +/*! @} */ + +/*! @name BSEL_GEN - FMU Block Select Generation Register */ +/*! @{ */ + +#define FMUTEST_BSEL_GEN_SBSEL_GEN_MASK (0x3U) +#define FMUTEST_BSEL_GEN_SBSEL_GEN_SHIFT (0U) +/*! SBSEL_GEN - Generated SBSEL */ +#define FMUTEST_BSEL_GEN_SBSEL_GEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BSEL_GEN_SBSEL_GEN_SHIFT)) & FMUTEST_BSEL_GEN_SBSEL_GEN_MASK) + +#define FMUTEST_BSEL_GEN_MBSEL_GEN_MASK (0x300U) +#define FMUTEST_BSEL_GEN_MBSEL_GEN_SHIFT (8U) +/*! MBSEL_GEN - Generated MBSEL */ +#define FMUTEST_BSEL_GEN_MBSEL_GEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BSEL_GEN_MBSEL_GEN_SHIFT)) & FMUTEST_BSEL_GEN_MBSEL_GEN_MASK) +/*! @} */ + +/*! @name PWR_OPT - Power Mode Options Register */ +/*! @{ */ + +#define FMUTEST_PWR_OPT_PD_CDIV_MASK (0xFFU) +#define FMUTEST_PWR_OPT_PD_CDIV_SHIFT (0U) +/*! PD_CDIV - Power Down Clock Divider Setting */ +#define FMUTEST_PWR_OPT_PD_CDIV(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_PWR_OPT_PD_CDIV_SHIFT)) & FMUTEST_PWR_OPT_PD_CDIV_MASK) + +#define FMUTEST_PWR_OPT_SLM_COUNT_MASK (0x3FF0000U) +#define FMUTEST_PWR_OPT_SLM_COUNT_SHIFT (16U) +/*! SLM_COUNT - Sleep Recovery Timer Count */ +#define FMUTEST_PWR_OPT_SLM_COUNT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_PWR_OPT_SLM_COUNT_SHIFT)) & FMUTEST_PWR_OPT_SLM_COUNT_MASK) + +#define FMUTEST_PWR_OPT_PD_TIMER_EN_MASK (0x80000000U) +#define FMUTEST_PWR_OPT_PD_TIMER_EN_SHIFT (31U) +/*! PD_TIMER_EN - Power Down BIST Timer Enable + * 0b0..BIST timer is not triggered during Power Down recovery + * 0b1..BIST timer is triggered during Power Down recovery (default behavior) + */ +#define FMUTEST_PWR_OPT_PD_TIMER_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_PWR_OPT_PD_TIMER_EN_SHIFT)) & FMUTEST_PWR_OPT_PD_TIMER_EN_MASK) +/*! @} */ + +/*! @name CMD_CHECK - FMU Command Check Register */ +/*! @{ */ + +#define FMUTEST_CMD_CHECK_ALIGNFAIL_PHR_MASK (0x1U) +#define FMUTEST_CMD_CHECK_ALIGNFAIL_PHR_SHIFT (0U) +/*! ALIGNFAIL_PHR - Phrase Alignment Fail + * 0b0..The address is phrase-aligned + * 0b1..The address is not phrase-aligned + */ +#define FMUTEST_CMD_CHECK_ALIGNFAIL_PHR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_ALIGNFAIL_PHR_SHIFT)) & FMUTEST_CMD_CHECK_ALIGNFAIL_PHR_MASK) + +#define FMUTEST_CMD_CHECK_ALIGNFAIL_PG_MASK (0x2U) +#define FMUTEST_CMD_CHECK_ALIGNFAIL_PG_SHIFT (1U) +/*! ALIGNFAIL_PG - Page Alignment Fail + * 0b0..The address is page-aligned + * 0b1..The address is not page-aligned + */ +#define FMUTEST_CMD_CHECK_ALIGNFAIL_PG(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_ALIGNFAIL_PG_SHIFT)) & FMUTEST_CMD_CHECK_ALIGNFAIL_PG_MASK) + +#define FMUTEST_CMD_CHECK_ALIGNFAIL_SCR_MASK (0x4U) +#define FMUTEST_CMD_CHECK_ALIGNFAIL_SCR_SHIFT (2U) +/*! ALIGNFAIL_SCR - Sector Alignment Fail + * 0b0..The address is sector-aligned + * 0b1..The address is not sector-aligned + */ +#define FMUTEST_CMD_CHECK_ALIGNFAIL_SCR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_ALIGNFAIL_SCR_SHIFT)) & FMUTEST_CMD_CHECK_ALIGNFAIL_SCR_MASK) + +#define FMUTEST_CMD_CHECK_ALIGNFAIL_BLK_MASK (0x8U) +#define FMUTEST_CMD_CHECK_ALIGNFAIL_BLK_SHIFT (3U) +/*! ALIGNFAIL_BLK - Block Alignment Fail + * 0b0..The address is block-aligned + * 0b1..The address is not block-aligned + */ +#define FMUTEST_CMD_CHECK_ALIGNFAIL_BLK(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_ALIGNFAIL_BLK_SHIFT)) & FMUTEST_CMD_CHECK_ALIGNFAIL_BLK_MASK) + +#define FMUTEST_CMD_CHECK_ADDR_FAIL_MASK (0x10U) +#define FMUTEST_CMD_CHECK_ADDR_FAIL_SHIFT (4U) +/*! ADDR_FAIL - Address Fail + * 0b0..The address is within the flash or IFR address space + * 0b1..The address is outside the flash or IFR address space + */ +#define FMUTEST_CMD_CHECK_ADDR_FAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_ADDR_FAIL_SHIFT)) & FMUTEST_CMD_CHECK_ADDR_FAIL_MASK) + +#define FMUTEST_CMD_CHECK_IFR_CMD_MASK (0x20U) +#define FMUTEST_CMD_CHECK_IFR_CMD_SHIFT (5U) +/*! IFR_CMD - IFR Command + * 0b0..The command operates on a main flash address + * 0b1..The command operates on an IFR address + */ +#define FMUTEST_CMD_CHECK_IFR_CMD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_IFR_CMD_SHIFT)) & FMUTEST_CMD_CHECK_IFR_CMD_MASK) + +#define FMUTEST_CMD_CHECK_ALL_CMD_MASK (0x40U) +#define FMUTEST_CMD_CHECK_ALL_CMD_SHIFT (6U) +/*! ALL_CMD - All Blocks Command + * 0b0..The command operates on a single flash block + * 0b1..The command operates on all flash blocks + */ +#define FMUTEST_CMD_CHECK_ALL_CMD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_ALL_CMD_SHIFT)) & FMUTEST_CMD_CHECK_ALL_CMD_MASK) + +#define FMUTEST_CMD_CHECK_RANGE_FAIL_MASK (0x80U) +#define FMUTEST_CMD_CHECK_RANGE_FAIL_SHIFT (7U) +/*! RANGE_FAIL - Address Range Fail + * 0b0..The address range is valid + * 0b1..The address range is invalid + */ +#define FMUTEST_CMD_CHECK_RANGE_FAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_RANGE_FAIL_SHIFT)) & FMUTEST_CMD_CHECK_RANGE_FAIL_MASK) + +#define FMUTEST_CMD_CHECK_SCR_ALIGN_CHK_MASK (0x100U) +#define FMUTEST_CMD_CHECK_SCR_ALIGN_CHK_SHIFT (8U) +/*! SCR_ALIGN_CHK - Sector Alignment Check + * 0b0..No sector alignment check + * 0b1..Sector alignment check + */ +#define FMUTEST_CMD_CHECK_SCR_ALIGN_CHK(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_SCR_ALIGN_CHK_SHIFT)) & FMUTEST_CMD_CHECK_SCR_ALIGN_CHK_MASK) + +#define FMUTEST_CMD_CHECK_OPTION_FAIL_MASK (0x200U) +#define FMUTEST_CMD_CHECK_OPTION_FAIL_SHIFT (9U) +/*! OPTION_FAIL - Option Check Fail + * 0b0..Option check passes for read command or command is not a read command + * 0b1..Option check fails for read command + */ +#define FMUTEST_CMD_CHECK_OPTION_FAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_OPTION_FAIL_SHIFT)) & FMUTEST_CMD_CHECK_OPTION_FAIL_MASK) + +#define FMUTEST_CMD_CHECK_ILLEGAL_CMD_MASK (0x400U) +#define FMUTEST_CMD_CHECK_ILLEGAL_CMD_SHIFT (10U) +/*! ILLEGAL_CMD - Illegal Command + * 0b0..Command is legal + * 0b1..Command is illegal + */ +#define FMUTEST_CMD_CHECK_ILLEGAL_CMD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_CMD_CHECK_ILLEGAL_CMD_SHIFT)) & FMUTEST_CMD_CHECK_ILLEGAL_CMD_MASK) +/*! @} */ + +/*! @name BSEL - FMU Block Select Register */ +/*! @{ */ + +#define FMUTEST_BSEL_SBSEL_MASK (0x3U) +#define FMUTEST_BSEL_SBSEL_SHIFT (0U) +/*! SBSEL - Slave Block Select */ +#define FMUTEST_BSEL_SBSEL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BSEL_SBSEL_SHIFT)) & FMUTEST_BSEL_SBSEL_MASK) + +#define FMUTEST_BSEL_MBSEL_MASK (0x300U) +#define FMUTEST_BSEL_MBSEL_SHIFT (8U) +/*! MBSEL - Master Block Select */ +#define FMUTEST_BSEL_MBSEL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BSEL_MBSEL_SHIFT)) & FMUTEST_BSEL_MBSEL_MASK) +/*! @} */ + +/*! @name MSIZE - FMU Memory Size Register */ +/*! @{ */ + +#define FMUTEST_MSIZE_MAXADDR0_MASK (0xFFU) +#define FMUTEST_MSIZE_MAXADDR0_SHIFT (0U) +/*! MAXADDR0 - Size of Flash Block 0 */ +#define FMUTEST_MSIZE_MAXADDR0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MSIZE_MAXADDR0_SHIFT)) & FMUTEST_MSIZE_MAXADDR0_MASK) +/*! @} */ + +/*! @name FLASH_RD_ADD - Flash Read Address Register */ +/*! @{ */ + +#define FMUTEST_FLASH_RD_ADD_FLASH_RD_ADD_MASK (0xFFFFFFFFU) +#define FMUTEST_FLASH_RD_ADD_FLASH_RD_ADD_SHIFT (0U) +/*! FLASH_RD_ADD - Flash Read Address */ +#define FMUTEST_FLASH_RD_ADD_FLASH_RD_ADD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FLASH_RD_ADD_FLASH_RD_ADD_SHIFT)) & FMUTEST_FLASH_RD_ADD_FLASH_RD_ADD_MASK) +/*! @} */ + +/*! @name FLASH_STOP_ADD - Flash Stop Address Register */ +/*! @{ */ + +#define FMUTEST_FLASH_STOP_ADD_FLASH_STOP_ADD_MASK (0xFFFFFFFFU) +#define FMUTEST_FLASH_STOP_ADD_FLASH_STOP_ADD_SHIFT (0U) +/*! FLASH_STOP_ADD - Flash Stop Address */ +#define FMUTEST_FLASH_STOP_ADD_FLASH_STOP_ADD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FLASH_STOP_ADD_FLASH_STOP_ADD_SHIFT)) & FMUTEST_FLASH_STOP_ADD_FLASH_STOP_ADD_MASK) +/*! @} */ + +/*! @name FLASH_RD_CTRL - Flash Read Control Register */ +/*! @{ */ + +#define FMUTEST_FLASH_RD_CTRL_FLASH_RD_MASK (0x1U) +#define FMUTEST_FLASH_RD_CTRL_FLASH_RD_SHIFT (0U) +/*! FLASH_RD - Flash Read Enable + * 0b0..Manual flash read not enabled.(default) + * 0b1..Manual flash read enabled + */ +#define FMUTEST_FLASH_RD_CTRL_FLASH_RD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FLASH_RD_CTRL_FLASH_RD_SHIFT)) & FMUTEST_FLASH_RD_CTRL_FLASH_RD_MASK) + +#define FMUTEST_FLASH_RD_CTRL_WIDE_LOAD_MASK (0x2U) +#define FMUTEST_FLASH_RD_CTRL_WIDE_LOAD_SHIFT (1U) +/*! WIDE_LOAD - Wide Load Enable + * 0b0..Wide load mode disabled (default) + * 0b1..Wide load mode enabled + */ +#define FMUTEST_FLASH_RD_CTRL_WIDE_LOAD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FLASH_RD_CTRL_WIDE_LOAD_SHIFT)) & FMUTEST_FLASH_RD_CTRL_WIDE_LOAD_MASK) + +#define FMUTEST_FLASH_RD_CTRL_SINGLE_RD_MASK (0x4U) +#define FMUTEST_FLASH_RD_CTRL_SINGLE_RD_SHIFT (2U) +/*! SINGLE_RD - Single Flash Read + * 0b0..Normal UINT operation + * 0b1..UINT configured for single cycle reads + */ +#define FMUTEST_FLASH_RD_CTRL_SINGLE_RD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FLASH_RD_CTRL_SINGLE_RD_SHIFT)) & FMUTEST_FLASH_RD_CTRL_SINGLE_RD_MASK) +/*! @} */ + +/*! @name MM_ADDR - Memory Map Address Register */ +/*! @{ */ + +#define FMUTEST_MM_ADDR_MM_ADDR_MASK (0xFFFFFFFFU) +#define FMUTEST_MM_ADDR_MM_ADDR_SHIFT (0U) +/*! MM_ADDR - Memory Map Address */ +#define FMUTEST_MM_ADDR_MM_ADDR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MM_ADDR_MM_ADDR_SHIFT)) & FMUTEST_MM_ADDR_MM_ADDR_MASK) +/*! @} */ + +/*! @name MM_WDATA - Memory Map Write Data Register */ +/*! @{ */ + +#define FMUTEST_MM_WDATA_MM_WDATA_MASK (0xFFFFFFFFU) +#define FMUTEST_MM_WDATA_MM_WDATA_SHIFT (0U) +/*! MM_WDATA - Memory Map Write Data */ +#define FMUTEST_MM_WDATA_MM_WDATA(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MM_WDATA_MM_WDATA_SHIFT)) & FMUTEST_MM_WDATA_MM_WDATA_MASK) +/*! @} */ + +/*! @name MM_CTL - Memory Map Control Register */ +/*! @{ */ + +#define FMUTEST_MM_CTL_MM_SEL_MASK (0x1U) +#define FMUTEST_MM_CTL_MM_SEL_SHIFT (0U) +/*! MM_SEL - Register Access Enable */ +#define FMUTEST_MM_CTL_MM_SEL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MM_CTL_MM_SEL_SHIFT)) & FMUTEST_MM_CTL_MM_SEL_MASK) + +#define FMUTEST_MM_CTL_MM_RD_MASK (0x2U) +#define FMUTEST_MM_CTL_MM_RD_SHIFT (1U) +/*! MM_RD - Register R/W Control + * 0b0..Write to register + * 0b1..Read register + */ +#define FMUTEST_MM_CTL_MM_RD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MM_CTL_MM_RD_SHIFT)) & FMUTEST_MM_CTL_MM_RD_MASK) + +#define FMUTEST_MM_CTL_BIST_ON_MASK (0x4U) +#define FMUTEST_MM_CTL_BIST_ON_SHIFT (2U) +/*! BIST_ON - BIST on + * 0b0..BIST enable not forced by user interface + * 0b1..BIST enable control by user interface + */ +#define FMUTEST_MM_CTL_BIST_ON(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MM_CTL_BIST_ON_SHIFT)) & FMUTEST_MM_CTL_BIST_ON_MASK) + +#define FMUTEST_MM_CTL_FORCE_SW_CLK_MASK (0x8U) +#define FMUTEST_MM_CTL_FORCE_SW_CLK_SHIFT (3U) +/*! FORCE_SW_CLK - Force Switch Clock + * 0b0..Switch clock not forced on (gated normally) + * 0b1..Switch clock forced on + */ +#define FMUTEST_MM_CTL_FORCE_SW_CLK(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MM_CTL_FORCE_SW_CLK_SHIFT)) & FMUTEST_MM_CTL_FORCE_SW_CLK_MASK) +/*! @} */ + +/*! @name UINT_CTL - User Interface Control Register */ +/*! @{ */ + +#define FMUTEST_UINT_CTL_SET_FAIL_MASK (0x1U) +#define FMUTEST_UINT_CTL_SET_FAIL_SHIFT (0U) +/*! SET_FAIL - Set Fail On Exit + * 0b0..FAIL flag should not be set on command exit (no failure detected) + * 0b1..FAIL flag should be set on command exit + */ +#define FMUTEST_UINT_CTL_SET_FAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_UINT_CTL_SET_FAIL_SHIFT)) & FMUTEST_UINT_CTL_SET_FAIL_MASK) + +#define FMUTEST_UINT_CTL_DBERR_MASK (0x2U) +#define FMUTEST_UINT_CTL_DBERR_SHIFT (1U) +/*! DBERR - Double-Bit ECC Fault Detect + * 0b0..No double-bit fault detected during UINT-driven read sequence + * 0b1..Double-bit fault detected during UINT-driven read sequence + */ +#define FMUTEST_UINT_CTL_DBERR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_UINT_CTL_DBERR_SHIFT)) & FMUTEST_UINT_CTL_DBERR_MASK) +/*! @} */ + +/*! @name RD_DATA0 - Read Data 0 Register */ +/*! @{ */ + +#define FMUTEST_RD_DATA0_RD_DATA0_MASK (0xFFFFFFFFU) +#define FMUTEST_RD_DATA0_RD_DATA0_SHIFT (0U) +/*! RD_DATA0 - Read Data 0 */ +#define FMUTEST_RD_DATA0_RD_DATA0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_DATA0_RD_DATA0_SHIFT)) & FMUTEST_RD_DATA0_RD_DATA0_MASK) +/*! @} */ + +/*! @name RD_DATA1 - Read Data 1 Register */ +/*! @{ */ + +#define FMUTEST_RD_DATA1_RD_DATA1_MASK (0xFFFFFFFFU) +#define FMUTEST_RD_DATA1_RD_DATA1_SHIFT (0U) +/*! RD_DATA1 - Read Data 1 */ +#define FMUTEST_RD_DATA1_RD_DATA1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_DATA1_RD_DATA1_SHIFT)) & FMUTEST_RD_DATA1_RD_DATA1_MASK) +/*! @} */ + +/*! @name RD_DATA2 - Read Data 2 Register */ +/*! @{ */ + +#define FMUTEST_RD_DATA2_RD_DATA2_MASK (0xFFFFFFFFU) +#define FMUTEST_RD_DATA2_RD_DATA2_SHIFT (0U) +/*! RD_DATA2 - Read Data 2 */ +#define FMUTEST_RD_DATA2_RD_DATA2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_DATA2_RD_DATA2_SHIFT)) & FMUTEST_RD_DATA2_RD_DATA2_MASK) +/*! @} */ + +/*! @name RD_DATA3 - Read Data 3 Register */ +/*! @{ */ + +#define FMUTEST_RD_DATA3_RD_DATA3_MASK (0xFFFFFFFFU) +#define FMUTEST_RD_DATA3_RD_DATA3_SHIFT (0U) +/*! RD_DATA3 - Read Data 3 */ +#define FMUTEST_RD_DATA3_RD_DATA3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_DATA3_RD_DATA3_SHIFT)) & FMUTEST_RD_DATA3_RD_DATA3_MASK) +/*! @} */ + +/*! @name PARITY - Parity Register */ +/*! @{ */ + +#define FMUTEST_PARITY_PARITY_MASK (0x1FFU) +#define FMUTEST_PARITY_PARITY_SHIFT (0U) +/*! PARITY - Read data [136:128] */ +#define FMUTEST_PARITY_PARITY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_PARITY_PARITY_SHIFT)) & FMUTEST_PARITY_PARITY_MASK) +/*! @} */ + +/*! @name RD_PATH_CTRL_STATUS - Read Path Control and Status Register */ +/*! @{ */ + +#define FMUTEST_RD_PATH_CTRL_STATUS_RD_CAPT_MASK (0xFFU) +#define FMUTEST_RD_PATH_CTRL_STATUS_RD_CAPT_SHIFT (0U) +/*! RD_CAPT - Read Capture Clock Periods */ +#define FMUTEST_RD_PATH_CTRL_STATUS_RD_CAPT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_RD_CAPT_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_RD_CAPT_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_SE_SIZE_MASK (0xFF00U) +#define FMUTEST_RD_PATH_CTRL_STATUS_SE_SIZE_SHIFT (8U) +/*! SE_SIZE - SE Clock Periods */ +#define FMUTEST_RD_PATH_CTRL_STATUS_SE_SIZE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_SE_SIZE_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_SE_SIZE_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_ECC_ENABLEB_MASK (0x10000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_ECC_ENABLEB_SHIFT (16U) +/*! ECC_ENABLEB - ECC Decoder Control + * 0b0..ECC decoder enabled (default) + * 0b1..ECC decoder disabled + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_ECC_ENABLEB(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_ECC_ENABLEB_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_ECC_ENABLEB_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_MISR_EN_MASK (0x20000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_MISR_EN_SHIFT (17U) +/*! MISR_EN - MISR Enable + * 0b0..MISR option disabled (default) + * 0b1..MISR option enabled + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_MISR_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_MISR_EN_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_MISR_EN_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_CPY_PAR_EN_MASK (0x40000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_CPY_PAR_EN_SHIFT (18U) +/*! CPY_PAR_EN - Copy Parity Enable + * 0b0..Copy parity disabled + * 0b1..Copy parity enabled + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_CPY_PAR_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_CPY_PAR_EN_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_CPY_PAR_EN_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_BIST_MUX_TO_SMW_MASK (0x80000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_BIST_MUX_TO_SMW_SHIFT (19U) +/*! BIST_MUX_TO_SMW - BIST Mux to SMW + * 0b0..BIST drives fields + * 0b1..SMW registers drive fields + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_BIST_MUX_TO_SMW(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_BIST_MUX_TO_SMW_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_BIST_MUX_TO_SMW_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_AD_SET_MASK (0xF00000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_AD_SET_SHIFT (20U) +/*! AD_SET - Multi-Cycle Address Setup Time */ +#define FMUTEST_RD_PATH_CTRL_STATUS_AD_SET(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_AD_SET_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_AD_SET_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_EN_MASK (0x1000000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_EN_SHIFT (24U) +/*! WR_PATH_EN - Write Path Enable + * 0b0..Writes to BIST setting registers driven by MM_WDATA + * 0b1..Writes to BIST setting registers driven by SMW_DIN + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_EN_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_EN_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_ECC_EN_MASK (0x2000000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_ECC_EN_SHIFT (25U) +/*! WR_PATH_ECC_EN - Write Path ECC Enable + * 0b0..ECC encoding disabled + * 0b1..ECC encoding enabled + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_ECC_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_ECC_EN_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_WR_PATH_ECC_EN_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_DBERR_REG_MASK (0x4000000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_DBERR_REG_SHIFT (26U) +/*! DBERR_REG - Double-Bit Error + * 0b0..Double-bit fault not detected + * 0b1..Double-bit fault detected on previous UINT flash read + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_DBERR_REG(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_DBERR_REG_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_DBERR_REG_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_SBERR_REG_MASK (0x8000000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_SBERR_REG_SHIFT (27U) +/*! SBERR_REG - Single-Bit Error + * 0b0..Single-bit fault not detected + * 0b1..Single-bit fault detected on previous UINT flash read + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_SBERR_REG(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_SBERR_REG_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_SBERR_REG_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_CPY_PHRASE_EN_MASK (0x10000000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_CPY_PHRASE_EN_SHIFT (28U) +/*! CPY_PHRASE_EN - Copy Phrase Enable + * 0b0..Copy Flash read data disabled + * 0b1..Copy Flash read data enabled + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_CPY_PHRASE_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_CPY_PHRASE_EN_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_CPY_PHRASE_EN_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_SMW_ARRAY1_SMW0_SEL_MASK (0x20000000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_SMW_ARRAY1_SMW0_SEL_SHIFT (29U) +/*! SMW_ARRAY1_SMW0_SEL - SMW_ARRAY1_SMW0_SEL + * 0b0..Select block 0 + * 0b1..Select block 1 + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_SMW_ARRAY1_SMW0_SEL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_SMW_ARRAY1_SMW0_SEL_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_SMW_ARRAY1_SMW0_SEL_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_BIST_ECC_EN_MASK (0x40000000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_BIST_ECC_EN_SHIFT (30U) +/*! BIST_ECC_EN - BIST ECC Enable + * 0b0..ECC correction disabled + * 0b1..ECC correction enabled + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_BIST_ECC_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_BIST_ECC_EN_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_BIST_ECC_EN_MASK) + +#define FMUTEST_RD_PATH_CTRL_STATUS_LAST_READ_MASK (0x80000000U) +#define FMUTEST_RD_PATH_CTRL_STATUS_LAST_READ_SHIFT (31U) +/*! LAST_READ - Last Read + * 0b0..Latest read not last in multi-address operation + * 0b1..Latest read last in multi-address operation + */ +#define FMUTEST_RD_PATH_CTRL_STATUS_LAST_READ(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_RD_PATH_CTRL_STATUS_LAST_READ_SHIFT)) & FMUTEST_RD_PATH_CTRL_STATUS_LAST_READ_MASK) +/*! @} */ + +/*! @name SMW_DIN0 - SMW DIN 0 Register */ +/*! @{ */ + +#define FMUTEST_SMW_DIN0_SMW_DIN0_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_DIN0_SMW_DIN0_SHIFT (0U) +/*! SMW_DIN0 - SMW DIN 0 */ +#define FMUTEST_SMW_DIN0_SMW_DIN0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_DIN0_SMW_DIN0_SHIFT)) & FMUTEST_SMW_DIN0_SMW_DIN0_MASK) +/*! @} */ + +/*! @name SMW_DIN1 - SMW DIN 1 Register */ +/*! @{ */ + +#define FMUTEST_SMW_DIN1_SMW_DIN1_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_DIN1_SMW_DIN1_SHIFT (0U) +/*! SMW_DIN1 - SMW DIN 1 */ +#define FMUTEST_SMW_DIN1_SMW_DIN1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_DIN1_SMW_DIN1_SHIFT)) & FMUTEST_SMW_DIN1_SMW_DIN1_MASK) +/*! @} */ + +/*! @name SMW_DIN2 - SMW DIN 2 Register */ +/*! @{ */ + +#define FMUTEST_SMW_DIN2_SMW_DIN2_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_DIN2_SMW_DIN2_SHIFT (0U) +/*! SMW_DIN2 - SMW DIN 2 */ +#define FMUTEST_SMW_DIN2_SMW_DIN2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_DIN2_SMW_DIN2_SHIFT)) & FMUTEST_SMW_DIN2_SMW_DIN2_MASK) +/*! @} */ + +/*! @name SMW_DIN3 - SMW DIN 3 Register */ +/*! @{ */ + +#define FMUTEST_SMW_DIN3_SMW_DIN3_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_DIN3_SMW_DIN3_SHIFT (0U) +/*! SMW_DIN3 - SMW DIN 3 */ +#define FMUTEST_SMW_DIN3_SMW_DIN3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_DIN3_SMW_DIN3_SHIFT)) & FMUTEST_SMW_DIN3_SMW_DIN3_MASK) +/*! @} */ + +/*! @name SMW_ADDR - SMW Address Register */ +/*! @{ */ + +#define FMUTEST_SMW_ADDR_SMW_ADDR_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_ADDR_SMW_ADDR_SHIFT (0U) +/*! SMW_ADDR - SMW Address */ +#define FMUTEST_SMW_ADDR_SMW_ADDR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_ADDR_SMW_ADDR_SHIFT)) & FMUTEST_SMW_ADDR_SMW_ADDR_MASK) +/*! @} */ + +/*! @name SMW_CMD_WAIT - SMW Command and Wait Register */ +/*! @{ */ + +#define FMUTEST_SMW_CMD_WAIT_CMD_MASK (0x7U) +#define FMUTEST_SMW_CMD_WAIT_CMD_SHIFT (0U) +/*! CMD - SMW Command + * 0b000..IDLE + * 0b001..ABORT + * 0b010..SME2 to one-shot mass erase + * 0b011..SME3 to sector erase on selected array + * 0b100..SMP1 to program phrase or page on selected array with shot disabled on previously programmed bit + * 0b101..Reserved for SME4 (multi-sector erase) + * 0b110..SMP2 to program phrase or page on selected array to repair cells of weak program after power loss + * 0b111..Reserved + */ +#define FMUTEST_SMW_CMD_WAIT_CMD(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_CMD_WAIT_CMD_SHIFT)) & FMUTEST_SMW_CMD_WAIT_CMD_MASK) + +#define FMUTEST_SMW_CMD_WAIT_WAIT_EN_MASK (0x8U) +#define FMUTEST_SMW_CMD_WAIT_WAIT_EN_SHIFT (3U) +/*! WAIT_EN - SMW Wait Enable + * 0b0..Wait feature disabled + * 0b1..Wait feature enabled + */ +#define FMUTEST_SMW_CMD_WAIT_WAIT_EN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_CMD_WAIT_WAIT_EN_SHIFT)) & FMUTEST_SMW_CMD_WAIT_WAIT_EN_MASK) + +#define FMUTEST_SMW_CMD_WAIT_WAIT_AUTO_SET_MASK (0x10U) +#define FMUTEST_SMW_CMD_WAIT_WAIT_AUTO_SET_SHIFT (4U) +/*! WAIT_AUTO_SET - SMW Wait Auto Set */ +#define FMUTEST_SMW_CMD_WAIT_WAIT_AUTO_SET(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_CMD_WAIT_WAIT_AUTO_SET_SHIFT)) & FMUTEST_SMW_CMD_WAIT_WAIT_AUTO_SET_MASK) +/*! @} */ + +/*! @name SMW_STATUS - SMW Status Register */ +/*! @{ */ + +#define FMUTEST_SMW_STATUS_SMW_ERR_MASK (0x1U) +#define FMUTEST_SMW_STATUS_SMW_ERR_SHIFT (0U) +/*! SMW_ERR - SMW Error + * 0b0..Error not detected + * 0b1..Error detected + */ +#define FMUTEST_SMW_STATUS_SMW_ERR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_STATUS_SMW_ERR_SHIFT)) & FMUTEST_SMW_STATUS_SMW_ERR_MASK) + +#define FMUTEST_SMW_STATUS_SMW_BUSY_MASK (0x2U) +#define FMUTEST_SMW_STATUS_SMW_BUSY_SHIFT (1U) +/*! SMW_BUSY - SMW Busy + * 0b0..SMW command not active + * 0b1..SMW command is active + */ +#define FMUTEST_SMW_STATUS_SMW_BUSY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_STATUS_SMW_BUSY_SHIFT)) & FMUTEST_SMW_STATUS_SMW_BUSY_MASK) + +#define FMUTEST_SMW_STATUS_BIST_BUSY_MASK (0x4U) +#define FMUTEST_SMW_STATUS_BIST_BUSY_SHIFT (2U) +/*! BIST_BUSY - BIST Busy + * 0b0..BIST Command not active + * 0b1..BIST Command is active + */ +#define FMUTEST_SMW_STATUS_BIST_BUSY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_STATUS_BIST_BUSY_SHIFT)) & FMUTEST_SMW_STATUS_BIST_BUSY_MASK) +/*! @} */ + +/*! @name SOCTRIM0_0 - SoC Trim Phrase 0 Word 0 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM0_0_TRIM0_0_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM0_0_TRIM0_0_SHIFT (0U) +/*! TRIM0_0 - TRIM0_0 */ +#define FMUTEST_SOCTRIM0_0_TRIM0_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM0_0_TRIM0_0_SHIFT)) & FMUTEST_SOCTRIM0_0_TRIM0_0_MASK) +/*! @} */ + +/*! @name SOCTRIM0_1 - SoC Trim Phrase 0 Word 1 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM0_1_TRIM0_1_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM0_1_TRIM0_1_SHIFT (0U) +/*! TRIM0_1 - TRIM0_1 */ +#define FMUTEST_SOCTRIM0_1_TRIM0_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM0_1_TRIM0_1_SHIFT)) & FMUTEST_SOCTRIM0_1_TRIM0_1_MASK) +/*! @} */ + +/*! @name SOCTRIM0_2 - SoC Trim Phrase 0 Word 2 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM0_2_TRIM0_2_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM0_2_TRIM0_2_SHIFT (0U) +/*! TRIM0_2 - TRIM0_2 */ +#define FMUTEST_SOCTRIM0_2_TRIM0_2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM0_2_TRIM0_2_SHIFT)) & FMUTEST_SOCTRIM0_2_TRIM0_2_MASK) +/*! @} */ + +/*! @name SOCTRIM0_3 - SoC Trim Phrase 0 Word 3 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM0_3_TRIM0_3_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM0_3_TRIM0_3_SHIFT (0U) +/*! TRIM0_3 - TRIM0_3 */ +#define FMUTEST_SOCTRIM0_3_TRIM0_3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM0_3_TRIM0_3_SHIFT)) & FMUTEST_SOCTRIM0_3_TRIM0_3_MASK) +/*! @} */ + +/*! @name SOCTRIM1_0 - SoC Trim Phrase 1 Word 0 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM1_0_TRIM1_0_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM1_0_TRIM1_0_SHIFT (0U) +/*! TRIM1_0 - TRIM1_0 */ +#define FMUTEST_SOCTRIM1_0_TRIM1_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM1_0_TRIM1_0_SHIFT)) & FMUTEST_SOCTRIM1_0_TRIM1_0_MASK) +/*! @} */ + +/*! @name SOCTRIM1_1 - SoC Trim Phrase 1 Word 1 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM1_1_TRIM1_1_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM1_1_TRIM1_1_SHIFT (0U) +/*! TRIM1_1 - TRIM1_1 */ +#define FMUTEST_SOCTRIM1_1_TRIM1_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM1_1_TRIM1_1_SHIFT)) & FMUTEST_SOCTRIM1_1_TRIM1_1_MASK) +/*! @} */ + +/*! @name SOCTRIM1_2 - SoC Trim Phrase 1 Word 2 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM1_2_TRIM1_2_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM1_2_TRIM1_2_SHIFT (0U) +/*! TRIM1_2 - TRIM1_2 */ +#define FMUTEST_SOCTRIM1_2_TRIM1_2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM1_2_TRIM1_2_SHIFT)) & FMUTEST_SOCTRIM1_2_TRIM1_2_MASK) +/*! @} */ + +/*! @name SOCTRIM1_3 - SoC Trim Phrase 1 Word 3 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM1_3_TRIM1_3_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM1_3_TRIM1_3_SHIFT (0U) +/*! TRIM1_3 - TRIM1_3 */ +#define FMUTEST_SOCTRIM1_3_TRIM1_3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM1_3_TRIM1_3_SHIFT)) & FMUTEST_SOCTRIM1_3_TRIM1_3_MASK) +/*! @} */ + +/*! @name SOCTRIM2_0 - SoC Trim Phrase 2 Word 0 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM2_0_TRIM2_0_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM2_0_TRIM2_0_SHIFT (0U) +/*! TRIM2_0 - TRIM2_0 */ +#define FMUTEST_SOCTRIM2_0_TRIM2_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM2_0_TRIM2_0_SHIFT)) & FMUTEST_SOCTRIM2_0_TRIM2_0_MASK) +/*! @} */ + +/*! @name SOCTRIM2_1 - SoC Trim Phrase 2 Word 1 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM2_1_TRIM2_1_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM2_1_TRIM2_1_SHIFT (0U) +/*! TRIM2_1 - TRIM2_1 */ +#define FMUTEST_SOCTRIM2_1_TRIM2_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM2_1_TRIM2_1_SHIFT)) & FMUTEST_SOCTRIM2_1_TRIM2_1_MASK) +/*! @} */ + +/*! @name SOCTRIM2_2 - SoC Trim Phrase 2 Word 2 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM2_2_TRIM2_2_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM2_2_TRIM2_2_SHIFT (0U) +/*! TRIM2_2 - TRIM2_2 */ +#define FMUTEST_SOCTRIM2_2_TRIM2_2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM2_2_TRIM2_2_SHIFT)) & FMUTEST_SOCTRIM2_2_TRIM2_2_MASK) +/*! @} */ + +/*! @name SOCTRIM2_3 - SoC Trim Phrase 2 Word 3 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM2_3_TRIM2_3_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM2_3_TRIM2_3_SHIFT (0U) +/*! TRIM2_3 - TRIM2_3 */ +#define FMUTEST_SOCTRIM2_3_TRIM2_3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM2_3_TRIM2_3_SHIFT)) & FMUTEST_SOCTRIM2_3_TRIM2_3_MASK) +/*! @} */ + +/*! @name SOCTRIM3_0 - SoC Trim Phrase 3 Word 0 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM3_0_TRIM3_0_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM3_0_TRIM3_0_SHIFT (0U) +/*! TRIM3_0 - TRIM3_0 */ +#define FMUTEST_SOCTRIM3_0_TRIM3_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM3_0_TRIM3_0_SHIFT)) & FMUTEST_SOCTRIM3_0_TRIM3_0_MASK) +/*! @} */ + +/*! @name SOCTRIM3_1 - SoC Trim Phrase 3 Word 1 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM3_1_TRIM3_1_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM3_1_TRIM3_1_SHIFT (0U) +/*! TRIM3_1 - TRIM3_1 */ +#define FMUTEST_SOCTRIM3_1_TRIM3_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM3_1_TRIM3_1_SHIFT)) & FMUTEST_SOCTRIM3_1_TRIM3_1_MASK) +/*! @} */ + +/*! @name SOCTRIM3_2 - SoC Trim Phrase 3 Word 2 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM3_2_TRIM3_2_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM3_2_TRIM3_2_SHIFT (0U) +/*! TRIM3_2 - TRIM3_2 */ +#define FMUTEST_SOCTRIM3_2_TRIM3_2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM3_2_TRIM3_2_SHIFT)) & FMUTEST_SOCTRIM3_2_TRIM3_2_MASK) +/*! @} */ + +/*! @name SOCTRIM3_3 - SoC Trim Phrase 3 Word 3 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM3_3_TRIM3_3_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM3_3_TRIM3_3_SHIFT (0U) +/*! TRIM3_3 - TRIM3_3 */ +#define FMUTEST_SOCTRIM3_3_TRIM3_3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM3_3_TRIM3_3_SHIFT)) & FMUTEST_SOCTRIM3_3_TRIM3_3_MASK) +/*! @} */ + +/*! @name SOCTRIM4_0 - SoC Trim Phrase 4 Word 0 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM4_0_TRIM4_0_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM4_0_TRIM4_0_SHIFT (0U) +/*! TRIM4_0 - TRIM4_0 */ +#define FMUTEST_SOCTRIM4_0_TRIM4_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM4_0_TRIM4_0_SHIFT)) & FMUTEST_SOCTRIM4_0_TRIM4_0_MASK) +/*! @} */ + +/*! @name SOCTRIM4_1 - SoC Trim Phrase 4 Word 1 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM4_1_TRIM4_1_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM4_1_TRIM4_1_SHIFT (0U) +/*! TRIM4_1 - TRIM4_1 */ +#define FMUTEST_SOCTRIM4_1_TRIM4_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM4_1_TRIM4_1_SHIFT)) & FMUTEST_SOCTRIM4_1_TRIM4_1_MASK) +/*! @} */ + +/*! @name SOCTRIM4_2 - SoC Trim Phrase 4 Word 2 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM4_2_TRIM4_2_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM4_2_TRIM4_2_SHIFT (0U) +/*! TRIM4_2 - TRIM4_2 */ +#define FMUTEST_SOCTRIM4_2_TRIM4_2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM4_2_TRIM4_2_SHIFT)) & FMUTEST_SOCTRIM4_2_TRIM4_2_MASK) +/*! @} */ + +/*! @name SOCTRIM4_3 - SoC Trim Phrase 4 Word 3 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM4_3_TRIM4_3_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM4_3_TRIM4_3_SHIFT (0U) +/*! TRIM4_3 - TRIM4_3 */ +#define FMUTEST_SOCTRIM4_3_TRIM4_3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM4_3_TRIM4_3_SHIFT)) & FMUTEST_SOCTRIM4_3_TRIM4_3_MASK) +/*! @} */ + +/*! @name SOCTRIM5_0 - SoC Trim Phrase 5 Word 0 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM5_0_TRIM5_0_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM5_0_TRIM5_0_SHIFT (0U) +/*! TRIM5_0 - TRIM5_0 */ +#define FMUTEST_SOCTRIM5_0_TRIM5_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM5_0_TRIM5_0_SHIFT)) & FMUTEST_SOCTRIM5_0_TRIM5_0_MASK) +/*! @} */ + +/*! @name SOCTRIM5_1 - SoC Trim Phrase 5 Word 1 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM5_1_TRIM5_1_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM5_1_TRIM5_1_SHIFT (0U) +/*! TRIM5_1 - TRIM5_1 */ +#define FMUTEST_SOCTRIM5_1_TRIM5_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM5_1_TRIM5_1_SHIFT)) & FMUTEST_SOCTRIM5_1_TRIM5_1_MASK) +/*! @} */ + +/*! @name SOCTRIM5_2 - SoC Trim Phrase 5 Word 2 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM5_2_TRIM5_2_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM5_2_TRIM5_2_SHIFT (0U) +/*! TRIM5_2 - TRIM5_2 */ +#define FMUTEST_SOCTRIM5_2_TRIM5_2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM5_2_TRIM5_2_SHIFT)) & FMUTEST_SOCTRIM5_2_TRIM5_2_MASK) +/*! @} */ + +/*! @name SOCTRIM5_3 - SoC Trim Phrase 5 Word 3 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM5_3_TRIM5_3_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM5_3_TRIM5_3_SHIFT (0U) +/*! TRIM5_3 - TRIM5_3 */ +#define FMUTEST_SOCTRIM5_3_TRIM5_3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM5_3_TRIM5_3_SHIFT)) & FMUTEST_SOCTRIM5_3_TRIM5_3_MASK) +/*! @} */ + +/*! @name SOCTRIM6_0 - SoC Trim Phrase 6 Word 0 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM6_0_TRIM6_0_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM6_0_TRIM6_0_SHIFT (0U) +/*! TRIM6_0 - TRIM6_0 */ +#define FMUTEST_SOCTRIM6_0_TRIM6_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM6_0_TRIM6_0_SHIFT)) & FMUTEST_SOCTRIM6_0_TRIM6_0_MASK) +/*! @} */ + +/*! @name SOCTRIM6_1 - SoC Trim Phrase 6 Word 1 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM6_1_TRIM6_1_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM6_1_TRIM6_1_SHIFT (0U) +/*! TRIM6_1 - TRIM6_1 */ +#define FMUTEST_SOCTRIM6_1_TRIM6_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM6_1_TRIM6_1_SHIFT)) & FMUTEST_SOCTRIM6_1_TRIM6_1_MASK) +/*! @} */ + +/*! @name SOCTRIM6_2 - SoC Trim Phrase 6 Word 2 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM6_2_TRIM6_2_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM6_2_TRIM6_2_SHIFT (0U) +/*! TRIM6_2 - TRIM6_2 */ +#define FMUTEST_SOCTRIM6_2_TRIM6_2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM6_2_TRIM6_2_SHIFT)) & FMUTEST_SOCTRIM6_2_TRIM6_2_MASK) +/*! @} */ + +/*! @name SOCTRIM6_3 - SoC Trim Phrase 6 Word 3 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM6_3_TRIM6_3_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM6_3_TRIM6_3_SHIFT (0U) +/*! TRIM6_3 - TRIM6_3 */ +#define FMUTEST_SOCTRIM6_3_TRIM6_3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM6_3_TRIM6_3_SHIFT)) & FMUTEST_SOCTRIM6_3_TRIM6_3_MASK) +/*! @} */ + +/*! @name SOCTRIM7_0 - SoC Trim Phrase 7 Word 0 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM7_0_TRIM7_0_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM7_0_TRIM7_0_SHIFT (0U) +/*! TRIM7_0 - TRIM7_0 */ +#define FMUTEST_SOCTRIM7_0_TRIM7_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM7_0_TRIM7_0_SHIFT)) & FMUTEST_SOCTRIM7_0_TRIM7_0_MASK) +/*! @} */ + +/*! @name SOCTRIM7_1 - SoC Trim Phrase 7 Word 1 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM7_1_TRIM7_1_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM7_1_TRIM7_1_SHIFT (0U) +/*! TRIM7_1 - TRIM7_1 */ +#define FMUTEST_SOCTRIM7_1_TRIM7_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM7_1_TRIM7_1_SHIFT)) & FMUTEST_SOCTRIM7_1_TRIM7_1_MASK) +/*! @} */ + +/*! @name SOCTRIM7_2 - SoC Trim Phrase 7 Word 2 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM7_2_TRIM7_2_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM7_2_TRIM7_2_SHIFT (0U) +/*! TRIM7_2 - TRIM7_2 */ +#define FMUTEST_SOCTRIM7_2_TRIM7_2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM7_2_TRIM7_2_SHIFT)) & FMUTEST_SOCTRIM7_2_TRIM7_2_MASK) +/*! @} */ + +/*! @name SOCTRIM7_3 - SoC Trim Phrase 7 Word 3 Register */ +/*! @{ */ + +#define FMUTEST_SOCTRIM7_3_TRIM7_3_MASK (0xFFFFFFFFU) +#define FMUTEST_SOCTRIM7_3_TRIM7_3_SHIFT (0U) +/*! TRIM7_3 - TRIM7_3 */ +#define FMUTEST_SOCTRIM7_3_TRIM7_3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SOCTRIM7_3_TRIM7_3_SHIFT)) & FMUTEST_SOCTRIM7_3_TRIM7_3_MASK) +/*! @} */ + +/*! @name R_IP_CONFIG - BIST Configuration Register */ +/*! @{ */ + +#define FMUTEST_R_IP_CONFIG_IPSEL0_MASK (0x3U) +#define FMUTEST_R_IP_CONFIG_IPSEL0_SHIFT (0U) +/*! IPSEL0 - Block 0 Select Control + * 0b00..Unselect block 0 + * 0b01..not used, reserved + * 0b10..Enable block 0 test, repair off (default) + * 0b11..Enable block 0 test, repair on + */ +#define FMUTEST_R_IP_CONFIG_IPSEL0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_IPSEL0_SHIFT)) & FMUTEST_R_IP_CONFIG_IPSEL0_MASK) + +#define FMUTEST_R_IP_CONFIG_IPSEL1_MASK (0xCU) +#define FMUTEST_R_IP_CONFIG_IPSEL1_SHIFT (2U) +/*! IPSEL1 - Block 1 Select Control + * 0b00..Unselect block 1 + * 0b01..not used, reserved + * 0b10..Enable block 1 test, repair off (default) + * 0b11..Enable block 1 test, repair on + */ +#define FMUTEST_R_IP_CONFIG_IPSEL1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_IPSEL1_SHIFT)) & FMUTEST_R_IP_CONFIG_IPSEL1_MASK) + +#define FMUTEST_R_IP_CONFIG_BIST_CDIVL_MASK (0xFF0U) +#define FMUTEST_R_IP_CONFIG_BIST_CDIVL_SHIFT (4U) +/*! BIST_CDIVL - Clock Divide Scalar for Long Pulse */ +#define FMUTEST_R_IP_CONFIG_BIST_CDIVL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_BIST_CDIVL_SHIFT)) & FMUTEST_R_IP_CONFIG_BIST_CDIVL_MASK) + +#define FMUTEST_R_IP_CONFIG_CDIVS_MASK (0x7000U) +#define FMUTEST_R_IP_CONFIG_CDIVS_SHIFT (12U) +/*! CDIVS - Number of clock cycles to generate short pulse */ +#define FMUTEST_R_IP_CONFIG_CDIVS(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_CDIVS_SHIFT)) & FMUTEST_R_IP_CONFIG_CDIVS_MASK) + +#define FMUTEST_R_IP_CONFIG_BIST_TVFY_MASK (0xF8000U) +#define FMUTEST_R_IP_CONFIG_BIST_TVFY_SHIFT (15U) +/*! BIST_TVFY - Timer adjust for verify */ +#define FMUTEST_R_IP_CONFIG_BIST_TVFY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_BIST_TVFY_SHIFT)) & FMUTEST_R_IP_CONFIG_BIST_TVFY_MASK) + +#define FMUTEST_R_IP_CONFIG_TSTCTL_MASK (0x300000U) +#define FMUTEST_R_IP_CONFIG_TSTCTL_SHIFT (20U) +/*! TSTCTL - BIST self-test control + * 0b00..Default, disable both BIST self-test and MISR + * 0b01..Enable BIST self-test mode DOUT from macro will be forced to '0', and disable MISR. + * 0b10..Enable MISR + * 0b11..Enable both BIST self-test mode and MISR + */ +#define FMUTEST_R_IP_CONFIG_TSTCTL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_TSTCTL_SHIFT)) & FMUTEST_R_IP_CONFIG_TSTCTL_MASK) + +#define FMUTEST_R_IP_CONFIG_DBGCTL_MASK (0x400000U) +#define FMUTEST_R_IP_CONFIG_DBGCTL_SHIFT (22U) +/*! DBGCTL - Debug feature control + * 0b0..Default + * 0b1..Enable debug feature to collect failure address and data. + */ +#define FMUTEST_R_IP_CONFIG_DBGCTL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_DBGCTL_SHIFT)) & FMUTEST_R_IP_CONFIG_DBGCTL_MASK) + +#define FMUTEST_R_IP_CONFIG_BIST_CLK_SEL_MASK (0x800000U) +#define FMUTEST_R_IP_CONFIG_BIST_CLK_SEL_SHIFT (23U) +/*! BIST_CLK_SEL - BIST Clock Select */ +#define FMUTEST_R_IP_CONFIG_BIST_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_BIST_CLK_SEL_SHIFT)) & FMUTEST_R_IP_CONFIG_BIST_CLK_SEL_MASK) + +#define FMUTEST_R_IP_CONFIG_SMWTST_MASK (0x3000000U) +#define FMUTEST_R_IP_CONFIG_SMWTST_SHIFT (24U) +/*! SMWTST - SMWR DOUT Function Control + * 0b00..Default + * 0b01..Enable SMWR self-test mode, DOUT from macro will be forced to all 0 + * 0b10..Enable SMWR self-test mode, DOUT from macro will be forced to all 1 + * 0b11..Reserved (unused) + */ +#define FMUTEST_R_IP_CONFIG_SMWTST(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_SMWTST_SHIFT)) & FMUTEST_R_IP_CONFIG_SMWTST_MASK) + +#define FMUTEST_R_IP_CONFIG_ECCEN_MASK (0x4000000U) +#define FMUTEST_R_IP_CONFIG_ECCEN_SHIFT (26U) +/*! ECCEN - BIST ECC Control + * 0b0..Default mode (no ECC encode or decode) + * 0b1..Enable ECC encode/decode + */ +#define FMUTEST_R_IP_CONFIG_ECCEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_IP_CONFIG_ECCEN_SHIFT)) & FMUTEST_R_IP_CONFIG_ECCEN_MASK) +/*! @} */ + +/*! @name R_TESTCODE - BIST Test Code Register */ +/*! @{ */ + +#define FMUTEST_R_TESTCODE_TESTCODE_MASK (0x3FU) +#define FMUTEST_R_TESTCODE_TESTCODE_SHIFT (0U) +/*! TESTCODE - Used to store test code information before running TMR-RST/TMRSET BIST command */ +#define FMUTEST_R_TESTCODE_TESTCODE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TESTCODE_TESTCODE_SHIFT)) & FMUTEST_R_TESTCODE_TESTCODE_MASK) +/*! @} */ + +/*! @name R_DFT_CTRL - BIST DFT Control Register */ +/*! @{ */ + +#define FMUTEST_R_DFT_CTRL_DFT_XADR_MASK (0xFU) +#define FMUTEST_R_DFT_CTRL_DFT_XADR_SHIFT (0U) +/*! DFT_XADR - DFT XADR Pattern + * 0b0000..XADR fixed, no change at all + * 0b0001..XADR increased by 1 after row. For READ operation, XADR increases by 1 after reading the last word of + * row. For PROG operation, XADR increases by 1 after NVSTR falls. + * 0b0010..XADR increased for diagonal. For PROG-DIAGONAL operation, XADR is increased to create diagonal pattern. + * 0b0011..XADR increased by sector. During ERASE operation, XADR increased by number of rows in a sector when NVSTR falls. + * 0b0100..XADR inversed. XADR is inversed after reading one word or after programming one row when NVSTR falls. + * 0b0101..XADR increased by 2 after row. For READ operation, XADR is increased by 2 after reading the last word + * of a row. For PROG operation, XADR is increased by 2 when NVSTR falls. + * 0b0110..XADR[0] inversed. XADR[0] is inversed after reading one word or after programming one row when NVSTR falls. + * 0b0111..XADR increased by 1. For READ operations only, XADR increased by 1 after each read cycle. + * 0b1000..XADR decreased by 1 after row. For READ operations only, XADR is decreased by 1 after YADR decreases to 0. + * 0b1001..XADR decreased by 1. For READ operations only, XADR is decreased by 1 after each read cycle. + */ +#define FMUTEST_R_DFT_CTRL_DFT_XADR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DFT_CTRL_DFT_XADR_SHIFT)) & FMUTEST_R_DFT_CTRL_DFT_XADR_MASK) + +#define FMUTEST_R_DFT_CTRL_DFT_YADR_MASK (0xF0U) +#define FMUTEST_R_DFT_CTRL_DFT_YADR_SHIFT (4U) +/*! DFT_YADR - DFT YADR Pattern + * 0b0000..YADR fixed, no change at all + * 0b0001..YADR for ICKBD. For PROG and READ operations, YADR changed to generate inverse checkerboard pattern. + * 0b0010..YADR for CKBD. For PROG and READ operations, YADR changed to generate checkerboard pattern. + * 0b0011..YADR increased by 1. For READ operations, YADR increased by 1 after each read cycle. For PROG + * operations, YADR increased by 1 after YE falls. + * 0b0100..YADR increased for diagonal. For PROG-DIAGONAL operation, YADR is increased to create diagonal pattern. + * 0b0101..YADR inversed. YADR is inversed after reading one word or after programming one word when YE falls. + * 0b0110..YADR[0] inversed. YADR[0] is inversed after reading one word or after programming one word when YE falls. + * 0b0111..YADR increased by 1 after last row. For READ operations only, YADR is increased by 1 after XADR reaches last row. + * 0b1000..YADR decreased by 1. For READ operations only, YADR is decreased by 1 after each read cycle. + * 0b1001..YADR decreased by 1 after first row. For READ operations only, YADR is decreased by 1 after XADR decreases to 0. + */ +#define FMUTEST_R_DFT_CTRL_DFT_YADR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DFT_CTRL_DFT_YADR_SHIFT)) & FMUTEST_R_DFT_CTRL_DFT_YADR_MASK) + +#define FMUTEST_R_DFT_CTRL_DFT_DATA_MASK (0xF00U) +#define FMUTEST_R_DFT_CTRL_DFT_DATA_SHIFT (8U) +/*! DFT_DATA - DFT Data Pattern + * 0b0000..CKBD pattern. For READ operations only, compare DOUT with checkerboard data pattern for each read cycle. + * 0b0001..ICKBD pattern. For READ operations only, compare DOUT with inverse checkerboard data pattern for each read cycle. + * 0b0010..Diagonal pattern. Used for READ operations only, compare DOUT to diagonal pattern. + * 0b0011..Fixed data pattern. For READ operations, comparison to DOUT for selected groups; refer to + * R_ADR_CTRL[GRPSEL] for modules with multiple groups. + * 0b0100..Random data pattern which will be generated based on the initial seed set in R_DATA; for READ + * operations, used for DOUT comparison of selected groups. For PROG operations, used to control DIN of selected + * groups. + * 0b0101..DOUT based pattern. For READ operations only, DOUT of selected group will be latched in R_DATA. If + * more than one group is selected in R_ADR_CTRL[GRPSEL], the group with the lower index will be latched. + * 0b0110..R_DATA based pattern. For READ operations, expected DOUT value of selected groups equals to R_DATA + * when XADR[0]==YADR[0] or ~R_DATA when XADR[0]!=YADR[0]. For PROG operations, DIN of selected groups equals + * R_DATA when XADR[0]==YADR[0] or ~R_DATA when XADR[0]!=YADR[0]. + * 0b0111..SCAN-IO pattern. For READ operations, control expected DOUT value of selected groups to SCAN-IO data + * pattern. For PROG operations, control DIN of selected groups to SCAN-IO data pattern. + * 0b1000..REPAIR set. For PROG operation to IFR1(7,1) and IFR1(7,2), R_REPAIR0_0 and R_REPAIR0_1 or R_REPAIR1_0 + * and R_REPAIR1_1 will control DIN. For READ operation on IFR1(7,1) and IFR1(7,2), DOUT will be compared + * against R_REPAIR0_0 and R_REPAIR0_1 or R_REPAIR1_0 andR_REPAIR1_1. When this option is selected, only + * one flash block can be selected. + * 0b1001..REPAIR load. For READ operation only, DOUT from IFR1(7,1) and IFR1(7,2) is loaded to R_REPAIR0 and R_REPAIR1. + */ +#define FMUTEST_R_DFT_CTRL_DFT_DATA(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DFT_CTRL_DFT_DATA_SHIFT)) & FMUTEST_R_DFT_CTRL_DFT_DATA_MASK) + +#define FMUTEST_R_DFT_CTRL_CMP_MASK_MASK (0x3000U) +#define FMUTEST_R_DFT_CTRL_CMP_MASK_SHIFT (12U) +/*! CMP_MASK - Data Compare Mask + * 0b00..Expected data is compared to DOUT + * 0b01..Expected data (only 0s are considered) are compared to DOUT + * 0b10..Expected data (only 1s are considered) are compared to DOUT + */ +#define FMUTEST_R_DFT_CTRL_CMP_MASK(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DFT_CTRL_CMP_MASK_SHIFT)) & FMUTEST_R_DFT_CTRL_CMP_MASK_MASK) + +#define FMUTEST_R_DFT_CTRL_DFT_DATA_SRC_MASK (0x4000U) +#define FMUTEST_R_DFT_CTRL_DFT_DATA_SRC_SHIFT (14U) +/*! DFT_DATA_SRC - DFT Data Source + * 0b0..{R_DATA_CTRL0,R_DATA_CTRL_EX[2:0],R_DATA_CTRL0,R_DATA_CTRL_EX[2:0],R_DATA_CTRL0,R_DATA_CTRL_EX[2:0],R_DATA_CTRL0} is used + * 0b1..{R_DATA_CTRL3,R_DATA_CTRL2_EX[2:0],R_DATA_CTRL2,R_DATA_CTRL1_EX[2:0],R_DATA_CTRL1,R_DATA_CTRL_EX[2:0],R_DATA_CTRL0} is used + */ +#define FMUTEST_R_DFT_CTRL_DFT_DATA_SRC(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DFT_CTRL_DFT_DATA_SRC_SHIFT)) & FMUTEST_R_DFT_CTRL_DFT_DATA_SRC_MASK) +/*! @} */ + +/*! @name R_ADR_CTRL - BIST Address Control Register */ +/*! @{ */ + +#define FMUTEST_R_ADR_CTRL_GRPSEL_MASK (0xFU) +#define FMUTEST_R_ADR_CTRL_GRPSEL_SHIFT (0U) +/*! GRPSEL - Data Group Select + * 0b0000..Select no data + * 0b0001..Select data slice [34:0] + * 0b0010..Select data slice [69:35] + * 0b0100..Select data slice [104:70] + * 0b1000..Select data slice [136:105] + * 0b1111..Select data [136:0] + */ +#define FMUTEST_R_ADR_CTRL_GRPSEL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_ADR_CTRL_GRPSEL_SHIFT)) & FMUTEST_R_ADR_CTRL_GRPSEL_MASK) + +#define FMUTEST_R_ADR_CTRL_XADR_MASK (0xFFF0U) +#define FMUTEST_R_ADR_CTRL_XADR_SHIFT (4U) +/*! XADR - BIST XADR */ +#define FMUTEST_R_ADR_CTRL_XADR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_ADR_CTRL_XADR_SHIFT)) & FMUTEST_R_ADR_CTRL_XADR_MASK) + +#define FMUTEST_R_ADR_CTRL_YADR_MASK (0x1F0000U) +#define FMUTEST_R_ADR_CTRL_YADR_SHIFT (16U) +/*! YADR - BIST YADR */ +#define FMUTEST_R_ADR_CTRL_YADR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_ADR_CTRL_YADR_SHIFT)) & FMUTEST_R_ADR_CTRL_YADR_MASK) + +#define FMUTEST_R_ADR_CTRL_PROG_ATTR_MASK (0xE00000U) +#define FMUTEST_R_ADR_CTRL_PROG_ATTR_SHIFT (21U) +/*! PROG_ATTR - Program Attribute + * 0b000..One YE pulse will program one data slice group + * 0b001..One YE pulse will program two data slice groups + * 0b010..One YE pulse will program three data slice groups (reserved) + * 0b011..One YE pulse will program four data slice groups + * 0b100..One YE pulse will program five data slice groups (reserved) + * 0b101..One YE pulse will program six data slice groups (reserved) + * 0b110..One YE pulse will program seven data slice groups (reserved) + * 0b111..One YE pulse will program eight data slice groups (reserved) + */ +#define FMUTEST_R_ADR_CTRL_PROG_ATTR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_ADR_CTRL_PROG_ATTR_SHIFT)) & FMUTEST_R_ADR_CTRL_PROG_ATTR_MASK) +/*! @} */ + +/*! @name R_DATA_CTRL0 - BIST Data Control 0 Register */ +/*! @{ */ + +#define FMUTEST_R_DATA_CTRL0_DATA0_MASK (0xFFFFFFFFU) +#define FMUTEST_R_DATA_CTRL0_DATA0_SHIFT (0U) +/*! DATA0 - BIST Data 0 Low */ +#define FMUTEST_R_DATA_CTRL0_DATA0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DATA_CTRL0_DATA0_SHIFT)) & FMUTEST_R_DATA_CTRL0_DATA0_MASK) +/*! @} */ + +/*! @name R_PIN_CTRL - BIST Pin Control Register */ +/*! @{ */ + +#define FMUTEST_R_PIN_CTRL_MAS1_MASK (0x1U) +#define FMUTEST_R_PIN_CTRL_MAS1_SHIFT (0U) +/*! MAS1 - Mass Erase */ +#define FMUTEST_R_PIN_CTRL_MAS1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_MAS1_SHIFT)) & FMUTEST_R_PIN_CTRL_MAS1_MASK) + +#define FMUTEST_R_PIN_CTRL_IFREN_MASK (0x2U) +#define FMUTEST_R_PIN_CTRL_IFREN_SHIFT (1U) +/*! IFREN - IFR Enable */ +#define FMUTEST_R_PIN_CTRL_IFREN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_IFREN_SHIFT)) & FMUTEST_R_PIN_CTRL_IFREN_MASK) + +#define FMUTEST_R_PIN_CTRL_IFREN1_MASK (0x4U) +#define FMUTEST_R_PIN_CTRL_IFREN1_SHIFT (2U) +/*! IFREN1 - IFR1 Enable */ +#define FMUTEST_R_PIN_CTRL_IFREN1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_IFREN1_SHIFT)) & FMUTEST_R_PIN_CTRL_IFREN1_MASK) + +#define FMUTEST_R_PIN_CTRL_REDEN_MASK (0x8U) +#define FMUTEST_R_PIN_CTRL_REDEN_SHIFT (3U) +/*! REDEN - Redundancy Block Enable */ +#define FMUTEST_R_PIN_CTRL_REDEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_REDEN_SHIFT)) & FMUTEST_R_PIN_CTRL_REDEN_MASK) + +#define FMUTEST_R_PIN_CTRL_LVE_MASK (0x10U) +#define FMUTEST_R_PIN_CTRL_LVE_SHIFT (4U) +/*! LVE - Low Voltage Enable */ +#define FMUTEST_R_PIN_CTRL_LVE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_LVE_SHIFT)) & FMUTEST_R_PIN_CTRL_LVE_MASK) + +#define FMUTEST_R_PIN_CTRL_PV_MASK (0x20U) +#define FMUTEST_R_PIN_CTRL_PV_SHIFT (5U) +/*! PV - Program Verify Enable */ +#define FMUTEST_R_PIN_CTRL_PV(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_PV_SHIFT)) & FMUTEST_R_PIN_CTRL_PV_MASK) + +#define FMUTEST_R_PIN_CTRL_EV_MASK (0x40U) +#define FMUTEST_R_PIN_CTRL_EV_SHIFT (6U) +/*! EV - Erase Verify Enable */ +#define FMUTEST_R_PIN_CTRL_EV(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_EV_SHIFT)) & FMUTEST_R_PIN_CTRL_EV_MASK) + +#define FMUTEST_R_PIN_CTRL_WIPGM_MASK (0x180U) +#define FMUTEST_R_PIN_CTRL_WIPGM_SHIFT (7U) +/*! WIPGM - Program Current */ +#define FMUTEST_R_PIN_CTRL_WIPGM(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_WIPGM_SHIFT)) & FMUTEST_R_PIN_CTRL_WIPGM_MASK) + +#define FMUTEST_R_PIN_CTRL_WHV_MASK (0x1E00U) +#define FMUTEST_R_PIN_CTRL_WHV_SHIFT (9U) +/*! WHV - High Voltage Level */ +#define FMUTEST_R_PIN_CTRL_WHV(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_WHV_SHIFT)) & FMUTEST_R_PIN_CTRL_WHV_MASK) + +#define FMUTEST_R_PIN_CTRL_WMV_MASK (0xE000U) +#define FMUTEST_R_PIN_CTRL_WMV_SHIFT (13U) +/*! WMV - Medium Voltage Level */ +#define FMUTEST_R_PIN_CTRL_WMV(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_WMV_SHIFT)) & FMUTEST_R_PIN_CTRL_WMV_MASK) + +#define FMUTEST_R_PIN_CTRL_XE_MASK (0x10000U) +#define FMUTEST_R_PIN_CTRL_XE_SHIFT (16U) +/*! XE - X Address Enable */ +#define FMUTEST_R_PIN_CTRL_XE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_XE_SHIFT)) & FMUTEST_R_PIN_CTRL_XE_MASK) + +#define FMUTEST_R_PIN_CTRL_YE_MASK (0x20000U) +#define FMUTEST_R_PIN_CTRL_YE_SHIFT (17U) +/*! YE - Y Address Enable */ +#define FMUTEST_R_PIN_CTRL_YE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_YE_SHIFT)) & FMUTEST_R_PIN_CTRL_YE_MASK) + +#define FMUTEST_R_PIN_CTRL_SE_MASK (0x40000U) +#define FMUTEST_R_PIN_CTRL_SE_SHIFT (18U) +/*! SE - Sense Amp Enable */ +#define FMUTEST_R_PIN_CTRL_SE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_SE_SHIFT)) & FMUTEST_R_PIN_CTRL_SE_MASK) + +#define FMUTEST_R_PIN_CTRL_ERASE_MASK (0x80000U) +#define FMUTEST_R_PIN_CTRL_ERASE_SHIFT (19U) +/*! ERASE - Erase Mode */ +#define FMUTEST_R_PIN_CTRL_ERASE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_ERASE_SHIFT)) & FMUTEST_R_PIN_CTRL_ERASE_MASK) + +#define FMUTEST_R_PIN_CTRL_PROG_MASK (0x100000U) +#define FMUTEST_R_PIN_CTRL_PROG_SHIFT (20U) +/*! PROG - Program Mode */ +#define FMUTEST_R_PIN_CTRL_PROG(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_PROG_SHIFT)) & FMUTEST_R_PIN_CTRL_PROG_MASK) + +#define FMUTEST_R_PIN_CTRL_NVSTR_MASK (0x200000U) +#define FMUTEST_R_PIN_CTRL_NVSTR_SHIFT (21U) +/*! NVSTR - NVM Store */ +#define FMUTEST_R_PIN_CTRL_NVSTR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_NVSTR_SHIFT)) & FMUTEST_R_PIN_CTRL_NVSTR_MASK) + +#define FMUTEST_R_PIN_CTRL_SLM_MASK (0x400000U) +#define FMUTEST_R_PIN_CTRL_SLM_SHIFT (22U) +/*! SLM - Sleep Mode Enable */ +#define FMUTEST_R_PIN_CTRL_SLM(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_SLM_SHIFT)) & FMUTEST_R_PIN_CTRL_SLM_MASK) + +#define FMUTEST_R_PIN_CTRL_RECALL_MASK (0x800000U) +#define FMUTEST_R_PIN_CTRL_RECALL_SHIFT (23U) +/*! RECALL - Recall Trim Code */ +#define FMUTEST_R_PIN_CTRL_RECALL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_RECALL_SHIFT)) & FMUTEST_R_PIN_CTRL_RECALL_MASK) + +#define FMUTEST_R_PIN_CTRL_HEM_MASK (0x1000000U) +#define FMUTEST_R_PIN_CTRL_HEM_SHIFT (24U) +/*! HEM - HEM Control */ +#define FMUTEST_R_PIN_CTRL_HEM(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_PIN_CTRL_HEM_SHIFT)) & FMUTEST_R_PIN_CTRL_HEM_MASK) +/*! @} */ + +/*! @name R_CNT_LOOP_CTRL - BIST Loop Count Control Register */ +/*! @{ */ + +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPCNT_MASK (0xFFFU) +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPCNT_SHIFT (0U) +/*! LOOPCNT - Loop Count Control */ +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPCNT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_CNT_LOOP_CTRL_LOOPCNT_SHIFT)) & FMUTEST_R_CNT_LOOP_CTRL_LOOPCNT_MASK) + +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPOPT_MASK (0x7000U) +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPOPT_SHIFT (12U) +/*! LOOPOPT - Loop Option + * 0b000..Loop is disabled; selected BIST operation is run once + * 0b001..Loop is enabled; XADR increments by 1 XADR increments by 1 for each new loop. Stops when total loop count meets LOOPCNT+1. + * 0b010..Loop is enabled; YADR increments by 1 YADR increments by 1 for each new loop. Stops when total loop count meets LOOPCNT+1. + * 0b011..Loop is enabled; XADR increments by 2 XADR increments by 2 for each new loop. Stops when total loop count meets LOOPCNT+1. + * 0b100..Loop is enabled; XADR increments by sector XADR increments by 16 for each new loop. Stops when total loop count meets LOOPCNT+1. + */ +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPOPT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_CNT_LOOP_CTRL_LOOPOPT_SHIFT)) & FMUTEST_R_CNT_LOOP_CTRL_LOOPOPT_MASK) + +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPUNIT_MASK (0x38000U) +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPUNIT_SHIFT (15U) +/*! LOOPUNIT - Loop Time Unit + * 0b000..Clock cycles + * 0b001..0.5 usec + * 0b010..1 usec + * 0b011..10 usec + * 0b100..100 usec + * 0b101..1 msec + * 0b110..10 msec + * 0b111..100 msec + */ +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPUNIT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_CNT_LOOP_CTRL_LOOPUNIT_SHIFT)) & FMUTEST_R_CNT_LOOP_CTRL_LOOPUNIT_MASK) + +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPDLY_MASK (0x1FC0000U) +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPDLY_SHIFT (18U) +/*! LOOPDLY - Loop Time Delay Scalar */ +#define FMUTEST_R_CNT_LOOP_CTRL_LOOPDLY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_CNT_LOOP_CTRL_LOOPDLY_SHIFT)) & FMUTEST_R_CNT_LOOP_CTRL_LOOPDLY_MASK) +/*! @} */ + +/*! @name R_TIMER_CTRL - BIST Timer Control Register */ +/*! @{ */ + +#define FMUTEST_R_TIMER_CTRL_TNVSUNIT_MASK (0x7U) +#define FMUTEST_R_TIMER_CTRL_TNVSUNIT_SHIFT (0U) +/*! TNVSUNIT - Tnvs Time Unit + * 0b000..Clock cycles + * 0b001..0.5 usec + * 0b010..1 usec + * 0b011..10 usec + * 0b100..100 usec + * 0b101..1 msec + * 0b110..10 msec + * 0b111..100 msec + */ +#define FMUTEST_R_TIMER_CTRL_TNVSUNIT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TNVSUNIT_SHIFT)) & FMUTEST_R_TIMER_CTRL_TNVSUNIT_MASK) + +#define FMUTEST_R_TIMER_CTRL_TNVSDLY_MASK (0x78U) +#define FMUTEST_R_TIMER_CTRL_TNVSDLY_SHIFT (3U) +/*! TNVSDLY - Tnvs Time Delay Scalar */ +#define FMUTEST_R_TIMER_CTRL_TNVSDLY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TNVSDLY_SHIFT)) & FMUTEST_R_TIMER_CTRL_TNVSDLY_MASK) + +#define FMUTEST_R_TIMER_CTRL_TNVHUNIT_MASK (0x380U) +#define FMUTEST_R_TIMER_CTRL_TNVHUNIT_SHIFT (7U) +/*! TNVHUNIT - Tnvh Time Unit + * 0b000..Clock cycles + * 0b001..0.5 usec + * 0b010..1 usec + * 0b011..10 usec + * 0b100..100 usec + * 0b101..1 msec + * 0b110..10 msec + * 0b111..100 msec + */ +#define FMUTEST_R_TIMER_CTRL_TNVHUNIT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TNVHUNIT_SHIFT)) & FMUTEST_R_TIMER_CTRL_TNVHUNIT_MASK) + +#define FMUTEST_R_TIMER_CTRL_TNVHDLY_MASK (0x3C00U) +#define FMUTEST_R_TIMER_CTRL_TNVHDLY_SHIFT (10U) +/*! TNVHDLY - Tnvh Time Delay Scalar */ +#define FMUTEST_R_TIMER_CTRL_TNVHDLY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TNVHDLY_SHIFT)) & FMUTEST_R_TIMER_CTRL_TNVHDLY_MASK) + +#define FMUTEST_R_TIMER_CTRL_TPGSUNIT_MASK (0x1C000U) +#define FMUTEST_R_TIMER_CTRL_TPGSUNIT_SHIFT (14U) +/*! TPGSUNIT - Tpgs Time Unit + * 0b000..Clock cycles + * 0b001..0.5 usec + * 0b010..1 usec + * 0b011..10 usec + * 0b100..100 usec + * 0b101..1 msec + * 0b110..10 msec + * 0b111..100 msec + */ +#define FMUTEST_R_TIMER_CTRL_TPGSUNIT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TPGSUNIT_SHIFT)) & FMUTEST_R_TIMER_CTRL_TPGSUNIT_MASK) + +#define FMUTEST_R_TIMER_CTRL_TPGSDLY_MASK (0x1E0000U) +#define FMUTEST_R_TIMER_CTRL_TPGSDLY_SHIFT (17U) +/*! TPGSDLY - Tpgs Time Delay Scalar */ +#define FMUTEST_R_TIMER_CTRL_TPGSDLY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TPGSDLY_SHIFT)) & FMUTEST_R_TIMER_CTRL_TPGSDLY_MASK) + +#define FMUTEST_R_TIMER_CTRL_TRCVUNIT_MASK (0xE00000U) +#define FMUTEST_R_TIMER_CTRL_TRCVUNIT_SHIFT (21U) +/*! TRCVUNIT - Trcv Time Unit + * 0b000..Clock cycles + * 0b001..0.5 usec + * 0b010..1 usec + * 0b011..10 usec + * 0b100..100 usec + * 0b101..1 msec + * 0b110..10 msec + * 0b111..100 msec + */ +#define FMUTEST_R_TIMER_CTRL_TRCVUNIT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TRCVUNIT_SHIFT)) & FMUTEST_R_TIMER_CTRL_TRCVUNIT_MASK) + +#define FMUTEST_R_TIMER_CTRL_TRCVDLY_MASK (0xF000000U) +#define FMUTEST_R_TIMER_CTRL_TRCVDLY_SHIFT (24U) +/*! TRCVDLY - Trcv Time Delay Scalar */ +#define FMUTEST_R_TIMER_CTRL_TRCVDLY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TRCVDLY_SHIFT)) & FMUTEST_R_TIMER_CTRL_TRCVDLY_MASK) + +#define FMUTEST_R_TIMER_CTRL_TLVSUNIT_MASK (0x70000000U) +#define FMUTEST_R_TIMER_CTRL_TLVSUNIT_SHIFT (28U) +/*! TLVSUNIT - Tlvs Time Unit + * 0b000..Clock cycles + * 0b001..0.5 usec + * 0b010..1 usec + * 0b011..10 usec + * 0b100..100 usec + * 0b101..1 msec + * 0b110..10 msec + * 0b111..100 msec + */ +#define FMUTEST_R_TIMER_CTRL_TLVSUNIT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TLVSUNIT_SHIFT)) & FMUTEST_R_TIMER_CTRL_TLVSUNIT_MASK) + +#define FMUTEST_R_TIMER_CTRL_TLVSDLY_L_MASK (0x80000000U) +#define FMUTEST_R_TIMER_CTRL_TLVSDLY_L_SHIFT (31U) +/*! TLVSDLY_L - Tlvs Time Delay Scalar Low */ +#define FMUTEST_R_TIMER_CTRL_TLVSDLY_L(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_TLVSDLY_L_SHIFT)) & FMUTEST_R_TIMER_CTRL_TLVSDLY_L_MASK) +/*! @} */ + +/*! @name R_TEST_CTRL - BIST Test Control Register */ +/*! @{ */ + +#define FMUTEST_R_TEST_CTRL_BUSY_MASK (0x1U) +#define FMUTEST_R_TEST_CTRL_BUSY_SHIFT (0U) +/*! BUSY - BIST Busy Status + * 0b0..BIST is idle + * 0b1..BIST is busy + */ +#define FMUTEST_R_TEST_CTRL_BUSY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TEST_CTRL_BUSY_SHIFT)) & FMUTEST_R_TEST_CTRL_BUSY_MASK) + +#define FMUTEST_R_TEST_CTRL_DEBUG_MASK (0x2U) +#define FMUTEST_R_TEST_CTRL_DEBUG_SHIFT (1U) +/*! DEBUG - BIST Debug Status */ +#define FMUTEST_R_TEST_CTRL_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TEST_CTRL_DEBUG_SHIFT)) & FMUTEST_R_TEST_CTRL_DEBUG_MASK) + +#define FMUTEST_R_TEST_CTRL_STATUS0_MASK (0x4U) +#define FMUTEST_R_TEST_CTRL_STATUS0_SHIFT (2U) +/*! STATUS0 - BIST Status 0 + * 0b0..BIST test passed on flash block 0 + * 0b1..BIST test failed on flash block 0 + */ +#define FMUTEST_R_TEST_CTRL_STATUS0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TEST_CTRL_STATUS0_SHIFT)) & FMUTEST_R_TEST_CTRL_STATUS0_MASK) + +#define FMUTEST_R_TEST_CTRL_STATUS1_MASK (0x8U) +#define FMUTEST_R_TEST_CTRL_STATUS1_SHIFT (3U) +/*! STATUS1 - BIST status 1 + * 0b0..BIST test passed on flash block 1 + * 0b1..BIST test failed on flash block 1 + */ +#define FMUTEST_R_TEST_CTRL_STATUS1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TEST_CTRL_STATUS1_SHIFT)) & FMUTEST_R_TEST_CTRL_STATUS1_MASK) + +#define FMUTEST_R_TEST_CTRL_DEBUGRUN_MASK (0x10U) +#define FMUTEST_R_TEST_CTRL_DEBUGRUN_SHIFT (4U) +/*! DEBUGRUN - BIST Continue Debug Run */ +#define FMUTEST_R_TEST_CTRL_DEBUGRUN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TEST_CTRL_DEBUGRUN_SHIFT)) & FMUTEST_R_TEST_CTRL_DEBUGRUN_MASK) + +#define FMUTEST_R_TEST_CTRL_STARTRUN_MASK (0x20U) +#define FMUTEST_R_TEST_CTRL_STARTRUN_SHIFT (5U) +/*! STARTRUN - Run New BIST Operation */ +#define FMUTEST_R_TEST_CTRL_STARTRUN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TEST_CTRL_STARTRUN_SHIFT)) & FMUTEST_R_TEST_CTRL_STARTRUN_MASK) + +#define FMUTEST_R_TEST_CTRL_CMDINDEX_MASK (0xFFC0U) +#define FMUTEST_R_TEST_CTRL_CMDINDEX_SHIFT (6U) +/*! CMDINDEX - BIST Command Index (code) */ +#define FMUTEST_R_TEST_CTRL_CMDINDEX(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TEST_CTRL_CMDINDEX_SHIFT)) & FMUTEST_R_TEST_CTRL_CMDINDEX_MASK) + +#define FMUTEST_R_TEST_CTRL_DISABLE_IP1_MASK (0x10000U) +#define FMUTEST_R_TEST_CTRL_DISABLE_IP1_SHIFT (16U) +/*! DISABLE_IP1 - BIST Disable IP1 */ +#define FMUTEST_R_TEST_CTRL_DISABLE_IP1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TEST_CTRL_DISABLE_IP1_SHIFT)) & FMUTEST_R_TEST_CTRL_DISABLE_IP1_MASK) +/*! @} */ + +/*! @name R_ABORT_LOOP - BIST Abort Loop Register */ +/*! @{ */ + +#define FMUTEST_R_ABORT_LOOP_ABORT_LOOP_MASK (0x1U) +#define FMUTEST_R_ABORT_LOOP_ABORT_LOOP_SHIFT (0U) +/*! ABORT_LOOP - Abort Loop + * 0b0..No effect + * 0b1..Abort BIST loop commands and force the loop counter to return to 0x0 + */ +#define FMUTEST_R_ABORT_LOOP_ABORT_LOOP(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_ABORT_LOOP_ABORT_LOOP_SHIFT)) & FMUTEST_R_ABORT_LOOP_ABORT_LOOP_MASK) +/*! @} */ + +/*! @name R_ADR_QUERY - BIST Address Query Register */ +/*! @{ */ + +#define FMUTEST_R_ADR_QUERY_YADRFAIL_MASK (0x1FU) +#define FMUTEST_R_ADR_QUERY_YADRFAIL_SHIFT (0U) +/*! YADRFAIL - Failing YADR */ +#define FMUTEST_R_ADR_QUERY_YADRFAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_ADR_QUERY_YADRFAIL_SHIFT)) & FMUTEST_R_ADR_QUERY_YADRFAIL_MASK) + +#define FMUTEST_R_ADR_QUERY_XADRFAIL_MASK (0x1FFE0U) +#define FMUTEST_R_ADR_QUERY_XADRFAIL_SHIFT (5U) +/*! XADRFAIL - Failing XADR */ +#define FMUTEST_R_ADR_QUERY_XADRFAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_ADR_QUERY_XADRFAIL_SHIFT)) & FMUTEST_R_ADR_QUERY_XADRFAIL_MASK) +/*! @} */ + +/*! @name R_DOUT_QUERY0 - BIST DOUT Query 0 Register */ +/*! @{ */ + +#define FMUTEST_R_DOUT_QUERY0_DOUTFAIL_MASK (0xFFFFFFFFU) +#define FMUTEST_R_DOUT_QUERY0_DOUTFAIL_SHIFT (0U) +/*! DOUTFAIL - Failing DOUT Low */ +#define FMUTEST_R_DOUT_QUERY0_DOUTFAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DOUT_QUERY0_DOUTFAIL_SHIFT)) & FMUTEST_R_DOUT_QUERY0_DOUTFAIL_MASK) +/*! @} */ + +/*! @name R_SMW_QUERY - BIST SMW Query Register */ +/*! @{ */ + +#define FMUTEST_R_SMW_QUERY_SMWLOOP_MASK (0x3FFU) +#define FMUTEST_R_SMW_QUERY_SMWLOOP_SHIFT (0U) +/*! SMWLOOP - SMW Total Loop Count */ +#define FMUTEST_R_SMW_QUERY_SMWLOOP(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SMW_QUERY_SMWLOOP_SHIFT)) & FMUTEST_R_SMW_QUERY_SMWLOOP_MASK) + +#define FMUTEST_R_SMW_QUERY_SMWLAST_MASK (0x7FC00U) +#define FMUTEST_R_SMW_QUERY_SMWLAST_SHIFT (10U) +/*! SMWLAST - SMW Last Voltage Setting */ +#define FMUTEST_R_SMW_QUERY_SMWLAST(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SMW_QUERY_SMWLAST_SHIFT)) & FMUTEST_R_SMW_QUERY_SMWLAST_MASK) +/*! @} */ + +/*! @name R_SMW_SETTING0 - BIST SMW Setting 0 Register */ +/*! @{ */ + +#define FMUTEST_R_SMW_SETTING0_SMWPARM0_MASK (0x7FFFFFFFU) +#define FMUTEST_R_SMW_SETTING0_SMWPARM0_SHIFT (0U) +/*! SMWPARM0 - SMW Parameter Set 0 */ +#define FMUTEST_R_SMW_SETTING0_SMWPARM0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SMW_SETTING0_SMWPARM0_SHIFT)) & FMUTEST_R_SMW_SETTING0_SMWPARM0_MASK) +/*! @} */ + +/*! @name R_SMW_SETTING1 - BIST SMW Setting 1 Register */ +/*! @{ */ + +#define FMUTEST_R_SMW_SETTING1_SMWPARM1_MASK (0xFFFFFFFU) +#define FMUTEST_R_SMW_SETTING1_SMWPARM1_SHIFT (0U) +/*! SMWPARM1 - SMW Parameter Set 1 */ +#define FMUTEST_R_SMW_SETTING1_SMWPARM1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SMW_SETTING1_SMWPARM1_SHIFT)) & FMUTEST_R_SMW_SETTING1_SMWPARM1_MASK) +/*! @} */ + +/*! @name R_SMP_WHV0 - BIST SMP WHV Setting 0 Register */ +/*! @{ */ + +#define FMUTEST_R_SMP_WHV0_SMPWHV0_MASK (0xFFFFFFFFU) +#define FMUTEST_R_SMP_WHV0_SMPWHV0_SHIFT (0U) +/*! SMPWHV0 - SMP WHV Parameter Set 0 */ +#define FMUTEST_R_SMP_WHV0_SMPWHV0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SMP_WHV0_SMPWHV0_SHIFT)) & FMUTEST_R_SMP_WHV0_SMPWHV0_MASK) +/*! @} */ + +/*! @name R_SMP_WHV1 - BIST SMP WHV Setting 1 Register */ +/*! @{ */ + +#define FMUTEST_R_SMP_WHV1_SMPWHV1_MASK (0xFFFFFFFFU) +#define FMUTEST_R_SMP_WHV1_SMPWHV1_SHIFT (0U) +/*! SMPWHV1 - SMP WHV Parameter Set 1 */ +#define FMUTEST_R_SMP_WHV1_SMPWHV1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SMP_WHV1_SMPWHV1_SHIFT)) & FMUTEST_R_SMP_WHV1_SMPWHV1_MASK) +/*! @} */ + +/*! @name R_SME_WHV0 - BIST SME WHV Setting 0 Register */ +/*! @{ */ + +#define FMUTEST_R_SME_WHV0_SMEWHV0_MASK (0xFFFFFFFFU) +#define FMUTEST_R_SME_WHV0_SMEWHV0_SHIFT (0U) +/*! SMEWHV0 - SME WHV Parameter Set 0 */ +#define FMUTEST_R_SME_WHV0_SMEWHV0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SME_WHV0_SMEWHV0_SHIFT)) & FMUTEST_R_SME_WHV0_SMEWHV0_MASK) +/*! @} */ + +/*! @name R_SME_WHV1 - BIST SME WHV Setting 1 Register */ +/*! @{ */ + +#define FMUTEST_R_SME_WHV1_SMEWHV1_MASK (0xFFFFFFFFU) +#define FMUTEST_R_SME_WHV1_SMEWHV1_SHIFT (0U) +/*! SMEWHV1 - SME WHV Parameter Set 1 */ +#define FMUTEST_R_SME_WHV1_SMEWHV1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SME_WHV1_SMEWHV1_SHIFT)) & FMUTEST_R_SME_WHV1_SMEWHV1_MASK) +/*! @} */ + +/*! @name R_SMW_SETTING2 - BIST SMW Setting 2 Register */ +/*! @{ */ + +#define FMUTEST_R_SMW_SETTING2_SMWPARM2_MASK (0x1FFFFFFFU) +#define FMUTEST_R_SMW_SETTING2_SMWPARM2_SHIFT (0U) +/*! SMWPARM2 - SMW Parameter Set 2 */ +#define FMUTEST_R_SMW_SETTING2_SMWPARM2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SMW_SETTING2_SMWPARM2_SHIFT)) & FMUTEST_R_SMW_SETTING2_SMWPARM2_MASK) +/*! @} */ + +/*! @name R_D_MISR0 - BIST DIN MISR 0 Register */ +/*! @{ */ + +#define FMUTEST_R_D_MISR0_DATASIG0_MASK (0xFFFFFFFFU) +#define FMUTEST_R_D_MISR0_DATASIG0_SHIFT (0U) +/*! DATASIG0 - Data Signature */ +#define FMUTEST_R_D_MISR0_DATASIG0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_D_MISR0_DATASIG0_SHIFT)) & FMUTEST_R_D_MISR0_DATASIG0_MASK) +/*! @} */ + +/*! @name R_A_MISR0 - BIST Address MISR 0 Register */ +/*! @{ */ + +#define FMUTEST_R_A_MISR0_ADRSIG0_MASK (0xFFFFFFFFU) +#define FMUTEST_R_A_MISR0_ADRSIG0_SHIFT (0U) +/*! ADRSIG0 - Address Signature */ +#define FMUTEST_R_A_MISR0_ADRSIG0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_A_MISR0_ADRSIG0_SHIFT)) & FMUTEST_R_A_MISR0_ADRSIG0_MASK) +/*! @} */ + +/*! @name R_C_MISR0 - BIST Control MISR 0 Register */ +/*! @{ */ + +#define FMUTEST_R_C_MISR0_CTRLSIG0_MASK (0xFFFFFFFFU) +#define FMUTEST_R_C_MISR0_CTRLSIG0_SHIFT (0U) +/*! CTRLSIG0 - Control Signature */ +#define FMUTEST_R_C_MISR0_CTRLSIG0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_C_MISR0_CTRLSIG0_SHIFT)) & FMUTEST_R_C_MISR0_CTRLSIG0_MASK) +/*! @} */ + +/*! @name R_SMW_SETTING3 - BIST SMW Setting 3 Register */ +/*! @{ */ + +#define FMUTEST_R_SMW_SETTING3_SMWPARM3_MASK (0x1FFFFU) +#define FMUTEST_R_SMW_SETTING3_SMWPARM3_SHIFT (0U) +/*! SMWPARM3 - SMW Parameter Set 3 */ +#define FMUTEST_R_SMW_SETTING3_SMWPARM3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_SMW_SETTING3_SMWPARM3_SHIFT)) & FMUTEST_R_SMW_SETTING3_SMWPARM3_MASK) +/*! @} */ + +/*! @name R_DATA_CTRL1 - BIST Data Control 1 Register */ +/*! @{ */ + +#define FMUTEST_R_DATA_CTRL1_DATA1_MASK (0xFFFFFFFFU) +#define FMUTEST_R_DATA_CTRL1_DATA1_SHIFT (0U) +/*! DATA1 - BIST Data 1 Low */ +#define FMUTEST_R_DATA_CTRL1_DATA1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DATA_CTRL1_DATA1_SHIFT)) & FMUTEST_R_DATA_CTRL1_DATA1_MASK) +/*! @} */ + +/*! @name R_DATA_CTRL2 - BIST Data Control 2 Register */ +/*! @{ */ + +#define FMUTEST_R_DATA_CTRL2_DATA2_MASK (0xFFFFFFFFU) +#define FMUTEST_R_DATA_CTRL2_DATA2_SHIFT (0U) +/*! DATA2 - BIST Data 2 Low */ +#define FMUTEST_R_DATA_CTRL2_DATA2(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DATA_CTRL2_DATA2_SHIFT)) & FMUTEST_R_DATA_CTRL2_DATA2_MASK) +/*! @} */ + +/*! @name R_DATA_CTRL3 - BIST Data Control 3 Register */ +/*! @{ */ + +#define FMUTEST_R_DATA_CTRL3_DATA3_MASK (0xFFFFFFFFU) +#define FMUTEST_R_DATA_CTRL3_DATA3_SHIFT (0U) +/*! DATA3 - BIST Data 3 Low */ +#define FMUTEST_R_DATA_CTRL3_DATA3(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DATA_CTRL3_DATA3_SHIFT)) & FMUTEST_R_DATA_CTRL3_DATA3_MASK) +/*! @} */ + +/*! @name R_REPAIR0_0 - BIST Repair 0 for Block 0 Register */ +/*! @{ */ + +#define FMUTEST_R_REPAIR0_0_RDIS0_0_MASK (0x1U) +#define FMUTEST_R_REPAIR0_0_RDIS0_0_SHIFT (0U) +/*! RDIS0_0 - Control Repair 0 in Block 0. + * 0b0..Repair address is valid + * 0b1..Repair address is not valid + */ +#define FMUTEST_R_REPAIR0_0_RDIS0_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_REPAIR0_0_RDIS0_0_SHIFT)) & FMUTEST_R_REPAIR0_0_RDIS0_0_MASK) + +#define FMUTEST_R_REPAIR0_0_RADR0_0_MASK (0x1FEU) +#define FMUTEST_R_REPAIR0_0_RADR0_0_SHIFT (1U) +/*! RADR0_0 - XADR for Repair 0 in Block 0 */ +#define FMUTEST_R_REPAIR0_0_RADR0_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_REPAIR0_0_RADR0_0_SHIFT)) & FMUTEST_R_REPAIR0_0_RADR0_0_MASK) +/*! @} */ + +/*! @name R_REPAIR0_1 - BIST Repair 1 Block 0 Register */ +/*! @{ */ + +#define FMUTEST_R_REPAIR0_1_RDIS0_1_MASK (0x1U) +#define FMUTEST_R_REPAIR0_1_RDIS0_1_SHIFT (0U) +/*! RDIS0_1 - Control Repair 1 in Block 0. + * 0b0..Repair address is valid + * 0b1..Repair address is not valid + */ +#define FMUTEST_R_REPAIR0_1_RDIS0_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_REPAIR0_1_RDIS0_1_SHIFT)) & FMUTEST_R_REPAIR0_1_RDIS0_1_MASK) + +#define FMUTEST_R_REPAIR0_1_RADR0_1_MASK (0x1FEU) +#define FMUTEST_R_REPAIR0_1_RADR0_1_SHIFT (1U) +/*! RADR0_1 - XADR for Repair 1 in Block 0. */ +#define FMUTEST_R_REPAIR0_1_RADR0_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_REPAIR0_1_RADR0_1_SHIFT)) & FMUTEST_R_REPAIR0_1_RADR0_1_MASK) +/*! @} */ + +/*! @name R_REPAIR1_0 - BIST Repair 0 Block 1 Register */ +/*! @{ */ + +#define FMUTEST_R_REPAIR1_0_RDIS1_0_MASK (0x1U) +#define FMUTEST_R_REPAIR1_0_RDIS1_0_SHIFT (0U) +/*! RDIS1_0 - Control Repair 0 in Block 1. + * 0b0..Repair address is valid + * 0b1..Repair address is not valid + */ +#define FMUTEST_R_REPAIR1_0_RDIS1_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_REPAIR1_0_RDIS1_0_SHIFT)) & FMUTEST_R_REPAIR1_0_RDIS1_0_MASK) + +#define FMUTEST_R_REPAIR1_0_RADR1_0_MASK (0x1FEU) +#define FMUTEST_R_REPAIR1_0_RADR1_0_SHIFT (1U) +/*! RADR1_0 - XADR for Repair 0 in Block 1. */ +#define FMUTEST_R_REPAIR1_0_RADR1_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_REPAIR1_0_RADR1_0_SHIFT)) & FMUTEST_R_REPAIR1_0_RADR1_0_MASK) +/*! @} */ + +/*! @name R_REPAIR1_1 - BIST Repair 1 Block 1 Register */ +/*! @{ */ + +#define FMUTEST_R_REPAIR1_1_RDIS1_1_MASK (0x1U) +#define FMUTEST_R_REPAIR1_1_RDIS1_1_SHIFT (0U) +/*! RDIS1_1 - Control Repair 1 in Block 1. + * 0b0..Repair address is valid + * 0b1..Repair address is not valid + */ +#define FMUTEST_R_REPAIR1_1_RDIS1_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_REPAIR1_1_RDIS1_1_SHIFT)) & FMUTEST_R_REPAIR1_1_RDIS1_1_MASK) + +#define FMUTEST_R_REPAIR1_1_RADR1_1_MASK (0x1FEU) +#define FMUTEST_R_REPAIR1_1_RADR1_1_SHIFT (1U) +/*! RADR1_1 - XADR for Repair 1 in Block 1. */ +#define FMUTEST_R_REPAIR1_1_RADR1_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_REPAIR1_1_RADR1_1_SHIFT)) & FMUTEST_R_REPAIR1_1_RADR1_1_MASK) +/*! @} */ + +/*! @name R_DATA_CTRL0_EX - BIST Data Control 0 Extension Register */ +/*! @{ */ + +#define FMUTEST_R_DATA_CTRL0_EX_DATA0X_MASK (0x7U) +#define FMUTEST_R_DATA_CTRL0_EX_DATA0X_SHIFT (0U) +/*! DATA0X - BIST Data 0 High */ +#define FMUTEST_R_DATA_CTRL0_EX_DATA0X(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DATA_CTRL0_EX_DATA0X_SHIFT)) & FMUTEST_R_DATA_CTRL0_EX_DATA0X_MASK) +/*! @} */ + +/*! @name R_TIMER_CTRL_EX - BIST Timer Control Extension Register */ +/*! @{ */ + +#define FMUTEST_R_TIMER_CTRL_EX_TLVSDLY_H_MASK (0x7U) +#define FMUTEST_R_TIMER_CTRL_EX_TLVSDLY_H_SHIFT (0U) +/*! TLVSDLY_H - Tlvs Time Delay Scalar High */ +#define FMUTEST_R_TIMER_CTRL_EX_TLVSDLY_H(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_TIMER_CTRL_EX_TLVSDLY_H_SHIFT)) & FMUTEST_R_TIMER_CTRL_EX_TLVSDLY_H_MASK) +/*! @} */ + +/*! @name R_DOUT_QUERY1 - BIST DOUT Query 1 Register */ +/*! @{ */ + +#define FMUTEST_R_DOUT_QUERY1_DOUT_MASK (0x7U) +#define FMUTEST_R_DOUT_QUERY1_DOUT_SHIFT (0U) +/*! DOUT - Failing DOUT High */ +#define FMUTEST_R_DOUT_QUERY1_DOUT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DOUT_QUERY1_DOUT_SHIFT)) & FMUTEST_R_DOUT_QUERY1_DOUT_MASK) +/*! @} */ + +/*! @name R_D_MISR1 - BIST DIN MISR 1 Register */ +/*! @{ */ + +#define FMUTEST_R_D_MISR1_DATASIG1_MASK (0xFFU) +#define FMUTEST_R_D_MISR1_DATASIG1_SHIFT (0U) +/*! DATASIG1 - MISR Data Signature High */ +#define FMUTEST_R_D_MISR1_DATASIG1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_D_MISR1_DATASIG1_SHIFT)) & FMUTEST_R_D_MISR1_DATASIG1_MASK) +/*! @} */ + +/*! @name R_A_MISR1 - BIST Address MISR 1 Register */ +/*! @{ */ + +#define FMUTEST_R_A_MISR1_ADRSIG1_MASK (0xFFU) +#define FMUTEST_R_A_MISR1_ADRSIG1_SHIFT (0U) +/*! ADRSIG1 - MISR Address Signature High */ +#define FMUTEST_R_A_MISR1_ADRSIG1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_A_MISR1_ADRSIG1_SHIFT)) & FMUTEST_R_A_MISR1_ADRSIG1_MASK) +/*! @} */ + +/*! @name R_C_MISR1 - BIST Control MISR 1 Register */ +/*! @{ */ + +#define FMUTEST_R_C_MISR1_CTRLSIG1_MASK (0xFFU) +#define FMUTEST_R_C_MISR1_CTRLSIG1_SHIFT (0U) +/*! CTRLSIG1 - MISR Control Signature High */ +#define FMUTEST_R_C_MISR1_CTRLSIG1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_C_MISR1_CTRLSIG1_SHIFT)) & FMUTEST_R_C_MISR1_CTRLSIG1_MASK) +/*! @} */ + +/*! @name R_DATA_CTRL1_EX - BIST Data Control 1 Extension Register */ +/*! @{ */ + +#define FMUTEST_R_DATA_CTRL1_EX_DATA1X_MASK (0x7U) +#define FMUTEST_R_DATA_CTRL1_EX_DATA1X_SHIFT (0U) +/*! DATA1X - BIST Data 1 High */ +#define FMUTEST_R_DATA_CTRL1_EX_DATA1X(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DATA_CTRL1_EX_DATA1X_SHIFT)) & FMUTEST_R_DATA_CTRL1_EX_DATA1X_MASK) +/*! @} */ + +/*! @name R_DATA_CTRL2_EX - BIST Data Control 2 Extension Register */ +/*! @{ */ + +#define FMUTEST_R_DATA_CTRL2_EX_DATA2X_MASK (0x7U) +#define FMUTEST_R_DATA_CTRL2_EX_DATA2X_SHIFT (0U) +/*! DATA2X - BIST Data 2 High */ +#define FMUTEST_R_DATA_CTRL2_EX_DATA2X(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DATA_CTRL2_EX_DATA2X_SHIFT)) & FMUTEST_R_DATA_CTRL2_EX_DATA2X_MASK) +/*! @} */ + +/*! @name R_DATA_CTRL3_EX - BIST Data Control 3 Extension Register */ +/*! @{ */ + +#define FMUTEST_R_DATA_CTRL3_EX_DATA3X_MASK (0x7U) +#define FMUTEST_R_DATA_CTRL3_EX_DATA3X_SHIFT (0U) +/*! DATA3X - BIST Data 3 High */ +#define FMUTEST_R_DATA_CTRL3_EX_DATA3X(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_R_DATA_CTRL3_EX_DATA3X_SHIFT)) & FMUTEST_R_DATA_CTRL3_EX_DATA3X_MASK) +/*! @} */ + +/*! @name SMW_TIMER_OPTION - SMW Timer Option Register */ +/*! @{ */ + +#define FMUTEST_SMW_TIMER_OPTION_SMW_CDIVL_MASK (0xFFU) +#define FMUTEST_SMW_TIMER_OPTION_SMW_CDIVL_SHIFT (0U) +/*! SMW_CDIVL - Clock Divide Scalar for Long Pulse */ +#define FMUTEST_SMW_TIMER_OPTION_SMW_CDIVL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_TIMER_OPTION_SMW_CDIVL_SHIFT)) & FMUTEST_SMW_TIMER_OPTION_SMW_CDIVL_MASK) + +#define FMUTEST_SMW_TIMER_OPTION_SMW_TVFY_MASK (0x1F00U) +#define FMUTEST_SMW_TIMER_OPTION_SMW_TVFY_SHIFT (8U) +/*! SMW_TVFY - Timer Adjust for Verify */ +#define FMUTEST_SMW_TIMER_OPTION_SMW_TVFY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_TIMER_OPTION_SMW_TVFY_SHIFT)) & FMUTEST_SMW_TIMER_OPTION_SMW_TVFY_MASK) +/*! @} */ + +/*! @name SMW_SETTING_OPTION0 - SMW Setting Option 0 Register */ +/*! @{ */ + +#define FMUTEST_SMW_SETTING_OPTION0_MV_INIT_MASK (0x1C000U) +#define FMUTEST_SMW_SETTING_OPTION0_MV_INIT_SHIFT (14U) +/*! MV_INIT - Medium Voltage Level Select Initial */ +#define FMUTEST_SMW_SETTING_OPTION0_MV_INIT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION0_MV_INIT_SHIFT)) & FMUTEST_SMW_SETTING_OPTION0_MV_INIT_MASK) + +#define FMUTEST_SMW_SETTING_OPTION0_MV_END_MASK (0xE0000U) +#define FMUTEST_SMW_SETTING_OPTION0_MV_END_SHIFT (17U) +/*! MV_END - Medium Voltage Level Select Final */ +#define FMUTEST_SMW_SETTING_OPTION0_MV_END(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION0_MV_END_SHIFT)) & FMUTEST_SMW_SETTING_OPTION0_MV_END_MASK) + +#define FMUTEST_SMW_SETTING_OPTION0_MV_MISC_MASK (0xF00000U) +#define FMUTEST_SMW_SETTING_OPTION0_MV_MISC_SHIFT (20U) +/*! MV_MISC - Medium Voltage Control Misc */ +#define FMUTEST_SMW_SETTING_OPTION0_MV_MISC(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION0_MV_MISC_SHIFT)) & FMUTEST_SMW_SETTING_OPTION0_MV_MISC_MASK) + +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_INIT_MASK (0x3000000U) +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_INIT_SHIFT (24U) +/*! IPGM_INIT - Program Current Control Initial */ +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_INIT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION0_IPGM_INIT_SHIFT)) & FMUTEST_SMW_SETTING_OPTION0_IPGM_INIT_MASK) + +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_END_MASK (0xC000000U) +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_END_SHIFT (26U) +/*! IPGM_END - Program Current Control Final */ +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_END(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION0_IPGM_END_SHIFT)) & FMUTEST_SMW_SETTING_OPTION0_IPGM_END_MASK) + +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_MISC_MASK (0x70000000U) +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_MISC_SHIFT (28U) +/*! IPGM_MISC - Program Current Control Misc */ +#define FMUTEST_SMW_SETTING_OPTION0_IPGM_MISC(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION0_IPGM_MISC_SHIFT)) & FMUTEST_SMW_SETTING_OPTION0_IPGM_MISC_MASK) +/*! @} */ + +/*! @name SMW_SETTING_OPTION2 - SMW Setting Option 2 Register */ +/*! @{ */ + +#define FMUTEST_SMW_SETTING_OPTION2_THVS_CTRL_MASK (0x7U) +#define FMUTEST_SMW_SETTING_OPTION2_THVS_CTRL_SHIFT (0U) +/*! THVS_CTRL - Thvs control */ +#define FMUTEST_SMW_SETTING_OPTION2_THVS_CTRL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_THVS_CTRL_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_THVS_CTRL_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_TRCV_CTRL_MASK (0x38U) +#define FMUTEST_SMW_SETTING_OPTION2_TRCV_CTRL_SHIFT (3U) +/*! TRCV_CTRL - Trcv Control */ +#define FMUTEST_SMW_SETTING_OPTION2_TRCV_CTRL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_TRCV_CTRL_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_TRCV_CTRL_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_XTRA_ERS_MASK (0xC0U) +#define FMUTEST_SMW_SETTING_OPTION2_XTRA_ERS_SHIFT (6U) +/*! XTRA_ERS - Number of Post Shots for SME */ +#define FMUTEST_SMW_SETTING_OPTION2_XTRA_ERS(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_XTRA_ERS_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_XTRA_ERS_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_XTRA_PGM_MASK (0x300U) +#define FMUTEST_SMW_SETTING_OPTION2_XTRA_PGM_SHIFT (8U) +/*! XTRA_PGM - Number of Post Shots for SMP */ +#define FMUTEST_SMW_SETTING_OPTION2_XTRA_PGM(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_XTRA_PGM_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_XTRA_PGM_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_WHV_CNTR_MASK (0x3FC00U) +#define FMUTEST_SMW_SETTING_OPTION2_WHV_CNTR_SHIFT (10U) +/*! WHV_CNTR - WHV Counter */ +#define FMUTEST_SMW_SETTING_OPTION2_WHV_CNTR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_WHV_CNTR_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_WHV_CNTR_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_POST_TERS_MASK (0x1C0000U) +#define FMUTEST_SMW_SETTING_OPTION2_POST_TERS_SHIFT (18U) +/*! POST_TERS - Post Ters Time + * 0b000..50 usec + * 0b001..100 usec + * 0b010..200 usec + * 0b011..300 usec + * 0b100..500 usec + * 0b101..1 msec + * 0b110..1.5 msec + * 0b111..2 msec + */ +#define FMUTEST_SMW_SETTING_OPTION2_POST_TERS(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_POST_TERS_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_POST_TERS_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_POST_TPGM_MASK (0x600000U) +#define FMUTEST_SMW_SETTING_OPTION2_POST_TPGM_SHIFT (21U) +/*! POST_TPGM - Post Tpgm Time + * 0b00..1 usec + * 0b01..2 usec + * 0b10..4 usec + * 0b11..8 usec + */ +#define FMUTEST_SMW_SETTING_OPTION2_POST_TPGM(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_POST_TPGM_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_POST_TPGM_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_VFY_OPT_MASK (0x1800000U) +#define FMUTEST_SMW_SETTING_OPTION2_VFY_OPT_SHIFT (23U) +/*! VFY_OPT - Verify Option + * 0b00..Skip verify for post shot only, verify for all other shots + * 0b01..Skip verify for the 1st and post shots + * 0b10..Skip the 1st, 2nd, and post shots + * 0b11..Skip verify for all shots + */ +#define FMUTEST_SMW_SETTING_OPTION2_VFY_OPT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_VFY_OPT_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_VFY_OPT_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_TPGM_OPT_MASK (0x6000000U) +#define FMUTEST_SMW_SETTING_OPTION2_TPGM_OPT_SHIFT (25U) +/*! TPGM_OPT - Tpgm Option + * 0b00..Fixed Tpgm for all shots, except post shot + * 0b01..Increase Tpgm option by 1 for each loop until Tpgm reaches 4 usec + * 0b10..Increase Tpgm option by 1 for each loop until Tpgm reaches 8 usec + * 0b11..Unused + */ +#define FMUTEST_SMW_SETTING_OPTION2_TPGM_OPT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_TPGM_OPT_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_TPGM_OPT_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_MASK0_OPT_MASK (0x8000000U) +#define FMUTEST_SMW_SETTING_OPTION2_MASK0_OPT_SHIFT (27U) +/*! MASK0_OPT - MASK0_OPT + * 0b0..Mask programmed bits passing PV until extra shot + * 0b1..Always program bits even if they pass PV + */ +#define FMUTEST_SMW_SETTING_OPTION2_MASK0_OPT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_MASK0_OPT_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_MASK0_OPT_MASK) + +#define FMUTEST_SMW_SETTING_OPTION2_DIS_PRER_MASK (0x10000000U) +#define FMUTEST_SMW_SETTING_OPTION2_DIS_PRER_SHIFT (28U) +/*! DIS_PRER - Disable pre-PV Read before First Program Shot + * 0b0..Enable pre-PV read before first program shot + * 0b1..Disable pre-PV read before first program shot + */ +#define FMUTEST_SMW_SETTING_OPTION2_DIS_PRER(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION2_DIS_PRER_SHIFT)) & FMUTEST_SMW_SETTING_OPTION2_DIS_PRER_MASK) +/*! @} */ + +/*! @name SMW_SETTING_OPTION3 - SMW Setting Option 3 Register */ +/*! @{ */ + +#define FMUTEST_SMW_SETTING_OPTION3_HEM_WHV_CNTR_MASK (0xFFU) +#define FMUTEST_SMW_SETTING_OPTION3_HEM_WHV_CNTR_SHIFT (0U) +/*! HEM_WHV_CNTR - WHV_COUNTER for HEM-erase Cycle */ +#define FMUTEST_SMW_SETTING_OPTION3_HEM_WHV_CNTR(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION3_HEM_WHV_CNTR_SHIFT)) & FMUTEST_SMW_SETTING_OPTION3_HEM_WHV_CNTR_MASK) + +#define FMUTEST_SMW_SETTING_OPTION3_HEM_MAX_ERS_MASK (0x1FF00U) +#define FMUTEST_SMW_SETTING_OPTION3_HEM_MAX_ERS_SHIFT (8U) +/*! HEM_MAX_ERS - HEM Max Erase Shot Count */ +#define FMUTEST_SMW_SETTING_OPTION3_HEM_MAX_ERS(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION3_HEM_MAX_ERS_SHIFT)) & FMUTEST_SMW_SETTING_OPTION3_HEM_MAX_ERS_MASK) +/*! @} */ + +/*! @name SMW_SMP_WHV_OPTION0 - SMW SMP WHV Option 0 Register */ +/*! @{ */ + +#define FMUTEST_SMW_SMP_WHV_OPTION0_SMP_WHV_OPT0_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_SMP_WHV_OPTION0_SMP_WHV_OPT0_SHIFT (0U) +/*! SMP_WHV_OPT0 - Smart Program WHV Option Low */ +#define FMUTEST_SMW_SMP_WHV_OPTION0_SMP_WHV_OPT0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SMP_WHV_OPTION0_SMP_WHV_OPT0_SHIFT)) & FMUTEST_SMW_SMP_WHV_OPTION0_SMP_WHV_OPT0_MASK) +/*! @} */ + +/*! @name SMW_SME_WHV_OPTION0 - SMW SME WHV Option 0 Register */ +/*! @{ */ + +#define FMUTEST_SMW_SME_WHV_OPTION0_SME_WHV_OPT0_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_SME_WHV_OPTION0_SME_WHV_OPT0_SHIFT (0U) +/*! SME_WHV_OPT0 - Smart Erase WHV Option Low */ +#define FMUTEST_SMW_SME_WHV_OPTION0_SME_WHV_OPT0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SME_WHV_OPTION0_SME_WHV_OPT0_SHIFT)) & FMUTEST_SMW_SME_WHV_OPTION0_SME_WHV_OPT0_MASK) +/*! @} */ + +/*! @name SMW_SETTING_OPTION1 - SMW Setting Option 1 Register */ +/*! @{ */ + +#define FMUTEST_SMW_SETTING_OPTION1_TERS_CTRL0_MASK (0x7U) +#define FMUTEST_SMW_SETTING_OPTION1_TERS_CTRL0_SHIFT (0U) +/*! TERS_CTRL0 - Ters Control + * 0b000..50 usec + * 0b001..100 usec + * 0b010..200 usec + * 0b011..300 usec + * 0b100..500 usec + * 0b101..1 msec + * 0b110..1.5 msec + * 0b111..2 msec + */ +#define FMUTEST_SMW_SETTING_OPTION1_TERS_CTRL0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION1_TERS_CTRL0_SHIFT)) & FMUTEST_SMW_SETTING_OPTION1_TERS_CTRL0_MASK) + +#define FMUTEST_SMW_SETTING_OPTION1_TPGM_CTRL_MASK (0x18U) +#define FMUTEST_SMW_SETTING_OPTION1_TPGM_CTRL_SHIFT (3U) +/*! TPGM_CTRL - Tpgm Control + * 0b00..1 usec + * 0b01..2 usec + * 0b10..4 usec + * 0b11..8 usec + */ +#define FMUTEST_SMW_SETTING_OPTION1_TPGM_CTRL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION1_TPGM_CTRL_SHIFT)) & FMUTEST_SMW_SETTING_OPTION1_TPGM_CTRL_MASK) + +#define FMUTEST_SMW_SETTING_OPTION1_TNVS_CTRL_MASK (0xE0U) +#define FMUTEST_SMW_SETTING_OPTION1_TNVS_CTRL_SHIFT (5U) +/*! TNVS_CTRL - Tnvs Control + * 0b000..5 usec + * 0b001..8 usec + * 0b010..11 usec + * 0b011..14 usec + * 0b100..17 usec + * 0b101..20 usec + * 0b110..23 usec + * 0b111..26 usec + */ +#define FMUTEST_SMW_SETTING_OPTION1_TNVS_CTRL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION1_TNVS_CTRL_SHIFT)) & FMUTEST_SMW_SETTING_OPTION1_TNVS_CTRL_MASK) + +#define FMUTEST_SMW_SETTING_OPTION1_TNVH_CTRL_MASK (0x700U) +#define FMUTEST_SMW_SETTING_OPTION1_TNVH_CTRL_SHIFT (8U) +/*! TNVH_CTRL - Tnvh Control + * 0b000..2 usec + * 0b001..2.5 usec + * 0b010..3 usec + * 0b011..3.5 usec + * 0b100..4 usec + * 0b101..4.5 usec + * 0b110..5 usec + * 0b111..5.5 usec + */ +#define FMUTEST_SMW_SETTING_OPTION1_TNVH_CTRL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION1_TNVH_CTRL_SHIFT)) & FMUTEST_SMW_SETTING_OPTION1_TNVH_CTRL_MASK) + +#define FMUTEST_SMW_SETTING_OPTION1_TPGS_CTRL_MASK (0x3800U) +#define FMUTEST_SMW_SETTING_OPTION1_TPGS_CTRL_SHIFT (11U) +/*! TPGS_CTRL - Tpgs Control + * 0b000..1 usec + * 0b001..2 usec + * 0b010..3 usec + * 0b011..4 usec + * 0b100..5 usec + * 0b101..6 usec + * 0b110..7 usec + * 0b111..8 usec + */ +#define FMUTEST_SMW_SETTING_OPTION1_TPGS_CTRL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION1_TPGS_CTRL_SHIFT)) & FMUTEST_SMW_SETTING_OPTION1_TPGS_CTRL_MASK) + +#define FMUTEST_SMW_SETTING_OPTION1_MAX_ERASE_MASK (0x7FC000U) +#define FMUTEST_SMW_SETTING_OPTION1_MAX_ERASE_SHIFT (14U) +/*! MAX_ERASE - Number of Erase Shots */ +#define FMUTEST_SMW_SETTING_OPTION1_MAX_ERASE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION1_MAX_ERASE_SHIFT)) & FMUTEST_SMW_SETTING_OPTION1_MAX_ERASE_MASK) + +#define FMUTEST_SMW_SETTING_OPTION1_MAX_PROG_MASK (0xF800000U) +#define FMUTEST_SMW_SETTING_OPTION1_MAX_PROG_SHIFT (23U) +/*! MAX_PROG - Number of Program Shots */ +#define FMUTEST_SMW_SETTING_OPTION1_MAX_PROG(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SETTING_OPTION1_MAX_PROG_SHIFT)) & FMUTEST_SMW_SETTING_OPTION1_MAX_PROG_MASK) +/*! @} */ + +/*! @name SMW_SMP_WHV_OPTION1 - SMW SMP WHV Option 1 Register */ +/*! @{ */ + +#define FMUTEST_SMW_SMP_WHV_OPTION1_SMP_WHV_OPT1_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_SMP_WHV_OPTION1_SMP_WHV_OPT1_SHIFT (0U) +/*! SMP_WHV_OPT1 - Smart Program WHV Option High */ +#define FMUTEST_SMW_SMP_WHV_OPTION1_SMP_WHV_OPT1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SMP_WHV_OPTION1_SMP_WHV_OPT1_SHIFT)) & FMUTEST_SMW_SMP_WHV_OPTION1_SMP_WHV_OPT1_MASK) +/*! @} */ + +/*! @name SMW_SME_WHV_OPTION1 - SMW SME WHV Option 1 Register */ +/*! @{ */ + +#define FMUTEST_SMW_SME_WHV_OPTION1_SME_WHV_OPT1_MASK (0xFFFFFFFFU) +#define FMUTEST_SMW_SME_WHV_OPTION1_SME_WHV_OPT1_SHIFT (0U) +/*! SME_WHV_OPT1 - Smart Erase WHV Option High */ +#define FMUTEST_SMW_SME_WHV_OPTION1_SME_WHV_OPT1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_SME_WHV_OPTION1_SME_WHV_OPT1_SHIFT)) & FMUTEST_SMW_SME_WHV_OPTION1_SME_WHV_OPT1_MASK) +/*! @} */ + +/*! @name REPAIR0_0 - FMU Repair 0 Block 0 Register */ +/*! @{ */ + +#define FMUTEST_REPAIR0_0_RDIS0_0_MASK (0x1U) +#define FMUTEST_REPAIR0_0_RDIS0_0_SHIFT (0U) +/*! RDIS0_0 - RDIS0_0 + * 0b0..Repair address is valid + * 0b1..Repair address is not valid + */ +#define FMUTEST_REPAIR0_0_RDIS0_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_REPAIR0_0_RDIS0_0_SHIFT)) & FMUTEST_REPAIR0_0_RDIS0_0_MASK) + +#define FMUTEST_REPAIR0_0_RADR0_0_MASK (0x1FEU) +#define FMUTEST_REPAIR0_0_RADR0_0_SHIFT (1U) +/*! RADR0_0 - RADR0_0 */ +#define FMUTEST_REPAIR0_0_RADR0_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_REPAIR0_0_RADR0_0_SHIFT)) & FMUTEST_REPAIR0_0_RADR0_0_MASK) +/*! @} */ + +/*! @name REPAIR0_1 - FMU Repair 1 Block 0 Register */ +/*! @{ */ + +#define FMUTEST_REPAIR0_1_RDIS0_1_MASK (0x1U) +#define FMUTEST_REPAIR0_1_RDIS0_1_SHIFT (0U) +/*! RDIS0_1 - RDIS0_1 + * 0b0..Repair address is valid + * 0b1..Repair address is not valid + */ +#define FMUTEST_REPAIR0_1_RDIS0_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_REPAIR0_1_RDIS0_1_SHIFT)) & FMUTEST_REPAIR0_1_RDIS0_1_MASK) + +#define FMUTEST_REPAIR0_1_RADR0_1_MASK (0x1FEU) +#define FMUTEST_REPAIR0_1_RADR0_1_SHIFT (1U) +/*! RADR0_1 - RADR0_1 */ +#define FMUTEST_REPAIR0_1_RADR0_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_REPAIR0_1_RADR0_1_SHIFT)) & FMUTEST_REPAIR0_1_RADR0_1_MASK) +/*! @} */ + +/*! @name REPAIR1_0 - FMU Repair 0 Block 1 Register */ +/*! @{ */ + +#define FMUTEST_REPAIR1_0_RDIS1_0_MASK (0x1U) +#define FMUTEST_REPAIR1_0_RDIS1_0_SHIFT (0U) +/*! RDIS1_0 - RDIS1_0 + * 0b0..Repair address is valid + * 0b1..Repair address is not valid + */ +#define FMUTEST_REPAIR1_0_RDIS1_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_REPAIR1_0_RDIS1_0_SHIFT)) & FMUTEST_REPAIR1_0_RDIS1_0_MASK) + +#define FMUTEST_REPAIR1_0_RADR1_0_MASK (0x1FEU) +#define FMUTEST_REPAIR1_0_RADR1_0_SHIFT (1U) +/*! RADR1_0 - RADR1_0 */ +#define FMUTEST_REPAIR1_0_RADR1_0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_REPAIR1_0_RADR1_0_SHIFT)) & FMUTEST_REPAIR1_0_RADR1_0_MASK) +/*! @} */ + +/*! @name REPAIR1_1 - FMU Repair 1 Block 1 Register */ +/*! @{ */ + +#define FMUTEST_REPAIR1_1_RDIS1_1_MASK (0x1U) +#define FMUTEST_REPAIR1_1_RDIS1_1_SHIFT (0U) +/*! RDIS1_1 - RDIS1_1 + * 0b0..Repair address is valid + * 0b1..Repair address is not valid + */ +#define FMUTEST_REPAIR1_1_RDIS1_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_REPAIR1_1_RDIS1_1_SHIFT)) & FMUTEST_REPAIR1_1_RDIS1_1_MASK) + +#define FMUTEST_REPAIR1_1_RADR1_1_MASK (0x1FEU) +#define FMUTEST_REPAIR1_1_RADR1_1_SHIFT (1U) +/*! RADR1_1 - RADR1_1 */ +#define FMUTEST_REPAIR1_1_RADR1_1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_REPAIR1_1_RADR1_1_SHIFT)) & FMUTEST_REPAIR1_1_RADR1_1_MASK) +/*! @} */ + +/*! @name SMW_HB_SIGNALS - SMW HB Signals Register */ +/*! @{ */ + +#define FMUTEST_SMW_HB_SIGNALS_SMW_ARRAY_MASK (0x7U) +#define FMUTEST_SMW_HB_SIGNALS_SMW_ARRAY_SHIFT (0U) +/*! SMW_ARRAY - SMW Region Select + * 0b000..Main array + * 0b001..IFR space only or main (and REDEN space) with IFR space for mass erase + * 0b010..IFR1 space + * 0b100..REDEN space + */ +#define FMUTEST_SMW_HB_SIGNALS_SMW_ARRAY(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_HB_SIGNALS_SMW_ARRAY_SHIFT)) & FMUTEST_SMW_HB_SIGNALS_SMW_ARRAY_MASK) + +#define FMUTEST_SMW_HB_SIGNALS_USER_IFREN1_MASK (0x8U) +#define FMUTEST_SMW_HB_SIGNALS_USER_IFREN1_SHIFT (3U) +/*! USER_IFREN1 - IFR1 Enable + * 0b0..IFREN1 input to the flash array is driven LOW + * 0b1..IFREN1 input to the flash array is driven HIGH + */ +#define FMUTEST_SMW_HB_SIGNALS_USER_IFREN1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_HB_SIGNALS_USER_IFREN1_SHIFT)) & FMUTEST_SMW_HB_SIGNALS_USER_IFREN1_MASK) + +#define FMUTEST_SMW_HB_SIGNALS_USER_PV_MASK (0x10U) +#define FMUTEST_SMW_HB_SIGNALS_USER_PV_SHIFT (4U) +/*! USER_PV - Program Verify + * 0b0..PV input to the flash array is driven LOW + * 0b1..PV input to the flash array is driven HIGH + */ +#define FMUTEST_SMW_HB_SIGNALS_USER_PV(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_HB_SIGNALS_USER_PV_SHIFT)) & FMUTEST_SMW_HB_SIGNALS_USER_PV_MASK) + +#define FMUTEST_SMW_HB_SIGNALS_USER_EV_MASK (0x20U) +#define FMUTEST_SMW_HB_SIGNALS_USER_EV_SHIFT (5U) +/*! USER_EV - Erase Verify + * 0b0..EV input to the flash array is driven LOW + * 0b1..EV input to the flash array is driven HIGH + */ +#define FMUTEST_SMW_HB_SIGNALS_USER_EV(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_HB_SIGNALS_USER_EV_SHIFT)) & FMUTEST_SMW_HB_SIGNALS_USER_EV_MASK) + +#define FMUTEST_SMW_HB_SIGNALS_USER_IFREN_MASK (0x40U) +#define FMUTEST_SMW_HB_SIGNALS_USER_IFREN_SHIFT (6U) +/*! USER_IFREN - IFR Enable + * 0b0..IFREN input to the flash array is driven LOW + * 0b1..IFREN input to the flash array is driven HIGH + */ +#define FMUTEST_SMW_HB_SIGNALS_USER_IFREN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_HB_SIGNALS_USER_IFREN_SHIFT)) & FMUTEST_SMW_HB_SIGNALS_USER_IFREN_MASK) + +#define FMUTEST_SMW_HB_SIGNALS_USER_REDEN_MASK (0x80U) +#define FMUTEST_SMW_HB_SIGNALS_USER_REDEN_SHIFT (7U) +/*! USER_REDEN - Repair Read Enable + * 0b0..REDEN input to the flash array is driven LOW + * 0b1..REDEN input to the flash array is driven HIGH + */ +#define FMUTEST_SMW_HB_SIGNALS_USER_REDEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_HB_SIGNALS_USER_REDEN_SHIFT)) & FMUTEST_SMW_HB_SIGNALS_USER_REDEN_MASK) + +#define FMUTEST_SMW_HB_SIGNALS_USER_HEM_MASK (0x100U) +#define FMUTEST_SMW_HB_SIGNALS_USER_HEM_SHIFT (8U) +/*! USER_HEM - High Endurance Enable + * 0b0..HEM input to SMW / BIST PIN_CTRL[24] is driven LOW + * 0b1..HEM input to SMW / BIST PIN_CTRL[24] is driven HIGH + */ +#define FMUTEST_SMW_HB_SIGNALS_USER_HEM(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_SMW_HB_SIGNALS_USER_HEM_SHIFT)) & FMUTEST_SMW_HB_SIGNALS_USER_HEM_MASK) +/*! @} */ + +/*! @name BIST_DUMP_CTRL - BIST Datadump Control Register */ +/*! @{ */ + +#define FMUTEST_BIST_DUMP_CTRL_BIST_DONE_MASK (0x10000U) +#define FMUTEST_BIST_DUMP_CTRL_BIST_DONE_SHIFT (16U) +/*! BIST_DONE - BIST Done + * 0b0..The BIST (or data dump) is running + * 0b1..The BIST (or data dump) has completed + */ +#define FMUTEST_BIST_DUMP_CTRL_BIST_DONE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BIST_DUMP_CTRL_BIST_DONE_SHIFT)) & FMUTEST_BIST_DUMP_CTRL_BIST_DONE_MASK) + +#define FMUTEST_BIST_DUMP_CTRL_BIST_FAIL_MASK (0x20000U) +#define FMUTEST_BIST_DUMP_CTRL_BIST_FAIL_SHIFT (17U) +/*! BIST_FAIL - BIST Fail + * 0b0..The last BIST operation completed successfully (or could not fail) + * 0b1..The last BIST operation failed + */ +#define FMUTEST_BIST_DUMP_CTRL_BIST_FAIL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BIST_DUMP_CTRL_BIST_FAIL_SHIFT)) & FMUTEST_BIST_DUMP_CTRL_BIST_FAIL_MASK) + +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_MASK (0x40000U) +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_SHIFT (18U) +/*! DATADUMP - Data Dump Enable */ +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BIST_DUMP_CTRL_DATADUMP_SHIFT)) & FMUTEST_BIST_DUMP_CTRL_DATADUMP_MASK) + +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_TRIG_MASK (0x80000U) +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_TRIG_SHIFT (19U) +/*! DATADUMP_TRIG - Data Dump Trigger */ +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_TRIG(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BIST_DUMP_CTRL_DATADUMP_TRIG_SHIFT)) & FMUTEST_BIST_DUMP_CTRL_DATADUMP_TRIG_MASK) + +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_PATT_MASK (0x300000U) +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_PATT_SHIFT (20U) +/*! DATADUMP_PATT - Data Dump Pattern Select + * 0b00..All ones + * 0b01..All zeroes + * 0b10..Checkerboard + * 0b11..Inverse checkerboard + */ +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_PATT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BIST_DUMP_CTRL_DATADUMP_PATT_SHIFT)) & FMUTEST_BIST_DUMP_CTRL_DATADUMP_PATT_MASK) + +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGEN_MASK (0x400000U) +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGEN_SHIFT (22U) +/*! DATADUMP_MRGEN - Data Dump Margin Enable + * 0b0..Normal read pulse shape + * 0b1..Margin read pulse shape + */ +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGEN(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGEN_SHIFT)) & FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGEN_MASK) + +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGTYPE_MASK (0x800000U) +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGTYPE_SHIFT (23U) +/*! DATADUMP_MRGTYPE - Data Dump Margin Type + * 0b0..DIN method used + * 0b1..TM method used + */ +#define FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGTYPE(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGTYPE_SHIFT)) & FMUTEST_BIST_DUMP_CTRL_DATADUMP_MRGTYPE_MASK) +/*! @} */ + +/*! @name ATX_PIN_CTRL - ATX Pin Control Register */ +/*! @{ */ + +#define FMUTEST_ATX_PIN_CTRL_TM_TO_ATX_MASK (0xFFU) +#define FMUTEST_ATX_PIN_CTRL_TM_TO_ATX_SHIFT (0U) +/*! TM_TO_ATX - TM to ATX + * 0b00000001..TM[0] to ATX0 + * 0b00000010..TM[1] to ATX0 + * 0b00000100..TM[2] to ATX0 + * 0b00001000..TM[3] to ATX0 + * 0b00010000..TM[0] to ATX1 + * 0b00100000..TM[1] to ATX1 + * 0b01000000..TM[2] to ATX1 + * 0b10000000..TM[3] to ATX1 + */ +#define FMUTEST_ATX_PIN_CTRL_TM_TO_ATX(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_ATX_PIN_CTRL_TM_TO_ATX_SHIFT)) & FMUTEST_ATX_PIN_CTRL_TM_TO_ATX_MASK) +/*! @} */ + +/*! @name FAILCNT - Fail Count Register */ +/*! @{ */ + +#define FMUTEST_FAILCNT_FAILCNT_MASK (0xFFFFFFFFU) +#define FMUTEST_FAILCNT_FAILCNT_SHIFT (0U) +/*! FAILCNT - Fail Count */ +#define FMUTEST_FAILCNT_FAILCNT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_FAILCNT_FAILCNT_SHIFT)) & FMUTEST_FAILCNT_FAILCNT_MASK) +/*! @} */ + +/*! @name PGM_PULSE_CNT0 - Block 0 Program Pulse Count Register */ +/*! @{ */ + +#define FMUTEST_PGM_PULSE_CNT0_PGM_CNT0_MASK (0xFFFFFFFFU) +#define FMUTEST_PGM_PULSE_CNT0_PGM_CNT0_SHIFT (0U) +/*! PGM_CNT0 - Program Pulse Count */ +#define FMUTEST_PGM_PULSE_CNT0_PGM_CNT0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_PGM_PULSE_CNT0_PGM_CNT0_SHIFT)) & FMUTEST_PGM_PULSE_CNT0_PGM_CNT0_MASK) +/*! @} */ + +/*! @name PGM_PULSE_CNT1 - Block 1 Program Pulse Count Register */ +/*! @{ */ + +#define FMUTEST_PGM_PULSE_CNT1_PGM_CNT1_MASK (0xFFFFFFFFU) +#define FMUTEST_PGM_PULSE_CNT1_PGM_CNT1_SHIFT (0U) +/*! PGM_CNT1 - Program Pulse Count */ +#define FMUTEST_PGM_PULSE_CNT1_PGM_CNT1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_PGM_PULSE_CNT1_PGM_CNT1_SHIFT)) & FMUTEST_PGM_PULSE_CNT1_PGM_CNT1_MASK) +/*! @} */ + +/*! @name ERS_PULSE_CNT - Erase Pulse Count Register */ +/*! @{ */ + +#define FMUTEST_ERS_PULSE_CNT_ERS_CNT0_MASK (0xFFFFU) +#define FMUTEST_ERS_PULSE_CNT_ERS_CNT0_SHIFT (0U) +/*! ERS_CNT0 - Block 0 Erase Pulse Count */ +#define FMUTEST_ERS_PULSE_CNT_ERS_CNT0(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_ERS_PULSE_CNT_ERS_CNT0_SHIFT)) & FMUTEST_ERS_PULSE_CNT_ERS_CNT0_MASK) + +#define FMUTEST_ERS_PULSE_CNT_ERS_CNT1_MASK (0xFFFF0000U) +#define FMUTEST_ERS_PULSE_CNT_ERS_CNT1_SHIFT (16U) +/*! ERS_CNT1 - Block 1 Erase Pulse Count */ +#define FMUTEST_ERS_PULSE_CNT_ERS_CNT1(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_ERS_PULSE_CNT_ERS_CNT1_SHIFT)) & FMUTEST_ERS_PULSE_CNT_ERS_CNT1_MASK) +/*! @} */ + +/*! @name MAX_PULSE_CNT - Maximum Pulse Count Register */ +/*! @{ */ + +#define FMUTEST_MAX_PULSE_CNT_LAST_PCNT_MASK (0x1FFU) +#define FMUTEST_MAX_PULSE_CNT_LAST_PCNT_SHIFT (0U) +/*! LAST_PCNT - Last SMW Operation's Pulse Count */ +#define FMUTEST_MAX_PULSE_CNT_LAST_PCNT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MAX_PULSE_CNT_LAST_PCNT_SHIFT)) & FMUTEST_MAX_PULSE_CNT_LAST_PCNT_MASK) + +#define FMUTEST_MAX_PULSE_CNT_MAX_ERS_CNT_MASK (0x1FF0000U) +#define FMUTEST_MAX_PULSE_CNT_MAX_ERS_CNT_SHIFT (16U) +/*! MAX_ERS_CNT - Maximum Erase Pulse Count */ +#define FMUTEST_MAX_PULSE_CNT_MAX_ERS_CNT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MAX_PULSE_CNT_MAX_ERS_CNT_SHIFT)) & FMUTEST_MAX_PULSE_CNT_MAX_ERS_CNT_MASK) + +#define FMUTEST_MAX_PULSE_CNT_MAX_PGM_CNT_MASK (0xF8000000U) +#define FMUTEST_MAX_PULSE_CNT_MAX_PGM_CNT_SHIFT (27U) +/*! MAX_PGM_CNT - Maximum Program Pulse Count */ +#define FMUTEST_MAX_PULSE_CNT_MAX_PGM_CNT(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_MAX_PULSE_CNT_MAX_PGM_CNT_SHIFT)) & FMUTEST_MAX_PULSE_CNT_MAX_PGM_CNT_MASK) +/*! @} */ + +/*! @name PORT_CTRL - Port Control Register */ +/*! @{ */ + +#define FMUTEST_PORT_CTRL_BDONE_SEL_MASK (0x3U) +#define FMUTEST_PORT_CTRL_BDONE_SEL_SHIFT (0U) +/*! BDONE_SEL - BIST Done Select + * 0b00..Select internal bist_done signal from current module instantiation + * 0b01..Select ipt_bist_fail signal from current module instantiation + * 0b10..Select ipt_bist_done signal from other module instantiation + * 0b11..Select AND of internal bist_done signal from current module instantiation with ipt_bist_done signal from other module instantiation + */ +#define FMUTEST_PORT_CTRL_BDONE_SEL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_PORT_CTRL_BDONE_SEL_SHIFT)) & FMUTEST_PORT_CTRL_BDONE_SEL_MASK) + +#define FMUTEST_PORT_CTRL_BSDO_SEL_MASK (0xCU) +#define FMUTEST_PORT_CTRL_BSDO_SEL_SHIFT (2U) +/*! BSDO_SEL - BIST Serial Data Output Select + * 0b00..Select internal bist_sdo signal from current module instantiation + * 0b01..Select ipt_bist_done signal from current module instantiation + * 0b10..Select ipt_bist_sdo signal from other module instantiation + * 0b11..Select ipt_bist_done signal from other module instantiation + */ +#define FMUTEST_PORT_CTRL_BSDO_SEL(x) (((uint32_t)(((uint32_t)(x)) << FMUTEST_PORT_CTRL_BSDO_SEL_SHIFT)) & FMUTEST_PORT_CTRL_BSDO_SEL_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group FMUTEST_Register_Masks */ + + +/* FMUTEST - Peripheral instance base addresses */ +/** Peripheral FMU0TEST base address */ +#define FMU0TEST_BASE (0x40096000u) +/** Peripheral FMU0TEST base pointer */ +#define FMU0TEST ((FMUTEST_Type *)FMU0TEST_BASE) +/** Array initializer of FMUTEST peripheral base addresses */ +#define FMUTEST_BASE_ADDRS { FMU0TEST_BASE } +/** Array initializer of FMUTEST peripheral base pointers */ +#define FMUTEST_BASE_PTRS { FMU0TEST } + +/*! + * @} + */ /* end of group FMUTEST_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- FREQME Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FREQME_Peripheral_Access_Layer FREQME Peripheral Access Layer + * @{ + */ + +/** FREQME - Register Layout Typedef */ +typedef struct { + union { /* offset: 0x0 */ + __I uint32_t CTRL_R; /**< Control (in Read mode), offset: 0x0 */ + __O uint32_t CTRL_W; /**< Control (in Write mode), offset: 0x0 */ + }; + __IO uint32_t CTRLSTAT; /**< Control Status, offset: 0x4 */ + __IO uint32_t MIN; /**< Minimum, offset: 0x8 */ + __IO uint32_t MAX; /**< Maximum, offset: 0xC */ +} FREQME_Type; + +/* ---------------------------------------------------------------------------- + -- FREQME Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup FREQME_Register_Masks FREQME Register Masks + * @{ + */ + +/*! @name CTRL_R - Control (in Read mode) */ +/*! @{ */ + +#define FREQME_CTRL_R_RESULT_MASK (0x7FFFFFFFU) +#define FREQME_CTRL_R_RESULT_SHIFT (0U) +#define FREQME_CTRL_R_RESULT(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_R_RESULT_SHIFT)) & FREQME_CTRL_R_RESULT_MASK) + +#define FREQME_CTRL_R_MEASURE_IN_PROGRESS_MASK (0x80000000U) +#define FREQME_CTRL_R_MEASURE_IN_PROGRESS_SHIFT (31U) +/*! MEASURE_IN_PROGRESS - Measurement In Progress + * 0b0..Complete + * 0b1..In progress + */ +#define FREQME_CTRL_R_MEASURE_IN_PROGRESS(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_R_MEASURE_IN_PROGRESS_SHIFT)) & FREQME_CTRL_R_MEASURE_IN_PROGRESS_MASK) +/*! @} */ + +/*! @name CTRL_W - Control (in Write mode) */ +/*! @{ */ + +#define FREQME_CTRL_W_REF_SCALE_MASK (0x1FU) +#define FREQME_CTRL_W_REF_SCALE_SHIFT (0U) +/*! REF_SCALE - Reference Clock Scaling Factor */ +#define FREQME_CTRL_W_REF_SCALE(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_W_REF_SCALE_SHIFT)) & FREQME_CTRL_W_REF_SCALE_MASK) + +#define FREQME_CTRL_W_PULSE_MODE_MASK (0x100U) +#define FREQME_CTRL_W_PULSE_MODE_SHIFT (8U) +/*! PULSE_MODE - Pulse Width Measurement Mode Select + * 0b0..Frequency Measurement mode + * 0b1..Pulse Width Measurement mode + */ +#define FREQME_CTRL_W_PULSE_MODE(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_W_PULSE_MODE_SHIFT)) & FREQME_CTRL_W_PULSE_MODE_MASK) + +#define FREQME_CTRL_W_PULSE_POL_MASK (0x200U) +#define FREQME_CTRL_W_PULSE_POL_SHIFT (9U) +/*! PULSE_POL - Pulse Polarity + * 0b0..High period + * 0b1..Low period + */ +#define FREQME_CTRL_W_PULSE_POL(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_W_PULSE_POL_SHIFT)) & FREQME_CTRL_W_PULSE_POL_MASK) + +#define FREQME_CTRL_W_LT_MIN_INT_EN_MASK (0x1000U) +#define FREQME_CTRL_W_LT_MIN_INT_EN_SHIFT (12U) +/*! LT_MIN_INT_EN - Less Than Minimum Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define FREQME_CTRL_W_LT_MIN_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_W_LT_MIN_INT_EN_SHIFT)) & FREQME_CTRL_W_LT_MIN_INT_EN_MASK) + +#define FREQME_CTRL_W_GT_MAX_INT_EN_MASK (0x2000U) +#define FREQME_CTRL_W_GT_MAX_INT_EN_SHIFT (13U) +/*! GT_MAX_INT_EN - Greater Than Maximum Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define FREQME_CTRL_W_GT_MAX_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_W_GT_MAX_INT_EN_SHIFT)) & FREQME_CTRL_W_GT_MAX_INT_EN_MASK) + +#define FREQME_CTRL_W_RESULT_READY_INT_EN_MASK (0x4000U) +#define FREQME_CTRL_W_RESULT_READY_INT_EN_SHIFT (14U) +/*! RESULT_READY_INT_EN - Result Ready Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define FREQME_CTRL_W_RESULT_READY_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_W_RESULT_READY_INT_EN_SHIFT)) & FREQME_CTRL_W_RESULT_READY_INT_EN_MASK) + +#define FREQME_CTRL_W_CONTINUOUS_MODE_EN_MASK (0x40000000U) +#define FREQME_CTRL_W_CONTINUOUS_MODE_EN_SHIFT (30U) +/*! CONTINUOUS_MODE_EN - Continuous Mode Enable + * 0b0..Disable + * 0b1..Enable + */ +#define FREQME_CTRL_W_CONTINUOUS_MODE_EN(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_W_CONTINUOUS_MODE_EN_SHIFT)) & FREQME_CTRL_W_CONTINUOUS_MODE_EN_MASK) + +#define FREQME_CTRL_W_MEASURE_IN_PROGRESS_MASK (0x80000000U) +#define FREQME_CTRL_W_MEASURE_IN_PROGRESS_SHIFT (31U) +/*! MEASURE_IN_PROGRESS - Measurement In Progress + * 0b0..Terminates measurement + * 0b1..Initiates measurement + */ +#define FREQME_CTRL_W_MEASURE_IN_PROGRESS(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRL_W_MEASURE_IN_PROGRESS_SHIFT)) & FREQME_CTRL_W_MEASURE_IN_PROGRESS_MASK) +/*! @} */ + +/*! @name CTRLSTAT - Control Status */ +/*! @{ */ + +#define FREQME_CTRLSTAT_REF_SCALE_MASK (0x1FU) +#define FREQME_CTRLSTAT_REF_SCALE_SHIFT (0U) +/*! REF_SCALE - Reference Scale */ +#define FREQME_CTRLSTAT_REF_SCALE(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_REF_SCALE_SHIFT)) & FREQME_CTRLSTAT_REF_SCALE_MASK) + +#define FREQME_CTRLSTAT_PULSE_MODE_MASK (0x100U) +#define FREQME_CTRLSTAT_PULSE_MODE_SHIFT (8U) +/*! PULSE_MODE - Pulse Mode + * 0b0..Frequency Measurement mode + * 0b1..Pulse Width Measurement mode + */ +#define FREQME_CTRLSTAT_PULSE_MODE(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_PULSE_MODE_SHIFT)) & FREQME_CTRLSTAT_PULSE_MODE_MASK) + +#define FREQME_CTRLSTAT_PULSE_POL_MASK (0x200U) +#define FREQME_CTRLSTAT_PULSE_POL_SHIFT (9U) +/*! PULSE_POL - Pulse Polarity + * 0b0..High period + * 0b1..Low period + */ +#define FREQME_CTRLSTAT_PULSE_POL(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_PULSE_POL_SHIFT)) & FREQME_CTRLSTAT_PULSE_POL_MASK) + +#define FREQME_CTRLSTAT_LT_MIN_INT_EN_MASK (0x1000U) +#define FREQME_CTRLSTAT_LT_MIN_INT_EN_SHIFT (12U) +/*! LT_MIN_INT_EN - Less Than Minimum Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define FREQME_CTRLSTAT_LT_MIN_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_LT_MIN_INT_EN_SHIFT)) & FREQME_CTRLSTAT_LT_MIN_INT_EN_MASK) + +#define FREQME_CTRLSTAT_GT_MAX_INT_EN_MASK (0x2000U) +#define FREQME_CTRLSTAT_GT_MAX_INT_EN_SHIFT (13U) +/*! GT_MAX_INT_EN - Greater Than Maximum Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define FREQME_CTRLSTAT_GT_MAX_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_GT_MAX_INT_EN_SHIFT)) & FREQME_CTRLSTAT_GT_MAX_INT_EN_MASK) + +#define FREQME_CTRLSTAT_RESULT_READY_INT_EN_MASK (0x4000U) +#define FREQME_CTRLSTAT_RESULT_READY_INT_EN_SHIFT (14U) +/*! RESULT_READY_INT_EN - Result Ready Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define FREQME_CTRLSTAT_RESULT_READY_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_RESULT_READY_INT_EN_SHIFT)) & FREQME_CTRLSTAT_RESULT_READY_INT_EN_MASK) + +#define FREQME_CTRLSTAT_LT_MIN_STAT_MASK (0x1000000U) +#define FREQME_CTRLSTAT_LT_MIN_STAT_SHIFT (24U) +/*! LT_MIN_STAT - Less Than Minimum Results Status + * 0b0..Greater than MIN[MIN_VALUE] + * 0b1..Less than MIN[MIN_VALUE] + */ +#define FREQME_CTRLSTAT_LT_MIN_STAT(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_LT_MIN_STAT_SHIFT)) & FREQME_CTRLSTAT_LT_MIN_STAT_MASK) + +#define FREQME_CTRLSTAT_GT_MAX_STAT_MASK (0x2000000U) +#define FREQME_CTRLSTAT_GT_MAX_STAT_SHIFT (25U) +/*! GT_MAX_STAT - Greater Than Maximum Result Status + * 0b0..Less than MAX[MAX_VALUE] + * 0b1..Greater than MAX[MAX_VALUE] + */ +#define FREQME_CTRLSTAT_GT_MAX_STAT(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_GT_MAX_STAT_SHIFT)) & FREQME_CTRLSTAT_GT_MAX_STAT_MASK) + +#define FREQME_CTRLSTAT_RESULT_READY_STAT_MASK (0x4000000U) +#define FREQME_CTRLSTAT_RESULT_READY_STAT_SHIFT (26U) +/*! RESULT_READY_STAT - Result Ready Status + * 0b0..Not complete + * 0b1..Complete + */ +#define FREQME_CTRLSTAT_RESULT_READY_STAT(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_RESULT_READY_STAT_SHIFT)) & FREQME_CTRLSTAT_RESULT_READY_STAT_MASK) + +#define FREQME_CTRLSTAT_CONTINUOUS_MODE_EN_MASK (0x40000000U) +#define FREQME_CTRLSTAT_CONTINUOUS_MODE_EN_SHIFT (30U) +/*! CONTINUOUS_MODE_EN - Continuous Mode Enable Status + * 0b0..Disabled + * 0b1..Enabled + */ +#define FREQME_CTRLSTAT_CONTINUOUS_MODE_EN(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_CONTINUOUS_MODE_EN_SHIFT)) & FREQME_CTRLSTAT_CONTINUOUS_MODE_EN_MASK) + +#define FREQME_CTRLSTAT_MEASURE_IN_PROGRESS_MASK (0x80000000U) +#define FREQME_CTRLSTAT_MEASURE_IN_PROGRESS_SHIFT (31U) +/*! MEASURE_IN_PROGRESS - Measurement in Progress Status + * 0b0..Not in progress + * 0b1..In progress + */ +#define FREQME_CTRLSTAT_MEASURE_IN_PROGRESS(x) (((uint32_t)(((uint32_t)(x)) << FREQME_CTRLSTAT_MEASURE_IN_PROGRESS_SHIFT)) & FREQME_CTRLSTAT_MEASURE_IN_PROGRESS_MASK) +/*! @} */ + +/*! @name MIN - Minimum */ +/*! @{ */ + +#define FREQME_MIN_MIN_VALUE_MASK (0x7FFFFFFFU) +#define FREQME_MIN_MIN_VALUE_SHIFT (0U) +/*! MIN_VALUE - Minimum Value */ +#define FREQME_MIN_MIN_VALUE(x) (((uint32_t)(((uint32_t)(x)) << FREQME_MIN_MIN_VALUE_SHIFT)) & FREQME_MIN_MIN_VALUE_MASK) +/*! @} */ + +/*! @name MAX - Maximum */ +/*! @{ */ + +#define FREQME_MAX_MAX_VALUE_MASK (0x7FFFFFFFU) +#define FREQME_MAX_MAX_VALUE_SHIFT (0U) +/*! MAX_VALUE - Maximum Value */ +#define FREQME_MAX_MAX_VALUE(x) (((uint32_t)(((uint32_t)(x)) << FREQME_MAX_MAX_VALUE_SHIFT)) & FREQME_MAX_MAX_VALUE_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group FREQME_Register_Masks */ + + +/* FREQME - Peripheral instance base addresses */ +/** Peripheral FREQME0 base address */ +#define FREQME0_BASE (0x40009000u) +/** Peripheral FREQME0 base pointer */ +#define FREQME0 ((FREQME_Type *)FREQME0_BASE) +/** Array initializer of FREQME peripheral base addresses */ +#define FREQME_BASE_ADDRS { FREQME0_BASE } +/** Array initializer of FREQME peripheral base pointers */ +#define FREQME_BASE_PTRS { FREQME0 } + +/*! + * @} + */ /* end of group FREQME_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- GLIKEY Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup GLIKEY_Peripheral_Access_Layer GLIKEY Peripheral Access Layer + * @{ + */ + +/** GLIKEY - Register Layout Typedef */ +typedef struct { + __IO uint32_t CTRL_0; /**< Control Register 0 SFR, offset: 0x0 */ + __IO uint32_t CTRL_1; /**< Control Regsiter 1 SFR, offset: 0x4 */ + __IO uint32_t INTR_CTRL; /**< Interrupt Control, offset: 0x8 */ + __I uint32_t STATUS; /**< Status, offset: 0xC */ + uint8_t RESERVED_0[236]; + __I uint32_t VERSION; /**< IP Version, offset: 0xFC */ +} GLIKEY_Type; + +/* ---------------------------------------------------------------------------- + -- GLIKEY Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup GLIKEY_Register_Masks GLIKEY Register Masks + * @{ + */ + +/*! @name CTRL_0 - Control Register 0 SFR */ +/*! @{ */ + +#define GLIKEY_CTRL_0_WRITE_INDEX_MASK (0xFFU) +#define GLIKEY_CTRL_0_WRITE_INDEX_SHIFT (0U) +/*! WRITE_INDEX - Write Index */ +#define GLIKEY_CTRL_0_WRITE_INDEX(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_0_WRITE_INDEX_SHIFT)) & GLIKEY_CTRL_0_WRITE_INDEX_MASK) + +#define GLIKEY_CTRL_0_RESERVED15_MASK (0xFF00U) +#define GLIKEY_CTRL_0_RESERVED15_SHIFT (8U) +/*! RESERVED15 - Reserved for Future Use */ +#define GLIKEY_CTRL_0_RESERVED15(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_0_RESERVED15_SHIFT)) & GLIKEY_CTRL_0_RESERVED15_MASK) + +#define GLIKEY_CTRL_0_WR_EN_0_MASK (0x30000U) +#define GLIKEY_CTRL_0_WR_EN_0_SHIFT (16U) +/*! WR_EN_0 - Write Enable 0 */ +#define GLIKEY_CTRL_0_WR_EN_0(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_0_WR_EN_0_SHIFT)) & GLIKEY_CTRL_0_WR_EN_0_MASK) + +#define GLIKEY_CTRL_0_SFT_RST_MASK (0x40000U) +#define GLIKEY_CTRL_0_SFT_RST_SHIFT (18U) +/*! SFT_RST - Soft reset for the core reset (SFR configuration will be preseved).This register reads as 0 + * 0b0..No effect + * 0b1..Triggers the soft reset + */ +#define GLIKEY_CTRL_0_SFT_RST(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_0_SFT_RST_SHIFT)) & GLIKEY_CTRL_0_SFT_RST_MASK) + +#define GLIKEY_CTRL_0_RESERVED31_MASK (0xFFF80000U) +#define GLIKEY_CTRL_0_RESERVED31_SHIFT (19U) +/*! RESERVED31 - Reserved for Future Use */ +#define GLIKEY_CTRL_0_RESERVED31(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_0_RESERVED31_SHIFT)) & GLIKEY_CTRL_0_RESERVED31_MASK) +/*! @} */ + +/*! @name CTRL_1 - Control Regsiter 1 SFR */ +/*! @{ */ + +#define GLIKEY_CTRL_1_READ_INDEX_MASK (0xFFU) +#define GLIKEY_CTRL_1_READ_INDEX_SHIFT (0U) +/*! READ_INDEX - Index status, Writing an index value to this register will request the block to return the lock status of this index. */ +#define GLIKEY_CTRL_1_READ_INDEX(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_1_READ_INDEX_SHIFT)) & GLIKEY_CTRL_1_READ_INDEX_MASK) + +#define GLIKEY_CTRL_1_RESERVED15_MASK (0xFF00U) +#define GLIKEY_CTRL_1_RESERVED15_SHIFT (8U) +/*! RESERVED15 - Reserved for Future Use */ +#define GLIKEY_CTRL_1_RESERVED15(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_1_RESERVED15_SHIFT)) & GLIKEY_CTRL_1_RESERVED15_MASK) + +#define GLIKEY_CTRL_1_WR_EN_1_MASK (0x30000U) +#define GLIKEY_CTRL_1_WR_EN_1_SHIFT (16U) +/*! WR_EN_1 - Write Enable One */ +#define GLIKEY_CTRL_1_WR_EN_1(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_1_WR_EN_1_SHIFT)) & GLIKEY_CTRL_1_WR_EN_1_MASK) + +#define GLIKEY_CTRL_1_SFR_LOCK_MASK (0x3C0000U) +#define GLIKEY_CTRL_1_SFR_LOCK_SHIFT (18U) +/*! SFR_LOCK - LOCK register for GLIKEY */ +#define GLIKEY_CTRL_1_SFR_LOCK(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_1_SFR_LOCK_SHIFT)) & GLIKEY_CTRL_1_SFR_LOCK_MASK) + +#define GLIKEY_CTRL_1_RESERVED31_MASK (0xFFC00000U) +#define GLIKEY_CTRL_1_RESERVED31_SHIFT (22U) +/*! RESERVED31 - Reserved for Future Use */ +#define GLIKEY_CTRL_1_RESERVED31(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_CTRL_1_RESERVED31_SHIFT)) & GLIKEY_CTRL_1_RESERVED31_MASK) +/*! @} */ + +/*! @name INTR_CTRL - Interrupt Control */ +/*! @{ */ + +#define GLIKEY_INTR_CTRL_INT_EN_MASK (0x1U) +#define GLIKEY_INTR_CTRL_INT_EN_SHIFT (0U) +/*! INT_EN - Interrupt Enable. Writing a 1, Interrupt asserts on Interrupt output port */ +#define GLIKEY_INTR_CTRL_INT_EN(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_INTR_CTRL_INT_EN_SHIFT)) & GLIKEY_INTR_CTRL_INT_EN_MASK) + +#define GLIKEY_INTR_CTRL_INT_CLR_MASK (0x2U) +#define GLIKEY_INTR_CTRL_INT_CLR_SHIFT (1U) +/*! INT_CLR - Interrupt Clear. Writing a 1 to this register creates a single interrupt clear pulse. This register reads as 0 */ +#define GLIKEY_INTR_CTRL_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_INTR_CTRL_INT_CLR_SHIFT)) & GLIKEY_INTR_CTRL_INT_CLR_MASK) + +#define GLIKEY_INTR_CTRL_INT_SET_MASK (0x4U) +#define GLIKEY_INTR_CTRL_INT_SET_SHIFT (2U) +/*! INT_SET - Interrupt Set. Writing a 1 to this register asserts the interrupt. This register reads as 0 + * 0b0..No effect + * 0b1..Triggers interrupt + */ +#define GLIKEY_INTR_CTRL_INT_SET(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_INTR_CTRL_INT_SET_SHIFT)) & GLIKEY_INTR_CTRL_INT_SET_MASK) + +#define GLIKEY_INTR_CTRL_RESERVED31_MASK (0xFFFFFFF8U) +#define GLIKEY_INTR_CTRL_RESERVED31_SHIFT (3U) +/*! RESERVED31 - Reserved for Future Use */ +#define GLIKEY_INTR_CTRL_RESERVED31(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_INTR_CTRL_RESERVED31_SHIFT)) & GLIKEY_INTR_CTRL_RESERVED31_MASK) +/*! @} */ + +/*! @name STATUS - Status */ +/*! @{ */ + +#define GLIKEY_STATUS_INT_STATUS_MASK (0x1U) +#define GLIKEY_STATUS_INT_STATUS_SHIFT (0U) +/*! INT_STATUS - Interrupt Status. + * 0b0..No effect + * 0b1..Triggers interrupt + */ +#define GLIKEY_STATUS_INT_STATUS(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_STATUS_INT_STATUS_SHIFT)) & GLIKEY_STATUS_INT_STATUS_MASK) + +#define GLIKEY_STATUS_LOCK_STATUS_MASK (0x2U) +#define GLIKEY_STATUS_LOCK_STATUS_SHIFT (1U) +/*! LOCK_STATUS - Provides the current lock status of indexes. + * 0b0..Current read index is not locked + * 0b1..Current read index is locked + */ +#define GLIKEY_STATUS_LOCK_STATUS(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_STATUS_LOCK_STATUS_SHIFT)) & GLIKEY_STATUS_LOCK_STATUS_MASK) + +#define GLIKEY_STATUS_ERROR_STATUS_MASK (0x1CU) +#define GLIKEY_STATUS_ERROR_STATUS_SHIFT (2U) +/*! ERROR_STATUS - Status of the Error + * 0b000..No error + * 0b001..FSM error has occurred + * 0b010..Write index out of the bound (OOB) error + * 0b011..Write index OOB and FSM error + * 0b100..Read index OOB error + * 0b110..Write index and read index OOB error + * 0b111..Read index OOB, write index OOB, and FSM error + */ +#define GLIKEY_STATUS_ERROR_STATUS(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_STATUS_ERROR_STATUS_SHIFT)) & GLIKEY_STATUS_ERROR_STATUS_MASK) + +#define GLIKEY_STATUS_RESERVED18_MASK (0x7FFE0U) +#define GLIKEY_STATUS_RESERVED18_SHIFT (5U) +/*! RESERVED18 - Reserved for Future Use */ +#define GLIKEY_STATUS_RESERVED18(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_STATUS_RESERVED18_SHIFT)) & GLIKEY_STATUS_RESERVED18_MASK) + +#define GLIKEY_STATUS_FSM_STATE_MASK (0xFFF80000U) +#define GLIKEY_STATUS_FSM_STATE_SHIFT (19U) +/*! FSM_STATE - Status of FSM */ +#define GLIKEY_STATUS_FSM_STATE(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_STATUS_FSM_STATE_SHIFT)) & GLIKEY_STATUS_FSM_STATE_MASK) +/*! @} */ + +/*! @name VERSION - IP Version */ +/*! @{ */ + +#define GLIKEY_VERSION_RESERVED3_MASK (0xFU) +#define GLIKEY_VERSION_RESERVED3_SHIFT (0U) +/*! Reserved3 - Reserved */ +#define GLIKEY_VERSION_RESERVED3(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_VERSION_RESERVED3_SHIFT)) & GLIKEY_VERSION_RESERVED3_MASK) + +#define GLIKEY_VERSION_RESERVED7_MASK (0xF0U) +#define GLIKEY_VERSION_RESERVED7_SHIFT (4U) +/*! Reserved7 - Reserved */ +#define GLIKEY_VERSION_RESERVED7(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_VERSION_RESERVED7_SHIFT)) & GLIKEY_VERSION_RESERVED7_MASK) + +#define GLIKEY_VERSION_RESERVED11_MASK (0xF00U) +#define GLIKEY_VERSION_RESERVED11_SHIFT (8U) +/*! Reserved11 - Reserved */ +#define GLIKEY_VERSION_RESERVED11(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_VERSION_RESERVED11_SHIFT)) & GLIKEY_VERSION_RESERVED11_MASK) + +#define GLIKEY_VERSION_RESERVED15_MASK (0xF000U) +#define GLIKEY_VERSION_RESERVED15_SHIFT (12U) +/*! Reserved15 - Reserved */ +#define GLIKEY_VERSION_RESERVED15(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_VERSION_RESERVED15_SHIFT)) & GLIKEY_VERSION_RESERVED15_MASK) + +#define GLIKEY_VERSION_RESERVED16_MASK (0x30000U) +#define GLIKEY_VERSION_RESERVED16_SHIFT (16U) +/*! Reserved16 - Reserved */ +#define GLIKEY_VERSION_RESERVED16(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_VERSION_RESERVED16_SHIFT)) & GLIKEY_VERSION_RESERVED16_MASK) + +#define GLIKEY_VERSION_FSM_CONFIG_MASK (0x40000U) +#define GLIKEY_VERSION_FSM_CONFIG_SHIFT (18U) +/*! FSM_CONFIG - 0:4 step, 1:8 step */ +#define GLIKEY_VERSION_FSM_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_VERSION_FSM_CONFIG_SHIFT)) & GLIKEY_VERSION_FSM_CONFIG_MASK) + +#define GLIKEY_VERSION_INDEX_CONFIG_MASK (0x7F80000U) +#define GLIKEY_VERSION_INDEX_CONFIG_SHIFT (19U) +/*! INDEX_CONFIG - Configured number of addressable indexes */ +#define GLIKEY_VERSION_INDEX_CONFIG(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_VERSION_INDEX_CONFIG_SHIFT)) & GLIKEY_VERSION_INDEX_CONFIG_MASK) + +#define GLIKEY_VERSION_RESERVED31_MASK (0xF8000000U) +#define GLIKEY_VERSION_RESERVED31_SHIFT (27U) +/*! Reserved31 - Reserved for Future Use */ +#define GLIKEY_VERSION_RESERVED31(x) (((uint32_t)(((uint32_t)(x)) << GLIKEY_VERSION_RESERVED31_SHIFT)) & GLIKEY_VERSION_RESERVED31_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group GLIKEY_Register_Masks */ + + +/* GLIKEY - Peripheral instance base addresses */ +/** Peripheral GLIKEY0 base address */ +#define GLIKEY0_BASE (0x40091D00u) +/** Peripheral GLIKEY0 base pointer */ +#define GLIKEY0 ((GLIKEY_Type *)GLIKEY0_BASE) +/** Array initializer of GLIKEY peripheral base addresses */ +#define GLIKEY_BASE_ADDRS { GLIKEY0_BASE } +/** Array initializer of GLIKEY peripheral base pointers */ +#define GLIKEY_BASE_PTRS { GLIKEY0 } + +/*! + * @} + */ /* end of group GLIKEY_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- GPIO Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup GPIO_Peripheral_Access_Layer GPIO Peripheral Access Layer + * @{ + */ + +/** GPIO - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + uint8_t RESERVED_0[56]; + __IO uint32_t PDOR; /**< Port Data Output, offset: 0x40 */ + __O uint32_t PSOR; /**< Port Set Output, offset: 0x44 */ + __O uint32_t PCOR; /**< Port Clear Output, offset: 0x48 */ + __O uint32_t PTOR; /**< Port Toggle Output, offset: 0x4C */ + __I uint32_t PDIR; /**< Port Data Input, offset: 0x50 */ + __IO uint32_t PDDR; /**< Port Data Direction, offset: 0x54 */ + __IO uint32_t PIDR; /**< Port Input Disable, offset: 0x58 */ + uint8_t RESERVED_1[4]; + __IO uint8_t PDR[32]; /**< Pin Data, array offset: 0x60, array step: 0x1 */ + __IO uint32_t ICR[32]; /**< Interrupt Control 0..Interrupt Control 31, array offset: 0x80, array step: 0x4 */ + __O uint32_t GICLR; /**< Global Interrupt Control Low, offset: 0x100 */ + __O uint32_t GICHR; /**< Global Interrupt Control High, offset: 0x104 */ + uint8_t RESERVED_2[24]; + __IO uint32_t ISFR[1]; /**< Interrupt Status Flag, array offset: 0x120, array step: 0x4 */ +} GPIO_Type; + +/* ---------------------------------------------------------------------------- + -- GPIO Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup GPIO_Register_Masks GPIO Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define GPIO_VERID_FEATURE_MASK (0xFFFFU) +#define GPIO_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number + * 0b0000000000000000..Basic implementation + * 0b0000000000000001..Protection registers implemented + */ +#define GPIO_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << GPIO_VERID_FEATURE_SHIFT)) & GPIO_VERID_FEATURE_MASK) + +#define GPIO_VERID_MINOR_MASK (0xFF0000U) +#define GPIO_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define GPIO_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_VERID_MINOR_SHIFT)) & GPIO_VERID_MINOR_MASK) + +#define GPIO_VERID_MAJOR_MASK (0xFF000000U) +#define GPIO_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define GPIO_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << GPIO_VERID_MAJOR_SHIFT)) & GPIO_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define GPIO_PARAM_IRQNUM_MASK (0xFU) +#define GPIO_PARAM_IRQNUM_SHIFT (0U) +/*! IRQNUM - Interrupt Number */ +#define GPIO_PARAM_IRQNUM(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PARAM_IRQNUM_SHIFT)) & GPIO_PARAM_IRQNUM_MASK) +/*! @} */ + +/*! @name PDOR - Port Data Output */ +/*! @{ */ + +#define GPIO_PDOR_PDO0_MASK (0x1U) +#define GPIO_PDOR_PDO0_SHIFT (0U) +/*! PDO0 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO0_SHIFT)) & GPIO_PDOR_PDO0_MASK) + +#define GPIO_PDOR_PDO1_MASK (0x2U) +#define GPIO_PDOR_PDO1_SHIFT (1U) +/*! PDO1 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO1_SHIFT)) & GPIO_PDOR_PDO1_MASK) + +#define GPIO_PDOR_PDO2_MASK (0x4U) +#define GPIO_PDOR_PDO2_SHIFT (2U) +/*! PDO2 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO2_SHIFT)) & GPIO_PDOR_PDO2_MASK) + +#define GPIO_PDOR_PDO3_MASK (0x8U) +#define GPIO_PDOR_PDO3_SHIFT (3U) +/*! PDO3 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO3_SHIFT)) & GPIO_PDOR_PDO3_MASK) + +#define GPIO_PDOR_PDO4_MASK (0x10U) +#define GPIO_PDOR_PDO4_SHIFT (4U) +/*! PDO4 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO4_SHIFT)) & GPIO_PDOR_PDO4_MASK) + +#define GPIO_PDOR_PDO5_MASK (0x20U) +#define GPIO_PDOR_PDO5_SHIFT (5U) +/*! PDO5 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO5_SHIFT)) & GPIO_PDOR_PDO5_MASK) + +#define GPIO_PDOR_PDO6_MASK (0x40U) +#define GPIO_PDOR_PDO6_SHIFT (6U) +/*! PDO6 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO6_SHIFT)) & GPIO_PDOR_PDO6_MASK) + +#define GPIO_PDOR_PDO7_MASK (0x80U) +#define GPIO_PDOR_PDO7_SHIFT (7U) +/*! PDO7 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO7_SHIFT)) & GPIO_PDOR_PDO7_MASK) + +#define GPIO_PDOR_PDO8_MASK (0x100U) +#define GPIO_PDOR_PDO8_SHIFT (8U) +/*! PDO8 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO8_SHIFT)) & GPIO_PDOR_PDO8_MASK) + +#define GPIO_PDOR_PDO9_MASK (0x200U) +#define GPIO_PDOR_PDO9_SHIFT (9U) +/*! PDO9 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO9_SHIFT)) & GPIO_PDOR_PDO9_MASK) + +#define GPIO_PDOR_PDO10_MASK (0x400U) +#define GPIO_PDOR_PDO10_SHIFT (10U) +/*! PDO10 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO10_SHIFT)) & GPIO_PDOR_PDO10_MASK) + +#define GPIO_PDOR_PDO11_MASK (0x800U) +#define GPIO_PDOR_PDO11_SHIFT (11U) +/*! PDO11 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO11_SHIFT)) & GPIO_PDOR_PDO11_MASK) + +#define GPIO_PDOR_PDO12_MASK (0x1000U) +#define GPIO_PDOR_PDO12_SHIFT (12U) +/*! PDO12 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO12_SHIFT)) & GPIO_PDOR_PDO12_MASK) + +#define GPIO_PDOR_PDO13_MASK (0x2000U) +#define GPIO_PDOR_PDO13_SHIFT (13U) +/*! PDO13 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO13_SHIFT)) & GPIO_PDOR_PDO13_MASK) + +#define GPIO_PDOR_PDO14_MASK (0x4000U) +#define GPIO_PDOR_PDO14_SHIFT (14U) +/*! PDO14 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO14_SHIFT)) & GPIO_PDOR_PDO14_MASK) + +#define GPIO_PDOR_PDO15_MASK (0x8000U) +#define GPIO_PDOR_PDO15_SHIFT (15U) +/*! PDO15 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO15_SHIFT)) & GPIO_PDOR_PDO15_MASK) + +#define GPIO_PDOR_PDO16_MASK (0x10000U) +#define GPIO_PDOR_PDO16_SHIFT (16U) +/*! PDO16 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO16_SHIFT)) & GPIO_PDOR_PDO16_MASK) + +#define GPIO_PDOR_PDO17_MASK (0x20000U) +#define GPIO_PDOR_PDO17_SHIFT (17U) +/*! PDO17 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO17_SHIFT)) & GPIO_PDOR_PDO17_MASK) + +#define GPIO_PDOR_PDO18_MASK (0x40000U) +#define GPIO_PDOR_PDO18_SHIFT (18U) +/*! PDO18 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO18_SHIFT)) & GPIO_PDOR_PDO18_MASK) + +#define GPIO_PDOR_PDO19_MASK (0x80000U) +#define GPIO_PDOR_PDO19_SHIFT (19U) +/*! PDO19 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO19_SHIFT)) & GPIO_PDOR_PDO19_MASK) + +#define GPIO_PDOR_PDO20_MASK (0x100000U) +#define GPIO_PDOR_PDO20_SHIFT (20U) +/*! PDO20 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO20_SHIFT)) & GPIO_PDOR_PDO20_MASK) + +#define GPIO_PDOR_PDO21_MASK (0x200000U) +#define GPIO_PDOR_PDO21_SHIFT (21U) +/*! PDO21 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO21_SHIFT)) & GPIO_PDOR_PDO21_MASK) + +#define GPIO_PDOR_PDO22_MASK (0x400000U) +#define GPIO_PDOR_PDO22_SHIFT (22U) +/*! PDO22 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO22_SHIFT)) & GPIO_PDOR_PDO22_MASK) + +#define GPIO_PDOR_PDO23_MASK (0x800000U) +#define GPIO_PDOR_PDO23_SHIFT (23U) +/*! PDO23 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO23_SHIFT)) & GPIO_PDOR_PDO23_MASK) + +#define GPIO_PDOR_PDO24_MASK (0x1000000U) +#define GPIO_PDOR_PDO24_SHIFT (24U) +/*! PDO24 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO24_SHIFT)) & GPIO_PDOR_PDO24_MASK) + +#define GPIO_PDOR_PDO25_MASK (0x2000000U) +#define GPIO_PDOR_PDO25_SHIFT (25U) +/*! PDO25 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO25_SHIFT)) & GPIO_PDOR_PDO25_MASK) + +#define GPIO_PDOR_PDO26_MASK (0x4000000U) +#define GPIO_PDOR_PDO26_SHIFT (26U) +/*! PDO26 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO26_SHIFT)) & GPIO_PDOR_PDO26_MASK) + +#define GPIO_PDOR_PDO27_MASK (0x8000000U) +#define GPIO_PDOR_PDO27_SHIFT (27U) +/*! PDO27 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO27_SHIFT)) & GPIO_PDOR_PDO27_MASK) + +#define GPIO_PDOR_PDO28_MASK (0x10000000U) +#define GPIO_PDOR_PDO28_SHIFT (28U) +/*! PDO28 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO28_SHIFT)) & GPIO_PDOR_PDO28_MASK) + +#define GPIO_PDOR_PDO29_MASK (0x20000000U) +#define GPIO_PDOR_PDO29_SHIFT (29U) +/*! PDO29 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO29_SHIFT)) & GPIO_PDOR_PDO29_MASK) + +#define GPIO_PDOR_PDO30_MASK (0x40000000U) +#define GPIO_PDOR_PDO30_SHIFT (30U) +/*! PDO30 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO30_SHIFT)) & GPIO_PDOR_PDO30_MASK) + +#define GPIO_PDOR_PDO31_MASK (0x80000000U) +#define GPIO_PDOR_PDO31_SHIFT (31U) +/*! PDO31 - Port Data Output + * 0b0..Logic level 0 + * 0b1..Logic level 1 + */ +#define GPIO_PDOR_PDO31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDOR_PDO31_SHIFT)) & GPIO_PDOR_PDO31_MASK) +/*! @} */ + +/*! @name PSOR - Port Set Output */ +/*! @{ */ + +#define GPIO_PSOR_PTSO0_MASK (0x1U) +#define GPIO_PSOR_PTSO0_SHIFT (0U) +/*! PTSO0 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO0_SHIFT)) & GPIO_PSOR_PTSO0_MASK) + +#define GPIO_PSOR_PTSO1_MASK (0x2U) +#define GPIO_PSOR_PTSO1_SHIFT (1U) +/*! PTSO1 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO1_SHIFT)) & GPIO_PSOR_PTSO1_MASK) + +#define GPIO_PSOR_PTSO2_MASK (0x4U) +#define GPIO_PSOR_PTSO2_SHIFT (2U) +/*! PTSO2 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO2_SHIFT)) & GPIO_PSOR_PTSO2_MASK) + +#define GPIO_PSOR_PTSO3_MASK (0x8U) +#define GPIO_PSOR_PTSO3_SHIFT (3U) +/*! PTSO3 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO3_SHIFT)) & GPIO_PSOR_PTSO3_MASK) + +#define GPIO_PSOR_PTSO4_MASK (0x10U) +#define GPIO_PSOR_PTSO4_SHIFT (4U) +/*! PTSO4 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO4_SHIFT)) & GPIO_PSOR_PTSO4_MASK) + +#define GPIO_PSOR_PTSO5_MASK (0x20U) +#define GPIO_PSOR_PTSO5_SHIFT (5U) +/*! PTSO5 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO5_SHIFT)) & GPIO_PSOR_PTSO5_MASK) + +#define GPIO_PSOR_PTSO6_MASK (0x40U) +#define GPIO_PSOR_PTSO6_SHIFT (6U) +/*! PTSO6 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO6_SHIFT)) & GPIO_PSOR_PTSO6_MASK) + +#define GPIO_PSOR_PTSO7_MASK (0x80U) +#define GPIO_PSOR_PTSO7_SHIFT (7U) +/*! PTSO7 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO7_SHIFT)) & GPIO_PSOR_PTSO7_MASK) + +#define GPIO_PSOR_PTSO8_MASK (0x100U) +#define GPIO_PSOR_PTSO8_SHIFT (8U) +/*! PTSO8 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO8_SHIFT)) & GPIO_PSOR_PTSO8_MASK) + +#define GPIO_PSOR_PTSO9_MASK (0x200U) +#define GPIO_PSOR_PTSO9_SHIFT (9U) +/*! PTSO9 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO9_SHIFT)) & GPIO_PSOR_PTSO9_MASK) + +#define GPIO_PSOR_PTSO10_MASK (0x400U) +#define GPIO_PSOR_PTSO10_SHIFT (10U) +/*! PTSO10 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO10_SHIFT)) & GPIO_PSOR_PTSO10_MASK) + +#define GPIO_PSOR_PTSO11_MASK (0x800U) +#define GPIO_PSOR_PTSO11_SHIFT (11U) +/*! PTSO11 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO11_SHIFT)) & GPIO_PSOR_PTSO11_MASK) + +#define GPIO_PSOR_PTSO12_MASK (0x1000U) +#define GPIO_PSOR_PTSO12_SHIFT (12U) +/*! PTSO12 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO12_SHIFT)) & GPIO_PSOR_PTSO12_MASK) + +#define GPIO_PSOR_PTSO13_MASK (0x2000U) +#define GPIO_PSOR_PTSO13_SHIFT (13U) +/*! PTSO13 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO13_SHIFT)) & GPIO_PSOR_PTSO13_MASK) + +#define GPIO_PSOR_PTSO14_MASK (0x4000U) +#define GPIO_PSOR_PTSO14_SHIFT (14U) +/*! PTSO14 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO14_SHIFT)) & GPIO_PSOR_PTSO14_MASK) + +#define GPIO_PSOR_PTSO15_MASK (0x8000U) +#define GPIO_PSOR_PTSO15_SHIFT (15U) +/*! PTSO15 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO15_SHIFT)) & GPIO_PSOR_PTSO15_MASK) + +#define GPIO_PSOR_PTSO16_MASK (0x10000U) +#define GPIO_PSOR_PTSO16_SHIFT (16U) +/*! PTSO16 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO16_SHIFT)) & GPIO_PSOR_PTSO16_MASK) + +#define GPIO_PSOR_PTSO17_MASK (0x20000U) +#define GPIO_PSOR_PTSO17_SHIFT (17U) +/*! PTSO17 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO17_SHIFT)) & GPIO_PSOR_PTSO17_MASK) + +#define GPIO_PSOR_PTSO18_MASK (0x40000U) +#define GPIO_PSOR_PTSO18_SHIFT (18U) +/*! PTSO18 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO18_SHIFT)) & GPIO_PSOR_PTSO18_MASK) + +#define GPIO_PSOR_PTSO19_MASK (0x80000U) +#define GPIO_PSOR_PTSO19_SHIFT (19U) +/*! PTSO19 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO19_SHIFT)) & GPIO_PSOR_PTSO19_MASK) + +#define GPIO_PSOR_PTSO20_MASK (0x100000U) +#define GPIO_PSOR_PTSO20_SHIFT (20U) +/*! PTSO20 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO20_SHIFT)) & GPIO_PSOR_PTSO20_MASK) + +#define GPIO_PSOR_PTSO21_MASK (0x200000U) +#define GPIO_PSOR_PTSO21_SHIFT (21U) +/*! PTSO21 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO21_SHIFT)) & GPIO_PSOR_PTSO21_MASK) + +#define GPIO_PSOR_PTSO22_MASK (0x400000U) +#define GPIO_PSOR_PTSO22_SHIFT (22U) +/*! PTSO22 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO22_SHIFT)) & GPIO_PSOR_PTSO22_MASK) + +#define GPIO_PSOR_PTSO23_MASK (0x800000U) +#define GPIO_PSOR_PTSO23_SHIFT (23U) +/*! PTSO23 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO23_SHIFT)) & GPIO_PSOR_PTSO23_MASK) + +#define GPIO_PSOR_PTSO24_MASK (0x1000000U) +#define GPIO_PSOR_PTSO24_SHIFT (24U) +/*! PTSO24 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO24_SHIFT)) & GPIO_PSOR_PTSO24_MASK) + +#define GPIO_PSOR_PTSO25_MASK (0x2000000U) +#define GPIO_PSOR_PTSO25_SHIFT (25U) +/*! PTSO25 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO25_SHIFT)) & GPIO_PSOR_PTSO25_MASK) + +#define GPIO_PSOR_PTSO26_MASK (0x4000000U) +#define GPIO_PSOR_PTSO26_SHIFT (26U) +/*! PTSO26 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO26_SHIFT)) & GPIO_PSOR_PTSO26_MASK) + +#define GPIO_PSOR_PTSO27_MASK (0x8000000U) +#define GPIO_PSOR_PTSO27_SHIFT (27U) +/*! PTSO27 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO27_SHIFT)) & GPIO_PSOR_PTSO27_MASK) + +#define GPIO_PSOR_PTSO28_MASK (0x10000000U) +#define GPIO_PSOR_PTSO28_SHIFT (28U) +/*! PTSO28 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO28_SHIFT)) & GPIO_PSOR_PTSO28_MASK) + +#define GPIO_PSOR_PTSO29_MASK (0x20000000U) +#define GPIO_PSOR_PTSO29_SHIFT (29U) +/*! PTSO29 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO29_SHIFT)) & GPIO_PSOR_PTSO29_MASK) + +#define GPIO_PSOR_PTSO30_MASK (0x40000000U) +#define GPIO_PSOR_PTSO30_SHIFT (30U) +/*! PTSO30 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO30_SHIFT)) & GPIO_PSOR_PTSO30_MASK) + +#define GPIO_PSOR_PTSO31_MASK (0x80000000U) +#define GPIO_PSOR_PTSO31_SHIFT (31U) +/*! PTSO31 - Port Set Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 1 + */ +#define GPIO_PSOR_PTSO31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PSOR_PTSO31_SHIFT)) & GPIO_PSOR_PTSO31_MASK) +/*! @} */ + +/*! @name PCOR - Port Clear Output */ +/*! @{ */ + +#define GPIO_PCOR_PTCO0_MASK (0x1U) +#define GPIO_PCOR_PTCO0_SHIFT (0U) +/*! PTCO0 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO0_SHIFT)) & GPIO_PCOR_PTCO0_MASK) + +#define GPIO_PCOR_PTCO1_MASK (0x2U) +#define GPIO_PCOR_PTCO1_SHIFT (1U) +/*! PTCO1 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO1_SHIFT)) & GPIO_PCOR_PTCO1_MASK) + +#define GPIO_PCOR_PTCO2_MASK (0x4U) +#define GPIO_PCOR_PTCO2_SHIFT (2U) +/*! PTCO2 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO2_SHIFT)) & GPIO_PCOR_PTCO2_MASK) + +#define GPIO_PCOR_PTCO3_MASK (0x8U) +#define GPIO_PCOR_PTCO3_SHIFT (3U) +/*! PTCO3 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO3_SHIFT)) & GPIO_PCOR_PTCO3_MASK) + +#define GPIO_PCOR_PTCO4_MASK (0x10U) +#define GPIO_PCOR_PTCO4_SHIFT (4U) +/*! PTCO4 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO4_SHIFT)) & GPIO_PCOR_PTCO4_MASK) + +#define GPIO_PCOR_PTCO5_MASK (0x20U) +#define GPIO_PCOR_PTCO5_SHIFT (5U) +/*! PTCO5 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO5_SHIFT)) & GPIO_PCOR_PTCO5_MASK) + +#define GPIO_PCOR_PTCO6_MASK (0x40U) +#define GPIO_PCOR_PTCO6_SHIFT (6U) +/*! PTCO6 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO6_SHIFT)) & GPIO_PCOR_PTCO6_MASK) + +#define GPIO_PCOR_PTCO7_MASK (0x80U) +#define GPIO_PCOR_PTCO7_SHIFT (7U) +/*! PTCO7 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO7_SHIFT)) & GPIO_PCOR_PTCO7_MASK) + +#define GPIO_PCOR_PTCO8_MASK (0x100U) +#define GPIO_PCOR_PTCO8_SHIFT (8U) +/*! PTCO8 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO8_SHIFT)) & GPIO_PCOR_PTCO8_MASK) + +#define GPIO_PCOR_PTCO9_MASK (0x200U) +#define GPIO_PCOR_PTCO9_SHIFT (9U) +/*! PTCO9 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO9_SHIFT)) & GPIO_PCOR_PTCO9_MASK) + +#define GPIO_PCOR_PTCO10_MASK (0x400U) +#define GPIO_PCOR_PTCO10_SHIFT (10U) +/*! PTCO10 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO10_SHIFT)) & GPIO_PCOR_PTCO10_MASK) + +#define GPIO_PCOR_PTCO11_MASK (0x800U) +#define GPIO_PCOR_PTCO11_SHIFT (11U) +/*! PTCO11 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO11_SHIFT)) & GPIO_PCOR_PTCO11_MASK) + +#define GPIO_PCOR_PTCO12_MASK (0x1000U) +#define GPIO_PCOR_PTCO12_SHIFT (12U) +/*! PTCO12 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO12_SHIFT)) & GPIO_PCOR_PTCO12_MASK) + +#define GPIO_PCOR_PTCO13_MASK (0x2000U) +#define GPIO_PCOR_PTCO13_SHIFT (13U) +/*! PTCO13 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO13_SHIFT)) & GPIO_PCOR_PTCO13_MASK) + +#define GPIO_PCOR_PTCO14_MASK (0x4000U) +#define GPIO_PCOR_PTCO14_SHIFT (14U) +/*! PTCO14 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO14_SHIFT)) & GPIO_PCOR_PTCO14_MASK) + +#define GPIO_PCOR_PTCO15_MASK (0x8000U) +#define GPIO_PCOR_PTCO15_SHIFT (15U) +/*! PTCO15 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO15_SHIFT)) & GPIO_PCOR_PTCO15_MASK) + +#define GPIO_PCOR_PTCO16_MASK (0x10000U) +#define GPIO_PCOR_PTCO16_SHIFT (16U) +/*! PTCO16 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO16_SHIFT)) & GPIO_PCOR_PTCO16_MASK) + +#define GPIO_PCOR_PTCO17_MASK (0x20000U) +#define GPIO_PCOR_PTCO17_SHIFT (17U) +/*! PTCO17 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO17_SHIFT)) & GPIO_PCOR_PTCO17_MASK) + +#define GPIO_PCOR_PTCO18_MASK (0x40000U) +#define GPIO_PCOR_PTCO18_SHIFT (18U) +/*! PTCO18 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO18_SHIFT)) & GPIO_PCOR_PTCO18_MASK) + +#define GPIO_PCOR_PTCO19_MASK (0x80000U) +#define GPIO_PCOR_PTCO19_SHIFT (19U) +/*! PTCO19 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO19_SHIFT)) & GPIO_PCOR_PTCO19_MASK) + +#define GPIO_PCOR_PTCO20_MASK (0x100000U) +#define GPIO_PCOR_PTCO20_SHIFT (20U) +/*! PTCO20 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO20_SHIFT)) & GPIO_PCOR_PTCO20_MASK) + +#define GPIO_PCOR_PTCO21_MASK (0x200000U) +#define GPIO_PCOR_PTCO21_SHIFT (21U) +/*! PTCO21 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO21_SHIFT)) & GPIO_PCOR_PTCO21_MASK) + +#define GPIO_PCOR_PTCO22_MASK (0x400000U) +#define GPIO_PCOR_PTCO22_SHIFT (22U) +/*! PTCO22 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO22_SHIFT)) & GPIO_PCOR_PTCO22_MASK) + +#define GPIO_PCOR_PTCO23_MASK (0x800000U) +#define GPIO_PCOR_PTCO23_SHIFT (23U) +/*! PTCO23 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO23_SHIFT)) & GPIO_PCOR_PTCO23_MASK) + +#define GPIO_PCOR_PTCO24_MASK (0x1000000U) +#define GPIO_PCOR_PTCO24_SHIFT (24U) +/*! PTCO24 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO24_SHIFT)) & GPIO_PCOR_PTCO24_MASK) + +#define GPIO_PCOR_PTCO25_MASK (0x2000000U) +#define GPIO_PCOR_PTCO25_SHIFT (25U) +/*! PTCO25 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO25_SHIFT)) & GPIO_PCOR_PTCO25_MASK) + +#define GPIO_PCOR_PTCO26_MASK (0x4000000U) +#define GPIO_PCOR_PTCO26_SHIFT (26U) +/*! PTCO26 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO26_SHIFT)) & GPIO_PCOR_PTCO26_MASK) + +#define GPIO_PCOR_PTCO27_MASK (0x8000000U) +#define GPIO_PCOR_PTCO27_SHIFT (27U) +/*! PTCO27 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO27_SHIFT)) & GPIO_PCOR_PTCO27_MASK) + +#define GPIO_PCOR_PTCO28_MASK (0x10000000U) +#define GPIO_PCOR_PTCO28_SHIFT (28U) +/*! PTCO28 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO28_SHIFT)) & GPIO_PCOR_PTCO28_MASK) + +#define GPIO_PCOR_PTCO29_MASK (0x20000000U) +#define GPIO_PCOR_PTCO29_SHIFT (29U) +/*! PTCO29 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO29_SHIFT)) & GPIO_PCOR_PTCO29_MASK) + +#define GPIO_PCOR_PTCO30_MASK (0x40000000U) +#define GPIO_PCOR_PTCO30_SHIFT (30U) +/*! PTCO30 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO30_SHIFT)) & GPIO_PCOR_PTCO30_MASK) + +#define GPIO_PCOR_PTCO31_MASK (0x80000000U) +#define GPIO_PCOR_PTCO31_SHIFT (31U) +/*! PTCO31 - Port Clear Output + * 0b0..No change + * 0b1..Corresponding field in PDOR becomes 0 + */ +#define GPIO_PCOR_PTCO31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PCOR_PTCO31_SHIFT)) & GPIO_PCOR_PTCO31_MASK) +/*! @} */ + +/*! @name PTOR - Port Toggle Output */ +/*! @{ */ + +#define GPIO_PTOR_PTTO0_MASK (0x1U) +#define GPIO_PTOR_PTTO0_SHIFT (0U) +/*! PTTO0 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO0_SHIFT)) & GPIO_PTOR_PTTO0_MASK) + +#define GPIO_PTOR_PTTO1_MASK (0x2U) +#define GPIO_PTOR_PTTO1_SHIFT (1U) +/*! PTTO1 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO1_SHIFT)) & GPIO_PTOR_PTTO1_MASK) + +#define GPIO_PTOR_PTTO2_MASK (0x4U) +#define GPIO_PTOR_PTTO2_SHIFT (2U) +/*! PTTO2 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO2_SHIFT)) & GPIO_PTOR_PTTO2_MASK) + +#define GPIO_PTOR_PTTO3_MASK (0x8U) +#define GPIO_PTOR_PTTO3_SHIFT (3U) +/*! PTTO3 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO3_SHIFT)) & GPIO_PTOR_PTTO3_MASK) + +#define GPIO_PTOR_PTTO4_MASK (0x10U) +#define GPIO_PTOR_PTTO4_SHIFT (4U) +/*! PTTO4 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO4_SHIFT)) & GPIO_PTOR_PTTO4_MASK) + +#define GPIO_PTOR_PTTO5_MASK (0x20U) +#define GPIO_PTOR_PTTO5_SHIFT (5U) +/*! PTTO5 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO5_SHIFT)) & GPIO_PTOR_PTTO5_MASK) + +#define GPIO_PTOR_PTTO6_MASK (0x40U) +#define GPIO_PTOR_PTTO6_SHIFT (6U) +/*! PTTO6 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO6_SHIFT)) & GPIO_PTOR_PTTO6_MASK) + +#define GPIO_PTOR_PTTO7_MASK (0x80U) +#define GPIO_PTOR_PTTO7_SHIFT (7U) +/*! PTTO7 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO7_SHIFT)) & GPIO_PTOR_PTTO7_MASK) + +#define GPIO_PTOR_PTTO8_MASK (0x100U) +#define GPIO_PTOR_PTTO8_SHIFT (8U) +/*! PTTO8 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO8_SHIFT)) & GPIO_PTOR_PTTO8_MASK) + +#define GPIO_PTOR_PTTO9_MASK (0x200U) +#define GPIO_PTOR_PTTO9_SHIFT (9U) +/*! PTTO9 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO9_SHIFT)) & GPIO_PTOR_PTTO9_MASK) + +#define GPIO_PTOR_PTTO10_MASK (0x400U) +#define GPIO_PTOR_PTTO10_SHIFT (10U) +/*! PTTO10 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO10_SHIFT)) & GPIO_PTOR_PTTO10_MASK) + +#define GPIO_PTOR_PTTO11_MASK (0x800U) +#define GPIO_PTOR_PTTO11_SHIFT (11U) +/*! PTTO11 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO11_SHIFT)) & GPIO_PTOR_PTTO11_MASK) + +#define GPIO_PTOR_PTTO12_MASK (0x1000U) +#define GPIO_PTOR_PTTO12_SHIFT (12U) +/*! PTTO12 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO12_SHIFT)) & GPIO_PTOR_PTTO12_MASK) + +#define GPIO_PTOR_PTTO13_MASK (0x2000U) +#define GPIO_PTOR_PTTO13_SHIFT (13U) +/*! PTTO13 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO13_SHIFT)) & GPIO_PTOR_PTTO13_MASK) + +#define GPIO_PTOR_PTTO14_MASK (0x4000U) +#define GPIO_PTOR_PTTO14_SHIFT (14U) +/*! PTTO14 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO14_SHIFT)) & GPIO_PTOR_PTTO14_MASK) + +#define GPIO_PTOR_PTTO15_MASK (0x8000U) +#define GPIO_PTOR_PTTO15_SHIFT (15U) +/*! PTTO15 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO15_SHIFT)) & GPIO_PTOR_PTTO15_MASK) + +#define GPIO_PTOR_PTTO16_MASK (0x10000U) +#define GPIO_PTOR_PTTO16_SHIFT (16U) +/*! PTTO16 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO16_SHIFT)) & GPIO_PTOR_PTTO16_MASK) + +#define GPIO_PTOR_PTTO17_MASK (0x20000U) +#define GPIO_PTOR_PTTO17_SHIFT (17U) +/*! PTTO17 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO17_SHIFT)) & GPIO_PTOR_PTTO17_MASK) + +#define GPIO_PTOR_PTTO18_MASK (0x40000U) +#define GPIO_PTOR_PTTO18_SHIFT (18U) +/*! PTTO18 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO18_SHIFT)) & GPIO_PTOR_PTTO18_MASK) + +#define GPIO_PTOR_PTTO19_MASK (0x80000U) +#define GPIO_PTOR_PTTO19_SHIFT (19U) +/*! PTTO19 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO19_SHIFT)) & GPIO_PTOR_PTTO19_MASK) + +#define GPIO_PTOR_PTTO20_MASK (0x100000U) +#define GPIO_PTOR_PTTO20_SHIFT (20U) +/*! PTTO20 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO20_SHIFT)) & GPIO_PTOR_PTTO20_MASK) + +#define GPIO_PTOR_PTTO21_MASK (0x200000U) +#define GPIO_PTOR_PTTO21_SHIFT (21U) +/*! PTTO21 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO21_SHIFT)) & GPIO_PTOR_PTTO21_MASK) + +#define GPIO_PTOR_PTTO22_MASK (0x400000U) +#define GPIO_PTOR_PTTO22_SHIFT (22U) +/*! PTTO22 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO22_SHIFT)) & GPIO_PTOR_PTTO22_MASK) + +#define GPIO_PTOR_PTTO23_MASK (0x800000U) +#define GPIO_PTOR_PTTO23_SHIFT (23U) +/*! PTTO23 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO23_SHIFT)) & GPIO_PTOR_PTTO23_MASK) + +#define GPIO_PTOR_PTTO24_MASK (0x1000000U) +#define GPIO_PTOR_PTTO24_SHIFT (24U) +/*! PTTO24 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO24_SHIFT)) & GPIO_PTOR_PTTO24_MASK) + +#define GPIO_PTOR_PTTO25_MASK (0x2000000U) +#define GPIO_PTOR_PTTO25_SHIFT (25U) +/*! PTTO25 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO25_SHIFT)) & GPIO_PTOR_PTTO25_MASK) + +#define GPIO_PTOR_PTTO26_MASK (0x4000000U) +#define GPIO_PTOR_PTTO26_SHIFT (26U) +/*! PTTO26 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO26_SHIFT)) & GPIO_PTOR_PTTO26_MASK) + +#define GPIO_PTOR_PTTO27_MASK (0x8000000U) +#define GPIO_PTOR_PTTO27_SHIFT (27U) +/*! PTTO27 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO27_SHIFT)) & GPIO_PTOR_PTTO27_MASK) + +#define GPIO_PTOR_PTTO28_MASK (0x10000000U) +#define GPIO_PTOR_PTTO28_SHIFT (28U) +/*! PTTO28 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO28_SHIFT)) & GPIO_PTOR_PTTO28_MASK) + +#define GPIO_PTOR_PTTO29_MASK (0x20000000U) +#define GPIO_PTOR_PTTO29_SHIFT (29U) +/*! PTTO29 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO29_SHIFT)) & GPIO_PTOR_PTTO29_MASK) + +#define GPIO_PTOR_PTTO30_MASK (0x40000000U) +#define GPIO_PTOR_PTTO30_SHIFT (30U) +/*! PTTO30 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO30_SHIFT)) & GPIO_PTOR_PTTO30_MASK) + +#define GPIO_PTOR_PTTO31_MASK (0x80000000U) +#define GPIO_PTOR_PTTO31_SHIFT (31U) +/*! PTTO31 - Port Toggle Output + * 0b0..No change + * 0b1..Set to the inverse of its current logic state + */ +#define GPIO_PTOR_PTTO31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PTOR_PTTO31_SHIFT)) & GPIO_PTOR_PTTO31_MASK) +/*! @} */ + +/*! @name PDIR - Port Data Input */ +/*! @{ */ + +#define GPIO_PDIR_PDI0_MASK (0x1U) +#define GPIO_PDIR_PDI0_SHIFT (0U) +/*! PDI0 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI0_SHIFT)) & GPIO_PDIR_PDI0_MASK) + +#define GPIO_PDIR_PDI1_MASK (0x2U) +#define GPIO_PDIR_PDI1_SHIFT (1U) +/*! PDI1 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI1_SHIFT)) & GPIO_PDIR_PDI1_MASK) + +#define GPIO_PDIR_PDI2_MASK (0x4U) +#define GPIO_PDIR_PDI2_SHIFT (2U) +/*! PDI2 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI2_SHIFT)) & GPIO_PDIR_PDI2_MASK) + +#define GPIO_PDIR_PDI3_MASK (0x8U) +#define GPIO_PDIR_PDI3_SHIFT (3U) +/*! PDI3 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI3_SHIFT)) & GPIO_PDIR_PDI3_MASK) + +#define GPIO_PDIR_PDI4_MASK (0x10U) +#define GPIO_PDIR_PDI4_SHIFT (4U) +/*! PDI4 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI4_SHIFT)) & GPIO_PDIR_PDI4_MASK) + +#define GPIO_PDIR_PDI5_MASK (0x20U) +#define GPIO_PDIR_PDI5_SHIFT (5U) +/*! PDI5 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI5_SHIFT)) & GPIO_PDIR_PDI5_MASK) + +#define GPIO_PDIR_PDI6_MASK (0x40U) +#define GPIO_PDIR_PDI6_SHIFT (6U) +/*! PDI6 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI6_SHIFT)) & GPIO_PDIR_PDI6_MASK) + +#define GPIO_PDIR_PDI7_MASK (0x80U) +#define GPIO_PDIR_PDI7_SHIFT (7U) +/*! PDI7 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI7_SHIFT)) & GPIO_PDIR_PDI7_MASK) + +#define GPIO_PDIR_PDI8_MASK (0x100U) +#define GPIO_PDIR_PDI8_SHIFT (8U) +/*! PDI8 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI8_SHIFT)) & GPIO_PDIR_PDI8_MASK) + +#define GPIO_PDIR_PDI9_MASK (0x200U) +#define GPIO_PDIR_PDI9_SHIFT (9U) +/*! PDI9 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI9_SHIFT)) & GPIO_PDIR_PDI9_MASK) + +#define GPIO_PDIR_PDI10_MASK (0x400U) +#define GPIO_PDIR_PDI10_SHIFT (10U) +/*! PDI10 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI10_SHIFT)) & GPIO_PDIR_PDI10_MASK) + +#define GPIO_PDIR_PDI11_MASK (0x800U) +#define GPIO_PDIR_PDI11_SHIFT (11U) +/*! PDI11 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI11_SHIFT)) & GPIO_PDIR_PDI11_MASK) + +#define GPIO_PDIR_PDI12_MASK (0x1000U) +#define GPIO_PDIR_PDI12_SHIFT (12U) +/*! PDI12 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI12_SHIFT)) & GPIO_PDIR_PDI12_MASK) + +#define GPIO_PDIR_PDI13_MASK (0x2000U) +#define GPIO_PDIR_PDI13_SHIFT (13U) +/*! PDI13 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI13_SHIFT)) & GPIO_PDIR_PDI13_MASK) + +#define GPIO_PDIR_PDI14_MASK (0x4000U) +#define GPIO_PDIR_PDI14_SHIFT (14U) +/*! PDI14 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI14_SHIFT)) & GPIO_PDIR_PDI14_MASK) + +#define GPIO_PDIR_PDI15_MASK (0x8000U) +#define GPIO_PDIR_PDI15_SHIFT (15U) +/*! PDI15 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI15_SHIFT)) & GPIO_PDIR_PDI15_MASK) + +#define GPIO_PDIR_PDI16_MASK (0x10000U) +#define GPIO_PDIR_PDI16_SHIFT (16U) +/*! PDI16 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI16_SHIFT)) & GPIO_PDIR_PDI16_MASK) + +#define GPIO_PDIR_PDI17_MASK (0x20000U) +#define GPIO_PDIR_PDI17_SHIFT (17U) +/*! PDI17 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI17_SHIFT)) & GPIO_PDIR_PDI17_MASK) + +#define GPIO_PDIR_PDI18_MASK (0x40000U) +#define GPIO_PDIR_PDI18_SHIFT (18U) +/*! PDI18 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI18_SHIFT)) & GPIO_PDIR_PDI18_MASK) + +#define GPIO_PDIR_PDI19_MASK (0x80000U) +#define GPIO_PDIR_PDI19_SHIFT (19U) +/*! PDI19 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI19_SHIFT)) & GPIO_PDIR_PDI19_MASK) + +#define GPIO_PDIR_PDI20_MASK (0x100000U) +#define GPIO_PDIR_PDI20_SHIFT (20U) +/*! PDI20 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI20_SHIFT)) & GPIO_PDIR_PDI20_MASK) + +#define GPIO_PDIR_PDI21_MASK (0x200000U) +#define GPIO_PDIR_PDI21_SHIFT (21U) +/*! PDI21 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI21_SHIFT)) & GPIO_PDIR_PDI21_MASK) + +#define GPIO_PDIR_PDI22_MASK (0x400000U) +#define GPIO_PDIR_PDI22_SHIFT (22U) +/*! PDI22 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI22_SHIFT)) & GPIO_PDIR_PDI22_MASK) + +#define GPIO_PDIR_PDI23_MASK (0x800000U) +#define GPIO_PDIR_PDI23_SHIFT (23U) +/*! PDI23 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI23_SHIFT)) & GPIO_PDIR_PDI23_MASK) + +#define GPIO_PDIR_PDI24_MASK (0x1000000U) +#define GPIO_PDIR_PDI24_SHIFT (24U) +/*! PDI24 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI24_SHIFT)) & GPIO_PDIR_PDI24_MASK) + +#define GPIO_PDIR_PDI25_MASK (0x2000000U) +#define GPIO_PDIR_PDI25_SHIFT (25U) +/*! PDI25 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI25_SHIFT)) & GPIO_PDIR_PDI25_MASK) + +#define GPIO_PDIR_PDI26_MASK (0x4000000U) +#define GPIO_PDIR_PDI26_SHIFT (26U) +/*! PDI26 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI26_SHIFT)) & GPIO_PDIR_PDI26_MASK) + +#define GPIO_PDIR_PDI27_MASK (0x8000000U) +#define GPIO_PDIR_PDI27_SHIFT (27U) +/*! PDI27 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI27_SHIFT)) & GPIO_PDIR_PDI27_MASK) + +#define GPIO_PDIR_PDI28_MASK (0x10000000U) +#define GPIO_PDIR_PDI28_SHIFT (28U) +/*! PDI28 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI28_SHIFT)) & GPIO_PDIR_PDI28_MASK) + +#define GPIO_PDIR_PDI29_MASK (0x20000000U) +#define GPIO_PDIR_PDI29_SHIFT (29U) +/*! PDI29 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI29_SHIFT)) & GPIO_PDIR_PDI29_MASK) + +#define GPIO_PDIR_PDI30_MASK (0x40000000U) +#define GPIO_PDIR_PDI30_SHIFT (30U) +/*! PDI30 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI30_SHIFT)) & GPIO_PDIR_PDI30_MASK) + +#define GPIO_PDIR_PDI31_MASK (0x80000000U) +#define GPIO_PDIR_PDI31_SHIFT (31U) +/*! PDI31 - Port Data Input + * 0b0..Logic 0 + * 0b1..Logic 1 + */ +#define GPIO_PDIR_PDI31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDIR_PDI31_SHIFT)) & GPIO_PDIR_PDI31_MASK) +/*! @} */ + +/*! @name PDDR - Port Data Direction */ +/*! @{ */ + +#define GPIO_PDDR_PDD0_MASK (0x1U) +#define GPIO_PDDR_PDD0_SHIFT (0U) +/*! PDD0 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD0_SHIFT)) & GPIO_PDDR_PDD0_MASK) + +#define GPIO_PDDR_PDD1_MASK (0x2U) +#define GPIO_PDDR_PDD1_SHIFT (1U) +/*! PDD1 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD1_SHIFT)) & GPIO_PDDR_PDD1_MASK) + +#define GPIO_PDDR_PDD2_MASK (0x4U) +#define GPIO_PDDR_PDD2_SHIFT (2U) +/*! PDD2 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD2_SHIFT)) & GPIO_PDDR_PDD2_MASK) + +#define GPIO_PDDR_PDD3_MASK (0x8U) +#define GPIO_PDDR_PDD3_SHIFT (3U) +/*! PDD3 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD3_SHIFT)) & GPIO_PDDR_PDD3_MASK) + +#define GPIO_PDDR_PDD4_MASK (0x10U) +#define GPIO_PDDR_PDD4_SHIFT (4U) +/*! PDD4 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD4_SHIFT)) & GPIO_PDDR_PDD4_MASK) + +#define GPIO_PDDR_PDD5_MASK (0x20U) +#define GPIO_PDDR_PDD5_SHIFT (5U) +/*! PDD5 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD5_SHIFT)) & GPIO_PDDR_PDD5_MASK) + +#define GPIO_PDDR_PDD6_MASK (0x40U) +#define GPIO_PDDR_PDD6_SHIFT (6U) +/*! PDD6 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD6_SHIFT)) & GPIO_PDDR_PDD6_MASK) + +#define GPIO_PDDR_PDD7_MASK (0x80U) +#define GPIO_PDDR_PDD7_SHIFT (7U) +/*! PDD7 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD7_SHIFT)) & GPIO_PDDR_PDD7_MASK) + +#define GPIO_PDDR_PDD8_MASK (0x100U) +#define GPIO_PDDR_PDD8_SHIFT (8U) +/*! PDD8 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD8_SHIFT)) & GPIO_PDDR_PDD8_MASK) + +#define GPIO_PDDR_PDD9_MASK (0x200U) +#define GPIO_PDDR_PDD9_SHIFT (9U) +/*! PDD9 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD9_SHIFT)) & GPIO_PDDR_PDD9_MASK) + +#define GPIO_PDDR_PDD10_MASK (0x400U) +#define GPIO_PDDR_PDD10_SHIFT (10U) +/*! PDD10 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD10_SHIFT)) & GPIO_PDDR_PDD10_MASK) + +#define GPIO_PDDR_PDD11_MASK (0x800U) +#define GPIO_PDDR_PDD11_SHIFT (11U) +/*! PDD11 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD11_SHIFT)) & GPIO_PDDR_PDD11_MASK) + +#define GPIO_PDDR_PDD12_MASK (0x1000U) +#define GPIO_PDDR_PDD12_SHIFT (12U) +/*! PDD12 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD12_SHIFT)) & GPIO_PDDR_PDD12_MASK) + +#define GPIO_PDDR_PDD13_MASK (0x2000U) +#define GPIO_PDDR_PDD13_SHIFT (13U) +/*! PDD13 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD13_SHIFT)) & GPIO_PDDR_PDD13_MASK) + +#define GPIO_PDDR_PDD14_MASK (0x4000U) +#define GPIO_PDDR_PDD14_SHIFT (14U) +/*! PDD14 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD14_SHIFT)) & GPIO_PDDR_PDD14_MASK) + +#define GPIO_PDDR_PDD15_MASK (0x8000U) +#define GPIO_PDDR_PDD15_SHIFT (15U) +/*! PDD15 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD15_SHIFT)) & GPIO_PDDR_PDD15_MASK) + +#define GPIO_PDDR_PDD16_MASK (0x10000U) +#define GPIO_PDDR_PDD16_SHIFT (16U) +/*! PDD16 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD16_SHIFT)) & GPIO_PDDR_PDD16_MASK) + +#define GPIO_PDDR_PDD17_MASK (0x20000U) +#define GPIO_PDDR_PDD17_SHIFT (17U) +/*! PDD17 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD17_SHIFT)) & GPIO_PDDR_PDD17_MASK) + +#define GPIO_PDDR_PDD18_MASK (0x40000U) +#define GPIO_PDDR_PDD18_SHIFT (18U) +/*! PDD18 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD18_SHIFT)) & GPIO_PDDR_PDD18_MASK) + +#define GPIO_PDDR_PDD19_MASK (0x80000U) +#define GPIO_PDDR_PDD19_SHIFT (19U) +/*! PDD19 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD19_SHIFT)) & GPIO_PDDR_PDD19_MASK) + +#define GPIO_PDDR_PDD20_MASK (0x100000U) +#define GPIO_PDDR_PDD20_SHIFT (20U) +/*! PDD20 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD20_SHIFT)) & GPIO_PDDR_PDD20_MASK) + +#define GPIO_PDDR_PDD21_MASK (0x200000U) +#define GPIO_PDDR_PDD21_SHIFT (21U) +/*! PDD21 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD21_SHIFT)) & GPIO_PDDR_PDD21_MASK) + +#define GPIO_PDDR_PDD22_MASK (0x400000U) +#define GPIO_PDDR_PDD22_SHIFT (22U) +/*! PDD22 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD22_SHIFT)) & GPIO_PDDR_PDD22_MASK) + +#define GPIO_PDDR_PDD23_MASK (0x800000U) +#define GPIO_PDDR_PDD23_SHIFT (23U) +/*! PDD23 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD23_SHIFT)) & GPIO_PDDR_PDD23_MASK) + +#define GPIO_PDDR_PDD24_MASK (0x1000000U) +#define GPIO_PDDR_PDD24_SHIFT (24U) +/*! PDD24 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD24_SHIFT)) & GPIO_PDDR_PDD24_MASK) + +#define GPIO_PDDR_PDD25_MASK (0x2000000U) +#define GPIO_PDDR_PDD25_SHIFT (25U) +/*! PDD25 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD25_SHIFT)) & GPIO_PDDR_PDD25_MASK) + +#define GPIO_PDDR_PDD26_MASK (0x4000000U) +#define GPIO_PDDR_PDD26_SHIFT (26U) +/*! PDD26 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD26_SHIFT)) & GPIO_PDDR_PDD26_MASK) + +#define GPIO_PDDR_PDD27_MASK (0x8000000U) +#define GPIO_PDDR_PDD27_SHIFT (27U) +/*! PDD27 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD27_SHIFT)) & GPIO_PDDR_PDD27_MASK) + +#define GPIO_PDDR_PDD28_MASK (0x10000000U) +#define GPIO_PDDR_PDD28_SHIFT (28U) +/*! PDD28 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD28_SHIFT)) & GPIO_PDDR_PDD28_MASK) + +#define GPIO_PDDR_PDD29_MASK (0x20000000U) +#define GPIO_PDDR_PDD29_SHIFT (29U) +/*! PDD29 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD29_SHIFT)) & GPIO_PDDR_PDD29_MASK) + +#define GPIO_PDDR_PDD30_MASK (0x40000000U) +#define GPIO_PDDR_PDD30_SHIFT (30U) +/*! PDD30 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD30_SHIFT)) & GPIO_PDDR_PDD30_MASK) + +#define GPIO_PDDR_PDD31_MASK (0x80000000U) +#define GPIO_PDDR_PDD31_SHIFT (31U) +/*! PDD31 - Port Data Direction + * 0b0..Input + * 0b1..Output + */ +#define GPIO_PDDR_PDD31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PDDR_PDD31_SHIFT)) & GPIO_PDDR_PDD31_MASK) +/*! @} */ + +/*! @name PIDR - Port Input Disable */ +/*! @{ */ + +#define GPIO_PIDR_PID0_MASK (0x1U) +#define GPIO_PIDR_PID0_SHIFT (0U) +/*! PID0 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID0_SHIFT)) & GPIO_PIDR_PID0_MASK) + +#define GPIO_PIDR_PID1_MASK (0x2U) +#define GPIO_PIDR_PID1_SHIFT (1U) +/*! PID1 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID1_SHIFT)) & GPIO_PIDR_PID1_MASK) + +#define GPIO_PIDR_PID2_MASK (0x4U) +#define GPIO_PIDR_PID2_SHIFT (2U) +/*! PID2 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID2_SHIFT)) & GPIO_PIDR_PID2_MASK) + +#define GPIO_PIDR_PID3_MASK (0x8U) +#define GPIO_PIDR_PID3_SHIFT (3U) +/*! PID3 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID3_SHIFT)) & GPIO_PIDR_PID3_MASK) + +#define GPIO_PIDR_PID4_MASK (0x10U) +#define GPIO_PIDR_PID4_SHIFT (4U) +/*! PID4 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID4_SHIFT)) & GPIO_PIDR_PID4_MASK) + +#define GPIO_PIDR_PID5_MASK (0x20U) +#define GPIO_PIDR_PID5_SHIFT (5U) +/*! PID5 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID5_SHIFT)) & GPIO_PIDR_PID5_MASK) + +#define GPIO_PIDR_PID6_MASK (0x40U) +#define GPIO_PIDR_PID6_SHIFT (6U) +/*! PID6 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID6_SHIFT)) & GPIO_PIDR_PID6_MASK) + +#define GPIO_PIDR_PID7_MASK (0x80U) +#define GPIO_PIDR_PID7_SHIFT (7U) +/*! PID7 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID7_SHIFT)) & GPIO_PIDR_PID7_MASK) + +#define GPIO_PIDR_PID8_MASK (0x100U) +#define GPIO_PIDR_PID8_SHIFT (8U) +/*! PID8 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID8_SHIFT)) & GPIO_PIDR_PID8_MASK) + +#define GPIO_PIDR_PID9_MASK (0x200U) +#define GPIO_PIDR_PID9_SHIFT (9U) +/*! PID9 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID9_SHIFT)) & GPIO_PIDR_PID9_MASK) + +#define GPIO_PIDR_PID10_MASK (0x400U) +#define GPIO_PIDR_PID10_SHIFT (10U) +/*! PID10 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID10_SHIFT)) & GPIO_PIDR_PID10_MASK) + +#define GPIO_PIDR_PID11_MASK (0x800U) +#define GPIO_PIDR_PID11_SHIFT (11U) +/*! PID11 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID11_SHIFT)) & GPIO_PIDR_PID11_MASK) + +#define GPIO_PIDR_PID12_MASK (0x1000U) +#define GPIO_PIDR_PID12_SHIFT (12U) +/*! PID12 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID12_SHIFT)) & GPIO_PIDR_PID12_MASK) + +#define GPIO_PIDR_PID13_MASK (0x2000U) +#define GPIO_PIDR_PID13_SHIFT (13U) +/*! PID13 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID13_SHIFT)) & GPIO_PIDR_PID13_MASK) + +#define GPIO_PIDR_PID14_MASK (0x4000U) +#define GPIO_PIDR_PID14_SHIFT (14U) +/*! PID14 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID14_SHIFT)) & GPIO_PIDR_PID14_MASK) + +#define GPIO_PIDR_PID15_MASK (0x8000U) +#define GPIO_PIDR_PID15_SHIFT (15U) +/*! PID15 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID15_SHIFT)) & GPIO_PIDR_PID15_MASK) + +#define GPIO_PIDR_PID16_MASK (0x10000U) +#define GPIO_PIDR_PID16_SHIFT (16U) +/*! PID16 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID16_SHIFT)) & GPIO_PIDR_PID16_MASK) + +#define GPIO_PIDR_PID17_MASK (0x20000U) +#define GPIO_PIDR_PID17_SHIFT (17U) +/*! PID17 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID17_SHIFT)) & GPIO_PIDR_PID17_MASK) + +#define GPIO_PIDR_PID18_MASK (0x40000U) +#define GPIO_PIDR_PID18_SHIFT (18U) +/*! PID18 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID18_SHIFT)) & GPIO_PIDR_PID18_MASK) + +#define GPIO_PIDR_PID19_MASK (0x80000U) +#define GPIO_PIDR_PID19_SHIFT (19U) +/*! PID19 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID19_SHIFT)) & GPIO_PIDR_PID19_MASK) + +#define GPIO_PIDR_PID20_MASK (0x100000U) +#define GPIO_PIDR_PID20_SHIFT (20U) +/*! PID20 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID20_SHIFT)) & GPIO_PIDR_PID20_MASK) + +#define GPIO_PIDR_PID21_MASK (0x200000U) +#define GPIO_PIDR_PID21_SHIFT (21U) +/*! PID21 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID21_SHIFT)) & GPIO_PIDR_PID21_MASK) + +#define GPIO_PIDR_PID22_MASK (0x400000U) +#define GPIO_PIDR_PID22_SHIFT (22U) +/*! PID22 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID22_SHIFT)) & GPIO_PIDR_PID22_MASK) + +#define GPIO_PIDR_PID23_MASK (0x800000U) +#define GPIO_PIDR_PID23_SHIFT (23U) +/*! PID23 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID23_SHIFT)) & GPIO_PIDR_PID23_MASK) + +#define GPIO_PIDR_PID24_MASK (0x1000000U) +#define GPIO_PIDR_PID24_SHIFT (24U) +/*! PID24 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID24_SHIFT)) & GPIO_PIDR_PID24_MASK) + +#define GPIO_PIDR_PID25_MASK (0x2000000U) +#define GPIO_PIDR_PID25_SHIFT (25U) +/*! PID25 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID25_SHIFT)) & GPIO_PIDR_PID25_MASK) + +#define GPIO_PIDR_PID26_MASK (0x4000000U) +#define GPIO_PIDR_PID26_SHIFT (26U) +/*! PID26 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID26_SHIFT)) & GPIO_PIDR_PID26_MASK) + +#define GPIO_PIDR_PID27_MASK (0x8000000U) +#define GPIO_PIDR_PID27_SHIFT (27U) +/*! PID27 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID27_SHIFT)) & GPIO_PIDR_PID27_MASK) + +#define GPIO_PIDR_PID28_MASK (0x10000000U) +#define GPIO_PIDR_PID28_SHIFT (28U) +/*! PID28 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID28_SHIFT)) & GPIO_PIDR_PID28_MASK) + +#define GPIO_PIDR_PID29_MASK (0x20000000U) +#define GPIO_PIDR_PID29_SHIFT (29U) +/*! PID29 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID29_SHIFT)) & GPIO_PIDR_PID29_MASK) + +#define GPIO_PIDR_PID30_MASK (0x40000000U) +#define GPIO_PIDR_PID30_SHIFT (30U) +/*! PID30 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID30_SHIFT)) & GPIO_PIDR_PID30_MASK) + +#define GPIO_PIDR_PID31_MASK (0x80000000U) +#define GPIO_PIDR_PID31_SHIFT (31U) +/*! PID31 - Port Input Disable + * 0b0..Configured for general-purpose input + * 0b1..Disabled for general-purpose input + */ +#define GPIO_PIDR_PID31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_PIDR_PID31_SHIFT)) & GPIO_PIDR_PID31_MASK) +/*! @} */ + +/*! @name PDR - Pin Data */ +/*! @{ */ + +#define GPIO_PDR_PD_MASK (0x1U) +#define GPIO_PDR_PD_SHIFT (0U) +/*! PD - Pin Data (I/O) + * 0b0..Logic zero + * 0b1..Logic one + */ +#define GPIO_PDR_PD(x) (((uint8_t)(((uint8_t)(x)) << GPIO_PDR_PD_SHIFT)) & GPIO_PDR_PD_MASK) +/*! @} */ + +/* The count of GPIO_PDR */ +#define GPIO_PDR_COUNT (32U) + +/*! @name ICR - Interrupt Control 0..Interrupt Control 31 */ +/*! @{ */ + +#define GPIO_ICR_IRQC_MASK (0xF0000U) +#define GPIO_ICR_IRQC_SHIFT (16U) +/*! IRQC - Interrupt Configuration + * 0b0000..ISF is disabled + * 0b0001..ISF and DMA request on rising edge + * 0b0010..ISF and DMA request on falling edge + * 0b0011..ISF and DMA request on either edge + * 0b0100..Reserved + * 0b0101..ISF sets on rising edge + * 0b0110..ISF sets on falling edge + * 0b0111..ISF sets on either edge + * 0b1000..ISF and interrupt when logic 0 + * 0b1001..ISF and interrupt on rising edge + * 0b1010..ISF and interrupt on falling edge + * 0b1011..ISF and Interrupt on either edge + * 0b1100..ISF and interrupt when logic 1 + * 0b1101..Enable active-high trigger output; ISF on rising edge (pin state is ORed with other enabled triggers + * to generate the output trigger for use by other peripherals) + * 0b1110..Enable active-low trigger output; ISF on falling edge (pin state is inverted and ORed with other + * enabled triggers to generate the output trigger for use by other peripherals) + * 0b1111..Reserved + */ +#define GPIO_ICR_IRQC(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR_IRQC_SHIFT)) & GPIO_ICR_IRQC_MASK) + +#define GPIO_ICR_ISF_MASK (0x1000000U) +#define GPIO_ICR_ISF_SHIFT (24U) +/*! ISF - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ICR_ISF(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ICR_ISF_SHIFT)) & GPIO_ICR_ISF_MASK) +/*! @} */ + +/* The count of GPIO_ICR */ +#define GPIO_ICR_COUNT (32U) + +/*! @name GICLR - Global Interrupt Control Low */ +/*! @{ */ + +#define GPIO_GICLR_GIWE0_MASK (0x1U) +#define GPIO_GICLR_GIWE0_SHIFT (0U) +/*! GIWE0 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE0_SHIFT)) & GPIO_GICLR_GIWE0_MASK) + +#define GPIO_GICLR_GIWE1_MASK (0x2U) +#define GPIO_GICLR_GIWE1_SHIFT (1U) +/*! GIWE1 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE1_SHIFT)) & GPIO_GICLR_GIWE1_MASK) + +#define GPIO_GICLR_GIWE2_MASK (0x4U) +#define GPIO_GICLR_GIWE2_SHIFT (2U) +/*! GIWE2 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE2_SHIFT)) & GPIO_GICLR_GIWE2_MASK) + +#define GPIO_GICLR_GIWE3_MASK (0x8U) +#define GPIO_GICLR_GIWE3_SHIFT (3U) +/*! GIWE3 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE3_SHIFT)) & GPIO_GICLR_GIWE3_MASK) + +#define GPIO_GICLR_GIWE4_MASK (0x10U) +#define GPIO_GICLR_GIWE4_SHIFT (4U) +/*! GIWE4 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE4_SHIFT)) & GPIO_GICLR_GIWE4_MASK) + +#define GPIO_GICLR_GIWE5_MASK (0x20U) +#define GPIO_GICLR_GIWE5_SHIFT (5U) +/*! GIWE5 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE5_SHIFT)) & GPIO_GICLR_GIWE5_MASK) + +#define GPIO_GICLR_GIWE6_MASK (0x40U) +#define GPIO_GICLR_GIWE6_SHIFT (6U) +/*! GIWE6 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE6_SHIFT)) & GPIO_GICLR_GIWE6_MASK) + +#define GPIO_GICLR_GIWE7_MASK (0x80U) +#define GPIO_GICLR_GIWE7_SHIFT (7U) +/*! GIWE7 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE7_SHIFT)) & GPIO_GICLR_GIWE7_MASK) + +#define GPIO_GICLR_GIWE8_MASK (0x100U) +#define GPIO_GICLR_GIWE8_SHIFT (8U) +/*! GIWE8 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE8_SHIFT)) & GPIO_GICLR_GIWE8_MASK) + +#define GPIO_GICLR_GIWE9_MASK (0x200U) +#define GPIO_GICLR_GIWE9_SHIFT (9U) +/*! GIWE9 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE9_SHIFT)) & GPIO_GICLR_GIWE9_MASK) + +#define GPIO_GICLR_GIWE10_MASK (0x400U) +#define GPIO_GICLR_GIWE10_SHIFT (10U) +/*! GIWE10 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE10_SHIFT)) & GPIO_GICLR_GIWE10_MASK) + +#define GPIO_GICLR_GIWE11_MASK (0x800U) +#define GPIO_GICLR_GIWE11_SHIFT (11U) +/*! GIWE11 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE11_SHIFT)) & GPIO_GICLR_GIWE11_MASK) + +#define GPIO_GICLR_GIWE12_MASK (0x1000U) +#define GPIO_GICLR_GIWE12_SHIFT (12U) +/*! GIWE12 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE12_SHIFT)) & GPIO_GICLR_GIWE12_MASK) + +#define GPIO_GICLR_GIWE13_MASK (0x2000U) +#define GPIO_GICLR_GIWE13_SHIFT (13U) +/*! GIWE13 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE13_SHIFT)) & GPIO_GICLR_GIWE13_MASK) + +#define GPIO_GICLR_GIWE14_MASK (0x4000U) +#define GPIO_GICLR_GIWE14_SHIFT (14U) +/*! GIWE14 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE14_SHIFT)) & GPIO_GICLR_GIWE14_MASK) + +#define GPIO_GICLR_GIWE15_MASK (0x8000U) +#define GPIO_GICLR_GIWE15_SHIFT (15U) +/*! GIWE15 - Global Interrupt Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define GPIO_GICLR_GIWE15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWE15_SHIFT)) & GPIO_GICLR_GIWE15_MASK) + +#define GPIO_GICLR_GIWD_MASK (0xFFFF0000U) +#define GPIO_GICLR_GIWD_SHIFT (16U) +/*! GIWD - Global Interrupt Write Data */ +#define GPIO_GICLR_GIWD(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICLR_GIWD_SHIFT)) & GPIO_GICLR_GIWD_MASK) +/*! @} */ + +/*! @name GICHR - Global Interrupt Control High */ +/*! @{ */ + +#define GPIO_GICHR_GIWE16_MASK (0x1U) +#define GPIO_GICHR_GIWE16_SHIFT (0U) +/*! GIWE16 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE16_SHIFT)) & GPIO_GICHR_GIWE16_MASK) + +#define GPIO_GICHR_GIWE17_MASK (0x2U) +#define GPIO_GICHR_GIWE17_SHIFT (1U) +/*! GIWE17 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE17_SHIFT)) & GPIO_GICHR_GIWE17_MASK) + +#define GPIO_GICHR_GIWE18_MASK (0x4U) +#define GPIO_GICHR_GIWE18_SHIFT (2U) +/*! GIWE18 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE18_SHIFT)) & GPIO_GICHR_GIWE18_MASK) + +#define GPIO_GICHR_GIWE19_MASK (0x8U) +#define GPIO_GICHR_GIWE19_SHIFT (3U) +/*! GIWE19 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE19_SHIFT)) & GPIO_GICHR_GIWE19_MASK) + +#define GPIO_GICHR_GIWE20_MASK (0x10U) +#define GPIO_GICHR_GIWE20_SHIFT (4U) +/*! GIWE20 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE20_SHIFT)) & GPIO_GICHR_GIWE20_MASK) + +#define GPIO_GICHR_GIWE21_MASK (0x20U) +#define GPIO_GICHR_GIWE21_SHIFT (5U) +/*! GIWE21 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE21_SHIFT)) & GPIO_GICHR_GIWE21_MASK) + +#define GPIO_GICHR_GIWE22_MASK (0x40U) +#define GPIO_GICHR_GIWE22_SHIFT (6U) +/*! GIWE22 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE22_SHIFT)) & GPIO_GICHR_GIWE22_MASK) + +#define GPIO_GICHR_GIWE23_MASK (0x80U) +#define GPIO_GICHR_GIWE23_SHIFT (7U) +/*! GIWE23 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE23_SHIFT)) & GPIO_GICHR_GIWE23_MASK) + +#define GPIO_GICHR_GIWE24_MASK (0x100U) +#define GPIO_GICHR_GIWE24_SHIFT (8U) +/*! GIWE24 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE24_SHIFT)) & GPIO_GICHR_GIWE24_MASK) + +#define GPIO_GICHR_GIWE25_MASK (0x200U) +#define GPIO_GICHR_GIWE25_SHIFT (9U) +/*! GIWE25 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE25_SHIFT)) & GPIO_GICHR_GIWE25_MASK) + +#define GPIO_GICHR_GIWE26_MASK (0x400U) +#define GPIO_GICHR_GIWE26_SHIFT (10U) +/*! GIWE26 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE26_SHIFT)) & GPIO_GICHR_GIWE26_MASK) + +#define GPIO_GICHR_GIWE27_MASK (0x800U) +#define GPIO_GICHR_GIWE27_SHIFT (11U) +/*! GIWE27 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE27_SHIFT)) & GPIO_GICHR_GIWE27_MASK) + +#define GPIO_GICHR_GIWE28_MASK (0x1000U) +#define GPIO_GICHR_GIWE28_SHIFT (12U) +/*! GIWE28 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE28_SHIFT)) & GPIO_GICHR_GIWE28_MASK) + +#define GPIO_GICHR_GIWE29_MASK (0x2000U) +#define GPIO_GICHR_GIWE29_SHIFT (13U) +/*! GIWE29 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE29_SHIFT)) & GPIO_GICHR_GIWE29_MASK) + +#define GPIO_GICHR_GIWE30_MASK (0x4000U) +#define GPIO_GICHR_GIWE30_SHIFT (14U) +/*! GIWE30 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE30_SHIFT)) & GPIO_GICHR_GIWE30_MASK) + +#define GPIO_GICHR_GIWE31_MASK (0x8000U) +#define GPIO_GICHR_GIWE31_SHIFT (15U) +/*! GIWE31 - Global Interrupt Write Enable + * 0b0..Not updated. + * 0b1..Updated + */ +#define GPIO_GICHR_GIWE31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWE31_SHIFT)) & GPIO_GICHR_GIWE31_MASK) + +#define GPIO_GICHR_GIWD_MASK (0xFFFF0000U) +#define GPIO_GICHR_GIWD_SHIFT (16U) +/*! GIWD - Global Interrupt Write Data */ +#define GPIO_GICHR_GIWD(x) (((uint32_t)(((uint32_t)(x)) << GPIO_GICHR_GIWD_SHIFT)) & GPIO_GICHR_GIWD_MASK) +/*! @} */ + +/*! @name ISFR - Interrupt Status Flag */ +/*! @{ */ + +#define GPIO_ISFR_ISF0_MASK (0x1U) +#define GPIO_ISFR_ISF0_SHIFT (0U) +/*! ISF0 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF0(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF0_SHIFT)) & GPIO_ISFR_ISF0_MASK) + +#define GPIO_ISFR_ISF1_MASK (0x2U) +#define GPIO_ISFR_ISF1_SHIFT (1U) +/*! ISF1 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF1(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF1_SHIFT)) & GPIO_ISFR_ISF1_MASK) + +#define GPIO_ISFR_ISF2_MASK (0x4U) +#define GPIO_ISFR_ISF2_SHIFT (2U) +/*! ISF2 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF2(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF2_SHIFT)) & GPIO_ISFR_ISF2_MASK) + +#define GPIO_ISFR_ISF3_MASK (0x8U) +#define GPIO_ISFR_ISF3_SHIFT (3U) +/*! ISF3 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF3(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF3_SHIFT)) & GPIO_ISFR_ISF3_MASK) + +#define GPIO_ISFR_ISF4_MASK (0x10U) +#define GPIO_ISFR_ISF4_SHIFT (4U) +/*! ISF4 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF4(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF4_SHIFT)) & GPIO_ISFR_ISF4_MASK) + +#define GPIO_ISFR_ISF5_MASK (0x20U) +#define GPIO_ISFR_ISF5_SHIFT (5U) +/*! ISF5 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF5(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF5_SHIFT)) & GPIO_ISFR_ISF5_MASK) + +#define GPIO_ISFR_ISF6_MASK (0x40U) +#define GPIO_ISFR_ISF6_SHIFT (6U) +/*! ISF6 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF6(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF6_SHIFT)) & GPIO_ISFR_ISF6_MASK) + +#define GPIO_ISFR_ISF7_MASK (0x80U) +#define GPIO_ISFR_ISF7_SHIFT (7U) +/*! ISF7 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF7(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF7_SHIFT)) & GPIO_ISFR_ISF7_MASK) + +#define GPIO_ISFR_ISF8_MASK (0x100U) +#define GPIO_ISFR_ISF8_SHIFT (8U) +/*! ISF8 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF8(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF8_SHIFT)) & GPIO_ISFR_ISF8_MASK) + +#define GPIO_ISFR_ISF9_MASK (0x200U) +#define GPIO_ISFR_ISF9_SHIFT (9U) +/*! ISF9 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF9(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF9_SHIFT)) & GPIO_ISFR_ISF9_MASK) + +#define GPIO_ISFR_ISF10_MASK (0x400U) +#define GPIO_ISFR_ISF10_SHIFT (10U) +/*! ISF10 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF10(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF10_SHIFT)) & GPIO_ISFR_ISF10_MASK) + +#define GPIO_ISFR_ISF11_MASK (0x800U) +#define GPIO_ISFR_ISF11_SHIFT (11U) +/*! ISF11 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF11(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF11_SHIFT)) & GPIO_ISFR_ISF11_MASK) + +#define GPIO_ISFR_ISF12_MASK (0x1000U) +#define GPIO_ISFR_ISF12_SHIFT (12U) +/*! ISF12 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF12(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF12_SHIFT)) & GPIO_ISFR_ISF12_MASK) + +#define GPIO_ISFR_ISF13_MASK (0x2000U) +#define GPIO_ISFR_ISF13_SHIFT (13U) +/*! ISF13 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF13(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF13_SHIFT)) & GPIO_ISFR_ISF13_MASK) + +#define GPIO_ISFR_ISF14_MASK (0x4000U) +#define GPIO_ISFR_ISF14_SHIFT (14U) +/*! ISF14 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF14(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF14_SHIFT)) & GPIO_ISFR_ISF14_MASK) + +#define GPIO_ISFR_ISF15_MASK (0x8000U) +#define GPIO_ISFR_ISF15_SHIFT (15U) +/*! ISF15 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF15(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF15_SHIFT)) & GPIO_ISFR_ISF15_MASK) + +#define GPIO_ISFR_ISF16_MASK (0x10000U) +#define GPIO_ISFR_ISF16_SHIFT (16U) +/*! ISF16 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF16(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF16_SHIFT)) & GPIO_ISFR_ISF16_MASK) + +#define GPIO_ISFR_ISF17_MASK (0x20000U) +#define GPIO_ISFR_ISF17_SHIFT (17U) +/*! ISF17 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF17(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF17_SHIFT)) & GPIO_ISFR_ISF17_MASK) + +#define GPIO_ISFR_ISF18_MASK (0x40000U) +#define GPIO_ISFR_ISF18_SHIFT (18U) +/*! ISF18 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF18(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF18_SHIFT)) & GPIO_ISFR_ISF18_MASK) + +#define GPIO_ISFR_ISF19_MASK (0x80000U) +#define GPIO_ISFR_ISF19_SHIFT (19U) +/*! ISF19 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF19(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF19_SHIFT)) & GPIO_ISFR_ISF19_MASK) + +#define GPIO_ISFR_ISF20_MASK (0x100000U) +#define GPIO_ISFR_ISF20_SHIFT (20U) +/*! ISF20 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF20(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF20_SHIFT)) & GPIO_ISFR_ISF20_MASK) + +#define GPIO_ISFR_ISF21_MASK (0x200000U) +#define GPIO_ISFR_ISF21_SHIFT (21U) +/*! ISF21 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF21(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF21_SHIFT)) & GPIO_ISFR_ISF21_MASK) + +#define GPIO_ISFR_ISF22_MASK (0x400000U) +#define GPIO_ISFR_ISF22_SHIFT (22U) +/*! ISF22 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF22(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF22_SHIFT)) & GPIO_ISFR_ISF22_MASK) + +#define GPIO_ISFR_ISF23_MASK (0x800000U) +#define GPIO_ISFR_ISF23_SHIFT (23U) +/*! ISF23 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF23(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF23_SHIFT)) & GPIO_ISFR_ISF23_MASK) + +#define GPIO_ISFR_ISF24_MASK (0x1000000U) +#define GPIO_ISFR_ISF24_SHIFT (24U) +/*! ISF24 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF24(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF24_SHIFT)) & GPIO_ISFR_ISF24_MASK) + +#define GPIO_ISFR_ISF25_MASK (0x2000000U) +#define GPIO_ISFR_ISF25_SHIFT (25U) +/*! ISF25 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF25(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF25_SHIFT)) & GPIO_ISFR_ISF25_MASK) + +#define GPIO_ISFR_ISF26_MASK (0x4000000U) +#define GPIO_ISFR_ISF26_SHIFT (26U) +/*! ISF26 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF26(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF26_SHIFT)) & GPIO_ISFR_ISF26_MASK) + +#define GPIO_ISFR_ISF27_MASK (0x8000000U) +#define GPIO_ISFR_ISF27_SHIFT (27U) +/*! ISF27 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF27(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF27_SHIFT)) & GPIO_ISFR_ISF27_MASK) + +#define GPIO_ISFR_ISF28_MASK (0x10000000U) +#define GPIO_ISFR_ISF28_SHIFT (28U) +/*! ISF28 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF28(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF28_SHIFT)) & GPIO_ISFR_ISF28_MASK) + +#define GPIO_ISFR_ISF29_MASK (0x20000000U) +#define GPIO_ISFR_ISF29_SHIFT (29U) +/*! ISF29 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF29(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF29_SHIFT)) & GPIO_ISFR_ISF29_MASK) + +#define GPIO_ISFR_ISF30_MASK (0x40000000U) +#define GPIO_ISFR_ISF30_SHIFT (30U) +/*! ISF30 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF30(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF30_SHIFT)) & GPIO_ISFR_ISF30_MASK) + +#define GPIO_ISFR_ISF31_MASK (0x80000000U) +#define GPIO_ISFR_ISF31_SHIFT (31U) +/*! ISF31 - Interrupt Status Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define GPIO_ISFR_ISF31(x) (((uint32_t)(((uint32_t)(x)) << GPIO_ISFR_ISF31_SHIFT)) & GPIO_ISFR_ISF31_MASK) +/*! @} */ + +/* The count of GPIO_ISFR */ +#define GPIO_ISFR_COUNT (1U) + + +/*! + * @} + */ /* end of group GPIO_Register_Masks */ + + +/* GPIO - Peripheral instance base addresses */ +/** Peripheral GPIO0 base address */ +#define GPIO0_BASE (0x40102000u) +/** Peripheral GPIO0 base pointer */ +#define GPIO0 ((GPIO_Type *)GPIO0_BASE) +/** Peripheral GPIO1 base address */ +#define GPIO1_BASE (0x40103000u) +/** Peripheral GPIO1 base pointer */ +#define GPIO1 ((GPIO_Type *)GPIO1_BASE) +/** Peripheral GPIO2 base address */ +#define GPIO2_BASE (0x40104000u) +/** Peripheral GPIO2 base pointer */ +#define GPIO2 ((GPIO_Type *)GPIO2_BASE) +/** Peripheral GPIO3 base address */ +#define GPIO3_BASE (0x40105000u) +/** Peripheral GPIO3 base pointer */ +#define GPIO3 ((GPIO_Type *)GPIO3_BASE) +/** Peripheral GPIO4 base address */ +#define GPIO4_BASE (0x40106000u) +/** Peripheral GPIO4 base pointer */ +#define GPIO4 ((GPIO_Type *)GPIO4_BASE) +/** Array initializer of GPIO peripheral base addresses */ +#define GPIO_BASE_ADDRS { GPIO0_BASE, GPIO1_BASE, GPIO2_BASE, GPIO3_BASE, GPIO4_BASE } +/** Array initializer of GPIO peripheral base pointers */ +#define GPIO_BASE_PTRS { GPIO0, GPIO1, GPIO2, GPIO3, GPIO4 } +/** Interrupt vectors for the GPIO peripheral type */ +#define GPIO_IRQS { GPIO0_IRQn, GPIO1_IRQn, GPIO2_IRQn, GPIO3_IRQn, GPIO4_IRQn } + +/*! + * @} + */ /* end of group GPIO_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- I3C Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup I3C_Peripheral_Access_Layer I3C Peripheral Access Layer + * @{ + */ + +/** I3C - Register Layout Typedef */ +typedef struct { + __IO uint32_t MCONFIG; /**< Controller Configuration, offset: 0x0 */ + __IO uint32_t SCONFIG; /**< Target Configuration, offset: 0x4 */ + __IO uint32_t SSTATUS; /**< Target Status, offset: 0x8 */ + __IO uint32_t SCTRL; /**< Target Control, offset: 0xC */ + __IO uint32_t SINTSET; /**< Target Interrupt Set, offset: 0x10 */ + __IO uint32_t SINTCLR; /**< Target Interrupt Clear, offset: 0x14 */ + __I uint32_t SINTMASKED; /**< Target Interrupt Mask, offset: 0x18 */ + __IO uint32_t SERRWARN; /**< Target Errors and Warnings, offset: 0x1C */ + __IO uint32_t SDMACTRL; /**< Target DMA Control, offset: 0x20 */ + uint8_t RESERVED_0[8]; + __IO uint32_t SDATACTRL; /**< Target Data Control, offset: 0x2C */ + __O uint32_t SWDATAB; /**< Target Write Data Byte, offset: 0x30 */ + __O uint32_t SWDATABE; /**< Target Write Data Byte End, offset: 0x34 */ + __O uint32_t SWDATAH; /**< Target Write Data Halfword, offset: 0x38 */ + __O uint32_t SWDATAHE; /**< Target Write Data Halfword End, offset: 0x3C */ + __I uint32_t SRDATAB; /**< Target Read Data Byte, offset: 0x40 */ + uint8_t RESERVED_1[4]; + __I uint32_t SRDATAH; /**< Target Read Data Halfword, offset: 0x48 */ + uint8_t RESERVED_2[8]; + union { /* offset: 0x54 */ + __O uint32_t SWDATAB1; /**< Target Write Data Byte, offset: 0x54 */ + __O uint32_t SWDATAH1; /**< Target Write Data Halfword, offset: 0x54 */ + }; + uint8_t RESERVED_3[4]; + __I uint32_t SCAPABILITIES2; /**< Target Capabilities 2, offset: 0x5C */ + __I uint32_t SCAPABILITIES; /**< Target Capabilities, offset: 0x60 */ + __IO uint32_t SDYNADDR; /**< Target Dynamic Address, offset: 0x64 */ + __IO uint32_t SMAXLIMITS; /**< Target Maximum Limits, offset: 0x68 */ + __IO uint32_t SIDPARTNO; /**< Target ID Part Number, offset: 0x6C */ + __IO uint32_t SIDEXT; /**< Target ID Extension, offset: 0x70 */ + __IO uint32_t SVENDORID; /**< Target Vendor ID, offset: 0x74 */ + __IO uint32_t STCCLOCK; /**< Target Time Control Clock, offset: 0x78 */ + __I uint32_t SMSGMAPADDR; /**< Target Message Map Address, offset: 0x7C */ + __IO uint32_t MCONFIG_EXT; /**< Controller Extended Configuration, offset: 0x80 */ + __IO uint32_t MCTRL; /**< Controller Control, offset: 0x84 */ + __IO uint32_t MSTATUS; /**< Controller Status, offset: 0x88 */ + __IO uint32_t MIBIRULES; /**< Controller In-band Interrupt Registry and Rules, offset: 0x8C */ + __IO uint32_t MINTSET; /**< Controller Interrupt Set, offset: 0x90 */ + __IO uint32_t MINTCLR; /**< Controller Interrupt Clear, offset: 0x94 */ + __I uint32_t MINTMASKED; /**< Controller Interrupt Mask, offset: 0x98 */ + __IO uint32_t MERRWARN; /**< Controller Errors and Warnings, offset: 0x9C */ + __IO uint32_t MDMACTRL; /**< Controller DMA Control, offset: 0xA0 */ + uint8_t RESERVED_4[8]; + __IO uint32_t MDATACTRL; /**< Controller Data Control, offset: 0xAC */ + __O uint32_t MWDATAB; /**< Controller Write Data Byte, offset: 0xB0 */ + __O uint32_t MWDATABE; /**< Controller Write Data Byte End, offset: 0xB4 */ + __O uint32_t MWDATAH; /**< Controller Write Data Halfword, offset: 0xB8 */ + __O uint32_t MWDATAHE; /**< Controller Write Data Halfword End, offset: 0xBC */ + __I uint32_t MRDATAB; /**< Controller Read Data Byte, offset: 0xC0 */ + uint8_t RESERVED_5[4]; + __I uint32_t MRDATAH; /**< Controller Read Data Halfword, offset: 0xC8 */ + union { /* offset: 0xCC */ + __O uint32_t MWDATAB1; /**< Controller Write Byte Data 1 (to Bus), offset: 0xCC */ + __O uint32_t MWDATAH1; /**< Controller Write Halfword Data (to Bus), offset: 0xCC */ + }; + union { /* offset: 0xD0 */ + __O uint32_t MWMSG_SDR_CONTROL; /**< Controller Write Message Control in SDR mode, offset: 0xD0 */ + __O uint32_t MWMSG_SDR_DATA; /**< Controller Write Message Data in SDR mode, offset: 0xD0 */ + }; + __I uint32_t MRMSG_SDR; /**< Controller Read Message in SDR mode, offset: 0xD4 */ + union { /* offset: 0xD8 */ + __O uint32_t MWMSG_DDR_CONTROL; /**< Controller Write Message in DDR mode: First Control Word, offset: 0xD8 */ + __O uint32_t MWMSG_DDR_CONTROL2; /**< Controller Write Message in DDR Mode Control 2, offset: 0xD8 */ + __O uint32_t MWMSG_DDR_DATA; /**< Controller Write Message Data in DDR mode, offset: 0xD8 */ + }; + __I uint32_t MRMSG_DDR; /**< Controller Read Message in DDR mode, offset: 0xDC */ + uint8_t RESERVED_6[4]; + __IO uint32_t MDYNADDR; /**< Controller Dynamic Address, offset: 0xE4 */ + uint8_t RESERVED_7[52]; + __I uint32_t SMAPCTRL0; /**< Map Feature Control 0, offset: 0x11C */ + uint8_t RESERVED_8[32]; + __IO uint32_t IBIEXT1; /**< Extended IBI Data 1, offset: 0x140 */ + __IO uint32_t IBIEXT2; /**< Extended IBI Data 2, offset: 0x144 */ + uint8_t RESERVED_9[3764]; + __I uint32_t SID; /**< Target Module ID, offset: 0xFFC */ +} I3C_Type; + +/* ---------------------------------------------------------------------------- + -- I3C Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup I3C_Register_Masks I3C Register Masks + * @{ + */ + +/*! @name MCONFIG - Controller Configuration */ +/*! @{ */ + +#define I3C_MCONFIG_MSTENA_MASK (0x3U) +#define I3C_MCONFIG_MSTENA_SHIFT (0U) +/*! MSTENA - Controller Enable + * 0b00..CONTROLLER_OFF + * 0b01..CONTROLLER_ON + * 0b10..CONTROLLER_CAPABLE + * 0b11..I2C_CONTROLLER_MODE + */ +#define I3C_MCONFIG_MSTENA(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_MSTENA_SHIFT)) & I3C_MCONFIG_MSTENA_MASK) + +#define I3C_MCONFIG_DISTO_MASK (0x8U) +#define I3C_MCONFIG_DISTO_SHIFT (3U) +/*! DISTO - Disable Timeout + * 0b1..Disabled, if configured + * 0b0..Enabled + */ +#define I3C_MCONFIG_DISTO(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_DISTO_SHIFT)) & I3C_MCONFIG_DISTO_MASK) + +#define I3C_MCONFIG_HKEEP_MASK (0x30U) +#define I3C_MCONFIG_HKEEP_SHIFT (4U) +/*! HKEEP - High-Keeper + * 0b00..None + * 0b01..WIRED_IN + * 0b10..PASSIVE_SDA + * 0b11..PASSIVE_ON_SDA_SCL + */ +#define I3C_MCONFIG_HKEEP(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_HKEEP_SHIFT)) & I3C_MCONFIG_HKEEP_MASK) + +#define I3C_MCONFIG_ODSTOP_MASK (0x40U) +#define I3C_MCONFIG_ODSTOP_SHIFT (6U) +/*! ODSTOP - Open Drain Stop + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MCONFIG_ODSTOP(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_ODSTOP_SHIFT)) & I3C_MCONFIG_ODSTOP_MASK) + +#define I3C_MCONFIG_PPBAUD_MASK (0xF00U) +#define I3C_MCONFIG_PPBAUD_SHIFT (8U) +/*! PPBAUD - Push-Pull Baud Rate */ +#define I3C_MCONFIG_PPBAUD(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_PPBAUD_SHIFT)) & I3C_MCONFIG_PPBAUD_MASK) + +#define I3C_MCONFIG_PPLOW_MASK (0xF000U) +#define I3C_MCONFIG_PPLOW_SHIFT (12U) +/*! PPLOW - Push-Pull Low */ +#define I3C_MCONFIG_PPLOW(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_PPLOW_SHIFT)) & I3C_MCONFIG_PPLOW_MASK) + +#define I3C_MCONFIG_ODBAUD_MASK (0xFF0000U) +#define I3C_MCONFIG_ODBAUD_SHIFT (16U) +/*! ODBAUD - Open Drain Baud Rate */ +#define I3C_MCONFIG_ODBAUD(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_ODBAUD_SHIFT)) & I3C_MCONFIG_ODBAUD_MASK) + +#define I3C_MCONFIG_ODHPP_MASK (0x1000000U) +#define I3C_MCONFIG_ODHPP_SHIFT (24U) +/*! ODHPP - Open Drain High Push-Pull + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MCONFIG_ODHPP(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_ODHPP_SHIFT)) & I3C_MCONFIG_ODHPP_MASK) + +#define I3C_MCONFIG_SKEW_MASK (0xE000000U) +#define I3C_MCONFIG_SKEW_SHIFT (25U) +/*! SKEW - Skew */ +#define I3C_MCONFIG_SKEW(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_SKEW_SHIFT)) & I3C_MCONFIG_SKEW_MASK) + +#define I3C_MCONFIG_I2CBAUD_MASK (0xF0000000U) +#define I3C_MCONFIG_I2CBAUD_SHIFT (28U) +/*! I2CBAUD - I2C Baud Rate */ +#define I3C_MCONFIG_I2CBAUD(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_I2CBAUD_SHIFT)) & I3C_MCONFIG_I2CBAUD_MASK) +/*! @} */ + +/*! @name SCONFIG - Target Configuration */ +/*! @{ */ + +#define I3C_SCONFIG_SLVENA_MASK (0x1U) +#define I3C_SCONFIG_SLVENA_SHIFT (0U) +/*! SLVENA - Target Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SCONFIG_SLVENA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCONFIG_SLVENA_SHIFT)) & I3C_SCONFIG_SLVENA_MASK) + +#define I3C_SCONFIG_NACK_MASK (0x2U) +#define I3C_SCONFIG_NACK_SHIFT (1U) +/*! NACK - Not Acknowledge + * 0b1..Always enable NACK mode (works normally) + * 0b0..Always disable NACK mode + */ +#define I3C_SCONFIG_NACK(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCONFIG_NACK_SHIFT)) & I3C_SCONFIG_NACK_MASK) + +#define I3C_SCONFIG_MATCHSS_MASK (0x4U) +#define I3C_SCONFIG_MATCHSS_SHIFT (2U) +/*! MATCHSS - Match Start or Stop + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SCONFIG_MATCHSS(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCONFIG_MATCHSS_SHIFT)) & I3C_SCONFIG_MATCHSS_MASK) + +#define I3C_SCONFIG_S0IGNORE_MASK (0x8U) +#define I3C_SCONFIG_S0IGNORE_SHIFT (3U) +/*! S0IGNORE - Ignore TE0 or TE1 Errors + * 0b1..Ignore TE0 or TE1 errors + * 0b0..Do not ignore TE0 or TE1 errors + */ +#define I3C_SCONFIG_S0IGNORE(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCONFIG_S0IGNORE_SHIFT)) & I3C_SCONFIG_S0IGNORE_MASK) + +#define I3C_SCONFIG_HDROK_MASK (0x10U) +#define I3C_SCONFIG_HDROK_SHIFT (4U) +/*! HDROK - HDR OK + * 0b1..Enable HDR OK + * 0b0..Disable HDR OK + */ +#define I3C_SCONFIG_HDROK(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCONFIG_HDROK_SHIFT)) & I3C_SCONFIG_HDROK_MASK) + +#define I3C_SCONFIG_OFFLINE_MASK (0x200U) +#define I3C_SCONFIG_OFFLINE_SHIFT (9U) +/*! OFFLINE - Offline + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SCONFIG_OFFLINE(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCONFIG_OFFLINE_SHIFT)) & I3C_SCONFIG_OFFLINE_MASK) + +#define I3C_SCONFIG_BAMATCH_MASK (0xFF0000U) +#define I3C_SCONFIG_BAMATCH_SHIFT (16U) +/*! BAMATCH - Bus Available Match */ +#define I3C_SCONFIG_BAMATCH(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCONFIG_BAMATCH_SHIFT)) & I3C_SCONFIG_BAMATCH_MASK) + +#define I3C_SCONFIG_SADDR_MASK (0xFE000000U) +#define I3C_SCONFIG_SADDR_SHIFT (25U) +/*! SADDR - Static Address */ +#define I3C_SCONFIG_SADDR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCONFIG_SADDR_SHIFT)) & I3C_SCONFIG_SADDR_MASK) +/*! @} */ + +/*! @name SSTATUS - Target Status */ +/*! @{ */ + +#define I3C_SSTATUS_STNOTSTOP_MASK (0x1U) +#define I3C_SSTATUS_STNOTSTOP_SHIFT (0U) +/*! STNOTSTOP - Status not Stop + * 0b1..Busy + * 0b0..In STOP condition + */ +#define I3C_SSTATUS_STNOTSTOP(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_STNOTSTOP_SHIFT)) & I3C_SSTATUS_STNOTSTOP_MASK) + +#define I3C_SSTATUS_STMSG_MASK (0x2U) +#define I3C_SSTATUS_STMSG_SHIFT (1U) +/*! STMSG - Status Message + * 0b1..Busy + * 0b0..Idle + */ +#define I3C_SSTATUS_STMSG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_STMSG_SHIFT)) & I3C_SSTATUS_STMSG_MASK) + +#define I3C_SSTATUS_STCCCH_MASK (0x4U) +#define I3C_SSTATUS_STCCCH_SHIFT (2U) +/*! STCCCH - Status Common Command Code Handler + * 0b1..Handled automatically + * 0b0..No CCC message handled + */ +#define I3C_SSTATUS_STCCCH(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_STCCCH_SHIFT)) & I3C_SSTATUS_STCCCH_MASK) + +#define I3C_SSTATUS_STREQRD_MASK (0x8U) +#define I3C_SSTATUS_STREQRD_SHIFT (3U) +/*! STREQRD - Status Request Read + * 0b1..SDR read from this target or an IBI is being pushed out + * 0b0..Not an SDR read + */ +#define I3C_SSTATUS_STREQRD(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_STREQRD_SHIFT)) & I3C_SSTATUS_STREQRD_MASK) + +#define I3C_SSTATUS_STREQWR_MASK (0x10U) +#define I3C_SSTATUS_STREQWR_SHIFT (4U) +/*! STREQWR - Status Request Write + * 0b1..SDR write data from the controller, but not in ENTDAA mode + * 0b0..Not an SDR write + */ +#define I3C_SSTATUS_STREQWR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_STREQWR_SHIFT)) & I3C_SSTATUS_STREQWR_MASK) + +#define I3C_SSTATUS_STDAA_MASK (0x20U) +#define I3C_SSTATUS_STDAA_SHIFT (5U) +/*! STDAA - Status Dynamic Address Assignment + * 0b1..In ENTDAA mode + * 0b0..Not in ENTDAA mode + */ +#define I3C_SSTATUS_STDAA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_STDAA_SHIFT)) & I3C_SSTATUS_STDAA_MASK) + +#define I3C_SSTATUS_STHDR_MASK (0x40U) +#define I3C_SSTATUS_STHDR_SHIFT (6U) +/*! STHDR - Status High Data Rate + * 0b1..I3C bus in HDR-DDR mode + * 0b0..I3C bus not in HDR-DDR mode + */ +#define I3C_SSTATUS_STHDR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_STHDR_SHIFT)) & I3C_SSTATUS_STHDR_MASK) + +#define I3C_SSTATUS_START_MASK (0x100U) +#define I3C_SSTATUS_START_SHIFT (8U) +/*! START - Start + * 0b1..Detected + * 0b0..Not detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SSTATUS_START(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_START_SHIFT)) & I3C_SSTATUS_START_MASK) + +#define I3C_SSTATUS_MATCHED_MASK (0x200U) +#define I3C_SSTATUS_MATCHED_SHIFT (9U) +/*! MATCHED - Matched + * 0b1..Header matched + * 0b0..Header not matched + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SSTATUS_MATCHED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_MATCHED_SHIFT)) & I3C_SSTATUS_MATCHED_MASK) + +#define I3C_SSTATUS_STOP_MASK (0x400U) +#define I3C_SSTATUS_STOP_SHIFT (10U) +/*! STOP - Stop + * 0b1..Stopped state detected + * 0b0..No Stopped state detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SSTATUS_STOP(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_STOP_SHIFT)) & I3C_SSTATUS_STOP_MASK) + +#define I3C_SSTATUS_RX_PEND_MASK (0x800U) +#define I3C_SSTATUS_RX_PEND_SHIFT (11U) +/*! RX_PEND - Received Message Pending + * 0b1..Received message pending + * 0b0..No received message pending + */ +#define I3C_SSTATUS_RX_PEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_RX_PEND_SHIFT)) & I3C_SSTATUS_RX_PEND_MASK) + +#define I3C_SSTATUS_TXNOTFULL_MASK (0x1000U) +#define I3C_SSTATUS_TXNOTFULL_SHIFT (12U) +/*! TXNOTFULL - Transmit Buffer Not Full + * 0b1..Transmit buffer not full + * 0b0..Transmit buffer full + */ +#define I3C_SSTATUS_TXNOTFULL(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_TXNOTFULL_SHIFT)) & I3C_SSTATUS_TXNOTFULL_MASK) + +#define I3C_SSTATUS_DACHG_MASK (0x2000U) +#define I3C_SSTATUS_DACHG_SHIFT (13U) +/*! DACHG - Dynamic Address Change + * 0b1..DA change detected + * 0b0..No DA change detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SSTATUS_DACHG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_DACHG_SHIFT)) & I3C_SSTATUS_DACHG_MASK) + +#define I3C_SSTATUS_CCC_MASK (0x4000U) +#define I3C_SSTATUS_CCC_SHIFT (14U) +/*! CCC - Common Command Code + * 0b1..CCC received + * 0b0..CCC not received + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SSTATUS_CCC(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_CCC_SHIFT)) & I3C_SSTATUS_CCC_MASK) + +#define I3C_SSTATUS_ERRWARN_MASK (0x8000U) +#define I3C_SSTATUS_ERRWARN_SHIFT (15U) +/*! ERRWARN - Error Warning */ +#define I3C_SSTATUS_ERRWARN(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_ERRWARN_SHIFT)) & I3C_SSTATUS_ERRWARN_MASK) + +#define I3C_SSTATUS_HDRMATCH_MASK (0x10000U) +#define I3C_SSTATUS_HDRMATCH_SHIFT (16U) +/*! HDRMATCH - High Data Rate Command Match + * 0b1..Matched the I3C dynamic address + * 0b0..Did not match + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SSTATUS_HDRMATCH(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_HDRMATCH_SHIFT)) & I3C_SSTATUS_HDRMATCH_MASK) + +#define I3C_SSTATUS_CHANDLED_MASK (0x20000U) +#define I3C_SSTATUS_CHANDLED_SHIFT (17U) +/*! CHANDLED - Common Command Code Handled + * 0b1..CCC handling in progress + * 0b0..CCC handling not in progress + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SSTATUS_CHANDLED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_CHANDLED_SHIFT)) & I3C_SSTATUS_CHANDLED_MASK) + +#define I3C_SSTATUS_EVENT_MASK (0x40000U) +#define I3C_SSTATUS_EVENT_SHIFT (18U) +/*! EVENT - Event + * 0b1..IBI, CR, or HJ occurred + * 0b0..No event occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SSTATUS_EVENT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_EVENT_SHIFT)) & I3C_SSTATUS_EVENT_MASK) + +#define I3C_SSTATUS_EVDET_MASK (0x300000U) +#define I3C_SSTATUS_EVDET_SHIFT (20U) +/*! EVDET - Event Details + * 0b00..NONE (no event or no pending event) + * 0b01..NO_REQUEST (request is not sent yet; either there is no START condition yet, or is waiting for Bus-Available or Bus-Idle (HJ)) + * 0b10..NACKed (not acknowledged, request sent and rejected); I3C tries again + * 0b11..ACKed (acknowledged; request sent and accepted), so done (unless the time control data is still being sent) + */ +#define I3C_SSTATUS_EVDET(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_EVDET_SHIFT)) & I3C_SSTATUS_EVDET_MASK) + +#define I3C_SSTATUS_IBIDIS_MASK (0x1000000U) +#define I3C_SSTATUS_IBIDIS_SHIFT (24U) +/*! IBIDIS - In-Band Interrupts Disable + * 0b1..Disabled + * 0b0..Enabled + */ +#define I3C_SSTATUS_IBIDIS(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_IBIDIS_SHIFT)) & I3C_SSTATUS_IBIDIS_MASK) + +#define I3C_SSTATUS_MRDIS_MASK (0x2000000U) +#define I3C_SSTATUS_MRDIS_SHIFT (25U) +/*! MRDIS - Controller Requests Disable + * 0b1..Disabled + * 0b0..Enabled + */ +#define I3C_SSTATUS_MRDIS(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_MRDIS_SHIFT)) & I3C_SSTATUS_MRDIS_MASK) + +#define I3C_SSTATUS_HJDIS_MASK (0x8000000U) +#define I3C_SSTATUS_HJDIS_SHIFT (27U) +/*! HJDIS - Hot-Join Disabled + * 0b1..Disabled + * 0b0..Enabled + */ +#define I3C_SSTATUS_HJDIS(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_HJDIS_SHIFT)) & I3C_SSTATUS_HJDIS_MASK) + +#define I3C_SSTATUS_ACTSTATE_MASK (0x30000000U) +#define I3C_SSTATUS_ACTSTATE_SHIFT (28U) +/*! ACTSTATE - Activity State from Common Command Codes (CCC) + * 0b00..NO_LATENCY (normal bus operations) + * 0b01..LATENCY_1MS (1 ms of latency) + * 0b10..LATENCY_100MS (100 ms of latency) + * 0b11..LATENCY_10S (10 seconds of latency) + */ +#define I3C_SSTATUS_ACTSTATE(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_ACTSTATE_SHIFT)) & I3C_SSTATUS_ACTSTATE_MASK) + +#define I3C_SSTATUS_TIMECTRL_MASK (0xC0000000U) +#define I3C_SSTATUS_TIMECTRL_SHIFT (30U) +/*! TIMECTRL - Time Control + * 0b00..NO_TIME_CONTROL (no time control is enabled) + * 0b01..SYNC_MODE (Synchronous mode is enabled) + * 0b10..ASYNC_MODE (Asynchronous standard mode (0 or 1) is enabled) + * 0b11..BOTHSYNCASYNC (both Synchronous and Asynchronous modes are enabled) + */ +#define I3C_SSTATUS_TIMECTRL(x) (((uint32_t)(((uint32_t)(x)) << I3C_SSTATUS_TIMECTRL_SHIFT)) & I3C_SSTATUS_TIMECTRL_MASK) +/*! @} */ + +/*! @name SCTRL - Target Control */ +/*! @{ */ + +#define I3C_SCTRL_EVENT_MASK (0x3U) +#define I3C_SCTRL_EVENT_SHIFT (0U) +/*! EVENT - Event + * 0b00..NORMAL_MODE + * 0b01..IBI + * 0b10..CONTROLLER_REQUEST + * 0b11..HOT_JOIN_REQUEST + */ +#define I3C_SCTRL_EVENT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCTRL_EVENT_SHIFT)) & I3C_SCTRL_EVENT_MASK) + +#define I3C_SCTRL_EXTDATA_MASK (0x8U) +#define I3C_SCTRL_EXTDATA_SHIFT (3U) +/*! EXTDATA - Extended Data + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SCTRL_EXTDATA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCTRL_EXTDATA_SHIFT)) & I3C_SCTRL_EXTDATA_MASK) + +#define I3C_SCTRL_IBIDATA_MASK (0xFF00U) +#define I3C_SCTRL_IBIDATA_SHIFT (8U) +/*! IBIDATA - In-Band Interrupt Data */ +#define I3C_SCTRL_IBIDATA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCTRL_IBIDATA_SHIFT)) & I3C_SCTRL_IBIDATA_MASK) + +#define I3C_SCTRL_PENDINT_MASK (0xF0000U) +#define I3C_SCTRL_PENDINT_SHIFT (16U) +/*! PENDINT - Pending Interrupt */ +#define I3C_SCTRL_PENDINT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCTRL_PENDINT_SHIFT)) & I3C_SCTRL_PENDINT_MASK) + +#define I3C_SCTRL_ACTSTATE_MASK (0x300000U) +#define I3C_SCTRL_ACTSTATE_SHIFT (20U) +/*! ACTSTATE - Activity State of Target */ +#define I3C_SCTRL_ACTSTATE(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCTRL_ACTSTATE_SHIFT)) & I3C_SCTRL_ACTSTATE_MASK) + +#define I3C_SCTRL_VENDINFO_MASK (0xFF000000U) +#define I3C_SCTRL_VENDINFO_SHIFT (24U) +/*! VENDINFO - Vendor Information */ +#define I3C_SCTRL_VENDINFO(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCTRL_VENDINFO_SHIFT)) & I3C_SCTRL_VENDINFO_MASK) +/*! @} */ + +/*! @name SINTSET - Target Interrupt Set */ +/*! @{ */ + +#define I3C_SINTSET_START_MASK (0x100U) +#define I3C_SINTSET_START_SHIFT (8U) +/*! START - Start Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_START(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_START_SHIFT)) & I3C_SINTSET_START_MASK) + +#define I3C_SINTSET_MATCHED_MASK (0x200U) +#define I3C_SINTSET_MATCHED_SHIFT (9U) +/*! MATCHED - Match Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_MATCHED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_MATCHED_SHIFT)) & I3C_SINTSET_MATCHED_MASK) + +#define I3C_SINTSET_STOP_MASK (0x400U) +#define I3C_SINTSET_STOP_SHIFT (10U) +/*! STOP - Stop Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_STOP(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_STOP_SHIFT)) & I3C_SINTSET_STOP_MASK) + +#define I3C_SINTSET_RXPEND_MASK (0x800U) +#define I3C_SINTSET_RXPEND_SHIFT (11U) +/*! RXPEND - Receive Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_RXPEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_RXPEND_SHIFT)) & I3C_SINTSET_RXPEND_MASK) + +#define I3C_SINTSET_TXSEND_MASK (0x1000U) +#define I3C_SINTSET_TXSEND_SHIFT (12U) +/*! TXSEND - Transmit Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_TXSEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_TXSEND_SHIFT)) & I3C_SINTSET_TXSEND_MASK) + +#define I3C_SINTSET_DACHG_MASK (0x2000U) +#define I3C_SINTSET_DACHG_SHIFT (13U) +/*! DACHG - Dynamic Address Change Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_DACHG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_DACHG_SHIFT)) & I3C_SINTSET_DACHG_MASK) + +#define I3C_SINTSET_CCC_MASK (0x4000U) +#define I3C_SINTSET_CCC_SHIFT (14U) +/*! CCC - Common Command Code (CCC) Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_CCC(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_CCC_SHIFT)) & I3C_SINTSET_CCC_MASK) + +#define I3C_SINTSET_ERRWARN_MASK (0x8000U) +#define I3C_SINTSET_ERRWARN_SHIFT (15U) +/*! ERRWARN - Error or Warning Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_ERRWARN(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_ERRWARN_SHIFT)) & I3C_SINTSET_ERRWARN_MASK) + +#define I3C_SINTSET_DDRMATCHED_MASK (0x10000U) +#define I3C_SINTSET_DDRMATCHED_SHIFT (16U) +/*! DDRMATCHED - Double Data Rate Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_DDRMATCHED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_DDRMATCHED_SHIFT)) & I3C_SINTSET_DDRMATCHED_MASK) + +#define I3C_SINTSET_CHANDLED_MASK (0x20000U) +#define I3C_SINTSET_CHANDLED_SHIFT (17U) +/*! CHANDLED - Common Command Code (CCC) Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_CHANDLED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_CHANDLED_SHIFT)) & I3C_SINTSET_CHANDLED_MASK) + +#define I3C_SINTSET_EVENT_MASK (0x40000U) +#define I3C_SINTSET_EVENT_SHIFT (18U) +/*! EVENT - Event Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_SINTSET_EVENT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTSET_EVENT_SHIFT)) & I3C_SINTSET_EVENT_MASK) +/*! @} */ + +/*! @name SINTCLR - Target Interrupt Clear */ +/*! @{ */ + +#define I3C_SINTCLR_START_MASK (0x100U) +#define I3C_SINTCLR_START_SHIFT (8U) +/*! START - START Interrupt Enable Clear */ +#define I3C_SINTCLR_START(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_START_SHIFT)) & I3C_SINTCLR_START_MASK) + +#define I3C_SINTCLR_MATCHED_MASK (0x200U) +#define I3C_SINTCLR_MATCHED_SHIFT (9U) +/*! MATCHED - Matched Interrupt Enable Clear */ +#define I3C_SINTCLR_MATCHED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_MATCHED_SHIFT)) & I3C_SINTCLR_MATCHED_MASK) + +#define I3C_SINTCLR_STOP_MASK (0x400U) +#define I3C_SINTCLR_STOP_SHIFT (10U) +/*! STOP - STOP Interrupt Enable Clear */ +#define I3C_SINTCLR_STOP(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_STOP_SHIFT)) & I3C_SINTCLR_STOP_MASK) + +#define I3C_SINTCLR_RXPEND_MASK (0x800U) +#define I3C_SINTCLR_RXPEND_SHIFT (11U) +/*! RXPEND - RXPEND Interrupt Enable Clear */ +#define I3C_SINTCLR_RXPEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_RXPEND_SHIFT)) & I3C_SINTCLR_RXPEND_MASK) + +#define I3C_SINTCLR_TXSEND_MASK (0x1000U) +#define I3C_SINTCLR_TXSEND_SHIFT (12U) +/*! TXSEND - TXSEND Interrupt Enable Clear */ +#define I3C_SINTCLR_TXSEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_TXSEND_SHIFT)) & I3C_SINTCLR_TXSEND_MASK) + +#define I3C_SINTCLR_DACHG_MASK (0x2000U) +#define I3C_SINTCLR_DACHG_SHIFT (13U) +/*! DACHG - DACHG Interrupt Enable Clear */ +#define I3C_SINTCLR_DACHG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_DACHG_SHIFT)) & I3C_SINTCLR_DACHG_MASK) + +#define I3C_SINTCLR_CCC_MASK (0x4000U) +#define I3C_SINTCLR_CCC_SHIFT (14U) +/*! CCC - CCC Interrupt Enable Clear */ +#define I3C_SINTCLR_CCC(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_CCC_SHIFT)) & I3C_SINTCLR_CCC_MASK) + +#define I3C_SINTCLR_ERRWARN_MASK (0x8000U) +#define I3C_SINTCLR_ERRWARN_SHIFT (15U) +/*! ERRWARN - ERRWARN Interrupt Enable Clear */ +#define I3C_SINTCLR_ERRWARN(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_ERRWARN_SHIFT)) & I3C_SINTCLR_ERRWARN_MASK) + +#define I3C_SINTCLR_DDRMATCHED_MASK (0x10000U) +#define I3C_SINTCLR_DDRMATCHED_SHIFT (16U) +/*! DDRMATCHED - DDRMATCHED Interrupt Enable Clear */ +#define I3C_SINTCLR_DDRMATCHED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_DDRMATCHED_SHIFT)) & I3C_SINTCLR_DDRMATCHED_MASK) + +#define I3C_SINTCLR_CHANDLED_MASK (0x20000U) +#define I3C_SINTCLR_CHANDLED_SHIFT (17U) +/*! CHANDLED - CHANDLED Interrupt Enable Clear */ +#define I3C_SINTCLR_CHANDLED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_CHANDLED_SHIFT)) & I3C_SINTCLR_CHANDLED_MASK) + +#define I3C_SINTCLR_EVENT_MASK (0x40000U) +#define I3C_SINTCLR_EVENT_SHIFT (18U) +/*! EVENT - EVENT Interrupt Enable Clear */ +#define I3C_SINTCLR_EVENT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTCLR_EVENT_SHIFT)) & I3C_SINTCLR_EVENT_MASK) +/*! @} */ + +/*! @name SINTMASKED - Target Interrupt Mask */ +/*! @{ */ + +#define I3C_SINTMASKED_START_MASK (0x100U) +#define I3C_SINTMASKED_START_SHIFT (8U) +/*! START - START Interrupt Mask */ +#define I3C_SINTMASKED_START(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_START_SHIFT)) & I3C_SINTMASKED_START_MASK) + +#define I3C_SINTMASKED_MATCHED_MASK (0x200U) +#define I3C_SINTMASKED_MATCHED_SHIFT (9U) +/*! MATCHED - MATCHED Interrupt Mask */ +#define I3C_SINTMASKED_MATCHED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_MATCHED_SHIFT)) & I3C_SINTMASKED_MATCHED_MASK) + +#define I3C_SINTMASKED_STOP_MASK (0x400U) +#define I3C_SINTMASKED_STOP_SHIFT (10U) +/*! STOP - STOP Interrupt Mask */ +#define I3C_SINTMASKED_STOP(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_STOP_SHIFT)) & I3C_SINTMASKED_STOP_MASK) + +#define I3C_SINTMASKED_RXPEND_MASK (0x800U) +#define I3C_SINTMASKED_RXPEND_SHIFT (11U) +/*! RXPEND - RXPEND Interrupt Mask */ +#define I3C_SINTMASKED_RXPEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_RXPEND_SHIFT)) & I3C_SINTMASKED_RXPEND_MASK) + +#define I3C_SINTMASKED_TXSEND_MASK (0x1000U) +#define I3C_SINTMASKED_TXSEND_SHIFT (12U) +/*! TXSEND - TXSEND Interrupt Mask */ +#define I3C_SINTMASKED_TXSEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_TXSEND_SHIFT)) & I3C_SINTMASKED_TXSEND_MASK) + +#define I3C_SINTMASKED_DACHG_MASK (0x2000U) +#define I3C_SINTMASKED_DACHG_SHIFT (13U) +/*! DACHG - DACHG Interrupt Mask */ +#define I3C_SINTMASKED_DACHG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_DACHG_SHIFT)) & I3C_SINTMASKED_DACHG_MASK) + +#define I3C_SINTMASKED_CCC_MASK (0x4000U) +#define I3C_SINTMASKED_CCC_SHIFT (14U) +/*! CCC - CCC Interrupt Mask */ +#define I3C_SINTMASKED_CCC(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_CCC_SHIFT)) & I3C_SINTMASKED_CCC_MASK) + +#define I3C_SINTMASKED_ERRWARN_MASK (0x8000U) +#define I3C_SINTMASKED_ERRWARN_SHIFT (15U) +/*! ERRWARN - ERRWARN Interrupt Mask */ +#define I3C_SINTMASKED_ERRWARN(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_ERRWARN_SHIFT)) & I3C_SINTMASKED_ERRWARN_MASK) + +#define I3C_SINTMASKED_DDRMATCHED_MASK (0x10000U) +#define I3C_SINTMASKED_DDRMATCHED_SHIFT (16U) +/*! DDRMATCHED - DDRMATCHED Interrupt Mask */ +#define I3C_SINTMASKED_DDRMATCHED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_DDRMATCHED_SHIFT)) & I3C_SINTMASKED_DDRMATCHED_MASK) + +#define I3C_SINTMASKED_CHANDLED_MASK (0x20000U) +#define I3C_SINTMASKED_CHANDLED_SHIFT (17U) +/*! CHANDLED - CHANDLED Interrupt Mask */ +#define I3C_SINTMASKED_CHANDLED(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_CHANDLED_SHIFT)) & I3C_SINTMASKED_CHANDLED_MASK) + +#define I3C_SINTMASKED_EVENT_MASK (0x40000U) +#define I3C_SINTMASKED_EVENT_SHIFT (18U) +/*! EVENT - EVENT Interrupt Mask */ +#define I3C_SINTMASKED_EVENT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SINTMASKED_EVENT_SHIFT)) & I3C_SINTMASKED_EVENT_MASK) +/*! @} */ + +/*! @name SERRWARN - Target Errors and Warnings */ +/*! @{ */ + +#define I3C_SERRWARN_ORUN_MASK (0x1U) +#define I3C_SERRWARN_ORUN_SHIFT (0U) +/*! ORUN - Overrun Error + * 0b1..Overrun error + * 0b0..No overrun error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_ORUN(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_ORUN_SHIFT)) & I3C_SERRWARN_ORUN_MASK) + +#define I3C_SERRWARN_URUN_MASK (0x2U) +#define I3C_SERRWARN_URUN_SHIFT (1U) +/*! URUN - Underrun Error + * 0b1..Underrun error + * 0b0..No underrun error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_URUN(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_URUN_SHIFT)) & I3C_SERRWARN_URUN_MASK) + +#define I3C_SERRWARN_URUNNACK_MASK (0x4U) +#define I3C_SERRWARN_URUNNACK_SHIFT (2U) +/*! URUNNACK - Underrun and Not Acknowledged (NACKed) Error + * 0b1..Underrun; not acknowledged error + * 0b0..No underrun; not acknowledged error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_URUNNACK(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_URUNNACK_SHIFT)) & I3C_SERRWARN_URUNNACK_MASK) + +#define I3C_SERRWARN_TERM_MASK (0x8U) +#define I3C_SERRWARN_TERM_SHIFT (3U) +/*! TERM - Terminated Error + * 0b1..Terminated error + * 0b0..No terminated error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_TERM(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_TERM_SHIFT)) & I3C_SERRWARN_TERM_MASK) + +#define I3C_SERRWARN_INVSTART_MASK (0x10U) +#define I3C_SERRWARN_INVSTART_SHIFT (4U) +/*! INVSTART - Invalid Start Error + * 0b1..Invalid start error + * 0b0..No invalid start error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_INVSTART(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_INVSTART_SHIFT)) & I3C_SERRWARN_INVSTART_MASK) + +#define I3C_SERRWARN_SPAR_MASK (0x100U) +#define I3C_SERRWARN_SPAR_SHIFT (8U) +/*! SPAR - SDR Parity Error + * 0b1..SDR parity error + * 0b0..No SDR parity error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_SPAR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_SPAR_SHIFT)) & I3C_SERRWARN_SPAR_MASK) + +#define I3C_SERRWARN_HPAR_MASK (0x200U) +#define I3C_SERRWARN_HPAR_SHIFT (9U) +/*! HPAR - HDR Parity Error + * 0b1..HDR parity error + * 0b0..No HDR parity error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_HPAR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_HPAR_SHIFT)) & I3C_SERRWARN_HPAR_MASK) + +#define I3C_SERRWARN_HCRC_MASK (0x400U) +#define I3C_SERRWARN_HCRC_SHIFT (10U) +/*! HCRC - HDR-DDR CRC Error + * 0b1..HDR-DDR CRC error occurred + * 0b0..No HDR-DDR CRC error occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_HCRC(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_HCRC_SHIFT)) & I3C_SERRWARN_HCRC_MASK) + +#define I3C_SERRWARN_S0S1_MASK (0x800U) +#define I3C_SERRWARN_S0S1_SHIFT (11U) +/*! S0S1 - TE0 or TE1 Error + * 0b1..TE0 or TE1 error occurred + * 0b0..No TE0 or TE1 error occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_S0S1(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_S0S1_SHIFT)) & I3C_SERRWARN_S0S1_MASK) + +#define I3C_SERRWARN_OREAD_MASK (0x10000U) +#define I3C_SERRWARN_OREAD_SHIFT (16U) +/*! OREAD - Over-Read Error + * 0b1..Over-read error + * 0b0..No over-read error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_OREAD(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_OREAD_SHIFT)) & I3C_SERRWARN_OREAD_MASK) + +#define I3C_SERRWARN_OWRITE_MASK (0x20000U) +#define I3C_SERRWARN_OWRITE_SHIFT (17U) +/*! OWRITE - Over-Write Error + * 0b1..Overwrite error + * 0b0..No overwrite error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_SERRWARN_OWRITE(x) (((uint32_t)(((uint32_t)(x)) << I3C_SERRWARN_OWRITE_SHIFT)) & I3C_SERRWARN_OWRITE_MASK) +/*! @} */ + +/*! @name SDMACTRL - Target DMA Control */ +/*! @{ */ + +#define I3C_SDMACTRL_DMAFB_MASK (0x3U) +#define I3C_SDMACTRL_DMAFB_SHIFT (0U) +/*! DMAFB - DMA Read (From-Bus) Trigger + * 0b00..DMA not used + * 0b01..DMA enabled for one frame + * 0b10..DMA enabled until turned off + * 0b11.. + */ +#define I3C_SDMACTRL_DMAFB(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDMACTRL_DMAFB_SHIFT)) & I3C_SDMACTRL_DMAFB_MASK) + +#define I3C_SDMACTRL_DMATB_MASK (0xCU) +#define I3C_SDMACTRL_DMATB_SHIFT (2U) +/*! DMATB - DMA Write (To-Bus) Trigger + * 0b00..DMA not used + * 0b01..DMA enabled for one frame + * 0b10..DMA enabled until turned off + * 0b11.. + */ +#define I3C_SDMACTRL_DMATB(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDMACTRL_DMATB_SHIFT)) & I3C_SDMACTRL_DMATB_MASK) + +#define I3C_SDMACTRL_DMAWIDTH_MASK (0x30U) +#define I3C_SDMACTRL_DMAWIDTH_SHIFT (4U) +/*! DMAWIDTH - Width of DMA Operations + * 0b00, 0b01..Byte + * 0b10..Halfword (16 bits) (this value ensures that two bytes are available in the FIFO) + * 0b11.. + */ +#define I3C_SDMACTRL_DMAWIDTH(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDMACTRL_DMAWIDTH_SHIFT)) & I3C_SDMACTRL_DMAWIDTH_MASK) +/*! @} */ + +/*! @name SDATACTRL - Target Data Control */ +/*! @{ */ + +#define I3C_SDATACTRL_FLUSHTB_MASK (0x1U) +#define I3C_SDATACTRL_FLUSHTB_SHIFT (0U) +/*! FLUSHTB - Flush To-Bus Buffer or FIFO */ +#define I3C_SDATACTRL_FLUSHTB(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_FLUSHTB_SHIFT)) & I3C_SDATACTRL_FLUSHTB_MASK) + +#define I3C_SDATACTRL_FLUSHFB_MASK (0x2U) +#define I3C_SDATACTRL_FLUSHFB_SHIFT (1U) +/*! FLUSHFB - Flush From-Bus Buffer or FIFO */ +#define I3C_SDATACTRL_FLUSHFB(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_FLUSHFB_SHIFT)) & I3C_SDATACTRL_FLUSHFB_MASK) + +#define I3C_SDATACTRL_UNLOCK_MASK (0x8U) +#define I3C_SDATACTRL_UNLOCK_SHIFT (3U) +/*! UNLOCK - Unlock + * 0b0..Cannot be changed + * 0b1..Can be changed + */ +#define I3C_SDATACTRL_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_UNLOCK_SHIFT)) & I3C_SDATACTRL_UNLOCK_MASK) + +#define I3C_SDATACTRL_TXTRIG_MASK (0x30U) +#define I3C_SDATACTRL_TXTRIG_SHIFT (4U) +/*! TXTRIG - Transmit Trigger Level + * 0b00..Trigger when empty + * 0b01..Trigger when 1/4 full or less + * 0b10..Trigger when 1/2 full or less + * 0b11..Default (trigger when 1 less than full or less) + */ +#define I3C_SDATACTRL_TXTRIG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_TXTRIG_SHIFT)) & I3C_SDATACTRL_TXTRIG_MASK) + +#define I3C_SDATACTRL_RXTRIG_MASK (0xC0U) +#define I3C_SDATACTRL_RXTRIG_SHIFT (6U) +/*! RXTRIG - Receive Trigger Level + * 0b00..Trigger when not empty + * 0b01..Trigger when 1/4 or more full + * 0b10..Trigger when 1/2 or more full + * 0b11..Trigger when 3/4 or more full + */ +#define I3C_SDATACTRL_RXTRIG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_RXTRIG_SHIFT)) & I3C_SDATACTRL_RXTRIG_MASK) + +#define I3C_SDATACTRL_TXCOUNT_MASK (0x1F0000U) +#define I3C_SDATACTRL_TXCOUNT_SHIFT (16U) +/*! TXCOUNT - Count of Bytes in Transmit */ +#define I3C_SDATACTRL_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_TXCOUNT_SHIFT)) & I3C_SDATACTRL_TXCOUNT_MASK) + +#define I3C_SDATACTRL_RXCOUNT_MASK (0x1F000000U) +#define I3C_SDATACTRL_RXCOUNT_SHIFT (24U) +/*! RXCOUNT - Count of Bytes in Receive */ +#define I3C_SDATACTRL_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_RXCOUNT_SHIFT)) & I3C_SDATACTRL_RXCOUNT_MASK) + +#define I3C_SDATACTRL_TXFULL_MASK (0x40000000U) +#define I3C_SDATACTRL_TXFULL_SHIFT (30U) +/*! TXFULL - Transmit is Full + * 0b1..Full + * 0b0..Not full + */ +#define I3C_SDATACTRL_TXFULL(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_TXFULL_SHIFT)) & I3C_SDATACTRL_TXFULL_MASK) + +#define I3C_SDATACTRL_RXEMPTY_MASK (0x80000000U) +#define I3C_SDATACTRL_RXEMPTY_SHIFT (31U) +/*! RXEMPTY - Receive is Empty + * 0b1..Empty + * 0b0..Not empty + */ +#define I3C_SDATACTRL_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDATACTRL_RXEMPTY_SHIFT)) & I3C_SDATACTRL_RXEMPTY_MASK) +/*! @} */ + +/*! @name SWDATAB - Target Write Data Byte */ +/*! @{ */ + +#define I3C_SWDATAB_DATA_MASK (0xFFU) +#define I3C_SWDATAB_DATA_SHIFT (0U) +/*! DATA - Data */ +#define I3C_SWDATAB_DATA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAB_DATA_SHIFT)) & I3C_SWDATAB_DATA_MASK) + +#define I3C_SWDATAB_END_MASK (0x100U) +#define I3C_SWDATAB_END_SHIFT (8U) +/*! END - End + * 0b1..End + * 0b0..Not the end + */ +#define I3C_SWDATAB_END(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAB_END_SHIFT)) & I3C_SWDATAB_END_MASK) + +#define I3C_SWDATAB_END_ALSO_MASK (0x10000U) +#define I3C_SWDATAB_END_ALSO_SHIFT (16U) +/*! END_ALSO - End Also + * 0b1..End + * 0b0..Not the end + */ +#define I3C_SWDATAB_END_ALSO(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAB_END_ALSO_SHIFT)) & I3C_SWDATAB_END_ALSO_MASK) +/*! @} */ + +/*! @name SWDATABE - Target Write Data Byte End */ +/*! @{ */ + +#define I3C_SWDATABE_DATA_MASK (0xFFU) +#define I3C_SWDATABE_DATA_SHIFT (0U) +/*! DATA - Data */ +#define I3C_SWDATABE_DATA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATABE_DATA_SHIFT)) & I3C_SWDATABE_DATA_MASK) +/*! @} */ + +/*! @name SWDATAH - Target Write Data Halfword */ +/*! @{ */ + +#define I3C_SWDATAH_DATA0_MASK (0xFFU) +#define I3C_SWDATAH_DATA0_SHIFT (0U) +/*! DATA0 - Data 0 */ +#define I3C_SWDATAH_DATA0(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAH_DATA0_SHIFT)) & I3C_SWDATAH_DATA0_MASK) + +#define I3C_SWDATAH_DATA1_MASK (0xFF00U) +#define I3C_SWDATAH_DATA1_SHIFT (8U) +/*! DATA1 - Data 1 */ +#define I3C_SWDATAH_DATA1(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAH_DATA1_SHIFT)) & I3C_SWDATAH_DATA1_MASK) + +#define I3C_SWDATAH_END_MASK (0x10000U) +#define I3C_SWDATAH_END_SHIFT (16U) +/*! END - End of Message + * 0b1..End + * 0b0..Not the end + */ +#define I3C_SWDATAH_END(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAH_END_SHIFT)) & I3C_SWDATAH_END_MASK) +/*! @} */ + +/*! @name SWDATAHE - Target Write Data Halfword End */ +/*! @{ */ + +#define I3C_SWDATAHE_DATA0_MASK (0xFFU) +#define I3C_SWDATAHE_DATA0_SHIFT (0U) +/*! DATA0 - Data 0 */ +#define I3C_SWDATAHE_DATA0(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAHE_DATA0_SHIFT)) & I3C_SWDATAHE_DATA0_MASK) + +#define I3C_SWDATAHE_DATA1_MASK (0xFF00U) +#define I3C_SWDATAHE_DATA1_SHIFT (8U) +/*! DATA1 - Data 1 */ +#define I3C_SWDATAHE_DATA1(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAHE_DATA1_SHIFT)) & I3C_SWDATAHE_DATA1_MASK) +/*! @} */ + +/*! @name SRDATAB - Target Read Data Byte */ +/*! @{ */ + +#define I3C_SRDATAB_DATA0_MASK (0xFFU) +#define I3C_SRDATAB_DATA0_SHIFT (0U) +/*! DATA0 - Data 0 */ +#define I3C_SRDATAB_DATA0(x) (((uint32_t)(((uint32_t)(x)) << I3C_SRDATAB_DATA0_SHIFT)) & I3C_SRDATAB_DATA0_MASK) +/*! @} */ + +/*! @name SRDATAH - Target Read Data Halfword */ +/*! @{ */ + +#define I3C_SRDATAH_LSB_MASK (0xFFU) +#define I3C_SRDATAH_LSB_SHIFT (0U) +/*! LSB - Low Byte */ +#define I3C_SRDATAH_LSB(x) (((uint32_t)(((uint32_t)(x)) << I3C_SRDATAH_LSB_SHIFT)) & I3C_SRDATAH_LSB_MASK) + +#define I3C_SRDATAH_MSB_MASK (0xFF00U) +#define I3C_SRDATAH_MSB_SHIFT (8U) +/*! MSB - High Byte */ +#define I3C_SRDATAH_MSB(x) (((uint32_t)(((uint32_t)(x)) << I3C_SRDATAH_MSB_SHIFT)) & I3C_SRDATAH_MSB_MASK) +/*! @} */ + +/*! @name SWDATAB1 - Target Write Data Byte */ +/*! @{ */ + +#define I3C_SWDATAB1_DATA_MASK (0xFFU) +#define I3C_SWDATAB1_DATA_SHIFT (0U) +/*! DATA - Data */ +#define I3C_SWDATAB1_DATA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAB1_DATA_SHIFT)) & I3C_SWDATAB1_DATA_MASK) +/*! @} */ + +/*! @name SWDATAH1 - Target Write Data Halfword */ +/*! @{ */ + +#define I3C_SWDATAH1_DATA_MASK (0xFFFFU) +#define I3C_SWDATAH1_DATA_SHIFT (0U) +/*! DATA - Data */ +#define I3C_SWDATAH1_DATA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SWDATAH1_DATA_SHIFT)) & I3C_SWDATAH1_DATA_MASK) +/*! @} */ + +/*! @name SCAPABILITIES2 - Target Capabilities 2 */ +/*! @{ */ + +#define I3C_SCAPABILITIES2_MAPCNT_MASK (0xFU) +#define I3C_SCAPABILITIES2_MAPCNT_SHIFT (0U) +/*! MAPCNT - Map Count */ +#define I3C_SCAPABILITIES2_MAPCNT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_MAPCNT_SHIFT)) & I3C_SCAPABILITIES2_MAPCNT_MASK) + +#define I3C_SCAPABILITIES2_I2C10B_MASK (0x10U) +#define I3C_SCAPABILITIES2_I2C10B_SHIFT (4U) +/*! I2C10B - I2C 10-bit Address + * 0b0..Not supported + * 0b1..Supported + */ +#define I3C_SCAPABILITIES2_I2C10B(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_I2C10B_SHIFT)) & I3C_SCAPABILITIES2_I2C10B_MASK) + +#define I3C_SCAPABILITIES2_I2CRST_MASK (0x20U) +#define I3C_SCAPABILITIES2_I2CRST_SHIFT (5U) +/*! I2CRST - I2C Software Reset + * 0b0..Not supported + * 0b1..Supported + */ +#define I3C_SCAPABILITIES2_I2CRST(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_I2CRST_SHIFT)) & I3C_SCAPABILITIES2_I2CRST_MASK) + +#define I3C_SCAPABILITIES2_I2CDEVID_MASK (0x40U) +#define I3C_SCAPABILITIES2_I2CDEVID_SHIFT (6U) +/*! I2CDEVID - I2C Device ID + * 0b0..Not supported + * 0b1..Supported + */ +#define I3C_SCAPABILITIES2_I2CDEVID(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_I2CDEVID_SHIFT)) & I3C_SCAPABILITIES2_I2CDEVID_MASK) + +#define I3C_SCAPABILITIES2_IBIEXT_MASK (0x100U) +#define I3C_SCAPABILITIES2_IBIEXT_SHIFT (8U) +/*! IBIEXT - In-Band Interrupt EXTDATA + * 0b0..Not supported + * 0b1..Supported + */ +#define I3C_SCAPABILITIES2_IBIEXT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_IBIEXT_SHIFT)) & I3C_SCAPABILITIES2_IBIEXT_MASK) + +#define I3C_SCAPABILITIES2_IBIXREG_MASK (0x200U) +#define I3C_SCAPABILITIES2_IBIXREG_SHIFT (9U) +/*! IBIXREG - In-Band Interrupt Extended Register + * 0b0..Not supported + * 0b1..Supported + */ +#define I3C_SCAPABILITIES2_IBIXREG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_IBIXREG_SHIFT)) & I3C_SCAPABILITIES2_IBIXREG_MASK) + +#define I3C_SCAPABILITIES2_SLVRST_MASK (0x20000U) +#define I3C_SCAPABILITIES2_SLVRST_SHIFT (17U) +/*! SLVRST - Target Reset + * 0b0..Not supported + * 0b1..Supported + */ +#define I3C_SCAPABILITIES2_SLVRST(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_SLVRST_SHIFT)) & I3C_SCAPABILITIES2_SLVRST_MASK) + +#define I3C_SCAPABILITIES2_GROUP_MASK (0xC0000U) +#define I3C_SCAPABILITIES2_GROUP_SHIFT (18U) +/*! GROUP - Group + * 0b00..v1.1 group addressing not supported + * 0b01..One group supported + * 0b10..Two groups supported + * 0b11..Three groups supported + */ +#define I3C_SCAPABILITIES2_GROUP(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_GROUP_SHIFT)) & I3C_SCAPABILITIES2_GROUP_MASK) + +#define I3C_SCAPABILITIES2_AASA_MASK (0x200000U) +#define I3C_SCAPABILITIES2_AASA_SHIFT (21U) +/*! AASA - SETAASA + * 0b1..SETAASA supported + * 0b0..SETAASA not supported + */ +#define I3C_SCAPABILITIES2_AASA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_AASA_SHIFT)) & I3C_SCAPABILITIES2_AASA_MASK) + +#define I3C_SCAPABILITIES2_SSTSUB_MASK (0x400000U) +#define I3C_SCAPABILITIES2_SSTSUB_SHIFT (22U) +/*! SSTSUB - Target-Target(s)-Tunnel Subscriber Capable + * 0b1..Subscriber capable + * 0b0..Not subscriber capable + */ +#define I3C_SCAPABILITIES2_SSTSUB(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_SSTSUB_SHIFT)) & I3C_SCAPABILITIES2_SSTSUB_MASK) + +#define I3C_SCAPABILITIES2_SSTWR_MASK (0x800000U) +#define I3C_SCAPABILITIES2_SSTWR_SHIFT (23U) +/*! SSTWR - Target-Target(s)-Tunnel Write Capable + * 0b1..Write capable + * 0b0..Not write capable + */ +#define I3C_SCAPABILITIES2_SSTWR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES2_SSTWR_SHIFT)) & I3C_SCAPABILITIES2_SSTWR_MASK) +/*! @} */ + +/*! @name SCAPABILITIES - Target Capabilities */ +/*! @{ */ + +#define I3C_SCAPABILITIES_IDENA_MASK (0x3U) +#define I3C_SCAPABILITIES_IDENA_SHIFT (0U) +/*! IDENA - ID 48b Handler + * 0b00..Application + * 0b01..Hardware + * 0b10..Hardware, but the I3C module instance handles ID 48b + * 0b11..A part number register (PARTNO) + */ +#define I3C_SCAPABILITIES_IDENA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_IDENA_SHIFT)) & I3C_SCAPABILITIES_IDENA_MASK) + +#define I3C_SCAPABILITIES_IDREG_MASK (0x3CU) +#define I3C_SCAPABILITIES_IDREG_SHIFT (2U) +/*! IDREG - ID Register + * 0b0000..All ID register features disabled + * 0bxxx1..ID Instance is a register; used if there is no PARTNO register + * 0bxx1x..An ID Random field is available + * 0bx1xx..A Device Characteristic Register (DCR) is available + * 0b1xxx..A Bus Characteristics Register (BCR) is available + */ +#define I3C_SCAPABILITIES_IDREG(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_IDREG_SHIFT)) & I3C_SCAPABILITIES_IDREG_MASK) + +#define I3C_SCAPABILITIES_HDRSUPP_MASK (0xC0U) +#define I3C_SCAPABILITIES_HDRSUPP_SHIFT (6U) +/*! HDRSUPP - High Data Rate Support + * 0b00..No HDR modes supported + * 0b01..DDR mode supported + * *.. + */ +#define I3C_SCAPABILITIES_HDRSUPP(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_HDRSUPP_SHIFT)) & I3C_SCAPABILITIES_HDRSUPP_MASK) + +#define I3C_SCAPABILITIES_MASTER_MASK (0x200U) +#define I3C_SCAPABILITIES_MASTER_SHIFT (9U) +/*! MASTER - Controller + * 0b0..Not supported + * 0b1..Supported + */ +#define I3C_SCAPABILITIES_MASTER(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_MASTER_SHIFT)) & I3C_SCAPABILITIES_MASTER_MASK) + +#define I3C_SCAPABILITIES_SADDR_MASK (0xC00U) +#define I3C_SCAPABILITIES_SADDR_SHIFT (10U) +/*! SADDR - Static Address + * 0b00..No static address + * 0b01..Static address is fixed in hardware + * 0b10..Hardware controls the static address dynamically (for example, from the pin strap) + * 0b11..SCONFIG register supplies the static address + */ +#define I3C_SCAPABILITIES_SADDR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_SADDR_SHIFT)) & I3C_SCAPABILITIES_SADDR_MASK) + +#define I3C_SCAPABILITIES_CCCHANDLE_MASK (0xF000U) +#define I3C_SCAPABILITIES_CCCHANDLE_SHIFT (12U) +/*! CCCHANDLE - Common Command Codes Handling + * 0b0000..All handling features disabled + * 0bxxx1..The I3C module manages events, activities, status, HDR, and if enabled for it, ID and static-address-related items + * 0bxx1x..The I3C module manages maximum read and write lengths, and max data speed + * 0bx1xx..GETSTATUS CCC returns the values of SCTRL[PENDINT] and SCTRL[ACTSTATE] + * 0b1xxx..GETSTATUS CCC returns the value of SCTRL[VENDINFO] + */ +#define I3C_SCAPABILITIES_CCCHANDLE(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_CCCHANDLE_SHIFT)) & I3C_SCAPABILITIES_CCCHANDLE_MASK) + +#define I3C_SCAPABILITIES_IBI_MR_HJ_MASK (0x1F0000U) +#define I3C_SCAPABILITIES_IBI_MR_HJ_SHIFT (16U) +/*! IBI_MR_HJ - In-Band Interrupts, Controller Requests, Hot-Join Events + * 0b00000..Application cannot generate IBI, CR, or HJ + * 0bxxxx1..Application can generate an IBI + * 0bxxx1x..When bit 0 = 1, the IBI has data from the SCTRL register + * 0bxx1xx..Application can generate a controller request for a secondary controller + * 0bx1xxx..Application can generate a Hot-Join event + * 0b1xxxx..Application can use SCONFIG[BAMATCH] for bus-available timing + */ +#define I3C_SCAPABILITIES_IBI_MR_HJ(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_IBI_MR_HJ_SHIFT)) & I3C_SCAPABILITIES_IBI_MR_HJ_MASK) + +#define I3C_SCAPABILITIES_TIMECTRL_MASK (0x200000U) +#define I3C_SCAPABILITIES_TIMECTRL_SHIFT (21U) +/*! TIMECTRL - Time Control + * 0b0..No time control supported + * 0b1..At least one time-control type supported + */ +#define I3C_SCAPABILITIES_TIMECTRL(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_TIMECTRL_SHIFT)) & I3C_SCAPABILITIES_TIMECTRL_MASK) + +#define I3C_SCAPABILITIES_EXTFIFO_MASK (0x3800000U) +#define I3C_SCAPABILITIES_EXTFIFO_SHIFT (23U) +/*! EXTFIFO - External FIFO + * 0b000..No external FIFO available + * 0b001..Standard available or free external FIFO + * 0b010..Request track external FIFO + * *.. + */ +#define I3C_SCAPABILITIES_EXTFIFO(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_EXTFIFO_SHIFT)) & I3C_SCAPABILITIES_EXTFIFO_MASK) + +#define I3C_SCAPABILITIES_FIFOTX_MASK (0xC000000U) +#define I3C_SCAPABILITIES_FIFOTX_SHIFT (26U) +/*! FIFOTX - FIFO Transmit + * 0b00..Two + * 0b01..Four + * 0b10..Eight + * 0b11..16 or larger + */ +#define I3C_SCAPABILITIES_FIFOTX(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_FIFOTX_SHIFT)) & I3C_SCAPABILITIES_FIFOTX_MASK) + +#define I3C_SCAPABILITIES_FIFORX_MASK (0x30000000U) +#define I3C_SCAPABILITIES_FIFORX_SHIFT (28U) +/*! FIFORX - FIFO Receive + * 0b00..Two or three + * 0b01..Four + * 0b10..Eight + * 0b11..16 or larger + */ +#define I3C_SCAPABILITIES_FIFORX(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_FIFORX_SHIFT)) & I3C_SCAPABILITIES_FIFORX_MASK) + +#define I3C_SCAPABILITIES_INT_MASK (0x40000000U) +#define I3C_SCAPABILITIES_INT_SHIFT (30U) +/*! INT - Interrupts + * 0b1..Supported + * 0b0..Not supported + */ +#define I3C_SCAPABILITIES_INT(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_INT_SHIFT)) & I3C_SCAPABILITIES_INT_MASK) + +#define I3C_SCAPABILITIES_DMA_MASK (0x80000000U) +#define I3C_SCAPABILITIES_DMA_SHIFT (31U) +/*! DMA - Direct Memory Access + * 0b1..Supported + * 0b0..Not supported + */ +#define I3C_SCAPABILITIES_DMA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SCAPABILITIES_DMA_SHIFT)) & I3C_SCAPABILITIES_DMA_MASK) +/*! @} */ + +/*! @name SDYNADDR - Target Dynamic Address */ +/*! @{ */ + +#define I3C_SDYNADDR_DAVALID_MASK (0x1U) +#define I3C_SDYNADDR_DAVALID_SHIFT (0U) +/*! DAVALID - Dynamic Address Valid + * 0b0..DANOTASSIGNED: a dynamic address is not assigned + * 0b1..DAASSIGNED: a dynamic address is assigned + */ +#define I3C_SDYNADDR_DAVALID(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDYNADDR_DAVALID_SHIFT)) & I3C_SDYNADDR_DAVALID_MASK) + +#define I3C_SDYNADDR_DADDR_MASK (0xFEU) +#define I3C_SDYNADDR_DADDR_SHIFT (1U) +/*! DADDR - Dynamic Address */ +#define I3C_SDYNADDR_DADDR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDYNADDR_DADDR_SHIFT)) & I3C_SDYNADDR_DADDR_MASK) + +#define I3C_SDYNADDR_MAPSA_MASK (0x1000U) +#define I3C_SDYNADDR_MAPSA_SHIFT (12U) +/*! MAPSA - Map a Static Address */ +#define I3C_SDYNADDR_MAPSA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDYNADDR_MAPSA_SHIFT)) & I3C_SDYNADDR_MAPSA_MASK) + +#define I3C_SDYNADDR_SA10B_MASK (0xE000U) +#define I3C_SDYNADDR_SA10B_SHIFT (13U) +/*! SA10B - 10-Bit Static Address */ +#define I3C_SDYNADDR_SA10B(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDYNADDR_SA10B_SHIFT)) & I3C_SDYNADDR_SA10B_MASK) + +#define I3C_SDYNADDR_KEY_MASK (0xFFFF0000U) +#define I3C_SDYNADDR_KEY_SHIFT (16U) +/*! KEY - Key */ +#define I3C_SDYNADDR_KEY(x) (((uint32_t)(((uint32_t)(x)) << I3C_SDYNADDR_KEY_SHIFT)) & I3C_SDYNADDR_KEY_MASK) +/*! @} */ + +/*! @name SMAXLIMITS - Target Maximum Limits */ +/*! @{ */ + +#define I3C_SMAXLIMITS_MAXRD_MASK (0xFFFU) +#define I3C_SMAXLIMITS_MAXRD_SHIFT (0U) +/*! MAXRD - Maximum Read Length */ +#define I3C_SMAXLIMITS_MAXRD(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMAXLIMITS_MAXRD_SHIFT)) & I3C_SMAXLIMITS_MAXRD_MASK) + +#define I3C_SMAXLIMITS_MAXWR_MASK (0xFFF0000U) +#define I3C_SMAXLIMITS_MAXWR_SHIFT (16U) +/*! MAXWR - Maximum Write Length */ +#define I3C_SMAXLIMITS_MAXWR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMAXLIMITS_MAXWR_SHIFT)) & I3C_SMAXLIMITS_MAXWR_MASK) +/*! @} */ + +/*! @name SIDPARTNO - Target ID Part Number */ +/*! @{ */ + +#define I3C_SIDPARTNO_PARTNO_MASK (0xFFFFFFFFU) +#define I3C_SIDPARTNO_PARTNO_SHIFT (0U) +/*! PARTNO - Part Number */ +#define I3C_SIDPARTNO_PARTNO(x) (((uint32_t)(((uint32_t)(x)) << I3C_SIDPARTNO_PARTNO_SHIFT)) & I3C_SIDPARTNO_PARTNO_MASK) +/*! @} */ + +/*! @name SIDEXT - Target ID Extension */ +/*! @{ */ + +#define I3C_SIDEXT_DCR_MASK (0xFF00U) +#define I3C_SIDEXT_DCR_SHIFT (8U) +/*! DCR - Device Characteristic Register */ +#define I3C_SIDEXT_DCR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SIDEXT_DCR_SHIFT)) & I3C_SIDEXT_DCR_MASK) + +#define I3C_SIDEXT_BCR_MASK (0xFF0000U) +#define I3C_SIDEXT_BCR_SHIFT (16U) +/*! BCR - Bus Characteristics Register */ +#define I3C_SIDEXT_BCR(x) (((uint32_t)(((uint32_t)(x)) << I3C_SIDEXT_BCR_SHIFT)) & I3C_SIDEXT_BCR_MASK) +/*! @} */ + +/*! @name SVENDORID - Target Vendor ID */ +/*! @{ */ + +#define I3C_SVENDORID_VID_MASK (0x7FFFU) +#define I3C_SVENDORID_VID_SHIFT (0U) +/*! VID - Vendor ID */ +#define I3C_SVENDORID_VID(x) (((uint32_t)(((uint32_t)(x)) << I3C_SVENDORID_VID_SHIFT)) & I3C_SVENDORID_VID_MASK) +/*! @} */ + +/*! @name STCCLOCK - Target Time Control Clock */ +/*! @{ */ + +#define I3C_STCCLOCK_ACCURACY_MASK (0xFFU) +#define I3C_STCCLOCK_ACCURACY_SHIFT (0U) +/*! ACCURACY - Clock Accuracy */ +#define I3C_STCCLOCK_ACCURACY(x) (((uint32_t)(((uint32_t)(x)) << I3C_STCCLOCK_ACCURACY_SHIFT)) & I3C_STCCLOCK_ACCURACY_MASK) + +#define I3C_STCCLOCK_FREQ_MASK (0xFF00U) +#define I3C_STCCLOCK_FREQ_SHIFT (8U) +/*! FREQ - Clock Frequency */ +#define I3C_STCCLOCK_FREQ(x) (((uint32_t)(((uint32_t)(x)) << I3C_STCCLOCK_FREQ_SHIFT)) & I3C_STCCLOCK_FREQ_MASK) +/*! @} */ + +/*! @name SMSGMAPADDR - Target Message Map Address */ +/*! @{ */ + +#define I3C_SMSGMAPADDR_MAPLAST_MASK (0xFU) +#define I3C_SMSGMAPADDR_MAPLAST_SHIFT (0U) +/*! MAPLAST - Matched Address Index */ +#define I3C_SMSGMAPADDR_MAPLAST(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMSGMAPADDR_MAPLAST_SHIFT)) & I3C_SMSGMAPADDR_MAPLAST_MASK) + +#define I3C_SMSGMAPADDR_LASTSTATIC_MASK (0x10U) +#define I3C_SMSGMAPADDR_LASTSTATIC_SHIFT (4U) +/*! LASTSTATIC - Last Static Address Matched + * 0b1..I2C static address + * 0b0..I3C dynamic address + */ +#define I3C_SMSGMAPADDR_LASTSTATIC(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMSGMAPADDR_LASTSTATIC_SHIFT)) & I3C_SMSGMAPADDR_LASTSTATIC_MASK) + +#define I3C_SMSGMAPADDR_MAPLASTM1_MASK (0xF00U) +#define I3C_SMSGMAPADDR_MAPLASTM1_SHIFT (8U) +/*! MAPLASTM1 - Matched Previous Address Index 1 */ +#define I3C_SMSGMAPADDR_MAPLASTM1(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMSGMAPADDR_MAPLASTM1_SHIFT)) & I3C_SMSGMAPADDR_MAPLASTM1_MASK) + +#define I3C_SMSGMAPADDR_MAPLASTM2_MASK (0xF0000U) +#define I3C_SMSGMAPADDR_MAPLASTM2_SHIFT (16U) +/*! MAPLASTM2 - Matched Previous Index 2 */ +#define I3C_SMSGMAPADDR_MAPLASTM2(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMSGMAPADDR_MAPLASTM2_SHIFT)) & I3C_SMSGMAPADDR_MAPLASTM2_MASK) +/*! @} */ + +/*! @name MCONFIG_EXT - Controller Extended Configuration */ +/*! @{ */ + +#define I3C_MCONFIG_EXT_I3C_CAS_DEL_MASK (0x30000U) +#define I3C_MCONFIG_EXT_I3C_CAS_DEL_SHIFT (16U) +/*! I3C_CAS_DEL - I3C CAS Delay After START + * 0b00..No delay + * 0b01..Increases SCL clock period by 1/2 + * 0b10..Increases SCL clock period by 1 + * 0b11..Increases SCL clock period by 3/2 + */ +#define I3C_MCONFIG_EXT_I3C_CAS_DEL(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_EXT_I3C_CAS_DEL_SHIFT)) & I3C_MCONFIG_EXT_I3C_CAS_DEL_MASK) + +#define I3C_MCONFIG_EXT_I3C_CASR_DEL_MASK (0xC0000U) +#define I3C_MCONFIG_EXT_I3C_CASR_DEL_SHIFT (18U) +/*! I3C_CASR_DEL - I3C CAS Delay After Repeated START + * 0b00..No delay + * 0b01..Increases SCL clock period by 1/2 + * 0b10..Increases SCL clock period by 1 + * 0b11..Increases SCL clock period by 1 1/2 + */ +#define I3C_MCONFIG_EXT_I3C_CASR_DEL(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCONFIG_EXT_I3C_CASR_DEL_SHIFT)) & I3C_MCONFIG_EXT_I3C_CASR_DEL_MASK) +/*! @} */ + +/*! @name MCTRL - Controller Control */ +/*! @{ */ + +#define I3C_MCTRL_REQUEST_MASK (0x7U) +#define I3C_MCTRL_REQUEST_SHIFT (0U) +/*! REQUEST - Request + * 0b000..NONE + * 0b001..EMITSTARTADDR + * 0b010..EMITSTOP + * 0b011..IBIACKNACK + * 0b100..PROCESSDAA + * 0b101.. + * 0b110..Force Exit and Target Reset + * 0b111..AUTOIBI + */ +#define I3C_MCTRL_REQUEST(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCTRL_REQUEST_SHIFT)) & I3C_MCTRL_REQUEST_MASK) + +#define I3C_MCTRL_TYPE_MASK (0x30U) +#define I3C_MCTRL_TYPE_SHIFT (4U) +/*! TYPE - Bus Type with EmitStartAddr + * 0b00..I3C + * 0b01..I2C + * 0b10..DDR + * 0b11.. + */ +#define I3C_MCTRL_TYPE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCTRL_TYPE_SHIFT)) & I3C_MCTRL_TYPE_MASK) + +#define I3C_MCTRL_IBIRESP_MASK (0xC0U) +#define I3C_MCTRL_IBIRESP_SHIFT (6U) +/*! IBIRESP - In-Band Interrupt Response + * 0b00..ACK (acknowledge) + * 0b01..NACK (reject) + * 0b10..Acknowledge with mandatory byte + * 0b11..Manual + */ +#define I3C_MCTRL_IBIRESP(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCTRL_IBIRESP_SHIFT)) & I3C_MCTRL_IBIRESP_MASK) + +#define I3C_MCTRL_DIR_MASK (0x100U) +#define I3C_MCTRL_DIR_SHIFT (8U) +/*! DIR - Direction + * 0b0..Write + * 0b1..Read + */ +#define I3C_MCTRL_DIR(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCTRL_DIR_SHIFT)) & I3C_MCTRL_DIR_MASK) + +#define I3C_MCTRL_ADDR_MASK (0xFE00U) +#define I3C_MCTRL_ADDR_SHIFT (9U) +/*! ADDR - Address */ +#define I3C_MCTRL_ADDR(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCTRL_ADDR_SHIFT)) & I3C_MCTRL_ADDR_MASK) + +#define I3C_MCTRL_RDTERM_MASK (0xFF0000U) +#define I3C_MCTRL_RDTERM_SHIFT (16U) +/*! RDTERM - Read Terminate Counter */ +#define I3C_MCTRL_RDTERM(x) (((uint32_t)(((uint32_t)(x)) << I3C_MCTRL_RDTERM_SHIFT)) & I3C_MCTRL_RDTERM_MASK) +/*! @} */ + +/*! @name MSTATUS - Controller Status */ +/*! @{ */ + +#define I3C_MSTATUS_STATE_MASK (0x7U) +#define I3C_MSTATUS_STATE_SHIFT (0U) +/*! STATE - State of the Controller + * 0b000..IDLE (bus has stopped) + * 0b001..SLVREQ (target request) + * 0b010..MSGSDR + * 0b011..NORMACT + * 0b100..MSGDDR + * 0b101..DAA + * 0b110..IBIACK + * 0b111..IBIRCV + */ +#define I3C_MSTATUS_STATE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_STATE_SHIFT)) & I3C_MSTATUS_STATE_MASK) + +#define I3C_MSTATUS_BETWEEN_MASK (0x10U) +#define I3C_MSTATUS_BETWEEN_SHIFT (4U) +/*! BETWEEN - Between + * 0b0..Inactive (for other cases) + * 0b1..Active + */ +#define I3C_MSTATUS_BETWEEN(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_BETWEEN_SHIFT)) & I3C_MSTATUS_BETWEEN_MASK) + +#define I3C_MSTATUS_NACKED_MASK (0x20U) +#define I3C_MSTATUS_NACKED_SHIFT (5U) +/*! NACKED - Not Acknowledged + * 0b1..NACKed (not acknowledged) + * 0b0..Not NACKed + */ +#define I3C_MSTATUS_NACKED(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_NACKED_SHIFT)) & I3C_MSTATUS_NACKED_MASK) + +#define I3C_MSTATUS_IBITYPE_MASK (0xC0U) +#define I3C_MSTATUS_IBITYPE_SHIFT (6U) +/*! IBITYPE - In-Band Interrupt (IBI) Type + * 0b00..NONE (no IBI: this status occurs when MSTATUS[IBIWON] becomes 0) + * 0b01..IBI + * 0b10..CR + * 0b11..HJ + */ +#define I3C_MSTATUS_IBITYPE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_IBITYPE_SHIFT)) & I3C_MSTATUS_IBITYPE_MASK) + +#define I3C_MSTATUS_SLVSTART_MASK (0x100U) +#define I3C_MSTATUS_SLVSTART_SHIFT (8U) +/*! SLVSTART - Target Start + * 0b1..Target requesting START + * 0b0..Target not requesting START + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MSTATUS_SLVSTART(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_SLVSTART_SHIFT)) & I3C_MSTATUS_SLVSTART_MASK) + +#define I3C_MSTATUS_MCTRLDONE_MASK (0x200U) +#define I3C_MSTATUS_MCTRLDONE_SHIFT (9U) +/*! MCTRLDONE - Controller Control Done + * 0b1..Done + * 0b0..Not done + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MSTATUS_MCTRLDONE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_MCTRLDONE_SHIFT)) & I3C_MSTATUS_MCTRLDONE_MASK) + +#define I3C_MSTATUS_COMPLETE_MASK (0x400U) +#define I3C_MSTATUS_COMPLETE_SHIFT (10U) +/*! COMPLETE - Complete + * 0b1..Complete + * 0b0..Not complete + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MSTATUS_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_COMPLETE_SHIFT)) & I3C_MSTATUS_COMPLETE_MASK) + +#define I3C_MSTATUS_RXPEND_MASK (0x800U) +#define I3C_MSTATUS_RXPEND_SHIFT (11U) +/*! RXPEND - RXPEND + * 0b1..Receive message pending + * 0b0..No receive message pending + */ +#define I3C_MSTATUS_RXPEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_RXPEND_SHIFT)) & I3C_MSTATUS_RXPEND_MASK) + +#define I3C_MSTATUS_TXNOTFULL_MASK (0x1000U) +#define I3C_MSTATUS_TXNOTFULL_SHIFT (12U) +/*! TXNOTFULL - TX Buffer or FIFO Not Full + * 0b1..Receive buffer or FIFO not full + * 0b0..Receive buffer or FIFO full + */ +#define I3C_MSTATUS_TXNOTFULL(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_TXNOTFULL_SHIFT)) & I3C_MSTATUS_TXNOTFULL_MASK) + +#define I3C_MSTATUS_IBIWON_MASK (0x2000U) +#define I3C_MSTATUS_IBIWON_SHIFT (13U) +/*! IBIWON - In-Band Interrupt (IBI) Won + * 0b1..IBI arbitration won + * 0b0..No IBI arbitration won + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MSTATUS_IBIWON(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_IBIWON_SHIFT)) & I3C_MSTATUS_IBIWON_MASK) + +#define I3C_MSTATUS_ERRWARN_MASK (0x8000U) +#define I3C_MSTATUS_ERRWARN_SHIFT (15U) +/*! ERRWARN - Error or Warning + * 0b1..Error or warning + * 0b0..No error or warning + */ +#define I3C_MSTATUS_ERRWARN(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_ERRWARN_SHIFT)) & I3C_MSTATUS_ERRWARN_MASK) + +#define I3C_MSTATUS_NOWMASTER_MASK (0x80000U) +#define I3C_MSTATUS_NOWMASTER_SHIFT (19U) +/*! NOWMASTER - Module is now Controller + * 0b1..Controller + * 0b0..Not a controller + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MSTATUS_NOWMASTER(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_NOWMASTER_SHIFT)) & I3C_MSTATUS_NOWMASTER_MASK) + +#define I3C_MSTATUS_IBIADDR_MASK (0x7F000000U) +#define I3C_MSTATUS_IBIADDR_SHIFT (24U) +/*! IBIADDR - IBI Address */ +#define I3C_MSTATUS_IBIADDR(x) (((uint32_t)(((uint32_t)(x)) << I3C_MSTATUS_IBIADDR_SHIFT)) & I3C_MSTATUS_IBIADDR_MASK) +/*! @} */ + +/*! @name MIBIRULES - Controller In-band Interrupt Registry and Rules */ +/*! @{ */ + +#define I3C_MIBIRULES_ADDR0_MASK (0x3FU) +#define I3C_MIBIRULES_ADDR0_SHIFT (0U) +/*! ADDR0 - ADDR0 */ +#define I3C_MIBIRULES_ADDR0(x) (((uint32_t)(((uint32_t)(x)) << I3C_MIBIRULES_ADDR0_SHIFT)) & I3C_MIBIRULES_ADDR0_MASK) + +#define I3C_MIBIRULES_ADDR1_MASK (0xFC0U) +#define I3C_MIBIRULES_ADDR1_SHIFT (6U) +/*! ADDR1 - ADDR1 */ +#define I3C_MIBIRULES_ADDR1(x) (((uint32_t)(((uint32_t)(x)) << I3C_MIBIRULES_ADDR1_SHIFT)) & I3C_MIBIRULES_ADDR1_MASK) + +#define I3C_MIBIRULES_ADDR2_MASK (0x3F000U) +#define I3C_MIBIRULES_ADDR2_SHIFT (12U) +/*! ADDR2 - ADDR2 */ +#define I3C_MIBIRULES_ADDR2(x) (((uint32_t)(((uint32_t)(x)) << I3C_MIBIRULES_ADDR2_SHIFT)) & I3C_MIBIRULES_ADDR2_MASK) + +#define I3C_MIBIRULES_ADDR3_MASK (0xFC0000U) +#define I3C_MIBIRULES_ADDR3_SHIFT (18U) +/*! ADDR3 - ADDR3 */ +#define I3C_MIBIRULES_ADDR3(x) (((uint32_t)(((uint32_t)(x)) << I3C_MIBIRULES_ADDR3_SHIFT)) & I3C_MIBIRULES_ADDR3_MASK) + +#define I3C_MIBIRULES_ADDR4_MASK (0x3F000000U) +#define I3C_MIBIRULES_ADDR4_SHIFT (24U) +/*! ADDR4 - ADDR4 */ +#define I3C_MIBIRULES_ADDR4(x) (((uint32_t)(((uint32_t)(x)) << I3C_MIBIRULES_ADDR4_SHIFT)) & I3C_MIBIRULES_ADDR4_MASK) + +#define I3C_MIBIRULES_MSB0_MASK (0x40000000U) +#define I3C_MIBIRULES_MSB0_SHIFT (30U) +/*! MSB0 - Most Significant Address Bit is 0 + * 0b1..MSB is 0 + * 0b0..MSB is not 0 + */ +#define I3C_MIBIRULES_MSB0(x) (((uint32_t)(((uint32_t)(x)) << I3C_MIBIRULES_MSB0_SHIFT)) & I3C_MIBIRULES_MSB0_MASK) + +#define I3C_MIBIRULES_NOBYTE_MASK (0x80000000U) +#define I3C_MIBIRULES_NOBYTE_SHIFT (31U) +/*! NOBYTE - No IBI byte + * 0b1..Without mandatory IBI byte + * 0b0..With mandatory IBI byte + */ +#define I3C_MIBIRULES_NOBYTE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MIBIRULES_NOBYTE_SHIFT)) & I3C_MIBIRULES_NOBYTE_MASK) +/*! @} */ + +/*! @name MINTSET - Controller Interrupt Set */ +/*! @{ */ + +#define I3C_MINTSET_SLVSTART_MASK (0x100U) +#define I3C_MINTSET_SLVSTART_SHIFT (8U) +/*! SLVSTART - Target Start Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MINTSET_SLVSTART(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTSET_SLVSTART_SHIFT)) & I3C_MINTSET_SLVSTART_MASK) + +#define I3C_MINTSET_MCTRLDONE_MASK (0x200U) +#define I3C_MINTSET_MCTRLDONE_SHIFT (9U) +/*! MCTRLDONE - Controller Control Done Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MINTSET_MCTRLDONE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTSET_MCTRLDONE_SHIFT)) & I3C_MINTSET_MCTRLDONE_MASK) + +#define I3C_MINTSET_COMPLETE_MASK (0x400U) +#define I3C_MINTSET_COMPLETE_SHIFT (10U) +/*! COMPLETE - Completed Message Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MINTSET_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTSET_COMPLETE_SHIFT)) & I3C_MINTSET_COMPLETE_MASK) + +#define I3C_MINTSET_RXPEND_MASK (0x800U) +#define I3C_MINTSET_RXPEND_SHIFT (11U) +/*! RXPEND - Receive Pending Interrupt Enable */ +#define I3C_MINTSET_RXPEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTSET_RXPEND_SHIFT)) & I3C_MINTSET_RXPEND_MASK) + +#define I3C_MINTSET_TXNOTFULL_MASK (0x1000U) +#define I3C_MINTSET_TXNOTFULL_SHIFT (12U) +/*! TXNOTFULL - Transmit Buffer/FIFO Not Full Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MINTSET_TXNOTFULL(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTSET_TXNOTFULL_SHIFT)) & I3C_MINTSET_TXNOTFULL_MASK) + +#define I3C_MINTSET_IBIWON_MASK (0x2000U) +#define I3C_MINTSET_IBIWON_SHIFT (13U) +/*! IBIWON - IBI Won Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MINTSET_IBIWON(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTSET_IBIWON_SHIFT)) & I3C_MINTSET_IBIWON_MASK) + +#define I3C_MINTSET_ERRWARN_MASK (0x8000U) +#define I3C_MINTSET_ERRWARN_SHIFT (15U) +/*! ERRWARN - Error or Warning (ERRWARN) Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MINTSET_ERRWARN(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTSET_ERRWARN_SHIFT)) & I3C_MINTSET_ERRWARN_MASK) + +#define I3C_MINTSET_NOWMASTER_MASK (0x80000U) +#define I3C_MINTSET_NOWMASTER_SHIFT (19U) +/*! NOWMASTER - Now Controller Interrupt Enable + * 0b1..Enable + * 0b0..Disable + */ +#define I3C_MINTSET_NOWMASTER(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTSET_NOWMASTER_SHIFT)) & I3C_MINTSET_NOWMASTER_MASK) +/*! @} */ + +/*! @name MINTCLR - Controller Interrupt Clear */ +/*! @{ */ + +#define I3C_MINTCLR_SLVSTART_MASK (0x100U) +#define I3C_MINTCLR_SLVSTART_SHIFT (8U) +/*! SLVSTART - SLVSTART Interrupt Enable Clear + * 0b1..Interrupt enable cleared + * 0b0..No effect + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MINTCLR_SLVSTART(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTCLR_SLVSTART_SHIFT)) & I3C_MINTCLR_SLVSTART_MASK) + +#define I3C_MINTCLR_MCTRLDONE_MASK (0x200U) +#define I3C_MINTCLR_MCTRLDONE_SHIFT (9U) +/*! MCTRLDONE - MCTRLDONE Interrupt Enable Clear + * 0b1..Interrupt enable cleared + * 0b0..No effect + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MINTCLR_MCTRLDONE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTCLR_MCTRLDONE_SHIFT)) & I3C_MINTCLR_MCTRLDONE_MASK) + +#define I3C_MINTCLR_COMPLETE_MASK (0x400U) +#define I3C_MINTCLR_COMPLETE_SHIFT (10U) +/*! COMPLETE - COMPLETE Interrupt Enable Clear + * 0b1..Interrupt enable cleared + * 0b0..No effect + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MINTCLR_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTCLR_COMPLETE_SHIFT)) & I3C_MINTCLR_COMPLETE_MASK) + +#define I3C_MINTCLR_RXPEND_MASK (0x800U) +#define I3C_MINTCLR_RXPEND_SHIFT (11U) +/*! RXPEND - RXPEND Interrupt Enable Clear + * 0b1..Interrupt enable cleared + * 0b0..No effect + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MINTCLR_RXPEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTCLR_RXPEND_SHIFT)) & I3C_MINTCLR_RXPEND_MASK) + +#define I3C_MINTCLR_TXNOTFULL_MASK (0x1000U) +#define I3C_MINTCLR_TXNOTFULL_SHIFT (12U) +/*! TXNOTFULL - TXNOTFULL Interrupt Enable Clear + * 0b1..Interrupt enable cleared + * 0b0..No effect + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MINTCLR_TXNOTFULL(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTCLR_TXNOTFULL_SHIFT)) & I3C_MINTCLR_TXNOTFULL_MASK) + +#define I3C_MINTCLR_IBIWON_MASK (0x2000U) +#define I3C_MINTCLR_IBIWON_SHIFT (13U) +/*! IBIWON - IBIWON Interrupt Enable Clear + * 0b1..Interrupt enable cleared + * 0b0..No effect + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MINTCLR_IBIWON(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTCLR_IBIWON_SHIFT)) & I3C_MINTCLR_IBIWON_MASK) + +#define I3C_MINTCLR_ERRWARN_MASK (0x8000U) +#define I3C_MINTCLR_ERRWARN_SHIFT (15U) +/*! ERRWARN - ERRWARN Interrupt Enable Clear + * 0b1..Interrupt enable cleared + * 0b0..No effect + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MINTCLR_ERRWARN(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTCLR_ERRWARN_SHIFT)) & I3C_MINTCLR_ERRWARN_MASK) + +#define I3C_MINTCLR_NOWMASTER_MASK (0x80000U) +#define I3C_MINTCLR_NOWMASTER_SHIFT (19U) +/*! NOWMASTER - NOWCONTROLLER Interrupt Enable Clear + * 0b1..Interrupt enable cleared + * 0b0..No effect + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MINTCLR_NOWMASTER(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTCLR_NOWMASTER_SHIFT)) & I3C_MINTCLR_NOWMASTER_MASK) +/*! @} */ + +/*! @name MINTMASKED - Controller Interrupt Mask */ +/*! @{ */ + +#define I3C_MINTMASKED_SLVSTART_MASK (0x100U) +#define I3C_MINTMASKED_SLVSTART_SHIFT (8U) +/*! SLVSTART - SLVSTART Interrupt Mask + * 0b1..Enabled + * 0b0..Disabled + */ +#define I3C_MINTMASKED_SLVSTART(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTMASKED_SLVSTART_SHIFT)) & I3C_MINTMASKED_SLVSTART_MASK) + +#define I3C_MINTMASKED_MCTRLDONE_MASK (0x200U) +#define I3C_MINTMASKED_MCTRLDONE_SHIFT (9U) +/*! MCTRLDONE - MCTRLDONE Interrupt Mask + * 0b1..Enabled + * 0b0..Disabled + */ +#define I3C_MINTMASKED_MCTRLDONE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTMASKED_MCTRLDONE_SHIFT)) & I3C_MINTMASKED_MCTRLDONE_MASK) + +#define I3C_MINTMASKED_COMPLETE_MASK (0x400U) +#define I3C_MINTMASKED_COMPLETE_SHIFT (10U) +/*! COMPLETE - COMPLETE Interrupt Mask + * 0b1..Enabled + * 0b0..Disabled + */ +#define I3C_MINTMASKED_COMPLETE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTMASKED_COMPLETE_SHIFT)) & I3C_MINTMASKED_COMPLETE_MASK) + +#define I3C_MINTMASKED_RXPEND_MASK (0x800U) +#define I3C_MINTMASKED_RXPEND_SHIFT (11U) +/*! RXPEND - RXPEND Interrupt Mask */ +#define I3C_MINTMASKED_RXPEND(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTMASKED_RXPEND_SHIFT)) & I3C_MINTMASKED_RXPEND_MASK) + +#define I3C_MINTMASKED_TXNOTFULL_MASK (0x1000U) +#define I3C_MINTMASKED_TXNOTFULL_SHIFT (12U) +/*! TXNOTFULL - TXNOTFULL Interrupt Mask + * 0b1..Enabled + * 0b0..Disabled + */ +#define I3C_MINTMASKED_TXNOTFULL(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTMASKED_TXNOTFULL_SHIFT)) & I3C_MINTMASKED_TXNOTFULL_MASK) + +#define I3C_MINTMASKED_IBIWON_MASK (0x2000U) +#define I3C_MINTMASKED_IBIWON_SHIFT (13U) +/*! IBIWON - IBIWON Interrupt Mask + * 0b1..Enabled + * 0b0..Disabled + */ +#define I3C_MINTMASKED_IBIWON(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTMASKED_IBIWON_SHIFT)) & I3C_MINTMASKED_IBIWON_MASK) + +#define I3C_MINTMASKED_ERRWARN_MASK (0x8000U) +#define I3C_MINTMASKED_ERRWARN_SHIFT (15U) +/*! ERRWARN - ERRWARN Interrupt Mask + * 0b1..Enabled + * 0b0..Disabled + */ +#define I3C_MINTMASKED_ERRWARN(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTMASKED_ERRWARN_SHIFT)) & I3C_MINTMASKED_ERRWARN_MASK) + +#define I3C_MINTMASKED_NOWMASTER_MASK (0x80000U) +#define I3C_MINTMASKED_NOWMASTER_SHIFT (19U) +/*! NOWMASTER - NOWCONTROLLER Interrupt Mask + * 0b1..Enabled + * 0b0..Disabled + */ +#define I3C_MINTMASKED_NOWMASTER(x) (((uint32_t)(((uint32_t)(x)) << I3C_MINTMASKED_NOWMASTER_SHIFT)) & I3C_MINTMASKED_NOWMASTER_MASK) +/*! @} */ + +/*! @name MERRWARN - Controller Errors and Warnings */ +/*! @{ */ + +#define I3C_MERRWARN_URUN_MASK (0x2U) +#define I3C_MERRWARN_URUN_SHIFT (1U) +/*! URUN - Underrun Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_URUN(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_URUN_SHIFT)) & I3C_MERRWARN_URUN_MASK) + +#define I3C_MERRWARN_NACK_MASK (0x4U) +#define I3C_MERRWARN_NACK_SHIFT (2U) +/*! NACK - Not Acknowledge Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_NACK(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_NACK_SHIFT)) & I3C_MERRWARN_NACK_MASK) + +#define I3C_MERRWARN_WRABT_MASK (0x8U) +#define I3C_MERRWARN_WRABT_SHIFT (3U) +/*! WRABT - Write Abort Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_WRABT(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_WRABT_SHIFT)) & I3C_MERRWARN_WRABT_MASK) + +#define I3C_MERRWARN_TERM_MASK (0x10U) +#define I3C_MERRWARN_TERM_SHIFT (4U) +/*! TERM - Terminate Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_TERM(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_TERM_SHIFT)) & I3C_MERRWARN_TERM_MASK) + +#define I3C_MERRWARN_HPAR_MASK (0x200U) +#define I3C_MERRWARN_HPAR_SHIFT (9U) +/*! HPAR - High Data Rate Parity + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_HPAR(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_HPAR_SHIFT)) & I3C_MERRWARN_HPAR_MASK) + +#define I3C_MERRWARN_HCRC_MASK (0x400U) +#define I3C_MERRWARN_HCRC_SHIFT (10U) +/*! HCRC - High Data Rate CRC Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_HCRC(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_HCRC_SHIFT)) & I3C_MERRWARN_HCRC_MASK) + +#define I3C_MERRWARN_OREAD_MASK (0x10000U) +#define I3C_MERRWARN_OREAD_SHIFT (16U) +/*! OREAD - Overread Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_OREAD(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_OREAD_SHIFT)) & I3C_MERRWARN_OREAD_MASK) + +#define I3C_MERRWARN_OWRITE_MASK (0x20000U) +#define I3C_MERRWARN_OWRITE_SHIFT (17U) +/*! OWRITE - Overwrite Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_OWRITE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_OWRITE_SHIFT)) & I3C_MERRWARN_OWRITE_MASK) + +#define I3C_MERRWARN_MSGERR_MASK (0x40000U) +#define I3C_MERRWARN_MSGERR_SHIFT (18U) +/*! MSGERR - Message Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_MSGERR(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_MSGERR_SHIFT)) & I3C_MERRWARN_MSGERR_MASK) + +#define I3C_MERRWARN_INVREQ_MASK (0x80000U) +#define I3C_MERRWARN_INVREQ_SHIFT (19U) +/*! INVREQ - Invalid Request Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_INVREQ(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_INVREQ_SHIFT)) & I3C_MERRWARN_INVREQ_MASK) + +#define I3C_MERRWARN_TIMEOUT_MASK (0x100000U) +#define I3C_MERRWARN_TIMEOUT_SHIFT (20U) +/*! TIMEOUT - Timeout Error + * 0b1..Error + * 0b0..No error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define I3C_MERRWARN_TIMEOUT(x) (((uint32_t)(((uint32_t)(x)) << I3C_MERRWARN_TIMEOUT_SHIFT)) & I3C_MERRWARN_TIMEOUT_MASK) +/*! @} */ + +/*! @name MDMACTRL - Controller DMA Control */ +/*! @{ */ + +#define I3C_MDMACTRL_DMAFB_MASK (0x3U) +#define I3C_MDMACTRL_DMAFB_SHIFT (0U) +/*! DMAFB - DMA from Bus + * 0b00..DMA not used + * 0b01..Enable DMA for one frame + * 0b10..Enable DMA until DMA is turned off + * 0b11.. + */ +#define I3C_MDMACTRL_DMAFB(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDMACTRL_DMAFB_SHIFT)) & I3C_MDMACTRL_DMAFB_MASK) + +#define I3C_MDMACTRL_DMATB_MASK (0xCU) +#define I3C_MDMACTRL_DMATB_SHIFT (2U) +/*! DMATB - DMA to Bus + * 0b00..DMA not used + * 0b01..Enable DMA for one frame (ended by DMA or terminated) + * 0b10..Enable DMA until DMA is turned off + * 0b11.. + */ +#define I3C_MDMACTRL_DMATB(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDMACTRL_DMATB_SHIFT)) & I3C_MDMACTRL_DMATB_MASK) + +#define I3C_MDMACTRL_DMAWIDTH_MASK (0x30U) +#define I3C_MDMACTRL_DMAWIDTH_SHIFT (4U) +/*! DMAWIDTH - DMA Width + * 0b00, 0b01..Byte + * 0b10..Halfword (16 bits) + * 0b11.. + */ +#define I3C_MDMACTRL_DMAWIDTH(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDMACTRL_DMAWIDTH_SHIFT)) & I3C_MDMACTRL_DMAWIDTH_MASK) +/*! @} */ + +/*! @name MDATACTRL - Controller Data Control */ +/*! @{ */ + +#define I3C_MDATACTRL_FLUSHTB_MASK (0x1U) +#define I3C_MDATACTRL_FLUSHTB_SHIFT (0U) +/*! FLUSHTB - Flush To-Bus Buffer or FIFO + * 0b1..Flush the buffer + * 0b0..No action + */ +#define I3C_MDATACTRL_FLUSHTB(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_FLUSHTB_SHIFT)) & I3C_MDATACTRL_FLUSHTB_MASK) + +#define I3C_MDATACTRL_FLUSHFB_MASK (0x2U) +#define I3C_MDATACTRL_FLUSHFB_SHIFT (1U) +/*! FLUSHFB - Flush From-Bus Buffer or FIFO + * 0b1..Flush the buffer + * 0b0..No action + */ +#define I3C_MDATACTRL_FLUSHFB(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_FLUSHFB_SHIFT)) & I3C_MDATACTRL_FLUSHFB_MASK) + +#define I3C_MDATACTRL_UNLOCK_MASK (0x8U) +#define I3C_MDATACTRL_UNLOCK_SHIFT (3U) +/*! UNLOCK - Unlock + * 0b0..Locked + * 0b1..Unlocked + */ +#define I3C_MDATACTRL_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_UNLOCK_SHIFT)) & I3C_MDATACTRL_UNLOCK_MASK) + +#define I3C_MDATACTRL_TXTRIG_MASK (0x30U) +#define I3C_MDATACTRL_TXTRIG_SHIFT (4U) +/*! TXTRIG - Transmit Trigger Level + * 0b00..Trigger when empty + * 0b01..Trigger when 1/4 full or less + * 0b10..Trigger when 1/2 full or less + * 0b11..Trigger when 1 less than full or less (default) + */ +#define I3C_MDATACTRL_TXTRIG(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_TXTRIG_SHIFT)) & I3C_MDATACTRL_TXTRIG_MASK) + +#define I3C_MDATACTRL_RXTRIG_MASK (0xC0U) +#define I3C_MDATACTRL_RXTRIG_SHIFT (6U) +/*! RXTRIG - Receive Trigger Level + * 0b00..Trigger when not empty + * 0b01..Trigger when 1/4 full or more + * 0b10..Trigger when 1/2 full or more + * 0b11..Trigger when 3/4 full or more + */ +#define I3C_MDATACTRL_RXTRIG(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_RXTRIG_SHIFT)) & I3C_MDATACTRL_RXTRIG_MASK) + +#define I3C_MDATACTRL_TXCOUNT_MASK (0x1F0000U) +#define I3C_MDATACTRL_TXCOUNT_SHIFT (16U) +/*! TXCOUNT - Transmit Byte Count */ +#define I3C_MDATACTRL_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_TXCOUNT_SHIFT)) & I3C_MDATACTRL_TXCOUNT_MASK) + +#define I3C_MDATACTRL_RXCOUNT_MASK (0x1F000000U) +#define I3C_MDATACTRL_RXCOUNT_SHIFT (24U) +/*! RXCOUNT - Receive Byte Count */ +#define I3C_MDATACTRL_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_RXCOUNT_SHIFT)) & I3C_MDATACTRL_RXCOUNT_MASK) + +#define I3C_MDATACTRL_TXFULL_MASK (0x40000000U) +#define I3C_MDATACTRL_TXFULL_SHIFT (30U) +/*! TXFULL - Transmit is Full + * 0b0..Not full + * 0b1..Full + */ +#define I3C_MDATACTRL_TXFULL(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_TXFULL_SHIFT)) & I3C_MDATACTRL_TXFULL_MASK) + +#define I3C_MDATACTRL_RXEMPTY_MASK (0x80000000U) +#define I3C_MDATACTRL_RXEMPTY_SHIFT (31U) +/*! RXEMPTY - Receive is Empty + * 0b0..Not empty + * 0b1..Empty + */ +#define I3C_MDATACTRL_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDATACTRL_RXEMPTY_SHIFT)) & I3C_MDATACTRL_RXEMPTY_MASK) +/*! @} */ + +/*! @name MWDATAB - Controller Write Data Byte */ +/*! @{ */ + +#define I3C_MWDATAB_VALUE_MASK (0xFFU) +#define I3C_MWDATAB_VALUE_SHIFT (0U) +/*! VALUE - Data Byte */ +#define I3C_MWDATAB_VALUE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAB_VALUE_SHIFT)) & I3C_MWDATAB_VALUE_MASK) + +#define I3C_MWDATAB_END_MASK (0x100U) +#define I3C_MWDATAB_END_SHIFT (8U) +/*! END - End of Message + * 0b0..Not the end + * 0b1..End + */ +#define I3C_MWDATAB_END(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAB_END_SHIFT)) & I3C_MWDATAB_END_MASK) + +#define I3C_MWDATAB_END_ALSO_MASK (0x10000U) +#define I3C_MWDATAB_END_ALSO_SHIFT (16U) +/*! END_ALSO - End of Message ALSO + * 0b0..Not the end + * 0b1..End + */ +#define I3C_MWDATAB_END_ALSO(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAB_END_ALSO_SHIFT)) & I3C_MWDATAB_END_ALSO_MASK) +/*! @} */ + +/*! @name MWDATABE - Controller Write Data Byte End */ +/*! @{ */ + +#define I3C_MWDATABE_VALUE_MASK (0xFFU) +#define I3C_MWDATABE_VALUE_SHIFT (0U) +/*! VALUE - Data */ +#define I3C_MWDATABE_VALUE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATABE_VALUE_SHIFT)) & I3C_MWDATABE_VALUE_MASK) +/*! @} */ + +/*! @name MWDATAH - Controller Write Data Halfword */ +/*! @{ */ + +#define I3C_MWDATAH_DATA0_MASK (0xFFU) +#define I3C_MWDATAH_DATA0_SHIFT (0U) +/*! DATA0 - Data Byte 0 */ +#define I3C_MWDATAH_DATA0(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAH_DATA0_SHIFT)) & I3C_MWDATAH_DATA0_MASK) + +#define I3C_MWDATAH_DATA1_MASK (0xFF00U) +#define I3C_MWDATAH_DATA1_SHIFT (8U) +/*! DATA1 - Data Byte 1 */ +#define I3C_MWDATAH_DATA1(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAH_DATA1_SHIFT)) & I3C_MWDATAH_DATA1_MASK) + +#define I3C_MWDATAH_END_MASK (0x10000U) +#define I3C_MWDATAH_END_SHIFT (16U) +/*! END - End of Message + * 0b0..Not the end + * 0b1..End + */ +#define I3C_MWDATAH_END(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAH_END_SHIFT)) & I3C_MWDATAH_END_MASK) +/*! @} */ + +/*! @name MWDATAHE - Controller Write Data Halfword End */ +/*! @{ */ + +#define I3C_MWDATAHE_DATA0_MASK (0xFFU) +#define I3C_MWDATAHE_DATA0_SHIFT (0U) +/*! DATA0 - Data Byte 0 */ +#define I3C_MWDATAHE_DATA0(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAHE_DATA0_SHIFT)) & I3C_MWDATAHE_DATA0_MASK) + +#define I3C_MWDATAHE_DATA1_MASK (0xFF00U) +#define I3C_MWDATAHE_DATA1_SHIFT (8U) +/*! DATA1 - Data Byte 1 */ +#define I3C_MWDATAHE_DATA1(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAHE_DATA1_SHIFT)) & I3C_MWDATAHE_DATA1_MASK) +/*! @} */ + +/*! @name MRDATAB - Controller Read Data Byte */ +/*! @{ */ + +#define I3C_MRDATAB_VALUE_MASK (0xFFU) +#define I3C_MRDATAB_VALUE_SHIFT (0U) +/*! VALUE - Value */ +#define I3C_MRDATAB_VALUE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MRDATAB_VALUE_SHIFT)) & I3C_MRDATAB_VALUE_MASK) +/*! @} */ + +/*! @name MRDATAH - Controller Read Data Halfword */ +/*! @{ */ + +#define I3C_MRDATAH_LSB_MASK (0xFFU) +#define I3C_MRDATAH_LSB_SHIFT (0U) +/*! LSB - Low Byte */ +#define I3C_MRDATAH_LSB(x) (((uint32_t)(((uint32_t)(x)) << I3C_MRDATAH_LSB_SHIFT)) & I3C_MRDATAH_LSB_MASK) + +#define I3C_MRDATAH_MSB_MASK (0xFF00U) +#define I3C_MRDATAH_MSB_SHIFT (8U) +/*! MSB - High Byte */ +#define I3C_MRDATAH_MSB(x) (((uint32_t)(((uint32_t)(x)) << I3C_MRDATAH_MSB_SHIFT)) & I3C_MRDATAH_MSB_MASK) +/*! @} */ + +/*! @name MWDATAB1 - Controller Write Byte Data 1 (to Bus) */ +/*! @{ */ + +#define I3C_MWDATAB1_VALUE_MASK (0xFFU) +#define I3C_MWDATAB1_VALUE_SHIFT (0U) +/*! VALUE - Value */ +#define I3C_MWDATAB1_VALUE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAB1_VALUE_SHIFT)) & I3C_MWDATAB1_VALUE_MASK) +/*! @} */ + +/*! @name MWDATAH1 - Controller Write Halfword Data (to Bus) */ +/*! @{ */ + +#define I3C_MWDATAH1_VALUE_MASK (0xFFFFU) +#define I3C_MWDATAH1_VALUE_SHIFT (0U) +/*! VALUE - Value */ +#define I3C_MWDATAH1_VALUE(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWDATAH1_VALUE_SHIFT)) & I3C_MWDATAH1_VALUE_MASK) +/*! @} */ + +/*! @name MWMSG_SDR_CONTROL - Controller Write Message Control in SDR mode */ +/*! @{ */ + +#define I3C_MWMSG_SDR_CONTROL_DIR_MASK (0x1U) +#define I3C_MWMSG_SDR_CONTROL_DIR_SHIFT (0U) +/*! DIR - Direction + * 0b0..Write + * 0b1..Read + */ +#define I3C_MWMSG_SDR_CONTROL_DIR(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_SDR_CONTROL_DIR_SHIFT)) & I3C_MWMSG_SDR_CONTROL_DIR_MASK) + +#define I3C_MWMSG_SDR_CONTROL_ADDR_MASK (0xFEU) +#define I3C_MWMSG_SDR_CONTROL_ADDR_SHIFT (1U) +/*! ADDR - Address */ +#define I3C_MWMSG_SDR_CONTROL_ADDR(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_SDR_CONTROL_ADDR_SHIFT)) & I3C_MWMSG_SDR_CONTROL_ADDR_MASK) + +#define I3C_MWMSG_SDR_CONTROL_END_MASK (0x100U) +#define I3C_MWMSG_SDR_CONTROL_END_SHIFT (8U) +/*! END - End of SDR Message + * 0b0..Not the end + * 0b1..End + */ +#define I3C_MWMSG_SDR_CONTROL_END(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_SDR_CONTROL_END_SHIFT)) & I3C_MWMSG_SDR_CONTROL_END_MASK) + +#define I3C_MWMSG_SDR_CONTROL_I2C_MASK (0x400U) +#define I3C_MWMSG_SDR_CONTROL_I2C_SHIFT (10U) +/*! I2C - I2C + * 0b0..I3C message + * 0b1..I2C message + */ +#define I3C_MWMSG_SDR_CONTROL_I2C(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_SDR_CONTROL_I2C_SHIFT)) & I3C_MWMSG_SDR_CONTROL_I2C_MASK) + +#define I3C_MWMSG_SDR_CONTROL_LEN_MASK (0xF800U) +#define I3C_MWMSG_SDR_CONTROL_LEN_SHIFT (11U) +/*! LEN - Length */ +#define I3C_MWMSG_SDR_CONTROL_LEN(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_SDR_CONTROL_LEN_SHIFT)) & I3C_MWMSG_SDR_CONTROL_LEN_MASK) +/*! @} */ + +/*! @name MWMSG_SDR_DATA - Controller Write Message Data in SDR mode */ +/*! @{ */ + +#define I3C_MWMSG_SDR_DATA_DATA16B_MASK (0xFFFFU) +#define I3C_MWMSG_SDR_DATA_DATA16B_SHIFT (0U) +/*! DATA16B - Data */ +#define I3C_MWMSG_SDR_DATA_DATA16B(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_SDR_DATA_DATA16B_SHIFT)) & I3C_MWMSG_SDR_DATA_DATA16B_MASK) +/*! @} */ + +/*! @name MRMSG_SDR - Controller Read Message in SDR mode */ +/*! @{ */ + +#define I3C_MRMSG_SDR_DATA_MASK (0xFFFFU) +#define I3C_MRMSG_SDR_DATA_SHIFT (0U) +/*! DATA - Data */ +#define I3C_MRMSG_SDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << I3C_MRMSG_SDR_DATA_SHIFT)) & I3C_MRMSG_SDR_DATA_MASK) +/*! @} */ + +/*! @name MWMSG_DDR_CONTROL - Controller Write Message in DDR mode: First Control Word */ +/*! @{ */ + +#define I3C_MWMSG_DDR_CONTROL_ADDRCMD_MASK (0xFFFFU) +#define I3C_MWMSG_DDR_CONTROL_ADDRCMD_SHIFT (0U) +/*! ADDRCMD - Address Command */ +#define I3C_MWMSG_DDR_CONTROL_ADDRCMD(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_DDR_CONTROL_ADDRCMD_SHIFT)) & I3C_MWMSG_DDR_CONTROL_ADDRCMD_MASK) +/*! @} */ + +/*! @name MWMSG_DDR_CONTROL2 - Controller Write Message in DDR Mode Control 2 */ +/*! @{ */ + +#define I3C_MWMSG_DDR_CONTROL2_LEN_MASK (0x3FFU) +#define I3C_MWMSG_DDR_CONTROL2_LEN_SHIFT (0U) +/*! LEN - Length of Message */ +#define I3C_MWMSG_DDR_CONTROL2_LEN(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_DDR_CONTROL2_LEN_SHIFT)) & I3C_MWMSG_DDR_CONTROL2_LEN_MASK) + +#define I3C_MWMSG_DDR_CONTROL2_END_MASK (0x4000U) +#define I3C_MWMSG_DDR_CONTROL2_END_SHIFT (14U) +/*! END - End of Message + * 0b1..End + * 0b0..Not the end + */ +#define I3C_MWMSG_DDR_CONTROL2_END(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_DDR_CONTROL2_END_SHIFT)) & I3C_MWMSG_DDR_CONTROL2_END_MASK) +/*! @} */ + +/*! @name MWMSG_DDR_DATA - Controller Write Message Data in DDR mode */ +/*! @{ */ + +#define I3C_MWMSG_DDR_DATA_DATA16B_MASK (0xFFFFU) +#define I3C_MWMSG_DDR_DATA_DATA16B_SHIFT (0U) +/*! DATA16B - Data */ +#define I3C_MWMSG_DDR_DATA_DATA16B(x) (((uint32_t)(((uint32_t)(x)) << I3C_MWMSG_DDR_DATA_DATA16B_SHIFT)) & I3C_MWMSG_DDR_DATA_DATA16B_MASK) +/*! @} */ + +/*! @name MRMSG_DDR - Controller Read Message in DDR mode */ +/*! @{ */ + +#define I3C_MRMSG_DDR_DATA_MASK (0xFFFFU) +#define I3C_MRMSG_DDR_DATA_SHIFT (0U) +/*! DATA - Data */ +#define I3C_MRMSG_DDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << I3C_MRMSG_DDR_DATA_SHIFT)) & I3C_MRMSG_DDR_DATA_MASK) +/*! @} */ + +/*! @name MDYNADDR - Controller Dynamic Address */ +/*! @{ */ + +#define I3C_MDYNADDR_DAVALID_MASK (0x1U) +#define I3C_MDYNADDR_DAVALID_SHIFT (0U) +/*! DAVALID - Dynamic Address Valid + * 0b1..Valid DA assigned + * 0b0..No valid DA assigned + */ +#define I3C_MDYNADDR_DAVALID(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDYNADDR_DAVALID_SHIFT)) & I3C_MDYNADDR_DAVALID_MASK) + +#define I3C_MDYNADDR_DADDR_MASK (0xFEU) +#define I3C_MDYNADDR_DADDR_SHIFT (1U) +/*! DADDR - Dynamic Address */ +#define I3C_MDYNADDR_DADDR(x) (((uint32_t)(((uint32_t)(x)) << I3C_MDYNADDR_DADDR_SHIFT)) & I3C_MDYNADDR_DADDR_MASK) +/*! @} */ + +/*! @name SMAPCTRL0 - Map Feature Control 0 */ +/*! @{ */ + +#define I3C_SMAPCTRL0_ENA_MASK (0x1U) +#define I3C_SMAPCTRL0_ENA_SHIFT (0U) +/*! ENA - Enable Primary Dynamic Address + * 0b0..Disabled + * 0b1..Enabled + */ +#define I3C_SMAPCTRL0_ENA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMAPCTRL0_ENA_SHIFT)) & I3C_SMAPCTRL0_ENA_MASK) + +#define I3C_SMAPCTRL0_DA_MASK (0xFEU) +#define I3C_SMAPCTRL0_DA_SHIFT (1U) +/*! DA - Dynamic Address */ +#define I3C_SMAPCTRL0_DA(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMAPCTRL0_DA_SHIFT)) & I3C_SMAPCTRL0_DA_MASK) + +#define I3C_SMAPCTRL0_CAUSE_MASK (0x700U) +#define I3C_SMAPCTRL0_CAUSE_SHIFT (8U) +/*! CAUSE - Cause + * 0b000..No information (this value occurs when not configured to write DA) + * 0b001..Set using ENTDAA + * 0b010..Set using SETDASA, SETAASA, or SETNEWDA + * 0b011..Cleared using RSTDAA + * 0b100..Auto MAP change happened last + * *.. + */ +#define I3C_SMAPCTRL0_CAUSE(x) (((uint32_t)(((uint32_t)(x)) << I3C_SMAPCTRL0_CAUSE_SHIFT)) & I3C_SMAPCTRL0_CAUSE_MASK) +/*! @} */ + +/*! @name IBIEXT1 - Extended IBI Data 1 */ +/*! @{ */ + +#define I3C_IBIEXT1_CNT_MASK (0x7U) +#define I3C_IBIEXT1_CNT_SHIFT (0U) +/*! CNT - Count */ +#define I3C_IBIEXT1_CNT(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT1_CNT_SHIFT)) & I3C_IBIEXT1_CNT_MASK) + +#define I3C_IBIEXT1_MAX_MASK (0x70U) +#define I3C_IBIEXT1_MAX_SHIFT (4U) +/*! MAX - Maximum */ +#define I3C_IBIEXT1_MAX(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT1_MAX_SHIFT)) & I3C_IBIEXT1_MAX_MASK) + +#define I3C_IBIEXT1_EXT1_MASK (0xFF00U) +#define I3C_IBIEXT1_EXT1_SHIFT (8U) +/*! EXT1 - Extra Byte 1 */ +#define I3C_IBIEXT1_EXT1(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT1_EXT1_SHIFT)) & I3C_IBIEXT1_EXT1_MASK) + +#define I3C_IBIEXT1_EXT2_MASK (0xFF0000U) +#define I3C_IBIEXT1_EXT2_SHIFT (16U) +/*! EXT2 - Extra Byte 2 */ +#define I3C_IBIEXT1_EXT2(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT1_EXT2_SHIFT)) & I3C_IBIEXT1_EXT2_MASK) + +#define I3C_IBIEXT1_EXT3_MASK (0xFF000000U) +#define I3C_IBIEXT1_EXT3_SHIFT (24U) +/*! EXT3 - Extra Byte 3 */ +#define I3C_IBIEXT1_EXT3(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT1_EXT3_SHIFT)) & I3C_IBIEXT1_EXT3_MASK) +/*! @} */ + +/*! @name IBIEXT2 - Extended IBI Data 2 */ +/*! @{ */ + +#define I3C_IBIEXT2_EXT4_MASK (0xFFU) +#define I3C_IBIEXT2_EXT4_SHIFT (0U) +/*! EXT4 - Extra Byte 4 */ +#define I3C_IBIEXT2_EXT4(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT2_EXT4_SHIFT)) & I3C_IBIEXT2_EXT4_MASK) + +#define I3C_IBIEXT2_EXT5_MASK (0xFF00U) +#define I3C_IBIEXT2_EXT5_SHIFT (8U) +/*! EXT5 - Extra Byte 5 */ +#define I3C_IBIEXT2_EXT5(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT2_EXT5_SHIFT)) & I3C_IBIEXT2_EXT5_MASK) + +#define I3C_IBIEXT2_EXT6_MASK (0xFF0000U) +#define I3C_IBIEXT2_EXT6_SHIFT (16U) +/*! EXT6 - Extra Byte 6 */ +#define I3C_IBIEXT2_EXT6(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT2_EXT6_SHIFT)) & I3C_IBIEXT2_EXT6_MASK) + +#define I3C_IBIEXT2_EXT7_MASK (0xFF000000U) +#define I3C_IBIEXT2_EXT7_SHIFT (24U) +/*! EXT7 - Extra Byte 7 */ +#define I3C_IBIEXT2_EXT7(x) (((uint32_t)(((uint32_t)(x)) << I3C_IBIEXT2_EXT7_SHIFT)) & I3C_IBIEXT2_EXT7_MASK) +/*! @} */ + +/*! @name SID - Target Module ID */ +/*! @{ */ + +#define I3C_SID_ID_MASK (0xFFFFFFFFU) +#define I3C_SID_ID_SHIFT (0U) +/*! ID - ID */ +#define I3C_SID_ID(x) (((uint32_t)(((uint32_t)(x)) << I3C_SID_ID_SHIFT)) & I3C_SID_ID_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group I3C_Register_Masks */ + + +/* I3C - Peripheral instance base addresses */ +/** Peripheral I3C0 base address */ +#define I3C0_BASE (0x40002000u) +/** Peripheral I3C0 base pointer */ +#define I3C0 ((I3C_Type *)I3C0_BASE) +/** Array initializer of I3C peripheral base addresses */ +#define I3C_BASE_ADDRS { I3C0_BASE } +/** Array initializer of I3C peripheral base pointers */ +#define I3C_BASE_PTRS { I3C0 } +/** Interrupt vectors for the I3C peripheral type */ +#define I3C_IRQS { I3C0_IRQn } + +/*! + * @} + */ /* end of group I3C_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- INPUTMUX Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup INPUTMUX_Peripheral_Access_Layer INPUTMUX Peripheral Access Layer + * @{ + */ + +/** INPUTMUX - Register Layout Typedef */ +typedef struct { + uint8_t RESERVED_0[32]; + __IO uint32_t CTIMER0CAP[4]; /**< Capture select register for CTIMER inputs, array offset: 0x20, array step: 0x4 */ + __IO uint32_t TIMER0TRIG; /**< Trigger register for TIMER0, offset: 0x30 */ + uint8_t RESERVED_1[12]; + __IO uint32_t CTIMER1CAP[4]; /**< Capture select register for CTIMER inputs, array offset: 0x40, array step: 0x4 */ + __IO uint32_t TIMER1TRIG; /**< Trigger register for TIMER1, offset: 0x50 */ + uint8_t RESERVED_2[12]; + __IO uint32_t CTIMER2CAP[4]; /**< Capture select register for CTIMER inputs, array offset: 0x60, array step: 0x4 */ + __IO uint32_t TIMER2TRIG; /**< Trigger register for TIMER2 inputs, offset: 0x70 */ + uint8_t RESERVED_3[268]; + __IO uint32_t FREQMEAS_REF; /**< Selection for frequency measurement reference clock, offset: 0x180 */ + __IO uint32_t FREQMEAS_TAR; /**< Selection for frequency measurement reference clock, offset: 0x184 */ + uint8_t RESERVED_4[24]; + __IO uint32_t CTIMER3CAP[4]; /**< Capture select register for CTIMER inputs, array offset: 0x1A0, array step: 0x4 */ + __IO uint32_t TIMER3TRIG; /**< Trigger register for TIMER3, offset: 0x1B0 */ + uint8_t RESERVED_5[12]; + __IO uint32_t CTIMER4CAP[4]; /**< Capture select register for CTIMER inputs, array offset: 0x1C0, array step: 0x4 */ + __IO uint32_t TIMER4TRIG; /**< Trigger register for TIMER4, offset: 0x1D0 */ + uint8_t RESERVED_6[44]; + __IO uint32_t AOI1_INPUT[16]; /**< AOI1 trigger input connections 0, array offset: 0x200, array step: 0x4 */ + uint8_t RESERVED_7[32]; + __IO uint32_t CMP0_TRIG; /**< CMP0 input connections, offset: 0x260 */ + uint8_t RESERVED_8[28]; + __IO uint32_t ADC0_TRIG[4]; /**< ADC Trigger input connections, array offset: 0x280, array step: 0x4 */ + uint8_t RESERVED_9[48]; + __IO uint32_t ADC1_TRIG[4]; /**< ADC Trigger input connections, array offset: 0x2C0, array step: 0x4 */ + uint8_t RESERVED_10[48]; + __IO uint32_t DAC0_TRIG; /**< This register selects the DAC0 trigger inputs., offset: 0x300 */ + uint8_t RESERVED_11[92]; + __IO uint32_t QDC0_TRIG; /**< QDC0 Trigger Input Connections, offset: 0x360 */ + __IO uint32_t QDC0_HOME; /**< QDC0 Trigger Input Connections, offset: 0x364 */ + __IO uint32_t QDC0_INDEX; /**< QDC0 Trigger Input Connections, offset: 0x368 */ + __IO uint32_t QDC0_PHASEB; /**< QDC0 Trigger Input Connections, offset: 0x36C */ + __IO uint32_t QDC0_PHASEA; /**< QDC0 Trigger Input Connections, offset: 0x370 */ + __IO uint32_t QDC0_ICAP1; /**< QDC0 Trigger Input Connections, offset: 0x374 */ + __IO uint32_t QDC0_ICAP2; /**< QDC0 Trigger Input Connections, offset: 0x378 */ + __IO uint32_t QDC0_ICAP3; /**< QDC0 Trigger Input Connections, offset: 0x37C */ + __IO uint32_t QDC1_TRIG; /**< QDC1 Trigger Input Connections, offset: 0x380 */ + __IO uint32_t QDC1_HOME; /**< QDC1 Trigger Input Connections, offset: 0x384 */ + __IO uint32_t QDC1_INDEX; /**< QDC1 Trigger Input Connections, offset: 0x388 */ + __IO uint32_t QDC1_PHASEB; /**< QDC1 Trigger Input Connections, offset: 0x38C */ + __IO uint32_t QDC1_PHASEA; /**< QDC1 Trigger Input Connections, offset: 0x390 */ + __IO uint32_t QDC1_ICAP1; /**< QDC1 Trigger Input Connections, offset: 0x394 */ + __IO uint32_t QDC1_ICAP2; /**< QDC1 Trigger Input Connections, offset: 0x398 */ + __IO uint32_t QDC1_ICAP3; /**< QDC1 Trigger Input Connections, offset: 0x39C */ + __IO uint32_t FLEXPWM0_SM0_EXTA0; /**< PWM0 input trigger connections, offset: 0x3A0 */ + __IO uint32_t FLEXPWM0_SM0_EXTSYNC; /**< PWM0 input trigger connections, offset: 0x3A4 */ + __IO uint32_t FLEXPWM0_SM1_EXTA; /**< PWM0 input trigger connections, offset: 0x3A8 */ + __IO uint32_t FLEXPWM0_SM1_EXTSYNC; /**< PWM0 input trigger connections, offset: 0x3AC */ + __IO uint32_t FLEXPWM0_SM2_EXTA; /**< PWM0 input trigger connections, offset: 0x3B0 */ + __IO uint32_t FLEXPWM0_SM2_EXTSYNC; /**< PWM0 input trigger connections, offset: 0x3B4 */ + uint8_t RESERVED_12[8]; + __IO uint32_t FLEXPWM0_FAULT[4]; /**< PWM0 Fault Input Trigger Connections, array offset: 0x3C0, array step: 0x4 */ + __IO uint32_t FLEXPWM0_FORCE; /**< PWM0 input trigger connections, offset: 0x3D0 */ + uint8_t RESERVED_13[12]; + __IO uint32_t FLEXPWM1_SM0_EXTA0; /**< PWM1 input trigger connections, offset: 0x3E0 */ + __IO uint32_t FLEXPWM1_SM0_EXTSYNC; /**< PWM1 input trigger connections, offset: 0x3E4 */ + __IO uint32_t FLEXPWM1_SM1_EXTA; /**< PWM1 input trigger connections, offset: 0x3E8 */ + __IO uint32_t FLEXPWM1_SM1_EXTSYNC; /**< PWM1 input trigger connections, offset: 0x3EC */ + __IO uint32_t FLEXPWM1_SM2_EXTA; /**< PWM1 input trigger connections, offset: 0x3F0 */ + __IO uint32_t FLEXPWM1_SM2_EXTSYNC; /**< PWM1 input trigger connections, offset: 0x3F4 */ + uint8_t RESERVED_14[8]; + __IO uint32_t FLEXPWM1_FAULT[4]; /**< PWM1 Fault Input Trigger Connections, array offset: 0x400, array step: 0x4 */ + __IO uint32_t FLEXPWM1_FORCE; /**< PWM1 input trigger connections, offset: 0x410 */ + uint8_t RESERVED_15[12]; + __IO uint32_t PWM0_EXT_CLK; /**< PWM0 external clock trigger, offset: 0x420 */ + __IO uint32_t PWM1_EXT_CLK; /**< PWM1 external clock trigger, offset: 0x424 */ + uint8_t RESERVED_16[24]; + __IO uint32_t AOI0_INPUT[16]; /**< AOI0 trigger input connections 0, array offset: 0x440, array step: 0x4 */ + __IO uint32_t USBFS_TRIG; /**< USB-FS trigger input connections, offset: 0x480 */ + uint8_t RESERVED_17[60]; + __IO uint32_t EXT_TRIG0; /**< EXT trigger connections 0, offset: 0x4C0 */ + uint8_t RESERVED_18[28]; + __IO uint32_t CMP1_TRIG; /**< CMP1 input connections, offset: 0x4E0 */ + uint8_t RESERVED_19[92]; + __IO uint32_t LPI2C2_TRIG; /**< LPI2C2 trigger input connections, offset: 0x540 */ + uint8_t RESERVED_20[60]; + __IO uint32_t OPAMP0_TRIG; /**< OPAMP0 Trigger Input Connections, offset: 0x580 */ + uint8_t RESERVED_21[28]; + __IO uint32_t LPI2C0_TRIG; /**< LPI2C0 trigger input connections, offset: 0x5A0 */ + uint8_t RESERVED_22[28]; + __IO uint32_t LPI2C1_TRIG; /**< LPI2C1 trigger input connections, offset: 0x5C0 */ + uint8_t RESERVED_23[28]; + __IO uint32_t LPSPI0_TRIG; /**< LPSPI0 trigger input connections, offset: 0x5E0 */ + uint8_t RESERVED_24[28]; + __IO uint32_t LPSPI1_TRIG; /**< LPSPI1 trigger input connections, offset: 0x600 */ + uint8_t RESERVED_25[28]; + __IO uint32_t LPUART0r; /**< LPUART0 trigger input connections, offset: 0x620, 'r' suffix has been added to avoid a clash with peripheral base pointer macro 'LPUART0' */ + uint8_t RESERVED_26[28]; + __IO uint32_t LPUART1r; /**< LPUART1 trigger input connections, offset: 0x640, 'r' suffix has been added to avoid a clash with peripheral base pointer macro 'LPUART1' */ + uint8_t RESERVED_27[28]; + __IO uint32_t LPUART2r; /**< LPUART2 trigger input connections, offset: 0x660, 'r' suffix has been added to avoid a clash with peripheral base pointer macro 'LPUART2' */ + uint8_t RESERVED_28[28]; + __IO uint32_t LPUART3r; /**< LPUART3 trigger input connections, offset: 0x680, 'r' suffix has been added to avoid a clash with peripheral base pointer macro 'LPUART3' */ + uint8_t RESERVED_29[28]; + __IO uint32_t LPUART4r; /**< LPUART4 trigger input connections, offset: 0x6A0, 'r' suffix has been added to avoid a clash with peripheral base pointer macro 'LPUART4' */ + uint8_t RESERVED_30[60]; + __IO uint32_t FLEXIO_TRIG[4]; /**< FlexIO Trigger Input Connections, array offset: 0x6E0, array step: 0x4 */ +} INPUTMUX_Type; + +/* ---------------------------------------------------------------------------- + -- INPUTMUX Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup INPUTMUX_Register_Masks INPUTMUX Register Masks + * @{ + */ + +/*! @name CTIMERA_CTIMER0CAP - Capture select register for CTIMER inputs */ +/*! @{ */ + +#define INPUTMUX_CTIMERA_CTIMER0CAP_INP_MASK (0x7FU) +#define INPUTMUX_CTIMERA_CTIMER0CAP_INP_SHIFT (0U) +/*! INP - Input number for CTIMER0 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer1_MAT1 input is selected + * 0b0100010..CTimer1_MAT2 input is selected + * 0b0100011..CTimer1_MAT3 input is selected + * 0b0100100..CTimer2_MAT1 input is selected + * 0b0100101..CTimer2_MAT2 input is selected + * 0b0100110..CTimer2_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer3_MAT1 input is selected + * 0b1010000..CTimer3_MAT2 input is selected + * 0b1010001..CTimer3_MAT3 input is selected + * 0b1010010..CTimer4_MAT1 input is selected + * 0b1010011..CTimer4_MAT2 input is selected + * 0b1010100..CTimer4_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_CTIMERA_CTIMER0CAP_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_CTIMERA_CTIMER0CAP_INP_SHIFT)) & INPUTMUX_CTIMERA_CTIMER0CAP_INP_MASK) +/*! @} */ + +/* The count of INPUTMUX_CTIMERA_CTIMER0CAP */ +#define INPUTMUX_CTIMERA_CTIMER0CAP_COUNT (4U) + +/*! @name TIMER0TRIG - Trigger register for TIMER0 */ +/*! @{ */ + +#define INPUTMUX_TIMER0TRIG_INP_MASK (0x7FU) +#define INPUTMUX_TIMER0TRIG_INP_SHIFT (0U) +/*! INP - Input number for CTIMER0 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer1_MAT1 input is selected + * 0b0100010..CTimer1_MAT2 input is selected + * 0b0100011..CTimer1_MAT3 input is selected + * 0b0100100..CTimer2_MAT1 input is selected + * 0b0100101..CTimer2_MAT2 input is selected + * 0b0100110..CTimer2_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer3_MAT1 input is selected + * 0b1010000..CTimer3_MAT2 input is selected + * 0b1010001..CTimer3_MAT3 input is selected + * 0b1010010..CTimer4_MAT1 input is selected + * 0b1010011..CTimer4_MAT2 input is selected + * 0b1010100..CTimer4_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_TIMER0TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_TIMER0TRIG_INP_SHIFT)) & INPUTMUX_TIMER0TRIG_INP_MASK) +/*! @} */ + +/*! @name CTIMERB_CTIMER1CAP - Capture select register for CTIMER inputs */ +/*! @{ */ + +#define INPUTMUX_CTIMERB_CTIMER1CAP_INP_MASK (0x7FU) +#define INPUTMUX_CTIMERB_CTIMER1CAP_INP_SHIFT (0U) +/*! INP - Input number for CTIMER1 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer0_MAT1 input is selected + * 0b0100010..CTimer0_MAT2 input is selected + * 0b0100011..CTimer0_MAT3 input is selected + * 0b0100100..CTimer2_MAT1 input is selected + * 0b0100101..CTimer2_MAT2 input is selected + * 0b0100110..CTimer2_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer3_MAT1 input is selected + * 0b1010000..CTimer3_MAT2 input is selected + * 0b1010001..CTimer3_MAT3 input is selected + * 0b1010010..CTimer4_MAT1 input is selected + * 0b1010011..CTimer4_MAT2 input is selected + * 0b1010100..CTimer4_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_CTIMERB_CTIMER1CAP_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_CTIMERB_CTIMER1CAP_INP_SHIFT)) & INPUTMUX_CTIMERB_CTIMER1CAP_INP_MASK) +/*! @} */ + +/* The count of INPUTMUX_CTIMERB_CTIMER1CAP */ +#define INPUTMUX_CTIMERB_CTIMER1CAP_COUNT (4U) + +/*! @name TIMER1TRIG - Trigger register for TIMER1 */ +/*! @{ */ + +#define INPUTMUX_TIMER1TRIG_INP_MASK (0x7FU) +#define INPUTMUX_TIMER1TRIG_INP_SHIFT (0U) +/*! INP - Input number for CTIMER1 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer0_MAT1 input is selected + * 0b0100010..CTimer0_MAT2 input is selected + * 0b0100011..CTimer0_MAT3 input is selected + * 0b0100100..CTimer2_MAT1 input is selected + * 0b0100101..CTimer2_MAT2 input is selected + * 0b0100110..CTimer2_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer3_MAT1 input is selected + * 0b1010000..CTimer3_MAT2 input is selected + * 0b1010001..CTimer3_MAT3 input is selected + * 0b1010010..CTimer4_MAT1 input is selected + * 0b1010011..CTimer4_MAT2 input is selected + * 0b1010100..CTimer4_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_TIMER1TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_TIMER1TRIG_INP_SHIFT)) & INPUTMUX_TIMER1TRIG_INP_MASK) +/*! @} */ + +/*! @name CTIMERC_CTIMER2CAP - Capture select register for CTIMER inputs */ +/*! @{ */ + +#define INPUTMUX_CTIMERC_CTIMER2CAP_INP_MASK (0x7FU) +#define INPUTMUX_CTIMERC_CTIMER2CAP_INP_SHIFT (0U) +/*! INP - Input number for CTIMER2 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer0_MAT1 input is selected + * 0b0100010..CTimer0_MAT2 input is selected + * 0b0100011..CTimer0_MAT3 input is selected + * 0b0100100..CTimer1_MAT1 input is selected + * 0b0100101..CTimer1_MAT2 input is selected + * 0b0100110..CTimer1_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer3_MAT1 input is selected + * 0b1010000..CTimer3_MAT2 input is selected + * 0b1010001..CTimer3_MAT3 input is selected + * 0b1010010..CTimer4_MAT1 input is selected + * 0b1010011..CTimer4_MAT2 input is selected + * 0b1010100..CTimer4_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_CTIMERC_CTIMER2CAP_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_CTIMERC_CTIMER2CAP_INP_SHIFT)) & INPUTMUX_CTIMERC_CTIMER2CAP_INP_MASK) +/*! @} */ + +/* The count of INPUTMUX_CTIMERC_CTIMER2CAP */ +#define INPUTMUX_CTIMERC_CTIMER2CAP_COUNT (4U) + +/*! @name TIMER2TRIG - Trigger register for TIMER2 inputs */ +/*! @{ */ + +#define INPUTMUX_TIMER2TRIG_INP_MASK (0x7FU) +#define INPUTMUX_TIMER2TRIG_INP_SHIFT (0U) +/*! INP - Input number for CTIMER2 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer0_MAT1 input is selected + * 0b0100010..CTimer0_MAT2 input is selected + * 0b0100011..CTimer0_MAT3 input is selected + * 0b0100100..CTimer1_MAT1 input is selected + * 0b0100101..CTimer1_MAT2 input is selected + * 0b0100110..CTimer1_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer3_MAT1 input is selected + * 0b1010000..CTimer3_MAT2 input is selected + * 0b1010001..CTimer3_MAT3 input is selected + * 0b1010010..CTimer4_MAT1 input is selected + * 0b1010011..CTimer4_MAT2 input is selected + * 0b1010100..CTimer4_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_TIMER2TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_TIMER2TRIG_INP_SHIFT)) & INPUTMUX_TIMER2TRIG_INP_MASK) +/*! @} */ + +/*! @name FREQMEAS_REF - Selection for frequency measurement reference clock */ +/*! @{ */ + +#define INPUTMUX_FREQMEAS_REF_INP_MASK (0x7FU) +#define INPUTMUX_FREQMEAS_REF_INP_SHIFT (0U) +/*! INP - Clock source number (binary value) for frequency measure function target clock. + * 0b0000000..Reserved + * 0b0000001..clk_in input is selected + * 0b0000010..FRO_OSC_12M input is selected + * 0b0000011..fro_hf_div input is selected + * 0b0000100..Reserved + * 0b0000101..clk_16k[1] input is selected + * 0b0000110..SLOW_CLK input is selected + * 0b0000111..FREQME_CLK_IN0 input is selected + * 0b0001000..FREQME_CLK_IN1 input is selected input is selected + * 0b0001001..AOI0_OUT0 input is selected + * 0b0001010..AOI0_OUT1 + * 0b0001011..PWM0_SM0_MUX_TRIG0 + * 0b0001100..PWM0_SM0_MUX_TRIG1 + * 0b0001101..PWM0_SM1_MUX_TRIG0 + * 0b0001110..PWM0_SM1_MUX_TRIG1 + * 0b0001111..PWM0_SM2_MUX_TRIG0 + * 0b0010000..PWM0_SM2_MUX_TRIG1 + * 0b0010001..Reserved + * 0b0010010..Reserved + * 0b0010011..Reserved + * 0b0010100..Reserved + * 0b0010101..Reserved + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..Reserved + * 0b0011001..Reserved + * 0b0011010..Reserved + * 0b0011011..Reserved + * 0b0011100..Reserved + * 0b0011101..Reserved + * 0b0011110..Reserved + * 0b0011111..Reserved + * 0b0100000..AOI1_OUT0 input is selected + * 0b0100001..AOI1_OUT1 input is selected + * 0b0100010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b0100011..PWM1_SM0_MUX_TRIG1 input is selected + * 0b0100100..PWM1_SM1_MUX_TRIG0 input is selected + * 0b0100101..PWM1_SM1_MUX_TRIG1 input is selected + * 0b0100110..PWM1_SM2_MUX_TRIG0 input is selected + * 0b0100111..PWM1_SM2_MUX_TRIG1 input is selected + * 0b0101000..Reserved + * 0b0101001..Reserved + * *.. + */ +#define INPUTMUX_FREQMEAS_REF_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FREQMEAS_REF_INP_SHIFT)) & INPUTMUX_FREQMEAS_REF_INP_MASK) +/*! @} */ + +/*! @name FREQMEAS_TAR - Selection for frequency measurement reference clock */ +/*! @{ */ + +#define INPUTMUX_FREQMEAS_TAR_INP_MASK (0x7FU) +#define INPUTMUX_FREQMEAS_TAR_INP_SHIFT (0U) +/*! INP - Clock source number (binary value) for frequency measure function target clock. + * 0b0000000..Reserved + * 0b0000001..clk_in input is selected + * 0b0000010..FRO_OSC_12M input is selected + * 0b0000011..fro_hf_div input is selected + * 0b0000100..Reserved + * 0b0000101..clk_16k[1] input is selected + * 0b0000110..SLOW_CLK input is selected + * 0b0000111..FREQME_CLK_IN0 input is selected + * 0b0001000..FREQME_CLK_IN1 input is selected input is selected + * 0b0001001..AOI0_OUT0 input is selected + * 0b0001010..AOI0_OUT1 + * 0b0001011..PWM0_SM0_MUX_TRIG0 + * 0b0001100..PWM0_SM0_MUX_TRIG1 + * 0b0001101..PWM0_SM1_MUX_TRIG0 + * 0b0001110..PWM0_SM1_MUX_TRIG1 + * 0b0001111..PWM0_SM2_MUX_TRIG0 + * 0b0010000..PWM0_SM2_MUX_TRIG1 + * 0b0010001..Reserved + * 0b0010010..Reserved + * 0b0010011..Reserved + * 0b0010100..Reserved + * 0b0010101..Reserved + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..Reserved + * 0b0011001..Reserved + * 0b0011010..Reserved + * 0b0011011..Reserved + * 0b0011100..Reserved + * 0b0011101..Reserved + * 0b0011110..Reserved + * 0b0011111..Reserved + * 0b0100000..AOI1_OUT0 input is selected + * 0b0100001..AOI1_OUT1 input is selected + * 0b0100010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b0100011..PWM1_SM0_MUX_TRIG1 input is selected + * 0b0100100..PWM1_SM1_MUX_TRIG0 input is selected + * 0b0100101..PWM1_SM1_MUX_TRIG1 input is selected + * 0b0100110..PWM1_SM2_MUX_TRIG0 input is selected + * 0b0100111..PWM1_SM2_MUX_TRIG1 input is selected + * 0b0101000..Reserved + * 0b0101001..Reserved + * *.. + */ +#define INPUTMUX_FREQMEAS_TAR_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FREQMEAS_TAR_INP_SHIFT)) & INPUTMUX_FREQMEAS_TAR_INP_MASK) +/*! @} */ + +/*! @name CTIMERD_CTIMER3CAP - Capture select register for CTIMER inputs */ +/*! @{ */ + +#define INPUTMUX_CTIMERD_CTIMER3CAP_INP_MASK (0x7FU) +#define INPUTMUX_CTIMERD_CTIMER3CAP_INP_SHIFT (0U) +/*! INP - Input number for CTIMER3 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer0_MAT1 input is selected + * 0b0100010..CTimer0_MAT2 input is selected + * 0b0100011..CTimer0_MAT3 input is selected + * 0b0100100..CTimer1_MAT1 input is selected + * 0b0100101..CTimer1_MAT2 input is selected + * 0b0100110..CTimer1_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer2_MAT1 input is selected + * 0b1010000..CTimer2_MAT2 input is selected + * 0b1010001..CTimer2_MAT3 input is selected + * 0b1010010..CTimer4_MAT1 input is selected + * 0b1010011..CTimer4_MAT2 input is selected + * 0b1010100..CTimer4_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_CTIMERD_CTIMER3CAP_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_CTIMERD_CTIMER3CAP_INP_SHIFT)) & INPUTMUX_CTIMERD_CTIMER3CAP_INP_MASK) +/*! @} */ + +/* The count of INPUTMUX_CTIMERD_CTIMER3CAP */ +#define INPUTMUX_CTIMERD_CTIMER3CAP_COUNT (4U) + +/*! @name TIMER3TRIG - Trigger register for TIMER3 */ +/*! @{ */ + +#define INPUTMUX_TIMER3TRIG_INP_MASK (0x7FU) +#define INPUTMUX_TIMER3TRIG_INP_SHIFT (0U) +/*! INP - Input number for CTIMER3 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer0_MAT1 input is selected + * 0b0100010..CTimer0_MAT2 input is selected + * 0b0100011..CTimer0_MAT3 input is selected + * 0b0100100..CTimer1_MAT1 input is selected + * 0b0100101..CTimer1_MAT2 input is selected + * 0b0100110..CTimer1_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer2_MAT1 input is selected + * 0b1010000..CTimer2_MAT2 input is selected + * 0b1010001..CTimer2_MAT3 input is selected + * 0b1010010..CTimer4_MAT1 input is selected + * 0b1010011..CTimer4_MAT2 input is selected + * 0b1010100..CTimer4_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_TIMER3TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_TIMER3TRIG_INP_SHIFT)) & INPUTMUX_TIMER3TRIG_INP_MASK) +/*! @} */ + +/*! @name CTIMERE_CTIMER4CAP - Capture select register for CTIMER inputs */ +/*! @{ */ + +#define INPUTMUX_CTIMERE_CTIMER4CAP_INP_MASK (0x7FU) +#define INPUTMUX_CTIMERE_CTIMER4CAP_INP_SHIFT (0U) +/*! INP - Input number for CTIMER4 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer0_MAT1 input is selected + * 0b0100010..CTimer0_MAT2 input is selected + * 0b0100011..CTimer0_MAT3 input is selected + * 0b0100100..CTimer1_MAT1 input is selected + * 0b0100101..CTimer1_MAT2 input is selected + * 0b0100110..CTimer1_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer2_MAT1 input is selected + * 0b1010000..CTimer2_MAT2 input is selected + * 0b1010001..CTimer2_MAT3 input is selected + * 0b1010010..CTimer3_MAT1 input is selected + * 0b1010011..CTimer3_MAT2 input is selected + * 0b1010100..CTimer3_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_CTIMERE_CTIMER4CAP_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_CTIMERE_CTIMER4CAP_INP_SHIFT)) & INPUTMUX_CTIMERE_CTIMER4CAP_INP_MASK) +/*! @} */ + +/* The count of INPUTMUX_CTIMERE_CTIMER4CAP */ +#define INPUTMUX_CTIMERE_CTIMER4CAP_COUNT (4U) + +/*! @name TIMER4TRIG - Trigger register for TIMER4 */ +/*! @{ */ + +#define INPUTMUX_TIMER4TRIG_INP_MASK (0x7FU) +#define INPUTMUX_TIMER4TRIG_INP_SHIFT (0U) +/*! INP - Input number for CTIMER4 + * 0b0000000..Reserved + * 0b0000001..CT_IPN0 input is selected + * 0b0000010..CT_IPN1 input is selected + * 0b0000011..CT_IPN2 input is selected + * 0b0000100..CT_IPN3 input is selected + * 0b0000101..CT_IPN4 input is selected + * 0b0000110..CT_IPN5 input is selected + * 0b0000111..CT_IPN6 input is selected + * 0b0001000..CT_IPN7 input is selected + * 0b0001001..CT_IPN8 input is selected + * 0b0001010..CT_IPN9 input is selected + * 0b0001011..CT_IPN10 input is selected + * 0b0001100..CT_IPN11 input is selected + * 0b0001101..CT_IPN12 input is selected + * 0b0001110..CT_IPN13 input is selected + * 0b0001111..CT_IPN14 input is selected + * 0b0010000..CT_IPN15 input is selected + * 0b0010001..CT_IPN16 input is selected + * 0b0010010..CT_IPN17 input is selected + * 0b0010011..CT_IPN18 input is selected + * 0b0010100..CT_IPN19 input is selected + * 0b0010101..USB0 usb0 start of frame input is selected + * 0b0010110..AOI0_OUT0 input is selected + * 0b0010111..AOI0_OUT1 input is selected + * 0b0011000..AOI0_OUT2 input is selected + * 0b0011001..AOI0_OUT3 input is selected + * 0b0011010..ADC0_tcomp[0] + * 0b0011011..ADC0_tcomp[1] + * 0b0011100..ADC0_tcomp[2] + * 0b0011101..ADC0_tcomp[3] input is selected + * 0b0011110..CMP0_OUT is selected + * 0b0011111..CMP1_OUT is selected + * 0b0100000..Reserved + * 0b0100001..CTimer0_MAT1 input is selected + * 0b0100010..CTimer0_MAT2 input is selected + * 0b0100011..CTimer0_MAT3 input is selected + * 0b0100100..CTimer1_MAT1 input is selected + * 0b0100101..CTimer1_MAT2 input is selected + * 0b0100110..CTimer1_MAT3 input is selected + * 0b0100111..QDC0_CMP_FLAG0 is selected + * 0b0101000..QDC0_CMP_FLAG1 input is selected + * 0b0101001..QDC0_CMP_FLAG2 input is selected + * 0b0101010..QDC0_CMP_FLAG3 input is selected + * 0b0101011..QDC0_POS_MATCH0 input is selected + * 0b0101100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0101101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0101110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0101111..Reserved + * 0b0110000..LPI2C0 Master End of Packet input is selected + * 0b0110001..LPI2C0 Slave End of Packet input is selected + * 0b0110010..LPI2C1 Master End of Packet input is selected + * 0b0110011..LPI2C1 Slave End of Packet input is selected + * 0b0110100..LPSPI0 End of Frame input is selected + * 0b0110101..LPSPI0 Received Data Word input is selected + * 0b0110110..LPSPI1 End of Frame input is selected + * 0b0110111..LPSPI1 Received Data Word input is selected + * 0b0111000..LPUART0 Received Data Word input is selected + * 0b0111001..LPUART0 Transmitted Data Word input is selected + * 0b0111010..LPUART0 Receive Line Idle input is selected + * 0b0111011..LPUART1 Received Data Word input is selected + * 0b0111100..LPUART1 Transmitted Data Word input is selected + * 0b0111101..LPUART1 Receive Line Idle input is selected + * 0b0111110..LPUART2 Received Data Word input is selected + * 0b0111111..LPUART2 Transmitted Data Word input is selected + * 0b1000000..LPUART2 Receive Line Idle input is selected + * 0b1000001..LPUART3 Received Data Word input is selected + * 0b1000010..LPUART3 Transmitted Data Word input is selected + * 0b1000011..LPUART3 Receive Line Idle input is selected + * 0b1000100..LPUART4 Received Data Word input is selected + * 0b1000101..LPUART4 Transmitted Data Word input is selected + * 0b1000110..LPUART4 Receive Line Idle input is selected + * 0b1000111..AOI1_OUT0 input is selected + * 0b1001000..AOI1_OUT1 input is selected + * 0b1001001..AOI1_OUT2 input is selected + * 0b1001010..AOI1_OUT3 input is selected + * 0b1001011..ADC1_tcomp[0] input is selected + * 0b1001100..ADC1_tcomp[1] input is selected + * 0b1001101..ADC1_tcomp[2] input is selected + * 0b1001110..ADC1_tcomp[3] input is selected + * 0b1001111..CTimer2_MAT1 input is selected + * 0b1010000..CTimer2_MAT2 input is selected + * 0b1010001..CTimer2_MAT3 input is selected + * 0b1010010..CTimer3_MAT1 input is selected + * 0b1010011..CTimer3_MAT2 input is selected + * 0b1010100..CTimer3_MAT3 input is selected + * 0b1010101..QDC1_CMP_FLAG0 input is selected + * 0b1010110..QDC1_CMP_FLAG1 input is selected + * 0b1010111..QDC1_CMP_FLAG2 input is selected + * 0b1011000..QDC1_CMP_FLAG3 input is selected + * 0b1011001..QDC1_POS_MATCH0 input is selected + * 0b1011010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1011011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1011100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1011101..Reserved + * 0b1011110..LPI2C2 Master End of Packet input is selected + * 0b1011111..LPI2C2 Slave End of Packet input is selected + * 0b1100000..LPI2C3 Master End of Packet input is selected + * 0b1100001..LPI2C3 Slave End of Packet input is selected + * *.. + */ +#define INPUTMUX_TIMER4TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_TIMER4TRIG_INP_SHIFT)) & INPUTMUX_TIMER4TRIG_INP_MASK) +/*! @} */ + +/*! @name AOI1_INPUTM_AOI1_INPUT - AOI1 trigger input connections 0 */ +/*! @{ */ + +#define INPUTMUX_AOI1_INPUTM_AOI1_INPUT_INP_MASK (0x7FU) +#define INPUTMUX_AOI1_INPUTM_AOI1_INPUT_INP_SHIFT (0U) +/*! INP - AOI0 trigger input connections + * 0b0000000..Reserved + * 0b0000001..ADC0_tcomp[0] input is selected + * 0b0000010..ADC0_tcomp[1] input is selected + * 0b0000011..ADC0_tcomp[2] input is selected + * 0b0000100..ADC0_tcomp[3] input is selected + * 0b0000101..CMP0_OUT input is selected + * 0b0000110..CMP1_OUT input is selected + * 0b0000111..Reserved + * 0b0001000..CTimer0_MAT0 input is selected + * 0b0001001..CTimer0_MAT1 input is selected + * 0b0001010..CTimer0_MAT2 input is selected + * 0b0001011..CTimer0_MAT3 input is selected + * 0b0001100..CTimer1_MAT0 + * 0b0001101..CTimer1_MAT1 input is selected + * 0b0001110..CTimer1_MAT2 input is selected + * 0b0001111..CTimer1_MAT3 input is selected + * 0b0010000..CTimer2_MAT0 input is selected + * 0b0010001..CTimer2_MAT1 input is selected + * 0b0010010..CTimer2_MAT2 input is selected + * 0b0010011..CTimer2_MAT3 input is selected + * 0b0010100..LPTMR0 input is selected + * 0b0010101..Reserved + * 0b0010110..QDC0_CMP_FLAG0 input is selected + * 0b0010111..QDC0_CMP_FLAG1 input is selected + * 0b0011000..QDC0_CMP_FLAG2 input is selected + * 0b0011001..QDC0_CMP_FLAG3 input is selected + * 0b0011010..QDC0_POS_MATCH input is selected + * 0b0011011..PWM0_SM0_MUX_TRIG0 0 input is selected + * 0b0011100..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0011101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0011110..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0011111..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0100000..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0100001..Reserved + * 0b0100010..Reserved + * 0b0100011..TRIG_IN0 input is selected + * 0b0100100..TRIG_IN1 input is selected + * 0b0100101..TRIG_IN2 input is selected + * 0b0100110..TRIG_IN3 input is selected + * 0b0100111..TRIG_IN4 input is selected + * 0b0101000..TRIG_IN5 input is selected + * 0b0101001..TRIG_IN6 input is selected + * 0b0101010..TRIG_IN7 input is selected + * 0b0101011..TRIG_IN8 input is selected + * 0b0101100..TRIG_IN9 input is selected + * 0b0101101..TRIG_IN10 input is selected + * 0b0101110..TRIG_IN11 input is selected + * 0b0101111..GPIO0 Pin Event Trig 0 input is selected + * 0b0110000..GPIO1 Pin Event Trig 0 input is selected + * 0b0110001..GPIO2 Pin Event Trig 0 input is selected + * 0b0110010..GPIO3 Pin Event Trig 0 input is selected + * 0b0110011..GPIO4 Pin Event Trig 0 input is selected + * 0b0110100..ADC1_tcomp[0] input is selected + * 0b0110101..ADC1_tcomp[1] input is selected + * 0b0110110..ADC1_tcomp[2] input is selected + * 0b0110111..ADC1_tcomp[3] input is selected + * 0b0111000..CTimer3_MAT0 input is selected + * 0b0111001..CTimer3_MAT1 input is selected + * 0b0111010..CTimer3_MAT2 input is selected + * 0b0111011..CTimer3_MAT3 input is selected + * 0b0111100..CTimer4_MAT0 input is selected + * 0b0111101..CTimer4_MAT1 input is selected + * 0b0111110..CTimer4_MAT2 input is selected + * 0b0111111..CTimer4_MAT3 input is selected + * 0b1000000..FlexIO CH0 input is selected + * 0b1000001..FlexIO CH1 input is selected + * 0b1000010..FlexIO CH2 input is selected + * 0b1000011..FlexIO CH3 input is selected + * 0b1000100..QDC1_CMP_FLAG0 input is selected + * 0b1000101..QDC1_CMP_FLAG1 input is selected + * 0b1000110..QDC1_CMP_FLAG2 input is selected + * 0b1000111..QDC1_CMP_FLAG3 input is selected + * 0b1001000..QDC1_POS_MATCH0 input is selected + * 0b1001001..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1001010..PWM1_SM0_MUX_TRIG1 input is selected + * 0b1001011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1001100..PWM1_SM1_MUX_TRIG1 input is selected + * 0b1001101..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1001110..PWM1_SM2_MUX_TRIG1 input is selected + * 0b1001111..Reserved + * 0b1010000..Reserved + * *.. + */ +#define INPUTMUX_AOI1_INPUTM_AOI1_INPUT_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_AOI1_INPUTM_AOI1_INPUT_INP_SHIFT)) & INPUTMUX_AOI1_INPUTM_AOI1_INPUT_INP_MASK) +/*! @} */ + +/* The count of INPUTMUX_AOI1_INPUTM_AOI1_INPUT */ +#define INPUTMUX_AOI1_INPUTM_AOI1_INPUT_COUNT (16U) + +/*! @name CMP0_TRIG - CMP0 input connections */ +/*! @{ */ + +#define INPUTMUX_CMP0_TRIG_TRIGIN_MASK (0x3FU) +#define INPUTMUX_CMP0_TRIG_TRIGIN_SHIFT (0U) +/*! TRIGIN - CMP0 input trigger + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP1_OUT input is selected + * 0b000111..Reserved + * 0b001000..CTimer0_MAT0 input is selected + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer1_MAT0 + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer2_MAT0 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..LPTMR0 input is selected + * 0b001111..Reserved + * 0b010000..QDC0_POS_MATCH0 + * 0b010001..PWM0_SM0_MUX_TRIG0 input is selected + * 0b010010..PWM0_SM0_MUX_TRIG1 input is selected + * 0b010011..PWM0_SM1_MUX_TRIG0 input is selected + * 0b010100..PWM0_SM1_MUX_TRIG1 input is selected + * 0b010101..PWM0_SM2_MUX_TRIG0 input is selected + * 0b010110..PWM0_SM2_MUX_TRIG1 input is selected + * 0b010111..Reserved + * 0b011000..Reserved + * 0b011001..GPIO0 Pin Event Trig 0 input is selected + * 0b011010..GPIO1 Pin Event Trig 0 input is selected + * 0b011011..GPIO2 Pin Event Trig 0 input is selected + * 0b011100..GPIO3 Pin Event Trig 0 input is selected + * 0b011101..GPIO4 Pin Event Trig 0 input is selected + * 0b011110..WUU input is selected + * 0b011111..AOI1_OUT0 input is selected + * 0b100000..AOI1_OUT1 input is selected + * 0b100001..AOI1_OUT2 input is selected + * 0b100010..AOI1_OUT3 input is selected + * 0b100011..Reserved + * 0b100100..Reserved + * 0b100101..Reserved + * 0b100110..Reserved + * 0b100111..CTimer3_MAT0 + * 0b101000..CTimer3_MAT1 + * 0b101001..CTimer4_MAT0 input is selected + * 0b101010..CTimer4_MAT1 input is selected + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..Reserved + * 0b101110..Reserved + * 0b101111..QDC1_POS_MATCH0 input is selected + * 0b110000..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110001..PWM1_SM0_MUX_TRIG1 input is selected + * 0b110010..PWM1_SM1_MUX_TRIG0 input is selected + * 0b110011..PWM1_SM1_MUX_TRIG1 input is selected + * 0b110100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b110101..PWM1_SM2_MUX_TRIG1 input is selected + * 0b110110..Reserved + * 0b110111..Reserved + * *.. + */ +#define INPUTMUX_CMP0_TRIG_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_CMP0_TRIG_TRIGIN_SHIFT)) & INPUTMUX_CMP0_TRIG_TRIGIN_MASK) +/*! @} */ + +/*! @name ADC0_TRIGM_ADC0_TRIG - ADC Trigger input connections */ +/*! @{ */ + +#define INPUTMUX_ADC0_TRIGM_ADC0_TRIG_TRIGIN_MASK (0x3FU) +#define INPUTMUX_ADC0_TRIGM_ADC0_TRIG_TRIGIN_SHIFT (0U) +/*! TRIGIN - ADC0 trigger inputs + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT0 input is selected + * 0b001010..CTimer0_MAT1 input is selected + * 0b001011..CTimer1_MAT0 input is selected + * 0b001100..CTimer1_MAT1 input is selected + * 0b001101..CTimer2_MAT0 input is selected + * 0b001110..CTimer2_MAT1 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..QDC0_POS_MATCH0 input is selected + * 0b010010..PWM0_SM0_OUT_TRIG0 input is selected + * 0b010011..PWM0_SM0_OUT_TRIG1 input is selected + * 0b010100..PWM0_SM1_OUT_TRIG0 input is selected + * 0b010101..PWM0_SM1_OUT_TRIG1 input is selected + * 0b010110..PWM0_SM2_OUT_TRIG0 input is selected + * 0b010111..PWM0_SM2_OUT_TRIG1 input is selected + * 0b011000..Reserved + * 0b011001..Reserved + * 0b011010..GPIO0 Pin Event Trig 0 input is selected + * 0b011011..GPIO1 Pin Event Trig 0 input is selected + * 0b011100..GPIO2 Pin Event Trig 0 input is selected + * 0b011101..GPIO3 Pin Event Trig 0 input is selected + * 0b011110..GPIO4 Pin Event Trig 0 input is selected + * 0b011111..WUU + * 0b100000..Reserved + * 0b100001..AOI1_OUT0 input is selected + * 0b100010..AOI1_OUT1 input is selected + * 0b100011..AOI1_OUT2 input is selected + * 0b100100..AOI1_OUT3 input is selected + * 0b100101..ADC1_tcomp[0] input is selected + * 0b100110..ADC1_tcomp[1] input is selected + * 0b100111..ADC1_tcomp[2] input is selected + * 0b101000..ADC1_tcomp[3] input is selected + * 0b101001..CTimer3_MAT0 input is selected + * 0b101010..CTimer3_MAT1 input is selected + * 0b101011..CTimer4_MAT0 input is selected + * 0b101100..CTimer4_MAT1 input is selected + * 0b101101..FlexIO CH0 input is selected + * 0b101110..FlexIO CH1 input is selected + * 0b101111..FlexIO CH2 input is selected + * 0b110000..FlexIO CH3 input is selected + * 0b110001..QDC1_POS_MATCH0 input is selected + * 0b110010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110011..PWM1_SM0_MUX_TRIG1 input is selected + * 0b110100..PWM1_SM1_MUX_TRIG0 input is selected + * 0b110101..PWM1_SM1_MUX_TRIG1 input is selected + * 0b110110..PWM1_SM2_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111000..Reserved + * 0b111001..Reserved + * *.. + */ +#define INPUTMUX_ADC0_TRIGM_ADC0_TRIG_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_ADC0_TRIGM_ADC0_TRIG_TRIGIN_SHIFT)) & INPUTMUX_ADC0_TRIGM_ADC0_TRIG_TRIGIN_MASK) +/*! @} */ + +/* The count of INPUTMUX_ADC0_TRIGM_ADC0_TRIG */ +#define INPUTMUX_ADC0_TRIGM_ADC0_TRIG_COUNT (4U) + +/*! @name ADC1_TRIGM_ADC1_TRIG - ADC Trigger input connections */ +/*! @{ */ + +#define INPUTMUX_ADC1_TRIGM_ADC1_TRIG_TRIGIN_MASK (0x3FU) +#define INPUTMUX_ADC1_TRIGM_ADC1_TRIG_TRIGIN_SHIFT (0U) +/*! TRIGIN - ADC0 trigger inputs + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT0 input is selected + * 0b001010..CTimer0_MAT1 input is selected + * 0b001011..CTimer1_MAT0 input is selected + * 0b001100..CTimer1_MAT1 input is selected + * 0b001101..CTimer2_MAT0 input is selected + * 0b001110..CTimer2_MAT1 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..QDC0_POS_MATCH0 input is selected + * 0b010010..PWM0_SM0_OUT_TRIG0 input is selected + * 0b010011..PWM0_SM0_OUT_TRIG1 input is selected + * 0b010100..PWM0_SM1_OUT_TRIG0 input is selected + * 0b010101..PWM0_SM1_OUT_TRIG1 input is selected + * 0b010110..PWM0_SM2_OUT_TRIG0 input is selected + * 0b010111..PWM0_SM2_OUT_TRIG1 input is selected + * 0b011000..Reserved + * 0b011001..Reserved + * 0b011010..GPIO0 Pin Event Trig 0 input is selected + * 0b011011..GPIO1 Pin Event Trig 0 input is selected + * 0b011100..GPIO2 Pin Event Trig 0 input is selected + * 0b011101..GPIO3 Pin Event Trig 0 input is selected + * 0b011110..GPIO4 Pin Event Trig 0 input is selected + * 0b011111..WUU + * 0b100000..Reserved + * 0b100001..AOI1_OUT0 input is selected + * 0b100010..AOI1_OUT1 input is selected + * 0b100011..AOI1_OUT2 input is selected + * 0b100100..AOI1_OUT3 input is selected + * 0b100101..ADC0_tcomp[0] input is selected + * 0b100110..ADC0_tcomp[1] input is selected + * 0b100111..ADC0_tcomp[2] input is selected + * 0b101000..ADC0_tcomp[3] input is selected + * 0b101001..CTimer3_MAT0 input is selected + * 0b101010..CTimer3_MAT1 input is selected + * 0b101011..CTimer4_MAT0 input is selected + * 0b101100..CTimer4_MAT1 input is selected + * 0b101101..FlexIO CH0 input is selected + * 0b101110..FlexIO CH1 input is selected + * 0b101111..FlexIO CH2 input is selected + * 0b110000..FlexIO CH3 input is selected + * 0b110001..QDC1_POS_MATCH0 input is selected + * 0b110010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110011..PWM1_SM0_MUX_TRIG1 input is selected + * 0b110100..PWM1_SM1_MUX_TRIG0 input is selected + * 0b110101..PWM1_SM1_MUX_TRIG1 input is selected + * 0b110110..PWM1_SM2_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111000..Reserved + * 0b111001..Reserved + * *.. + */ +#define INPUTMUX_ADC1_TRIGM_ADC1_TRIG_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_ADC1_TRIGM_ADC1_TRIG_TRIGIN_SHIFT)) & INPUTMUX_ADC1_TRIGM_ADC1_TRIG_TRIGIN_MASK) +/*! @} */ + +/* The count of INPUTMUX_ADC1_TRIGM_ADC1_TRIG */ +#define INPUTMUX_ADC1_TRIGM_ADC1_TRIG_COUNT (4U) + +/*! @name DAC0_TRIG - This register selects the DAC0 trigger inputs. */ +/*! @{ */ + +#define INPUTMUX_DAC0_TRIG_TRIGIN_MASK (0x3FU) +#define INPUTMUX_DAC0_TRIG_TRIGIN_SHIFT (0U) +/*! TRIGIN - DAC0 trigger input + * 0b000000..Reserved + * 0b000001..ARM_TXEV + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT0 input is selected + * 0b001010..CTimer0_MAT1 input is selected + * 0b001011..CTimer1_MAT0 input is selected + * 0b001100..CTimer1_MAT1 input is selected + * 0b001101..CTimer2_MAT0 input is selected + * 0b001110..CTimer2_MAT1 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..Reserved + * 0b010010..Reserved + * 0b010011..Reserved + * 0b010100..Reserved + * 0b010101..Reserved + * 0b010110..Reserved + * 0b010111..Reserved + * 0b011000..Reserved + * 0b011001..Reserved + * 0b011010..GPIO0 Pin Event Trig 0 input is selected + * 0b011011..GPIO1 Pin Event Trig 0 input is selected + * 0b011100..GPIO2 Pin Event Trig 0 input is selected + * 0b011101..GPIO3 Pin Event Trig 0 input is selected + * 0b011110..GPIO4 Pin Event Trig 0 input is selected + * 0b011111..WUU input is selected + * 0b100000..Reserved + * 0b100001..AOI1_OUT0 input is selected + * 0b100010..AOI1_OUT1 input is selected + * 0b100011..AOI1_OUT2 input is selected + * 0b100100..AOI1_OUT3 input is selected + * 0b100101..ADC0_tcomp[0] input is selected + * 0b100110..ADC0_tcomp[1] input is selected + * 0b100111..ADC1_tcomp[0] input is selected + * 0b101000..ADC1_tcomp[1] input is selected + * 0b101001..CTimer3_MAT0 input is selected + * 0b101010..CTimer3_MAT1 input is selected + * 0b101011..CTimer4_MAT0 input is selected + * 0b101100..CTimer4_MAT1 input is selected + * 0b101101..Reserved + * 0b101110..Reserved + * 0b101111..Reserved + * 0b110000..Reserved + * 0b110001..Reserved + * 0b110010..Reserved + * 0b110011..Reserved + * 0b110100..Reserved + * 0b110101..Reserved + * 0b110110..Reserved + * 0b110111..Reserved + * 0b111000..Reserved + * 0b111001..Reserved + * *.. + */ +#define INPUTMUX_DAC0_TRIG_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DAC0_TRIG_TRIGIN_SHIFT)) & INPUTMUX_DAC0_TRIG_TRIGIN_MASK) +/*! @} */ + +/*! @name QDC0_TRIG - QDC0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC0_TRIG_INP_MASK (0x7FU) +#define INPUTMUX_QDC0_TRIG_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC0_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC0_TRIG_INP_SHIFT)) & INPUTMUX_QDC0_TRIG_INP_MASK) +/*! @} */ + +/*! @name QDC0_HOME - QDC0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC0_HOME_INP_MASK (0x7FU) +#define INPUTMUX_QDC0_HOME_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC0_HOME_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC0_HOME_INP_SHIFT)) & INPUTMUX_QDC0_HOME_INP_MASK) +/*! @} */ + +/*! @name QDC0_INDEX - QDC0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC0_INDEX_INP_MASK (0x7FU) +#define INPUTMUX_QDC0_INDEX_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC0_INDEX_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC0_INDEX_INP_SHIFT)) & INPUTMUX_QDC0_INDEX_INP_MASK) +/*! @} */ + +/*! @name QDC0_PHASEB - QDC0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC0_PHASEB_INP_MASK (0x7FU) +#define INPUTMUX_QDC0_PHASEB_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC0_PHASEB_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC0_PHASEB_INP_SHIFT)) & INPUTMUX_QDC0_PHASEB_INP_MASK) +/*! @} */ + +/*! @name QDC0_PHASEA - QDC0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC0_PHASEA_INP_MASK (0x7FU) +#define INPUTMUX_QDC0_PHASEA_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC0_PHASEA_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC0_PHASEA_INP_SHIFT)) & INPUTMUX_QDC0_PHASEA_INP_MASK) +/*! @} */ + +/*! @name QDC0_ICAP1 - QDC0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC0_ICAP1_INP_MASK (0x7FU) +#define INPUTMUX_QDC0_ICAP1_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC0_ICAP1_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC0_ICAP1_INP_SHIFT)) & INPUTMUX_QDC0_ICAP1_INP_MASK) +/*! @} */ + +/*! @name QDC0_ICAP2 - QDC0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC0_ICAP2_INP_MASK (0x7FU) +#define INPUTMUX_QDC0_ICAP2_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC0_ICAP2_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC0_ICAP2_INP_SHIFT)) & INPUTMUX_QDC0_ICAP2_INP_MASK) +/*! @} */ + +/*! @name QDC0_ICAP3 - QDC0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC0_ICAP3_INP_MASK (0x7FU) +#define INPUTMUX_QDC0_ICAP3_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC0_ICAP3_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC0_ICAP3_INP_SHIFT)) & INPUTMUX_QDC0_ICAP3_INP_MASK) +/*! @} */ + +/*! @name QDC1_TRIG - QDC1 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC1_TRIG_INP_MASK (0x7FU) +#define INPUTMUX_QDC1_TRIG_INP_SHIFT (0U) +/*! INP - QDC1 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC1_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC1_TRIG_INP_SHIFT)) & INPUTMUX_QDC1_TRIG_INP_MASK) +/*! @} */ + +/*! @name QDC1_HOME - QDC1 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC1_HOME_INP_MASK (0x7FU) +#define INPUTMUX_QDC1_HOME_INP_SHIFT (0U) +/*! INP - QDC1 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC1_HOME_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC1_HOME_INP_SHIFT)) & INPUTMUX_QDC1_HOME_INP_MASK) +/*! @} */ + +/*! @name QDC1_INDEX - QDC1 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC1_INDEX_INP_MASK (0x7FU) +#define INPUTMUX_QDC1_INDEX_INP_SHIFT (0U) +/*! INP - QDC1 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC1_INDEX_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC1_INDEX_INP_SHIFT)) & INPUTMUX_QDC1_INDEX_INP_MASK) +/*! @} */ + +/*! @name QDC1_PHASEB - QDC1 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC1_PHASEB_INP_MASK (0x7FU) +#define INPUTMUX_QDC1_PHASEB_INP_SHIFT (0U) +/*! INP - QDC1 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC1_PHASEB_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC1_PHASEB_INP_SHIFT)) & INPUTMUX_QDC1_PHASEB_INP_MASK) +/*! @} */ + +/*! @name QDC1_PHASEA - QDC1 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC1_PHASEA_INP_MASK (0x7FU) +#define INPUTMUX_QDC1_PHASEA_INP_SHIFT (0U) +/*! INP - QDC0 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC1_PHASEA_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC1_PHASEA_INP_SHIFT)) & INPUTMUX_QDC1_PHASEA_INP_MASK) +/*! @} */ + +/*! @name QDC1_ICAP1 - QDC1 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC1_ICAP1_INP_MASK (0x7FU) +#define INPUTMUX_QDC1_ICAP1_INP_SHIFT (0U) +/*! INP - QDC1 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC1_ICAP1_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC1_ICAP1_INP_SHIFT)) & INPUTMUX_QDC1_ICAP1_INP_MASK) +/*! @} */ + +/*! @name QDC1_ICAP2 - QDC1 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC1_ICAP2_INP_MASK (0x7FU) +#define INPUTMUX_QDC1_ICAP2_INP_SHIFT (0U) +/*! INP - QDC1 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC1_ICAP2_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC1_ICAP2_INP_SHIFT)) & INPUTMUX_QDC1_ICAP2_INP_MASK) +/*! @} */ + +/*! @name QDC1_ICAP3 - QDC1 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_QDC1_ICAP3_INP_MASK (0x7FU) +#define INPUTMUX_QDC1_ICAP3_INP_SHIFT (0U) +/*! INP - QDC1 input connections + * 0b0000000..Reserved + * 0b0000001..ARM_TXEV input is selected + * 0b0000010..AOI0_OUT0 input is selected + * 0b0000011..AOI0_OUT1 input is selected + * 0b0000100..AOI0_OUT2 input is selected + * 0b0000101..AOI0_OUT3 input is selected + * 0b0000110..CMP0_OUT input is selected + * 0b0000111..CMP1_OUT input is selected + * 0b0001000..Reserved + * 0b0001001..CTimer0_MAT2 input is selected + * 0b0001010..CTimer0_MAT3 + * 0b0001011..CTimer1_MAT2 input is selected + * 0b0001100..CTimer1_MAT3 input is selected + * 0b0001101..CTimer2_MAT2 input is selected + * 0b0001110..CTimer2_MAT3 input is selected + * 0b0001111..Reserved + * 0b0010000..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010001..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0010010..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010011..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0010100..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0010110..Reserved + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..TRIG_IN8 input is selected + * 0b0100001..TRIG_IN9 input is selected + * 0b0100010..TRIG_IN10 input is selected + * 0b0100011..TRIG_IN11 input is selected + * 0b0100100..GPIO0 Pin Event Trig 0 is selected + * 0b0100101..GPIO1 Pin Event Trig 0 input is selected + * 0b0100110..GPIO2 Pin Event Trig 0 input is selected + * 0b0100111..GPIO3 Pin Event Trig 0 input is selected + * 0b0101000..GPIO4 Pin Event Trig 0 input is selected + * 0b0101001..AOI1_OUT0 input is selected + * 0b0101010..AOI1_OUT1 input is selected + * 0b0101011..AOI1_OUT2 input is selected + * 0b0101100..AOI1_OUT3 input is selected + * 0b0101101..Reserved + * 0b0101110..Reserved + * 0b0101111..Reserved + * 0b0110000..Reserved + * 0b0110001..CTimer3_MAT2 input is selected + * 0b0110010..CTimer3_MAT3 input is selected + * 0b0110011..CTimer4_MAT2 input is selected + * 0b0110100..CTimer4_MAT3 End of Frame input is selected + * 0b0110101..Reserved + * 0b0110110..Reserved + * 0b0110111..Reserved + * 0b0111000..Reserved + * 0b0111001..Reserved + * 0b0111010..Reserved + * 0b0111011..Reserved + * 0b0111100..Reserved + * 0b0111101..Reserved + * 0b0111110..PWM1_SM0_OUT_TRIG0 input is selected + * 0b0111111..PWM1_SM0_OUT_TRIG1 input is selected + * 0b1000000..PWM1_SM1_OUT_TRIG0 input is selected + * 0b1000001..PWM1_SM1_OUT_TRIG1 input is selected + * 0b1000010..PWM1_SM2_OUT_TRIG0 input is selected + * 0b1000011..PWM1_SM2_OUT_TRIG1 input is selected + * 0b1000100..Reserved + * 0b1000101..Reserved + * *.. + */ +#define INPUTMUX_QDC1_ICAP3_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_QDC1_ICAP3_INP_SHIFT)) & INPUTMUX_QDC1_ICAP3_INP_MASK) +/*! @} */ + +/*! @name FLEXPWM0_SM0_EXTA0 - PWM0 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM0_SM0_EXTA0_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM0_SM0_EXTA0_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTA input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM1_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM1_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM1_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM0_SM0_EXTA0_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM0_SM0_EXTA0_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM0_SM0_EXTA0_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM0_SM0_EXTSYNC - PWM0 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM0_SM0_EXTSYNC_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM0_SM0_EXTSYNC_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTSYNC input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM1_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM1_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM1_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM0_SM0_EXTSYNC_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM0_SM0_EXTSYNC_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM0_SM0_EXTSYNC_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM0_SM1_EXTA - PWM0 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM0_SM1_EXTA_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM0_SM1_EXTA_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTA input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM1_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM1_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM1_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM0_SM1_EXTA_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM0_SM1_EXTA_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM0_SM1_EXTA_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM0_SM1_EXTSYNC - PWM0 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM0_SM1_EXTSYNC_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM0_SM1_EXTSYNC_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTSYNC input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM1_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM1_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM1_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM0_SM1_EXTSYNC_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM0_SM1_EXTSYNC_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM0_SM1_EXTSYNC_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM0_SM2_EXTA - PWM0 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM0_SM2_EXTA_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM0_SM2_EXTA_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTA input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM1_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM1_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM1_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM0_SM2_EXTA_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM0_SM2_EXTA_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM0_SM2_EXTA_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM0_SM2_EXTSYNC - PWM0 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM0_SM2_EXTSYNC_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM0_SM2_EXTSYNC_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTSYNC input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM1_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM1_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM1_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM0_SM2_EXTSYNC_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM0_SM2_EXTSYNC_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM0_SM2_EXTSYNC_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM0_FAULT - PWM0 Fault Input Trigger Connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM0_FAULT_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM0_FAULT_TRIGIN_SHIFT (0U) +/*! TRIGIN - FAULT input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM1_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM1_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM1_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM0_FAULT_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM0_FAULT_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM0_FAULT_TRIGIN_MASK) +/*! @} */ + +/* The count of INPUTMUX_FLEXPWM0_FAULT */ +#define INPUTMUX_FLEXPWM0_FAULT_COUNT (4U) + +/*! @name FLEXPWM0_FORCE - PWM0 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM0_FORCE_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM0_FORCE_TRIGIN_SHIFT (0U) +/*! TRIGIN - Trigger input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM1_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM1_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM1_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM0_FORCE_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM0_FORCE_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM0_FORCE_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM1_SM0_EXTA0 - PWM1 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM1_SM0_EXTA0_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM1_SM0_EXTA0_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTA input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM0_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM0_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM0_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM0_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM0_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM0_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM1_SM0_EXTA0_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM1_SM0_EXTA0_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM1_SM0_EXTA0_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM1_SM0_EXTSYNC - PWM1 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM1_SM0_EXTSYNC_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM1_SM0_EXTSYNC_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTSYNC input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM0_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM0_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM0_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM0_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM0_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM0_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM1_SM0_EXTSYNC_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM1_SM0_EXTSYNC_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM1_SM0_EXTSYNC_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM1_SM1_EXTA - PWM1 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM1_SM1_EXTA_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM1_SM1_EXTA_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTA input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM0_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM0_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM0_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM0_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM0_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM0_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM1_SM1_EXTA_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM1_SM1_EXTA_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM1_SM1_EXTA_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM1_SM1_EXTSYNC - PWM1 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM1_SM1_EXTSYNC_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM1_SM1_EXTSYNC_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTSYNC input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM0_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM0_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM0_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM0_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM0_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM0_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM1_SM1_EXTSYNC_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM1_SM1_EXTSYNC_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM1_SM1_EXTSYNC_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM1_SM2_EXTA - PWM1 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM1_SM2_EXTA_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM1_SM2_EXTA_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTA input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM0_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM0_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM0_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM0_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM0_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM0_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM1_SM2_EXTA_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM1_SM2_EXTA_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM1_SM2_EXTA_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM1_SM2_EXTSYNC - PWM1 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM1_SM2_EXTSYNC_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM1_SM2_EXTSYNC_TRIGIN_SHIFT (0U) +/*! TRIGIN - EXTSYNC input connections for PWM0 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM0_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM0_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM0_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM0_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM0_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM0_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM1_SM2_EXTSYNC_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM1_SM2_EXTSYNC_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM1_SM2_EXTSYNC_TRIGIN_MASK) +/*! @} */ + +/*! @name FLEXPWM1_FAULT - PWM1 Fault Input Trigger Connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM1_FAULT_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM1_FAULT_TRIGIN_SHIFT (0U) +/*! TRIGIN - FAULT input connections for PWM1 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM0_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM0_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM0_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM0_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM0_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM0_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM1_FAULT_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM1_FAULT_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM1_FAULT_TRIGIN_MASK) +/*! @} */ + +/* The count of INPUTMUX_FLEXPWM1_FAULT */ +#define INPUTMUX_FLEXPWM1_FAULT_COUNT (4U) + +/*! @name FLEXPWM1_FORCE - PWM1 input trigger connections */ +/*! @{ */ + +#define INPUTMUX_FLEXPWM1_FORCE_TRIGIN_MASK (0x3FU) +#define INPUTMUX_FLEXPWM1_FORCE_TRIGIN_SHIFT (0U) +/*! TRIGIN - Trigger input connections for PWM1 + * 0b000000..Reserved + * 0b000001..ARM_TXEV input is selected + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..QDC0_CMP_FLAG0 input is selected + * 0b010000..QDC0_CMP_FLAG1 input is selected + * 0b010001..QDC0_CMP_FLAG2 input is selected + * 0b010010..QDC0_CMP_FLAG3 input is selected + * 0b010011..QDC0_POS_MATCH0 input is selected + * 0b010100..TRIG_IN0 input is selected + * 0b010101..TRIG_IN1 input is selected + * 0b010110..TRIG_IN2 input is selected + * 0b010111..TRIG_IN3 input is selected + * 0b011000..TRIG_IN4 input is selected + * 0b011001..TRIG_IN5 input is selected + * 0b011010..TRIG_IN6 input is selected + * 0b011011..TRIG_IN7 input is selected + * 0b011100..TRIG_IN8 input is selected + * 0b011101..TRIG_IN9 input is selected + * 0b011110..TRIG_IN10 input is selected + * 0b011111..TRIG_IN11 input is selected + * 0b100000..GPIO0 Pin Event Trig 0 input is selected + * 0b100001..GPIO1 Pin Event Trig 0 input is selected + * 0b100010..GPIO2 Pin Event Trig 0 input is selected + * 0b100011..GPIO3 Pin Event Trig 0 input is selected + * 0b100100..GPIO4 Pin Event Trig 0 input is selected + * 0b100101..AOI1_OUT0 input is selected + * 0b100110..AOI1_OUT1 input is selected + * 0b100111..AOI1_OUT2 input is selected + * 0b101000..AOI1_OUT3 input is selected + * 0b101001..Reserved + * 0b101010..Reserved + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..CTimer3_MAT2 input is selected + * 0b101110..CTimer3_MAT3 input is selected + * 0b101111..CTimer4_MAT2 input is selected + * 0b110000..CTimer4_MAT3 input is selected + * 0b110001..QDC1_CMP_FLAG0 input is selected + * 0b110010..QDC1_CMP_FLAG1 input is selected + * 0b110011..QDC1_CMP_FLAG2 input is selected + * 0b110100..QDC1_CMP_FLAG3 input is selected + * 0b110101..QDC1_POS_MATCH0 input is selected + * 0b110110..PWM0_SM0_MUX_TRIG0 input is selected + * 0b110111..PWM0_SM0_MUX_TRIG1 input is selected + * 0b111000..PWM0_SM1_MUX_TRIG0 input is selected + * 0b111001..PWM0_SM1_MUX_TRIG1 input is selected + * 0b111010..PWM0_SM2_MUX_TRIG0 input is selected + * 0b111011..PWM0_SM2_MUX_TRIG1 input is selected + * 0b111100..Reserved + * 0b111101..Reserved + * *.. + */ +#define INPUTMUX_FLEXPWM1_FORCE_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXPWM1_FORCE_TRIGIN_SHIFT)) & INPUTMUX_FLEXPWM1_FORCE_TRIGIN_MASK) +/*! @} */ + +/*! @name PWM0_EXT_CLK - PWM0 external clock trigger */ +/*! @{ */ + +#define INPUTMUX_PWM0_EXT_CLK_TRIGIN_MASK (0xFU) +#define INPUTMUX_PWM0_EXT_CLK_TRIGIN_SHIFT (0U) +/*! TRIGIN - Trigger input connections for PWM + * 0b0000..Reserved + * 0b0001..clk_16k[1] input is selected + * 0b0010..clk_in input is selected + * 0b0011..AOI0_OUT0 input is selected + * 0b0100..AOI0_OUT1 input is selected + * 0b0101..EXTTRIG_IN0 input is selected + * 0b0110..EXTTRIG_IN7 input is selected + * 0b0111..AOI1_OUT0 input is selected + * 0b1000..AOI1_OUT1 input is selected + * *.. + */ +#define INPUTMUX_PWM0_EXT_CLK_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_PWM0_EXT_CLK_TRIGIN_SHIFT)) & INPUTMUX_PWM0_EXT_CLK_TRIGIN_MASK) +/*! @} */ + +/*! @name PWM1_EXT_CLK - PWM1 external clock trigger */ +/*! @{ */ + +#define INPUTMUX_PWM1_EXT_CLK_TRIGIN_MASK (0xFU) +#define INPUTMUX_PWM1_EXT_CLK_TRIGIN_SHIFT (0U) +/*! TRIGIN - Trigger input connections for PWM + * 0b0000..Reserved + * 0b0001..clk_16k[1] input is selected + * 0b0010..clk_in input is selected + * 0b0011..AOI0_OUT0 input is selected + * 0b0100..AOI0_OUT1 input is selected + * 0b0101..EXTTRIG_IN0 input is selected + * 0b0110..EXTTRIG_IN7 input is selected + * 0b0111..AOI1_OUT0 input is selected + * 0b1000..AOI1_OUT1 input is selected + * *.. + */ +#define INPUTMUX_PWM1_EXT_CLK_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_PWM1_EXT_CLK_TRIGIN_SHIFT)) & INPUTMUX_PWM1_EXT_CLK_TRIGIN_MASK) +/*! @} */ + +/*! @name AOI0_INPUTK_AOI0_INPUT - AOI0 trigger input connections 0 */ +/*! @{ */ + +#define INPUTMUX_AOI0_INPUTK_AOI0_INPUT_INP_MASK (0x7FU) +#define INPUTMUX_AOI0_INPUTK_AOI0_INPUT_INP_SHIFT (0U) +/*! INP - AOI0 trigger input connections + * 0b0000000..Reserved + * 0b0000001..ADC0_tcomp[0] input is selected + * 0b0000010..ADC0_tcomp[1] input is selected + * 0b0000011..ADC0_tcomp[2] input is selected + * 0b0000100..ADC0_tcomp[3] input is selected + * 0b0000101..CMP0_OUT input is selected + * 0b0000110..CMP1_OUT input is selected + * 0b0000111..Reserved + * 0b0001000..CTimer0_MAT0 input is selected + * 0b0001001..CTimer0_MAT1 input is selected + * 0b0001010..CTimer0_MAT2 input is selected + * 0b0001011..CTimer0_MAT3 input is selected + * 0b0001100..CTimer1_MAT0 + * 0b0001101..CTimer1_MAT1 input is selected + * 0b0001110..CTimer1_MAT2 input is selected + * 0b0001111..CTimer1_MAT3 input is selected + * 0b0010000..CTimer2_MAT0 input is selected + * 0b0010001..CTimer2_MAT1 input is selected + * 0b0010010..CTimer2_MAT2 input is selected + * 0b0010011..CTimer2_MAT3 input is selected + * 0b0010100..LPTMR0 input is selected + * 0b0010101..Reserved + * 0b0010110..QDC0_CMP_FLAG0 input is selected + * 0b0010111..QDC0_CMP_FLAG1 input is selected + * 0b0011000..QDC0_CMP_FLAG2 input is selected + * 0b0011001..QDC0_CMP_FLAG3 input is selected + * 0b0011010..QDC0_POS_MATCH input is selected + * 0b0011011..PWM0_SM0_MUX_TRIG0 0 input is selected + * 0b0011100..PWM0_SM0_MUX_TRIG1 input is selected + * 0b0011101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0011110..PWM0_SM1_MUX_TRIG1 input is selected + * 0b0011111..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0100000..PWM0_SM2_MUX_TRIG1 input is selected + * 0b0100001..Reserved + * 0b0100010..Reserved + * 0b0100011..TRIG_IN0 input is selected + * 0b0100100..TRIG_IN1 input is selected + * 0b0100101..TRIG_IN2 input is selected + * 0b0100110..TRIG_IN3 input is selected + * 0b0100111..TRIG_IN4 input is selected + * 0b0101000..TRIG_IN5 input is selected + * 0b0101001..TRIG_IN6 input is selected + * 0b0101010..TRIG_IN7 input is selected + * 0b0101011..TRIG_IN8 input is selected + * 0b0101100..TRIG_IN9 input is selected + * 0b0101101..TRIG_IN10 input is selected + * 0b0101110..TRIG_IN11 input is selected + * 0b0101111..GPIO0 Pin Event Trig 0 input is selected + * 0b0110000..GPIO1 Pin Event Trig 0 input is selected + * 0b0110001..GPIO2 Pin Event Trig 0 input is selected + * 0b0110010..GPIO3 Pin Event Trig 0 input is selected + * 0b0110011..GPIO4 Pin Event Trig 0 input is selected + * 0b0110100..ADC1_tcomp[0] input is selected + * 0b0110101..ADC1_tcomp[1] input is selected + * 0b0110110..ADC1_tcomp[2] input is selected + * 0b0110111..ADC1_tcomp[3] input is selected + * 0b0111000..CTimer3_MAT0 input is selected + * 0b0111001..CTimer3_MAT1 input is selected + * 0b0111010..CTimer3_MAT2 input is selected + * 0b0111011..CTimer3_MAT3 input is selected + * 0b0111100..CTimer4_MAT0 input is selected + * 0b0111101..CTimer4_MAT1 input is selected + * 0b0111110..CTimer4_MAT2 input is selected + * 0b0111111..CTimer4_MAT3 input is selected + * 0b1000000..FlexIO CH0 input is selected + * 0b1000001..FlexIO CH1 input is selected + * 0b1000010..FlexIO CH2 input is selected + * 0b1000011..FlexIO CH3 input is selected + * 0b1000100..QDC1_CMP_FLAG0 input is selected + * 0b1000101..QDC1_CMP_FLAG1 input is selected + * 0b1000110..QDC1_CMP_FLAG2 input is selected + * 0b1000111..QDC1_CMP_FLAG3 input is selected + * 0b1001000..QDC1_POS_MATCH0 input is selected + * 0b1001001..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1001010..PWM1_SM0_MUX_TRIG1 input is selected + * 0b1001011..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1001100..PWM1_SM1_MUX_TRIG1 input is selected + * 0b1001101..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1001110..PWM1_SM2_MUX_TRIG1 input is selected + * 0b1001111..Reserved + * 0b1010000..Reserved + * *.. + */ +#define INPUTMUX_AOI0_INPUTK_AOI0_INPUT_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_AOI0_INPUTK_AOI0_INPUT_INP_SHIFT)) & INPUTMUX_AOI0_INPUTK_AOI0_INPUT_INP_MASK) +/*! @} */ + +/* The count of INPUTMUX_AOI0_INPUTK_AOI0_INPUT */ +#define INPUTMUX_AOI0_INPUTK_AOI0_INPUT_COUNT (16U) + +/*! @name USBFS_TRIG - USB-FS trigger input connections */ +/*! @{ */ + +#define INPUTMUX_USBFS_TRIG_INP_MASK (0xFU) +#define INPUTMUX_USBFS_TRIG_INP_SHIFT (0U) +/*! INP - USB-FS trigger input connections. + * 0b0000..Reserved + * 0b0001..LPUART0 lpuart_trg_txdata input is selected + * 0b0010..LPUART1 lpuart_trg_txdata input is selected + * 0b0011..LPUART2 lpuart_trg_txdata input is selected + * 0b0100..LPUART3 lpuart_trg_txdata input is selected + * 0b0101..LPUART4 lpuart_trg_txda input is selected + * *.. + */ +#define INPUTMUX_USBFS_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_USBFS_TRIG_INP_SHIFT)) & INPUTMUX_USBFS_TRIG_INP_MASK) +/*! @} */ + +/*! @name EXT_TRIG0 - EXT trigger connections 0 */ +/*! @{ */ + +#define INPUTMUX_EXT_TRIG0_INP_MASK (0x1FU) +#define INPUTMUX_EXT_TRIG0_INP_SHIFT (0U) +/*! INP - EXT trigger input connections + * 0b00000..Reserved + * 0b00001..Reserved + * 0b00010..AOI0_OUT0 input is selected + * 0b00011..AOI0_OUT1 input is selected + * 0b00100..AOI0_OUT2 input is selected + * 0b00101..AOI0_OUT3 input is selected + * 0b00110..CMP0_OUT input is selected + * 0b00111..CMP1_OUT input is selected + * 0b01000..Reserved + * 0b01001..LPUART0 input is selected + * 0b01010..LPUART1 input is selected + * 0b01011..LPUART2 input is selected + * 0b01100..LPUART3 input is selected + * 0b01101..LPUART4 input is selected + * 0b01110..AOI1_OUT0 input is selected + * 0b01111..AOI1_OUT1 input is selected + * 0b10000..AOI1_OUT2 input is selected + * 0b10001..AOI1_OUT3 input is selected + * *.. + */ +#define INPUTMUX_EXT_TRIG0_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_EXT_TRIG0_INP_SHIFT)) & INPUTMUX_EXT_TRIG0_INP_MASK) +/*! @} */ + +/*! @name CMP1_TRIG - CMP1 input connections */ +/*! @{ */ + +#define INPUTMUX_CMP1_TRIG_TRIGIN_MASK (0x3FU) +#define INPUTMUX_CMP1_TRIG_TRIGIN_SHIFT (0U) +/*! TRIGIN - CMP0 input trigger + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..Reserved + * 0b001000..CTimer0_MAT0 input is selected + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer1_MAT0 + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer2_MAT0 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..LPTMR0 input is selected + * 0b001111..Reserved + * 0b010000..QDC0_POS_MATCH0 + * 0b010001..PWM0_SM0_MUX_TRIG0 input is selected + * 0b010010..PWM0_SM0_MUX_TRIG1 input is selected + * 0b010011..PWM0_SM1_MUX_TRIG0 input is selected + * 0b010100..PWM0_SM1_MUX_TRIG1 input is selected + * 0b010101..PWM0_SM2_MUX_TRIG0 input is selected + * 0b010110..PWM0_SM2_MUX_TRIG1 input is selected + * 0b010111..Reserved + * 0b011000..Reserved + * 0b011001..GPIO0 Pin Event Trig 0 input is selected + * 0b011010..GPIO1 Pin Event Trig 0 input is selected + * 0b011011..GPIO2 Pin Event Trig 0 input is selected + * 0b011100..GPIO3 Pin Event Trig 0 input is selected + * 0b011101..GPIO4 Pin Event Trig 0 input is selected + * 0b011110..WUU input is selected + * 0b011111..AOI1_OUT0 input is selected + * 0b100000..AOI1_OUT1 input is selected + * 0b100001..AOI1_OUT2 input is selected + * 0b100010..AOI1_OUT3 input is selected + * 0b100011..Reserved + * 0b100100..Reserved + * 0b100101..Reserved + * 0b100110..Reserved + * 0b100111..CTimer3_MAT0 + * 0b101000..CTimer3_MAT1 + * 0b101001..CTimer4_MAT0 input is selected + * 0b101010..CTimer4_MAT1 input is selected + * 0b101011..Reserved + * 0b101100..Reserved + * 0b101101..Reserved + * 0b101110..Reserved + * 0b101111..QDC1_POS_MATCH0 input is selected + * 0b110000..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110001..PWM1_SM0_MUX_TRIG1 input is selected + * 0b110010..PWM1_SM1_MUX_TRIG0 input is selected + * 0b110011..PWM1_SM1_MUX_TRIG1 input is selected + * 0b110100..PWM1_SM2_MUX_TRIG0 input is selected + * 0b110101..PWM1_SM2_MUX_TRIG1 input is selected + * 0b110110..Reserved + * 0b110111..Reserved + * *.. + */ +#define INPUTMUX_CMP1_TRIG_TRIGIN(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_CMP1_TRIG_TRIGIN_SHIFT)) & INPUTMUX_CMP1_TRIG_TRIGIN_MASK) +/*! @} */ + +/*! @name LPI2C2_TRIG - LPI2C2 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPI2C2_TRIG_INP_MASK (0x3FU) +#define INPUTMUX_LPI2C2_TRIG_INP_SHIFT (0U) +/*! INP - LPI2C2 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT0 input is selected + * 0b001010..CTimer0_MAT1 input is selected + * 0b001011..CTimer1_MAT0 input is selected + * 0b001100..CTimer1_MAT1 input is selected + * 0b001101..CTimer2_MAT0 input is selected + * 0b001110..CTimer2_MAT1 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..GPIO0 Pin Event Trig 0 input is selected + * 0b011010..GPIO1 Pin Event Trig 0 input is selected + * 0b011011..GPIO2 Pin Event Trig 0 input is selected + * 0b011100..GPIO3 Pin Event Trig 0 input is selected + * 0b011101..GPIO4 Pin Event Trig 0 input is selected + * 0b011110..WUU input is selected + * 0b011111..AOI1_OUT0 input is selected + * 0b100000..AOI1_OUT1 input is selected + * 0b100001..AOI1_OUT2 input is selected + * 0b100010..AOI1_OUT3 input is selected + * 0b100011..CTimer3_MAT2 input is selected + * 0b100100..CTimer3_MAT3 input is selected + * 0b100101..CTimer4_MAT2 input is selected + * 0b100110..CTimer4_MAT3 input is selected + * 0b100111..FlexIO CH0 input is selected + * 0b101000..FlexIO CH1 input is selected + * 0b101001..FlexIO CH2 input is selected + * 0b101010..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPI2C2_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPI2C2_TRIG_INP_SHIFT)) & INPUTMUX_LPI2C2_TRIG_INP_MASK) +/*! @} */ + +/*! @name OPAMP0_TRIG - OPAMP0 Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_OPAMP0_TRIG_INP_MASK (0x3FU) +#define INPUTMUX_OPAMP0_TRIG_INP_SHIFT (0U) +/*! INP - DAC0 trigger input + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT0 input is selected + * 0b001010..CTimer0_MAT1 input is selected + * 0b001011..CTimer1_MAT0 input is selected + * 0b001100..CTimer1_MAT1 input is selected + * 0b001101..CTimer2_MAT0 input is selected + * 0b001110..CTimer2_MAT1 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..Reserved + * 0b010010..PWM0_SM0_MUX_TRIG0 input is selected + * 0b010011..PWM0_SM0_MUX_TRIG1 input is selected + * 0b010100..PWM0_SM1_MUX_TRIG0 input is selected + * 0b010101..PWM0_SM1_MUX_TRIG1 input is selected + * 0b010110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b010111..PWM0_SM2_MUX_TRIG1 input is selected + * 0b011000..Reserved + * 0b011001..Reserved + * 0b011010..GPIO0 Pin Event Trig 0 input is selected + * 0b011011..GPIO1 Pin Event Trig 0 input is selected + * 0b011100..GPIO2 Pin Event Trig 0 input is selected + * 0b011101..GPIO3 Pin Event Trig 0 input is selected + * 0b011110..GPIO4 Pin Event Trig 0 input is selected + * 0b011111..WUU input is selected + * 0b100000..Reserved + * 0b100001..AOI1_OUT0 input is selected + * 0b100010..AOI1_OUT1 input is selected + * 0b100011..AOI1_OUT2 input is selected + * 0b100100..AOI1_OUT3 input is selected + * 0b100101..ADC0_tcomp[0] input is selected + * 0b100110..ADC0_tcomp[1] input is selected + * 0b100111..ADC1_tcomp[0] input is selected + * 0b101000..ADC1_tcomp[1] input is selected + * 0b101001..CTimer3_MAT0 input is selected + * 0b101010..CTimer3_MAT1 input is selected + * 0b101011..CTimer4_MAT0 input is selected + * 0b101100..CTimer4_MAT1 input is selected + * 0b101101..FlexIO CH0 input is selected + * 0b101110..FlexIO CH1 input is selected + * 0b101111..FlexIO CH2 input is selected + * 0b110000..FlexIO CH3 input is selected + * 0b110001..Reserved + * 0b110010..PWM1_SM0_MUX_TRIG0 input is selected + * 0b110011..PWM1_SM0_MUX_TRIG1 input is selected + * 0b110100..PWM1_SM1_MUX_TRIG0 input is selected + * 0b110101..PWM1_SM1_MUX_TRIG1 input is selected + * 0b110110..PWM1_SM2_MUX_TRIG0 input is selected + * 0b110111..PWM1_SM2_MUX_TRIG1 input is selected + * 0b111000..Reserved + * 0b111001..Reserved + * *.. + */ +#define INPUTMUX_OPAMP0_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_OPAMP0_TRIG_INP_SHIFT)) & INPUTMUX_OPAMP0_TRIG_INP_MASK) +/*! @} */ + +/*! @name LPI2C0_TRIG - LPI2C0 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPI2C0_TRIG_INP_MASK (0x3FU) +#define INPUTMUX_LPI2C0_TRIG_INP_SHIFT (0U) +/*! INP - LPI2C0 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT0 input is selected + * 0b001010..CTimer0_MAT1 input is selected + * 0b001011..CTimer1_MAT0 input is selected + * 0b001100..CTimer1_MAT1 input is selected + * 0b001101..CTimer2_MAT0 input is selected + * 0b001110..CTimer2_MAT1 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..GPIO0 Pin Event Trig 0 input is selected + * 0b011010..GPIO1 Pin Event Trig 0 input is selected + * 0b011011..GPIO2 Pin Event Trig 0 input is selected + * 0b011100..GPIO3 Pin Event Trig 0 input is selected + * 0b011101..GPIO4 Pin Event Trig 0 input is selected + * 0b011110..WUU input is selected + * 0b011111..AOI1_OUT0 input is selected + * 0b100000..AOI1_OUT1 input is selected + * 0b100001..AOI1_OUT2 input is selected + * 0b100010..AOI1_OUT3 input is selected + * 0b100011..CTimer3_MAT2 input is selected + * 0b100100..CTimer3_MAT3 input is selected + * 0b100101..CTimer4_MAT2 input is selected + * 0b100110..CTimer4_MAT3 input is selected + * 0b100111..FlexIO CH0 input is selected + * 0b101000..FlexIO CH1 input is selected + * 0b101001..FlexIO CH2 input is selected + * 0b101010..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPI2C0_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPI2C0_TRIG_INP_SHIFT)) & INPUTMUX_LPI2C0_TRIG_INP_MASK) +/*! @} */ + +/*! @name LPI2C1_TRIG - LPI2C1 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPI2C1_TRIG_INP_MASK (0x3FU) +#define INPUTMUX_LPI2C1_TRIG_INP_SHIFT (0U) +/*! INP - LPI2C1 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT0 input is selected + * 0b001010..CTimer0_MAT1 input is selected + * 0b001011..CTimer1_MAT0 input is selected + * 0b001100..CTimer1_MAT1 input is selected + * 0b001101..CTimer2_MAT0 input is selected + * 0b001110..CTimer2_MAT1 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..GPIO0 Pin Event Trig 0 input is selected + * 0b011010..GPIO1 Pin Event Trig 0 input is selected + * 0b011011..GPIO2 Pin Event Trig 0 input is selected + * 0b011100..GPIO3 Pin Event Trig 0 input is selected + * 0b011101..GPIO4 Pin Event Trig 0 input is selected + * 0b011110..WUU input is selected + * 0b011111..AOI1_OUT0 input is selected + * 0b100000..AOI1_OUT1 input is selected + * 0b100001..AOI1_OUT2 input is selected + * 0b100010..AOI1_OUT3 input is selected + * 0b100011..CTimer3_MAT2 input is selected + * 0b100100..CTimer3_MAT3 input is selected + * 0b100101..CTimer4_MAT2 input is selected + * 0b100110..CTimer4_MAT3 input is selected + * 0b100111..FlexIO CH0 input is selected + * 0b101000..FlexIO CH1 input is selected + * 0b101001..FlexIO CH2 input is selected + * 0b101010..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPI2C1_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPI2C1_TRIG_INP_SHIFT)) & INPUTMUX_LPI2C1_TRIG_INP_MASK) +/*! @} */ + +/*! @name LPSPI0_TRIG - LPSPI0 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPSPI0_TRIG_INP_MASK (0x3FU) +#define INPUTMUX_LPSPI0_TRIG_INP_SHIFT (0U) +/*! INP - LPSPI0 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT1 input is selected + * 0b001010..CTimer0_MAT2 input is selected + * 0b001011..CTimer1_MAT1 input is selected + * 0b001100..CTimer1_MAT2 input is selected + * 0b001101..CTimer2_MAT1 input is selected + * 0b001110..CTimer2_MAT2 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..GPIO0 Pin Event Trig 0 input is selected + * 0b011010..GPIO1 Pin Event Trig 0 input is selected + * 0b011011..GPIO2 Pin Event Trig 0 input is selected + * 0b011100..GPIO3 Pin Event Trig 0 input is selected + * 0b011101..GPIO4 Pin Event Trig 0 input is selected + * 0b011110..WUU input is selected + * 0b011111..AOI1_OUT0 input is selected + * 0b100000..AOI1_OUT1 input is selected + * 0b100001..AOI1_OUT2 input is selected + * 0b100010..AOI1_OUT3 input is selected + * 0b100011..CTimer3_MAT2 input is selected + * 0b100100..CTimer3_MAT3 input is selected + * 0b100101..CTimer4_MAT2 input is selected + * 0b100110..CTimer4_MAT3 input is selected + * 0b100111..FlexIO CH0 input is selected + * 0b101000..FlexIO CH1 input is selected + * 0b101001..FlexIO CH2 input is selected + * 0b101010..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPSPI0_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPSPI0_TRIG_INP_SHIFT)) & INPUTMUX_LPSPI0_TRIG_INP_MASK) +/*! @} */ + +/*! @name LPSPI1_TRIG - LPSPI1 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPSPI1_TRIG_INP_MASK (0x3FU) +#define INPUTMUX_LPSPI1_TRIG_INP_SHIFT (0U) +/*! INP - LPSPI1 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT1 input is selected + * 0b001010..CTimer0_MAT2 input is selected + * 0b001011..CTimer1_MAT1 input is selected + * 0b001100..CTimer1_MAT2 input is selected + * 0b001101..CTimer2_MAT1 input is selected + * 0b001110..CTimer2_MAT2 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..GPIO0 Pin Event Trig 0 input is selected + * 0b011010..GPIO1 Pin Event Trig 0 input is selected + * 0b011011..GPIO2 Pin Event Trig 0 input is selected + * 0b011100..GPIO3 Pin Event Trig 0 input is selected + * 0b011101..GPIO4 Pin Event Trig 0 input is selected + * 0b011110..WUU input is selected + * 0b011111..AOI1_OUT0 input is selected + * 0b100000..AOI1_OUT1 input is selected + * 0b100001..AOI1_OUT2 input is selected + * 0b100010..AOI1_OUT3 input is selected + * 0b100011..CTimer3_MAT2 input is selected + * 0b100100..CTimer3_MAT3 input is selected + * 0b100101..CTimer4_MAT2 input is selected + * 0b100110..CTimer4_MAT3 input is selected + * 0b100111..FlexIO CH0 input is selected + * 0b101000..FlexIO CH1 input is selected + * 0b101001..FlexIO CH2 input is selected + * 0b101010..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPSPI1_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPSPI1_TRIG_INP_SHIFT)) & INPUTMUX_LPSPI1_TRIG_INP_MASK) +/*! @} */ + +/*! @name LPUART0 - LPUART0 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPUART0_INP_MASK (0x3FU) +#define INPUTMUX_LPUART0_INP_SHIFT (0U) +/*! INP - LPUART0 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..TRIG_IN8 input is selected + * 0b011010..TRIG_IN9 input is selected + * 0b011011..TRIG_IN10 input is selected + * 0b011100..TRIG_IN11 input is selected + * 0b011101..GPIO0 Pin Event Trig 0 input is selected + * 0b011110..GPIO1 Pin Event Trig 0 input is selected + * 0b011111..GPIO2 Pin Event Trig 0 input is selected + * 0b100000..GPIO3 Pin Event Trig 0 input is selected + * 0b100001..GPIO4 Pin Event Trig 0 input is selected + * 0b100010..WUU selected + * 0b100011..USB0 ipp_ind_uart_rxd_usbmux input is selected + * 0b100100..AOI1_OUT0 input is selected + * 0b100101..AOI1_OUT1 input is selected + * 0b100110..AOI1_OUT2 input is selected + * 0b100111..AOI1_OUT3 input is selected + * 0b101000..CTimer3_MAT2 input is selected + * 0b101001..CTimer3_MAT3 input is selected + * 0b101010..CTimer4_MAT2 input is selected + * 0b101011..CTimer4_MAT3 input is selected + * 0b101100..FlexIO CH0 input is selected + * 0b101101..FlexIO CH1 input is selected + * 0b101110..FlexIO CH2 input is selected + * 0b101111..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPUART0_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPUART0_INP_SHIFT)) & INPUTMUX_LPUART0_INP_MASK) +/*! @} */ + +/*! @name LPUART1 - LPUART1 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPUART1_INP_MASK (0x3FU) +#define INPUTMUX_LPUART1_INP_SHIFT (0U) +/*! INP - LPUART1 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..TRIG_IN8 input is selected + * 0b011010..TRIG_IN9 input is selected + * 0b011011..TRIG_IN10 input is selected + * 0b011100..TRIG_IN11 input is selected + * 0b011101..GPIO0 Pin Event Trig 0 input is selected + * 0b011110..GPIO1 Pin Event Trig 0 input is selected + * 0b011111..GPIO2 Pin Event Trig 0 input is selected + * 0b100000..GPIO3 Pin Event Trig 0 input is selected + * 0b100001..GPIO4 Pin Event Trig 0 input is selected + * 0b100010..WUU selected + * 0b100011..USB0 ipp_ind_uart_rxd_usbmux input is selected + * 0b100100..AOI1_OUT0 input is selected + * 0b100101..AOI1_OUT1 input is selected + * 0b100110..AOI1_OUT2 input is selected + * 0b100111..AOI1_OUT3 input is selected + * 0b101000..CTimer3_MAT2 input is selected + * 0b101001..CTimer3_MAT3 input is selected + * 0b101010..CTimer4_MAT2 input is selected + * 0b101011..CTimer4_MAT3 input is selected + * 0b101100..FlexIO CH0 input is selected + * 0b101101..FlexIO CH1 input is selected + * 0b101110..FlexIO CH2 input is selected + * 0b101111..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPUART1_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPUART1_INP_SHIFT)) & INPUTMUX_LPUART1_INP_MASK) +/*! @} */ + +/*! @name LPUART2 - LPUART2 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPUART2_INP_MASK (0x3FU) +#define INPUTMUX_LPUART2_INP_SHIFT (0U) +/*! INP - LPUART2 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..TRIG_IN8 input is selected + * 0b011010..TRIG_IN9 input is selected + * 0b011011..TRIG_IN10 input is selected + * 0b011100..TRIG_IN11 input is selected + * 0b011101..GPIO0 Pin Event Trig 0 input is selected + * 0b011110..GPIO1 Pin Event Trig 0 input is selected + * 0b011111..GPIO2 Pin Event Trig 0 input is selected + * 0b100000..GPIO3 Pin Event Trig 0 input is selected + * 0b100001..GPIO4 Pin Event Trig 0 input is selected + * 0b100010..WUU selected + * 0b100011..USB0 ipp_ind_uart_rxd_usbmux input is selected + * 0b100100..AOI1_OUT0 input is selected + * 0b100101..AOI1_OUT1 input is selected + * 0b100110..AOI1_OUT2 input is selected + * 0b100111..AOI1_OUT3 input is selected + * 0b101000..CTimer3_MAT2 input is selected + * 0b101001..CTimer3_MAT3 input is selected + * 0b101010..CTimer4_MAT2 input is selected + * 0b101011..CTimer4_MAT3 input is selected + * 0b101100..FlexIO CH0 input is selected + * 0b101101..FlexIO CH1 input is selected + * 0b101110..FlexIO CH2 input is selected + * 0b101111..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPUART2_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPUART2_INP_SHIFT)) & INPUTMUX_LPUART2_INP_MASK) +/*! @} */ + +/*! @name LPUART3 - LPUART3 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPUART3_INP_MASK (0x3FU) +#define INPUTMUX_LPUART3_INP_SHIFT (0U) +/*! INP - LPUART3 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..TRIG_IN8 input is selected + * 0b011010..TRIG_IN9 input is selected + * 0b011011..TRIG_IN10 input is selected + * 0b011100..TRIG_IN11 input is selected + * 0b011101..GPIO0 Pin Event Trig 0 input is selected + * 0b011110..GPIO1 Pin Event Trig 0 input is selected + * 0b011111..GPIO2 Pin Event Trig 0 input is selected + * 0b100000..GPIO3 Pin Event Trig 0 input is selected + * 0b100001..GPIO4 Pin Event Trig 0 input is selected + * 0b100010..WUU selected + * 0b100011..USB0 ipp_ind_uart_rxd_usbmux input is selected + * 0b100100..AOI1_OUT0 input is selected + * 0b100101..AOI1_OUT1 input is selected + * 0b100110..AOI1_OUT2 input is selected + * 0b100111..AOI1_OUT3 input is selected + * 0b101000..CTimer3_MAT2 input is selected + * 0b101001..CTimer3_MAT3 input is selected + * 0b101010..CTimer4_MAT2 input is selected + * 0b101011..CTimer4_MAT3 input is selected + * 0b101100..FlexIO CH0 input is selected + * 0b101101..FlexIO CH1 input is selected + * 0b101110..FlexIO CH2 input is selected + * 0b101111..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPUART3_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPUART3_INP_SHIFT)) & INPUTMUX_LPUART3_INP_MASK) +/*! @} */ + +/*! @name LPUART4 - LPUART4 trigger input connections */ +/*! @{ */ + +#define INPUTMUX_LPUART4_INP_MASK (0x3FU) +#define INPUTMUX_LPUART4_INP_SHIFT (0U) +/*! INP - LPUART4 trigger input connections + * 0b000000..Reserved + * 0b000001..Reserved + * 0b000010..AOI0_OUT0 input is selected + * 0b000011..AOI0_OUT1 input is selected + * 0b000100..AOI0_OUT2 input is selected + * 0b000101..AOI0_OUT3 input is selected + * 0b000110..CMP0_OUT input is selected + * 0b000111..CMP1_OUT input is selected + * 0b001000..Reserved + * 0b001001..CTimer0_MAT2 input is selected + * 0b001010..CTimer0_MAT3 input is selected + * 0b001011..CTimer1_MAT2 input is selected + * 0b001100..CTimer1_MAT3 input is selected + * 0b001101..CTimer2_MAT2 input is selected + * 0b001110..CTimer2_MAT3 input is selected + * 0b001111..LPTMR0 input is selected + * 0b010000..Reserved + * 0b010001..TRIG_IN0 input is selected + * 0b010010..TRIG_IN1 input is selected + * 0b010011..TRIG_IN2 input is selected + * 0b010100..TRIG_IN3 input is selected + * 0b010101..TRIG_IN4 input is selected + * 0b010110..TRIG_IN5 input is selected + * 0b010111..TRIG_IN6 input is selected + * 0b011000..TRIG_IN7 input is selected + * 0b011001..TRIG_IN8 input is selected + * 0b011010..TRIG_IN9 input is selected + * 0b011011..TRIG_IN10 input is selected + * 0b011100..TRIG_IN11 input is selected + * 0b011101..GPIO0 Pin Event Trig 0 input is selected + * 0b011110..GPIO1 Pin Event Trig 0 input is selected + * 0b011111..GPIO2 Pin Event Trig 0 input is selected + * 0b100000..GPIO3 Pin Event Trig 0 input is selected + * 0b100001..GPIO4 Pin Event Trig 0 input is selected + * 0b100010..WUU selected + * 0b100011..USB0 ipp_ind_uart_rxd_usbmux input is selected + * 0b100100..AOI1_OUT0 input is selected + * 0b100101..AOI1_OUT1 input is selected + * 0b100110..AOI1_OUT2 input is selected + * 0b100111..AOI1_OUT3 input is selected + * 0b101000..CTimer3_MAT2 input is selected + * 0b101001..CTimer3_MAT3 input is selected + * 0b101010..CTimer4_MAT2 input is selected + * 0b101011..CTimer4_MAT3 input is selected + * 0b101100..FlexIO CH0 input is selected + * 0b101101..FlexIO CH1 input is selected + * 0b101110..FlexIO CH2 input is selected + * 0b101111..FlexIO CH3 input is selected + * *.. + */ +#define INPUTMUX_LPUART4_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_LPUART4_INP_SHIFT)) & INPUTMUX_LPUART4_INP_MASK) +/*! @} */ + +/*! @name FLEXIO_TRIGN_FLEXIO_TRIG - FlexIO Trigger Input Connections */ +/*! @{ */ + +#define INPUTMUX_FLEXIO_TRIGN_FLEXIO_TRIG_INP_MASK (0x7FU) +#define INPUTMUX_FLEXIO_TRIGN_FLEXIO_TRIG_INP_SHIFT (0U) +/*! INP - Input number for FlexIO0. + * 0b0000000..Reserved + * 0b0000001..AOI0_OUT0 input is selected + * 0b0000010..AOI0_OUT1 input is selected + * 0b0000011..AOI0_OUT2 input is selected + * 0b0000100..AOI0_OUT3 input is selected + * 0b0000101..ADC0_tcomp[0] input is selected + * 0b0000110..ADC0_tcomp[1] input is selected + * 0b0000111..ADC0_tcomp[2] input is selected + * 0b0001000..ADC0_tcomp[3] input is selected + * 0b0001001..CMP0_OUT input is selected + * 0b0001010..CMP1_OUT input is selected + * 0b0001011..Reserved + * 0b0001100..CTimer0_MAT1 input is selected + * 0b0001101..CTimer0_MAT2 input is selected + * 0b0001110..CTimer1_MAT1 input is selected + * 0b0001111..CTimer1_MAT2 input is selected + * 0b0010000..CTimer2_MAT1 input is selected + * 0b0010001..CTimer2_MAT2 input is selected + * 0b0010010..LPTMR0 input is selected + * 0b0010011..Reserved (LPTMR1) input is selected + * 0b0010100..PWM0_SM0_MUX_TRIG0 input is selected + * 0b0010101..PWM0_SM1_MUX_TRIG0 input is selected + * 0b0010110..PWM0_SM2_MUX_TRIG0 input is selected + * 0b0010111..Reserved + * 0b0011000..TRIG_IN0 input is selected + * 0b0011001..TRIG_IN1 input is selected + * 0b0011010..TRIG_IN2 input is selected + * 0b0011011..TRIG_IN3 input is selected + * 0b0011100..TRIG_IN4 input is selected + * 0b0011101..TRIG_IN5 input is selected + * 0b0011110..TRIG_IN6 input is selected + * 0b0011111..TRIG_IN7 input is selected + * 0b0100000..GPIO0 Pin Event Trig 0 input is selected + * 0b0100001..GPIO2 Pin Event Trig 0 input is selected + * 0b0100010..GPIO3 Pin Event Trig 0 input is selected + * 0b0100011..GPIO4 Pin Event Trig 0 input is selected + * 0b0100100..WUU input is selected + * 0b0100101..PWM1_A0_TRIG0 input is selected + * 0b0100110..LPI2C0 Master End of Packet + * 0b0100111..LPI2C0 Slave End of Packet + * 0b0101000..LPI2C1 Master End of Packet + * 0b0101001..LPI2C1 Slave End of Packet + * 0b0101010..LPSPI0 End of Frame + * 0b0101011..LPSPI0 Received Data Word + * 0b0101100..LPSPI1 End of Frame + * 0b0101101..LPSPI1 Received Data Word + * 0b0101110..LPUART0 Received Data Word + * 0b0101111..LPUART0 Transmitted Data Word + * 0b0110000..LPUART0 Receive Line Idle + * 0b0110001..LPUART1 Received Data Word + * 0b0110010..LPUART1 Transmitted Data Word + * 0b0110011..LPUART1 Receive Line Idle + * 0b0110100..LPUART2 Received Data Word + * 0b0110101..LPUART2 Transmitted Data Word + * 0b0110110..LPUART2 Receive Line Idle + * 0b0110111..LPUART3 Received Data Word + * 0b0111000..LPUART3 Transmitted Data Word + * 0b0111001..LPUART3 Receive Line Idle + * 0b0111010..LPUART4 Received Data Word + * 0b0111011..LPUART4 Transmitted Data Word + * 0b0111100..LPUART4 Receive Line Idle + * 0b0111101..AOI1_OUT0 input is selected + * 0b0111110..AOI1_OUT1 input is selected + * 0b0111111..AOI1_OUT2 input is selected + * 0b1000000..AOI1_OUT3 input is selected + * 0b1000001..ADC1_tcomp[0] input is selected + * 0b1000010..ADC1_tcomp[1] input is selected + * 0b1000011..ADC1_tcomp[2] input is selected + * 0b1000100..ADC1_tcomp[3] input is selected + * 0b1000101..CTimer3_MAT2 input is selected + * 0b1000110..CTimer3_MAT3 input is selected + * 0b1000111..CTimer4_MAT2 input is selected + * 0b1001000..CTimer4_MAT3 input is selected + * 0b1001001..PWM1_SM0_MUX_TRIG0 input is selected + * 0b1001010..PWM1_SM1_MUX_TRIG0 input is selected + * 0b1001011..PWM1_SM2_MUX_TRIG0 input is selected + * 0b1001100..Reserved + * 0b1001101..LPI2C2 Master End of Packet + * 0b1001110..LPI2C2 Slave End of Packet + * 0b1001111..LPI2C3 Master End of Packet + * 0b1010000..LPI2C3 Slave End of Packet + * *.. + */ +#define INPUTMUX_FLEXIO_TRIGN_FLEXIO_TRIG_INP(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FLEXIO_TRIGN_FLEXIO_TRIG_INP_SHIFT)) & INPUTMUX_FLEXIO_TRIGN_FLEXIO_TRIG_INP_MASK) +/*! @} */ + +/* The count of INPUTMUX_FLEXIO_TRIGN_FLEXIO_TRIG */ +#define INPUTMUX_FLEXIO_TRIGN_FLEXIO_TRIG_COUNT (4U) + + +/*! + * @} + */ /* end of group INPUTMUX_Register_Masks */ + + +/* INPUTMUX - Peripheral instance base addresses */ +/** Peripheral INPUTMUX0 base address */ +#define INPUTMUX0_BASE (0x40001000u) +/** Peripheral INPUTMUX0 base pointer */ +#define INPUTMUX0 ((INPUTMUX_Type *)INPUTMUX0_BASE) +/** Array initializer of INPUTMUX peripheral base addresses */ +#define INPUTMUX_BASE_ADDRS { INPUTMUX0_BASE } +/** Array initializer of INPUTMUX peripheral base pointers */ +#define INPUTMUX_BASE_PTRS { INPUTMUX0 } + +/*! + * @} + */ /* end of group INPUTMUX_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- LPCMP Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPCMP_Peripheral_Access_Layer LPCMP Peripheral Access Layer + * @{ + */ + +/** LPCMP - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + __IO uint32_t CCR0; /**< Comparator Control Register 0, offset: 0x8 */ + __IO uint32_t CCR1; /**< Comparator Control Register 1, offset: 0xC */ + __IO uint32_t CCR2; /**< Comparator Control Register 2, offset: 0x10 */ + uint8_t RESERVED_0[4]; + __IO uint32_t DCR; /**< DAC Control, offset: 0x18 */ + __IO uint32_t IER; /**< Interrupt Enable, offset: 0x1C */ + __IO uint32_t CSR; /**< Comparator Status, offset: 0x20 */ + __IO uint32_t RRCR0; /**< Round Robin Control Register 0, offset: 0x24 */ + __IO uint32_t RRCR1; /**< Round Robin Control Register 1, offset: 0x28 */ + __IO uint32_t RRCSR; /**< Round Robin Control and Status, offset: 0x2C */ + __IO uint32_t RRSR; /**< Round Robin Status, offset: 0x30 */ + uint8_t RESERVED_1[4]; + __IO uint32_t RRCR2; /**< Round Robin Control Register 2, offset: 0x38 */ +} LPCMP_Type; + +/* ---------------------------------------------------------------------------- + -- LPCMP Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPCMP_Register_Masks LPCMP Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define LPCMP_VERID_FEATURE_MASK (0xFFFFU) +#define LPCMP_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number + * 0b0000000000000001..Round robin feature + */ +#define LPCMP_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_VERID_FEATURE_SHIFT)) & LPCMP_VERID_FEATURE_MASK) + +#define LPCMP_VERID_MINOR_MASK (0xFF0000U) +#define LPCMP_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define LPCMP_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_VERID_MINOR_SHIFT)) & LPCMP_VERID_MINOR_MASK) + +#define LPCMP_VERID_MAJOR_MASK (0xFF000000U) +#define LPCMP_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define LPCMP_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_VERID_MAJOR_SHIFT)) & LPCMP_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define LPCMP_PARAM_DAC_RES_MASK (0xFU) +#define LPCMP_PARAM_DAC_RES_SHIFT (0U) +/*! DAC_RES - DAC Resolution + * 0b0000..4-bit DAC + * 0b0001..6-bit DAC + * 0b0010..8-bit DAC + * 0b0011..10-bit DAC + * 0b0100..12-bit DAC + * 0b0101..14-bit DAC + * 0b0110..16-bit DAC + */ +#define LPCMP_PARAM_DAC_RES(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_PARAM_DAC_RES_SHIFT)) & LPCMP_PARAM_DAC_RES_MASK) +/*! @} */ + +/*! @name CCR0 - Comparator Control Register 0 */ +/*! @{ */ + +#define LPCMP_CCR0_CMP_EN_MASK (0x1U) +#define LPCMP_CCR0_CMP_EN_SHIFT (0U) +/*! CMP_EN - Comparator Enable + * 0b0..Disable (The analog logic remains off and consumes no power.) + * 0b1..Enable + */ +#define LPCMP_CCR0_CMP_EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR0_CMP_EN_SHIFT)) & LPCMP_CCR0_CMP_EN_MASK) + +#define LPCMP_CCR0_CMP_STOP_EN_MASK (0x2U) +#define LPCMP_CCR0_CMP_STOP_EN_SHIFT (1U) +/*! CMP_STOP_EN - Comparator Deep sleep Mode Enable + * 0b0..Disables the analog comparator regardless of CMP_EN. + * 0b1..Allows CMP_EN to enable the analog comparator. + */ +#define LPCMP_CCR0_CMP_STOP_EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR0_CMP_STOP_EN_SHIFT)) & LPCMP_CCR0_CMP_STOP_EN_MASK) +/*! @} */ + +/*! @name CCR1 - Comparator Control Register 1 */ +/*! @{ */ + +#define LPCMP_CCR1_WINDOW_EN_MASK (0x1U) +#define LPCMP_CCR1_WINDOW_EN_SHIFT (0U) +/*! WINDOW_EN - Windowing Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPCMP_CCR1_WINDOW_EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_WINDOW_EN_SHIFT)) & LPCMP_CCR1_WINDOW_EN_MASK) + +#define LPCMP_CCR1_SAMPLE_EN_MASK (0x2U) +#define LPCMP_CCR1_SAMPLE_EN_SHIFT (1U) +/*! SAMPLE_EN - Sampling Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPCMP_CCR1_SAMPLE_EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_SAMPLE_EN_SHIFT)) & LPCMP_CCR1_SAMPLE_EN_MASK) + +#define LPCMP_CCR1_DMA_EN_MASK (0x4U) +#define LPCMP_CCR1_DMA_EN_SHIFT (2U) +/*! DMA_EN - DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPCMP_CCR1_DMA_EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_DMA_EN_SHIFT)) & LPCMP_CCR1_DMA_EN_MASK) + +#define LPCMP_CCR1_COUT_INV_MASK (0x8U) +#define LPCMP_CCR1_COUT_INV_SHIFT (3U) +/*! COUT_INV - Comparator Invert + * 0b0..Do not invert + * 0b1..Invert + */ +#define LPCMP_CCR1_COUT_INV(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_COUT_INV_SHIFT)) & LPCMP_CCR1_COUT_INV_MASK) + +#define LPCMP_CCR1_COUT_SEL_MASK (0x10U) +#define LPCMP_CCR1_COUT_SEL_SHIFT (4U) +/*! COUT_SEL - Comparator Output Select + * 0b0..Use COUT (filtered) + * 0b1..Use COUTA (unfiltered) + */ +#define LPCMP_CCR1_COUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_COUT_SEL_SHIFT)) & LPCMP_CCR1_COUT_SEL_MASK) + +#define LPCMP_CCR1_COUT_PEN_MASK (0x20U) +#define LPCMP_CCR1_COUT_PEN_SHIFT (5U) +/*! COUT_PEN - Comparator Output Pin Enable + * 0b0..Not available + * 0b1..Available + */ +#define LPCMP_CCR1_COUT_PEN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_COUT_PEN_SHIFT)) & LPCMP_CCR1_COUT_PEN_MASK) + +#define LPCMP_CCR1_COUTA_OWEN_MASK (0x40U) +#define LPCMP_CCR1_COUTA_OWEN_SHIFT (6U) +/*! COUTA_OWEN - COUTA_OW Enable + * 0b0..COUTA holds the last sampled value. + * 0b1..Enables the COUTA signal value to be defined by COUTA_OW. + */ +#define LPCMP_CCR1_COUTA_OWEN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_COUTA_OWEN_SHIFT)) & LPCMP_CCR1_COUTA_OWEN_MASK) + +#define LPCMP_CCR1_COUTA_OW_MASK (0x80U) +#define LPCMP_CCR1_COUTA_OW_SHIFT (7U) +/*! COUTA_OW - COUTA Output Level for Closed Window + * 0b0..COUTA is 0 + * 0b1..COUTA is 1 + */ +#define LPCMP_CCR1_COUTA_OW(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_COUTA_OW_SHIFT)) & LPCMP_CCR1_COUTA_OW_MASK) + +#define LPCMP_CCR1_WINDOW_INV_MASK (0x100U) +#define LPCMP_CCR1_WINDOW_INV_SHIFT (8U) +/*! WINDOW_INV - WINDOW/SAMPLE Signal Invert + * 0b0..Do not invert + * 0b1..Invert + */ +#define LPCMP_CCR1_WINDOW_INV(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_WINDOW_INV_SHIFT)) & LPCMP_CCR1_WINDOW_INV_MASK) + +#define LPCMP_CCR1_WINDOW_CLS_MASK (0x200U) +#define LPCMP_CCR1_WINDOW_CLS_SHIFT (9U) +/*! WINDOW_CLS - COUT Event Window Close + * 0b0..COUT event cannot close the window + * 0b1..COUT event can close the window + */ +#define LPCMP_CCR1_WINDOW_CLS(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_WINDOW_CLS_SHIFT)) & LPCMP_CCR1_WINDOW_CLS_MASK) + +#define LPCMP_CCR1_EVT_SEL_MASK (0xC00U) +#define LPCMP_CCR1_EVT_SEL_SHIFT (10U) +/*! EVT_SEL - COUT Event Select + * 0b00..Rising edge + * 0b01..Falling edge + * 0b1x..Both edges + */ +#define LPCMP_CCR1_EVT_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_EVT_SEL_SHIFT)) & LPCMP_CCR1_EVT_SEL_MASK) + +#define LPCMP_CCR1_FUNC_CLK_SEL_MASK (0x3000U) +#define LPCMP_CCR1_FUNC_CLK_SEL_SHIFT (12U) +/*! FUNC_CLK_SEL - Functional Clock Source Select + * 0b00..Select functional clock source 0 + * 0b01..Select functional clock source 1 + * 0b10..Select functional clock source 2 + * 0b11..Select functional clock source 3 + */ +#define LPCMP_CCR1_FUNC_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_FUNC_CLK_SEL_SHIFT)) & LPCMP_CCR1_FUNC_CLK_SEL_MASK) + +#define LPCMP_CCR1_FILT_CNT_MASK (0x70000U) +#define LPCMP_CCR1_FILT_CNT_SHIFT (16U) +/*! FILT_CNT - Filter Sample Count + * 0b000..Filter is bypassed: COUT = COUTA + * 0b001..1 consecutive sample (Comparator output is simply sampled.) + * 0b010..2 consecutive samples + * 0b011..3 consecutive samples + * 0b100..4 consecutive samples + * 0b101..5 consecutive samples + * 0b110..6 consecutive samples + * 0b111..7 consecutive samples + */ +#define LPCMP_CCR1_FILT_CNT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_FILT_CNT_SHIFT)) & LPCMP_CCR1_FILT_CNT_MASK) + +#define LPCMP_CCR1_FILT_PER_MASK (0xFF000000U) +#define LPCMP_CCR1_FILT_PER_SHIFT (24U) +/*! FILT_PER - Filter Sample Period */ +#define LPCMP_CCR1_FILT_PER(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_FILT_PER_SHIFT)) & LPCMP_CCR1_FILT_PER_MASK) +/*! @} */ + +/*! @name CCR2 - Comparator Control Register 2 */ +/*! @{ */ + +#define LPCMP_CCR2_CMP_HPMD_MASK (0x1U) +#define LPCMP_CCR2_CMP_HPMD_SHIFT (0U) +/*! CMP_HPMD - CMP High Power Mode Select + * 0b0..Low power (speed) comparison mode + * 0b1..High power (speed) comparison mode + */ +#define LPCMP_CCR2_CMP_HPMD(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR2_CMP_HPMD_SHIFT)) & LPCMP_CCR2_CMP_HPMD_MASK) + +#define LPCMP_CCR2_CMP_NPMD_MASK (0x2U) +#define LPCMP_CCR2_CMP_NPMD_SHIFT (1U) +/*! CMP_NPMD - CMP Nano Power Mode Select + * 0b0..Disables CMP Nano power mode. CCR2[CMP_HPMD] determines the mode for the comparator. + * 0b1..Enables CMP Nano power mode. + */ +#define LPCMP_CCR2_CMP_NPMD(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR2_CMP_NPMD_SHIFT)) & LPCMP_CCR2_CMP_NPMD_MASK) + +#define LPCMP_CCR2_HYSTCTR_MASK (0x30U) +#define LPCMP_CCR2_HYSTCTR_SHIFT (4U) +/*! HYSTCTR - Comparator Hysteresis Control + * 0b00..Level 0: Analog comparator hysteresis 0 mV. + * 0b01..Level 1: Analog comparator hysteresis 10 mV. + * 0b10..Level 2: Analog comparator hysteresis 20 mV. + * 0b11..Level 3: Analog comparator hysteresis 30 mV. + */ +#define LPCMP_CCR2_HYSTCTR(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR2_HYSTCTR_SHIFT)) & LPCMP_CCR2_HYSTCTR_MASK) + +#define LPCMP_CCR2_PSEL_MASK (0x70000U) +#define LPCMP_CCR2_PSEL_SHIFT (16U) +/*! PSEL - Plus Input MUX Select + * 0b000..Input 0p + * 0b001..Input 1p + * 0b010..Input 2p + * 0b011..Input 3p + * 0b100..Input 4p + * 0b101..Input 5p + * 0b110..Reserved + * 0b111..Internal DAC output + */ +#define LPCMP_CCR2_PSEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR2_PSEL_SHIFT)) & LPCMP_CCR2_PSEL_MASK) + +#define LPCMP_CCR2_MSEL_MASK (0x700000U) +#define LPCMP_CCR2_MSEL_SHIFT (20U) +/*! MSEL - Minus Input MUX Select + * 0b000..Input 0m + * 0b001..Input 1m + * 0b010..Input 2m + * 0b011..Input 3m + * 0b100..Input 4m + * 0b101..Input 5m + * 0b110..Reserved + * 0b111..Internal DAC output + */ +#define LPCMP_CCR2_MSEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR2_MSEL_SHIFT)) & LPCMP_CCR2_MSEL_MASK) +/*! @} */ + +/*! @name DCR - DAC Control */ +/*! @{ */ + +#define LPCMP_DCR_DAC_EN_MASK (0x1U) +#define LPCMP_DCR_DAC_EN_SHIFT (0U) +/*! DAC_EN - DAC Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPCMP_DCR_DAC_EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_DCR_DAC_EN_SHIFT)) & LPCMP_DCR_DAC_EN_MASK) + +#define LPCMP_DCR_DAC_HPMD_MASK (0x2U) +#define LPCMP_DCR_DAC_HPMD_SHIFT (1U) +/*! DAC_HPMD - DAC High Power Mode + * 0b0..Disable + * 0b1..Enable + */ +#define LPCMP_DCR_DAC_HPMD(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_DCR_DAC_HPMD_SHIFT)) & LPCMP_DCR_DAC_HPMD_MASK) + +#define LPCMP_DCR_VRSEL_MASK (0x100U) +#define LPCMP_DCR_VRSEL_SHIFT (8U) +/*! VRSEL - DAC Reference High Voltage Source Select + * 0b0..VREFH0 + * 0b1..VREFH1 + */ +#define LPCMP_DCR_VRSEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_DCR_VRSEL_SHIFT)) & LPCMP_DCR_VRSEL_MASK) + +#define LPCMP_DCR_DAC_DATA_MASK (0xFF0000U) +#define LPCMP_DCR_DAC_DATA_SHIFT (16U) +/*! DAC_DATA - DAC Output Voltage Select */ +#define LPCMP_DCR_DAC_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_DCR_DAC_DATA_SHIFT)) & LPCMP_DCR_DAC_DATA_MASK) +/*! @} */ + +/*! @name IER - Interrupt Enable */ +/*! @{ */ + +#define LPCMP_IER_CFR_IE_MASK (0x1U) +#define LPCMP_IER_CFR_IE_SHIFT (0U) +/*! CFR_IE - Comparator Flag Rising Interrupt Enable + * 0b0..Disables the comparator flag rising interrupt. + * 0b1..Enables the comparator flag rising interrupt when CFR is set. + */ +#define LPCMP_IER_CFR_IE(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_IER_CFR_IE_SHIFT)) & LPCMP_IER_CFR_IE_MASK) + +#define LPCMP_IER_CFF_IE_MASK (0x2U) +#define LPCMP_IER_CFF_IE_SHIFT (1U) +/*! CFF_IE - Comparator Flag Falling Interrupt Enable + * 0b0..Disables the comparator flag falling interrupt. + * 0b1..Enables the comparator flag falling interrupt when CFF is set. + */ +#define LPCMP_IER_CFF_IE(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_IER_CFF_IE_SHIFT)) & LPCMP_IER_CFF_IE_MASK) + +#define LPCMP_IER_RRF_IE_MASK (0x4U) +#define LPCMP_IER_RRF_IE_SHIFT (2U) +/*! RRF_IE - Round-Robin Flag Interrupt Enable + * 0b0..Disables the round-robin flag interrupt. + * 0b1..Enables the round-robin flag interrupt when the comparison result changes for a given channel. + */ +#define LPCMP_IER_RRF_IE(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_IER_RRF_IE_SHIFT)) & LPCMP_IER_RRF_IE_MASK) +/*! @} */ + +/*! @name CSR - Comparator Status */ +/*! @{ */ + +#define LPCMP_CSR_CFR_MASK (0x1U) +#define LPCMP_CSR_CFR_SHIFT (0U) +/*! CFR - Analog Comparator Flag Rising + * 0b0..Not detected + * 0b1..Detected + */ +#define LPCMP_CSR_CFR(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CSR_CFR_SHIFT)) & LPCMP_CSR_CFR_MASK) + +#define LPCMP_CSR_CFF_MASK (0x2U) +#define LPCMP_CSR_CFF_SHIFT (1U) +/*! CFF - Analog Comparator Flag Falling + * 0b0..Not detected + * 0b1..Detected + */ +#define LPCMP_CSR_CFF(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CSR_CFF_SHIFT)) & LPCMP_CSR_CFF_MASK) + +#define LPCMP_CSR_RRF_MASK (0x4U) +#define LPCMP_CSR_RRF_SHIFT (2U) +/*! RRF - Round-Robin Flag + * 0b0..Not detected + * 0b1..Detected + */ +#define LPCMP_CSR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CSR_RRF_SHIFT)) & LPCMP_CSR_RRF_MASK) + +#define LPCMP_CSR_COUT_MASK (0x100U) +#define LPCMP_CSR_COUT_SHIFT (8U) +/*! COUT - Analog Comparator Output */ +#define LPCMP_CSR_COUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_CSR_COUT_SHIFT)) & LPCMP_CSR_COUT_MASK) +/*! @} */ + +/*! @name RRCR0 - Round Robin Control Register 0 */ +/*! @{ */ + +#define LPCMP_RRCR0_RR_EN_MASK (0x1U) +#define LPCMP_RRCR0_RR_EN_SHIFT (0U) +/*! RR_EN - Round-Robin Enable + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR0_RR_EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR0_RR_EN_SHIFT)) & LPCMP_RRCR0_RR_EN_MASK) + +#define LPCMP_RRCR0_RR_TRG_SEL_MASK (0x2U) +#define LPCMP_RRCR0_RR_TRG_SEL_SHIFT (1U) +/*! RR_TRG_SEL - Round-Robin Trigger Select + * 0b0..External trigger + * 0b1..Internal trigger + */ +#define LPCMP_RRCR0_RR_TRG_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR0_RR_TRG_SEL_SHIFT)) & LPCMP_RRCR0_RR_TRG_SEL_MASK) + +#define LPCMP_RRCR0_RR_EXTTRG_SEL_MASK (0x3CU) +#define LPCMP_RRCR0_RR_EXTTRG_SEL_SHIFT (2U) +/*! RR_EXTTRG_SEL - External Trigger Source Select + * 0b0000..Select external trigger source 0 + * 0b0001..Select external trigger source 1 + * 0b0010..Select external trigger source 2 + * 0b0011..Select external trigger source 3 + * 0b0100..Select external trigger source 4 + * 0b0101..Select external trigger source 5 + * 0b0110..Select external trigger source 6 + * 0b0111..Select external trigger source 7 + * 0b1000..Select external trigger source 8 + * 0b1001..Select external trigger source 9 + * 0b1010..Select external trigger source 10 + * 0b1011..Select external trigger source 11 + * 0b1100..Select external trigger source 12 + * 0b1101..Select external trigger source 13 + * 0b1110..Select external trigger source 14 + * 0b1111..Select external trigger source 15 + */ +#define LPCMP_RRCR0_RR_EXTTRG_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR0_RR_EXTTRG_SEL_SHIFT)) & LPCMP_RRCR0_RR_EXTTRG_SEL_MASK) + +#define LPCMP_RRCR0_RR_NSAM_MASK (0x300U) +#define LPCMP_RRCR0_RR_NSAM_SHIFT (8U) +/*! RR_NSAM - Number of Sample Clocks + * 0b00..0 clock + * 0b01..1 clock + * 0b10..2 clocks + * 0b11..3 clocks + */ +#define LPCMP_RRCR0_RR_NSAM(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR0_RR_NSAM_SHIFT)) & LPCMP_RRCR0_RR_NSAM_MASK) + +#define LPCMP_RRCR0_RR_CLK_SEL_MASK (0x3000U) +#define LPCMP_RRCR0_RR_CLK_SEL_SHIFT (12U) +/*! RR_CLK_SEL - Round Robin Clock Source Select + * 0b00..Select Round Robin clock Source 0 + * 0b01..Select Round Robin clock Source 1 + * 0b10..Select Round Robin clock Source 2 + * 0b11..Select Round Robin clock Source 3 + */ +#define LPCMP_RRCR0_RR_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR0_RR_CLK_SEL_SHIFT)) & LPCMP_RRCR0_RR_CLK_SEL_MASK) + +#define LPCMP_RRCR0_RR_INITMOD_MASK (0x3F0000U) +#define LPCMP_RRCR0_RR_INITMOD_SHIFT (16U) +/*! RR_INITMOD - Initialization Delay Modulus + * 0b000000..63 cycles (same as 111111b) + * 0b000001-0b111111..1 to 63 cycles + */ +#define LPCMP_RRCR0_RR_INITMOD(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR0_RR_INITMOD_SHIFT)) & LPCMP_RRCR0_RR_INITMOD_MASK) + +#define LPCMP_RRCR0_RR_SAMPLE_CNT_MASK (0xF000000U) +#define LPCMP_RRCR0_RR_SAMPLE_CNT_SHIFT (24U) +/*! RR_SAMPLE_CNT - Number of Sample for One Channel + * 0b0000..1 samples + * 0b0001..2 samples + * 0b0010..3 samples + * 0b0011..4 samples + * 0b0100..5 samples + * 0b0101..6 samples + * 0b0110..7 samples + * 0b0111..8 samples + * 0b1000..9 samples + * 0b1001..10 samples + * 0b1010..11 samples + * 0b1011..12 samples + * 0b1100..13 samples + * 0b1101..14 samples + * 0b1110..15 samples + * 0b1111..16 samples + */ +#define LPCMP_RRCR0_RR_SAMPLE_CNT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR0_RR_SAMPLE_CNT_SHIFT)) & LPCMP_RRCR0_RR_SAMPLE_CNT_MASK) + +#define LPCMP_RRCR0_RR_SAMPLE_THRESHOLD_MASK (0xF0000000U) +#define LPCMP_RRCR0_RR_SAMPLE_THRESHOLD_SHIFT (28U) +/*! RR_SAMPLE_THRESHOLD - Sample Time Threshold + * 0b0000..At least 1 sampled "1", the final result is "1" + * 0b0001..At least 2 sampled "1", the final result is "1" + * 0b0010..At least 3 sampled "1", the final result is "1" + * 0b0011..At least 4 sampled "1", the final result is "1" + * 0b0100..At least 5 sampled "1", the final result is "1" + * 0b0101..At least 6 sampled "1", the final result is "1" + * 0b0110..At least 7 sampled "1", the final result is "1" + * 0b0111..At least 8 sampled "1", the final result is "1" + * 0b1000..At least 9 sampled "1", the final result is "1" + * 0b1001..At least 10 sampled "1", the final result is "1" + * 0b1010..At least 11 sampled "1", the final result is "1" + * 0b1011..At least 12 sampled "1", the final result is "1" + * 0b1100..At least 13 sampled "1", the final result is "1" + * 0b1101..At least 14 sampled "1", the final result is "1" + * 0b1110..At least 15 sampled "1", the final result is "1" + * 0b1111..At least 16 sampled "1", the final result is "1" + */ +#define LPCMP_RRCR0_RR_SAMPLE_THRESHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR0_RR_SAMPLE_THRESHOLD_SHIFT)) & LPCMP_RRCR0_RR_SAMPLE_THRESHOLD_MASK) +/*! @} */ + +/*! @name RRCR1 - Round Robin Control Register 1 */ +/*! @{ */ + +#define LPCMP_RRCR1_RR_CH0EN_MASK (0x1U) +#define LPCMP_RRCR1_RR_CH0EN_SHIFT (0U) +/*! RR_CH0EN - Channel 0 Input Enable in Trigger Mode + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR1_RR_CH0EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_RR_CH0EN_SHIFT)) & LPCMP_RRCR1_RR_CH0EN_MASK) + +#define LPCMP_RRCR1_RR_CH1EN_MASK (0x2U) +#define LPCMP_RRCR1_RR_CH1EN_SHIFT (1U) +/*! RR_CH1EN - Channel 1 Input Enable in Trigger Mode + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR1_RR_CH1EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_RR_CH1EN_SHIFT)) & LPCMP_RRCR1_RR_CH1EN_MASK) + +#define LPCMP_RRCR1_RR_CH2EN_MASK (0x4U) +#define LPCMP_RRCR1_RR_CH2EN_SHIFT (2U) +/*! RR_CH2EN - Channel 2 Input Enable in Trigger Mode + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR1_RR_CH2EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_RR_CH2EN_SHIFT)) & LPCMP_RRCR1_RR_CH2EN_MASK) + +#define LPCMP_RRCR1_RR_CH3EN_MASK (0x8U) +#define LPCMP_RRCR1_RR_CH3EN_SHIFT (3U) +/*! RR_CH3EN - Channel 3 Input Enable in Trigger Mode + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR1_RR_CH3EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_RR_CH3EN_SHIFT)) & LPCMP_RRCR1_RR_CH3EN_MASK) + +#define LPCMP_RRCR1_RR_CH4EN_MASK (0x10U) +#define LPCMP_RRCR1_RR_CH4EN_SHIFT (4U) +/*! RR_CH4EN - Channel 4 Input Enable in Trigger Mode + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR1_RR_CH4EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_RR_CH4EN_SHIFT)) & LPCMP_RRCR1_RR_CH4EN_MASK) + +#define LPCMP_RRCR1_RR_CH5EN_MASK (0x20U) +#define LPCMP_RRCR1_RR_CH5EN_SHIFT (5U) +/*! RR_CH5EN - Channel 5 Input Enable in Trigger Mode + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR1_RR_CH5EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_RR_CH5EN_SHIFT)) & LPCMP_RRCR1_RR_CH5EN_MASK) + +#define LPCMP_RRCR1_RR_CH6EN_MASK (0x40U) +#define LPCMP_RRCR1_RR_CH6EN_SHIFT (6U) +/*! RR_CH6EN - Channel 6 Input Enable in Trigger Mode + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR1_RR_CH6EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_RR_CH6EN_SHIFT)) & LPCMP_RRCR1_RR_CH6EN_MASK) + +#define LPCMP_RRCR1_RR_CH7EN_MASK (0x80U) +#define LPCMP_RRCR1_RR_CH7EN_SHIFT (7U) +/*! RR_CH7EN - Channel 7 Input Enable in Trigger Mode + * 0b1..Enable + * 0b0..Disable + */ +#define LPCMP_RRCR1_RR_CH7EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_RR_CH7EN_SHIFT)) & LPCMP_RRCR1_RR_CH7EN_MASK) + +#define LPCMP_RRCR1_FIXP_MASK (0x10000U) +#define LPCMP_RRCR1_FIXP_SHIFT (16U) +/*! FIXP - Fixed Port + * 0b0..Fix the plus port. Sweep only the inputs to the minus port. + * 0b1..Fix the minus port. Sweep only the inputs to the plus port. + */ +#define LPCMP_RRCR1_FIXP(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_FIXP_SHIFT)) & LPCMP_RRCR1_FIXP_MASK) + +#define LPCMP_RRCR1_FIXCH_MASK (0x700000U) +#define LPCMP_RRCR1_FIXCH_SHIFT (20U) +/*! FIXCH - Fixed Channel Select + * 0b000..Channel 0 + * 0b001..Channel 1 + * 0b010..Channel 2 + * 0b011..Channel 3 + * 0b100..Channel 4 + * 0b101..Channel 5 + * 0b110..Channel 6 + * 0b111..Channel 7 + */ +#define LPCMP_RRCR1_FIXCH(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR1_FIXCH_SHIFT)) & LPCMP_RRCR1_FIXCH_MASK) +/*! @} */ + +/*! @name RRCSR - Round Robin Control and Status */ +/*! @{ */ + +#define LPCMP_RRCSR_RR_CH0OUT_MASK (0x1U) +#define LPCMP_RRCSR_RR_CH0OUT_SHIFT (0U) +/*! RR_CH0OUT - Comparison Result for Channel 0 */ +#define LPCMP_RRCSR_RR_CH0OUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCSR_RR_CH0OUT_SHIFT)) & LPCMP_RRCSR_RR_CH0OUT_MASK) + +#define LPCMP_RRCSR_RR_CH1OUT_MASK (0x2U) +#define LPCMP_RRCSR_RR_CH1OUT_SHIFT (1U) +/*! RR_CH1OUT - Comparison Result for Channel 1 */ +#define LPCMP_RRCSR_RR_CH1OUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCSR_RR_CH1OUT_SHIFT)) & LPCMP_RRCSR_RR_CH1OUT_MASK) + +#define LPCMP_RRCSR_RR_CH2OUT_MASK (0x4U) +#define LPCMP_RRCSR_RR_CH2OUT_SHIFT (2U) +/*! RR_CH2OUT - Comparison Result for Channel 2 */ +#define LPCMP_RRCSR_RR_CH2OUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCSR_RR_CH2OUT_SHIFT)) & LPCMP_RRCSR_RR_CH2OUT_MASK) + +#define LPCMP_RRCSR_RR_CH3OUT_MASK (0x8U) +#define LPCMP_RRCSR_RR_CH3OUT_SHIFT (3U) +/*! RR_CH3OUT - Comparison Result for Channel 3 */ +#define LPCMP_RRCSR_RR_CH3OUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCSR_RR_CH3OUT_SHIFT)) & LPCMP_RRCSR_RR_CH3OUT_MASK) + +#define LPCMP_RRCSR_RR_CH4OUT_MASK (0x10U) +#define LPCMP_RRCSR_RR_CH4OUT_SHIFT (4U) +/*! RR_CH4OUT - Comparison Result for Channel 4 */ +#define LPCMP_RRCSR_RR_CH4OUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCSR_RR_CH4OUT_SHIFT)) & LPCMP_RRCSR_RR_CH4OUT_MASK) + +#define LPCMP_RRCSR_RR_CH5OUT_MASK (0x20U) +#define LPCMP_RRCSR_RR_CH5OUT_SHIFT (5U) +/*! RR_CH5OUT - Comparison Result for Channel 5 */ +#define LPCMP_RRCSR_RR_CH5OUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCSR_RR_CH5OUT_SHIFT)) & LPCMP_RRCSR_RR_CH5OUT_MASK) + +#define LPCMP_RRCSR_RR_CH6OUT_MASK (0x40U) +#define LPCMP_RRCSR_RR_CH6OUT_SHIFT (6U) +/*! RR_CH6OUT - Comparison Result for Channel 6 */ +#define LPCMP_RRCSR_RR_CH6OUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCSR_RR_CH6OUT_SHIFT)) & LPCMP_RRCSR_RR_CH6OUT_MASK) + +#define LPCMP_RRCSR_RR_CH7OUT_MASK (0x80U) +#define LPCMP_RRCSR_RR_CH7OUT_SHIFT (7U) +/*! RR_CH7OUT - Comparison Result for Channel 7 */ +#define LPCMP_RRCSR_RR_CH7OUT(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCSR_RR_CH7OUT_SHIFT)) & LPCMP_RRCSR_RR_CH7OUT_MASK) +/*! @} */ + +/*! @name RRSR - Round Robin Status */ +/*! @{ */ + +#define LPCMP_RRSR_RR_CH0F_MASK (0x1U) +#define LPCMP_RRSR_RR_CH0F_SHIFT (0U) +/*! RR_CH0F - Channel 0 Input Changed Flag + * 0b0..No different + * 0b1..Different + */ +#define LPCMP_RRSR_RR_CH0F(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRSR_RR_CH0F_SHIFT)) & LPCMP_RRSR_RR_CH0F_MASK) + +#define LPCMP_RRSR_RR_CH1F_MASK (0x2U) +#define LPCMP_RRSR_RR_CH1F_SHIFT (1U) +/*! RR_CH1F - Channel 1 Input Changed Flag + * 0b0..No different + * 0b1..Different + */ +#define LPCMP_RRSR_RR_CH1F(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRSR_RR_CH1F_SHIFT)) & LPCMP_RRSR_RR_CH1F_MASK) + +#define LPCMP_RRSR_RR_CH2F_MASK (0x4U) +#define LPCMP_RRSR_RR_CH2F_SHIFT (2U) +/*! RR_CH2F - Channel 2 Input Changed Flag + * 0b0..No different + * 0b1..Different + */ +#define LPCMP_RRSR_RR_CH2F(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRSR_RR_CH2F_SHIFT)) & LPCMP_RRSR_RR_CH2F_MASK) + +#define LPCMP_RRSR_RR_CH3F_MASK (0x8U) +#define LPCMP_RRSR_RR_CH3F_SHIFT (3U) +/*! RR_CH3F - Channel 3 Input Changed Flag + * 0b0..No different + * 0b1..Different + */ +#define LPCMP_RRSR_RR_CH3F(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRSR_RR_CH3F_SHIFT)) & LPCMP_RRSR_RR_CH3F_MASK) + +#define LPCMP_RRSR_RR_CH4F_MASK (0x10U) +#define LPCMP_RRSR_RR_CH4F_SHIFT (4U) +/*! RR_CH4F - Channel 4 Input Changed Flag + * 0b0..No different + * 0b1..Different + */ +#define LPCMP_RRSR_RR_CH4F(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRSR_RR_CH4F_SHIFT)) & LPCMP_RRSR_RR_CH4F_MASK) + +#define LPCMP_RRSR_RR_CH5F_MASK (0x20U) +#define LPCMP_RRSR_RR_CH5F_SHIFT (5U) +/*! RR_CH5F - Channel 5 Input Changed Flag + * 0b0..No different + * 0b1..Different + */ +#define LPCMP_RRSR_RR_CH5F(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRSR_RR_CH5F_SHIFT)) & LPCMP_RRSR_RR_CH5F_MASK) + +#define LPCMP_RRSR_RR_CH6F_MASK (0x40U) +#define LPCMP_RRSR_RR_CH6F_SHIFT (6U) +/*! RR_CH6F - Channel 6 Input Changed Flag + * 0b0..No different + * 0b1..Different + */ +#define LPCMP_RRSR_RR_CH6F(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRSR_RR_CH6F_SHIFT)) & LPCMP_RRSR_RR_CH6F_MASK) + +#define LPCMP_RRSR_RR_CH7F_MASK (0x80U) +#define LPCMP_RRSR_RR_CH7F_SHIFT (7U) +/*! RR_CH7F - Channel 7 Input Changed Flag + * 0b0..No different + * 0b1..Different + */ +#define LPCMP_RRSR_RR_CH7F(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRSR_RR_CH7F_SHIFT)) & LPCMP_RRSR_RR_CH7F_MASK) +/*! @} */ + +/*! @name RRCR2 - Round Robin Control Register 2 */ +/*! @{ */ + +#define LPCMP_RRCR2_RR_TIMER_RELOAD_MASK (0xFFFFFFFU) +#define LPCMP_RRCR2_RR_TIMER_RELOAD_SHIFT (0U) +/*! RR_TIMER_RELOAD - Number of Sample Clocks */ +#define LPCMP_RRCR2_RR_TIMER_RELOAD(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR2_RR_TIMER_RELOAD_SHIFT)) & LPCMP_RRCR2_RR_TIMER_RELOAD_MASK) + +#define LPCMP_RRCR2_RR_TIMER_EN_MASK (0x80000000U) +#define LPCMP_RRCR2_RR_TIMER_EN_SHIFT (31U) +/*! RR_TIMER_EN - Round-Robin Internal Timer Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPCMP_RRCR2_RR_TIMER_EN(x) (((uint32_t)(((uint32_t)(x)) << LPCMP_RRCR2_RR_TIMER_EN_SHIFT)) & LPCMP_RRCR2_RR_TIMER_EN_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group LPCMP_Register_Masks */ + + +/* LPCMP - Peripheral instance base addresses */ +/** Peripheral CMP0 base address */ +#define CMP0_BASE (0x400B1000u) +/** Peripheral CMP0 base pointer */ +#define CMP0 ((LPCMP_Type *)CMP0_BASE) +/** Peripheral CMP1 base address */ +#define CMP1_BASE (0x400B2000u) +/** Peripheral CMP1 base pointer */ +#define CMP1 ((LPCMP_Type *)CMP1_BASE) +/** Array initializer of LPCMP peripheral base addresses */ +#define LPCMP_BASE_ADDRS { CMP0_BASE, CMP1_BASE } +/** Array initializer of LPCMP peripheral base pointers */ +#define LPCMP_BASE_PTRS { CMP0, CMP1 } + +/*! + * @} + */ /* end of group LPCMP_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- LPDAC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPDAC_Peripheral_Access_Layer LPDAC Peripheral Access Layer + * @{ + */ + +/** LPDAC - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version Identifier, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + __O uint32_t DATA; /**< Data, offset: 0x8 */ + __IO uint32_t GCR; /**< Global Control, offset: 0xC */ + __IO uint32_t FCR; /**< DAC FIFO Control, offset: 0x10 */ + __I uint32_t FPR; /**< DAC FIFO Pointer, offset: 0x14 */ + __IO uint32_t FSR; /**< FIFO Status, offset: 0x18 */ + __IO uint32_t IER; /**< Interrupt Enable, offset: 0x1C */ + __IO uint32_t DER; /**< DMA Enable, offset: 0x20 */ + __IO uint32_t RCR; /**< Reset Control, offset: 0x24 */ + __O uint32_t TCR; /**< Trigger Control, offset: 0x28 */ + __IO uint32_t PCR; /**< Periodic Trigger Control, offset: 0x2C */ +} LPDAC_Type; + +/* ---------------------------------------------------------------------------- + -- LPDAC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPDAC_Register_Masks LPDAC Register Masks + * @{ + */ + +/*! @name VERID - Version Identifier */ +/*! @{ */ + +#define LPDAC_VERID_FEATURE_MASK (0xFFFFU) +#define LPDAC_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Identification Number */ +#define LPDAC_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_VERID_FEATURE_SHIFT)) & LPDAC_VERID_FEATURE_MASK) + +#define LPDAC_VERID_MINOR_MASK (0xFF0000U) +#define LPDAC_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define LPDAC_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_VERID_MINOR_SHIFT)) & LPDAC_VERID_MINOR_MASK) + +#define LPDAC_VERID_MAJOR_MASK (0xFF000000U) +#define LPDAC_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define LPDAC_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_VERID_MAJOR_SHIFT)) & LPDAC_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define LPDAC_PARAM_FIFOSZ_MASK (0x7U) +#define LPDAC_PARAM_FIFOSZ_SHIFT (0U) +/*! FIFOSZ - FIFO Size + * 0b000..Reserved + * 0b001..FIFO depth is 4 + * 0b010..FIFO depth is 8 + * 0b011..FIFO depth is 16 + * 0b100..FIFO depth is 32 + * 0b101..FIFO depth is 64 + * 0b110..FIFO depth is 128 + * 0b111..FIFO depth is 256 + */ +#define LPDAC_PARAM_FIFOSZ(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_PARAM_FIFOSZ_SHIFT)) & LPDAC_PARAM_FIFOSZ_MASK) +/*! @} */ + +/*! @name DATA - Data */ +/*! @{ */ + +#define LPDAC_DATA_DATA_MASK (0xFFFU) +#define LPDAC_DATA_DATA_SHIFT (0U) +/*! DATA - FIFO Entry or Buffer Entry */ +#define LPDAC_DATA_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_DATA_DATA_SHIFT)) & LPDAC_DATA_DATA_MASK) +/*! @} */ + +/*! @name GCR - Global Control */ +/*! @{ */ + +#define LPDAC_GCR_DACEN_MASK (0x1U) +#define LPDAC_GCR_DACEN_SHIFT (0U) +/*! DACEN - DAC Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_GCR_DACEN(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_DACEN_SHIFT)) & LPDAC_GCR_DACEN_MASK) + +#define LPDAC_GCR_DACRFS_MASK (0x6U) +#define LPDAC_GCR_DACRFS_SHIFT (1U) +/*! DACRFS - DAC Reference Select + * 0b00..Selects VREFH0 as the reference voltage. + * 0b01..Selects VREFH1 as the reference voltage. + * 0b10..Selects VREFH2 as the reference voltage. + * 0b11..Reserved. + */ +#define LPDAC_GCR_DACRFS(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_DACRFS_SHIFT)) & LPDAC_GCR_DACRFS_MASK) + +#define LPDAC_GCR_FIFOEN_MASK (0x8U) +#define LPDAC_GCR_FIFOEN_SHIFT (3U) +/*! FIFOEN - FIFO Enable + * 0b0..Enables FIFO mode and disables Buffer mode. Any data written to DATA[DATA] goes to buffer then goes to conversion. + * 0b1..Enables FIFO mode. Data will be first read from FIFO to buffer and then goes to conversion. + */ +#define LPDAC_GCR_FIFOEN(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_FIFOEN_SHIFT)) & LPDAC_GCR_FIFOEN_MASK) + +#define LPDAC_GCR_SWMD_MASK (0x10U) +#define LPDAC_GCR_SWMD_SHIFT (4U) +/*! SWMD - Swing Back Mode + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_GCR_SWMD(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_SWMD_SHIFT)) & LPDAC_GCR_SWMD_MASK) + +#define LPDAC_GCR_TRGSEL_MASK (0x20U) +#define LPDAC_GCR_TRGSEL_SHIFT (5U) +/*! TRGSEL - DAC Trigger Select + * 0b0..Hardware trigger + * 0b1..Software trigger + */ +#define LPDAC_GCR_TRGSEL(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_TRGSEL_SHIFT)) & LPDAC_GCR_TRGSEL_MASK) + +#define LPDAC_GCR_PTGEN_MASK (0x40U) +#define LPDAC_GCR_PTGEN_SHIFT (6U) +/*! PTGEN - DAC Periodic Trigger Mode Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_GCR_PTGEN(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_PTGEN_SHIFT)) & LPDAC_GCR_PTGEN_MASK) + +#define LPDAC_GCR_LATCH_CYC_MASK (0xF00U) +#define LPDAC_GCR_LATCH_CYC_SHIFT (8U) +/*! LATCH_CYC - RCLK Cycles Before Data Latch */ +#define LPDAC_GCR_LATCH_CYC(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_LATCH_CYC_SHIFT)) & LPDAC_GCR_LATCH_CYC_MASK) + +#define LPDAC_GCR_BUF_EN_MASK (0x20000U) +#define LPDAC_GCR_BUF_EN_SHIFT (17U) +/*! BUF_EN - Buffer Enable + * 0b0..Not used + * 0b1..Used + */ +#define LPDAC_GCR_BUF_EN(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_BUF_EN_SHIFT)) & LPDAC_GCR_BUF_EN_MASK) + +#define LPDAC_GCR_IREF_PTAT_EXT_SEL_MASK (0x100000U) +#define LPDAC_GCR_IREF_PTAT_EXT_SEL_SHIFT (20U) +/*! IREF_PTAT_EXT_SEL - External On-Chip PTAT Current Reference Select + * 0b0..Not selected + * 0b1..Selected + */ +#define LPDAC_GCR_IREF_PTAT_EXT_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_IREF_PTAT_EXT_SEL_SHIFT)) & LPDAC_GCR_IREF_PTAT_EXT_SEL_MASK) + +#define LPDAC_GCR_IREF_ZTC_EXT_SEL_MASK (0x200000U) +#define LPDAC_GCR_IREF_ZTC_EXT_SEL_SHIFT (21U) +/*! IREF_ZTC_EXT_SEL - External On-Chip ZTC Current Reference Select + * 0b0..Not selected + * 0b1..Selected + */ +#define LPDAC_GCR_IREF_ZTC_EXT_SEL(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_IREF_ZTC_EXT_SEL_SHIFT)) & LPDAC_GCR_IREF_ZTC_EXT_SEL_MASK) + +#define LPDAC_GCR_BUF_SPD_CTRL_MASK (0x800000U) +#define LPDAC_GCR_BUF_SPD_CTRL_SHIFT (23U) +/*! BUF_SPD_CTRL - OPAMP as Buffer, Speed Control Signal + * 0b0..Lower Low-Power mode + * 0b1..Low-Power mode + */ +#define LPDAC_GCR_BUF_SPD_CTRL(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_GCR_BUF_SPD_CTRL_SHIFT)) & LPDAC_GCR_BUF_SPD_CTRL_MASK) +/*! @} */ + +/*! @name FCR - DAC FIFO Control */ +/*! @{ */ + +#define LPDAC_FCR_WML_MASK (0xFU) +#define LPDAC_FCR_WML_SHIFT (0U) +/*! WML - Watermark Level */ +#define LPDAC_FCR_WML(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FCR_WML_SHIFT)) & LPDAC_FCR_WML_MASK) +/*! @} */ + +/*! @name FPR - DAC FIFO Pointer */ +/*! @{ */ + +#define LPDAC_FPR_FIFO_RPT_MASK (0xFU) +#define LPDAC_FPR_FIFO_RPT_SHIFT (0U) +/*! FIFO_RPT - FIFO Read Pointer */ +#define LPDAC_FPR_FIFO_RPT(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FPR_FIFO_RPT_SHIFT)) & LPDAC_FPR_FIFO_RPT_MASK) + +#define LPDAC_FPR_FIFO_WPT_MASK (0xF0000U) +#define LPDAC_FPR_FIFO_WPT_SHIFT (16U) +/*! FIFO_WPT - FIFO Write Pointer */ +#define LPDAC_FPR_FIFO_WPT(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FPR_FIFO_WPT_SHIFT)) & LPDAC_FPR_FIFO_WPT_MASK) +/*! @} */ + +/*! @name FSR - FIFO Status */ +/*! @{ */ + +#define LPDAC_FSR_FULL_MASK (0x1U) +#define LPDAC_FSR_FULL_SHIFT (0U) +/*! FULL - FIFO Full Flag + * 0b0..Not full + * 0b1..Full + */ +#define LPDAC_FSR_FULL(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FSR_FULL_SHIFT)) & LPDAC_FSR_FULL_MASK) + +#define LPDAC_FSR_EMPTY_MASK (0x2U) +#define LPDAC_FSR_EMPTY_SHIFT (1U) +/*! EMPTY - FIFO Empty Flag + * 0b0..Not empty + * 0b1..Empty + */ +#define LPDAC_FSR_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FSR_EMPTY_SHIFT)) & LPDAC_FSR_EMPTY_MASK) + +#define LPDAC_FSR_WM_MASK (0x4U) +#define LPDAC_FSR_WM_SHIFT (2U) +/*! WM - FIFO Watermark Status Flag + * 0b0..Data in FIFO is more than watermark level + * 0b1..Data in FIFO is less than or equal to watermark level + */ +#define LPDAC_FSR_WM(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FSR_WM_SHIFT)) & LPDAC_FSR_WM_MASK) + +#define LPDAC_FSR_SWBK_MASK (0x8U) +#define LPDAC_FSR_SWBK_SHIFT (3U) +/*! SWBK - Swing Back One Cycle Complete Flag + * 0b0..No swing back cycle has completed since the last time the flag was cleared + * 0b1..At least one swing back cycle has occurred since the last time the flag was cleared + */ +#define LPDAC_FSR_SWBK(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FSR_SWBK_SHIFT)) & LPDAC_FSR_SWBK_MASK) + +#define LPDAC_FSR_OF_MASK (0x40U) +#define LPDAC_FSR_OF_SHIFT (6U) +/*! OF - FIFO Overflow Flag + * 0b0..No overflow has occurred since the last time the flag was cleared + * 0b1..At least one FIFO overflow has occurred since the last time the flag was cleared + */ +#define LPDAC_FSR_OF(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FSR_OF_SHIFT)) & LPDAC_FSR_OF_MASK) + +#define LPDAC_FSR_UF_MASK (0x80U) +#define LPDAC_FSR_UF_SHIFT (7U) +/*! UF - FIFO Underflow Flag + * 0b0..No underflow has occurred since the last time the flag was cleared + * 0b1..At least one trigger underflow has occurred since the last time the flag was cleared + */ +#define LPDAC_FSR_UF(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FSR_UF_SHIFT)) & LPDAC_FSR_UF_MASK) + +#define LPDAC_FSR_PTGCOCO_MASK (0x100U) +#define LPDAC_FSR_PTGCOCO_SHIFT (8U) +/*! PTGCOCO - Period Trigger Mode Conversion Complete Flag + * 0b0..Not completed or not started + * 0b1..Completed + */ +#define LPDAC_FSR_PTGCOCO(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_FSR_PTGCOCO_SHIFT)) & LPDAC_FSR_PTGCOCO_MASK) +/*! @} */ + +/*! @name IER - Interrupt Enable */ +/*! @{ */ + +#define LPDAC_IER_FULL_IE_MASK (0x1U) +#define LPDAC_IER_FULL_IE_SHIFT (0U) +/*! FULL_IE - FIFO Full Interrupt Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_IER_FULL_IE(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_IER_FULL_IE_SHIFT)) & LPDAC_IER_FULL_IE_MASK) + +#define LPDAC_IER_EMPTY_IE_MASK (0x2U) +#define LPDAC_IER_EMPTY_IE_SHIFT (1U) +/*! EMPTY_IE - FIFO Empty Interrupt Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_IER_EMPTY_IE(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_IER_EMPTY_IE_SHIFT)) & LPDAC_IER_EMPTY_IE_MASK) + +#define LPDAC_IER_WM_IE_MASK (0x4U) +#define LPDAC_IER_WM_IE_SHIFT (2U) +/*! WM_IE - FIFO Watermark Interrupt Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_IER_WM_IE(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_IER_WM_IE_SHIFT)) & LPDAC_IER_WM_IE_MASK) + +#define LPDAC_IER_SWBK_IE_MASK (0x8U) +#define LPDAC_IER_SWBK_IE_SHIFT (3U) +/*! SWBK_IE - Swing Back One Cycle Complete Interrupt Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_IER_SWBK_IE(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_IER_SWBK_IE_SHIFT)) & LPDAC_IER_SWBK_IE_MASK) + +#define LPDAC_IER_OF_IE_MASK (0x40U) +#define LPDAC_IER_OF_IE_SHIFT (6U) +/*! OF_IE - FIFO Overflow Interrupt Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_IER_OF_IE(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_IER_OF_IE_SHIFT)) & LPDAC_IER_OF_IE_MASK) + +#define LPDAC_IER_UF_IE_MASK (0x80U) +#define LPDAC_IER_UF_IE_SHIFT (7U) +/*! UF_IE - FIFO Underflow Interrupt Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_IER_UF_IE(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_IER_UF_IE_SHIFT)) & LPDAC_IER_UF_IE_MASK) + +#define LPDAC_IER_PTGCOCO_IE_MASK (0x100U) +#define LPDAC_IER_PTGCOCO_IE_SHIFT (8U) +/*! PTGCOCO_IE - PTG Mode Conversion Complete Interrupt Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_IER_PTGCOCO_IE(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_IER_PTGCOCO_IE_SHIFT)) & LPDAC_IER_PTGCOCO_IE_MASK) +/*! @} */ + +/*! @name DER - DMA Enable */ +/*! @{ */ + +#define LPDAC_DER_EMPTY_DMAEN_MASK (0x2U) +#define LPDAC_DER_EMPTY_DMAEN_SHIFT (1U) +/*! EMPTY_DMAEN - FIFO Empty DMA Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_DER_EMPTY_DMAEN(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_DER_EMPTY_DMAEN_SHIFT)) & LPDAC_DER_EMPTY_DMAEN_MASK) + +#define LPDAC_DER_WM_DMAEN_MASK (0x4U) +#define LPDAC_DER_WM_DMAEN_SHIFT (2U) +/*! WM_DMAEN - FIFO Watermark DMA Enable + * 0b0..Disables + * 0b1..Enables + */ +#define LPDAC_DER_WM_DMAEN(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_DER_WM_DMAEN_SHIFT)) & LPDAC_DER_WM_DMAEN_MASK) +/*! @} */ + +/*! @name RCR - Reset Control */ +/*! @{ */ + +#define LPDAC_RCR_SWRST_MASK (0x1U) +#define LPDAC_RCR_SWRST_SHIFT (0U) +/*! SWRST - Software Reset + * 0b0..No effect + * 0b1..Software reset + */ +#define LPDAC_RCR_SWRST(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_RCR_SWRST_SHIFT)) & LPDAC_RCR_SWRST_MASK) + +#define LPDAC_RCR_FIFORST_MASK (0x2U) +#define LPDAC_RCR_FIFORST_SHIFT (1U) +/*! FIFORST - FIFO Reset + * 0b0..No effect + * 0b1..FIFO reset + */ +#define LPDAC_RCR_FIFORST(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_RCR_FIFORST_SHIFT)) & LPDAC_RCR_FIFORST_MASK) +/*! @} */ + +/*! @name TCR - Trigger Control */ +/*! @{ */ + +#define LPDAC_TCR_SWTRG_MASK (0x1U) +#define LPDAC_TCR_SWTRG_SHIFT (0U) +/*! SWTRG - Software Trigger + * 0b0..Not valid + * 0b1..Valid + */ +#define LPDAC_TCR_SWTRG(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_TCR_SWTRG_SHIFT)) & LPDAC_TCR_SWTRG_MASK) +/*! @} */ + +/*! @name PCR - Periodic Trigger Control */ +/*! @{ */ + +#define LPDAC_PCR_PTG_NUM_MASK (0xFFFFU) +#define LPDAC_PCR_PTG_NUM_SHIFT (0U) +/*! PTG_NUM - Periodic Trigger Number */ +#define LPDAC_PCR_PTG_NUM(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_PCR_PTG_NUM_SHIFT)) & LPDAC_PCR_PTG_NUM_MASK) + +#define LPDAC_PCR_PTG_PERIOD_MASK (0xFFFF0000U) +#define LPDAC_PCR_PTG_PERIOD_SHIFT (16U) +/*! PTG_PERIOD - Periodic Trigger Period Width */ +#define LPDAC_PCR_PTG_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << LPDAC_PCR_PTG_PERIOD_SHIFT)) & LPDAC_PCR_PTG_PERIOD_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group LPDAC_Register_Masks */ + + +/* LPDAC - Peripheral instance base addresses */ +/** Peripheral DAC0 base address */ +#define DAC0_BASE (0x400B4000u) +/** Peripheral DAC0 base pointer */ +#define DAC0 ((LPDAC_Type *)DAC0_BASE) +/** Array initializer of LPDAC peripheral base addresses */ +#define LPDAC_BASE_ADDRS { DAC0_BASE } +/** Array initializer of LPDAC peripheral base pointers */ +#define LPDAC_BASE_PTRS { DAC0 } +/** Interrupt vectors for the LPDAC peripheral type */ +#define LPDAC_IRQS { DAC0_IRQn } + +/*! + * @} + */ /* end of group LPDAC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- LPI2C Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPI2C_Peripheral_Access_Layer LPI2C Peripheral Access Layer + * @{ + */ + +/** LPI2C - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + uint8_t RESERVED_0[8]; + __IO uint32_t MCR; /**< Controller Control, offset: 0x10 */ + __IO uint32_t MSR; /**< Controller Status, offset: 0x14 */ + __IO uint32_t MIER; /**< Controller Interrupt Enable, offset: 0x18 */ + __IO uint32_t MDER; /**< Controller DMA Enable, offset: 0x1C */ + __IO uint32_t MCFGR0; /**< Controller Configuration 0, offset: 0x20 */ + __IO uint32_t MCFGR1; /**< Controller Configuration 1, offset: 0x24 */ + __IO uint32_t MCFGR2; /**< Controller Configuration 2, offset: 0x28 */ + __IO uint32_t MCFGR3; /**< Controller Configuration 3, offset: 0x2C */ + uint8_t RESERVED_1[16]; + __IO uint32_t MDMR; /**< Controller Data Match, offset: 0x40 */ + uint8_t RESERVED_2[4]; + __IO uint32_t MCCR0; /**< Controller Clock Configuration 0, offset: 0x48 */ + uint8_t RESERVED_3[4]; + __IO uint32_t MCCR1; /**< Controller Clock Configuration 1, offset: 0x50 */ + uint8_t RESERVED_4[4]; + __IO uint32_t MFCR; /**< Controller FIFO Control, offset: 0x58 */ + __I uint32_t MFSR; /**< Controller FIFO Status, offset: 0x5C */ + __O uint32_t MTDR; /**< Controller Transmit Data, offset: 0x60 */ + uint8_t RESERVED_5[12]; + __I uint32_t MRDR; /**< Controller Receive Data, offset: 0x70 */ + uint8_t RESERVED_6[4]; + __I uint32_t MRDROR; /**< Controller Receive Data Read Only, offset: 0x78 */ + uint8_t RESERVED_7[148]; + __IO uint32_t SCR; /**< Target Control, offset: 0x110 */ + __IO uint32_t SSR; /**< Target Status, offset: 0x114 */ + __IO uint32_t SIER; /**< Target Interrupt Enable, offset: 0x118 */ + __IO uint32_t SDER; /**< Target DMA Enable, offset: 0x11C */ + __IO uint32_t SCFGR0; /**< Target Configuration 0, offset: 0x120 */ + __IO uint32_t SCFGR1; /**< Target Configuration 1, offset: 0x124 */ + __IO uint32_t SCFGR2; /**< Target Configuration 2, offset: 0x128 */ + uint8_t RESERVED_8[20]; + __IO uint32_t SAMR; /**< Target Address Match, offset: 0x140 */ + uint8_t RESERVED_9[12]; + __I uint32_t SASR; /**< Target Address Status, offset: 0x150 */ + __IO uint32_t STAR; /**< Target Transmit ACK, offset: 0x154 */ + uint8_t RESERVED_10[8]; + __O uint32_t STDR; /**< Target Transmit Data, offset: 0x160 */ + uint8_t RESERVED_11[12]; + __I uint32_t SRDR; /**< Target Receive Data, offset: 0x170 */ + uint8_t RESERVED_12[4]; + __I uint32_t SRDROR; /**< Target Receive Data Read Only, offset: 0x178 */ +} LPI2C_Type; + +/* ---------------------------------------------------------------------------- + -- LPI2C Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPI2C_Register_Masks LPI2C Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define LPI2C_VERID_FEATURE_MASK (0xFFFFU) +#define LPI2C_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number + * 0b0000000000000010..Controller only, with standard feature set + * 0b0000000000000011..Controller and target, with standard feature set + */ +#define LPI2C_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_FEATURE_SHIFT)) & LPI2C_VERID_FEATURE_MASK) + +#define LPI2C_VERID_MINOR_MASK (0xFF0000U) +#define LPI2C_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define LPI2C_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_MINOR_SHIFT)) & LPI2C_VERID_MINOR_MASK) + +#define LPI2C_VERID_MAJOR_MASK (0xFF000000U) +#define LPI2C_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define LPI2C_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_VERID_MAJOR_SHIFT)) & LPI2C_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define LPI2C_PARAM_MTXFIFO_MASK (0xFU) +#define LPI2C_PARAM_MTXFIFO_SHIFT (0U) +/*! MTXFIFO - Controller Transmit FIFO Size */ +#define LPI2C_PARAM_MTXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_PARAM_MTXFIFO_SHIFT)) & LPI2C_PARAM_MTXFIFO_MASK) + +#define LPI2C_PARAM_MRXFIFO_MASK (0xF00U) +#define LPI2C_PARAM_MRXFIFO_SHIFT (8U) +/*! MRXFIFO - Controller Receive FIFO Size */ +#define LPI2C_PARAM_MRXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_PARAM_MRXFIFO_SHIFT)) & LPI2C_PARAM_MRXFIFO_MASK) +/*! @} */ + +/*! @name MCR - Controller Control */ +/*! @{ */ + +#define LPI2C_MCR_MEN_MASK (0x1U) +#define LPI2C_MCR_MEN_SHIFT (0U) +/*! MEN - Controller Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MCR_MEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_MEN_SHIFT)) & LPI2C_MCR_MEN_MASK) + +#define LPI2C_MCR_RST_MASK (0x2U) +#define LPI2C_MCR_RST_SHIFT (1U) +/*! RST - Software Reset + * 0b0..No effect + * 0b1..Reset + */ +#define LPI2C_MCR_RST(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RST_SHIFT)) & LPI2C_MCR_RST_MASK) + +#define LPI2C_MCR_DOZEN_MASK (0x4U) +#define LPI2C_MCR_DOZEN_SHIFT (2U) +/*! DOZEN - Doze Mode Enable + * 0b0..Enable + * 0b1..Disable + */ +#define LPI2C_MCR_DOZEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_DOZEN_SHIFT)) & LPI2C_MCR_DOZEN_MASK) + +#define LPI2C_MCR_DBGEN_MASK (0x8U) +#define LPI2C_MCR_DBGEN_SHIFT (3U) +/*! DBGEN - Debug Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MCR_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_DBGEN_SHIFT)) & LPI2C_MCR_DBGEN_MASK) + +#define LPI2C_MCR_RTF_MASK (0x100U) +#define LPI2C_MCR_RTF_SHIFT (8U) +/*! RTF - Reset Transmit FIFO + * 0b0..No effect + * 0b1..Reset transmit FIFO + */ +#define LPI2C_MCR_RTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RTF_SHIFT)) & LPI2C_MCR_RTF_MASK) + +#define LPI2C_MCR_RRF_MASK (0x200U) +#define LPI2C_MCR_RRF_SHIFT (9U) +/*! RRF - Reset Receive FIFO + * 0b0..No effect + * 0b1..Reset receive FIFO + */ +#define LPI2C_MCR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCR_RRF_SHIFT)) & LPI2C_MCR_RRF_MASK) +/*! @} */ + +/*! @name MSR - Controller Status */ +/*! @{ */ + +#define LPI2C_MSR_TDF_MASK (0x1U) +#define LPI2C_MSR_TDF_SHIFT (0U) +/*! TDF - Transmit Data Flag + * 0b0..Transmit data not requested + * 0b1..Transmit data requested + */ +#define LPI2C_MSR_TDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_TDF_SHIFT)) & LPI2C_MSR_TDF_MASK) + +#define LPI2C_MSR_RDF_MASK (0x2U) +#define LPI2C_MSR_RDF_SHIFT (1U) +/*! RDF - Receive Data Flag + * 0b0..Receive data not ready + * 0b1..Receive data ready + */ +#define LPI2C_MSR_RDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_RDF_SHIFT)) & LPI2C_MSR_RDF_MASK) + +#define LPI2C_MSR_EPF_MASK (0x100U) +#define LPI2C_MSR_EPF_SHIFT (8U) +/*! EPF - End Packet Flag + * 0b0..No Stop or repeated Start generated + * 0b1..Stop or repeated Start generated + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_MSR_EPF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_EPF_SHIFT)) & LPI2C_MSR_EPF_MASK) + +#define LPI2C_MSR_SDF_MASK (0x200U) +#define LPI2C_MSR_SDF_SHIFT (9U) +/*! SDF - Stop Detect Flag + * 0b0..No Stop condition generated + * 0b1..Stop condition generated + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_MSR_SDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_SDF_SHIFT)) & LPI2C_MSR_SDF_MASK) + +#define LPI2C_MSR_NDF_MASK (0x400U) +#define LPI2C_MSR_NDF_SHIFT (10U) +/*! NDF - NACK Detect Flag + * 0b0..No unexpected NACK detected + * 0b1..Unexpected NACK detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_MSR_NDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_NDF_SHIFT)) & LPI2C_MSR_NDF_MASK) + +#define LPI2C_MSR_ALF_MASK (0x800U) +#define LPI2C_MSR_ALF_SHIFT (11U) +/*! ALF - Arbitration Lost Flag + * 0b0..Controller did not lose arbitration + * 0b1..Controller lost arbitration + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_MSR_ALF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_ALF_SHIFT)) & LPI2C_MSR_ALF_MASK) + +#define LPI2C_MSR_FEF_MASK (0x1000U) +#define LPI2C_MSR_FEF_SHIFT (12U) +/*! FEF - FIFO Error Flag + * 0b0..No FIFO error + * 0b1..FIFO error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_MSR_FEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_FEF_SHIFT)) & LPI2C_MSR_FEF_MASK) + +#define LPI2C_MSR_PLTF_MASK (0x2000U) +#define LPI2C_MSR_PLTF_SHIFT (13U) +/*! PLTF - Pin Low Timeout Flag + * 0b0..Pin low timeout did not occur + * 0b1..Pin low timeout occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_MSR_PLTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_PLTF_SHIFT)) & LPI2C_MSR_PLTF_MASK) + +#define LPI2C_MSR_DMF_MASK (0x4000U) +#define LPI2C_MSR_DMF_SHIFT (14U) +/*! DMF - Data Match Flag + * 0b0..Matching data not received + * 0b1..Matching data received + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_MSR_DMF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_DMF_SHIFT)) & LPI2C_MSR_DMF_MASK) + +#define LPI2C_MSR_STF_MASK (0x8000U) +#define LPI2C_MSR_STF_SHIFT (15U) +/*! STF - Start Flag + * 0b0..Start condition not detected + * 0b1..Start condition detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_MSR_STF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_STF_SHIFT)) & LPI2C_MSR_STF_MASK) + +#define LPI2C_MSR_MBF_MASK (0x1000000U) +#define LPI2C_MSR_MBF_SHIFT (24U) +/*! MBF - Controller Busy Flag + * 0b0..Idle + * 0b1..Busy + */ +#define LPI2C_MSR_MBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_MBF_SHIFT)) & LPI2C_MSR_MBF_MASK) + +#define LPI2C_MSR_BBF_MASK (0x2000000U) +#define LPI2C_MSR_BBF_SHIFT (25U) +/*! BBF - Bus Busy Flag + * 0b0..Idle + * 0b1..Busy + */ +#define LPI2C_MSR_BBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MSR_BBF_SHIFT)) & LPI2C_MSR_BBF_MASK) +/*! @} */ + +/*! @name MIER - Controller Interrupt Enable */ +/*! @{ */ + +#define LPI2C_MIER_TDIE_MASK (0x1U) +#define LPI2C_MIER_TDIE_SHIFT (0U) +/*! TDIE - Transmit Data Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_TDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_TDIE_SHIFT)) & LPI2C_MIER_TDIE_MASK) + +#define LPI2C_MIER_RDIE_MASK (0x2U) +#define LPI2C_MIER_RDIE_SHIFT (1U) +/*! RDIE - Receive Data Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_RDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_RDIE_SHIFT)) & LPI2C_MIER_RDIE_MASK) + +#define LPI2C_MIER_EPIE_MASK (0x100U) +#define LPI2C_MIER_EPIE_SHIFT (8U) +/*! EPIE - End Packet Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_EPIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_EPIE_SHIFT)) & LPI2C_MIER_EPIE_MASK) + +#define LPI2C_MIER_SDIE_MASK (0x200U) +#define LPI2C_MIER_SDIE_SHIFT (9U) +/*! SDIE - Stop Detect Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_SDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_SDIE_SHIFT)) & LPI2C_MIER_SDIE_MASK) + +#define LPI2C_MIER_NDIE_MASK (0x400U) +#define LPI2C_MIER_NDIE_SHIFT (10U) +/*! NDIE - NACK Detect Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_NDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_NDIE_SHIFT)) & LPI2C_MIER_NDIE_MASK) + +#define LPI2C_MIER_ALIE_MASK (0x800U) +#define LPI2C_MIER_ALIE_SHIFT (11U) +/*! ALIE - Arbitration Lost Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_ALIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_ALIE_SHIFT)) & LPI2C_MIER_ALIE_MASK) + +#define LPI2C_MIER_FEIE_MASK (0x1000U) +#define LPI2C_MIER_FEIE_SHIFT (12U) +/*! FEIE - FIFO Error Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_FEIE_SHIFT)) & LPI2C_MIER_FEIE_MASK) + +#define LPI2C_MIER_PLTIE_MASK (0x2000U) +#define LPI2C_MIER_PLTIE_SHIFT (13U) +/*! PLTIE - Pin Low Timeout Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_PLTIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_PLTIE_SHIFT)) & LPI2C_MIER_PLTIE_MASK) + +#define LPI2C_MIER_DMIE_MASK (0x4000U) +#define LPI2C_MIER_DMIE_SHIFT (14U) +/*! DMIE - Data Match Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_DMIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_DMIE_SHIFT)) & LPI2C_MIER_DMIE_MASK) + +#define LPI2C_MIER_STIE_MASK (0x8000U) +#define LPI2C_MIER_STIE_SHIFT (15U) +/*! STIE - Start Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MIER_STIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MIER_STIE_SHIFT)) & LPI2C_MIER_STIE_MASK) +/*! @} */ + +/*! @name MDER - Controller DMA Enable */ +/*! @{ */ + +#define LPI2C_MDER_TDDE_MASK (0x1U) +#define LPI2C_MDER_TDDE_SHIFT (0U) +/*! TDDE - Transmit Data DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MDER_TDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDER_TDDE_SHIFT)) & LPI2C_MDER_TDDE_MASK) + +#define LPI2C_MDER_RDDE_MASK (0x2U) +#define LPI2C_MDER_RDDE_SHIFT (1U) +/*! RDDE - Receive Data DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MDER_RDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDER_RDDE_SHIFT)) & LPI2C_MDER_RDDE_MASK) +/*! @} */ + +/*! @name MCFGR0 - Controller Configuration 0 */ +/*! @{ */ + +#define LPI2C_MCFGR0_HREN_MASK (0x1U) +#define LPI2C_MCFGR0_HREN_SHIFT (0U) +/*! HREN - Host Request Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MCFGR0_HREN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HREN_SHIFT)) & LPI2C_MCFGR0_HREN_MASK) + +#define LPI2C_MCFGR0_HRPOL_MASK (0x2U) +#define LPI2C_MCFGR0_HRPOL_SHIFT (1U) +/*! HRPOL - Host Request Polarity + * 0b0..Active low + * 0b1..Active high + */ +#define LPI2C_MCFGR0_HRPOL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HRPOL_SHIFT)) & LPI2C_MCFGR0_HRPOL_MASK) + +#define LPI2C_MCFGR0_HRSEL_MASK (0x4U) +#define LPI2C_MCFGR0_HRSEL_SHIFT (2U) +/*! HRSEL - Host Request Select + * 0b0..Host request input is pin HREQ + * 0b1..Host request input is input trigger + */ +#define LPI2C_MCFGR0_HRSEL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HRSEL_SHIFT)) & LPI2C_MCFGR0_HRSEL_MASK) + +#define LPI2C_MCFGR0_HRDIR_MASK (0x8U) +#define LPI2C_MCFGR0_HRDIR_SHIFT (3U) +/*! HRDIR - Host Request Direction + * 0b0..HREQ pin is input (for LPI2C controller) + * 0b1..HREQ pin is output (for LPI2C target) + */ +#define LPI2C_MCFGR0_HRDIR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_HRDIR_SHIFT)) & LPI2C_MCFGR0_HRDIR_MASK) + +#define LPI2C_MCFGR0_CIRFIFO_MASK (0x100U) +#define LPI2C_MCFGR0_CIRFIFO_SHIFT (8U) +/*! CIRFIFO - Circular FIFO Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_MCFGR0_CIRFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_CIRFIFO_SHIFT)) & LPI2C_MCFGR0_CIRFIFO_MASK) + +#define LPI2C_MCFGR0_RDMO_MASK (0x200U) +#define LPI2C_MCFGR0_RDMO_SHIFT (9U) +/*! RDMO - Receive Data Match Only + * 0b0..Received data is stored in the receive FIFO + * 0b1..Received data is discarded unless MSR[DMF] is set + */ +#define LPI2C_MCFGR0_RDMO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_RDMO_SHIFT)) & LPI2C_MCFGR0_RDMO_MASK) + +#define LPI2C_MCFGR0_RELAX_MASK (0x10000U) +#define LPI2C_MCFGR0_RELAX_SHIFT (16U) +/*! RELAX - Relaxed Mode + * 0b0..Normal transfer + * 0b1..Relaxed transfer + */ +#define LPI2C_MCFGR0_RELAX(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_RELAX_SHIFT)) & LPI2C_MCFGR0_RELAX_MASK) + +#define LPI2C_MCFGR0_ABORT_MASK (0x20000U) +#define LPI2C_MCFGR0_ABORT_SHIFT (17U) +/*! ABORT - Abort Transfer + * 0b0..Normal transfer + * 0b1..Abort existing transfer and do not start a new one + */ +#define LPI2C_MCFGR0_ABORT(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR0_ABORT_SHIFT)) & LPI2C_MCFGR0_ABORT_MASK) +/*! @} */ + +/*! @name MCFGR1 - Controller Configuration 1 */ +/*! @{ */ + +#define LPI2C_MCFGR1_PRESCALE_MASK (0x7U) +#define LPI2C_MCFGR1_PRESCALE_SHIFT (0U) +/*! PRESCALE - Prescaler + * 0b000..Divide by 1 + * 0b001..Divide by 2 + * 0b010..Divide by 4 + * 0b011..Divide by 8 + * 0b100..Divide by 16 + * 0b101..Divide by 32 + * 0b110..Divide by 64 + * 0b111..Divide by 128 + */ +#define LPI2C_MCFGR1_PRESCALE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_PRESCALE_SHIFT)) & LPI2C_MCFGR1_PRESCALE_MASK) + +#define LPI2C_MCFGR1_AUTOSTOP_MASK (0x100U) +#define LPI2C_MCFGR1_AUTOSTOP_SHIFT (8U) +/*! AUTOSTOP - Automatic Stop Generation + * 0b0..No effect + * 0b1..Stop automatically generated + */ +#define LPI2C_MCFGR1_AUTOSTOP(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_AUTOSTOP_SHIFT)) & LPI2C_MCFGR1_AUTOSTOP_MASK) + +#define LPI2C_MCFGR1_IGNACK_MASK (0x200U) +#define LPI2C_MCFGR1_IGNACK_SHIFT (9U) +/*! IGNACK - Ignore NACK + * 0b0..No effect + * 0b1..Treat a received NACK as an ACK + */ +#define LPI2C_MCFGR1_IGNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_IGNACK_SHIFT)) & LPI2C_MCFGR1_IGNACK_MASK) + +#define LPI2C_MCFGR1_TIMECFG_MASK (0x400U) +#define LPI2C_MCFGR1_TIMECFG_SHIFT (10U) +/*! TIMECFG - Timeout Configuration + * 0b0..SCL + * 0b1..SCL or SDA + */ +#define LPI2C_MCFGR1_TIMECFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_TIMECFG_SHIFT)) & LPI2C_MCFGR1_TIMECFG_MASK) + +#define LPI2C_MCFGR1_STOPCFG_MASK (0x800U) +#define LPI2C_MCFGR1_STOPCFG_SHIFT (11U) +/*! STOPCFG - Stop Configuration + * 0b0..Any Stop condition + * 0b1..Last Stop condition + */ +#define LPI2C_MCFGR1_STOPCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_STOPCFG_SHIFT)) & LPI2C_MCFGR1_STOPCFG_MASK) + +#define LPI2C_MCFGR1_STARTCFG_MASK (0x1000U) +#define LPI2C_MCFGR1_STARTCFG_SHIFT (12U) +/*! STARTCFG - Start Configuration + * 0b0..Sets when both I2C bus and LPI2C controller are idle + * 0b1..Sets when I2C bus is idle + */ +#define LPI2C_MCFGR1_STARTCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_STARTCFG_SHIFT)) & LPI2C_MCFGR1_STARTCFG_MASK) + +#define LPI2C_MCFGR1_MATCFG_MASK (0x70000U) +#define LPI2C_MCFGR1_MATCFG_SHIFT (16U) +/*! MATCFG - Match Configuration + * 0b000..Match is disabled + * 0b001..Reserved + * 0b010..Match is enabled: first data word equals MDMR[MATCH0] OR MDMR[MATCH1] + * 0b011..Match is enabled: any data word equals MDMR[MATCH0] OR MDMR[MATCH1] + * 0b100..Match is enabled: (first data word equals MDMR[MATCH0]) AND (second data word equals MDMR[MATCH1) + * 0b101..Match is enabled: (any data word equals MDMR[MATCH0]) AND (next data word equals MDMR[MATCH1) + * 0b110..Match is enabled: (first data word AND MDMR[MATCH1]) equals (MDMR[MATCH0] AND MDMR[MATCH1]) + * 0b111..Match is enabled: (any data word AND MDMR[MATCH1]) equals (MDMR[MATCH0] AND MDMR[MATCH1]) + */ +#define LPI2C_MCFGR1_MATCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_MATCFG_SHIFT)) & LPI2C_MCFGR1_MATCFG_MASK) + +#define LPI2C_MCFGR1_PINCFG_MASK (0x7000000U) +#define LPI2C_MCFGR1_PINCFG_SHIFT (24U) +/*! PINCFG - Pin Configuration + * 0b000..Two-pin open drain mode + * 0b001..Two-pin output only mode (Ultra-Fast mode) + * 0b010..Two-pin push-pull mode + * 0b011..Four-pin push-pull mode + * 0b100..Two-pin open-drain mode with separate LPI2C target + * 0b101..Two-pin output only mode (Ultra-Fast mode) with separate LPI2C target + * 0b110..Two-pin push-pull mode with separate LPI2C target + * 0b111..Four-pin push-pull mode (inverted outputs) + */ +#define LPI2C_MCFGR1_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR1_PINCFG_SHIFT)) & LPI2C_MCFGR1_PINCFG_MASK) +/*! @} */ + +/*! @name MCFGR2 - Controller Configuration 2 */ +/*! @{ */ + +#define LPI2C_MCFGR2_BUSIDLE_MASK (0xFFFU) +#define LPI2C_MCFGR2_BUSIDLE_SHIFT (0U) +/*! BUSIDLE - Bus Idle Timeout */ +#define LPI2C_MCFGR2_BUSIDLE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_BUSIDLE_SHIFT)) & LPI2C_MCFGR2_BUSIDLE_MASK) + +#define LPI2C_MCFGR2_FILTSCL_MASK (0xF0000U) +#define LPI2C_MCFGR2_FILTSCL_SHIFT (16U) +/*! FILTSCL - Glitch Filter SCL */ +#define LPI2C_MCFGR2_FILTSCL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_FILTSCL_SHIFT)) & LPI2C_MCFGR2_FILTSCL_MASK) + +#define LPI2C_MCFGR2_FILTSDA_MASK (0xF000000U) +#define LPI2C_MCFGR2_FILTSDA_SHIFT (24U) +/*! FILTSDA - Glitch Filter SDA */ +#define LPI2C_MCFGR2_FILTSDA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR2_FILTSDA_SHIFT)) & LPI2C_MCFGR2_FILTSDA_MASK) +/*! @} */ + +/*! @name MCFGR3 - Controller Configuration 3 */ +/*! @{ */ + +#define LPI2C_MCFGR3_PINLOW_MASK (0xFFF00U) +#define LPI2C_MCFGR3_PINLOW_SHIFT (8U) +/*! PINLOW - Pin Low Timeout */ +#define LPI2C_MCFGR3_PINLOW(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCFGR3_PINLOW_SHIFT)) & LPI2C_MCFGR3_PINLOW_MASK) +/*! @} */ + +/*! @name MDMR - Controller Data Match */ +/*! @{ */ + +#define LPI2C_MDMR_MATCH0_MASK (0xFFU) +#define LPI2C_MDMR_MATCH0_SHIFT (0U) +/*! MATCH0 - Match 0 Value */ +#define LPI2C_MDMR_MATCH0(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDMR_MATCH0_SHIFT)) & LPI2C_MDMR_MATCH0_MASK) + +#define LPI2C_MDMR_MATCH1_MASK (0xFF0000U) +#define LPI2C_MDMR_MATCH1_SHIFT (16U) +/*! MATCH1 - Match 1 Value */ +#define LPI2C_MDMR_MATCH1(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MDMR_MATCH1_SHIFT)) & LPI2C_MDMR_MATCH1_MASK) +/*! @} */ + +/*! @name MCCR0 - Controller Clock Configuration 0 */ +/*! @{ */ + +#define LPI2C_MCCR0_CLKLO_MASK (0x3FU) +#define LPI2C_MCCR0_CLKLO_SHIFT (0U) +/*! CLKLO - Clock Low Period */ +#define LPI2C_MCCR0_CLKLO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_CLKLO_SHIFT)) & LPI2C_MCCR0_CLKLO_MASK) + +#define LPI2C_MCCR0_CLKHI_MASK (0x3F00U) +#define LPI2C_MCCR0_CLKHI_SHIFT (8U) +/*! CLKHI - Clock High Period */ +#define LPI2C_MCCR0_CLKHI(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_CLKHI_SHIFT)) & LPI2C_MCCR0_CLKHI_MASK) + +#define LPI2C_MCCR0_SETHOLD_MASK (0x3F0000U) +#define LPI2C_MCCR0_SETHOLD_SHIFT (16U) +/*! SETHOLD - Setup Hold Delay */ +#define LPI2C_MCCR0_SETHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_SETHOLD_SHIFT)) & LPI2C_MCCR0_SETHOLD_MASK) + +#define LPI2C_MCCR0_DATAVD_MASK (0x3F000000U) +#define LPI2C_MCCR0_DATAVD_SHIFT (24U) +/*! DATAVD - Data Valid Delay */ +#define LPI2C_MCCR0_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR0_DATAVD_SHIFT)) & LPI2C_MCCR0_DATAVD_MASK) +/*! @} */ + +/*! @name MCCR1 - Controller Clock Configuration 1 */ +/*! @{ */ + +#define LPI2C_MCCR1_CLKLO_MASK (0x3FU) +#define LPI2C_MCCR1_CLKLO_SHIFT (0U) +/*! CLKLO - Clock Low Period */ +#define LPI2C_MCCR1_CLKLO(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_CLKLO_SHIFT)) & LPI2C_MCCR1_CLKLO_MASK) + +#define LPI2C_MCCR1_CLKHI_MASK (0x3F00U) +#define LPI2C_MCCR1_CLKHI_SHIFT (8U) +/*! CLKHI - Clock High Period */ +#define LPI2C_MCCR1_CLKHI(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_CLKHI_SHIFT)) & LPI2C_MCCR1_CLKHI_MASK) + +#define LPI2C_MCCR1_SETHOLD_MASK (0x3F0000U) +#define LPI2C_MCCR1_SETHOLD_SHIFT (16U) +/*! SETHOLD - Setup Hold Delay */ +#define LPI2C_MCCR1_SETHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_SETHOLD_SHIFT)) & LPI2C_MCCR1_SETHOLD_MASK) + +#define LPI2C_MCCR1_DATAVD_MASK (0x3F000000U) +#define LPI2C_MCCR1_DATAVD_SHIFT (24U) +/*! DATAVD - Data Valid Delay */ +#define LPI2C_MCCR1_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MCCR1_DATAVD_SHIFT)) & LPI2C_MCCR1_DATAVD_MASK) +/*! @} */ + +/*! @name MFCR - Controller FIFO Control */ +/*! @{ */ + +#define LPI2C_MFCR_TXWATER_MASK (0x3U) +#define LPI2C_MFCR_TXWATER_SHIFT (0U) +/*! TXWATER - Transmit FIFO Watermark */ +#define LPI2C_MFCR_TXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFCR_TXWATER_SHIFT)) & LPI2C_MFCR_TXWATER_MASK) + +#define LPI2C_MFCR_RXWATER_MASK (0x30000U) +#define LPI2C_MFCR_RXWATER_SHIFT (16U) +/*! RXWATER - Receive FIFO Watermark */ +#define LPI2C_MFCR_RXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFCR_RXWATER_SHIFT)) & LPI2C_MFCR_RXWATER_MASK) +/*! @} */ + +/*! @name MFSR - Controller FIFO Status */ +/*! @{ */ + +#define LPI2C_MFSR_TXCOUNT_MASK (0x7U) +#define LPI2C_MFSR_TXCOUNT_SHIFT (0U) +/*! TXCOUNT - Transmit FIFO Count */ +#define LPI2C_MFSR_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFSR_TXCOUNT_SHIFT)) & LPI2C_MFSR_TXCOUNT_MASK) + +#define LPI2C_MFSR_RXCOUNT_MASK (0x70000U) +#define LPI2C_MFSR_RXCOUNT_SHIFT (16U) +/*! RXCOUNT - Receive FIFO Count */ +#define LPI2C_MFSR_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MFSR_RXCOUNT_SHIFT)) & LPI2C_MFSR_RXCOUNT_MASK) +/*! @} */ + +/*! @name MTDR - Controller Transmit Data */ +/*! @{ */ + +#define LPI2C_MTDR_DATA_MASK (0xFFU) +#define LPI2C_MTDR_DATA_SHIFT (0U) +/*! DATA - Transmit Data */ +#define LPI2C_MTDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MTDR_DATA_SHIFT)) & LPI2C_MTDR_DATA_MASK) + +#define LPI2C_MTDR_CMD_MASK (0x700U) +#define LPI2C_MTDR_CMD_SHIFT (8U) +/*! CMD - Command Data + * 0b000..Transmit the value in DATA[7:0] + * 0b001..Receive (DATA[7:0] + 1) bytes + * 0b010..Generate Stop condition on I2C bus + * 0b011..Receive and discard (DATA[7:0] + 1) bytes + * 0b100..Generate (repeated) Start on the I2C bus and transmit the address in DATA[7:0] + * 0b101..Generate (repeated) Start on the I2C bus and transmit the address in DATA[7:0] (this transfer expects a NACK to be returned) + * 0b110..Generate (repeated) Start on the I2C bus and transmit the address in DATA[7:0] using HS mode + * 0b111..Generate (repeated) Start on the I2C bus and transmit the address in DATA[7:0] using HS mode (this transfer expects a NACK to be returned) + */ +#define LPI2C_MTDR_CMD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MTDR_CMD_SHIFT)) & LPI2C_MTDR_CMD_MASK) +/*! @} */ + +/*! @name MRDR - Controller Receive Data */ +/*! @{ */ + +#define LPI2C_MRDR_DATA_MASK (0xFFU) +#define LPI2C_MRDR_DATA_SHIFT (0U) +/*! DATA - Receive Data */ +#define LPI2C_MRDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MRDR_DATA_SHIFT)) & LPI2C_MRDR_DATA_MASK) + +#define LPI2C_MRDR_RXEMPTY_MASK (0x4000U) +#define LPI2C_MRDR_RXEMPTY_SHIFT (14U) +/*! RXEMPTY - Receive Empty + * 0b0..Not empty + * 0b1..Empty + */ +#define LPI2C_MRDR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MRDR_RXEMPTY_SHIFT)) & LPI2C_MRDR_RXEMPTY_MASK) +/*! @} */ + +/*! @name MRDROR - Controller Receive Data Read Only */ +/*! @{ */ + +#define LPI2C_MRDROR_DATA_MASK (0xFFU) +#define LPI2C_MRDROR_DATA_SHIFT (0U) +/*! DATA - Receive Data */ +#define LPI2C_MRDROR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MRDROR_DATA_SHIFT)) & LPI2C_MRDROR_DATA_MASK) + +#define LPI2C_MRDROR_RXEMPTY_MASK (0x4000U) +#define LPI2C_MRDROR_RXEMPTY_SHIFT (14U) +/*! RXEMPTY - RX Empty + * 0b0..Not empty + * 0b1..Empty + */ +#define LPI2C_MRDROR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_MRDROR_RXEMPTY_SHIFT)) & LPI2C_MRDROR_RXEMPTY_MASK) +/*! @} */ + +/*! @name SCR - Target Control */ +/*! @{ */ + +#define LPI2C_SCR_SEN_MASK (0x1U) +#define LPI2C_SCR_SEN_SHIFT (0U) +/*! SEN - Target Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCR_SEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_SEN_SHIFT)) & LPI2C_SCR_SEN_MASK) + +#define LPI2C_SCR_RST_MASK (0x2U) +#define LPI2C_SCR_RST_SHIFT (1U) +/*! RST - Software Reset + * 0b0..Not reset + * 0b1..Reset + */ +#define LPI2C_SCR_RST(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RST_SHIFT)) & LPI2C_SCR_RST_MASK) + +#define LPI2C_SCR_FILTEN_MASK (0x10U) +#define LPI2C_SCR_FILTEN_SHIFT (4U) +/*! FILTEN - Filter Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCR_FILTEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_FILTEN_SHIFT)) & LPI2C_SCR_FILTEN_MASK) + +#define LPI2C_SCR_FILTDZ_MASK (0x20U) +#define LPI2C_SCR_FILTDZ_SHIFT (5U) +/*! FILTDZ - Filter Doze Enable + * 0b0..Enable + * 0b1..Disable + */ +#define LPI2C_SCR_FILTDZ(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_FILTDZ_SHIFT)) & LPI2C_SCR_FILTDZ_MASK) + +#define LPI2C_SCR_RTF_MASK (0x100U) +#define LPI2C_SCR_RTF_SHIFT (8U) +/*! RTF - Reset Transmit FIFO + * 0b0..No effect + * 0b1..STDR is now empty + */ +#define LPI2C_SCR_RTF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RTF_SHIFT)) & LPI2C_SCR_RTF_MASK) + +#define LPI2C_SCR_RRF_MASK (0x200U) +#define LPI2C_SCR_RRF_SHIFT (9U) +/*! RRF - Reset Receive FIFO + * 0b0..No effect + * 0b1..SRDR is now empty + */ +#define LPI2C_SCR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCR_RRF_SHIFT)) & LPI2C_SCR_RRF_MASK) +/*! @} */ + +/*! @name SSR - Target Status */ +/*! @{ */ + +#define LPI2C_SSR_TDF_MASK (0x1U) +#define LPI2C_SSR_TDF_SHIFT (0U) +/*! TDF - Transmit Data Flag + * 0b0..Transmit data not requested + * 0b1..Transmit data is requested + */ +#define LPI2C_SSR_TDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_TDF_SHIFT)) & LPI2C_SSR_TDF_MASK) + +#define LPI2C_SSR_RDF_MASK (0x2U) +#define LPI2C_SSR_RDF_SHIFT (1U) +/*! RDF - Receive Data Flag + * 0b0..Not ready + * 0b1..Ready + */ +#define LPI2C_SSR_RDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_RDF_SHIFT)) & LPI2C_SSR_RDF_MASK) + +#define LPI2C_SSR_AVF_MASK (0x4U) +#define LPI2C_SSR_AVF_SHIFT (2U) +/*! AVF - Address Valid Flag + * 0b0..Not valid + * 0b1..Valid + */ +#define LPI2C_SSR_AVF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AVF_SHIFT)) & LPI2C_SSR_AVF_MASK) + +#define LPI2C_SSR_TAF_MASK (0x8U) +#define LPI2C_SSR_TAF_SHIFT (3U) +/*! TAF - Transmit ACK Flag + * 0b0..Not required + * 0b1..Required + */ +#define LPI2C_SSR_TAF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_TAF_SHIFT)) & LPI2C_SSR_TAF_MASK) + +#define LPI2C_SSR_RSF_MASK (0x100U) +#define LPI2C_SSR_RSF_SHIFT (8U) +/*! RSF - Repeated Start Flag + * 0b0..No repeated Start detected + * 0b1..Repeated Start detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_SSR_RSF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_RSF_SHIFT)) & LPI2C_SSR_RSF_MASK) + +#define LPI2C_SSR_SDF_MASK (0x200U) +#define LPI2C_SSR_SDF_SHIFT (9U) +/*! SDF - Stop Detect Flag + * 0b0..No Stop detected + * 0b1..Stop detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_SSR_SDF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SDF_SHIFT)) & LPI2C_SSR_SDF_MASK) + +#define LPI2C_SSR_BEF_MASK (0x400U) +#define LPI2C_SSR_BEF_SHIFT (10U) +/*! BEF - Bit Error Flag + * 0b0..No bit error occurred + * 0b1..Bit error occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_SSR_BEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_BEF_SHIFT)) & LPI2C_SSR_BEF_MASK) + +#define LPI2C_SSR_FEF_MASK (0x800U) +#define LPI2C_SSR_FEF_SHIFT (11U) +/*! FEF - FIFO Error Flag + * 0b0..No FIFO error + * 0b1..FIFO error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPI2C_SSR_FEF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_FEF_SHIFT)) & LPI2C_SSR_FEF_MASK) + +#define LPI2C_SSR_AM0F_MASK (0x1000U) +#define LPI2C_SSR_AM0F_SHIFT (12U) +/*! AM0F - Address Match 0 Flag + * 0b0..ADDR0 matching address not received + * 0b1..ADDR0 matching address received + */ +#define LPI2C_SSR_AM0F(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AM0F_SHIFT)) & LPI2C_SSR_AM0F_MASK) + +#define LPI2C_SSR_AM1F_MASK (0x2000U) +#define LPI2C_SSR_AM1F_SHIFT (13U) +/*! AM1F - Address Match 1 Flag + * 0b0..Matching address not received + * 0b1..Matching address received + */ +#define LPI2C_SSR_AM1F(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_AM1F_SHIFT)) & LPI2C_SSR_AM1F_MASK) + +#define LPI2C_SSR_GCF_MASK (0x4000U) +#define LPI2C_SSR_GCF_SHIFT (14U) +/*! GCF - General Call Flag + * 0b0..General call address disabled or not detected + * 0b1..General call address detected + */ +#define LPI2C_SSR_GCF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_GCF_SHIFT)) & LPI2C_SSR_GCF_MASK) + +#define LPI2C_SSR_SARF_MASK (0x8000U) +#define LPI2C_SSR_SARF_SHIFT (15U) +/*! SARF - SMBus Alert Response Flag + * 0b0..Disabled or not detected + * 0b1..Enabled and detected + */ +#define LPI2C_SSR_SARF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SARF_SHIFT)) & LPI2C_SSR_SARF_MASK) + +#define LPI2C_SSR_SBF_MASK (0x1000000U) +#define LPI2C_SSR_SBF_SHIFT (24U) +/*! SBF - Target Busy Flag + * 0b0..Idle + * 0b1..Busy + */ +#define LPI2C_SSR_SBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_SBF_SHIFT)) & LPI2C_SSR_SBF_MASK) + +#define LPI2C_SSR_BBF_MASK (0x2000000U) +#define LPI2C_SSR_BBF_SHIFT (25U) +/*! BBF - Bus Busy Flag + * 0b0..Idle + * 0b1..Busy + */ +#define LPI2C_SSR_BBF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SSR_BBF_SHIFT)) & LPI2C_SSR_BBF_MASK) +/*! @} */ + +/*! @name SIER - Target Interrupt Enable */ +/*! @{ */ + +#define LPI2C_SIER_TDIE_MASK (0x1U) +#define LPI2C_SIER_TDIE_SHIFT (0U) +/*! TDIE - Transmit Data Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_TDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_TDIE_SHIFT)) & LPI2C_SIER_TDIE_MASK) + +#define LPI2C_SIER_RDIE_MASK (0x2U) +#define LPI2C_SIER_RDIE_SHIFT (1U) +/*! RDIE - Receive Data Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_RDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_RDIE_SHIFT)) & LPI2C_SIER_RDIE_MASK) + +#define LPI2C_SIER_AVIE_MASK (0x4U) +#define LPI2C_SIER_AVIE_SHIFT (2U) +/*! AVIE - Address Valid Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_AVIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AVIE_SHIFT)) & LPI2C_SIER_AVIE_MASK) + +#define LPI2C_SIER_TAIE_MASK (0x8U) +#define LPI2C_SIER_TAIE_SHIFT (3U) +/*! TAIE - Transmit ACK Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_TAIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_TAIE_SHIFT)) & LPI2C_SIER_TAIE_MASK) + +#define LPI2C_SIER_RSIE_MASK (0x100U) +#define LPI2C_SIER_RSIE_SHIFT (8U) +/*! RSIE - Repeated Start Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_RSIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_RSIE_SHIFT)) & LPI2C_SIER_RSIE_MASK) + +#define LPI2C_SIER_SDIE_MASK (0x200U) +#define LPI2C_SIER_SDIE_SHIFT (9U) +/*! SDIE - Stop Detect Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_SDIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_SDIE_SHIFT)) & LPI2C_SIER_SDIE_MASK) + +#define LPI2C_SIER_BEIE_MASK (0x400U) +#define LPI2C_SIER_BEIE_SHIFT (10U) +/*! BEIE - Bit Error Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_BEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_BEIE_SHIFT)) & LPI2C_SIER_BEIE_MASK) + +#define LPI2C_SIER_FEIE_MASK (0x800U) +#define LPI2C_SIER_FEIE_SHIFT (11U) +/*! FEIE - FIFO Error Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_FEIE_SHIFT)) & LPI2C_SIER_FEIE_MASK) + +#define LPI2C_SIER_AM0IE_MASK (0x1000U) +#define LPI2C_SIER_AM0IE_SHIFT (12U) +/*! AM0IE - Address Match 0 Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_AM0IE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AM0IE_SHIFT)) & LPI2C_SIER_AM0IE_MASK) + +#define LPI2C_SIER_AM1IE_MASK (0x2000U) +#define LPI2C_SIER_AM1IE_SHIFT (13U) +/*! AM1IE - Address Match 1 Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_AM1IE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_AM1IE_SHIFT)) & LPI2C_SIER_AM1IE_MASK) + +#define LPI2C_SIER_GCIE_MASK (0x4000U) +#define LPI2C_SIER_GCIE_SHIFT (14U) +/*! GCIE - General Call Interrupt Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define LPI2C_SIER_GCIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_GCIE_SHIFT)) & LPI2C_SIER_GCIE_MASK) + +#define LPI2C_SIER_SARIE_MASK (0x8000U) +#define LPI2C_SIER_SARIE_SHIFT (15U) +/*! SARIE - SMBus Alert Response Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SIER_SARIE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SIER_SARIE_SHIFT)) & LPI2C_SIER_SARIE_MASK) +/*! @} */ + +/*! @name SDER - Target DMA Enable */ +/*! @{ */ + +#define LPI2C_SDER_TDDE_MASK (0x1U) +#define LPI2C_SDER_TDDE_SHIFT (0U) +/*! TDDE - Transmit Data DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SDER_TDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_TDDE_SHIFT)) & LPI2C_SDER_TDDE_MASK) + +#define LPI2C_SDER_RDDE_MASK (0x2U) +#define LPI2C_SDER_RDDE_SHIFT (1U) +/*! RDDE - Receive Data DMA Enable + * 0b0..Disable DMA request + * 0b1..Enable DMA request + */ +#define LPI2C_SDER_RDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_RDDE_SHIFT)) & LPI2C_SDER_RDDE_MASK) + +#define LPI2C_SDER_AVDE_MASK (0x4U) +#define LPI2C_SDER_AVDE_SHIFT (2U) +/*! AVDE - Address Valid DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SDER_AVDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_AVDE_SHIFT)) & LPI2C_SDER_AVDE_MASK) + +#define LPI2C_SDER_RSDE_MASK (0x100U) +#define LPI2C_SDER_RSDE_SHIFT (8U) +/*! RSDE - Repeated Start DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SDER_RSDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_RSDE_SHIFT)) & LPI2C_SDER_RSDE_MASK) + +#define LPI2C_SDER_SDDE_MASK (0x200U) +#define LPI2C_SDER_SDDE_SHIFT (9U) +/*! SDDE - Stop Detect DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SDER_SDDE(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SDER_SDDE_SHIFT)) & LPI2C_SDER_SDDE_MASK) +/*! @} */ + +/*! @name SCFGR0 - Target Configuration 0 */ +/*! @{ */ + +#define LPI2C_SCFGR0_RDREQ_MASK (0x1U) +#define LPI2C_SCFGR0_RDREQ_SHIFT (0U) +/*! RDREQ - Read Request + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR0_RDREQ(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR0_RDREQ_SHIFT)) & LPI2C_SCFGR0_RDREQ_MASK) + +#define LPI2C_SCFGR0_RDACK_MASK (0x2U) +#define LPI2C_SCFGR0_RDACK_SHIFT (1U) +/*! RDACK - Read Acknowledge Flag + * 0b0..Read Request not acknowledged + * 0b1..Read Request acknowledged + */ +#define LPI2C_SCFGR0_RDACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR0_RDACK_SHIFT)) & LPI2C_SCFGR0_RDACK_MASK) +/*! @} */ + +/*! @name SCFGR1 - Target Configuration 1 */ +/*! @{ */ + +#define LPI2C_SCFGR1_ADRSTALL_MASK (0x1U) +#define LPI2C_SCFGR1_ADRSTALL_SHIFT (0U) +/*! ADRSTALL - Address SCL Stall + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR1_ADRSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ADRSTALL_SHIFT)) & LPI2C_SCFGR1_ADRSTALL_MASK) + +#define LPI2C_SCFGR1_RXSTALL_MASK (0x2U) +#define LPI2C_SCFGR1_RXSTALL_SHIFT (1U) +/*! RXSTALL - RX SCL Stall + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR1_RXSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RXSTALL_SHIFT)) & LPI2C_SCFGR1_RXSTALL_MASK) + +#define LPI2C_SCFGR1_TXDSTALL_MASK (0x4U) +#define LPI2C_SCFGR1_TXDSTALL_SHIFT (2U) +/*! TXDSTALL - Transmit Data SCL Stall + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR1_TXDSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_TXDSTALL_SHIFT)) & LPI2C_SCFGR1_TXDSTALL_MASK) + +#define LPI2C_SCFGR1_ACKSTALL_MASK (0x8U) +#define LPI2C_SCFGR1_ACKSTALL_SHIFT (3U) +/*! ACKSTALL - ACK SCL Stall + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR1_ACKSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ACKSTALL_SHIFT)) & LPI2C_SCFGR1_ACKSTALL_MASK) + +#define LPI2C_SCFGR1_RXNACK_MASK (0x10U) +#define LPI2C_SCFGR1_RXNACK_SHIFT (4U) +/*! RXNACK - Receive NACK + * 0b0..ACK or NACK always determined by STAR[TXNACK] + * 0b1..NACK always generated on address overrun or receive data overrun, otherwise ACK or NACK is determined by STAR[TXNACK] + */ +#define LPI2C_SCFGR1_RXNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RXNACK_SHIFT)) & LPI2C_SCFGR1_RXNACK_MASK) + +#define LPI2C_SCFGR1_GCEN_MASK (0x100U) +#define LPI2C_SCFGR1_GCEN_SHIFT (8U) +/*! GCEN - General Call Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR1_GCEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_GCEN_SHIFT)) & LPI2C_SCFGR1_GCEN_MASK) + +#define LPI2C_SCFGR1_SAEN_MASK (0x200U) +#define LPI2C_SCFGR1_SAEN_SHIFT (9U) +/*! SAEN - SMBus Alert Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR1_SAEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_SAEN_SHIFT)) & LPI2C_SCFGR1_SAEN_MASK) + +#define LPI2C_SCFGR1_TXCFG_MASK (0x400U) +#define LPI2C_SCFGR1_TXCFG_SHIFT (10U) +/*! TXCFG - Transmit Flag Configuration + * 0b0..MSR[TDF] is set only during a target-transmit transfer when STDR is empty + * 0b1..MSR[TDF] is set whenever STDR is empty + */ +#define LPI2C_SCFGR1_TXCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_TXCFG_SHIFT)) & LPI2C_SCFGR1_TXCFG_MASK) + +#define LPI2C_SCFGR1_RXCFG_MASK (0x800U) +#define LPI2C_SCFGR1_RXCFG_SHIFT (11U) +/*! RXCFG - Receive Data Configuration + * 0b0..Return received data, clear MSR[RDF] + * 0b1..Return SASR and clear SSR[AVF] when SSR[AVF] is set, return received data and clear MSR[RDF] when SSR[AFV] is not set + */ +#define LPI2C_SCFGR1_RXCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RXCFG_SHIFT)) & LPI2C_SCFGR1_RXCFG_MASK) + +#define LPI2C_SCFGR1_IGNACK_MASK (0x1000U) +#define LPI2C_SCFGR1_IGNACK_SHIFT (12U) +/*! IGNACK - Ignore NACK + * 0b0..End transfer on NACK + * 0b1..Do not end transfer on NACK + */ +#define LPI2C_SCFGR1_IGNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_IGNACK_SHIFT)) & LPI2C_SCFGR1_IGNACK_MASK) + +#define LPI2C_SCFGR1_HSMEN_MASK (0x2000U) +#define LPI2C_SCFGR1_HSMEN_SHIFT (13U) +/*! HSMEN - HS Mode Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR1_HSMEN(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_HSMEN_SHIFT)) & LPI2C_SCFGR1_HSMEN_MASK) + +#define LPI2C_SCFGR1_ADDRCFG_MASK (0x70000U) +#define LPI2C_SCFGR1_ADDRCFG_SHIFT (16U) +/*! ADDRCFG - Address Configuration + * 0b000..Address match 0 (7-bit) + * 0b001..Address match 0 (10-bit) + * 0b010..Address match 0 (7-bit) or address match 1 (7-bit) + * 0b011..Address match 0 (10-bit) or address match 1 (10-bit) + * 0b100..Address match 0 (7-bit) or address match 1 (10-bit) + * 0b101..Address match 0 (10-bit) or address match 1 (7-bit) + * 0b110..From address match 0 (7-bit) to address match 1 (7-bit) + * 0b111..From address match 0 (10-bit) to address match 1 (10-bit) + */ +#define LPI2C_SCFGR1_ADDRCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_ADDRCFG_SHIFT)) & LPI2C_SCFGR1_ADDRCFG_MASK) + +#define LPI2C_SCFGR1_RXALL_MASK (0x1000000U) +#define LPI2C_SCFGR1_RXALL_SHIFT (24U) +/*! RXALL - Receive All + * 0b0..Disable + * 0b1..Enable + */ +#define LPI2C_SCFGR1_RXALL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RXALL_SHIFT)) & LPI2C_SCFGR1_RXALL_MASK) + +#define LPI2C_SCFGR1_RSCFG_MASK (0x2000000U) +#define LPI2C_SCFGR1_RSCFG_SHIFT (25U) +/*! RSCFG - Repeated Start Configuration + * 0b0..Any repeated Start condition following an address match + * 0b1..Any repeated Start condition + */ +#define LPI2C_SCFGR1_RSCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_RSCFG_SHIFT)) & LPI2C_SCFGR1_RSCFG_MASK) + +#define LPI2C_SCFGR1_SDCFG_MASK (0x4000000U) +#define LPI2C_SCFGR1_SDCFG_SHIFT (26U) +/*! SDCFG - Stop Detect Configuration + * 0b0..Any Stop condition following an address match + * 0b1..Any Stop condition + */ +#define LPI2C_SCFGR1_SDCFG(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR1_SDCFG_SHIFT)) & LPI2C_SCFGR1_SDCFG_MASK) +/*! @} */ + +/*! @name SCFGR2 - Target Configuration 2 */ +/*! @{ */ + +#define LPI2C_SCFGR2_CLKHOLD_MASK (0xFU) +#define LPI2C_SCFGR2_CLKHOLD_SHIFT (0U) +/*! CLKHOLD - Clock Hold Time */ +#define LPI2C_SCFGR2_CLKHOLD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_CLKHOLD_SHIFT)) & LPI2C_SCFGR2_CLKHOLD_MASK) + +#define LPI2C_SCFGR2_DATAVD_MASK (0x3F00U) +#define LPI2C_SCFGR2_DATAVD_SHIFT (8U) +/*! DATAVD - Data Valid Delay */ +#define LPI2C_SCFGR2_DATAVD(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_DATAVD_SHIFT)) & LPI2C_SCFGR2_DATAVD_MASK) + +#define LPI2C_SCFGR2_FILTSCL_MASK (0xF0000U) +#define LPI2C_SCFGR2_FILTSCL_SHIFT (16U) +/*! FILTSCL - Glitch Filter SCL */ +#define LPI2C_SCFGR2_FILTSCL(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_FILTSCL_SHIFT)) & LPI2C_SCFGR2_FILTSCL_MASK) + +#define LPI2C_SCFGR2_FILTSDA_MASK (0xF000000U) +#define LPI2C_SCFGR2_FILTSDA_SHIFT (24U) +/*! FILTSDA - Glitch Filter SDA */ +#define LPI2C_SCFGR2_FILTSDA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SCFGR2_FILTSDA_SHIFT)) & LPI2C_SCFGR2_FILTSDA_MASK) +/*! @} */ + +/*! @name SAMR - Target Address Match */ +/*! @{ */ + +#define LPI2C_SAMR_ADDR0_MASK (0x7FEU) +#define LPI2C_SAMR_ADDR0_SHIFT (1U) +/*! ADDR0 - Address 0 Value */ +#define LPI2C_SAMR_ADDR0(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SAMR_ADDR0_SHIFT)) & LPI2C_SAMR_ADDR0_MASK) + +#define LPI2C_SAMR_ADDR1_MASK (0x7FE0000U) +#define LPI2C_SAMR_ADDR1_SHIFT (17U) +/*! ADDR1 - Address 1 Value */ +#define LPI2C_SAMR_ADDR1(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SAMR_ADDR1_SHIFT)) & LPI2C_SAMR_ADDR1_MASK) +/*! @} */ + +/*! @name SASR - Target Address Status */ +/*! @{ */ + +#define LPI2C_SASR_RADDR_MASK (0x7FFU) +#define LPI2C_SASR_RADDR_SHIFT (0U) +/*! RADDR - Received Address */ +#define LPI2C_SASR_RADDR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SASR_RADDR_SHIFT)) & LPI2C_SASR_RADDR_MASK) + +#define LPI2C_SASR_ANV_MASK (0x4000U) +#define LPI2C_SASR_ANV_SHIFT (14U) +/*! ANV - Address Not Valid + * 0b0..Valid + * 0b1..Not valid + */ +#define LPI2C_SASR_ANV(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SASR_ANV_SHIFT)) & LPI2C_SASR_ANV_MASK) +/*! @} */ + +/*! @name STAR - Target Transmit ACK */ +/*! @{ */ + +#define LPI2C_STAR_TXNACK_MASK (0x1U) +#define LPI2C_STAR_TXNACK_SHIFT (0U) +/*! TXNACK - Transmit NACK + * 0b0..Transmit ACK + * 0b1..Transmit NACK + */ +#define LPI2C_STAR_TXNACK(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_STAR_TXNACK_SHIFT)) & LPI2C_STAR_TXNACK_MASK) +/*! @} */ + +/*! @name STDR - Target Transmit Data */ +/*! @{ */ + +#define LPI2C_STDR_DATA_MASK (0xFFU) +#define LPI2C_STDR_DATA_SHIFT (0U) +/*! DATA - Transmit Data */ +#define LPI2C_STDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_STDR_DATA_SHIFT)) & LPI2C_STDR_DATA_MASK) +/*! @} */ + +/*! @name SRDR - Target Receive Data */ +/*! @{ */ + +#define LPI2C_SRDR_DATA_MASK (0xFFU) +#define LPI2C_SRDR_DATA_SHIFT (0U) +/*! DATA - Received Data */ +#define LPI2C_SRDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_DATA_SHIFT)) & LPI2C_SRDR_DATA_MASK) + +#define LPI2C_SRDR_RADDR_MASK (0x700U) +#define LPI2C_SRDR_RADDR_SHIFT (8U) +/*! RADDR - Received Address */ +#define LPI2C_SRDR_RADDR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_RADDR_SHIFT)) & LPI2C_SRDR_RADDR_MASK) + +#define LPI2C_SRDR_RXEMPTY_MASK (0x4000U) +#define LPI2C_SRDR_RXEMPTY_SHIFT (14U) +/*! RXEMPTY - Receive Empty + * 0b0..Not empty + * 0b1..Empty + */ +#define LPI2C_SRDR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_RXEMPTY_SHIFT)) & LPI2C_SRDR_RXEMPTY_MASK) + +#define LPI2C_SRDR_SOF_MASK (0x8000U) +#define LPI2C_SRDR_SOF_SHIFT (15U) +/*! SOF - Start of Frame + * 0b0..Not first + * 0b1..First + */ +#define LPI2C_SRDR_SOF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDR_SOF_SHIFT)) & LPI2C_SRDR_SOF_MASK) +/*! @} */ + +/*! @name SRDROR - Target Receive Data Read Only */ +/*! @{ */ + +#define LPI2C_SRDROR_DATA_MASK (0xFFU) +#define LPI2C_SRDROR_DATA_SHIFT (0U) +/*! DATA - Receive Data */ +#define LPI2C_SRDROR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDROR_DATA_SHIFT)) & LPI2C_SRDROR_DATA_MASK) + +#define LPI2C_SRDROR_RADDR_MASK (0x700U) +#define LPI2C_SRDROR_RADDR_SHIFT (8U) +/*! RADDR - Received Address */ +#define LPI2C_SRDROR_RADDR(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDROR_RADDR_SHIFT)) & LPI2C_SRDROR_RADDR_MASK) + +#define LPI2C_SRDROR_RXEMPTY_MASK (0x4000U) +#define LPI2C_SRDROR_RXEMPTY_SHIFT (14U) +/*! RXEMPTY - Receive Empty + * 0b0..Not empty + * 0b1..Empty + */ +#define LPI2C_SRDROR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDROR_RXEMPTY_SHIFT)) & LPI2C_SRDROR_RXEMPTY_MASK) + +#define LPI2C_SRDROR_SOF_MASK (0x8000U) +#define LPI2C_SRDROR_SOF_SHIFT (15U) +/*! SOF - Start of Frame + * 0b0..Not the first + * 0b1..First + */ +#define LPI2C_SRDROR_SOF(x) (((uint32_t)(((uint32_t)(x)) << LPI2C_SRDROR_SOF_SHIFT)) & LPI2C_SRDROR_SOF_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group LPI2C_Register_Masks */ + + +/* LPI2C - Peripheral instance base addresses */ +/** Peripheral LPI2C0 base address */ +#define LPI2C0_BASE (0x4009A000u) +/** Peripheral LPI2C0 base pointer */ +#define LPI2C0 ((LPI2C_Type *)LPI2C0_BASE) +/** Peripheral LPI2C1 base address */ +#define LPI2C1_BASE (0x4009B000u) +/** Peripheral LPI2C1 base pointer */ +#define LPI2C1 ((LPI2C_Type *)LPI2C1_BASE) +/** Peripheral LPI2C2 base address */ +#define LPI2C2_BASE (0x400D4000u) +/** Peripheral LPI2C2 base pointer */ +#define LPI2C2 ((LPI2C_Type *)LPI2C2_BASE) +/** Peripheral LPI2C3 base address */ +#define LPI2C3_BASE (0x400D5000u) +/** Peripheral LPI2C3 base pointer */ +#define LPI2C3 ((LPI2C_Type *)LPI2C3_BASE) +/** Array initializer of LPI2C peripheral base addresses */ +#define LPI2C_BASE_ADDRS { LPI2C0_BASE, LPI2C1_BASE, LPI2C2_BASE, LPI2C3_BASE } +/** Array initializer of LPI2C peripheral base pointers */ +#define LPI2C_BASE_PTRS { LPI2C0, LPI2C1, LPI2C2, LPI2C3 } +/** Interrupt vectors for the LPI2C peripheral type */ +#define LPI2C_IRQS { LPI2C0_IRQn, LPI2C1_IRQn, LPI2C2_IRQn, LPI2C3_IRQn } + +/*! + * @} + */ /* end of group LPI2C_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- LPSPI Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPSPI_Peripheral_Access_Layer LPSPI Peripheral Access Layer + * @{ + */ + +/** LPSPI - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + uint8_t RESERVED_0[8]; + __IO uint32_t CR; /**< Control, offset: 0x10 */ + __IO uint32_t SR; /**< Status, offset: 0x14 */ + __IO uint32_t IER; /**< Interrupt Enable, offset: 0x18 */ + __IO uint32_t DER; /**< DMA Enable, offset: 0x1C */ + __IO uint32_t CFGR0; /**< Configuration 0, offset: 0x20 */ + __IO uint32_t CFGR1; /**< Configuration 1, offset: 0x24 */ + uint8_t RESERVED_1[8]; + __IO uint32_t DMR0; /**< Data Match 0, offset: 0x30 */ + __IO uint32_t DMR1; /**< Data Match 1, offset: 0x34 */ + uint8_t RESERVED_2[8]; + __IO uint32_t CCR; /**< Clock Configuration, offset: 0x40 */ + __IO uint32_t CCR1; /**< Clock Configuration 1, offset: 0x44 */ + uint8_t RESERVED_3[16]; + __IO uint32_t FCR; /**< FIFO Control, offset: 0x58 */ + __I uint32_t FSR; /**< FIFO Status, offset: 0x5C */ + __IO uint32_t TCR; /**< Transmit Command, offset: 0x60 */ + __O uint32_t TDR; /**< Transmit Data, offset: 0x64 */ + uint8_t RESERVED_4[8]; + __I uint32_t RSR; /**< Receive Status, offset: 0x70 */ + __I uint32_t RDR; /**< Receive Data, offset: 0x74 */ + __I uint32_t RDROR; /**< Receive Data Read Only, offset: 0x78 */ + uint8_t RESERVED_5[896]; + __O uint32_t TCBR; /**< Transmit Command Burst, offset: 0x3FC */ + __O uint32_t TDBR[128]; /**< Transmit Data Burst, array offset: 0x400, array step: 0x4 */ + __I uint32_t RDBR[128]; /**< Receive Data Burst, array offset: 0x600, array step: 0x4 */ +} LPSPI_Type; + +/* ---------------------------------------------------------------------------- + -- LPSPI Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPSPI_Register_Masks LPSPI Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define LPSPI_VERID_FEATURE_MASK (0xFFFFU) +#define LPSPI_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Module Identification Number + * 0b0000000000000100..Standard feature set supporting a 32-bit shift register. + * *.. + */ +#define LPSPI_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_VERID_FEATURE_SHIFT)) & LPSPI_VERID_FEATURE_MASK) + +#define LPSPI_VERID_MINOR_MASK (0xFF0000U) +#define LPSPI_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define LPSPI_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_VERID_MINOR_SHIFT)) & LPSPI_VERID_MINOR_MASK) + +#define LPSPI_VERID_MAJOR_MASK (0xFF000000U) +#define LPSPI_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define LPSPI_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_VERID_MAJOR_SHIFT)) & LPSPI_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define LPSPI_PARAM_TXFIFO_MASK (0xFFU) +#define LPSPI_PARAM_TXFIFO_SHIFT (0U) +/*! TXFIFO - Transmit FIFO Size */ +#define LPSPI_PARAM_TXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_PARAM_TXFIFO_SHIFT)) & LPSPI_PARAM_TXFIFO_MASK) + +#define LPSPI_PARAM_RXFIFO_MASK (0xFF00U) +#define LPSPI_PARAM_RXFIFO_SHIFT (8U) +/*! RXFIFO - Receive FIFO Size */ +#define LPSPI_PARAM_RXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_PARAM_RXFIFO_SHIFT)) & LPSPI_PARAM_RXFIFO_MASK) + +#define LPSPI_PARAM_PCSNUM_MASK (0xFF0000U) +#define LPSPI_PARAM_PCSNUM_SHIFT (16U) +/*! PCSNUM - PCS Number */ +#define LPSPI_PARAM_PCSNUM(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_PARAM_PCSNUM_SHIFT)) & LPSPI_PARAM_PCSNUM_MASK) +/*! @} */ + +/*! @name CR - Control */ +/*! @{ */ + +#define LPSPI_CR_MEN_MASK (0x1U) +#define LPSPI_CR_MEN_SHIFT (0U) +/*! MEN - Module Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_CR_MEN(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_MEN_SHIFT)) & LPSPI_CR_MEN_MASK) + +#define LPSPI_CR_RST_MASK (0x2U) +#define LPSPI_CR_RST_SHIFT (1U) +/*! RST - Software Reset + * 0b0..Not reset + * 0b1..Reset + */ +#define LPSPI_CR_RST(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_RST_SHIFT)) & LPSPI_CR_RST_MASK) + +#define LPSPI_CR_DBGEN_MASK (0x8U) +#define LPSPI_CR_DBGEN_SHIFT (3U) +/*! DBGEN - Debug Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_CR_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_DBGEN_SHIFT)) & LPSPI_CR_DBGEN_MASK) + +#define LPSPI_CR_RTF_MASK (0x100U) +#define LPSPI_CR_RTF_SHIFT (8U) +/*! RTF - Reset Transmit FIFO + * 0b0..No effect + * 0b1..Reset + */ +#define LPSPI_CR_RTF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_RTF_SHIFT)) & LPSPI_CR_RTF_MASK) + +#define LPSPI_CR_RRF_MASK (0x200U) +#define LPSPI_CR_RRF_SHIFT (9U) +/*! RRF - Reset Receive FIFO + * 0b0..No effect + * 0b1..Reset + */ +#define LPSPI_CR_RRF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CR_RRF_SHIFT)) & LPSPI_CR_RRF_MASK) +/*! @} */ + +/*! @name SR - Status */ +/*! @{ */ + +#define LPSPI_SR_TDF_MASK (0x1U) +#define LPSPI_SR_TDF_SHIFT (0U) +/*! TDF - Transmit Data Flag + * 0b0..Transmit data not requested + * 0b1..Transmit data requested + */ +#define LPSPI_SR_TDF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_TDF_SHIFT)) & LPSPI_SR_TDF_MASK) + +#define LPSPI_SR_RDF_MASK (0x2U) +#define LPSPI_SR_RDF_SHIFT (1U) +/*! RDF - Receive Data Flag + * 0b0..Receive data not ready + * 0b1..Receive data ready + */ +#define LPSPI_SR_RDF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_RDF_SHIFT)) & LPSPI_SR_RDF_MASK) + +#define LPSPI_SR_WCF_MASK (0x100U) +#define LPSPI_SR_WCF_SHIFT (8U) +/*! WCF - Word Complete Flag + * 0b0..Not complete + * 0b1..Complete + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPSPI_SR_WCF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_WCF_SHIFT)) & LPSPI_SR_WCF_MASK) + +#define LPSPI_SR_FCF_MASK (0x200U) +#define LPSPI_SR_FCF_SHIFT (9U) +/*! FCF - Frame Complete Flag + * 0b0..Not complete + * 0b1..Complete + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPSPI_SR_FCF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_FCF_SHIFT)) & LPSPI_SR_FCF_MASK) + +#define LPSPI_SR_TCF_MASK (0x400U) +#define LPSPI_SR_TCF_SHIFT (10U) +/*! TCF - Transfer Complete Flag + * 0b0..Not complete + * 0b1..Complete + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPSPI_SR_TCF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_TCF_SHIFT)) & LPSPI_SR_TCF_MASK) + +#define LPSPI_SR_TEF_MASK (0x800U) +#define LPSPI_SR_TEF_SHIFT (11U) +/*! TEF - Transmit Error Flag + * 0b0..No underrun + * 0b1..Underrun + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPSPI_SR_TEF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_TEF_SHIFT)) & LPSPI_SR_TEF_MASK) + +#define LPSPI_SR_REF_MASK (0x1000U) +#define LPSPI_SR_REF_SHIFT (12U) +/*! REF - Receive Error Flag + * 0b0..No overflow + * 0b1..Overflow + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPSPI_SR_REF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_REF_SHIFT)) & LPSPI_SR_REF_MASK) + +#define LPSPI_SR_DMF_MASK (0x2000U) +#define LPSPI_SR_DMF_SHIFT (13U) +/*! DMF - Data Match Flag + * 0b0..No match + * 0b1..Match + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPSPI_SR_DMF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_DMF_SHIFT)) & LPSPI_SR_DMF_MASK) + +#define LPSPI_SR_MBF_MASK (0x1000000U) +#define LPSPI_SR_MBF_SHIFT (24U) +/*! MBF - Module Busy Flag + * 0b0..LPSPI is idle + * 0b1..LPSPI is busy + */ +#define LPSPI_SR_MBF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_SR_MBF_SHIFT)) & LPSPI_SR_MBF_MASK) +/*! @} */ + +/*! @name IER - Interrupt Enable */ +/*! @{ */ + +#define LPSPI_IER_TDIE_MASK (0x1U) +#define LPSPI_IER_TDIE_SHIFT (0U) +/*! TDIE - Transmit Data Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_IER_TDIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_TDIE_SHIFT)) & LPSPI_IER_TDIE_MASK) + +#define LPSPI_IER_RDIE_MASK (0x2U) +#define LPSPI_IER_RDIE_SHIFT (1U) +/*! RDIE - Receive Data Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_IER_RDIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_RDIE_SHIFT)) & LPSPI_IER_RDIE_MASK) + +#define LPSPI_IER_WCIE_MASK (0x100U) +#define LPSPI_IER_WCIE_SHIFT (8U) +/*! WCIE - Word Complete Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_IER_WCIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_WCIE_SHIFT)) & LPSPI_IER_WCIE_MASK) + +#define LPSPI_IER_FCIE_MASK (0x200U) +#define LPSPI_IER_FCIE_SHIFT (9U) +/*! FCIE - Frame Complete Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_IER_FCIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_FCIE_SHIFT)) & LPSPI_IER_FCIE_MASK) + +#define LPSPI_IER_TCIE_MASK (0x400U) +#define LPSPI_IER_TCIE_SHIFT (10U) +/*! TCIE - Transfer Complete Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_IER_TCIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_TCIE_SHIFT)) & LPSPI_IER_TCIE_MASK) + +#define LPSPI_IER_TEIE_MASK (0x800U) +#define LPSPI_IER_TEIE_SHIFT (11U) +/*! TEIE - Transmit Error Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_IER_TEIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_TEIE_SHIFT)) & LPSPI_IER_TEIE_MASK) + +#define LPSPI_IER_REIE_MASK (0x1000U) +#define LPSPI_IER_REIE_SHIFT (12U) +/*! REIE - Receive Error Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_IER_REIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_REIE_SHIFT)) & LPSPI_IER_REIE_MASK) + +#define LPSPI_IER_DMIE_MASK (0x2000U) +#define LPSPI_IER_DMIE_SHIFT (13U) +/*! DMIE - Data Match Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_IER_DMIE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_IER_DMIE_SHIFT)) & LPSPI_IER_DMIE_MASK) +/*! @} */ + +/*! @name DER - DMA Enable */ +/*! @{ */ + +#define LPSPI_DER_TDDE_MASK (0x1U) +#define LPSPI_DER_TDDE_SHIFT (0U) +/*! TDDE - Transmit Data DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_DER_TDDE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DER_TDDE_SHIFT)) & LPSPI_DER_TDDE_MASK) + +#define LPSPI_DER_RDDE_MASK (0x2U) +#define LPSPI_DER_RDDE_SHIFT (1U) +/*! RDDE - Receive Data DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_DER_RDDE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DER_RDDE_SHIFT)) & LPSPI_DER_RDDE_MASK) + +#define LPSPI_DER_FCDE_MASK (0x200U) +#define LPSPI_DER_FCDE_SHIFT (9U) +/*! FCDE - Frame Complete DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_DER_FCDE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DER_FCDE_SHIFT)) & LPSPI_DER_FCDE_MASK) +/*! @} */ + +/*! @name CFGR0 - Configuration 0 */ +/*! @{ */ + +#define LPSPI_CFGR0_HREN_MASK (0x1U) +#define LPSPI_CFGR0_HREN_SHIFT (0U) +/*! HREN - Host Request Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_CFGR0_HREN(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_HREN_SHIFT)) & LPSPI_CFGR0_HREN_MASK) + +#define LPSPI_CFGR0_HRPOL_MASK (0x2U) +#define LPSPI_CFGR0_HRPOL_SHIFT (1U) +/*! HRPOL - Host Request Polarity + * 0b0..Active high + * 0b1..Active low + */ +#define LPSPI_CFGR0_HRPOL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_HRPOL_SHIFT)) & LPSPI_CFGR0_HRPOL_MASK) + +#define LPSPI_CFGR0_HRSEL_MASK (0x4U) +#define LPSPI_CFGR0_HRSEL_SHIFT (2U) +/*! HRSEL - Host Request Select + * 0b0..HREQ pin + * 0b1..Input trigger + */ +#define LPSPI_CFGR0_HRSEL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_HRSEL_SHIFT)) & LPSPI_CFGR0_HRSEL_MASK) + +#define LPSPI_CFGR0_HRDIR_MASK (0x8U) +#define LPSPI_CFGR0_HRDIR_SHIFT (3U) +/*! HRDIR - Host Request Direction + * 0b0..Input + * 0b1..Output + */ +#define LPSPI_CFGR0_HRDIR(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_HRDIR_SHIFT)) & LPSPI_CFGR0_HRDIR_MASK) + +#define LPSPI_CFGR0_CIRFIFO_MASK (0x100U) +#define LPSPI_CFGR0_CIRFIFO_SHIFT (8U) +/*! CIRFIFO - Circular FIFO Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_CFGR0_CIRFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_CIRFIFO_SHIFT)) & LPSPI_CFGR0_CIRFIFO_MASK) + +#define LPSPI_CFGR0_RDMO_MASK (0x200U) +#define LPSPI_CFGR0_RDMO_SHIFT (9U) +/*! RDMO - Receive Data Match Only + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_CFGR0_RDMO(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR0_RDMO_SHIFT)) & LPSPI_CFGR0_RDMO_MASK) +/*! @} */ + +/*! @name CFGR1 - Configuration 1 */ +/*! @{ */ + +#define LPSPI_CFGR1_MASTER_MASK (0x1U) +#define LPSPI_CFGR1_MASTER_SHIFT (0U) +/*! MASTER - Master Mode + * 0b0..Slave mode + * 0b1..Master mode + */ +#define LPSPI_CFGR1_MASTER(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_MASTER_SHIFT)) & LPSPI_CFGR1_MASTER_MASK) + +#define LPSPI_CFGR1_SAMPLE_MASK (0x2U) +#define LPSPI_CFGR1_SAMPLE_SHIFT (1U) +/*! SAMPLE - Sample Point + * 0b0..SCK edge + * 0b1..Delayed SCK edge + */ +#define LPSPI_CFGR1_SAMPLE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_SAMPLE_SHIFT)) & LPSPI_CFGR1_SAMPLE_MASK) + +#define LPSPI_CFGR1_AUTOPCS_MASK (0x4U) +#define LPSPI_CFGR1_AUTOPCS_SHIFT (2U) +/*! AUTOPCS - Automatic PCS + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_CFGR1_AUTOPCS(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_AUTOPCS_SHIFT)) & LPSPI_CFGR1_AUTOPCS_MASK) + +#define LPSPI_CFGR1_NOSTALL_MASK (0x8U) +#define LPSPI_CFGR1_NOSTALL_SHIFT (3U) +/*! NOSTALL - No Stall + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_CFGR1_NOSTALL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_NOSTALL_SHIFT)) & LPSPI_CFGR1_NOSTALL_MASK) + +#define LPSPI_CFGR1_PARTIAL_MASK (0x10U) +#define LPSPI_CFGR1_PARTIAL_SHIFT (4U) +/*! PARTIAL - Partial Enable + * 0b0..Discard + * 0b1..Store + */ +#define LPSPI_CFGR1_PARTIAL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_PARTIAL_SHIFT)) & LPSPI_CFGR1_PARTIAL_MASK) + +#define LPSPI_CFGR1_PCSPOL_MASK (0xF00U) +#define LPSPI_CFGR1_PCSPOL_SHIFT (8U) +/*! PCSPOL - Peripheral Chip Select Polarity + * 0b0000..Active low + * 0b0001..Active high + */ +#define LPSPI_CFGR1_PCSPOL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_PCSPOL_SHIFT)) & LPSPI_CFGR1_PCSPOL_MASK) + +#define LPSPI_CFGR1_MATCFG_MASK (0x70000U) +#define LPSPI_CFGR1_MATCFG_SHIFT (16U) +/*! MATCFG - Match Configuration + * 0b000..Match is disabled + * 0b001.. + * 0b010..Match first data word with compare word + * 0b011..Match any data word with compare word + * 0b100..Sequential match, first data word + * 0b101..Sequential match, any data word + * 0b110..Match first data word (masked) with compare word (masked) + * 0b111..Match any data word (masked) with compare word (masked) + */ +#define LPSPI_CFGR1_MATCFG(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_MATCFG_SHIFT)) & LPSPI_CFGR1_MATCFG_MASK) + +#define LPSPI_CFGR1_PINCFG_MASK (0x3000000U) +#define LPSPI_CFGR1_PINCFG_SHIFT (24U) +/*! PINCFG - Pin Configuration + * 0b00..SIN is used for input data; SOUT is used for output data + * 0b01..SIN is used for both input and output data; only half-duplex serial transfers are supported + * 0b10..SOUT is used for both input and output data; only half-duplex serial transfers are supported + * 0b11..SOUT is used for input data; SIN is used for output data + */ +#define LPSPI_CFGR1_PINCFG(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_PINCFG_SHIFT)) & LPSPI_CFGR1_PINCFG_MASK) + +#define LPSPI_CFGR1_OUTCFG_MASK (0x4000000U) +#define LPSPI_CFGR1_OUTCFG_SHIFT (26U) +/*! OUTCFG - Output Configuration + * 0b0..Retain last value + * 0b1..3-stated + */ +#define LPSPI_CFGR1_OUTCFG(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_OUTCFG_SHIFT)) & LPSPI_CFGR1_OUTCFG_MASK) + +#define LPSPI_CFGR1_PCSCFG_MASK (0x8000000U) +#define LPSPI_CFGR1_PCSCFG_SHIFT (27U) +/*! PCSCFG - Peripheral Chip Select Configuration + * 0b0..PCS[3:2] configured for chip select function + * 0b1..PCS[3:2] configured for half-duplex 4-bit transfers (PCS[3:2] = DATA[3:2]) + */ +#define LPSPI_CFGR1_PCSCFG(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CFGR1_PCSCFG_SHIFT)) & LPSPI_CFGR1_PCSCFG_MASK) +/*! @} */ + +/*! @name DMR0 - Data Match 0 */ +/*! @{ */ + +#define LPSPI_DMR0_MATCH0_MASK (0xFFFFFFFFU) +#define LPSPI_DMR0_MATCH0_SHIFT (0U) +/*! MATCH0 - Match 0 Value */ +#define LPSPI_DMR0_MATCH0(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DMR0_MATCH0_SHIFT)) & LPSPI_DMR0_MATCH0_MASK) +/*! @} */ + +/*! @name DMR1 - Data Match 1 */ +/*! @{ */ + +#define LPSPI_DMR1_MATCH1_MASK (0xFFFFFFFFU) +#define LPSPI_DMR1_MATCH1_SHIFT (0U) +/*! MATCH1 - Match 1 Value */ +#define LPSPI_DMR1_MATCH1(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_DMR1_MATCH1_SHIFT)) & LPSPI_DMR1_MATCH1_MASK) +/*! @} */ + +/*! @name CCR - Clock Configuration */ +/*! @{ */ + +#define LPSPI_CCR_SCKDIV_MASK (0xFFU) +#define LPSPI_CCR_SCKDIV_SHIFT (0U) +/*! SCKDIV - SCK Divider */ +#define LPSPI_CCR_SCKDIV(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR_SCKDIV_SHIFT)) & LPSPI_CCR_SCKDIV_MASK) + +#define LPSPI_CCR_DBT_MASK (0xFF00U) +#define LPSPI_CCR_DBT_SHIFT (8U) +/*! DBT - Delay Between Transfers */ +#define LPSPI_CCR_DBT(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR_DBT_SHIFT)) & LPSPI_CCR_DBT_MASK) + +#define LPSPI_CCR_PCSSCK_MASK (0xFF0000U) +#define LPSPI_CCR_PCSSCK_SHIFT (16U) +/*! PCSSCK - PCS-to-SCK Delay */ +#define LPSPI_CCR_PCSSCK(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR_PCSSCK_SHIFT)) & LPSPI_CCR_PCSSCK_MASK) + +#define LPSPI_CCR_SCKPCS_MASK (0xFF000000U) +#define LPSPI_CCR_SCKPCS_SHIFT (24U) +/*! SCKPCS - SCK-to-PCS Delay */ +#define LPSPI_CCR_SCKPCS(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR_SCKPCS_SHIFT)) & LPSPI_CCR_SCKPCS_MASK) +/*! @} */ + +/*! @name CCR1 - Clock Configuration 1 */ +/*! @{ */ + +#define LPSPI_CCR1_SCKSET_MASK (0xFFU) +#define LPSPI_CCR1_SCKSET_SHIFT (0U) +/*! SCKSET - SCK Setup */ +#define LPSPI_CCR1_SCKSET(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR1_SCKSET_SHIFT)) & LPSPI_CCR1_SCKSET_MASK) + +#define LPSPI_CCR1_SCKHLD_MASK (0xFF00U) +#define LPSPI_CCR1_SCKHLD_SHIFT (8U) +/*! SCKHLD - SCK Hold */ +#define LPSPI_CCR1_SCKHLD(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR1_SCKHLD_SHIFT)) & LPSPI_CCR1_SCKHLD_MASK) + +#define LPSPI_CCR1_PCSPCS_MASK (0xFF0000U) +#define LPSPI_CCR1_PCSPCS_SHIFT (16U) +/*! PCSPCS - PCS to PCS Delay */ +#define LPSPI_CCR1_PCSPCS(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR1_PCSPCS_SHIFT)) & LPSPI_CCR1_PCSPCS_MASK) + +#define LPSPI_CCR1_SCKSCK_MASK (0xFF000000U) +#define LPSPI_CCR1_SCKSCK_SHIFT (24U) +/*! SCKSCK - SCK Inter-Frame Delay */ +#define LPSPI_CCR1_SCKSCK(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_CCR1_SCKSCK_SHIFT)) & LPSPI_CCR1_SCKSCK_MASK) +/*! @} */ + +/*! @name FCR - FIFO Control */ +/*! @{ */ + +#define LPSPI_FCR_TXWATER_MASK (0x3U) +#define LPSPI_FCR_TXWATER_SHIFT (0U) +/*! TXWATER - Transmit FIFO Watermark */ +#define LPSPI_FCR_TXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_FCR_TXWATER_SHIFT)) & LPSPI_FCR_TXWATER_MASK) + +#define LPSPI_FCR_RXWATER_MASK (0x30000U) +#define LPSPI_FCR_RXWATER_SHIFT (16U) +/*! RXWATER - Receive FIFO Watermark */ +#define LPSPI_FCR_RXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_FCR_RXWATER_SHIFT)) & LPSPI_FCR_RXWATER_MASK) +/*! @} */ + +/*! @name FSR - FIFO Status */ +/*! @{ */ + +#define LPSPI_FSR_TXCOUNT_MASK (0x7U) +#define LPSPI_FSR_TXCOUNT_SHIFT (0U) +/*! TXCOUNT - Transmit FIFO Count */ +#define LPSPI_FSR_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_FSR_TXCOUNT_SHIFT)) & LPSPI_FSR_TXCOUNT_MASK) + +#define LPSPI_FSR_RXCOUNT_MASK (0x70000U) +#define LPSPI_FSR_RXCOUNT_SHIFT (16U) +/*! RXCOUNT - Receive FIFO Count */ +#define LPSPI_FSR_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_FSR_RXCOUNT_SHIFT)) & LPSPI_FSR_RXCOUNT_MASK) +/*! @} */ + +/*! @name TCR - Transmit Command */ +/*! @{ */ + +#define LPSPI_TCR_FRAMESZ_MASK (0xFFFU) +#define LPSPI_TCR_FRAMESZ_SHIFT (0U) +/*! FRAMESZ - Frame Size */ +#define LPSPI_TCR_FRAMESZ(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_FRAMESZ_SHIFT)) & LPSPI_TCR_FRAMESZ_MASK) + +#define LPSPI_TCR_WIDTH_MASK (0x30000U) +#define LPSPI_TCR_WIDTH_SHIFT (16U) +/*! WIDTH - Transfer Width + * 0b00..1-bit transfer + * 0b01..2-bit transfer + * 0b10..4-bit transfer + * 0b11..Reserved + */ +#define LPSPI_TCR_WIDTH(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_WIDTH_SHIFT)) & LPSPI_TCR_WIDTH_MASK) + +#define LPSPI_TCR_TXMSK_MASK (0x40000U) +#define LPSPI_TCR_TXMSK_SHIFT (18U) +/*! TXMSK - Transmit Data Mask + * 0b0..Normal transfer + * 0b1..Mask transmit data + */ +#define LPSPI_TCR_TXMSK(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_TXMSK_SHIFT)) & LPSPI_TCR_TXMSK_MASK) + +#define LPSPI_TCR_RXMSK_MASK (0x80000U) +#define LPSPI_TCR_RXMSK_SHIFT (19U) +/*! RXMSK - Receive Data Mask + * 0b0..Normal transfer + * 0b1..Mask receive data + */ +#define LPSPI_TCR_RXMSK(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_RXMSK_SHIFT)) & LPSPI_TCR_RXMSK_MASK) + +#define LPSPI_TCR_CONTC_MASK (0x100000U) +#define LPSPI_TCR_CONTC_SHIFT (20U) +/*! CONTC - Continuing Command + * 0b0..Command word for start of new transfer + * 0b1..Command word for continuing transfer + */ +#define LPSPI_TCR_CONTC(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_CONTC_SHIFT)) & LPSPI_TCR_CONTC_MASK) + +#define LPSPI_TCR_CONT_MASK (0x200000U) +#define LPSPI_TCR_CONT_SHIFT (21U) +/*! CONT - Continuous Transfer + * 0b0..Disable + * 0b1..Enable + */ +#define LPSPI_TCR_CONT(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_CONT_SHIFT)) & LPSPI_TCR_CONT_MASK) + +#define LPSPI_TCR_BYSW_MASK (0x400000U) +#define LPSPI_TCR_BYSW_SHIFT (22U) +/*! BYSW - Byte Swap + * 0b0..Disable byte swap + * 0b1..Enable byte swap + */ +#define LPSPI_TCR_BYSW(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_BYSW_SHIFT)) & LPSPI_TCR_BYSW_MASK) + +#define LPSPI_TCR_LSBF_MASK (0x800000U) +#define LPSPI_TCR_LSBF_SHIFT (23U) +/*! LSBF - LSB First + * 0b0..MSB first + * 0b1..LSB first + */ +#define LPSPI_TCR_LSBF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_LSBF_SHIFT)) & LPSPI_TCR_LSBF_MASK) + +#define LPSPI_TCR_PCS_MASK (0x3000000U) +#define LPSPI_TCR_PCS_SHIFT (24U) +/*! PCS - Peripheral Chip Select + * 0b00..Transfer using PCS[0] + * 0b01..Transfer using PCS[1] + * 0b10..Transfer using PCS[2] + * 0b11..Transfer using PCS[3] + */ +#define LPSPI_TCR_PCS(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_PCS_SHIFT)) & LPSPI_TCR_PCS_MASK) + +#define LPSPI_TCR_PRESCALE_MASK (0x38000000U) +#define LPSPI_TCR_PRESCALE_SHIFT (27U) +/*! PRESCALE - Prescaler Value + * 0b000..Divide by 1 + * 0b001..Divide by 2 + * 0b010..Divide by 4 + * 0b011..Divide by 8 + * 0b100..Divide by 16 + * 0b101..Divide by 32 + * 0b110..Divide by 64 + * 0b111..Divide by 128 + */ +#define LPSPI_TCR_PRESCALE(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_PRESCALE_SHIFT)) & LPSPI_TCR_PRESCALE_MASK) + +#define LPSPI_TCR_CPHA_MASK (0x40000000U) +#define LPSPI_TCR_CPHA_SHIFT (30U) +/*! CPHA - Clock Phase + * 0b0..Captured + * 0b1..Changed + */ +#define LPSPI_TCR_CPHA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_CPHA_SHIFT)) & LPSPI_TCR_CPHA_MASK) + +#define LPSPI_TCR_CPOL_MASK (0x80000000U) +#define LPSPI_TCR_CPOL_SHIFT (31U) +/*! CPOL - Clock Polarity + * 0b0..Inactive low + * 0b1..Inactive high + */ +#define LPSPI_TCR_CPOL(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCR_CPOL_SHIFT)) & LPSPI_TCR_CPOL_MASK) +/*! @} */ + +/*! @name TDR - Transmit Data */ +/*! @{ */ + +#define LPSPI_TDR_DATA_MASK (0xFFFFFFFFU) +#define LPSPI_TDR_DATA_SHIFT (0U) +/*! DATA - Transmit Data */ +#define LPSPI_TDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TDR_DATA_SHIFT)) & LPSPI_TDR_DATA_MASK) +/*! @} */ + +/*! @name RSR - Receive Status */ +/*! @{ */ + +#define LPSPI_RSR_SOF_MASK (0x1U) +#define LPSPI_RSR_SOF_SHIFT (0U) +/*! SOF - Start of Frame + * 0b0..Subsequent data word + * 0b1..First data word + */ +#define LPSPI_RSR_SOF(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_RSR_SOF_SHIFT)) & LPSPI_RSR_SOF_MASK) + +#define LPSPI_RSR_RXEMPTY_MASK (0x2U) +#define LPSPI_RSR_RXEMPTY_SHIFT (1U) +/*! RXEMPTY - RX FIFO Empty + * 0b0..Not empty + * 0b1..Empty + */ +#define LPSPI_RSR_RXEMPTY(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_RSR_RXEMPTY_SHIFT)) & LPSPI_RSR_RXEMPTY_MASK) +/*! @} */ + +/*! @name RDR - Receive Data */ +/*! @{ */ + +#define LPSPI_RDR_DATA_MASK (0xFFFFFFFFU) +#define LPSPI_RDR_DATA_SHIFT (0U) +/*! DATA - Receive Data */ +#define LPSPI_RDR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_RDR_DATA_SHIFT)) & LPSPI_RDR_DATA_MASK) +/*! @} */ + +/*! @name RDROR - Receive Data Read Only */ +/*! @{ */ + +#define LPSPI_RDROR_DATA_MASK (0xFFFFFFFFU) +#define LPSPI_RDROR_DATA_SHIFT (0U) +/*! DATA - Receive Data */ +#define LPSPI_RDROR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_RDROR_DATA_SHIFT)) & LPSPI_RDROR_DATA_MASK) +/*! @} */ + +/*! @name TCBR - Transmit Command Burst */ +/*! @{ */ + +#define LPSPI_TCBR_DATA_MASK (0xFFFFFFFFU) +#define LPSPI_TCBR_DATA_SHIFT (0U) +/*! DATA - Command Data */ +#define LPSPI_TCBR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TCBR_DATA_SHIFT)) & LPSPI_TCBR_DATA_MASK) +/*! @} */ + +/*! @name TDBR - Transmit Data Burst */ +/*! @{ */ + +#define LPSPI_TDBR_DATA_MASK (0xFFFFFFFFU) +#define LPSPI_TDBR_DATA_SHIFT (0U) +/*! DATA - Data */ +#define LPSPI_TDBR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_TDBR_DATA_SHIFT)) & LPSPI_TDBR_DATA_MASK) +/*! @} */ + +/* The count of LPSPI_TDBR */ +#define LPSPI_TDBR_COUNT (128U) + +/*! @name RDBR - Receive Data Burst */ +/*! @{ */ + +#define LPSPI_RDBR_DATA_MASK (0xFFFFFFFFU) +#define LPSPI_RDBR_DATA_SHIFT (0U) +/*! DATA - Data */ +#define LPSPI_RDBR_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPSPI_RDBR_DATA_SHIFT)) & LPSPI_RDBR_DATA_MASK) +/*! @} */ + +/* The count of LPSPI_RDBR */ +#define LPSPI_RDBR_COUNT (128U) + + +/*! + * @} + */ /* end of group LPSPI_Register_Masks */ + + +/* LPSPI - Peripheral instance base addresses */ +/** Peripheral LPSPI0 base address */ +#define LPSPI0_BASE (0x4009C000u) +/** Peripheral LPSPI0 base pointer */ +#define LPSPI0 ((LPSPI_Type *)LPSPI0_BASE) +/** Peripheral LPSPI1 base address */ +#define LPSPI1_BASE (0x4009D000u) +/** Peripheral LPSPI1 base pointer */ +#define LPSPI1 ((LPSPI_Type *)LPSPI1_BASE) +/** Array initializer of LPSPI peripheral base addresses */ +#define LPSPI_BASE_ADDRS { LPSPI0_BASE, LPSPI1_BASE } +/** Array initializer of LPSPI peripheral base pointers */ +#define LPSPI_BASE_PTRS { LPSPI0, LPSPI1 } +/** Interrupt vectors for the LPSPI peripheral type */ +#define LPSPI_IRQS { LPSPI0_IRQn, LPSPI1_IRQn } + +/*! + * @} + */ /* end of group LPSPI_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- LPTMR Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPTMR_Peripheral_Access_Layer LPTMR Peripheral Access Layer + * @{ + */ + +/** LPTMR - Register Layout Typedef */ +typedef struct { + __IO uint32_t CSR; /**< Control Status, offset: 0x0 */ + __IO uint32_t PSR; /**< Prescaler and Glitch Filter, offset: 0x4 */ + __IO uint32_t CMR; /**< Compare, offset: 0x8 */ + __IO uint32_t CNR; /**< Counter, offset: 0xC */ +} LPTMR_Type; + +/* ---------------------------------------------------------------------------- + -- LPTMR Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPTMR_Register_Masks LPTMR Register Masks + * @{ + */ + +/*! @name CSR - Control Status */ +/*! @{ */ + +#define LPTMR_CSR_TEN_MASK (0x1U) +#define LPTMR_CSR_TEN_SHIFT (0U) +/*! TEN - Timer Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPTMR_CSR_TEN(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CSR_TEN_SHIFT)) & LPTMR_CSR_TEN_MASK) + +#define LPTMR_CSR_TMS_MASK (0x2U) +#define LPTMR_CSR_TMS_SHIFT (1U) +/*! TMS - Timer Mode Select + * 0b0..Time Counter + * 0b1..Pulse Counter + */ +#define LPTMR_CSR_TMS(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CSR_TMS_SHIFT)) & LPTMR_CSR_TMS_MASK) + +#define LPTMR_CSR_TFC_MASK (0x4U) +#define LPTMR_CSR_TFC_SHIFT (2U) +/*! TFC - Timer Free-Running Counter + * 0b0..Reset when TCF asserts + * 0b1..Reset on overflow + */ +#define LPTMR_CSR_TFC(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CSR_TFC_SHIFT)) & LPTMR_CSR_TFC_MASK) + +#define LPTMR_CSR_TPP_MASK (0x8U) +#define LPTMR_CSR_TPP_SHIFT (3U) +/*! TPP - Timer Pin Polarity + * 0b0..Active-high + * 0b1..Active-low + */ +#define LPTMR_CSR_TPP(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CSR_TPP_SHIFT)) & LPTMR_CSR_TPP_MASK) + +#define LPTMR_CSR_TPS_MASK (0x30U) +#define LPTMR_CSR_TPS_SHIFT (4U) +/*! TPS - Timer Pin Select + * 0b00..Input 0 + * 0b01..Input 1 + * 0b10..Input 2 + * 0b11..Input 3 + */ +#define LPTMR_CSR_TPS(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CSR_TPS_SHIFT)) & LPTMR_CSR_TPS_MASK) + +#define LPTMR_CSR_TIE_MASK (0x40U) +#define LPTMR_CSR_TIE_SHIFT (6U) +/*! TIE - Timer Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPTMR_CSR_TIE(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CSR_TIE_SHIFT)) & LPTMR_CSR_TIE_MASK) + +#define LPTMR_CSR_TCF_MASK (0x80U) +#define LPTMR_CSR_TCF_SHIFT (7U) +/*! TCF - Timer Compare Flag + * 0b0..CNR != (CMR + 1) + * 0b1..CNR = (CMR + 1) + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPTMR_CSR_TCF(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CSR_TCF_SHIFT)) & LPTMR_CSR_TCF_MASK) + +#define LPTMR_CSR_TDRE_MASK (0x100U) +#define LPTMR_CSR_TDRE_SHIFT (8U) +/*! TDRE - Timer DMA Request Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPTMR_CSR_TDRE(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CSR_TDRE_SHIFT)) & LPTMR_CSR_TDRE_MASK) +/*! @} */ + +/*! @name PSR - Prescaler and Glitch Filter */ +/*! @{ */ + +#define LPTMR_PSR_PCS_MASK (0x3U) +#define LPTMR_PSR_PCS_SHIFT (0U) +/*! PCS - Prescaler and Glitch Filter Clock Select + * 0b00..Clock 0 + * 0b01..Clock 1 + * 0b10..Clock 2 + * 0b11..Clock 3 + */ +#define LPTMR_PSR_PCS(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_PSR_PCS_SHIFT)) & LPTMR_PSR_PCS_MASK) + +#define LPTMR_PSR_PBYP_MASK (0x4U) +#define LPTMR_PSR_PBYP_SHIFT (2U) +/*! PBYP - Prescaler and Glitch Filter Bypass + * 0b0..Prescaler and glitch filter enable + * 0b1..Prescaler and glitch filter bypass + */ +#define LPTMR_PSR_PBYP(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_PSR_PBYP_SHIFT)) & LPTMR_PSR_PBYP_MASK) + +#define LPTMR_PSR_PRESCALE_MASK (0x78U) +#define LPTMR_PSR_PRESCALE_SHIFT (3U) +/*! PRESCALE - Prescaler and Glitch Filter Value + * 0b0000..Prescaler divides the prescaler clock by 2; glitch filter does not support this configuration + * 0b0001..Prescaler divides the prescaler clock by 4; glitch filter recognizes change on input pin after two rising clock edges + * 0b0010..Prescaler divides the prescaler clock by 8; glitch filter recognizes change on input pin after four rising clock edges + * 0b0011..Prescaler divides the prescaler clock by 16; glitch filter recognizes change on input pin after eight rising clock edges + * 0b0100..Prescaler divides the prescaler clock by 32; glitch filter recognizes change on input pin after 16 rising clock edges + * 0b0101..Prescaler divides the prescaler clock by 64; glitch filter recognizes change on input pin after 32 rising clock edges + * 0b0110..Prescaler divides the prescaler clock by 128; glitch filter recognizes change on input pin after 64 rising clock edges + * 0b0111..Prescaler divides the prescaler clock by 256; glitch filter recognizes change on input pin after 128 rising clock edges + * 0b1000..Prescaler divides the prescaler clock by 512; glitch filter recognizes change on input pin after 256 rising clock edges + * 0b1001..Prescaler divides the prescaler clock by 1024; glitch filter recognizes change on input pin after 512 rising clock edges + * 0b1010..Prescaler divides the prescaler clock by 2048; glitch filter recognizes change on input pin after 1024 rising clock edges + * 0b1011..Prescaler divides the prescaler clock by 4096; glitch filter recognizes change on input pin after 2048 rising clock edges + * 0b1100..Prescaler divides the prescaler clock by 8192; glitch filter recognizes change on input pin after 4096 rising clock edges + * 0b1101..Prescaler divides the prescaler clock by 16,384; glitch filter recognizes change on input pin after 8192 rising clock edges + * 0b1110..Prescaler divides the prescaler clock by 32,768; glitch filter recognizes change on input pin after 16,384 rising clock edges + * 0b1111..Prescaler divides the prescaler clock by 65,536; glitch filter recognizes change on input pin after 32,768 rising clock edges + */ +#define LPTMR_PSR_PRESCALE(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_PSR_PRESCALE_SHIFT)) & LPTMR_PSR_PRESCALE_MASK) +/*! @} */ + +/*! @name CMR - Compare */ +/*! @{ */ + +#define LPTMR_CMR_COMPARE_MASK (0xFFFFFFFFU) +#define LPTMR_CMR_COMPARE_SHIFT (0U) +/*! COMPARE - Compare Value */ +#define LPTMR_CMR_COMPARE(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CMR_COMPARE_SHIFT)) & LPTMR_CMR_COMPARE_MASK) +/*! @} */ + +/*! @name CNR - Counter */ +/*! @{ */ + +#define LPTMR_CNR_COUNTER_MASK (0xFFFFFFFFU) +#define LPTMR_CNR_COUNTER_SHIFT (0U) +/*! COUNTER - Counter Value */ +#define LPTMR_CNR_COUNTER(x) (((uint32_t)(((uint32_t)(x)) << LPTMR_CNR_COUNTER_SHIFT)) & LPTMR_CNR_COUNTER_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group LPTMR_Register_Masks */ + + +/* LPTMR - Peripheral instance base addresses */ +/** Peripheral LPTMR0 base address */ +#define LPTMR0_BASE (0x400AB000u) +/** Peripheral LPTMR0 base pointer */ +#define LPTMR0 ((LPTMR_Type *)LPTMR0_BASE) +/** Array initializer of LPTMR peripheral base addresses */ +#define LPTMR_BASE_ADDRS { LPTMR0_BASE } +/** Array initializer of LPTMR peripheral base pointers */ +#define LPTMR_BASE_PTRS { LPTMR0 } +/** Interrupt vectors for the LPTMR peripheral type */ +#define LPTMR_IRQS { LPTMR0_IRQn } + +/*! + * @} + */ /* end of group LPTMR_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- LPUART Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPUART_Peripheral_Access_Layer LPUART Peripheral Access Layer + * @{ + */ + +/** LPUART - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + __IO uint32_t GLOBAL; /**< Global, offset: 0x8 */ + __IO uint32_t PINCFG; /**< Pin Configuration, offset: 0xC */ + __IO uint32_t BAUD; /**< Baud Rate, offset: 0x10 */ + __IO uint32_t STAT; /**< Status, offset: 0x14 */ + __IO uint32_t CTRL; /**< Control, offset: 0x18 */ + __IO uint32_t DATA; /**< Data, offset: 0x1C */ + __IO uint32_t MATCH; /**< Match Address, offset: 0x20 */ + __IO uint32_t MODIR; /**< MODEM IrDA, offset: 0x24 */ + __IO uint32_t FIFO; /**< FIFO, offset: 0x28 */ + __IO uint32_t WATER; /**< Watermark, offset: 0x2C */ + __I uint32_t DATARO; /**< Data Read-Only, offset: 0x30 */ +} LPUART_Type; + +/* ---------------------------------------------------------------------------- + -- LPUART Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup LPUART_Register_Masks LPUART Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define LPUART_VERID_FEATURE_MASK (0xFFFFU) +#define LPUART_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Identification Number + * 0b0000000000000001..Standard feature set + * 0b0000000000000011..Standard feature set with MODEM and IrDA support + */ +#define LPUART_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_FEATURE_SHIFT)) & LPUART_VERID_FEATURE_MASK) + +#define LPUART_VERID_MINOR_MASK (0xFF0000U) +#define LPUART_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define LPUART_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_MINOR_SHIFT)) & LPUART_VERID_MINOR_MASK) + +#define LPUART_VERID_MAJOR_MASK (0xFF000000U) +#define LPUART_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define LPUART_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_VERID_MAJOR_SHIFT)) & LPUART_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define LPUART_PARAM_TXFIFO_MASK (0xFFU) +#define LPUART_PARAM_TXFIFO_SHIFT (0U) +/*! TXFIFO - Transmit FIFO Size */ +#define LPUART_PARAM_TXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PARAM_TXFIFO_SHIFT)) & LPUART_PARAM_TXFIFO_MASK) + +#define LPUART_PARAM_RXFIFO_MASK (0xFF00U) +#define LPUART_PARAM_RXFIFO_SHIFT (8U) +/*! RXFIFO - Receive FIFO Size */ +#define LPUART_PARAM_RXFIFO(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PARAM_RXFIFO_SHIFT)) & LPUART_PARAM_RXFIFO_MASK) +/*! @} */ + +/*! @name GLOBAL - Global */ +/*! @{ */ + +#define LPUART_GLOBAL_RST_MASK (0x2U) +#define LPUART_GLOBAL_RST_SHIFT (1U) +/*! RST - Software Reset + * 0b0..Not reset + * 0b1..Reset + */ +#define LPUART_GLOBAL_RST(x) (((uint32_t)(((uint32_t)(x)) << LPUART_GLOBAL_RST_SHIFT)) & LPUART_GLOBAL_RST_MASK) +/*! @} */ + +/*! @name PINCFG - Pin Configuration */ +/*! @{ */ + +#define LPUART_PINCFG_TRGSEL_MASK (0x3U) +#define LPUART_PINCFG_TRGSEL_SHIFT (0U) +/*! TRGSEL - Trigger Select + * 0b00..Input trigger disabled + * 0b01..Input trigger used instead of the RXD pin input + * 0b10..Input trigger used instead of the CTS_B pin input + * 0b11..Input trigger used to modulate the TXD pin output, which (after TXINV configuration) is internally ANDed with the input trigger + */ +#define LPUART_PINCFG_TRGSEL(x) (((uint32_t)(((uint32_t)(x)) << LPUART_PINCFG_TRGSEL_SHIFT)) & LPUART_PINCFG_TRGSEL_MASK) +/*! @} */ + +/*! @name BAUD - Baud Rate */ +/*! @{ */ + +#define LPUART_BAUD_SBR_MASK (0x1FFFU) +#define LPUART_BAUD_SBR_SHIFT (0U) +/*! SBR - Baud Rate Modulo Divisor */ +#define LPUART_BAUD_SBR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_SBR_SHIFT)) & LPUART_BAUD_SBR_MASK) + +#define LPUART_BAUD_SBNS_MASK (0x2000U) +#define LPUART_BAUD_SBNS_SHIFT (13U) +/*! SBNS - Stop Bit Number Select + * 0b0..One stop bit + * 0b1..Two stop bits + */ +#define LPUART_BAUD_SBNS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_SBNS_SHIFT)) & LPUART_BAUD_SBNS_MASK) + +#define LPUART_BAUD_RXEDGIE_MASK (0x4000U) +#define LPUART_BAUD_RXEDGIE_SHIFT (14U) +/*! RXEDGIE - RX Input Active Edge Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_BAUD_RXEDGIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RXEDGIE_SHIFT)) & LPUART_BAUD_RXEDGIE_MASK) + +#define LPUART_BAUD_LBKDIE_MASK (0x8000U) +#define LPUART_BAUD_LBKDIE_SHIFT (15U) +/*! LBKDIE - LIN Break Detect Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_BAUD_LBKDIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_LBKDIE_SHIFT)) & LPUART_BAUD_LBKDIE_MASK) + +#define LPUART_BAUD_RESYNCDIS_MASK (0x10000U) +#define LPUART_BAUD_RESYNCDIS_SHIFT (16U) +/*! RESYNCDIS - Resynchronization Disable + * 0b0..Enable + * 0b1..Disable + */ +#define LPUART_BAUD_RESYNCDIS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RESYNCDIS_SHIFT)) & LPUART_BAUD_RESYNCDIS_MASK) + +#define LPUART_BAUD_BOTHEDGE_MASK (0x20000U) +#define LPUART_BAUD_BOTHEDGE_SHIFT (17U) +/*! BOTHEDGE - Both Edge Sampling + * 0b0..Rising edge + * 0b1..Both rising and falling edges + */ +#define LPUART_BAUD_BOTHEDGE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_BOTHEDGE_SHIFT)) & LPUART_BAUD_BOTHEDGE_MASK) + +#define LPUART_BAUD_MATCFG_MASK (0xC0000U) +#define LPUART_BAUD_MATCFG_SHIFT (18U) +/*! MATCFG - Match Configuration + * 0b00..Address match wake-up + * 0b01..Idle match wake-up + * 0b10..Match on and match off + * 0b11..Enables RWU on data match and match on or off for the transmitter CTS input + */ +#define LPUART_BAUD_MATCFG(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MATCFG_SHIFT)) & LPUART_BAUD_MATCFG_MASK) + +#define LPUART_BAUD_RIDMAE_MASK (0x100000U) +#define LPUART_BAUD_RIDMAE_SHIFT (20U) +/*! RIDMAE - Receiver Idle DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_BAUD_RIDMAE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RIDMAE_SHIFT)) & LPUART_BAUD_RIDMAE_MASK) + +#define LPUART_BAUD_RDMAE_MASK (0x200000U) +#define LPUART_BAUD_RDMAE_SHIFT (21U) +/*! RDMAE - Receiver Full DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_BAUD_RDMAE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_RDMAE_SHIFT)) & LPUART_BAUD_RDMAE_MASK) + +#define LPUART_BAUD_TDMAE_MASK (0x800000U) +#define LPUART_BAUD_TDMAE_SHIFT (23U) +/*! TDMAE - Transmitter DMA Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_BAUD_TDMAE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_TDMAE_SHIFT)) & LPUART_BAUD_TDMAE_MASK) + +#define LPUART_BAUD_OSR_MASK (0x1F000000U) +#define LPUART_BAUD_OSR_SHIFT (24U) +/*! OSR - Oversampling Ratio + * 0b00000..Results in an OSR of 16 + * 0b00001..Reserved + * 0b00010..Reserved + * 0b00011..Results in an OSR of 4 (requires BAUD[BOTHEDGE] to be 1) + * 0b00100..Results in an OSR of 5 (requires BAUD[BOTHEDGE] to be 1) + * 0b00101..Results in an OSR of 6 (requires BAUD[BOTHEDGE] to be 1) + * 0b00110..Results in an OSR of 7 (requires BAUD[BOTHEDGE] to be 1) + * 0b00111..Results in an OSR of 8 + * 0b01000..Results in an OSR of 9 + * 0b01001..Results in an OSR of 10 + * 0b01010..Results in an OSR of 11 + * 0b01011..Results in an OSR of 12 + * 0b01100..Results in an OSR of 13 + * 0b01101..Results in an OSR of 14 + * 0b01110..Results in an OSR of 15 + * 0b01111..Results in an OSR of 16 + * 0b10000..Results in an OSR of 17 + * 0b10001..Results in an OSR of 18 + * 0b10010..Results in an OSR of 19 + * 0b10011..Results in an OSR of 20 + * 0b10100..Results in an OSR of 21 + * 0b10101..Results in an OSR of 22 + * 0b10110..Results in an OSR of 23 + * 0b10111..Results in an OSR of 24 + * 0b11000..Results in an OSR of 25 + * 0b11001..Results in an OSR of 26 + * 0b11010..Results in an OSR of 27 + * 0b11011..Results in an OSR of 28 + * 0b11100..Results in an OSR of 29 + * 0b11101..Results in an OSR of 30 + * 0b11110..Results in an OSR of 31 + * 0b11111..Results in an OSR of 32 + */ +#define LPUART_BAUD_OSR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_OSR_SHIFT)) & LPUART_BAUD_OSR_MASK) + +#define LPUART_BAUD_M10_MASK (0x20000000U) +#define LPUART_BAUD_M10_SHIFT (29U) +/*! M10 - 10-Bit Mode Select + * 0b0..Receiver and transmitter use 7-bit to 9-bit data characters + * 0b1..Receiver and transmitter use 10-bit data characters + */ +#define LPUART_BAUD_M10(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_M10_SHIFT)) & LPUART_BAUD_M10_MASK) + +#define LPUART_BAUD_MAEN2_MASK (0x40000000U) +#define LPUART_BAUD_MAEN2_SHIFT (30U) +/*! MAEN2 - Match Address Mode Enable 2 + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_BAUD_MAEN2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MAEN2_SHIFT)) & LPUART_BAUD_MAEN2_MASK) + +#define LPUART_BAUD_MAEN1_MASK (0x80000000U) +#define LPUART_BAUD_MAEN1_SHIFT (31U) +/*! MAEN1 - Match Address Mode Enable 1 + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_BAUD_MAEN1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_BAUD_MAEN1_SHIFT)) & LPUART_BAUD_MAEN1_MASK) +/*! @} */ + +/*! @name STAT - Status */ +/*! @{ */ + +#define LPUART_STAT_LBKFE_MASK (0x1U) +#define LPUART_STAT_LBKFE_SHIFT (0U) +/*! LBKFE - LIN Break Flag Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_STAT_LBKFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_LBKFE_SHIFT)) & LPUART_STAT_LBKFE_MASK) + +#define LPUART_STAT_AME_MASK (0x2U) +#define LPUART_STAT_AME_SHIFT (1U) +/*! AME - Address Mark Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_STAT_AME(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_AME_SHIFT)) & LPUART_STAT_AME_MASK) + +#define LPUART_STAT_MA2F_MASK (0x4000U) +#define LPUART_STAT_MA2F_SHIFT (14U) +/*! MA2F - Match 2 Flag + * 0b0..Not equal to MA2 + * 0b1..Equal to MA2 + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_MA2F(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MA2F_SHIFT)) & LPUART_STAT_MA2F_MASK) + +#define LPUART_STAT_MA1F_MASK (0x8000U) +#define LPUART_STAT_MA1F_SHIFT (15U) +/*! MA1F - Match 1 Flag + * 0b0..Not equal to MA1 + * 0b1..Equal to MA1 + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_MA1F(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MA1F_SHIFT)) & LPUART_STAT_MA1F_MASK) + +#define LPUART_STAT_PF_MASK (0x10000U) +#define LPUART_STAT_PF_SHIFT (16U) +/*! PF - Parity Error Flag + * 0b0..No parity error detected + * 0b1..Parity error detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_PF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_PF_SHIFT)) & LPUART_STAT_PF_MASK) + +#define LPUART_STAT_FE_MASK (0x20000U) +#define LPUART_STAT_FE_SHIFT (17U) +/*! FE - Framing Error Flag + * 0b0..No framing error detected (this does not guarantee that the framing is correct) + * 0b1..Framing error detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_FE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_FE_SHIFT)) & LPUART_STAT_FE_MASK) + +#define LPUART_STAT_NF_MASK (0x40000U) +#define LPUART_STAT_NF_SHIFT (18U) +/*! NF - Noise Flag + * 0b0..No noise detected + * 0b1..Noise detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_NF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_NF_SHIFT)) & LPUART_STAT_NF_MASK) + +#define LPUART_STAT_OR_MASK (0x80000U) +#define LPUART_STAT_OR_SHIFT (19U) +/*! OR - Receiver Overrun Flag + * 0b0..No overrun + * 0b1..Receive overrun (new LPUART data is lost) + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_OR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_OR_SHIFT)) & LPUART_STAT_OR_MASK) + +#define LPUART_STAT_IDLE_MASK (0x100000U) +#define LPUART_STAT_IDLE_SHIFT (20U) +/*! IDLE - Idle Line Flag + * 0b0..Idle line detected + * 0b1..Idle line not detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_IDLE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_IDLE_SHIFT)) & LPUART_STAT_IDLE_MASK) + +#define LPUART_STAT_RDRF_MASK (0x200000U) +#define LPUART_STAT_RDRF_SHIFT (21U) +/*! RDRF - Receive Data Register Full Flag + * 0b0..Equal to or less than watermark + * 0b1..Greater than watermark + */ +#define LPUART_STAT_RDRF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RDRF_SHIFT)) & LPUART_STAT_RDRF_MASK) + +#define LPUART_STAT_TC_MASK (0x400000U) +#define LPUART_STAT_TC_SHIFT (22U) +/*! TC - Transmission Complete Flag + * 0b0..Transmitter active + * 0b1..Transmitter idle + */ +#define LPUART_STAT_TC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_TC_SHIFT)) & LPUART_STAT_TC_MASK) + +#define LPUART_STAT_TDRE_MASK (0x800000U) +#define LPUART_STAT_TDRE_SHIFT (23U) +/*! TDRE - Transmit Data Register Empty Flag + * 0b0..Greater than watermark + * 0b1..Equal to or less than watermark + */ +#define LPUART_STAT_TDRE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_TDRE_SHIFT)) & LPUART_STAT_TDRE_MASK) + +#define LPUART_STAT_RAF_MASK (0x1000000U) +#define LPUART_STAT_RAF_SHIFT (24U) +/*! RAF - Receiver Active Flag + * 0b0..Idle, waiting for a start bit + * 0b1..Receiver active (RXD pin input not idle) + */ +#define LPUART_STAT_RAF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RAF_SHIFT)) & LPUART_STAT_RAF_MASK) + +#define LPUART_STAT_LBKDE_MASK (0x2000000U) +#define LPUART_STAT_LBKDE_SHIFT (25U) +/*! LBKDE - LIN Break Detection Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_STAT_LBKDE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_LBKDE_SHIFT)) & LPUART_STAT_LBKDE_MASK) + +#define LPUART_STAT_BRK13_MASK (0x4000000U) +#define LPUART_STAT_BRK13_SHIFT (26U) +/*! BRK13 - Break Character Generation Length + * 0b0..9 to 13 bit times + * 0b1..12 to 15 bit times + */ +#define LPUART_STAT_BRK13(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_BRK13_SHIFT)) & LPUART_STAT_BRK13_MASK) + +#define LPUART_STAT_RWUID_MASK (0x8000000U) +#define LPUART_STAT_RWUID_SHIFT (27U) +/*! RWUID - Receive Wake Up Idle Detect + * 0b0..STAT[IDLE] does not become 1 + * 0b1..STAT[IDLE] becomes 1 + */ +#define LPUART_STAT_RWUID(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RWUID_SHIFT)) & LPUART_STAT_RWUID_MASK) + +#define LPUART_STAT_RXINV_MASK (0x10000000U) +#define LPUART_STAT_RXINV_SHIFT (28U) +/*! RXINV - Receive Data Inversion + * 0b0..Inverted + * 0b1..Not inverted + */ +#define LPUART_STAT_RXINV(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RXINV_SHIFT)) & LPUART_STAT_RXINV_MASK) + +#define LPUART_STAT_MSBF_MASK (0x20000000U) +#define LPUART_STAT_MSBF_SHIFT (29U) +/*! MSBF - MSB First + * 0b0..LSB + * 0b1..MSB + */ +#define LPUART_STAT_MSBF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_MSBF_SHIFT)) & LPUART_STAT_MSBF_MASK) + +#define LPUART_STAT_RXEDGIF_MASK (0x40000000U) +#define LPUART_STAT_RXEDGIF_SHIFT (30U) +/*! RXEDGIF - RXD Pin Active Edge Interrupt Flag + * 0b0..Not occurred + * 0b1..Occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_RXEDGIF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_RXEDGIF_SHIFT)) & LPUART_STAT_RXEDGIF_MASK) + +#define LPUART_STAT_LBKDIF_MASK (0x80000000U) +#define LPUART_STAT_LBKDIF_SHIFT (31U) +/*! LBKDIF - LIN Break Detect Interrupt Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_STAT_LBKDIF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_STAT_LBKDIF_SHIFT)) & LPUART_STAT_LBKDIF_MASK) +/*! @} */ + +/*! @name CTRL - Control */ +/*! @{ */ + +#define LPUART_CTRL_PT_MASK (0x1U) +#define LPUART_CTRL_PT_SHIFT (0U) +/*! PT - Parity Type + * 0b0..Even parity + * 0b1..Odd parity + */ +#define LPUART_CTRL_PT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PT_SHIFT)) & LPUART_CTRL_PT_MASK) + +#define LPUART_CTRL_PE_MASK (0x2U) +#define LPUART_CTRL_PE_SHIFT (1U) +/*! PE - Parity Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_PE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PE_SHIFT)) & LPUART_CTRL_PE_MASK) + +#define LPUART_CTRL_ILT_MASK (0x4U) +#define LPUART_CTRL_ILT_SHIFT (2U) +/*! ILT - Idle Line Type Select + * 0b0..After the start bit + * 0b1..After the stop bit + */ +#define LPUART_CTRL_ILT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ILT_SHIFT)) & LPUART_CTRL_ILT_MASK) + +#define LPUART_CTRL_WAKE_MASK (0x8U) +#define LPUART_CTRL_WAKE_SHIFT (3U) +/*! WAKE - Receiver Wake-Up Method Select + * 0b0..Idle + * 0b1..Mark + */ +#define LPUART_CTRL_WAKE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_WAKE_SHIFT)) & LPUART_CTRL_WAKE_MASK) + +#define LPUART_CTRL_M_MASK (0x10U) +#define LPUART_CTRL_M_SHIFT (4U) +/*! M - 9-Bit Or 8-Bit Mode Select + * 0b0..8-bit + * 0b1..9-bit + */ +#define LPUART_CTRL_M(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_M_SHIFT)) & LPUART_CTRL_M_MASK) + +#define LPUART_CTRL_RSRC_MASK (0x20U) +#define LPUART_CTRL_RSRC_SHIFT (5U) +/*! RSRC - Receiver Source Select + * 0b0..Internal Loopback mode + * 0b1..Single-wire mode + */ +#define LPUART_CTRL_RSRC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RSRC_SHIFT)) & LPUART_CTRL_RSRC_MASK) + +#define LPUART_CTRL_DOZEEN_MASK (0x40U) +#define LPUART_CTRL_DOZEEN_SHIFT (6U) +/*! DOZEEN - Doze Mode + * 0b0..Enable + * 0b1..Disable + */ +#define LPUART_CTRL_DOZEEN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_DOZEEN_SHIFT)) & LPUART_CTRL_DOZEEN_MASK) + +#define LPUART_CTRL_LOOPS_MASK (0x80U) +#define LPUART_CTRL_LOOPS_SHIFT (7U) +/*! LOOPS - Loop Mode Select + * 0b0..Normal operation: RXD and TXD use separate pins + * 0b1..Loop mode or Single-Wire mode + */ +#define LPUART_CTRL_LOOPS(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_LOOPS_SHIFT)) & LPUART_CTRL_LOOPS_MASK) + +#define LPUART_CTRL_IDLECFG_MASK (0x700U) +#define LPUART_CTRL_IDLECFG_SHIFT (8U) +/*! IDLECFG - Idle Configuration + * 0b000..1 + * 0b001..2 + * 0b010..4 + * 0b011..8 + * 0b100..16 + * 0b101..32 + * 0b110..64 + * 0b111..128 + */ +#define LPUART_CTRL_IDLECFG(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_IDLECFG_SHIFT)) & LPUART_CTRL_IDLECFG_MASK) + +#define LPUART_CTRL_M7_MASK (0x800U) +#define LPUART_CTRL_M7_SHIFT (11U) +/*! M7 - 7-Bit Mode Select + * 0b0..8-bit to 10-bit + * 0b1..7-bit + */ +#define LPUART_CTRL_M7(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_M7_SHIFT)) & LPUART_CTRL_M7_MASK) + +#define LPUART_CTRL_MA2IE_MASK (0x4000U) +#define LPUART_CTRL_MA2IE_SHIFT (14U) +/*! MA2IE - Match 2 (MA2F) Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_MA2IE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_MA2IE_SHIFT)) & LPUART_CTRL_MA2IE_MASK) + +#define LPUART_CTRL_MA1IE_MASK (0x8000U) +#define LPUART_CTRL_MA1IE_SHIFT (15U) +/*! MA1IE - Match 1 (MA1F) Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_MA1IE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_MA1IE_SHIFT)) & LPUART_CTRL_MA1IE_MASK) + +#define LPUART_CTRL_SBK_MASK (0x10000U) +#define LPUART_CTRL_SBK_SHIFT (16U) +/*! SBK - Send Break + * 0b0..Normal transmitter operation + * 0b1..Queue break character(s) to be sent + */ +#define LPUART_CTRL_SBK(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_SBK_SHIFT)) & LPUART_CTRL_SBK_MASK) + +#define LPUART_CTRL_RWU_MASK (0x20000U) +#define LPUART_CTRL_RWU_SHIFT (17U) +/*! RWU - Receiver Wake-Up Control + * 0b0..Normal receiver operation + * 0b1..LPUART receiver in standby, waiting for a wake-up condition + */ +#define LPUART_CTRL_RWU(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RWU_SHIFT)) & LPUART_CTRL_RWU_MASK) + +#define LPUART_CTRL_RE_MASK (0x40000U) +#define LPUART_CTRL_RE_SHIFT (18U) +/*! RE - Receiver Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_RE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RE_SHIFT)) & LPUART_CTRL_RE_MASK) + +#define LPUART_CTRL_TE_MASK (0x80000U) +#define LPUART_CTRL_TE_SHIFT (19U) +/*! TE - Transmitter Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_TE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TE_SHIFT)) & LPUART_CTRL_TE_MASK) + +#define LPUART_CTRL_ILIE_MASK (0x100000U) +#define LPUART_CTRL_ILIE_SHIFT (20U) +/*! ILIE - Idle Line Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_ILIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ILIE_SHIFT)) & LPUART_CTRL_ILIE_MASK) + +#define LPUART_CTRL_RIE_MASK (0x200000U) +#define LPUART_CTRL_RIE_SHIFT (21U) +/*! RIE - Receiver Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_RIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_RIE_SHIFT)) & LPUART_CTRL_RIE_MASK) + +#define LPUART_CTRL_TCIE_MASK (0x400000U) +#define LPUART_CTRL_TCIE_SHIFT (22U) +/*! TCIE - Transmission Complete Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_TCIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TCIE_SHIFT)) & LPUART_CTRL_TCIE_MASK) + +#define LPUART_CTRL_TIE_MASK (0x800000U) +#define LPUART_CTRL_TIE_SHIFT (23U) +/*! TIE - Transmit Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_TIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TIE_SHIFT)) & LPUART_CTRL_TIE_MASK) + +#define LPUART_CTRL_PEIE_MASK (0x1000000U) +#define LPUART_CTRL_PEIE_SHIFT (24U) +/*! PEIE - Parity Error Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_PEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_PEIE_SHIFT)) & LPUART_CTRL_PEIE_MASK) + +#define LPUART_CTRL_FEIE_MASK (0x2000000U) +#define LPUART_CTRL_FEIE_SHIFT (25U) +/*! FEIE - Framing Error Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_FEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_FEIE_SHIFT)) & LPUART_CTRL_FEIE_MASK) + +#define LPUART_CTRL_NEIE_MASK (0x4000000U) +#define LPUART_CTRL_NEIE_SHIFT (26U) +/*! NEIE - Noise Error Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_NEIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_NEIE_SHIFT)) & LPUART_CTRL_NEIE_MASK) + +#define LPUART_CTRL_ORIE_MASK (0x8000000U) +#define LPUART_CTRL_ORIE_SHIFT (27U) +/*! ORIE - Overrun Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_CTRL_ORIE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_ORIE_SHIFT)) & LPUART_CTRL_ORIE_MASK) + +#define LPUART_CTRL_TXINV_MASK (0x10000000U) +#define LPUART_CTRL_TXINV_SHIFT (28U) +/*! TXINV - Transmit Data Inversion + * 0b0..Not inverted + * 0b1..Inverted + */ +#define LPUART_CTRL_TXINV(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TXINV_SHIFT)) & LPUART_CTRL_TXINV_MASK) + +#define LPUART_CTRL_TXDIR_MASK (0x20000000U) +#define LPUART_CTRL_TXDIR_SHIFT (29U) +/*! TXDIR - TXD Pin Direction in Single-Wire Mode + * 0b0..Input + * 0b1..Output + */ +#define LPUART_CTRL_TXDIR(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_TXDIR_SHIFT)) & LPUART_CTRL_TXDIR_MASK) + +#define LPUART_CTRL_R9T8_MASK (0x40000000U) +#define LPUART_CTRL_R9T8_SHIFT (30U) +/*! R9T8 - Receive Bit 9 Transmit Bit 8 */ +#define LPUART_CTRL_R9T8(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_R9T8_SHIFT)) & LPUART_CTRL_R9T8_MASK) + +#define LPUART_CTRL_R8T9_MASK (0x80000000U) +#define LPUART_CTRL_R8T9_SHIFT (31U) +/*! R8T9 - Receive Bit 8 Transmit Bit 9 */ +#define LPUART_CTRL_R8T9(x) (((uint32_t)(((uint32_t)(x)) << LPUART_CTRL_R8T9_SHIFT)) & LPUART_CTRL_R8T9_MASK) +/*! @} */ + +/*! @name DATA - Data */ +/*! @{ */ + +#define LPUART_DATA_R0T0_MASK (0x1U) +#define LPUART_DATA_R0T0_SHIFT (0U) +/*! R0T0 - Read receive FIFO bit 0 or write transmit FIFO bit 0 */ +#define LPUART_DATA_R0T0(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R0T0_SHIFT)) & LPUART_DATA_R0T0_MASK) + +#define LPUART_DATA_R1T1_MASK (0x2U) +#define LPUART_DATA_R1T1_SHIFT (1U) +/*! R1T1 - Read receive FIFO bit 1 or write transmit FIFO bit 1 */ +#define LPUART_DATA_R1T1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R1T1_SHIFT)) & LPUART_DATA_R1T1_MASK) + +#define LPUART_DATA_R2T2_MASK (0x4U) +#define LPUART_DATA_R2T2_SHIFT (2U) +/*! R2T2 - Read receive FIFO bit 2 or write transmit FIFO bit 2 */ +#define LPUART_DATA_R2T2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R2T2_SHIFT)) & LPUART_DATA_R2T2_MASK) + +#define LPUART_DATA_R3T3_MASK (0x8U) +#define LPUART_DATA_R3T3_SHIFT (3U) +/*! R3T3 - Read receive FIFO bit 3 or write transmit FIFO bit 3 */ +#define LPUART_DATA_R3T3(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R3T3_SHIFT)) & LPUART_DATA_R3T3_MASK) + +#define LPUART_DATA_R4T4_MASK (0x10U) +#define LPUART_DATA_R4T4_SHIFT (4U) +/*! R4T4 - Read receive FIFO bit 4 or write transmit FIFO bit 4 */ +#define LPUART_DATA_R4T4(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R4T4_SHIFT)) & LPUART_DATA_R4T4_MASK) + +#define LPUART_DATA_R5T5_MASK (0x20U) +#define LPUART_DATA_R5T5_SHIFT (5U) +/*! R5T5 - Read receive FIFO bit 5 or write transmit FIFO bit 5 */ +#define LPUART_DATA_R5T5(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R5T5_SHIFT)) & LPUART_DATA_R5T5_MASK) + +#define LPUART_DATA_R6T6_MASK (0x40U) +#define LPUART_DATA_R6T6_SHIFT (6U) +/*! R6T6 - Read receive FIFO bit 6 or write transmit FIFO bit 6 */ +#define LPUART_DATA_R6T6(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R6T6_SHIFT)) & LPUART_DATA_R6T6_MASK) + +#define LPUART_DATA_R7T7_MASK (0x80U) +#define LPUART_DATA_R7T7_SHIFT (7U) +/*! R7T7 - Read receive FIFO bit 7 or write transmit FIFO bit 7 */ +#define LPUART_DATA_R7T7(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R7T7_SHIFT)) & LPUART_DATA_R7T7_MASK) + +#define LPUART_DATA_R8T8_MASK (0x100U) +#define LPUART_DATA_R8T8_SHIFT (8U) +/*! R8T8 - Read receive FIFO bit 8 or write transmit FIFO bit 8 */ +#define LPUART_DATA_R8T8(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R8T8_SHIFT)) & LPUART_DATA_R8T8_MASK) + +#define LPUART_DATA_R9T9_MASK (0x200U) +#define LPUART_DATA_R9T9_SHIFT (9U) +/*! R9T9 - Read receive FIFO bit 9 or write transmit FIFO bit 9 */ +#define LPUART_DATA_R9T9(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_R9T9_SHIFT)) & LPUART_DATA_R9T9_MASK) + +#define LPUART_DATA_LINBRK_MASK (0x400U) +#define LPUART_DATA_LINBRK_SHIFT (10U) +/*! LINBRK - LIN Break + * 0b0..Not detected + * 0b1..Detected + */ +#define LPUART_DATA_LINBRK(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_LINBRK_SHIFT)) & LPUART_DATA_LINBRK_MASK) + +#define LPUART_DATA_IDLINE_MASK (0x800U) +#define LPUART_DATA_IDLINE_SHIFT (11U) +/*! IDLINE - Idle Line + * 0b0..Not idle + * 0b1..Idle + */ +#define LPUART_DATA_IDLINE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_IDLINE_SHIFT)) & LPUART_DATA_IDLINE_MASK) + +#define LPUART_DATA_RXEMPT_MASK (0x1000U) +#define LPUART_DATA_RXEMPT_SHIFT (12U) +/*! RXEMPT - Receive Buffer Empty + * 0b0..Valid data + * 0b1..Invalid data and empty + */ +#define LPUART_DATA_RXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_RXEMPT_SHIFT)) & LPUART_DATA_RXEMPT_MASK) + +#define LPUART_DATA_FRETSC_MASK (0x2000U) +#define LPUART_DATA_FRETSC_SHIFT (13U) +/*! FRETSC - Frame Error Transmit Special Character + * 0b0..Received without a frame error on reads or transmits a normal character on writes + * 0b1..Received with a frame error on reads or transmits an idle or break character on writes + */ +#define LPUART_DATA_FRETSC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_FRETSC_SHIFT)) & LPUART_DATA_FRETSC_MASK) + +#define LPUART_DATA_PARITYE_MASK (0x4000U) +#define LPUART_DATA_PARITYE_SHIFT (14U) +/*! PARITYE - Parity Error + * 0b0..Received without a parity error + * 0b1..Received with a parity error + */ +#define LPUART_DATA_PARITYE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_PARITYE_SHIFT)) & LPUART_DATA_PARITYE_MASK) + +#define LPUART_DATA_NOISY_MASK (0x8000U) +#define LPUART_DATA_NOISY_SHIFT (15U) +/*! NOISY - Noisy Data Received + * 0b0..Received without noise + * 0b1..Received with noise + */ +#define LPUART_DATA_NOISY(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATA_NOISY_SHIFT)) & LPUART_DATA_NOISY_MASK) +/*! @} */ + +/*! @name MATCH - Match Address */ +/*! @{ */ + +#define LPUART_MATCH_MA1_MASK (0x3FFU) +#define LPUART_MATCH_MA1_SHIFT (0U) +/*! MA1 - Match Address 1 */ +#define LPUART_MATCH_MA1(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MATCH_MA1_SHIFT)) & LPUART_MATCH_MA1_MASK) + +#define LPUART_MATCH_MA2_MASK (0x3FF0000U) +#define LPUART_MATCH_MA2_SHIFT (16U) +/*! MA2 - Match Address 2 */ +#define LPUART_MATCH_MA2(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MATCH_MA2_SHIFT)) & LPUART_MATCH_MA2_MASK) +/*! @} */ + +/*! @name MODIR - MODEM IrDA */ +/*! @{ */ + +#define LPUART_MODIR_TXCTSE_MASK (0x1U) +#define LPUART_MODIR_TXCTSE_SHIFT (0U) +/*! TXCTSE - Transmitter CTS Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_MODIR_TXCTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSE_SHIFT)) & LPUART_MODIR_TXCTSE_MASK) + +#define LPUART_MODIR_TXRTSE_MASK (0x2U) +#define LPUART_MODIR_TXRTSE_SHIFT (1U) +/*! TXRTSE - Transmitter RTS Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_MODIR_TXRTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXRTSE_SHIFT)) & LPUART_MODIR_TXRTSE_MASK) + +#define LPUART_MODIR_TXRTSPOL_MASK (0x4U) +#define LPUART_MODIR_TXRTSPOL_SHIFT (2U) +/*! TXRTSPOL - Transmitter RTS Polarity + * 0b0..Active low + * 0b1..Active high + */ +#define LPUART_MODIR_TXRTSPOL(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXRTSPOL_SHIFT)) & LPUART_MODIR_TXRTSPOL_MASK) + +#define LPUART_MODIR_RXRTSE_MASK (0x8U) +#define LPUART_MODIR_RXRTSE_SHIFT (3U) +/*! RXRTSE - Receiver RTS Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_MODIR_RXRTSE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_RXRTSE_SHIFT)) & LPUART_MODIR_RXRTSE_MASK) + +#define LPUART_MODIR_TXCTSC_MASK (0x10U) +#define LPUART_MODIR_TXCTSC_SHIFT (4U) +/*! TXCTSC - Transmit CTS Configuration + * 0b0..Sampled at the start of each character + * 0b1..Sampled when the transmitter is idle + */ +#define LPUART_MODIR_TXCTSC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSC_SHIFT)) & LPUART_MODIR_TXCTSC_MASK) + +#define LPUART_MODIR_TXCTSSRC_MASK (0x20U) +#define LPUART_MODIR_TXCTSSRC_SHIFT (5U) +/*! TXCTSSRC - Transmit CTS Source + * 0b0..The CTS_B pin + * 0b1..An internal connection to the receiver address match result + */ +#define LPUART_MODIR_TXCTSSRC(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TXCTSSRC_SHIFT)) & LPUART_MODIR_TXCTSSRC_MASK) + +#define LPUART_MODIR_RTSWATER_MASK (0x300U) +#define LPUART_MODIR_RTSWATER_SHIFT (8U) +/*! RTSWATER - Receive RTS Configuration */ +#define LPUART_MODIR_RTSWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_RTSWATER_SHIFT)) & LPUART_MODIR_RTSWATER_MASK) + +#define LPUART_MODIR_TNP_MASK (0x30000U) +#define LPUART_MODIR_TNP_SHIFT (16U) +/*! TNP - Transmitter Narrow Pulse + * 0b00..1 / OSR + * 0b01..2 / OSR + * 0b10..3 / OSR + * 0b11..4 / OSR + */ +#define LPUART_MODIR_TNP(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_TNP_SHIFT)) & LPUART_MODIR_TNP_MASK) + +#define LPUART_MODIR_IREN_MASK (0x40000U) +#define LPUART_MODIR_IREN_SHIFT (18U) +/*! IREN - IR Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_MODIR_IREN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_MODIR_IREN_SHIFT)) & LPUART_MODIR_IREN_MASK) +/*! @} */ + +/*! @name FIFO - FIFO */ +/*! @{ */ + +#define LPUART_FIFO_RXFIFOSIZE_MASK (0x7U) +#define LPUART_FIFO_RXFIFOSIZE_SHIFT (0U) +/*! RXFIFOSIZE - Receive FIFO Buffer Depth + * 0b000..1 + * 0b001..4 + * 0b010..8 + * 0b011..16 + * 0b100..32 + * 0b101..64 + * 0b110..128 + * 0b111..256 + */ +#define LPUART_FIFO_RXFIFOSIZE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFIFOSIZE_SHIFT)) & LPUART_FIFO_RXFIFOSIZE_MASK) + +#define LPUART_FIFO_RXFE_MASK (0x8U) +#define LPUART_FIFO_RXFE_SHIFT (3U) +/*! RXFE - Receive FIFO Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_FIFO_RXFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFE_SHIFT)) & LPUART_FIFO_RXFE_MASK) + +#define LPUART_FIFO_TXFIFOSIZE_MASK (0x70U) +#define LPUART_FIFO_TXFIFOSIZE_SHIFT (4U) +/*! TXFIFOSIZE - Transmit FIFO Buffer Depth + * 0b000..1 + * 0b001..4 + * 0b010..8 + * 0b011..16 + * 0b100..32 + * 0b101..64 + * 0b110..128 + * 0b111..256 + */ +#define LPUART_FIFO_TXFIFOSIZE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFIFOSIZE_SHIFT)) & LPUART_FIFO_TXFIFOSIZE_MASK) + +#define LPUART_FIFO_TXFE_MASK (0x80U) +#define LPUART_FIFO_TXFE_SHIFT (7U) +/*! TXFE - Transmit FIFO Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_FIFO_TXFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFE_SHIFT)) & LPUART_FIFO_TXFE_MASK) + +#define LPUART_FIFO_RXUFE_MASK (0x100U) +#define LPUART_FIFO_RXUFE_SHIFT (8U) +/*! RXUFE - Receive FIFO Underflow Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_FIFO_RXUFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXUFE_SHIFT)) & LPUART_FIFO_RXUFE_MASK) + +#define LPUART_FIFO_TXOFE_MASK (0x200U) +#define LPUART_FIFO_TXOFE_SHIFT (9U) +/*! TXOFE - Transmit FIFO Overflow Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define LPUART_FIFO_TXOFE(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXOFE_SHIFT)) & LPUART_FIFO_TXOFE_MASK) + +#define LPUART_FIFO_RXIDEN_MASK (0x1C00U) +#define LPUART_FIFO_RXIDEN_SHIFT (10U) +/*! RXIDEN - Receiver Idle Empty Enable + * 0b000..Disable STAT[RDRF] to become 1 because of partially filled FIFO when the receiver is idle + * 0b001..Enable STAT[RDRF] to become 1 because of partially filled FIFO when the receiver is idle for one character + * 0b010..Enable STAT[RDRF] to become 1 because of partially filled FIFO when the receiver is idle for two characters + * 0b011..Enable STAT[RDRF] to become 1 because of partially filled FIFO when the receiver is idle for four characters + * 0b100..Enable STAT[RDRF] to become 1 because of partially filled FIFO when the receiver is idle for eight characters + * 0b101..Enable STAT[RDRF] to become 1 because of partially filled FIFO when the receiver is idle for 16 characters + * 0b110..Enable STAT[RDRF] to become 1 because of partially filled FIFO when the receiver is idle for 32 characters + * 0b111..Enable STAT[RDRF] to become 1 because of partially filled FIFO when the receiver is idle for 64 characters + */ +#define LPUART_FIFO_RXIDEN(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXIDEN_SHIFT)) & LPUART_FIFO_RXIDEN_MASK) + +#define LPUART_FIFO_RXFLUSH_MASK (0x4000U) +#define LPUART_FIFO_RXFLUSH_SHIFT (14U) +/*! RXFLUSH - Receive FIFO Flush + * 0b0..No effect + * 0b1..All data flushed out + */ +#define LPUART_FIFO_RXFLUSH(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXFLUSH_SHIFT)) & LPUART_FIFO_RXFLUSH_MASK) + +#define LPUART_FIFO_TXFLUSH_MASK (0x8000U) +#define LPUART_FIFO_TXFLUSH_SHIFT (15U) +/*! TXFLUSH - Transmit FIFO Flush + * 0b0..No effect + * 0b1..All data flushed out + */ +#define LPUART_FIFO_TXFLUSH(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXFLUSH_SHIFT)) & LPUART_FIFO_TXFLUSH_MASK) + +#define LPUART_FIFO_RXUF_MASK (0x10000U) +#define LPUART_FIFO_RXUF_SHIFT (16U) +/*! RXUF - Receiver FIFO Underflow Flag + * 0b0..No underflow + * 0b1..Underflow + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_FIFO_RXUF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXUF_SHIFT)) & LPUART_FIFO_RXUF_MASK) + +#define LPUART_FIFO_TXOF_MASK (0x20000U) +#define LPUART_FIFO_TXOF_SHIFT (17U) +/*! TXOF - Transmitter FIFO Overflow Flag + * 0b0..No overflow + * 0b1..Overflow + * 0b0..No effect + * 0b1..Clear the flag + */ +#define LPUART_FIFO_TXOF(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXOF_SHIFT)) & LPUART_FIFO_TXOF_MASK) + +#define LPUART_FIFO_RXEMPT_MASK (0x400000U) +#define LPUART_FIFO_RXEMPT_SHIFT (22U) +/*! RXEMPT - Receive FIFO Or Buffer Empty + * 0b0..Not empty + * 0b1..Empty + */ +#define LPUART_FIFO_RXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_RXEMPT_SHIFT)) & LPUART_FIFO_RXEMPT_MASK) + +#define LPUART_FIFO_TXEMPT_MASK (0x800000U) +#define LPUART_FIFO_TXEMPT_SHIFT (23U) +/*! TXEMPT - Transmit FIFO Or Buffer Empty + * 0b0..Not empty + * 0b1..Empty + */ +#define LPUART_FIFO_TXEMPT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_FIFO_TXEMPT_SHIFT)) & LPUART_FIFO_TXEMPT_MASK) +/*! @} */ + +/*! @name WATER - Watermark */ +/*! @{ */ + +#define LPUART_WATER_TXWATER_MASK (0x3U) +#define LPUART_WATER_TXWATER_SHIFT (0U) +/*! TXWATER - Transmit Watermark */ +#define LPUART_WATER_TXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_TXWATER_SHIFT)) & LPUART_WATER_TXWATER_MASK) + +#define LPUART_WATER_TXCOUNT_MASK (0x700U) +#define LPUART_WATER_TXCOUNT_SHIFT (8U) +/*! TXCOUNT - Transmit Counter */ +#define LPUART_WATER_TXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_TXCOUNT_SHIFT)) & LPUART_WATER_TXCOUNT_MASK) + +#define LPUART_WATER_RXWATER_MASK (0x30000U) +#define LPUART_WATER_RXWATER_SHIFT (16U) +/*! RXWATER - Receive Watermark */ +#define LPUART_WATER_RXWATER(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_RXWATER_SHIFT)) & LPUART_WATER_RXWATER_MASK) + +#define LPUART_WATER_RXCOUNT_MASK (0x7000000U) +#define LPUART_WATER_RXCOUNT_SHIFT (24U) +/*! RXCOUNT - Receive Counter */ +#define LPUART_WATER_RXCOUNT(x) (((uint32_t)(((uint32_t)(x)) << LPUART_WATER_RXCOUNT_SHIFT)) & LPUART_WATER_RXCOUNT_MASK) +/*! @} */ + +/*! @name DATARO - Data Read-Only */ +/*! @{ */ + +#define LPUART_DATARO_DATA_MASK (0xFFFFU) +#define LPUART_DATARO_DATA_SHIFT (0U) +/*! DATA - Receive Data */ +#define LPUART_DATARO_DATA(x) (((uint32_t)(((uint32_t)(x)) << LPUART_DATARO_DATA_SHIFT)) & LPUART_DATARO_DATA_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group LPUART_Register_Masks */ + + +/* LPUART - Peripheral instance base addresses */ +/** Peripheral LPUART0 base address */ +#define LPUART0_BASE (0x4009F000u) +/** Peripheral LPUART0 base pointer */ +#define LPUART0 ((LPUART_Type *)LPUART0_BASE) +/** Peripheral LPUART1 base address */ +#define LPUART1_BASE (0x400A0000u) +/** Peripheral LPUART1 base pointer */ +#define LPUART1 ((LPUART_Type *)LPUART1_BASE) +/** Peripheral LPUART2 base address */ +#define LPUART2_BASE (0x400A1000u) +/** Peripheral LPUART2 base pointer */ +#define LPUART2 ((LPUART_Type *)LPUART2_BASE) +/** Peripheral LPUART3 base address */ +#define LPUART3_BASE (0x400A2000u) +/** Peripheral LPUART3 base pointer */ +#define LPUART3 ((LPUART_Type *)LPUART3_BASE) +/** Peripheral LPUART4 base address */ +#define LPUART4_BASE (0x400A3000u) +/** Peripheral LPUART4 base pointer */ +#define LPUART4 ((LPUART_Type *)LPUART4_BASE) +/** Array initializer of LPUART peripheral base addresses */ +#define LPUART_BASE_ADDRS { LPUART0_BASE, LPUART1_BASE, LPUART2_BASE, LPUART3_BASE, LPUART4_BASE } +/** Array initializer of LPUART peripheral base pointers */ +#define LPUART_BASE_PTRS { LPUART0, LPUART1, LPUART2, LPUART3, LPUART4 } +/** Interrupt vectors for the LPUART peripheral type */ +#define LPUART_RX_TX_IRQS { LPUART0_IRQn, LPUART1_IRQn, LPUART2_IRQn, LPUART3_IRQn, LPUART4_IRQn } +#define LPUART_ERR_IRQS { LPUART0_IRQn, LPUART1_IRQn, LPUART2_IRQn, LPUART3_IRQn, LPUART4_IRQn } + +/*! + * @} + */ /* end of group LPUART_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- MRCC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MRCC_Peripheral_Access_Layer MRCC Peripheral Access Layer + * @{ + */ + +/** MRCC - Register Layout Typedef */ +typedef struct { + __IO uint32_t MRCC_GLB_RST0; /**< Peripheral Reset Control 0, offset: 0x0 */ + __O uint32_t MRCC_GLB_RST0_SET; /**< Peripheral Reset Control Set 0, offset: 0x4 */ + __O uint32_t MRCC_GLB_RST0_CLR; /**< Peripheral Reset Control Clear 0, offset: 0x8 */ + uint8_t RESERVED_0[4]; + __IO uint32_t MRCC_GLB_RST1; /**< Peripheral Reset Control 1, offset: 0x10 */ + __O uint32_t MRCC_GLB_RST1_SET; /**< Peripheral Reset Control Set 1, offset: 0x14 */ + __O uint32_t MRCC_GLB_RST1_CLR; /**< Peripheral Reset Control Clear 1, offset: 0x18 */ + uint8_t RESERVED_1[36]; + __IO uint32_t MRCC_GLB_CC0; /**< AHB Clock Control 0, offset: 0x40 */ + __O uint32_t MRCC_GLB_CC0_SET; /**< AHB Clock Control Set 0, offset: 0x44 */ + __O uint32_t MRCC_GLB_CC0_CLR; /**< AHB Clock Control Clear 0, offset: 0x48 */ + uint8_t RESERVED_2[4]; + __IO uint32_t MRCC_GLB_CC1; /**< AHB Clock Control 1, offset: 0x50 */ + __O uint32_t MRCC_GLB_CC_SET[1]; /**< AHB Clock Control Set 1, array offset: 0x54, array step: 0x4 */ + __O uint32_t MRCC_GLB_CC_CLR[1]; /**< AHB Clock Control Clear 1, array offset: 0x58, array step: 0x4 */ + uint8_t RESERVED_3[36]; + __IO uint32_t MRCC_GLB_ACC0; /**< Control Automatic Clock Gating 0, offset: 0x80 */ + __IO uint32_t MRCC_GLB_ACC1; /**< Control Automatic Clock Gating 1, offset: 0x84 */ + uint8_t RESERVED_4[24]; + __IO uint32_t MRCC_I3C0_FCLK_CLKSEL; /**< I3C0_FCLK clock selection control, offset: 0xA0 */ + __IO uint32_t MRCC_I3C0_FCLK_CLKDIV; /**< I3C0_FCLK clock divider control, offset: 0xA4 */ + __IO uint32_t MRCC_CTIMER0_CLKSEL; /**< CTIMER0 clock selection control, offset: 0xA8 */ + __IO uint32_t MRCC_CTIMER0_CLKDIV; /**< CTIMER0 clock divider control, offset: 0xAC */ + __IO uint32_t MRCC_CTIMER1_CLKSEL; /**< CTIMER1 clock selection control, offset: 0xB0 */ + __IO uint32_t MRCC_CTIMER1_CLKDIV; /**< CTIMER1 clock divider control, offset: 0xB4 */ + __IO uint32_t MRCC_CTIMER2_CLKSEL; /**< CTIMER2 clock selection control, offset: 0xB8 */ + __IO uint32_t MRCC_CTIMER2_CLKDIV; /**< CTIMER2 clock divider control, offset: 0xBC */ + __IO uint32_t MRCC_CTIMER3_CLKSEL; /**< CTIMER3 clock selection control, offset: 0xC0 */ + __IO uint32_t MRCC_CTIMER3_CLKDIV; /**< CTIMER3 clock divider control, offset: 0xC4 */ + __IO uint32_t MRCC_CTIMER4_CLKSEL; /**< CTIMER4 clock selection control, offset: 0xC8 */ + __IO uint32_t MRCC_CTIMER4_CLKDIV; /**< CTIMER4 clock divider control, offset: 0xCC */ + uint8_t RESERVED_5[4]; + __IO uint32_t MRCC_WWDT0_CLKDIV; /**< WWDT0 clock divider control, offset: 0xD4 */ + __IO uint32_t MRCC_FLEXIO0_CLKSEL; /**< FLEXIO0 clock selection control, offset: 0xD8 */ + __IO uint32_t MRCC_FLEXIO0_CLKDIV; /**< FLEXIO0 clock divider control, offset: 0xDC */ + __IO uint32_t MRCC_LPI2C0_CLKSEL; /**< LPI2C0 clock selection control, offset: 0xE0 */ + __IO uint32_t MRCC_LPI2C0_CLKDIV; /**< LPI2C0 clock divider control, offset: 0xE4 */ + __IO uint32_t MRCC_LPI2C1_CLKSEL; /**< LPI2C1 clock selection control, offset: 0xE8 */ + __IO uint32_t MRCC_LPI2C1_CLKDIV; /**< LPI2C1 clock divider control, offset: 0xEC */ + __IO uint32_t MRCC_LPSPI0_CLKSEL; /**< LPSPI0 clock selection control, offset: 0xF0 */ + __IO uint32_t MRCC_LPSPI0_CLKDIV; /**< LPSPI0 clock divider control, offset: 0xF4 */ + __IO uint32_t MRCC_LPSPI1_CLKSEL; /**< LPSPI1 clock selection control, offset: 0xF8 */ + __IO uint32_t MRCC_LPSPI1_CLKDIV; /**< LPSPI1 clock divider control, offset: 0xFC */ + __IO uint32_t MRCC_LPUART0_CLKSEL; /**< LPUART0 clock selection control, offset: 0x100 */ + __IO uint32_t MRCC_LPUART0_CLKDIV; /**< LPUART0 clock divider control, offset: 0x104 */ + __IO uint32_t MRCC_LPUART1_CLKSEL; /**< LPUART1 clock selection control, offset: 0x108 */ + __IO uint32_t MRCC_LPUART1_CLKDIV; /**< LPUART1 clock divider control, offset: 0x10C */ + __IO uint32_t MRCC_LPUART2_CLKSEL; /**< LPUART2 clock selection control, offset: 0x110 */ + __IO uint32_t MRCC_LPUART2_CLKDIV; /**< LPUART2 clock divider control, offset: 0x114 */ + __IO uint32_t MRCC_LPUART3_CLKSEL; /**< LPUART3 clock selection control, offset: 0x118 */ + __IO uint32_t MRCC_LPUART3_CLKDIV; /**< LPUART3 clock divider control, offset: 0x11C */ + __IO uint32_t MRCC_LPUART4_CLKSEL; /**< LPUART4 clock selection control, offset: 0x120 */ + __IO uint32_t MRCC_LPUART4_CLKDIV; /**< LPUART4 clock divider control, offset: 0x124 */ + __IO uint32_t MRCC_USB0_CLKSEL; /**< USB0 clock selection control, offset: 0x128 */ + uint8_t RESERVED_6[4]; + __IO uint32_t MRCC_LPTMR0_CLKSEL; /**< LPTMR0 clock selection control, offset: 0x130 */ + __IO uint32_t MRCC_LPTMR0_CLKDIV; /**< LPTMR0 clock divider control, offset: 0x134 */ + __IO uint32_t MRCC_OSTIMER0_CLKSEL; /**< OSTIMER0 clock selection control, offset: 0x138 */ + uint8_t RESERVED_7[4]; + __IO uint32_t MRCC_ADC0_CLKSEL; /**< ADC0 clock selection control, offset: 0x140 */ + __IO uint32_t MRCC_ADC0_CLKDIV; /**< ADC0 clock divider control, offset: 0x144 */ + __IO uint32_t MRCC_ADC1_CLKSEL; /**< ADC1 clock selection control, offset: 0x148 */ + __IO uint32_t MRCC_ADC1_CLKDIV; /**< ADC1 clock divider control, offset: 0x14C */ + uint8_t RESERVED_8[4]; + __IO uint32_t MRCC_CMP0_FUNC_CLKDIV; /**< CMP0_FUNC clock divider control, offset: 0x154 */ + __IO uint32_t MRCC_CMP0_RR_CLKSEL; /**< CMP0_RR clock selection control, offset: 0x158 */ + __IO uint32_t MRCC_CMP0_RR_CLKDIV; /**< CMP0_RR clock divider control, offset: 0x15C */ + uint8_t RESERVED_9[4]; + __IO uint32_t MRCC_CMP1_FUNC_CLKDIV; /**< CMP1_FUNC clock divider control, offset: 0x164 */ + __IO uint32_t MRCC_CMP1_RR_CLKSEL; /**< CMP1_RR clock selection control, offset: 0x168 */ + __IO uint32_t MRCC_CMP1_RR_CLKDIV; /**< CMP1_RR clock divider control, offset: 0x16C */ + __IO uint32_t MRCC_DAC0_CLKSEL; /**< DAC0 clock selection control, offset: 0x170 */ + __IO uint32_t MRCC_DAC0_CLKDIV; /**< DAC0 clock divider control, offset: 0x174 */ + __IO uint32_t MRCC_FLEXCAN0_CLKSEL; /**< FLEXCAN0 clock selection control, offset: 0x178 */ + __IO uint32_t MRCC_FLEXCAN0_CLKDIV; /**< FLEXCAN0 clock divider control, offset: 0x17C */ + __IO uint32_t MRCC_LPI2C2_CLKSEL; /**< LPI2C2 clock selection control, offset: 0x180 */ + __IO uint32_t MRCC_LPI2C2_CLKDIV; /**< LPI2C2 clock divider control, offset: 0x184 */ + __IO uint32_t MRCC_LPI2C3_CLKSEL; /**< LPI2C3 clock selection control, offset: 0x188 */ + __IO uint32_t MRCC_LPI2C3_CLKDIV; /**< LPI2C3 clock divider control, offset: 0x18C */ + __IO uint32_t MRCC_DBG_TRACE_CLKSEL; /**< DBG_TRACE clock selection control, offset: 0x190 */ + __IO uint32_t MRCC_DBG_TRACE_CLKDIV; /**< DBG_TRACE clock divider control, offset: 0x194 */ + __IO uint32_t MRCC_CLKOUT_CLKSEL; /**< CLKOUT clock selection control, offset: 0x198 */ + __IO uint32_t MRCC_CLKOUT_CLKDIV; /**< CLKOUT clock divider control, offset: 0x19C */ + __IO uint32_t MRCC_SYSTICK_CLKSEL; /**< SYSTICK clock selection control, offset: 0x1A0 */ + __IO uint32_t MRCC_SYSTICK_CLKDIV; /**< SYSTICK clock divider control, offset: 0x1A4 */ + uint8_t RESERVED_10[4]; + __IO uint32_t MRCC_FRO_HF_DIV_CLKDIV; /**< FRO_HF_DIV clock divider control, offset: 0x1AC */ +} MRCC_Type; + +/* ---------------------------------------------------------------------------- + -- MRCC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup MRCC_Register_Masks MRCC Register Masks + * @{ + */ + +/*! @name MRCC_GLB_RST0 - Peripheral Reset Control 0 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_RST0_INPUTMUX0_MASK (0x1U) +#define MRCC_MRCC_GLB_RST0_INPUTMUX0_SHIFT (0U) +/*! INPUTMUX0 - INPUTMUX0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_INPUTMUX0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_INPUTMUX0_SHIFT)) & MRCC_MRCC_GLB_RST0_INPUTMUX0_MASK) + +#define MRCC_MRCC_GLB_RST0_I3C0_MASK (0x2U) +#define MRCC_MRCC_GLB_RST0_I3C0_SHIFT (1U) +/*! I3C0 - I3C0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_I3C0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_I3C0_SHIFT)) & MRCC_MRCC_GLB_RST0_I3C0_MASK) + +#define MRCC_MRCC_GLB_RST0_CTIMER0_MASK (0x4U) +#define MRCC_MRCC_GLB_RST0_CTIMER0_SHIFT (2U) +/*! CTIMER0 - CTIMER0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_CTIMER0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_CTIMER0_SHIFT)) & MRCC_MRCC_GLB_RST0_CTIMER0_MASK) + +#define MRCC_MRCC_GLB_RST0_CTIMER1_MASK (0x8U) +#define MRCC_MRCC_GLB_RST0_CTIMER1_SHIFT (3U) +/*! CTIMER1 - CTIMER1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_CTIMER1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_CTIMER1_SHIFT)) & MRCC_MRCC_GLB_RST0_CTIMER1_MASK) + +#define MRCC_MRCC_GLB_RST0_CTIMER2_MASK (0x10U) +#define MRCC_MRCC_GLB_RST0_CTIMER2_SHIFT (4U) +/*! CTIMER2 - CTIMER2 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_CTIMER2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_CTIMER2_SHIFT)) & MRCC_MRCC_GLB_RST0_CTIMER2_MASK) + +#define MRCC_MRCC_GLB_RST0_CTIMER3_MASK (0x20U) +#define MRCC_MRCC_GLB_RST0_CTIMER3_SHIFT (5U) +/*! CTIMER3 - CTIMER3 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_CTIMER3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_CTIMER3_SHIFT)) & MRCC_MRCC_GLB_RST0_CTIMER3_MASK) + +#define MRCC_MRCC_GLB_RST0_CTIMER4_MASK (0x40U) +#define MRCC_MRCC_GLB_RST0_CTIMER4_SHIFT (6U) +/*! CTIMER4 - CTIMER4 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_CTIMER4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_CTIMER4_SHIFT)) & MRCC_MRCC_GLB_RST0_CTIMER4_MASK) + +#define MRCC_MRCC_GLB_RST0_FREQME_MASK (0x80U) +#define MRCC_MRCC_GLB_RST0_FREQME_SHIFT (7U) +/*! FREQME - FREQME + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_FREQME(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_FREQME_SHIFT)) & MRCC_MRCC_GLB_RST0_FREQME_MASK) + +#define MRCC_MRCC_GLB_RST0_UTICK0_MASK (0x100U) +#define MRCC_MRCC_GLB_RST0_UTICK0_SHIFT (8U) +/*! UTICK0 - UTICK0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_UTICK0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_UTICK0_SHIFT)) & MRCC_MRCC_GLB_RST0_UTICK0_MASK) + +#define MRCC_MRCC_GLB_RST0_DMA_MASK (0x400U) +#define MRCC_MRCC_GLB_RST0_DMA_SHIFT (10U) +/*! DMA - DMA + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_DMA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_DMA_SHIFT)) & MRCC_MRCC_GLB_RST0_DMA_MASK) + +#define MRCC_MRCC_GLB_RST0_AOI0_MASK (0x800U) +#define MRCC_MRCC_GLB_RST0_AOI0_SHIFT (11U) +/*! AOI0 - AOI0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_AOI0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_AOI0_SHIFT)) & MRCC_MRCC_GLB_RST0_AOI0_MASK) + +#define MRCC_MRCC_GLB_RST0_CRC0_MASK (0x1000U) +#define MRCC_MRCC_GLB_RST0_CRC0_SHIFT (12U) +/*! CRC0 - CRC0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_CRC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_CRC0_SHIFT)) & MRCC_MRCC_GLB_RST0_CRC0_MASK) + +#define MRCC_MRCC_GLB_RST0_EIM0_MASK (0x2000U) +#define MRCC_MRCC_GLB_RST0_EIM0_SHIFT (13U) +/*! EIM0 - EIM0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_EIM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_EIM0_SHIFT)) & MRCC_MRCC_GLB_RST0_EIM0_MASK) + +#define MRCC_MRCC_GLB_RST0_ERM0_MASK (0x4000U) +#define MRCC_MRCC_GLB_RST0_ERM0_SHIFT (14U) +/*! ERM0 - ERM0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_ERM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_ERM0_SHIFT)) & MRCC_MRCC_GLB_RST0_ERM0_MASK) + +#define MRCC_MRCC_GLB_RST0_AOI1_MASK (0x10000U) +#define MRCC_MRCC_GLB_RST0_AOI1_SHIFT (16U) +/*! AOI1 - AOI1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_AOI1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_AOI1_SHIFT)) & MRCC_MRCC_GLB_RST0_AOI1_MASK) + +#define MRCC_MRCC_GLB_RST0_FLEXIO0_MASK (0x20000U) +#define MRCC_MRCC_GLB_RST0_FLEXIO0_SHIFT (17U) +/*! FLEXIO0 - FLEXIO0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_FLEXIO0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_FLEXIO0_SHIFT)) & MRCC_MRCC_GLB_RST0_FLEXIO0_MASK) + +#define MRCC_MRCC_GLB_RST0_LPI2C0_MASK (0x40000U) +#define MRCC_MRCC_GLB_RST0_LPI2C0_SHIFT (18U) +/*! LPI2C0 - LPI2C0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPI2C0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPI2C0_SHIFT)) & MRCC_MRCC_GLB_RST0_LPI2C0_MASK) + +#define MRCC_MRCC_GLB_RST0_LPI2C1_MASK (0x80000U) +#define MRCC_MRCC_GLB_RST0_LPI2C1_SHIFT (19U) +/*! LPI2C1 - LPI2C1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPI2C1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPI2C1_SHIFT)) & MRCC_MRCC_GLB_RST0_LPI2C1_MASK) + +#define MRCC_MRCC_GLB_RST0_LPSPI0_MASK (0x100000U) +#define MRCC_MRCC_GLB_RST0_LPSPI0_SHIFT (20U) +/*! LPSPI0 - LPSPI0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPSPI0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPSPI0_SHIFT)) & MRCC_MRCC_GLB_RST0_LPSPI0_MASK) + +#define MRCC_MRCC_GLB_RST0_LPSPI1_MASK (0x200000U) +#define MRCC_MRCC_GLB_RST0_LPSPI1_SHIFT (21U) +/*! LPSPI1 - LPSPI1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPSPI1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPSPI1_SHIFT)) & MRCC_MRCC_GLB_RST0_LPSPI1_MASK) + +#define MRCC_MRCC_GLB_RST0_LPUART0_MASK (0x400000U) +#define MRCC_MRCC_GLB_RST0_LPUART0_SHIFT (22U) +/*! LPUART0 - LPUART0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPUART0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPUART0_SHIFT)) & MRCC_MRCC_GLB_RST0_LPUART0_MASK) + +#define MRCC_MRCC_GLB_RST0_LPUART1_MASK (0x800000U) +#define MRCC_MRCC_GLB_RST0_LPUART1_SHIFT (23U) +/*! LPUART1 - LPUART1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPUART1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPUART1_SHIFT)) & MRCC_MRCC_GLB_RST0_LPUART1_MASK) + +#define MRCC_MRCC_GLB_RST0_LPUART2_MASK (0x1000000U) +#define MRCC_MRCC_GLB_RST0_LPUART2_SHIFT (24U) +/*! LPUART2 - LPUART2 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPUART2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPUART2_SHIFT)) & MRCC_MRCC_GLB_RST0_LPUART2_MASK) + +#define MRCC_MRCC_GLB_RST0_LPUART3_MASK (0x2000000U) +#define MRCC_MRCC_GLB_RST0_LPUART3_SHIFT (25U) +/*! LPUART3 - LPUART3 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPUART3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPUART3_SHIFT)) & MRCC_MRCC_GLB_RST0_LPUART3_MASK) + +#define MRCC_MRCC_GLB_RST0_LPUART4_MASK (0x4000000U) +#define MRCC_MRCC_GLB_RST0_LPUART4_SHIFT (26U) +/*! LPUART4 - LPUART4 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_LPUART4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_LPUART4_SHIFT)) & MRCC_MRCC_GLB_RST0_LPUART4_MASK) + +#define MRCC_MRCC_GLB_RST0_USB0_MASK (0x8000000U) +#define MRCC_MRCC_GLB_RST0_USB0_SHIFT (27U) +/*! USB0 - USB0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_USB0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_USB0_SHIFT)) & MRCC_MRCC_GLB_RST0_USB0_MASK) + +#define MRCC_MRCC_GLB_RST0_QDC0_MASK (0x10000000U) +#define MRCC_MRCC_GLB_RST0_QDC0_SHIFT (28U) +/*! QDC0 - QDC0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_QDC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_QDC0_SHIFT)) & MRCC_MRCC_GLB_RST0_QDC0_MASK) + +#define MRCC_MRCC_GLB_RST0_QDC1_MASK (0x20000000U) +#define MRCC_MRCC_GLB_RST0_QDC1_SHIFT (29U) +/*! QDC1 - QDC1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_QDC1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_QDC1_SHIFT)) & MRCC_MRCC_GLB_RST0_QDC1_MASK) + +#define MRCC_MRCC_GLB_RST0_FLEXPWM0_MASK (0x40000000U) +#define MRCC_MRCC_GLB_RST0_FLEXPWM0_SHIFT (30U) +/*! FLEXPWM0 - FLEXPWM0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_FLEXPWM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_FLEXPWM0_SHIFT)) & MRCC_MRCC_GLB_RST0_FLEXPWM0_MASK) + +#define MRCC_MRCC_GLB_RST0_FLEXPWM1_MASK (0x80000000U) +#define MRCC_MRCC_GLB_RST0_FLEXPWM1_SHIFT (31U) +/*! FLEXPWM1 - FLEXPWM1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST0_FLEXPWM1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_FLEXPWM1_SHIFT)) & MRCC_MRCC_GLB_RST0_FLEXPWM1_MASK) +/*! @} */ + +/*! @name MRCC_GLB_RST0_SET - Peripheral Reset Control Set 0 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_RST0_SET_DATA_MASK (0xFFFFFFFFU) +#define MRCC_MRCC_GLB_RST0_SET_DATA_SHIFT (0U) +/*! DATA - Data array value, refer to corresponding position in MRCC_GLB_RSTn. */ +#define MRCC_MRCC_GLB_RST0_SET_DATA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_SET_DATA_SHIFT)) & MRCC_MRCC_GLB_RST0_SET_DATA_MASK) +/*! @} */ + +/*! @name MRCC_GLB_RST0_CLR - Peripheral Reset Control Clear 0 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_RST0_CLR_DATA_MASK (0xFFFFFFFFU) +#define MRCC_MRCC_GLB_RST0_CLR_DATA_SHIFT (0U) +/*! DATA - Data array value, refer to corresponding position in MRCC_GLB_RSTn. */ +#define MRCC_MRCC_GLB_RST0_CLR_DATA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST0_CLR_DATA_SHIFT)) & MRCC_MRCC_GLB_RST0_CLR_DATA_MASK) +/*! @} */ + +/*! @name MRCC_GLB_RST1 - Peripheral Reset Control 1 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_RST1_OSTIMER0_MASK (0x1U) +#define MRCC_MRCC_GLB_RST1_OSTIMER0_SHIFT (0U) +/*! OSTIMER0 - OSTIMER0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_OSTIMER0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_OSTIMER0_SHIFT)) & MRCC_MRCC_GLB_RST1_OSTIMER0_MASK) + +#define MRCC_MRCC_GLB_RST1_ADC0_MASK (0x2U) +#define MRCC_MRCC_GLB_RST1_ADC0_SHIFT (1U) +/*! ADC0 - ADC0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_ADC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_ADC0_SHIFT)) & MRCC_MRCC_GLB_RST1_ADC0_MASK) + +#define MRCC_MRCC_GLB_RST1_ADC1_MASK (0x4U) +#define MRCC_MRCC_GLB_RST1_ADC1_SHIFT (2U) +/*! ADC1 - ADC1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_ADC1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_ADC1_SHIFT)) & MRCC_MRCC_GLB_RST1_ADC1_MASK) + +#define MRCC_MRCC_GLB_RST1_CMP1_MASK (0x10U) +#define MRCC_MRCC_GLB_RST1_CMP1_SHIFT (4U) +/*! CMP1 - CMP1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_CMP1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_CMP1_SHIFT)) & MRCC_MRCC_GLB_RST1_CMP1_MASK) + +#define MRCC_MRCC_GLB_RST1_DAC0_MASK (0x20U) +#define MRCC_MRCC_GLB_RST1_DAC0_SHIFT (5U) +/*! DAC0 - DAC0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_DAC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_DAC0_SHIFT)) & MRCC_MRCC_GLB_RST1_DAC0_MASK) + +#define MRCC_MRCC_GLB_RST1_OPAMP0_MASK (0x40U) +#define MRCC_MRCC_GLB_RST1_OPAMP0_SHIFT (6U) +/*! OPAMP0 - OPAMP0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_OPAMP0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_OPAMP0_SHIFT)) & MRCC_MRCC_GLB_RST1_OPAMP0_MASK) + +#define MRCC_MRCC_GLB_RST1_PORT0_MASK (0x80U) +#define MRCC_MRCC_GLB_RST1_PORT0_SHIFT (7U) +/*! PORT0 - PORT0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_PORT0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_PORT0_SHIFT)) & MRCC_MRCC_GLB_RST1_PORT0_MASK) + +#define MRCC_MRCC_GLB_RST1_PORT1_MASK (0x100U) +#define MRCC_MRCC_GLB_RST1_PORT1_SHIFT (8U) +/*! PORT1 - PORT1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_PORT1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_PORT1_SHIFT)) & MRCC_MRCC_GLB_RST1_PORT1_MASK) + +#define MRCC_MRCC_GLB_RST1_PORT2_MASK (0x200U) +#define MRCC_MRCC_GLB_RST1_PORT2_SHIFT (9U) +/*! PORT2 - PORT2 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_PORT2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_PORT2_SHIFT)) & MRCC_MRCC_GLB_RST1_PORT2_MASK) + +#define MRCC_MRCC_GLB_RST1_PORT3_MASK (0x400U) +#define MRCC_MRCC_GLB_RST1_PORT3_SHIFT (10U) +/*! PORT3 - PORT3 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_PORT3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_PORT3_SHIFT)) & MRCC_MRCC_GLB_RST1_PORT3_MASK) + +#define MRCC_MRCC_GLB_RST1_PORT4_MASK (0x800U) +#define MRCC_MRCC_GLB_RST1_PORT4_SHIFT (11U) +/*! PORT4 - PORT4 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_PORT4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_PORT4_SHIFT)) & MRCC_MRCC_GLB_RST1_PORT4_MASK) + +#define MRCC_MRCC_GLB_RST1_FLEXCAN0_MASK (0x1000U) +#define MRCC_MRCC_GLB_RST1_FLEXCAN0_SHIFT (12U) +/*! FLEXCAN0 - FLEXCAN0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_FLEXCAN0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_FLEXCAN0_SHIFT)) & MRCC_MRCC_GLB_RST1_FLEXCAN0_MASK) + +#define MRCC_MRCC_GLB_RST1_LPI2C2_MASK (0x2000U) +#define MRCC_MRCC_GLB_RST1_LPI2C2_SHIFT (13U) +/*! LPI2C2 - LPI2C2 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_LPI2C2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_LPI2C2_SHIFT)) & MRCC_MRCC_GLB_RST1_LPI2C2_MASK) + +#define MRCC_MRCC_GLB_RST1_LPI2C3_MASK (0x4000U) +#define MRCC_MRCC_GLB_RST1_LPI2C3_SHIFT (14U) +/*! LPI2C3 - LPI2C3 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_LPI2C3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_LPI2C3_SHIFT)) & MRCC_MRCC_GLB_RST1_LPI2C3_MASK) + +#define MRCC_MRCC_GLB_RST1_GPIO0_MASK (0x100000U) +#define MRCC_MRCC_GLB_RST1_GPIO0_SHIFT (20U) +/*! GPIO0 - GPIO0 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_GPIO0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_GPIO0_SHIFT)) & MRCC_MRCC_GLB_RST1_GPIO0_MASK) + +#define MRCC_MRCC_GLB_RST1_GPIO1_MASK (0x200000U) +#define MRCC_MRCC_GLB_RST1_GPIO1_SHIFT (21U) +/*! GPIO1 - GPIO1 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_GPIO1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_GPIO1_SHIFT)) & MRCC_MRCC_GLB_RST1_GPIO1_MASK) + +#define MRCC_MRCC_GLB_RST1_GPIO2_MASK (0x400000U) +#define MRCC_MRCC_GLB_RST1_GPIO2_SHIFT (22U) +/*! GPIO2 - GPIO2 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_GPIO2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_GPIO2_SHIFT)) & MRCC_MRCC_GLB_RST1_GPIO2_MASK) + +#define MRCC_MRCC_GLB_RST1_GPIO3_MASK (0x800000U) +#define MRCC_MRCC_GLB_RST1_GPIO3_SHIFT (23U) +/*! GPIO3 - GPIO3 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_GPIO3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_GPIO3_SHIFT)) & MRCC_MRCC_GLB_RST1_GPIO3_MASK) + +#define MRCC_MRCC_GLB_RST1_GPIO4_MASK (0x1000000U) +#define MRCC_MRCC_GLB_RST1_GPIO4_SHIFT (24U) +/*! GPIO4 - GPIO4 + * 0b0..Peripheral is held in reset + * 0b1..Peripheral is released from reset + */ +#define MRCC_MRCC_GLB_RST1_GPIO4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_GPIO4_SHIFT)) & MRCC_MRCC_GLB_RST1_GPIO4_MASK) +/*! @} */ + +/*! @name MRCC_GLB_RST1_SET - Peripheral Reset Control Set 1 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_RST1_SET_DATA_MASK (0xFFFFFFFFU) +#define MRCC_MRCC_GLB_RST1_SET_DATA_SHIFT (0U) +/*! DATA - Data array value, refer to corresponding position in MRCC_GLB_RSTn. */ +#define MRCC_MRCC_GLB_RST1_SET_DATA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_SET_DATA_SHIFT)) & MRCC_MRCC_GLB_RST1_SET_DATA_MASK) +/*! @} */ + +/*! @name MRCC_GLB_RST1_CLR - Peripheral Reset Control Clear 1 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_RST1_CLR_DATA_MASK (0xFFFFFFFFU) +#define MRCC_MRCC_GLB_RST1_CLR_DATA_SHIFT (0U) +/*! DATA - Data array value, refer to corresponding position in MRCC_GLB_RSTn. */ +#define MRCC_MRCC_GLB_RST1_CLR_DATA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_RST1_CLR_DATA_SHIFT)) & MRCC_MRCC_GLB_RST1_CLR_DATA_MASK) +/*! @} */ + +/*! @name MRCC_GLB_CC0 - AHB Clock Control 0 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_CC0_INPUTMUX0_MASK (0x1U) +#define MRCC_MRCC_GLB_CC0_INPUTMUX0_SHIFT (0U) +/*! INPUTMUX0 - INPUTMUX0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_INPUTMUX0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_INPUTMUX0_SHIFT)) & MRCC_MRCC_GLB_CC0_INPUTMUX0_MASK) + +#define MRCC_MRCC_GLB_CC0_I3C0_MASK (0x2U) +#define MRCC_MRCC_GLB_CC0_I3C0_SHIFT (1U) +/*! I3C0 - I3C0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_I3C0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_I3C0_SHIFT)) & MRCC_MRCC_GLB_CC0_I3C0_MASK) + +#define MRCC_MRCC_GLB_CC0_CTIMER0_MASK (0x4U) +#define MRCC_MRCC_GLB_CC0_CTIMER0_SHIFT (2U) +/*! CTIMER0 - CTIMER0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_CTIMER0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_CTIMER0_SHIFT)) & MRCC_MRCC_GLB_CC0_CTIMER0_MASK) + +#define MRCC_MRCC_GLB_CC0_CTIMER1_MASK (0x8U) +#define MRCC_MRCC_GLB_CC0_CTIMER1_SHIFT (3U) +/*! CTIMER1 - CTIMER1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_CTIMER1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_CTIMER1_SHIFT)) & MRCC_MRCC_GLB_CC0_CTIMER1_MASK) + +#define MRCC_MRCC_GLB_CC0_CTIMER2_MASK (0x10U) +#define MRCC_MRCC_GLB_CC0_CTIMER2_SHIFT (4U) +/*! CTIMER2 - CTIMER2 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_CTIMER2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_CTIMER2_SHIFT)) & MRCC_MRCC_GLB_CC0_CTIMER2_MASK) + +#define MRCC_MRCC_GLB_CC0_CTIMER3_MASK (0x20U) +#define MRCC_MRCC_GLB_CC0_CTIMER3_SHIFT (5U) +/*! CTIMER3 - CTIMER3 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_CTIMER3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_CTIMER3_SHIFT)) & MRCC_MRCC_GLB_CC0_CTIMER3_MASK) + +#define MRCC_MRCC_GLB_CC0_CTIMER4_MASK (0x40U) +#define MRCC_MRCC_GLB_CC0_CTIMER4_SHIFT (6U) +/*! CTIMER4 - CTIMER4 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_CTIMER4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_CTIMER4_SHIFT)) & MRCC_MRCC_GLB_CC0_CTIMER4_MASK) + +#define MRCC_MRCC_GLB_CC0_FREQME_MASK (0x80U) +#define MRCC_MRCC_GLB_CC0_FREQME_SHIFT (7U) +/*! FREQME - FREQME + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_FREQME(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_FREQME_SHIFT)) & MRCC_MRCC_GLB_CC0_FREQME_MASK) + +#define MRCC_MRCC_GLB_CC0_UTICK0_MASK (0x100U) +#define MRCC_MRCC_GLB_CC0_UTICK0_SHIFT (8U) +/*! UTICK0 - UTICK0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_UTICK0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_UTICK0_SHIFT)) & MRCC_MRCC_GLB_CC0_UTICK0_MASK) + +#define MRCC_MRCC_GLB_CC0_WWDT0_MASK (0x200U) +#define MRCC_MRCC_GLB_CC0_WWDT0_SHIFT (9U) +/*! WWDT0 - WWDT0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_WWDT0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_WWDT0_SHIFT)) & MRCC_MRCC_GLB_CC0_WWDT0_MASK) + +#define MRCC_MRCC_GLB_CC0_DMA_MASK (0x400U) +#define MRCC_MRCC_GLB_CC0_DMA_SHIFT (10U) +/*! DMA - DMA + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_DMA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_DMA_SHIFT)) & MRCC_MRCC_GLB_CC0_DMA_MASK) + +#define MRCC_MRCC_GLB_CC0_AOI0_MASK (0x800U) +#define MRCC_MRCC_GLB_CC0_AOI0_SHIFT (11U) +/*! AOI0 - AOI0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_AOI0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_AOI0_SHIFT)) & MRCC_MRCC_GLB_CC0_AOI0_MASK) + +#define MRCC_MRCC_GLB_CC0_CRC0_MASK (0x1000U) +#define MRCC_MRCC_GLB_CC0_CRC0_SHIFT (12U) +/*! CRC0 - CRC0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_CRC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_CRC0_SHIFT)) & MRCC_MRCC_GLB_CC0_CRC0_MASK) + +#define MRCC_MRCC_GLB_CC0_EIM0_MASK (0x2000U) +#define MRCC_MRCC_GLB_CC0_EIM0_SHIFT (13U) +/*! EIM0 - EIM0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_EIM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_EIM0_SHIFT)) & MRCC_MRCC_GLB_CC0_EIM0_MASK) + +#define MRCC_MRCC_GLB_CC0_ERM0_MASK (0x4000U) +#define MRCC_MRCC_GLB_CC0_ERM0_SHIFT (14U) +/*! ERM0 - ERM0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_ERM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_ERM0_SHIFT)) & MRCC_MRCC_GLB_CC0_ERM0_MASK) + +#define MRCC_MRCC_GLB_CC0_FMC_MASK (0x8000U) +#define MRCC_MRCC_GLB_CC0_FMC_SHIFT (15U) +/*! FMC - FMC + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_FMC(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_FMC_SHIFT)) & MRCC_MRCC_GLB_CC0_FMC_MASK) + +#define MRCC_MRCC_GLB_CC0_AOI1_MASK (0x10000U) +#define MRCC_MRCC_GLB_CC0_AOI1_SHIFT (16U) +/*! AOI1 - AOI1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_AOI1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_AOI1_SHIFT)) & MRCC_MRCC_GLB_CC0_AOI1_MASK) + +#define MRCC_MRCC_GLB_CC0_FLEXIO0_MASK (0x20000U) +#define MRCC_MRCC_GLB_CC0_FLEXIO0_SHIFT (17U) +/*! FLEXIO0 - FLEXIO0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_FLEXIO0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_FLEXIO0_SHIFT)) & MRCC_MRCC_GLB_CC0_FLEXIO0_MASK) + +#define MRCC_MRCC_GLB_CC0_LPI2C0_MASK (0x40000U) +#define MRCC_MRCC_GLB_CC0_LPI2C0_SHIFT (18U) +/*! LPI2C0 - LPI2C0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPI2C0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPI2C0_SHIFT)) & MRCC_MRCC_GLB_CC0_LPI2C0_MASK) + +#define MRCC_MRCC_GLB_CC0_LPI2C1_MASK (0x80000U) +#define MRCC_MRCC_GLB_CC0_LPI2C1_SHIFT (19U) +/*! LPI2C1 - LPI2C1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPI2C1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPI2C1_SHIFT)) & MRCC_MRCC_GLB_CC0_LPI2C1_MASK) + +#define MRCC_MRCC_GLB_CC0_LPSPI0_MASK (0x100000U) +#define MRCC_MRCC_GLB_CC0_LPSPI0_SHIFT (20U) +/*! LPSPI0 - LPSPI0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPSPI0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPSPI0_SHIFT)) & MRCC_MRCC_GLB_CC0_LPSPI0_MASK) + +#define MRCC_MRCC_GLB_CC0_LPSPI1_MASK (0x200000U) +#define MRCC_MRCC_GLB_CC0_LPSPI1_SHIFT (21U) +/*! LPSPI1 - LPSPI1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPSPI1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPSPI1_SHIFT)) & MRCC_MRCC_GLB_CC0_LPSPI1_MASK) + +#define MRCC_MRCC_GLB_CC0_LPUART0_MASK (0x400000U) +#define MRCC_MRCC_GLB_CC0_LPUART0_SHIFT (22U) +/*! LPUART0 - LPUART0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPUART0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPUART0_SHIFT)) & MRCC_MRCC_GLB_CC0_LPUART0_MASK) + +#define MRCC_MRCC_GLB_CC0_LPUART1_MASK (0x800000U) +#define MRCC_MRCC_GLB_CC0_LPUART1_SHIFT (23U) +/*! LPUART1 - LPUART1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPUART1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPUART1_SHIFT)) & MRCC_MRCC_GLB_CC0_LPUART1_MASK) + +#define MRCC_MRCC_GLB_CC0_LPUART2_MASK (0x1000000U) +#define MRCC_MRCC_GLB_CC0_LPUART2_SHIFT (24U) +/*! LPUART2 - LPUART2 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPUART2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPUART2_SHIFT)) & MRCC_MRCC_GLB_CC0_LPUART2_MASK) + +#define MRCC_MRCC_GLB_CC0_LPUART3_MASK (0x2000000U) +#define MRCC_MRCC_GLB_CC0_LPUART3_SHIFT (25U) +/*! LPUART3 - LPUART3 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPUART3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPUART3_SHIFT)) & MRCC_MRCC_GLB_CC0_LPUART3_MASK) + +#define MRCC_MRCC_GLB_CC0_LPUART4_MASK (0x4000000U) +#define MRCC_MRCC_GLB_CC0_LPUART4_SHIFT (26U) +/*! LPUART4 - LPUART4 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_LPUART4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_LPUART4_SHIFT)) & MRCC_MRCC_GLB_CC0_LPUART4_MASK) + +#define MRCC_MRCC_GLB_CC0_USB0_MASK (0x8000000U) +#define MRCC_MRCC_GLB_CC0_USB0_SHIFT (27U) +/*! USB0 - USB0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_USB0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_USB0_SHIFT)) & MRCC_MRCC_GLB_CC0_USB0_MASK) + +#define MRCC_MRCC_GLB_CC0_QDC0_MASK (0x10000000U) +#define MRCC_MRCC_GLB_CC0_QDC0_SHIFT (28U) +/*! QDC0 - QDC0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_QDC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_QDC0_SHIFT)) & MRCC_MRCC_GLB_CC0_QDC0_MASK) + +#define MRCC_MRCC_GLB_CC0_QDC1_MASK (0x20000000U) +#define MRCC_MRCC_GLB_CC0_QDC1_SHIFT (29U) +/*! QDC1 - QDC1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_QDC1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_QDC1_SHIFT)) & MRCC_MRCC_GLB_CC0_QDC1_MASK) + +#define MRCC_MRCC_GLB_CC0_FLEXPWM0_MASK (0x40000000U) +#define MRCC_MRCC_GLB_CC0_FLEXPWM0_SHIFT (30U) +/*! FLEXPWM0 - FLEXPWM0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_FLEXPWM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_FLEXPWM0_SHIFT)) & MRCC_MRCC_GLB_CC0_FLEXPWM0_MASK) + +#define MRCC_MRCC_GLB_CC0_FLEXPWM1_MASK (0x80000000U) +#define MRCC_MRCC_GLB_CC0_FLEXPWM1_SHIFT (31U) +/*! FLEXPWM1 - FLEXPWM1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC0_FLEXPWM1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_FLEXPWM1_SHIFT)) & MRCC_MRCC_GLB_CC0_FLEXPWM1_MASK) +/*! @} */ + +/*! @name MRCC_GLB_CC0_SET - AHB Clock Control Set 0 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_CC0_SET_DATA_MASK (0xFFFFFFFFU) +#define MRCC_MRCC_GLB_CC0_SET_DATA_SHIFT (0U) +/*! DATA - Data array value, refer to corresponding position in MRCC_GLB_CCn. */ +#define MRCC_MRCC_GLB_CC0_SET_DATA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_SET_DATA_SHIFT)) & MRCC_MRCC_GLB_CC0_SET_DATA_MASK) +/*! @} */ + +/*! @name MRCC_GLB_CC0_CLR - AHB Clock Control Clear 0 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_CC0_CLR_DATA_MASK (0xFFFFFFFFU) +#define MRCC_MRCC_GLB_CC0_CLR_DATA_SHIFT (0U) +/*! DATA - Data array value, refer to corresponding position in MRCC_GLB_CCn. */ +#define MRCC_MRCC_GLB_CC0_CLR_DATA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC0_CLR_DATA_SHIFT)) & MRCC_MRCC_GLB_CC0_CLR_DATA_MASK) +/*! @} */ + +/*! @name MRCC_GLB_CC1 - AHB Clock Control 1 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_CC1_OSTIMER0_MASK (0x1U) +#define MRCC_MRCC_GLB_CC1_OSTIMER0_SHIFT (0U) +/*! OSTIMER0 - OSTIMER0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_OSTIMER0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_OSTIMER0_SHIFT)) & MRCC_MRCC_GLB_CC1_OSTIMER0_MASK) + +#define MRCC_MRCC_GLB_CC1_ADC0_MASK (0x2U) +#define MRCC_MRCC_GLB_CC1_ADC0_SHIFT (1U) +/*! ADC0 - ADC0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_ADC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_ADC0_SHIFT)) & MRCC_MRCC_GLB_CC1_ADC0_MASK) + +#define MRCC_MRCC_GLB_CC1_ADC1_MASK (0x4U) +#define MRCC_MRCC_GLB_CC1_ADC1_SHIFT (2U) +/*! ADC1 - ADC1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_ADC1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_ADC1_SHIFT)) & MRCC_MRCC_GLB_CC1_ADC1_MASK) + +#define MRCC_MRCC_GLB_CC1_CMP0_MASK (0x8U) +#define MRCC_MRCC_GLB_CC1_CMP0_SHIFT (3U) +/*! CMP0 - CMP0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_CMP0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_CMP0_SHIFT)) & MRCC_MRCC_GLB_CC1_CMP0_MASK) + +#define MRCC_MRCC_GLB_CC1_CMP1_MASK (0x10U) +#define MRCC_MRCC_GLB_CC1_CMP1_SHIFT (4U) +/*! CMP1 - CMP1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_CMP1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_CMP1_SHIFT)) & MRCC_MRCC_GLB_CC1_CMP1_MASK) + +#define MRCC_MRCC_GLB_CC1_DAC0_MASK (0x20U) +#define MRCC_MRCC_GLB_CC1_DAC0_SHIFT (5U) +/*! DAC0 - DAC0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_DAC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_DAC0_SHIFT)) & MRCC_MRCC_GLB_CC1_DAC0_MASK) + +#define MRCC_MRCC_GLB_CC1_OPAMP0_MASK (0x40U) +#define MRCC_MRCC_GLB_CC1_OPAMP0_SHIFT (6U) +/*! OPAMP0 - OPAMP0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_OPAMP0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_OPAMP0_SHIFT)) & MRCC_MRCC_GLB_CC1_OPAMP0_MASK) + +#define MRCC_MRCC_GLB_CC1_PORT0_MASK (0x80U) +#define MRCC_MRCC_GLB_CC1_PORT0_SHIFT (7U) +/*! PORT0 - PORT0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_PORT0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_PORT0_SHIFT)) & MRCC_MRCC_GLB_CC1_PORT0_MASK) + +#define MRCC_MRCC_GLB_CC1_PORT1_MASK (0x100U) +#define MRCC_MRCC_GLB_CC1_PORT1_SHIFT (8U) +/*! PORT1 - PORT1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_PORT1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_PORT1_SHIFT)) & MRCC_MRCC_GLB_CC1_PORT1_MASK) + +#define MRCC_MRCC_GLB_CC1_PORT2_MASK (0x200U) +#define MRCC_MRCC_GLB_CC1_PORT2_SHIFT (9U) +/*! PORT2 - PORT2 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_PORT2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_PORT2_SHIFT)) & MRCC_MRCC_GLB_CC1_PORT2_MASK) + +#define MRCC_MRCC_GLB_CC1_PORT3_MASK (0x400U) +#define MRCC_MRCC_GLB_CC1_PORT3_SHIFT (10U) +/*! PORT3 - PORT3 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_PORT3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_PORT3_SHIFT)) & MRCC_MRCC_GLB_CC1_PORT3_MASK) + +#define MRCC_MRCC_GLB_CC1_PORT4_MASK (0x800U) +#define MRCC_MRCC_GLB_CC1_PORT4_SHIFT (11U) +/*! PORT4 - PORT4 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_PORT4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_PORT4_SHIFT)) & MRCC_MRCC_GLB_CC1_PORT4_MASK) + +#define MRCC_MRCC_GLB_CC1_FLEXCAN0_MASK (0x1000U) +#define MRCC_MRCC_GLB_CC1_FLEXCAN0_SHIFT (12U) +/*! FLEXCAN0 - FLEXCAN0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_FLEXCAN0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_FLEXCAN0_SHIFT)) & MRCC_MRCC_GLB_CC1_FLEXCAN0_MASK) + +#define MRCC_MRCC_GLB_CC1_LPI2C2_MASK (0x2000U) +#define MRCC_MRCC_GLB_CC1_LPI2C2_SHIFT (13U) +/*! LPI2C2 - LPI2C2 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_LPI2C2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_LPI2C2_SHIFT)) & MRCC_MRCC_GLB_CC1_LPI2C2_MASK) + +#define MRCC_MRCC_GLB_CC1_LPI2C3_MASK (0x4000U) +#define MRCC_MRCC_GLB_CC1_LPI2C3_SHIFT (14U) +/*! LPI2C3 - LPI2C3 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_LPI2C3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_LPI2C3_SHIFT)) & MRCC_MRCC_GLB_CC1_LPI2C3_MASK) + +#define MRCC_MRCC_GLB_CC1_RAMA_MASK (0x40000U) +#define MRCC_MRCC_GLB_CC1_RAMA_SHIFT (18U) +/*! RAMA - RAMA + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_RAMA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_RAMA_SHIFT)) & MRCC_MRCC_GLB_CC1_RAMA_MASK) + +#define MRCC_MRCC_GLB_CC1_RAMB_MASK (0x80000U) +#define MRCC_MRCC_GLB_CC1_RAMB_SHIFT (19U) +/*! RAMB - RAMB + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_RAMB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_RAMB_SHIFT)) & MRCC_MRCC_GLB_CC1_RAMB_MASK) + +#define MRCC_MRCC_GLB_CC1_GPIO0_MASK (0x100000U) +#define MRCC_MRCC_GLB_CC1_GPIO0_SHIFT (20U) +/*! GPIO0 - GPIO0 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_GPIO0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_GPIO0_SHIFT)) & MRCC_MRCC_GLB_CC1_GPIO0_MASK) + +#define MRCC_MRCC_GLB_CC1_GPIO1_MASK (0x200000U) +#define MRCC_MRCC_GLB_CC1_GPIO1_SHIFT (21U) +/*! GPIO1 - GPIO1 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_GPIO1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_GPIO1_SHIFT)) & MRCC_MRCC_GLB_CC1_GPIO1_MASK) + +#define MRCC_MRCC_GLB_CC1_GPIO2_MASK (0x400000U) +#define MRCC_MRCC_GLB_CC1_GPIO2_SHIFT (22U) +/*! GPIO2 - GPIO2 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_GPIO2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_GPIO2_SHIFT)) & MRCC_MRCC_GLB_CC1_GPIO2_MASK) + +#define MRCC_MRCC_GLB_CC1_GPIO3_MASK (0x800000U) +#define MRCC_MRCC_GLB_CC1_GPIO3_SHIFT (23U) +/*! GPIO3 - GPIO3 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_GPIO3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_GPIO3_SHIFT)) & MRCC_MRCC_GLB_CC1_GPIO3_MASK) + +#define MRCC_MRCC_GLB_CC1_GPIO4_MASK (0x1000000U) +#define MRCC_MRCC_GLB_CC1_GPIO4_SHIFT (24U) +/*! GPIO4 - GPIO4 + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_GPIO4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_GPIO4_SHIFT)) & MRCC_MRCC_GLB_CC1_GPIO4_MASK) + +#define MRCC_MRCC_GLB_CC1_ROMC_MASK (0x2000000U) +#define MRCC_MRCC_GLB_CC1_ROMC_SHIFT (25U) +/*! ROMC - ROMC + * 0b0..Peripheral clock is disabled + * 0b1..Peripheral clock is enabled + */ +#define MRCC_MRCC_GLB_CC1_ROMC(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC1_ROMC_SHIFT)) & MRCC_MRCC_GLB_CC1_ROMC_MASK) +/*! @} */ + +/*! @name MRCC_GLB_CC_SET - AHB Clock Control Set 1 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_CC_SET_DATA_MASK (0xFFFFFFFFU) +#define MRCC_MRCC_GLB_CC_SET_DATA_SHIFT (0U) +/*! DATA - Data array value, refer to corresponding position in MRCC_GLB_CCn. */ +#define MRCC_MRCC_GLB_CC_SET_DATA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC_SET_DATA_SHIFT)) & MRCC_MRCC_GLB_CC_SET_DATA_MASK) +/*! @} */ + +/* The count of MRCC_MRCC_GLB_CC_SET */ +#define MRCC_MRCC_GLB_CC_SET_COUNT (1U) + +/*! @name MRCC_GLB_CC_CLR - AHB Clock Control Clear 1 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_CC_CLR_DATA_MASK (0xFFFFFFFFU) +#define MRCC_MRCC_GLB_CC_CLR_DATA_SHIFT (0U) +/*! DATA - Data array value, refer to corresponding position in MRCC_GLB_CCn. */ +#define MRCC_MRCC_GLB_CC_CLR_DATA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_CC_CLR_DATA_SHIFT)) & MRCC_MRCC_GLB_CC_CLR_DATA_MASK) +/*! @} */ + +/* The count of MRCC_MRCC_GLB_CC_CLR */ +#define MRCC_MRCC_GLB_CC_CLR_COUNT (1U) + +/*! @name MRCC_GLB_ACC0 - Control Automatic Clock Gating 0 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_ACC0_INPUTMUX0_MASK (0x1U) +#define MRCC_MRCC_GLB_ACC0_INPUTMUX0_SHIFT (0U) +/*! INPUTMUX0 - INPUTMUX0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_INPUTMUX0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_INPUTMUX0_SHIFT)) & MRCC_MRCC_GLB_ACC0_INPUTMUX0_MASK) + +#define MRCC_MRCC_GLB_ACC0_I3C0_MASK (0x2U) +#define MRCC_MRCC_GLB_ACC0_I3C0_SHIFT (1U) +/*! I3C0 - I3C0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_I3C0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_I3C0_SHIFT)) & MRCC_MRCC_GLB_ACC0_I3C0_MASK) + +#define MRCC_MRCC_GLB_ACC0_CTIMER0_MASK (0x4U) +#define MRCC_MRCC_GLB_ACC0_CTIMER0_SHIFT (2U) +/*! CTIMER0 - CTIMER0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_CTIMER0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_CTIMER0_SHIFT)) & MRCC_MRCC_GLB_ACC0_CTIMER0_MASK) + +#define MRCC_MRCC_GLB_ACC0_CTIMER1_MASK (0x8U) +#define MRCC_MRCC_GLB_ACC0_CTIMER1_SHIFT (3U) +/*! CTIMER1 - CTIMER1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_CTIMER1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_CTIMER1_SHIFT)) & MRCC_MRCC_GLB_ACC0_CTIMER1_MASK) + +#define MRCC_MRCC_GLB_ACC0_CTIMER2_MASK (0x10U) +#define MRCC_MRCC_GLB_ACC0_CTIMER2_SHIFT (4U) +/*! CTIMER2 - CTIMER2 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_CTIMER2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_CTIMER2_SHIFT)) & MRCC_MRCC_GLB_ACC0_CTIMER2_MASK) + +#define MRCC_MRCC_GLB_ACC0_CTIMER3_MASK (0x20U) +#define MRCC_MRCC_GLB_ACC0_CTIMER3_SHIFT (5U) +/*! CTIMER3 - CTIMER3 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_CTIMER3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_CTIMER3_SHIFT)) & MRCC_MRCC_GLB_ACC0_CTIMER3_MASK) + +#define MRCC_MRCC_GLB_ACC0_CTIMER4_MASK (0x40U) +#define MRCC_MRCC_GLB_ACC0_CTIMER4_SHIFT (6U) +/*! CTIMER4 - CTIMER4 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_CTIMER4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_CTIMER4_SHIFT)) & MRCC_MRCC_GLB_ACC0_CTIMER4_MASK) + +#define MRCC_MRCC_GLB_ACC0_FREQME_MASK (0x80U) +#define MRCC_MRCC_GLB_ACC0_FREQME_SHIFT (7U) +/*! FREQME - FREQME + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_FREQME(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_FREQME_SHIFT)) & MRCC_MRCC_GLB_ACC0_FREQME_MASK) + +#define MRCC_MRCC_GLB_ACC0_UTICK0_MASK (0x100U) +#define MRCC_MRCC_GLB_ACC0_UTICK0_SHIFT (8U) +/*! UTICK0 - UTICK0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_UTICK0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_UTICK0_SHIFT)) & MRCC_MRCC_GLB_ACC0_UTICK0_MASK) + +#define MRCC_MRCC_GLB_ACC0_WWDT0_MASK (0x200U) +#define MRCC_MRCC_GLB_ACC0_WWDT0_SHIFT (9U) +/*! WWDT0 - WWDT0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_WWDT0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_WWDT0_SHIFT)) & MRCC_MRCC_GLB_ACC0_WWDT0_MASK) + +#define MRCC_MRCC_GLB_ACC0_DMA_MASK (0x400U) +#define MRCC_MRCC_GLB_ACC0_DMA_SHIFT (10U) +/*! DMA - DMA + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_DMA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_DMA_SHIFT)) & MRCC_MRCC_GLB_ACC0_DMA_MASK) + +#define MRCC_MRCC_GLB_ACC0_AOI0_MASK (0x800U) +#define MRCC_MRCC_GLB_ACC0_AOI0_SHIFT (11U) +/*! AOI0 - AOI0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_AOI0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_AOI0_SHIFT)) & MRCC_MRCC_GLB_ACC0_AOI0_MASK) + +#define MRCC_MRCC_GLB_ACC0_CRC0_MASK (0x1000U) +#define MRCC_MRCC_GLB_ACC0_CRC0_SHIFT (12U) +/*! CRC0 - CRC0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_CRC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_CRC0_SHIFT)) & MRCC_MRCC_GLB_ACC0_CRC0_MASK) + +#define MRCC_MRCC_GLB_ACC0_EIM0_MASK (0x2000U) +#define MRCC_MRCC_GLB_ACC0_EIM0_SHIFT (13U) +/*! EIM0 - EIM0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_EIM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_EIM0_SHIFT)) & MRCC_MRCC_GLB_ACC0_EIM0_MASK) + +#define MRCC_MRCC_GLB_ACC0_ERM0_MASK (0x4000U) +#define MRCC_MRCC_GLB_ACC0_ERM0_SHIFT (14U) +/*! ERM0 - ERM0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_ERM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_ERM0_SHIFT)) & MRCC_MRCC_GLB_ACC0_ERM0_MASK) + +#define MRCC_MRCC_GLB_ACC0_FMC_MASK (0x8000U) +#define MRCC_MRCC_GLB_ACC0_FMC_SHIFT (15U) +/*! FMC - FMC + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_FMC(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_FMC_SHIFT)) & MRCC_MRCC_GLB_ACC0_FMC_MASK) + +#define MRCC_MRCC_GLB_ACC0_AOI1_MASK (0x10000U) +#define MRCC_MRCC_GLB_ACC0_AOI1_SHIFT (16U) +/*! AOI1 - AOI1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_AOI1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_AOI1_SHIFT)) & MRCC_MRCC_GLB_ACC0_AOI1_MASK) + +#define MRCC_MRCC_GLB_ACC0_FLEXIO0_MASK (0x20000U) +#define MRCC_MRCC_GLB_ACC0_FLEXIO0_SHIFT (17U) +/*! FLEXIO0 - FLEXIO0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_FLEXIO0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_FLEXIO0_SHIFT)) & MRCC_MRCC_GLB_ACC0_FLEXIO0_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPI2C0_MASK (0x40000U) +#define MRCC_MRCC_GLB_ACC0_LPI2C0_SHIFT (18U) +/*! LPI2C0 - LPI2C0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPI2C0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPI2C0_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPI2C0_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPI2C1_MASK (0x80000U) +#define MRCC_MRCC_GLB_ACC0_LPI2C1_SHIFT (19U) +/*! LPI2C1 - LPI2C1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPI2C1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPI2C1_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPI2C1_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPSPI0_MASK (0x100000U) +#define MRCC_MRCC_GLB_ACC0_LPSPI0_SHIFT (20U) +/*! LPSPI0 - LPSPI0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPSPI0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPSPI0_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPSPI0_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPSPI1_MASK (0x200000U) +#define MRCC_MRCC_GLB_ACC0_LPSPI1_SHIFT (21U) +/*! LPSPI1 - LPSPI1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPSPI1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPSPI1_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPSPI1_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPUART0_MASK (0x400000U) +#define MRCC_MRCC_GLB_ACC0_LPUART0_SHIFT (22U) +/*! LPUART0 - LPUART0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPUART0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPUART0_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPUART0_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPUART1_MASK (0x800000U) +#define MRCC_MRCC_GLB_ACC0_LPUART1_SHIFT (23U) +/*! LPUART1 - LPUART1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPUART1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPUART1_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPUART1_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPUART2_MASK (0x1000000U) +#define MRCC_MRCC_GLB_ACC0_LPUART2_SHIFT (24U) +/*! LPUART2 - LPUART2 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPUART2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPUART2_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPUART2_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPUART3_MASK (0x2000000U) +#define MRCC_MRCC_GLB_ACC0_LPUART3_SHIFT (25U) +/*! LPUART3 - LPUART3 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPUART3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPUART3_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPUART3_MASK) + +#define MRCC_MRCC_GLB_ACC0_LPUART4_MASK (0x4000000U) +#define MRCC_MRCC_GLB_ACC0_LPUART4_SHIFT (26U) +/*! LPUART4 - LPUART4 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_LPUART4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_LPUART4_SHIFT)) & MRCC_MRCC_GLB_ACC0_LPUART4_MASK) + +#define MRCC_MRCC_GLB_ACC0_USB0_MASK (0x8000000U) +#define MRCC_MRCC_GLB_ACC0_USB0_SHIFT (27U) +/*! USB0 - USB0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_USB0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_USB0_SHIFT)) & MRCC_MRCC_GLB_ACC0_USB0_MASK) + +#define MRCC_MRCC_GLB_ACC0_QDC0_MASK (0x10000000U) +#define MRCC_MRCC_GLB_ACC0_QDC0_SHIFT (28U) +/*! QDC0 - QDC0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_QDC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_QDC0_SHIFT)) & MRCC_MRCC_GLB_ACC0_QDC0_MASK) + +#define MRCC_MRCC_GLB_ACC0_QDC1_MASK (0x20000000U) +#define MRCC_MRCC_GLB_ACC0_QDC1_SHIFT (29U) +/*! QDC1 - QDC1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_QDC1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_QDC1_SHIFT)) & MRCC_MRCC_GLB_ACC0_QDC1_MASK) + +#define MRCC_MRCC_GLB_ACC0_FLEXPWM0_MASK (0x40000000U) +#define MRCC_MRCC_GLB_ACC0_FLEXPWM0_SHIFT (30U) +/*! FLEXPWM0 - FLEXPWM0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_FLEXPWM0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_FLEXPWM0_SHIFT)) & MRCC_MRCC_GLB_ACC0_FLEXPWM0_MASK) + +#define MRCC_MRCC_GLB_ACC0_FLEXPWM1_MASK (0x80000000U) +#define MRCC_MRCC_GLB_ACC0_FLEXPWM1_SHIFT (31U) +/*! FLEXPWM1 - FLEXPWM1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC0_FLEXPWM1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC0_FLEXPWM1_SHIFT)) & MRCC_MRCC_GLB_ACC0_FLEXPWM1_MASK) +/*! @} */ + +/*! @name MRCC_GLB_ACC1 - Control Automatic Clock Gating 1 */ +/*! @{ */ + +#define MRCC_MRCC_GLB_ACC1_OSTIMER0_MASK (0x1U) +#define MRCC_MRCC_GLB_ACC1_OSTIMER0_SHIFT (0U) +/*! OSTIMER0 - OSTIMER0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_OSTIMER0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_OSTIMER0_SHIFT)) & MRCC_MRCC_GLB_ACC1_OSTIMER0_MASK) + +#define MRCC_MRCC_GLB_ACC1_ADC0_MASK (0x2U) +#define MRCC_MRCC_GLB_ACC1_ADC0_SHIFT (1U) +/*! ADC0 - ADC0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_ADC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_ADC0_SHIFT)) & MRCC_MRCC_GLB_ACC1_ADC0_MASK) + +#define MRCC_MRCC_GLB_ACC1_ADC1_MASK (0x4U) +#define MRCC_MRCC_GLB_ACC1_ADC1_SHIFT (2U) +/*! ADC1 - ADC1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_ADC1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_ADC1_SHIFT)) & MRCC_MRCC_GLB_ACC1_ADC1_MASK) + +#define MRCC_MRCC_GLB_ACC1_CMP0_MASK (0x8U) +#define MRCC_MRCC_GLB_ACC1_CMP0_SHIFT (3U) +/*! CMP0 - CMP0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_CMP0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_CMP0_SHIFT)) & MRCC_MRCC_GLB_ACC1_CMP0_MASK) + +#define MRCC_MRCC_GLB_ACC1_CMP1_MASK (0x10U) +#define MRCC_MRCC_GLB_ACC1_CMP1_SHIFT (4U) +/*! CMP1 - CMP1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_CMP1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_CMP1_SHIFT)) & MRCC_MRCC_GLB_ACC1_CMP1_MASK) + +#define MRCC_MRCC_GLB_ACC1_DAC0_MASK (0x20U) +#define MRCC_MRCC_GLB_ACC1_DAC0_SHIFT (5U) +/*! DAC0 - DAC0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_DAC0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_DAC0_SHIFT)) & MRCC_MRCC_GLB_ACC1_DAC0_MASK) + +#define MRCC_MRCC_GLB_ACC1_OPAMP0_MASK (0x40U) +#define MRCC_MRCC_GLB_ACC1_OPAMP0_SHIFT (6U) +/*! OPAMP0 - OPAMP0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_OPAMP0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_OPAMP0_SHIFT)) & MRCC_MRCC_GLB_ACC1_OPAMP0_MASK) + +#define MRCC_MRCC_GLB_ACC1_PORT0_MASK (0x80U) +#define MRCC_MRCC_GLB_ACC1_PORT0_SHIFT (7U) +/*! PORT0 - PORT0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_PORT0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_PORT0_SHIFT)) & MRCC_MRCC_GLB_ACC1_PORT0_MASK) + +#define MRCC_MRCC_GLB_ACC1_PORT1_MASK (0x100U) +#define MRCC_MRCC_GLB_ACC1_PORT1_SHIFT (8U) +/*! PORT1 - PORT1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_PORT1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_PORT1_SHIFT)) & MRCC_MRCC_GLB_ACC1_PORT1_MASK) + +#define MRCC_MRCC_GLB_ACC1_PORT2_MASK (0x200U) +#define MRCC_MRCC_GLB_ACC1_PORT2_SHIFT (9U) +/*! PORT2 - PORT2 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_PORT2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_PORT2_SHIFT)) & MRCC_MRCC_GLB_ACC1_PORT2_MASK) + +#define MRCC_MRCC_GLB_ACC1_PORT3_MASK (0x400U) +#define MRCC_MRCC_GLB_ACC1_PORT3_SHIFT (10U) +/*! PORT3 - PORT3 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_PORT3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_PORT3_SHIFT)) & MRCC_MRCC_GLB_ACC1_PORT3_MASK) + +#define MRCC_MRCC_GLB_ACC1_PORT4_MASK (0x800U) +#define MRCC_MRCC_GLB_ACC1_PORT4_SHIFT (11U) +/*! PORT4 - PORT4 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_PORT4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_PORT4_SHIFT)) & MRCC_MRCC_GLB_ACC1_PORT4_MASK) + +#define MRCC_MRCC_GLB_ACC1_FLEXCAN0_MASK (0x1000U) +#define MRCC_MRCC_GLB_ACC1_FLEXCAN0_SHIFT (12U) +/*! FLEXCAN0 - FLEXCAN0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_FLEXCAN0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_FLEXCAN0_SHIFT)) & MRCC_MRCC_GLB_ACC1_FLEXCAN0_MASK) + +#define MRCC_MRCC_GLB_ACC1_LPI2C2_MASK (0x2000U) +#define MRCC_MRCC_GLB_ACC1_LPI2C2_SHIFT (13U) +/*! LPI2C2 - LPI2C2 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_LPI2C2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_LPI2C2_SHIFT)) & MRCC_MRCC_GLB_ACC1_LPI2C2_MASK) + +#define MRCC_MRCC_GLB_ACC1_LPI2C3_MASK (0x4000U) +#define MRCC_MRCC_GLB_ACC1_LPI2C3_SHIFT (14U) +/*! LPI2C3 - LPI2C3 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_LPI2C3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_LPI2C3_SHIFT)) & MRCC_MRCC_GLB_ACC1_LPI2C3_MASK) + +#define MRCC_MRCC_GLB_ACC1_RAMA_MASK (0x40000U) +#define MRCC_MRCC_GLB_ACC1_RAMA_SHIFT (18U) +/*! RAMA - RAMA + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_RAMA(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_RAMA_SHIFT)) & MRCC_MRCC_GLB_ACC1_RAMA_MASK) + +#define MRCC_MRCC_GLB_ACC1_RAMB_MASK (0x80000U) +#define MRCC_MRCC_GLB_ACC1_RAMB_SHIFT (19U) +/*! RAMB - RAMB + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_RAMB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_RAMB_SHIFT)) & MRCC_MRCC_GLB_ACC1_RAMB_MASK) + +#define MRCC_MRCC_GLB_ACC1_GPIO0_MASK (0x100000U) +#define MRCC_MRCC_GLB_ACC1_GPIO0_SHIFT (20U) +/*! GPIO0 - GPIO0 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_GPIO0(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_GPIO0_SHIFT)) & MRCC_MRCC_GLB_ACC1_GPIO0_MASK) + +#define MRCC_MRCC_GLB_ACC1_GPIO1_MASK (0x200000U) +#define MRCC_MRCC_GLB_ACC1_GPIO1_SHIFT (21U) +/*! GPIO1 - GPIO1 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_GPIO1(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_GPIO1_SHIFT)) & MRCC_MRCC_GLB_ACC1_GPIO1_MASK) + +#define MRCC_MRCC_GLB_ACC1_GPIO2_MASK (0x400000U) +#define MRCC_MRCC_GLB_ACC1_GPIO2_SHIFT (22U) +/*! GPIO2 - GPIO2 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_GPIO2(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_GPIO2_SHIFT)) & MRCC_MRCC_GLB_ACC1_GPIO2_MASK) + +#define MRCC_MRCC_GLB_ACC1_GPIO3_MASK (0x800000U) +#define MRCC_MRCC_GLB_ACC1_GPIO3_SHIFT (23U) +/*! GPIO3 - GPIO3 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_GPIO3(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_GPIO3_SHIFT)) & MRCC_MRCC_GLB_ACC1_GPIO3_MASK) + +#define MRCC_MRCC_GLB_ACC1_GPIO4_MASK (0x1000000U) +#define MRCC_MRCC_GLB_ACC1_GPIO4_SHIFT (24U) +/*! GPIO4 - GPIO4 + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_GPIO4(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_GPIO4_SHIFT)) & MRCC_MRCC_GLB_ACC1_GPIO4_MASK) + +#define MRCC_MRCC_GLB_ACC1_ROMC_MASK (0x2000000U) +#define MRCC_MRCC_GLB_ACC1_ROMC_SHIFT (25U) +/*! ROMC - ROMC + * 0b0..Automatic clock gating is disabled + * 0b1..Automatic clock gating is enabled + */ +#define MRCC_MRCC_GLB_ACC1_ROMC(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_GLB_ACC1_ROMC_SHIFT)) & MRCC_MRCC_GLB_ACC1_ROMC_MASK) +/*! @} */ + +/*! @name MRCC_I3C0_FCLK_CLKSEL - I3C0_FCLK clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_I3C0_FCLK_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_I3C0_FCLK_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_I3C0_FCLK_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_I3C0_FCLK_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_I3C0_FCLK_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_I3C0_FCLK_CLKDIV - I3C0_FCLK clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_I3C0_FCLK_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_I3C0_FCLK_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_I3C0_FCLK_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_I3C0_FCLK_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_I3C0_FCLK_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_I3C0_FCLK_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_I3C0_FCLK_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_I3C0_FCLK_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_I3C0_FCLK_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER0_CLKSEL - CTIMER0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_CTIMER0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b001..FRO_HF_GATED + * 0b000..FRO_12M + */ +#define MRCC_MRCC_CTIMER0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_CTIMER0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER0_CLKDIV - CTIMER0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CTIMER0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CTIMER0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CTIMER0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CTIMER0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CTIMER0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CTIMER0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CTIMER0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CTIMER0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CTIMER0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CTIMER0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CTIMER0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CTIMER0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CTIMER0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CTIMER0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CTIMER0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER1_CLKSEL - CTIMER1 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER1_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_CTIMER1_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b001..FRO_HF_GATED + * 0b000..FRO_12M + */ +#define MRCC_MRCC_CTIMER1_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER1_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_CTIMER1_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER1_CLKDIV - CTIMER1 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER1_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CTIMER1_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CTIMER1_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER1_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CTIMER1_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CTIMER1_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CTIMER1_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CTIMER1_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER1_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CTIMER1_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CTIMER1_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CTIMER1_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CTIMER1_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER1_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CTIMER1_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CTIMER1_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CTIMER1_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CTIMER1_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER1_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CTIMER1_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER2_CLKSEL - CTIMER2 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER2_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_CTIMER2_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b001..FRO_HF_GATED + * 0b000..FRO_12M + */ +#define MRCC_MRCC_CTIMER2_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER2_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_CTIMER2_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER2_CLKDIV - CTIMER2 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER2_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CTIMER2_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CTIMER2_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER2_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CTIMER2_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CTIMER2_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CTIMER2_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CTIMER2_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER2_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CTIMER2_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CTIMER2_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CTIMER2_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CTIMER2_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER2_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CTIMER2_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CTIMER2_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CTIMER2_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CTIMER2_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER2_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CTIMER2_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER3_CLKSEL - CTIMER3 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER3_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_CTIMER3_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b001..FRO_HF_GATED + * 0b000..FRO_12M + */ +#define MRCC_MRCC_CTIMER3_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER3_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_CTIMER3_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER3_CLKDIV - CTIMER3 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER3_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CTIMER3_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CTIMER3_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER3_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CTIMER3_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CTIMER3_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CTIMER3_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CTIMER3_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER3_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CTIMER3_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CTIMER3_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CTIMER3_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CTIMER3_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER3_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CTIMER3_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CTIMER3_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CTIMER3_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CTIMER3_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER3_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CTIMER3_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER4_CLKSEL - CTIMER4 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER4_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_CTIMER4_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b001..FRO_HF_GATED + * 0b000..FRO_12M + */ +#define MRCC_MRCC_CTIMER4_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER4_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_CTIMER4_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_CTIMER4_CLKDIV - CTIMER4 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CTIMER4_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CTIMER4_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CTIMER4_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER4_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CTIMER4_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CTIMER4_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CTIMER4_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CTIMER4_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER4_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CTIMER4_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CTIMER4_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CTIMER4_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CTIMER4_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER4_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CTIMER4_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CTIMER4_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CTIMER4_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CTIMER4_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CTIMER4_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CTIMER4_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_WWDT0_CLKDIV - WWDT0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_WWDT0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_WWDT0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_WWDT0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_WWDT0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_WWDT0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_WWDT0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_WWDT0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_WWDT0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_WWDT0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_WWDT0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_WWDT0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_WWDT0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_WWDT0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_WWDT0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_WWDT0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_WWDT0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_WWDT0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_WWDT0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_WWDT0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_WWDT0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_FLEXIO0_CLKSEL - FLEXIO0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_FLEXIO0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_FLEXIO0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b001..FRO_HF_GATED + * 0b000..FRO_12M + */ +#define MRCC_MRCC_FLEXIO0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXIO0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_FLEXIO0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_FLEXIO0_CLKDIV - FLEXIO0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_FLEXIO0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_FLEXIO0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_FLEXIO0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXIO0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_FLEXIO0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_FLEXIO0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_FLEXIO0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_FLEXIO0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXIO0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_FLEXIO0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_FLEXIO0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_FLEXIO0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_FLEXIO0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXIO0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_FLEXIO0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_FLEXIO0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_FLEXIO0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_FLEXIO0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXIO0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_FLEXIO0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPI2C0_CLKSEL - LPI2C0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPI2C0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPI2C0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPI2C0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPI2C0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPI2C0_CLKDIV - LPI2C0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPI2C0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPI2C0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPI2C0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPI2C0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPI2C0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPI2C0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPI2C0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPI2C0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPI2C0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPI2C0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPI2C0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPI2C0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPI2C0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPI2C0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPI2C0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPI2C0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPI2C1_CLKSEL - LPI2C1 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPI2C1_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPI2C1_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPI2C1_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C1_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPI2C1_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPI2C1_CLKDIV - LPI2C1 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPI2C1_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPI2C1_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPI2C1_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C1_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPI2C1_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPI2C1_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPI2C1_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPI2C1_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C1_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPI2C1_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPI2C1_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPI2C1_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPI2C1_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C1_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPI2C1_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPI2C1_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPI2C1_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPI2C1_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C1_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPI2C1_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPSPI0_CLKSEL - LPSPI0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPSPI0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPSPI0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPSPI0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPSPI0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPSPI0_CLKDIV - LPSPI0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPSPI0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPSPI0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPSPI0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPSPI0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPSPI0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPSPI0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPSPI0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPSPI0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPSPI0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPSPI0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPSPI0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPSPI0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPSPI0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPSPI0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPSPI0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPSPI0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPSPI1_CLKSEL - LPSPI1 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPSPI1_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPSPI1_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPSPI1_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI1_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPSPI1_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPSPI1_CLKDIV - LPSPI1 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPSPI1_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPSPI1_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPSPI1_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI1_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPSPI1_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPSPI1_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPSPI1_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPSPI1_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI1_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPSPI1_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPSPI1_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPSPI1_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPSPI1_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI1_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPSPI1_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPSPI1_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPSPI1_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPSPI1_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPSPI1_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPSPI1_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPUART0_CLKSEL - LPUART0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPUART0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPUART0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPUART0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPUART0_CLKDIV - LPUART0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPUART0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPUART0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPUART0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPUART0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPUART0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPUART0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPUART0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPUART0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPUART0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPUART0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPUART0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPUART0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPUART0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPUART0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPUART0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPUART1_CLKSEL - LPUART1 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART1_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPUART1_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPUART1_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART1_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPUART1_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPUART1_CLKDIV - LPUART1 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART1_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPUART1_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPUART1_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART1_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPUART1_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPUART1_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPUART1_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPUART1_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART1_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPUART1_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPUART1_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPUART1_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPUART1_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART1_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPUART1_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPUART1_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPUART1_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPUART1_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART1_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPUART1_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPUART2_CLKSEL - LPUART2 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART2_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPUART2_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPUART2_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART2_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPUART2_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPUART2_CLKDIV - LPUART2 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART2_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPUART2_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPUART2_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART2_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPUART2_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPUART2_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPUART2_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPUART2_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART2_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPUART2_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPUART2_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPUART2_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPUART2_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART2_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPUART2_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPUART2_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPUART2_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPUART2_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART2_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPUART2_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPUART3_CLKSEL - LPUART3 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART3_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPUART3_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPUART3_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART3_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPUART3_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPUART3_CLKDIV - LPUART3 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART3_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPUART3_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPUART3_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART3_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPUART3_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPUART3_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPUART3_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPUART3_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART3_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPUART3_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPUART3_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPUART3_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPUART3_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART3_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPUART3_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPUART3_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPUART3_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPUART3_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART3_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPUART3_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPUART4_CLKSEL - LPUART4 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART4_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPUART4_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b100..CLK_16K + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPUART4_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART4_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPUART4_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPUART4_CLKDIV - LPUART4 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPUART4_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPUART4_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPUART4_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART4_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPUART4_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPUART4_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPUART4_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPUART4_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART4_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPUART4_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPUART4_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPUART4_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPUART4_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART4_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPUART4_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPUART4_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPUART4_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPUART4_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPUART4_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPUART4_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_USB0_CLKSEL - USB0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_USB0_CLKSEL_MUX_MASK (0x3U) +#define MRCC_MRCC_USB0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b11..Reserved(NO Clock) + * 0b10..CLK_IN + * 0b01..CLK_48M + */ +#define MRCC_MRCC_USB0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_USB0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_USB0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPTMR0_CLKSEL - LPTMR0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPTMR0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPTMR0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPTMR0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPTMR0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPTMR0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPTMR0_CLKDIV - LPTMR0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPTMR0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPTMR0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPTMR0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPTMR0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPTMR0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPTMR0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPTMR0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPTMR0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPTMR0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPTMR0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPTMR0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPTMR0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPTMR0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPTMR0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPTMR0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPTMR0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPTMR0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPTMR0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPTMR0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPTMR0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_OSTIMER0_CLKSEL - OSTIMER0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_OSTIMER0_CLKSEL_MUX_MASK (0x3U) +#define MRCC_MRCC_OSTIMER0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b11..Reserved2(NO Clock) + * 0b10..CLK_1M + * 0b00..CLK_16K + */ +#define MRCC_MRCC_OSTIMER0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_OSTIMER0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_OSTIMER0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_ADC0_CLKSEL - ADC0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_ADC0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_ADC0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b001..FRO_HF_GATED + * 0b000..FRO_12M + */ +#define MRCC_MRCC_ADC0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_ADC0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_ADC0_CLKDIV - ADC0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_ADC0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_ADC0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_ADC0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_ADC0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_ADC0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_ADC0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_ADC0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_ADC0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_ADC0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_ADC0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_ADC0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_ADC0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_ADC0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_ADC0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_ADC0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_ADC0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_ADC1_CLKSEL - ADC1 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_ADC1_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_ADC1_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b001..FRO_HF_GATED + * 0b000..FRO_12M + */ +#define MRCC_MRCC_ADC1_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC1_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_ADC1_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_ADC1_CLKDIV - ADC1 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_ADC1_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_ADC1_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_ADC1_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC1_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_ADC1_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_ADC1_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_ADC1_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_ADC1_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC1_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_ADC1_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_ADC1_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_ADC1_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_ADC1_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC1_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_ADC1_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_ADC1_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_ADC1_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_ADC1_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_ADC1_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_ADC1_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CMP0_FUNC_CLKDIV - CMP0_FUNC clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_FUNC_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CMP0_FUNC_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_FUNC_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CMP0_FUNC_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_FUNC_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CMP0_FUNC_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CMP0_FUNC_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_FUNC_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CMP0_FUNC_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CMP0_RR_CLKSEL - CMP0_RR clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_CMP0_RR_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_CMP0_RR_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_CMP0_RR_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_RR_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_CMP0_RR_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_CMP0_RR_CLKDIV - CMP0_RR clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CMP0_RR_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CMP0_RR_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CMP0_RR_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_RR_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CMP0_RR_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CMP0_RR_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CMP0_RR_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CMP0_RR_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_RR_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CMP0_RR_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CMP0_RR_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CMP0_RR_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CMP0_RR_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_RR_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CMP0_RR_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CMP0_RR_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CMP0_RR_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CMP0_RR_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP0_RR_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CMP0_RR_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CMP1_FUNC_CLKDIV - CMP1_FUNC clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_FUNC_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CMP1_FUNC_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_FUNC_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CMP1_FUNC_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_FUNC_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CMP1_FUNC_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CMP1_FUNC_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_FUNC_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CMP1_FUNC_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CMP1_RR_CLKSEL - CMP1_RR clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_CMP1_RR_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_CMP1_RR_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_CMP1_RR_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_RR_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_CMP1_RR_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_CMP1_RR_CLKDIV - CMP1_RR clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CMP1_RR_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CMP1_RR_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CMP1_RR_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_RR_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CMP1_RR_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CMP1_RR_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CMP1_RR_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CMP1_RR_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_RR_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CMP1_RR_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CMP1_RR_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CMP1_RR_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CMP1_RR_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_RR_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CMP1_RR_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CMP1_RR_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CMP1_RR_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CMP1_RR_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CMP1_RR_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CMP1_RR_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_DAC0_CLKSEL - DAC0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_DAC0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_DAC0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_DAC0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DAC0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_DAC0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_DAC0_CLKDIV - DAC0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_DAC0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_DAC0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_DAC0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DAC0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_DAC0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_DAC0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_DAC0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_DAC0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DAC0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_DAC0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_DAC0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_DAC0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_DAC0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DAC0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_DAC0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_DAC0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_DAC0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_DAC0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DAC0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_DAC0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_FLEXCAN0_CLKSEL - FLEXCAN0 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_FLEXCAN0_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_FLEXCAN0_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + */ +#define MRCC_MRCC_FLEXCAN0_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXCAN0_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_FLEXCAN0_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_FLEXCAN0_CLKDIV - FLEXCAN0 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_FLEXCAN0_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_FLEXCAN0_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_FLEXCAN0_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXCAN0_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_FLEXCAN0_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_FLEXCAN0_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_FLEXCAN0_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_FLEXCAN0_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXCAN0_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_FLEXCAN0_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_FLEXCAN0_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_FLEXCAN0_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_FLEXCAN0_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXCAN0_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_FLEXCAN0_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_FLEXCAN0_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_FLEXCAN0_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_FLEXCAN0_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FLEXCAN0_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_FLEXCAN0_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPI2C2_CLKSEL - LPI2C2 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPI2C2_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPI2C2_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPI2C2_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C2_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPI2C2_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPI2C2_CLKDIV - LPI2C2 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPI2C2_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPI2C2_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPI2C2_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C2_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPI2C2_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPI2C2_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPI2C2_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPI2C2_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C2_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPI2C2_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPI2C2_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPI2C2_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPI2C2_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C2_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPI2C2_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPI2C2_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPI2C2_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPI2C2_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C2_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPI2C2_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_LPI2C3_CLKSEL - LPI2C3 clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_LPI2C3_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_LPI2C3_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b101..CLK_1M + * 0b011..CLK_IN + * 0b010..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_LPI2C3_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C3_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_LPI2C3_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_LPI2C3_CLKDIV - LPI2C3 clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_LPI2C3_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_LPI2C3_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_LPI2C3_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C3_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_LPI2C3_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_LPI2C3_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_LPI2C3_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_LPI2C3_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C3_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_LPI2C3_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_LPI2C3_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_LPI2C3_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_LPI2C3_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C3_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_LPI2C3_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_LPI2C3_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_LPI2C3_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_LPI2C3_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_LPI2C3_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_LPI2C3_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_DBG_TRACE_CLKSEL - DBG_TRACE clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_DBG_TRACE_CLKSEL_MUX_MASK (0x3U) +#define MRCC_MRCC_DBG_TRACE_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b11..Reserved1(NO Clock) + * 0b10..CLK_16K + * 0b01..CLK_1M + * 0b00..CPU_CLK + */ +#define MRCC_MRCC_DBG_TRACE_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DBG_TRACE_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_DBG_TRACE_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_DBG_TRACE_CLKDIV - DBG_TRACE clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_DBG_TRACE_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_DBG_TRACE_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_DBG_TRACE_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DBG_TRACE_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_DBG_TRACE_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_DBG_TRACE_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_DBG_TRACE_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_DBG_TRACE_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DBG_TRACE_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_DBG_TRACE_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_DBG_TRACE_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_DBG_TRACE_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_DBG_TRACE_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DBG_TRACE_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_DBG_TRACE_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_DBG_TRACE_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_DBG_TRACE_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_DBG_TRACE_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_DBG_TRACE_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_DBG_TRACE_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_CLKOUT_CLKSEL - CLKOUT clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_CLKOUT_CLKSEL_MUX_MASK (0x7U) +#define MRCC_MRCC_CLKOUT_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b111..Reserved(NO Clock) + * 0b110..SLOW_CLK + * 0b011..CLK_16K + * 0b010..CLK_IN + * 0b001..FRO_HF_DIV + * 0b000..FRO_12M + */ +#define MRCC_MRCC_CLKOUT_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CLKOUT_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_CLKOUT_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_CLKOUT_CLKDIV - CLKOUT clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_CLKOUT_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_CLKOUT_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_CLKOUT_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CLKOUT_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_CLKOUT_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_CLKOUT_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_CLKOUT_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_CLKOUT_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CLKOUT_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_CLKOUT_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_CLKOUT_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_CLKOUT_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_CLKOUT_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CLKOUT_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_CLKOUT_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_CLKOUT_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_CLKOUT_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_CLKOUT_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_CLKOUT_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_CLKOUT_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_SYSTICK_CLKSEL - SYSTICK clock selection control */ +/*! @{ */ + +#define MRCC_MRCC_SYSTICK_CLKSEL_MUX_MASK (0x3U) +#define MRCC_MRCC_SYSTICK_CLKSEL_MUX_SHIFT (0U) +/*! MUX - Functional Clock Mux Select + * 0b11..Reserved1(NO Clock) + * 0b10..CLK_16K + * 0b01..CLK_1M + * 0b00..CPU_CLK + */ +#define MRCC_MRCC_SYSTICK_CLKSEL_MUX(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_SYSTICK_CLKSEL_MUX_SHIFT)) & MRCC_MRCC_SYSTICK_CLKSEL_MUX_MASK) +/*! @} */ + +/*! @name MRCC_SYSTICK_CLKDIV - SYSTICK clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_SYSTICK_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_SYSTICK_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_SYSTICK_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_SYSTICK_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_SYSTICK_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_SYSTICK_CLKDIV_RESET_MASK (0x20000000U) +#define MRCC_MRCC_SYSTICK_CLKDIV_RESET_SHIFT (29U) +/*! RESET - Reset divider counter + * 0b0..Divider isn't reset + * 0b1..Divider is reset + */ +#define MRCC_MRCC_SYSTICK_CLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_SYSTICK_CLKDIV_RESET_SHIFT)) & MRCC_MRCC_SYSTICK_CLKDIV_RESET_MASK) + +#define MRCC_MRCC_SYSTICK_CLKDIV_HALT_MASK (0x40000000U) +#define MRCC_MRCC_SYSTICK_CLKDIV_HALT_SHIFT (30U) +/*! HALT - Halt divider counter + * 0b0..Divider clock is running + * 0b1..Divider clock is stopped + */ +#define MRCC_MRCC_SYSTICK_CLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_SYSTICK_CLKDIV_HALT_SHIFT)) & MRCC_MRCC_SYSTICK_CLKDIV_HALT_MASK) + +#define MRCC_MRCC_SYSTICK_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_SYSTICK_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_SYSTICK_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_SYSTICK_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_SYSTICK_CLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name MRCC_FRO_HF_DIV_CLKDIV - FRO_HF_DIV clock divider control */ +/*! @{ */ + +#define MRCC_MRCC_FRO_HF_DIV_CLKDIV_DIV_MASK (0xFU) +#define MRCC_MRCC_FRO_HF_DIV_CLKDIV_DIV_SHIFT (0U) +/*! DIV - Functional Clock Divider */ +#define MRCC_MRCC_FRO_HF_DIV_CLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FRO_HF_DIV_CLKDIV_DIV_SHIFT)) & MRCC_MRCC_FRO_HF_DIV_CLKDIV_DIV_MASK) + +#define MRCC_MRCC_FRO_HF_DIV_CLKDIV_UNSTAB_MASK (0x80000000U) +#define MRCC_MRCC_FRO_HF_DIV_CLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b0..Divider clock is stable + * 0b1..Clock frequency isn't stable + */ +#define MRCC_MRCC_FRO_HF_DIV_CLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << MRCC_MRCC_FRO_HF_DIV_CLKDIV_UNSTAB_SHIFT)) & MRCC_MRCC_FRO_HF_DIV_CLKDIV_UNSTAB_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group MRCC_Register_Masks */ + + +/* MRCC - Peripheral instance base addresses */ +/** Peripheral MRCC0 base address */ +#define MRCC0_BASE (0x40091000u) +/** Peripheral MRCC0 base pointer */ +#define MRCC0 ((MRCC_Type *)MRCC0_BASE) +/** Array initializer of MRCC peripheral base addresses */ +#define MRCC_BASE_ADDRS { MRCC0_BASE } +/** Array initializer of MRCC peripheral base pointers */ +#define MRCC_BASE_PTRS { MRCC0 } + +/*! + * @} + */ /* end of group MRCC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- OPAMP Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OPAMP_Peripheral_Access_Layer OPAMP Peripheral Access Layer + * @{ + */ + +/** OPAMP - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + __IO uint32_t OPAMP_CTR; /**< OPAMP Control, offset: 0x8 */ +} OPAMP_Type; + +/* ---------------------------------------------------------------------------- + -- OPAMP Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OPAMP_Register_Masks OPAMP Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define OPAMP_VERID_FEATURE_MASK (0xFFFFU) +#define OPAMP_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number */ +#define OPAMP_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_VERID_FEATURE_SHIFT)) & OPAMP_VERID_FEATURE_MASK) + +#define OPAMP_VERID_MINOR_MASK (0xFF0000U) +#define OPAMP_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define OPAMP_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_VERID_MINOR_SHIFT)) & OPAMP_VERID_MINOR_MASK) + +#define OPAMP_VERID_MAJOR_MASK (0xFF000000U) +#define OPAMP_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define OPAMP_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_VERID_MAJOR_SHIFT)) & OPAMP_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define OPAMP_PARAM_PGA_FUNCTION_MASK (0x1U) +#define OPAMP_PARAM_PGA_FUNCTION_SHIFT (0U) +/*! PGA_FUNCTION - PGA Function Option + * 0b0..Core amplifier enabled + * 0b1..PGA function enabled + */ +#define OPAMP_PARAM_PGA_FUNCTION(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_PARAM_PGA_FUNCTION_SHIFT)) & OPAMP_PARAM_PGA_FUNCTION_MASK) +/*! @} */ + +/*! @name OPAMP_CTR - OPAMP Control */ +/*! @{ */ + +#define OPAMP_OPAMP_CTR_EN_MASK (0x1U) +#define OPAMP_OPAMP_CTR_EN_SHIFT (0U) +/*! EN - OPAMP Enable + * 0b0..Disable + * 0b1..Enable + */ +#define OPAMP_OPAMP_CTR_EN(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_EN_SHIFT)) & OPAMP_OPAMP_CTR_EN_MASK) + +#define OPAMP_OPAMP_CTR_MODE_MASK (0x2U) +#define OPAMP_OPAMP_CTR_MODE_SHIFT (1U) +/*! MODE - Mode Selection + * 0b0..High performance mode + * 0b1..Low power mode + */ +#define OPAMP_OPAMP_CTR_MODE(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_MODE_SHIFT)) & OPAMP_OPAMP_CTR_MODE_MASK) + +#define OPAMP_OPAMP_CTR_BIASC_MASK (0xCU) +#define OPAMP_OPAMP_CTR_BIASC_SHIFT (2U) +/*! BIASC - Bias Current Trim Selection + * 0b00..Default + * 0b01..Increase current + * 0b10..Decrease current + * 0b11..Further decrease current + */ +#define OPAMP_OPAMP_CTR_BIASC(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_BIASC_SHIFT)) & OPAMP_OPAMP_CTR_BIASC_MASK) + +#define OPAMP_OPAMP_CTR_INTREF_MASK (0x30U) +#define OPAMP_OPAMP_CTR_INTREF_SHIFT (4U) +/*! INTREF - Provide OPAMP rail to rail voltage selection + * 0b00..Select OPAMP input rail to rail voltage from 0 to VDD_ANA + * 0b01..Select OPAMP input rail to rail voltage from 0 to VDD_ANA-0.8V + * 0b10..Select OPAMP input rail to rail voltage from 0.8V to VDD_ANA + * 0b11..Not allowed + */ +#define OPAMP_OPAMP_CTR_INTREF(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_INTREF_SHIFT)) & OPAMP_OPAMP_CTR_INTREF_MASK) + +#define OPAMP_OPAMP_CTR_TRIGMD_MASK (0x100U) +#define OPAMP_OPAMP_CTR_TRIGMD_SHIFT (8U) +/*! TRIGMD - Trigger Mode + * 0b0..Disable + * 0b1..Enable + */ +#define OPAMP_OPAMP_CTR_TRIGMD(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_TRIGMD_SHIFT)) & OPAMP_OPAMP_CTR_TRIGMD_MASK) + +#define OPAMP_OPAMP_CTR_INPSEL_MASK (0x200U) +#define OPAMP_OPAMP_CTR_INPSEL_SHIFT (9U) +/*! INPSEL - Positive Input Channel Selection + * 0b0..When OPAMP is not in trigger mode, select positive input 0 (INP0) + * 0b1..When OPAMP is not in trigger mode, select positive input 1 (INP1) + */ +#define OPAMP_OPAMP_CTR_INPSEL(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_INPSEL_SHIFT)) & OPAMP_OPAMP_CTR_INPSEL_MASK) + +#define OPAMP_OPAMP_CTR_INPF_MASK (0x1000U) +#define OPAMP_OPAMP_CTR_INPF_SHIFT (12U) +/*! INPF - Positive Input Connection Status + * 0b0..Positive input 0 (INP0) + * 0b1..Positive input 1 (INP1) + */ +#define OPAMP_OPAMP_CTR_INPF(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_INPF_SHIFT)) & OPAMP_OPAMP_CTR_INPF_MASK) + +#define OPAMP_OPAMP_CTR_BUFEN_MASK (0x10000U) +#define OPAMP_OPAMP_CTR_BUFEN_SHIFT (16U) +/*! BUFEN - Reference Buffer + * 0b0..Disables + * 0b1..Enables + */ +#define OPAMP_OPAMP_CTR_BUFEN(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_BUFEN_SHIFT)) & OPAMP_OPAMP_CTR_BUFEN_MASK) + +#define OPAMP_OPAMP_CTR_PREF_MASK (0x60000U) +#define OPAMP_OPAMP_CTR_PREF_SHIFT (17U) +/*! PREF - Positive Reference Voltage Selection + * 0b00..Input 0 + * 0b01..Input 1 + * 0b10..Input 2 + * 0b11..Input 3 + */ +#define OPAMP_OPAMP_CTR_PREF(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_PREF_SHIFT)) & OPAMP_OPAMP_CTR_PREF_MASK) + +#define OPAMP_OPAMP_CTR_ADCSW1_MASK (0x100000U) +#define OPAMP_OPAMP_CTR_ADCSW1_SHIFT (20U) +/*! ADCSW1 - Measure Switch 1 + * 0b0..Measure negative gain resistor ladder voltage switch off + * 0b1..Measure negative gain resistor ladder voltage switch on + */ +#define OPAMP_OPAMP_CTR_ADCSW1(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_ADCSW1_SHIFT)) & OPAMP_OPAMP_CTR_ADCSW1_MASK) + +#define OPAMP_OPAMP_CTR_ADCSW2_MASK (0x200000U) +#define OPAMP_OPAMP_CTR_ADCSW2_SHIFT (21U) +/*! ADCSW2 - Measure Switch 2 + * 0b0..Measure positive gain resistor ladder reference voltage switch off + * 0b1..Measure positive gain resistor ladder reference voltage switch on + */ +#define OPAMP_OPAMP_CTR_ADCSW2(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_ADCSW2_SHIFT)) & OPAMP_OPAMP_CTR_ADCSW2_MASK) + +#define OPAMP_OPAMP_CTR_OUTSW_MASK (0x400000U) +#define OPAMP_OPAMP_CTR_OUTSW_SHIFT (22U) +/*! OUTSW - Output Switch + * 0b0..OPAMP out to negative gain resistor ladder switch off + * 0b1..OPAMP out to negative gain resistor ladder switch on + */ +#define OPAMP_OPAMP_CTR_OUTSW(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_OUTSW_SHIFT)) & OPAMP_OPAMP_CTR_OUTSW_MASK) + +#define OPAMP_OPAMP_CTR_PGAIN_MASK (0x7000000U) +#define OPAMP_OPAMP_CTR_PGAIN_SHIFT (24U) +/*! PGAIN - Positive PGA Selection + * 0b000..Positive input 1 (INP1) + * 0b001..Pgain=1 + * 0b010..Pgain=2 + * 0b011..Pgain=4 + * 0b100..Pgain=8 + * 0b101..Pgain=16 + * 0b110..Pgain=33 + * 0b111..Pgain=64 + */ +#define OPAMP_OPAMP_CTR_PGAIN(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_PGAIN_SHIFT)) & OPAMP_OPAMP_CTR_PGAIN_MASK) + +#define OPAMP_OPAMP_CTR_NGAIN_MASK (0x70000000U) +#define OPAMP_OPAMP_CTR_NGAIN_SHIFT (28U) +/*! NGAIN - Negative PGA Selection + * 0b000..Buffer + * 0b001..Ngain=1 + * 0b010..Ngain=2 + * 0b011..Ngain=4 + * 0b100..Ngain=8 + * 0b101..Ngain=16 + * 0b110..Ngain=33 + * 0b111..Ngain=64 + */ +#define OPAMP_OPAMP_CTR_NGAIN(x) (((uint32_t)(((uint32_t)(x)) << OPAMP_OPAMP_CTR_NGAIN_SHIFT)) & OPAMP_OPAMP_CTR_NGAIN_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group OPAMP_Register_Masks */ + + +/* OPAMP - Peripheral instance base addresses */ +/** Peripheral OPAMP0 base address */ +#define OPAMP0_BASE (0x400B7000u) +/** Peripheral OPAMP0 base pointer */ +#define OPAMP0 ((OPAMP_Type *)OPAMP0_BASE) +/** Array initializer of OPAMP peripheral base addresses */ +#define OPAMP_BASE_ADDRS { OPAMP0_BASE } +/** Array initializer of OPAMP peripheral base pointers */ +#define OPAMP_BASE_PTRS { OPAMP0 } + +/*! + * @} + */ /* end of group OPAMP_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- OSTIMER Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OSTIMER_Peripheral_Access_Layer OSTIMER Peripheral Access Layer + * @{ + */ + +/** OSTIMER - Register Layout Typedef */ +typedef struct { + __I uint32_t EVTIMERL; /**< EVTIMER Low, offset: 0x0 */ + __I uint32_t EVTIMERH; /**< EVTIMER High, offset: 0x4 */ + __I uint32_t CAPTURE_L; /**< Local Capture Low for CPU, offset: 0x8 */ + __I uint32_t CAPTURE_H; /**< Local Capture High for CPU, offset: 0xC */ + __IO uint32_t MATCH_L; /**< Local Match Low for CPU, offset: 0x10 */ + __IO uint32_t MATCH_H; /**< Local Match High for CPU, offset: 0x14 */ + uint8_t RESERVED_0[4]; + __IO uint32_t OSEVENT_CTRL; /**< OSTIMER Control for CPU, offset: 0x1C */ +} OSTIMER_Type; + +/* ---------------------------------------------------------------------------- + -- OSTIMER Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup OSTIMER_Register_Masks OSTIMER Register Masks + * @{ + */ + +/*! @name EVTIMERL - EVTIMER Low */ +/*! @{ */ + +#define OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE_MASK (0xFFFFFFFFU) +#define OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE_SHIFT (0U) +/*! EVTIMER_COUNT_VALUE - EVTimer Count Value */ +#define OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE_SHIFT)) & OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE_MASK) +/*! @} */ + +/*! @name EVTIMERH - EVTIMER High */ +/*! @{ */ + +#define OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE_MASK (0x3FFU) +#define OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE_SHIFT (0U) +/*! EVTIMER_COUNT_VALUE - EVTimer Count Value */ +#define OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE_SHIFT)) & OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE_MASK) +/*! @} */ + +/*! @name CAPTURE_L - Local Capture Low for CPU */ +/*! @{ */ + +#define OSTIMER_CAPTURE_L_CAPTURE_VALUE_MASK (0xFFFFFFFFU) +#define OSTIMER_CAPTURE_L_CAPTURE_VALUE_SHIFT (0U) +/*! CAPTURE_VALUE - EVTimer Capture Value */ +#define OSTIMER_CAPTURE_L_CAPTURE_VALUE(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_CAPTURE_L_CAPTURE_VALUE_SHIFT)) & OSTIMER_CAPTURE_L_CAPTURE_VALUE_MASK) +/*! @} */ + +/*! @name CAPTURE_H - Local Capture High for CPU */ +/*! @{ */ + +#define OSTIMER_CAPTURE_H_CAPTURE_VALUE_MASK (0x3FFU) +#define OSTIMER_CAPTURE_H_CAPTURE_VALUE_SHIFT (0U) +/*! CAPTURE_VALUE - EVTimer Capture Value */ +#define OSTIMER_CAPTURE_H_CAPTURE_VALUE(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_CAPTURE_H_CAPTURE_VALUE_SHIFT)) & OSTIMER_CAPTURE_H_CAPTURE_VALUE_MASK) +/*! @} */ + +/*! @name MATCH_L - Local Match Low for CPU */ +/*! @{ */ + +#define OSTIMER_MATCH_L_MATCH_VALUE_MASK (0xFFFFFFFFU) +#define OSTIMER_MATCH_L_MATCH_VALUE_SHIFT (0U) +/*! MATCH_VALUE - EVTimer Match Value */ +#define OSTIMER_MATCH_L_MATCH_VALUE(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_MATCH_L_MATCH_VALUE_SHIFT)) & OSTIMER_MATCH_L_MATCH_VALUE_MASK) +/*! @} */ + +/*! @name MATCH_H - Local Match High for CPU */ +/*! @{ */ + +#define OSTIMER_MATCH_H_MATCH_VALUE_MASK (0x3FFU) +#define OSTIMER_MATCH_H_MATCH_VALUE_SHIFT (0U) +/*! MATCH_VALUE - EVTimer Match Value */ +#define OSTIMER_MATCH_H_MATCH_VALUE(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_MATCH_H_MATCH_VALUE_SHIFT)) & OSTIMER_MATCH_H_MATCH_VALUE_MASK) +/*! @} */ + +/*! @name OSEVENT_CTRL - OSTIMER Control for CPU */ +/*! @{ */ + +#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_MASK (0x1U) +#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_SHIFT (0U) +/*! OSTIMER_INTRFLAG - Interrupt Flag */ +#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_SHIFT)) & OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_MASK) + +#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK (0x2U) +#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_SHIFT (1U) +/*! OSTIMER_INTENA - Interrupt or Wake-Up Request + * 0b0..Interrupts blocked + * 0b1..Interrupts enabled + */ +#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_SHIFT)) & OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK) + +#define OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK (0x4U) +#define OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_SHIFT (2U) +/*! MATCH_WR_RDY - EVTimer Match Write Ready */ +#define OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_SHIFT)) & OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK) + +#define OSTIMER_OSEVENT_CTRL_DEBUG_EN_MASK (0x8U) +#define OSTIMER_OSEVENT_CTRL_DEBUG_EN_SHIFT (3U) +/*! DEBUG_EN - Debug Enable + * 0b0..Disables + * 0b1..Enables + */ +#define OSTIMER_OSEVENT_CTRL_DEBUG_EN(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_OSEVENT_CTRL_DEBUG_EN_SHIFT)) & OSTIMER_OSEVENT_CTRL_DEBUG_EN_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group OSTIMER_Register_Masks */ + + +/* OSTIMER - Peripheral instance base addresses */ +/** Peripheral OSTIMER0 base address */ +#define OSTIMER0_BASE (0x400AD000u) +/** Peripheral OSTIMER0 base pointer */ +#define OSTIMER0 ((OSTIMER_Type *)OSTIMER0_BASE) +/** Array initializer of OSTIMER peripheral base addresses */ +#define OSTIMER_BASE_ADDRS { OSTIMER0_BASE } +/** Array initializer of OSTIMER peripheral base pointers */ +#define OSTIMER_BASE_PTRS { OSTIMER0 } +/** Interrupt vectors for the OSTIMER peripheral type */ +#define OSTIMER_IRQS { OS_EVENT_IRQn } + +/*! + * @} + */ /* end of group OSTIMER_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- PORT Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup PORT_Peripheral_Access_Layer PORT Peripheral Access Layer + * @{ + */ + +/** PORT - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + uint8_t RESERVED_0[12]; + __O uint32_t GPCLR; /**< Global Pin Control Low, offset: 0x10 */ + __O uint32_t GPCHR; /**< Global Pin Control High, offset: 0x14 */ + uint8_t RESERVED_1[8]; + __IO uint32_t CONFIG; /**< Configuration, offset: 0x20 */ + uint8_t RESERVED_2[60]; + __IO uint32_t CALIB0; /**< Calibration 0, offset: 0x60, available only on: PORT0, PORT1, PORT3, PORT4 (missing on PORT2) */ + __IO uint32_t CALIB1; /**< Calibration 1, offset: 0x64, available only on: PORT0, PORT1, PORT3, PORT4 (missing on PORT2) */ + uint8_t RESERVED_3[24]; + __IO uint32_t PCR[32]; /**< Pin Control 0..Pin Control 31, array offset: 0x80, array step: 0x4 */ +} PORT_Type; + +/* ---------------------------------------------------------------------------- + -- PORT Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup PORT_Register_Masks PORT Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define PORT_VERID_FEATURE_MASK (0xFFFFU) +#define PORT_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number + * 0b0000000000000000..Basic implementation + */ +#define PORT_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << PORT_VERID_FEATURE_SHIFT)) & PORT_VERID_FEATURE_MASK) + +#define PORT_VERID_MINOR_MASK (0xFF0000U) +#define PORT_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define PORT_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << PORT_VERID_MINOR_SHIFT)) & PORT_VERID_MINOR_MASK) + +#define PORT_VERID_MAJOR_MASK (0xFF000000U) +#define PORT_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define PORT_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << PORT_VERID_MAJOR_SHIFT)) & PORT_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name GPCLR - Global Pin Control Low */ +/*! @{ */ + +#define PORT_GPCLR_GPWD_MASK (0xFFFFU) +#define PORT_GPCLR_GPWD_SHIFT (0U) +/*! GPWD - Global Pin Write Data */ +#define PORT_GPCLR_GPWD(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWD_SHIFT)) & PORT_GPCLR_GPWD_MASK) + +#define PORT_GPCLR_GPWE0_MASK (0x10000U) +#define PORT_GPCLR_GPWE0_SHIFT (16U) +/*! GPWE0 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE0(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE0_SHIFT)) & PORT_GPCLR_GPWE0_MASK) + +#define PORT_GPCLR_GPWE1_MASK (0x20000U) +#define PORT_GPCLR_GPWE1_SHIFT (17U) +/*! GPWE1 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE1(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE1_SHIFT)) & PORT_GPCLR_GPWE1_MASK) + +#define PORT_GPCLR_GPWE2_MASK (0x40000U) +#define PORT_GPCLR_GPWE2_SHIFT (18U) +/*! GPWE2 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE2(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE2_SHIFT)) & PORT_GPCLR_GPWE2_MASK) + +#define PORT_GPCLR_GPWE3_MASK (0x80000U) +#define PORT_GPCLR_GPWE3_SHIFT (19U) +/*! GPWE3 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE3(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE3_SHIFT)) & PORT_GPCLR_GPWE3_MASK) + +#define PORT_GPCLR_GPWE4_MASK (0x100000U) +#define PORT_GPCLR_GPWE4_SHIFT (20U) +/*! GPWE4 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE4(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE4_SHIFT)) & PORT_GPCLR_GPWE4_MASK) + +#define PORT_GPCLR_GPWE5_MASK (0x200000U) +#define PORT_GPCLR_GPWE5_SHIFT (21U) +/*! GPWE5 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE5(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE5_SHIFT)) & PORT_GPCLR_GPWE5_MASK) + +#define PORT_GPCLR_GPWE6_MASK (0x400000U) +#define PORT_GPCLR_GPWE6_SHIFT (22U) +/*! GPWE6 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE6(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE6_SHIFT)) & PORT_GPCLR_GPWE6_MASK) + +#define PORT_GPCLR_GPWE7_MASK (0x800000U) +#define PORT_GPCLR_GPWE7_SHIFT (23U) +/*! GPWE7 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE7(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE7_SHIFT)) & PORT_GPCLR_GPWE7_MASK) + +#define PORT_GPCLR_GPWE8_MASK (0x1000000U) +#define PORT_GPCLR_GPWE8_SHIFT (24U) +/*! GPWE8 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE8(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE8_SHIFT)) & PORT_GPCLR_GPWE8_MASK) + +#define PORT_GPCLR_GPWE9_MASK (0x2000000U) +#define PORT_GPCLR_GPWE9_SHIFT (25U) +/*! GPWE9 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE9(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE9_SHIFT)) & PORT_GPCLR_GPWE9_MASK) + +#define PORT_GPCLR_GPWE10_MASK (0x4000000U) +#define PORT_GPCLR_GPWE10_SHIFT (26U) +/*! GPWE10 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE10(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE10_SHIFT)) & PORT_GPCLR_GPWE10_MASK) + +#define PORT_GPCLR_GPWE11_MASK (0x8000000U) +#define PORT_GPCLR_GPWE11_SHIFT (27U) +/*! GPWE11 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE11(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE11_SHIFT)) & PORT_GPCLR_GPWE11_MASK) + +#define PORT_GPCLR_GPWE12_MASK (0x10000000U) +#define PORT_GPCLR_GPWE12_SHIFT (28U) +/*! GPWE12 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE12(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE12_SHIFT)) & PORT_GPCLR_GPWE12_MASK) + +#define PORT_GPCLR_GPWE13_MASK (0x20000000U) +#define PORT_GPCLR_GPWE13_SHIFT (29U) +/*! GPWE13 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE13(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE13_SHIFT)) & PORT_GPCLR_GPWE13_MASK) + +#define PORT_GPCLR_GPWE14_MASK (0x40000000U) +#define PORT_GPCLR_GPWE14_SHIFT (30U) +/*! GPWE14 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE14(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE14_SHIFT)) & PORT_GPCLR_GPWE14_MASK) + +#define PORT_GPCLR_GPWE15_MASK (0x80000000U) +#define PORT_GPCLR_GPWE15_SHIFT (31U) +/*! GPWE15 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCLR_GPWE15(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCLR_GPWE15_SHIFT)) & PORT_GPCLR_GPWE15_MASK) +/*! @} */ + +/*! @name GPCHR - Global Pin Control High */ +/*! @{ */ + +#define PORT_GPCHR_GPWD_MASK (0xFFFFU) +#define PORT_GPCHR_GPWD_SHIFT (0U) +/*! GPWD - Global Pin Write Data */ +#define PORT_GPCHR_GPWD(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWD_SHIFT)) & PORT_GPCHR_GPWD_MASK) + +#define PORT_GPCHR_GPWE16_MASK (0x10000U) +#define PORT_GPCHR_GPWE16_SHIFT (16U) +/*! GPWE16 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE16(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE16_SHIFT)) & PORT_GPCHR_GPWE16_MASK) + +#define PORT_GPCHR_GPWE17_MASK (0x20000U) +#define PORT_GPCHR_GPWE17_SHIFT (17U) +/*! GPWE17 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE17(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE17_SHIFT)) & PORT_GPCHR_GPWE17_MASK) + +#define PORT_GPCHR_GPWE18_MASK (0x40000U) +#define PORT_GPCHR_GPWE18_SHIFT (18U) +/*! GPWE18 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE18(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE18_SHIFT)) & PORT_GPCHR_GPWE18_MASK) + +#define PORT_GPCHR_GPWE19_MASK (0x80000U) +#define PORT_GPCHR_GPWE19_SHIFT (19U) +/*! GPWE19 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE19(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE19_SHIFT)) & PORT_GPCHR_GPWE19_MASK) + +#define PORT_GPCHR_GPWE20_MASK (0x100000U) +#define PORT_GPCHR_GPWE20_SHIFT (20U) +/*! GPWE20 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE20(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE20_SHIFT)) & PORT_GPCHR_GPWE20_MASK) + +#define PORT_GPCHR_GPWE21_MASK (0x200000U) +#define PORT_GPCHR_GPWE21_SHIFT (21U) +/*! GPWE21 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE21(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE21_SHIFT)) & PORT_GPCHR_GPWE21_MASK) + +#define PORT_GPCHR_GPWE22_MASK (0x400000U) +#define PORT_GPCHR_GPWE22_SHIFT (22U) +/*! GPWE22 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE22(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE22_SHIFT)) & PORT_GPCHR_GPWE22_MASK) + +#define PORT_GPCHR_GPWE23_MASK (0x800000U) +#define PORT_GPCHR_GPWE23_SHIFT (23U) +/*! GPWE23 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE23(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE23_SHIFT)) & PORT_GPCHR_GPWE23_MASK) + +#define PORT_GPCHR_GPWE24_MASK (0x1000000U) +#define PORT_GPCHR_GPWE24_SHIFT (24U) +/*! GPWE24 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE24(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE24_SHIFT)) & PORT_GPCHR_GPWE24_MASK) + +#define PORT_GPCHR_GPWE25_MASK (0x2000000U) +#define PORT_GPCHR_GPWE25_SHIFT (25U) +/*! GPWE25 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE25(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE25_SHIFT)) & PORT_GPCHR_GPWE25_MASK) + +#define PORT_GPCHR_GPWE26_MASK (0x4000000U) +#define PORT_GPCHR_GPWE26_SHIFT (26U) +/*! GPWE26 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE26(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE26_SHIFT)) & PORT_GPCHR_GPWE26_MASK) + +#define PORT_GPCHR_GPWE27_MASK (0x8000000U) +#define PORT_GPCHR_GPWE27_SHIFT (27U) +/*! GPWE27 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE27(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE27_SHIFT)) & PORT_GPCHR_GPWE27_MASK) + +#define PORT_GPCHR_GPWE28_MASK (0x10000000U) +#define PORT_GPCHR_GPWE28_SHIFT (28U) +/*! GPWE28 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE28(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE28_SHIFT)) & PORT_GPCHR_GPWE28_MASK) + +#define PORT_GPCHR_GPWE29_MASK (0x20000000U) +#define PORT_GPCHR_GPWE29_SHIFT (29U) +/*! GPWE29 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE29(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE29_SHIFT)) & PORT_GPCHR_GPWE29_MASK) + +#define PORT_GPCHR_GPWE30_MASK (0x40000000U) +#define PORT_GPCHR_GPWE30_SHIFT (30U) +/*! GPWE30 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE30(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE30_SHIFT)) & PORT_GPCHR_GPWE30_MASK) + +#define PORT_GPCHR_GPWE31_MASK (0x80000000U) +#define PORT_GPCHR_GPWE31_SHIFT (31U) +/*! GPWE31 - Global Pin Write Enable + * 0b0..Not updated + * 0b1..Updated + */ +#define PORT_GPCHR_GPWE31(x) (((uint32_t)(((uint32_t)(x)) << PORT_GPCHR_GPWE31_SHIFT)) & PORT_GPCHR_GPWE31_MASK) +/*! @} */ + +/*! @name CONFIG - Configuration */ +/*! @{ */ + +#define PORT_CONFIG_RANGE_MASK (0x1U) +#define PORT_CONFIG_RANGE_SHIFT (0U) +/*! RANGE - Port Voltage Range + * 0b0..1.71 V-3.6 V + * 0b1..2.70 V-3.6 V + */ +#define PORT_CONFIG_RANGE(x) (((uint32_t)(((uint32_t)(x)) << PORT_CONFIG_RANGE_SHIFT)) & PORT_CONFIG_RANGE_MASK) +/*! @} */ + +/*! @name CALIB0 - Calibration 0 */ +/*! @{ */ + +#define PORT_CALIB0_NCAL_MASK (0x3FU) +#define PORT_CALIB0_NCAL_SHIFT (0U) +/*! NCAL - Calibration of NMOS Output Driver */ +#define PORT_CALIB0_NCAL(x) (((uint32_t)(((uint32_t)(x)) << PORT_CALIB0_NCAL_SHIFT)) & PORT_CALIB0_NCAL_MASK) + +#define PORT_CALIB0_PCAL_MASK (0x3F0000U) +#define PORT_CALIB0_PCAL_SHIFT (16U) +/*! PCAL - Calibration of PMOS Output Driver */ +#define PORT_CALIB0_PCAL(x) (((uint32_t)(((uint32_t)(x)) << PORT_CALIB0_PCAL_SHIFT)) & PORT_CALIB0_PCAL_MASK) +/*! @} */ + +/*! @name CALIB1 - Calibration 1 */ +/*! @{ */ + +#define PORT_CALIB1_NCAL_MASK (0x3FU) +#define PORT_CALIB1_NCAL_SHIFT (0U) +/*! NCAL - Calibration of NMOS Output Driver */ +#define PORT_CALIB1_NCAL(x) (((uint32_t)(((uint32_t)(x)) << PORT_CALIB1_NCAL_SHIFT)) & PORT_CALIB1_NCAL_MASK) + +#define PORT_CALIB1_PCAL_MASK (0x3F0000U) +#define PORT_CALIB1_PCAL_SHIFT (16U) +/*! PCAL - Calibration of PMOS Output Driver */ +#define PORT_CALIB1_PCAL(x) (((uint32_t)(((uint32_t)(x)) << PORT_CALIB1_PCAL_SHIFT)) & PORT_CALIB1_PCAL_MASK) +/*! @} */ + +/*! @name PCR - Pin Control 0..Pin Control 31 */ +/*! @{ */ + +#define PORT_PCR_PS_MASK (0x1U) +#define PORT_PCR_PS_SHIFT (0U) +/*! PS - Pull Select + * 0b0..Enables internal pulldown resistor + * 0b1..Enables internal pullup resistor + */ +#define PORT_PCR_PS(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_PS_SHIFT)) & PORT_PCR_PS_MASK) + +#define PORT_PCR_PE_MASK (0x2U) +#define PORT_PCR_PE_SHIFT (1U) +/*! PE - Pull Enable + * 0b0..Disables + * 0b1..Enables + */ +#define PORT_PCR_PE(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_PE_SHIFT)) & PORT_PCR_PE_MASK) + +#define PORT_PCR_PV_MASK (0x4U) +#define PORT_PCR_PV_SHIFT (2U) +/*! PV - Pull Value + * 0b0..Low + * 0b1..High + */ +#define PORT_PCR_PV(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_PV_SHIFT)) & PORT_PCR_PV_MASK) + +#define PORT_PCR_SRE_MASK (0x8U) +#define PORT_PCR_SRE_SHIFT (3U) +/*! SRE - Slew Rate Enable + * 0b0..Fast + * 0b1..Slow + */ +#define PORT_PCR_SRE(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_SRE_SHIFT)) & PORT_PCR_SRE_MASK) + +#define PORT_PCR_PFE_MASK (0x10U) +#define PORT_PCR_PFE_SHIFT (4U) +/*! PFE - Passive Filter Enable + * 0b0..Disables + * 0b1..Enables + */ +#define PORT_PCR_PFE(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_PFE_SHIFT)) & PORT_PCR_PFE_MASK) + +#define PORT_PCR_ODE_MASK (0x20U) +#define PORT_PCR_ODE_SHIFT (5U) +/*! ODE - Open Drain Enable + * 0b0..Disables + * 0b1..Enables + */ +#define PORT_PCR_ODE(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_ODE_SHIFT)) & PORT_PCR_ODE_MASK) + +#define PORT_PCR_DSE_MASK (0x40U) +#define PORT_PCR_DSE_SHIFT (6U) +/*! DSE - Drive Strength Enable + * 0b0..Low + * 0b1..High + */ +#define PORT_PCR_DSE(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_DSE_SHIFT)) & PORT_PCR_DSE_MASK) + +#define PORT_PCR_DSE1_MASK (0x80U) +#define PORT_PCR_DSE1_SHIFT (7U) +/*! DSE1 - Drive Strength Enable + * 0b0..Normal + * 0b1..Double + */ +#define PORT_PCR_DSE1(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_DSE1_SHIFT)) & PORT_PCR_DSE1_MASK) + +#define PORT_PCR_MUX_MASK (0xF00U) /* Merged from fields with different position or width, of widths (2, 3, 4), largest definition used */ +#define PORT_PCR_MUX_SHIFT (8U) +/*! MUX - Pin Multiplex Control + * 0b0000..Alternative 0 (GPIO) + * 0b0001..Alternative 1 (chip-specific) + * 0b0010..Alternative 2 (chip-specific) + * 0b0011..Alternative 3 (chip-specific) + * 0b0100..Alternative 4 (chip-specific) + * 0b0101..Alternative 5 (chip-specific) + * 0b0110..Alternative 6 (chip-specific) + * 0b0111..Alternative 7 (chip-specific) + * 0b1000..Alternative 8 (chip-specific) + * 0b1001..Alternative 9 (chip-specific) + * 0b1010..Alternative 10 (chip-specific) + * 0b1011..Alternative 11 (chip-specific) + * 0b1100..Alternative 12 (chip-specific) + * 0b1101..Alternative 13 (chip-specific) + */ +#define PORT_PCR_MUX(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_MUX_SHIFT)) & PORT_PCR_MUX_MASK) /* Merged from fields with different position or width, of widths (2, 3, 4), largest definition used */ + +#define PORT_PCR_IBE_MASK (0x1000U) +#define PORT_PCR_IBE_SHIFT (12U) +/*! IBE - Input Buffer Enable + * 0b0..Disables + * 0b1..Enables + */ +#define PORT_PCR_IBE(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_IBE_SHIFT)) & PORT_PCR_IBE_MASK) + +#define PORT_PCR_INV_MASK (0x2000U) +#define PORT_PCR_INV_SHIFT (13U) +/*! INV - Invert Input + * 0b0..Does not invert + * 0b1..Inverts + */ +#define PORT_PCR_INV(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_INV_SHIFT)) & PORT_PCR_INV_MASK) + +#define PORT_PCR_LK_MASK (0x8000U) +#define PORT_PCR_LK_SHIFT (15U) +/*! LK - Lock Register + * 0b0..Does not lock + * 0b1..Locks + */ +#define PORT_PCR_LK(x) (((uint32_t)(((uint32_t)(x)) << PORT_PCR_LK_SHIFT)) & PORT_PCR_LK_MASK) +/*! @} */ + +/* The count of PORT_PCR */ +#define PORT_PCR_COUNT (32U) + + +/*! + * @} + */ /* end of group PORT_Register_Masks */ + + +/* PORT - Peripheral instance base addresses */ +/** Peripheral PORT0 base address */ +#define PORT0_BASE (0x400BC000u) +/** Peripheral PORT0 base pointer */ +#define PORT0 ((PORT_Type *)PORT0_BASE) +/** Peripheral PORT1 base address */ +#define PORT1_BASE (0x400BD000u) +/** Peripheral PORT1 base pointer */ +#define PORT1 ((PORT_Type *)PORT1_BASE) +/** Peripheral PORT2 base address */ +#define PORT2_BASE (0x400BE000u) +/** Peripheral PORT2 base pointer */ +#define PORT2 ((PORT_Type *)PORT2_BASE) +/** Peripheral PORT3 base address */ +#define PORT3_BASE (0x400BF000u) +/** Peripheral PORT3 base pointer */ +#define PORT3 ((PORT_Type *)PORT3_BASE) +/** Peripheral PORT4 base address */ +#define PORT4_BASE (0x400C0000u) +/** Peripheral PORT4 base pointer */ +#define PORT4 ((PORT_Type *)PORT4_BASE) +/** Array initializer of PORT peripheral base addresses */ +#define PORT_BASE_ADDRS { PORT0_BASE, PORT1_BASE, PORT2_BASE, PORT3_BASE, PORT4_BASE } +/** Array initializer of PORT peripheral base pointers */ +#define PORT_BASE_PTRS { PORT0, PORT1, PORT2, PORT3, PORT4 } + +/*! + * @} + */ /* end of group PORT_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- PWM Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup PWM_Peripheral_Access_Layer PWM Peripheral Access Layer + * @{ + */ + +/** PWM - Register Layout Typedef */ +typedef struct { + struct { /* offset: 0x0, array step: 0x60 */ + __I uint16_t CNT; /**< Counter Register, array offset: 0x0, array step: 0x60 */ + __IO uint16_t INIT; /**< Initial Count Register, array offset: 0x2, array step: 0x60 */ + __IO uint16_t CTRL2; /**< Control 2 Register, array offset: 0x4, array step: 0x60 */ + __IO uint16_t CTRL; /**< Control Register, array offset: 0x6, array step: 0x60 */ + uint8_t RESERVED_0[2]; + __IO uint16_t VAL0; /**< Value Register 0, array offset: 0xA, array step: 0x60 */ + uint8_t RESERVED_1[2]; + __IO uint16_t VAL1; /**< Value Register 1, array offset: 0xE, array step: 0x60 */ + uint8_t RESERVED_2[2]; + __IO uint16_t VAL2; /**< Value Register 2, array offset: 0x12, array step: 0x60 */ + uint8_t RESERVED_3[2]; + __IO uint16_t VAL3; /**< Value Register 3, array offset: 0x16, array step: 0x60 */ + uint8_t RESERVED_4[2]; + __IO uint16_t VAL4; /**< Value Register 4, array offset: 0x1A, array step: 0x60 */ + uint8_t RESERVED_5[2]; + __IO uint16_t VAL5; /**< Value Register 5, array offset: 0x1E, array step: 0x60 */ + uint8_t RESERVED_6[2]; + __IO uint16_t OCTRL; /**< Output Control Register, array offset: 0x22, array step: 0x60 */ + __IO uint16_t STS; /**< Status Register, array offset: 0x24, array step: 0x60 */ + __IO uint16_t INTEN; /**< Interrupt Enable Register, array offset: 0x26, array step: 0x60 */ + __IO uint16_t DMAEN; /**< DMA Enable Register, array offset: 0x28, array step: 0x60 */ + __IO uint16_t TCTRL; /**< Output Trigger Control Register, array offset: 0x2A, array step: 0x60 */ + __IO uint16_t DISMAP[1]; /**< Fault Disable Mapping Register 0, array offset: 0x2C, array step: index*0x60, index2*0x2 */ + uint8_t RESERVED_7[2]; + __IO uint16_t DTCNT0; /**< Deadtime Count Register 0, array offset: 0x30, array step: 0x60 */ + __IO uint16_t DTCNT1; /**< Deadtime Count Register 1, array offset: 0x32, array step: 0x60 */ + uint8_t RESERVED_8[8]; + __IO uint16_t CAPTCTRLX; /**< Capture Control X Register, array offset: 0x3C, array step: 0x60 */ + __IO uint16_t CAPTCOMPX; /**< Capture Compare X Register, array offset: 0x3E, array step: 0x60 */ + __I uint16_t CVAL0; /**< Capture Value 0 Register, array offset: 0x40, array step: 0x60 */ + __I uint16_t CVAL0CYC; /**< Capture Value 0 Cycle Register, array offset: 0x42, array step: 0x60 */ + __I uint16_t CVAL1; /**< Capture Value 1 Register, array offset: 0x44, array step: 0x60 */ + __I uint16_t CVAL1CYC; /**< Capture Value 1 Cycle Register, array offset: 0x46, array step: 0x60 */ + uint8_t RESERVED_9[16]; + __IO uint16_t PHASEDLY; /**< Phase Delay Register, array offset: 0x58, array step: 0x60, valid indices: [1-2] */ + uint8_t RESERVED_10[4]; + __IO uint16_t CAPTFILTX; /**< Capture PWM_X Input Filter Register, array offset: 0x5E, array step: 0x60 */ + } SM[3]; + uint8_t RESERVED_0[96]; + __IO uint16_t OUTEN; /**< Output Enable Register, offset: 0x180 */ + __IO uint16_t MASK; /**< Mask Register, offset: 0x182 */ + __IO uint16_t SWCOUT; /**< Software Controlled Output Register, offset: 0x184 */ + __IO uint16_t DTSRCSEL; /**< PWM Source Select Register, offset: 0x186 */ + __IO uint16_t MCTRL; /**< Master Control Register, offset: 0x188 */ + __IO uint16_t MCTRL2; /**< Master Control 2 Register, offset: 0x18A */ + __IO uint16_t FCTRL; /**< Fault Control Register, offset: 0x18C */ + __IO uint16_t FSTS; /**< Fault Status Register, offset: 0x18E */ + __IO uint16_t FFILT; /**< Fault Filter Register, offset: 0x190 */ + __IO uint16_t FTST; /**< Fault Test Register, offset: 0x192 */ + __IO uint16_t FCTRL2; /**< Fault Control 2 Register, offset: 0x194 */ +} PWM_Type; + +/* ---------------------------------------------------------------------------- + -- PWM Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup PWM_Register_Masks PWM Register Masks + * @{ + */ + +/*! @name CNT - Counter Register */ +/*! @{ */ + +#define PWM_CNT_CNT_MASK (0xFFFFU) +#define PWM_CNT_CNT_SHIFT (0U) +/*! CNT - Counter Register Bits */ +#define PWM_CNT_CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CNT_CNT_SHIFT)) & PWM_CNT_CNT_MASK) +/*! @} */ + +/* The count of PWM_CNT */ +#define PWM_CNT_COUNT (3U) + +/*! @name INIT - Initial Count Register */ +/*! @{ */ + +#define PWM_INIT_INIT_MASK (0xFFFFU) +#define PWM_INIT_INIT_SHIFT (0U) +/*! INIT - Initial Count Register Bits */ +#define PWM_INIT_INIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_INIT_INIT_SHIFT)) & PWM_INIT_INIT_MASK) +/*! @} */ + +/* The count of PWM_INIT */ +#define PWM_INIT_COUNT (3U) + +/*! @name CTRL2 - Control 2 Register */ +/*! @{ */ + +#define PWM_CTRL2_CLK_SEL_MASK (0x3U) +#define PWM_CTRL2_CLK_SEL_SHIFT (0U) +/*! CLK_SEL - Clock Source Select + * 0b00..The IPBus clock is used as the clock for the local prescaler and counter. + * 0b01..EXT_CLK is used as the clock for the local prescaler and counter. + * 0b10..Submodule 0's clock (AUX_CLK) is used as the source clock for the local prescaler and counter. This + * setting should not be used in submodule 0 as it forces the clock to logic 0. + * 0b11..Reserved + */ +#define PWM_CTRL2_CLK_SEL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_CLK_SEL_SHIFT)) & PWM_CTRL2_CLK_SEL_MASK) + +#define PWM_CTRL2_RELOAD_SEL_MASK (0x4U) +#define PWM_CTRL2_RELOAD_SEL_SHIFT (2U) +/*! RELOAD_SEL - Reload Source Select + * 0b0..The local RELOAD signal is used to reload registers. + * 0b1..The master RELOAD signal (from submodule 0) is used to reload registers. This setting should not be used + * in submodule 0 as it forces the RELOAD signal to logic 0. + */ +#define PWM_CTRL2_RELOAD_SEL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_RELOAD_SEL_SHIFT)) & PWM_CTRL2_RELOAD_SEL_MASK) + +#define PWM_CTRL2_FORCE_SEL_MASK (0x38U) +#define PWM_CTRL2_FORCE_SEL_SHIFT (3U) +/*! FORCE_SEL - Force Select + * 0b000..The local force signal, CTRL2[FORCE], from this submodule is used to force updates. + * 0b001..The master force signal from submodule 0 is used to force updates. This setting should not be used in + * submodule 0 as it holds the FORCE OUTPUT signal to logic 0. + * 0b010..The local reload signal from this submodule is used to force updates without regard to the state of LDOK. + * 0b011..The master reload signal from submodule0 is used to force updates if LDOK is set. This setting should + * not be used in submodule0 as it holds the FORCE OUTPUT signal to logic 0. + * 0b100..The local sync signal from this submodule is used to force updates. + * 0b101..The master sync signal from submodule0 is used to force updates. This setting should not be used in + * submodule0 as it holds the FORCE OUTPUT signal to logic 0. + * 0b110..The external force signal, EXT_FORCE, from outside the PWM module causes updates. + * 0b111..The external sync signal, EXT_SYNC, from outside the PWM module causes updates. + */ +#define PWM_CTRL2_FORCE_SEL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_FORCE_SEL_SHIFT)) & PWM_CTRL2_FORCE_SEL_MASK) + +#define PWM_CTRL2_FORCE_MASK (0x40U) +#define PWM_CTRL2_FORCE_SHIFT (6U) +/*! FORCE - Force Initialization */ +#define PWM_CTRL2_FORCE(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_FORCE_SHIFT)) & PWM_CTRL2_FORCE_MASK) + +#define PWM_CTRL2_FRCEN_MASK (0x80U) +#define PWM_CTRL2_FRCEN_SHIFT (7U) +/*! FRCEN - Force Enable + * 0b0..Initialization from a FORCE_OUT is disabled. + * 0b1..Initialization from a FORCE_OUT is enabled. + */ +#define PWM_CTRL2_FRCEN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_FRCEN_SHIFT)) & PWM_CTRL2_FRCEN_MASK) + +#define PWM_CTRL2_INIT_SEL_MASK (0x300U) +#define PWM_CTRL2_INIT_SEL_SHIFT (8U) +/*! INIT_SEL - Initialization Control Select + * 0b00..Local sync (PWM_X) causes initialization. + * 0b01..Master reload from submodule 0 causes initialization. This setting should not be used in submodule 0 as + * it forces the INIT signal to logic 0. The submodule counter will only re-initialize when a master reload + * occurs. + * 0b10..Master sync from submodule 0 causes initialization. This setting should not be used in submodule 0 as it forces the INIT signal to logic 0. + * 0b11..EXT_SYNC causes initialization. + */ +#define PWM_CTRL2_INIT_SEL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_INIT_SEL_SHIFT)) & PWM_CTRL2_INIT_SEL_MASK) + +#define PWM_CTRL2_PWMX_INIT_MASK (0x400U) +#define PWM_CTRL2_PWMX_INIT_SHIFT (10U) +/*! PWMX_INIT - PWM_X Initial Value */ +#define PWM_CTRL2_PWMX_INIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_PWMX_INIT_SHIFT)) & PWM_CTRL2_PWMX_INIT_MASK) + +#define PWM_CTRL2_PWM45_INIT_MASK (0x800U) +#define PWM_CTRL2_PWM45_INIT_SHIFT (11U) +/*! PWM45_INIT - PWM45 Initial Value */ +#define PWM_CTRL2_PWM45_INIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_PWM45_INIT_SHIFT)) & PWM_CTRL2_PWM45_INIT_MASK) + +#define PWM_CTRL2_PWM23_INIT_MASK (0x1000U) +#define PWM_CTRL2_PWM23_INIT_SHIFT (12U) +/*! PWM23_INIT - PWM23 Initial Value */ +#define PWM_CTRL2_PWM23_INIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_PWM23_INIT_SHIFT)) & PWM_CTRL2_PWM23_INIT_MASK) + +#define PWM_CTRL2_INDEP_MASK (0x2000U) +#define PWM_CTRL2_INDEP_SHIFT (13U) +/*! INDEP - Independent or Complementary Pair Operation + * 0b0..PWM_A and PWM_B form a complementary PWM pair. + * 0b1..PWM_A and PWM_B outputs are independent PWMs. + */ +#define PWM_CTRL2_INDEP(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_INDEP_SHIFT)) & PWM_CTRL2_INDEP_MASK) + +#define PWM_CTRL2_DBGEN_MASK (0x8000U) +#define PWM_CTRL2_DBGEN_SHIFT (15U) +/*! DBGEN - Debug Enable */ +#define PWM_CTRL2_DBGEN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL2_DBGEN_SHIFT)) & PWM_CTRL2_DBGEN_MASK) +/*! @} */ + +/* The count of PWM_CTRL2 */ +#define PWM_CTRL2_COUNT (3U) + +/*! @name CTRL - Control Register */ +/*! @{ */ + +#define PWM_CTRL_DBLEN_MASK (0x1U) +#define PWM_CTRL_DBLEN_SHIFT (0U) +/*! DBLEN - Double Switching Enable + * 0b0..Double switching disabled. + * 0b1..Double switching enabled. + */ +#define PWM_CTRL_DBLEN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_DBLEN_SHIFT)) & PWM_CTRL_DBLEN_MASK) + +#define PWM_CTRL_DBLX_MASK (0x2U) +#define PWM_CTRL_DBLX_SHIFT (1U) +/*! DBLX - PWM_X Double Switching Enable + * 0b0..PWM_X double pulse disabled. + * 0b1..PWM_X double pulse enabled. + */ +#define PWM_CTRL_DBLX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_DBLX_SHIFT)) & PWM_CTRL_DBLX_MASK) + +#define PWM_CTRL_LDMOD_MASK (0x4U) +#define PWM_CTRL_LDMOD_SHIFT (2U) +/*! LDMOD - Load Mode Select + * 0b0..Buffered registers of this submodule are loaded and take effect at the next PWM reload if MCTRL[LDOK] is set. + * 0b1..Buffered registers of this submodule are loaded and take effect immediately upon MCTRL[LDOK] being set. + * In this case, it is not necessary to set CTRL[FULL] or CTRL[HALF]. + */ +#define PWM_CTRL_LDMOD(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_LDMOD_SHIFT)) & PWM_CTRL_LDMOD_MASK) + +#define PWM_CTRL_SPLIT_MASK (0x8U) +#define PWM_CTRL_SPLIT_SHIFT (3U) +/*! SPLIT - Split the DBLPWM signal to PWM_A and PWM_B + * 0b0..DBLPWM is not split. PWM_A and PWM_B each have double pulses. + * 0b1..DBLPWM is split to PWM_A and PWM_B. + */ +#define PWM_CTRL_SPLIT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_SPLIT_SHIFT)) & PWM_CTRL_SPLIT_MASK) + +#define PWM_CTRL_PRSC_MASK (0x70U) +#define PWM_CTRL_PRSC_SHIFT (4U) +/*! PRSC - Prescaler + * 0b000..Prescaler 1 + * 0b001..Prescaler 2 + * 0b010..Prescaler 4 + * 0b011..Prescaler 8 + * 0b100..Prescaler 16 + * 0b101..Prescaler 32 + * 0b110..Prescaler 64 + * 0b111..Prescaler 128 + */ +#define PWM_CTRL_PRSC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_PRSC_SHIFT)) & PWM_CTRL_PRSC_MASK) + +#define PWM_CTRL_COMPMODE_MASK (0x80U) +#define PWM_CTRL_COMPMODE_SHIFT (7U) +/*! COMPMODE - Compare Mode + * 0b0..The VAL* registers and the PWM counter are compared using an "equal to" method. This means that PWM edges + * are only produced when the counter is equal to one of the VAL* register values. This implies that a PWM_A + * output that is high at the end of a period maintains this state until a match with VAL3 clears the output + * in the following period. + * 0b1..The VAL* registers and the PWM counter are compared using an "equal to or greater than" method. This + * means that PWM edges are produced when the counter is equal to or greater than one of the VAL* register + * values. This implies that a PWM_A output that is high at the end of a period could go low at the start of the + * next period if the starting counter value is greater than (but not necessarily equal to) the new VAL3 value. + */ +#define PWM_CTRL_COMPMODE(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_COMPMODE_SHIFT)) & PWM_CTRL_COMPMODE_MASK) + +#define PWM_CTRL_DT_MASK (0x300U) +#define PWM_CTRL_DT_SHIFT (8U) +/*! DT - Deadtime */ +#define PWM_CTRL_DT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_DT_SHIFT)) & PWM_CTRL_DT_MASK) + +#define PWM_CTRL_FULL_MASK (0x400U) +#define PWM_CTRL_FULL_SHIFT (10U) +/*! FULL - Full Cycle Reload + * 0b0..Full-cycle reloads disabled. + * 0b1..Full-cycle reloads enabled. + */ +#define PWM_CTRL_FULL(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_FULL_SHIFT)) & PWM_CTRL_FULL_MASK) + +#define PWM_CTRL_HALF_MASK (0x800U) +#define PWM_CTRL_HALF_SHIFT (11U) +/*! HALF - Half Cycle Reload + * 0b0..Half-cycle reloads disabled. + * 0b1..Half-cycle reloads enabled. + */ +#define PWM_CTRL_HALF(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_HALF_SHIFT)) & PWM_CTRL_HALF_MASK) + +#define PWM_CTRL_LDFQ_MASK (0xF000U) +#define PWM_CTRL_LDFQ_SHIFT (12U) +/*! LDFQ - Load Frequency + * 0b0000..Every PWM opportunity + * 0b0001..Every 2 PWM opportunities + * 0b0010..Every 3 PWM opportunities + * 0b0011..Every 4 PWM opportunities + * 0b0100..Every 5 PWM opportunities + * 0b0101..Every 6 PWM opportunities + * 0b0110..Every 7 PWM opportunities + * 0b0111..Every 8 PWM opportunities + * 0b1000..Every 9 PWM opportunities + * 0b1001..Every 10 PWM opportunities + * 0b1010..Every 11 PWM opportunities + * 0b1011..Every 12 PWM opportunities + * 0b1100..Every 13 PWM opportunities + * 0b1101..Every 14 PWM opportunities + * 0b1110..Every 15 PWM opportunities + * 0b1111..Every 16 PWM opportunities + */ +#define PWM_CTRL_LDFQ(x) (((uint16_t)(((uint16_t)(x)) << PWM_CTRL_LDFQ_SHIFT)) & PWM_CTRL_LDFQ_MASK) +/*! @} */ + +/* The count of PWM_CTRL */ +#define PWM_CTRL_COUNT (3U) + +/*! @name VAL0 - Value Register 0 */ +/*! @{ */ + +#define PWM_VAL0_VAL0_MASK (0xFFFFU) +#define PWM_VAL0_VAL0_SHIFT (0U) +/*! VAL0 - Value 0 */ +#define PWM_VAL0_VAL0(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL0_VAL0_SHIFT)) & PWM_VAL0_VAL0_MASK) +/*! @} */ + +/* The count of PWM_VAL0 */ +#define PWM_VAL0_COUNT (3U) + +/*! @name VAL1 - Value Register 1 */ +/*! @{ */ + +#define PWM_VAL1_VAL1_MASK (0xFFFFU) +#define PWM_VAL1_VAL1_SHIFT (0U) +/*! VAL1 - Value 1 */ +#define PWM_VAL1_VAL1(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL1_VAL1_SHIFT)) & PWM_VAL1_VAL1_MASK) +/*! @} */ + +/* The count of PWM_VAL1 */ +#define PWM_VAL1_COUNT (3U) + +/*! @name VAL2 - Value Register 2 */ +/*! @{ */ + +#define PWM_VAL2_VAL2_MASK (0xFFFFU) +#define PWM_VAL2_VAL2_SHIFT (0U) +/*! VAL2 - Value 2 */ +#define PWM_VAL2_VAL2(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL2_VAL2_SHIFT)) & PWM_VAL2_VAL2_MASK) +/*! @} */ + +/* The count of PWM_VAL2 */ +#define PWM_VAL2_COUNT (3U) + +/*! @name VAL3 - Value Register 3 */ +/*! @{ */ + +#define PWM_VAL3_VAL3_MASK (0xFFFFU) +#define PWM_VAL3_VAL3_SHIFT (0U) +/*! VAL3 - Value 3 */ +#define PWM_VAL3_VAL3(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL3_VAL3_SHIFT)) & PWM_VAL3_VAL3_MASK) +/*! @} */ + +/* The count of PWM_VAL3 */ +#define PWM_VAL3_COUNT (3U) + +/*! @name VAL4 - Value Register 4 */ +/*! @{ */ + +#define PWM_VAL4_VAL4_MASK (0xFFFFU) +#define PWM_VAL4_VAL4_SHIFT (0U) +/*! VAL4 - Value 4 */ +#define PWM_VAL4_VAL4(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL4_VAL4_SHIFT)) & PWM_VAL4_VAL4_MASK) +/*! @} */ + +/* The count of PWM_VAL4 */ +#define PWM_VAL4_COUNT (3U) + +/*! @name VAL5 - Value Register 5 */ +/*! @{ */ + +#define PWM_VAL5_VAL5_MASK (0xFFFFU) +#define PWM_VAL5_VAL5_SHIFT (0U) +/*! VAL5 - Value 5 */ +#define PWM_VAL5_VAL5(x) (((uint16_t)(((uint16_t)(x)) << PWM_VAL5_VAL5_SHIFT)) & PWM_VAL5_VAL5_MASK) +/*! @} */ + +/* The count of PWM_VAL5 */ +#define PWM_VAL5_COUNT (3U) + +/*! @name OCTRL - Output Control Register */ +/*! @{ */ + +#define PWM_OCTRL_PWMXFS_MASK (0x3U) +#define PWM_OCTRL_PWMXFS_SHIFT (0U) +/*! PWMXFS - PWM_X Fault State + * 0b00..Output is forced to logic 0 state prior to consideration of output polarity control. + * 0b01..Output is forced to logic 1 state prior to consideration of output polarity control. + * 0b10, 0b11..Output is put in a high-impedance state. + */ +#define PWM_OCTRL_PWMXFS(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMXFS_SHIFT)) & PWM_OCTRL_PWMXFS_MASK) + +#define PWM_OCTRL_PWMBFS_MASK (0xCU) +#define PWM_OCTRL_PWMBFS_SHIFT (2U) +/*! PWMBFS - PWM_B Fault State + * 0b00..Output is forced to logic 0 state prior to consideration of output polarity control. + * 0b01..Output is forced to logic 1 state prior to consideration of output polarity control. + * 0b10, 0b11..Output is put in a high-impedance state. + */ +#define PWM_OCTRL_PWMBFS(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMBFS_SHIFT)) & PWM_OCTRL_PWMBFS_MASK) + +#define PWM_OCTRL_PWMAFS_MASK (0x30U) +#define PWM_OCTRL_PWMAFS_SHIFT (4U) +/*! PWMAFS - PWM_A Fault State + * 0b00..Output is forced to logic 0 state prior to consideration of output polarity control. + * 0b01..Output is forced to logic 1 state prior to consideration of output polarity control. + * 0b10, 0b11..Output is put in a high-impedance state. + */ +#define PWM_OCTRL_PWMAFS(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMAFS_SHIFT)) & PWM_OCTRL_PWMAFS_MASK) + +#define PWM_OCTRL_POLX_MASK (0x100U) +#define PWM_OCTRL_POLX_SHIFT (8U) +/*! POLX - PWM_X Output Polarity + * 0b0..PWM_X output not inverted. A high level on the PWM_X pin represents the "on" or "active" state. + * 0b1..PWM_X output inverted. A low level on the PWM_X pin represents the "on" or "active" state. + */ +#define PWM_OCTRL_POLX(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_POLX_SHIFT)) & PWM_OCTRL_POLX_MASK) + +#define PWM_OCTRL_POLB_MASK (0x200U) +#define PWM_OCTRL_POLB_SHIFT (9U) +/*! POLB - PWM_B Output Polarity + * 0b0..PWM_B output not inverted. A high level on the PWM_B pin represents the "on" or "active" state. + * 0b1..PWM_B output inverted. A low level on the PWM_B pin represents the "on" or "active" state. + */ +#define PWM_OCTRL_POLB(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_POLB_SHIFT)) & PWM_OCTRL_POLB_MASK) + +#define PWM_OCTRL_POLA_MASK (0x400U) +#define PWM_OCTRL_POLA_SHIFT (10U) +/*! POLA - PWM_A Output Polarity + * 0b0..PWM_A output not inverted. A high level on the PWM_A pin represents the "on" or "active" state. + * 0b1..PWM_A output inverted. A low level on the PWM_A pin represents the "on" or "active" state. + */ +#define PWM_OCTRL_POLA(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_POLA_SHIFT)) & PWM_OCTRL_POLA_MASK) + +#define PWM_OCTRL_PWMX_IN_MASK (0x2000U) +#define PWM_OCTRL_PWMX_IN_SHIFT (13U) +/*! PWMX_IN - PWM_X Input */ +#define PWM_OCTRL_PWMX_IN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMX_IN_SHIFT)) & PWM_OCTRL_PWMX_IN_MASK) + +#define PWM_OCTRL_PWMB_IN_MASK (0x4000U) +#define PWM_OCTRL_PWMB_IN_SHIFT (14U) +/*! PWMB_IN - PWM_B Input */ +#define PWM_OCTRL_PWMB_IN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMB_IN_SHIFT)) & PWM_OCTRL_PWMB_IN_MASK) + +#define PWM_OCTRL_PWMA_IN_MASK (0x8000U) +#define PWM_OCTRL_PWMA_IN_SHIFT (15U) +/*! PWMA_IN - PWM_A Input */ +#define PWM_OCTRL_PWMA_IN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OCTRL_PWMA_IN_SHIFT)) & PWM_OCTRL_PWMA_IN_MASK) +/*! @} */ + +/* The count of PWM_OCTRL */ +#define PWM_OCTRL_COUNT (3U) + +/*! @name STS - Status Register */ +/*! @{ */ + +#define PWM_STS_CMPF_MASK (0x3FU) +#define PWM_STS_CMPF_SHIFT (0U) +/*! CMPF - Compare Flags + * 0b000000..No compare event has occurred for a particular VALx value. + * 0b000001..A compare event has occurred for a particular VALx value. + */ +#define PWM_STS_CMPF(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CMPF_SHIFT)) & PWM_STS_CMPF_MASK) + +#define PWM_STS_CFX0_MASK (0x40U) +#define PWM_STS_CFX0_SHIFT (6U) +/*! CFX0 - Capture Flag X0 */ +#define PWM_STS_CFX0(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CFX0_SHIFT)) & PWM_STS_CFX0_MASK) + +#define PWM_STS_CFX1_MASK (0x80U) +#define PWM_STS_CFX1_SHIFT (7U) +/*! CFX1 - Capture Flag X1 */ +#define PWM_STS_CFX1(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_CFX1_SHIFT)) & PWM_STS_CFX1_MASK) + +#define PWM_STS_RF_MASK (0x1000U) +#define PWM_STS_RF_SHIFT (12U) +/*! RF - Reload Flag + * 0b0..No new reload cycle since last STS[RF] clearing + * 0b1..New reload cycle since last STS[RF] clearing + */ +#define PWM_STS_RF(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_RF_SHIFT)) & PWM_STS_RF_MASK) + +#define PWM_STS_REF_MASK (0x2000U) +#define PWM_STS_REF_SHIFT (13U) +/*! REF - Reload Error Flag + * 0b0..No reload error occurred. + * 0b1..Reload signal occurred with non-coherent data and MCTRL[LDOK] = 0. + */ +#define PWM_STS_REF(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_REF_SHIFT)) & PWM_STS_REF_MASK) + +#define PWM_STS_RUF_MASK (0x4000U) +#define PWM_STS_RUF_SHIFT (14U) +/*! RUF - Registers Updated Flag + * 0b0..No register update has occurred since last reload. + * 0b1..At least one of the double buffered registers has been updated since the last reload. + */ +#define PWM_STS_RUF(x) (((uint16_t)(((uint16_t)(x)) << PWM_STS_RUF_SHIFT)) & PWM_STS_RUF_MASK) +/*! @} */ + +/* The count of PWM_STS */ +#define PWM_STS_COUNT (3U) + +/*! @name INTEN - Interrupt Enable Register */ +/*! @{ */ + +#define PWM_INTEN_CMPIE_MASK (0x3FU) +#define PWM_INTEN_CMPIE_SHIFT (0U) +/*! CMPIE - Compare Interrupt Enables + * 0b000000..The corresponding STS[CMPF] bit will not cause an interrupt request. + * 0b000001..The corresponding STS[CMPF] bit will cause an interrupt request. + */ +#define PWM_INTEN_CMPIE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CMPIE_SHIFT)) & PWM_INTEN_CMPIE_MASK) + +#define PWM_INTEN_CX0IE_MASK (0x40U) +#define PWM_INTEN_CX0IE_SHIFT (6U) +/*! CX0IE - Capture X 0 Interrupt Enable + * 0b0..Interrupt request disabled for STS[CFX0]. + * 0b1..Interrupt request enabled for STS[CFX0]. + */ +#define PWM_INTEN_CX0IE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CX0IE_SHIFT)) & PWM_INTEN_CX0IE_MASK) + +#define PWM_INTEN_CX1IE_MASK (0x80U) +#define PWM_INTEN_CX1IE_SHIFT (7U) +/*! CX1IE - Capture X 1 Interrupt Enable + * 0b0..Interrupt request disabled for STS[CFX1]. + * 0b1..Interrupt request enabled for STS[CFX1]. + */ +#define PWM_INTEN_CX1IE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_CX1IE_SHIFT)) & PWM_INTEN_CX1IE_MASK) + +#define PWM_INTEN_RIE_MASK (0x1000U) +#define PWM_INTEN_RIE_SHIFT (12U) +/*! RIE - Reload Interrupt Enable + * 0b0..STS[RF] CPU interrupt requests disabled + * 0b1..STS[RF] CPU interrupt requests enabled + */ +#define PWM_INTEN_RIE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_RIE_SHIFT)) & PWM_INTEN_RIE_MASK) + +#define PWM_INTEN_REIE_MASK (0x2000U) +#define PWM_INTEN_REIE_SHIFT (13U) +/*! REIE - Reload Error Interrupt Enable + * 0b0..STS[REF] CPU interrupt requests disabled + * 0b1..STS[REF] CPU interrupt requests enabled + */ +#define PWM_INTEN_REIE(x) (((uint16_t)(((uint16_t)(x)) << PWM_INTEN_REIE_SHIFT)) & PWM_INTEN_REIE_MASK) +/*! @} */ + +/* The count of PWM_INTEN */ +#define PWM_INTEN_COUNT (3U) + +/*! @name DMAEN - DMA Enable Register */ +/*! @{ */ + +#define PWM_DMAEN_CX0DE_MASK (0x1U) +#define PWM_DMAEN_CX0DE_SHIFT (0U) +/*! CX0DE - Capture X0 FIFO DMA Enable */ +#define PWM_DMAEN_CX0DE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CX0DE_SHIFT)) & PWM_DMAEN_CX0DE_MASK) + +#define PWM_DMAEN_CX1DE_MASK (0x2U) +#define PWM_DMAEN_CX1DE_SHIFT (1U) +/*! CX1DE - Capture X1 FIFO DMA Enable */ +#define PWM_DMAEN_CX1DE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CX1DE_SHIFT)) & PWM_DMAEN_CX1DE_MASK) + +#define PWM_DMAEN_CAPTDE_MASK (0xC0U) +#define PWM_DMAEN_CAPTDE_SHIFT (6U) +/*! CAPTDE - Capture DMA Enable Source Select + * 0b00..Read DMA requests disabled. + * 0b01..Exceeding a FIFO watermark sets the DMA read request. This requires at least one of DMAEN[CA1DE], + * DMAEN[CA0DE], DMAEN[CB1DE], DMAEN[CB0DE], DMAEN[CX1DE], or DMAEN[CX0DE] to be set to determine which + * watermark(s) the DMA request is sensitive. + * 0b10..A local synchronization (VAL1 matches counter) sets the read DMA request. + * 0b11..A local reload (STS[RF] being set) sets the read DMA request. + */ +#define PWM_DMAEN_CAPTDE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_CAPTDE_SHIFT)) & PWM_DMAEN_CAPTDE_MASK) + +#define PWM_DMAEN_FAND_MASK (0x100U) +#define PWM_DMAEN_FAND_SHIFT (8U) +/*! FAND - FIFO Watermark AND Control + * 0b0..Selected FIFO watermarks are OR'ed together. + * 0b1..Selected FIFO watermarks are AND'ed together. + */ +#define PWM_DMAEN_FAND(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_FAND_SHIFT)) & PWM_DMAEN_FAND_MASK) + +#define PWM_DMAEN_VALDE_MASK (0x200U) +#define PWM_DMAEN_VALDE_SHIFT (9U) +/*! VALDE - Value Registers DMA Enable + * 0b0..DMA write requests disabled + * 0b1..Enabled + */ +#define PWM_DMAEN_VALDE(x) (((uint16_t)(((uint16_t)(x)) << PWM_DMAEN_VALDE_SHIFT)) & PWM_DMAEN_VALDE_MASK) +/*! @} */ + +/* The count of PWM_DMAEN */ +#define PWM_DMAEN_COUNT (3U) + +/*! @name TCTRL - Output Trigger Control Register */ +/*! @{ */ + +#define PWM_TCTRL_OUT_TRIG_EN_MASK (0x3FU) +#define PWM_TCTRL_OUT_TRIG_EN_SHIFT (0U) +/*! OUT_TRIG_EN - Output Trigger Enables + * 0bxxxxx1..PWM_OUT_TRIG0 will set when the counter value matches the VAL0 value. + * 0bxxxx1x..PWM_OUT_TRIG1 will set when the counter value matches the VAL1 value. + * 0bxxx1xx..PWM_OUT_TRIG0 will set when the counter value matches the VAL2 value. + * 0bxx1xxx..PWM_OUT_TRIG1 will set when the counter value matches the VAL3 value. + * 0bx1xxxx..PWM_OUT_TRIG0 will set when the counter value matches the VAL4 value. + * 0b1xxxxx..PWM_OUT_TRIG1 will set when the counter value matches the VAL5 value. + */ +#define PWM_TCTRL_OUT_TRIG_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_TCTRL_OUT_TRIG_EN_SHIFT)) & PWM_TCTRL_OUT_TRIG_EN_MASK) + +#define PWM_TCTRL_TRGFRQ_MASK (0x1000U) +#define PWM_TCTRL_TRGFRQ_SHIFT (12U) +/*! TRGFRQ - Trigger Frequency + * 0b0..Trigger outputs are generated during every PWM period even if the PWM is not reloaded every period due to CTRL[LDFQ] being non-zero. + * 0b1..Trigger outputs are generated only during the final PWM period prior to a reload opportunity when the PWM + * is not reloaded every period due to CTRL[LDFQ] being non-zero. + */ +#define PWM_TCTRL_TRGFRQ(x) (((uint16_t)(((uint16_t)(x)) << PWM_TCTRL_TRGFRQ_SHIFT)) & PWM_TCTRL_TRGFRQ_MASK) + +#define PWM_TCTRL_PWBOT1_MASK (0x4000U) +#define PWM_TCTRL_PWBOT1_SHIFT (14U) +/*! PWBOT1 - Mux Output Trigger 1 Source Select + * 0b0..Route the PWM_OUT_TRIG1 signal to PWM_MUX_TRIG1 port. + * 0b1..Route the PWM_B output to the PWM_MUX_TRIG1 port. + */ +#define PWM_TCTRL_PWBOT1(x) (((uint16_t)(((uint16_t)(x)) << PWM_TCTRL_PWBOT1_SHIFT)) & PWM_TCTRL_PWBOT1_MASK) + +#define PWM_TCTRL_PWAOT0_MASK (0x8000U) +#define PWM_TCTRL_PWAOT0_SHIFT (15U) +/*! PWAOT0 - Mux Output Trigger 0 Source Select + * 0b0..Route the PWM_OUT_TRIG0 signal to PWM_MUX_TRIG0 port. + * 0b1..Route the PWM_A output to the PWM_MUX_TRIG0 port. + */ +#define PWM_TCTRL_PWAOT0(x) (((uint16_t)(((uint16_t)(x)) << PWM_TCTRL_PWAOT0_SHIFT)) & PWM_TCTRL_PWAOT0_MASK) +/*! @} */ + +/* The count of PWM_TCTRL */ +#define PWM_TCTRL_COUNT (3U) + +/*! @name DISMAP - Fault Disable Mapping Register 0 */ +/*! @{ */ + +#define PWM_DISMAP_DIS0A_MASK (0xFU) +#define PWM_DISMAP_DIS0A_SHIFT (0U) +/*! DIS0A - PWM_A Fault Disable Mask 0 */ +#define PWM_DISMAP_DIS0A(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS0A_SHIFT)) & PWM_DISMAP_DIS0A_MASK) + +#define PWM_DISMAP_DIS0B_MASK (0xF0U) +#define PWM_DISMAP_DIS0B_SHIFT (4U) +/*! DIS0B - PWM_B Fault Disable Mask 0 */ +#define PWM_DISMAP_DIS0B(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS0B_SHIFT)) & PWM_DISMAP_DIS0B_MASK) + +#define PWM_DISMAP_DIS0X_MASK (0xF00U) +#define PWM_DISMAP_DIS0X_SHIFT (8U) +/*! DIS0X - PWM_X Fault Disable Mask 0 */ +#define PWM_DISMAP_DIS0X(x) (((uint16_t)(((uint16_t)(x)) << PWM_DISMAP_DIS0X_SHIFT)) & PWM_DISMAP_DIS0X_MASK) +/*! @} */ + +/* The count of PWM_DISMAP */ +#define PWM_DISMAP_COUNT (3U) + +/* The count of PWM_DISMAP */ +#define PWM_DISMAP_COUNT2 (1U) + +/*! @name DTCNT0 - Deadtime Count Register 0 */ +/*! @{ */ + +#define PWM_DTCNT0_DTCNT0_MASK (0x7FFU) +#define PWM_DTCNT0_DTCNT0_SHIFT (0U) +/*! DTCNT0 - Deadtime Count Register 0 */ +#define PWM_DTCNT0_DTCNT0(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTCNT0_DTCNT0_SHIFT)) & PWM_DTCNT0_DTCNT0_MASK) +/*! @} */ + +/* The count of PWM_DTCNT0 */ +#define PWM_DTCNT0_COUNT (3U) + +/*! @name DTCNT1 - Deadtime Count Register 1 */ +/*! @{ */ + +#define PWM_DTCNT1_DTCNT1_MASK (0x7FFU) +#define PWM_DTCNT1_DTCNT1_SHIFT (0U) +/*! DTCNT1 - Deadtime Count Register 1 */ +#define PWM_DTCNT1_DTCNT1(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTCNT1_DTCNT1_SHIFT)) & PWM_DTCNT1_DTCNT1_MASK) +/*! @} */ + +/* The count of PWM_DTCNT1 */ +#define PWM_DTCNT1_COUNT (3U) + +/*! @name CAPTCTRLX - Capture Control X Register */ +/*! @{ */ + +#define PWM_CAPTCTRLX_ARMX_MASK (0x1U) +#define PWM_CAPTCTRLX_ARMX_SHIFT (0U) +/*! ARMX - Arm X + * 0b0..Input capture operation is disabled. + * 0b1..Input capture operation as specified by CAPTCTRLX[EDGXx] is enabled. + */ +#define PWM_CAPTCTRLX_ARMX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_ARMX_SHIFT)) & PWM_CAPTCTRLX_ARMX_MASK) + +#define PWM_CAPTCTRLX_ONESHOTX_MASK (0x2U) +#define PWM_CAPTCTRLX_ONESHOTX_SHIFT (1U) +/*! ONESHOTX - One Shot Mode Aux + * 0b0..Free Running + * 0b1..One Shot + */ +#define PWM_CAPTCTRLX_ONESHOTX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_ONESHOTX_SHIFT)) & PWM_CAPTCTRLX_ONESHOTX_MASK) + +#define PWM_CAPTCTRLX_EDGX0_MASK (0xCU) +#define PWM_CAPTCTRLX_EDGX0_SHIFT (2U) +/*! EDGX0 - Edge X 0 + * 0b00..Disabled + * 0b01..Capture falling edges + * 0b10..Capture rising edges + * 0b11..Capture any edge + */ +#define PWM_CAPTCTRLX_EDGX0(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_EDGX0_SHIFT)) & PWM_CAPTCTRLX_EDGX0_MASK) + +#define PWM_CAPTCTRLX_EDGX1_MASK (0x30U) +#define PWM_CAPTCTRLX_EDGX1_SHIFT (4U) +/*! EDGX1 - Edge X 1 + * 0b00..Disabled + * 0b01..Capture falling edges + * 0b10..Capture rising edges + * 0b11..Capture any edge + */ +#define PWM_CAPTCTRLX_EDGX1(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_EDGX1_SHIFT)) & PWM_CAPTCTRLX_EDGX1_MASK) + +#define PWM_CAPTCTRLX_INP_SELX_MASK (0x40U) +#define PWM_CAPTCTRLX_INP_SELX_SHIFT (6U) +/*! INP_SELX - Input Select X + * 0b0..Raw PWM_X input signal selected as source. + * 0b1..Edge Counter + */ +#define PWM_CAPTCTRLX_INP_SELX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_INP_SELX_SHIFT)) & PWM_CAPTCTRLX_INP_SELX_MASK) + +#define PWM_CAPTCTRLX_EDGCNTX_EN_MASK (0x80U) +#define PWM_CAPTCTRLX_EDGCNTX_EN_SHIFT (7U) +/*! EDGCNTX_EN - Edge Counter X Enable + * 0b0..Edge counter disabled and held in reset + * 0b1..Edge counter enabled + */ +#define PWM_CAPTCTRLX_EDGCNTX_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_EDGCNTX_EN_SHIFT)) & PWM_CAPTCTRLX_EDGCNTX_EN_MASK) + +#define PWM_CAPTCTRLX_CFXWM_MASK (0x300U) +#define PWM_CAPTCTRLX_CFXWM_SHIFT (8U) +/*! CFXWM - Capture X FIFOs Water Mark */ +#define PWM_CAPTCTRLX_CFXWM(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_CFXWM_SHIFT)) & PWM_CAPTCTRLX_CFXWM_MASK) + +#define PWM_CAPTCTRLX_CX0CNT_MASK (0x1C00U) +#define PWM_CAPTCTRLX_CX0CNT_SHIFT (10U) +/*! CX0CNT - Capture X0 FIFO Word Count */ +#define PWM_CAPTCTRLX_CX0CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_CX0CNT_SHIFT)) & PWM_CAPTCTRLX_CX0CNT_MASK) + +#define PWM_CAPTCTRLX_CX1CNT_MASK (0xE000U) +#define PWM_CAPTCTRLX_CX1CNT_SHIFT (13U) +/*! CX1CNT - Capture X1 FIFO Word Count */ +#define PWM_CAPTCTRLX_CX1CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCTRLX_CX1CNT_SHIFT)) & PWM_CAPTCTRLX_CX1CNT_MASK) +/*! @} */ + +/* The count of PWM_CAPTCTRLX */ +#define PWM_CAPTCTRLX_COUNT (3U) + +/*! @name CAPTCOMPX - Capture Compare X Register */ +/*! @{ */ + +#define PWM_CAPTCOMPX_EDGCMPX_MASK (0xFFU) +#define PWM_CAPTCOMPX_EDGCMPX_SHIFT (0U) +/*! EDGCMPX - Edge Compare X */ +#define PWM_CAPTCOMPX_EDGCMPX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCOMPX_EDGCMPX_SHIFT)) & PWM_CAPTCOMPX_EDGCMPX_MASK) + +#define PWM_CAPTCOMPX_EDGCNTX_MASK (0xFF00U) +#define PWM_CAPTCOMPX_EDGCNTX_SHIFT (8U) +/*! EDGCNTX - Edge Counter X */ +#define PWM_CAPTCOMPX_EDGCNTX(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTCOMPX_EDGCNTX_SHIFT)) & PWM_CAPTCOMPX_EDGCNTX_MASK) +/*! @} */ + +/* The count of PWM_CAPTCOMPX */ +#define PWM_CAPTCOMPX_COUNT (3U) + +/*! @name CVAL0 - Capture Value 0 Register */ +/*! @{ */ + +#define PWM_CVAL0_CAPTVAL0_MASK (0xFFFFU) +#define PWM_CVAL0_CAPTVAL0_SHIFT (0U) +/*! CAPTVAL0 - Capture Value 0 */ +#define PWM_CVAL0_CAPTVAL0(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL0_CAPTVAL0_SHIFT)) & PWM_CVAL0_CAPTVAL0_MASK) +/*! @} */ + +/* The count of PWM_CVAL0 */ +#define PWM_CVAL0_COUNT (3U) + +/*! @name CVAL0CYC - Capture Value 0 Cycle Register */ +/*! @{ */ + +#define PWM_CVAL0CYC_CVAL0CYC_MASK (0xFU) +#define PWM_CVAL0CYC_CVAL0CYC_SHIFT (0U) +/*! CVAL0CYC - Capture Value 0 Cycle */ +#define PWM_CVAL0CYC_CVAL0CYC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL0CYC_CVAL0CYC_SHIFT)) & PWM_CVAL0CYC_CVAL0CYC_MASK) +/*! @} */ + +/* The count of PWM_CVAL0CYC */ +#define PWM_CVAL0CYC_COUNT (3U) + +/*! @name CVAL1 - Capture Value 1 Register */ +/*! @{ */ + +#define PWM_CVAL1_CAPTVAL1_MASK (0xFFFFU) +#define PWM_CVAL1_CAPTVAL1_SHIFT (0U) +/*! CAPTVAL1 - Capture Value 1 */ +#define PWM_CVAL1_CAPTVAL1(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL1_CAPTVAL1_SHIFT)) & PWM_CVAL1_CAPTVAL1_MASK) +/*! @} */ + +/* The count of PWM_CVAL1 */ +#define PWM_CVAL1_COUNT (3U) + +/*! @name CVAL1CYC - Capture Value 1 Cycle Register */ +/*! @{ */ + +#define PWM_CVAL1CYC_CVAL1CYC_MASK (0xFU) +#define PWM_CVAL1CYC_CVAL1CYC_SHIFT (0U) +/*! CVAL1CYC - Capture Value 1 Cycle */ +#define PWM_CVAL1CYC_CVAL1CYC(x) (((uint16_t)(((uint16_t)(x)) << PWM_CVAL1CYC_CVAL1CYC_SHIFT)) & PWM_CVAL1CYC_CVAL1CYC_MASK) +/*! @} */ + +/* The count of PWM_CVAL1CYC */ +#define PWM_CVAL1CYC_COUNT (3U) + +/*! @name PHASEDLY - Phase Delay Register */ +/*! @{ */ + +#define PWM_PHASEDLY_PHASEDLY_MASK (0xFFFFU) +#define PWM_PHASEDLY_PHASEDLY_SHIFT (0U) +/*! PHASEDLY - Initial Count Register Bits */ +#define PWM_PHASEDLY_PHASEDLY(x) (((uint16_t)(((uint16_t)(x)) << PWM_PHASEDLY_PHASEDLY_SHIFT)) & PWM_PHASEDLY_PHASEDLY_MASK) +/*! @} */ + +/* The count of PWM_PHASEDLY */ +#define PWM_PHASEDLY_COUNT (3U) + +/*! @name CAPTFILTX - Capture PWM_X Input Filter Register */ +/*! @{ */ + +#define PWM_CAPTFILTX_CAPTX_FILT_PER_MASK (0xFFU) +#define PWM_CAPTFILTX_CAPTX_FILT_PER_SHIFT (0U) +/*! CAPTX_FILT_PER - Input Capture Filter Period */ +#define PWM_CAPTFILTX_CAPTX_FILT_PER(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTFILTX_CAPTX_FILT_PER_SHIFT)) & PWM_CAPTFILTX_CAPTX_FILT_PER_MASK) + +#define PWM_CAPTFILTX_CAPTX_FILT_CNT_MASK (0x700U) +#define PWM_CAPTFILTX_CAPTX_FILT_CNT_SHIFT (8U) +/*! CAPTX_FILT_CNT - Input Capture Filter Count */ +#define PWM_CAPTFILTX_CAPTX_FILT_CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_CAPTFILTX_CAPTX_FILT_CNT_SHIFT)) & PWM_CAPTFILTX_CAPTX_FILT_CNT_MASK) +/*! @} */ + +/* The count of PWM_CAPTFILTX */ +#define PWM_CAPTFILTX_COUNT (3U) + +/*! @name OUTEN - Output Enable Register */ +/*! @{ */ + +#define PWM_OUTEN_PWMX_EN_MASK (0x7U) +#define PWM_OUTEN_PWMX_EN_SHIFT (0U) +/*! PWMX_EN - PWM_X Output Enables */ +#define PWM_OUTEN_PWMX_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OUTEN_PWMX_EN_SHIFT)) & PWM_OUTEN_PWMX_EN_MASK) + +#define PWM_OUTEN_PWMB_EN_MASK (0x70U) +#define PWM_OUTEN_PWMB_EN_SHIFT (4U) +/*! PWMB_EN - PWM_B Output Enables */ +#define PWM_OUTEN_PWMB_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OUTEN_PWMB_EN_SHIFT)) & PWM_OUTEN_PWMB_EN_MASK) + +#define PWM_OUTEN_PWMA_EN_MASK (0x700U) +#define PWM_OUTEN_PWMA_EN_SHIFT (8U) +/*! PWMA_EN - PWM_A Output Enables */ +#define PWM_OUTEN_PWMA_EN(x) (((uint16_t)(((uint16_t)(x)) << PWM_OUTEN_PWMA_EN_SHIFT)) & PWM_OUTEN_PWMA_EN_MASK) +/*! @} */ + +/*! @name MASK - Mask Register */ +/*! @{ */ + +#define PWM_MASK_MASKX_MASK (0x7U) +#define PWM_MASK_MASKX_SHIFT (0U) +/*! MASKX - PWM_X Masks */ +#define PWM_MASK_MASKX(x) (((uint16_t)(((uint16_t)(x)) << PWM_MASK_MASKX_SHIFT)) & PWM_MASK_MASKX_MASK) + +#define PWM_MASK_MASKB_MASK (0x70U) +#define PWM_MASK_MASKB_SHIFT (4U) +/*! MASKB - PWM_B Masks */ +#define PWM_MASK_MASKB(x) (((uint16_t)(((uint16_t)(x)) << PWM_MASK_MASKB_SHIFT)) & PWM_MASK_MASKB_MASK) + +#define PWM_MASK_MASKA_MASK (0x700U) +#define PWM_MASK_MASKA_SHIFT (8U) +/*! MASKA - PWM_A Masks */ +#define PWM_MASK_MASKA(x) (((uint16_t)(((uint16_t)(x)) << PWM_MASK_MASKA_SHIFT)) & PWM_MASK_MASKA_MASK) + +#define PWM_MASK_UPDATE_MASK_MASK (0x7000U) +#define PWM_MASK_UPDATE_MASK_SHIFT (12U) +/*! UPDATE_MASK - Update Mask Bits Immediately */ +#define PWM_MASK_UPDATE_MASK(x) (((uint16_t)(((uint16_t)(x)) << PWM_MASK_UPDATE_MASK_SHIFT)) & PWM_MASK_UPDATE_MASK_MASK) +/*! @} */ + +/*! @name SWCOUT - Software Controlled Output Register */ +/*! @{ */ + +#define PWM_SWCOUT_SM0OUT45_MASK (0x1U) +#define PWM_SWCOUT_SM0OUT45_SHIFT (0U) +/*! SM0OUT45 - Submodule 0 Software Controlled Output 45 + * 0b0..A logic 0 is supplied to the deadtime generator of submodule 0 instead of PWM45. + * 0b1..A logic 1 is supplied to the deadtime generator of submodule 0 instead of PWM45. + */ +#define PWM_SWCOUT_SM0OUT45(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM0OUT45_SHIFT)) & PWM_SWCOUT_SM0OUT45_MASK) + +#define PWM_SWCOUT_SM0OUT23_MASK (0x2U) +#define PWM_SWCOUT_SM0OUT23_SHIFT (1U) +/*! SM0OUT23 - Submodule 0 Software Controlled Output 23 + * 0b0..A logic 0 is supplied to the deadtime generator of submodule 0 instead of PWM23. + * 0b1..A logic 1 is supplied to the deadtime generator of submodule 0 instead of PWM23. + */ +#define PWM_SWCOUT_SM0OUT23(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM0OUT23_SHIFT)) & PWM_SWCOUT_SM0OUT23_MASK) + +#define PWM_SWCOUT_SM1OUT45_MASK (0x4U) +#define PWM_SWCOUT_SM1OUT45_SHIFT (2U) +/*! SM1OUT45 - Submodule 1 Software Controlled Output 45 + * 0b0..A logic 0 is supplied to the deadtime generator of submodule 1 instead of PWM45. + * 0b1..A logic 1 is supplied to the deadtime generator of submodule 1 instead of PWM45. + */ +#define PWM_SWCOUT_SM1OUT45(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM1OUT45_SHIFT)) & PWM_SWCOUT_SM1OUT45_MASK) + +#define PWM_SWCOUT_SM1OUT23_MASK (0x8U) +#define PWM_SWCOUT_SM1OUT23_SHIFT (3U) +/*! SM1OUT23 - Submodule 1 Software Controlled Output 23 + * 0b0..A logic 0 is supplied to the deadtime generator of submodule 1 instead of PWM23. + * 0b1..A logic 1 is supplied to the deadtime generator of submodule 1 instead of PWM23. + */ +#define PWM_SWCOUT_SM1OUT23(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM1OUT23_SHIFT)) & PWM_SWCOUT_SM1OUT23_MASK) + +#define PWM_SWCOUT_SM2OUT45_MASK (0x10U) +#define PWM_SWCOUT_SM2OUT45_SHIFT (4U) +/*! SM2OUT45 - Submodule 2 Software Controlled Output 45 + * 0b0..A logic 0 is supplied to the deadtime generator of submodule 2 instead of PWM45. + * 0b1..A logic 1 is supplied to the deadtime generator of submodule 2 instead of PWM45. + */ +#define PWM_SWCOUT_SM2OUT45(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM2OUT45_SHIFT)) & PWM_SWCOUT_SM2OUT45_MASK) + +#define PWM_SWCOUT_SM2OUT23_MASK (0x20U) +#define PWM_SWCOUT_SM2OUT23_SHIFT (5U) +/*! SM2OUT23 - Submodule 2 Software Controlled Output 23 + * 0b0..A logic 0 is supplied to the deadtime generator of submodule 2 instead of PWM23. + * 0b1..A logic 1 is supplied to the deadtime generator of submodule 2 instead of PWM23. + */ +#define PWM_SWCOUT_SM2OUT23(x) (((uint16_t)(((uint16_t)(x)) << PWM_SWCOUT_SM2OUT23_SHIFT)) & PWM_SWCOUT_SM2OUT23_MASK) +/*! @} */ + +/*! @name DTSRCSEL - PWM Source Select Register */ +/*! @{ */ + +#define PWM_DTSRCSEL_SM0SEL45_MASK (0x3U) +#define PWM_DTSRCSEL_SM0SEL45_SHIFT (0U) +/*! SM0SEL45 - Submodule 0 PWM45 Control Select + * 0b00..Generated SM0PWM45 signal used by the deadtime logic. + * 0b01..Inverted generated SM0PWM45 signal used by the deadtime logic. + * 0b10..SWCOUT[SM0OUT45] used by the deadtime logic. + * 0b11..Reserved + */ +#define PWM_DTSRCSEL_SM0SEL45(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM0SEL45_SHIFT)) & PWM_DTSRCSEL_SM0SEL45_MASK) + +#define PWM_DTSRCSEL_SM0SEL23_MASK (0xCU) +#define PWM_DTSRCSEL_SM0SEL23_SHIFT (2U) +/*! SM0SEL23 - Submodule 0 PWM23 Control Select + * 0b00..Generated SM0PWM23 signal used by the deadtime logic. + * 0b01..Inverted generated SM0PWM23 signal used by the deadtime logic. + * 0b10..SWCOUT[SM0OUT23] used by the deadtime logic. + * 0b11..PWM0_EXTA signal used by the deadtime logic. + */ +#define PWM_DTSRCSEL_SM0SEL23(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM0SEL23_SHIFT)) & PWM_DTSRCSEL_SM0SEL23_MASK) + +#define PWM_DTSRCSEL_SM1SEL45_MASK (0x30U) +#define PWM_DTSRCSEL_SM1SEL45_SHIFT (4U) +/*! SM1SEL45 - Submodule 1 PWM45 Control Select + * 0b00..Generated SM1PWM45 signal used by the deadtime logic. + * 0b01..Inverted generated SM1PWM45 signal used by the deadtime logic. + * 0b10..SWCOUT[SM1OUT45] used by the deadtime logic. + * 0b11..Reserved + */ +#define PWM_DTSRCSEL_SM1SEL45(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM1SEL45_SHIFT)) & PWM_DTSRCSEL_SM1SEL45_MASK) + +#define PWM_DTSRCSEL_SM1SEL23_MASK (0xC0U) +#define PWM_DTSRCSEL_SM1SEL23_SHIFT (6U) +/*! SM1SEL23 - Submodule 1 PWM23 Control Select + * 0b00..Generated SM1PWM23 signal used by the deadtime logic. + * 0b01..Inverted generated SM1PWM23 signal used by the deadtime logic. + * 0b10..SWCOUT[SM1OUT23] used by the deadtime logic. + * 0b11..PWM1_EXTA signal used by the deadtime logic. + */ +#define PWM_DTSRCSEL_SM1SEL23(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM1SEL23_SHIFT)) & PWM_DTSRCSEL_SM1SEL23_MASK) + +#define PWM_DTSRCSEL_SM2SEL45_MASK (0x300U) +#define PWM_DTSRCSEL_SM2SEL45_SHIFT (8U) +/*! SM2SEL45 - Submodule 2 PWM45 Control Select + * 0b00..Generated SM2PWM45 signal used by the deadtime logic. + * 0b01..Inverted generated SM2PWM45 signal used by the deadtime logic. + * 0b10..SWCOUT[SM2OUT45] used by the deadtime logic. + * 0b11..Reserved + */ +#define PWM_DTSRCSEL_SM2SEL45(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM2SEL45_SHIFT)) & PWM_DTSRCSEL_SM2SEL45_MASK) + +#define PWM_DTSRCSEL_SM2SEL23_MASK (0xC00U) +#define PWM_DTSRCSEL_SM2SEL23_SHIFT (10U) +/*! SM2SEL23 - Submodule 2 PWM23 Control Select + * 0b00..Generated SM2PWM23 signal used by the deadtime logic. + * 0b01..Inverted generated SM2PWM23 signal used by the deadtime logic. + * 0b10..SWCOUT[SM2OUT23] used by the deadtime logic. + * 0b11..PWM2_EXTA signal used by the deadtime logic. + */ +#define PWM_DTSRCSEL_SM2SEL23(x) (((uint16_t)(((uint16_t)(x)) << PWM_DTSRCSEL_SM2SEL23_SHIFT)) & PWM_DTSRCSEL_SM2SEL23_MASK) +/*! @} */ + +/*! @name MCTRL - Master Control Register */ +/*! @{ */ + +#define PWM_MCTRL_LDOK_MASK (0x7U) +#define PWM_MCTRL_LDOK_SHIFT (0U) +/*! LDOK - Load Okay + * 0b000..Do not load new values. + * 0b001..Load prescaler, modulus, and PWM values of the corresponding submodule. + */ +#define PWM_MCTRL_LDOK(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL_LDOK_SHIFT)) & PWM_MCTRL_LDOK_MASK) + +#define PWM_MCTRL_CLDOK_MASK (0x70U) +#define PWM_MCTRL_CLDOK_SHIFT (4U) +/*! CLDOK - Clear Load Okay */ +#define PWM_MCTRL_CLDOK(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL_CLDOK_SHIFT)) & PWM_MCTRL_CLDOK_MASK) + +#define PWM_MCTRL_RUN_MASK (0x700U) +#define PWM_MCTRL_RUN_SHIFT (8U) +/*! RUN - Run + * 0b000..PWM counter is stopped, but PWM outputs hold the current state. + * 0b001..PWM counter is started in the corresponding submodule. + */ +#define PWM_MCTRL_RUN(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL_RUN_SHIFT)) & PWM_MCTRL_RUN_MASK) + +#define PWM_MCTRL_IPOL_MASK (0x7000U) +#define PWM_MCTRL_IPOL_SHIFT (12U) +/*! IPOL - Current Polarity + * 0b000..PWM23 is used to generate complementary PWM pair in the corresponding submodule. + * 0b001..PWM45 is used to generate complementary PWM pair in the corresponding submodule. + */ +#define PWM_MCTRL_IPOL(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL_IPOL_SHIFT)) & PWM_MCTRL_IPOL_MASK) +/*! @} */ + +/*! @name MCTRL2 - Master Control 2 Register */ +/*! @{ */ + +#define PWM_MCTRL2_WRPROT_MASK (0xCU) +#define PWM_MCTRL2_WRPROT_SHIFT (2U) +/*! WRPROT - Write protect + * 0b00..Write protection off (default). + * 0b01..Write protection on. + * 0b10..Write protection off and locked until chip reset. + * 0b11..Write protection on and locked until chip reset. + */ +#define PWM_MCTRL2_WRPROT(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL2_WRPROT_SHIFT)) & PWM_MCTRL2_WRPROT_MASK) + +#define PWM_MCTRL2_STRETCH_CNT_PRSC_MASK (0xC0U) +#define PWM_MCTRL2_STRETCH_CNT_PRSC_SHIFT (6U) +/*! STRETCH_CNT_PRSC - Stretch IPBus clock count prescaler for mux0_trig/mux1_trig/out0_trig/out1_trig/pwma_trig/pwmb_trig + * 0b00..Stretch count is zero, no stretch. + * 0b01..Stretch mux0_trig/mux1_trig/out0_trig/out1_trig/pwma_trig/pwmb_trig for 2 IPBus clock period. + * 0b10..Stretch mux0_trig/mux1_trig/out0_trig/out1_trig/pwma_trig/pwmb_trig for 4 IPBus clock period. + * 0b11..Stretch mux0_trig/mux1_trig/out0_trig/out1_trig/pwma_trig/pwmb_trig for 8 IPBus clock period. + */ +#define PWM_MCTRL2_STRETCH_CNT_PRSC(x) (((uint16_t)(((uint16_t)(x)) << PWM_MCTRL2_STRETCH_CNT_PRSC_SHIFT)) & PWM_MCTRL2_STRETCH_CNT_PRSC_MASK) +/*! @} */ + +/*! @name FCTRL - Fault Control Register */ +/*! @{ */ + +#define PWM_FCTRL_FIE_MASK (0xFU) +#define PWM_FCTRL_FIE_SHIFT (0U) +/*! FIE - Fault Interrupt Enables + * 0b0000..FAULTx CPU interrupt requests disabled. + * 0b0001..FAULTx CPU interrupt requests enabled. + */ +#define PWM_FCTRL_FIE(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL_FIE_SHIFT)) & PWM_FCTRL_FIE_MASK) + +#define PWM_FCTRL_FSAFE_MASK (0xF0U) +#define PWM_FCTRL_FSAFE_SHIFT (4U) +/*! FSAFE - Fault Safety Mode + * 0b0000..Normal mode. PWM outputs disabled by this fault are not enabled until FSTS[FFLAGx] is clear at the + * start of a half cycle or full cycle depending on the states of FSTS[FHALF] and FSTS[FFULL] without regard + * to the state of FSTS[FFPINx]. If neither FHALF nor FFULL is set, then the fault condition cannot be + * cleared. The PWM outputs disabled by this fault input will not be re-enabled until the actual FAULTx input + * signal de-asserts since the fault input will combinationally disable the PWM outputs (as programmed in + * DISMAPn). + * 0b0001..Safe mode. PWM outputs disabled by this fault are not enabled until FSTS[FFLAGx] is clear and + * FSTS[FFPINx] is clear at the start of a half cycle or full cycle depending on the states of FSTS[FHALF] and + * FSTS[FFULL]. If neither FHLAF nor FFULL is set, then the fault condition cannot be cleared. + */ +#define PWM_FCTRL_FSAFE(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL_FSAFE_SHIFT)) & PWM_FCTRL_FSAFE_MASK) + +#define PWM_FCTRL_FAUTO_MASK (0xF00U) +#define PWM_FCTRL_FAUTO_SHIFT (8U) +/*! FAUTO - Automatic Fault Clearing + * 0b0000..Manual fault clearing. PWM outputs disabled by this fault are not enabled until FSTS[FFLAGx] is clear + * at the start of a half cycle or full cycle depending on the states of FSTS[FHALF] and FSTS[FFULL]. If + * neither FFULL nor FHALF is set, then the fault condition cannot be cleared. This is further controlled + * by FCTRL[FSAFE]. + * 0b0001..Automatic fault clearing. PWM outputs disabled by this fault are enabled when FSTS[FFPINx] is clear at + * the start of a half cycle or full cycle depending on the states of FSTS[FHALF] and FSTS[FFULL] without + * regard to the state of FSTS[FFLAGx]. If neither FFULL nor FHALF is set, then the fault condition + * cannot be cleared. + */ +#define PWM_FCTRL_FAUTO(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL_FAUTO_SHIFT)) & PWM_FCTRL_FAUTO_MASK) + +#define PWM_FCTRL_FLVL_MASK (0xF000U) +#define PWM_FCTRL_FLVL_SHIFT (12U) +/*! FLVL - Fault Level + * 0b0000..A logic 0 on the fault input indicates a fault condition. + * 0b0001..A logic 1 on the fault input indicates a fault condition. + */ +#define PWM_FCTRL_FLVL(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL_FLVL_SHIFT)) & PWM_FCTRL_FLVL_MASK) +/*! @} */ + +/*! @name FSTS - Fault Status Register */ +/*! @{ */ + +#define PWM_FSTS_FFLAG_MASK (0xFU) +#define PWM_FSTS_FFLAG_SHIFT (0U) +/*! FFLAG - Fault Flags + * 0b0000..No fault on the FAULTx pin. + * 0b0001..Fault on the FAULTx pin. + */ +#define PWM_FSTS_FFLAG(x) (((uint16_t)(((uint16_t)(x)) << PWM_FSTS_FFLAG_SHIFT)) & PWM_FSTS_FFLAG_MASK) + +#define PWM_FSTS_FFULL_MASK (0xF0U) +#define PWM_FSTS_FFULL_SHIFT (4U) +/*! FFULL - Full Cycle + * 0b0000..PWM outputs are not re-enabled at the start of a full cycle + * 0b0001..PWM outputs are re-enabled at the start of a full cycle + */ +#define PWM_FSTS_FFULL(x) (((uint16_t)(((uint16_t)(x)) << PWM_FSTS_FFULL_SHIFT)) & PWM_FSTS_FFULL_MASK) + +#define PWM_FSTS_FFPIN_MASK (0xF00U) +#define PWM_FSTS_FFPIN_SHIFT (8U) +/*! FFPIN - Filtered Fault Pins */ +#define PWM_FSTS_FFPIN(x) (((uint16_t)(((uint16_t)(x)) << PWM_FSTS_FFPIN_SHIFT)) & PWM_FSTS_FFPIN_MASK) + +#define PWM_FSTS_FHALF_MASK (0xF000U) +#define PWM_FSTS_FHALF_SHIFT (12U) +/*! FHALF - Half Cycle Fault Recovery + * 0b0000..PWM outputs are not re-enabled at the start of a half cycle. + * 0b0001..PWM outputs are re-enabled at the start of a half cycle (as defined by VAL0). + */ +#define PWM_FSTS_FHALF(x) (((uint16_t)(((uint16_t)(x)) << PWM_FSTS_FHALF_SHIFT)) & PWM_FSTS_FHALF_MASK) +/*! @} */ + +/*! @name FFILT - Fault Filter Register */ +/*! @{ */ + +#define PWM_FFILT_FILT_PER_MASK (0xFFU) +#define PWM_FFILT_FILT_PER_SHIFT (0U) +/*! FILT_PER - Fault Filter Period */ +#define PWM_FFILT_FILT_PER(x) (((uint16_t)(((uint16_t)(x)) << PWM_FFILT_FILT_PER_SHIFT)) & PWM_FFILT_FILT_PER_MASK) + +#define PWM_FFILT_FILT_CNT_MASK (0x700U) +#define PWM_FFILT_FILT_CNT_SHIFT (8U) +/*! FILT_CNT - Fault Filter Count */ +#define PWM_FFILT_FILT_CNT(x) (((uint16_t)(((uint16_t)(x)) << PWM_FFILT_FILT_CNT_SHIFT)) & PWM_FFILT_FILT_CNT_MASK) + +#define PWM_FFILT_GSTR_MASK (0x8000U) +#define PWM_FFILT_GSTR_SHIFT (15U) +/*! GSTR - Fault Glitch Stretch Enable + * 0b0..Fault input glitch stretching is disabled. + * 0b1..Input fault signals are stretched to at least 2 IPBus clock cycles. + */ +#define PWM_FFILT_GSTR(x) (((uint16_t)(((uint16_t)(x)) << PWM_FFILT_GSTR_SHIFT)) & PWM_FFILT_GSTR_MASK) +/*! @} */ + +/*! @name FTST - Fault Test Register */ +/*! @{ */ + +#define PWM_FTST_FTEST_MASK (0x1U) +#define PWM_FTST_FTEST_SHIFT (0U) +/*! FTEST - Fault Test + * 0b0..No fault + * 0b1..Cause a simulated fault + */ +#define PWM_FTST_FTEST(x) (((uint16_t)(((uint16_t)(x)) << PWM_FTST_FTEST_SHIFT)) & PWM_FTST_FTEST_MASK) +/*! @} */ + +/*! @name FCTRL2 - Fault Control 2 Register */ +/*! @{ */ + +#define PWM_FCTRL2_NOCOMB_MASK (0xFU) +#define PWM_FCTRL2_NOCOMB_SHIFT (0U) +/*! NOCOMB - No Combinational Path From Fault Input To PWM Output + * 0b0000..There is a combinational link from the fault inputs to the PWM outputs. The fault inputs are combined + * with the filtered and latched fault signals to disable the PWM outputs. + * 0b0001..The direct combinational path from the fault inputs to the PWM outputs is disabled and the filtered + * and latched fault signals are used to disable the PWM outputs. + */ +#define PWM_FCTRL2_NOCOMB(x) (((uint16_t)(((uint16_t)(x)) << PWM_FCTRL2_NOCOMB_SHIFT)) & PWM_FCTRL2_NOCOMB_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group PWM_Register_Masks */ + + +/* PWM - Peripheral instance base addresses */ +/** Peripheral FLEXPWM0 base address */ +#define FLEXPWM0_BASE (0x400A9000u) +/** Peripheral FLEXPWM0 base pointer */ +#define FLEXPWM0 ((PWM_Type *)FLEXPWM0_BASE) +/** Peripheral FLEXPWM1 base address */ +#define FLEXPWM1_BASE (0x400AA000u) +/** Peripheral FLEXPWM1 base pointer */ +#define FLEXPWM1 ((PWM_Type *)FLEXPWM1_BASE) +/** Array initializer of PWM peripheral base addresses */ +#define PWM_BASE_ADDRS { FLEXPWM0_BASE, FLEXPWM1_BASE } +/** Array initializer of PWM peripheral base pointers */ +#define PWM_BASE_PTRS { FLEXPWM0, FLEXPWM1 } +/** Interrupt vectors for the PWM peripheral type */ +#define PWM_CMP_IRQS { { FLEXPWM0_SUBMODULE0_IRQn, FLEXPWM0_SUBMODULE1_IRQn, FLEXPWM0_SUBMODULE2_IRQn }, { FLEXPWM1_SUBMODULE0_IRQn, FLEXPWM1_SUBMODULE1_IRQn, FLEXPWM1_SUBMODULE2_IRQn } } +#define PWM_RELOAD_IRQS { { FLEXPWM0_SUBMODULE0_IRQn, FLEXPWM0_SUBMODULE1_IRQn, FLEXPWM0_SUBMODULE2_IRQn }, { FLEXPWM1_SUBMODULE0_IRQn, FLEXPWM1_SUBMODULE1_IRQn, FLEXPWM1_SUBMODULE2_IRQn } } +#define PWM_CAPTURE_IRQS { { FLEXPWM0_SUBMODULE0_IRQn, FLEXPWM0_SUBMODULE1_IRQn, FLEXPWM0_SUBMODULE2_IRQn }, { FLEXPWM1_SUBMODULE0_IRQn, FLEXPWM1_SUBMODULE1_IRQn, FLEXPWM1_SUBMODULE2_IRQn } } +#define PWM_FAULT_IRQS { FLEXPWM0_FAULT_IRQn, FLEXPWM1_FAULT_IRQn } +#define PWM_RELOAD_ERROR_IRQS { FLEXPWM0_RELOAD_ERROR_IRQn, FLEXPWM1_RELOAD_ERROR_IRQn } + +/*! + * @} + */ /* end of group PWM_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- SCG Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SCG_Peripheral_Access_Layer SCG Peripheral Access Layer + * @{ + */ + +/** SCG - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID Register, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter Register, offset: 0x4 */ + __IO uint32_t TRIM_LOCK; /**< Trim Lock register, offset: 0x8 */ + uint8_t RESERVED_0[4]; + __I uint32_t CSR; /**< Clock Status Register, offset: 0x10 */ + __IO uint32_t RCCR; /**< Run Clock Control Register, offset: 0x14 */ + uint8_t RESERVED_1[232]; + __IO uint32_t SOSCCSR; /**< SOSC Control Status Register, offset: 0x100 */ + uint8_t RESERVED_2[4]; + __IO uint32_t SOSCCFG; /**< SOSC Configuration Register, offset: 0x108 */ + uint8_t RESERVED_3[244]; + __IO uint32_t SIRCCSR; /**< SIRC Control Status Register, offset: 0x200 */ + uint8_t RESERVED_4[8]; + __IO uint32_t SIRCTCFG; /**< SIRC Trim Configuration Register, offset: 0x20C */ + __IO uint32_t SIRCTRIM; /**< SIRC Trim Register, offset: 0x210 */ + uint8_t RESERVED_5[4]; + __IO uint32_t SIRCSTAT; /**< SIRC Auto-trimming Status Register, offset: 0x218 */ + uint8_t RESERVED_6[228]; + __IO uint32_t FIRCCSR; /**< FIRC Control Status Register, offset: 0x300 */ + uint8_t RESERVED_7[4]; + __IO uint32_t FIRCCFG; /**< FIRC Configuration Register, offset: 0x308 */ + __IO uint32_t FIRCTCFG; /**< FIRC Trim Configuration Register, offset: 0x30C */ + __IO uint32_t FIRCTRIM; /**< FIRC Trim Register, offset: 0x310 */ + uint8_t RESERVED_8[4]; + __IO uint32_t FIRCSTAT; /**< FIRC Auto-trimming Status Register, offset: 0x318 */ + __IO uint32_t FIRCATC1; /**< FIRC Auto-trimming Counter 1, offset: 0x31C */ + __IO uint32_t FIRCATC2; /**< FIRC Auto-trimming Counter 2, offset: 0x320 */ + __IO uint32_t FIRCATC3; /**< FIRC Auto-trimming Counter 2, offset: 0x324 */ + uint8_t RESERVED_9[216]; + __IO uint32_t ROSCCSR; /**< ROSC Control Status Register, offset: 0x400 */ +} SCG_Type; + +/* ---------------------------------------------------------------------------- + -- SCG Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SCG_Register_Masks SCG Register Masks + * @{ + */ + +/*! @name VERID - Version ID Register */ +/*! @{ */ + +#define SCG_VERID_VERSION_MASK (0xFFFFFFFFU) +#define SCG_VERID_VERSION_SHIFT (0U) +/*! VERSION - SCG Version Number */ +#define SCG_VERID_VERSION(x) (((uint32_t)(((uint32_t)(x)) << SCG_VERID_VERSION_SHIFT)) & SCG_VERID_VERSION_MASK) +/*! @} */ + +/*! @name PARAM - Parameter Register */ +/*! @{ */ + +#define SCG_PARAM_SOSCCLKPRES_MASK (0x2U) +#define SCG_PARAM_SOSCCLKPRES_SHIFT (1U) +/*! SOSCCLKPRES - SOSC Clock Present + * 0b1..SOSC clock source is present + * 0b0..SOSC clock source is not present + */ +#define SCG_PARAM_SOSCCLKPRES(x) (((uint32_t)(((uint32_t)(x)) << SCG_PARAM_SOSCCLKPRES_SHIFT)) & SCG_PARAM_SOSCCLKPRES_MASK) + +#define SCG_PARAM_SIRCCLKPRES_MASK (0x4U) +#define SCG_PARAM_SIRCCLKPRES_SHIFT (2U) +/*! SIRCCLKPRES - SIRC Clock Present + * 0b1..SIRC clock source is present + * 0b0..SIRC clock source is not present + */ +#define SCG_PARAM_SIRCCLKPRES(x) (((uint32_t)(((uint32_t)(x)) << SCG_PARAM_SIRCCLKPRES_SHIFT)) & SCG_PARAM_SIRCCLKPRES_MASK) + +#define SCG_PARAM_FIRCCLKPRES_MASK (0x8U) +#define SCG_PARAM_FIRCCLKPRES_SHIFT (3U) +/*! FIRCCLKPRES - FIRC Clock Present + * 0b1..FIRC clock source is present + * 0b0..FIRC clock source is not present + */ +#define SCG_PARAM_FIRCCLKPRES(x) (((uint32_t)(((uint32_t)(x)) << SCG_PARAM_FIRCCLKPRES_SHIFT)) & SCG_PARAM_FIRCCLKPRES_MASK) + +#define SCG_PARAM_ROSCCLKPRES_MASK (0x10U) +#define SCG_PARAM_ROSCCLKPRES_SHIFT (4U) +/*! ROSCCLKPRES - ROSC Clock Present + * 0b1..ROSC clock source is present + * 0b0..ROSC clock source is not present + */ +#define SCG_PARAM_ROSCCLKPRES(x) (((uint32_t)(((uint32_t)(x)) << SCG_PARAM_ROSCCLKPRES_SHIFT)) & SCG_PARAM_ROSCCLKPRES_MASK) +/*! @} */ + +/*! @name TRIM_LOCK - Trim Lock register */ +/*! @{ */ + +#define SCG_TRIM_LOCK_TRIM_UNLOCK_MASK (0x1U) +#define SCG_TRIM_LOCK_TRIM_UNLOCK_SHIFT (0U) +/*! TRIM_UNLOCK - TRIM_UNLOCK + * 0b0..SCG Trim Registers locked and not writable. + * 0b1..SCG Trim registers unlocked and writable. + */ +#define SCG_TRIM_LOCK_TRIM_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << SCG_TRIM_LOCK_TRIM_UNLOCK_SHIFT)) & SCG_TRIM_LOCK_TRIM_UNLOCK_MASK) + +#define SCG_TRIM_LOCK_IFR_DISABLE_MASK (0x2U) +#define SCG_TRIM_LOCK_IFR_DISABLE_SHIFT (1U) +/*! IFR_DISABLE - IFR_DISABLE + * 0b0..IFR write access to SCG trim registers not disabled. The SCG Trim registers are reprogrammed with the IFR values after any system reset. + * 0b1..IFR write access to SCG trim registers during system reset is blocked. + */ +#define SCG_TRIM_LOCK_IFR_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << SCG_TRIM_LOCK_IFR_DISABLE_SHIFT)) & SCG_TRIM_LOCK_IFR_DISABLE_MASK) + +#define SCG_TRIM_LOCK_TRIM_LOCK_KEY_MASK (0xFFFF0000U) +#define SCG_TRIM_LOCK_TRIM_LOCK_KEY_SHIFT (16U) +/*! TRIM_LOCK_KEY - TRIM_LOCK_KEY */ +#define SCG_TRIM_LOCK_TRIM_LOCK_KEY(x) (((uint32_t)(((uint32_t)(x)) << SCG_TRIM_LOCK_TRIM_LOCK_KEY_SHIFT)) & SCG_TRIM_LOCK_TRIM_LOCK_KEY_MASK) +/*! @} */ + +/*! @name CSR - Clock Status Register */ +/*! @{ */ + +#define SCG_CSR_SCS_MASK (0x7000000U) +#define SCG_CSR_SCS_SHIFT (24U) +/*! SCS - System Clock Source + * 0b000..Reserved + * 0b001..SOSC + * 0b010..SIRC + * 0b011..FIRC + * 0b100..ROSC + * 0b101-0b111..Reserved + */ +#define SCG_CSR_SCS(x) (((uint32_t)(((uint32_t)(x)) << SCG_CSR_SCS_SHIFT)) & SCG_CSR_SCS_MASK) +/*! @} */ + +/*! @name RCCR - Run Clock Control Register */ +/*! @{ */ + +#define SCG_RCCR_SCS_MASK (0x7000000U) +#define SCG_RCCR_SCS_SHIFT (24U) +/*! SCS - System Clock Source + * 0b000..Reserved + * 0b001..SOSC + * 0b010..SIRC + * 0b011..FIRC + * 0b100..ROSC + * 0b101-0b111..Reserved + */ +#define SCG_RCCR_SCS(x) (((uint32_t)(((uint32_t)(x)) << SCG_RCCR_SCS_SHIFT)) & SCG_RCCR_SCS_MASK) +/*! @} */ + +/*! @name SOSCCSR - SOSC Control Status Register */ +/*! @{ */ + +#define SCG_SOSCCSR_SOSCEN_MASK (0x1U) +#define SCG_SOSCCSR_SOSCEN_SHIFT (0U) +/*! SOSCEN - SOSC Enable + * 0b0..SOSC is disabled + * 0b1..SOSC is enabled + */ +#define SCG_SOSCCSR_SOSCEN(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_SOSCEN_SHIFT)) & SCG_SOSCCSR_SOSCEN_MASK) + +#define SCG_SOSCCSR_SOSCSTEN_MASK (0x2U) +#define SCG_SOSCCSR_SOSCSTEN_SHIFT (1U) +/*! SOSCSTEN - SOSC Stop Enable + * 0b0..SOSC is disabled in Deep Sleep mode + * 0b1..SOSC is enabled in Deep Sleep mode only if SOSCEN is set + */ +#define SCG_SOSCCSR_SOSCSTEN(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_SOSCSTEN_SHIFT)) & SCG_SOSCCSR_SOSCSTEN_MASK) + +#define SCG_SOSCCSR_SOSCCM_MASK (0x10000U) +#define SCG_SOSCCSR_SOSCCM_SHIFT (16U) +/*! SOSCCM - SOSC Clock Monitor Enable + * 0b0..SOSC Clock Monitor is disabled + * 0b1..SOSC Clock Monitor is enabled + */ +#define SCG_SOSCCSR_SOSCCM(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_SOSCCM_SHIFT)) & SCG_SOSCCSR_SOSCCM_MASK) + +#define SCG_SOSCCSR_SOSCCMRE_MASK (0x20000U) +#define SCG_SOSCCSR_SOSCCMRE_SHIFT (17U) +/*! SOSCCMRE - SOSC Clock Monitor Reset Enable + * 0b0..Clock monitor generates an interrupt when an error is detected + * 0b1..Clock monitor generates a reset when an error is detected + */ +#define SCG_SOSCCSR_SOSCCMRE(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_SOSCCMRE_SHIFT)) & SCG_SOSCCSR_SOSCCMRE_MASK) + +#define SCG_SOSCCSR_LK_MASK (0x800000U) +#define SCG_SOSCCSR_LK_SHIFT (23U) +/*! LK - Lock Register + * 0b0..This Control Status Register can be written + * 0b1..This Control Status Register cannot be written + */ +#define SCG_SOSCCSR_LK(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_LK_SHIFT)) & SCG_SOSCCSR_LK_MASK) + +#define SCG_SOSCCSR_SOSCVLD_MASK (0x1000000U) +#define SCG_SOSCCSR_SOSCVLD_SHIFT (24U) +/*! SOSCVLD - SOSC Valid + * 0b0..SOSC is not enabled or clock is not valid + * 0b1..SOSC is enabled and output clock is valid + */ +#define SCG_SOSCCSR_SOSCVLD(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_SOSCVLD_SHIFT)) & SCG_SOSCCSR_SOSCVLD_MASK) + +#define SCG_SOSCCSR_SOSCSEL_MASK (0x2000000U) +#define SCG_SOSCCSR_SOSCSEL_SHIFT (25U) +/*! SOSCSEL - SOSC Selected + * 0b0..SOSC is not the system clock source + * 0b1..SOSC is the system clock source + */ +#define SCG_SOSCCSR_SOSCSEL(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_SOSCSEL_SHIFT)) & SCG_SOSCCSR_SOSCSEL_MASK) + +#define SCG_SOSCCSR_SOSCERR_MASK (0x4000000U) +#define SCG_SOSCCSR_SOSCERR_SHIFT (26U) +/*! SOSCERR - SOSC Clock Error + * 0b0..SOSC Clock Monitor is disabled or has not detected an error + * 0b1..SOSC Clock Monitor is enabled and detected an error + */ +#define SCG_SOSCCSR_SOSCERR(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_SOSCERR_SHIFT)) & SCG_SOSCCSR_SOSCERR_MASK) + +#define SCG_SOSCCSR_SOSCVLD_IE_MASK (0x40000000U) +#define SCG_SOSCCSR_SOSCVLD_IE_SHIFT (30U) +/*! SOSCVLD_IE - SOSC Valid Interrupt Enable + * 0b0..SOSCVLD interrupt is not enabled + * 0b1..SOSCVLD interrupt is enabled + */ +#define SCG_SOSCCSR_SOSCVLD_IE(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCSR_SOSCVLD_IE_SHIFT)) & SCG_SOSCCSR_SOSCVLD_IE_MASK) +/*! @} */ + +/*! @name SOSCCFG - SOSC Configuration Register */ +/*! @{ */ + +#define SCG_SOSCCFG_EREFS_MASK (0x4U) +#define SCG_SOSCCFG_EREFS_SHIFT (2U) +/*! EREFS - External Reference Select + * 0b0..External reference clock selected. + * 0b1..Internal crystal oscillator of OSC selected. + */ +#define SCG_SOSCCFG_EREFS(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCFG_EREFS_SHIFT)) & SCG_SOSCCFG_EREFS_MASK) + +#define SCG_SOSCCFG_RANGE_MASK (0x30U) +#define SCG_SOSCCFG_RANGE_SHIFT (4U) +/*! RANGE - SOSC Range Select + * 0b00..Frequency range select of 8-16 MHz. + * 0b01..Frequency range select of 16-25 MHz. + * 0b10..Frequency range select of 25-40 MHz. + * 0b11..Frequency range select of 40-50 MHz. + */ +#define SCG_SOSCCFG_RANGE(x) (((uint32_t)(((uint32_t)(x)) << SCG_SOSCCFG_RANGE_SHIFT)) & SCG_SOSCCFG_RANGE_MASK) +/*! @} */ + +/*! @name SIRCCSR - SIRC Control Status Register */ +/*! @{ */ + +#define SCG_SIRCCSR_SIRCSTEN_MASK (0x2U) +#define SCG_SIRCCSR_SIRCSTEN_SHIFT (1U) +/*! SIRCSTEN - SIRC Stop Enable + * 0b0..SIRC is disabled in Deep Sleep mode + * 0b1..SIRC is enabled in Deep Sleep mode + */ +#define SCG_SIRCCSR_SIRCSTEN(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_SIRCSTEN_SHIFT)) & SCG_SIRCCSR_SIRCSTEN_MASK) + +#define SCG_SIRCCSR_SIRC_CLK_PERIPH_EN_MASK (0x20U) +#define SCG_SIRCCSR_SIRC_CLK_PERIPH_EN_SHIFT (5U) +/*! SIRC_CLK_PERIPH_EN - SIRC Clock to Peripherals Enable + * 0b0..SIRC clock to peripherals is disabled + * 0b1..SIRC clock to peripherals is enabled + */ +#define SCG_SIRCCSR_SIRC_CLK_PERIPH_EN(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_SIRC_CLK_PERIPH_EN_SHIFT)) & SCG_SIRCCSR_SIRC_CLK_PERIPH_EN_MASK) + +#define SCG_SIRCCSR_SIRCTREN_MASK (0x100U) +#define SCG_SIRCCSR_SIRCTREN_SHIFT (8U) +/*! SIRCTREN - SIRC 12 MHz Trim Enable (SIRCCFG[RANGE]=1) + * 0b0..Disables trimming SIRC to an external clock source + * 0b1..Enables trimming SIRC to an external clock source + */ +#define SCG_SIRCCSR_SIRCTREN(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_SIRCTREN_SHIFT)) & SCG_SIRCCSR_SIRCTREN_MASK) + +#define SCG_SIRCCSR_SIRCTRUP_MASK (0x200U) +#define SCG_SIRCCSR_SIRCTRUP_SHIFT (9U) +/*! SIRCTRUP - SIRC Trim Update + * 0b0..Disables SIRC trimming updates + * 0b1..Enables SIRC trimming updates + */ +#define SCG_SIRCCSR_SIRCTRUP(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_SIRCTRUP_SHIFT)) & SCG_SIRCCSR_SIRCTRUP_MASK) + +#define SCG_SIRCCSR_TRIM_LOCK_MASK (0x400U) +#define SCG_SIRCCSR_TRIM_LOCK_SHIFT (10U) +/*! TRIM_LOCK - SIRC TRIM LOCK + * 0b0..SIRC auto trim not locked to target frequency range + * 0b1..SIRC auto trim locked to target frequency range + */ +#define SCG_SIRCCSR_TRIM_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_TRIM_LOCK_SHIFT)) & SCG_SIRCCSR_TRIM_LOCK_MASK) + +#define SCG_SIRCCSR_COARSE_TRIM_BYPASS_MASK (0x800U) +#define SCG_SIRCCSR_COARSE_TRIM_BYPASS_SHIFT (11U) +/*! COARSE_TRIM_BYPASS - Coarse Auto Trim Bypass + * 0b0..SIRC Coarse Auto Trim NOT Bypassed + * 0b1..SIRC Coarse Auto Trim Bypassed + */ +#define SCG_SIRCCSR_COARSE_TRIM_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_COARSE_TRIM_BYPASS_SHIFT)) & SCG_SIRCCSR_COARSE_TRIM_BYPASS_MASK) + +#define SCG_SIRCCSR_LK_MASK (0x800000U) +#define SCG_SIRCCSR_LK_SHIFT (23U) +/*! LK - Lock Register + * 0b0..Control Status Register can be written + * 0b1..Control Status Register cannot be written + */ +#define SCG_SIRCCSR_LK(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_LK_SHIFT)) & SCG_SIRCCSR_LK_MASK) + +#define SCG_SIRCCSR_SIRCVLD_MASK (0x1000000U) +#define SCG_SIRCCSR_SIRCVLD_SHIFT (24U) +/*! SIRCVLD - SIRC Valid + * 0b0..SIRC is not enabled or clock is not valid + * 0b1..SIRC is enabled and output clock is valid + */ +#define SCG_SIRCCSR_SIRCVLD(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_SIRCVLD_SHIFT)) & SCG_SIRCCSR_SIRCVLD_MASK) + +#define SCG_SIRCCSR_SIRCSEL_MASK (0x2000000U) +#define SCG_SIRCCSR_SIRCSEL_SHIFT (25U) +/*! SIRCSEL - SIRC Selected + * 0b0..SIRC is not the system clock source + * 0b1..SIRC is the system clock source + */ +#define SCG_SIRCCSR_SIRCSEL(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_SIRCSEL_SHIFT)) & SCG_SIRCCSR_SIRCSEL_MASK) + +#define SCG_SIRCCSR_SIRCERR_MASK (0x4000000U) +#define SCG_SIRCCSR_SIRCERR_SHIFT (26U) +/*! SIRCERR - SIRC Clock Error + * 0b0..Error not detected with the SIRC trimming + * 0b1..Error detected with the SIRC trimming + */ +#define SCG_SIRCCSR_SIRCERR(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_SIRCERR_SHIFT)) & SCG_SIRCCSR_SIRCERR_MASK) + +#define SCG_SIRCCSR_SIRCERR_IE_MASK (0x8000000U) +#define SCG_SIRCCSR_SIRCERR_IE_SHIFT (27U) +/*! SIRCERR_IE - SIRC Clock Error Interrupt Enable + * 0b0..SIRCERR interrupt is not enabled + * 0b1..SIRCERR interrupt is enabled + */ +#define SCG_SIRCCSR_SIRCERR_IE(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCCSR_SIRCERR_IE_SHIFT)) & SCG_SIRCCSR_SIRCERR_IE_MASK) +/*! @} */ + +/*! @name SIRCTCFG - SIRC Trim Configuration Register */ +/*! @{ */ + +#define SCG_SIRCTCFG_TRIMSRC_MASK (0x3U) +#define SCG_SIRCTCFG_TRIMSRC_SHIFT (0U) +/*! TRIMSRC - Trim Source + * 0b00..Reserved + * 0b01..Reserved + * 0b10..SOSC. This option requires that SOSC be divided using the TRIMDIV field to get a frequency of 1 MHz. + * 0b11..Reserved + */ +#define SCG_SIRCTCFG_TRIMSRC(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCTCFG_TRIMSRC_SHIFT)) & SCG_SIRCTCFG_TRIMSRC_MASK) + +#define SCG_SIRCTCFG_TRIMDIV_MASK (0x7F0000U) +#define SCG_SIRCTCFG_TRIMDIV_SHIFT (16U) +/*! TRIMDIV - SIRC Trim Pre-divider */ +#define SCG_SIRCTCFG_TRIMDIV(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCTCFG_TRIMDIV_SHIFT)) & SCG_SIRCTCFG_TRIMDIV_MASK) +/*! @} */ + +/*! @name SIRCTRIM - SIRC Trim Register */ +/*! @{ */ + +#define SCG_SIRCTRIM_CCOTRIM_MASK (0x3FU) +#define SCG_SIRCTRIM_CCOTRIM_SHIFT (0U) +/*! CCOTRIM - CCO Trim */ +#define SCG_SIRCTRIM_CCOTRIM(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCTRIM_CCOTRIM_SHIFT)) & SCG_SIRCTRIM_CCOTRIM_MASK) + +#define SCG_SIRCTRIM_CLTRIM_MASK (0x3F00U) +#define SCG_SIRCTRIM_CLTRIM_SHIFT (8U) +/*! CLTRIM - CL Trim */ +#define SCG_SIRCTRIM_CLTRIM(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCTRIM_CLTRIM_SHIFT)) & SCG_SIRCTRIM_CLTRIM_MASK) + +#define SCG_SIRCTRIM_TCTRIM_MASK (0x1F0000U) +#define SCG_SIRCTRIM_TCTRIM_SHIFT (16U) +/*! TCTRIM - Trim Temp */ +#define SCG_SIRCTRIM_TCTRIM(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCTRIM_TCTRIM_SHIFT)) & SCG_SIRCTRIM_TCTRIM_MASK) + +#define SCG_SIRCTRIM_FVCHTRIM_MASK (0x1F000000U) +#define SCG_SIRCTRIM_FVCHTRIM_SHIFT (24U) +#define SCG_SIRCTRIM_FVCHTRIM(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCTRIM_FVCHTRIM_SHIFT)) & SCG_SIRCTRIM_FVCHTRIM_MASK) +/*! @} */ + +/*! @name SIRCSTAT - SIRC Auto-trimming Status Register */ +/*! @{ */ + +#define SCG_SIRCSTAT_CCOTRIM_MASK (0x3FU) +#define SCG_SIRCSTAT_CCOTRIM_SHIFT (0U) +/*! CCOTRIM - CCO Trim */ +#define SCG_SIRCSTAT_CCOTRIM(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCSTAT_CCOTRIM_SHIFT)) & SCG_SIRCSTAT_CCOTRIM_MASK) + +#define SCG_SIRCSTAT_CLTRIM_MASK (0x3F00U) +#define SCG_SIRCSTAT_CLTRIM_SHIFT (8U) +/*! CLTRIM - CL Trim */ +#define SCG_SIRCSTAT_CLTRIM(x) (((uint32_t)(((uint32_t)(x)) << SCG_SIRCSTAT_CLTRIM_SHIFT)) & SCG_SIRCSTAT_CLTRIM_MASK) +/*! @} */ + +/*! @name FIRCCSR - FIRC Control Status Register */ +/*! @{ */ + +#define SCG_FIRCCSR_FIRCEN_MASK (0x1U) +#define SCG_FIRCCSR_FIRCEN_SHIFT (0U) +/*! FIRCEN - FIRC Enable + * 0b0..FIRC is disabled + * 0b1..FIRC is enabled + */ +#define SCG_FIRCCSR_FIRCEN(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCEN_SHIFT)) & SCG_FIRCCSR_FIRCEN_MASK) + +#define SCG_FIRCCSR_FIRCSTEN_MASK (0x2U) +#define SCG_FIRCCSR_FIRCSTEN_SHIFT (1U) +/*! FIRCSTEN - FIRC Stop Enable + * 0b0..FIRC is disabled in Deep Sleep mode + * 0b1..FIRC is enabled in Deep Sleep mode + */ +#define SCG_FIRCCSR_FIRCSTEN(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCSTEN_SHIFT)) & SCG_FIRCCSR_FIRCSTEN_MASK) + +#define SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN_MASK (0x10U) +#define SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN_SHIFT (4U) +/*! FIRC_SCLK_PERIPH_EN - FIRC 48 MHz Clock to peripherals Enable + * 0b0..FIRC 48 MHz to peripherals is disabled + * 0b1..FIRC 48 MHz to peripherals is enabled + */ +#define SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN_SHIFT)) & SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN_MASK) + +#define SCG_FIRCCSR_FIRC_FCLK_PERIPH_EN_MASK (0x20U) +#define SCG_FIRCCSR_FIRC_FCLK_PERIPH_EN_SHIFT (5U) +/*! FIRC_FCLK_PERIPH_EN - FRO_HF Clock to peripherals Enable + * 0b0..FRO_HF to peripherals is disabled + * 0b1..FRO_HF to peripherals is enabled + */ +#define SCG_FIRCCSR_FIRC_FCLK_PERIPH_EN(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRC_FCLK_PERIPH_EN_SHIFT)) & SCG_FIRCCSR_FIRC_FCLK_PERIPH_EN_MASK) + +#define SCG_FIRCCSR_FIRCTREN_MASK (0x100U) +#define SCG_FIRCCSR_FIRCTREN_SHIFT (8U) +/*! FIRCTREN - FRO_HF Trim Enable + * 0b0..Disables trimming FRO_HF by an external clock source + * 0b1..Enables trimming FRO_HF by an external clock source + */ +#define SCG_FIRCCSR_FIRCTREN(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCTREN_SHIFT)) & SCG_FIRCCSR_FIRCTREN_MASK) + +#define SCG_FIRCCSR_FIRCTRUP_MASK (0x200U) +#define SCG_FIRCCSR_FIRCTRUP_SHIFT (9U) +/*! FIRCTRUP - FIRC Trim Update + * 0b0..Disables FIRC trimming updates + * 0b1..Enables FIRC trimming updates + */ +#define SCG_FIRCCSR_FIRCTRUP(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCTRUP_SHIFT)) & SCG_FIRCCSR_FIRCTRUP_MASK) + +#define SCG_FIRCCSR_TRIM_LOCK_MASK (0x400U) +#define SCG_FIRCCSR_TRIM_LOCK_SHIFT (10U) +/*! TRIM_LOCK - FIRC TRIM LOCK + * 0b0..FIRC auto trim not locked to target frequency range + * 0b1..FIRC auto trim locked to target frequency range + */ +#define SCG_FIRCCSR_TRIM_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_TRIM_LOCK_SHIFT)) & SCG_FIRCCSR_TRIM_LOCK_MASK) + +#define SCG_FIRCCSR_COARSE_TRIM_BYPASS_MASK (0x800U) +#define SCG_FIRCCSR_COARSE_TRIM_BYPASS_SHIFT (11U) +/*! COARSE_TRIM_BYPASS - Coarse Auto Trim Bypass + * 0b0..FIRC Coarse Auto Trim NOT Bypassed + * 0b1..FIRC Coarse Auto Trim Bypassed + */ +#define SCG_FIRCCSR_COARSE_TRIM_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_COARSE_TRIM_BYPASS_SHIFT)) & SCG_FIRCCSR_COARSE_TRIM_BYPASS_MASK) + +#define SCG_FIRCCSR_LK_MASK (0x800000U) +#define SCG_FIRCCSR_LK_SHIFT (23U) +/*! LK - Lock Register + * 0b0..Control Status Register can be written + * 0b1..Control Status Register cannot be written + */ +#define SCG_FIRCCSR_LK(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_LK_SHIFT)) & SCG_FIRCCSR_LK_MASK) + +#define SCG_FIRCCSR_FIRCVLD_MASK (0x1000000U) +#define SCG_FIRCCSR_FIRCVLD_SHIFT (24U) +/*! FIRCVLD - FIRC Valid status + * 0b0..FIRC is not enabled or clock is not valid. + * 0b1..FIRC is enabled and output clock is valid. The clock is valid after there is an output clock from the FIRC analog. + */ +#define SCG_FIRCCSR_FIRCVLD(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCVLD_SHIFT)) & SCG_FIRCCSR_FIRCVLD_MASK) + +#define SCG_FIRCCSR_FIRCSEL_MASK (0x2000000U) +#define SCG_FIRCCSR_FIRCSEL_SHIFT (25U) +/*! FIRCSEL - FIRC Selected + * 0b0..FIRC is not the system clock source + * 0b1..FIRC is the system clock source + */ +#define SCG_FIRCCSR_FIRCSEL(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCSEL_SHIFT)) & SCG_FIRCCSR_FIRCSEL_MASK) + +#define SCG_FIRCCSR_FIRCERR_MASK (0x4000000U) +#define SCG_FIRCCSR_FIRCERR_SHIFT (26U) +/*! FIRCERR - FIRC Clock Error + * 0b0..Error not detected with the FIRC trimming + * 0b1..Error detected with the FIRC trimming + */ +#define SCG_FIRCCSR_FIRCERR(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCERR_SHIFT)) & SCG_FIRCCSR_FIRCERR_MASK) + +#define SCG_FIRCCSR_FIRCERR_IE_MASK (0x8000000U) +#define SCG_FIRCCSR_FIRCERR_IE_SHIFT (27U) +/*! FIRCERR_IE - FIRC Clock Error Interrupt Enable + * 0b0..FIRCERR interrupt is not enabled + * 0b1..FIRCERR interrupt is enabled + */ +#define SCG_FIRCCSR_FIRCERR_IE(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCERR_IE_SHIFT)) & SCG_FIRCCSR_FIRCERR_IE_MASK) + +#define SCG_FIRCCSR_FIRCACC_IE_MASK (0x40000000U) +#define SCG_FIRCCSR_FIRCACC_IE_SHIFT (30U) +/*! FIRCACC_IE - FIRC Accurate Interrupt Enable + * 0b0..FIRCACC interrupt is not enabled + * 0b1..FIRCACC interrupt is enabled + */ +#define SCG_FIRCCSR_FIRCACC_IE(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCACC_IE_SHIFT)) & SCG_FIRCCSR_FIRCACC_IE_MASK) + +#define SCG_FIRCCSR_FIRCACC_MASK (0x80000000U) +#define SCG_FIRCCSR_FIRCACC_SHIFT (31U) +/*! FIRCACC - FIRC Frequency Accurate + * 0b0..FIRC is not enabled or clock is not accurate. + * 0b1..FIRC is enabled and output clock is accurate after some preparation time which is obtained by counting FRO_HF clock. + */ +#define SCG_FIRCCSR_FIRCACC(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCSR_FIRCACC_SHIFT)) & SCG_FIRCCSR_FIRCACC_MASK) +/*! @} */ + +/*! @name FIRCCFG - FIRC Configuration Register */ +/*! @{ */ + +#define SCG_FIRCCFG_FREQ_SEL_MASK (0xEU) +#define SCG_FIRCCFG_FREQ_SEL_SHIFT (1U) +/*! FREQ_SEL - Frequency select + * 0b111..192 MHz FIRC clock selected + * 0b101..96 MHz FIRC clock selected + * 0b011..64 MHz FIRC clock selected + * 0b001..48 MHz FIRC clock selected, divided from 192 MHz + */ +#define SCG_FIRCCFG_FREQ_SEL(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCCFG_FREQ_SEL_SHIFT)) & SCG_FIRCCFG_FREQ_SEL_MASK) +/*! @} */ + +/*! @name FIRCTCFG - FIRC Trim Configuration Register */ +/*! @{ */ + +#define SCG_FIRCTCFG_TRIMSRC_MASK (0x3U) +#define SCG_FIRCTCFG_TRIMSRC_SHIFT (0U) +/*! TRIMSRC - Trim Source + * 0b00..USB0 Start of Frame (1 KHz). This option does not use TRIMDIV . + * 0b01..Reserved + * 0b10..SOSC. This option requires that SOSC be divided using the TRIMDIV field to get a frequency of 1 MHz. + * 0b11..Reserved + */ +#define SCG_FIRCTCFG_TRIMSRC(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCTCFG_TRIMSRC_SHIFT)) & SCG_FIRCTCFG_TRIMSRC_MASK) + +#define SCG_FIRCTCFG_TRIMDIV_MASK (0x7F0000U) +#define SCG_FIRCTCFG_TRIMDIV_SHIFT (16U) +/*! TRIMDIV - FIRC Trim Pre-divider */ +#define SCG_FIRCTCFG_TRIMDIV(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCTCFG_TRIMDIV_SHIFT)) & SCG_FIRCTCFG_TRIMDIV_MASK) +/*! @} */ + +/*! @name FIRCTRIM - FIRC Trim Register */ +/*! @{ */ + +#define SCG_FIRCTRIM_TRIMFINE_MASK (0xFFU) +#define SCG_FIRCTRIM_TRIMFINE_SHIFT (0U) +/*! TRIMFINE - Trim Fine */ +#define SCG_FIRCTRIM_TRIMFINE(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCTRIM_TRIMFINE_SHIFT)) & SCG_FIRCTRIM_TRIMFINE_MASK) + +#define SCG_FIRCTRIM_TRIMCOAR_MASK (0x3F00U) +#define SCG_FIRCTRIM_TRIMCOAR_SHIFT (8U) +/*! TRIMCOAR - Trim Coarse */ +#define SCG_FIRCTRIM_TRIMCOAR(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCTRIM_TRIMCOAR_SHIFT)) & SCG_FIRCTRIM_TRIMCOAR_MASK) + +#define SCG_FIRCTRIM_TRIMTEMP2_MASK (0xC0000U) +#define SCG_FIRCTRIM_TRIMTEMP2_SHIFT (18U) +/*! TRIMTEMP2 - Trim Temperature2 */ +#define SCG_FIRCTRIM_TRIMTEMP2(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCTRIM_TRIMTEMP2_SHIFT)) & SCG_FIRCTRIM_TRIMTEMP2_MASK) + +#define SCG_FIRCTRIM_TRIMSTART_MASK (0x3F000000U) +#define SCG_FIRCTRIM_TRIMSTART_SHIFT (24U) +/*! TRIMSTART - Trim Start */ +#define SCG_FIRCTRIM_TRIMSTART(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCTRIM_TRIMSTART_SHIFT)) & SCG_FIRCTRIM_TRIMSTART_MASK) +/*! @} */ + +/*! @name FIRCSTAT - FIRC Auto-trimming Status Register */ +/*! @{ */ + +#define SCG_FIRCSTAT_TRIMFINE_MASK (0xFFU) +#define SCG_FIRCSTAT_TRIMFINE_SHIFT (0U) +/*! TRIMFINE - Trim Fine */ +#define SCG_FIRCSTAT_TRIMFINE(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCSTAT_TRIMFINE_SHIFT)) & SCG_FIRCSTAT_TRIMFINE_MASK) + +#define SCG_FIRCSTAT_TRIMCOAR_MASK (0x3F00U) +#define SCG_FIRCSTAT_TRIMCOAR_SHIFT (8U) +/*! TRIMCOAR - Trim Coarse */ +#define SCG_FIRCSTAT_TRIMCOAR(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCSTAT_TRIMCOAR_SHIFT)) & SCG_FIRCSTAT_TRIMCOAR_MASK) +/*! @} */ + +/*! @name FIRCATC1 - FIRC Auto-trimming Counter 1 */ +/*! @{ */ + +#define SCG_FIRCATC1_IDEALC_MASK (0xFFFFU) +#define SCG_FIRCATC1_IDEALC_SHIFT (0U) +/*! IDEALC - Ideal Counter */ +#define SCG_FIRCATC1_IDEALC(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCATC1_IDEALC_SHIFT)) & SCG_FIRCATC1_IDEALC_MASK) +/*! @} */ + +/*! @name FIRCATC2 - FIRC Auto-trimming Counter 2 */ +/*! @{ */ + +#define SCG_FIRCATC2_COARMINC_MASK (0xFFFFU) +#define SCG_FIRCATC2_COARMINC_SHIFT (0U) +/*! COARMINC - Coarse Trim Minimum Counter */ +#define SCG_FIRCATC2_COARMINC(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCATC2_COARMINC_SHIFT)) & SCG_FIRCATC2_COARMINC_MASK) + +#define SCG_FIRCATC2_COARMAXC_MASK (0xFFFF0000U) +#define SCG_FIRCATC2_COARMAXC_SHIFT (16U) +/*! COARMAXC - Coarse Trim Maximum Counter */ +#define SCG_FIRCATC2_COARMAXC(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCATC2_COARMAXC_SHIFT)) & SCG_FIRCATC2_COARMAXC_MASK) +/*! @} */ + +/*! @name FIRCATC3 - FIRC Auto-trimming Counter 2 */ +/*! @{ */ + +#define SCG_FIRCATC3_FINEMINC_MASK (0xFFFFU) +#define SCG_FIRCATC3_FINEMINC_SHIFT (0U) +/*! FINEMINC - Fine Trim Minimum Counter */ +#define SCG_FIRCATC3_FINEMINC(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCATC3_FINEMINC_SHIFT)) & SCG_FIRCATC3_FINEMINC_MASK) + +#define SCG_FIRCATC3_FINEMAXC_MASK (0xFFFF0000U) +#define SCG_FIRCATC3_FINEMAXC_SHIFT (16U) +/*! FINEMAXC - Fine Trim Maximum Counter */ +#define SCG_FIRCATC3_FINEMAXC(x) (((uint32_t)(((uint32_t)(x)) << SCG_FIRCATC3_FINEMAXC_SHIFT)) & SCG_FIRCATC3_FINEMAXC_MASK) +/*! @} */ + +/*! @name ROSCCSR - ROSC Control Status Register */ +/*! @{ */ + +#define SCG_ROSCCSR_LK_MASK (0x800000U) +#define SCG_ROSCCSR_LK_SHIFT (23U) +/*! LK - Lock Register + * 0b0..Control Status Register can be written + * 0b1..Control Status Register cannot be written + */ +#define SCG_ROSCCSR_LK(x) (((uint32_t)(((uint32_t)(x)) << SCG_ROSCCSR_LK_SHIFT)) & SCG_ROSCCSR_LK_MASK) + +#define SCG_ROSCCSR_ROSCVLD_MASK (0x1000000U) +#define SCG_ROSCCSR_ROSCVLD_SHIFT (24U) +/*! ROSCVLD - ROSC Valid + * 0b0..ROSC is not enabled or clock is not valid + * 0b1..ROSC is enabled and output clock is valid + */ +#define SCG_ROSCCSR_ROSCVLD(x) (((uint32_t)(((uint32_t)(x)) << SCG_ROSCCSR_ROSCVLD_SHIFT)) & SCG_ROSCCSR_ROSCVLD_MASK) + +#define SCG_ROSCCSR_ROSCSEL_MASK (0x2000000U) +#define SCG_ROSCCSR_ROSCSEL_SHIFT (25U) +/*! ROSCSEL - ROSC Selected + * 0b0..ROSC is not the system clock source + * 0b1..ROSC is the system clock source + */ +#define SCG_ROSCCSR_ROSCSEL(x) (((uint32_t)(((uint32_t)(x)) << SCG_ROSCCSR_ROSCSEL_SHIFT)) & SCG_ROSCCSR_ROSCSEL_MASK) + +#define SCG_ROSCCSR_ROSCERR_MASK (0x4000000U) +#define SCG_ROSCCSR_ROSCERR_SHIFT (26U) +/*! ROSCERR - ROSC Clock Error + * 0b0..ROSC Clock has not detected an error + * 0b1..ROSC Clock has detected an error + */ +#define SCG_ROSCCSR_ROSCERR(x) (((uint32_t)(((uint32_t)(x)) << SCG_ROSCCSR_ROSCERR_SHIFT)) & SCG_ROSCCSR_ROSCERR_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group SCG_Register_Masks */ + + +/* SCG - Peripheral instance base addresses */ +/** Peripheral SCG0 base address */ +#define SCG0_BASE (0x4008F000u) +/** Peripheral SCG0 base pointer */ +#define SCG0 ((SCG_Type *)SCG0_BASE) +/** Array initializer of SCG peripheral base addresses */ +#define SCG_BASE_ADDRS { SCG0_BASE } +/** Array initializer of SCG peripheral base pointers */ +#define SCG_BASE_PTRS { SCG0 } + +/*! + * @} + */ /* end of group SCG_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- SPC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SPC_Peripheral_Access_Layer SPC Peripheral Access Layer + * @{ + */ + +/** SPC - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + uint8_t RESERVED_0[12]; + __IO uint32_t SC; /**< Status Control, offset: 0x10 */ + uint8_t RESERVED_1[8]; + __IO uint32_t LPREQ_CFG; /**< Low-Power Request Configuration, offset: 0x1C */ + uint8_t RESERVED_2[16]; + __IO uint32_t PD_STATUS[1]; /**< SPC Power Domain Mode Status, array offset: 0x30, array step: 0x4 */ + uint8_t RESERVED_3[12]; + __IO uint32_t SRAMCTL; /**< SRAM Control, offset: 0x40 */ + uint8_t RESERVED_4[16]; + __IO uint32_t SRAMRETLDO_REFTRIM; /**< SRAM Retention Reference Trim, offset: 0x54 */ + __IO uint32_t SRAMRETLDO_CNTRL; /**< SRAM Retention LDO Control, offset: 0x58 */ + uint8_t RESERVED_5[164]; + __IO uint32_t ACTIVE_CFG; /**< Active Power Mode Configuration, offset: 0x100 */ + __IO uint32_t ACTIVE_CFG1; /**< Active Power Mode Configuration 1, offset: 0x104 */ + __IO uint32_t LP_CFG; /**< Low-Power Mode Configuration, offset: 0x108 */ + __IO uint32_t LP_CFG1; /**< Low Power Mode Configuration 1, offset: 0x10C */ + uint8_t RESERVED_6[16]; + __IO uint32_t LPWKUP_DELAY; /**< Low Power Wake-Up Delay, offset: 0x120 */ + __IO uint32_t ACTIVE_VDELAY; /**< Active Voltage Trim Delay, offset: 0x124 */ + uint8_t RESERVED_7[8]; + __IO uint32_t VD_STAT; /**< Voltage Detect Status, offset: 0x130 */ + __IO uint32_t VD_CORE_CFG; /**< Core Voltage Detect Configuration, offset: 0x134 */ + __IO uint32_t VD_SYS_CFG; /**< System Voltage Detect Configuration, offset: 0x138 */ + uint8_t RESERVED_8[4]; + __IO uint32_t EVD_CFG; /**< External Voltage Domain Configuration, offset: 0x140 */ + uint8_t RESERVED_9[444]; + uint32_t CORELDO_CFG; /**< LDO_CORE Configuration, offset: 0x300 */ +} SPC_Type; + +/* ---------------------------------------------------------------------------- + -- SPC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SPC_Register_Masks SPC Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define SPC_VERID_FEATURE_MASK (0xFFFFU) +#define SPC_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number + * 0b0000000000000000..Standard features + * *.. + */ +#define SPC_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << SPC_VERID_FEATURE_SHIFT)) & SPC_VERID_FEATURE_MASK) + +#define SPC_VERID_MINOR_MASK (0xFF0000U) +#define SPC_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define SPC_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << SPC_VERID_MINOR_SHIFT)) & SPC_VERID_MINOR_MASK) + +#define SPC_VERID_MAJOR_MASK (0xFF000000U) +#define SPC_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define SPC_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << SPC_VERID_MAJOR_SHIFT)) & SPC_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name SC - Status Control */ +/*! @{ */ + +#define SPC_SC_BUSY_MASK (0x1U) +#define SPC_SC_BUSY_SHIFT (0U) +/*! BUSY - SPC Busy Status Flag + * 0b0..Not busy + * 0b1..Busy + */ +#define SPC_SC_BUSY(x) (((uint32_t)(((uint32_t)(x)) << SPC_SC_BUSY_SHIFT)) & SPC_SC_BUSY_MASK) + +#define SPC_SC_SPC_LP_REQ_MASK (0x2U) +#define SPC_SC_SPC_LP_REQ_SHIFT (1U) +/*! SPC_LP_REQ - SPC Power Mode Configuration Status Flag + * 0b0..SPC is in Active mode; the ACTIVE_CFG register has control + * 0b1..All power domains requested low-power mode; SPC entered a low-power state; power-mode configuration based on the LP_CFG register + * 0b0..No effect + * 0b1..Clear the flag + */ +#define SPC_SC_SPC_LP_REQ(x) (((uint32_t)(((uint32_t)(x)) << SPC_SC_SPC_LP_REQ_SHIFT)) & SPC_SC_SPC_LP_REQ_MASK) + +#define SPC_SC_SPC_LP_MODE_MASK (0xF0U) +#define SPC_SC_SPC_LP_MODE_SHIFT (4U) +/*! SPC_LP_MODE - Power Domain Low-Power Mode Request + * 0b0000..Sleep mode with system clock running + * 0b0001..DSLEEP with system clock off + * 0b0010..PDOWN with system clock off + * 0b0100.. + * 0b1000..DPDOWN with system clock off + */ +#define SPC_SC_SPC_LP_MODE(x) (((uint32_t)(((uint32_t)(x)) << SPC_SC_SPC_LP_MODE_SHIFT)) & SPC_SC_SPC_LP_MODE_MASK) + +#define SPC_SC_ISO_CLR_MASK (0x10000U) +#define SPC_SC_ISO_CLR_SHIFT (16U) +/*! ISO_CLR - Isolation Clear Flags */ +#define SPC_SC_ISO_CLR(x) (((uint32_t)(((uint32_t)(x)) << SPC_SC_ISO_CLR_SHIFT)) & SPC_SC_ISO_CLR_MASK) +/*! @} */ + +/*! @name LPREQ_CFG - Low-Power Request Configuration */ +/*! @{ */ + +#define SPC_LPREQ_CFG_LPREQOE_MASK (0x1U) +#define SPC_LPREQ_CFG_LPREQOE_SHIFT (0U) +/*! LPREQOE - Low-Power Request Output Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_LPREQ_CFG_LPREQOE(x) (((uint32_t)(((uint32_t)(x)) << SPC_LPREQ_CFG_LPREQOE_SHIFT)) & SPC_LPREQ_CFG_LPREQOE_MASK) + +#define SPC_LPREQ_CFG_LPREQPOL_MASK (0x2U) +#define SPC_LPREQ_CFG_LPREQPOL_SHIFT (1U) +/*! LPREQPOL - Low-Power Request Output Pin Polarity Control + * 0b0..High + * 0b1..Low + */ +#define SPC_LPREQ_CFG_LPREQPOL(x) (((uint32_t)(((uint32_t)(x)) << SPC_LPREQ_CFG_LPREQPOL_SHIFT)) & SPC_LPREQ_CFG_LPREQPOL_MASK) + +#define SPC_LPREQ_CFG_LPREQOV_MASK (0xCU) +#define SPC_LPREQ_CFG_LPREQOV_SHIFT (2U) +/*! LPREQOV - Low-Power Request Output Override + * 0b00..Not forced + * 0b01.. + * 0b10..Forced low (ignore LPREQPOL settings) + * 0b11..Forced high (ignore LPREQPOL settings) + */ +#define SPC_LPREQ_CFG_LPREQOV(x) (((uint32_t)(((uint32_t)(x)) << SPC_LPREQ_CFG_LPREQOV_SHIFT)) & SPC_LPREQ_CFG_LPREQOV_MASK) +/*! @} */ + +/*! @name PD_STATUS - SPC Power Domain Mode Status */ +/*! @{ */ + +#define SPC_PD_STATUS_PWR_REQ_STATUS_MASK (0x1U) +#define SPC_PD_STATUS_PWR_REQ_STATUS_SHIFT (0U) +/*! PWR_REQ_STATUS - Power Request Status Flag + * 0b0..Did not request + * 0b1..Requested + */ +#define SPC_PD_STATUS_PWR_REQ_STATUS(x) (((uint32_t)(((uint32_t)(x)) << SPC_PD_STATUS_PWR_REQ_STATUS_SHIFT)) & SPC_PD_STATUS_PWR_REQ_STATUS_MASK) + +#define SPC_PD_STATUS_PD_LP_REQ_MASK (0x10U) +#define SPC_PD_STATUS_PD_LP_REQ_SHIFT (4U) +/*! PD_LP_REQ - Power Domain Low Power Request Flag + * 0b0..Did not request + * 0b1..Requested + */ +#define SPC_PD_STATUS_PD_LP_REQ(x) (((uint32_t)(((uint32_t)(x)) << SPC_PD_STATUS_PD_LP_REQ_SHIFT)) & SPC_PD_STATUS_PD_LP_REQ_MASK) + +#define SPC_PD_STATUS_LP_MODE_MASK (0xF00U) +#define SPC_PD_STATUS_LP_MODE_SHIFT (8U) +/*! LP_MODE - Power Domain Low Power Mode Request + * 0b0000..SLEEP with system clock running + * 0b0001..DSLEEP with system clock off + * 0b0010..PDOWN with system clock off + * 0b0100.. + * 0b1000..DPDOWN with system clock off + */ +#define SPC_PD_STATUS_LP_MODE(x) (((uint32_t)(((uint32_t)(x)) << SPC_PD_STATUS_LP_MODE_SHIFT)) & SPC_PD_STATUS_LP_MODE_MASK) +/*! @} */ + +/* The count of SPC_PD_STATUS */ +#define SPC_PD_STATUS_COUNT (1U) + +/*! @name SRAMCTL - SRAM Control */ +/*! @{ */ + +#define SPC_SRAMCTL_VSM_MASK (0x3U) +#define SPC_SRAMCTL_VSM_SHIFT (0U) +/*! VSM - Voltage Select Margin + * 0b00.. + * 0b01..1.0 V + * 0b10..1.1 V + * 0b11.. + */ +#define SPC_SRAMCTL_VSM(x) (((uint32_t)(((uint32_t)(x)) << SPC_SRAMCTL_VSM_SHIFT)) & SPC_SRAMCTL_VSM_MASK) + +#define SPC_SRAMCTL_REQ_MASK (0x40000000U) +#define SPC_SRAMCTL_REQ_SHIFT (30U) +/*! REQ - SRAM Voltage Update Request + * 0b0..Do not request + * 0b1..Request + */ +#define SPC_SRAMCTL_REQ(x) (((uint32_t)(((uint32_t)(x)) << SPC_SRAMCTL_REQ_SHIFT)) & SPC_SRAMCTL_REQ_MASK) + +#define SPC_SRAMCTL_ACK_MASK (0x80000000U) +#define SPC_SRAMCTL_ACK_SHIFT (31U) +/*! ACK - SRAM Voltage Update Request Acknowledge + * 0b0..Not acknowledged + * 0b1..Acknowledged + */ +#define SPC_SRAMCTL_ACK(x) (((uint32_t)(((uint32_t)(x)) << SPC_SRAMCTL_ACK_SHIFT)) & SPC_SRAMCTL_ACK_MASK) +/*! @} */ + +/*! @name SRAMRETLDO_REFTRIM - SRAM Retention Reference Trim */ +/*! @{ */ + +#define SPC_SRAMRETLDO_REFTRIM_REFTRIM_MASK (0x1FU) +#define SPC_SRAMRETLDO_REFTRIM_REFTRIM_SHIFT (0U) +/*! REFTRIM - Reference Trim. Voltage range is around 0.48V - 0.85V. Trim step is 12 mV. */ +#define SPC_SRAMRETLDO_REFTRIM_REFTRIM(x) (((uint32_t)(((uint32_t)(x)) << SPC_SRAMRETLDO_REFTRIM_REFTRIM_SHIFT)) & SPC_SRAMRETLDO_REFTRIM_REFTRIM_MASK) +/*! @} */ + +/*! @name SRAMRETLDO_CNTRL - SRAM Retention LDO Control */ +/*! @{ */ + +#define SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON_MASK (0x1U) +#define SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON_SHIFT (0U) +/*! SRAMLDO_ON - SRAM LDO Regulator Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON(x) (((uint32_t)(((uint32_t)(x)) << SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON_SHIFT)) & SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON_MASK) + +#define SPC_SRAMRETLDO_CNTRL_SRAM_RET_EN_MASK (0xF00U) +#define SPC_SRAMRETLDO_CNTRL_SRAM_RET_EN_SHIFT (8U) +/*! SRAM_RET_EN - SRAM Retention */ +#define SPC_SRAMRETLDO_CNTRL_SRAM_RET_EN(x) (((uint32_t)(((uint32_t)(x)) << SPC_SRAMRETLDO_CNTRL_SRAM_RET_EN_SHIFT)) & SPC_SRAMRETLDO_CNTRL_SRAM_RET_EN_MASK) +/*! @} */ + +/*! @name ACTIVE_CFG - Active Power Mode Configuration */ +/*! @{ */ + +#define SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK (0x1U) +#define SPC_ACTIVE_CFG_CORELDO_VDD_DS_SHIFT (0U) +/*! CORELDO_VDD_DS - LDO_CORE VDD Drive Strength + * 0b0..Low + * 0b1..Normal + */ +#define SPC_ACTIVE_CFG_CORELDO_VDD_DS(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_CFG_CORELDO_VDD_DS_SHIFT)) & SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK) + +#define SPC_ACTIVE_CFG_CORELDO_VDD_LVL_MASK (0xCU) +#define SPC_ACTIVE_CFG_CORELDO_VDD_LVL_SHIFT (2U) +/*! CORELDO_VDD_LVL - LDO_CORE VDD Regulator Voltage Level + * 0b00.. + * 0b01..Regulate to mid voltage (1.0 V) + * 0b10..Regulate to normal voltage (1.1 V) + * 0b11..Reserved + * 0b11..Reserved + */ +#define SPC_ACTIVE_CFG_CORELDO_VDD_LVL(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_CFG_CORELDO_VDD_LVL_SHIFT)) & SPC_ACTIVE_CFG_CORELDO_VDD_LVL_MASK) + +#define SPC_ACTIVE_CFG_BGMODE_MASK (0x300000U) +#define SPC_ACTIVE_CFG_BGMODE_SHIFT (20U) +/*! BGMODE - Bandgap Mode + * 0b00..Bandgap disabled + * 0b01..Bandgap enabled, buffer disabled + * 0b10..Bandgap enabled, buffer enabled + * 0b11.. + */ +#define SPC_ACTIVE_CFG_BGMODE(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_CFG_BGMODE_SHIFT)) & SPC_ACTIVE_CFG_BGMODE_MASK) + +#define SPC_ACTIVE_CFG_VDD_VD_DISABLE_MASK (0x800000U) +#define SPC_ACTIVE_CFG_VDD_VD_DISABLE_SHIFT (23U) +/*! VDD_VD_DISABLE - VDD Voltage Detect Disable + * 0b0..Enable + * 0b1..Disable + */ +#define SPC_ACTIVE_CFG_VDD_VD_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_CFG_VDD_VD_DISABLE_SHIFT)) & SPC_ACTIVE_CFG_VDD_VD_DISABLE_MASK) + +#define SPC_ACTIVE_CFG_CORE_LVDE_MASK (0x1000000U) +#define SPC_ACTIVE_CFG_CORE_LVDE_SHIFT (24U) +/*! CORE_LVDE - Core Low-Voltage Detection Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_ACTIVE_CFG_CORE_LVDE(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_CFG_CORE_LVDE_SHIFT)) & SPC_ACTIVE_CFG_CORE_LVDE_MASK) + +#define SPC_ACTIVE_CFG_SYS_LVDE_MASK (0x2000000U) +#define SPC_ACTIVE_CFG_SYS_LVDE_SHIFT (25U) +/*! SYS_LVDE - System Low-Voltage Detection Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_ACTIVE_CFG_SYS_LVDE(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_CFG_SYS_LVDE_SHIFT)) & SPC_ACTIVE_CFG_SYS_LVDE_MASK) + +#define SPC_ACTIVE_CFG_SYS_HVDE_MASK (0x10000000U) +#define SPC_ACTIVE_CFG_SYS_HVDE_SHIFT (28U) +/*! SYS_HVDE - System High-Voltage Detection Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_ACTIVE_CFG_SYS_HVDE(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_CFG_SYS_HVDE_SHIFT)) & SPC_ACTIVE_CFG_SYS_HVDE_MASK) +/*! @} */ + +/*! @name ACTIVE_CFG1 - Active Power Mode Configuration 1 */ +/*! @{ */ + +#define SPC_ACTIVE_CFG1_SOC_CNTRL_MASK (0xFFFFFFFFU) +#define SPC_ACTIVE_CFG1_SOC_CNTRL_SHIFT (0U) +/*! SOC_CNTRL - Active Config Chip Control */ +#define SPC_ACTIVE_CFG1_SOC_CNTRL(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_CFG1_SOC_CNTRL_SHIFT)) & SPC_ACTIVE_CFG1_SOC_CNTRL_MASK) +/*! @} */ + +/*! @name LP_CFG - Low-Power Mode Configuration */ +/*! @{ */ + +#define SPC_LP_CFG_CORELDO_VDD_DS_MASK (0x1U) +#define SPC_LP_CFG_CORELDO_VDD_DS_SHIFT (0U) +/*! CORELDO_VDD_DS - LDO_CORE VDD Drive Strength + * 0b0..Low + * 0b1..Normal + */ +#define SPC_LP_CFG_CORELDO_VDD_DS(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG_CORELDO_VDD_DS_SHIFT)) & SPC_LP_CFG_CORELDO_VDD_DS_MASK) + +#define SPC_LP_CFG_CORELDO_VDD_LVL_MASK (0xCU) +#define SPC_LP_CFG_CORELDO_VDD_LVL_SHIFT (2U) +/*! CORELDO_VDD_LVL - LDO_CORE VDD Regulator Voltage Level + * 0b00..Retention voltage + * 0b01..Mid voltage (1.0 V) + * 0b10..Normal voltage (1.1 V) + * 0b11..Reserved + * 0b11..Overdrive voltage (1.15 V) + */ +#define SPC_LP_CFG_CORELDO_VDD_LVL(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG_CORELDO_VDD_LVL_SHIFT)) & SPC_LP_CFG_CORELDO_VDD_LVL_MASK) + +#define SPC_LP_CFG_SRAMLDO_DPD_ON_MASK (0x80000U) +#define SPC_LP_CFG_SRAMLDO_DPD_ON_SHIFT (19U) +/*! SRAMLDO_DPD_ON - SRAM_LDO Deep Power Low Power IREF Enable + * 0b0..Low Power IREF is disabled for power saving in Deep Power Down mode + * 0b1..Low Power IREF is enabled + */ +#define SPC_LP_CFG_SRAMLDO_DPD_ON(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG_SRAMLDO_DPD_ON_SHIFT)) & SPC_LP_CFG_SRAMLDO_DPD_ON_MASK) + +#define SPC_LP_CFG_BGMODE_MASK (0x300000U) +#define SPC_LP_CFG_BGMODE_SHIFT (20U) +/*! BGMODE - Bandgap Mode + * 0b00..Bandgap disabled + * 0b01..Bandgap enabled, buffer disabled + * 0b10..Bandgap enabled, buffer enabled + * 0b11.. + */ +#define SPC_LP_CFG_BGMODE(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG_BGMODE_SHIFT)) & SPC_LP_CFG_BGMODE_MASK) + +#define SPC_LP_CFG_LP_IREFEN_MASK (0x800000U) +#define SPC_LP_CFG_LP_IREFEN_SHIFT (23U) +/*! LP_IREFEN - Low-Power IREF Enable + * 0b0..Disable for power saving in Deep Power Down mode + * 0b1..Enable + */ +#define SPC_LP_CFG_LP_IREFEN(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG_LP_IREFEN_SHIFT)) & SPC_LP_CFG_LP_IREFEN_MASK) + +#define SPC_LP_CFG_CORE_LVDE_MASK (0x1000000U) +#define SPC_LP_CFG_CORE_LVDE_SHIFT (24U) +/*! CORE_LVDE - Core Low Voltage Detect Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_LP_CFG_CORE_LVDE(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG_CORE_LVDE_SHIFT)) & SPC_LP_CFG_CORE_LVDE_MASK) + +#define SPC_LP_CFG_SYS_LVDE_MASK (0x2000000U) +#define SPC_LP_CFG_SYS_LVDE_SHIFT (25U) +/*! SYS_LVDE - System Low Voltage Detect Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_LP_CFG_SYS_LVDE(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG_SYS_LVDE_SHIFT)) & SPC_LP_CFG_SYS_LVDE_MASK) + +#define SPC_LP_CFG_SYS_HVDE_MASK (0x10000000U) +#define SPC_LP_CFG_SYS_HVDE_SHIFT (28U) +/*! SYS_HVDE - System High Voltage Detect Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_LP_CFG_SYS_HVDE(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG_SYS_HVDE_SHIFT)) & SPC_LP_CFG_SYS_HVDE_MASK) +/*! @} */ + +/*! @name LP_CFG1 - Low Power Mode Configuration 1 */ +/*! @{ */ + +#define SPC_LP_CFG1_SOC_CNTRL_MASK (0xFFFFFFFFU) +#define SPC_LP_CFG1_SOC_CNTRL_SHIFT (0U) +/*! SOC_CNTRL - Low-Power Configuration Chip Control */ +#define SPC_LP_CFG1_SOC_CNTRL(x) (((uint32_t)(((uint32_t)(x)) << SPC_LP_CFG1_SOC_CNTRL_SHIFT)) & SPC_LP_CFG1_SOC_CNTRL_MASK) +/*! @} */ + +/*! @name LPWKUP_DELAY - Low Power Wake-Up Delay */ +/*! @{ */ + +#define SPC_LPWKUP_DELAY_LPWKUP_DELAY_MASK (0xFFFFU) +#define SPC_LPWKUP_DELAY_LPWKUP_DELAY_SHIFT (0U) +/*! LPWKUP_DELAY - Low-Power Wake-Up Delay */ +#define SPC_LPWKUP_DELAY_LPWKUP_DELAY(x) (((uint32_t)(((uint32_t)(x)) << SPC_LPWKUP_DELAY_LPWKUP_DELAY_SHIFT)) & SPC_LPWKUP_DELAY_LPWKUP_DELAY_MASK) +/*! @} */ + +/*! @name ACTIVE_VDELAY - Active Voltage Trim Delay */ +/*! @{ */ + +#define SPC_ACTIVE_VDELAY_ACTIVE_VDELAY_MASK (0xFFFFU) +#define SPC_ACTIVE_VDELAY_ACTIVE_VDELAY_SHIFT (0U) +/*! ACTIVE_VDELAY - Active Voltage Delay */ +#define SPC_ACTIVE_VDELAY_ACTIVE_VDELAY(x) (((uint32_t)(((uint32_t)(x)) << SPC_ACTIVE_VDELAY_ACTIVE_VDELAY_SHIFT)) & SPC_ACTIVE_VDELAY_ACTIVE_VDELAY_MASK) +/*! @} */ + +/*! @name VD_STAT - Voltage Detect Status */ +/*! @{ */ + +#define SPC_VD_STAT_COREVDD_LVDF_MASK (0x1U) +#define SPC_VD_STAT_COREVDD_LVDF_SHIFT (0U) +/*! COREVDD_LVDF - Core Low-Voltage Detect Flag + * 0b0..Event not detected + * 0b1..Event detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define SPC_VD_STAT_COREVDD_LVDF(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_STAT_COREVDD_LVDF_SHIFT)) & SPC_VD_STAT_COREVDD_LVDF_MASK) + +#define SPC_VD_STAT_SYSVDD_LVDF_MASK (0x2U) +#define SPC_VD_STAT_SYSVDD_LVDF_SHIFT (1U) +/*! SYSVDD_LVDF - System Low-Voltage Detect Flag + * 0b0..Event not detected + * 0b1..Event detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define SPC_VD_STAT_SYSVDD_LVDF(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_STAT_SYSVDD_LVDF_SHIFT)) & SPC_VD_STAT_SYSVDD_LVDF_MASK) + +#define SPC_VD_STAT_SYSVDD_HVDF_MASK (0x20U) +#define SPC_VD_STAT_SYSVDD_HVDF_SHIFT (5U) +/*! SYSVDD_HVDF - System HVD Flag + * 0b0..Event not detected + * 0b1..Event detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define SPC_VD_STAT_SYSVDD_HVDF(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_STAT_SYSVDD_HVDF_SHIFT)) & SPC_VD_STAT_SYSVDD_HVDF_MASK) +/*! @} */ + +/*! @name VD_CORE_CFG - Core Voltage Detect Configuration */ +/*! @{ */ + +#define SPC_VD_CORE_CFG_LVDRE_MASK (0x1U) +#define SPC_VD_CORE_CFG_LVDRE_SHIFT (0U) +/*! LVDRE - Core LVD Reset Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_VD_CORE_CFG_LVDRE(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_CORE_CFG_LVDRE_SHIFT)) & SPC_VD_CORE_CFG_LVDRE_MASK) + +#define SPC_VD_CORE_CFG_LVDIE_MASK (0x2U) +#define SPC_VD_CORE_CFG_LVDIE_SHIFT (1U) +/*! LVDIE - Core LVD Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_VD_CORE_CFG_LVDIE(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_CORE_CFG_LVDIE_SHIFT)) & SPC_VD_CORE_CFG_LVDIE_MASK) + +#define SPC_VD_CORE_CFG_LOCK_MASK (0x10000U) +#define SPC_VD_CORE_CFG_LOCK_SHIFT (16U) +/*! LOCK - Core Voltage Detect Reset Enable Lock + * 0b0..Allow + * 0b1..Deny + */ +#define SPC_VD_CORE_CFG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_CORE_CFG_LOCK_SHIFT)) & SPC_VD_CORE_CFG_LOCK_MASK) +/*! @} */ + +/*! @name VD_SYS_CFG - System Voltage Detect Configuration */ +/*! @{ */ + +#define SPC_VD_SYS_CFG_LVDRE_MASK (0x1U) +#define SPC_VD_SYS_CFG_LVDRE_SHIFT (0U) +/*! LVDRE - System LVD Reset Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_VD_SYS_CFG_LVDRE(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_SYS_CFG_LVDRE_SHIFT)) & SPC_VD_SYS_CFG_LVDRE_MASK) + +#define SPC_VD_SYS_CFG_LVDIE_MASK (0x2U) +#define SPC_VD_SYS_CFG_LVDIE_SHIFT (1U) +/*! LVDIE - System LVD Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_VD_SYS_CFG_LVDIE(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_SYS_CFG_LVDIE_SHIFT)) & SPC_VD_SYS_CFG_LVDIE_MASK) + +#define SPC_VD_SYS_CFG_HVDRE_MASK (0x4U) +#define SPC_VD_SYS_CFG_HVDRE_SHIFT (2U) +/*! HVDRE - System HVD Reset Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_VD_SYS_CFG_HVDRE(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_SYS_CFG_HVDRE_SHIFT)) & SPC_VD_SYS_CFG_HVDRE_MASK) + +#define SPC_VD_SYS_CFG_HVDIE_MASK (0x8U) +#define SPC_VD_SYS_CFG_HVDIE_SHIFT (3U) +/*! HVDIE - System HVD Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define SPC_VD_SYS_CFG_HVDIE(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_SYS_CFG_HVDIE_SHIFT)) & SPC_VD_SYS_CFG_HVDIE_MASK) + +#define SPC_VD_SYS_CFG_LVSEL_MASK (0x100U) +#define SPC_VD_SYS_CFG_LVSEL_SHIFT (8U) +/*! LVSEL - System Low-Voltage Level Select + * 0b0..Normal + * 0b1..Safe + */ +#define SPC_VD_SYS_CFG_LVSEL(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_SYS_CFG_LVSEL_SHIFT)) & SPC_VD_SYS_CFG_LVSEL_MASK) + +#define SPC_VD_SYS_CFG_LOCK_MASK (0x10000U) +#define SPC_VD_SYS_CFG_LOCK_SHIFT (16U) +/*! LOCK - System Voltage Detect Reset Enable Lock + * 0b0..Allow + * 0b1..Deny + */ +#define SPC_VD_SYS_CFG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SPC_VD_SYS_CFG_LOCK_SHIFT)) & SPC_VD_SYS_CFG_LOCK_MASK) +/*! @} */ + +/*! @name EVD_CFG - External Voltage Domain Configuration */ +/*! @{ */ + +#define SPC_EVD_CFG_EVDISO_MASK (0xFU) +#define SPC_EVD_CFG_EVDISO_SHIFT (0U) +/*! EVDISO - External Voltage Domain Isolation */ +#define SPC_EVD_CFG_EVDISO(x) (((uint32_t)(((uint32_t)(x)) << SPC_EVD_CFG_EVDISO_SHIFT)) & SPC_EVD_CFG_EVDISO_MASK) + +#define SPC_EVD_CFG_EVDLPISO_MASK (0xF00U) +#define SPC_EVD_CFG_EVDLPISO_SHIFT (8U) +/*! EVDLPISO - External Voltage Domain Low-Power Isolation */ +#define SPC_EVD_CFG_EVDLPISO(x) (((uint32_t)(((uint32_t)(x)) << SPC_EVD_CFG_EVDLPISO_SHIFT)) & SPC_EVD_CFG_EVDLPISO_MASK) + +#define SPC_EVD_CFG_EVDSTAT_MASK (0xF0000U) +#define SPC_EVD_CFG_EVDSTAT_SHIFT (16U) +/*! EVDSTAT - External Voltage Domain Status */ +#define SPC_EVD_CFG_EVDSTAT(x) (((uint32_t)(((uint32_t)(x)) << SPC_EVD_CFG_EVDSTAT_SHIFT)) & SPC_EVD_CFG_EVDSTAT_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group SPC_Register_Masks */ + + +/* SPC - Peripheral instance base addresses */ +/** Peripheral SPC0 base address */ +#define SPC0_BASE (0x40090000u) +/** Peripheral SPC0 base pointer */ +#define SPC0 ((SPC_Type *)SPC0_BASE) +/** Array initializer of SPC peripheral base addresses */ +#define SPC_BASE_ADDRS { SPC0_BASE } +/** Array initializer of SPC peripheral base pointers */ +#define SPC_BASE_PTRS { SPC0 } + +/*! + * @} + */ /* end of group SPC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- SYSCON Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SYSCON_Peripheral_Access_Layer SYSCON Peripheral Access Layer + * @{ + */ + +/** SYSCON - Register Layout Typedef */ +typedef struct { + uint8_t RESERVED_0[512]; + __IO uint32_t REMAP; /**< AHB Matrix Remap Control, offset: 0x200 */ + uint8_t RESERVED_1[12]; + __IO uint32_t AHBMATPRIO; /**< AHB Matrix Priority Control, offset: 0x210 */ + uint8_t RESERVED_2[40]; + __IO uint32_t CPU0NSTCKCAL; /**< Non-Secure CPU0 System Tick Calibration, offset: 0x23C */ + uint8_t RESERVED_3[8]; + __IO uint32_t NMISRC; /**< NMI Source Select, offset: 0x248 */ + uint8_t RESERVED_4[300]; + __IO uint32_t SLOWCLKDIV; /**< SLOW_CLK Clock Divider, offset: 0x378 */ + uint8_t RESERVED_5[4]; + __IO uint32_t AHBCLKDIV; /**< System Clock Divider, offset: 0x380 */ + uint8_t RESERVED_6[120]; + __IO uint32_t CLKUNLOCK; /**< Clock Configuration Unlock, offset: 0x3FC */ + __IO uint32_t NVM_CTRL; /**< NVM Control, offset: 0x400 */ + uint32_t ROMCR; /**< ROM Wait State, offset: 0x404 */ + uint8_t RESERVED_7[1028]; + __I uint32_t CPUSTAT; /**< CPU Status, offset: 0x80C */ + uint8_t RESERVED_8[20]; + __IO uint32_t LPCAC_CTRL; /**< LPCAC Control, offset: 0x824 */ + uint8_t RESERVED_9[272]; + __IO uint32_t PWM0SUBCTL; /**< PWM0 Submodule Control, offset: 0x938 */ + __IO uint32_t PWM1SUBCTL; /**< PWM1 Submodule Control, offset: 0x93C */ + __IO uint32_t CTIMERGLOBALSTARTEN; /**< CTIMER Global Start Enable, offset: 0x940 */ + __IO uint32_t RAM_CTRL; /**< RAM Control, offset: 0x944 */ + uint8_t RESERVED_10[536]; + __IO uint32_t GRAY_CODE_LSB; /**< Gray to Binary Converter Gray Code [31:0], offset: 0xB60 */ + __IO uint32_t GRAY_CODE_MSB; /**< Gray to Binary Converter Gray Code [41:32], offset: 0xB64 */ + __I uint32_t BINARY_CODE_LSB; /**< Gray to Binary Converter Binary Code [31:0], offset: 0xB68 */ + __I uint32_t BINARY_CODE_MSB; /**< Gray to Binary Converter Binary Code [41:32], offset: 0xB6C */ + uint8_t RESERVED_11[716]; + __I uint32_t ROP_STATE; /**< ROP State Register, offset: 0xE3C */ + __I uint32_t OVP_PAD_STATE; /**< OVP_PAD_STATE, offset: 0xE40 */ + __I uint32_t PROBE_STATE; /**< PROBE_STATE, offset: 0xE44 */ + __I uint32_t FT_STATE_A; /**< FT_STATE_A, offset: 0xE48 */ + __I uint32_t FT_STATE_B; /**< FT_STATE_B, offset: 0xE4C */ + uint8_t RESERVED_12[8]; + __IO uint32_t SRAM_XEN; /**< RAM XEN Control, offset: 0xE58 */ + __IO uint32_t SRAM_XEN_DP; /**< RAM XEN Control (Duplicate), offset: 0xE5C */ + uint8_t RESERVED_13[32]; + __I uint32_t ELS_OTP_LC_STATE; /**< Life Cycle State Register, offset: 0xE80 */ + __I uint32_t ELS_OTP_LC_STATE_DP; /**< Life Cycle State Register (Duplicate), offset: 0xE84 */ + uint8_t RESERVED_14[280]; + __IO uint32_t DEBUG_LOCK_EN; /**< Control Write Access to Security, offset: 0xFA0 */ + __IO uint32_t DEBUG_FEATURES; /**< Cortex Debug Features Control, offset: 0xFA4 */ + __IO uint32_t DEBUG_FEATURES_DP; /**< Cortex Debug Features Control (Duplicate), offset: 0xFA8 */ + uint8_t RESERVED_15[8]; + __IO uint32_t SWD_ACCESS_CPU0; /**< CPU0 Software Debug Access, offset: 0xFB4 */ + uint8_t RESERVED_16[8]; + __IO uint32_t DEBUG_AUTH_BEACON; /**< Debug Authentication BEACON, offset: 0xFC0 */ + uint8_t RESERVED_17[44]; + __I uint32_t JTAG_ID; /**< JTAG Chip ID, offset: 0xFF0 */ + __I uint32_t DEVICE_TYPE; /**< Device Type, offset: 0xFF4 */ + __I uint32_t DEVICE_ID0; /**< Device ID, offset: 0xFF8 */ + __I uint32_t DIEID; /**< Chip Revision ID and Number, offset: 0xFFC */ +} SYSCON_Type; + +/* ---------------------------------------------------------------------------- + -- SYSCON Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SYSCON_Register_Masks SYSCON Register Masks + * @{ + */ + +/*! @name REMAP - AHB Matrix Remap Control */ +/*! @{ */ + +#define SYSCON_REMAP_CPU0_SBUS_MASK (0x3U) +#define SYSCON_REMAP_CPU0_SBUS_SHIFT (0U) +/*! CPU0_SBUS - RAMX0 address remap for CPU System bus + * 0b00..RAMX0: 0x04000000 - 0x04001fff + * 0b01..RAMX0: 0x2001e000 - 0x2001ffff(for 128KB RAM chip) / 0x20016000 - 0x20017fff(for 96KB RAM chip) / 0x2000e000 - 0x2000ffff(for 64KB RAM chip) + */ +#define SYSCON_REMAP_CPU0_SBUS(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_REMAP_CPU0_SBUS_SHIFT)) & SYSCON_REMAP_CPU0_SBUS_MASK) + +#define SYSCON_REMAP_DMA0_MASK (0xCU) +#define SYSCON_REMAP_DMA0_SHIFT (2U) +/*! DMA0 - RAMX0 address remap for DMA0 + * 0b00..RAMX0: 0x04000000 - 0x04001fff + * 0b01..RAMX0: same alias space as CPU0_SBUS + */ +#define SYSCON_REMAP_DMA0(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_REMAP_DMA0_SHIFT)) & SYSCON_REMAP_DMA0_MASK) + +#define SYSCON_REMAP_USB0_MASK (0x30U) +#define SYSCON_REMAP_USB0_SHIFT (4U) +/*! USB0 - RAMX0 address remap for USB0 + * 0b00..RAMX0: 0x04000000 - 0x04001fff + * 0b01..RAMX0: same alias space as CPU0_SBUS + */ +#define SYSCON_REMAP_USB0(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_REMAP_USB0_SHIFT)) & SYSCON_REMAP_USB0_MASK) + +#define SYSCON_REMAP_LOCK_MASK (0x80000000U) +#define SYSCON_REMAP_LOCK_SHIFT (31U) +/*! LOCK - This 1-bit field provides a mechanism to limit writes to the this register to protect its + * contents. Once set, this bit remains asserted until a system reset. + * 0b0..This register is not locked and can be altered. + * 0b1..This register is locked and cannot be altered until a system reset. + */ +#define SYSCON_REMAP_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_REMAP_LOCK_SHIFT)) & SYSCON_REMAP_LOCK_MASK) +/*! @} */ + +/*! @name AHBMATPRIO - AHB Matrix Priority Control */ +/*! @{ */ + +#define SYSCON_AHBMATPRIO_CPU0_CBUS_MASK (0x3U) +#define SYSCON_AHBMATPRIO_CPU0_CBUS_SHIFT (0U) +/*! CPU0_CBUS - CPU0 C-AHB bus master priority level + * 0b00..level 0 + * 0b01..level 1 + * 0b10..level 2 + * 0b11..level 3 + */ +#define SYSCON_AHBMATPRIO_CPU0_CBUS(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_AHBMATPRIO_CPU0_CBUS_SHIFT)) & SYSCON_AHBMATPRIO_CPU0_CBUS_MASK) + +#define SYSCON_AHBMATPRIO_CPU0_SBUS_MASK (0xCU) +#define SYSCON_AHBMATPRIO_CPU0_SBUS_SHIFT (2U) +/*! CPU0_SBUS - CPU0 S-AHB bus master priority level + * 0b00..level 0 + * 0b01..level 1 + * 0b10..level 2 + * 0b11..level 3 + */ +#define SYSCON_AHBMATPRIO_CPU0_SBUS(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_AHBMATPRIO_CPU0_SBUS_SHIFT)) & SYSCON_AHBMATPRIO_CPU0_SBUS_MASK) + +#define SYSCON_AHBMATPRIO_DMA0_MASK (0x300U) +#define SYSCON_AHBMATPRIO_DMA0_SHIFT (8U) +/*! DMA0 - DMA0 controller bus master priority level + * 0b00..level 0 + * 0b01..level 1 + * 0b10..level 2 + * 0b11..level 3 + */ +#define SYSCON_AHBMATPRIO_DMA0(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_AHBMATPRIO_DMA0_SHIFT)) & SYSCON_AHBMATPRIO_DMA0_MASK) + +#define SYSCON_AHBMATPRIO_USB_FS_ENET_MASK (0x3000000U) +#define SYSCON_AHBMATPRIO_USB_FS_ENET_SHIFT (24U) +/*! USB_FS_ENET - USB-FS bus master priority level + * 0b00..level 0 + * 0b01..level 1 + * 0b10..level 2 + * 0b11..level 3 + */ +#define SYSCON_AHBMATPRIO_USB_FS_ENET(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_AHBMATPRIO_USB_FS_ENET_SHIFT)) & SYSCON_AHBMATPRIO_USB_FS_ENET_MASK) +/*! @} */ + +/*! @name CPU0NSTCKCAL - Non-Secure CPU0 System Tick Calibration */ +/*! @{ */ + +#define SYSCON_CPU0NSTCKCAL_TENMS_MASK (0xFFFFFFU) +#define SYSCON_CPU0NSTCKCAL_TENMS_SHIFT (0U) +/*! TENMS - Reload value for 10 ms (100 Hz) timing, subject to system clock skew errors. If the + * value reads as zero, the calibration value is not known. + */ +#define SYSCON_CPU0NSTCKCAL_TENMS(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CPU0NSTCKCAL_TENMS_SHIFT)) & SYSCON_CPU0NSTCKCAL_TENMS_MASK) + +#define SYSCON_CPU0NSTCKCAL_SKEW_MASK (0x1000000U) +#define SYSCON_CPU0NSTCKCAL_SKEW_SHIFT (24U) +/*! SKEW - Indicates whether the TENMS value is exact. + * 0b0..TENMS value is exact + * 0b1..TENMS value is not exact or not given + */ +#define SYSCON_CPU0NSTCKCAL_SKEW(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CPU0NSTCKCAL_SKEW_SHIFT)) & SYSCON_CPU0NSTCKCAL_SKEW_MASK) + +#define SYSCON_CPU0NSTCKCAL_NOREF_MASK (0x2000000U) +#define SYSCON_CPU0NSTCKCAL_NOREF_SHIFT (25U) +/*! NOREF - Indicates whether the device provides a reference clock to the processor. + * 0b0..Reference clock is provided + * 0b1..No reference clock is provided + */ +#define SYSCON_CPU0NSTCKCAL_NOREF(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CPU0NSTCKCAL_NOREF_SHIFT)) & SYSCON_CPU0NSTCKCAL_NOREF_MASK) +/*! @} */ + +/*! @name NMISRC - NMI Source Select */ +/*! @{ */ + +#define SYSCON_NMISRC_IRQCPU0_MASK (0xFFU) +#define SYSCON_NMISRC_IRQCPU0_SHIFT (0U) +/*! IRQCPU0 - The IRQ number of the interrupt that acts as the Non-Maskable Interrupt (NMI) for CPU0, if enabled by NMIENCPU0. */ +#define SYSCON_NMISRC_IRQCPU0(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_NMISRC_IRQCPU0_SHIFT)) & SYSCON_NMISRC_IRQCPU0_MASK) + +#define SYSCON_NMISRC_NMIENCPU0_MASK (0x80000000U) +#define SYSCON_NMISRC_NMIENCPU0_SHIFT (31U) +/*! NMIENCPU0 - Enables the Non-Maskable Interrupt (NMI) source selected by IRQCPU0. + * 0b1..Enable. + * 0b0..Disable. + */ +#define SYSCON_NMISRC_NMIENCPU0(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_NMISRC_NMIENCPU0_SHIFT)) & SYSCON_NMISRC_NMIENCPU0_MASK) +/*! @} */ + +/*! @name SLOWCLKDIV - SLOW_CLK Clock Divider */ +/*! @{ */ + +#define SYSCON_SLOWCLKDIV_RESET_MASK (0x20000000U) +#define SYSCON_SLOWCLKDIV_RESET_SHIFT (29U) +/*! RESET - Resets the divider counter + * 0b1..Divider is reset + * 0b0..Divider is not reset + */ +#define SYSCON_SLOWCLKDIV_RESET(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SLOWCLKDIV_RESET_SHIFT)) & SYSCON_SLOWCLKDIV_RESET_MASK) + +#define SYSCON_SLOWCLKDIV_HALT_MASK (0x40000000U) +#define SYSCON_SLOWCLKDIV_HALT_SHIFT (30U) +/*! HALT - Halts the divider counter + * 0b1..Divider clock is stopped + * 0b0..Divider clock is running + */ +#define SYSCON_SLOWCLKDIV_HALT(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SLOWCLKDIV_HALT_SHIFT)) & SYSCON_SLOWCLKDIV_HALT_MASK) + +#define SYSCON_SLOWCLKDIV_UNSTAB_MASK (0x80000000U) +#define SYSCON_SLOWCLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b1..Clock frequency is not stable + * 0b0..Divider clock is stable + */ +#define SYSCON_SLOWCLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SLOWCLKDIV_UNSTAB_SHIFT)) & SYSCON_SLOWCLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name AHBCLKDIV - System Clock Divider */ +/*! @{ */ + +#define SYSCON_AHBCLKDIV_DIV_MASK (0xFFU) +#define SYSCON_AHBCLKDIV_DIV_SHIFT (0U) +/*! DIV - Clock divider value */ +#define SYSCON_AHBCLKDIV_DIV(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_AHBCLKDIV_DIV_SHIFT)) & SYSCON_AHBCLKDIV_DIV_MASK) + +#define SYSCON_AHBCLKDIV_UNSTAB_MASK (0x80000000U) +#define SYSCON_AHBCLKDIV_UNSTAB_SHIFT (31U) +/*! UNSTAB - Divider status flag + * 0b1..Clock frequency is not stable + * 0b0..Divider clock is stable + */ +#define SYSCON_AHBCLKDIV_UNSTAB(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_AHBCLKDIV_UNSTAB_SHIFT)) & SYSCON_AHBCLKDIV_UNSTAB_MASK) +/*! @} */ + +/*! @name CLKUNLOCK - Clock Configuration Unlock */ +/*! @{ */ + +#define SYSCON_CLKUNLOCK_UNLOCK_MASK (0x1U) +#define SYSCON_CLKUNLOCK_UNLOCK_SHIFT (0U) +/*! UNLOCK - Controls clock configuration registers access (for example, MRCC_xxx_CLKDIV, MRCC_xxx_CLKSEL, MRCC_GLB_xxx) + * 0b1..Freezes all clock configuration registers update. + * 0b0..Updates are allowed to all clock configuration registers + */ +#define SYSCON_CLKUNLOCK_UNLOCK(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CLKUNLOCK_UNLOCK_SHIFT)) & SYSCON_CLKUNLOCK_UNLOCK_MASK) +/*! @} */ + +/*! @name NVM_CTRL - NVM Control */ +/*! @{ */ + +#define SYSCON_NVM_CTRL_DIS_FLASH_SPEC_MASK (0x1U) +#define SYSCON_NVM_CTRL_DIS_FLASH_SPEC_SHIFT (0U) +/*! DIS_FLASH_SPEC - Flash speculation control + * 0b0..Enables flash speculation + * 0b1..Disables flash speculation + */ +#define SYSCON_NVM_CTRL_DIS_FLASH_SPEC(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_NVM_CTRL_DIS_FLASH_SPEC_SHIFT)) & SYSCON_NVM_CTRL_DIS_FLASH_SPEC_MASK) + +#define SYSCON_NVM_CTRL_DIS_DATA_SPEC_MASK (0x2U) +#define SYSCON_NVM_CTRL_DIS_DATA_SPEC_SHIFT (1U) +/*! DIS_DATA_SPEC - Flash data speculation control + * 0b0..Enables data speculation + * 0b1..Disables data speculation + */ +#define SYSCON_NVM_CTRL_DIS_DATA_SPEC(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_NVM_CTRL_DIS_DATA_SPEC_SHIFT)) & SYSCON_NVM_CTRL_DIS_DATA_SPEC_MASK) + +#define SYSCON_NVM_CTRL_FLASH_STALL_EN_MASK (0x400U) +#define SYSCON_NVM_CTRL_FLASH_STALL_EN_SHIFT (10U) +/*! FLASH_STALL_EN - FLASH stall on busy control + * 0b0..No stall on FLASH busy + * 0b1..Stall on FLASH busy + */ +#define SYSCON_NVM_CTRL_FLASH_STALL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_NVM_CTRL_FLASH_STALL_EN_SHIFT)) & SYSCON_NVM_CTRL_FLASH_STALL_EN_MASK) + +#define SYSCON_NVM_CTRL_DIS_MBECC_ERR_INST_MASK (0x10000U) +#define SYSCON_NVM_CTRL_DIS_MBECC_ERR_INST_SHIFT (16U) +/*! DIS_MBECC_ERR_INST + * 0b0..Enables bus error on multi-bit ECC error for instruction + * 0b1..Disables bus error on multi-bit ECC error for instruction + */ +#define SYSCON_NVM_CTRL_DIS_MBECC_ERR_INST(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_NVM_CTRL_DIS_MBECC_ERR_INST_SHIFT)) & SYSCON_NVM_CTRL_DIS_MBECC_ERR_INST_MASK) + +#define SYSCON_NVM_CTRL_DIS_MBECC_ERR_DATA_MASK (0x20000U) +#define SYSCON_NVM_CTRL_DIS_MBECC_ERR_DATA_SHIFT (17U) +/*! DIS_MBECC_ERR_DATA + * 0b0..Enables bus error on multi-bit ECC error for data + * 0b1..Disables bus error on multi-bit ECC error for data + */ +#define SYSCON_NVM_CTRL_DIS_MBECC_ERR_DATA(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_NVM_CTRL_DIS_MBECC_ERR_DATA_SHIFT)) & SYSCON_NVM_CTRL_DIS_MBECC_ERR_DATA_MASK) +/*! @} */ + +/*! @name CPUSTAT - CPU Status */ +/*! @{ */ + +#define SYSCON_CPUSTAT_CPU0SLEEPING_MASK (0x1U) +#define SYSCON_CPUSTAT_CPU0SLEEPING_SHIFT (0U) +/*! CPU0SLEEPING - CPU0 sleeping state + * 0b1..CPU is sleeping + * 0b0..CPU is not sleeping + */ +#define SYSCON_CPUSTAT_CPU0SLEEPING(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CPUSTAT_CPU0SLEEPING_SHIFT)) & SYSCON_CPUSTAT_CPU0SLEEPING_MASK) + +#define SYSCON_CPUSTAT_CPU0LOCKUP_MASK (0x4U) +#define SYSCON_CPUSTAT_CPU0LOCKUP_SHIFT (2U) +/*! CPU0LOCKUP - CPU0 lockup state + * 0b1..CPU is in lockup + * 0b0..CPU is not in lockup + */ +#define SYSCON_CPUSTAT_CPU0LOCKUP(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CPUSTAT_CPU0LOCKUP_SHIFT)) & SYSCON_CPUSTAT_CPU0LOCKUP_MASK) +/*! @} */ + +/*! @name LPCAC_CTRL - LPCAC Control */ +/*! @{ */ + +#define SYSCON_LPCAC_CTRL_DIS_LPCAC_MASK (0x1U) +#define SYSCON_LPCAC_CTRL_DIS_LPCAC_SHIFT (0U) +/*! DIS_LPCAC - Disables/enables the cache function. + * 0b0..Enabled + * 0b1..Disabled + */ +#define SYSCON_LPCAC_CTRL_DIS_LPCAC(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_LPCAC_CTRL_DIS_LPCAC_SHIFT)) & SYSCON_LPCAC_CTRL_DIS_LPCAC_MASK) + +#define SYSCON_LPCAC_CTRL_CLR_LPCAC_MASK (0x2U) +#define SYSCON_LPCAC_CTRL_CLR_LPCAC_SHIFT (1U) +/*! CLR_LPCAC - Clears the cache function. + * 0b0..Unclears the cache + * 0b1..Clears the cache + */ +#define SYSCON_LPCAC_CTRL_CLR_LPCAC(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_LPCAC_CTRL_CLR_LPCAC_SHIFT)) & SYSCON_LPCAC_CTRL_CLR_LPCAC_MASK) + +#define SYSCON_LPCAC_CTRL_FRC_NO_ALLOC_MASK (0x4U) +#define SYSCON_LPCAC_CTRL_FRC_NO_ALLOC_SHIFT (2U) +/*! FRC_NO_ALLOC - Forces no allocation. + * 0b0..Forces allocation + * 0b1..Forces no allocation + */ +#define SYSCON_LPCAC_CTRL_FRC_NO_ALLOC(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_LPCAC_CTRL_FRC_NO_ALLOC_SHIFT)) & SYSCON_LPCAC_CTRL_FRC_NO_ALLOC_MASK) + +#define SYSCON_LPCAC_CTRL_DIS_LPCAC_WTBF_MASK (0x10U) +#define SYSCON_LPCAC_CTRL_DIS_LPCAC_WTBF_SHIFT (4U) +/*! DIS_LPCAC_WTBF - Disable LPCAC Write Through Buffer. + * 0b1..Disables write through buffer + * 0b0..Enables write through buffer + */ +#define SYSCON_LPCAC_CTRL_DIS_LPCAC_WTBF(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_LPCAC_CTRL_DIS_LPCAC_WTBF_SHIFT)) & SYSCON_LPCAC_CTRL_DIS_LPCAC_WTBF_MASK) + +#define SYSCON_LPCAC_CTRL_LIM_LPCAC_WTBF_MASK (0x20U) +#define SYSCON_LPCAC_CTRL_LIM_LPCAC_WTBF_SHIFT (5U) +/*! LIM_LPCAC_WTBF - Limit LPCAC Write Through Buffer. + * 0b1..Write buffer enabled when transaction is cacheable and bufferable + * 0b0..Write buffer enabled when transaction is bufferable. + */ +#define SYSCON_LPCAC_CTRL_LIM_LPCAC_WTBF(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_LPCAC_CTRL_LIM_LPCAC_WTBF_SHIFT)) & SYSCON_LPCAC_CTRL_LIM_LPCAC_WTBF_MASK) + +#define SYSCON_LPCAC_CTRL_LPCAC_XOM_MASK (0x80U) +#define SYSCON_LPCAC_CTRL_LPCAC_XOM_SHIFT (7U) +/*! LPCAC_XOM - LPCAC XOM(eXecute-Only-Memory) attribute control + * 0b1..Enabled. + * 0b0..Disabled. + */ +#define SYSCON_LPCAC_CTRL_LPCAC_XOM(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_LPCAC_CTRL_LPCAC_XOM_SHIFT)) & SYSCON_LPCAC_CTRL_LPCAC_XOM_MASK) + +#define SYSCON_LPCAC_CTRL_LPCAC_MEM_REQ_MASK (0x100U) +#define SYSCON_LPCAC_CTRL_LPCAC_MEM_REQ_SHIFT (8U) +/*! LPCAC_MEM_REQ - Request LPCAC memories. + * 0b1..Configure shared memories RAMX1 as LPCAC memories, write one lock until a system reset. + * 0b0..Configure shared memories RAMX1 as general memories. + */ +#define SYSCON_LPCAC_CTRL_LPCAC_MEM_REQ(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_LPCAC_CTRL_LPCAC_MEM_REQ_SHIFT)) & SYSCON_LPCAC_CTRL_LPCAC_MEM_REQ_MASK) +/*! @} */ + +/*! @name PWM0SUBCTL - PWM0 Submodule Control */ +/*! @{ */ + +#define SYSCON_PWM0SUBCTL_CLK0_EN_MASK (0x1U) +#define SYSCON_PWM0SUBCTL_CLK0_EN_SHIFT (0U) +/*! CLK0_EN - Enables PWM0 SUB Clock0 + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_PWM0SUBCTL_CLK0_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PWM0SUBCTL_CLK0_EN_SHIFT)) & SYSCON_PWM0SUBCTL_CLK0_EN_MASK) + +#define SYSCON_PWM0SUBCTL_CLK1_EN_MASK (0x2U) +#define SYSCON_PWM0SUBCTL_CLK1_EN_SHIFT (1U) +/*! CLK1_EN - Enables PWM0 SUB Clock1 + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_PWM0SUBCTL_CLK1_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PWM0SUBCTL_CLK1_EN_SHIFT)) & SYSCON_PWM0SUBCTL_CLK1_EN_MASK) + +#define SYSCON_PWM0SUBCTL_CLK2_EN_MASK (0x4U) +#define SYSCON_PWM0SUBCTL_CLK2_EN_SHIFT (2U) +/*! CLK2_EN - Enables PWM0 SUB Clock2 + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_PWM0SUBCTL_CLK2_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PWM0SUBCTL_CLK2_EN_SHIFT)) & SYSCON_PWM0SUBCTL_CLK2_EN_MASK) + +#define SYSCON_PWM0SUBCTL_CLK3_EN_MASK (0x8U) +#define SYSCON_PWM0SUBCTL_CLK3_EN_SHIFT (3U) +/*! CLK3_EN - Enables PWM0 SUB Clock3 + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_PWM0SUBCTL_CLK3_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PWM0SUBCTL_CLK3_EN_SHIFT)) & SYSCON_PWM0SUBCTL_CLK3_EN_MASK) +/*! @} */ + +/*! @name PWM1SUBCTL - PWM1 Submodule Control */ +/*! @{ */ + +#define SYSCON_PWM1SUBCTL_CLK0_EN_MASK (0x1U) +#define SYSCON_PWM1SUBCTL_CLK0_EN_SHIFT (0U) +/*! CLK0_EN - Enables PWM1 SUB Clock0 + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_PWM1SUBCTL_CLK0_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PWM1SUBCTL_CLK0_EN_SHIFT)) & SYSCON_PWM1SUBCTL_CLK0_EN_MASK) + +#define SYSCON_PWM1SUBCTL_CLK1_EN_MASK (0x2U) +#define SYSCON_PWM1SUBCTL_CLK1_EN_SHIFT (1U) +/*! CLK1_EN - Enables PWM1 SUB Clock1 + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_PWM1SUBCTL_CLK1_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PWM1SUBCTL_CLK1_EN_SHIFT)) & SYSCON_PWM1SUBCTL_CLK1_EN_MASK) + +#define SYSCON_PWM1SUBCTL_CLK2_EN_MASK (0x4U) +#define SYSCON_PWM1SUBCTL_CLK2_EN_SHIFT (2U) +/*! CLK2_EN - Enables PWM1 SUB Clock2 + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_PWM1SUBCTL_CLK2_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PWM1SUBCTL_CLK2_EN_SHIFT)) & SYSCON_PWM1SUBCTL_CLK2_EN_MASK) + +#define SYSCON_PWM1SUBCTL_CLK3_EN_MASK (0x8U) +#define SYSCON_PWM1SUBCTL_CLK3_EN_SHIFT (3U) +/*! CLK3_EN - Enables PWM1 SUB Clock3 + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_PWM1SUBCTL_CLK3_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PWM1SUBCTL_CLK3_EN_SHIFT)) & SYSCON_PWM1SUBCTL_CLK3_EN_MASK) +/*! @} */ + +/*! @name CTIMERGLOBALSTARTEN - CTIMER Global Start Enable */ +/*! @{ */ + +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER0_CLK_EN_MASK (0x1U) +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER0_CLK_EN_SHIFT (0U) +/*! CTIMER0_CLK_EN - Enables the CTIMER0 function clock + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER0_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CTIMERGLOBALSTARTEN_CTIMER0_CLK_EN_SHIFT)) & SYSCON_CTIMERGLOBALSTARTEN_CTIMER0_CLK_EN_MASK) + +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER1_CLK_EN_MASK (0x2U) +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER1_CLK_EN_SHIFT (1U) +/*! CTIMER1_CLK_EN - Enables the CTIMER1 function clock + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER1_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CTIMERGLOBALSTARTEN_CTIMER1_CLK_EN_SHIFT)) & SYSCON_CTIMERGLOBALSTARTEN_CTIMER1_CLK_EN_MASK) + +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER2_CLK_EN_MASK (0x4U) +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER2_CLK_EN_SHIFT (2U) +/*! CTIMER2_CLK_EN - Enables the CTIMER2 function clock + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER2_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CTIMERGLOBALSTARTEN_CTIMER2_CLK_EN_SHIFT)) & SYSCON_CTIMERGLOBALSTARTEN_CTIMER2_CLK_EN_MASK) + +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER3_CLK_EN_MASK (0x8U) +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER3_CLK_EN_SHIFT (3U) +/*! CTIMER3_CLK_EN - Enables the CTIMER3 function clock + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER3_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CTIMERGLOBALSTARTEN_CTIMER3_CLK_EN_SHIFT)) & SYSCON_CTIMERGLOBALSTARTEN_CTIMER3_CLK_EN_MASK) + +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER4_CLK_EN_MASK (0x10U) +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER4_CLK_EN_SHIFT (4U) +/*! CTIMER4_CLK_EN - Enables the CTIMER4 function clock + * 0b1..Enable + * 0b0..Disable + */ +#define SYSCON_CTIMERGLOBALSTARTEN_CTIMER4_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_CTIMERGLOBALSTARTEN_CTIMER4_CLK_EN_SHIFT)) & SYSCON_CTIMERGLOBALSTARTEN_CTIMER4_CLK_EN_MASK) +/*! @} */ + +/*! @name RAM_CTRL - RAM Control */ +/*! @{ */ + +#define SYSCON_RAM_CTRL_RAMA_ECC_ENABLE_MASK (0x1U) +#define SYSCON_RAM_CTRL_RAMA_ECC_ENABLE_SHIFT (0U) +/*! RAMA_ECC_ENABLE - RAMA0 ECC enable + * 0b1..ECC is enabled + * 0b0..ECC is disabled + */ +#define SYSCON_RAM_CTRL_RAMA_ECC_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_RAM_CTRL_RAMA_ECC_ENABLE_SHIFT)) & SYSCON_RAM_CTRL_RAMA_ECC_ENABLE_MASK) + +#define SYSCON_RAM_CTRL_RAMA_CG_OVERRIDE_MASK (0x10000U) +#define SYSCON_RAM_CTRL_RAMA_CG_OVERRIDE_SHIFT (16U) +/*! RAMA_CG_OVERRIDE - RAMA bank clock gating control, only avaiable when RAMA_ECC_ENABLE = 0. + * 0b1..Auto clock gating feature is disabled + * 0b0..Memory bank clock is gated automatically if no access more than 16 clock cycles + */ +#define SYSCON_RAM_CTRL_RAMA_CG_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_RAM_CTRL_RAMA_CG_OVERRIDE_SHIFT)) & SYSCON_RAM_CTRL_RAMA_CG_OVERRIDE_MASK) + +#define SYSCON_RAM_CTRL_RAMX_CG_OVERRIDE_MASK (0x20000U) +#define SYSCON_RAM_CTRL_RAMX_CG_OVERRIDE_SHIFT (17U) +/*! RAMX_CG_OVERRIDE - RAMX bank clock gating control + * 0b1..Auto clock gating feature is disabled + * 0b0..Memory bank clock is gated automatically if no access more than 16 clock cycles + */ +#define SYSCON_RAM_CTRL_RAMX_CG_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_RAM_CTRL_RAMX_CG_OVERRIDE_SHIFT)) & SYSCON_RAM_CTRL_RAMX_CG_OVERRIDE_MASK) + +#define SYSCON_RAM_CTRL_RAMB_CG_OVERRIDE_MASK (0x40000U) +#define SYSCON_RAM_CTRL_RAMB_CG_OVERRIDE_SHIFT (18U) +/*! RAMB_CG_OVERRIDE - RAMB bank clock gating control + * 0b1..Auto clock gating feature is disabled + * 0b0..Memory bank clock is gated automatically if no access more than 16 clock cycles + */ +#define SYSCON_RAM_CTRL_RAMB_CG_OVERRIDE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_RAM_CTRL_RAMB_CG_OVERRIDE_SHIFT)) & SYSCON_RAM_CTRL_RAMB_CG_OVERRIDE_MASK) +/*! @} */ + +/*! @name GRAY_CODE_LSB - Gray to Binary Converter Gray Code [31:0] */ +/*! @{ */ + +#define SYSCON_GRAY_CODE_LSB_code_gray_31_0_MASK (0xFFFFFFFFU) +#define SYSCON_GRAY_CODE_LSB_code_gray_31_0_SHIFT (0U) +/*! code_gray_31_0 - Gray code [31:0] */ +#define SYSCON_GRAY_CODE_LSB_code_gray_31_0(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_GRAY_CODE_LSB_code_gray_31_0_SHIFT)) & SYSCON_GRAY_CODE_LSB_code_gray_31_0_MASK) +/*! @} */ + +/*! @name GRAY_CODE_MSB - Gray to Binary Converter Gray Code [41:32] */ +/*! @{ */ + +#define SYSCON_GRAY_CODE_MSB_code_gray_41_32_MASK (0x3FFU) +#define SYSCON_GRAY_CODE_MSB_code_gray_41_32_SHIFT (0U) +/*! code_gray_41_32 - Gray code [41:32] */ +#define SYSCON_GRAY_CODE_MSB_code_gray_41_32(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_GRAY_CODE_MSB_code_gray_41_32_SHIFT)) & SYSCON_GRAY_CODE_MSB_code_gray_41_32_MASK) +/*! @} */ + +/*! @name BINARY_CODE_LSB - Gray to Binary Converter Binary Code [31:0] */ +/*! @{ */ + +#define SYSCON_BINARY_CODE_LSB_code_bin_31_0_MASK (0xFFFFFFFFU) +#define SYSCON_BINARY_CODE_LSB_code_bin_31_0_SHIFT (0U) +/*! code_bin_31_0 - Binary code [31:0] */ +#define SYSCON_BINARY_CODE_LSB_code_bin_31_0(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_BINARY_CODE_LSB_code_bin_31_0_SHIFT)) & SYSCON_BINARY_CODE_LSB_code_bin_31_0_MASK) +/*! @} */ + +/*! @name BINARY_CODE_MSB - Gray to Binary Converter Binary Code [41:32] */ +/*! @{ */ + +#define SYSCON_BINARY_CODE_MSB_code_bin_41_32_MASK (0x3FFU) +#define SYSCON_BINARY_CODE_MSB_code_bin_41_32_SHIFT (0U) +/*! code_bin_41_32 - Binary code [41:32] */ +#define SYSCON_BINARY_CODE_MSB_code_bin_41_32(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_BINARY_CODE_MSB_code_bin_41_32_SHIFT)) & SYSCON_BINARY_CODE_MSB_code_bin_41_32_MASK) +/*! @} */ + +/*! @name ROP_STATE - ROP State Register */ +/*! @{ */ + +#define SYSCON_ROP_STATE_ROP_STATE_MASK (0xFFFFFFFFU) +#define SYSCON_ROP_STATE_ROP_STATE_SHIFT (0U) +/*! ROP_STATE - ROP state */ +#define SYSCON_ROP_STATE_ROP_STATE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_ROP_STATE_ROP_STATE_SHIFT)) & SYSCON_ROP_STATE_ROP_STATE_MASK) +/*! @} */ + +/*! @name OVP_PAD_STATE - OVP_PAD_STATE */ +/*! @{ */ + +#define SYSCON_OVP_PAD_STATE_OVP_PAD_STATE_MASK (0xFFFFFFFFU) +#define SYSCON_OVP_PAD_STATE_OVP_PAD_STATE_SHIFT (0U) +/*! OVP_PAD_STATE - OVP_PAD_STATE */ +#define SYSCON_OVP_PAD_STATE_OVP_PAD_STATE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_OVP_PAD_STATE_OVP_PAD_STATE_SHIFT)) & SYSCON_OVP_PAD_STATE_OVP_PAD_STATE_MASK) +/*! @} */ + +/*! @name PROBE_STATE - PROBE_STATE */ +/*! @{ */ + +#define SYSCON_PROBE_STATE_PROBE_STATE_MASK (0xFFFFFFFFU) +#define SYSCON_PROBE_STATE_PROBE_STATE_SHIFT (0U) +/*! PROBE_STATE - PROBE_STATE */ +#define SYSCON_PROBE_STATE_PROBE_STATE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_PROBE_STATE_PROBE_STATE_SHIFT)) & SYSCON_PROBE_STATE_PROBE_STATE_MASK) +/*! @} */ + +/*! @name FT_STATE_A - FT_STATE_A */ +/*! @{ */ + +#define SYSCON_FT_STATE_A_FT_STATE_A_MASK (0xFFFFFFFFU) +#define SYSCON_FT_STATE_A_FT_STATE_A_SHIFT (0U) +/*! FT_STATE_A - FT_STATE_A */ +#define SYSCON_FT_STATE_A_FT_STATE_A(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_FT_STATE_A_FT_STATE_A_SHIFT)) & SYSCON_FT_STATE_A_FT_STATE_A_MASK) +/*! @} */ + +/*! @name FT_STATE_B - FT_STATE_B */ +/*! @{ */ + +#define SYSCON_FT_STATE_B_FT_STATE_B_MASK (0xFFFFFFFFU) +#define SYSCON_FT_STATE_B_FT_STATE_B_SHIFT (0U) +/*! FT_STATE_B - FT_STATE_B */ +#define SYSCON_FT_STATE_B_FT_STATE_B(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_FT_STATE_B_FT_STATE_B_SHIFT)) & SYSCON_FT_STATE_B_FT_STATE_B_MASK) +/*! @} */ + +/*! @name SRAM_XEN - RAM XEN Control */ +/*! @{ */ + +#define SYSCON_SRAM_XEN_RAMX0_XEN_MASK (0x1U) +#define SYSCON_SRAM_XEN_RAMX0_XEN_SHIFT (0U) +/*! RAMX0_XEN - RAMX0 Execute permission control. + * 0b1..Execute permission is enabled, R/W/X are enabled. + * 0b0..Execute permission is disabled, R/W are enabled. + */ +#define SYSCON_SRAM_XEN_RAMX0_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_RAMX0_XEN_SHIFT)) & SYSCON_SRAM_XEN_RAMX0_XEN_MASK) + +#define SYSCON_SRAM_XEN_RAMX1_XEN_MASK (0x2U) +#define SYSCON_SRAM_XEN_RAMX1_XEN_SHIFT (1U) +/*! RAMX1_XEN - RAMX1 Execute permission control. + * 0b1..Execute permission is enabled, R/W/X are enabled. + * 0b0..Execute permission is disabled, R/W are enabled. + */ +#define SYSCON_SRAM_XEN_RAMX1_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_RAMX1_XEN_SHIFT)) & SYSCON_SRAM_XEN_RAMX1_XEN_MASK) + +#define SYSCON_SRAM_XEN_RAMA0_XEN_MASK (0x4U) +#define SYSCON_SRAM_XEN_RAMA0_XEN_SHIFT (2U) +/*! RAMA0_XEN - RAMA0 Execute permission control. + * 0b1..Execute permission is enabled, R/W/X are enabled. + * 0b0..Execute permission is disabled, R/W are enabled. + */ +#define SYSCON_SRAM_XEN_RAMA0_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_RAMA0_XEN_SHIFT)) & SYSCON_SRAM_XEN_RAMA0_XEN_MASK) + +#define SYSCON_SRAM_XEN_RAMA1_XEN_MASK (0x8U) +#define SYSCON_SRAM_XEN_RAMA1_XEN_SHIFT (3U) +/*! RAMA1_XEN - RAMAx (excepts RAMA0) Execute permission control. + * 0b1..Execute permission is enabled, R/W/X are enabled. + * 0b0..Execute permission is disabled, R/W are enabled. + */ +#define SYSCON_SRAM_XEN_RAMA1_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_RAMA1_XEN_SHIFT)) & SYSCON_SRAM_XEN_RAMA1_XEN_MASK) + +#define SYSCON_SRAM_XEN_RAMB_XEN_MASK (0x10U) +#define SYSCON_SRAM_XEN_RAMB_XEN_SHIFT (4U) +/*! RAMB_XEN - RAMBx Execute permission control. + * 0b1..Execute permission is enabled, R/W/X are enabled. + * 0b0..Execute permission is disabled, R/W are enabled. + */ +#define SYSCON_SRAM_XEN_RAMB_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_RAMB_XEN_SHIFT)) & SYSCON_SRAM_XEN_RAMB_XEN_MASK) + +#define SYSCON_SRAM_XEN_LOCK_MASK (0x80000000U) +#define SYSCON_SRAM_XEN_LOCK_SHIFT (31U) +/*! LOCK - This 1-bit field provides a mechanism to limit writes to the this register (and + * SRAM_XEN_DP) to protect its contents. Once set, this bit remains asserted until a system reset. + * 0b0..This register is not locked and can be altered. + * 0b1..This register is locked and cannot be altered. + */ +#define SYSCON_SRAM_XEN_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_LOCK_SHIFT)) & SYSCON_SRAM_XEN_LOCK_MASK) +/*! @} */ + +/*! @name SRAM_XEN_DP - RAM XEN Control (Duplicate) */ +/*! @{ */ + +#define SYSCON_SRAM_XEN_DP_RAMX0_XEN_MASK (0x1U) +#define SYSCON_SRAM_XEN_DP_RAMX0_XEN_SHIFT (0U) +/*! RAMX0_XEN - Refer to SRAM_XEN for more details. */ +#define SYSCON_SRAM_XEN_DP_RAMX0_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_DP_RAMX0_XEN_SHIFT)) & SYSCON_SRAM_XEN_DP_RAMX0_XEN_MASK) + +#define SYSCON_SRAM_XEN_DP_RAMX1_XEN_MASK (0x2U) +#define SYSCON_SRAM_XEN_DP_RAMX1_XEN_SHIFT (1U) +/*! RAMX1_XEN - Refer to SRAM_XEN for more details. */ +#define SYSCON_SRAM_XEN_DP_RAMX1_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_DP_RAMX1_XEN_SHIFT)) & SYSCON_SRAM_XEN_DP_RAMX1_XEN_MASK) + +#define SYSCON_SRAM_XEN_DP_RAMA0_XEN_MASK (0x4U) +#define SYSCON_SRAM_XEN_DP_RAMA0_XEN_SHIFT (2U) +/*! RAMA0_XEN - Refer to SRAM_XEN for more details. */ +#define SYSCON_SRAM_XEN_DP_RAMA0_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_DP_RAMA0_XEN_SHIFT)) & SYSCON_SRAM_XEN_DP_RAMA0_XEN_MASK) + +#define SYSCON_SRAM_XEN_DP_RAMA1_XEN_MASK (0x8U) +#define SYSCON_SRAM_XEN_DP_RAMA1_XEN_SHIFT (3U) +/*! RAMA1_XEN - Refer to SRAM_XEN for more details. */ +#define SYSCON_SRAM_XEN_DP_RAMA1_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_DP_RAMA1_XEN_SHIFT)) & SYSCON_SRAM_XEN_DP_RAMA1_XEN_MASK) + +#define SYSCON_SRAM_XEN_DP_RAMB_XEN_MASK (0x10U) +#define SYSCON_SRAM_XEN_DP_RAMB_XEN_SHIFT (4U) +/*! RAMB_XEN - Refer to SRAM_XEN for more details. */ +#define SYSCON_SRAM_XEN_DP_RAMB_XEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SRAM_XEN_DP_RAMB_XEN_SHIFT)) & SYSCON_SRAM_XEN_DP_RAMB_XEN_MASK) +/*! @} */ + +/*! @name ELS_OTP_LC_STATE - Life Cycle State Register */ +/*! @{ */ + +#define SYSCON_ELS_OTP_LC_STATE_OTP_LC_STATE_MASK (0xFFU) +#define SYSCON_ELS_OTP_LC_STATE_OTP_LC_STATE_SHIFT (0U) +/*! OTP_LC_STATE - OTP life cycle state */ +#define SYSCON_ELS_OTP_LC_STATE_OTP_LC_STATE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_ELS_OTP_LC_STATE_OTP_LC_STATE_SHIFT)) & SYSCON_ELS_OTP_LC_STATE_OTP_LC_STATE_MASK) +/*! @} */ + +/*! @name ELS_OTP_LC_STATE_DP - Life Cycle State Register (Duplicate) */ +/*! @{ */ + +#define SYSCON_ELS_OTP_LC_STATE_DP_OTP_LC_STATE_DP_MASK (0xFFU) +#define SYSCON_ELS_OTP_LC_STATE_DP_OTP_LC_STATE_DP_SHIFT (0U) +/*! OTP_LC_STATE_DP - OTP life cycle state */ +#define SYSCON_ELS_OTP_LC_STATE_DP_OTP_LC_STATE_DP(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_ELS_OTP_LC_STATE_DP_OTP_LC_STATE_DP_SHIFT)) & SYSCON_ELS_OTP_LC_STATE_DP_OTP_LC_STATE_DP_MASK) +/*! @} */ + +/*! @name DEBUG_LOCK_EN - Control Write Access to Security */ +/*! @{ */ + +#define SYSCON_DEBUG_LOCK_EN_LOCK_ALL_MASK (0xFU) +#define SYSCON_DEBUG_LOCK_EN_LOCK_ALL_SHIFT (0U) +/*! LOCK_ALL - Controls write access to the security registers + * 0b1010..Enables write access to all registers + * 0b0000..Any other value than b1010: disables write access to all registers + */ +#define SYSCON_DEBUG_LOCK_EN_LOCK_ALL(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEBUG_LOCK_EN_LOCK_ALL_SHIFT)) & SYSCON_DEBUG_LOCK_EN_LOCK_ALL_MASK) +/*! @} */ + +/*! @name DEBUG_FEATURES - Cortex Debug Features Control */ +/*! @{ */ + +#define SYSCON_DEBUG_FEATURES_CPU0_DBGEN_MASK (0x3U) +#define SYSCON_DEBUG_FEATURES_CPU0_DBGEN_SHIFT (0U) +/*! CPU0_DBGEN - CPU0 invasive debug control + * 0b01..Disables debug + * 0b10..Enables debug + */ +#define SYSCON_DEBUG_FEATURES_CPU0_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEBUG_FEATURES_CPU0_DBGEN_SHIFT)) & SYSCON_DEBUG_FEATURES_CPU0_DBGEN_MASK) + +#define SYSCON_DEBUG_FEATURES_CPU0_NIDEN_MASK (0xCU) +#define SYSCON_DEBUG_FEATURES_CPU0_NIDEN_SHIFT (2U) +/*! CPU0_NIDEN - CPU0 non-invasive debug control + * 0b01..Disables debug + * 0b10..Enables debug + */ +#define SYSCON_DEBUG_FEATURES_CPU0_NIDEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEBUG_FEATURES_CPU0_NIDEN_SHIFT)) & SYSCON_DEBUG_FEATURES_CPU0_NIDEN_MASK) +/*! @} */ + +/*! @name DEBUG_FEATURES_DP - Cortex Debug Features Control (Duplicate) */ +/*! @{ */ + +#define SYSCON_DEBUG_FEATURES_DP_CPU0_DBGEN_MASK (0x3U) +#define SYSCON_DEBUG_FEATURES_DP_CPU0_DBGEN_SHIFT (0U) +/*! CPU0_DBGEN - CPU0 invasive debug control + * 0b01..Disables debug + * 0b10..Enables debug + */ +#define SYSCON_DEBUG_FEATURES_DP_CPU0_DBGEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEBUG_FEATURES_DP_CPU0_DBGEN_SHIFT)) & SYSCON_DEBUG_FEATURES_DP_CPU0_DBGEN_MASK) + +#define SYSCON_DEBUG_FEATURES_DP_CPU0_NIDEN_MASK (0xCU) +#define SYSCON_DEBUG_FEATURES_DP_CPU0_NIDEN_SHIFT (2U) +/*! CPU0_NIDEN - CPU0 non-invasive debug control + * 0b01..Disables debug + * 0b10..Enables debug + */ +#define SYSCON_DEBUG_FEATURES_DP_CPU0_NIDEN(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEBUG_FEATURES_DP_CPU0_NIDEN_SHIFT)) & SYSCON_DEBUG_FEATURES_DP_CPU0_NIDEN_MASK) +/*! @} */ + +/*! @name SWD_ACCESS_CPU0 - CPU0 Software Debug Access */ +/*! @{ */ + +#define SYSCON_SWD_ACCESS_CPU0_SEC_CODE_MASK (0xFFFFFFFFU) +#define SYSCON_SWD_ACCESS_CPU0_SEC_CODE_SHIFT (0U) +/*! SEC_CODE - CPU0 SWD-AP: 0x12345678 + * 0b00010010001101000101011001111000..Value to write to enable CPU0 SWD access. Reading back register is read as 0xA. + * 0b00000000000000000000000000000000..CPU0 DAP is not allowed. Reading back register is read as 0x5. + */ +#define SYSCON_SWD_ACCESS_CPU0_SEC_CODE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_SWD_ACCESS_CPU0_SEC_CODE_SHIFT)) & SYSCON_SWD_ACCESS_CPU0_SEC_CODE_MASK) +/*! @} */ + +/*! @name DEBUG_AUTH_BEACON - Debug Authentication BEACON */ +/*! @{ */ + +#define SYSCON_DEBUG_AUTH_BEACON_BEACON_MASK (0xFFFFFFFFU) +#define SYSCON_DEBUG_AUTH_BEACON_BEACON_SHIFT (0U) +/*! BEACON - Sets by the debug authentication code in ROM to pass the debug beacons (Credential + * Beacon and Authentication Beacon) to the application code. + */ +#define SYSCON_DEBUG_AUTH_BEACON_BEACON(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEBUG_AUTH_BEACON_BEACON_SHIFT)) & SYSCON_DEBUG_AUTH_BEACON_BEACON_MASK) +/*! @} */ + +/*! @name JTAG_ID - JTAG Chip ID */ +/*! @{ */ + +#define SYSCON_JTAG_ID_JTAG_ID_MASK (0xFFFFFFFFU) +#define SYSCON_JTAG_ID_JTAG_ID_SHIFT (0U) +/*! JTAG_ID - Indicates the device ID */ +#define SYSCON_JTAG_ID_JTAG_ID(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_JTAG_ID_JTAG_ID_SHIFT)) & SYSCON_JTAG_ID_JTAG_ID_MASK) +/*! @} */ + +/*! @name DEVICE_TYPE - Device Type */ +/*! @{ */ + +#define SYSCON_DEVICE_TYPE_DEVICE_TYPE_MASK (0xFFFFFFFFU) +#define SYSCON_DEVICE_TYPE_DEVICE_TYPE_SHIFT (0U) +/*! DEVICE_TYPE - Indicates DEVICE TYPE. */ +#define SYSCON_DEVICE_TYPE_DEVICE_TYPE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEVICE_TYPE_DEVICE_TYPE_SHIFT)) & SYSCON_DEVICE_TYPE_DEVICE_TYPE_MASK) +/*! @} */ + +/*! @name DEVICE_ID0 - Device ID */ +/*! @{ */ + +#define SYSCON_DEVICE_ID0_RAM_SIZE_MASK (0xFU) +#define SYSCON_DEVICE_ID0_RAM_SIZE_SHIFT (0U) +/*! RAM_SIZE - Chip RAM Size + * 0b0000..8KB. + * 0b0001..16KB. + * 0b0010..32KB. + * 0b0011..64KB. + * 0b0100..96KB. + * 0b0101..128KB. + * 0b0110..160KB. + * 0b0111..192KB. + * 0b1000..256KB. + * 0b1001..288KB. + * 0b1010..352KB. + * 0b1011..512KB. + */ +#define SYSCON_DEVICE_ID0_RAM_SIZE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEVICE_ID0_RAM_SIZE_SHIFT)) & SYSCON_DEVICE_ID0_RAM_SIZE_MASK) + +#define SYSCON_DEVICE_ID0_FLASH_SIZE_MASK (0xF0U) +#define SYSCON_DEVICE_ID0_FLASH_SIZE_SHIFT (4U) +/*! FLASH_SIZE - Chip FLASH Size + * 0b0000..32KB. + * 0b0001..64KB. + * 0b0010..128KB. + * 0b0011..256KB. + * 0b0100..512KB. + * 0b0101..768KB. + * 0b0110..1MB. + * 0b0111..1.5MB. + * 0b1000..2MB. + */ +#define SYSCON_DEVICE_ID0_FLASH_SIZE(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEVICE_ID0_FLASH_SIZE_SHIFT)) & SYSCON_DEVICE_ID0_FLASH_SIZE_MASK) + +#define SYSCON_DEVICE_ID0_SECURITY_MASK (0xF000000U) +#define SYSCON_DEVICE_ID0_SECURITY_SHIFT (24U) +/*! SECURITY + * 0b1010..Non secure version. + * 0b0101..Secure version. + */ +#define SYSCON_DEVICE_ID0_SECURITY(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DEVICE_ID0_SECURITY_SHIFT)) & SYSCON_DEVICE_ID0_SECURITY_MASK) +/*! @} */ + +/*! @name DIEID - Chip Revision ID and Number */ +/*! @{ */ + +#define SYSCON_DIEID_MINOR_REVISION_MASK (0xFU) +#define SYSCON_DIEID_MINOR_REVISION_SHIFT (0U) +/*! MINOR_REVISION - Chip minor revision */ +#define SYSCON_DIEID_MINOR_REVISION(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DIEID_MINOR_REVISION_SHIFT)) & SYSCON_DIEID_MINOR_REVISION_MASK) + +#define SYSCON_DIEID_MAJOR_REVISION_MASK (0xF0U) +#define SYSCON_DIEID_MAJOR_REVISION_SHIFT (4U) +/*! MAJOR_REVISION - Chip major revision */ +#define SYSCON_DIEID_MAJOR_REVISION(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DIEID_MAJOR_REVISION_SHIFT)) & SYSCON_DIEID_MAJOR_REVISION_MASK) + +#define SYSCON_DIEID_MCO_NUM_IN_DIE_ID_MASK (0xFFFFF00U) +#define SYSCON_DIEID_MCO_NUM_IN_DIE_ID_SHIFT (8U) +/*! MCO_NUM_IN_DIE_ID - Chip number */ +#define SYSCON_DIEID_MCO_NUM_IN_DIE_ID(x) (((uint32_t)(((uint32_t)(x)) << SYSCON_DIEID_MCO_NUM_IN_DIE_ID_SHIFT)) & SYSCON_DIEID_MCO_NUM_IN_DIE_ID_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group SYSCON_Register_Masks */ + + +/* SYSCON - Peripheral instance base addresses */ +/** Peripheral SYSCON base address */ +#define SYSCON_BASE (0x40091000u) +/** Peripheral SYSCON base pointer */ +#define SYSCON ((SYSCON_Type *)SYSCON_BASE) +/** Array initializer of SYSCON peripheral base addresses */ +#define SYSCON_BASE_ADDRS { SYSCON_BASE } +/** Array initializer of SYSCON peripheral base pointers */ +#define SYSCON_BASE_PTRS { SYSCON } + +/*! + * @} + */ /* end of group SYSCON_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- TRDC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup TRDC_Peripheral_Access_Layer TRDC Peripheral Access Layer + * @{ + */ + +/** TRDC - Register Layout Typedef */ +typedef struct { + struct { /* offset: 0x0, array step: 0x1AC */ + __IO uint32_t MBC_MEM_GLBCFG[4]; /**< MBC Global Configuration Register, array offset: 0x0, array step: index*0x1AC, index2*0x4 */ + uint8_t RESERVED_0[16]; + __IO uint32_t MBC_MEMN_GLBAC[8]; /**< MBC Global Access Control, array offset: 0x20, array step: index*0x1AC, index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM0_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x40, array step: index*0x1AC, index2*0x4 */ + uint8_t RESERVED_1[288]; + __IO uint32_t MBC_DOM0_MEM1_BLK_CFG_W[1]; /**< MBC Memory Block Configuration Word, array offset: 0x180, array step: index*0x1AC, index2*0x4 */ + uint8_t RESERVED_2[36]; + __IO uint32_t MBC_DOM0_MEM2_BLK_CFG_W[1]; /**< MBC Memory Block Configuration Word, array offset: 0x1A8, array step: index*0x1AC, index2*0x4 */ + } MBC_INDEX[1]; +} TRDC_Type; + +/* ---------------------------------------------------------------------------- + -- TRDC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup TRDC_Register_Masks TRDC Register Masks + * @{ + */ + +/*! @name MBC_INDEX_MBC_MEM_GLBCFG - MBC Global Configuration Register */ +/*! @{ */ + +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_NBLKS_MASK (0x3FFU) +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_NBLKS_SHIFT (0U) +/*! NBLKS - Number of blocks in this memory */ +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_NBLKS(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEM_GLBCFG_NBLKS_SHIFT)) & TRDC_MBC_INDEX_MBC_MEM_GLBCFG_NBLKS_MASK) + +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_SIZE_LOG2_MASK (0x1F0000U) +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_SIZE_LOG2_SHIFT (16U) +/*! SIZE_LOG2 - Log2 size per block */ +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_SIZE_LOG2(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEM_GLBCFG_SIZE_LOG2_SHIFT)) & TRDC_MBC_INDEX_MBC_MEM_GLBCFG_SIZE_LOG2_MASK) + +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_CLRE_MASK (0xC0000000U) +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_CLRE_SHIFT (30U) +/*! CLRE - Clear Error */ +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_CLRE(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEM_GLBCFG_CLRE_SHIFT)) & TRDC_MBC_INDEX_MBC_MEM_GLBCFG_CLRE_MASK) +/*! @} */ + +/* The count of TRDC_MBC_INDEX_MBC_MEM_GLBCFG */ +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_COUNT (1U) + +/* The count of TRDC_MBC_INDEX_MBC_MEM_GLBCFG */ +#define TRDC_MBC_INDEX_MBC_MEM_GLBCFG_COUNT2 (4U) + +/*! @name MBC_INDEX_MBC_MEMN_GLBAC - MBC Global Access Control */ +/*! @{ */ + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUX_MASK (0x1U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUX_SHIFT (0U) +/*! NUX - NonsecureUser Execute + * 0b0..Execute access is not allowed in Nonsecure User mode. + * 0b1..Execute access is allowed in Nonsecure User mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUX(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUX_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUX_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUW_MASK (0x2U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUW_SHIFT (1U) +/*! NUW - NonsecureUser Write + * 0b0..Write access is not allowed in Nonsecure User mode. + * 0b1..Write access is allowed in Nonsecure User mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUW(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUW_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUW_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUR_MASK (0x4U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUR_SHIFT (2U) +/*! NUR - NonsecureUser Read + * 0b0..Read access is not allowed in Nonsecure User mode. + * 0b1..Read access is allowed in Nonsecure User mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUR(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUR_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NUR_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPX_MASK (0x10U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPX_SHIFT (4U) +/*! NPX - NonsecurePriv Execute + * 0b0..Execute access is not allowed in Nonsecure Privilege mode. + * 0b1..Execute access is allowed in Nonsecure Privilege mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPX(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPX_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPX_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPW_MASK (0x20U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPW_SHIFT (5U) +/*! NPW - NonsecurePriv Write + * 0b0..Write access is not allowed in Nonsecure Privilege mode. + * 0b1..Write access is allowed in Nonsecure Privilege mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPW(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPW_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPW_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPR_MASK (0x40U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPR_SHIFT (6U) +/*! NPR - NonsecurePriv Read + * 0b0..Read access is not allowed in Nonsecure Privilege mode. + * 0b1..Read access is allowed in Nonsecure Privilege mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPR(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPR_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_NPR_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUX_MASK (0x100U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUX_SHIFT (8U) +/*! SUX - SecureUser Execute + * 0b0..Execute access is not allowed in Secure User mode. + * 0b1..Execute access is allowed in Secure User mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUX(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUX_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUX_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUW_MASK (0x200U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUW_SHIFT (9U) +/*! SUW - SecureUser Write + * 0b0..Write access is not allowed in Secure User mode. + * 0b1..Write access is allowed in Secure User mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUW(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUW_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUW_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUR_MASK (0x400U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUR_SHIFT (10U) +/*! SUR - SecureUser Read + * 0b0..Read access is not allowed in Secure User mode. + * 0b1..Read access is allowed in Secure User mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUR(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUR_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SUR_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPX_MASK (0x1000U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPX_SHIFT (12U) +/*! SPX - SecurePriv Execute + * 0b0..Execute access is not allowed in Secure Privilege mode. + * 0b1..Execute access is allowed in Secure Privilege mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPX(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPX_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPX_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPW_MASK (0x2000U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPW_SHIFT (13U) +/*! SPW - SecurePriv Write + * 0b0..Write access is not allowed in Secure Privilege mode. + * 0b1..Write access is allowed in Secure Privilege mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPW(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPW_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPW_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPR_MASK (0x4000U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPR_SHIFT (14U) +/*! SPR - SecurePriv Read + * 0b0..Read access is not allowed in Secure Privilege mode. + * 0b1..Read access is allowed in Secure Privilege mode. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPR(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPR_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_SPR_MASK) + +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_LK_MASK (0x80000000U) +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_LK_SHIFT (31U) +/*! LK - LOCK + * 0b0..This register is not locked and can be altered. + * 0b1..This register is locked and cannot be altered. + */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_LK(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_MEMN_GLBAC_LK_SHIFT)) & TRDC_MBC_INDEX_MBC_MEMN_GLBAC_LK_MASK) +/*! @} */ + +/* The count of TRDC_MBC_INDEX_MBC_MEMN_GLBAC */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_COUNT (1U) + +/* The count of TRDC_MBC_INDEX_MBC_MEMN_GLBAC */ +#define TRDC_MBC_INDEX_MBC_MEMN_GLBAC_COUNT2 (8U) + +/*! @name MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W - MBC Memory Block Configuration Word */ +/*! @{ */ + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL0_MASK (0x7U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL0_SHIFT (0U) +/*! MBACSEL0 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL0(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL0_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL0_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE0_MASK (0x8U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE0_SHIFT (3U) +/*! NSE0 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE0(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE0_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE0_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL1_MASK (0x70U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL1_SHIFT (4U) +/*! MBACSEL1 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL1(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL1_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL1_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE1_MASK (0x80U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE1_SHIFT (7U) +/*! NSE1 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE1(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE1_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE1_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL2_MASK (0x700U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL2_SHIFT (8U) +/*! MBACSEL2 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL2(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL2_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL2_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE2_MASK (0x800U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE2_SHIFT (11U) +/*! NSE2 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE2(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE2_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE2_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL3_MASK (0x7000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL3_SHIFT (12U) +/*! MBACSEL3 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL3(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL3_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL3_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE3_MASK (0x8000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE3_SHIFT (15U) +/*! NSE3 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE3(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE3_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE3_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL4_MASK (0x70000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL4_SHIFT (16U) +/*! MBACSEL4 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL4(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL4_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL4_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE4_MASK (0x80000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE4_SHIFT (19U) +/*! NSE4 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE4(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE4_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE4_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL5_MASK (0x700000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL5_SHIFT (20U) +/*! MBACSEL5 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL5(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL5_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL5_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE5_MASK (0x800000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE5_SHIFT (23U) +/*! NSE5 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE5(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE5_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE5_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL6_MASK (0x7000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL6_SHIFT (24U) +/*! MBACSEL6 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL6(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL6_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL6_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE6_MASK (0x8000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE6_SHIFT (27U) +/*! NSE6 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE6(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE6_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE6_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL7_MASK (0x70000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL7_SHIFT (28U) +/*! MBACSEL7 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL7(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL7_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_MBACSEL7_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE7_MASK (0x80000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE7_SHIFT (31U) +/*! NSE7 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE7(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE7_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_NSE7_MASK) +/*! @} */ + +/* The count of TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_COUNT (1U) + +/* The count of TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM0_BLK_CFG_W_MBC_DOM0_MEM0_BLK_CFG_W_COUNT2 (8U) + +/*! @name MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W - MBC Memory Block Configuration Word */ +/*! @{ */ + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL0_MASK (0x7U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL0_SHIFT (0U) +/*! MBACSEL0 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL0(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL0_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL0_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE0_MASK (0x8U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE0_SHIFT (3U) +/*! NSE0 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE0(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE0_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE0_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL1_MASK (0x70U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL1_SHIFT (4U) +/*! MBACSEL1 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL1(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL1_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL1_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE1_MASK (0x80U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE1_SHIFT (7U) +/*! NSE1 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE1(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE1_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE1_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL2_MASK (0x700U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL2_SHIFT (8U) +/*! MBACSEL2 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL2(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL2_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL2_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE2_MASK (0x800U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE2_SHIFT (11U) +/*! NSE2 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE2(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE2_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE2_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL3_MASK (0x7000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL3_SHIFT (12U) +/*! MBACSEL3 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL3(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL3_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL3_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE3_MASK (0x8000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE3_SHIFT (15U) +/*! NSE3 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE3(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE3_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE3_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL4_MASK (0x70000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL4_SHIFT (16U) +/*! MBACSEL4 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL4(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL4_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL4_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE4_MASK (0x80000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE4_SHIFT (19U) +/*! NSE4 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE4(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE4_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE4_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL5_MASK (0x700000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL5_SHIFT (20U) +/*! MBACSEL5 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL5(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL5_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL5_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE5_MASK (0x800000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE5_SHIFT (23U) +/*! NSE5 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE5(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE5_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE5_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL6_MASK (0x7000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL6_SHIFT (24U) +/*! MBACSEL6 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL6(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL6_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL6_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE6_MASK (0x8000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE6_SHIFT (27U) +/*! NSE6 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE6(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE6_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE6_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL7_MASK (0x70000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL7_SHIFT (28U) +/*! MBACSEL7 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL7(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL7_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_MBACSEL7_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE7_MASK (0x80000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE7_SHIFT (31U) +/*! NSE7 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE7(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE7_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_NSE7_MASK) +/*! @} */ + +/* The count of TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_COUNT (1U) + +/* The count of TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM1_BLK_CFG_W_MBC_DOM0_MEM1_BLK_CFG_W_COUNT2 (1U) + +/*! @name MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W - MBC Memory Block Configuration Word */ +/*! @{ */ + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL0_MASK (0x7U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL0_SHIFT (0U) +/*! MBACSEL0 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL0(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL0_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL0_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE0_MASK (0x8U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE0_SHIFT (3U) +/*! NSE0 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE0(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE0_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE0_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL1_MASK (0x70U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL1_SHIFT (4U) +/*! MBACSEL1 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL1(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL1_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL1_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE1_MASK (0x80U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE1_SHIFT (7U) +/*! NSE1 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE1(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE1_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE1_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL2_MASK (0x700U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL2_SHIFT (8U) +/*! MBACSEL2 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL2(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL2_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL2_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE2_MASK (0x800U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE2_SHIFT (11U) +/*! NSE2 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE2(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE2_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE2_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL3_MASK (0x7000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL3_SHIFT (12U) +/*! MBACSEL3 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL3(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL3_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL3_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE3_MASK (0x8000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE3_SHIFT (15U) +/*! NSE3 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE3(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE3_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE3_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL4_MASK (0x70000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL4_SHIFT (16U) +/*! MBACSEL4 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL4(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL4_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL4_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE4_MASK (0x80000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE4_SHIFT (19U) +/*! NSE4 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE4(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE4_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE4_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL5_MASK (0x700000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL5_SHIFT (20U) +/*! MBACSEL5 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL5(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL5_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL5_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE5_MASK (0x800000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE5_SHIFT (23U) +/*! NSE5 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE5(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE5_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE5_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL6_MASK (0x7000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL6_SHIFT (24U) +/*! MBACSEL6 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL6(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL6_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL6_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE6_MASK (0x8000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE6_SHIFT (27U) +/*! NSE6 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE6(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE6_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE6_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL7_MASK (0x70000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL7_SHIFT (28U) +/*! MBACSEL7 - Memory Block Access Control Select for block B + * 0b000..select MBC_MEMN_GLBAC0 access control policy for block B + * 0b001..select MBC_MEMN_GLBAC1 access control policy for block B + * 0b010..select MBC_MEMN_GLBAC2 access control policy for block B + * 0b011..select MBC_MEMN_GLBAC3 access control policy for block B + * 0b100..select MBC_MEMN_GLBAC4 access control policy for block B + * 0b101..select MBC_MEMN_GLBAC5 access control policy for block B + * 0b110..select MBC_MEMN_GLBAC6 access control policy for block B + * 0b111..select MBC_MEMN_GLBAC7 access control policy for block B + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL7(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL7_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_MBACSEL7_MASK) + +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE7_MASK (0x80000000U) +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE7_SHIFT (31U) +/*! NSE7 - NonSecure Enable for block B + * 0b0..Secure accesses to block B are based on corresponding MBACSEL field in this register + * (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]), nonsecure accesses to block B are not allowed. + * 0b1..Secure accesses to block B are not allowed, nonsecure accesses to block B are based on corresponding + * MBACSEL field in this register (MBCm_DOMd_MEMs_BLK_CFG_Ww[MBACSEL]). + */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE7(x) (((uint32_t)(((uint32_t)(x)) << TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE7_SHIFT)) & TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_NSE7_MASK) +/*! @} */ + +/* The count of TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_COUNT (1U) + +/* The count of TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W */ +#define TRDC_MBC_INDEX_MBC_INDEX_DOM0_MEM2_BLK_CFG_W_MBC_DOM0_MEM2_BLK_CFG_W_COUNT2 (1U) + + +/*! + * @} + */ /* end of group TRDC_Register_Masks */ + + +/* TRDC - Peripheral instance base addresses */ +/** Peripheral MBC0 base address */ +#define MBC0_BASE (0x4008E000u) +/** Peripheral MBC0 base pointer */ +#define MBC0 ((TRDC_Type *)MBC0_BASE) +/** Array initializer of TRDC peripheral base addresses */ +#define TRDC_BASE_ADDRS { MBC0_BASE } +/** Array initializer of TRDC peripheral base pointers */ +#define TRDC_BASE_PTRS { MBC0 } +#define MBC0_MEMORY_CFG_WORD_COUNT {1,2,4,1} +#define MBC1_MEMORY_CFG_WORD_COUNT {1,1,1,1} +#define MBC2_MEMORY_CFG_WORD_COUNT {9,6,1,1} +#define MBC3_MEMORY_CFG_WORD_COUNT {3,0,0,0} +#define MBC_MEMORY_CFG_WORD_COUNT {MBC0_MEMORY_CFG_WORD_COUNT , MBC1_MEMORY_CFG_WORD_COUNT, MBC2_MEMORY_CFG_WORD_COUNT, MBC3_MEMORY_CFG_WORD_COUNT} +#define MBC0_MEMORY_NSE_WORD_COUNT {1,1,1,1} +#define MBC1_MEMORY_NSE_WORD_COUNT {1,1,1,1} +#define MBC2_MEMORY_NSE_WORD_COUNT {3,2,1,1} +#define MBC3_MEMORY_NSE_WORD_COUNT {1,0,0,0} +#define MBC_MEMORY_NSE_WORD_COUNT {MBC0_MEMORY_NSE_WORD_COUNT , MBC1_MEMORY_NSE_WORD_COUNT, MBC2_MEMORY_NSE_WORD_COUNT, MBC3_MEMORY_NSE_WORD_COUNT} + + +/*! + * @} + */ /* end of group TRDC_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- USB Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup USB_Peripheral_Access_Layer USB Peripheral Access Layer + * @{ + */ + +/** USB - Register Layout Typedef */ +typedef struct { + __I uint8_t PERID; /**< Peripheral ID, offset: 0x0 */ + uint8_t RESERVED_0[3]; + __I uint8_t IDCOMP; /**< Peripheral ID Complement, offset: 0x4 */ + uint8_t RESERVED_1[3]; + __I uint8_t REV; /**< Peripheral Revision, offset: 0x8 */ + uint8_t RESERVED_2[19]; + __IO uint8_t OTGCTL; /**< OTG Control, offset: 0x1C */ + uint8_t RESERVED_3[99]; + __IO uint8_t ISTAT; /**< Interrupt Status, offset: 0x80 */ + uint8_t RESERVED_4[3]; + __IO uint8_t INTEN; /**< Interrupt Enable, offset: 0x84 */ + uint8_t RESERVED_5[3]; + __IO uint8_t ERRSTAT; /**< Error Interrupt Status, offset: 0x88 */ + uint8_t RESERVED_6[3]; + __IO uint8_t ERREN; /**< Error Interrupt Enable, offset: 0x8C */ + uint8_t RESERVED_7[3]; + __I uint8_t STAT; /**< Status, offset: 0x90 */ + uint8_t RESERVED_8[3]; + __IO uint8_t CTL; /**< Control, offset: 0x94 */ + uint8_t RESERVED_9[3]; + __IO uint8_t ADDR; /**< Address, offset: 0x98 */ + uint8_t RESERVED_10[3]; + __IO uint8_t BDTPAGE1; /**< BDT Page 1, offset: 0x9C */ + uint8_t RESERVED_11[3]; + __I uint8_t FRMNUML; /**< Frame Number Register Low, offset: 0xA0 */ + uint8_t RESERVED_12[3]; + __I uint8_t FRMNUMH; /**< Frame Number Register High, offset: 0xA4 */ + uint8_t RESERVED_13[11]; + __IO uint8_t BDTPAGE2; /**< BDT Page 2, offset: 0xB0 */ + uint8_t RESERVED_14[3]; + __IO uint8_t BDTPAGE3; /**< BDT Page 3, offset: 0xB4 */ + uint8_t RESERVED_15[11]; + struct { /* offset: 0xC0, array step: 0x4 */ + __IO uint8_t ENDPT; /**< Endpoint Control, array offset: 0xC0, array step: 0x4 */ + uint8_t RESERVED_0[3]; + } ENDPOINT[16]; + __IO uint8_t USBCTRL; /**< USB Control, offset: 0x100 */ + uint8_t RESERVED_16[3]; + __I uint8_t OBSERVE; /**< USB OTG Observe, offset: 0x104 */ + uint8_t RESERVED_17[3]; + __IO uint8_t CONTROL; /**< USB OTG Control, offset: 0x108 */ + uint8_t RESERVED_18[3]; + __IO uint8_t USBTRC0; /**< USB Transceiver Control 0, offset: 0x10C */ + uint8_t RESERVED_19[23]; + uint8_t KEEP_ALIVE_CTRL_RSVD; /**< Reserved, offset: 0x124 */ + uint8_t RESERVED_20[3]; + uint8_t KEEP_ALIVE_WKCTRL_RSVD; /**< Reserved, offset: 0x128 */ + uint8_t RESERVED_21[3]; + __IO uint8_t MISCCTRL; /**< Miscellaneous Control, offset: 0x12C */ + uint8_t RESERVED_22[3]; + __IO uint8_t STALL_IL_DIS; /**< Peripheral Mode Stall Disable for Endpoints 7 to 0 in IN Direction, offset: 0x130 */ + uint8_t RESERVED_23[3]; + __IO uint8_t STALL_IH_DIS; /**< Peripheral Mode Stall Disable for Endpoints 15 to 8 in IN Direction, offset: 0x134 */ + uint8_t RESERVED_24[3]; + __IO uint8_t STALL_OL_DIS; /**< Peripheral Mode Stall Disable for Endpoints 7 to 0 in OUT Direction, offset: 0x138 */ + uint8_t RESERVED_25[3]; + __IO uint8_t STALL_OH_DIS; /**< Peripheral Mode Stall Disable for Endpoints 15 to 8 in OUT Direction, offset: 0x13C */ + uint8_t RESERVED_26[3]; + __IO uint8_t CLK_RECOVER_CTRL; /**< USB Clock Recovery Control, offset: 0x140 */ + uint8_t RESERVED_27[3]; + __IO uint8_t CLK_RECOVER_IRC_EN; /**< FIRC Oscillator Enable, offset: 0x144 */ + uint8_t RESERVED_28[15]; + __IO uint8_t CLK_RECOVER_INT_EN; /**< Clock Recovery Combined Interrupt Enable, offset: 0x154 */ + uint8_t RESERVED_29[7]; + __IO uint8_t CLK_RECOVER_INT_STATUS; /**< Clock Recovery Separated Interrupt Status, offset: 0x15C */ +} USB_Type; + +/* ---------------------------------------------------------------------------- + -- USB Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup USB_Register_Masks USB Register Masks + * @{ + */ + +/*! @name PERID - Peripheral ID */ +/*! @{ */ + +#define USB_PERID_ID_MASK (0x3FU) +#define USB_PERID_ID_SHIFT (0U) +/*! ID - Peripheral Identification */ +#define USB_PERID_ID(x) (((uint8_t)(((uint8_t)(x)) << USB_PERID_ID_SHIFT)) & USB_PERID_ID_MASK) +/*! @} */ + +/*! @name IDCOMP - Peripheral ID Complement */ +/*! @{ */ + +#define USB_IDCOMP_NID_MASK (0x3FU) +#define USB_IDCOMP_NID_SHIFT (0U) +/*! NID - Negative Peripheral ID */ +#define USB_IDCOMP_NID(x) (((uint8_t)(((uint8_t)(x)) << USB_IDCOMP_NID_SHIFT)) & USB_IDCOMP_NID_MASK) +/*! @} */ + +/*! @name REV - Peripheral Revision */ +/*! @{ */ + +#define USB_REV_REV_MASK (0xFFU) +#define USB_REV_REV_SHIFT (0U) +/*! REV - Revision */ +#define USB_REV_REV(x) (((uint8_t)(((uint8_t)(x)) << USB_REV_REV_SHIFT)) & USB_REV_REV_MASK) +/*! @} */ + +/*! @name OTGCTL - OTG Control */ +/*! @{ */ + +#define USB_OTGCTL_DPHIGH_MASK (0x80U) +#define USB_OTGCTL_DPHIGH_SHIFT (7U) +/*! DPHIGH - D+ Data Line Pullup Resistor Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_OTGCTL_DPHIGH(x) (((uint8_t)(((uint8_t)(x)) << USB_OTGCTL_DPHIGH_SHIFT)) & USB_OTGCTL_DPHIGH_MASK) +/*! @} */ + +/*! @name ISTAT - Interrupt Status */ +/*! @{ */ + +#define USB_ISTAT_USBRST_MASK (0x1U) +#define USB_ISTAT_USBRST_SHIFT (0U) +/*! USBRST - USB Reset Flag + * 0b0..Not detected + * 0b1..Detected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_USBRST(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_USBRST_SHIFT)) & USB_ISTAT_USBRST_MASK) + +#define USB_ISTAT_ERROR_MASK (0x2U) +#define USB_ISTAT_ERROR_SHIFT (1U) +/*! ERROR - Error Flag + * 0b0..Error did not occur + * 0b1..Error occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_ERROR(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_ERROR_SHIFT)) & USB_ISTAT_ERROR_MASK) + +#define USB_ISTAT_SOFTOK_MASK (0x4U) +#define USB_ISTAT_SOFTOK_SHIFT (2U) +/*! SOFTOK - Start Of Frame (SOF) Token Flag + * 0b0..Did not receive + * 0b1..Received + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_SOFTOK(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_SOFTOK_SHIFT)) & USB_ISTAT_SOFTOK_MASK) + +#define USB_ISTAT_TOKDNE_MASK (0x8U) +#define USB_ISTAT_TOKDNE_SHIFT (3U) +/*! TOKDNE - Current Token Processing Flag + * 0b0..Not processed + * 0b1..Processed + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_TOKDNE(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_TOKDNE_SHIFT)) & USB_ISTAT_TOKDNE_MASK) + +#define USB_ISTAT_SLEEP_MASK (0x10U) +#define USB_ISTAT_SLEEP_SHIFT (4U) +/*! SLEEP - Sleep Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_SLEEP(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_SLEEP_SHIFT)) & USB_ISTAT_SLEEP_MASK) + +#define USB_ISTAT_RESUME_MASK (0x20U) +#define USB_ISTAT_RESUME_SHIFT (5U) +/*! RESUME - Resume Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_RESUME(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_RESUME_SHIFT)) & USB_ISTAT_RESUME_MASK) + +#define USB_ISTAT_STALL_MASK (0x80U) +#define USB_ISTAT_STALL_SHIFT (7U) +/*! STALL - Stall Interrupt Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ISTAT_STALL(x) (((uint8_t)(((uint8_t)(x)) << USB_ISTAT_STALL_SHIFT)) & USB_ISTAT_STALL_MASK) +/*! @} */ + +/*! @name INTEN - Interrupt Enable */ +/*! @{ */ + +#define USB_INTEN_USBRSTEN_MASK (0x1U) +#define USB_INTEN_USBRSTEN_SHIFT (0U) +/*! USBRSTEN - USBRST Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_USBRSTEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_USBRSTEN_SHIFT)) & USB_INTEN_USBRSTEN_MASK) + +#define USB_INTEN_ERROREN_MASK (0x2U) +#define USB_INTEN_ERROREN_SHIFT (1U) +/*! ERROREN - ERROR Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_ERROREN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_ERROREN_SHIFT)) & USB_INTEN_ERROREN_MASK) + +#define USB_INTEN_SOFTOKEN_MASK (0x4U) +#define USB_INTEN_SOFTOKEN_SHIFT (2U) +/*! SOFTOKEN - SOFTOK Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_SOFTOKEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_SOFTOKEN_SHIFT)) & USB_INTEN_SOFTOKEN_MASK) + +#define USB_INTEN_TOKDNEEN_MASK (0x8U) +#define USB_INTEN_TOKDNEEN_SHIFT (3U) +/*! TOKDNEEN - TOKDNE Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_TOKDNEEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_TOKDNEEN_SHIFT)) & USB_INTEN_TOKDNEEN_MASK) + +#define USB_INTEN_SLEEPEN_MASK (0x10U) +#define USB_INTEN_SLEEPEN_SHIFT (4U) +/*! SLEEPEN - SLEEP Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_SLEEPEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_SLEEPEN_SHIFT)) & USB_INTEN_SLEEPEN_MASK) + +#define USB_INTEN_RESUMEEN_MASK (0x20U) +#define USB_INTEN_RESUMEEN_SHIFT (5U) +/*! RESUMEEN - RESUME Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_RESUMEEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_RESUMEEN_SHIFT)) & USB_INTEN_RESUMEEN_MASK) + +#define USB_INTEN_STALLEN_MASK (0x80U) +#define USB_INTEN_STALLEN_SHIFT (7U) +/*! STALLEN - STALL Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_INTEN_STALLEN(x) (((uint8_t)(((uint8_t)(x)) << USB_INTEN_STALLEN_SHIFT)) & USB_INTEN_STALLEN_MASK) +/*! @} */ + +/*! @name ERRSTAT - Error Interrupt Status */ +/*! @{ */ + +#define USB_ERRSTAT_PIDERR_MASK (0x1U) +#define USB_ERRSTAT_PIDERR_SHIFT (0U) +/*! PIDERR - PID Error Flag + * 0b0..Did not fail + * 0b1..Failed + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_PIDERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_PIDERR_SHIFT)) & USB_ERRSTAT_PIDERR_MASK) + +#define USB_ERRSTAT_CRC5EOF_MASK (0x2U) +#define USB_ERRSTAT_CRC5EOF_SHIFT (1U) +/*! CRC5EOF - CRC5 Error or End of Frame Error Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_CRC5EOF(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_CRC5EOF_SHIFT)) & USB_ERRSTAT_CRC5EOF_MASK) + +#define USB_ERRSTAT_CRC16_MASK (0x4U) +#define USB_ERRSTAT_CRC16_SHIFT (2U) +/*! CRC16 - CRC16 Error Flag + * 0b0..Not rejected + * 0b1..Rejected + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_CRC16(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_CRC16_SHIFT)) & USB_ERRSTAT_CRC16_MASK) + +#define USB_ERRSTAT_DFN8_MASK (0x8U) +#define USB_ERRSTAT_DFN8_SHIFT (3U) +/*! DFN8 - Data Field Not 8 Bits Flag + * 0b0..Integer number of bytes + * 0b1..Not an integer number of bytes + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_DFN8(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_DFN8_SHIFT)) & USB_ERRSTAT_DFN8_MASK) + +#define USB_ERRSTAT_BTOERR_MASK (0x10U) +#define USB_ERRSTAT_BTOERR_SHIFT (4U) +/*! BTOERR - Bus Turnaround Timeout Error Flag + * 0b0..Not timed out + * 0b1..Timed out + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_BTOERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_BTOERR_SHIFT)) & USB_ERRSTAT_BTOERR_MASK) + +#define USB_ERRSTAT_DMAERR_MASK (0x20U) +#define USB_ERRSTAT_DMAERR_SHIFT (5U) +/*! DMAERR - DMA Access Error Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_DMAERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_DMAERR_SHIFT)) & USB_ERRSTAT_DMAERR_MASK) + +#define USB_ERRSTAT_OWNERR_MASK (0x40U) +#define USB_ERRSTAT_OWNERR_SHIFT (6U) +/*! OWNERR - BD Unavailable Error Flag + * 0b0..Interrupt did not occur + * 0b1..Interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_OWNERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_OWNERR_SHIFT)) & USB_ERRSTAT_OWNERR_MASK) + +#define USB_ERRSTAT_BTSERR_MASK (0x80U) +#define USB_ERRSTAT_BTSERR_SHIFT (7U) +/*! BTSERR - Bit Stuff Error Flag + * 0b0..Packet not rejected due to the error + * 0b1..Packet rejected due to the error + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_ERRSTAT_BTSERR(x) (((uint8_t)(((uint8_t)(x)) << USB_ERRSTAT_BTSERR_SHIFT)) & USB_ERRSTAT_BTSERR_MASK) +/*! @} */ + +/*! @name ERREN - Error Interrupt Enable */ +/*! @{ */ + +#define USB_ERREN_PIDERREN_MASK (0x1U) +#define USB_ERREN_PIDERREN_SHIFT (0U) +/*! PIDERREN - PIDERR Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_PIDERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_PIDERREN_SHIFT)) & USB_ERREN_PIDERREN_MASK) + +#define USB_ERREN_CRC5EOFEN_MASK (0x2U) +#define USB_ERREN_CRC5EOFEN_SHIFT (1U) +/*! CRC5EOFEN - CRC5/EOF Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_CRC5EOFEN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_CRC5EOFEN_SHIFT)) & USB_ERREN_CRC5EOFEN_MASK) + +#define USB_ERREN_CRC16EN_MASK (0x4U) +#define USB_ERREN_CRC16EN_SHIFT (2U) +/*! CRC16EN - CRC16 Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_CRC16EN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_CRC16EN_SHIFT)) & USB_ERREN_CRC16EN_MASK) + +#define USB_ERREN_DFN8EN_MASK (0x8U) +#define USB_ERREN_DFN8EN_SHIFT (3U) +/*! DFN8EN - DFN8 (Data Field Not Integer Number of Bytes) Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_DFN8EN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_DFN8EN_SHIFT)) & USB_ERREN_DFN8EN_MASK) + +#define USB_ERREN_BTOERREN_MASK (0x10U) +#define USB_ERREN_BTOERREN_SHIFT (4U) +/*! BTOERREN - BTOERR (Bus Timeout Error) Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_BTOERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_BTOERREN_SHIFT)) & USB_ERREN_BTOERREN_MASK) + +#define USB_ERREN_DMAERREN_MASK (0x20U) +#define USB_ERREN_DMAERREN_SHIFT (5U) +/*! DMAERREN - DMAERR Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_DMAERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_DMAERREN_SHIFT)) & USB_ERREN_DMAERREN_MASK) + +#define USB_ERREN_OWNERREN_MASK (0x40U) +#define USB_ERREN_OWNERREN_SHIFT (6U) +/*! OWNERREN - OWNERR Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_OWNERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_OWNERREN_SHIFT)) & USB_ERREN_OWNERREN_MASK) + +#define USB_ERREN_BTSERREN_MASK (0x80U) +#define USB_ERREN_BTSERREN_SHIFT (7U) +/*! BTSERREN - BTSERR (Bit Stuff Error) Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_ERREN_BTSERREN(x) (((uint8_t)(((uint8_t)(x)) << USB_ERREN_BTSERREN_SHIFT)) & USB_ERREN_BTSERREN_MASK) +/*! @} */ + +/*! @name STAT - Status */ +/*! @{ */ + +#define USB_STAT_ODD_MASK (0x4U) +#define USB_STAT_ODD_SHIFT (2U) +/*! ODD - Odd Bank + * 0b0..Not in the odd bank + * 0b1..In the odd bank + */ +#define USB_STAT_ODD(x) (((uint8_t)(((uint8_t)(x)) << USB_STAT_ODD_SHIFT)) & USB_STAT_ODD_MASK) + +#define USB_STAT_TX_MASK (0x8U) +#define USB_STAT_TX_SHIFT (3U) +/*! TX - Transmit Indicator + * 0b0..Receive + * 0b1..Transmit + */ +#define USB_STAT_TX(x) (((uint8_t)(((uint8_t)(x)) << USB_STAT_TX_SHIFT)) & USB_STAT_TX_MASK) + +#define USB_STAT_ENDP_MASK (0xF0U) +#define USB_STAT_ENDP_SHIFT (4U) +/*! ENDP - Endpoint address */ +#define USB_STAT_ENDP(x) (((uint8_t)(((uint8_t)(x)) << USB_STAT_ENDP_SHIFT)) & USB_STAT_ENDP_MASK) +/*! @} */ + +/*! @name CTL - Control */ +/*! @{ */ + +#define USB_CTL_USBENSOFEN_MASK (0x1U) +#define USB_CTL_USBENSOFEN_SHIFT (0U) +/*! USBENSOFEN - USB Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_CTL_USBENSOFEN(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_USBENSOFEN_SHIFT)) & USB_CTL_USBENSOFEN_MASK) + +#define USB_CTL_ODDRST_MASK (0x2U) +#define USB_CTL_ODDRST_SHIFT (1U) +/*! ODDRST - Odd Reset */ +#define USB_CTL_ODDRST(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_ODDRST_SHIFT)) & USB_CTL_ODDRST_MASK) + +#define USB_CTL_RESUME_MASK (0x4U) +#define USB_CTL_RESUME_SHIFT (2U) +/*! RESUME - Resume */ +#define USB_CTL_RESUME(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_RESUME_SHIFT)) & USB_CTL_RESUME_MASK) + +#define USB_CTL_TXSUSPENDTOKENBUSY_MASK (0x20U) +#define USB_CTL_TXSUSPENDTOKENBUSY_SHIFT (5U) +/*! TXSUSPENDTOKENBUSY - TXD Suspend And Token Busy */ +#define USB_CTL_TXSUSPENDTOKENBUSY(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_TXSUSPENDTOKENBUSY_SHIFT)) & USB_CTL_TXSUSPENDTOKENBUSY_MASK) + +#define USB_CTL_SE0_MASK (0x40U) +#define USB_CTL_SE0_SHIFT (6U) +/*! SE0 - Live USB Single-Ended Zero signal */ +#define USB_CTL_SE0(x) (((uint8_t)(((uint8_t)(x)) << USB_CTL_SE0_SHIFT)) & USB_CTL_SE0_MASK) +/*! @} */ + +/*! @name ADDR - Address */ +/*! @{ */ + +#define USB_ADDR_ADDR_MASK (0x7FU) +#define USB_ADDR_ADDR_SHIFT (0U) +/*! ADDR - USB Address */ +#define USB_ADDR_ADDR(x) (((uint8_t)(((uint8_t)(x)) << USB_ADDR_ADDR_SHIFT)) & USB_ADDR_ADDR_MASK) +/*! @} */ + +/*! @name BDTPAGE1 - BDT Page 1 */ +/*! @{ */ + +#define USB_BDTPAGE1_BDTBA_MASK (0xFEU) +#define USB_BDTPAGE1_BDTBA_SHIFT (1U) +/*! BDTBA - BDT Base Address */ +#define USB_BDTPAGE1_BDTBA(x) (((uint8_t)(((uint8_t)(x)) << USB_BDTPAGE1_BDTBA_SHIFT)) & USB_BDTPAGE1_BDTBA_MASK) +/*! @} */ + +/*! @name FRMNUML - Frame Number Register Low */ +/*! @{ */ + +#define USB_FRMNUML_FRM_MASK (0xFFU) +#define USB_FRMNUML_FRM_SHIFT (0U) +/*! FRM - Frame Number, Bits 0-7 */ +#define USB_FRMNUML_FRM(x) (((uint8_t)(((uint8_t)(x)) << USB_FRMNUML_FRM_SHIFT)) & USB_FRMNUML_FRM_MASK) +/*! @} */ + +/*! @name FRMNUMH - Frame Number Register High */ +/*! @{ */ + +#define USB_FRMNUMH_FRM_MASK (0x7U) +#define USB_FRMNUMH_FRM_SHIFT (0U) +/*! FRM - Frame Number, Bits 8-10 */ +#define USB_FRMNUMH_FRM(x) (((uint8_t)(((uint8_t)(x)) << USB_FRMNUMH_FRM_SHIFT)) & USB_FRMNUMH_FRM_MASK) +/*! @} */ + +/*! @name BDTPAGE2 - BDT Page 2 */ +/*! @{ */ + +#define USB_BDTPAGE2_BDTBA_MASK (0xFFU) +#define USB_BDTPAGE2_BDTBA_SHIFT (0U) +/*! BDTBA - BDT Base Address */ +#define USB_BDTPAGE2_BDTBA(x) (((uint8_t)(((uint8_t)(x)) << USB_BDTPAGE2_BDTBA_SHIFT)) & USB_BDTPAGE2_BDTBA_MASK) +/*! @} */ + +/*! @name BDTPAGE3 - BDT Page 3 */ +/*! @{ */ + +#define USB_BDTPAGE3_BDTBA_MASK (0xFFU) +#define USB_BDTPAGE3_BDTBA_SHIFT (0U) +/*! BDTBA - BDT Base Address */ +#define USB_BDTPAGE3_BDTBA(x) (((uint8_t)(((uint8_t)(x)) << USB_BDTPAGE3_BDTBA_SHIFT)) & USB_BDTPAGE3_BDTBA_MASK) +/*! @} */ + +/*! @name ENDPT - Endpoint Control */ +/*! @{ */ + +#define USB_ENDPT_EPHSHK_MASK (0x1U) +#define USB_ENDPT_EPHSHK_SHIFT (0U) +/*! EPHSHK - Endpoint Handshaking Enable */ +#define USB_ENDPT_EPHSHK(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPHSHK_SHIFT)) & USB_ENDPT_EPHSHK_MASK) + +#define USB_ENDPT_EPSTALL_MASK (0x2U) +#define USB_ENDPT_EPSTALL_SHIFT (1U) +/*! EPSTALL - Endpoint Stalled */ +#define USB_ENDPT_EPSTALL(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPSTALL_SHIFT)) & USB_ENDPT_EPSTALL_MASK) + +#define USB_ENDPT_EPTXEN_MASK (0x4U) +#define USB_ENDPT_EPTXEN_SHIFT (2U) +/*! EPTXEN - Endpoint for TX transfers enable */ +#define USB_ENDPT_EPTXEN(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPTXEN_SHIFT)) & USB_ENDPT_EPTXEN_MASK) + +#define USB_ENDPT_EPRXEN_MASK (0x8U) +#define USB_ENDPT_EPRXEN_SHIFT (3U) +/*! EPRXEN - Endpoint for RX transfers enable */ +#define USB_ENDPT_EPRXEN(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPRXEN_SHIFT)) & USB_ENDPT_EPRXEN_MASK) + +#define USB_ENDPT_EPCTLDIS_MASK (0x10U) +#define USB_ENDPT_EPCTLDIS_SHIFT (4U) +/*! EPCTLDIS - Control Transfer Disable + * 0b0..Enable + * 0b1..Disable + */ +#define USB_ENDPT_EPCTLDIS(x) (((uint8_t)(((uint8_t)(x)) << USB_ENDPT_EPCTLDIS_SHIFT)) & USB_ENDPT_EPCTLDIS_MASK) +/*! @} */ + +/* The count of USB_ENDPT */ +#define USB_ENDPT_COUNT (16U) + +/*! @name USBCTRL - USB Control */ +/*! @{ */ + +#define USB_USBCTRL_DPDM_LANE_REVERSE_MASK (0x4U) +#define USB_USBCTRL_DPDM_LANE_REVERSE_SHIFT (2U) +/*! DPDM_LANE_REVERSE - DP and DM Lane Reversal Control + * 0b0..Standard USB DP and DM package pin assignment + * 0b1..Reverse roles of USB DP and DM package pins + */ +#define USB_USBCTRL_DPDM_LANE_REVERSE(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_DPDM_LANE_REVERSE_SHIFT)) & USB_USBCTRL_DPDM_LANE_REVERSE_MASK) + +#define USB_USBCTRL_UARTSEL_MASK (0x10U) +#define USB_USBCTRL_UARTSEL_SHIFT (4U) +/*! UARTSEL - UART Select + * 0b0..USB DP and DM external package pins are used for USB signaling. + * 0b1..USB DP and DM external package pins are used for UART signaling. + */ +#define USB_USBCTRL_UARTSEL(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_UARTSEL_SHIFT)) & USB_USBCTRL_UARTSEL_MASK) + +#define USB_USBCTRL_UARTCHLS_MASK (0x20U) +#define USB_USBCTRL_UARTCHLS_SHIFT (5U) +/*! UARTCHLS - UART Signal Channel Select + * 0b0..USB DP and DM signals are used as UART TX/RX. + * 0b1..USB DP and DM signals are used as UART RX/TX. + */ +#define USB_USBCTRL_UARTCHLS(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_UARTCHLS_SHIFT)) & USB_USBCTRL_UARTCHLS_MASK) + +#define USB_USBCTRL_PDE_MASK (0x40U) +#define USB_USBCTRL_PDE_SHIFT (6U) +/*! PDE - Pulldown Enable + * 0b0..Disable on D+ and D- + * 0b1..Enable on D+ and D- + */ +#define USB_USBCTRL_PDE(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_PDE_SHIFT)) & USB_USBCTRL_PDE_MASK) + +#define USB_USBCTRL_SUSP_MASK (0x80U) +#define USB_USBCTRL_SUSP_SHIFT (7U) +/*! SUSP - Suspend + * 0b0..Not in Suspend state + * 0b1..In Suspend state + */ +#define USB_USBCTRL_SUSP(x) (((uint8_t)(((uint8_t)(x)) << USB_USBCTRL_SUSP_SHIFT)) & USB_USBCTRL_SUSP_MASK) +/*! @} */ + +/*! @name OBSERVE - USB OTG Observe */ +/*! @{ */ + +#define USB_OBSERVE_DMPD_MASK (0x10U) +#define USB_OBSERVE_DMPD_SHIFT (4U) +/*! DMPD - D- Pulldown + * 0b0..Disabled + * 0b1..Enabled + */ +#define USB_OBSERVE_DMPD(x) (((uint8_t)(((uint8_t)(x)) << USB_OBSERVE_DMPD_SHIFT)) & USB_OBSERVE_DMPD_MASK) + +#define USB_OBSERVE_DPPD_MASK (0x40U) +#define USB_OBSERVE_DPPD_SHIFT (6U) +/*! DPPD - D+ Pulldown + * 0b0..Disabled + * 0b1..Enabled + */ +#define USB_OBSERVE_DPPD(x) (((uint8_t)(((uint8_t)(x)) << USB_OBSERVE_DPPD_SHIFT)) & USB_OBSERVE_DPPD_MASK) + +#define USB_OBSERVE_DPPU_MASK (0x80U) +#define USB_OBSERVE_DPPU_SHIFT (7U) +/*! DPPU - D+ Pullup + * 0b0..Disabled + * 0b1..Enabled + */ +#define USB_OBSERVE_DPPU(x) (((uint8_t)(((uint8_t)(x)) << USB_OBSERVE_DPPU_SHIFT)) & USB_OBSERVE_DPPU_MASK) +/*! @} */ + +/*! @name CONTROL - USB OTG Control */ +/*! @{ */ + +#define USB_CONTROL_VBUS_SOURCE_SEL_MASK (0x1U) +#define USB_CONTROL_VBUS_SOURCE_SEL_SHIFT (0U) +/*! VBUS_SOURCE_SEL - VBUS Monitoring Source Select + * 0b0..Reserved + * 0b1..Resistive divider attached to a GPIO pin + */ +#define USB_CONTROL_VBUS_SOURCE_SEL(x) (((uint8_t)(((uint8_t)(x)) << USB_CONTROL_VBUS_SOURCE_SEL_SHIFT)) & USB_CONTROL_VBUS_SOURCE_SEL_MASK) + +#define USB_CONTROL_SESS_VLD_MASK (0x2U) +#define USB_CONTROL_SESS_VLD_SHIFT (1U) +/*! SESS_VLD - VBUS Session Valid status + * 0b1..Above + * 0b0..Below + */ +#define USB_CONTROL_SESS_VLD(x) (((uint8_t)(((uint8_t)(x)) << USB_CONTROL_SESS_VLD_SHIFT)) & USB_CONTROL_SESS_VLD_MASK) + +#define USB_CONTROL_DPPULLUPNONOTG_MASK (0x10U) +#define USB_CONTROL_DPPULLUPNONOTG_SHIFT (4U) +/*! DPPULLUPNONOTG - DP Pullup in Non-OTG Device Mode + * 0b0..Disable + * 0b1..Enabled + */ +#define USB_CONTROL_DPPULLUPNONOTG(x) (((uint8_t)(((uint8_t)(x)) << USB_CONTROL_DPPULLUPNONOTG_SHIFT)) & USB_CONTROL_DPPULLUPNONOTG_MASK) +/*! @} */ + +/*! @name USBTRC0 - USB Transceiver Control 0 */ +/*! @{ */ + +#define USB_USBTRC0_USB_RESUME_INT_MASK (0x1U) +#define USB_USBTRC0_USB_RESUME_INT_SHIFT (0U) +/*! USB_RESUME_INT - USB Asynchronous Interrupt + * 0b0..Not generated + * 0b1..Generated because of the USB asynchronous interrupt + */ +#define USB_USBTRC0_USB_RESUME_INT(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_USB_RESUME_INT_SHIFT)) & USB_USBTRC0_USB_RESUME_INT_MASK) + +#define USB_USBTRC0_SYNC_DET_MASK (0x2U) +#define USB_USBTRC0_SYNC_DET_SHIFT (1U) +/*! SYNC_DET - Synchronous USB Interrupt Detect + * 0b0..Not detected + * 0b1..Detected + */ +#define USB_USBTRC0_SYNC_DET(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_SYNC_DET_SHIFT)) & USB_USBTRC0_SYNC_DET_MASK) + +#define USB_USBTRC0_USB_CLK_RECOVERY_INT_MASK (0x4U) +#define USB_USBTRC0_USB_CLK_RECOVERY_INT_SHIFT (2U) +/*! USB_CLK_RECOVERY_INT - Combined USB Clock Recovery interrupt status */ +#define USB_USBTRC0_USB_CLK_RECOVERY_INT(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_USB_CLK_RECOVERY_INT_SHIFT)) & USB_USBTRC0_USB_CLK_RECOVERY_INT_MASK) + +#define USB_USBTRC0_VREDG_DET_MASK (0x8U) +#define USB_USBTRC0_VREDG_DET_SHIFT (3U) +/*! VREDG_DET - VREGIN Rising Edge Interrupt Detect + * 0b0..Not detected + * 0b1..Detected + */ +#define USB_USBTRC0_VREDG_DET(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_VREDG_DET_SHIFT)) & USB_USBTRC0_VREDG_DET_MASK) + +#define USB_USBTRC0_VFEDG_DET_MASK (0x10U) +#define USB_USBTRC0_VFEDG_DET_SHIFT (4U) +/*! VFEDG_DET - VREGIN Falling Edge Interrupt Detect + * 0b0..Not detected + * 0b1..Detected + */ +#define USB_USBTRC0_VFEDG_DET(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_VFEDG_DET_SHIFT)) & USB_USBTRC0_VFEDG_DET_MASK) + +#define USB_USBTRC0_USBRESMEN_MASK (0x20U) +#define USB_USBTRC0_USBRESMEN_SHIFT (5U) +/*! USBRESMEN - Asynchronous Resume Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_USBTRC0_USBRESMEN(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_USBRESMEN_SHIFT)) & USB_USBTRC0_USBRESMEN_MASK) + +#define USB_USBTRC0_VREGIN_STS_MASK (0x40U) +#define USB_USBTRC0_VREGIN_STS_SHIFT (6U) +/*! VREGIN_STS - VREGIN Status */ +#define USB_USBTRC0_VREGIN_STS(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_VREGIN_STS_SHIFT)) & USB_USBTRC0_VREGIN_STS_MASK) + +#define USB_USBTRC0_USBRESET_MASK (0x80U) +#define USB_USBTRC0_USBRESET_SHIFT (7U) +/*! USBRESET - USB Reset + * 0b0..Normal USBFS operation + * 0b1..Returns USBFS to its reset state + */ +#define USB_USBTRC0_USBRESET(x) (((uint8_t)(((uint8_t)(x)) << USB_USBTRC0_USBRESET_SHIFT)) & USB_USBTRC0_USBRESET_MASK) +/*! @} */ + +/*! @name MISCCTRL - Miscellaneous Control */ +/*! @{ */ + +#define USB_MISCCTRL_OWNERRISODIS_MASK (0x4U) +#define USB_MISCCTRL_OWNERRISODIS_SHIFT (2U) +/*! OWNERRISODIS - OWN Error Detect for ISO IN and ISO OUT Disable + * 0b0..Enable + * 0b1..Disable + */ +#define USB_MISCCTRL_OWNERRISODIS(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_OWNERRISODIS_SHIFT)) & USB_MISCCTRL_OWNERRISODIS_MASK) + +#define USB_MISCCTRL_VREDG_EN_MASK (0x8U) +#define USB_MISCCTRL_VREDG_EN_SHIFT (3U) +/*! VREDG_EN - VREGIN Rising Edge Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_MISCCTRL_VREDG_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_VREDG_EN_SHIFT)) & USB_MISCCTRL_VREDG_EN_MASK) + +#define USB_MISCCTRL_VFEDG_EN_MASK (0x10U) +#define USB_MISCCTRL_VFEDG_EN_SHIFT (4U) +/*! VFEDG_EN - VREGIN Falling Edge Interrupt Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_MISCCTRL_VFEDG_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_VFEDG_EN_SHIFT)) & USB_MISCCTRL_VFEDG_EN_MASK) + +#define USB_MISCCTRL_STL_ADJ_EN_MASK (0x80U) +#define USB_MISCCTRL_STL_ADJ_EN_SHIFT (7U) +/*! STL_ADJ_EN - USB Peripheral Mode Stall Adjust Enable + * 0b0..If ENDPTn[END_STALL] = 1, both IN and OUT directions for the associated endpoint stalls. + * 0b1..If ENDPTn[END_STALL] = 1, the STALL_xx_DIS registers control which directions for the associated endpoint stalls. + */ +#define USB_MISCCTRL_STL_ADJ_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_MISCCTRL_STL_ADJ_EN_SHIFT)) & USB_MISCCTRL_STL_ADJ_EN_MASK) +/*! @} */ + +/*! @name STALL_IL_DIS - Peripheral Mode Stall Disable for Endpoints 7 to 0 in IN Direction */ +/*! @{ */ + +#define USB_STALL_IL_DIS_STALL_I_DIS0_MASK (0x1U) +#define USB_STALL_IL_DIS_STALL_I_DIS0_SHIFT (0U) +/*! STALL_I_DIS0 - Disable Endpoint 0 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS0(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS0_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS0_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS1_MASK (0x2U) +#define USB_STALL_IL_DIS_STALL_I_DIS1_SHIFT (1U) +/*! STALL_I_DIS1 - Disable Endpoint 1 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS1(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS1_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS1_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS2_MASK (0x4U) +#define USB_STALL_IL_DIS_STALL_I_DIS2_SHIFT (2U) +/*! STALL_I_DIS2 - Disable Endpoint 2 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS2(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS2_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS2_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS3_MASK (0x8U) +#define USB_STALL_IL_DIS_STALL_I_DIS3_SHIFT (3U) +/*! STALL_I_DIS3 - Disable Endpoint 3 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS3(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS3_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS3_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS4_MASK (0x10U) +#define USB_STALL_IL_DIS_STALL_I_DIS4_SHIFT (4U) +/*! STALL_I_DIS4 - Disable Endpoint 4 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS4(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS4_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS4_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS5_MASK (0x20U) +#define USB_STALL_IL_DIS_STALL_I_DIS5_SHIFT (5U) +/*! STALL_I_DIS5 - Disable Endpoint 5 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS5(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS5_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS5_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS6_MASK (0x40U) +#define USB_STALL_IL_DIS_STALL_I_DIS6_SHIFT (6U) +/*! STALL_I_DIS6 - Disable Endpoint 6 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS6(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS6_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS6_MASK) + +#define USB_STALL_IL_DIS_STALL_I_DIS7_MASK (0x80U) +#define USB_STALL_IL_DIS_STALL_I_DIS7_SHIFT (7U) +/*! STALL_I_DIS7 - Disable Endpoint 7 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IL_DIS_STALL_I_DIS7(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IL_DIS_STALL_I_DIS7_SHIFT)) & USB_STALL_IL_DIS_STALL_I_DIS7_MASK) +/*! @} */ + +/*! @name STALL_IH_DIS - Peripheral Mode Stall Disable for Endpoints 15 to 8 in IN Direction */ +/*! @{ */ + +#define USB_STALL_IH_DIS_STALL_I_DIS8_MASK (0x1U) +#define USB_STALL_IH_DIS_STALL_I_DIS8_SHIFT (0U) +/*! STALL_I_DIS8 - Disable Endpoint 8 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS8(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS8_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS8_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS9_MASK (0x2U) +#define USB_STALL_IH_DIS_STALL_I_DIS9_SHIFT (1U) +/*! STALL_I_DIS9 - Disable Endpoint 9 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS9(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS9_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS9_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS10_MASK (0x4U) +#define USB_STALL_IH_DIS_STALL_I_DIS10_SHIFT (2U) +/*! STALL_I_DIS10 - Disable Endpoint 10 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS10(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS10_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS10_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS11_MASK (0x8U) +#define USB_STALL_IH_DIS_STALL_I_DIS11_SHIFT (3U) +/*! STALL_I_DIS11 - Disable Endpoint 11 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS11(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS11_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS11_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS12_MASK (0x10U) +#define USB_STALL_IH_DIS_STALL_I_DIS12_SHIFT (4U) +/*! STALL_I_DIS12 - Disable Endpoint 12 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS12(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS12_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS12_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS13_MASK (0x20U) +#define USB_STALL_IH_DIS_STALL_I_DIS13_SHIFT (5U) +/*! STALL_I_DIS13 - Disable Endpoint 13 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS13(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS13_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS13_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS14_MASK (0x40U) +#define USB_STALL_IH_DIS_STALL_I_DIS14_SHIFT (6U) +/*! STALL_I_DIS14 - Disable Endpoint 14 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS14(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS14_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS14_MASK) + +#define USB_STALL_IH_DIS_STALL_I_DIS15_MASK (0x80U) +#define USB_STALL_IH_DIS_STALL_I_DIS15_SHIFT (7U) +/*! STALL_I_DIS15 - Disable Endpoint 15 IN Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_IH_DIS_STALL_I_DIS15(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_IH_DIS_STALL_I_DIS15_SHIFT)) & USB_STALL_IH_DIS_STALL_I_DIS15_MASK) +/*! @} */ + +/*! @name STALL_OL_DIS - Peripheral Mode Stall Disable for Endpoints 7 to 0 in OUT Direction */ +/*! @{ */ + +#define USB_STALL_OL_DIS_STALL_O_DIS0_MASK (0x1U) +#define USB_STALL_OL_DIS_STALL_O_DIS0_SHIFT (0U) +/*! STALL_O_DIS0 - Disable Endpoint 0 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS0(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS0_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS0_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS1_MASK (0x2U) +#define USB_STALL_OL_DIS_STALL_O_DIS1_SHIFT (1U) +/*! STALL_O_DIS1 - Disable Endpoint 1 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS1(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS1_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS1_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS2_MASK (0x4U) +#define USB_STALL_OL_DIS_STALL_O_DIS2_SHIFT (2U) +/*! STALL_O_DIS2 - Disable Endpoint 2 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS2(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS2_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS2_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS3_MASK (0x8U) +#define USB_STALL_OL_DIS_STALL_O_DIS3_SHIFT (3U) +/*! STALL_O_DIS3 - Disable Endpoint 3 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS3(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS3_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS3_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS4_MASK (0x10U) +#define USB_STALL_OL_DIS_STALL_O_DIS4_SHIFT (4U) +/*! STALL_O_DIS4 - Disable Endpoint 4 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS4(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS4_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS4_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS5_MASK (0x20U) +#define USB_STALL_OL_DIS_STALL_O_DIS5_SHIFT (5U) +/*! STALL_O_DIS5 - Disable Endpoint 5 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS5(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS5_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS5_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS6_MASK (0x40U) +#define USB_STALL_OL_DIS_STALL_O_DIS6_SHIFT (6U) +/*! STALL_O_DIS6 - Disable Endpoint 6 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS6(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS6_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS6_MASK) + +#define USB_STALL_OL_DIS_STALL_O_DIS7_MASK (0x80U) +#define USB_STALL_OL_DIS_STALL_O_DIS7_SHIFT (7U) +/*! STALL_O_DIS7 - Disable Endpoint 7 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OL_DIS_STALL_O_DIS7(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OL_DIS_STALL_O_DIS7_SHIFT)) & USB_STALL_OL_DIS_STALL_O_DIS7_MASK) +/*! @} */ + +/*! @name STALL_OH_DIS - Peripheral Mode Stall Disable for Endpoints 15 to 8 in OUT Direction */ +/*! @{ */ + +#define USB_STALL_OH_DIS_STALL_O_DIS8_MASK (0x1U) +#define USB_STALL_OH_DIS_STALL_O_DIS8_SHIFT (0U) +/*! STALL_O_DIS8 - Disable Endpoint 8 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS8(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS8_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS8_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS9_MASK (0x2U) +#define USB_STALL_OH_DIS_STALL_O_DIS9_SHIFT (1U) +/*! STALL_O_DIS9 - Disable Endpoint 9 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS9(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS9_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS9_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS10_MASK (0x4U) +#define USB_STALL_OH_DIS_STALL_O_DIS10_SHIFT (2U) +/*! STALL_O_DIS10 - Disable Endpoint 10 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS10(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS10_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS10_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS11_MASK (0x8U) +#define USB_STALL_OH_DIS_STALL_O_DIS11_SHIFT (3U) +/*! STALL_O_DIS11 - Disable Endpoint 11 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS11(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS11_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS11_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS12_MASK (0x10U) +#define USB_STALL_OH_DIS_STALL_O_DIS12_SHIFT (4U) +/*! STALL_O_DIS12 - Disable endpoint 12 OUT direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS12(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS12_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS12_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS13_MASK (0x20U) +#define USB_STALL_OH_DIS_STALL_O_DIS13_SHIFT (5U) +/*! STALL_O_DIS13 - Disable Endpoint 13 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS13(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS13_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS13_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS14_MASK (0x40U) +#define USB_STALL_OH_DIS_STALL_O_DIS14_SHIFT (6U) +/*! STALL_O_DIS14 - Disable Endpoint 14 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS14(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS14_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS14_MASK) + +#define USB_STALL_OH_DIS_STALL_O_DIS15_MASK (0x80U) +#define USB_STALL_OH_DIS_STALL_O_DIS15_SHIFT (7U) +/*! STALL_O_DIS15 - Disable Endpoint 15 OUT Direction + * 0b0..Enable + * 0b1..Disable + */ +#define USB_STALL_OH_DIS_STALL_O_DIS15(x) (((uint8_t)(((uint8_t)(x)) << USB_STALL_OH_DIS_STALL_O_DIS15_SHIFT)) & USB_STALL_OH_DIS_STALL_O_DIS15_MASK) +/*! @} */ + +/*! @name CLK_RECOVER_CTRL - USB Clock Recovery Control */ +/*! @{ */ + +#define USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL_MASK (0x8U) +#define USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL_SHIFT (3U) +/*! TRIM_INIT_VAL_SEL - Selects the source for the initial FIRC trim fine value used after a reset. + * 0b0..Mid-scale + * 0b1..IFR + */ +#define USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL_SHIFT)) & USB_CLK_RECOVER_CTRL_TRIM_INIT_VAL_SEL_MASK) + +#define USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN_MASK (0x20U) +#define USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN_SHIFT (5U) +/*! RESTART_IFRTRIM_EN - Restart from IFR Trim Value + * 0b0..Trim fine adjustment always works based on the previous updated trim fine value. + * 0b1..Trim fine restarts from the IFR trim value whenever you detect bus_reset or bus_resume or deassert module enable. + */ +#define USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN_SHIFT)) & USB_CLK_RECOVER_CTRL_RESTART_IFRTRIM_EN_MASK) + +#define USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN_MASK (0x40U) +#define USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN_SHIFT (6U) +/*! RESET_RESUME_ROUGH_EN - Reset or Resume to Rough Phase Enable + * 0b0..Always works in tracking phase after the first time rough phase, to track transition. + * 0b1..Go back to rough stage whenever a bus reset or bus resume occurs. + */ +#define USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN_SHIFT)) & USB_CLK_RECOVER_CTRL_RESET_RESUME_ROUGH_EN_MASK) + +#define USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_MASK (0x80U) +#define USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_SHIFT (7U) +/*! CLOCK_RECOVER_EN - Crystal-Less USB Enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_SHIFT)) & USB_CLK_RECOVER_CTRL_CLOCK_RECOVER_EN_MASK) +/*! @} */ + +/*! @name CLK_RECOVER_IRC_EN - FIRC Oscillator Enable */ +/*! @{ */ + +#define USB_CLK_RECOVER_IRC_EN_IRC_EN_MASK (0x2U) +#define USB_CLK_RECOVER_IRC_EN_IRC_EN_SHIFT (1U) +/*! IRC_EN - Fast IRC enable + * 0b0..Disable + * 0b1..Enable + */ +#define USB_CLK_RECOVER_IRC_EN_IRC_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_IRC_EN_IRC_EN_SHIFT)) & USB_CLK_RECOVER_IRC_EN_IRC_EN_MASK) +/*! @} */ + +/*! @name CLK_RECOVER_INT_EN - Clock Recovery Combined Interrupt Enable */ +/*! @{ */ + +#define USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN_MASK (0x10U) +#define USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN_SHIFT (4U) +/*! OVF_ERROR_EN - Overflow error interrupt enable + * 0b0..The interrupt is masked + * 0b1..The interrupt is enabled + */ +#define USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN_SHIFT)) & USB_CLK_RECOVER_INT_EN_OVF_ERROR_EN_MASK) +/*! @} */ + +/*! @name CLK_RECOVER_INT_STATUS - Clock Recovery Separated Interrupt Status */ +/*! @{ */ + +#define USB_CLK_RECOVER_INT_STATUS_OVF_ERROR_MASK (0x10U) +#define USB_CLK_RECOVER_INT_STATUS_OVF_ERROR_SHIFT (4U) +/*! OVF_ERROR - Overflow Error Interrupt Status Flag + * 0b0..Interrupt did not occur + * 0b1..Unmasked interrupt occurred + * 0b0..No effect + * 0b1..Clear the flag + */ +#define USB_CLK_RECOVER_INT_STATUS_OVF_ERROR(x) (((uint8_t)(((uint8_t)(x)) << USB_CLK_RECOVER_INT_STATUS_OVF_ERROR_SHIFT)) & USB_CLK_RECOVER_INT_STATUS_OVF_ERROR_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group USB_Register_Masks */ + + +/* USB - Peripheral instance base addresses */ +/** Peripheral USB0 base address */ +#define USB0_BASE (0x400A4000u) +/** Peripheral USB0 base pointer */ +#define USB0 ((USB_Type *)USB0_BASE) +/** Array initializer of USB peripheral base addresses */ +#define USB_BASE_ADDRS { USB0_BASE } +/** Array initializer of USB peripheral base pointers */ +#define USB_BASE_PTRS { USB0 } +/** Interrupt vectors for the USB peripheral type */ +#define USB_IRQS { USB0_IRQn } +/* Backward compatibility */ +#define USBFS_IRQS USB_IRQS +#define USBFS_IRQHandler USB0_IRQHandler + + +/*! + * @} + */ /* end of group USB_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- UTICK Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup UTICK_Peripheral_Access_Layer UTICK Peripheral Access Layer + * @{ + */ + +/** UTICK - Register Layout Typedef */ +typedef struct { + __IO uint32_t CTRL; /**< Control, offset: 0x0 */ + __IO uint32_t STAT; /**< Status, offset: 0x4 */ + __IO uint32_t CFG; /**< Capture Configuration, offset: 0x8 */ + __O uint32_t CAPCLR; /**< Capture Clear, offset: 0xC */ + __I uint32_t CAP[4]; /**< Capture, array offset: 0x10, array step: 0x4 */ +} UTICK_Type; + +/* ---------------------------------------------------------------------------- + -- UTICK Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup UTICK_Register_Masks UTICK Register Masks + * @{ + */ + +/*! @name CTRL - Control */ +/*! @{ */ + +#define UTICK_CTRL_DELAYVAL_MASK (0x7FFFFFFFU) +#define UTICK_CTRL_DELAYVAL_SHIFT (0U) +/*! DELAYVAL - Tick Interval + * 0b0000000000000000000000000000000.. + * *..Clock cycles as defined in the description + */ +#define UTICK_CTRL_DELAYVAL(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CTRL_DELAYVAL_SHIFT)) & UTICK_CTRL_DELAYVAL_MASK) + +#define UTICK_CTRL_REPEAT_MASK (0x80000000U) +#define UTICK_CTRL_REPEAT_SHIFT (31U) +/*! REPEAT - Repeat Delay + * 0b0..One-time delay + * 0b1..Delay repeats continuously + */ +#define UTICK_CTRL_REPEAT(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CTRL_REPEAT_SHIFT)) & UTICK_CTRL_REPEAT_MASK) +/*! @} */ + +/*! @name STAT - Status */ +/*! @{ */ + +#define UTICK_STAT_INTR_MASK (0x1U) +#define UTICK_STAT_INTR_SHIFT (0U) +/*! INTR - Interrupt Flag + * 0b0..Not pending + * 0b1..Pending + */ +#define UTICK_STAT_INTR(x) (((uint32_t)(((uint32_t)(x)) << UTICK_STAT_INTR_SHIFT)) & UTICK_STAT_INTR_MASK) + +#define UTICK_STAT_ACTIVE_MASK (0x2U) +#define UTICK_STAT_ACTIVE_SHIFT (1U) +/*! ACTIVE - Timer Active Flag + * 0b0..Inactive (stopped) + * 0b1..Active + */ +#define UTICK_STAT_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << UTICK_STAT_ACTIVE_SHIFT)) & UTICK_STAT_ACTIVE_MASK) +/*! @} */ + +/*! @name CFG - Capture Configuration */ +/*! @{ */ + +#define UTICK_CFG_CAPEN0_MASK (0x1U) +#define UTICK_CFG_CAPEN0_SHIFT (0U) +/*! CAPEN0 - Enable Capture 0 + * 0b0..Disable + * 0b1..Enable + */ +#define UTICK_CFG_CAPEN0(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPEN0_SHIFT)) & UTICK_CFG_CAPEN0_MASK) + +#define UTICK_CFG_CAPEN1_MASK (0x2U) +#define UTICK_CFG_CAPEN1_SHIFT (1U) +/*! CAPEN1 - Enable Capture 1 + * 0b0..Disable + * 0b1..Enable + */ +#define UTICK_CFG_CAPEN1(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPEN1_SHIFT)) & UTICK_CFG_CAPEN1_MASK) + +#define UTICK_CFG_CAPEN2_MASK (0x4U) +#define UTICK_CFG_CAPEN2_SHIFT (2U) +/*! CAPEN2 - Enable Capture 2 + * 0b0..Disable + * 0b1..Enable + */ +#define UTICK_CFG_CAPEN2(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPEN2_SHIFT)) & UTICK_CFG_CAPEN2_MASK) + +#define UTICK_CFG_CAPEN3_MASK (0x8U) +#define UTICK_CFG_CAPEN3_SHIFT (3U) +/*! CAPEN3 - Enable Capture 3 + * 0b0..Disable + * 0b1..Enable + */ +#define UTICK_CFG_CAPEN3(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPEN3_SHIFT)) & UTICK_CFG_CAPEN3_MASK) + +#define UTICK_CFG_CAPPOL0_MASK (0x100U) +#define UTICK_CFG_CAPPOL0_SHIFT (8U) +/*! CAPPOL0 - Capture Polarity 0 + * 0b0..Positive + * 0b1..Negative + */ +#define UTICK_CFG_CAPPOL0(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPPOL0_SHIFT)) & UTICK_CFG_CAPPOL0_MASK) + +#define UTICK_CFG_CAPPOL1_MASK (0x200U) +#define UTICK_CFG_CAPPOL1_SHIFT (9U) +/*! CAPPOL1 - Capture-Polarity 1 + * 0b0..Positive + * 0b1..Negative + */ +#define UTICK_CFG_CAPPOL1(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPPOL1_SHIFT)) & UTICK_CFG_CAPPOL1_MASK) + +#define UTICK_CFG_CAPPOL2_MASK (0x400U) +#define UTICK_CFG_CAPPOL2_SHIFT (10U) +/*! CAPPOL2 - Capture Polarity 2 + * 0b0..Positive + * 0b1..Negative + */ +#define UTICK_CFG_CAPPOL2(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPPOL2_SHIFT)) & UTICK_CFG_CAPPOL2_MASK) + +#define UTICK_CFG_CAPPOL3_MASK (0x800U) +#define UTICK_CFG_CAPPOL3_SHIFT (11U) +/*! CAPPOL3 - Capture Polarity 3 + * 0b0..Positive + * 0b1..Negative + */ +#define UTICK_CFG_CAPPOL3(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPPOL3_SHIFT)) & UTICK_CFG_CAPPOL3_MASK) +/*! @} */ + +/*! @name CAPCLR - Capture Clear */ +/*! @{ */ + +#define UTICK_CAPCLR_CAPCLR0_MASK (0x1U) +#define UTICK_CAPCLR_CAPCLR0_SHIFT (0U) +/*! CAPCLR0 - Clear Capture 0 + * 0b0..Does nothing + * 0b1..Clears the CAP0 register value + */ +#define UTICK_CAPCLR_CAPCLR0(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CAPCLR_CAPCLR0_SHIFT)) & UTICK_CAPCLR_CAPCLR0_MASK) + +#define UTICK_CAPCLR_CAPCLR1_MASK (0x2U) +#define UTICK_CAPCLR_CAPCLR1_SHIFT (1U) +/*! CAPCLR1 - Clear Capture 1 + * 0b0..Does nothing + * 0b1..Clears the CAP1 register value + */ +#define UTICK_CAPCLR_CAPCLR1(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CAPCLR_CAPCLR1_SHIFT)) & UTICK_CAPCLR_CAPCLR1_MASK) + +#define UTICK_CAPCLR_CAPCLR2_MASK (0x4U) +#define UTICK_CAPCLR_CAPCLR2_SHIFT (2U) +/*! CAPCLR2 - Clear Capture 2 + * 0b0..Does nothing + * 0b1..Clears the CAP2 register value + */ +#define UTICK_CAPCLR_CAPCLR2(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CAPCLR_CAPCLR2_SHIFT)) & UTICK_CAPCLR_CAPCLR2_MASK) + +#define UTICK_CAPCLR_CAPCLR3_MASK (0x8U) +#define UTICK_CAPCLR_CAPCLR3_SHIFT (3U) +/*! CAPCLR3 - Clear Capture 3 + * 0b0..Does nothing + * 0b1..Clears the CAP3 register value + */ +#define UTICK_CAPCLR_CAPCLR3(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CAPCLR_CAPCLR3_SHIFT)) & UTICK_CAPCLR_CAPCLR3_MASK) +/*! @} */ + +/*! @name CAP - Capture */ +/*! @{ */ + +#define UTICK_CAP_CAP_VALUE_MASK (0x7FFFFFFFU) +#define UTICK_CAP_CAP_VALUE_SHIFT (0U) +/*! CAP_VALUE - Captured Value for the Related Capture Event */ +#define UTICK_CAP_CAP_VALUE(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CAP_CAP_VALUE_SHIFT)) & UTICK_CAP_CAP_VALUE_MASK) + +#define UTICK_CAP_VALID_MASK (0x80000000U) +#define UTICK_CAP_VALID_SHIFT (31U) +/*! VALID - Captured Value Valid Flag + * 0b0..Valid value not captured + * 0b1..Valid value captured + */ +#define UTICK_CAP_VALID(x) (((uint32_t)(((uint32_t)(x)) << UTICK_CAP_VALID_SHIFT)) & UTICK_CAP_VALID_MASK) +/*! @} */ + +/* The count of UTICK_CAP */ +#define UTICK_CAP_COUNT (4U) + + +/*! + * @} + */ /* end of group UTICK_Register_Masks */ + + +/* UTICK - Peripheral instance base addresses */ +/** Peripheral UTICK0 base address */ +#define UTICK0_BASE (0x4000B000u) +/** Peripheral UTICK0 base pointer */ +#define UTICK0 ((UTICK_Type *)UTICK0_BASE) +/** Array initializer of UTICK peripheral base addresses */ +#define UTICK_BASE_ADDRS { UTICK0_BASE } +/** Array initializer of UTICK peripheral base pointers */ +#define UTICK_BASE_PTRS { UTICK0 } +/** Interrupt vectors for the UTICK peripheral type */ +#define UTICK_IRQS { UTICK0_IRQn } + +/*! + * @} + */ /* end of group UTICK_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- VBAT Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup VBAT_Peripheral_Access_Layer VBAT Peripheral Access Layer + * @{ + */ + +/** VBAT - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + uint8_t RESERVED_0[508]; + __IO uint32_t FROCTLA; /**< FRO16K Control A, offset: 0x200 */ + uint8_t RESERVED_1[20]; + __IO uint32_t FROLCKA; /**< FRO16K Lock A, offset: 0x218 */ + uint8_t RESERVED_2[4]; + __IO uint32_t FROCLKE; /**< FRO16K Clock Enable, offset: 0x220 */ + uint8_t RESERVED_3[1244]; + struct { /* offset: 0x700, array step: 0x8 */ + __IO uint32_t WAKEUPA; /**< Wakeup 0 Register A, array offset: 0x700, array step: 0x8 */ + uint8_t RESERVED_0[4]; + } WAKEUP[2]; + uint8_t RESERVED_4[232]; + __IO uint32_t WAKLCKA; /**< Wakeup Lock A, offset: 0x7F8 */ +} VBAT_Type; + +/* ---------------------------------------------------------------------------- + -- VBAT Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup VBAT_Register_Masks VBAT Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define VBAT_VERID_FEATURE_MASK (0xFFFFU) +#define VBAT_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number */ +#define VBAT_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << VBAT_VERID_FEATURE_SHIFT)) & VBAT_VERID_FEATURE_MASK) + +#define VBAT_VERID_MINOR_MASK (0xFF0000U) +#define VBAT_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define VBAT_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << VBAT_VERID_MINOR_SHIFT)) & VBAT_VERID_MINOR_MASK) + +#define VBAT_VERID_MAJOR_MASK (0xFF000000U) +#define VBAT_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define VBAT_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << VBAT_VERID_MAJOR_SHIFT)) & VBAT_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name FROCTLA - FRO16K Control A */ +/*! @{ */ + +#define VBAT_FROCTLA_FRO_EN_MASK (0x1U) +#define VBAT_FROCTLA_FRO_EN_SHIFT (0U) +/*! FRO_EN - FRO16K Enable + * 0b0..Disable + * 0b1..Enable + */ +#define VBAT_FROCTLA_FRO_EN(x) (((uint32_t)(((uint32_t)(x)) << VBAT_FROCTLA_FRO_EN_SHIFT)) & VBAT_FROCTLA_FRO_EN_MASK) +/*! @} */ + +/*! @name FROLCKA - FRO16K Lock A */ +/*! @{ */ + +#define VBAT_FROLCKA_LOCK_MASK (0x1U) +#define VBAT_FROLCKA_LOCK_SHIFT (0U) +/*! LOCK - Lock + * 0b0..Do not block + * 0b1..Block + */ +#define VBAT_FROLCKA_LOCK(x) (((uint32_t)(((uint32_t)(x)) << VBAT_FROLCKA_LOCK_SHIFT)) & VBAT_FROLCKA_LOCK_MASK) +/*! @} */ + +/*! @name FROCLKE - FRO16K Clock Enable */ +/*! @{ */ + +#define VBAT_FROCLKE_CLKE_MASK (0x3U) +#define VBAT_FROCLKE_CLKE_SHIFT (0U) +/*! CLKE - Clock Enable */ +#define VBAT_FROCLKE_CLKE(x) (((uint32_t)(((uint32_t)(x)) << VBAT_FROCLKE_CLKE_SHIFT)) & VBAT_FROCLKE_CLKE_MASK) +/*! @} */ + +/*! @name WAKEUP_WAKEUPA - Wakeup 0 Register A */ +/*! @{ */ + +#define VBAT_WAKEUP_WAKEUPA_REG_MASK (0xFFFFFFFFU) +#define VBAT_WAKEUP_WAKEUPA_REG_SHIFT (0U) +/*! REG - Register */ +#define VBAT_WAKEUP_WAKEUPA_REG(x) (((uint32_t)(((uint32_t)(x)) << VBAT_WAKEUP_WAKEUPA_REG_SHIFT)) & VBAT_WAKEUP_WAKEUPA_REG_MASK) +/*! @} */ + +/* The count of VBAT_WAKEUP_WAKEUPA */ +#define VBAT_WAKEUP_WAKEUPA_COUNT (2U) + +/*! @name WAKLCKA - Wakeup Lock A */ +/*! @{ */ + +#define VBAT_WAKLCKA_LOCK_MASK (0x1U) +#define VBAT_WAKLCKA_LOCK_SHIFT (0U) +/*! LOCK - Lock + * 0b0..Lock is disabled + * 0b1..Lock is enabled + */ +#define VBAT_WAKLCKA_LOCK(x) (((uint32_t)(((uint32_t)(x)) << VBAT_WAKLCKA_LOCK_SHIFT)) & VBAT_WAKLCKA_LOCK_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group VBAT_Register_Masks */ + + +/* VBAT - Peripheral instance base addresses */ +/** Peripheral VBAT0 base address */ +#define VBAT0_BASE (0x40093000u) +/** Peripheral VBAT0 base pointer */ +#define VBAT0 ((VBAT_Type *)VBAT0_BASE) +/** Array initializer of VBAT peripheral base addresses */ +#define VBAT_BASE_ADDRS { VBAT0_BASE } +/** Array initializer of VBAT peripheral base pointers */ +#define VBAT_BASE_PTRS { VBAT0 } + +/*! + * @} + */ /* end of group VBAT_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- WAKETIMER Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup WAKETIMER_Peripheral_Access_Layer WAKETIMER Peripheral Access Layer + * @{ + */ + +/** WAKETIMER - Register Layout Typedef */ +typedef struct { + __IO uint32_t WAKE_TIMER_CTRL; /**< Wake Timer Control, offset: 0x0 */ + uint8_t RESERVED_0[8]; + __IO uint32_t WAKE_TIMER_CNT; /**< Wake Timer Counter, offset: 0xC */ +} WAKETIMER_Type; + +/* ---------------------------------------------------------------------------- + -- WAKETIMER Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup WAKETIMER_Register_Masks WAKETIMER Register Masks + * @{ + */ + +/*! @name WAKE_TIMER_CTRL - Wake Timer Control */ +/*! @{ */ + +#define WAKETIMER_WAKE_TIMER_CTRL_WAKE_FLAG_MASK (0x2U) +#define WAKETIMER_WAKE_TIMER_CTRL_WAKE_FLAG_SHIFT (1U) +/*! WAKE_FLAG - Wake Timer Status Flag + * 0b0..Wake timer has not timed out. + * 0b1..Wake timer has timed out. + */ +#define WAKETIMER_WAKE_TIMER_CTRL_WAKE_FLAG(x) (((uint32_t)(((uint32_t)(x)) << WAKETIMER_WAKE_TIMER_CTRL_WAKE_FLAG_SHIFT)) & WAKETIMER_WAKE_TIMER_CTRL_WAKE_FLAG_MASK) + +#define WAKETIMER_WAKE_TIMER_CTRL_CLR_WAKE_TIMER_MASK (0x4U) +#define WAKETIMER_WAKE_TIMER_CTRL_CLR_WAKE_TIMER_SHIFT (2U) +/*! CLR_WAKE_TIMER - Clear Wake Timer + * 0b0..No effect. + * 0b1..Clears the wake timer counter and halts operation until a new count value is loaded. + */ +#define WAKETIMER_WAKE_TIMER_CTRL_CLR_WAKE_TIMER(x) (((uint32_t)(((uint32_t)(x)) << WAKETIMER_WAKE_TIMER_CTRL_CLR_WAKE_TIMER_SHIFT)) & WAKETIMER_WAKE_TIMER_CTRL_CLR_WAKE_TIMER_MASK) + +#define WAKETIMER_WAKE_TIMER_CTRL_OSC_DIV_ENA_MASK (0x10U) +#define WAKETIMER_WAKE_TIMER_CTRL_OSC_DIV_ENA_SHIFT (4U) +/*! OSC_DIV_ENA - OSC Divide Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define WAKETIMER_WAKE_TIMER_CTRL_OSC_DIV_ENA(x) (((uint32_t)(((uint32_t)(x)) << WAKETIMER_WAKE_TIMER_CTRL_OSC_DIV_ENA_SHIFT)) & WAKETIMER_WAKE_TIMER_CTRL_OSC_DIV_ENA_MASK) + +#define WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_MASK (0x20U) +#define WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_SHIFT (5U) +/*! INTR_EN - Enable Interrupt + * 0b0..Disabled + * 0b1..Enabled + */ +#define WAKETIMER_WAKE_TIMER_CTRL_INTR_EN(x) (((uint32_t)(((uint32_t)(x)) << WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_SHIFT)) & WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_MASK) +/*! @} */ + +/*! @name WAKE_TIMER_CNT - Wake Timer Counter */ +/*! @{ */ + +#define WAKETIMER_WAKE_TIMER_CNT_WAKE_CNT_MASK (0xFFFFFFFFU) +#define WAKETIMER_WAKE_TIMER_CNT_WAKE_CNT_SHIFT (0U) +/*! WAKE_CNT - Wake Counter */ +#define WAKETIMER_WAKE_TIMER_CNT_WAKE_CNT(x) (((uint32_t)(((uint32_t)(x)) << WAKETIMER_WAKE_TIMER_CNT_WAKE_CNT_SHIFT)) & WAKETIMER_WAKE_TIMER_CNT_WAKE_CNT_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group WAKETIMER_Register_Masks */ + + +/* WAKETIMER - Peripheral instance base addresses */ +/** Peripheral WAKETIMER0 base address */ +#define WAKETIMER0_BASE (0x400AE000u) +/** Peripheral WAKETIMER0 base pointer */ +#define WAKETIMER0 ((WAKETIMER_Type *)WAKETIMER0_BASE) +/** Array initializer of WAKETIMER peripheral base addresses */ +#define WAKETIMER_BASE_ADDRS { WAKETIMER0_BASE } +/** Array initializer of WAKETIMER peripheral base pointers */ +#define WAKETIMER_BASE_PTRS { WAKETIMER0 } +/** Interrupt vectors for the WAKETIMER peripheral type */ +#define WAKETIMER_IRQS { WAKETIMER0_IRQn } + +/*! + * @} + */ /* end of group WAKETIMER_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- WUU Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup WUU_Peripheral_Access_Layer WUU Peripheral Access Layer + * @{ + */ + +/** WUU - Register Layout Typedef */ +typedef struct { + __I uint32_t VERID; /**< Version ID, offset: 0x0 */ + __I uint32_t PARAM; /**< Parameter, offset: 0x4 */ + __IO uint32_t PE1; /**< Pin Enable 1, offset: 0x8 */ + __IO uint32_t PE2; /**< Pin Enable 2, offset: 0xC */ + uint8_t RESERVED_0[8]; + __IO uint32_t ME; /**< Module Interrupt Enable, offset: 0x18 */ + __IO uint32_t DE; /**< Module DMA/Trigger Enable, offset: 0x1C */ + __IO uint32_t PF; /**< Pin Flag, offset: 0x20 */ + uint8_t RESERVED_1[12]; + __IO uint32_t FILT; /**< Pin Filter, offset: 0x30 */ + uint8_t RESERVED_2[4]; + __IO uint32_t PDC1; /**< Pin DMA/Trigger Configuration 1, offset: 0x38 */ + __IO uint32_t PDC2; /**< Pin DMA/Trigger Configuration 2, offset: 0x3C */ + uint8_t RESERVED_3[8]; + __IO uint32_t FDC; /**< Pin Filter DMA/Trigger Configuration, offset: 0x48 */ + uint8_t RESERVED_4[4]; + __IO uint32_t PMC; /**< Pin Mode Configuration, offset: 0x50 */ + uint8_t RESERVED_5[4]; + __IO uint32_t FMC; /**< Pin Filter Mode Configuration, offset: 0x58 */ +} WUU_Type; + +/* ---------------------------------------------------------------------------- + -- WUU Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup WUU_Register_Masks WUU Register Masks + * @{ + */ + +/*! @name VERID - Version ID */ +/*! @{ */ + +#define WUU_VERID_FEATURE_MASK (0xFFFFU) +#define WUU_VERID_FEATURE_SHIFT (0U) +/*! FEATURE - Feature Specification Number + * 0b0000000000000000..Standard features implemented + * 0b0000000000000001..Support for DMA/Trigger generation from wake-up pins and filters enabled. Support for + * external pin/filter detection during all power modes enabled. + * *.. + */ +#define WUU_VERID_FEATURE(x) (((uint32_t)(((uint32_t)(x)) << WUU_VERID_FEATURE_SHIFT)) & WUU_VERID_FEATURE_MASK) + +#define WUU_VERID_MINOR_MASK (0xFF0000U) +#define WUU_VERID_MINOR_SHIFT (16U) +/*! MINOR - Minor Version Number */ +#define WUU_VERID_MINOR(x) (((uint32_t)(((uint32_t)(x)) << WUU_VERID_MINOR_SHIFT)) & WUU_VERID_MINOR_MASK) + +#define WUU_VERID_MAJOR_MASK (0xFF000000U) +#define WUU_VERID_MAJOR_SHIFT (24U) +/*! MAJOR - Major Version Number */ +#define WUU_VERID_MAJOR(x) (((uint32_t)(((uint32_t)(x)) << WUU_VERID_MAJOR_SHIFT)) & WUU_VERID_MAJOR_MASK) +/*! @} */ + +/*! @name PARAM - Parameter */ +/*! @{ */ + +#define WUU_PARAM_FILTERS_MASK (0xFFU) +#define WUU_PARAM_FILTERS_SHIFT (0U) +/*! FILTERS - Filter Number */ +#define WUU_PARAM_FILTERS(x) (((uint32_t)(((uint32_t)(x)) << WUU_PARAM_FILTERS_SHIFT)) & WUU_PARAM_FILTERS_MASK) + +#define WUU_PARAM_DMAS_MASK (0xFF00U) +#define WUU_PARAM_DMAS_SHIFT (8U) +/*! DMAS - DMA Number */ +#define WUU_PARAM_DMAS(x) (((uint32_t)(((uint32_t)(x)) << WUU_PARAM_DMAS_SHIFT)) & WUU_PARAM_DMAS_MASK) + +#define WUU_PARAM_MODULES_MASK (0xFF0000U) +#define WUU_PARAM_MODULES_SHIFT (16U) +/*! MODULES - Module Number */ +#define WUU_PARAM_MODULES(x) (((uint32_t)(((uint32_t)(x)) << WUU_PARAM_MODULES_SHIFT)) & WUU_PARAM_MODULES_MASK) + +#define WUU_PARAM_PINS_MASK (0xFF000000U) +#define WUU_PARAM_PINS_SHIFT (24U) +/*! PINS - Pin Number */ +#define WUU_PARAM_PINS(x) (((uint32_t)(((uint32_t)(x)) << WUU_PARAM_PINS_SHIFT)) & WUU_PARAM_PINS_MASK) +/*! @} */ + +/*! @name PE1 - Pin Enable 1 */ +/*! @{ */ + +#define WUU_PE1_Reserved0_MASK (0x3U) +#define WUU_PE1_Reserved0_SHIFT (0U) +/*! Reserved0 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE1_Reserved0(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_Reserved0_SHIFT)) & WUU_PE1_Reserved0_MASK) + +#define WUU_PE1_Reserved1_MASK (0xCU) +#define WUU_PE1_Reserved1_SHIFT (2U) +/*! Reserved1 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE1_Reserved1(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_Reserved1_SHIFT)) & WUU_PE1_Reserved1_MASK) + +#define WUU_PE1_WUPE2_MASK (0x30U) +#define WUU_PE1_WUPE2_SHIFT (4U) +/*! WUPE2 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE1_WUPE2(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_WUPE2_SHIFT)) & WUU_PE1_WUPE2_MASK) + +#define WUU_PE1_Reserved3_MASK (0xC0U) +#define WUU_PE1_Reserved3_SHIFT (6U) +/*! Reserved3 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE1_Reserved3(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_Reserved3_SHIFT)) & WUU_PE1_Reserved3_MASK) + +#define WUU_PE1_Reserved4_MASK (0x300U) +#define WUU_PE1_Reserved4_SHIFT (8U) +/*! Reserved4 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE1_Reserved4(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_Reserved4_SHIFT)) & WUU_PE1_Reserved4_MASK) + +#define WUU_PE1_Reserved5_MASK (0xC00U) +#define WUU_PE1_Reserved5_SHIFT (10U) +/*! Reserved5 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE1_Reserved5(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_Reserved5_SHIFT)) & WUU_PE1_Reserved5_MASK) + +#define WUU_PE1_WUPE6_MASK (0x3000U) +#define WUU_PE1_WUPE6_SHIFT (12U) +/*! WUPE6 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE1_WUPE6(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_WUPE6_SHIFT)) & WUU_PE1_WUPE6_MASK) + +#define WUU_PE1_WUPE7_MASK (0xC000U) +#define WUU_PE1_WUPE7_SHIFT (14U) +/*! WUPE7 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE1_WUPE7(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_WUPE7_SHIFT)) & WUU_PE1_WUPE7_MASK) + +#define WUU_PE1_WUPE8_MASK (0x30000U) +#define WUU_PE1_WUPE8_SHIFT (16U) +/*! WUPE8 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE1_WUPE8(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_WUPE8_SHIFT)) & WUU_PE1_WUPE8_MASK) + +#define WUU_PE1_WUPE9_MASK (0xC0000U) +#define WUU_PE1_WUPE9_SHIFT (18U) +/*! WUPE9 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE1_WUPE9(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_WUPE9_SHIFT)) & WUU_PE1_WUPE9_MASK) + +#define WUU_PE1_WUPE10_MASK (0x300000U) +#define WUU_PE1_WUPE10_SHIFT (20U) +/*! WUPE10 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE1_WUPE10(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_WUPE10_SHIFT)) & WUU_PE1_WUPE10_MASK) + +#define WUU_PE1_WUPE11_MASK (0xC00000U) +#define WUU_PE1_WUPE11_SHIFT (22U) +/*! WUPE11 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE1_WUPE11(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_WUPE11_SHIFT)) & WUU_PE1_WUPE11_MASK) + +#define WUU_PE1_WUPE12_MASK (0x3000000U) +#define WUU_PE1_WUPE12_SHIFT (24U) +/*! WUPE12 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE1_WUPE12(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_WUPE12_SHIFT)) & WUU_PE1_WUPE12_MASK) + +#define WUU_PE1_Reserved13_MASK (0xC000000U) +#define WUU_PE1_Reserved13_SHIFT (26U) +/*! Reserved13 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE1_Reserved13(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_Reserved13_SHIFT)) & WUU_PE1_Reserved13_MASK) + +#define WUU_PE1_Reserved14_MASK (0x30000000U) +#define WUU_PE1_Reserved14_SHIFT (28U) +/*! Reserved14 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE1_Reserved14(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_Reserved14_SHIFT)) & WUU_PE1_Reserved14_MASK) + +#define WUU_PE1_Reserved15_MASK (0xC0000000U) +#define WUU_PE1_Reserved15_SHIFT (30U) +/*! Reserved15 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE1_Reserved15(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE1_Reserved15_SHIFT)) & WUU_PE1_Reserved15_MASK) +/*! @} */ + +/*! @name PE2 - Pin Enable 2 */ +/*! @{ */ + +#define WUU_PE2_WUPE16_MASK (0x3U) +#define WUU_PE2_WUPE16_SHIFT (0U) +/*! WUPE16 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE16(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE16_SHIFT)) & WUU_PE2_WUPE16_MASK) + +#define WUU_PE2_WUPE17_MASK (0xCU) +#define WUU_PE2_WUPE17_SHIFT (2U) +/*! WUPE17 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE17(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE17_SHIFT)) & WUU_PE2_WUPE17_MASK) + +#define WUU_PE2_WUPE18_MASK (0x30U) +#define WUU_PE2_WUPE18_SHIFT (4U) +/*! WUPE18 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE18(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE18_SHIFT)) & WUU_PE2_WUPE18_MASK) + +#define WUU_PE2_WUPE19_MASK (0xC0U) +#define WUU_PE2_WUPE19_SHIFT (6U) +/*! WUPE19 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE19(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE19_SHIFT)) & WUU_PE2_WUPE19_MASK) + +#define WUU_PE2_WUPE20_MASK (0x300U) +#define WUU_PE2_WUPE20_SHIFT (8U) +/*! WUPE20 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE20(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE20_SHIFT)) & WUU_PE2_WUPE20_MASK) + +#define WUU_PE2_Reserved21_MASK (0xC00U) +#define WUU_PE2_Reserved21_SHIFT (10U) +/*! Reserved21 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PE2_Reserved21(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_Reserved21_SHIFT)) & WUU_PE2_Reserved21_MASK) + +#define WUU_PE2_WUPE22_MASK (0x3000U) +#define WUU_PE2_WUPE22_SHIFT (12U) +/*! WUPE22 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE22(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE22_SHIFT)) & WUU_PE2_WUPE22_MASK) + +#define WUU_PE2_WUPE23_MASK (0xC000U) +#define WUU_PE2_WUPE23_SHIFT (14U) +/*! WUPE23 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE23(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE23_SHIFT)) & WUU_PE2_WUPE23_MASK) + +#define WUU_PE2_WUPE24_MASK (0x30000U) +#define WUU_PE2_WUPE24_SHIFT (16U) +/*! WUPE24 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE24(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE24_SHIFT)) & WUU_PE2_WUPE24_MASK) + +#define WUU_PE2_WUPE25_MASK (0xC0000U) +#define WUU_PE2_WUPE25_SHIFT (18U) +/*! WUPE25 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE25(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE25_SHIFT)) & WUU_PE2_WUPE25_MASK) + +#define WUU_PE2_WUPE26_MASK (0x300000U) +#define WUU_PE2_WUPE26_SHIFT (20U) +/*! WUPE26 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE26(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE26_SHIFT)) & WUU_PE2_WUPE26_MASK) + +#define WUU_PE2_WUPE27_MASK (0xC00000U) +#define WUU_PE2_WUPE27_SHIFT (22U) +/*! WUPE27 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE27(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE27_SHIFT)) & WUU_PE2_WUPE27_MASK) + +#define WUU_PE2_WUPE28_MASK (0x3000000U) +#define WUU_PE2_WUPE28_SHIFT (24U) +/*! WUPE28 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE28(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE28_SHIFT)) & WUU_PE2_WUPE28_MASK) + +#define WUU_PE2_WUPE29_MASK (0xC000000U) +#define WUU_PE2_WUPE29_SHIFT (26U) +/*! WUPE29 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE29(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE29_SHIFT)) & WUU_PE2_WUPE29_MASK) + +#define WUU_PE2_WUPE30_MASK (0x30000000U) +#define WUU_PE2_WUPE30_SHIFT (28U) +/*! WUPE30 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE30(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE30_SHIFT)) & WUU_PE2_WUPE30_MASK) + +#define WUU_PE2_WUPE31_MASK (0xC0000000U) +#define WUU_PE2_WUPE31_SHIFT (30U) +/*! WUPE31 - Wake-up Pin Enable for WUU_Pn + * 0b00..Disable + * 0b01..Enable (detect on rising edge or high level) + * 0b10..Enable (detect on falling edge or low level) + * 0b11..Enable (detect on any edge) + */ +#define WUU_PE2_WUPE31(x) (((uint32_t)(((uint32_t)(x)) << WUU_PE2_WUPE31_SHIFT)) & WUU_PE2_WUPE31_MASK) +/*! @} */ + +/*! @name ME - Module Interrupt Enable */ +/*! @{ */ + +#define WUU_ME_WUME0_MASK (0x1U) +#define WUU_ME_WUME0_SHIFT (0U) +/*! WUME0 - Module Interrupt Wake-up Enable for Module 0 + * 0b0..Disable + * 0b1..Enable + */ +#define WUU_ME_WUME0(x) (((uint32_t)(((uint32_t)(x)) << WUU_ME_WUME0_SHIFT)) & WUU_ME_WUME0_MASK) + +#define WUU_ME_WUME2_MASK (0x4U) +#define WUU_ME_WUME2_SHIFT (2U) +/*! WUME2 - Module Interrupt Wake-up Enable for Module 2 + * 0b0..Disable + * 0b1..Enable + */ +#define WUU_ME_WUME2(x) (((uint32_t)(((uint32_t)(x)) << WUU_ME_WUME2_SHIFT)) & WUU_ME_WUME2_MASK) + +#define WUU_ME_WUME6_MASK (0x40U) +#define WUU_ME_WUME6_SHIFT (6U) +/*! WUME6 - Module Interrupt Wake-up Enable for Module 6 + * 0b0..Disable + * 0b1..Enable + */ +#define WUU_ME_WUME6(x) (((uint32_t)(((uint32_t)(x)) << WUU_ME_WUME6_SHIFT)) & WUU_ME_WUME6_MASK) + +#define WUU_ME_WUME8_MASK (0x100U) +#define WUU_ME_WUME8_SHIFT (8U) +/*! WUME8 - Module Interrupt Wake-up Enable for Module 8 + * 0b0..Disable + * 0b1..Enable + */ +#define WUU_ME_WUME8(x) (((uint32_t)(((uint32_t)(x)) << WUU_ME_WUME8_SHIFT)) & WUU_ME_WUME8_MASK) +/*! @} */ + +/*! @name DE - Module DMA/Trigger Enable */ +/*! @{ */ + +#define WUU_DE_WUDE4_MASK (0x10U) +#define WUU_DE_WUDE4_SHIFT (4U) +/*! WUDE4 - DMA/Trigger Wake-up Enable for Module 4 + * 0b0..Disable + * 0b1..Enable + */ +#define WUU_DE_WUDE4(x) (((uint32_t)(((uint32_t)(x)) << WUU_DE_WUDE4_SHIFT)) & WUU_DE_WUDE4_MASK) + +#define WUU_DE_WUDE6_MASK (0x40U) +#define WUU_DE_WUDE6_SHIFT (6U) +/*! WUDE6 - DMA/Trigger Wake-up Enable for Module 6 + * 0b0..Disable + * 0b1..Enable + */ +#define WUU_DE_WUDE6(x) (((uint32_t)(((uint32_t)(x)) << WUU_DE_WUDE6_SHIFT)) & WUU_DE_WUDE6_MASK) + +#define WUU_DE_WUDE8_MASK (0x100U) +#define WUU_DE_WUDE8_SHIFT (8U) +/*! WUDE8 - DMA/Trigger Wake-up Enable for Module 8 + * 0b0..Disable + * 0b1..Enable + */ +#define WUU_DE_WUDE8(x) (((uint32_t)(((uint32_t)(x)) << WUU_DE_WUDE8_SHIFT)) & WUU_DE_WUDE8_MASK) +/*! @} */ + +/*! @name PF - Pin Flag */ +/*! @{ */ + +#define WUU_PF_Reserved0_MASK (0x1U) +#define WUU_PF_Reserved0_SHIFT (0U) +/*! Reserved0 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved0(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved0_SHIFT)) & WUU_PF_Reserved0_MASK) + +#define WUU_PF_Reserved1_MASK (0x2U) +#define WUU_PF_Reserved1_SHIFT (1U) +/*! Reserved1 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved1(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved1_SHIFT)) & WUU_PF_Reserved1_MASK) + +#define WUU_PF_WUF2_MASK (0x4U) +#define WUU_PF_WUF2_SHIFT (2U) +/*! WUF2 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF2(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF2_SHIFT)) & WUU_PF_WUF2_MASK) + +#define WUU_PF_Reserved3_MASK (0x8U) +#define WUU_PF_Reserved3_SHIFT (3U) +/*! Reserved3 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved3(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved3_SHIFT)) & WUU_PF_Reserved3_MASK) + +#define WUU_PF_Reserved4_MASK (0x10U) +#define WUU_PF_Reserved4_SHIFT (4U) +/*! Reserved4 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved4(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved4_SHIFT)) & WUU_PF_Reserved4_MASK) + +#define WUU_PF_Reserved5_MASK (0x20U) +#define WUU_PF_Reserved5_SHIFT (5U) +/*! Reserved5 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved5(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved5_SHIFT)) & WUU_PF_Reserved5_MASK) + +#define WUU_PF_WUF6_MASK (0x40U) +#define WUU_PF_WUF6_SHIFT (6U) +/*! WUF6 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF6(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF6_SHIFT)) & WUU_PF_WUF6_MASK) + +#define WUU_PF_WUF7_MASK (0x80U) +#define WUU_PF_WUF7_SHIFT (7U) +/*! WUF7 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF7(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF7_SHIFT)) & WUU_PF_WUF7_MASK) + +#define WUU_PF_WUF8_MASK (0x100U) +#define WUU_PF_WUF8_SHIFT (8U) +/*! WUF8 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF8(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF8_SHIFT)) & WUU_PF_WUF8_MASK) + +#define WUU_PF_WUF9_MASK (0x200U) +#define WUU_PF_WUF9_SHIFT (9U) +/*! WUF9 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF9(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF9_SHIFT)) & WUU_PF_WUF9_MASK) + +#define WUU_PF_WUF10_MASK (0x400U) +#define WUU_PF_WUF10_SHIFT (10U) +/*! WUF10 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF10(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF10_SHIFT)) & WUU_PF_WUF10_MASK) + +#define WUU_PF_WUF11_MASK (0x800U) +#define WUU_PF_WUF11_SHIFT (11U) +/*! WUF11 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF11(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF11_SHIFT)) & WUU_PF_WUF11_MASK) + +#define WUU_PF_WUF12_MASK (0x1000U) +#define WUU_PF_WUF12_SHIFT (12U) +/*! WUF12 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF12(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF12_SHIFT)) & WUU_PF_WUF12_MASK) + +#define WUU_PF_Reserved13_MASK (0x2000U) +#define WUU_PF_Reserved13_SHIFT (13U) +/*! Reserved13 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved13(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved13_SHIFT)) & WUU_PF_Reserved13_MASK) + +#define WUU_PF_Reserved14_MASK (0x4000U) +#define WUU_PF_Reserved14_SHIFT (14U) +/*! Reserved14 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved14(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved14_SHIFT)) & WUU_PF_Reserved14_MASK) + +#define WUU_PF_Reserved15_MASK (0x8000U) +#define WUU_PF_Reserved15_SHIFT (15U) +/*! Reserved15 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved15(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved15_SHIFT)) & WUU_PF_Reserved15_MASK) + +#define WUU_PF_WUF16_MASK (0x10000U) +#define WUU_PF_WUF16_SHIFT (16U) +/*! WUF16 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF16(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF16_SHIFT)) & WUU_PF_WUF16_MASK) + +#define WUU_PF_WUF17_MASK (0x20000U) +#define WUU_PF_WUF17_SHIFT (17U) +/*! WUF17 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF17(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF17_SHIFT)) & WUU_PF_WUF17_MASK) + +#define WUU_PF_WUF18_MASK (0x40000U) +#define WUU_PF_WUF18_SHIFT (18U) +/*! WUF18 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF18(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF18_SHIFT)) & WUU_PF_WUF18_MASK) + +#define WUU_PF_WUF19_MASK (0x80000U) +#define WUU_PF_WUF19_SHIFT (19U) +/*! WUF19 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF19(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF19_SHIFT)) & WUU_PF_WUF19_MASK) + +#define WUU_PF_WUF20_MASK (0x100000U) +#define WUU_PF_WUF20_SHIFT (20U) +/*! WUF20 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF20(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF20_SHIFT)) & WUU_PF_WUF20_MASK) + +#define WUU_PF_Reserved21_MASK (0x200000U) +#define WUU_PF_Reserved21_SHIFT (21U) +/*! Reserved21 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PF_Reserved21(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_Reserved21_SHIFT)) & WUU_PF_Reserved21_MASK) + +#define WUU_PF_WUF22_MASK (0x400000U) +#define WUU_PF_WUF22_SHIFT (22U) +/*! WUF22 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF22(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF22_SHIFT)) & WUU_PF_WUF22_MASK) + +#define WUU_PF_WUF23_MASK (0x800000U) +#define WUU_PF_WUF23_SHIFT (23U) +/*! WUF23 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF23(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF23_SHIFT)) & WUU_PF_WUF23_MASK) + +#define WUU_PF_WUF24_MASK (0x1000000U) +#define WUU_PF_WUF24_SHIFT (24U) +/*! WUF24 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF24(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF24_SHIFT)) & WUU_PF_WUF24_MASK) + +#define WUU_PF_WUF25_MASK (0x2000000U) +#define WUU_PF_WUF25_SHIFT (25U) +/*! WUF25 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF25(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF25_SHIFT)) & WUU_PF_WUF25_MASK) + +#define WUU_PF_WUF26_MASK (0x4000000U) +#define WUU_PF_WUF26_SHIFT (26U) +/*! WUF26 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF26(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF26_SHIFT)) & WUU_PF_WUF26_MASK) + +#define WUU_PF_WUF27_MASK (0x8000000U) +#define WUU_PF_WUF27_SHIFT (27U) +/*! WUF27 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF27(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF27_SHIFT)) & WUU_PF_WUF27_MASK) + +#define WUU_PF_WUF28_MASK (0x10000000U) +#define WUU_PF_WUF28_SHIFT (28U) +/*! WUF28 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF28(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF28_SHIFT)) & WUU_PF_WUF28_MASK) + +#define WUU_PF_WUF29_MASK (0x20000000U) +#define WUU_PF_WUF29_SHIFT (29U) +/*! WUF29 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF29(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF29_SHIFT)) & WUU_PF_WUF29_MASK) + +#define WUU_PF_WUF30_MASK (0x40000000U) +#define WUU_PF_WUF30_SHIFT (30U) +/*! WUF30 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF30(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF30_SHIFT)) & WUU_PF_WUF30_MASK) + +#define WUU_PF_WUF31_MASK (0x80000000U) +#define WUU_PF_WUF31_SHIFT (31U) +/*! WUF31 - Wake-up Flag for WUU_Pn + * 0b0..No + * 0b1..Yes + */ +#define WUU_PF_WUF31(x) (((uint32_t)(((uint32_t)(x)) << WUU_PF_WUF31_SHIFT)) & WUU_PF_WUF31_MASK) +/*! @} */ + +/*! @name FILT - Pin Filter */ +/*! @{ */ + +#define WUU_FILT_FILTSEL1_MASK (0x1FU) +#define WUU_FILT_FILTSEL1_SHIFT (0U) +/*! FILTSEL1 - Filter 1 Pin Select */ +#define WUU_FILT_FILTSEL1(x) (((uint32_t)(((uint32_t)(x)) << WUU_FILT_FILTSEL1_SHIFT)) & WUU_FILT_FILTSEL1_MASK) + +#define WUU_FILT_FILTE1_MASK (0x60U) +#define WUU_FILT_FILTE1_SHIFT (5U) +/*! FILTE1 - Filter 1 Enable + * 0b00..Disable + * 0b01..Enable (Detect on rising edge or high level) + * 0b10..Enable (Detect on falling edge or low level) + * 0b11..Enable (Detect on any edge) + */ +#define WUU_FILT_FILTE1(x) (((uint32_t)(((uint32_t)(x)) << WUU_FILT_FILTE1_SHIFT)) & WUU_FILT_FILTE1_MASK) + +#define WUU_FILT_FILTF1_MASK (0x80U) +#define WUU_FILT_FILTF1_SHIFT (7U) +/*! FILTF1 - Filter 1 Flag + * 0b0..No + * 0b1..Yes + */ +#define WUU_FILT_FILTF1(x) (((uint32_t)(((uint32_t)(x)) << WUU_FILT_FILTF1_SHIFT)) & WUU_FILT_FILTF1_MASK) + +#define WUU_FILT_FILTSEL2_MASK (0x1F00U) +#define WUU_FILT_FILTSEL2_SHIFT (8U) +/*! FILTSEL2 - Filter 2 Pin Select */ +#define WUU_FILT_FILTSEL2(x) (((uint32_t)(((uint32_t)(x)) << WUU_FILT_FILTSEL2_SHIFT)) & WUU_FILT_FILTSEL2_MASK) + +#define WUU_FILT_FILTE2_MASK (0x6000U) +#define WUU_FILT_FILTE2_SHIFT (13U) +/*! FILTE2 - Filter 2 Enable + * 0b00..Disable + * 0b01..Enable (Detect on rising edge or high level) + * 0b10..Enable (Detect on falling edge or low level) + * 0b11..Enable (Detect on any edge) + */ +#define WUU_FILT_FILTE2(x) (((uint32_t)(((uint32_t)(x)) << WUU_FILT_FILTE2_SHIFT)) & WUU_FILT_FILTE2_MASK) + +#define WUU_FILT_FILTF2_MASK (0x8000U) +#define WUU_FILT_FILTF2_SHIFT (15U) +/*! FILTF2 - Filter 2 Flag + * 0b0..No + * 0b1..Yes + */ +#define WUU_FILT_FILTF2(x) (((uint32_t)(((uint32_t)(x)) << WUU_FILT_FILTF2_SHIFT)) & WUU_FILT_FILTF2_MASK) +/*! @} */ + +/*! @name PDC1 - Pin DMA/Trigger Configuration 1 */ +/*! @{ */ + +#define WUU_PDC1_Reserved0_MASK (0x3U) +#define WUU_PDC1_Reserved0_SHIFT (0U) +/*! Reserved0 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC1_Reserved0(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_Reserved0_SHIFT)) & WUU_PDC1_Reserved0_MASK) + +#define WUU_PDC1_Reserved1_MASK (0xCU) +#define WUU_PDC1_Reserved1_SHIFT (2U) +/*! Reserved1 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC1_Reserved1(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_Reserved1_SHIFT)) & WUU_PDC1_Reserved1_MASK) + +#define WUU_PDC1_WUPDC2_MASK (0x30U) +#define WUU_PDC1_WUPDC2_SHIFT (4U) +/*! WUPDC2 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC1_WUPDC2(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_WUPDC2_SHIFT)) & WUU_PDC1_WUPDC2_MASK) + +#define WUU_PDC1_Reserved3_MASK (0xC0U) +#define WUU_PDC1_Reserved3_SHIFT (6U) +/*! Reserved3 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC1_Reserved3(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_Reserved3_SHIFT)) & WUU_PDC1_Reserved3_MASK) + +#define WUU_PDC1_Reserved4_MASK (0x300U) +#define WUU_PDC1_Reserved4_SHIFT (8U) +/*! Reserved4 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC1_Reserved4(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_Reserved4_SHIFT)) & WUU_PDC1_Reserved4_MASK) + +#define WUU_PDC1_Reserved5_MASK (0xC00U) +#define WUU_PDC1_Reserved5_SHIFT (10U) +/*! Reserved5 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC1_Reserved5(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_Reserved5_SHIFT)) & WUU_PDC1_Reserved5_MASK) + +#define WUU_PDC1_WUPDC6_MASK (0x3000U) +#define WUU_PDC1_WUPDC6_SHIFT (12U) +/*! WUPDC6 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC1_WUPDC6(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_WUPDC6_SHIFT)) & WUU_PDC1_WUPDC6_MASK) + +#define WUU_PDC1_WUPDC7_MASK (0xC000U) +#define WUU_PDC1_WUPDC7_SHIFT (14U) +/*! WUPDC7 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC1_WUPDC7(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_WUPDC7_SHIFT)) & WUU_PDC1_WUPDC7_MASK) + +#define WUU_PDC1_WUPDC8_MASK (0x30000U) +#define WUU_PDC1_WUPDC8_SHIFT (16U) +/*! WUPDC8 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC1_WUPDC8(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_WUPDC8_SHIFT)) & WUU_PDC1_WUPDC8_MASK) + +#define WUU_PDC1_WUPDC9_MASK (0xC0000U) +#define WUU_PDC1_WUPDC9_SHIFT (18U) +/*! WUPDC9 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC1_WUPDC9(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_WUPDC9_SHIFT)) & WUU_PDC1_WUPDC9_MASK) + +#define WUU_PDC1_WUPDC10_MASK (0x300000U) +#define WUU_PDC1_WUPDC10_SHIFT (20U) +/*! WUPDC10 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC1_WUPDC10(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_WUPDC10_SHIFT)) & WUU_PDC1_WUPDC10_MASK) + +#define WUU_PDC1_WUPDC11_MASK (0xC00000U) +#define WUU_PDC1_WUPDC11_SHIFT (22U) +/*! WUPDC11 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC1_WUPDC11(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_WUPDC11_SHIFT)) & WUU_PDC1_WUPDC11_MASK) + +#define WUU_PDC1_WUPDC12_MASK (0x3000000U) +#define WUU_PDC1_WUPDC12_SHIFT (24U) +/*! WUPDC12 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC1_WUPDC12(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_WUPDC12_SHIFT)) & WUU_PDC1_WUPDC12_MASK) + +#define WUU_PDC1_Reserved13_MASK (0xC000000U) +#define WUU_PDC1_Reserved13_SHIFT (26U) +/*! Reserved13 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC1_Reserved13(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_Reserved13_SHIFT)) & WUU_PDC1_Reserved13_MASK) + +#define WUU_PDC1_Reserved14_MASK (0x30000000U) +#define WUU_PDC1_Reserved14_SHIFT (28U) +/*! Reserved14 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC1_Reserved14(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_Reserved14_SHIFT)) & WUU_PDC1_Reserved14_MASK) + +#define WUU_PDC1_Reserved15_MASK (0xC0000000U) +#define WUU_PDC1_Reserved15_SHIFT (30U) +/*! Reserved15 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC1_Reserved15(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC1_Reserved15_SHIFT)) & WUU_PDC1_Reserved15_MASK) +/*! @} */ + +/*! @name PDC2 - Pin DMA/Trigger Configuration 2 */ +/*! @{ */ + +#define WUU_PDC2_WUPDC16_MASK (0x3U) +#define WUU_PDC2_WUPDC16_SHIFT (0U) +/*! WUPDC16 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC16(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC16_SHIFT)) & WUU_PDC2_WUPDC16_MASK) + +#define WUU_PDC2_WUPDC17_MASK (0xCU) +#define WUU_PDC2_WUPDC17_SHIFT (2U) +/*! WUPDC17 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC17(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC17_SHIFT)) & WUU_PDC2_WUPDC17_MASK) + +#define WUU_PDC2_WUPDC18_MASK (0x30U) +#define WUU_PDC2_WUPDC18_SHIFT (4U) +/*! WUPDC18 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC18(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC18_SHIFT)) & WUU_PDC2_WUPDC18_MASK) + +#define WUU_PDC2_WUPDC19_MASK (0xC0U) +#define WUU_PDC2_WUPDC19_SHIFT (6U) +/*! WUPDC19 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC19(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC19_SHIFT)) & WUU_PDC2_WUPDC19_MASK) + +#define WUU_PDC2_WUPDC20_MASK (0x300U) +#define WUU_PDC2_WUPDC20_SHIFT (8U) +/*! WUPDC20 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC20(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC20_SHIFT)) & WUU_PDC2_WUPDC20_MASK) + +#define WUU_PDC2_Reserved21_MASK (0xC00U) +#define WUU_PDC2_Reserved21_SHIFT (10U) +/*! Reserved21 - Reserved + * 0b00..Not supported + * 0b01..Not supported + * 0b10..Not supported + * 0b11..Not supported + */ +#define WUU_PDC2_Reserved21(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_Reserved21_SHIFT)) & WUU_PDC2_Reserved21_MASK) + +#define WUU_PDC2_WUPDC22_MASK (0x3000U) +#define WUU_PDC2_WUPDC22_SHIFT (12U) +/*! WUPDC22 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC22(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC22_SHIFT)) & WUU_PDC2_WUPDC22_MASK) + +#define WUU_PDC2_WUPDC23_MASK (0xC000U) +#define WUU_PDC2_WUPDC23_SHIFT (14U) +/*! WUPDC23 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC23(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC23_SHIFT)) & WUU_PDC2_WUPDC23_MASK) + +#define WUU_PDC2_WUPDC24_MASK (0x30000U) +#define WUU_PDC2_WUPDC24_SHIFT (16U) +/*! WUPDC24 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC24(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC24_SHIFT)) & WUU_PDC2_WUPDC24_MASK) + +#define WUU_PDC2_WUPDC25_MASK (0xC0000U) +#define WUU_PDC2_WUPDC25_SHIFT (18U) +/*! WUPDC25 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC25(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC25_SHIFT)) & WUU_PDC2_WUPDC25_MASK) + +#define WUU_PDC2_WUPDC26_MASK (0x300000U) +#define WUU_PDC2_WUPDC26_SHIFT (20U) +/*! WUPDC26 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC26(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC26_SHIFT)) & WUU_PDC2_WUPDC26_MASK) + +#define WUU_PDC2_WUPDC27_MASK (0xC00000U) +#define WUU_PDC2_WUPDC27_SHIFT (22U) +/*! WUPDC27 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC27(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC27_SHIFT)) & WUU_PDC2_WUPDC27_MASK) + +#define WUU_PDC2_WUPDC28_MASK (0x3000000U) +#define WUU_PDC2_WUPDC28_SHIFT (24U) +/*! WUPDC28 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC28(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC28_SHIFT)) & WUU_PDC2_WUPDC28_MASK) + +#define WUU_PDC2_WUPDC29_MASK (0xC000000U) +#define WUU_PDC2_WUPDC29_SHIFT (26U) +/*! WUPDC29 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC29(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC29_SHIFT)) & WUU_PDC2_WUPDC29_MASK) + +#define WUU_PDC2_WUPDC30_MASK (0x30000000U) +#define WUU_PDC2_WUPDC30_SHIFT (28U) +/*! WUPDC30 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC30(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC30_SHIFT)) & WUU_PDC2_WUPDC30_MASK) + +#define WUU_PDC2_WUPDC31_MASK (0xC0000000U) +#define WUU_PDC2_WUPDC31_SHIFT (30U) +/*! WUPDC31 - Wake-up Pin Configuration for WUU_Pn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_PDC2_WUPDC31(x) (((uint32_t)(((uint32_t)(x)) << WUU_PDC2_WUPDC31_SHIFT)) & WUU_PDC2_WUPDC31_MASK) +/*! @} */ + +/*! @name FDC - Pin Filter DMA/Trigger Configuration */ +/*! @{ */ + +#define WUU_FDC_FILTC1_MASK (0x3U) +#define WUU_FDC_FILTC1_SHIFT (0U) +/*! FILTC1 - Filter Configuration for FILTn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_FDC_FILTC1(x) (((uint32_t)(((uint32_t)(x)) << WUU_FDC_FILTC1_SHIFT)) & WUU_FDC_FILTC1_MASK) + +#define WUU_FDC_FILTC2_MASK (0xCU) +#define WUU_FDC_FILTC2_SHIFT (2U) +/*! FILTC2 - Filter Configuration for FILTn + * 0b00..Interrupt + * 0b01..DMA request + * 0b10..Trigger event + * 0b11..Reserved + */ +#define WUU_FDC_FILTC2(x) (((uint32_t)(((uint32_t)(x)) << WUU_FDC_FILTC2_SHIFT)) & WUU_FDC_FILTC2_MASK) +/*! @} */ + +/*! @name PMC - Pin Mode Configuration */ +/*! @{ */ + +#define WUU_PMC_Reserved0_MASK (0x1U) +#define WUU_PMC_Reserved0_SHIFT (0U) +/*! Reserved0 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved0(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved0_SHIFT)) & WUU_PMC_Reserved0_MASK) + +#define WUU_PMC_Reserved1_MASK (0x2U) +#define WUU_PMC_Reserved1_SHIFT (1U) +/*! Reserved1 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved1(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved1_SHIFT)) & WUU_PMC_Reserved1_MASK) + +#define WUU_PMC_WUPMC2_MASK (0x4U) +#define WUU_PMC_WUPMC2_SHIFT (2U) +/*! WUPMC2 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC2(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC2_SHIFT)) & WUU_PMC_WUPMC2_MASK) + +#define WUU_PMC_Reserved3_MASK (0x8U) +#define WUU_PMC_Reserved3_SHIFT (3U) +/*! Reserved3 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved3(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved3_SHIFT)) & WUU_PMC_Reserved3_MASK) + +#define WUU_PMC_Reserved4_MASK (0x10U) +#define WUU_PMC_Reserved4_SHIFT (4U) +/*! Reserved4 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved4(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved4_SHIFT)) & WUU_PMC_Reserved4_MASK) + +#define WUU_PMC_Reserved5_MASK (0x20U) +#define WUU_PMC_Reserved5_SHIFT (5U) +/*! Reserved5 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved5(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved5_SHIFT)) & WUU_PMC_Reserved5_MASK) + +#define WUU_PMC_WUPMC6_MASK (0x40U) +#define WUU_PMC_WUPMC6_SHIFT (6U) +/*! WUPMC6 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC6(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC6_SHIFT)) & WUU_PMC_WUPMC6_MASK) + +#define WUU_PMC_WUPMC7_MASK (0x80U) +#define WUU_PMC_WUPMC7_SHIFT (7U) +/*! WUPMC7 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC7(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC7_SHIFT)) & WUU_PMC_WUPMC7_MASK) + +#define WUU_PMC_WUPMC8_MASK (0x100U) +#define WUU_PMC_WUPMC8_SHIFT (8U) +/*! WUPMC8 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC8(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC8_SHIFT)) & WUU_PMC_WUPMC8_MASK) + +#define WUU_PMC_WUPMC9_MASK (0x200U) +#define WUU_PMC_WUPMC9_SHIFT (9U) +/*! WUPMC9 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC9(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC9_SHIFT)) & WUU_PMC_WUPMC9_MASK) + +#define WUU_PMC_WUPMC10_MASK (0x400U) +#define WUU_PMC_WUPMC10_SHIFT (10U) +/*! WUPMC10 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC10(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC10_SHIFT)) & WUU_PMC_WUPMC10_MASK) + +#define WUU_PMC_WUPMC11_MASK (0x800U) +#define WUU_PMC_WUPMC11_SHIFT (11U) +/*! WUPMC11 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC11(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC11_SHIFT)) & WUU_PMC_WUPMC11_MASK) + +#define WUU_PMC_WUPMC12_MASK (0x1000U) +#define WUU_PMC_WUPMC12_SHIFT (12U) +/*! WUPMC12 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC12(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC12_SHIFT)) & WUU_PMC_WUPMC12_MASK) + +#define WUU_PMC_Reserved13_MASK (0x2000U) +#define WUU_PMC_Reserved13_SHIFT (13U) +/*! Reserved13 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved13(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved13_SHIFT)) & WUU_PMC_Reserved13_MASK) + +#define WUU_PMC_Reserved14_MASK (0x4000U) +#define WUU_PMC_Reserved14_SHIFT (14U) +/*! Reserved14 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved14(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved14_SHIFT)) & WUU_PMC_Reserved14_MASK) + +#define WUU_PMC_Reserved15_MASK (0x8000U) +#define WUU_PMC_Reserved15_SHIFT (15U) +/*! Reserved15 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved15(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved15_SHIFT)) & WUU_PMC_Reserved15_MASK) + +#define WUU_PMC_WUPMC16_MASK (0x10000U) +#define WUU_PMC_WUPMC16_SHIFT (16U) +/*! WUPMC16 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC16(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC16_SHIFT)) & WUU_PMC_WUPMC16_MASK) + +#define WUU_PMC_WUPMC17_MASK (0x20000U) +#define WUU_PMC_WUPMC17_SHIFT (17U) +/*! WUPMC17 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC17(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC17_SHIFT)) & WUU_PMC_WUPMC17_MASK) + +#define WUU_PMC_WUPMC18_MASK (0x40000U) +#define WUU_PMC_WUPMC18_SHIFT (18U) +/*! WUPMC18 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC18(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC18_SHIFT)) & WUU_PMC_WUPMC18_MASK) + +#define WUU_PMC_WUPMC19_MASK (0x80000U) +#define WUU_PMC_WUPMC19_SHIFT (19U) +/*! WUPMC19 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC19(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC19_SHIFT)) & WUU_PMC_WUPMC19_MASK) + +#define WUU_PMC_WUPMC20_MASK (0x100000U) +#define WUU_PMC_WUPMC20_SHIFT (20U) +/*! WUPMC20 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC20(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC20_SHIFT)) & WUU_PMC_WUPMC20_MASK) + +#define WUU_PMC_Reserved21_MASK (0x200000U) +#define WUU_PMC_Reserved21_SHIFT (21U) +/*! Reserved21 - Reserved + * 0b0..Not supported + * 0b1..Not supported + */ +#define WUU_PMC_Reserved21(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_Reserved21_SHIFT)) & WUU_PMC_Reserved21_MASK) + +#define WUU_PMC_WUPMC22_MASK (0x400000U) +#define WUU_PMC_WUPMC22_SHIFT (22U) +/*! WUPMC22 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC22(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC22_SHIFT)) & WUU_PMC_WUPMC22_MASK) + +#define WUU_PMC_WUPMC23_MASK (0x800000U) +#define WUU_PMC_WUPMC23_SHIFT (23U) +/*! WUPMC23 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC23(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC23_SHIFT)) & WUU_PMC_WUPMC23_MASK) + +#define WUU_PMC_WUPMC24_MASK (0x1000000U) +#define WUU_PMC_WUPMC24_SHIFT (24U) +/*! WUPMC24 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC24(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC24_SHIFT)) & WUU_PMC_WUPMC24_MASK) + +#define WUU_PMC_WUPMC25_MASK (0x2000000U) +#define WUU_PMC_WUPMC25_SHIFT (25U) +/*! WUPMC25 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC25(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC25_SHIFT)) & WUU_PMC_WUPMC25_MASK) + +#define WUU_PMC_WUPMC26_MASK (0x4000000U) +#define WUU_PMC_WUPMC26_SHIFT (26U) +/*! WUPMC26 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC26(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC26_SHIFT)) & WUU_PMC_WUPMC26_MASK) + +#define WUU_PMC_WUPMC27_MASK (0x8000000U) +#define WUU_PMC_WUPMC27_SHIFT (27U) +/*! WUPMC27 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC27(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC27_SHIFT)) & WUU_PMC_WUPMC27_MASK) + +#define WUU_PMC_WUPMC28_MASK (0x10000000U) +#define WUU_PMC_WUPMC28_SHIFT (28U) +/*! WUPMC28 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC28(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC28_SHIFT)) & WUU_PMC_WUPMC28_MASK) + +#define WUU_PMC_WUPMC29_MASK (0x20000000U) +#define WUU_PMC_WUPMC29_SHIFT (29U) +/*! WUPMC29 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC29(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC29_SHIFT)) & WUU_PMC_WUPMC29_MASK) + +#define WUU_PMC_WUPMC30_MASK (0x40000000U) +#define WUU_PMC_WUPMC30_SHIFT (30U) +/*! WUPMC30 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC30(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC30_SHIFT)) & WUU_PMC_WUPMC30_MASK) + +#define WUU_PMC_WUPMC31_MASK (0x80000000U) +#define WUU_PMC_WUPMC31_SHIFT (31U) +/*! WUPMC31 - Wake-up Pin Mode Configuration for WUU_Pn + * 0b0..Active only during a low-leakage mode. You can modify the corresponding fields within Pin Enable (PEn) or + * Pin DMA/Trigger Configuration (PDCn). + * 0b1..Active during all power modes. Do not modify the corresponding fields within Pin Enable (PEn) or Pin DMA/Trigger Configuration (PDCn). + */ +#define WUU_PMC_WUPMC31(x) (((uint32_t)(((uint32_t)(x)) << WUU_PMC_WUPMC31_SHIFT)) & WUU_PMC_WUPMC31_MASK) +/*! @} */ + +/*! @name FMC - Pin Filter Mode Configuration */ +/*! @{ */ + +#define WUU_FMC_FILTM1_MASK (0x1U) +#define WUU_FMC_FILTM1_SHIFT (0U) +/*! FILTM1 - Filter Mode for FILTn + * 0b0..Active only during Power Down/Deep Power Down mode + * 0b1..Active during all power modes + */ +#define WUU_FMC_FILTM1(x) (((uint32_t)(((uint32_t)(x)) << WUU_FMC_FILTM1_SHIFT)) & WUU_FMC_FILTM1_MASK) + +#define WUU_FMC_FILTM2_MASK (0x2U) +#define WUU_FMC_FILTM2_SHIFT (1U) +/*! FILTM2 - Filter Mode for FILTn + * 0b0..Active only during Power Down/Deep Power Down mode + * 0b1..Active during all power modes + */ +#define WUU_FMC_FILTM2(x) (((uint32_t)(((uint32_t)(x)) << WUU_FMC_FILTM2_SHIFT)) & WUU_FMC_FILTM2_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group WUU_Register_Masks */ + + +/* WUU - Peripheral instance base addresses */ +/** Peripheral WUU0 base address */ +#define WUU0_BASE (0x40092000u) +/** Peripheral WUU0 base pointer */ +#define WUU0 ((WUU_Type *)WUU0_BASE) +/** Array initializer of WUU peripheral base addresses */ +#define WUU_BASE_ADDRS { WUU0_BASE } +/** Array initializer of WUU peripheral base pointers */ +#define WUU_BASE_PTRS { WUU0 } + +/*! + * @} + */ /* end of group WUU_Peripheral_Access_Layer */ + + +/* ---------------------------------------------------------------------------- + -- WWDT Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup WWDT_Peripheral_Access_Layer WWDT Peripheral Access Layer + * @{ + */ + +/** WWDT - Register Layout Typedef */ +typedef struct { + __IO uint32_t MOD; /**< Mode, offset: 0x0 */ + __IO uint32_t TC; /**< Timer Constant, offset: 0x4 */ + __O uint32_t FEED; /**< Feed Sequence, offset: 0x8 */ + __I uint32_t TV; /**< Timer Value, offset: 0xC */ + uint8_t RESERVED_0[4]; + __IO uint32_t WARNINT; /**< Warning Interrupt Compare Value, offset: 0x14 */ + __IO uint32_t WINDOW; /**< Window Compare Value, offset: 0x18 */ +} WWDT_Type; + +/* ---------------------------------------------------------------------------- + -- WWDT Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup WWDT_Register_Masks WWDT Register Masks + * @{ + */ + +/*! @name MOD - Mode */ +/*! @{ */ + +#define WWDT_MOD_WDEN_MASK (0x1U) +#define WWDT_MOD_WDEN_SHIFT (0U) +/*! WDEN - Watchdog Enable + * 0b0..Timer stopped + * 0b1..Timer running + */ +#define WWDT_MOD_WDEN(x) (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDEN_SHIFT)) & WWDT_MOD_WDEN_MASK) + +#define WWDT_MOD_WDRESET_MASK (0x2U) +#define WWDT_MOD_WDRESET_SHIFT (1U) +/*! WDRESET - Watchdog Reset Enable + * 0b0..Interrupt + * 0b1..Reset + */ +#define WWDT_MOD_WDRESET(x) (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDRESET_SHIFT)) & WWDT_MOD_WDRESET_MASK) + +#define WWDT_MOD_WDTOF_MASK (0x4U) +#define WWDT_MOD_WDTOF_SHIFT (2U) +/*! WDTOF - Watchdog Timeout Flag + * 0b0..Watchdog event has not occurred. + * 0b1..Watchdog event has occurred (causes a chip reset if WDRESET = 1). + */ +#define WWDT_MOD_WDTOF(x) (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDTOF_SHIFT)) & WWDT_MOD_WDTOF_MASK) + +#define WWDT_MOD_WDINT_MASK (0x8U) +#define WWDT_MOD_WDINT_SHIFT (3U) +/*! WDINT - Warning Interrupt Flag + * 0b0..No flag + * 0b1..Flag + */ +#define WWDT_MOD_WDINT(x) (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDINT_SHIFT)) & WWDT_MOD_WDINT_MASK) + +#define WWDT_MOD_WDPROTECT_MASK (0x10U) +#define WWDT_MOD_WDPROTECT_SHIFT (4U) +/*! WDPROTECT - Watchdog Update Mode + * 0b0..Flexible + * 0b1..Threshold + */ +#define WWDT_MOD_WDPROTECT(x) (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDPROTECT_SHIFT)) & WWDT_MOD_WDPROTECT_MASK) + +#define WWDT_MOD_LOCK_MASK (0x20U) +#define WWDT_MOD_LOCK_SHIFT (5U) +/*! LOCK - Lock + * 0b0..No Lock + * 0b1..Lock + */ +#define WWDT_MOD_LOCK(x) (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_LOCK_SHIFT)) & WWDT_MOD_LOCK_MASK) + +#define WWDT_MOD_DEBUG_EN_MASK (0x40U) +#define WWDT_MOD_DEBUG_EN_SHIFT (6U) +/*! DEBUG_EN - Debug Enable + * 0b0..Disabled + * 0b1..Enabled + */ +#define WWDT_MOD_DEBUG_EN(x) (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_DEBUG_EN_SHIFT)) & WWDT_MOD_DEBUG_EN_MASK) +/*! @} */ + +/*! @name TC - Timer Constant */ +/*! @{ */ + +#define WWDT_TC_COUNT_MASK (0xFFFFFFU) +#define WWDT_TC_COUNT_SHIFT (0U) +/*! COUNT - Watchdog Timeout Value */ +#define WWDT_TC_COUNT(x) (((uint32_t)(((uint32_t)(x)) << WWDT_TC_COUNT_SHIFT)) & WWDT_TC_COUNT_MASK) +/*! @} */ + +/*! @name FEED - Feed Sequence */ +/*! @{ */ + +#define WWDT_FEED_FEED_MASK (0xFFU) +#define WWDT_FEED_FEED_SHIFT (0U) +/*! FEED - Feed Value */ +#define WWDT_FEED_FEED(x) (((uint32_t)(((uint32_t)(x)) << WWDT_FEED_FEED_SHIFT)) & WWDT_FEED_FEED_MASK) +/*! @} */ + +/*! @name TV - Timer Value */ +/*! @{ */ + +#define WWDT_TV_COUNT_MASK (0xFFFFFFU) +#define WWDT_TV_COUNT_SHIFT (0U) +/*! COUNT - Counter Timer Value */ +#define WWDT_TV_COUNT(x) (((uint32_t)(((uint32_t)(x)) << WWDT_TV_COUNT_SHIFT)) & WWDT_TV_COUNT_MASK) +/*! @} */ + +/*! @name WARNINT - Warning Interrupt Compare Value */ +/*! @{ */ + +#define WWDT_WARNINT_WARNINT_MASK (0x3FFU) +#define WWDT_WARNINT_WARNINT_SHIFT (0U) +/*! WARNINT - Watchdog Warning Interrupt Compare Value */ +#define WWDT_WARNINT_WARNINT(x) (((uint32_t)(((uint32_t)(x)) << WWDT_WARNINT_WARNINT_SHIFT)) & WWDT_WARNINT_WARNINT_MASK) +/*! @} */ + +/*! @name WINDOW - Window Compare Value */ +/*! @{ */ + +#define WWDT_WINDOW_WINDOW_MASK (0xFFFFFFU) +#define WWDT_WINDOW_WINDOW_SHIFT (0U) +/*! WINDOW - Watchdog Window Value */ +#define WWDT_WINDOW_WINDOW(x) (((uint32_t)(((uint32_t)(x)) << WWDT_WINDOW_WINDOW_SHIFT)) & WWDT_WINDOW_WINDOW_MASK) +/*! @} */ + + +/*! + * @} + */ /* end of group WWDT_Register_Masks */ + + +/* WWDT - Peripheral instance base addresses */ +/** Peripheral WWDT0 base address */ +#define WWDT0_BASE (0x4000C000u) +/** Peripheral WWDT0 base pointer */ +#define WWDT0 ((WWDT_Type *)WWDT0_BASE) +/** Array initializer of WWDT peripheral base addresses */ +#define WWDT_BASE_ADDRS { WWDT0_BASE } +/** Array initializer of WWDT peripheral base pointers */ +#define WWDT_BASE_PTRS { WWDT0 } + +/*! + * @} + */ /* end of group WWDT_Peripheral_Access_Layer */ + + +/* +** End of section using anonymous unions +*/ + +#if defined(__ARMCC_VERSION) + #if (__ARMCC_VERSION >= 6010050) + #pragma clang diagnostic pop + #else + #pragma pop + #endif +#elif defined(__GNUC__) + /* leave anonymous unions enabled */ +#elif defined(__IAR_SYSTEMS_ICC__) + #pragma language=default +#else + #error Not supported compiler type +#endif + +/*! + * @} + */ /* end of group Peripheral_access_layer */ + + +/* ---------------------------------------------------------------------------- + -- Macros for use with bit field definitions (xxx_SHIFT, xxx_MASK). + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Bit_Field_Generic_Macros Macros for use with bit field definitions (xxx_SHIFT, xxx_MASK). + * @{ + */ + +#if defined(__ARMCC_VERSION) + #if (__ARMCC_VERSION >= 6010050) + #pragma clang system_header + #endif +#elif defined(__IAR_SYSTEMS_ICC__) + #pragma system_include +#endif + +/** + * @brief Mask and left-shift a bit field value for use in a register bit range. + * @param field Name of the register bit field. + * @param value Value of the bit field. + * @return Masked and shifted value. + */ +#define NXP_VAL2FLD(field, value) (((value) << (field ## _SHIFT)) & (field ## _MASK)) +/** + * @brief Mask and right-shift a register value to extract a bit field value. + * @param field Name of the register bit field. + * @param value Value of the register. + * @return Masked and shifted bit field value. + */ +#define NXP_FLD2VAL(field, value) (((value) & (field ## _MASK)) >> (field ## _SHIFT)) + +/*! + * @} + */ /* end of group Bit_Field_Generic_Macros */ + + +/* ---------------------------------------------------------------------------- + -- SDK Compatibility + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup SDK_Compatibility_Symbols SDK Compatibility + * @{ + */ + +/** High Speed SPI (Flexcomm 8) interrupt name */ +#define LSPI_HS_IRQn FLEXCOMM8_IRQn + + +/*! + * @} + */ /* end of group SDK_Compatibility_Symbols */ + + +#endif /* MCXA156_H_ */ + diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/MCXA156_features.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/MCXA156_features.h new file mode 100644 index 00000000000..b362ed44e65 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/MCXA156_features.h @@ -0,0 +1,793 @@ +/* +** ################################################################### +** Version: rev. 1.0, 2022-03-29 +** Build: b240411 +** +** Abstract: +** Chip specific module features. +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2022-03-29) +** Initial version based on v0.1UM +** +** ################################################################### +*/ + +#ifndef _MCXA156_FEATURES_H_ +#define _MCXA156_FEATURES_H_ + +/* SOC module features */ + +/* @brief AOI availability on the SoC. */ +#define FSL_FEATURE_SOC_AOI_COUNT (2) +/* @brief CDOG availability on the SoC. */ +#define FSL_FEATURE_SOC_CDOG_COUNT (1) +/* @brief CMC availability on the SoC. */ +#define FSL_FEATURE_SOC_CMC_COUNT (1) +/* @brief CRC availability on the SoC. */ +#define FSL_FEATURE_SOC_CRC_COUNT (1) +/* @brief CTIMER availability on the SoC. */ +#define FSL_FEATURE_SOC_CTIMER_COUNT (5) +/* @brief EDMA availability on the SoC. */ +#define FSL_FEATURE_SOC_EDMA_COUNT (1) +/* @brief EIM availability on the SoC. */ +#define FSL_FEATURE_SOC_EIM_COUNT (1) +/* @brief EQDC availability on the SoC. */ +#define FSL_FEATURE_SOC_EQDC_COUNT (2) +/* @brief FLEXCAN availability on the SoC. */ +#define FSL_FEATURE_SOC_FLEXCAN_COUNT (1) +/* @brief FLEXIO availability on the SoC. */ +#define FSL_FEATURE_SOC_FLEXIO_COUNT (1) +/* @brief FMC availability on the SoC. */ +#define FSL_FEATURE_SOC_FMC_COUNT (1) +/* @brief FREQME availability on the SoC. */ +#define FSL_FEATURE_SOC_FREQME_COUNT (1) +/* @brief GPIO availability on the SoC. */ +#define FSL_FEATURE_SOC_GPIO_COUNT (5) +/* @brief SPC availability on the SoC. */ +#define FSL_FEATURE_SOC_SPC_COUNT (1) +/* @brief I3C availability on the SoC. */ +#define FSL_FEATURE_SOC_I3C_COUNT (1) +/* @brief INPUTMUX availability on the SoC. */ +#define FSL_FEATURE_SOC_INPUTMUX_COUNT (1) +/* @brief LPADC availability on the SoC. */ +#define FSL_FEATURE_SOC_LPADC_COUNT (2) +/* @brief LPCMP availability on the SoC. */ +#define FSL_FEATURE_SOC_LPCMP_COUNT (2) +/* @brief LPDAC availability on the SoC. */ +#define FSL_FEATURE_SOC_LPDAC_COUNT (1) +/* @brief LPI2C availability on the SoC. */ +#define FSL_FEATURE_SOC_LPI2C_COUNT (4) +/* @brief LPSPI availability on the SoC. */ +#define FSL_FEATURE_SOC_LPSPI_COUNT (2) +/* @brief LPTMR availability on the SoC. */ +#define FSL_FEATURE_SOC_LPTMR_COUNT (1) +/* @brief LPUART availability on the SoC. */ +#define FSL_FEATURE_SOC_LPUART_COUNT (5) +/* @brief OPAMP availability on the SoC. */ +#define FSL_FEATURE_SOC_OPAMP_COUNT (1) +/* @brief OSTIMER availability on the SoC. */ +#define FSL_FEATURE_SOC_OSTIMER_COUNT (1) +/* @brief PORT availability on the SoC. */ +#define FSL_FEATURE_SOC_PORT_COUNT (5) +/* @brief PWM availability on the SoC. */ +#define FSL_FEATURE_SOC_PWM_COUNT (2) +/* @brief SCG availability on the SoC. */ +#define FSL_FEATURE_SOC_SCG_COUNT (1) +/* @brief SYSCON availability on the SoC. */ +#define FSL_FEATURE_SOC_SYSCON_COUNT (1) +/* @brief USB availability on the SoC. */ +#define FSL_FEATURE_SOC_USB_COUNT (1) +/* @brief UTICK availability on the SoC. */ +#define FSL_FEATURE_SOC_UTICK_COUNT (1) +/* @brief WAKETIMER availability on the SoC. */ +#define FSL_FEATURE_SOC_WAKETIMER_COUNT (1) +/* @brief WWDT availability on the SoC. */ +#define FSL_FEATURE_SOC_WWDT_COUNT (1) +/* @brief WUU availability on the SoC. */ +#define FSL_FEATURE_SOC_WUU_COUNT (1) + +/* LPADC module features */ + +/* @brief FIFO availability on the SoC. */ +#define FSL_FEATURE_LPADC_FIFO_COUNT (1) +/* @brief Has subsequent trigger priority (bitfield CFG[TPRICTRL]). */ +#define FSL_FEATURE_LPADC_HAS_CFG_SUBSEQUENT_PRIORITY (1) +/* @brief Has differential mode (bitfield CMDLn[DIFF]). */ +#define FSL_FEATURE_LPADC_HAS_CMDL_DIFF (0) +/* @brief Has channel scale (bitfield CMDLn[CSCALE]). */ +#define FSL_FEATURE_LPADC_HAS_CMDL_CSCALE (0) +/* @brief Has conversion type select (bitfield CMDLn[CTYPE]). */ +#define FSL_FEATURE_LPADC_HAS_CMDL_CTYPE (1) +/* @brief Has conversion resolution select (bitfield CMDLn[MODE]). */ +#define FSL_FEATURE_LPADC_HAS_CMDL_MODE (1) +/* @brief Has compare function enable (bitfield CMDHn[CMPEN]). */ +#define FSL_FEATURE_LPADC_HAS_CMDH_CMPEN (1) +/* @brief Has Wait for trigger assertion before execution (bitfield CMDHn[WAIT_TRIG]). */ +#define FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG (1) +/* @brief Has offset calibration (bitfield CTRL[CALOFS]). */ +#define FSL_FEATURE_LPADC_HAS_CTRL_CALOFS (1) +/* @brief Has gain calibration (bitfield CTRL[CAL_REQ]). */ +#define FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ (1) +/* @brief Has calibration average (bitfield CTRL[CAL_AVGS]). */ +#define FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS (1) +/* @brief Has internal clock (bitfield CFG[ADCKEN]). */ +#define FSL_FEATURE_LPADC_HAS_CFG_ADCKEN (0) +/* @brief Enable support for low voltage reference on option 1 reference (bitfield CFG[VREF1RNG]). */ +#define FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG (0) +/* @brief Has calibration (bitfield CFG[CALOFS]). */ +#define FSL_FEATURE_LPADC_HAS_CFG_CALOFS (0) +/* @brief Has offset trim (register OFSTRIM). */ +#define FSL_FEATURE_LPADC_HAS_OFSTRIM (1) +/* @brief OFSTRIM availability on the SoC. */ +#define FSL_FEATURE_LPADC_OFSTRIM_COUNT (1) +/* @brief Has Trigger status register. */ +#define FSL_FEATURE_LPADC_HAS_TSTAT (1) +/* @brief Has power select (bitfield CFG[PWRSEL]). */ +#define FSL_FEATURE_LPADC_HAS_CFG_PWRSEL (1) +/* @brief Has alternate channel B scale (bitfield CMDLn[ALTB_CSCALE]). */ +#define FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE (0) +/* @brief Has alternate channel B select enable (bitfield CMDLn[ALTBEN]). */ +#define FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN (0) +/* @brief Has alternate channel input (bitfield CMDLn[ALTB_ADCH]). */ +#define FSL_FEATURE_LPADC_HAS_CMDL_ALTB_ADCH (0) +/* @brief Has offset calibration mode (bitfield CTRL[CALOFSMODE]). */ +#define FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE (0) +/* @brief Conversion averaged bitfiled width. */ +#define FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH (4) +/* @brief Has B side channels. */ +#define FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS (0) +/* @brief Indicate whether the LPADC STAT register has trigger exception interrupt function (bitfield STAT[TEXC_INT]). */ +#define FSL_FEATURE_LPADC_HAS_STAT_TEXC_INT (1) +/* @brief Indicate whether the LPADC STAT register has trigger completion interrupt function (bitfield STAT[TCOMP_INT]). */ +#define FSL_FEATURE_LPADC_HAS_STAT_TCOMP_INT (1) +/* @brief Indicate whether the LPADC STAT register has calibration ready function (bitfield STAT[CAL_RDY]). */ +#define FSL_FEATURE_LPADC_HAS_STAT_CAL_RDY (1) +/* @brief Indicate whether the LPADC STAT register has ADC active function (bitfield STAT[ADC_ACTIVE]). */ +#define FSL_FEATURE_LPADC_HAS_STAT_ADC_ACTIVE (1) +/* @brief Indicate whether the LPADC IE register has trigger exception interrupt enable function (bitfield IE[TEXC_IE]). */ +#define FSL_FEATURE_LPADC_HAS_IE_TEXC_IE (1) +/* @brief Indicate whether the LPADC IE register has trigger completion interrupt enable function (bitfield IE[TCOMP_IE]). */ +#define FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE (1) +/* @brief Indicate whether the LPADC CFG register has trigger resume/restart enable function (bitfield CFG[TRES]). */ +#define FSL_FEATURE_LPADC_HAS_CFG_TRES (1) +/* @brief Indicate whether the LPADC CFG register has trigger command resume/restart enable function (bitfield CFG[TCMDRES]). */ +#define FSL_FEATURE_LPADC_HAS_CFG_TCMDRES (1) +/* @brief Indicate whether the LPADC CFG register has high priority trigger exception disable function (bitfield CFG[HPT_EXDI]). */ +#define FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI (1) +/* @brief Indicate LPADC CFG register TPRICTRL bitfield width. */ +#define FSL_FEATURE_LPADC_CFG_TPRICTRL_BITFIELD_WIDTH (2) +/* @brief Has internal temperature sensor. */ +#define FSL_FEATURE_LPADC_HAS_INTERNAL_TEMP_SENSOR (1) +/* @brief Temperature sensor parameter A (slope). */ +#define FSL_FEATURE_LPADC_TEMP_PARAMETER_A (738.0f) +/* @brief Temperature sensor parameter B (offset). */ +#define FSL_FEATURE_LPADC_TEMP_PARAMETER_B (287.5f) +/* @brief Temperature sensor parameter Alpha. */ +#define FSL_FEATURE_LPADC_TEMP_PARAMETER_ALPHA (10.06f) +/* @brief The buffer size of temperature sensor. */ +#define FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE (2U) + +/* AOI module features */ + +/* @brief Maximum value of input mux. */ +#define FSL_FEATURE_AOI_MODULE_INPUTS (4) +/* @brief Number of events related to number of registers AOIx_BFCRT01n/AOIx_BFCRT23n. */ +#define FSL_FEATURE_AOI_EVENT_COUNT (4) + +/* FLEXCAN module features */ + +/* @brief Has more than 64 MBs. */ +#define FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB (0) +/* @brief Message buffer size */ +#define FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(x) (32) +/* @brief Has doze mode support (register bit field MCR[DOZE]). */ +#define FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT (1) +/* @brief Insatnce has doze mode support (register bit field MCR[DOZE]). */ +#define FSL_FEATURE_FLEXCAN_INSTANCE_HAS_DOZE_MODE_SUPPORTn(x) (1) +/* @brief Has a glitch filter on the receive pin (register bit field MCR[WAKSRC]). */ +#define FSL_FEATURE_FLEXCAN_HAS_GLITCH_FILTER (1) +/* @brief Has extended interrupt mask and flag register (register IMASK2, IFLAG2). */ +#define FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER (0) +/* @brief Instance has extended bit timing register (register CBT). */ +#define FSL_FEATURE_FLEXCAN_INSTANCE_HAS_EXTENDED_TIMING_REGISTERn(x) (1) +/* @brief Has a receive FIFO DMA feature (register bit field MCR[DMA]). */ +#define FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA (1) +/* @brief Instance has a receive FIFO DMA feature (register bit field MCR[DMA]). */ +#define FSL_FEATURE_FLEXCAN_INSTANCE_HAS_RX_FIFO_DMAn(x) (1) +/* @brief Remove CAN Engine Clock Source Selection from unsupported part. */ +#define FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE (1) +/* @brief Instance remove CAN Engine Clock Source Selection from unsupported part. */ +#define FSL_FEATURE_FLEXCAN_INSTANCE_SUPPORT_ENGINE_CLK_SEL_REMOVEn(x) (1) +/* @brief Is affected by errata with ID 5641 (Module does not transmit a message that is enabled to be transmitted at a specific moment during the arbitration process). */ +#define FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641 (0) +/* @brief Is affected by errata with ID 5829 (FlexCAN: FlexCAN does not transmit a message that is enabled to be transmitted in a specific moment during the arbitration process). */ +#define FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829 (0) +/* @brief Is affected by errata with ID 6032 (FlexCAN: A frame with wrong ID or payload is transmitted into the CAN bus when the Message Buffer under transmission is either aborted or deactivated while the CAN bus is in the Bus Idle state). */ +#define FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032 (0) +/* @brief Is affected by errata with ID 9595 (FlexCAN: Corrupt frame possible if the Freeze Mode or the Low-Power Mode are entered during a Bus-Off state). */ +#define FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595 (0) +/* @brief Has CAN with Flexible Data rate (CAN FD) protocol. */ +#define FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE (1) +/* @brief CAN instance support Flexible Data rate (CAN FD) protocol. */ +#define FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(x) (1) +/* @brief Has memory error control (register MECR). */ +#define FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL (0) +/* @brief Has enhanced bit timing register (register EPRS, ENCBT, EDCBT and ETDC). */ +#define FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG (1) +/* @brief Has Pretended Networking mode support. */ +#define FSL_FEATURE_FLEXCAN_HAS_PN_MODE (1) +/* @brief Has Enhanced Rx FIFO. */ +#define FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO (1) +/* @brief Enhanced Rx FIFO size (Indicates how many CAN FD messages can be stored). */ +#define FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_SIZE (12) +/* @brief The number of enhanced Rx FIFO filter element registers. */ +#define FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_FILTER_MAX_NUMBER (32) +/* @brief Does not support Supervisor Mode (bitfield MCR[SUPV]. */ +#define FSL_FEATURE_FLEXCAN_HAS_NO_SUPV_SUPPORT (1) + +/* CDOG module features */ + +/* @brief CDOG Has No Reset */ +#define FSL_FEATURE_CDOG_HAS_NO_RESET (1) + +/* CMC module features */ + +/* @brief Has SRAM_DIS register */ +#define FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG (0) +/* @brief Has BSR register */ +#define FSL_FEATURE_MCX_CMC_HAS_BSR_REG (0) +/* @brief Has RSTCNT register */ +#define FSL_FEATURE_MCX_CMC_HAS_RSTCNT_REG (1) +/* @brief Has BLR register */ +#define FSL_FEATURE_MCX_CMC_HAS_BLR_REG (0) + +/* LPCMP module features */ + +/* @brief Has CCR1 FUNC_CLK_SEL bitfield. */ +#define FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL (1) +/* @brief Has IER RRF_IE bitfield. */ +#define FSL_FEATURE_LPCMP_HAS_IER_RRF_IE (1) +/* @brief Has CSR RRF bitfield. */ +#define FSL_FEATURE_LPCMP_HAS_CSR_RRF (1) +/* @brief Has Round Robin mode (related to existence of registers RRCR0). */ +#define FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE (1) +/* @brief Has window mode (related to existence of CCR1.WINDOW_CLS). */ +#define FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL (1) + +/* CTIMER module features */ + +/* @brief CTIMER has no capture channel. */ +#define FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE (0) +/* @brief CTIMER has no capture 2 interrupt. */ +#define FSL_FEATURE_CTIMER_HAS_NO_IR_CR2INT (0) +/* @brief CTIMER capture 3 interrupt. */ +#define FSL_FEATURE_CTIMER_HAS_IR_CR3INT (1) +/* @brief Has CTIMER CCR_CAP2 (register bits CCR[CAP2RE][CAP2FE][CAP2I]. */ +#define FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2 (0) +/* @brief Has CTIMER CCR_CAP3 (register bits CCR[CAP3RE][CAP3FE][CAP3I]). */ +#define FSL_FEATURE_CTIMER_HAS_CCR_CAP3 (1) +/* @brief CTIMER Has register MSR */ +#define FSL_FEATURE_CTIMER_HAS_MSR (1) + +/* LPDAC module features */ + +/* @brief FIFO size. */ +#define FSL_FEATURE_LPDAC_FIFO_SIZE (16) +/* @brief Has OPAMP as buffer, speed control signal (bitfield GCR[BUF_SPD_CTRL]). */ +#define FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL (1) +/* @brief Buffer Enable(bitfield GCR[BUF_EN]). */ +#define FSL_FEATURE_LPDAC_HAS_GCR_BUF_EN (1) +/* @brief RCLK cycles before data latch(bitfield GCR[LATCH_CYC]). */ +#define FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC (1) +/* @brief VREF source number. */ +#define FSL_FEATURE_ANALOG_NUM_OF_VREF_SRC (3) +/* @brief Has internal reference current options. */ +#define FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT (1) + +/* EDMA module features */ + +/* @brief Number of DMA channels (related to number of registers TCD, DCHPRI, bit fields ERQ[ERQn], EEI[EEIn], INT[INTn], ERR[ERRn], HRS[HRSn] and bit field widths ES[ERRCHN], CEEI[CEEI], SEEI[SEEI], CERQ[CERQ], SERQ[SERQ], CDNE[CDNE], SSRT[SSRT], CERR[CERR], CINT[CINT], TCDn_CITER_ELINKYES[LINKCH], TCDn_CSR[MAJORLINKCH], TCDn_BITER_ELINKYES[LINKCH]). (Valid only for eDMA modules.) */ +#define FSL_FEATURE_EDMA_MODULE_CHANNEL (8) +/* @brief If 8 bytes transfer supported. */ +#define FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER (1) +/* @brief Number of DMA channel groups (register bit fields CR[ERGA], CR[GRPnPRI], ES[GPE], DCHPRIn[GRPPRI]). (Valid only for eDMA modules.) */ +#define FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT (1) +/* @brief If 16 bytes transfer supported. */ +#define FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER (1) +/* @brief Has DMA_Error interrupt vector. */ +#define FSL_FEATURE_EDMA_HAS_ERROR_IRQ (1) +/* @brief If 64 bytes transfer supported. */ +#define FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER (1) +/* @brief If channel clock controlled independently */ +#define FSL_FEATURE_EDMA_CHANNEL_HAS_OWN_CLOCK_GATE (1) +/* @brief If 128 bytes transfer supported. */ +#define FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER (1) +/* @brief Number of channel for each EDMA instance, (only defined for soc with different channel numbers for difference instance) */ +#define FSL_FEATURE_EDMA_INSTANCE_CHANNELn(x) (8) +/* @brief If 128 bytes transfer supported. */ +#define FSL_FEATURE_EDMA_INSTANCE_SUPPORT_128_BYTES_TRANSFERn(x) (1) +/* @brief Has no register bit fields MP_CSR[EBW]. */ +#define FSL_FEATURE_EDMA_HAS_NO_MP_CSR_EBW (1) +/* @brief Has register CH_CSR. */ +#define FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG (1) +/* @brief If dma has common clock gate */ +#define FSL_FEATURE_EDMA_HAS_COMMON_CLOCK_GATE (0) +/* @brief Has channel mux */ +#define FSL_FEATURE_EDMA_HAS_CHANNEL_MUX (1) +/* @brief If dma channel IRQ support parameter */ +#define FSL_FEATURE_EDMA_MODULE_CHANNEL_IRQ_ENTRY_SUPPORT_PARAMETER (0) +/* @brief Instance has channel mux */ +#define FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_MUXn(x) (1) +/* @brief NBYTES must be multiple of 8 when using scatter gather. */ +#define FSL_FEATURE_EDMA_HAS_ERRATA_51327 (0) +/* @brief Has register CH_SBR. */ +#define FSL_FEATURE_EDMA_HAS_SBR (1) +/* @brief NBYTES must be multiple of 8 when using scatter gather. */ +#define FSL_FEATURE_EDMA_INSTANCE_HAS_ERRATA_51327n(x) (0) +/* @brief Has no register bit fields CH_SBR[ATTR]. */ +#define FSL_FEATURE_EDMA_HAS_NO_CH_SBR_ATTR (1) +/* @brief Has register bit fields MP_CSR[GMRC]. */ +#define FSL_FEATURE_EDMA_HAS_GLOBAL_MASTER_ID_REPLICATION (1) +/* @brief Has register bit field CH_CSR[SWAP]. */ +#define FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE (0) +/* @brief Instance has register bit field CH_CSR[SWAP]. */ +#define FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_SWAP_SIZEn(x) (0) +/* @brief Has register bit field CH_SBR[INSTR]. */ +#define FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE (0) +/* @brief Instance has register bit field CH_SBR[INSTR]. */ +#define FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_ACCESS_TYPEn(x) (0) +/* @brief Has register bit fields CH_MATTR[WCACHE], CH_MATTR[RCACHE]. */ +#define FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE (0) +/* @brief Instance has register CH_MATTR. */ +#define FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_MEMORY_ATTRIBUTEn(x) (0) +/* @brief Has register bit field CH_CSR[SIGNEXT]. */ +#define FSL_FEATURE_EDMA_HAS_CHANNEL_SIGN_EXTENSION (0) +/* @brief Instance Has register bit field CH_CSR[SIGNEXT]. */ +#define FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_SIGN_EXTENSIONn(x) (0) +/* @brief Has register bit field TCD_CSR[BWC]. */ +#define FSL_FEATURE_EDMA_HAS_BANDWIDTH (1) +/* @brief Instance has register bit field TCD_CSR[BWC]. */ +#define FSL_FEATURE_EDMA_INSTANCE_HAS_BANDWIDTHn(x) (1) +/* @brief Has register bit fields TCD_CSR[TMC]. */ +#define FSL_FEATURE_EDMA_HAS_TRANSFER_MODE (0) +/* @brief Instance has register bit fields TCD_CSR[TMC]. */ +#define FSL_FEATURE_EDMA_INSTANCE_HAS_TRANSFER_MODEn(x) (0) +/* @brief Has no register bit fields CH_SBR[SEC]. */ +#define FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC (1) + +/* FLEXIO module features */ + +/* @brief Has Shifter Status Register (FLEXIO_SHIFTSTAT) */ +#define FSL_FEATURE_FLEXIO_HAS_SHIFTER_STATUS (1) +/* @brief Has Pin Data Input Register (FLEXIO_PIN) */ +#define FSL_FEATURE_FLEXIO_HAS_PIN_STATUS (1) +/* @brief Has pin input output related registers */ +#define FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER (1) +/* @brief Has Shifter Buffer N Nibble Byte Swapped Register (FLEXIO_SHIFTBUFNBSn) */ +#define FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP (1) +/* @brief Has Shifter Buffer N Half Word Swapped Register (FLEXIO_SHIFTBUFHWSn) */ +#define FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP (1) +/* @brief Has Shifter Buffer N Nibble Swapped Register (FLEXIO_SHIFTBUFNISn) */ +#define FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP (1) +/* @brief Supports Shifter State Mode (FLEXIO_SHIFTCTLn[SMOD]) */ +#define FSL_FEATURE_FLEXIO_HAS_STATE_MODE (1) +/* @brief Supports Shifter Logic Mode (FLEXIO_SHIFTCTLn[SMOD]) */ +#define FSL_FEATURE_FLEXIO_HAS_LOGIC_MODE (1) +/* @brief Supports paralle width (FLEXIO_SHIFTCFGn[PWIDTH]) */ +#define FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH (1) +/* @brief Reset value of the FLEXIO_VERID register */ +#define FSL_FEATURE_FLEXIO_VERID_RESET_VALUE (0x2010003) +/* @brief Reset value of the FLEXIO_PARAM register */ +#define FSL_FEATURE_FLEXIO_PARAM_RESET_VALUE (0x4200404) +/* @brief Represent the bit width of the TIMDCE field (FLEXIO_TIMCFGLn[TIMDEC]) */ +#define FSL_FEATURE_FLEXIO_TIMCFG_TIMDCE_FIELD_WIDTH (3) + +/* PWM module features */ + +/* @brief If (e)FlexPWM has module A channels (outputs). */ +#define FSL_FEATURE_PWM_HAS_CHANNELA (1) +/* @brief If (e)FlexPWM has module B channels (outputs). */ +#define FSL_FEATURE_PWM_HAS_CHANNELB (1) +/* @brief If (e)FlexPWM has module X channels (outputs). */ +#define FSL_FEATURE_PWM_HAS_CHANNELX (1) +/* @brief If (e)FlexPWM has fractional feature. */ +#define FSL_FEATURE_PWM_HAS_FRACTIONAL (0) +/* @brief If (e)FlexPWM has mux trigger source select bit field. */ +#define FSL_FEATURE_PWM_HAS_MUX_TRIGGER_SOURCE_SEL (1) +/* @brief Number of submodules in each (e)FlexPWM module. */ +#define FSL_FEATURE_PWM_SUBMODULE_COUNT (3) +/* @brief Number of fault channel in each (e)FlexPWM module. */ +#define FSL_FEATURE_PWM_FAULT_CH_COUNT (1) +/* @brief (e)FlexPWM has no WAITEN Bitfield In CTRL2 Register. */ +#define FSL_FEATURE_PWM_HAS_NO_WAITEN (1) +/* @brief If (e)FlexPWM has phase delay feature. */ +#define FSL_FEATURE_PWM_HAS_PHASE_DELAY (1) +/* @brief If (e)FlexPWM has input filter capture feature. */ +#define FSL_FEATURE_PWM_HAS_INPUT_FILTER_CAPTURE (1) +/* @brief If (e)FlexPWM has module capture functionality on A channels (inputs). */ +#define FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA (0) +/* @brief If (e)FlexPWM has module capture functionality on B channels (inputs). */ +#define FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB (0) +/* @brief If (e)FlexPWM has module capture functionality on X channels (inputs). */ +#define FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX (1) + +/* FMU module features */ + +/* @brief Is the flash module msf1? */ +#define FSL_FEATURE_FSL_FEATURE_FLASH_IS_MSF1 (1) +/* @brief P-Flash block count. */ +#define FSL_FEATURE_FLASH_PFLASH_BLOCK_COUNT (1) +/* @brief P-Flash block0 start address. */ +#define FSL_FEATURE_FLASH_PFLASH_START_ADDRESS (0x00000000U) +/* @brief P-Flash block0 size. */ +#define FSL_FEATURE_FLASH_PFLASH_BLOCK_SIZE (0x100000U) +/* @brief P-Flash sector size. */ +#define FSL_FEATURE_FLASH_PFLASH_SECTOR_SIZE (0x2000U) +/* @brief P-Flash page size. */ +#define FSL_FEATURE_FLASH_PFLASH_PAGE_SIZE (128) +/* @brief P-Flash phrase size. */ +#define FSL_FEATURE_FLASH_PFLASH_PHRASE_SIZE (16) +/* @brief Has IFR memory. */ +#define FSL_FEATURE_FLASH_HAS_IFR (1) +/* @brief flash BLOCK0 IFR0 start address. */ +#define FSL_FEATURE_FLASH_IFR0_START_ADDRESS (0x01000000u) +/* @brief flash BLOCK0 IFR1 start address. */ +#define FSL_FEATURE_FLASH_IFR1_START_ADDRESS (0x02100000U) +/* @brief flash block IFR0 size. */ +#define FSL_FEATURE_FLASH_IFR0_SIZE (0x8000U) +/* @brief flash block IFR1 size. */ +#define FSL_FEATURE_FLASH_IFR1_SIZE (0x2000U) +/* @brief IFR sector size. */ +#define FSL_FEATURE_FLASH_IFR_SECTOR_SIZE (0x2000U) +/* @brief IFR page size. */ +#define FSL_FEATURE_FLASH_IFR_PAGE_SIZE (128) + +/* GLIKEY module features */ + +/* @brief GLIKEY has 8 step FSM configuration */ +#define FSL_FEATURE_GLIKEY_HAS_EIGHT_STEPS (1) + +/* GPIO module features */ + +/* @brief Has GPIO attribute checker register (GACR). */ +#define FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER (0) +/* @brief Has GPIO version ID register (VERID). */ +#define FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER (1) +/* @brief Has secure/non-secure access protection registers (LOCK, PCNS, PCNP, ICNS, ICNP). */ +#define FSL_FEATURE_GPIO_HAS_SECURE_PRIVILEGE_CONTROL (0) +/* @brief Has GPIO port input disable register (PIDR). */ +#define FSL_FEATURE_GPIO_HAS_PORT_INPUT_CONTROL (1) +/* @brief Has GPIO interrupt/DMA request/trigger output selection. */ +#define FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT (0) + +/* I3C module features */ + +/* @brief Has TERM bitfile in MERRWARN register. */ +#define FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM (0) +/* @brief SOC has no reset driver. */ +#define FSL_FEATURE_I3C_HAS_NO_RESET (0) +/* @brief Use fixed BAMATCH count, do not provide editable BAMATCH. */ +#define FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH (0) +/* @brief Register SCONFIG do not have IDRAND bitfield. */ +#define FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND (1) +/* @brief Register SCONFIG has HDROK bitfield. */ +#define FSL_FEATURE_I3C_HAS_HDROK (1) +/* @brief SOC doesn't support slave IBI/MR/HJ. */ +#define FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ (0) +/* @brief Has SCL delay after START. */ +#define FSL_FEATURE_I3C_HAS_START_SCL_DELAY (1) + +/* LPI2C module features */ + +/* @brief Has separate DMA RX and TX requests. */ +#define FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(x) (1) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPI2C_FIFO_SIZEn(x) (4) + +/* LPSPI module features */ + +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPSPI_FIFO_SIZEn(x) (4) +/* @brief Has separate DMA RX and TX requests. */ +#define FSL_FEATURE_LPSPI_HAS_SEPARATE_DMA_RX_TX_REQn(x) (1) +/* @brief Has CCR1 (related to existence of registers CCR1). */ +#define FSL_FEATURE_LPSPI_HAS_CCR1 (1) +/* @brief Has no PCSCFG bit in CFGR1 register */ +#define FSL_FEATURE_LPSPI_HAS_NO_PCSCFG (0) +/* @brief Has no WIDTH bits in TCR register */ +#define FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH (0) + +/* LPTMR module features */ + +/* @brief Has shared interrupt handler with another LPTMR module. */ +#define FSL_FEATURE_LPTMR_HAS_SHARED_IRQ_HANDLER (0) +/* @brief Whether LPTMR counter is 32 bits width. */ +#define FSL_FEATURE_LPTMR_CNR_WIDTH_IS_32B (1) +/* @brief Has timer DMA request enable (register bit CSR[TDRE]). */ +#define FSL_FEATURE_LPTMR_HAS_CSR_TDRE (1) +/* @brief Do not has prescaler clock source 0. */ +#define FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_0_SUPPORT (1) +/* @brief Do not has prescaler clock source 1. */ +#define FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_1_SUPPORT (0) +/* @brief Do not has prescaler clock source 2. */ +#define FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_2_SUPPORT (1) +/* @brief Do not has prescaler clock source 3. */ +#define FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_3_SUPPORT (0) + +/* LPUART module features */ + +/* @brief Has receive FIFO overflow detection (bit field CFIFO[RXOFE]). */ +#define FSL_FEATURE_LPUART_HAS_IRQ_EXTENDED_FUNCTIONS (0) +/* @brief Has low power features (can be enabled in wait mode via register bit C1[DOZEEN] or CTRL[DOZEEN] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_LOW_POWER_UART_SUPPORT (1) +/* @brief Has extended data register ED (or extra flags in the DATA register if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPUART_HAS_FIFO (1) +/* @brief Has 32-bit register MODIR */ +#define FSL_FEATURE_LPUART_HAS_MODIR (1) +/* @brief Hardware flow control (RTS, CTS) is supported. */ +#define FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT (1) +/* @brief Infrared (modulation) is supported. */ +#define FSL_FEATURE_LPUART_HAS_IR_SUPPORT (1) +/* @brief 2 bits long stop bit is available. */ +#define FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT (1) +/* @brief If 10-bit mode is supported. */ +#define FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT (1) +/* @brief If 7-bit mode is supported. */ +#define FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT (1) +/* @brief Baud rate fine adjustment is available. */ +#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_FINE_ADJUST_SUPPORT (0) +/* @brief Baud rate oversampling is available (has bit fields C4[OSR], C5[BOTHEDGE], C5[RESYNCDIS] or BAUD[OSR], BAUD[BOTHEDGE], BAUD[RESYNCDIS] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FSL_FEATURE_LPUART_HAS_RX_RESYNC_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FSL_FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (1) +/* @brief Peripheral type. */ +#define FSL_FEATURE_LPUART_IS_SCI (1) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FSL_FEATURE_LPUART_FIFO_SIZEn(x) (4) +/* @brief Supports two match addresses to filter incoming frames. */ +#define FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING (1) +/* @brief Has transmitter/receiver DMA enable bits C5[TDMAE]/C5[RDMAE] (or BAUD[TDMAE]/BAUD[RDMAE] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_DMA_ENABLE (1) +/* @brief Has transmitter/receiver DMA select bits C4[TDMAS]/C4[RDMAS], resp. C5[TDMAS]/C5[RDMAS] if IS_SCI = 0. */ +#define FSL_FEATURE_LPUART_HAS_DMA_SELECT (0) +/* @brief Data character bit order selection is supported (bit field S2[MSBF] or STAT[MSBF] if the registers are 32-bit wide). */ +#define FSL_FEATURE_LPUART_HAS_BIT_ORDER_SELECT (1) +/* @brief Has smart card (ISO7816 protocol) support and no improved smart card support. */ +#define FSL_FEATURE_LPUART_HAS_SMART_CARD_SUPPORT (0) +/* @brief Has improved smart card (ISO7816 protocol) support. */ +#define FSL_FEATURE_LPUART_HAS_IMPROVED_SMART_CARD_SUPPORT (0) +/* @brief Has local operation network (CEA709.1-B protocol) support. */ +#define FSL_FEATURE_LPUART_HAS_LOCAL_OPERATION_NETWORK_SUPPORT (0) +/* @brief Has 32-bit registers (BAUD, STAT, CTRL, DATA, MATCH, MODIR) instead of 8-bit (BDH, BDL, C1, S1, D, etc.). */ +#define FSL_FEATURE_LPUART_HAS_32BIT_REGISTERS (1) +/* @brief Lin break detect available (has bit BAUD[LBKDIE]). */ +#define FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT (1) +/* @brief UART stops in Wait mode available (has bit C1[UARTSWAI]). */ +#define FSL_FEATURE_LPUART_HAS_WAIT_MODE_OPERATION (0) +/* @brief Has separate DMA RX and TX requests. */ +#define FSL_FEATURE_LPUART_HAS_SEPARATE_DMA_RX_TX_REQn(x) (1) +/* @brief Has separate RX and TX interrupts. */ +#define FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ (0) +/* @brief Has LPAURT_PARAM. */ +#define FSL_FEATURE_LPUART_HAS_PARAM (1) +/* @brief Has LPUART_VERID. */ +#define FSL_FEATURE_LPUART_HAS_VERID (1) +/* @brief Has LPUART_GLOBAL. */ +#define FSL_FEATURE_LPUART_HAS_GLOBAL (1) +/* @brief Has LPUART_PINCFG. */ +#define FSL_FEATURE_LPUART_HAS_PINCFG (1) +/* @brief Has register MODEM Control. */ +#define FSL_FEATURE_LPUART_HAS_MCR (0) +/* @brief Has register Half Duplex Control. */ +#define FSL_FEATURE_LPUART_HAS_HDCR (0) +/* @brief Has register Timeout. */ +#define FSL_FEATURE_LPUART_HAS_TIMEOUT (0) + +/* TRDC module features */ + +/* @brief Process master count. */ +#define FSL_FEATURE_TRDC_PROCESSOR_MASTER_COUNT (2) +/* @brief TRDC instance has PID configuration or not. */ +#define FSL_FEATURE_TRDC_INSTANCE_HAS_PID_CONFIGURATIONn(x) (0) +/* @brief TRDC instance has MBC. */ +#define FSL_FEATURE_TRDC_HAS_MBC (1) +/* @brief TRDC instance has MRC. */ +#define FSL_FEATURE_TRDC_HAS_MRC (0) +/* @brief TRDC instance has TRDC_CR. */ +#define FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG (0) +/* @brief TRDC instance has MDA_Wx_y_DFMT. */ +#define FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT (0) +/* @brief TRDC instance has TRDC_FDID. */ +#define FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR (0) +/* @brief TRDC instance has TRDC_FLW_CTL. */ +#define FSL_FEATURE_TRDC_HAS_FLW (0) + +/* OPAMP module features */ + +/* @brief Opamp has OPAMP_CTR OUTSW bit */ +#define FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW (1) +/* @brief Opamp has OPAMP_CTR ADCSW1 bit */ +#define FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1 (1) +/* @brief Opamp has OPAMP_CTR ADCSW2 bit */ +#define FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2 (1) +/* @brief Opamp has OPAMP_CTR BUFEN bit */ +#define FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN (1) +/* @brief Opamp has OPAMP_CTR INPSEL bit */ +#define FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL (1) +/* @brief Opamp has OPAMP_CTR TRIGMD bit */ +#define FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD (1) +/* @brief OPAMP support reference buffer */ +#define FSL_FEATURE_OPAMP_HAS_SUPPORT_REFERENCE_BUFFER (1U) + +/* PORT module features */ + +/* @brief Has control lock (register bit PCR[LK]). */ +#define FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK (1) +/* @brief Has open drain control (register bit PCR[ODE]). */ +#define FSL_FEATURE_PORT_HAS_OPEN_DRAIN (1) +/* @brief Has digital filter (registers DFER, DFCR and DFWR). */ +#define FSL_FEATURE_PORT_HAS_DIGITAL_FILTER (0) +/* @brief Has DMA request (register bit field PCR[IRQC] or ICR[IRQC] values). */ +#define FSL_FEATURE_PORT_HAS_DMA_REQUEST (0) +/* @brief Has pull resistor selection available. */ +#define FSL_FEATURE_PORT_HAS_PULL_SELECTION (1) +/* @brief Has pull resistor enable (register bit PCR[PE]). */ +#define FSL_FEATURE_PORT_HAS_PULL_ENABLE (1) +/* @brief Has slew rate control (register bit PCR[SRE]). */ +#define FSL_FEATURE_PORT_HAS_SLEW_RATE (1) +/* @brief Has passive filter (register bit field PCR[PFE]). */ +#define FSL_FEATURE_PORT_HAS_PASSIVE_FILTER (1) +/* @brief Do not has interrupt control (register ISFR). */ +#define FSL_FEATURE_PORT_HAS_NO_INTERRUPT (1) +/* @brief Has pull value (register bit field PCR[PV]). */ +#define FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE (1) +/* @brief Has drive strength1 control (register bit PCR[DSE1]). */ +#define FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1 (1) +/* @brief Has version ID register (register VERID). */ +#define FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER (1) +/* @brief Has voltage range control (register bit CONFIG[RANGE]). */ +#define FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE (1) +/* @brief Has EFT detect (registers EDFR, EDIER and EDCR). */ +#define FSL_FEATURE_PORT_SUPPORT_EFT (0) +/* @brief Function 0 is GPIO. */ +#define FSL_FEATURE_PORT_PCR_MUX_GPIO (0) +/* @brief Has drive strength control (register bit PCR[DSE]). */ +#define FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH (1) +/* @brief Defines width of PCR[MUX] field. */ +#define FSL_FEATURE_PORT_PCR_MUX_WIDTH (4) +/* @brief Has dedicated interrupt vector. */ +#define FSL_FEATURE_PORT_HAS_INTERRUPT_VECTOR (1) +/* @brief Has independent interrupt control(register ICR). */ +#define FSL_FEATURE_PORT_HAS_INDEPENDENT_INTERRUPT_CONTROL (0) +/* @brief Has multiple pin IRQ configuration (register GICLR and GICHR). */ +#define FSL_FEATURE_PORT_HAS_MULTIPLE_IRQ_CONFIG (0) +/* @brief Has Input Buffer Enable (register bit field PCR[IBE]). */ +#define FSL_FEATURE_PORT_HAS_INPUT_BUFFER (1) +/* @brief Has Invert Input (register bit field PCR[INV]). */ +#define FSL_FEATURE_PORT_HAS_INVERT_INPUT (1) +/* @brief Defines whether PCR[IRQC] bit-field has flag states. */ +#define FSL_FEATURE_PORT_HAS_IRQC_FLAG (0) +/* @brief Defines whether PCR[IRQC] bit-field has trigger states. */ +#define FSL_FEATURE_PORT_HAS_IRQC_TRIGGER (0) + +/* EQDC module features */ + +/* @brief If EQDC CTRL2 register has EMIP bit field. */ +#define FSL_FEATURE_EQDC_CTRL2_HAS_EMIP_BIT_FIELD (1) + +/* SPC module features */ + +/* @brief Has DCDC */ +#define FSL_FEATURE_MCX_SPC_HAS_DCDC (0) +/* @brief Has SYS LDO */ +#define FSL_FEATURE_MCX_SPC_HAS_SYS_LDO (0) +/* @brief Has IOVDD_LVDF */ +#define FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD (0) +/* @brief Has COREVDD_HVDF */ +#define FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD (0) +/* @brief Has CORELDO_VDD_DS */ +#define FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS (1) +/* @brief Has LPBUFF_EN */ +#define FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT (0) +/* @brief Has COREVDD_IVS_EN */ +#define FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT (0) +/* @brief Has SWITCH_STATE */ +#define FSL_FEATURE_MCX_SPC_HAS_SWITCH_STATE_BIT (0) +/* @brief Has SRAMRETLDO */ +#define FSL_FEATURE_MCX_SPC_HAS_SRAMRETLDO_REG (1) +/* @brief Has CFG register */ +#define FSL_FEATURE_MCX_SPC_HAS_CFG_REG (0) +/* @brief Has SRAMLDO_DPD_ON */ +#define FSL_FEATURE_MCX_SPC_HAS_SRAMLDO_DPD_ON_BIT (1) +/* @brief Has CNTRL register */ +#define FSL_FEATURE_MCX_SPC_HAS_CNTRL_REG (0) +/* @brief Has DPDOWN_PULLDOWN_DISABLE */ +#define FSL_FEATURE_MCX_SPC_HAS_DPDOWN_PULLDOWN_DISABLE_BIT (0) +/* @brief Not have glitch detect */ +#define FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT (1) +/* @brief Has BLEED_EN */ +#define FSL_FEATURE_MCX_SPC_HAS_DCDC_CFG_BLEED_EN (0) + +/* SYSCON module features */ + +/* @brief Flash page size in bytes */ +#define FSL_FEATURE_SYSCON_FLASH_PAGE_SIZE_BYTES (128) +/* @brief Flash sector size in bytes */ +#define FSL_FEATURE_SYSCON_FLASH_SECTOR_SIZE_BYTES (8192) +/* @brief Flash size in bytes */ +#define FSL_FEATURE_SYSCON_FLASH_SIZE_BYTES (1048576) +/* @brief Support ROMAPI */ +#define FSL_FEATURE_SYSCON_ROMAPI (1) +/* @brief Powerlib API is different with other series devices */ +#define FSL_FEATURE_POWERLIB_EXTEND (1) +/* @brief No OSTIMER register in PMC */ +#define FSL_FEATURE_PMC_HAS_NO_OSTIMER_REG (1) +/* @brief Starter register discontinuous. */ +#define FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS (1) + +/* USB module features */ + +/* @brief KHCI module instance count */ +#define FSL_FEATURE_USB_KHCI_COUNT (1) +/* @brief HOST mode enabled */ +#define FSL_FEATURE_USB_KHCI_HOST_ENABLED (0) +/* @brief OTG mode enabled */ +#define FSL_FEATURE_USB_KHCI_OTG_ENABLED (0) +/* @brief Size of the USB dedicated RAM */ +#define FSL_FEATURE_USB_KHCI_USB_RAM (0) +/* @brief Has KEEP_ALIVE_CTRL register */ +#define FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED (0) +/* @brief Has the Dynamic SOF threshold compare support */ +#define FSL_FEATURE_USB_KHCI_DYNAMIC_SOF_THRESHOLD_COMPARE_ENABLED (0) +/* @brief Has the VBUS detect support */ +#define FSL_FEATURE_USB_KHCI_VBUS_DETECT_ENABLED (1) +/* @brief Has the IRC48M module clock support */ +#define FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED (1) +/* @brief Number of endpoints supported */ +#define FSL_FEATURE_USB_ENDPT_COUNT (16) +/* @brief Has STALL_IL/OL_DIS registers */ +#define FSL_FEATURE_USB_KHCI_HAS_STALL_LOW (1) +/* @brief Has STALL_IH/OH_DIS registers */ +#define FSL_FEATURE_USB_KHCI_HAS_STALL_HIGH (1) + +/* UTICK module features */ + +/* @brief UTICK does not support PD configure. */ +#define FSL_FEATURE_UTICK_HAS_NO_PDCFG (1) + +/* VBAT module features */ + +/* @brief Has STATUS register */ +#define FSL_FEATURE_MCX_VBAT_HAS_STATUS_REG (0) +/* @brief Has TAMPER register */ +#define FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG (0) +/* @brief Has BANDGAP register */ +#define FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER (0) +/* @brief Has LDOCTL register */ +#define FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG (0) +/* @brief Has OSCCTL register */ +#define FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG (0) +/* @brief Has SWICTL register */ +#define FSL_FEATURE_MCX_VBAT_HAS_SWICTL_REG (0) +/* @brief Has CLKMON register */ +#define FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG (0) + +/* WWDT module features */ + +/* @brief Has no RESET register. */ +#define FSL_FEATURE_WWDT_HAS_NO_RESET (1) + +#endif /* _MCXA156_FEATURES_H_ */ + diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA156_flash.scf b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA156_flash.scf new file mode 100644 index 00000000000..265cd9533cc --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA156_flash.scf @@ -0,0 +1,71 @@ +#!armclang --target=arm-arm-none-eabi -march=armv8-m.main -E -x c +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compiler: Keil ARM C/C++ Compiler +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240104 +** +** Abstract: +** Linker file for the Keil ARM C/C++ Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + +/* Sizes */ +#if (defined(__stack_size__)) + #define Stack_Size __stack_size__ +#else + #define Stack_Size 0x0400 +#endif + +#if (defined(__heap_size__)) + #define Heap_Size __heap_size__ +#else + #define Heap_Size 0x0400 +#endif + +#define m_interrupts_start 0x00000000 +#define m_interrupts_size 0x00000200 + +#define m_text_start 0x00000200 +#define m_text_size 0x000FFE00 + +#define m_data_start 0x20000000 +#define m_data_size 0x0001E000 + +#define m_sramx0_start 0x04000000; +#define m_sramx0_size 0x00002000; + +LR_m_text m_interrupts_start m_interrupts_size+m_text_size { ; load region size_region + + VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address + * (.isr_vector,+FIRST) + } + + ER_m_text m_text_start FIXED m_text_size { ; load address = execution address + * (InRoot$$Sections) + .ANY (+RO) + } + + RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data + .ANY (+RW +ZI) + } + ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up + } + ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down + } + +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA156_ram.scf b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA156_ram.scf new file mode 100644 index 00000000000..d3cdf8c9006 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA156_ram.scf @@ -0,0 +1,68 @@ +#!armclang --target=arm-arm-none-eabi -march=armv8-m.main -E -x c +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compiler: Keil ARM C/C++ Compiler +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240104 +** +** Abstract: +** Linker file for the Keil ARM C/C++ Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + +/* Sizes */ +#if (defined(__stack_size__)) + #define Stack_Size __stack_size__ +#else + #define Stack_Size 0x0400 +#endif + +#if (defined(__heap_size__)) + #define Heap_Size __heap_size__ +#else + #define Heap_Size 0x0400 +#endif + +#define m_interrupts_start 0x20000000 +#define m_interrupts_size 0x00000200 + +#define m_text_start 0x20000200 +#define m_text_size 0x00005E00 + +#define m_data_start 0x20006000 +#define m_data_size 0x00018000 + +LR_m_text m_interrupts_start m_interrupts_size+m_text_size { ; load region size_region + + VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address + * (.isr_vector,+FIRST) + } + + ER_m_text m_text_start FIXED m_text_size { ; load address = execution address + * (InRoot$$Sections) + .ANY (+RO) + } + + RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data + .ANY (+RW +ZI) + } + ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up + } + ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down + } + +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA15X.dbgconf b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA15X.dbgconf new file mode 100644 index 00000000000..a59776c1989 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA15X.dbgconf @@ -0,0 +1,18 @@ +// <<< Use Configuration Wizard in Context Menu >>> + +// SWO pin +// The SWO (Serial Wire Output) pin optionally provides data from the ITM +// for an external debug tool to evaluate. +// <0=> PIO0_10 +// <1=> PIO0_8 +SWO_Pin = 0; +// + +// Debug Configuration +// StopAfterBootloader Stop after Bootloader +// +Dbg_CR = 0x00000001; +// + + +// <<< end of configuration section >>> diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA15X_1024.FLM b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/arm/MCXA15X_1024.FLM new file mode 100644 index 0000000000000000000000000000000000000000..036b2fb9a15d690db1e272d8be85ca8c3d8e4e16 GIT binary patch literal 19216 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[event].BFCRT01; + + temp = (value & AOI_BFCRT01_PT0_AC_MASK) >> AOI_BFCRT01_PT0_AC_SHIFT; + config->PT0AC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT01_PT0_BC_MASK) >> AOI_BFCRT01_PT0_BC_SHIFT; + config->PT0BC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT01_PT0_CC_MASK) >> AOI_BFCRT01_PT0_CC_SHIFT; + config->PT0CC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT01_PT0_DC_MASK) >> AOI_BFCRT01_PT0_DC_SHIFT; + config->PT0DC = (aoi_input_config_t)temp; + + temp = (value & AOI_BFCRT01_PT1_AC_MASK) >> AOI_BFCRT01_PT1_AC_SHIFT; + config->PT1AC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT01_PT1_BC_MASK) >> AOI_BFCRT01_PT1_BC_SHIFT; + config->PT1BC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT01_PT1_CC_MASK) >> AOI_BFCRT01_PT1_CC_SHIFT; + config->PT1CC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT01_PT1_DC_MASK) >> AOI_BFCRT01_PT1_DC_SHIFT; + config->PT1DC = (aoi_input_config_t)temp; + + /* Read BFCRT23 register at event index. */ + value = base->BFCRT[event].BFCRT23; + + temp = (value & AOI_BFCRT23_PT2_AC_MASK) >> AOI_BFCRT23_PT2_AC_SHIFT; + config->PT2AC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT23_PT2_BC_MASK) >> AOI_BFCRT23_PT2_BC_SHIFT; + config->PT2BC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT23_PT2_CC_MASK) >> AOI_BFCRT23_PT2_CC_SHIFT; + config->PT2CC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT23_PT2_DC_MASK) >> AOI_BFCRT23_PT2_DC_SHIFT; + config->PT2DC = (aoi_input_config_t)temp; + + temp = (value & AOI_BFCRT23_PT3_AC_MASK) >> AOI_BFCRT23_PT3_AC_SHIFT; + config->PT3AC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT23_PT3_BC_MASK) >> AOI_BFCRT23_PT3_BC_SHIFT; + config->PT3BC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT23_PT3_CC_MASK) >> AOI_BFCRT23_PT3_CC_SHIFT; + config->PT3CC = (aoi_input_config_t)temp; + temp = (value & AOI_BFCRT23_PT3_DC_MASK) >> AOI_BFCRT23_PT3_DC_SHIFT; + config->PT3DC = (aoi_input_config_t)temp; +} + +/*! + * brief Configures an AOI event. + * + * This function configures an AOI event according + * to the aoiEventConfig structure. This function configures all inputs (A, B, C, and D) + * of all product terms (0, 1, 2, and 3) of a desired event. + * + * Example: + code + aoi_event_config_t demoEventLogicStruct; + + demoEventLogicStruct.PT0AC = kAOI_InvInputSignal; + demoEventLogicStruct.PT0BC = kAOI_InputSignal; + demoEventLogicStruct.PT0CC = kAOI_LogicOne; + demoEventLogicStruct.PT0DC = kAOI_LogicOne; + + demoEventLogicStruct.PT1AC = kAOI_LogicZero; + demoEventLogicStruct.PT1BC = kAOI_LogicOne; + demoEventLogicStruct.PT1CC = kAOI_LogicOne; + demoEventLogicStruct.PT1DC = kAOI_LogicOne; + + demoEventLogicStruct.PT2AC = kAOI_LogicZero; + demoEventLogicStruct.PT2BC = kAOI_LogicOne; + demoEventLogicStruct.PT2CC = kAOI_LogicOne; + demoEventLogicStruct.PT2DC = kAOI_LogicOne; + + demoEventLogicStruct.PT3AC = kAOI_LogicZero; + demoEventLogicStruct.PT3BC = kAOI_LogicOne; + demoEventLogicStruct.PT3CC = kAOI_LogicOne; + demoEventLogicStruct.PT3DC = kAOI_LogicOne; + + AOI_SetEventLogicConfig(AOI, kAOI_Event0, demoEventLogicStruct); + endcode + * + * param base AOI peripheral address. + * param event Event which will be configured of type aoi_event_t. + * param eventConfig Pointer to type aoi_event_config_t structure. The user is responsible for + * filling out the members of this structure and passing the pointer to this function. + */ +void AOI_SetEventLogicConfig(AOI_Type *base, aoi_event_t event, const aoi_event_config_t *eventConfig) +{ + assert(eventConfig != NULL); + assert((uint32_t)event < (uint32_t)FSL_FEATURE_AOI_EVENT_COUNT); + + uint16_t value; + /* Calculate value to configure product term 0, 1 */ + value = AOI_BFCRT01_PT0_AC(eventConfig->PT0AC) | AOI_BFCRT01_PT0_BC(eventConfig->PT0BC) | + AOI_BFCRT01_PT0_CC(eventConfig->PT0CC) | AOI_BFCRT01_PT0_DC(eventConfig->PT0DC) | + AOI_BFCRT01_PT1_AC(eventConfig->PT1AC) | AOI_BFCRT01_PT1_BC(eventConfig->PT1BC) | + AOI_BFCRT01_PT1_CC(eventConfig->PT1CC) | AOI_BFCRT01_PT1_DC(eventConfig->PT1DC); + /* Write value to register */ + base->BFCRT[event].BFCRT01 = value; + + /* Reset and calculate value to configure product term 2, 3 */ + value = AOI_BFCRT23_PT2_AC(eventConfig->PT2AC) | AOI_BFCRT23_PT2_BC(eventConfig->PT2BC) | + AOI_BFCRT23_PT2_CC(eventConfig->PT2CC) | AOI_BFCRT23_PT2_DC(eventConfig->PT2DC) | + AOI_BFCRT23_PT3_AC(eventConfig->PT3AC) | AOI_BFCRT23_PT3_BC(eventConfig->PT3BC) | + AOI_BFCRT23_PT3_CC(eventConfig->PT3CC) | AOI_BFCRT23_PT3_DC(eventConfig->PT3DC); + /* Write value to register */ + base->BFCRT[event].BFCRT23 = value; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_aoi.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_aoi.h new file mode 100644 index 00000000000..3b1126e623e --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_aoi.h @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_AOI_H_ +#define FSL_AOI_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup aoi + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +#ifndef AOI +#define AOI AOI0 /*!< AOI peripheral address */ +#endif + +/*! @name Driver version */ +/*! @{ */ +#define FSL_AOI_DRIVER_VERSION (MAKE_VERSION(2, 0, 2)) /*!< Version 2.0.2. */ +/*! @} */ + +/*! + * @brief AOI input configurations. + * + * The selection item represents the Boolean evaluations. + */ +typedef enum _aoi_input_config +{ + kAOI_LogicZero = 0x0U, /*!< Forces the input to logical zero. */ + kAOI_InputSignal = 0x1U, /*!< Passes the input signal. */ + kAOI_InvInputSignal = 0x2U, /*!< Inverts the input signal. */ + kAOI_LogicOne = 0x3U /*!< Forces the input to logical one. */ +} aoi_input_config_t; + +/*! + * @brief AOI event indexes, where an event is the collection of the four product + * terms (0, 1, 2, and 3) and the four signal inputs (A, B, C, and D). + */ +typedef enum _aoi_event +{ + kAOI_Event0 = 0x0U, /*!< Event 0 index */ + kAOI_Event1 = 0x1U, /*!< Event 1 index */ + kAOI_Event2 = 0x2U, /*!< Event 2 index */ + kAOI_Event3 = 0x3U /*!< Event 3 index */ +} aoi_event_t; + +/*! + * @brief AOI event configuration structure + * + * Defines structure _aoi_event_config and use the AOI_SetEventLogicConfig() function to make + * whole event configuration. + */ +typedef struct _aoi_event_config +{ + aoi_input_config_t PT0AC; /*!< Product term 0 input A */ + aoi_input_config_t PT0BC; /*!< Product term 0 input B */ + aoi_input_config_t PT0CC; /*!< Product term 0 input C */ + aoi_input_config_t PT0DC; /*!< Product term 0 input D */ + aoi_input_config_t PT1AC; /*!< Product term 1 input A */ + aoi_input_config_t PT1BC; /*!< Product term 1 input B */ + aoi_input_config_t PT1CC; /*!< Product term 1 input C */ + aoi_input_config_t PT1DC; /*!< Product term 1 input D */ + aoi_input_config_t PT2AC; /*!< Product term 2 input A */ + aoi_input_config_t PT2BC; /*!< Product term 2 input B */ + aoi_input_config_t PT2CC; /*!< Product term 2 input C */ + aoi_input_config_t PT2DC; /*!< Product term 2 input D */ + aoi_input_config_t PT3AC; /*!< Product term 3 input A */ + aoi_input_config_t PT3BC; /*!< Product term 3 input B */ + aoi_input_config_t PT3CC; /*!< Product term 3 input C */ + aoi_input_config_t PT3DC; /*!< Product term 3 input D */ +} aoi_event_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @name AOI Initialization + * @{ + */ + +/*! + * @brief Initializes an AOI instance for operation. + * + * This function un-gates the AOI clock. + * + * @param base AOI peripheral address. + */ +void AOI_Init(AOI_Type *base); + +/*! + * @brief Deinitializes an AOI instance for operation. + * + * This function shutdowns AOI module. + * + * @param base AOI peripheral address. + */ +void AOI_Deinit(AOI_Type *base); + +/*! @} */ + +/*! + * @name AOI Get Set Operation + * @{ + */ + +/*! + * @brief Gets the Boolean evaluation associated. + * + * This function returns the Boolean evaluation associated. + * + * Example: + @code + aoi_event_config_t demoEventLogicStruct; + + AOI_GetEventLogicConfig(AOI, kAOI_Event0, &demoEventLogicStruct); + @endcode + * + * @param base AOI peripheral address. + * @param event Index of the event which will be set of type aoi_event_t. + * @param config Selected input configuration . + */ +void AOI_GetEventLogicConfig(AOI_Type *base, aoi_event_t event, aoi_event_config_t *config); + +/*! + * @brief Configures an AOI event. + * + * This function configures an AOI event according + * to the aoiEventConfig structure. This function configures all inputs (A, B, C, and D) + * of all product terms (0, 1, 2, and 3) of a desired event. + * + * Example: + @code + aoi_event_config_t demoEventLogicStruct; + + demoEventLogicStruct.PT0AC = kAOI_InvInputSignal; + demoEventLogicStruct.PT0BC = kAOI_InputSignal; + demoEventLogicStruct.PT0CC = kAOI_LogicOne; + demoEventLogicStruct.PT0DC = kAOI_LogicOne; + + demoEventLogicStruct.PT1AC = kAOI_LogicZero; + demoEventLogicStruct.PT1BC = kAOI_LogicOne; + demoEventLogicStruct.PT1CC = kAOI_LogicOne; + demoEventLogicStruct.PT1DC = kAOI_LogicOne; + + demoEventLogicStruct.PT2AC = kAOI_LogicZero; + demoEventLogicStruct.PT2BC = kAOI_LogicOne; + demoEventLogicStruct.PT2CC = kAOI_LogicOne; + demoEventLogicStruct.PT2DC = kAOI_LogicOne; + + demoEventLogicStruct.PT3AC = kAOI_LogicZero; + demoEventLogicStruct.PT3BC = kAOI_LogicOne; + demoEventLogicStruct.PT3CC = kAOI_LogicOne; + demoEventLogicStruct.PT3DC = kAOI_LogicOne; + + AOI_SetEventLogicConfig(AOI, kAOI_Event0, demoEventLogicStruct); + @endcode + * + * @param base AOI peripheral address. + * @param event Event which will be configured of type aoi_event_t. + * @param eventConfig Pointer to type aoi_event_config_t structure. The user is responsible for + * filling out the members of this structure and passing the pointer to this function. + */ +void AOI_SetEventLogicConfig(AOI_Type *base, aoi_event_t event, const aoi_event_config_t *eventConfig); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/*! @} */ + +/*!* @} */ + +#endif /* FSL_AOI_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cdog.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cdog.c new file mode 100644 index 00000000000..cd3ed6eaa3f --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cdog.c @@ -0,0 +1,378 @@ +/* + * Copyright 2020-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_cdog.h" + +/******************************************************************************* + * Definitions + *******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.cdog" +#endif + +/* Reset CONTROL mask */ +#define RESERVED_CTRL_MASK 0x800u + +#if defined(CDOG_IRQS) +/* Array of IRQs */ +static const IRQn_Type s_CdogIrqs[] = CDOG_IRQS; +#endif /* CDOG_IRQS */ + +#ifdef CDOG_CLOCKS +static const clock_ip_name_t s_CdogClocks[] = CDOG_CLOCKS; +#endif /* CDOG_CLOCKS */ + +#ifdef CDOG_BASE_PTRS +static const CDOG_Type* s_cdogBases[] = CDOG_BASE_PTRS; +#endif /* CDOG_BASE_PTRS */ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +static uint32_t CDOG_GetInstance(CDOG_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_cdogBases); instance++) + { + if (s_cdogBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_cdogBases)); + + return instance; +} + +/*! + * brief Sets the default configuration of CDOG + * + * This function initialize CDOG config structure to default values. + * + * param conf CDOG configuration structure + */ +void CDOG_GetDefaultConfig(cdog_config_t *conf) +{ + /* Default configuration after reset */ + conf->lock = (uint8_t)kCDOG_LockCtrl_Unlock; /* Lock control */ + conf->timeout = (uint8_t)kCDOG_FaultCtrl_NoAction; /* Timeout control */ + conf->miscompare = (uint8_t)kCDOG_FaultCtrl_NoAction; /* Miscompare control */ + conf->sequence = (uint8_t)kCDOG_FaultCtrl_NoAction; /* Sequence control */ + conf->state = (uint8_t)kCDOG_FaultCtrl_NoAction; /* State control */ + conf->address = (uint8_t)kCDOG_FaultCtrl_NoAction; /* Address control */ + conf->irq_pause = (uint8_t)kCDOG_IrqPauseCtrl_Run; /* IRQ pause control */ + conf->debug_halt = (uint8_t)kCDOG_DebugHaltCtrl_Run; /* Debug halt control */ + return; +} + +/*! + * brief Sets secure counter and instruction timer values + * + * This function sets value in RELOAD and START registers for instruction timer. + * + * param base CDOG peripheral base address + * param reload reload value + * param start start value + */ +void CDOG_Start(CDOG_Type *base, uint32_t reload, uint32_t start) +{ + base->RELOAD = reload; + base->START = start; +} + +/*! + * brief Stops secure counter and instruction timer + * + * This function stops instruction timer and secure counter. + * This also change state of CDOG to IDLE. + * + * param base CDOG peripheral base address + * param stop expected value which will be compared with value of secure counter + */ +void CDOG_Stop(CDOG_Type *base, uint32_t stop) +{ + base->STOP = stop; +} + +/*! + * brief Sets secure counter and instruction timer values + * + * This function sets value in STOP, RELOAD and START registers + * for instruction timer and secure counter. + * + * param base CDOG peripheral base address + * param stop expected value which will be compared with value of secure counter + * param reload reload value for instruction timer + * param start start value for secure timer + */ +void CDOG_Set(CDOG_Type *base, uint32_t stop, uint32_t reload, uint32_t start) +{ + base->STOP = stop; + base->RELOAD = reload; + base->START = start; +} + +/*! + * brief Add value to secure counter + * + * This function add specified value to secure counter. + * + * param base CDOG peripheral base address. + * param add Value to be added. + */ +void CDOG_Add(CDOG_Type *base, uint32_t add) +{ + base->ADD = (secure_counter_t)add; +} + +/*! + * brief Add 1 to secure counter + * + * This function add 1 to secure counter. + * + * param base CDOG peripheral base address. + * param add Value to be added. + */ +void CDOG_Add1(CDOG_Type *base) +{ + base->ADD1 = (secure_counter_t)0x1U; +} + +/*! + * brief Add 16 to secure counter + * + * This function add 16 to secure counter. + * + * param base CDOG peripheral base address. + * param add Value to be added. + */ +void CDOG_Add16(CDOG_Type *base) +{ + base->ADD16 = (secure_counter_t)0x1U; +} + +/*! + * brief Add 256 to secure counter + * + * This function add 256 to secure counter. + * + * param base CDOG peripheral base address. + * param add Value to be added. + */ +void CDOG_Add256(CDOG_Type *base) +{ + base->ADD256 = (secure_counter_t)0x1U; +} + +/*! + * brief Substract value to secure counter + * + * This function substract specified value to secure counter. + * + * param base CDOG peripheral base address. + * param sub Value to be substracted. + */ +void CDOG_Sub(CDOG_Type *base, uint32_t sub) +{ + base->SUB = (secure_counter_t)sub; +} + +/*! + * brief Substract 1 from secure counter + * + * This function substract specified 1 from secure counter. + * + * param base CDOG peripheral base address. + */ +void CDOG_Sub1(CDOG_Type *base) +{ + base->SUB1 = (secure_counter_t)0x1U; +} + +/*! + * brief Substract 16 from secure counter + * + * This function substract specified 16 from secure counter. + * + * param base CDOG peripheral base address. + */ +void CDOG_Sub16(CDOG_Type *base) +{ + base->SUB16 = (secure_counter_t)0x1U; +} + +/*! + * brief Substract 256 from secure counter + * + * This function substract specified 256 from secure counter. + * + * param base CDOG peripheral base address. + */ +void CDOG_Sub256(CDOG_Type *base) +{ + base->SUB256 = (secure_counter_t)0x1U; +} + +/*! + * brief Checks secure counter. + * + * This function compares stop value with secure counter value + * by writting to RELOAD refister. + * + * param base CDOG peripheral base address + * param check expected (stop) value. + */ +void CDOG_Check(CDOG_Type *base, uint32_t check) +{ +#if defined(FLS_FEATURE_CDOG_USE_RESTART) + base->RESTART = check; +#else + base->STOP = check; + base->RELOAD = base->RELOAD; + base->START= check; +#endif +} + +/*! + * brief Set the CDOG persistent word. + * + * param base CDOG peripheral base address. + * param value The value to be written. + */ +void CDOG_WritePersistent(CDOG_Type *base, uint32_t value) +{ + base->PERSISTENT = value; +} + +/*! + * brief Get the CDOG persistent word. + * + * param base CDOG peripheral base address. + * return The persistent word. + */ +uint32_t CDOG_ReadPersistent(CDOG_Type *base) +{ + return base->PERSISTENT; +} + +/*! + * brief Initialize CDOG + * + * This function initializes CDOG setting and enable all interrupts. + * + * param base CDOG peripheral base address + * param conf CDOG configuration structure + * return Status of the init operation + */ +status_t CDOG_Init(CDOG_Type *base, cdog_config_t *conf) +{ + /* Ungate clock to CDOG engine and reset it */ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +#ifdef CDOG_CLOCKS + CLOCK_EnableClock(s_CdogClocks[CDOG_GetInstance(base)]); +#endif /* CDOG_CLOCKS */ +#endif /* !FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_FEATURE_CDOG_HAS_NO_RESET) && FSL_FEATURE_CDOG_HAS_NO_RESET) + RESET_PeripheralReset(kCDOG_RST_SHIFT_RSTn); +#endif /* !FSL_FEATURE_CDOG_HAS_NO_RESET */ + + if (base->CONTROL == 0x0U) + { + /* CDOG is not in IDLE mode, which may be cause after SW reset. */ + /* Writing to CONTROL register will trigger fault. */ + return kStatus_Fail; + } + + /* Clear pending errors, otherwise the device will reset */ + /* itself immediately after enable Code Watchdog */ + if ((uint32_t)kCDOG_LockCtrl_Lock == + ((base->CONTROL & CDOG_CONTROL_LOCK_CTRL_MASK) >> CDOG_CONTROL_LOCK_CTRL_SHIFT)) + + { + base->FLAGS = CDOG_FLAGS_TO_FLAG(1U) | CDOG_FLAGS_MISCOM_FLAG(1U) | CDOG_FLAGS_SEQ_FLAG(1U) | + CDOG_FLAGS_CNT_FLAG(1U) | CDOG_FLAGS_STATE_FLAG(1U) | CDOG_FLAGS_ADDR_FLAG(1U) | + CDOG_FLAGS_POR_FLAG(1U); + } + else + { +/* load default values for CDOG->CONTROL before flags clear */ +#if defined(FSL_FEATURE_CDOG_NEED_LOAD_DEFAULT_CONF) && (FSL_FEATURE_CDOG_NEED_LOAD_DEFAULT_CONF > 0) + cdog_config_t default_conf; + + /* Initialize CDOG */ + CDOG_GetDefaultConfig(&default_conf); + + /* Write default value to CDOG->CONTROL*/ + base->CONTROL = + CDOG_CONTROL_TIMEOUT_CTRL(default_conf.timeout) | /* Action if the timeout event is triggered */ + CDOG_CONTROL_MISCOMPARE_CTRL(default_conf.miscompare) | /* Action if the miscompare error event is triggered */ + CDOG_CONTROL_SEQUENCE_CTRL(default_conf.sequence) | /* Action if the sequence error event is triggered */ + CDOG_CONTROL_STATE_CTRL(default_conf.state) | /* Action if the state error event is triggered */ + CDOG_CONTROL_ADDRESS_CTRL(default_conf.address) | /* Action if the address error event is triggered */ + CDOG_CONTROL_IRQ_PAUSE(default_conf.irq_pause) | /* Pause running during interrupts setup */ + CDOG_CONTROL_DEBUG_HALT_CTRL(default_conf.debug_halt) | /* Halt CDOG timer during debug */ + CDOG_CONTROL_LOCK_CTRL(default_conf.lock) | RESERVED_CTRL_MASK; /* Lock control register, RESERVED */ +#endif /* FSL_FEATURE_CDOG_NEED_LOAD_DEFAULT_CONF */ + + base->FLAGS = CDOG_FLAGS_TO_FLAG(0U) | CDOG_FLAGS_MISCOM_FLAG(0U) | CDOG_FLAGS_SEQ_FLAG(0U) | + CDOG_FLAGS_CNT_FLAG(0U) | CDOG_FLAGS_STATE_FLAG(0U) | CDOG_FLAGS_ADDR_FLAG(0U) | + CDOG_FLAGS_POR_FLAG(0U); + } + + base->CONTROL = + CDOG_CONTROL_TIMEOUT_CTRL(conf->timeout) | /* Action if the timeout event is triggered */ + CDOG_CONTROL_MISCOMPARE_CTRL(conf->miscompare) | /* Action if the miscompare error event is triggered */ + CDOG_CONTROL_SEQUENCE_CTRL(conf->sequence) | /* Action if the sequence error event is triggered */ + CDOG_CONTROL_STATE_CTRL(conf->state) | /* Action if the state error event is triggered */ + CDOG_CONTROL_ADDRESS_CTRL(conf->address) | /* Action if the address error event is triggered */ + CDOG_CONTROL_IRQ_PAUSE(conf->irq_pause) | /* Pause running during interrupts setup */ + CDOG_CONTROL_DEBUG_HALT_CTRL(conf->debug_halt) | /* Halt CDOG timer during debug */ + CDOG_CONTROL_LOCK_CTRL(conf->lock) | RESERVED_CTRL_MASK; /* Lock control register, RESERVED */ + +#if defined(CDOG_IRQS) + /* Enable peripheral IRQ */ + NVIC_EnableIRQ(s_CdogIrqs[CDOG_GetInstance(base)]); +#endif /* CDOG_IRQS */ + + return kStatus_Success; +} + +/*! + * brief Deinitialize CDOG + * + * This function stops CDOG secure counter. + * + * param base CDOG peripheral base address + */ +void CDOG_Deinit(CDOG_Type *base) +{ +#if defined(CDOG_IRQS) + /* Disable peripheral IRQ */ + NVIC_DisableIRQ(s_CdogIrqs[CDOG_GetInstance(base)]); +#endif /* CDOG_IRQS */ + +#if !(defined(FSL_FEATURE_CDOG_HAS_NO_RESET) && FSL_FEATURE_CDOG_HAS_NO_RESET) + RESET_SetPeripheralReset(kCDOG_RST_SHIFT_RSTn); +#endif /* !FSL_FEATURE_CDOG_HAS_NO_RESET */ + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +#ifdef CDOG_CLOCKS + CLOCK_DisableClock(s_CdogClocks[CDOG_GetInstance(base)]); +#endif /* CDOG_CLOCKS */ +#endif /* !FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cdog.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cdog.h new file mode 100644 index 00000000000..7252eaccd8c --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cdog.h @@ -0,0 +1,329 @@ +/* + * Copyright 2020-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_CDOG_H_ +#define FSL_CDOG_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup CDOG + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + *******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief Defines CDOG driver version 2.1.3. + * + * Change log: + * - Version 2.1.3 + * - Re-design multiple instance IRQs and Clocks + * - Add fix for RESTART command errata + * - Version 2.1.2 + * - Support multiple IRQs + * - Fix default CONTROL values + * - Version 2.1.1 + * - Remove bit CONTROL[CONTROL_CTRL] + * - Version 2.1.0 + * - Rename CWT to CDOG + * - Version 2.0.2 + * - Fix MISRA-2012 issues + * - Version 2.0.1 + * - Fix doxygen issues + * - Version 2.0.0 + * - initial version + */ +#define FSL_CDOG_DRIVER_VERSION (MAKE_VERSION(2, 1, 3)) +/*! @} */ + +typedef struct +{ + uint8_t lock : 2; + uint8_t timeout : 3; + uint8_t miscompare : 3; + uint8_t sequence : 3; + uint8_t state : 3; + uint8_t address : 3; + uint8_t reserved : 8; + uint8_t irq_pause : 2; + uint8_t debug_halt : 2; +} cdog_config_t; + +enum __cdog_debug_Action_ctrl_enum +{ + kCDOG_DebugHaltCtrl_Run = 0x1, + kCDOG_DebugHaltCtrl_Pause = 0x2, +}; + +enum __cdog_irq_pause_ctrl_enum +{ + kCDOG_IrqPauseCtrl_Run = 0x1, + kCDOG_IrqPauseCtrl_Pause = 0x2, +}; + +enum __cdog_fault_ctrl_enum +{ + kCDOG_FaultCtrl_EnableReset = 0x1U, + kCDOG_FaultCtrl_EnableInterrupt = 0x2U, + kCDOG_FaultCtrl_NoAction = 0x4U, +}; + +enum __code_lock_ctrl_enum +{ + kCDOG_LockCtrl_Lock = 0x1, + kCDOG_LockCtrl_Unlock = 0x2, +}; + +typedef uint32_t secure_counter_t; + +#define SC_ADD(add) \ + do \ + { \ + CDOG->ADD = (secure_counter_t)(add); \ + } while (0) + +#define SC_ADD1 \ + do \ + { \ + CDOG->ADD1 = (secure_counter_t)0x1U; \ + } while (0) + +#define SC_ADD16 \ + do \ + { \ + CDOG->ADD16 = (secure_counter_t)0x1U; \ + } while (0) + +#define SC_ADD256 \ + do \ + { \ + CDOG->ADD256 = (secure_counter_t)0x1U; \ + } while (0) + +#define SC_SUB(sub) \ + do \ + { \ + CDOG->SUB = (secure_counter_t)(sub); \ + } while (0) + +#define SC_SUB1 \ + do \ + { \ + CDOG->SUB1 = (secure_counter_t)0x1U; \ + } while (0) + +#define SC_SUB16 \ + do \ + { \ + CDOG->SUB16 = (secure_counter_t)0x1U; \ + } while (0) + +#define SC_SUB256 \ + do \ + { \ + CDOG->SUB256 = (secure_counter_t)0x1U; \ + } while (0) + +#define SC_CHECK(val) \ + do \ + { \ + CDOG->RESTART = (secure_counter_t)val; \ + } while (0) + +/******************************************************************************* + * API + *******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*! + * @name CDOG Functional Operation + * @{ + */ + +/*! + * @brief Initialize CDOG + * + * This function initializes CDOG block and setting. + * + * @param base CDOG peripheral base address + * @param conf CDOG configuration structure + * @return Status of the init operation + */ +status_t CDOG_Init(CDOG_Type *base, cdog_config_t *conf); + +/*! + * @brief Deinitialize CDOG + * + * This function deinitializes CDOG secure counter. + * + * @param base CDOG peripheral base address + */ +void CDOG_Deinit(CDOG_Type *base); + +/*! + * @brief Sets the default configuration of CDOG + * + * This function initialize CDOG config structure to default values. + * + * @param conf CDOG configuration structure + */ +void CDOG_GetDefaultConfig(cdog_config_t *conf); + +/*! + * @brief Stops secure counter and instruction timer + * + * This function stops instruction timer and secure counter. + * This also change state od CDOG to IDLE. + * + * @param base CDOG peripheral base address + * @param stop expected value which will be compared with value of secure counter + */ +void CDOG_Stop(CDOG_Type *base, uint32_t stop); + +/*! + * @brief Sets secure counter and instruction timer values + * + * This function sets value in RELOAD and START registers + * for instruction timer and secure counter + * + * @param base CDOG peripheral base address + * @param reload reload value + * @param start start value + */ +void CDOG_Start(CDOG_Type *base, uint32_t reload, uint32_t start); + +/*! + * @brief Checks secure counter. + * + * This function compares stop value in handler with secure counter value + * by writting to RELOAD refister. + * + * @param base CDOG peripheral base address + * @param check expected (stop) value + */ +void CDOG_Check(CDOG_Type *base, uint32_t check); + +/*! + * @brief Sets secure counter and instruction timer values + * + * This function sets value in STOP, RELOAD and START registers + * for instruction timer and secure counter. + * + * @param base CDOG peripheral base address + * @param stop expected value which will be compared with value of secure counter + * @param reload reload value for instruction timer + * @param start start value for secure timer + */ +void CDOG_Set(CDOG_Type *base, uint32_t stop, uint32_t reload, uint32_t start); + +/*! + * @brief Add value to secure counter + * + * This function add specified value to secure counter. + * + * @param base CDOG peripheral base address. + * @param add Value to be added. + */ +void CDOG_Add(CDOG_Type *base, uint32_t add); + +/*! + * @brief Add 1 to secure counter + * + * This function add 1 to secure counter. + * + * @param base CDOG peripheral base address. + */ +void CDOG_Add1(CDOG_Type *base); + +/*! + * @brief Add 16 to secure counter + * + * This function add 16 to secure counter. + * + * @param base CDOG peripheral base address. + */ +void CDOG_Add16(CDOG_Type *base); + +/*! + * @brief Add 256 to secure counter + * + * This function add 256 to secure counter. + * + * @param base CDOG peripheral base address. + */ +void CDOG_Add256(CDOG_Type *base); + +/*! + * brief Substract value to secure counter + * + * This function substract specified value to secure counter. + * + * param base CDOG peripheral base address. + * param sub Value to be substracted. + */ +void CDOG_Sub(CDOG_Type *base, uint32_t sub); + +/*! + * @brief Substract 1 from secure counter + * + * This function substract specified 1 from secure counter. + * + * @param base CDOG peripheral base address. + */ +void CDOG_Sub1(CDOG_Type *base); + +/*! + * @brief Substract 16 from secure counter + * + * This function substract specified 16 from secure counter. + * + * @param base CDOG peripheral base address. + */ +void CDOG_Sub16(CDOG_Type *base); + +/*! + * @brief Substract 256 from secure counter + * + * This function substract specified 256 from secure counter. + * + * @param base CDOG peripheral base address. + */ +void CDOG_Sub256(CDOG_Type *base); + +/*! + * @brief Set the CDOG persistent word. + * + * @param base CDOG peripheral base address. + * @param value The value to be written. + */ +void CDOG_WritePersistent(CDOG_Type *base, uint32_t value); + +/*! + * @brief Get the CDOG persistent word. + * + * @param base CDOG peripheral base address. + * @return The persistent word. + */ +uint32_t CDOG_ReadPersistent(CDOG_Type *base); + +/*! @}*/ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @}*/ /* end of group cdog */ + +#endif /* FSL_CDOG_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_clock.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_clock.c new file mode 100644 index 00000000000..00f13896cd5 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_clock.c @@ -0,0 +1,1353 @@ +/* + * Copyright 2023, NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_clock.h" +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.clock" +#endif + +/******************************************************************************* + * Variables + ******************************************************************************/ +/** External clock rate on the CLKIN pin in Hz. If not used, + set this to 0. Otherwise, set it to the exact rate in Hz this pin is + being driven at. */ +volatile static uint32_t s_Ext_Clk_Freq = 16000000U; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/* Get FRO 12M Clk */ +static uint32_t CLOCK_GetFro12MFreq(void); +/* Get CLK 1M Clk */ +static uint32_t CLOCK_GetClk1MFreq(void); +/* Get HF FRO Clk */ +static uint32_t CLOCK_GetFroHfFreq(void); +/* Get CLK 48M Clk */ +static uint32_t CLOCK_GetClk48MFreq(void); +/* Get CLK 16K Clk */ +static uint32_t CLOCK_GetClk16KFreq(uint8_t id); +/* Get EXT OSC Clk */ +static uint32_t CLOCK_GetExtClkFreq(void); +/* Get Main_Clk */ +uint32_t CLOCK_GetMainClk(void); +/* Get FRO_16K */ +static uint32_t CLOCK_GetFRO16KFreq(void); + +/* Check if DIV is halt */ +static inline bool CLOCK_IsDivHalt(uint32_t div_value) +{ + if (0U != (div_value & (1UL << 30U))) + { + return true; + } + else + { + return false; + } +} + +/******************************************************************************* + * Code + ******************************************************************************/ + +/* Clock Selection for IP */ +/** + * brief Configure the clock selection muxes. + * param connection : Clock to be configured. + * return Nothing + */ +void CLOCK_AttachClk(clock_attach_id_t connection) +{ + const uint32_t reg_offset = CLK_ATTACH_REG_OFFSET(connection); + const uint32_t clk_sel = CLK_ATTACH_CLK_SEL(connection); + + if (kNONE_to_NONE != connection) + { + CLOCK_SetClockSelect((clock_select_name_t)reg_offset, clk_sel); + } +} + +/* Return the actual clock attach id */ +/** + * brief Get the actual clock attach id. + * This fuction uses the offset in input attach id, then it reads the actual source value in + * the register and combine the offset to obtain an actual attach id. + * param connection : Clock attach id to get. + * return Clock source value. + */ +clock_attach_id_t CLOCK_GetClockAttachId(clock_attach_id_t connection) +{ + const uint32_t reg_offset = CLK_ATTACH_REG_OFFSET(connection); + uint32_t actual_sel = 0U; + uint32_t clock_attach_id = 0U; + + if (kNONE_to_NONE == connection) + { + return kNONE_to_NONE; + } + + actual_sel = CLOCK_GetClockSelect((clock_select_name_t)reg_offset); + clock_attach_id = CLK_ATTACH_MUX(reg_offset, actual_sel); + + return (clock_attach_id_t)clock_attach_id; +} + +/* Set the clock selection value */ +void CLOCK_SetClockSelect(clock_select_name_t sel_name, uint32_t value) +{ + volatile uint32_t *pClkCtrl = (volatile uint32_t *)(MRCC0_BASE + (uint32_t)sel_name); + assert(sel_name <= kCLOCK_SelMax); + + if (sel_name == kCLOCK_SelSCGSCS) + { + SCG0->RCCR = (SCG0->RCCR & ~(SCG_RCCR_SCS_MASK)) | SCG_RCCR_SCS(value); + while ((SCG0->CSR & SCG_CSR_SCS_MASK) != SCG_CSR_SCS(value)) + { + } + } + else + { + /* Unlock clock configuration */ + SYSCON->CLKUNLOCK &= ~SYSCON_CLKUNLOCK_UNLOCK_MASK; + + *pClkCtrl = value; + + /* Freeze clock configuration */ + SYSCON->CLKUNLOCK |= SYSCON_CLKUNLOCK_UNLOCK_MASK; + } +} + +/* Get the clock selection value */ +uint32_t CLOCK_GetClockSelect(clock_select_name_t sel_name) +{ + volatile uint32_t *pClkCtrl = (volatile uint32_t *)(MRCC0_BASE + (uint32_t)sel_name); + uint32_t actual_sel = 0U; + assert(sel_name <= kCLOCK_SelMax); + + if (sel_name == kCLOCK_SelSCGSCS) + { + actual_sel = (uint32_t)((SCG0->RCCR & SCG_RCCR_SCS_MASK) >> SCG_RCCR_SCS_SHIFT); + } + else + { + actual_sel = *pClkCtrl; + } + + return actual_sel; +} + +/* Set the clock divider value */ +void CLOCK_SetClockDiv(clock_div_name_t div_name, uint32_t value) +{ + volatile uint32_t *pDivCtrl = (volatile uint32_t *)(MRCC0_BASE + (uint32_t)div_name); + assert(div_name <= kCLOCK_DivMax); + + /* Unlock clock configuration */ + SYSCON->CLKUNLOCK &= ~SYSCON_CLKUNLOCK_UNLOCK_MASK; + + /* halt and reset clock dividers */ + *pDivCtrl = 0x3UL << 29U; + + if (value == 0U) /*!< halt */ + { + *pDivCtrl |= (1UL << 30U); + } + else + { + *pDivCtrl = (value - 1U); + } + + /* Freeze clock configuration */ + SYSCON->CLKUNLOCK |= SYSCON_CLKUNLOCK_UNLOCK_MASK; +} + +/* Get the clock divider value */ +uint32_t CLOCK_GetClockDiv(clock_div_name_t div_name) +{ + volatile uint32_t *pDivCtrl = (volatile uint32_t *)(MRCC0_BASE + (uint32_t)div_name); + assert(div_name <= kCLOCK_DivMax); + + if (((*pDivCtrl) & (1UL << 30U)) != 0U) + { + return 0; + } + else + { + return ((*pDivCtrl & 0xFFU) + 1U); + } +} + +/* Halt the clock divider value */ +void CLOCK_HaltClockDiv(clock_div_name_t div_name) +{ + volatile uint32_t *pDivCtrl = (volatile uint32_t *)(MRCC0_BASE + (uint32_t)div_name); + assert(div_name <= kCLOCK_DivMax); + + /* Unlock clock configuration */ + SYSCON->CLKUNLOCK &= ~SYSCON_CLKUNLOCK_UNLOCK_MASK; + + *pDivCtrl |= (1UL << 30U); + + /* Freeze clock configuration */ + SYSCON->CLKUNLOCK |= SYSCON_CLKUNLOCK_UNLOCK_MASK; +} + +/* Initialize the FROHF to given frequency (48,64,96,192) */ +status_t CLOCK_SetupFROHFClocking(uint32_t iFreq) +{ + uint8_t freq_select = 0x0U; + switch (iFreq) + { + case 48000000U: + freq_select = 1U; + break; + case 64000000U: + freq_select = 3U; + break; + case 96000000U: + freq_select = 5U; + break; + case 192000000U: + freq_select = 7U; + break; + default: + freq_select = 0xFU; + break; + } + + if (0xFU == freq_select) + { + return kStatus_Fail; + } + + /* Set FIRC frequency */ + SCG0->FIRCCFG = SCG_FIRCCFG_FREQ_SEL(freq_select); + + /* Unlock FIRCCSR */ + SCG0->FIRCCSR &= ~SCG_FIRCCSR_LK_MASK; + + /* Enable CLK 48 MHz clock for peripheral use */ + SCG0->FIRCCSR |= SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN_MASK; + /* Enable FIRC HF clock for peripheral use */ + SCG0->FIRCCSR |= SCG_FIRCCSR_FIRC_FCLK_PERIPH_EN_MASK; + /* Enable FIRC */ + SCG0->FIRCCSR |= SCG_FIRCCSR_FIRCEN_MASK; + + /* Lock FIRCCSR */ + SCG0->FIRCCSR |= SCG_FIRCCSR_LK_MASK; + + /* Wait for FIRC clock to be valid. */ + while ((SCG0->FIRCCSR & SCG_FIRCCSR_FIRCVLD_MASK) == 0U) + { + } + + return kStatus_Success; +} + +/* Initialize the FRO12M. */ +status_t CLOCK_SetupFRO12MClocking(void) +{ + /* Unlock SIRCCSR */ + SCG0->SIRCCSR &= ~SCG_SIRCCSR_LK_MASK; + + /* Enable FRO12M clock for peripheral use */ + SCG0->SIRCCSR |= SCG_SIRCCSR_SIRC_CLK_PERIPH_EN_MASK; + + /* Lock SIRCCSR */ + SCG0->SIRCCSR |= SCG_SIRCCSR_LK_MASK; + + /* Wait for SIRC clock to be valid. */ + while ((SCG0->SIRCCSR & SCG_SIRCCSR_SIRCVLD_MASK) == 0U) + { + } + + return kStatus_Success; +} + +/*! + * brief Initialize the FRO16K. + * This function turns on FRO16K. + * return returns success or fail status. + */ +status_t CLOCK_SetupFRO16KClocking(uint8_t clk_16k_enable_mask) +{ + VBAT0->FROCTLA |= VBAT_FROCTLA_FRO_EN_MASK; + VBAT0->FROLCKA |= VBAT_FROLCKA_LOCK_MASK; + + /* enable clk_16k output clock to corresponding modules according to the enable_mask. */ + VBAT0->FROCLKE |= VBAT_FROCLKE_CLKE(((uint32_t)clk_16k_enable_mask)); + + return kStatus_Success; +} + +/*! + * brief Initialize the external osc clock to given frequency. + * param iFreq : Desired frequency (must be equal to exact rate in Hz) + * return returns success or fail status. + */ +status_t CLOCK_SetupExtClocking(uint32_t iFreq) +{ + uint8_t range = 0U; + + if ((iFreq >= 8000000U) && (iFreq < 16000000U)) + { + range = 0U; + } + else if ((iFreq >= 16000000U) && (iFreq < 25000000U)) + { + range = 1U; + } + else if ((iFreq >= 25000000U) && (iFreq < 40000000U)) + { + range = 2U; + } + else if ((iFreq >= 40000000U) && (iFreq <= 50000000U)) + { + range = 3U; + } + else + { + return kStatus_InvalidArgument; + } + + /* If configure register is locked, return error. */ + if ((SCG0->SOSCCSR & SCG_SOSCCSR_LK_MASK) != 0U) + { + return kStatus_ReadOnly; + } + + /* De-initializes the SCG SOSC */ + SCG0->SOSCCSR = SCG_SOSCCSR_SOSCERR_MASK; + + /* Select SOSC source (internal crystal oscillator) and Configure SOSC range */ + SCG0->SOSCCFG = SCG_SOSCCFG_EREFS_MASK | SCG_SOSCCFG_RANGE(range); + + /* Unlock SOSCCSR */ + SCG0->SOSCCSR &= ~SCG_SOSCCSR_LK_MASK; + + /* Enable SOSC clock monitor and Enable SOSC */ + SCG0->SOSCCSR |= (SCG_SOSCCSR_SOSCCM_MASK | SCG_SOSCCSR_SOSCEN_MASK); + + /* Wait for SOSC clock to be valid. */ + while ((SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) == 0U) + { + } + + s_Ext_Clk_Freq = iFreq; + + return kStatus_Success; +} + +/*! + * @brief Initialize the external reference clock to given frequency. + * param iFreq : Desired frequency (must be equal to exact rate in Hz) + * return returns success or fail status. + */ +status_t CLOCK_SetupExtRefClocking(uint32_t iFreq) +{ + + if (iFreq > 50000000U) + { + return kStatus_InvalidArgument; + } + + /* If configure register is locked, return error. */ + if ((SCG0->SOSCCSR & SCG_SOSCCSR_LK_MASK) != 0U) + { + return kStatus_ReadOnly; + } + + /* De-initializes the SCG SOSC */ + SCG0->SOSCCSR = SCG_SOSCCSR_SOSCERR_MASK; + + /* Select SOSC source (external reference clock)*/ + SCG0->SOSCCFG &= ~SCG_SOSCCFG_EREFS_MASK; + + /* Unlock SOSCCSR */ + SCG0->SOSCCSR &= ~SCG_SOSCCSR_LK_MASK; + + /* Enable SOSC clock monitor and Enable SOSC */ + SCG0->SOSCCSR |= (SCG_SOSCCSR_SOSCCM_MASK | SCG_SOSCCSR_SOSCEN_MASK); + + /* Wait for SOSC clock to be valid. */ + while ((SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) == 0U) + { + } + + s_Ext_Clk_Freq = iFreq; + + return kStatus_Success; +} + +/* Get IP Clk */ +/*! brief Return Frequency of selected clock + * return Frequency of selected clock + */ +uint32_t CLOCK_GetFreq(clock_name_t clockName) +{ + uint32_t freq = 0U; + + switch (clockName) + { + case kCLOCK_MainClk: /* MAIN_CLK */ + freq = CLOCK_GetMainClk(); + break; + case kCLOCK_CoreSysClk: /* Core/system clock(CPU_CLK) */ + freq = CLOCK_GetCoreSysClkFreq(); + break; + case kCLOCK_SYSTEM_CLK: /* AHB clock */ + freq = CLOCK_GetCoreSysClkFreq(); + break; + case kCLOCK_BusClk: /* Bus clock (AHB clock) */ + freq = CLOCK_GetCoreSysClkFreq(); + break; + case kCLOCK_ExtClk: /* External Clock */ + freq = CLOCK_GetExtClkFreq(); + break; + case kCLOCK_FroHf: /* FROHF */ + freq = CLOCK_GetFroHfFreq(); + break; + case kCLOCK_FroHfDiv: /* Divided by FROHF */ + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case kCLOCK_Clk48M: /* CLK48M */ + freq = CLOCK_GetClk48MFreq(); + break; + case kCLOCK_Fro12M: /* FRO12M */ + freq = CLOCK_GetFro12MFreq(); + break; + case kCLOCK_Clk1M: /* CLK1M */ + freq = CLOCK_GetClk1MFreq(); + break; + case kCLOCK_Fro16K: /* FRO16K */ + freq = CLOCK_GetFRO16KFreq(); + break; + case kCLOCK_Clk16K0: /* CLK16K[0] */ + freq = CLOCK_GetClk16KFreq(0); + break; + case kCLOCK_Clk16K1: /* CLK16K[1] */ + freq = CLOCK_GetClk16KFreq(1); + break; + case kCLOCK_SLOW_CLK: /* SYSTEM_CLK divided by 4 */ + freq = CLOCK_GetCoreSysClkFreq() >> 2; + break; + default: + freq = 0U; + break; + } + return freq; +} + +/* Get FRO 12M Clk */ +/*! brief Return Frequency of FRO 12MHz + * return Frequency of FRO 12MHz + */ +static uint32_t CLOCK_GetFro12MFreq(void) +{ + return ((SCG0->SIRCCSR & SCG_SIRCCSR_SIRC_CLK_PERIPH_EN_MASK) != 0U) ? 12000000U : 0U; +} + +/* Get CLK 1M Clk */ +/*! brief Return Frequency of CLK 1MHz + * return Frequency of CLK 1MHz + */ +static uint32_t CLOCK_GetClk1MFreq(void) +{ + return 1000000U; +} + +/* Get HF FRO Clk */ +/*! brief Return Frequency of High-Freq output of FRO + * return Frequency of High-Freq output of FRO + */ +static uint32_t CLOCK_GetFroHfFreq(void) +{ + uint32_t freq; + + if (((SCG0->FIRCCSR & SCG_FIRCCSR_FIRCEN_MASK) == 0U) || + ((SCG0->FIRCCSR & SCG_FIRCCSR_FIRC_FCLK_PERIPH_EN_SHIFT) == 0U)) + { + freq = 0U; + } + + switch ((SCG0->FIRCCFG & SCG_FIRCCFG_FREQ_SEL_MASK) >> SCG_FIRCCFG_FREQ_SEL_SHIFT) + { + case 0U: + freq = 36000000U; + break; + case 1U: + freq = 48000000U; + break; + case 2U: + freq = 48000000U; + break; + case 3U: + freq = 64000000U; + break; + case 4U: + freq = 72000000U; + break; + case 5U: + freq = 96000000U; + break; + case 6U: + freq = 144000000U; + break; + case 7U: + freq = 192000000U; + break; + default: + freq = 0U; + break; + } + + return freq; +} + +/* Get CLK 48M Clk */ +/*! brief Return Frequency of CLK 48MHz + * return Frequency of CLK 48MHz + */ +static uint32_t CLOCK_GetClk48MFreq(void) +{ + return (((SCG0->FIRCCSR & SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN_MASK) != 0U) || + ((SCG0->FIRCCSR & SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN_SHIFT) == 0U)) ? + 48000000U : + 0U; +} + +/*! brief Return Frequency of FRO16K + * return Frequency of FRO_16K + */ +static uint32_t CLOCK_GetFRO16KFreq(void) +{ + return ((VBAT0->FROCTLA & VBAT_FROCTLA_FRO_EN_MASK) != 0U) ? 16000U : 0U; +} +/* Get CLK 16K Clk */ +/*! brief Return Frequency of CLK 16KHz + * return Frequency of CLK 16KHz + */ +static uint32_t CLOCK_GetClk16KFreq(uint8_t id) +{ + return (((VBAT0->FROCTLA & VBAT_FROCTLA_FRO_EN_MASK) != 0U) && + ((VBAT0->FROCLKE & VBAT_FROCLKE_CLKE((((uint32_t)id) << 1U))) != 0U)) ? + 16000U : + 0U; +} + +/* Get EXT OSC Clk */ +/*! brief Return Frequency of External Clock + * return Frequency of External Clock. If no external clock is used returns 0. + */ +static uint32_t CLOCK_GetExtClkFreq(void) +{ + return ((SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) != 0U) ? s_Ext_Clk_Freq : 0U; +} + +/* Get MAIN Clk */ +/*! brief Return Frequency of Core System + * return Frequency of Core System + */ +uint32_t CLOCK_GetMainClk(void) +{ + uint32_t freq = 0U; + + switch ((SCG0->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) + { + case 1U: + freq = CLOCK_GetExtClkFreq(); + break; + case 2U: + freq = CLOCK_GetFro12MFreq(); + break; + case 3U: + freq = CLOCK_GetFroHfFreq(); + break; + case 4U: + freq = CLOCK_GetClk16KFreq(1); + break; + default: + freq = 0U; + break; + } + + return freq; +} + +/*! brief Return Frequency of core + * return Frequency of the core + */ +uint32_t CLOCK_GetCoreSysClkFreq(void) +{ + return CLOCK_GetMainClk() / ((SYSCON->AHBCLKDIV & 0xFFU) + 1U); +} + +/* Get I3C Clk */ +/*! brief Return Frequency of I3C Clock + * return Frequency of I3C Clock + */ +uint32_t CLOCK_GetI3CFClkFreq(void) +{ + uint32_t freq = 0U; + uint32_t clksel = (MRCC0->MRCC_I3C0_FCLK_CLKSEL); + uint32_t clkdiv = (MRCC0->MRCC_I3C0_FCLK_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 2U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/* Get CTimer Clk */ +/*! brief Return Frequency of CTimer functional Clock + * return Frequency of CTimer functional Clock + */ +uint32_t CLOCK_GetCTimerClkFreq(uint32_t id) +{ + uint32_t freq = 0U; + uint32_t clksel = 0U; + uint32_t clkdiv = 0U; + + switch (id) + { + case 0U: + clksel = MRCC0->MRCC_CTIMER0_CLKSEL; + clkdiv = MRCC0->MRCC_CTIMER0_CLKDIV; + break; + case 1U: + clksel = MRCC0->MRCC_CTIMER1_CLKSEL; + clkdiv = MRCC0->MRCC_CTIMER1_CLKDIV; + break; + case 2U: + clksel = MRCC0->MRCC_CTIMER2_CLKSEL; + clkdiv = MRCC0->MRCC_CTIMER2_CLKDIV; + break; + case 3U: + clksel = MRCC0->MRCC_CTIMER3_CLKSEL; + clkdiv = MRCC0->MRCC_CTIMER3_CLKDIV; + break; + case 4U: + clksel = MRCC0->MRCC_CTIMER4_CLKSEL; + clkdiv = MRCC0->MRCC_CTIMER4_CLKDIV; + break; + default: + clksel = MRCC0->MRCC_CTIMER0_CLKSEL; + clkdiv = MRCC0->MRCC_CTIMER0_CLKDIV; + break; + } + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 1U: + freq = CLOCK_GetFroHfFreq(); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 4U: + freq = CLOCK_GetClk16KFreq(1); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/* Get LPI2C Clk */ +/*! brief Return Frequency of LPI2C functional Clock + * return Frequency of LPI2C functional Clock + */ +uint32_t CLOCK_GetLpi2cClkFreq(uint32_t id) +{ + uint32_t freq = 0U; + + uint32_t clksel = 0U; + uint32_t clkdiv = 0U; + + switch (id) + { + case 0U: + clksel = MRCC0->MRCC_LPI2C0_CLKSEL; + clkdiv = MRCC0->MRCC_LPI2C0_CLKDIV; + break; + case 1U: + clksel = MRCC0->MRCC_LPI2C1_CLKSEL; + clkdiv = MRCC0->MRCC_LPI2C1_CLKDIV; + break; + case 2U: + clksel = MRCC0->MRCC_LPI2C2_CLKSEL; + clkdiv = MRCC0->MRCC_LPI2C2_CLKDIV; + break; + case 3U: + clksel = MRCC0->MRCC_LPI2C3_CLKSEL; + clkdiv = MRCC0->MRCC_LPI2C3_CLKDIV; + break; + default: + clksel = MRCC0->MRCC_LPI2C0_CLKSEL; + clkdiv = MRCC0->MRCC_LPI2C0_CLKDIV; + break; + } + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 2U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of LPSPI Clock + * return Frequency of LPSPI Clock + */ +uint32_t CLOCK_GetLpspiClkFreq(uint32_t id) +{ + uint32_t freq = 0U; + uint32_t clksel = (0U == id) ? (MRCC0->MRCC_LPSPI0_CLKSEL) : (MRCC0->MRCC_LPSPI1_CLKSEL); + uint32_t clkdiv = (0U == id) ? (MRCC0->MRCC_LPSPI0_CLKDIV) : (MRCC0->MRCC_LPSPI1_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 2U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of LPUART Clock + * return Frequency of LPUART Clock + */ +uint32_t CLOCK_GetLpuartClkFreq(uint32_t id) +{ + uint32_t freq = 0U; + uint32_t clksel = 0U; + uint32_t clkdiv = 0U; + + switch (id) + { + case 0U: + clksel = MRCC0->MRCC_LPUART0_CLKSEL; + clkdiv = MRCC0->MRCC_LPUART0_CLKDIV; + break; + case 1U: + clksel = MRCC0->MRCC_LPUART1_CLKSEL; + clkdiv = MRCC0->MRCC_LPUART1_CLKDIV; + break; + case 2U: + clksel = MRCC0->MRCC_LPUART2_CLKSEL; + clkdiv = MRCC0->MRCC_LPUART2_CLKDIV; + break; + case 3U: + clksel = MRCC0->MRCC_LPUART3_CLKSEL; + clkdiv = MRCC0->MRCC_LPUART3_CLKDIV; + break; + case 4U: + clksel = MRCC0->MRCC_LPUART4_CLKSEL; + clkdiv = MRCC0->MRCC_LPUART4_CLKDIV; + break; + default: + clksel = MRCC0->MRCC_LPUART0_CLKSEL; + clkdiv = MRCC0->MRCC_LPUART0_CLKDIV; + break; + } + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 2U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 4U: + freq = CLOCK_GetClk16KFreq(1); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of LPTMR Clock + * return Frequency of LPTMR Clock + */ +uint32_t CLOCK_GetLptmrClkFreq(void) +{ + uint32_t freq = 0U; + uint32_t clksel = (MRCC0->MRCC_LPTMR0_CLKSEL); + uint32_t clkdiv = (MRCC0->MRCC_LPTMR0_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 2U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of OSTIMER + * return Frequency of OSTIMER Clock + */ +uint32_t CLOCK_GetOstimerClkFreq(void) +{ + uint32_t freq = 0U; + uint32_t clksel = (MRCC0->MRCC_OSTIMER0_CLKSEL); + + switch (clksel) + { + case 0U: + freq = CLOCK_GetClk16KFreq(1); + break; + case 2U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq; +} + +/*! brief Return Frequency of Adc Clock + * return Frequency of Adc. + */ +uint32_t CLOCK_GetAdcClkFreq(uint32_t id) +{ + uint32_t freq = 0U; + + uint32_t clksel = (0U == id) ? (MRCC0->MRCC_ADC0_CLKSEL) : (MRCC0->MRCC_ADC1_CLKSEL); + uint32_t clkdiv = (0U == id) ? (MRCC0->MRCC_ADC0_CLKDIV) : (MRCC0->MRCC_ADC1_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 1U: + freq = CLOCK_GetFroHfFreq(); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of Dac Clock + * return Frequency of Dac. + */ +uint32_t CLOCK_GetDacClkFreq(void) +{ + uint32_t freq = 0U; + uint32_t clksel = (MRCC0->MRCC_DAC0_CLKSEL); + uint32_t clkdiv = (MRCC0->MRCC_DAC0_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 1U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of CMP Function Clock + * return Frequency of CMP Function. + */ +uint32_t CLOCK_GetCmpFClkFreq(uint32_t id) +{ + uint32_t freq = 0U; + uint32_t clksel = (0U == id) ? (MRCC0->MRCC_CMP0_RR_CLKSEL) : (MRCC0->MRCC_CMP1_RR_CLKSEL); + uint32_t clkdiv = (0U == id) ? (MRCC0->MRCC_CMP0_FUNC_CLKDIV) : (MRCC0->MRCC_CMP1_FUNC_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 2U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of CMP Round Robin Clock + * return Frequency of CMP Round Robin. + */ +uint32_t CLOCK_GetCmpRRClkFreq(uint32_t id) +{ + uint32_t freq = 0U; + uint32_t clksel = (0U == id) ? (MRCC0->MRCC_CMP0_RR_CLKSEL) : (MRCC0->MRCC_CMP1_RR_CLKSEL); + uint32_t clkdiv = (0U == id) ? (MRCC0->MRCC_CMP0_RR_CLKDIV) : (MRCC0->MRCC_CMP1_RR_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 2U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of Trace Clock + * return Frequency of Trace. + */ +uint32_t CLOCK_GetTraceClkFreq(void) +{ + uint32_t freq = 0U; + uint32_t clksel = (MRCC0->MRCC_DBG_TRACE_CLKSEL); + uint32_t clkdiv = (MRCC0->MRCC_DBG_TRACE_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetCoreSysClkFreq(); + break; + case 1U: + freq = CLOCK_GetClk1MFreq(); + break; + case 2U: + freq = CLOCK_GetClk16KFreq(1); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of CLKOUT Clock + * return Frequency of CLKOUT. + */ +uint32_t CLOCK_GetClkoutClkFreq(void) +{ + uint32_t freq = 0U; + uint32_t clksel = (MRCC0->MRCC_CLKOUT_CLKSEL); + uint32_t clkdiv = (MRCC0->MRCC_CLKOUT_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 1U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 2U: + freq = CLOCK_GetExtClkFreq(); + break; + case 3U: + freq = CLOCK_GetClk16KFreq(1); + break; + case 6U: + freq = CLOCK_GetCoreSysClkFreq() >> 2; + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of Systick Clock + * return Frequency of Systick. + */ +uint32_t CLOCK_GetSystickClkFreq(void) +{ + uint32_t freq = 0U; + uint32_t clksel = (MRCC0->MRCC_SYSTICK_CLKSEL); + uint32_t clkdiv = (MRCC0->MRCC_SYSTICK_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetCoreSysClkFreq(); + break; + case 1U: + freq = CLOCK_GetClk1MFreq(); + break; + case 2U: + freq = CLOCK_GetClk16KFreq(1); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of Systick Clock + * return Frequency of Systick. + */ +uint32_t CLOCK_GetWwdtClkFreq(void) +{ + uint32_t freq = 0U; + uint32_t clkdiv = (MRCC0->MRCC_WWDT0_CLKDIV); + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + freq = CLOCK_GetClk1MFreq(); + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of FLEXIO FCLK + * return Frequency of FLEXIO FCLK. + */ +uint32_t CLOCK_GetFlexioClkFreq(void) +{ + uint32_t freq = 0U; + + uint32_t clksel = MRCC0->MRCC_FLEXIO0_CLKSEL; + uint32_t clkdiv = MRCC0->MRCC_FLEXIO0_CLKDIV; + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 0U: + freq = CLOCK_GetFro12MFreq(); + break; + case 1U: + freq = CLOCK_GetFroHfFreq(); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + case 5U: + freq = CLOCK_GetClk1MFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/*! brief Return Frequency of FlexCAN FCLK + * return Frequency of FlexCAN FCLK. + */ +uint32_t CLOCK_GetFlexcanClkFreq(void) +{ + uint32_t freq = 0U; + + uint32_t clksel = MRCC0->MRCC_FLEXCAN0_CLKSEL; + uint32_t clkdiv = MRCC0->MRCC_FLEXCAN0_CLKDIV; + + if (true == CLOCK_IsDivHalt(clkdiv)) + { + return 0; + } + + switch (clksel) + { + case 2U: + freq = CLOCK_GetFroHfFreq() / ((MRCC0->MRCC_FRO_HF_DIV_CLKDIV & 0xfU) + 1U); + break; + case 3U: + freq = CLOCK_GetExtClkFreq(); + break; + default: + freq = 0U; + break; + } + + return freq / ((clkdiv & 0xFFU) + 1U); +} + +/** + * @brief Setup FROHF trim. + * @param config : FROHF trim value + * @return returns success or fail status. + */ +status_t CLOCK_FROHFTrimConfig(firc_trim_config_t config) +{ + SCG0->FIRCTCFG = SCG_FIRCTCFG_TRIMDIV(config.trimDiv) | SCG_FIRCTCFG_TRIMSRC(config.trimSrc); + + if (kSCG_FircTrimNonUpdate == config.trimMode) + { + SCG0->FIRCSTAT = SCG_FIRCSTAT_TRIMFINE(config.trimFine); + } + + /* Set trim mode. */ + SCG0->FIRCCSR = (uint32_t)config.trimMode; + + if ((SCG0->FIRCCSR & SCG_FIRCCSR_FIRCERR_MASK) == SCG_FIRCCSR_FIRCERR_MASK) + { + return (status_t)kStatus_Fail; + } + + return (status_t)kStatus_Success; +} + +/** + * @brief Setup FRO 12M trim. + * @param config : FRO 12M trim value + * @return returns success or fail status. + */ +status_t CLOCK_FRO12MTrimConfig(sirc_trim_config_t config) +{ + SCG0->SIRCTCFG = SCG_SIRCTCFG_TRIMDIV(config.trimDiv) | SCG_SIRCTCFG_TRIMSRC(config.trimSrc); + + if (kSCG_SircTrimNonUpdate == config.trimMode) + { + SCG0->SIRCSTAT = SCG_SIRCSTAT_CCOTRIM(config.cltrim); + SCG0->SIRCSTAT = SCG_SIRCSTAT_CCOTRIM(config.ccotrim); + } + + /* Set trim mode. */ + SCG0->SIRCCSR = (uint32_t)config.trimMode; + + if ((SCG0->SIRCCSR & SCG_SIRCCSR_SIRCERR_MASK) == SCG_SIRCCSR_SIRCERR_MASK) + { + return (status_t)kStatus_Fail; + } + + return (status_t)kStatus_Success; +} + +/*! + * @brief Sets the system OSC monitor mode. + * + * This function sets the system OSC monitor mode. The mode can be disabled, + * it can generate an interrupt when the error is disabled, or reset when the error is detected. + * + * @param mode Monitor mode to set. + */ +void CLOCK_SetSysOscMonitorMode(scg_sosc_monitor_mode_t mode) +{ + uint32_t reg = SCG0->SOSCCSR; + + reg &= ~(SCG_SOSCCSR_SOSCCM_MASK | SCG_SOSCCSR_SOSCCMRE_MASK); + + reg |= (uint32_t)mode; + + SCG0->SOSCCSR = reg; +} + +/*! brief Enable USB FS clock. + * Enable USB Full Speed clock. + */ +bool CLOCK_EnableUsbfsClock(void) +{ + /* Enable USB clock */ + CLOCK_EnableClock(kCLOCK_GateUSB0); + + /* Enable FROHF with 48MHZ if it is disabled */ + if (0U == (SCG0->FIRCCSR & SCG_FIRCCSR_FIRCEN_MASK)) + { + if (kStatus_Success != CLOCK_SetupFROHFClocking(48000000U)) + { + return false; + } + } + + /* Enable CLK_48 MHz clock for peripheral use */ + SCG0->FIRCCSR |= SCG_FIRCCSR_FIRC_SCLK_PERIPH_EN_MASK; + + /* Use clk_48M for USB FS */ + CLOCK_AttachClk(kCLK_48M_to_USB0); + + return true; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_clock.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_clock.h new file mode 100644 index 00000000000..2e43e7fbed8 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_clock.h @@ -0,0 +1,983 @@ +/* + * Copyright 2023, NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FSL_CLOCK_H_ +#define _FSL_CLOCK_H_ + +#include "fsl_common.h" + +/*! @addtogroup clock */ +/*! @{ */ + +/*! @file */ + +/******************************************************************************* + * Definitions + *****************************************************************************/ + +/*! @name Driver version */ +/*@{*/ +/*! @brief CLOCK driver version 1.0.0. */ +#define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(1, 0, 0)) +/*@}*/ + +/*! @brief Configure whether driver controls clock + * + * When set to 0, peripheral drivers will enable clock in initialize function + * and disable clock in de-initialize function. When set to 1, peripheral + * driver will not control the clock, application could control the clock out of + * the driver. + * + * @note All drivers share this feature switcher. If it is set to 1, application + * should handle clock enable and disable for all drivers. + */ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)) +#define FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL 0U +#endif + +/* Definition for delay API in clock driver, users can redefine it to the real application. */ +#ifndef SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY +#define SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY (96000000U) +#endif + +/*! @brief Clock gate name used for CLOCK_EnableClock/CLOCK_DisableClock. */ +/*------------------------------------------------------------------------------ + clock_ip_name_t definition: +------------------------------------------------------------------------------*/ +#define CLK_GATE_REG_OFFSET(value) (((uint32_t)(value)) >> 16U) +#define CLK_GATE_BIT_SHIFT(value) (((uint32_t)(value)) & 0x0000FFFFU) + +#define REG_PWM0SUBCTL (250U) +#define REG_PWM1SUBCTL (240U) + +/*! @brief Clock gate name used for CLOCK_EnableClock/CLOCK_DisableClock. */ +typedef enum _clock_ip_name +{ + kCLOCK_InputMux = (0x0000U | (0U)), /*!< Clock gate name: INPUTMUX0 */ + kCLOCK_GateINPUTMUX0 = (0x0000U | (0U)), /*!< Clock gate name: INPUTMUX0 */ + kCLOCK_GateI3C0 = (0x0000U | (1U)), /*!< Clock gate name: I3C0 */ + kCLOCK_GateCTIMER0 = (0x0000U | (2U)), /*!< Clock gate name: CTIMER0 */ + kCLOCK_GateCTIMER1 = (0x0000U | (3U)), /*!< Clock gate name: CTIMER1 */ + kCLOCK_GateCTIMER2 = (0x0000U | (4U)), /*!< Clock gate name: CTIMER2 */ + kCLOCK_GateCTIMER3 = (0x0000U | (5U)), /*!< Clock gate name: CTIMER3 */ + kCLOCK_GateCTIMER4 = (0x0000U | (6U)), /*!< Clock gate name: CTIMER4 */ + kCLOCK_GateFREQME = (0x0000U | (7U)), /*!< Clock gate name: FREQME */ + kCLOCK_GateUTICK0 = (0x0000U | (8U)), /*!< Clock gate name: UTICK0 */ + kCLOCK_GateWWDT0 = (0x0000U | (9U)), /*!< Clock gate name: WWDT0 */ + kCLOCK_GateDMA = (0x0000U | (10U)), /*!< Clock gate name: DMA */ + kCLOCK_GateAOI0 = (0x0000U | (11U)), /*!< Clock gate name: AOI0 */ + kCLOCK_GateCRC0 = (0x0000U | (12U)), /*!< Clock gate name: CRC0 */ + kCLOCK_Crc0 = (0x0000U | (12U)), /*!< Clock gate name: CRC0 */ + kCLOCK_GateEIM0 = (0x0000U | (13U)), /*!< Clock gate name: EIM0 */ + kCLOCK_GateERM0 = (0x0000U | (14U)), /*!< Clock gate name: ERM0 */ + kCLOCK_GateFMC = (0x0000U | (15U)), /*!< Clock gate name: FMC */ + kCLOCK_GateAOI1 = (0x0000U | (16U)), /*!< Clock gate name: AOI1 */ + kCLOCK_GateFLEXIO0 = (0x0000U | (17U)), /*!< Clock gate name: FLEXIO0 */ + kCLOCK_GateLPI2C0 = (0x0000U | (18U)), /*!< Clock gate name: LPI2C0 */ + kCLOCK_GateLPI2C1 = (0x0000U | (19U)), /*!< Clock gate name: LPI2C1 */ + kCLOCK_GateLPSPI0 = (0x0000U | (20U)), /*!< Clock gate name: LPSPI0 */ + kCLOCK_GateLPSPI1 = (0x0000U | (21U)), /*!< Clock gate name: LPSPI1 */ + kCLOCK_GateLPUART0 = (0x0000U | (22U)), /*!< Clock gate name: LPUART0 */ + kCLOCK_GateLPUART1 = (0x0000U | (23U)), /*!< Clock gate name: LPUART1 */ + kCLOCK_GateLPUART2 = (0x0000U | (24U)), /*!< Clock gate name: LPUART2 */ + kCLOCK_GateLPUART3 = (0x0000U | (25U)), /*!< Clock gate name: LPUART3 */ + kCLOCK_GateLPUART4 = (0x0000U | (26U)), /*!< Clock gate name: LPUART4 */ + kCLOCK_GateUSB0 = (0x0000U | (27U)), /*!< Clock gate name: USB0 */ + kCLOCK_GateQDC0 = (0x0000U | (28U)), /*!< Clock gate name: QDC0 */ + kCLOCK_GateQDC1 = (0x0000U | (29U)), /*!< Clock gate name: QDC1 */ + kCLOCK_GateFLEXPWM0 = (0x0000U | (30U)), /*!< Clock gate name: FLEXPWM0 */ + kCLOCK_GateFLEXPWM1 = (0x0000U | (31U)), /*!< Clock gate name: FLEXPWM1 */ + kCLOCK_GateOSTIMER0 = ((0x10U << 16U) | (0U)), /*!< Clock gate name: OSTIMER0 */ + kCLOCK_GateADC0 = ((0x10U << 16U) | (1U)), /*!< Clock gate name: ADC0 */ + kCLOCK_GateADC1 = ((0x10U << 16U) | (2U)), /*!< Clock gate name: ADC1 */ + kCLOCK_GateCMP0 = ((0x10U << 16U) | (3U)), /*!< Clock gate name: CMP0 */ + kCLOCK_GateCMP1 = ((0x10U << 16U) | (4U)), /*!< Clock gate name: CMP1 */ + kCLOCK_GateDAC0 = ((0x10U << 16U) | (5U)), /*!< Clock gate name: DAC0 */ + kCLOCK_GateOPAMP0 = ((0x10U << 16U) | (6U)), /*!< Clock gate name: OPAMP0 */ + kCLOCK_GatePORT0 = ((0x10U << 16U) | (7U)), /*!< Clock gate name: PORT0 */ + kCLOCK_GatePORT1 = ((0x10U << 16U) | (8U)), /*!< Clock gate name: PORT1 */ + kCLOCK_GatePORT2 = ((0x10U << 16U) | (9U)), /*!< Clock gate name: PORT2 */ + kCLOCK_GatePORT3 = ((0x10U << 16U) | (10U)), /*!< Clock gate name: PORT3 */ + kCLOCK_GatePORT4 = ((0x10U << 16U) | (11U)), /*!< Clock gate name: PORT4 */ + kCLOCK_GateFLEXCAN0 = ((0x10U << 16U) | (12U)), /*!< Clock gate name: FLEXCAN0 */ + kCLOCK_GateLPI2C2 = ((0x10U << 16U) | (13U)), /*!< Clock gate name: LPI2C2 */ + kCLOCK_GateLPI2C3 = ((0x10U << 16U) | (14U)), /*!< Clock gate name: LPI2C3 */ + kCLOCK_GateMTR = ((0x10U << 16U) | (16U)), /*!< Clock gate name: MTR */ + kCLOCK_GateTCU = ((0x10U << 16U) | (17U)), /*!< Clock gate name: TCU */ + kCLOCK_GateRAMA = ((0x10U << 16U) | (18U)), /*!< Clock gate name: RAMA */ + kCLOCK_GateRAMB = ((0x10U << 16U) | (19U)), /*!< Clock gate name: RAMB */ + kCLOCK_GateGPIO0 = ((0x10U << 16U) | (20U)), /*!< Clock gate name: GPIO0 */ + kCLOCK_GateGPIO1 = ((0x10U << 16U) | (21U)), /*!< Clock gate name: GPIO1 */ + kCLOCK_GateGPIO2 = ((0x10U << 16U) | (22U)), /*!< Clock gate name: GPIO2 */ + kCLOCK_GateGPIO3 = ((0x10U << 16U) | (23U)), /*!< Clock gate name: GPIO3 */ + kCLOCK_GateGPIO4 = ((0x10U << 16U) | (24U)), /*!< Clock gate name: GPIO4 */ + kCLOCK_GateROMC = ((0x10U << 16U) | (25U)), /*!< Clock gate name: ROMC */ + kCLOCK_GatePWM0SM0 = ((REG_PWM0SUBCTL << 16U) | (0U)), /*!< Clock gate name: FlexPWM0 SM0 */ + kCLOCK_GatePWM0SM1 = ((REG_PWM0SUBCTL << 16U) | (1U)), /*!< Clock gate name: FlexPWM0 SM1 */ + kCLOCK_GatePWM0SM2 = ((REG_PWM0SUBCTL << 16U) | (2U)), /*!< Clock gate name: FlexPWM0 SM2 */ + kCLOCK_GatePWM1SM0 = ((REG_PWM1SUBCTL << 16U) | (0U)), /*!< Clock gate name: FlexPWM1 SM0 */ + kCLOCK_GatePWM1SM1 = ((REG_PWM1SUBCTL << 16U) | (1U)), /*!< Clock gate name: FlexPWM1 SM1 */ + kCLOCK_GatePWM1SM2 = ((REG_PWM1SUBCTL << 16U) | (2U)), /*!< Clock gate name: FlexPWM1 SM2 */ + kCLOCK_GateNotAvail = (0xFFFFFFFFU), /**< Clock gate name: None */ +} clock_ip_name_t; + +/*! @brief Clock ip name array for AOI. */ +#define AOI_CLOCKS \ + { \ + kCLOCK_GateAOI0, kCLOCK_GateAOI1 \ + } +/*! @brief Clock ip name array for CRC. */ +#define CRC_CLOCKS \ + { \ + kCLOCK_GateCRC0 \ + } +/*! @brief Clock ip name array for CTIMER. */ +#define CTIMER_CLOCKS \ + { \ + kCLOCK_GateCTIMER0, kCLOCK_GateCTIMER1, kCLOCK_GateCTIMER2, kCLOCK_GateCTIMER3, kCLOCK_GateCTIMER4 \ + } +/*! @brief Clock ip name array for DAC. */ +#define LPDAC_CLOCKS \ + { \ + kCLOCK_GateDAC0 \ + } +/*! @brief Clock ip name array for DMA. */ +#define DMA_CLOCKS \ + { \ + kCLOCK_GateDMA \ + } +/*! @brief Clock gate name array for EDMA. */ +#define EDMA_CLOCKS \ + { \ + kCLOCK_GateDMA \ + } +/*! @brief Clock ip name array for ERM. */ +#define ERM_CLOCKS \ + { \ + kCLOCK_GateERM0 \ + } +/*! @brief Clock ip name array for EIM. */ +#define EIM_CLOCKS \ + { \ + kCLOCK_GateEIM0 \ + } +/*! @brief Clock ip name array for FLEXCAN. */ +#define FLEXCAN_CLOCKS \ + { \ + kCLOCK_GateFLEXCAN0 \ + } +/*! @brief Clock ip name array for FLEXIO. */ +#define FLEXIO_CLOCKS \ + { \ + kCLOCK_GateFLEXIO0 \ + } +/*! @brief Clock ip name array for FREQME. */ +#define FREQME_CLOCKS \ + { \ + kCLOCK_GateFREQME \ + } +/*! @brief Clock ip name array for GPIO. */ +#define GPIO_CLOCKS \ + { \ + kCLOCK_GateGPIO0, kCLOCK_GateGPIO1, kCLOCK_GateGPIO2, kCLOCK_GateGPIO3, kCLOCK_GateGPIO4 \ + } +/*! @brief Clock ip name array for I3C */ +#define I3C_CLOCKS \ + { \ + kCLOCK_GateI3C0 \ + } +/*! @brief Clock ip name array for INPUTMUX. */ +#define INPUTMUX_CLOCKS \ + { \ + kCLOCK_GateINPUTMUX0 \ + } +/*! @brief Clock ip name array for GPIO. */ +#define LPCMP_CLOCKS \ + { \ + kCLOCK_GateCMP0, kCLOCK_GateCMP1 \ + } +/*! @brief Clock ip name array for LPADC. */ +#define LPADC_CLOCKS \ + { \ + kCLOCK_GateADC0, kCLOCK_GateADC1 \ + } +/*! @brief Clock ip name array for LPUART. */ +#define LPUART_CLOCKS \ + { \ + kCLOCK_GateLPUART0, kCLOCK_GateLPUART1, kCLOCK_GateLPUART2, kCLOCK_GateLPUART3, kCLOCK_GateLPUART4 \ + } +/*! @brief Clock ip name array for LPI2C. */ +#define LPI2C_CLOCKS \ + { \ + kCLOCK_GateLPI2C0, kCLOCK_GateLPI2C1, kCLOCK_GateLPI2C2, kCLOCK_GateLPI2C3 \ + } +/*! @brief Clock ip name array for LSPI. */ +#define LPSPI_CLOCKS \ + { \ + kCLOCK_GateLPSPI0, kCLOCK_GateLPSPI1 \ + } +/*! @brief Clock ip name array for MTR. */ +#define MTR_CLOCKS \ + { \ + kCLOCK_GateMTR \ + } +/*! @brief Clock ip name array for OSTIMER. */ +#define OSTIMER_CLOCKS \ + { \ + kCLOCK_GateOSTIMER0 \ + } +/*! @brief Clock ip name array for DAC. */ +#define OPAMP_CLOCKS \ + { \ + kCLOCK_GateOPAMP0 \ + } +/*! @brief Clock ip name array for PWM. */ +#define PWM_CLOCKS \ + { \ + {kCLOCK_GatePWM0SM0, kCLOCK_GatePWM0SM1, kCLOCK_GatePWM0SM2}, \ + { \ + kCLOCK_GatePWM1SM0, kCLOCK_GatePWM1SM1, kCLOCK_GatePWM1SM2 \ + } \ + } +/*! @brief Clock ip name array for QDC. */ +#define QDC_CLOCKS \ + { \ + kCLOCK_GateQDC0, kCLOCK_GateQDC1 \ + } +/*! @brief Clock ip name array for UTICK. */ +#define UTICK_CLOCKS \ + { \ + kCLOCK_GateUTICK0 \ + } +/*! @brief Clock ip name array for WWDT. */ +#define WWDT_CLOCKS \ + { \ + kCLOCK_GateWWDT0 \ + } + +/*! @brief Peripherals clock source definition. */ +#define BUS_CLK kCLOCK_BusClk + +/*! @brief Clock name used to get clock frequency. */ +typedef enum _clock_name +{ + kCLOCK_MainClk, /*!< MAIN_CLK */ + kCLOCK_CoreSysClk, /*!< Core/system clock(CPU_CLK) */ + kCLOCK_SYSTEM_CLK, /*!< AHB clock */ + kCLOCK_BusClk, /*!< Bus clock (AHB clock) */ + kCLOCK_ExtClk, /*!< External Clock */ + kCLOCK_FroHf, /*!< FRO192 */ + kCLOCK_FroHfDiv, /*!< Divided by FRO192 */ + kCLOCK_Clk48M, /*!< CLK48M */ + kCLOCK_Fro12M, /*!< FRO12M */ + kCLOCK_Clk1M, /*!< CLK1M */ + kCLOCK_Fro16K, /*!< FRO16K */ + kCLOCK_Clk16K0, /*!< CLK16K[0] */ + kCLOCK_Clk16K1, /*!< CLK16K[1] */ + kCLOCK_SLOW_CLK, /*!< SYSTEM_CLK divided by 4 */ +} clock_name_t; + +/*! @brief Clock Mux Switches + * The encoding is as follows each connection identified is 32bits wide while 24bits are valuable + * starting from LSB upwards + * + * [4 bits for choice, 0 means invalid choice] [8 bits mux ID]* + * + */ + +#define CLK_ATTACH_REG_OFFSET(value) (((uint32_t)(value)) >> 16U) +#define CLK_ATTACH_CLK_SEL(value) (((uint32_t)(value)) & 0x0000FFFFU) +#define CLK_ATTACH_MUX(reg, sel) ((((uint32_t)(reg)) << 16U) | (sel)) + +/*! @brief Clock name used to get clock frequency. */ +typedef enum _clock_select_name +{ + kCLOCK_SelI3C0_FCLK = (0x0A0), /*MRCC_GLB_CC0_SET)) + reg_offset); + + if (clk == kCLOCK_GateNotAvail) + { + return; + } + + /* Unlock clock configuration */ + SYSCON->CLKUNLOCK &= ~SYSCON_CLKUNLOCK_UNLOCK_MASK; + + if (reg_offset == REG_PWM0SUBCTL) + { + SYSCON->PWM0SUBCTL |= (1UL << bit_shift); + MRCC0->MRCC_GLB_CC0_SET = MRCC_MRCC_GLB_CC0_FLEXPWM0_MASK; + } + else if (reg_offset == REG_PWM1SUBCTL) + { + SYSCON->PWM1SUBCTL |= (1UL << bit_shift); + MRCC0->MRCC_GLB_CC0_SET = MRCC_MRCC_GLB_CC0_FLEXPWM1_MASK; + } + else + { + *pClkCtrl = (1UL << bit_shift); + } + + /* Freeze clock configuration */ + SYSCON->CLKUNLOCK |= SYSCON_CLKUNLOCK_UNLOCK_MASK; +} + +/** + * @brief Disable the clock for specific IP. + * @param clk : Clock to be Disabled. + * @return Nothing + */ +static inline void CLOCK_DisableClock(clock_ip_name_t clk) +{ + uint32_t reg_offset = CLK_GATE_REG_OFFSET(clk); + uint32_t bit_shift = CLK_GATE_BIT_SHIFT(clk); + volatile uint32_t *pClkCtrl = (volatile uint32_t *)((uint32_t)(&(MRCC0->MRCC_GLB_CC0_CLR)) + reg_offset); + + if (clk == kCLOCK_GateNotAvail) + { + return; + } + + /* Unlock clock configuration */ + SYSCON->CLKUNLOCK &= ~SYSCON_CLKUNLOCK_UNLOCK_MASK; + + if (reg_offset == REG_PWM0SUBCTL) + { + SYSCON->PWM0SUBCTL &= ~(1UL << bit_shift); + + if (0U == (SYSCON->PWM0SUBCTL & 0xFU)) + { + MRCC0->MRCC_GLB_CC0_CLR = MRCC_MRCC_GLB_CC0_FLEXPWM0_MASK; + } + } + else if (reg_offset == REG_PWM1SUBCTL) + { + SYSCON->PWM1SUBCTL &= ~(1UL << bit_shift); + + if (0U == (SYSCON->PWM1SUBCTL & 0xFU)) + { + MRCC0->MRCC_GLB_CC0_CLR = MRCC_MRCC_GLB_CC0_FLEXPWM1_MASK; + } + } + else + { + *pClkCtrl = (1UL << bit_shift); + } + + /* Freeze clock configuration */ + SYSCON->CLKUNLOCK |= SYSCON_CLKUNLOCK_UNLOCK_MASK; +} + +/** + * @brief Configure the clock selection muxes. + * @param connection : Clock to be configured. + * @return Nothing + */ +void CLOCK_AttachClk(clock_attach_id_t connection); + +/** + * @brief Get the actual clock attach id. + * This fuction uses the offset in input attach id, then it reads the actual source value in + * the register and combine the offset to obtain an actual attach id. + * @param connection : Clock attach id to get. + * @return Clock source value. + */ +clock_attach_id_t CLOCK_GetClockAttachId(clock_attach_id_t connection); + +/** + * @brief Set the clock select value. + * This fuction set the peripheral clock select value. + * @param sel_name : Clock select. + * @param value : value to be set. + */ +void CLOCK_SetClockSelect(clock_select_name_t sel_name, uint32_t value); + +/** + * @brief Get the clock select value. + * This fuction get the peripheral clock select value. + * @param sel_name : Clock select. + * @return Clock source value. + */ +uint32_t CLOCK_GetClockSelect(clock_select_name_t sel_name); + +/** + * @brief Setup peripheral clock dividers. + * @param div_name : Clock divider name + * @param value : Value to be divided + * @return Nothing + */ +void CLOCK_SetClockDiv(clock_div_name_t div_name, uint32_t value); + +/** + * @brief Get peripheral clock dividers. + * @param div_name : Clock divider name + * @return peripheral clock dividers + */ +uint32_t CLOCK_GetClockDiv(clock_div_name_t div_name); + +/** + * @brief Halt peripheral clock dividers. + * @param div_name : Clock divider name + * @return Nothing + */ +void CLOCK_HaltClockDiv(clock_div_name_t div_name); + +/** + * @brief Initialize the FROHF to given frequency (48,64,96,192). + * This function turns on FIRC and select the given frequency as the source of fro_hf + * @param iFreq : Desired frequency. + * @return returns success or fail status. + */ +status_t CLOCK_SetupFROHFClocking(uint32_t iFreq); + +/** + * @brief Initialize the FRO12M. + * This function turns on FRO12M. + * @return returns success or fail status. + */ +status_t CLOCK_SetupFRO12MClocking(void); + +/** + * @brief Initialize the FRO16K. + * This function turns on FRO16K. + * @param clk_16k_enable_mask: 0-3 + * 0b00: disable both clk_16k0 and clk_16k1 + * 0b01: only enable clk_16k0 + * 0b10: only enable clk_16k1 + * 0b11: enable both clk_16k0 and clk_16k1 + * @return returns success or fail status. + */ +status_t CLOCK_SetupFRO16KClocking(uint8_t clk_16k_enable_mask); + +/** + * @brief Initialize the external osc clock to given frequency. + * @param iFreq : Desired frequency (must be equal to exact rate in Hz) + * @return returns success or fail status. + */ +status_t CLOCK_SetupExtClocking(uint32_t iFreq); + +/** + * @brief Initialize the external reference clock to given frequency. + * @param iFreq : Desired frequency (must be equal to exact rate in Hz) + * @return returns success or fail status. + */ +status_t CLOCK_SetupExtRefClocking(uint32_t iFreq); + +/*! @brief Return Frequency of selected clock + * @return Frequency of selected clock + */ +uint32_t CLOCK_GetFreq(clock_name_t clockName); + +/*! @brief Return Frequency of core + * @return Frequency of the core + */ +uint32_t CLOCK_GetCoreSysClkFreq(void); + +/*! @brief Return Frequency of I3C FCLK + * @return Frequency of I3C FCLK. + */ +uint32_t CLOCK_GetI3CFClkFreq(void); + +/*! @brief Return Frequency of CTimer functional Clock + * @return Frequency of CTimer functional Clock + */ +uint32_t CLOCK_GetCTimerClkFreq(uint32_t id); + +/*! @brief Return Frequency of LPI2C0 functional Clock + * @return Frequency of LPI2C0 functional Clock + */ +uint32_t CLOCK_GetLpi2cClkFreq(uint32_t id); + +/*! @brief Return Frequency of LPSPI functional Clock + * @return Frequency of LPSPI functional Clock + */ +uint32_t CLOCK_GetLpspiClkFreq(uint32_t id); + +/*! @brief Return Frequency of LPUART functional Clock + * @return Frequency of LPUART functional Clock + */ +uint32_t CLOCK_GetLpuartClkFreq(uint32_t id); + +/*! @brief Return Frequency of LPTMR functional Clock + * @return Frequency of LPTMR functional Clock + */ +uint32_t CLOCK_GetLptmrClkFreq(void); + +/*! @brief Return Frequency of OSTIMER + * @return Frequency of OSTIMER Clock + */ +uint32_t CLOCK_GetOstimerClkFreq(void); + +/*! @brief Return Frequency of Adc Clock + * @return Frequency of Adc. + */ +uint32_t CLOCK_GetAdcClkFreq(uint32_t id); + +/*! @brief Return Frequency of Dac Clock + * @return Frequency of Dac. + */ +uint32_t CLOCK_GetDacClkFreq(void); + +/*! @brief Return Frequency of CMP Function Clock + * @return Frequency of CMP Function. + */ +uint32_t CLOCK_GetCmpFClkFreq(uint32_t id); + +/*! @brief Return Frequency of CMP Round Robin Clock + * @return Frequency of CMP Round Robin. + */ +uint32_t CLOCK_GetCmpRRClkFreq(uint32_t id); + +/*! @brief Return Frequency of Trace Clock + * @return Frequency of Trace. + */ +uint32_t CLOCK_GetTraceClkFreq(void); + +/*! @brief Return Frequency of CLKOUT Clock + * @return Frequency of CLKOUT. + */ +uint32_t CLOCK_GetClkoutClkFreq(void); + +/*! @brief Return Frequency of Systick Clock + * @return Frequency of Systick. + */ +uint32_t CLOCK_GetSystickClkFreq(void); + +/*! brief Return Frequency of Systick Clock + * return Frequency of Systick. + */ +uint32_t CLOCK_GetWwdtClkFreq(void); + +/*! @brief Return Frequency of FLEXIO FCLK + * @return Frequency of FLEXIO FCLK. + */ +uint32_t CLOCK_GetFlexioClkFreq(void); + +/*! @brief Return Frequency of FlexCAN FCLK + * @return Frequency of FlexCAN FCLK. + */ +uint32_t CLOCK_GetFlexcanClkFreq(void); + +/** + * @brief Setup FROHF trim. + * @param config : FROHF trim value + * @return returns success or fail status. + */ +status_t CLOCK_FROHFTrimConfig(firc_trim_config_t config); + +/** + * @brief Setup FRO 12M trim. + * @param config : FRO 12M trim value + * @return returns success or fail status. + */ +status_t CLOCK_FRO12MTrimConfig(sirc_trim_config_t config); + +/*! + * @brief Sets the system OSC monitor mode. + * + * This function sets the system OSC monitor mode. The mode can be disabled, + * it can generate an interrupt when the error is disabled, or reset when the error is detected. + * + * @param mode Monitor mode to set. + */ +void CLOCK_SetSysOscMonitorMode(scg_sosc_monitor_mode_t mode); + +/*! brief Enable USB FS clock. + * Enable USB Full Speed clock. + */ +bool CLOCK_EnableUsbfsClock(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @} */ + +#endif /* _FSL_CLOCK_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cmc.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cmc.c new file mode 100644 index 00000000000..4e388d9e73a --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cmc.c @@ -0,0 +1,310 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#include "fsl_cmc.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.mcx_cmc" +#endif + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +static uint32_t g_savedPrimask; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Sets clock mode. + * + * This function configs the amount of clock gating when the core asserts + * Sleeping due to WFI, WFE or SLEEPONEXIT. + * + * param base CMC peripheral base address. + * param mode System clock mode. + */ +void CMC_SetClockMode(CMC_Type *base, cmc_clock_mode_t mode) +{ + uint32_t reg; + + reg = base->CKCTRL; + reg &= ~CMC_CKCTRL_CKMODE_MASK; + reg |= CMC_CKCTRL_CKMODE((mode)); + base->CKCTRL = reg; +} + +/*! + * brief Configures all power mode protection settings. + * + * This function configures the power mode protection settings for + * supported power modes. This should be done before setting the lowPower mode + * for each power doamin. + * + * The allowed lowpower modes are passed as bit map. For example, to allow + * Sleep and DeepSleep, use CMC_SetPowerModeProtection(CMC_base, kCMC_AllowSleepMode|kCMC_AllowDeepSleepMode). + * To allow all low power modes, use CMC_SetPowerModeProtection(CMC_base, kCMC_AllowAllLowPowerModes). + * + * param base CMC peripheral base address. + * param allowedModes Bitmaps of the allowed power modes. + */ +void CMC_SetPowerModeProtection(CMC_Type *base, uint32_t allowedModes) +{ + uint32_t reg; + + reg = base->PMPROT; + reg &= ~0xFUL; + reg |= allowedModes; + + base->PMPROT = reg; +} + +/*! + * brief Configure reset pin. + * + * This function configures reset pin. When enabled, the low power filter is enabled in both + * Active and Low power modes, the reset filter is only enabled in Active mode. When both filers + * are enabled, they operate in series. + * + * param base CMC peripheral base address. + * param config Pointer to the reset pin config structure. + */ +void CMC_ConfigResetPin(CMC_Type *base, const cmc_reset_pin_config_t *config) +{ + assert(config != NULL); + + uint32_t reg = base->RPC; + + if (config->lowpowerFilterEnable) + { + reg |= CMC_RPC_LPFEN_MASK; + } + else + { + reg &= ~CMC_RPC_LPFEN_MASK; + } + if (config->resetFilterEnable) + { + reg |= (CMC_RPC_FILTEN_MASK | CMC_RPC_FILTCFG(config->resetFilterWidth)); + } + else + { + reg &= ~(CMC_RPC_FILTEN_MASK | CMC_RPC_FILTCFG_MASK); + } + base->RPC = reg; +} + +#if (defined(FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG) && FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG) +/*! + * brief Power off the selected system SRAM always. + * + * This function powers off the selected system SRAM always. The SRAM arrays should + * not be accessed while they are shut down. SRAM array contents are not retained + * if they are powered off. + * + * param base CMC peripheral base address. + * param mask Bitmap of the SRAM arrays to be powered off all modes. + */ +void CMC_PowerOffSRAMAllMode(CMC_Type *base, uint32_t mask) +{ + uint32_t reg = base->SRAMDIS[0]; + uint32_t maskToSet = mask & ((uint32_t)kCMC_AllSramArrays); + + reg &= ~((uint32_t)kCMC_AllSramArrays); + reg |= CMC_SRAMDIS_DIS(maskToSet); + base->SRAMDIS[0] = reg; +} + +/*! + * brief Power off the selected system SRAm during low power mode only. + * + * This function powers off the selected system SRAM only during low power mode. + * SRAM array contents are not retained if they are power off. + * + * param base CMC peripheral base address. + * param mask Bitmap of the SRAM arrays to be power off during low power mode only. + */ +void CMC_PowerOffSRAMLowPowerOnly(CMC_Type *base, uint32_t mask) +{ + uint32_t reg = base->SRAMRET[0]; + uint32_t maskToSet = mask & ((uint32_t)kCMC_AllSramArrays); + + reg &= ~((uint32_t)kCMC_AllSramArrays); + reg |= CMC_SRAMRET_RET(maskToSet); + base->SRAMRET[0] = reg; +} +#endif /* FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG */ + +#if (defined(FSL_FEATURE_MCX_CMC_HAS_NO_FLASHCR_WAKE) && FSL_FEATURE_MCX_CMC_HAS_NO_FLASHCR_WAKE) +/*! + * brief Configs the low power mode of the on-chip flash memory. + * + * This function configs the low power mode of the on-chip flash memory. + * + * param base CMC peripheral base address. + * param doze true: Flash is disabled while core is sleeping + * false: No effect. + * param disable true: Flash memory is placed in low power state. + * false: No effect. + */ +void CMC_ConfigFlashMode(CMC_Type *base, bool doze, bool disable) +{ + uint32_t reg = 0UL; + + reg |= (disable ? CMC_FLASHCR_FLASHDIS(1U) : CMC_FLASHCR_FLASHDIS(0U)) | + (doze ? CMC_FLASHCR_FLASHDOZE(1U) : CMC_FLASHCR_FLASHDOZE(0U)); + base->FLASHCR = reg; +} +#else +/*! + * brief Configs the low power mode of the on-chip flash memory. + * + * This function config the low power mode of the on-chip flash memory. + * + * param base CMC peripheral base address. + * param wake + * true - Flash will exit low power state during the flash memory accesses. + * false - No effect. + * param doze + * true - Flash is disabled while core is sleeping + * false - No effect. + * param disable + * true - Flash memory is placed in low power state. + * false - No effect. + */ +void CMC_ConfigFlashMode(CMC_Type *base, bool wake, bool doze, bool disable) +{ + uint32_t reg = 0UL; + + reg |= (disable ? CMC_FLASHCR_FLASHDIS(1U) : CMC_FLASHCR_FLASHDIS(0U)) | + (doze ? CMC_FLASHCR_FLASHDOZE(1U) : CMC_FLASHCR_FLASHDOZE(0U)) | + (wake ? CMC_FLASHCR_FLASHWAKE(1U) : CMC_FLASHCR_FLASHWAKE(0U)); + base->FLASHCR = reg; +} +#endif /* FSL_FEATURE_MCX_CMC_HAS_NO_FLASHCR_WAKE */ + +/*! + * brief Prepares to enter stop modes. + * + * This function should be called before entering low power modes. + * + */ +void CMC_PreEnterLowPowerMode(void) +{ + g_savedPrimask = DisableGlobalIRQ(); + __ISB(); +} + +/*! + * brief Recovers after wake up from stop modes. + * + * This function should be called after waking up from low power modes. + * This function should be used with CMC_PreEnterLowPowerMode() + * + */ +void CMC_PostExitLowPowerMode(void) +{ + EnableGlobalIRQ(g_savedPrimask); + __ISB(); +} + +/*! + * brief Configs the entry into the same low power mode for each power domains. + * + * This function provides the feature to entry into the same low power mode for each power + * domains. Before invoking this function, please ensure the selected power mode have been allowed. + * + * param base CMC peripheral base address. + * param lowPowerMode The low power mode to be entered. See @ref cmc_low_power_mode_t for the details. + * + */ +void CMC_GlobalEnterLowPowerMode(CMC_Type *base, cmc_low_power_mode_t lowPowerMode) +{ + /* Note: unlock the CKCTRL register if this API will be reinvoked later. */ + CMC_SetClockMode(base, kCMC_GateAllSystemClocksEnterLowPowerMode); + CMC_SetGlobalPowerMode(base, lowPowerMode); + /* Before executing WFI instruction read back the last register to + * ensure all registers writes have completed. */ + (void)base->GPMCTRL; + /* Set the core into DeepSleep mode. */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + __DSB(); + __WFI(); + __ISB(); +} + +/*! + * brief Configs the entry into different low power modes for each of the power domains. + * + * This function provides the feature to entry into different low power modes for + * each power domains. Before invoking this function please ensure the selected + * modes are allowed. + * + * param base CMC peripheral base address. + * param base config Pointer to the cmc_power_domain_config_t structure. + */ +void CMC_EnterLowPowerMode(CMC_Type *base, const cmc_power_domain_config_t *config) +{ + assert(config != NULL); + +#if (CMC_PMCTRL_COUNT > 1U) + /* The WAKE domain must never be configured to a lower power mode compared with main power mode. */ + assert(config->wake_domain <= config->main_domain); +#endif /* (CMC_PMCTRL_COUNT > 1U) */ + + if (config->clock_mode < kCMC_GateAllSystemClocksEnterLowPowerMode) + { + /* In This case the power domain doesn't need to be placed in low power state. */ + /* Note: unlock the register if this API will be reinvoked later. */ + CMC_SetClockMode(base, config->clock_mode); + + CMC_SetMAINPowerMode(base, kCMC_ActiveOrSleepMode); +#if (CMC_PMCTRL_COUNT > 1U) + CMC_SetWAKEPowerMode(base, kCMC_ActiveOrSleepMode); +#endif /* (CMC_PMCTRL_COUNT > 1U) */ + + /* Before executing WFI instruction read back the last register to + * ensure all registers writes have completed. */ + (void)base->CKCTRL; + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + __DSB(); + __WFI(); + __ISB(); + } + else + { + /* Note: unlock the register if this API will be reinvoked later. */ + CMC_SetClockMode(base, kCMC_GateAllSystemClocksEnterLowPowerMode); + CMC_SetMAINPowerMode(base, config->main_domain); +#if (CMC_PMCTRL_COUNT > 1U) + CMC_SetWAKEPowerMode(base, config->wake_domain); +#endif /* (CMC_PMCTRL_COUNT > 1U) */ + + /* Before execute WFI instruction read back the last register to + * ensure all registers writes have completed. */ +#if (CMC_PMCTRL_COUNT > 1U) + if ((CMC_GetWAKEPowerMode(base) == config->wake_domain) && (CMC_GetMAINPowerMode(base) == config->main_domain)) + { +#endif /* (CMC_PMCTRL_COUNT > 1U) */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + __DSB(); + __WFI(); + __ISB(); +#if (CMC_PMCTRL_COUNT > 1U) + } +#endif /* (CMC_PMCTRL_COUNT > 1U) */ + } +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cmc.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cmc.h new file mode 100644 index 00000000000..6dbe8e974bd --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_cmc.h @@ -0,0 +1,929 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_CMC_H_ +#define FSL_CMC_H_ +#include "fsl_common.h" + +/*! + * @addtogroup mcx_cmc + * @{ + */ +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @name Driver version */ +/*@{*/ +/*! @brief CMC driver version 2.2.2. */ +#define FSL_CMC_DRIVER_VERSION (MAKE_VERSION(2, 2, 2)) +/* @} */ + +/*! + * @brief CMC power mode Protection enumeration. + */ +enum _cmc_power_mode_protection +{ + kCMC_AllowDeepSleepMode = 0x1UL, /*!< Allow Deep Sleep mode. */ + kCMC_AllowPowerDownMode = 0x2UL, /*!< Allow Power Down mode. */ + kCMC_AllowDeepPowerDownMode = 0x8UL, /*!< Allow Deep Power Down mode. */ + kCMC_AllowAllLowPowerModes = 0xFUL, /*!< Allow Deep Sleep, Power Down, Deep Power Down modes. */ +}; + +/*! + * @brief Wake up sources from the previous low power mode entry. + * + * @note #kCMC_WakeupFromUsbFs, #kCMC_WakeupFromITRC, #kCMC_WakeupFromCpu1 are not supported in MCXA family. + */ +enum _cmc_wakeup_sources +{ + kCMC_WakeupFromResetInterruptOrPowerDown = + CMC_CKSTAT_WAKEUP(1U << 0U), /*!< Wakeup source is reset interrupt, or wake up from Deep Power Down. */ + kCMC_WakeupFromDebugReuqest = CMC_CKSTAT_WAKEUP(1U << 1U), /*!< Wakeup source is debug request. */ + kCMC_WakeupFromInterrupt = CMC_CKSTAT_WAKEUP(1U << 2U), /*!< Wakeup source is interrupt. */ + kCMC_WakeupFromDMAWakeup = CMC_CKSTAT_WAKEUP(1U << 3U), /*!< Wakeup source is DMA Wakeup. */ + kCMC_WakeupFromWUURequest = CMC_CKSTAT_WAKEUP(1U << 4U), /*!< Wakeup source is WUU request. */ + kCMC_WakeupFromUsbFs = CMC_CKSTAT_WAKEUP(1U << 5U), /*!< Wakeup source is USBFS(USB0). */ + kCMC_WakeupFromITRC = CMC_CKSTAT_WAKEUP(1U << 6U), /*!< Wakeup source is ITRC. */ + kCMC_WakeupFromCpu1 = CMC_CKSTAT_WAKEUP(1U << 7U), /*!< Wakeup source is CPU1. */ +}; + +/*! + * @brief System Reset Interrupt enable enumeration. + */ +enum _cmc_system_reset_interrupt_enable +{ + kCMC_PinResetInterruptEnable = CMC_SRIE_PIN_MASK, /*!< Pin Reset interrupt enable. */ + kCMC_DAPResetInterruptEnable = CMC_SRIE_DAP_MASK, /*!< DAP Reset interrupt enable. */ + kCMC_LowPowerAcknowledgeTimeoutResetInterruptEnable = CMC_SRIE_LPACK_MASK, /*!< Low Power Acknowledge Timeout + Reset interrupt enable. */ + kCMC_WindowedWatchdog0ResetInterruptEnable = CMC_SRIE_WWDT0_MASK, /*!< Windowed Watchdog 0 reset + interrupt enable. */ + kCMC_SoftwareResetInterruptEnable = CMC_SRIE_SW_MASK, /*!< Software Reset interrupt enable. */ + kCMC_LockupResetInterruptEnable = CMC_SRIE_LOCKUP_MASK, /*!< Lockup Reset interrupt enable. */ +#if defined(CMC_SRIE_CPU1_MASK) + kCMC_Cpu1ResetInterruptEnable = CMC_SRIE_CPU1_MASK, /*!< CPU1 Reset interrupt enable. */ +#endif /* CMC_SRIE_CPU1_MASK */ +#if defined(CMC_SRIE_ADVC_MASK) + kCMC_AdvcResetInterruptEnable = CMC_SRIE_ADVC_MASK, /*!< ADVC Reset interrupt enable. */ +#endif /* CMC_SRIE_ADVC_MASK */ +#if defined(CMC_SRIE_VBAT_MASK) + kCMC_VBATResetInterruptEnable = CMC_SRIE_VBAT_MASK, /*!< VBAT reset interrupt enable. */ +#endif /* CMC_SRIE_VBAT_MASK */ +#if defined(CMC_SRIE_WWDT1_MASK) + kCMC_WindowedWatchdog1ResetInterruptEnable = CMC_SRIE_WWDT1_MASK, /*!< Windowed Watchdog 1 reset + interrupt enable. */ +#endif /* CMC_SRIE_WWDT1_MASK */ + kCMC_CodeWatchDog0ResetInterruptEnable = CMC_SRIE_CDOG0_MASK, /*!< Code watchdog 0 reset interrupt enable. */ +#if defined(CMC_SRIE_CDOG1_MASK) + kCMC_CodeWatchDog1ResetInterruptEnable = CMC_SRIE_CDOG1_MASK, /*!< Code watchdog 1 reset interrupt enable. */ +#endif /* CMC_SRIE_CDOG1_MASK */ +}; + +/*! + * @brief CMC System Reset Interrupt Status flag. + */ +enum _cmc_system_reset_interrupt_flag +{ + kCMC_PinResetInterruptFlag = CMC_SRIF_PIN_MASK, /*!< Pin Reset interrupt flag. */ + kCMC_DAPResetInterruptFlag = CMC_SRIF_DAP_MASK, /*!< DAP Reset interrupt flag. */ + kCMC_LowPowerAcknowledgeTimeoutResetFlag = CMC_SRIF_LPACK_MASK, /*!< Low Power Acknowledge + Timeout Reset interrupt flag. */ + kCMC_WindowedWatchdog0ResetInterruptFlag = CMC_SRIF_WWDT0_MASK, /*!< Windowned Watchdog 0 Reset interrupt flag. */ + kCMC_SoftwareResetInterruptFlag = CMC_SRIF_SW_MASK, /*!< Software Reset interrupt flag. */ + kCMC_LockupResetInterruptFlag = CMC_SRIF_LOCKUP_MASK, /*!< Lock up Reset interrupt flag. */ +#if defined(CMC_SRIF_CPU1_MASK) + kCMC_Cpu1ResetInterruptFlag = CMC_SRIF_CPU1_MASK, /*!< CPU1 Reset interrupt flag. */ +#endif /* CMC_SRIF_CPU1_MASK */ +#if defined(CMC_SRIF_ADVC_MASK) + kCMC_AdvcResetInterruptFlag = CMC_SRIF_ADVC_MASK, /*!< ADVC Reset interrupt flag. */ +#endif /* CMC_SRIF_ADVC_MASK */ +#if defined(CMC_SRIF_VBAT_MASK) + kCMC_VbatResetInterruptFlag = CMC_SRIF_VBAT_MASK, /*!< VBAT system reset interrupt flag. */ +#endif /* CMC_SRIF_VBAT_MASK */ +#if defined(CMC_SRIF_WWDT1_MASK) + kCMC_WindowedWatchdog1ResetInterruptFlag = CMC_SRIF_WWDT1_MASK, /*!< Windowned Watchdog 1 Reset interrupt flag. */ +#endif /* CMC_SRIF_WWDT1_MASK */ + kCMC_CodeWatchdog0ResetInterruptFlag = CMC_SRIF_CDOG0_MASK, /*!< Code watchdog0 reset interrupt flag. */ +#if defined(CMC_SRIF_CDOG1_MASK) + kCMC_CodeWatchdog1ResetInterruptFlag = CMC_SRIF_CDOG1_MASK, /*!< Code watchdog1 reset interrupt flag. */ +#endif /* CMC_SRIF_CDOG1_MASK */ +}; + +#if (defined(FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG) && FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG) +/*! + * @brief CMC System SRAM arrays low power mode enable enumeration. + */ +enum _cmc_system_sram_arrays +{ + kCMC_RAMX0 = 1UL << 0UL, /*!< Used to control RAMX0. */ + kCMC_RAMX1 = 1UL << 1UL, /*!< Used to control RAMX1. */ + kCMC_RAMX2 = 1UL << 2UL, /*!< Used to control RAMX2. */ + kCMC_RAMB = 1UL << 3UL, /*!< Used to control RAMB. */ + kCMC_RAMC0 = 1UL << 4UL, /*!< Used to control RAMC0. */ + kCMC_RAMC1 = 1UL << 5UL, /*!< Used to control RAMC1. */ + kCMC_RAMD0 = 1UL << 6UL, /*!< Used to control RAMD0. */ + kCMC_RAMD1 = 1UL << 7UL, /*!< Used to control RAMD1. */ + kCMC_RAME0 = 1UL << 8UL, /*!< Used to control RAME0. */ + kCMC_RAME1 = 1UL << 9UL, /*!< Used to control RAME1. */ + kCMC_RAMF0 = 1UL << 10UL, /*!< Used to control RAMF0. */ + kCMC_RAMF1 = 1UL << 11UL, /*!< Used to control RAMF1. */ + kCMC_RAMG0_RAMG1 = 1UL << 12UL, /*!< Used to control RAMG0 and RAMG1. */ + kCMC_RAMG2_RAMG3 = 1UL << 13UL, /*!< Used to control RAMG2 and RAMG3. */ + kCMC_RAMH0_RAMH1 = 1UL << 14UL, /*!< Used to control RAMH0 and RAMH1. */ + kCMC_LPCAC = 1UL << 24UL, /*!< Used to control LPCAC. */ + kCMC_DMA0_DMA1_PKC = 1UL << 25UL, /*!< Used to control DMA0, DMA1 and PKC. */ + kCMC_USB0 = 1UL << 26UL, /*!< Used to control USB0. */ + kCMC_PQ = 1UL << 27UL, /*!< Used to control PQ. */ + kCMC_CAN0_CAN1_ENET_USB1 = 1UL << 28UL, /*!< Used to control CAN0, CAN1, ENET, USB1. */ + kCMC_FlexSPI = 1UL << 29UL, /*!< Used to control FlexSPI. */ + + kCMC_AllSramArrays = (kCMC_RAMX0 | kCMC_RAMX1 | kCMC_RAMX2 | kCMC_RAMB | kCMC_RAMC0 | kCMC_RAMC1 | kCMC_RAMD0 | + kCMC_RAMD1 | kCMC_RAME0 | kCMC_RAME1 | kCMC_RAMF0 | kCMC_RAMF1 | kCMC_RAMG0_RAMG1 | + kCMC_RAMG2_RAMG3 | kCMC_RAMH0_RAMH1 | kCMC_LPCAC | kCMC_DMA0_DMA1_PKC | kCMC_USB0 | kCMC_PQ | + kCMC_CAN0_CAN1_ENET_USB1 | kCMC_FlexSPI), /*!< Mask of all System SRAM arrays. */ +}; +#endif /* FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG */ + +/*! + * @brief System reset sources enumeration. + */ +enum _cmc_system_reset_sources +{ + kCMC_WakeUpReset = CMC_SRS_WAKEUP_MASK, /*!< The reset caused by a wakeup from Power Down or + Deep Power Down mode. */ + kCMC_PORReset = CMC_SRS_POR_MASK, /*!< The reset caused by power on reset detection logic. */ + kCMC_VDReset = CMC_SRS_VD_MASK, /*!< The reset caused by an LVD or HVD. */ + kCMC_WarmReset = CMC_SRS_WARM_MASK, /*!< The last reset source is a warm reset source. */ + kCMC_FatalReset = CMC_SRS_FATAL_MASK, /*!< The last reset source is a fatal reset source. */ + kCMC_PinReset = CMC_SRS_PIN_MASK, /*!< The reset caused by the RESET_b pin. */ + kCMC_DAPReset = CMC_SRS_DAP_MASK, /*!< The reset caused by a reset request from the Debug Access port. */ + kCMC_ResetTimeout = CMC_SRS_RSTACK_MASK, /*!< The reset caused by a timeout or other error condition in the system + reset generation. */ + kCMC_LowPowerAcknowledgeTimeoutReset = CMC_SRS_LPACK_MASK, /*!< The reset caused by a timeout in + low power mode entry logic. */ + kCMC_SCGReset = CMC_SRS_SCG_MASK, /*!< The reset caused by a loss of clock or loss of lock event in the SCG. */ + kCMC_WindowedWatchdog0Reset = CMC_SRS_WWDT0_MASK, /*!< The reset caused by the Windowed WatchDog 0 timeout. */ + kCMC_SoftwareReset = CMC_SRS_SW_MASK, /*!< The reset caused by a software reset request. */ + kCMC_LockUoReset = CMC_SRS_LOCKUP_MASK, /*!< The reset caused by the ARM core indication of a LOCKUP event. */ +#if defined(CMC_SRS_CPU1_MASK) + kCMC_Cpu1Reset = CMC_SRS_CPU1_MASK, /*!< The reset caused by a CPU1 system reset. */ +#endif /* CMC_SRS_CPU1_MASK */ +#if defined(CMC_SRS_ADVC_MASK) + kCMC_AdvcReset = CMC_SRS_ADVC_MASK, /*!< The reset caused by ADVC critical reset. */ +#endif /* CMC_SRS_ADVC_MASK */ +#if defined(CMC_SRS_VBAT_MASK) + kCMC_VbatReset = CMC_SRS_VBAT_MASK, /*!< The reset caused by a VBAT POR. */ +#endif /* CMC_SRS_VBAT_MASK */ +#if defined(CMC_SRS_WWDT1_MASK) + kCMC_WindowedWatchdog1Reset = CMC_SRS_WWDT1_MASK, /*!< The reset caused by the Windowed WatchDog 1 timeout. */ +#endif /* CMC_SRS_WWDT1_MASK */ + kCMC_CodeWatchDog0Reset = CMC_SRS_CDOG0_MASK, /*!< The reset caused by the code watchdog0 fault. */ +#if defined(CMC_SRS_CDOG1_MASK) + kCMC_CodeWatchDog1Reset = CMC_SRS_CDOG1_MASK, /*!< The reset caused by the code watchdog1 fault. */ +#endif /* CMC_SRS_CDOG1_MASK */ + kCMC_JTAGSystemReset = CMC_SRS_JTAG_MASK, /*!< The reset caused by a JTAG system reset request. */ +#if defined(CMC_SRS_SECVIO_MASK) + kCMC_SecurityViolationReset = CMC_SRS_SECVIO_MASK, /*!< The reset caused by a Security Violation logic. */ +#endif /* CMC_SRS_SECVIO_MASK */ +#if defined(CMC_SRS_TAMPER_MASK) + kCMC_TapmerReset = CMC_SRS_TAMPER_MASK, /*!< The reset caused by the tamper detection logic. */ +#endif /* CMC_SRS_TAMPER_MASK */ +}; + +/*! + * @brief Indicate the core clock was gated. + */ +typedef enum _cmc_core_clock_gate_status +{ + kCMC_CoreClockNotGated = 0U, /*!< Core clock not gated. */ + kCMC_CoreClockGated = 1U /*!< Core clock was gated due to low power mode entry. */ +} cmc_core_clock_gate_status_t; + +/*! + * @brief CMC clock mode enumeration. + */ +typedef enum _cmc_clock_mode +{ + kCMC_GateNoneClock = 0x00U, /*!< No clock gating. */ + kCMC_GateCoreClock = 0x01U, /*!< Gate Core clock. */ + kCMC_GateCorePlatformClock = 0x03U, /*!< Gate Core clock and platform clock. */ + kCMC_GateAllSystemClocks = 0x07U, /*!< Gate all System clocks, without getting core entering into low power mode. */ + kCMC_GateAllSystemClocksEnterLowPowerMode = 0x0FU /*!< Gate all System clocks, with core + entering into low power mode. */ +} cmc_clock_mode_t; + +/*! + * @brief CMC power mode enumeration. + */ +typedef enum _cmc_low_power_mode +{ + kCMC_ActiveOrSleepMode = 0x0U, /*!< Select Active/Sleep mode. */ + kCMC_DeepSleepMode = 0x1U, /*!< Select Deep Sleep mode when a core executes WFI or WFE instruction. */ + kCMC_PowerDownMode = 0x3U, /*!< Select Power Down mode when a core executes WFI or WFE instruction. */ + kCMC_DeepPowerDown = 0xFU, /*!< Select Deep Power Down mode when a core executes WFI or WFE instruction. */ +} cmc_low_power_mode_t; + +/*! + * @brief CMC reset pin configuration. + */ +typedef struct _cmc_reset_pin_config +{ + bool lowpowerFilterEnable; /*!< Low Power Filter enable. */ + bool resetFilterEnable; /*!< Reset Filter enable. */ + uint8_t resetFilterWidth; /*!< Width of the Reset Filter. */ +} cmc_reset_pin_config_t; + +/*! + * @brief power mode configuration for each power domain. + */ +typedef struct _cmc_power_domain_config +{ + cmc_clock_mode_t clock_mode; /*!< Clock mode for each power domain. */ + cmc_low_power_mode_t main_domain; /*!< The low power mode of the MAIN power domain. */ +#if (CMC_PMCTRL_COUNT > 1U) + cmc_low_power_mode_t wake_domain; /*!< The low power mode of the WAKE power domain. */ +#endif /* (CMC_PMCTRL_COUNT > 1U) */ +} cmc_power_domain_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*! + * @name CLOCK mode configuration. + * @{ + */ + +/*! + * @brief Sets clock mode. + * + * This function configs the amount of clock gating when the core asserts + * Sleeping due to WFI, WFE or SLEEPONEXIT. + * + * @param base CMC peripheral base address. + * @param mode System clock mode. + */ +void CMC_SetClockMode(CMC_Type *base, cmc_clock_mode_t mode); + +/*! + * @brief Locks the clock mode setting. + * + * After invoking this function, any clock mode setting will be blocked. + * + * @param base CMC peripheral base address. + */ +static inline void CMC_LockClockModeSetting(CMC_Type *base) +{ + base->CKCTRL |= CMC_CKCTRL_LOCK_MASK; +} + +/* @} */ + +/*! + * @name Gets/Clears the Clock Mode, the wake up source, the Reset source. + * @{ + */ + +/*! + * @brief Gets the core clock gated status. + * + * This function get the status to indicate whether the core clock is gated. + * The core clock gated status can be cleared by software. + * + * @param base CMC peripheral base address. + * @return The status to indicate whether the core clock is gated. + */ +static inline cmc_core_clock_gate_status_t CMC_GetCoreClockGatedStatus(CMC_Type *base) +{ + return (cmc_core_clock_gate_status_t)(uint32_t)((base->CKSTAT & CMC_CKSTAT_VALID_MASK) >> CMC_CKSTAT_VALID_SHIFT); +} + +/*! + * @brief Clears the core clock gated status. + * + * This function clear clock status flag by software. + * + * @param base CMC peripheral base address. + */ +static inline void CMC_ClearCoreClockGatedStatus(CMC_Type *base) +{ + base->CKSTAT |= CMC_CKSTAT_VALID_MASK; +} + +/*! + * @brief Gets the Wakeup Source. + * + * This function gets the Wakeup sources from the previous low power mode entry. + * + * @param base CMC peripheral base address. + * @return The Wakeup sources from the previous low power mode entry. See @ref _cmc_wakeup_sources for details. + */ +static inline uint8_t CMC_GetWakeupSource(CMC_Type *base) +{ + return ((uint8_t)((base->CKSTAT & CMC_CKSTAT_WAKEUP_MASK) >> CMC_CKSTAT_WAKEUP_SHIFT)); +} + +/*! + * @brief Gets the Clock mode. + * + * This function gets the clock mode of the previous low power mode entry. + * + * @param base CMC peripheral base address. + * @return The Low Power status. + */ +static inline cmc_clock_mode_t CMC_GetClockMode(CMC_Type *base) +{ + return (cmc_clock_mode_t)(uint32_t)((base->CKSTAT & CMC_CKSTAT_CKMODE_MASK) >> CMC_CKSTAT_CKMODE_SHIFT); +} + +/*! + * @brief Gets the System reset status. + * + * This function returns the system reset status. Those status + * updates on every MAIN Warm Reset to indicate the type/source + * of the most recent reset. + * + * @param base CMC peripheral base address. + * @return The most recent system reset status. See @ref _cmc_system_reset_sources for details. + */ +static inline uint32_t CMC_GetSystemResetStatus(CMC_Type *base) +{ + return base->SRS; +} + +/*! + * @brief Gets the sticky system reset status since the last WAKE Cold Reset. + * + * This function gets all source of system reset that have generated a + * system reset since the last WAKE Cold Reset, and that have not been + * cleared by software. + * + * @param base CMC peripheral base address. + * @return System reset status that have not been cleared by software. See @ref _cmc_system_reset_sources for details. + */ +static inline uint32_t CMC_GetStickySystemResetStatus(CMC_Type *base) +{ + return base->SSRS; +} + +/*! + * @brief Clears the sticky system reset status flags. + * + * @param base CMC peripheral base address. + * @param mask Bitmap of the sticky system reset status to be cleared. + */ +static inline void CMC_ClearStickySystemResetStatus(CMC_Type *base, uint32_t mask) +{ + base->SSRS = mask; +} + +#if (defined(FSL_FEATURE_MCX_CMC_HAS_RSTCNT_REG) && FSL_FEATURE_MCX_CMC_HAS_RSTCNT_REG) +/*! + * @brief Gets the number of reset sequences completed since the last Cold Reset. + * + * @param base CMC peripheral base address. + * @return The number of reset sequences. + */ +static inline uint8_t CMC_GetResetCount(CMC_Type *base) +{ + return (uint8_t)(base->RSTCNT & CMC_RSTCNT_COUNT_MASK); +} +#endif /* FSL_FEATURE_MCX_CMC_HAS_RSTCNT_REG */ + +/* @} */ + +/*! + * @name Power mode configuration. + * @{ + */ + +/*! + * @brief Configures all power mode protection settings. + * + * This function configures the power mode protection settings for + * supported power modes. This should be done before set the lowPower mode + * for each power doamin. + * + * The allowed lowpower modes are passed as bit map. For example, to allow + * Sleep and DeepSleep, use CMC_SetPowerModeProtection(CMC_base, kCMC_AllowSleepMode|kCMC_AllowDeepSleepMode). + * To allow all low power modes, use CMC_SetPowerModeProtection(CMC_base, kCMC_AllowAllLowPowerModes). + * + * @param base CMC peripheral base address. + * @param allowedModes Bitmaps of the allowed power modes. See @ref _cmc_power_mode_protection for details. + */ +void CMC_SetPowerModeProtection(CMC_Type *base, uint32_t allowedModes); + +/*! + * @brief Locks the power mode protection. + * + * This function locks the power mode protection. After invoking this function, + * any power mode protection setting will be ignored. + * + * @param base CMC peripheral base address. + */ +static inline void CMC_LockPowerModeProtectionSetting(CMC_Type *base) +{ + base->PMPROT |= CMC_PMPROT_LOCK_MASK; +} + +/*! + * @brief Config the same lowPower mode for all power domain. + * + * This function configures the same low power mode for MAIN power domian and WAKE power domain. + * + * @param base CMC peripheral base address. + * @param lowPowerMode The desired lowPower mode. See @ref cmc_low_power_mode_t for details. + */ +static inline void CMC_SetGlobalPowerMode(CMC_Type *base, cmc_low_power_mode_t lowPowerMode) +{ + base->GPMCTRL = CMC_GPMCTRL_LPMODE((uint8_t)lowPowerMode); +} + +/*! + * @brief Configures entry into low power mode for the MAIN Power domain. + * + * This function configures the low power mode for the MAIN power domian, + * when the core executes WFI/WFE instruction. The available lowPower modes + * are defined in the @ref cmc_low_power_mode_t. + * + * @param base CMC peripheral base address. + * @param lowPowerMode The desired lowPower mode. See @ref cmc_low_power_mode_t for details. + * + */ +static inline void CMC_SetMAINPowerMode(CMC_Type *base, cmc_low_power_mode_t lowPowerMode) +{ + base->PMCTRL[0] = CMC_PMCTRL_LPMODE((uint8_t)lowPowerMode); +} + +/*! + * @brief Gets the power mode of the MAIN Power domain. + * + * @param base CMC peripheral base address. + * @return The power mode of MAIN Power domain. See @ref cmc_low_power_mode_t for details. + */ +static inline cmc_low_power_mode_t CMC_GetMAINPowerMode(CMC_Type *base) +{ + return (cmc_low_power_mode_t)(uint32_t)(base->PMCTRL[0] & CMC_PMCTRL_LPMODE_MASK); +} + +#if (CMC_PMCTRL_COUNT > 1U) +/*! + * @brief Configure entry into low power mode for the WAKE Power domain. + * + * This function configures the low power mode for the WAKE power domian, + * when the core executes WFI/WFE instruction. The available lowPower mode + * are defined in the @ref cmc_low_power_mode_t. + * + * @note The lowPower Mode for the WAKE domain must not be configured to a + * lower power mode than any other power domain. + * + * @param base CMC peripheral base address. + * @param lowPowerMode The desired lowPower mode. See @ref cmc_low_power_mode_t for details. + * + */ +static inline void CMC_SetWAKEPowerMode(CMC_Type *base, cmc_low_power_mode_t lowPowerMode) +{ + base->PMCTRL[1] = CMC_PMCTRL_LPMODE((uint8_t)lowPowerMode); +} + +/*! + * @brief Gets the power mode of the WAKE Power domain. + * + * @param base CMC peripheral base address. + * @return The power mode of WAKE Power domain. See @ref cmc_low_power_mode_t for details. + */ +static inline cmc_low_power_mode_t CMC_GetWAKEPowerMode(CMC_Type *base) +{ + return (cmc_low_power_mode_t)(uint32_t)(base->PMCTRL[1] & CMC_PMCTRL_LPMODE_MASK); +} +#endif /* CMC_PMCTRL_COUNT > 1U */ + +/* @} */ + +/*! + * @name Reset Pin configuration. + * @{ + */ + +/*! + * @brief Configure reset pin. + * + * This function configures reset pin. When enabled, the low power filter is enabled in both + * Active and Low power modes, the reset filter is only enabled in Active mode. When both filers + * are enabled, they operate in series. + * + * @param base CMC peripheral base address. + * @param config Pointer to the reset pin config structure. + */ +void CMC_ConfigResetPin(CMC_Type *base, const cmc_reset_pin_config_t *config); + +/* @} */ + +/*! + * @name System Reset Interrupts. + * @{ + */ + +/*! + * @brief Enable system reset interrupts. + * + * This function enables the system reset interrupts. The assertion of + * non-fatal warm reset can be delayed for 258 cycles of the 32K_CLK clock + * while an enabled interrupt is generated. Then Software can perform a graceful + * shutdown or abort the non-fatal warm reset provided the pending reset source is cleared + * by resetting the reset source and then clearing the pending flag. + * + * @param base CMC peripheral base address. + * @param mask System reset interrupts. See @ref _cmc_system_reset_interrupt_enable for details. + * + */ +static inline void CMC_EnableSystemResetInterrupt(CMC_Type *base, uint32_t mask) +{ + base->SRIE |= mask; +} + +/*! + * @brief Disable system reset interrupts. + * + * This function disables the system reset interrupts. + * + * @param base CMC peripheral base address. + * @param mask System reset interrupts. See @ref _cmc_system_reset_interrupt_enable for details. + */ +static inline void CMC_DisableSystemResetInterrupt(CMC_Type *base, uint32_t mask) +{ + base->SRIE &= (uint32_t)(~mask); +} + +/*! + * @brief Gets System Reset interrupt flags. + * + * This function returns the System reset interrupt flags. + * + * @param base CMC peripheral base address. + * @return System reset interrupt flags. See @ref _cmc_system_reset_interrupt_flag for details. + */ +static inline uint32_t CMC_GetSystemResetInterruptFlags(CMC_Type *base) +{ + return base->SRIF; +} + +/*! + * @brief Clears System Reset interrupt flags. + * + * This function clears system reset interrupt flags. The pending reset source + * can be cleared by resetting the source of the reset and then clearing the pending + * flags. + * + * @param base CMC peripheral base address. + * @param mask System Reset interrupt flags. See @ref _cmc_system_reset_interrupt_flag for details. + * + */ +static inline void CMC_ClearSystemResetInterruptFlags(CMC_Type *base, uint32_t mask) +{ + base->SRIF = mask; +} + +/* @} */ + +/*! + * @name Non Maskable Pin interrupt. + * @{ + */ + +/*! + * @brief Enable/Disable Non maskable Pin interrupt. + * + * @param base CMC peripheral base address. + * @param enable Enable or disable Non maskable pin interrupt. + * true - enable Non-maskable pin interrupt. + * false - disable Non-maskable pin interupt. + */ +static inline void CMC_EnableNonMaskablePinInterrupt(CMC_Type *base, bool enable) +{ + if (enable) + { + base->CORECTL |= CMC_CORECTL_NPIE_MASK; + } + else + { + base->CORECTL &= ~CMC_CORECTL_NPIE_MASK; + } +} + +/* @} */ + +/*! + * @name Boot Configuration. + * @{ + */ + +/*! + * @brief Gets the logic state of the ISPMODE_n pin. + * + * This function returns the logic state of the ISPMODE_n pin + * on the last negation of RESET_b pin. + * + * @param base CMC peripheral base address. + * @return The logic state of the ISPMODE_n pin on the last negation of RESET_b pin. + */ +static inline uint8_t CMC_GetISPMODEPinLogic(CMC_Type *base) +{ + return (uint8_t)((base->MR[0] & CMC_MR_ISPMODE_n_MASK) >> CMC_MR_ISPMODE_n_SHIFT); +} + +/*! + * @brief Clears ISPMODE_n pin state. + * + * @param base CMC peripheral base address. + */ +static inline void CMC_ClearISPMODEPinLogic(CMC_Type *base) +{ + base->MR[0] = CMC_MR_ISPMODE_n_MASK; +} + +/*! + * @brief Set the logic state of the BOOT_CONFIGn pin. + * + * This function force the logic state of the Boot_Confign pin to assert + * on next system reset. + * + * @param base CMC peripheral base address. + * @param assert Assert the corresponding pin or not. + * true - Assert corresponding pin on next system reset. + * false - No effect. + */ +static inline void CMC_ForceBootConfiguration(CMC_Type *base, bool assert) +{ + if (assert) + { + base->FM[0] |= CMC_FM_FORCECFG_MASK; + } + else + { + base->FM[0] &= ~CMC_FM_FORCECFG_MASK; + } +} + +/* @} */ + +/*! + * @name BootROM Status. + * @{ + */ + +#if (defined(FSL_FEATURE_MCX_CMC_HAS_BSR_REG) && FSL_FEATURE_MCX_CMC_HAS_BSR_REG) +/*! + * @brief Gets the status information written by the BootROM. + * + * @param base CMC peripheral base address. + * @return The status information written by the BootROM. + */ +static inline uint32_t CMC_GetBootRomStatus(CMC_Type *base) +{ + return base->BSR; +} + +/*! + * @brief Sets the bootROM status value. + * + * @note This function is useful when result of CMC_CheckBootRomRegisterWrittable() is true. + * + * @param base CMC peripheral base address. + * @param stat The state value to set. + */ +static inline void CMC_SetBootRomStatus(CMC_Type *base, uint32_t statValue) +{ + base->BSR = CMC_BSR_STAT(statValue); +} +#endif /* FSL_FEATURE_MCX_CMC_HAS_BSR_REG */ + +#if (defined(FSL_FEATURE_MCX_CMC_HAS_BLR_REG) && FSL_FEATURE_MCX_CMC_HAS_BLR_REG) +/*! + * @brief Check if BootROM status and lock registers is writtable. + * + * @param base CMC peripheral base address. + * @return The result of whether BootROM status and lock register is writtable. + * - \b true BootROM status and lock registers are writtable; + * - \b false BootROM status and lock registers are not writtable. + */ +static inline bool CMC_CheckBootRomRegisterWrittable(CMC_Type *base) +{ + return (base->BLR == 0x2UL); +} + +/*! + * @brief After invoking this function, BootROM status and lock registers cannot be written. + * + * @param base CMC peripheral base address. + */ +static inline void CMC_LockBootRomStatusWritten(CMC_Type *base) +{ + base->BLR = CMC_BLR_LOCK(0x5U); +} + +/*! + * @brief After invoking this function, BootROM status and lock register can be written.s + * + * @param base + */ +static inline void CMC_UnlockBootRomStatusWritten(CMC_Type *base) +{ + base->BLR = CMC_BLR_LOCK(0x2U); +} +#endif /* FSL_FEATURE_MCX_CMC_HAS_BLR_REG */ + +/* @} */ + +#if (defined(FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG) && FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG) +/*! + * @name System SRAM Configuration. + * @{ + */ + +/*! + * @brief Power off the selected system SRAM always. + * + * @note This function power off the selected system SRAM always. The SRAM arrays should + * not be accessed while they are shut down. SRAM array contents are not retained + * if they are powered off. + * + * @note Once invoked, the previous settings will be overwritten. + * + * @param base CMC peripheral base address. + * @param mask Bitmap of the SRAM arrays to be powered off all modes. + * See @ref _cmc_system_sram_arrays for details. + * Check Reference Manual for the SRAM region and mask bit relationship. + */ +void CMC_PowerOffSRAMAllMode(CMC_Type *base, uint32_t mask); + +/*! + * @brief Power on SRAM during all mode. + * + * @note Once invoked, the previous settings will be overwritten. + * + * @param base CMC peripheral base address. + * @param mask Bitmap of the SRAM arrays to be powered on all modes. + * See @ref _cmc_system_sram_arrays for details. + * Check Reference Manual for the SRAM region and mask bit relationship. + */ +static inline void CMC_PowerOnSRAMAllMode(CMC_Type *base, uint32_t mask) +{ + base->SRAMDIS[0] &= CMC_SRAMDIS_DIS((uint32_t)(~mask)); +} + +/*! + * @brief Power off the selected system SRAM during low power modes only. + * + * This function power off the selected system SRAM only during low power mode. + * SRAM array contents are not retained if they are power off. + * + * @param base CMC peripheral base address. + * @param mask Bitmap of the SRAM arrays to be power off during low power mode only. + * See @ref _cmc_system_sram_arrays for details. + * Check Reference Manual for the SRAM region and mask bit relationship. + */ +void CMC_PowerOffSRAMLowPowerOnly(CMC_Type *base, uint32_t mask); + +/*! + * @brief Power on the selected system SRAM during low power modes only. + * + * This function power on the selected system SRAM. The SRAM arrray contents are + * retained in low power modes. + * + * @param base CMC peripheral base address. + * @param mask Bitmap of the SRAM arrays to be power on during low power mode only. + * See @ref _cmc_system_sram_arrays for details. + * Check Reference Manual for the SRAM region and mask bit relationship. + */ +static inline void CMC_PowerOnSRAMLowPowerOnly(CMC_Type *base, uint32_t mask) +{ + base->SRAMRET[0] &= CMC_SRAMRET_RET((uint32_t)(~mask)); +} + +/* @} */ +#endif /* FSL_FEATURE_MCX_CMC_HAS_SRAM_DIS_REG */ + +/*! + * @name Flash Low Power Mode configuration. + * @{ + */ + +#if (defined(FSL_FEATURE_MCX_CMC_HAS_NO_FLASHCR_WAKE) && FSL_FEATURE_MCX_CMC_HAS_NO_FLASHCR_WAKE) +/*! + * @brief Configs the low power mode of the on-chip flash memory. + * + * This function configs the low power mode of the on-chip flash memory. + * + * @param base CMC peripheral base address. + * @param doze true: Flash is disabled while core is sleeping + * false: No effect. + * @param disable true: Flash memory is placed in low power state. + * false: No effect. + */ +void CMC_ConfigFlashMode(CMC_Type *base, bool doze, bool disable); +#else +/*! + * @brief Configs the low power mode of the on-chip flash memory. + * + * This function configs the low power mode of the on-chip flash memory. + * + * @param base CMC peripheral base address. + * @param wake true: Flash will exit low power state during the flash memory accesses. + * false: No effect. + * @param doze true: Flash is disabled while core is sleeping + * false: No effect. + * @param disable true: Flash memory is placed in low power state. + * false: No effect. + */ +void CMC_ConfigFlashMode(CMC_Type *base, bool wake, bool doze, bool disable); +#endif /* FSL_FEATURE_MCX_CMC_HAS_NO_FLASHCR_WAKE */ +/* @} */ + +/*! + * @name Debug Configuration. + */ + +/*! + * @brief Enables/Disables debug Operation when the core sleep. + * + * This function configs what happens to debug when core sleeps. + * + * @param base CMC peripheral base address. + * @param enable Enable or disable Debug when Core is sleeping. + * true - Debug remains enabled when the core is sleeping. + * false - Debug is disabled when the core is sleeping. + */ +static inline void CMC_EnableDebugOperation(CMC_Type *base, bool enable) +{ + if (enable) + { + base->DBGCTL &= ~CMC_DBGCTL_SOD_MASK; + } + else + { + base->DBGCTL |= CMC_DBGCTL_SOD_MASK; + } +} + +/* @} */ + +/*! + * @name Low Power modes enter. + * @{ + */ +/*! + * @brief Prepares to enter low power modes. + * + * This function should be called before entering low power modes. + * + */ +void CMC_PreEnterLowPowerMode(void); + +/*! + * @brief Recovers after wake up from low power modes. + * + * This function should be called after wake up from low power modes. + * This function should be used with CMC_PreEnterLowPowerMode() + * + */ +void CMC_PostExitLowPowerMode(void); + +/*! + * @brief Configs the entry into the same low power mode for each power domains. + * + * This function provides the feature to entry into the same low power mode for each power + * domains. Before invoking this function, please ensure the selected power mode have been allowed. + * + * @param base CMC peripheral base address. + * @param lowPowerMode The low power mode to be entered. See @ref cmc_low_power_mode_t for the details. + * + */ +void CMC_GlobalEnterLowPowerMode(CMC_Type *base, cmc_low_power_mode_t lowPowerMode); + +/*! + * @brief Configs the entry into different low power modes for each power domains. + * + * This function provides the feature to entry into different low power modes for + * each power domains. Before invoking this function please ensure the selected + * modes are allowed. + * + * @param base CMC peripheral base address. + * @param config Pointer to the cmc_power_domain_config_t structure. + */ +void CMC_EnterLowPowerMode(CMC_Type *base, const cmc_power_domain_config_t *config); + +/* @} */ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @}*/ +#endif /* FSL_CMC_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common.c new file mode 100644 index 00000000000..d3af9fdfc67 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_common.h" + +#define SDK_MEM_MAGIC_NUMBER 12345U + +typedef struct _mem_align_control_block +{ + uint16_t identifier; /*!< Identifier for the memory control block. */ + uint16_t offset; /*!< offset from aligned address to real address */ +} mem_align_cb_t; + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.common" +#endif + +#if !((defined(__DSC__) && defined(__CW__))) +void *SDK_Malloc(size_t size, size_t alignbytes) +{ + mem_align_cb_t *p_cb = NULL; + uint32_t alignedsize; + + /* Check overflow. */ + alignedsize = (uint32_t)(unsigned int)SDK_SIZEALIGN(size, alignbytes); + if (alignedsize < size) + { + return NULL; + } + + if (alignedsize > SIZE_MAX - alignbytes - sizeof(mem_align_cb_t)) + { + return NULL; + } + + alignedsize += alignbytes + (uint32_t)sizeof(mem_align_cb_t); + + union + { + void *pointer_value; + uintptr_t unsigned_value; + } p_align_addr, p_addr; + + p_addr.pointer_value = malloc((size_t)alignedsize); + + if (p_addr.pointer_value == NULL) + { + return NULL; + } + + p_align_addr.unsigned_value = SDK_SIZEALIGN(p_addr.unsigned_value + sizeof(mem_align_cb_t), alignbytes); + + p_cb = (mem_align_cb_t *)(p_align_addr.unsigned_value - 4U); + p_cb->identifier = SDK_MEM_MAGIC_NUMBER; + p_cb->offset = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value); + + return p_align_addr.pointer_value; +} + +void SDK_Free(void *ptr) +{ + union + { + void *pointer_value; + uintptr_t unsigned_value; + } p_free; + p_free.pointer_value = ptr; + mem_align_cb_t *p_cb = (mem_align_cb_t *)(p_free.unsigned_value - 4U); + + if (p_cb->identifier != SDK_MEM_MAGIC_NUMBER) + { + return; + } + + p_free.unsigned_value = p_free.unsigned_value - p_cb->offset; + + free(p_free.pointer_value); +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common.h new file mode 100644 index 00000000000..e6d5cce7190 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common.h @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_COMMON_H_ +#define FSL_COMMON_H_ + +#include +#include +#include +#include +#include + +#if defined(__ICCARM__) || (defined(__CC_ARM) || defined(__ARMCC_VERSION)) || defined(__GNUC__) +#include +#endif + +#include "fsl_device_registers.h" + +/*! + * @addtogroup ksdk_common + * @{ + */ + +/******************************************************************************* + * Configurations + ******************************************************************************/ + +/*! @brief Macro to use the default weak IRQ handler in drivers. */ +#ifndef FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ +#define FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ 1 +#endif + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @brief Construct a status code value from a group and code number. */ +#define MAKE_STATUS(group, code) ((((group)*100L) + (code))) + +/*! @brief Construct the version number for drivers. + * + * The driver version is a 32-bit number, for both 32-bit platforms(such as Cortex M) + * and 16-bit platforms(such as DSC). + * + * @verbatim + + | Unused || Major Version || Minor Version || Bug Fix | + 31 25 24 17 16 9 8 0 + + @endverbatim + */ +#define MAKE_VERSION(major, minor, bugfix) (((major)*65536L) + ((minor)*256L) + (bugfix)) + +/*! @name Driver version */ +/*! @{ */ +/*! @brief common driver version. */ +#define FSL_COMMON_DRIVER_VERSION (MAKE_VERSION(2, 4, 1)) +/*! @} */ + +/*! @name Debug console type definition. */ +/*! @{ */ +#define DEBUG_CONSOLE_DEVICE_TYPE_NONE 0U /*!< No debug console. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_UART 1U /*!< Debug console based on UART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_LPUART 2U /*!< Debug console based on LPUART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_LPSCI 3U /*!< Debug console based on LPSCI. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_USBCDC 4U /*!< Debug console based on USBCDC. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM 5U /*!< Debug console based on FLEXCOMM. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_IUART 6U /*!< Debug console based on i.MX UART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_VUSART 7U /*!< Debug console based on LPC_VUSART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART 8U /*!< Debug console based on LPC_USART. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_SWO 9U /*!< Debug console based on SWO. */ +#define DEBUG_CONSOLE_DEVICE_TYPE_QSCI 10U /*!< Debug console based on QSCI. */ +/*! @} */ + +/*! @brief Status group numbers. */ +enum _status_groups +{ + kStatusGroup_Generic = 0, /*!< Group number for generic status codes. */ + kStatusGroup_FLASH = 1, /*!< Group number for FLASH status codes. */ + kStatusGroup_LPSPI = 4, /*!< Group number for LPSPI status codes. */ + kStatusGroup_FLEXIO_SPI = 5, /*!< Group number for FLEXIO SPI status codes. */ + kStatusGroup_DSPI = 6, /*!< Group number for DSPI status codes. */ + kStatusGroup_FLEXIO_UART = 7, /*!< Group number for FLEXIO UART status codes. */ + kStatusGroup_FLEXIO_I2C = 8, /*!< Group number for FLEXIO I2C status codes. */ + kStatusGroup_LPI2C = 9, /*!< Group number for LPI2C status codes. */ + kStatusGroup_UART = 10, /*!< Group number for UART status codes. */ + kStatusGroup_I2C = 11, /*!< Group number for UART status codes. */ + kStatusGroup_LPSCI = 12, /*!< Group number for LPSCI status codes. */ + kStatusGroup_LPUART = 13, /*!< Group number for LPUART status codes. */ + kStatusGroup_SPI = 14, /*!< Group number for SPI status code.*/ + kStatusGroup_XRDC = 15, /*!< Group number for XRDC status code.*/ + kStatusGroup_SEMA42 = 16, /*!< Group number for SEMA42 status code.*/ + kStatusGroup_SDHC = 17, /*!< Group number for SDHC status code */ + kStatusGroup_SDMMC = 18, /*!< Group number for SDMMC status code */ + kStatusGroup_SAI = 19, /*!< Group number for SAI status code */ + kStatusGroup_MCG = 20, /*!< Group number for MCG status codes. */ + kStatusGroup_SCG = 21, /*!< Group number for SCG status codes. */ + kStatusGroup_SDSPI = 22, /*!< Group number for SDSPI status codes. */ + kStatusGroup_FLEXIO_I2S = 23, /*!< Group number for FLEXIO I2S status codes */ + kStatusGroup_FLEXIO_MCULCD = 24, /*!< Group number for FLEXIO LCD status codes */ + kStatusGroup_FLASHIAP = 25, /*!< Group number for FLASHIAP status codes */ + kStatusGroup_FLEXCOMM_I2C = 26, /*!< Group number for FLEXCOMM I2C status codes */ + kStatusGroup_I2S = 27, /*!< Group number for I2S status codes */ + kStatusGroup_IUART = 28, /*!< Group number for IUART status codes */ + kStatusGroup_CSI = 29, /*!< Group number for CSI status codes */ + kStatusGroup_MIPI_DSI = 30, /*!< Group number for MIPI DSI status codes */ + kStatusGroup_SDRAMC = 35, /*!< Group number for SDRAMC status codes. */ + kStatusGroup_POWER = 39, /*!< Group number for POWER status codes. */ + kStatusGroup_ENET = 40, /*!< Group number for ENET status codes. */ + kStatusGroup_PHY = 41, /*!< Group number for PHY status codes. */ + kStatusGroup_TRGMUX = 42, /*!< Group number for TRGMUX status codes. */ + kStatusGroup_SMARTCARD = 43, /*!< Group number for SMARTCARD status codes. */ + kStatusGroup_LMEM = 44, /*!< Group number for LMEM status codes. */ + kStatusGroup_QSPI = 45, /*!< Group number for QSPI status codes. */ + kStatusGroup_DMA = 50, /*!< Group number for DMA status codes. */ + kStatusGroup_EDMA = 51, /*!< Group number for EDMA status codes. */ + kStatusGroup_DMAMGR = 52, /*!< Group number for DMAMGR status codes. */ + kStatusGroup_FLEXCAN = 53, /*!< Group number for FlexCAN status codes. */ + kStatusGroup_LTC = 54, /*!< Group number for LTC status codes. */ + kStatusGroup_FLEXIO_CAMERA = 55, /*!< Group number for FLEXIO CAMERA status codes. */ + kStatusGroup_LPC_SPI = 56, /*!< Group number for LPC_SPI status codes. */ + kStatusGroup_LPC_USART = 57, /*!< Group number for LPC_USART status codes. */ + kStatusGroup_DMIC = 58, /*!< Group number for DMIC status codes. */ + kStatusGroup_SDIF = 59, /*!< Group number for SDIF status codes.*/ + kStatusGroup_SPIFI = 60, /*!< Group number for SPIFI status codes. */ + kStatusGroup_OTP = 61, /*!< Group number for OTP status codes. */ + kStatusGroup_MCAN = 62, /*!< Group number for MCAN status codes. */ + kStatusGroup_CAAM = 63, /*!< Group number for CAAM status codes. */ + kStatusGroup_ECSPI = 64, /*!< Group number for ECSPI status codes. */ + kStatusGroup_USDHC = 65, /*!< Group number for USDHC status codes.*/ + kStatusGroup_LPC_I2C = 66, /*!< Group number for LPC_I2C status codes.*/ + kStatusGroup_DCP = 67, /*!< Group number for DCP status codes.*/ + kStatusGroup_MSCAN = 68, /*!< Group number for MSCAN status codes.*/ + kStatusGroup_ESAI = 69, /*!< Group number for ESAI status codes. */ + kStatusGroup_FLEXSPI = 70, /*!< Group number for FLEXSPI status codes. */ + kStatusGroup_MMDC = 71, /*!< Group number for MMDC status codes. */ + kStatusGroup_PDM = 72, /*!< Group number for MIC status codes. */ + kStatusGroup_SDMA = 73, /*!< Group number for SDMA status codes. */ + kStatusGroup_ICS = 74, /*!< Group number for ICS status codes. */ + kStatusGroup_SPDIF = 75, /*!< Group number for SPDIF status codes. */ + kStatusGroup_LPC_MINISPI = 76, /*!< Group number for LPC_MINISPI status codes. */ + kStatusGroup_HASHCRYPT = 77, /*!< Group number for Hashcrypt status codes */ + kStatusGroup_LPC_SPI_SSP = 78, /*!< Group number for LPC_SPI_SSP status codes. */ + kStatusGroup_I3C = 79, /*!< Group number for I3C status codes */ + kStatusGroup_LPC_I2C_1 = 97, /*!< Group number for LPC_I2C_1 status codes. */ + kStatusGroup_NOTIFIER = 98, /*!< Group number for NOTIFIER status codes. */ + kStatusGroup_DebugConsole = 99, /*!< Group number for debug console status codes. */ + kStatusGroup_SEMC = 100, /*!< Group number for SEMC status codes. */ + kStatusGroup_ApplicationRangeStart = 101, /*!< Starting number for application groups. */ + kStatusGroup_IAP = 102, /*!< Group number for IAP status codes */ + kStatusGroup_SFA = 103, /*!< Group number for SFA status codes*/ + kStatusGroup_SPC = 104, /*!< Group number for SPC status codes. */ + kStatusGroup_PUF = 105, /*!< Group number for PUF status codes. */ + kStatusGroup_TOUCH_PANEL = 106, /*!< Group number for touch panel status codes */ + kStatusGroup_VBAT = 107, /*!< Group number for VBAT status codes */ + kStatusGroup_XSPI = 108, /*!< Group number for XSPI status codes */ + kStatusGroup_PNGDEC = 109, /*!< Group number for PNGDEC status codes */ + kStatusGroup_JPEGDEC = 110, /*!< Group number for JPEGDEC status codes */ + + kStatusGroup_HAL_GPIO = 121, /*!< Group number for HAL GPIO status codes. */ + kStatusGroup_HAL_UART = 122, /*!< Group number for HAL UART status codes. */ + kStatusGroup_HAL_TIMER = 123, /*!< Group number for HAL TIMER status codes. */ + kStatusGroup_HAL_SPI = 124, /*!< Group number for HAL SPI status codes. */ + kStatusGroup_HAL_I2C = 125, /*!< Group number for HAL I2C status codes. */ + kStatusGroup_HAL_FLASH = 126, /*!< Group number for HAL FLASH status codes. */ + kStatusGroup_HAL_PWM = 127, /*!< Group number for HAL PWM status codes. */ + kStatusGroup_HAL_RNG = 128, /*!< Group number for HAL RNG status codes. */ + kStatusGroup_HAL_I2S = 129, /*!< Group number for HAL I2S status codes. */ + kStatusGroup_HAL_ADC_SENSOR = 130, /*!< Group number for HAL ADC SENSOR status codes. */ + kStatusGroup_TIMERMANAGER = 135, /*!< Group number for TiMER MANAGER status codes. */ + kStatusGroup_SERIALMANAGER = 136, /*!< Group number for SERIAL MANAGER status codes. */ + kStatusGroup_LED = 137, /*!< Group number for LED status codes. */ + kStatusGroup_BUTTON = 138, /*!< Group number for BUTTON status codes. */ + kStatusGroup_EXTERN_EEPROM = 139, /*!< Group number for EXTERN EEPROM status codes. */ + kStatusGroup_SHELL = 140, /*!< Group number for SHELL status codes. */ + kStatusGroup_MEM_MANAGER = 141, /*!< Group number for MEM MANAGER status codes. */ + kStatusGroup_LIST = 142, /*!< Group number for List status codes. */ + kStatusGroup_OSA = 143, /*!< Group number for OSA status codes. */ + kStatusGroup_COMMON_TASK = 144, /*!< Group number for Common task status codes. */ + kStatusGroup_MSG = 145, /*!< Group number for messaging status codes. */ + kStatusGroup_SDK_OCOTP = 146, /*!< Group number for OCOTP status codes. */ + kStatusGroup_SDK_FLEXSPINOR = 147, /*!< Group number for FLEXSPINOR status codes.*/ + kStatusGroup_CODEC = 148, /*!< Group number for codec status codes. */ + kStatusGroup_ASRC = 149, /*!< Group number for codec status ASRC. */ + kStatusGroup_OTFAD = 150, /*!< Group number for codec status codes. */ + kStatusGroup_SDIOSLV = 151, /*!< Group number for SDIOSLV status codes. */ + kStatusGroup_MECC = 152, /*!< Group number for MECC status codes. */ + kStatusGroup_ENET_QOS = 153, /*!< Group number for ENET_QOS status codes. */ + kStatusGroup_LOG = 154, /*!< Group number for LOG status codes. */ + kStatusGroup_I3CBUS = 155, /*!< Group number for I3CBUS status codes. */ + kStatusGroup_QSCI = 156, /*!< Group number for QSCI status codes. */ + kStatusGroup_ELEMU = 157, /*!< Group number for ELEMU status codes. */ + kStatusGroup_QUEUEDSPI = 158, /*!< Group number for QSPI status codes. */ + kStatusGroup_POWER_MANAGER = 159, /*!< Group number for POWER_MANAGER status codes. */ + kStatusGroup_IPED = 160, /*!< Group number for IPED status codes. */ + kStatusGroup_ELS_PKC = 161, /*!< Group number for ELS PKC status codes. */ + kStatusGroup_CSS_PKC = 162, /*!< Group number for CSS PKC status codes. */ + kStatusGroup_HOSTIF = 163, /*!< Group number for HOSTIF status codes. */ + kStatusGroup_CLIF = 164, /*!< Group number for CLIF status codes. */ + kStatusGroup_BMA = 165, /*!< Group number for BMA status codes. */ + kStatusGroup_NETC = 166, /*!< Group number for NETC status codes. */ + kStatusGroup_ELE = 167, /*!< Group number for ELE status codes. */ + kStatusGroup_GLIKEY = 168, /*!< Group number for GLIKEY status codes. */ +}; + +/*! \public + * @brief Generic status return codes. + */ +enum +{ + kStatus_Success = MAKE_STATUS(kStatusGroup_Generic, 0), /*!< Generic status for Success. */ + kStatus_Fail = MAKE_STATUS(kStatusGroup_Generic, 1), /*!< Generic status for Fail. */ + kStatus_ReadOnly = MAKE_STATUS(kStatusGroup_Generic, 2), /*!< Generic status for read only failure. */ + kStatus_OutOfRange = MAKE_STATUS(kStatusGroup_Generic, 3), /*!< Generic status for out of range access. */ + kStatus_InvalidArgument = MAKE_STATUS(kStatusGroup_Generic, 4), /*!< Generic status for invalid argument check. */ + kStatus_Timeout = MAKE_STATUS(kStatusGroup_Generic, 5), /*!< Generic status for timeout. */ + kStatus_NoTransferInProgress = + MAKE_STATUS(kStatusGroup_Generic, 6), /*!< Generic status for no transfer in progress. */ + kStatus_Busy = MAKE_STATUS(kStatusGroup_Generic, 7), /*!< Generic status for module is busy. */ + kStatus_NoData = + MAKE_STATUS(kStatusGroup_Generic, 8), /*!< Generic status for no data is found for the operation. */ +}; + +/*! @brief Type used for all status and error return values. */ +typedef int32_t status_t; + +#ifdef __ZEPHYR__ +#include +#else +/*! + * @name Min/max macros + * @{ + */ +#if !defined(MIN) +/*! Computes the minimum of \a a and \a b. */ +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#if !defined(MAX) +/*! Computes the maximum of \a a and \a b. */ +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +/*! @} */ + +/*! @brief Computes the number of elements in an array. */ +#if !defined(ARRAY_SIZE) +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif +#endif /* __ZEPHYR__ */ + +/*! @name UINT16_MAX/UINT32_MAX value */ +/*! @{ */ +#if !defined(UINT16_MAX) +/*! Max value of uint16_t type. */ +#define UINT16_MAX ((uint16_t)-1) +#endif + +#if !defined(UINT32_MAX) +/*! Max value of uint32_t type. */ +#define UINT32_MAX ((uint32_t)-1) +#endif +/*! @} */ + +/*! Macro to get upper 32 bits of a 64-bit value */ +#if !defined(UINT64_H) +#define UINT64_H(X) ((uint32_t)((((uint64_t) (X)) >> 32U) & 0x0FFFFFFFFULL)) +#endif + +/*! Macro to get lower 32 bits of a 64-bit value */ +#if !defined(UINT64_L) +#define UINT64_L(X) ((uint32_t)(((uint64_t) (X)) & 0x0FFFFFFFFULL)) +#endif + +/*! + * @def SUPPRESS_FALL_THROUGH_WARNING() + * + * For switch case code block, if case section ends without "break;" statement, there wil be + * fallthrough warning with compiler flag -Wextra or -Wimplicit-fallthrough=n when using armgcc. + * To suppress this warning, "SUPPRESS_FALL_THROUGH_WARNING();" need to be added at the end of each + * case section which misses "break;"statement. + */ +#if defined(__GNUC__) && !defined(__ARMCC_VERSION) +#define SUPPRESS_FALL_THROUGH_WARNING() __attribute__((fallthrough)) +#else +#define SUPPRESS_FALL_THROUGH_WARNING() +#endif + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +#if !((defined(__DSC__) && defined(__CW__))) +/*! + * @brief Allocate memory with given alignment and aligned size. + * + * This is provided to support the dynamically allocated memory + * used in cache-able region. + * @param size The length required to malloc. + * @param alignbytes The alignment size. + * @retval The allocated memory. + */ +void *SDK_Malloc(size_t size, size_t alignbytes); + +/*! + * @brief Free memory. + * + * @param ptr The memory to be release. + */ +void SDK_Free(void *ptr); +#endif + +/*! + * @brief Delay at least for some time. + * Please note that, this API uses while loop for delay, different run-time environments make the time not precise, + * if precise delay count was needed, please implement a new delay function with hardware timer. + * + * @param delayTime_us Delay time in unit of microsecond. + * @param coreClock_Hz Core clock frequency with Hz. + */ +void SDK_DelayAtLeastUs(uint32_t delayTime_us, uint32_t coreClock_Hz); + +#if defined(__cplusplus) +} +#endif + +/*! @} */ + +#if (defined(__DSC__) && defined(__CW__)) +#include "fsl_common_dsc.h" +#elif defined(__XTENSA__) +#include "fsl_common_dsp.h" +#else +#include "fsl_common_arm.h" +#endif + +#endif /* FSL_COMMON_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common_arm.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common_arm.c new file mode 100644 index 00000000000..e9f32aadf4a --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common_arm.c @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021, 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_common.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.common_arm" +#endif + +#ifndef __GIC_PRIO_BITS +#if defined(ENABLE_RAM_VECTOR_TABLE) +uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler) +{ +#ifdef __VECTOR_TABLE +#undef __VECTOR_TABLE +#endif + +/* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */ +#if defined(__CC_ARM) || defined(__ARMCC_VERSION) + extern uint32_t Image$$VECTOR_ROM$$Base[]; + extern uint32_t Image$$VECTOR_RAM$$Base[]; + extern uint32_t Image$$VECTOR_RAM$$ZI$$Limit[]; + +#define __VECTOR_TABLE Image$$VECTOR_ROM$$Base +#define __VECTOR_RAM Image$$VECTOR_RAM$$Base +#define __RAM_VECTOR_TABLE_SIZE (((uint32_t)Image$$VECTOR_RAM$$ZI$$Limit - (uint32_t)Image$$VECTOR_RAM$$Base)) +#elif defined(__ICCARM__) + extern uint32_t __RAM_VECTOR_TABLE_SIZE[]; + extern uint32_t __VECTOR_TABLE[]; + extern uint32_t __VECTOR_RAM[]; +#elif defined(__GNUC__) + extern uint32_t __VECTOR_TABLE[]; + extern uint32_t __VECTOR_RAM[]; + extern uint32_t __RAM_VECTOR_TABLE_SIZE_BYTES[]; + uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES); +#endif /* defined(__CC_ARM) || defined(__ARMCC_VERSION) */ + uint32_t n; + uint32_t ret; + uint32_t irqMaskValue; + + irqMaskValue = DisableGlobalIRQ(); + if (SCB->VTOR != (uint32_t)__VECTOR_RAM) + { + /* Copy the vector table from ROM to RAM */ + for (n = 0; n < ((uint32_t)__RAM_VECTOR_TABLE_SIZE) / sizeof(uint32_t); n++) + { + __VECTOR_RAM[n] = __VECTOR_TABLE[n]; + } + /* Point the VTOR to the position of vector table */ + SCB->VTOR = (uint32_t)__VECTOR_RAM; + } + + ret = __VECTOR_RAM[(int32_t)irq + 16]; + /* make sure the __VECTOR_RAM is noncachable */ + __VECTOR_RAM[(int32_t)irq + 16] = irqHandler; + + EnableGlobalIRQ(irqMaskValue); + + return ret; +} +#endif /* ENABLE_RAM_VECTOR_TABLE. */ +#endif /* __GIC_PRIO_BITS. */ + +#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) + +/* + * When FSL_FEATURE_POWERLIB_EXTEND is defined to non-zero value, + * powerlib should be used instead of these functions. + */ +#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0)) + +/* + * When the SYSCON STARTER registers are discontinuous, these functions are + * implemented in fsl_power.c. + */ +#if !(defined(FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS) && FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS) + +void EnableDeepSleepIRQ(IRQn_Type interrupt) +{ + uint32_t intNumber = (uint32_t)interrupt; + + uint32_t index = 0; + + while (intNumber >= 32u) + { + index++; + intNumber -= 32u; + } + + SYSCON->STARTERSET[index] = 1UL << intNumber; + (void)EnableIRQ(interrupt); /* also enable interrupt at NVIC */ +} + +void DisableDeepSleepIRQ(IRQn_Type interrupt) +{ + uint32_t intNumber = (uint32_t)interrupt; + + (void)DisableIRQ(interrupt); /* also disable interrupt at NVIC */ + uint32_t index = 0; + + while (intNumber >= 32u) + { + index++; + intNumber -= 32u; + } + + SYSCON->STARTERCLR[index] = 1UL << intNumber; +} +#endif /* FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS */ +#endif /* FSL_FEATURE_POWERLIB_EXTEND */ +#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */ + +#if defined(DWT) +/* Use WDT. */ +void MSDK_EnableCpuCycleCounter(void) +{ + /* Make sure the DWT trace fucntion is enabled. */ + if (CoreDebug_DEMCR_TRCENA_Msk != (CoreDebug_DEMCR_TRCENA_Msk & CoreDebug->DEMCR)) + { + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + } + + /* CYCCNT not supported on this device. */ + assert(DWT_CTRL_NOCYCCNT_Msk != (DWT->CTRL & DWT_CTRL_NOCYCCNT_Msk)); + + /* Read CYCCNT directly if CYCCENT has already been enabled, otherwise enable CYCCENT first. */ + if (DWT_CTRL_CYCCNTENA_Msk != (DWT_CTRL_CYCCNTENA_Msk & DWT->CTRL)) + { + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; + } +} + +uint32_t MSDK_GetCpuCycleCount(void) +{ + return DWT->CYCCNT; +} +#endif /* defined(DWT) */ + +#if !(defined(SDK_DELAY_USE_DWT) && defined(DWT)) +/* Use software loop. */ +#if defined(__CC_ARM) /* This macro is arm v5 specific */ +/* clang-format off */ +__ASM static void DelayLoop(uint32_t count) +{ +loop + SUBS R0, R0, #1 + CMP R0, #0 + BNE loop + BX LR +} +#elif defined(__ARM_ARCH_8A__) /* This macro is ARMv8-A specific */ +static void DelayLoop(uint32_t count) +{ + __ASM volatile(" MOV X0, %0" : : "r"(count)); + __ASM volatile( + "loop%=: \n" + " SUB X0, X0, #1 \n" + " CMP X0, #0 \n" + + " BNE loop%= \n" + : + : + : "r0"); +} +/* clang-format on */ +#elif defined(__ARMCC_VERSION) || defined(__ICCARM__) || defined(__GNUC__) +/* Cortex-M0 has a smaller instruction set, SUBS isn't supported in thumb-16 mode reported from __GNUC__ compiler, + * use SUB and CMP here for compatibility */ +static void DelayLoop(uint32_t count) +{ + __ASM volatile(" MOV R0, %0" : : "r"(count)); + __ASM volatile( + "loop%=: \n" +#if defined(__GNUC__) && !defined(__ARMCC_VERSION) + " SUB R0, R0, #1 \n" +#else + " SUBS R0, R0, #1 \n" +#endif + " CMP R0, #0 \n" + + " BNE loop%= \n" + : + : + : "r0"); +} +#endif /* defined(__CC_ARM) */ +#endif /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */ + +/*! + * @brief Delay at least for some time. + * Please note that, if not uses DWT, this API will use while loop for delay, different run-time environments have + * effect on the delay time. If precise delay is needed, please enable DWT delay. The two parmeters delayTime_us and + * coreClock_Hz have limitation. For example, in the platform with 1GHz coreClock_Hz, the delayTime_us only supports + * up to 4294967 in current code. If long time delay is needed, please implement a new delay function. + * + * @param delayTime_us Delay time in unit of microsecond. + * @param coreClock_Hz Core clock frequency with Hz. + */ +void SDK_DelayAtLeastUs(uint32_t delayTime_us, uint32_t coreClock_Hz) +{ + uint64_t count; + + if (delayTime_us > 0U) + { + count = USEC_TO_COUNT(delayTime_us, coreClock_Hz); + + assert(count <= UINT32_MAX); + +#if defined(SDK_DELAY_USE_DWT) && defined(DWT) /* Use DWT for better accuracy */ + + MSDK_EnableCpuCycleCounter(); + /* Calculate the count ticks. */ + count += MSDK_GetCpuCycleCount(); + + if (count > UINT32_MAX) + { + count -= UINT32_MAX; + /* Wait for cyccnt overflow. */ + while (count < MSDK_GetCpuCycleCount()) + { + } + } + + /* Wait for cyccnt reach count value. */ + while (count > MSDK_GetCpuCycleCount()) + { + } +#else +#if defined(__CORTEX_Axx) && ((__CORTEX_Axx == 53) || (__CORTEX_Axx == 55)) + /* + * Cortex-A53/A55 execution throughput: + * - SUB/CMP: 2 instructions per cycle + * - BNE: 1 instruction per cycle + * So, each loop takes 2 CPU cycles. + */ + count = count / 2U; +#elif (__CORTEX_M == 7) + /* Divide value may be different in various environment to ensure delay is precise. + * Every loop count includes three instructions, due to Cortex-M7 sometimes executes + * two instructions in one period, through test here set divide 1.5. Other M cores use + * divide 4. By the way, divide 1.5 or 4 could let the count lose precision, but it does + * not matter because other instructions outside while loop is enough to fill the time. + */ + count = count / 3U * 2U; +#else + count = count / 4U; +#endif + DelayLoop((uint32_t)count); +#endif /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */ + } +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common_arm.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common_arm.h new file mode 100644 index 00000000000..3d35d76f812 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_common_arm.h @@ -0,0 +1,898 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_COMMON_ARM_H_ +#define FSL_COMMON_ARM_H_ + +/* + * For CMSIS pack RTE. + * CMSIS pack RTE generates "RTC_Components.h" which contains the statements + * of the related element for all selected software components. + */ +#ifdef _RTE_ +#include "RTE_Components.h" +#endif + +/*! + * @addtogroup ksdk_common + * @{ + */ + +/*! @name Atomic modification + * + * These macros are used for atomic access, such as read-modify-write + * to the peripheral registers. + * + * Take @ref SDK_ATOMIC_LOCAL_CLEAR_AND_SET as an example: the parameter @c addr + * means the address of the peripheral register or variable you want to modify + * atomically, the parameter @c clearBits is the bits to clear, the parameter + * @c setBits it the bits to set. + * For example, to set a 32-bit register bit1:bit0 to 0b10, use like this: + * + * @code + volatile uint32_t * reg = (volatile uint32_t *)REG_ADDR; + + SDK_ATOMIC_LOCAL_CLEAR_AND_SET(reg, 0x03, 0x02); + @endcode + * + * In this example, the register bit1:bit0 are cleared and bit1 is set, as a result, + * register bit1:bit0 = 0b10. + * + * @note For the platforms don't support exclusive load and store, these macros + * disable the global interrupt to pretect the modification. + * + * @note These macros only guarantee the local processor atomic operations. For + * the multi-processor devices, use hardware semaphore such as SEMA42 to + * guarantee exclusive access if necessary. + * + * @{ + */ + +/*! + * @def SDK_ATOMIC_LOCAL_ADD(addr, val) + * Add value \a val from the variable at address \a address. + * + * @def SDK_ATOMIC_LOCAL_SUB(addr, val) + * Subtract value \a val to the variable at address \a address. + * + * @def SDK_ATOMIC_LOCAL_SET(addr, bits) + * Set the bits specifiled by \a bits to the variable at address \a address. + * + * @def SDK_ATOMIC_LOCAL_CLEAR(addr, bits) + * Clear the bits specifiled by \a bits to the variable at address \a address. + * + * @def SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) + * Toggle the bits specifiled by \a bits to the variable at address \a address. + * + * @def SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) + * For the variable at address \a address, clear the bits specifiled by \a clearBits + * and set the bits specifiled by \a setBits. + */ + +/* clang-format off */ +#if ((defined(__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined(__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined(__ARM_ARCH_8M_BASE__) && (__ARM_ARCH_8M_BASE__ == 1))) +/* clang-format on */ + +/* If the LDREX and STREX are supported, use them. */ +#define _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, val, ops) \ + do \ + { \ + (val) = __LDREXB(addr); \ + (ops); \ + } while (0UL != __STREXB((val), (addr))) + +#define _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, val, ops) \ + do \ + { \ + (val) = __LDREXH(addr); \ + (ops); \ + } while (0UL != __STREXH((val), (addr))) + +#define _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, val, ops) \ + do \ + { \ + (val) = __LDREXW(addr); \ + (ops); \ + } while (0UL != __STREXW((val), (addr))) + +static inline void _SDK_AtomicLocalAdd1Byte(volatile uint8_t *addr, uint8_t val) +{ + uint8_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val += val); +} + +static inline void _SDK_AtomicLocalAdd2Byte(volatile uint16_t *addr, uint16_t val) +{ + uint16_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val += val); +} + +static inline void _SDK_AtomicLocalAdd4Byte(volatile uint32_t *addr, uint32_t val) +{ + uint32_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val += val); +} + +static inline void _SDK_AtomicLocalSub1Byte(volatile uint8_t *addr, uint8_t val) +{ + uint8_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val -= val); +} + +static inline void _SDK_AtomicLocalSub2Byte(volatile uint16_t *addr, uint16_t val) +{ + uint16_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val -= val); +} + +static inline void _SDK_AtomicLocalSub4Byte(volatile uint32_t *addr, uint32_t val) +{ + uint32_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val -= val); +} + +static inline void _SDK_AtomicLocalSet1Byte(volatile uint8_t *addr, uint8_t bits) +{ + uint8_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val |= bits); +} + +static inline void _SDK_AtomicLocalSet2Byte(volatile uint16_t *addr, uint16_t bits) +{ + uint16_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val |= bits); +} + +static inline void _SDK_AtomicLocalSet4Byte(volatile uint32_t *addr, uint32_t bits) +{ + uint32_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val |= bits); +} + +static inline void _SDK_AtomicLocalClear1Byte(volatile uint8_t *addr, uint8_t bits) +{ + uint8_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val &= ~bits); +} + +static inline void _SDK_AtomicLocalClear2Byte(volatile uint16_t *addr, uint16_t bits) +{ + uint16_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val &= ~bits); +} + +static inline void _SDK_AtomicLocalClear4Byte(volatile uint32_t *addr, uint32_t bits) +{ + uint32_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val &= ~bits); +} + +static inline void _SDK_AtomicLocalToggle1Byte(volatile uint8_t *addr, uint8_t bits) +{ + uint8_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val ^= bits); +} + +static inline void _SDK_AtomicLocalToggle2Byte(volatile uint16_t *addr, uint16_t bits) +{ + uint16_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val ^= bits); +} + +static inline void _SDK_AtomicLocalToggle4Byte(volatile uint32_t *addr, uint32_t bits) +{ + uint32_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val ^= bits); +} + +static inline void _SDK_AtomicLocalClearAndSet1Byte(volatile uint8_t *addr, uint8_t clearBits, uint8_t setBits) +{ + uint8_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits); +} + +static inline void _SDK_AtomicLocalClearAndSet2Byte(volatile uint16_t *addr, uint16_t clearBits, uint16_t setBits) +{ + uint16_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits); +} + +static inline void _SDK_AtomicLocalClearAndSet4Byte(volatile uint32_t *addr, uint32_t clearBits, uint32_t setBits) +{ + uint32_t s_val; + + _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits); +} + +#define SDK_ATOMIC_LOCAL_ADD(addr, val) \ + ((1UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalAdd1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(val)) : \ + ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalAdd2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(val)) : \ + _SDK_AtomicLocalAdd4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(val)))) + +#define SDK_ATOMIC_LOCAL_SUB(addr, val) \ + ((1UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalSub1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(val)) : \ + ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalSub2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(val)) : \ + _SDK_AtomicLocalSub4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(val)))) + +#define SDK_ATOMIC_LOCAL_SET(addr, bits) \ + ((1UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalSet1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) : \ + ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalSet2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \ + _SDK_AtomicLocalSet4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits)))) + +#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits) \ + ((1UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalClear1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) : \ + ((2UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalClear2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \ + _SDK_AtomicLocalClear4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits)))) + +#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) \ + ((1UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalToggle1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) : \ + ((2UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalToggle2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \ + _SDK_AtomicLocalToggle4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits)))) + +#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \ + ((1UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalClearAndSet1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(clearBits), (uint8_t)(setBits)) : \ + ((2UL == sizeof(*(addr))) ? \ + _SDK_AtomicLocalClearAndSet2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(clearBits), (uint16_t)(setBits)) : \ + _SDK_AtomicLocalClearAndSet4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(clearBits), (uint32_t)(setBits)))) +#else + +#define SDK_ATOMIC_LOCAL_ADD(addr, val) \ + do \ + { \ + uint32_t s_atomicOldInt; \ + s_atomicOldInt = DisableGlobalIRQ(); \ + *(addr) += (val); \ + EnableGlobalIRQ(s_atomicOldInt); \ + } while (false) + +#define SDK_ATOMIC_LOCAL_SUB(addr, val) \ + do \ + { \ + uint32_t s_atomicOldInt; \ + s_atomicOldInt = DisableGlobalIRQ(); \ + *(addr) -= (val); \ + EnableGlobalIRQ(s_atomicOldInt); \ + } while (false) + +#define SDK_ATOMIC_LOCAL_SET(addr, bits) \ + do \ + { \ + uint32_t s_atomicOldInt; \ + s_atomicOldInt = DisableGlobalIRQ(); \ + *(addr) |= (bits); \ + EnableGlobalIRQ(s_atomicOldInt); \ + } while (false) + +#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits) \ + do \ + { \ + uint32_t s_atomicOldInt; \ + s_atomicOldInt = DisableGlobalIRQ(); \ + *(addr) &= ~(bits); \ + EnableGlobalIRQ(s_atomicOldInt); \ + } while (false) + +#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits) \ + do \ + { \ + uint32_t s_atomicOldInt; \ + s_atomicOldInt = DisableGlobalIRQ(); \ + *(addr) ^= (bits); \ + EnableGlobalIRQ(s_atomicOldInt); \ + } while (false) + +#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \ + do \ + { \ + uint32_t s_atomicOldInt; \ + s_atomicOldInt = DisableGlobalIRQ(); \ + *(addr) = (*(addr) & ~(clearBits)) | (setBits); \ + EnableGlobalIRQ(s_atomicOldInt); \ + } while (false) + +#endif +/*! @} */ + +/*! @name Timer utilities */ +/*! @{ */ +/*! Macro to convert a microsecond period to raw count value */ +#define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U) +/*! Macro to convert a raw count value to microsecond */ +#define COUNT_TO_USEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count)*1000000U / (clockFreqInHz)) + +/*! Macro to convert a millisecond period to raw count value */ +#define MSEC_TO_COUNT(ms, clockFreqInHz) (uint64_t)((uint64_t)(ms) * (clockFreqInHz) / 1000U) +/*! Macro to convert a raw count value to millisecond */ +#define COUNT_TO_MSEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count)*1000U / (clockFreqInHz)) +/*! @} */ + +/*! @name ISR exit barrier + * @{ + * + * ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping + * exception return operation might vector to incorrect interrupt. + * For Cortex-M7, if core speed much faster than peripheral register write speed, + * the peripheral interrupt flags may be still set after exiting ISR, this results to + * the same error similar with errata 83869. + */ +#if (defined __CORTEX_M) && ((__CORTEX_M == 4U) || (__CORTEX_M == 7U)) +#define SDK_ISR_EXIT_BARRIER __DSB() +#else +#define SDK_ISR_EXIT_BARRIER +#endif + +/*! @} */ + +/*! @name Alignment variable definition macros */ +/*! @{ */ +#if (defined(__ICCARM__)) +/* + * Workaround to disable MISRA C message suppress warnings for IAR compiler. + * http:/ /supp.iar.com/Support/?note=24725 + */ +_Pragma("diag_suppress=Pm120") +#define SDK_PRAGMA(x) _Pragma(#x) + _Pragma("diag_error=Pm120") +/*! Macro to define a variable with alignbytes alignment */ +#define SDK_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var +#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) +/*! Macro to define a variable with alignbytes alignment */ +#define SDK_ALIGN(var, alignbytes) __attribute__((aligned(alignbytes))) var +#elif defined(__GNUC__) || defined(DOXYGEN_OUTPUT) +/*! Macro to define a variable with alignbytes alignment */ +#define SDK_ALIGN(var, alignbytes) var __attribute__((aligned(alignbytes))) +#else +#error Toolchain not supported +#endif + +/*! Macro to define a variable with L1 d-cache line size alignment */ +#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) +#define SDK_L1DCACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L1DCACHE_LINESIZE_BYTE) +#endif +/*! Macro to define a variable with L2 cache line size alignment */ +#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE) +#define SDK_L2CACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L2CACHE_LINESIZE_BYTE) +#endif + +/*! Macro to change a value to a given size aligned value */ +#define SDK_SIZEALIGN(var, alignbytes) \ + ((unsigned int)((var) + ((alignbytes)-1U)) & (unsigned int)(~(unsigned int)((alignbytes)-1U))) +/*! @} */ + +/*! + * @name Non-cacheable region definition macros + * + * For initialized non-zero non-cacheable variables, please use "AT_NONCACHEABLE_SECTION_INIT(var) ={xx};" or + * "AT_NONCACHEABLE_SECTION_ALIGN_INIT(var) ={xx};" in your projects to define them. For zero-inited non-cacheable + * variables, please use "AT_NONCACHEABLE_SECTION(var);" or "AT_NONCACHEABLE_SECTION_ALIGN(var);" to define them, + * these zero-inited variables will be initialized to zero in system startup. + * + * @note For GCC, when the non-cacheable section is required, please define "__STARTUP_INITIALIZE_NONCACHEDATA" + * in your projects to make sure the non-cacheable section variables will be initialized in system startup. + * + * @{ + */ + +/*! + * @def AT_NONCACHEABLE_SECTION(var) + * Define a variable \a var, and place it in non-cacheable section. + * + * @def AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) + * Define a variable \a var, and place it in non-cacheable section, the start address + * of the variable is aligned to \a alignbytes. + * + * @def AT_NONCACHEABLE_SECTION_INIT(var) + * Define a variable \a var with initial value, and place it in non-cacheable section. + * + * @def AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) + * Define a variable \a var with initial value, and place it in non-cacheable section, + * the start address of the variable is aligned to \a alignbytes. + */ + +#if ((!(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION)) && \ + defined(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE)) + +#if (defined(__ICCARM__)) +#define AT_NONCACHEABLE_SECTION(var) var @"NonCacheable" +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable" +#define AT_NONCACHEABLE_SECTION_INIT(var) var @"NonCacheable.init" +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \ + SDK_PRAGMA(data_alignment = alignbytes) var @"NonCacheable.init" + +#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION)) +#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \ + __attribute__((section("NonCacheable.init"))) __attribute__((aligned(alignbytes))) var +#if (defined(__CC_ARM)) +#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable"), zero_init)) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ + __attribute__((section("NonCacheable"), zero_init)) __attribute__((aligned(alignbytes))) var +#else +#define AT_NONCACHEABLE_SECTION(var) __attribute__((section(".bss.NonCacheable"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ + __attribute__((section(".bss.NonCacheable"))) __attribute__((aligned(alignbytes))) var +#endif + +#elif (defined(__GNUC__)) || defined(DOXYGEN_OUTPUT) +/* For GCC, when the non-cacheable section is required, please define "__STARTUP_INITIALIZE_NONCACHEDATA" + * in your projects to make sure the non-cacheable section variables will be initialized in system startup. + */ +#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section("NonCacheable.init"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \ + __attribute__((section("NonCacheable.init"))) var __attribute__((aligned(alignbytes))) +#define AT_NONCACHEABLE_SECTION(var) __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \ + __attribute__((section("NonCacheable,\"aw\",%nobits @"))) var __attribute__((aligned(alignbytes))) +#else +#error Toolchain not supported. +#endif + +#else + +#define AT_NONCACHEABLE_SECTION(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_ALIGN(var, alignbytes) +#define AT_NONCACHEABLE_SECTION_INIT(var) var +#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_ALIGN(var, alignbytes) + +#endif + +/*! @} */ + +/*! + * @name Time sensitive region + * @{ + */ + +/*! + * @def AT_QUICKACCESS_SECTION_CODE(func) + * Place function in a section which can be accessed quickly by core. + * + * @def AT_QUICKACCESS_SECTION_DATA(var) + * Place data in a section which can be accessed quickly by core. + * + * @def AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) + * Place data in a section which can be accessed quickly by core, and the variable + * address is set to align with \a alignbytes. + */ +#if (defined(__ICCARM__)) +#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess" +#define AT_QUICKACCESS_SECTION_DATA(var) var @"DataQuickAccess" +#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \ + SDK_PRAGMA(data_alignment = alignbytes) var @"DataQuickAccess" +#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION)) +#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func +#define AT_QUICKACCESS_SECTION_DATA(var) __attribute__((section("DataQuickAccess"))) var +#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \ + __attribute__((section("DataQuickAccess"))) __attribute__((aligned(alignbytes))) var +#elif (defined(__GNUC__)) || defined(DOXYGEN_OUTPUT) +#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section("CodeQuickAccess"), __noinline__)) func +#define AT_QUICKACCESS_SECTION_DATA(var) __attribute__((section("DataQuickAccess"))) var +#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \ + __attribute__((section("DataQuickAccess"))) var __attribute__((aligned(alignbytes))) +#else +#error Toolchain not supported. +#endif /* defined(__ICCARM__) */ +/*! @} */ + +/*! + * @name Ram Function + * @{ + * + * @def RAMFUNCTION_SECTION_CODE(func) + * Place function in ram. + */ +#if (defined(__ICCARM__)) +#define RAMFUNCTION_SECTION_CODE(func) func @"RamFunction" +#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION)) +#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func +#elif (defined(__GNUC__)) || defined(DOXYGEN_OUTPUT) +#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section("RamFunction"))) func +#else +#error Toolchain not supported. +#endif /* defined(__ICCARM__) */ +/*! @} */ + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + void DefaultISR(void); +#endif + +/* + * The fsl_clock.h is included here because it needs MAKE_VERSION/MAKE_STATUS/status_t + * defined in previous of this file. + */ +#include "fsl_clock.h" + +/* + * Chip level peripheral reset API, for MCUs that implement peripheral reset control external to a peripheral + */ +#if ((defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) || \ + (defined(FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT) && (FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT > 0))) +#include "fsl_reset.h" +#endif + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief Enable specific interrupt. + * + * Enable LEVEL1 interrupt. For some devices, there might be multiple interrupt + * levels. For example, there are NVIC and intmux. Here the interrupts connected + * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. + * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed + * to NVIC first then routed to core. + * + * This function only enables the LEVEL1 interrupts. The number of LEVEL1 interrupts + * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. + * + * @param interrupt The IRQ number. + * @retval kStatus_Success Interrupt enabled successfully + * @retval kStatus_Fail Failed to enable the interrupt + */ +static inline status_t EnableIRQ(IRQn_Type interrupt) +{ + status_t status = kStatus_Success; + + if (NotAvail_IRQn == interrupt) + { + status = kStatus_Fail; + } + +#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) + else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) + { + status = kStatus_Fail; + } +#endif + + else + { +#if defined(__GIC_PRIO_BITS) + GIC_EnableIRQ(interrupt); +#else + NVIC_EnableIRQ(interrupt); +#endif + } + + return status; +} + +/*! + * @brief Disable specific interrupt. + * + * Disable LEVEL1 interrupt. For some devices, there might be multiple interrupt + * levels. For example, there are NVIC and intmux. Here the interrupts connected + * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. + * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed + * to NVIC first then routed to core. + * + * This function only disables the LEVEL1 interrupts. The number of LEVEL1 interrupts + * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. + * + * @param interrupt The IRQ number. + * @retval kStatus_Success Interrupt disabled successfully + * @retval kStatus_Fail Failed to disable the interrupt + */ +static inline status_t DisableIRQ(IRQn_Type interrupt) +{ + status_t status = kStatus_Success; + + if (NotAvail_IRQn == interrupt) + { + status = kStatus_Fail; + } + +#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) + else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) + { + status = kStatus_Fail; + } +#endif + + else + { +#if defined(__GIC_PRIO_BITS) + GIC_DisableIRQ(interrupt); +#else + NVIC_DisableIRQ(interrupt); +#endif + } + + return status; +} + +/*! + * @brief Enable the IRQ, and also set the interrupt priority. + * + * Only handle LEVEL1 interrupt. For some devices, there might be multiple interrupt + * levels. For example, there are NVIC and intmux. Here the interrupts connected + * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. + * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed + * to NVIC first then routed to core. + * + * This function only handles the LEVEL1 interrupts. The number of LEVEL1 interrupts + * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. + * + * @param interrupt The IRQ to Enable. + * @param priNum Priority number set to interrupt controller register. + * @retval kStatus_Success Interrupt priority set successfully + * @retval kStatus_Fail Failed to set the interrupt priority. + */ +static inline status_t EnableIRQWithPriority(IRQn_Type interrupt, uint8_t priNum) +{ + status_t status = kStatus_Success; + + if (NotAvail_IRQn == interrupt) + { + status = kStatus_Fail; + } + +#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) + else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) + { + status = kStatus_Fail; + } +#endif + + else + { +#if defined(__GIC_PRIO_BITS) + GIC_SetPriority(interrupt, priNum); + GIC_EnableIRQ(interrupt); +#else + NVIC_SetPriority(interrupt, priNum); + NVIC_EnableIRQ(interrupt); +#endif + } + + return status; +} + +/*! + * @brief Set the IRQ priority. + * + * Only handle LEVEL1 interrupt. For some devices, there might be multiple interrupt + * levels. For example, there are NVIC and intmux. Here the interrupts connected + * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. + * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed + * to NVIC first then routed to core. + * + * This function only handles the LEVEL1 interrupts. The number of LEVEL1 interrupts + * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. + * + * @param interrupt The IRQ to set. + * @param priNum Priority number set to interrupt controller register. + * + * @retval kStatus_Success Interrupt priority set successfully + * @retval kStatus_Fail Failed to set the interrupt priority. + */ +static inline status_t IRQ_SetPriority(IRQn_Type interrupt, uint8_t priNum) +{ + status_t status = kStatus_Success; + + if (NotAvail_IRQn == interrupt) + { + status = kStatus_Fail; + } + +#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) + else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) + { + status = kStatus_Fail; + } +#endif + + else + { +#if defined(__GIC_PRIO_BITS) + GIC_SetPriority(interrupt, priNum); +#else + NVIC_SetPriority(interrupt, priNum); +#endif + } + + return status; +} + +/*! + * @brief Clear the pending IRQ flag. + * + * Only handle LEVEL1 interrupt. For some devices, there might be multiple interrupt + * levels. For example, there are NVIC and intmux. Here the interrupts connected + * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly. + * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed + * to NVIC first then routed to core. + * + * This function only handles the LEVEL1 interrupts. The number of LEVEL1 interrupts + * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS. + * + * @param interrupt The flag which IRQ to clear. + * + * @retval kStatus_Success Interrupt priority set successfully + * @retval kStatus_Fail Failed to set the interrupt priority. + */ +static inline status_t IRQ_ClearPendingIRQ(IRQn_Type interrupt) +{ + status_t status = kStatus_Success; + + if (NotAvail_IRQn == interrupt) + { + status = kStatus_Fail; + } + +#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0) + else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) + { + status = kStatus_Fail; + } +#endif + + else + { +#if defined(__GIC_PRIO_BITS) + GIC_ClearPendingIRQ(interrupt); +#else + NVIC_ClearPendingIRQ(interrupt); +#endif + } + + return status; +} + +/*! + * @brief Disable the global IRQ + * + * Disable the global interrupt and return the current primask register. User is required to provided the primask + * register for the EnableGlobalIRQ(). + * + * @return Current primask value. + */ +static inline uint32_t DisableGlobalIRQ(void) +{ + uint32_t mask; + +#if defined(CPSR_I_Msk) + mask = __get_CPSR() & CPSR_I_Msk; +#elif defined(DAIF_I_BIT) + mask = __get_DAIF() & DAIF_I_BIT; +#else + mask = __get_PRIMASK(); +#endif + __disable_irq(); + + return mask; +} + +/*! + * @brief Enable the global IRQ + * + * Set the primask register with the provided primask value but not just enable the primask. The idea is for the + * convenience of integration of RTOS. some RTOS get its own management mechanism of primask. User is required to + * use the EnableGlobalIRQ() and DisableGlobalIRQ() in pair. + * + * @param primask value of primask register to be restored. The primask value is supposed to be provided by the + * DisableGlobalIRQ(). + */ +static inline void EnableGlobalIRQ(uint32_t primask) +{ +#if defined(CPSR_I_Msk) + __set_CPSR((__get_CPSR() & ~CPSR_I_Msk) | primask); +#elif defined(DAIF_I_BIT) + if (0UL == primask) + { + __enable_irq(); + } +#else + __set_PRIMASK(primask); +#endif +} + +#if defined(ENABLE_RAM_VECTOR_TABLE) +/*! + * @brief install IRQ handler + * + * @param irq IRQ number + * @param irqHandler IRQ handler address + * @return The old IRQ handler address + */ +uint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler); +#endif /* ENABLE_RAM_VECTOR_TABLE. */ + +#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) + +/* + * When FSL_FEATURE_POWERLIB_EXTEND is defined to non-zero value, + * powerlib should be used instead of these functions. + */ +#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0)) +/*! + * @brief Enable specific interrupt for wake-up from deep-sleep mode. + * + * Enable the interrupt for wake-up from deep sleep mode. + * Some interrupts are typically used in sleep mode only and will not occur during + * deep-sleep mode because relevant clocks are stopped. However, it is possible to enable + * those clocks (significantly increasing power consumption in the reduced power mode), + * making these wake-ups possible. + * + * @note This function also enables the interrupt in the NVIC (EnableIRQ() is called internaly). + * + * @param interrupt The IRQ number. + */ +void EnableDeepSleepIRQ(IRQn_Type interrupt); + +/*! + * @brief Disable specific interrupt for wake-up from deep-sleep mode. + * + * Disable the interrupt for wake-up from deep sleep mode. + * Some interrupts are typically used in sleep mode only and will not occur during + * deep-sleep mode because relevant clocks are stopped. However, it is possible to enable + * those clocks (significantly increasing power consumption in the reduced power mode), + * making these wake-ups possible. + * + * @note This function also disables the interrupt in the NVIC (DisableIRQ() is called internaly). + * + * @param interrupt The IRQ number. + */ +void DisableDeepSleepIRQ(IRQn_Type interrupt); +#endif /* FSL_FEATURE_POWERLIB_EXTEND */ +#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */ + +#if defined(DWT) +/*! + * @brief Enable the counter to get CPU cycles. + */ +void MSDK_EnableCpuCycleCounter(void); + +/*! + * @brief Get the current CPU cycle count. + * + * @return Current CPU cycle count. + */ +uint32_t MSDK_GetCpuCycleCount(void); +#endif + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/*! @} */ + +#endif /* FSL_COMMON_ARM_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_crc.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_crc.c new file mode 100644 index 00000000000..f4e303be95e --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_crc.c @@ -0,0 +1,371 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2017, 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#include "fsl_crc.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.crc" +#endif + +/*! @internal @brief Has data register with name CRC. */ +#if defined(FSL_FEATURE_CRC_HAS_CRC_REG) && FSL_FEATURE_CRC_HAS_CRC_REG +#define DATA CRC +#define DATALL CRCLL +#endif + +#if defined(CRC_DRIVER_USE_CRC16_CCIT_FALSE_AS_DEFAULT) && CRC_DRIVER_USE_CRC16_CCIT_FALSE_AS_DEFAULT +/* @brief Default user configuration structure for CRC-16-CCITT */ +#define CRC_DRIVER_DEFAULT_POLYNOMIAL 0x1021U +/*< CRC-16-CCIT polynomial x**16 + x**12 + x**5 + x**0 */ +#define CRC_DRIVER_DEFAULT_SEED 0xFFFFU +/*< Default initial checksum */ +#define CRC_DRIVER_DEFAULT_REFLECT_IN false +/*< Default is no transpose */ +#define CRC_DRIVER_DEFAULT_REFLECT_OUT false +/*< Default is transpose bytes */ +#define CRC_DRIVER_DEFAULT_COMPLEMENT_CHECKSUM false +/*< Default is without complement of CRC data register read data */ +#define CRC_DRIVER_DEFAULT_CRC_BITS kCrcBits16 +/*< Default is 16-bit CRC protocol */ +#define CRC_DRIVER_DEFAULT_CRC_RESULT kCrcFinalChecksum +/*< Default is resutl type is final checksum */ +#endif /* CRC_DRIVER_USE_CRC16_CCIT_FALSE_AS_DEFAULT */ + +#if defined(CRC_RSTS) +#define CRC_RESETS_ARRAY CRC_RSTS +#endif + +/*! @brief CRC type of transpose of read write data */ +typedef enum _crc_transpose_type +{ + kCrcTransposeNone = 0U, /*! No transpose */ + kCrcTransposeBits = 1U, /*! Tranpose bits in bytes */ + kCrcTransposeBitsAndBytes = 2U, /*! Transpose bytes and bits in bytes */ + kCrcTransposeBytes = 3U, /*! Transpose bytes */ +} crc_transpose_type_t; + +/*! + * @brief CRC module configuration. + * + * This structure holds the configuration for the CRC module. + */ +typedef struct _crc_module_config +{ + uint32_t polynomial; /*!< CRC Polynomial, MSBit first.@n + Example polynomial: 0x1021 = 1_0000_0010_0001 = x^12+x^5+1 */ + uint32_t seed; /*!< Starting checksum value */ + crc_transpose_type_t readTranspose; /*!< Type of transpose when reading CRC result. */ + crc_transpose_type_t writeTranspose; /*!< Type of transpose when writing CRC input data. */ + bool complementChecksum; /*!< True if the result shall be complement of the actual checksum. */ + crc_bits_t crcBits; /*!< Selects 16- or 32- bit CRC protocol. */ +} crc_module_config_t; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +#if defined(CRC_RESETS_ARRAY) +/*! + * @brief Get instance number for CRC module. + * + * @param base CRC peripheral base address + */ +static uint32_t CRC_GetInstance(CRC_Type *base); +#endif +/******************************************************************************* + * Variables + ******************************************************************************/ +#if defined(CRC_RESETS_ARRAY) +static CRC_Type *const s_crcBases[] = CRC_BASE_PTRS; + +/* Reset array */ +static const reset_ip_name_t s_crcResets[] = CRC_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ +#if defined(CRC_RESETS_ARRAY) +static uint32_t CRC_GetInstance(CRC_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_crcBases); instance++) + { + if (s_crcBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_crcBases)); + + return instance; +} +#endif + +/*! + * @brief Returns transpose type for CRC protocol reflect in parameter. + * + * This functions helps to set writeTranspose member of crc_config_t structure. Reflect in is CRC protocol parameter. + * + * @param enable True or false for the selected CRC protocol Reflect In (refin) parameter. + */ +static inline crc_transpose_type_t CRC_GetTransposeTypeFromReflectIn(bool enable) +{ + return ((enable) ? kCrcTransposeBitsAndBytes : kCrcTransposeBytes); +} + +/*! + * @brief Returns transpose type for CRC protocol reflect out parameter. + * + * This functions helps to set readTranspose member of crc_config_t structure. Reflect out is CRC protocol parameter. + * + * @param enable True or false for the selected CRC protocol Reflect Out (refout) parameter. + */ +static inline crc_transpose_type_t CRC_GetTransposeTypeFromReflectOut(bool enable) +{ + return ((enable) ? kCrcTransposeBitsAndBytes : kCrcTransposeNone); +} + +/*! + * @brief Starts checksum computation. + * + * Configures the CRC module for the specified CRC protocol. @n + * Starts the checksum computation by writing the seed value + * + * @param base CRC peripheral address. + * @param config Pointer to protocol configuration structure. + */ +static void CRC_ConfigureAndStart(CRC_Type *base, const crc_module_config_t *config) +{ + uint32_t crcControl; + + /* pre-compute value for CRC control registger based on user configuraton without WAS field */ + crcControl = 0U | CRC_CTRL_TOT(config->writeTranspose) | CRC_CTRL_TOTR(config->readTranspose) | + CRC_CTRL_FXOR(config->complementChecksum) | CRC_CTRL_TCRC(config->crcBits); + + /* make sure the control register is clear - WAS is deasserted, and protocol is set */ + base->CTRL = crcControl; + + /* write polynomial register */ + base->GPOLY = config->polynomial; + + /* write pre-computed control register value along with WAS to start checksum computation */ + base->CTRL = crcControl | CRC_CTRL_WAS(true); + + /* write seed (initial checksum) */ + base->DATA = config->seed; + + /* deassert WAS by writing pre-computed CRC control register value */ + base->CTRL = crcControl; +} + +/*! + * @brief Starts final checksum computation. + * + * Configures the CRC module for the specified CRC protocol. @n + * Starts final checksum computation by writing the seed value. + * @note CRC_Get16bitResult() or CRC_Get32bitResult() return final checksum + * (output reflection and xor functions are applied). + * + * @param base CRC peripheral address. + * @param protocolConfig Pointer to protocol configuration structure. + */ +static void CRC_SetProtocolConfig(CRC_Type *base, const crc_config_t *protocolConfig) +{ + crc_module_config_t moduleConfig; + /* convert protocol to CRC peripheral module configuration, prepare for final checksum */ + moduleConfig.polynomial = protocolConfig->polynomial; + moduleConfig.seed = protocolConfig->seed; + moduleConfig.readTranspose = CRC_GetTransposeTypeFromReflectOut(protocolConfig->reflectOut); + moduleConfig.writeTranspose = CRC_GetTransposeTypeFromReflectIn(protocolConfig->reflectIn); + moduleConfig.complementChecksum = protocolConfig->complementChecksum; + moduleConfig.crcBits = protocolConfig->crcBits; + + CRC_ConfigureAndStart(base, &moduleConfig); +} + +/*! + * @brief Starts intermediate checksum computation. + * + * Configures the CRC module for the specified CRC protocol. @n + * Starts intermediate checksum computation by writing the seed value. + * @note CRC_Get16bitResult() or CRC_Get32bitResult() return intermediate checksum (raw data register value). + * + * @param base CRC peripheral address. + * @param protocolConfig Pointer to protocol configuration structure. + */ +static void CRC_SetRawProtocolConfig(CRC_Type *base, const crc_config_t *protocolConfig) +{ + crc_module_config_t moduleConfig; + /* convert protocol to CRC peripheral module configuration, prepare for intermediate checksum */ + moduleConfig.polynomial = protocolConfig->polynomial; + moduleConfig.seed = protocolConfig->seed; + moduleConfig.readTranspose = + kCrcTransposeNone; /* intermediate checksum does no transpose of data register read value */ + moduleConfig.writeTranspose = CRC_GetTransposeTypeFromReflectIn(protocolConfig->reflectIn); + moduleConfig.complementChecksum = false; /* intermediate checksum does no xor of data register read value */ + moduleConfig.crcBits = protocolConfig->crcBits; + + CRC_ConfigureAndStart(base, &moduleConfig); +} + +/*! + * brief Enables and configures the CRC peripheral module. + * + * This function enables the clock gate in the SIM module for the CRC peripheral. + * It also configures the CRC module and starts a checksum computation by writing the seed. + * + * param base CRC peripheral address. + * param config CRC module configuration structure. + */ +void CRC_Init(CRC_Type *base, const crc_config_t *config) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* ungate clock */ + CLOCK_EnableClock(kCLOCK_Crc0); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(CRC_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_crcResets[CRC_GetInstance(base)]); +#endif + + /* configure CRC module and write the seed */ + if (config->crcResult == kCrcFinalChecksum) + { + CRC_SetProtocolConfig(base, config); + } + else + { + CRC_SetRawProtocolConfig(base, config); + } +} + +/*! + * brief Loads default values to the CRC protocol configuration structure. + * + * Loads default values to the CRC protocol configuration structure. The default values are as follows. + * code + * config->polynomial = 0x1021; + * config->seed = 0xFFFF; + * config->reflectIn = false; + * config->reflectOut = false; + * config->complementChecksum = false; + * config->crcBits = kCrcBits16; + * config->crcResult = kCrcFinalChecksum; + * endcode + * + * param config CRC protocol configuration structure. + */ +void CRC_GetDefaultConfig(crc_config_t *config) +{ + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + static const crc_config_t crc16ccit = { + CRC_DRIVER_DEFAULT_POLYNOMIAL, CRC_DRIVER_DEFAULT_SEED, + CRC_DRIVER_DEFAULT_REFLECT_IN, CRC_DRIVER_DEFAULT_REFLECT_OUT, + CRC_DRIVER_DEFAULT_COMPLEMENT_CHECKSUM, CRC_DRIVER_DEFAULT_CRC_BITS, + CRC_DRIVER_DEFAULT_CRC_RESULT, + }; + + *config = crc16ccit; +} + +/*! + * brief Writes data to the CRC module. + * + * Writes input data buffer bytes to the CRC data register. + * The configured type of transpose is applied. + * + * param base CRC peripheral address. + * param data Input data stream, MSByte in data[0]. + * param dataSize Size in bytes of the input data buffer. + */ +void CRC_WriteData(CRC_Type *base, const uint8_t *data, size_t dataSize) +{ + const uint32_t *data32; + + /* 8-bit reads and writes till source address is aligned 4 bytes */ + while ((0U != dataSize) && (0U != ((uint32_t)data & 3U))) + { + base->ACCESS8BIT.DATALL = *data; + data++; + dataSize--; + } + + /* use 32-bit reads and writes as long as possible */ + data32 = (const uint32_t *)(uint32_t)data; + while (dataSize >= sizeof(uint32_t)) + { + base->DATA = *data32; + data32++; + dataSize -= sizeof(uint32_t); + } + + data = (const uint8_t *)data32; + + /* 8-bit reads and writes till end of data buffer */ + while (dataSize != 0U) + { + base->ACCESS8BIT.DATALL = *data; + data++; + dataSize--; + } +} + +/*! + * brief Reads the 32-bit checksum from the CRC module. + * + * Reads the CRC data register (either an intermediate or the final checksum). + * The configured type of transpose and complement is applied. + * + * param base CRC peripheral address. + * return An intermediate or the final 32-bit checksum, after configured transpose and complement operations. + */ +uint32_t CRC_Get32bitResult(CRC_Type *base) +{ + return base->DATA; +} + +/*! + * brief Reads a 16-bit checksum from the CRC module. + * + * Reads the CRC data register (either an intermediate or the final checksum). + * The configured type of transpose and complement is applied. + * + * param base CRC peripheral address. + * return An intermediate or the final 16-bit checksum, after configured transpose and complement operations. + */ +uint16_t CRC_Get16bitResult(CRC_Type *base) +{ + uint32_t retval; + uint32_t totr; /* type of transpose read bitfield */ + + retval = base->DATA; + totr = (base->CTRL & CRC_CTRL_TOTR_MASK) >> CRC_CTRL_TOTR_SHIFT; + + /* check transpose type to get 16-bit out of 32-bit register */ + if (totr >= 2U) + { + /* transpose of bytes for read is set, the result CRC is in CRC_DATA[HU:HL] */ + retval &= 0xFFFF0000U; + retval = retval >> 16U; + } + else + { + /* no transpose of bytes for read, the result CRC is in CRC_DATA[LU:LL] */ + retval &= 0x0000FFFFU; + } + return (uint16_t)retval; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_crc.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_crc.h new file mode 100644 index 00000000000..487e9f1095f --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_crc.h @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2017, 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_CRC_H_ +#define FSL_CRC_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup crc + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief CRC driver version. Version 2.0.4. + * + * Current version: 2.0.4 + * + * Change log: + * + * - Version 2.0.4 + * - Release peripheral from reset if necessary in init function. + * + * - Version 2.0.3 + * - Fix MISRA issues + * + * - Version 2.0.2 + * - Fix MISRA issues + * + * - Version 2.0.1 + * - move DATA and DATALL macro definition from header file to source file + */ +#define FSL_CRC_DRIVER_VERSION (MAKE_VERSION(2, 0, 4)) +/*! @} */ + +#ifndef CRC_DRIVER_CUSTOM_DEFAULTS +/*! @brief Default configuration structure filled by CRC_GetDefaultConfig(). Use CRC16-CCIT-FALSE as defeault. */ +#define CRC_DRIVER_USE_CRC16_CCIT_FALSE_AS_DEFAULT 1 +#endif + +/*! @brief CRC bit width */ +typedef enum _crc_bits +{ + kCrcBits16 = 0U, /*!< Generate 16-bit CRC code */ + kCrcBits32 = 1U /*!< Generate 32-bit CRC code */ +} crc_bits_t; + +/*! @brief CRC result type */ +typedef enum _crc_result +{ + kCrcFinalChecksum = 0U, /*!< CRC data register read value is the final checksum. + Reflect out and final xor protocol features are applied. */ + kCrcIntermediateChecksum = 1U /*!< CRC data register read value is intermediate checksum (raw value). + Reflect out and final xor protocol feature are not applied. + Intermediate checksum can be used as a seed for CRC_Init() + to continue adding data to this checksum. */ +} crc_result_t; + +/*! + * @brief CRC protocol configuration. + * + * This structure holds the configuration for the CRC protocol. + * + */ +typedef struct _crc_config +{ + uint32_t polynomial; /*!< CRC Polynomial, MSBit first. + Example polynomial: 0x1021 = 1_0000_0010_0001 = x^12+x^5+1 */ + uint32_t seed; /*!< Starting checksum value */ + bool reflectIn; /*!< Reflect bits on input. */ + bool reflectOut; /*!< Reflect bits on output. */ + bool complementChecksum; /*!< True if the result shall be complement of the actual checksum. */ + crc_bits_t crcBits; /*!< Selects 16- or 32- bit CRC protocol. */ + crc_result_t crcResult; /*!< Selects final or intermediate checksum return from CRC_Get16bitResult() or + CRC_Get32bitResult() */ +} crc_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Enables and configures the CRC peripheral module. + * + * This function enables the clock gate in the SIM module for the CRC peripheral. + * It also configures the CRC module and starts a checksum computation by writing the seed. + * + * @param base CRC peripheral address. + * @param config CRC module configuration structure. + */ +void CRC_Init(CRC_Type *base, const crc_config_t *config); + +/*! + * @brief Disables the CRC peripheral module. + * + * This function disables the clock gate in the SIM module for the CRC peripheral. + * + * @param base CRC peripheral address. + */ +static inline void CRC_Deinit(CRC_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* gate clock */ + CLOCK_DisableClock(kCLOCK_Crc0); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * @brief Loads default values to the CRC protocol configuration structure. + * + * Loads default values to the CRC protocol configuration structure. The default values are as follows. + * @code + * config->polynomial = 0x1021; + * config->seed = 0xFFFF; + * config->reflectIn = false; + * config->reflectOut = false; + * config->complementChecksum = false; + * config->crcBits = kCrcBits16; + * config->crcResult = kCrcFinalChecksum; + * @endcode + * + * @param config CRC protocol configuration structure. + */ +void CRC_GetDefaultConfig(crc_config_t *config); + +/*! + * @brief Writes data to the CRC module. + * + * Writes input data buffer bytes to the CRC data register. + * The configured type of transpose is applied. + * + * @param base CRC peripheral address. + * @param data Input data stream, MSByte in data[0]. + * @param dataSize Size in bytes of the input data buffer. + */ +void CRC_WriteData(CRC_Type *base, const uint8_t *data, size_t dataSize); + +/*! + * @brief Reads the 32-bit checksum from the CRC module. + * + * Reads the CRC data register (either an intermediate or the final checksum). + * The configured type of transpose and complement is applied. + * + * @param base CRC peripheral address. + * @return An intermediate or the final 32-bit checksum, after configured transpose and complement operations. + */ +uint32_t CRC_Get32bitResult(CRC_Type *base); + +/*! + * @brief Reads a 16-bit checksum from the CRC module. + * + * Reads the CRC data register (either an intermediate or the final checksum). + * The configured type of transpose and complement is applied. + * + * @param base CRC peripheral address. + * @return An intermediate or the final 16-bit checksum, after configured transpose and complement operations. + */ +uint16_t CRC_Get16bitResult(CRC_Type *base); + +#if defined(__cplusplus) +} +#endif + +/*! + *@} + */ + +#endif /* FSL_CRC_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ctimer.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ctimer.c new file mode 100644 index 00000000000..3317157fdeb --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ctimer.c @@ -0,0 +1,604 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_ctimer.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.ctimer" +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Gets the instance from the base address + * + * @param base Ctimer peripheral base address + * + * @return The Timer instance + */ +static uint32_t CTIMER_GetInstance(CTIMER_Type *base); + +/*! + * @brief CTIMER generic IRQ handle function. + * + * @param index FlexCAN peripheral instance index. + */ +static void CTIMER_GenericIRQHandler(uint32_t index); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to Timer bases for each instance. */ +static CTIMER_Type *const s_ctimerBases[] = CTIMER_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to Timer clocks for each instance. */ +static const clock_ip_name_t s_ctimerClocks[] = CTIMER_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_RESET) && (FSL_FEATURE_CTIMER_HAS_NO_RESET)) +#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) +#if defined(FSL_FEATURE_CTIMER_WRITE_ZERO_ASSERT_RESET) && FSL_FEATURE_CTIMER_WRITE_ZERO_ASSERT_RESET +/*! @brief Pointers to Timer resets for each instance, writing a zero asserts the reset */ +static const reset_ip_name_t s_ctimerResets[] = CTIMER_RSTS_N; +#else +/*! @brief Pointers to Timer resets for each instance, writing a one asserts the reset */ +static const reset_ip_name_t s_ctimerResets[] = CTIMER_RSTS; +#endif +#endif +#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */ + +/*! @brief Pointers real ISRs installed by drivers for each instance. */ +static ctimer_callback_t *s_ctimerCallback[sizeof(s_ctimerBases) / sizeof(s_ctimerBases[0])] = {0}; + +/*! @brief Callback type installed by drivers for each instance. */ +static ctimer_callback_type_t ctimerCallbackType[sizeof(s_ctimerBases) / sizeof(s_ctimerBases[0])] = { + kCTIMER_SingleCallback}; + +/*! @brief Array to map timer instance to IRQ number. */ +static const IRQn_Type s_ctimerIRQ[] = CTIMER_IRQS; + +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t CTIMER_GetInstance(CTIMER_Type *base) +{ + uint32_t instance; + uint32_t ctimerArrayCount = (sizeof(s_ctimerBases) / sizeof(s_ctimerBases[0])); + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ctimerArrayCount; instance++) + { + if (s_ctimerBases[instance] == base) + { + break; + } + } + + assert(instance < ctimerArrayCount); + + return instance; +} + +/*! + * brief Ungates the clock and configures the peripheral for basic operation. + * + * note This API should be called at the beginning of the application before using the driver. + * + * param base Ctimer peripheral base address + * param config Pointer to the user configuration structure. + */ +void CTIMER_Init(CTIMER_Type *base, const ctimer_config_t *config) +{ + assert(config != NULL); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable the timer clock*/ + CLOCK_EnableClock(s_ctimerClocks[CTIMER_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) +/* Reset the module. */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_RESET) && (FSL_FEATURE_CTIMER_HAS_NO_RESET)) + RESET_PeripheralReset(s_ctimerResets[CTIMER_GetInstance(base)]); +#endif +#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */ + +/* Setup the cimer mode and count select */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE) && (FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE)) + base->CTCR = CTIMER_CTCR_CTMODE(config->mode) | CTIMER_CTCR_CINSEL(config->input); +#endif + /* Setup the timer prescale value */ + base->PR = CTIMER_PR_PRVAL(config->prescale); +} + +/*! + * brief Gates the timer clock. + * + * param base Ctimer peripheral base address + */ +void CTIMER_Deinit(CTIMER_Type *base) +{ + uint32_t index = CTIMER_GetInstance(base); + /* Stop the timer */ + base->TCR &= ~CTIMER_TCR_CEN_MASK; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Disable the timer clock*/ + CLOCK_DisableClock(s_ctimerClocks[index]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + /* Disable IRQ at NVIC Level */ + (void)DisableIRQ(s_ctimerIRQ[index]); +} + +/*! + * brief Fills in the timers configuration structure with the default settings. + * + * The default values are: + * code + * config->mode = kCTIMER_TimerMode; + * config->input = kCTIMER_Capture_0; + * config->prescale = 0; + * endcode + * param config Pointer to the user configuration structure. + */ +void CTIMER_GetDefaultConfig(ctimer_config_t *config) +{ + assert(config != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + /* Run as a timer */ + config->mode = kCTIMER_TimerMode; + /* This field is ignored when mode is timer */ + config->input = kCTIMER_Capture_0; + /* Timer counter is incremented on every APB bus clock */ + config->prescale = 0; +} + +/*! + * brief Configures the PWM signal parameters. + * + * Enables PWM mode on the match channel passed in and will then setup the match value + * and other match parameters to generate a PWM signal. + * This function can manually assign the specified channel to set the PWM cycle. + * + * note When setting PWM output from multiple output pins, all should use the same PWM + * frequency. Please use CTIMER_SetupPwmPeriod to set up the PWM with high resolution. + * + * param base Ctimer peripheral base address + * param pwmPeriodChannel Specify the channel to control the PWM period + * param matchChannel Match pin to be used to output the PWM signal + * param dutyCyclePercent PWM pulse width; the value should be between 0 to 100 + * param pwmFreq_Hz PWM signal frequency in Hz + * param srcClock_Hz Timer counter clock in Hz + * param enableInt Enable interrupt when the timer value reaches the match value of the PWM pulse, + * if it is 0 then no interrupt will be generated. + * + * return kStatus_Success on success + * kStatus_Fail If matchChannel is equal to pwmPeriodChannel; this channel is reserved to set the PWM cycle + */ +status_t CTIMER_SetupPwm(CTIMER_Type *base, + const ctimer_match_t pwmPeriodChannel, + ctimer_match_t matchChannel, + uint8_t dutyCyclePercent, + uint32_t pwmFreq_Hz, + uint32_t srcClock_Hz, + bool enableInt) +{ + assert(pwmFreq_Hz > 0U); + + uint32_t reg; + uint32_t period, pulsePeriod = 0; + uint32_t timerClock = srcClock_Hz / (base->PR + 1U); + uint32_t index = CTIMER_GetInstance(base); + + if (matchChannel == pwmPeriodChannel) + { + return kStatus_Fail; + } + + /* Enable PWM mode on the match channel */ + base->PWMC |= (1UL << (uint32_t)matchChannel); + + /* Clear the stop, reset and interrupt bits for this channel */ + reg = base->MCR; + reg &= + ~(((uint32_t)((uint32_t)CTIMER_MCR_MR0R_MASK | (uint32_t)CTIMER_MCR_MR0S_MASK | (uint32_t)CTIMER_MCR_MR0I_MASK)) + << ((uint32_t)matchChannel * 3U)); + + /* If call back function is valid then enable match interrupt for the channel */ + if (enableInt) + { + reg |= (((uint32_t)CTIMER_MCR_MR0I_MASK) << (CTIMER_MCR_MR0I_SHIFT + ((uint32_t)matchChannel * 3U))); + } + + /* Reset the counter when match on PWM period channel (pwmPeriodChannel) */ + reg |= ((uint32_t)((uint32_t)CTIMER_MCR_MR0R_MASK) << ((uint32_t)pwmPeriodChannel * 3U)); + + base->MCR = reg; + + /* Calculate PWM period match value */ + period = (timerClock / pwmFreq_Hz) - 1U; + + /* Calculate pulse width match value */ + if (dutyCyclePercent == 0U) + { + pulsePeriod = period + 1U; + } + else + { + pulsePeriod = (period * (100U - (uint32_t)dutyCyclePercent)) / 100U; + } + + /* Specified channel pwmPeriodChannel will define the PWM period */ + base->MR[pwmPeriodChannel] = period; + + /* This will define the PWM pulse period */ + base->MR[matchChannel] = pulsePeriod; + /* Clear status flags */ + CTIMER_ClearStatusFlags(base, ((uint32_t)CTIMER_IR_MR0INT_MASK) << (uint32_t)matchChannel); + /* If call back function is valid then enable interrupt and update the call back function */ + if (enableInt) + { + (void)EnableIRQ(s_ctimerIRQ[index]); + } + + return kStatus_Success; +} + +/*! + * brief Configures the PWM signal parameters. + * + * Enables PWM mode on the match channel passed in and will then setup the match value + * and other match parameters to generate a PWM signal. + * This function can manually assign the specified channel to set the PWM cycle. + * + * note When setting PWM output from multiple output pins, all should use the same PWM + * period + * + * param base Ctimer peripheral base address + * param pwmPeriodChannel Specify the channel to control the PWM period + * param matchChannel Match pin to be used to output the PWM signal + * param pwmPeriod PWM period match value + * param pulsePeriod Pulse width match value + * param enableInt Enable interrupt when the timer value reaches the match value of the PWM pulse, + * if it is 0 then no interrupt will be generated. + * + * return kStatus_Success on success + * kStatus_Fail If matchChannel is equal to pwmPeriodChannel; this channel is reserved to set the PWM period + */ +status_t CTIMER_SetupPwmPeriod(CTIMER_Type *base, + const ctimer_match_t pwmPeriodChannel, + ctimer_match_t matchChannel, + uint32_t pwmPeriod, + uint32_t pulsePeriod, + bool enableInt) +{ +/* Some CTimers only have 16bits , so the value is limited*/ +#if defined(FSL_FEATURE_SOC_CTIMER16B) && FSL_FEATURE_SOC_CTIMER16B + assert(!((FSL_FEATURE_CTIMER_BIT_SIZEn(base) < 32) && (pulsePeriod > 0xFFFFU))); +#endif + + uint32_t reg; + uint32_t index = CTIMER_GetInstance(base); + + if (matchChannel == pwmPeriodChannel) + { + return kStatus_Fail; + } + + /* Enable PWM mode on PWM pulse channel */ + base->PWMC |= (1UL << (uint32_t)matchChannel); + + /* Clear the stop, reset and interrupt bits for PWM pulse channel */ + reg = base->MCR; + reg &= + ~((uint32_t)((uint32_t)CTIMER_MCR_MR0R_MASK | (uint32_t)CTIMER_MCR_MR0S_MASK | (uint32_t)CTIMER_MCR_MR0I_MASK) + << ((uint32_t)matchChannel * 3U)); + + /* If call back function is valid then enable match interrupt for PWM pulse channel */ + if (enableInt) + { + reg |= (((uint32_t)CTIMER_MCR_MR0I_MASK) << (CTIMER_MCR_MR0I_SHIFT + ((uint32_t)matchChannel * 3U))); + } + + /* Reset the counter when match on PWM period channel (pwmPeriodChannel) */ + reg |= ((uint32_t)((uint32_t)CTIMER_MCR_MR0R_MASK) << ((uint32_t)pwmPeriodChannel * 3U)); + + base->MCR = reg; + + /* Specified channel pwmPeriodChannel will define the PWM period */ + base->MR[pwmPeriodChannel] = pwmPeriod; + + /* This will define the PWM pulse period */ + base->MR[matchChannel] = pulsePeriod; + /* Clear status flags */ + CTIMER_ClearStatusFlags(base, ((uint32_t)CTIMER_IR_MR0INT_MASK) << (uint32_t)matchChannel); + /* If call back function is valid then enable interrupt and update the call back function */ + if (enableInt) + { + (void)EnableIRQ(s_ctimerIRQ[index]); + } + + return kStatus_Success; +} + +/*! + * brief Updates the duty cycle of an active PWM signal. + * + * note Please use CTIMER_SetupPwmPeriod to update the PWM with high resolution. + * This function can manually assign the specified channel to set the PWM cycle. + * + * param base Ctimer peripheral base address + * param pwmPeriodChannel Specify the channel to control the PWM period + * param matchChannel Match pin to be used to output the PWM signal + * param dutyCyclePercent New PWM pulse width; the value should be between 0 to 100 + */ +void CTIMER_UpdatePwmDutycycle(CTIMER_Type *base, + const ctimer_match_t pwmPeriodChannel, + ctimer_match_t matchChannel, + uint8_t dutyCyclePercent) +{ + uint32_t pulsePeriod = 0, period; + + /* Specified channel pwmPeriodChannel defines the PWM period */ + period = base->MR[pwmPeriodChannel]; + + /* For 0% dutycyle, make pulse period greater than period so the event will never occur */ + if (dutyCyclePercent == 0U) + { + pulsePeriod = period + 1U; + } + else + { + pulsePeriod = (period * (100U - (uint32_t)dutyCyclePercent)) / 100U; + } + + /* Update dutycycle */ + base->MR[matchChannel] = pulsePeriod; +} + +/*! + * brief Setup the match register. + * + * User configuration is used to setup the match value and action to be taken when a match occurs. + * + * param base Ctimer peripheral base address + * param matchChannel Match register to configure + * param config Pointer to the match configuration structure + */ +void CTIMER_SetupMatch(CTIMER_Type *base, ctimer_match_t matchChannel, const ctimer_match_config_t *config) +{ +/* Some CTimers only have 16bits , so the value is limited*/ +#if defined(FSL_FEATURE_SOC_CTIMER16B) && FSL_FEATURE_SOC_CTIMER16B + assert(!(FSL_FEATURE_CTIMER_BIT_SIZEn(base) < 32 && config->matchValue > 0xFFFFU)); +#endif + uint32_t reg; + uint32_t index = CTIMER_GetInstance(base); + + /* Set the counter operation when a match on this channel occurs */ + reg = base->MCR; + reg &= + ~((uint32_t)((uint32_t)CTIMER_MCR_MR0R_MASK | (uint32_t)CTIMER_MCR_MR0S_MASK | (uint32_t)CTIMER_MCR_MR0I_MASK) + << ((uint32_t)matchChannel * 3U)); + reg |= ((uint32_t)(config->enableCounterReset) << (CTIMER_MCR_MR0R_SHIFT + ((uint32_t)matchChannel * 3U))); + reg |= ((uint32_t)(config->enableCounterStop) << (CTIMER_MCR_MR0S_SHIFT + ((uint32_t)matchChannel * 3U))); + reg |= ((uint32_t)(config->enableInterrupt) << (CTIMER_MCR_MR0I_SHIFT + ((uint32_t)matchChannel * 3U))); + base->MCR = reg; + + reg = base->EMR; + /* Set the match output operation when a match on this channel occurs */ + reg &= ~(((uint32_t)CTIMER_EMR_EMC0_MASK) << ((uint32_t)matchChannel * 2U)); + reg |= ((uint32_t)config->outControl) << (CTIMER_EMR_EMC0_SHIFT + ((uint32_t)matchChannel * 2U)); + + /* Set the initial state of the EM bit/output */ + reg &= ~(((uint32_t)CTIMER_EMR_EM0_MASK) << (uint32_t)matchChannel); + reg |= ((uint32_t)config->outPinInitState) << (uint32_t)matchChannel; + base->EMR = reg; + + /* Set the match value */ + base->MR[matchChannel] = config->matchValue; + /* Clear status flags */ + CTIMER_ClearStatusFlags(base, ((uint32_t)CTIMER_IR_MR0INT_MASK) << (uint32_t)matchChannel); + /* If interrupt is enabled then enable interrupt and update the call back function */ + if (config->enableInterrupt) + { + (void)EnableIRQ(s_ctimerIRQ[index]); + } +} + +/*! + * brief Get the status of output match. + * + * This function gets the status of output MAT, whether or not this output is connected to a pin. + * This status is driven to the MAT pins if the match function is selected via IOCON. 0 = LOW. 1 = HIGH. + * + * param base Ctimer peripheral base address + * param matchChannel External match channel, user can obtain the status of multiple match channels + * at the same time by using the logic of "|" + * enumeration ::ctimer_external_match_t + * return The mask of external match channel status flags. Users need to use the + * _ctimer_external_match type to decode the return variables. + */ +uint32_t CTIMER_GetOutputMatchStatus(CTIMER_Type *base, uint32_t matchChannel) +{ + return (base->EMR & matchChannel); +} + +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE) && (FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE)) +/*! + * brief Setup the capture. + * + * param base Ctimer peripheral base address + * param capture Capture channel to configure + * param edge Edge on the channel that will trigger a capture + * param enableInt Flag to enable channel interrupts, if enabled then the registered call back + * is called upon capture + */ +void CTIMER_SetupCapture(CTIMER_Type *base, + ctimer_capture_channel_t capture, + ctimer_capture_edge_t edge, + bool enableInt) +{ + uint32_t reg = base->CCR; + uint32_t index = CTIMER_GetInstance(base); + + /* Set the capture edge */ + reg &= ~((uint32_t)((uint32_t)CTIMER_CCR_CAP0RE_MASK | (uint32_t)CTIMER_CCR_CAP0FE_MASK | + (uint32_t)CTIMER_CCR_CAP0I_MASK) + << ((uint32_t)capture * 3U)); + reg |= ((uint32_t)edge) << (CTIMER_CCR_CAP0RE_SHIFT + ((uint32_t)capture * 3U)); + /* Clear status flags */ + CTIMER_ClearStatusFlags(base, (((uint32_t)kCTIMER_Capture0Flag) << (uint32_t)capture)); + /* If call back function is valid then enable capture interrupt for the channel and update the call back function */ + if (enableInt) + { + reg |= ((uint32_t)CTIMER_CCR_CAP0I_MASK) << ((uint32_t)capture * 3U); + (void)EnableIRQ(s_ctimerIRQ[index]); + } + base->CCR = reg; +} +#endif + +/*! + * brief Register callback. + * + * param base Ctimer peripheral base address + * param cb_func callback function + * param cb_type callback function type, singular or multiple + */ +void CTIMER_RegisterCallBack(CTIMER_Type *base, ctimer_callback_t *cb_func, ctimer_callback_type_t cb_type) +{ + uint32_t index = CTIMER_GetInstance(base); + s_ctimerCallback[index] = cb_func; + ctimerCallbackType[index] = cb_type; +} + +/*! + * brief CTIMER generic IRQ handle function. + * + * param index FlexCAN peripheral instance index. + */ +static void CTIMER_GenericIRQHandler(uint32_t index) +{ + uint32_t int_stat, i, mask; + /* Get Interrupt status flags */ + int_stat = CTIMER_GetStatusFlags(s_ctimerBases[index]); + /* Clear the status flags that were set */ + CTIMER_ClearStatusFlags(s_ctimerBases[index], int_stat); + if (ctimerCallbackType[index] == kCTIMER_SingleCallback) + { + if (s_ctimerCallback[index][0] != NULL) + { + s_ctimerCallback[index][0](int_stat); + } + } + else + { +#if defined(FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE) && FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE + for (i = 0; i <= CTIMER_IR_MR3INT_SHIFT; i++) +#else +#if defined(FSL_FEATURE_CTIMER_HAS_IR_CR3INT) && FSL_FEATURE_CTIMER_HAS_IR_CR3INT + for (i = 0; i <= CTIMER_IR_CR3INT_SHIFT; i++) +#else +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_IR_CR2INT) && FSL_FEATURE_CTIMER_HAS_NO_IR_CR2INT) + for (i = 0; i <= CTIMER_IR_CR2INT_SHIFT; i++) +#else + for (i = 0; i <= CTIMER_IR_CR1INT_SHIFT; i++) +#endif /* FSL_FEATURE_CTIMER_HAS_NO_IR_CR2INT */ +#endif /* FSL_FEATURE_CTIMER_HAS_IR_CR3INT */ +#endif + { + mask = 0x01UL << i; + /* For each status flag bit that was set call the callback function if it is valid */ + if (((int_stat & mask) != 0U) && (s_ctimerCallback[index][i] != NULL)) + { + s_ctimerCallback[index][i](int_stat); + } + } + } + SDK_ISR_EXIT_BARRIER; +} + +/* IRQ handler functions overloading weak symbols in the startup */ +#if defined(CTIMER0) +void CTIMER0_DriverIRQHandler(void); +void CTIMER0_DriverIRQHandler(void) +{ + CTIMER_GenericIRQHandler(0); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CTIMER1) +void CTIMER1_DriverIRQHandler(void); +void CTIMER1_DriverIRQHandler(void) +{ + CTIMER_GenericIRQHandler(1); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CTIMER2) +void CTIMER2_DriverIRQHandler(void); +void CTIMER2_DriverIRQHandler(void) +{ + CTIMER_GenericIRQHandler(2); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CTIMER3) +void CTIMER3_DriverIRQHandler(void); +void CTIMER3_DriverIRQHandler(void) +{ + CTIMER_GenericIRQHandler(3); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CTIMER4) +void CTIMER4_DriverIRQHandler(void); +void CTIMER4_DriverIRQHandler(void) +{ + CTIMER_GenericIRQHandler(4); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CTIMER5) +void CTIMER5_DriverIRQHandler(void); +void CTIMER5_DriverIRQHandler(void) +{ + CTIMER_GenericIRQHandler(5); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CTIMER6) +void CTIMER6_DriverIRQHandler(void); +void CTIMER6_DriverIRQHandler(void) +{ + CTIMER_GenericIRQHandler(6); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CTIMER7) +void CTIMER7_DriverIRQHandler(void); +void CTIMER7_DriverIRQHandler(void) +{ + CTIMER_GenericIRQHandler(7); + SDK_ISR_EXIT_BARRIER; +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ctimer.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ctimer.h new file mode 100644 index 00000000000..0ec7286e6c6 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ctimer.h @@ -0,0 +1,682 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_CTIMER_H_ +#define FSL_CTIMER_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup ctimer + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +#define FSL_CTIMER_DRIVER_VERSION (MAKE_VERSION(2, 3, 1)) /*!< Version 2.3.1 */ +/*! @} */ + +/*! @brief List of Timer capture channels */ +typedef enum _ctimer_capture_channel +{ + kCTIMER_Capture_0 = 0U, /*!< Timer capture channel 0 */ + kCTIMER_Capture_1, /*!< Timer capture channel 1 */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) && FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) + kCTIMER_Capture_2, /*!< Timer capture channel 2 */ +#endif /* FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2 */ +#if defined(FSL_FEATURE_CTIMER_HAS_CCR_CAP3) && FSL_FEATURE_CTIMER_HAS_CCR_CAP3 + kCTIMER_Capture_3 /*!< Timer capture channel 3 */ +#endif /* FSL_FEATURE_CTIMER_HAS_CCR_CAP3 */ +} ctimer_capture_channel_t; + +/*! @brief List of capture edge options */ +typedef enum _ctimer_capture_edge +{ + kCTIMER_Capture_RiseEdge = 1U, /*!< Capture on rising edge */ + kCTIMER_Capture_FallEdge = 2U, /*!< Capture on falling edge */ + kCTIMER_Capture_BothEdge = 3U, /*!< Capture on rising and falling edge */ +} ctimer_capture_edge_t; + +/*! @brief List of Timer match registers */ +typedef enum _ctimer_match +{ + kCTIMER_Match_0 = 0U, /*!< Timer match register 0 */ + kCTIMER_Match_1, /*!< Timer match register 1 */ + kCTIMER_Match_2, /*!< Timer match register 2 */ + kCTIMER_Match_3 /*!< Timer match register 3 */ +} ctimer_match_t; + +/*! @brief List of external match */ +typedef enum _ctimer_external_match +{ + kCTIMER_External_Match_0 = (1UL << 0), /*!< External match 0 */ + kCTIMER_External_Match_1 = (1UL << 1), /*!< External match 1 */ + kCTIMER_External_Match_2 = (1UL << 2), /*!< External match 2 */ + kCTIMER_External_Match_3 = (1UL << 3) /*!< External match 3 */ +} ctimer_external_match_t; + +/*! @brief List of output control options */ +typedef enum _ctimer_match_output_control +{ + kCTIMER_Output_NoAction = 0U, /*!< No action is taken */ + kCTIMER_Output_Clear, /*!< Clear the EM bit/output to 0 */ + kCTIMER_Output_Set, /*!< Set the EM bit/output to 1 */ + kCTIMER_Output_Toggle /*!< Toggle the EM bit/output */ +} ctimer_match_output_control_t; + +/*! @brief List of Timer modes */ +typedef enum _ctimer_timer_mode +{ + kCTIMER_TimerMode = 0U, /* TC is incremented every rising APB bus clock edge */ + kCTIMER_IncreaseOnRiseEdge, /* TC is incremented on rising edge of input signal */ + kCTIMER_IncreaseOnFallEdge, /* TC is incremented on falling edge of input signal */ + kCTIMER_IncreaseOnBothEdge /* TC is incremented on both edges of input signal */ +} ctimer_timer_mode_t; + +/*! @brief List of Timer interrupts */ +typedef enum _ctimer_interrupt_enable +{ + kCTIMER_Match0InterruptEnable = CTIMER_MCR_MR0I_MASK, /*!< Match 0 interrupt */ + kCTIMER_Match1InterruptEnable = CTIMER_MCR_MR1I_MASK, /*!< Match 1 interrupt */ + kCTIMER_Match2InterruptEnable = CTIMER_MCR_MR2I_MASK, /*!< Match 2 interrupt */ + kCTIMER_Match3InterruptEnable = CTIMER_MCR_MR3I_MASK, /*!< Match 3 interrupt */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE) && (FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE)) + kCTIMER_Capture0InterruptEnable = CTIMER_CCR_CAP0I_MASK, /*!< Capture 0 interrupt */ + kCTIMER_Capture1InterruptEnable = CTIMER_CCR_CAP1I_MASK, /*!< Capture 1 interrupt */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) && FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) + kCTIMER_Capture2InterruptEnable = CTIMER_CCR_CAP2I_MASK, /*!< Capture 2 interrupt */ +#endif /* FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2 */ +#if defined(FSL_FEATURE_CTIMER_HAS_CCR_CAP3) && FSL_FEATURE_CTIMER_HAS_CCR_CAP3 + kCTIMER_Capture3InterruptEnable = CTIMER_CCR_CAP3I_MASK, /*!< Capture 3 interrupt */ +#endif /* FSL_FEATURE_CTIMER_HAS_CCR_CAP3 */ +#endif +} ctimer_interrupt_enable_t; + +/*! @brief List of Timer flags */ +typedef enum _ctimer_status_flags +{ + kCTIMER_Match0Flag = CTIMER_IR_MR0INT_MASK, /*!< Match 0 interrupt flag */ + kCTIMER_Match1Flag = CTIMER_IR_MR1INT_MASK, /*!< Match 1 interrupt flag */ + kCTIMER_Match2Flag = CTIMER_IR_MR2INT_MASK, /*!< Match 2 interrupt flag */ + kCTIMER_Match3Flag = CTIMER_IR_MR3INT_MASK, /*!< Match 3 interrupt flag */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE) && (FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE)) + kCTIMER_Capture0Flag = CTIMER_IR_CR0INT_MASK, /*!< Capture 0 interrupt flag */ + kCTIMER_Capture1Flag = CTIMER_IR_CR1INT_MASK, /*!< Capture 1 interrupt flag */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_IR_CR2INT) && FSL_FEATURE_CTIMER_HAS_NO_IR_CR2INT) + kCTIMER_Capture2Flag = CTIMER_IR_CR2INT_MASK, /*!< Capture 2 interrupt flag */ +#endif /* FSL_FEATURE_CTIMER_HAS_NO_IR_CR2INT */ +#if defined(FSL_FEATURE_CTIMER_HAS_IR_CR3INT) && FSL_FEATURE_CTIMER_HAS_IR_CR3INT + kCTIMER_Capture3Flag = CTIMER_IR_CR3INT_MASK, /*!< Capture 3 interrupt flag */ +#endif /* FSL_FEATURE_CTIMER_HAS_IR_CR3INT */ +#endif +} ctimer_status_flags_t; + +typedef void (*ctimer_callback_t)(uint32_t flags); + +/*! @brief Callback type when registering for a callback. When registering a callback + * an array of function pointers is passed the size could be 1 or 8, the callback + * type will tell that. + */ +typedef enum +{ + kCTIMER_SingleCallback, /*!< Single Callback type where there is only one callback for the timer. + based on the status flags different channels needs to be handled differently */ + kCTIMER_MultipleCallback /*!< Multiple Callback type where there can be 8 valid callbacks, one per channel. + for both match/capture */ +} ctimer_callback_type_t; + +/*! + * @brief Match configuration + * + * This structure holds the configuration settings for each match register. + */ +typedef struct _ctimer_match_config +{ + uint32_t matchValue; /*!< This is stored in the match register */ + bool enableCounterReset; /*!< true: Match will reset the counter + false: Match will not reser the counter */ + bool enableCounterStop; /*!< true: Match will stop the counter + false: Match will not stop the counter */ + ctimer_match_output_control_t outControl; /*!< Action to be taken on a match on the EM bit/output */ + bool outPinInitState; /*!< Initial value of the EM bit/output */ + bool enableInterrupt; /*!< true: Generate interrupt upon match + false: Do not generate interrupt on match */ + +} ctimer_match_config_t; + +/*! + * @brief Timer configuration structure + * + * This structure holds the configuration settings for the Timer peripheral. To initialize this + * structure to reasonable defaults, call the CTIMER_GetDefaultConfig() function and pass a + * pointer to the configuration structure instance. + * + * The configuration structure can be made constant so as to reside in flash. + */ +typedef struct _ctimer_config +{ + ctimer_timer_mode_t mode; /*!< Timer mode */ + ctimer_capture_channel_t input; /*!< Input channel to increment the timer, used only in timer + modes that rely on this input signal to increment TC */ + uint32_t prescale; /*!< Prescale value */ +} ctimer_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Ungates the clock and configures the peripheral for basic operation. + * + * @note This API should be called at the beginning of the application before using the driver. + * + * @param base Ctimer peripheral base address + * @param config Pointer to the user configuration structure. + */ +void CTIMER_Init(CTIMER_Type *base, const ctimer_config_t *config); + +/*! + * @brief Gates the timer clock. + * + * @param base Ctimer peripheral base address + */ +void CTIMER_Deinit(CTIMER_Type *base); + +/*! + * @brief Fills in the timers configuration structure with the default settings. + * + * The default values are: + * @code + * config->mode = kCTIMER_TimerMode; + * config->input = kCTIMER_Capture_0; + * config->prescale = 0; + * @endcode + * @param config Pointer to the user configuration structure. + */ +void CTIMER_GetDefaultConfig(ctimer_config_t *config); + +/*! @}*/ + +/*! + * @name PWM setup operations + * @{ + */ + +/*! + * @brief Configures the PWM signal parameters. + * + * Enables PWM mode on the match channel passed in and will then setup the match value + * and other match parameters to generate a PWM signal. + * This function can manually assign the specified channel to set the PWM cycle. + * + * @note When setting PWM output from multiple output pins, all should use the same PWM + * period + * + * @param base Ctimer peripheral base address + * @param pwmPeriodChannel Specify the channel to control the PWM period + * @param matchChannel Match pin to be used to output the PWM signal + * @param pwmPeriod PWM period match value + * @param pulsePeriod Pulse width match value + * @param enableInt Enable interrupt when the timer value reaches the match value of the PWM pulse, + * if it is 0 then no interrupt will be generated. + */ +status_t CTIMER_SetupPwmPeriod(CTIMER_Type *base, + const ctimer_match_t pwmPeriodChannel, + ctimer_match_t matchChannel, + uint32_t pwmPeriod, + uint32_t pulsePeriod, + bool enableInt); + +/*! + * @brief Configures the PWM signal parameters. + * + * Enables PWM mode on the match channel passed in and will then setup the match value + * and other match parameters to generate a PWM signal. + * This function can manually assign the specified channel to set the PWM cycle. + * + * @note When setting PWM output from multiple output pins, all should use the same PWM + * frequency. Please use CTIMER_SetupPwmPeriod to set up the PWM with high resolution. + * + * @param base Ctimer peripheral base address + * @param pwmPeriodChannel Specify the channel to control the PWM period + * @param matchChannel Match pin to be used to output the PWM signal + * @param dutyCyclePercent PWM pulse width; the value should be between 0 to 100 + * @param pwmFreq_Hz PWM signal frequency in Hz + * @param srcClock_Hz Timer counter clock in Hz + * @param enableInt Enable interrupt when the timer value reaches the match value of the PWM pulse, + * if it is 0 then no interrupt will be generated. + */ +status_t CTIMER_SetupPwm(CTIMER_Type *base, + const ctimer_match_t pwmPeriodChannel, + ctimer_match_t matchChannel, + uint8_t dutyCyclePercent, + uint32_t pwmFreq_Hz, + uint32_t srcClock_Hz, + bool enableInt); + +/*! + * @brief Updates the pulse period of an active PWM signal. + * + * @param base Ctimer peripheral base address + * @param matchChannel Match pin to be used to output the PWM signal + * @param pulsePeriod New PWM pulse width match value + */ +static inline void CTIMER_UpdatePwmPulsePeriod(CTIMER_Type *base, ctimer_match_t matchChannel, uint32_t pulsePeriod) +{ + /* Update PWM pulse period match value */ + base->MR[matchChannel] = pulsePeriod; +} + +/*! + * @brief Updates the duty cycle of an active PWM signal. + * + * @note Please use CTIMER_SetupPwmPeriod to update the PWM with high resolution. + * This function can manually assign the specified channel to set the PWM cycle. + * + * @param base Ctimer peripheral base address + * @param pwmPeriodChannel Specify the channel to control the PWM period + * @param matchChannel Match pin to be used to output the PWM signal + * @param dutyCyclePercent New PWM pulse width; the value should be between 0 to 100 + */ +void CTIMER_UpdatePwmDutycycle(CTIMER_Type *base, + const ctimer_match_t pwmPeriodChannel, + ctimer_match_t matchChannel, + uint8_t dutyCyclePercent); + +/*! @}*/ + +/*! + * @brief Setup the match register. + * + * User configuration is used to setup the match value and action to be taken when a match occurs. + * + * @param base Ctimer peripheral base address + * @param matchChannel Match register to configure + * @param config Pointer to the match configuration structure + */ +void CTIMER_SetupMatch(CTIMER_Type *base, ctimer_match_t matchChannel, const ctimer_match_config_t *config); + +/*! + * @brief Get the status of output match. + * + * This function gets the status of output MAT, whether or not this output is connected to a pin. + * This status is driven to the MAT pins if the match function is selected via IOCON. 0 = LOW. 1 = HIGH. + * + * @param base Ctimer peripheral base address + * @param matchChannel External match channel, user can obtain the status of multiple match channels + * at the same time by using the logic of "|" + * enumeration ::ctimer_external_match_t + * @return The mask of external match channel status flags. Users need to use the + * _ctimer_external_match type to decode the return variables. + */ +uint32_t CTIMER_GetOutputMatchStatus(CTIMER_Type *base, uint32_t matchChannel); + +/*! + * @brief Setup the capture. + * + * @param base Ctimer peripheral base address + * @param capture Capture channel to configure + * @param edge Edge on the channel that will trigger a capture + * @param enableInt Flag to enable channel interrupts, if enabled then the registered call back + * is called upon capture + */ +void CTIMER_SetupCapture(CTIMER_Type *base, + ctimer_capture_channel_t capture, + ctimer_capture_edge_t edge, + bool enableInt); + +/*! + * @brief Get the timer count value from TC register. + * + * @param base Ctimer peripheral base address. + * @return return the timer count value. + */ +static inline uint32_t CTIMER_GetTimerCountValue(CTIMER_Type *base) +{ + return (base->TC); +} + +/*! + * @brief Register callback. + * + * @param base Ctimer peripheral base address + * @param cb_func callback function + * @param cb_type callback function type, singular or multiple + */ +void CTIMER_RegisterCallBack(CTIMER_Type *base, ctimer_callback_t *cb_func, ctimer_callback_type_t cb_type); + +/*! + * @name Interrupt Interface + * @{ + */ + +/*! + * @brief Enables the selected Timer interrupts. + * + * @param base Ctimer peripheral base address + * @param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::ctimer_interrupt_enable_t + */ +static inline void CTIMER_EnableInterrupts(CTIMER_Type *base, uint32_t mask) +{ + /* Enable match interrupts */ + base->MCR |= mask & (CTIMER_MCR_MR0I_MASK | CTIMER_MCR_MR1I_MASK | CTIMER_MCR_MR2I_MASK | CTIMER_MCR_MR3I_MASK); + +/* Enable capture interrupts */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE) && (FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE)) + base->CCR |= mask & (CTIMER_CCR_CAP0I_MASK | CTIMER_CCR_CAP1I_MASK +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) && FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) + | CTIMER_CCR_CAP2I_MASK +#endif /* FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2 */ +#if defined(FSL_FEATURE_CTIMER_HAS_CCR_CAP3) && FSL_FEATURE_CTIMER_HAS_CCR_CAP3 + | CTIMER_CCR_CAP3I_MASK +#endif /* FSL_FEATURE_CTIMER_HAS_CCR_CAP3 */ + ); +#endif +} + +/*! + * @brief Disables the selected Timer interrupts. + * + * @param base Ctimer peripheral base address + * @param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::ctimer_interrupt_enable_t + */ +static inline void CTIMER_DisableInterrupts(CTIMER_Type *base, uint32_t mask) +{ + /* Disable match interrupts */ + base->MCR &= ~(mask & (CTIMER_MCR_MR0I_MASK | CTIMER_MCR_MR1I_MASK | CTIMER_MCR_MR2I_MASK | CTIMER_MCR_MR3I_MASK)); + +/* Disable capture interrupts */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE) && (FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE)) + base->CCR &= ~(mask & (CTIMER_CCR_CAP0I_MASK | CTIMER_CCR_CAP1I_MASK +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) && FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) + | CTIMER_CCR_CAP2I_MASK +#endif /* FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2 */ +#if defined(FSL_FEATURE_CTIMER_HAS_CCR_CAP3) && FSL_FEATURE_CTIMER_HAS_CCR_CAP3 + | CTIMER_CCR_CAP3I_MASK +#endif /* FSL_FEATURE_CTIMER_HAS_CCR_CAP3 */ + )); +#endif +} + +/*! + * @brief Gets the enabled Timer interrupts. + * + * @param base Ctimer peripheral base address + * + * @return The enabled interrupts. This is the logical OR of members of the + * enumeration ::ctimer_interrupt_enable_t + */ +static inline uint32_t CTIMER_GetEnabledInterrupts(CTIMER_Type *base) +{ + uint32_t enabledIntrs = 0; + + /* Get all the match interrupts enabled */ + enabledIntrs = + base->MCR & (CTIMER_MCR_MR0I_MASK | CTIMER_MCR_MR1I_MASK | CTIMER_MCR_MR2I_MASK | CTIMER_MCR_MR3I_MASK); + +/* Get all the capture interrupts enabled */ +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE) && (FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE)) + enabledIntrs |= base->CCR & (CTIMER_CCR_CAP0I_MASK | CTIMER_CCR_CAP1I_MASK +#if !(defined(FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) && FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2) + | CTIMER_CCR_CAP2I_MASK +#endif /* FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2 */ +#if defined(FSL_FEATURE_CTIMER_HAS_CCR_CAP3) && FSL_FEATURE_CTIMER_HAS_CCR_CAP3 + | CTIMER_CCR_CAP3I_MASK +#endif /* FSL_FEATURE_CTIMER_HAS_CCR_CAP3 */ + ); +#endif + + return enabledIntrs; +} + +/*! @}*/ + +/*! + * @name Status Interface + * @{ + */ + +/*! + * @brief Gets the Timer status flags. + * + * @param base Ctimer peripheral base address + * + * @return The status flags. This is the logical OR of members of the + * enumeration ::ctimer_status_flags_t + */ +static inline uint32_t CTIMER_GetStatusFlags(CTIMER_Type *base) +{ + return base->IR; +} + +/*! + * @brief Clears the Timer status flags. + * + * @param base Ctimer peripheral base address + * @param mask The status flags to clear. This is a logical OR of members of the + * enumeration ::ctimer_status_flags_t + */ +static inline void CTIMER_ClearStatusFlags(CTIMER_Type *base, uint32_t mask) +{ + base->IR = mask; +} + +/*! @}*/ + +/*! + * @name Counter Start and Stop + * @{ + */ + +/*! + * @brief Starts the Timer counter. + * + * @param base Ctimer peripheral base address + */ +static inline void CTIMER_StartTimer(CTIMER_Type *base) +{ + base->TCR |= CTIMER_TCR_CEN_MASK; +} + +/*! + * @brief Stops the Timer counter. + * + * @param base Ctimer peripheral base address + */ +static inline void CTIMER_StopTimer(CTIMER_Type *base) +{ + base->TCR &= ~CTIMER_TCR_CEN_MASK; +} + +/*! @}*/ + +/*! + * @brief Reset the counter. + * + * The timer counter and prescale counter are reset on the next positive edge of the APB clock. + * + * @param base Ctimer peripheral base address + */ +static inline void CTIMER_Reset(CTIMER_Type *base) +{ + base->TCR |= CTIMER_TCR_CRST_MASK; + base->TCR &= ~CTIMER_TCR_CRST_MASK; +} + +/*! + * @brief Setup the timer prescale value. + * + * Specifies the maximum value for the Prescale Counter. + * + * @param base Ctimer peripheral base address + * @param prescale Prescale value + */ +static inline void CTIMER_SetPrescale(CTIMER_Type *base, uint32_t prescale) +{ + base->PR = CTIMER_PR_PRVAL(prescale); +} + +/*! + * @brief Get capture channel value. + * + * Get the counter/timer value on the corresponding capture channel. + * + * @param base Ctimer peripheral base address + * @param capture Select capture channel + * + * @return The timer count capture value. + */ +static inline uint32_t CTIMER_GetCaptureValue(CTIMER_Type *base, ctimer_capture_channel_t capture) +{ + return base->CR[capture]; +} + +/*! + * @brief Enable reset match channel. + * + * Set the specified match channel reset operation. + * + * @param base Ctimer peripheral base address + * @param match match channel used + * @param enable Enable match channel reset operation. + */ +static inline void CTIMER_EnableResetMatchChannel(CTIMER_Type *base, ctimer_match_t match, bool enable) +{ + if (enable) + { + base->MCR |= (1UL << (CTIMER_MCR_MR0R_SHIFT + ((uint32_t)match * 3U))); + } + else + { + base->MCR &= ~(1UL << (CTIMER_MCR_MR0R_SHIFT + ((uint32_t)match * 3U))); + } +} + +/*! + * @brief Enable stop match channel. + * + * Set the specified match channel stop operation. + * + * @param base Ctimer peripheral base address. + * @param match match channel used. + * @param enable Enable match channel stop operation. + */ +static inline void CTIMER_EnableStopMatchChannel(CTIMER_Type *base, ctimer_match_t match, bool enable) +{ + if (enable) + { + base->MCR |= (1UL << (CTIMER_MCR_MR0S_SHIFT + ((uint32_t)match * 3U))); + } + else + { + base->MCR &= ~(1UL << (CTIMER_MCR_MR0S_SHIFT + ((uint32_t)match * 3U))); + } +} + +#if (defined(FSL_FEATURE_CTIMER_HAS_MSR) && (FSL_FEATURE_CTIMER_HAS_MSR)) +/*! + * @brief Enable reload channel falling edge. + * + * Enable the specified match channel reload match shadow value. + * + * @param base Ctimer peripheral base address. + * @param match match channel used. + * @param enable Enable . + */ +static inline void CTIMER_EnableMatchChannelReload(CTIMER_Type *base, ctimer_match_t match, bool enable) +{ + if (enable) + { + base->MCR |= (1UL << (CTIMER_MCR_MR0RL_SHIFT + (uint32_t)match)); + } + else + { + base->MCR &= ~(1UL << (CTIMER_MCR_MR0RL_SHIFT + (uint32_t)match)); + } +} +#endif /* FSL_FEATURE_CTIMER_HAS_MSR */ + +/*! + * @brief Enable capture channel rising edge. + * + * Sets the specified capture channel for rising edge capture. + * + * @param base Ctimer peripheral base address. + * @param capture capture channel used. + * @param enable Enable rising edge capture. + */ +static inline void CTIMER_EnableRisingEdgeCapture(CTIMER_Type *base, ctimer_capture_channel_t capture, bool enable) +{ + if (enable) + { + base->CCR |= (1UL << (CTIMER_CCR_CAP0RE_SHIFT + ((uint32_t)capture * 3U))); + } + else + { + base->CCR &= ~(1UL << (CTIMER_CCR_CAP0RE_SHIFT + ((uint32_t)capture * 3U))); + } +} + +/*! + * @brief Enable capture channel falling edge. + * + * Sets the specified capture channel for falling edge capture. + * + * @param base Ctimer peripheral base address. + * @param capture capture channel used. + * @param enable Enable falling edge capture. + */ +static inline void CTIMER_EnableFallingEdgeCapture(CTIMER_Type *base, ctimer_capture_channel_t capture, bool enable) +{ + if (enable) + { + base->CCR |= (1UL << (CTIMER_CCR_CAP0FE_SHIFT + ((uint32_t)capture * 3U))); + } + else + { + base->CCR &= ~(1UL << (CTIMER_CCR_CAP0FE_SHIFT + ((uint32_t)capture * 3U))); + } +} + +#if (defined(FSL_FEATURE_CTIMER_HAS_MSR) && (FSL_FEATURE_CTIMER_HAS_MSR)) +/*! + * @brief Set the specified match shadow channel. + * + * @param base Ctimer peripheral base address. + * @param match match channel used. + * @param matchvalue Reload the value of the corresponding match register. + */ +static inline void CTIMER_SetShadowValue(CTIMER_Type *base, ctimer_match_t match, uint32_t matchvalue) +{ + base->MSR[match] = matchvalue; +} +#endif /* FSL_FEATURE_CTIMER_HAS_MSR */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_CTIMER_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_dac.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_dac.c new file mode 100644 index 00000000000..09845018deb --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_dac.c @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2019, 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_dac.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.dac_1" +#endif + +#if defined(DAC_RSTS) +#define DAC_RESETS_ARRAY DAC_RSTS +#elif defined(DAC_RSTS_N) +#define DAC_RESETS_ARRAY DAC_RSTS_N +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Get instance number for DAC module. + * + * @param base DAC peripheral base address + */ +static uint32_t DAC_GetInstance(LPDAC_Type *base); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to DAC bases for each instance. */ +static LPDAC_Type *const s_dacBases[] = LPDAC_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to DAC clocks for each instance. */ +static const clock_ip_name_t s_dacClocks[] = LPDAC_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(DAC_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_dacResets[] = DAC_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t DAC_GetInstance(LPDAC_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_dacBases); instance++) + { + if (s_dacBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_dacBases)); + + return instance; +} + +/*! + * brief Initialize the DAC module with common configuartion. + * + * The clock will be enabled in this function. + * + * param base DAC peripheral base address. + * param config Pointer to configuration structure. + */ +void DAC_Init(LPDAC_Type *base, const dac_config_t *config) +{ + assert(NULL != config); + + uint32_t tmp32 = 0U; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable the clock. */ + CLOCK_EnableClock(s_dacClocks[DAC_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(DAC_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_dacResets[DAC_GetInstance(base)]); +#endif + + /* Reset the logic. */ + DAC_SetReset(base, kDAC_ResetLogic); + DAC_ClearReset(base, kDAC_ResetLogic); + + /* Reset the FIFO. */ + DAC_SetReset(base, kDAC_ResetFIFO); + DAC_ClearReset(base, kDAC_ResetFIFO); + + /* Configuration. */ + if (kDAC_FIFOTriggerBySoftwareMode == config->fifoTriggerMode) + { + tmp32 |= LPDAC_GCR_TRGSEL_MASK; /* Software trigger. */ + } + switch (config->fifoWorkMode) + { + case kDAC_FIFOWorkAsNormalMode: /* Normal FIFO. */ + tmp32 |= LPDAC_GCR_FIFOEN_MASK; + break; + case kDAC_FIFOWorkAsSwingMode: + tmp32 |= LPDAC_GCR_FIFOEN_MASK | LPDAC_GCR_SWMD_MASK; /* Enable swing mode. */ + break; +#if defined(FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE) && FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE + case kDAC_FIFOWorkAsPeriodTriggerMode: + tmp32 |= LPDAC_GCR_FIFOEN_MASK | LPDAC_GCR_PTGEN_MASK; /* Enable period trigger mode. */ + /* Set trigger number and width. */ + base->PCR = + LPDAC_PCR_PTG_NUM(config->periodicTriggerNumber) | LPDAC_PCR_PTG_PERIOD(config->periodicTriggerWidth); + break; + case kDAC_FIFOWorkAsPeriodTriggerAndSwingMode: + tmp32 |= LPDAC_GCR_FIFOEN_MASK | LPDAC_GCR_PTGEN_MASK | LPDAC_GCR_SWMD_MASK; + /* Set trigger number and width. */ + base->PCR = + LPDAC_PCR_PTG_NUM(config->periodicTriggerNumber) | LPDAC_PCR_PTG_PERIOD(config->periodicTriggerWidth); + break; +#endif /* FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE */ + default: /* kDAC_FIFODisabled. */ + break; + } + +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG) && FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG + if (config->enableExternalTriggerSource) + { + tmp32 |= LPDAC_GCR_RCV_TRG_MASK; /* Use trigger source from another DAC. */ + } +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG */ +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL) && FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL + if (false == config->enableLowerLowPowerMode) + { + tmp32 |= LPDAC_GCR_BUF_SPD_CTRL_MASK; /* Enable low power. */ + } +#else + if (config->enableLowPowerMode) + { + tmp32 |= LPDAC_GCR_LPEN_MASK; /* Enable low power. */ + } +#endif /* LPDAC_GCR_BUF_SPD_CTRL_MASK */ + +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_BUF_EN) && FSL_FEATURE_LPDAC_HAS_GCR_BUF_EN + tmp32 |= LPDAC_GCR_BUF_EN_MASK; /* Opamp is used as buffer. */ +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_BUF_EN */ +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC) && FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC + /* Configure DAC sync cycles. */ + tmp32 |= LPDAC_GCR_LATCH_CYC(config->syncTime); +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC */ +#if defined(FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT) && FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT + tmp32 |= (uint32_t)config->referenceCurrentSource; +#endif /* FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT */ + /* Set reference voltage source. */ + tmp32 |= LPDAC_GCR_DACRFS(config->referenceVoltageSource); + + base->GCR = tmp32; + base->FCR = LPDAC_FCR_WML(config->fifoWatermarkLevel); + + /* Now, the DAC is disabled. It needs to be enabled in application. */ +} + +/*! + * brief Get the default settings for initialization's configuration. + * + * This function initializes the user configuration structure to a default value. The default values are: + * code + * config->fifoWatermarkLevel = 0U; + * config->fifoTriggerMode = kDAC_FIFOTriggerByHardwareMode; + * config->fifoWorkMode = kDAC_FIFODisabled; + * config->enableLowPowerMode = false; + * config->referenceVoltageSource = kDAC_ReferenceVoltageSourceAlt1; + * endcode + * + * param config Pointer to configuration structure. + * param + */ +void DAC_GetDefaultConfig(dac_config_t *config) +{ + assert(config != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + config->fifoWatermarkLevel = 0U; + config->fifoTriggerMode = kDAC_FIFOTriggerByHardwareMode; + config->fifoWorkMode = kDAC_FIFODisabled; + +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG) && FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG + config->enableExternalTriggerSource = false; +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG */ +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL) && FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL + config->enableLowerLowPowerMode = true; +#else + config->enableLowPowerMode = false; +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL */ +#if defined(FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE) && FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE + config->periodicTriggerNumber = 0UL; + config->periodicTriggerWidth = 0UL; +#endif /* FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE */ +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC) && FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC + /* Configure DAC sync cycles. */ + config->syncTime = 1U; +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC */ +#if defined(FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT) && FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT + config->referenceCurrentSource = kDAC_ReferenceCurrentSourcePtat; +#endif /* FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT */ + config->referenceVoltageSource = kDAC_ReferenceVoltageSourceAlt1; +} + +/*! + * brief De-initialize the DAC module. + * + * The clock will be disabled in this function. + * + * param base DAC peripheral base address. + * param + */ +void DAC_Deinit(LPDAC_Type *base) +{ + /* Disable the module. */ + DAC_Enable(base, false); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Disable the clock. */ + CLOCK_DisableClock(s_dacClocks[DAC_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_dac.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_dac.h new file mode 100644 index 00000000000..5dcecf2db57 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_dac.h @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020, 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_DAC_H_ +#define FSL_DAC_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup dac + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief DAC driver version 2.1.2. */ +#define FSL_DAC_DRIVER_VERSION (MAKE_VERSION(2, 1, 2)) +/*! @} */ + +/*! + * @brief DAC reset control. + */ +enum +{ + kDAC_ResetFIFO = LPDAC_RCR_FIFORST_MASK, /*!< Resets the FIFO pointers and flags. */ + kDAC_ResetLogic = LPDAC_RCR_SWRST_MASK, /*!< Resets all DAC registers and internal logic. */ +}; + +/*! + * @brief DAC interrupts. + */ +enum +{ + kDAC_FIFOFullInterruptEnable = LPDAC_IER_FULL_IE_MASK, /*!< FIFO full interrupt enable. */ + kDAC_FIFOEmptyInterruptEnable = LPDAC_IER_EMPTY_IE_MASK, /*!< FIFO empty interrupt enable. */ + kDAC_FIFOWatermarkInterruptEnable = LPDAC_IER_WM_IE_MASK, /*!< FIFO watermark interrupt enable. */ + kDAC_SwingBackInterruptEnable = LPDAC_IER_SWBK_IE_MASK, /*!< Swing back one cycle complete interrupt enable. */ + kDAC_FIFOOverflowInterruptEnable = LPDAC_IER_OF_IE_MASK, /*!< FIFO overflow interrupt enable. */ + kDAC_FIFOUnderflowInterruptEnable = LPDAC_IER_UF_IE_MASK, /*!< FIFO underflow interrupt enable. */ +#if defined(FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE) && FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE + kDAC_PeriodTriggerCompleteInterruptEnable = + LPDAC_IER_PTGCOCO_IE_MASK, /*!< Period trigger mode conversion complete interrupt enable */ +#endif /* FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE */ +}; + +/*! + * @brief DAC DMA switchers. + */ +enum +{ + kDAC_FIFOEmptyDMAEnable = LPDAC_DER_EMPTY_DMAEN_MASK, /*!< FIFO empty DMA enable. */ + kDAC_FIFOWatermarkDMAEnable = LPDAC_DER_WM_DMAEN_MASK, /*!< FIFO watermark DMA enable. */ +}; + +/*! + * @brief DAC status flags. + */ +enum +{ + kDAC_FIFOUnderflowFlag = LPDAC_FSR_UF_MASK, /*!< This flag means that there is a new trigger after the buffer is +empty. The FIFO read pointer will not +increase in this case and the data sent to DAC analog conversion will not changed. This flag is cleared by writing a 1 +to it. */ + + kDAC_FIFOOverflowFlag = + LPDAC_FSR_OF_MASK, /*!< This flag indicates that data is intended to write into FIFO after the +buffer is full. The writer pointer will +not increase in this case. The extra data will not be written into the FIFO. This flag is cleared by writing a 1 to it. +*/ + + kDAC_FIFOSwingBackFlag = LPDAC_FSR_SWBK_MASK, /*!< This flag indicates that the DAC has completed one period of +conversion in swing back mode. It means +that the read pointer has increased to the top (write pointer) once and then decreased to zero once. For +example, after three data is written to FIFO, the writer pointer is now 3. Then, if continually triggered, the +read pointer will swing like: 0-1-2-1-0-1-2-, and so on. After the fourth trigger, the flag is set. This flag is +cleared by writing a 1 to it. */ + + kDAC_FIFOWatermarkFlag = LPDAC_FSR_WM_MASK, /*!< This field is set if the remaining data in FIFO is less than or + equal to the setting value of wartermark. By writing data into FIFO by DMA or CPU, this flag is + cleared automatically when the data in FIFO is more than the setting value of watermark. */ + + kDAC_FIFOEmptyFlag = LPDAC_FSR_EMPTY_MASK, /*!< FIFO empty flag. */ + kDAC_FIFOFullFlag = LPDAC_FSR_FULL_MASK, /*!< FIFO full flag. */ +#if defined(FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE) && FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE + kDAC_PeriodTriggerCompleteFlag = LPDAC_FSR_PTGCOCO_MASK, /*!< Period trigger mode conversion complete flag. */ +#endif /* FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE */ +}; + +/*! + * @brief DAC FIFO trigger mode. + */ +typedef enum _dac_fifo_trigger_mode +{ + kDAC_FIFOTriggerByHardwareMode = 0U, /*!< Buffer would be triggered by hardware. */ + kDAC_FIFOTriggerBySoftwareMode = 1U, /*!< Buffer would be triggered by software. */ +} dac_fifo_trigger_mode_t; + +/*! + * @brief DAC FIFO work mode. + */ +typedef enum _dac_fifo_work_mode +{ + kDAC_FIFODisabled = 0U, /*!< FIFO mode is disabled and buffer mode is enabled. Any data written to DATA[DATA] goes + to buffer then goes to conversion. */ + kDAC_FIFOWorkAsNormalMode = 1U, /*!< FIFO mode is enabled. Data will be first read from FIFO to buffer then goes to + conversion. */ + kDAC_FIFOWorkAsSwingMode = 2U, /*!< In swing mode, the read pointer swings between the writer pointer and zero. That + is, the trigger increases the read pointer till reach the writer pointer and + decreases the read pointer till zero, and so on. The FIFO empty/full/watermark + flag will not update during swing back mode. */ +#if defined(FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE) && FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE + kDAC_FIFOWorkAsPeriodTriggerMode = + 3U, /*!< In periodic trigger mode, user only needs to send the first trigger. Then after every [PTG_PERIOD+1] + RCLK cycles, DAC will be automatically triggered by internal trigger. There will be [PTG_NUM] internal + triggers, thus in total [PTG_NUM+1] conversions including the first trigger sent by user. User can + terminate the current conversion queue by clearing the GCR[PTGEN] bit. Then, after the current conversion + is completed, the conversion is terminated and the PTGCOCO flag is set. If PCR[PTG_NUM] is set to zero, + there will be infinite triggers following the first hardware/software trigger, until the GCR[PTGEN] is + cleared by software. In any case, the conversion can be terminated by FIFORST/SWRST. */ + kDAC_FIFOWorkAsPeriodTriggerAndSwingMode = 4U, /*!< Periodically trigger DAC and swing back. */ +#endif /* FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE */ +} dac_fifo_work_mode_t; + +/*! + * @brief DAC reference voltage source. + */ +typedef enum _dac_reference_voltage_source +{ +#if defined(FSL_FEATURE_ANALOG_NUM_OF_VREF_SRC) && (FSL_FEATURE_ANALOG_NUM_OF_VREF_SRC == 3) + kDAC_ReferenceVoltageSourceAlt1 = 0U, /*!< The DAC selects VDD_ANA as the reference voltage. */ + kDAC_ReferenceVoltageSourceAlt2 = 1U, /*!< The DAC selects VREF_OUT as the reference voltage. */ + kDAC_ReferenceVoltageSourceAlt3 = 2U, /*!< THe DAC selects VREFH as the reference voltage. */ +#else + kDAC_ReferenceVoltageSourceAlt1 = 0U, /*!< The DAC selects VREFH_INT as the reference voltage. */ + kDAC_ReferenceVoltageSourceAlt2 = 1U, /*!< The DAC selects VREFH_EXT as the reference voltage. */ +#endif /* FSL_FEATURE_ANALOG_NUM_OF_VREF_SRC */ +} dac_reference_voltage_source_t; + +#if defined(FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT) && FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT +/* + * @brief DAC internal reference current source + */ +typedef enum _dac_reference_current_source +{ + kDAC_ReferenceCurrentSourcePtat = LPDAC_GCR_IREF_PTAT_EXT_SEL_MASK, /* Internal PTAT Current Reference selected */ + kDAC_ReferenceCurrentSourceZtc = LPDAC_GCR_IREF_ZTC_EXT_SEL_MASK, /* Internal ZTC Current Reference selected */ +} dac_reference_current_source_t; +#endif /* FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT */ + +/*! + * @brief DAC configuration structure. + */ +typedef struct _dac_config +{ + uint32_t fifoWatermarkLevel; /*!< FIFO's watermark, the max value can be the hardware FIFO size. */ + dac_fifo_trigger_mode_t fifoTriggerMode; /*!< Select the trigger mode for FIFO. */ + dac_fifo_work_mode_t fifoWorkMode; /*!< Select the work mode for FIFO. */ +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_BUF_EN) && FSL_FEATURE_LPDAC_HAS_GCR_BUF_EN + bool enableOpampBuffer; /*!< Opamp is used as buffer. */ +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_BUF_EN */ +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG) && FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG + bool enableExternalTriggerSource; /* DAC uses another DAC's hardware/software trigger as its trigger source. */ +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_RCV_TRG */ +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL) && FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL + bool enableLowerLowPowerMode; /*!< Enable the lower low power mode. */ +#else + bool enableLowPowerMode; /*!< Enable the low power mode. */ +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_BUF_SPD_CTRL */ +#if defined(FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE) && FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE + uint32_t periodicTriggerNumber; /*!< There will be 'periodicTriggerNumber' internal triggers following the first + hardware/software trigger. So there will be 'periodicTriggerNumber + 1' + conversions in total. If set to zero, there will be infinite triggers following + the first hw/sw trigger, until the GCR[PTGEN] is cleared. */ + uint32_t periodicTriggerWidth; /*!< Control the periodic trigger frequency. There will be 'periodicTriggerWidth + 1' + RCLK cycles between each periodic trigger. The periodic trigger frequency should + be configured to not larger than the analog conversion speed. */ +#endif /* FSL_FEATURE_LPDAC_HAS_PERIODIC_TRIGGER_MODE */ +#if defined(FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC) && FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC + uint32_t syncTime; /*!< RCLK cycles before data latch. accessible range is 0-15. It is used to configure the DAC + sync cycles which is helpful to reduce glitch on the output. The sync time is (LATCH_CYC+1) + RCLK cycles. User should configure this register according to the RCLK frequency. The + recommended sync time is at least 40ns.*/ +#endif /* FSL_FEATURE_LPDAC_HAS_GCR_LATCH_CYC */ +#if defined(FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT) && FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT + dac_reference_current_source_t referenceCurrentSource; /*!< Select the internal reference current source. */ +#endif /* FSL_FEATURE_LPDAC_HAS_INTERNAL_REFERENCE_CURRENT */ + dac_reference_voltage_source_t referenceVoltageSource; /*!< Select the reference voltage source. */ +} dac_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and de-initialization + * @{ + */ + +/*! + * @brief Initialize the DAC module with common configuartion. + * + * The clock will be enabled in this function. + * + * @param base DAC peripheral base address. + * @param config Pointer to configuration structure. + */ +void DAC_Init(LPDAC_Type *base, const dac_config_t *config); + +/*! + * @brief Get the default settings for initialization's configuration. + * + * This function initializes the user configuration structure to a default value. The default values are: + * @code + * config->fifoWatermarkLevel = 0U; + * config->fifoTriggerMode = kDAC_FIFOTriggerByHardwareMode; + * config->fifoWorkMode = kDAC_FIFODisabled; + * config->enableLowPowerMode = false; + * config->referenceVoltageSource = kDAC_ReferenceVoltageSourceAlt1; + * @endcode + * + * @param config Pointer to configuration structure. + */ +void DAC_GetDefaultConfig(dac_config_t *config); + +/*! + * @brief De-initialize the DAC module. + * + * The clock will be disabled in this function. + * + * @param base DAC peripheral base address. + */ +void DAC_Deinit(LPDAC_Type *base); + +/*! + * @brief Assert the reset control to part hardware. + * + * This function is to assert the reset control to part hardware. Responding part hardware would remain reset untill + * cleared by software. + * + * @param base DAC peripheral base address. + * @param mask The reset control mask, see to _dac_reset_control_t. + */ +static inline void DAC_SetReset(LPDAC_Type *base, uint32_t mask) +{ + base->RCR |= mask; +} + +/*! + * @brief Clear the reset control to part hardware. + * + * This function is to clear the reset control to part hardware. Responding part hardware would work after the reset + * control is cleared by software. + * + * @param base DAC peripheral base address. + * @param mask The reset control mask, see to _dac_reset_control_t. + */ +static inline void DAC_ClearReset(LPDAC_Type *base, uint32_t mask) +{ + base->RCR &= ~mask; +} + +/*! + * @brief Enable the DAC hardware system or not. + * + * This function is to start the Programmable Reference Generator operation or not. + * + * @param base DAC peripheral base address. + * @param enable Assertion of indicated event. + */ +static inline void DAC_Enable(LPDAC_Type *base, bool enable) +{ + if (enable) + { + base->GCR |= LPDAC_GCR_DACEN_MASK; + } + else + { + base->GCR &= ~LPDAC_GCR_DACEN_MASK; + } +} + +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enable the interrupts. + * + * @param base DAC peripheral base address. + * @param mask Mask value of indicated interrupt events. See to _dac_interrupt_enable. + */ +static inline void DAC_EnableInterrupts(LPDAC_Type *base, uint32_t mask) +{ + base->IER |= mask; +} + +/*! + * @brief Disable the interrupts. + * + * @param base DAC peripheral base address. + * @param mask Mask value of indicated interrupt events. See to _dac_interrupt_enable. + */ +static inline void DAC_DisableInterrupts(LPDAC_Type *base, uint32_t mask) +{ + base->IER &= ~mask; +} + +/*! @} */ + +/*! + * @name DMA control + * @{ + */ + +/*! + * @brief Enable the DMA switchers or not. + * + * @param base DAC peripheral base address. + * @param mask Mask value of indicated DMA requeset. See to _dac_dma_enable. + * @param enable Enable the DMA or not. + */ +static inline void DAC_EnableDMA(LPDAC_Type *base, uint32_t mask, bool enable) +{ + if (enable) + { + base->DER |= mask; + } + else + { + base->DER &= ~mask; + } +} + +/*! @} */ + +/*! + * @name Status flags + * @{ + */ + +/*! + * @brief Get status flags of DAC module. + * + * @param base DAC peripheral base address. + * @return Mask value of status flags. See to _dac_status_flags. + */ +static inline uint32_t DAC_GetStatusFlags(LPDAC_Type *base) +{ + return base->FSR; +} + +/*! + * @brief Clear status flags of DAC module. + * + * @param base DAC peripheral base address. + * @param flags Mask value of status flags to be cleared. See to _dac_status_flags. + */ +static inline void DAC_ClearStatusFlags(LPDAC_Type *base, uint32_t flags) +{ + base->FSR = flags; +} + +/*! @} */ + +/*! + * @name Functional feature + * @{ + */ + +/*! + * @brief Set data into the entry of FIFO buffer. + * + * @param base DAC peripheral base address. + * @param value Setting value into FIFO buffer. + */ +static inline void DAC_SetData(LPDAC_Type *base, uint32_t value) +{ + base->DATA = LPDAC_DATA_DATA(value); +} + +/*! + * @brief Get the value of the FIFO write pointer. + * + * @param base DAC peripheral base address. + * @return Current value of the FIFO write pointer. + */ + +static inline uint32_t DAC_GetFIFOWritePointer(LPDAC_Type *base) +{ + return (LPDAC_FPR_FIFO_WPT_MASK & base->FPR) >> LPDAC_FPR_FIFO_WPT_SHIFT; +} + +/*! + * @brief Get the value of the FIFO read pointer. + * + * @param base DAC peripheral base address. + * @return Current value of the FIFO read pointer. + */ + +static inline uint32_t DAC_GetFIFOReadPointer(LPDAC_Type *base) +{ + return (LPDAC_FPR_FIFO_RPT_MASK & base->FPR) >> LPDAC_FPR_FIFO_RPT_SHIFT; +} + +/*! + * @brief Do software trigger to FIFO when in software mode. + * + * @param base DAC peripheral base address. + */ + +static inline void DAC_DoSoftwareTriggerFIFO(LPDAC_Type *base) +{ + base->TCR = LPDAC_TCR_SWTRG_MASK; +} + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* FSL_DAC12_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma.c new file mode 100644 index 00000000000..b444faac9be --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma.c @@ -0,0 +1,2654 @@ +/* + * Copyright 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_edma.h" +#if defined FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET +#include "fsl_memory.h" +#endif + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.edma4" +#endif +#if defined FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET +#define CONVERT_TO_DMA_ADDRESS(addr) (MEMORY_ConvertMemoryMapAddress((uint32_t)(addr), kMEMORY_Local2DMA)) +#else +#define CONVERT_TO_DMA_ADDRESS(addr) ((uint32_t)(addr)) +#endif +#if defined(DMA_RSTS_N) +#define EDMA_RESETS_ARRAY DMA_RSTS_N +#endif +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Map transfer width. + * + * @param width transfer width. + */ +static edma_transfer_size_t EDMA_TransferWidthMapping(uint32_t width); + +/*! + * @brief validate edma errata. + * + * @param base edma base address. + * @param tcd edma transfer content descriptor. + */ +#if defined FSL_FEATURE_EDMA_HAS_ERRATA_51327 +static inline status_t EDMA_CheckErrata(EDMA_Type *base, edma_tcd_t *tcd); +#endif +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Array to map EDMA instance number to base pointer. */ +static EDMA_Type *const s_edmaBases[] = EDMA_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Array to map EDMA instance number to clock name. */ +static const clock_ip_name_t s_edmaClockName[] = EDMA_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(EDMA_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_edmaResets[] = EDMA_RESETS_ARRAY; +#endif + +/*! @brief Array to map EDMA instance number to IRQ number. */ +static const IRQn_Type s_edmaIRQNumber[][FSL_FEATURE_EDMA_MODULE_CHANNEL] = EDMA_CHN_IRQS; + +/*! @brief Pointers to transfer handle for each EDMA channel. */ +static edma_handle_t *s_EDMAHandle[FSL_FEATURE_SOC_EDMA_COUNT][FSL_FEATURE_EDMA_MODULE_CHANNEL]; +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t EDMA_GetInstance(EDMA_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_edmaBases); instance++) + { + if (s_edmaBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_edmaBases)); + + return instance; +} + +#if defined FSL_FEATURE_EDMA_HAS_ERRATA_51327 +static inline status_t EDMA_CheckErrata(EDMA_Type *base, edma_tcd_t *tcd) +{ + status_t status = kStatus_Success; + /* errata 51327: to use scatter gather feature, NBYTES must be multiple of 8 */ + if ((uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_ERRATA_51327n(base) == 1U) + { + if ((EDMA_TCD_NBYTES(tcd, EDMA_TCD_TYPE(base)) % 8U) != 0U) + { + assert(false); + status = kStatus_InvalidArgument; + } + } + + return status; +} +#endif + +/*! + * brief Push content of TCD structure into hardware TCD register. + * + * param base EDMA peripheral base address. + * param channel EDMA channel number. + * param tcd Point to TCD structure. + */ +void EDMA_InstallTCD(EDMA_Type *base, uint32_t channel, edma_tcd_t *tcd) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + assert(tcd != NULL); + + edma_tcd_t *tcdRegs = EDMA_TCD_BASE(base, channel); + +#if defined FSL_FEATURE_EDMA_HAS_ERRATA_51327 + if ((EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(base)) != 0U) && + ((EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) & (uint16_t)DMA_CSR_ESG_MASK) != 0U) && + (EDMA_CheckErrata(base, tcd) != kStatus_Success)) + { + assert(false); + } +#endif + + /* Clear DONE bit first, otherwise ESG cannot be set */ + DMA_CLEAR_DONE_STATUS(base, channel); + /* Push tcd into hardware TCD register */ + EDMA_TCD_SADDR(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_SADDR(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_SOFF(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_SOFF(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_ATTR(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_ATTR(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_NBYTES(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_NBYTES(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_SLAST(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_SLAST(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_DADDR(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_DADDR(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_DOFF(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_DOFF(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_CITER(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_DLAST_SGA(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)); + EDMA_TCD_BITER(tcdRegs, EDMA_TCD_TYPE(base)) = EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)); +} + +/*! + * brief Initializes the eDMA peripheral. + * + * This function ungates the eDMA clock and configures the eDMA peripheral according + * to the configuration structure. + * + * param base eDMA peripheral base address. + * param config A pointer to the configuration structure, see "edma_config_t". + * note This function enables the minor loop map feature. + */ +void EDMA_Init(EDMA_Type *base, const edma_config_t *config) +{ + assert(config != NULL); + assert(FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base) != -1); + + uint32_t tmpreg, i = 0U; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate EDMA peripheral clock */ + CLOCK_EnableClock(s_edmaClockName[EDMA_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(EDMA_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_edmaResets[EDMA_GetInstance(base)]); +#endif + +#if defined(FSL_EDMA_SOC_IP_EDMA) && FSL_EDMA_SOC_IP_EDMA + /* clear all the enabled request, status to make sure EDMA status is in normal condition */ + EDMA_BASE(base)->ERQ = 0U; + EDMA_BASE(base)->INT = 0xFFFFFFFFU; + EDMA_BASE(base)->ERR = 0xFFFFFFFFU; + /* Configure EDMA peripheral according to the configuration structure. */ + tmpreg = EDMA_BASE(base)->CR; + tmpreg &= ~(DMA_CR_ERCA_MASK | DMA_CR_HOE_MASK | DMA_CR_CLM_MASK | DMA_CR_EDBG_MASK); + tmpreg |= (DMA_CR_ERCA(config->enableRoundRobinArbitration) | DMA_CR_HOE(config->enableHaltOnError) | + DMA_CR_CLM(config->enableContinuousLinkMode) | DMA_CR_EDBG(config->enableDebugMode) | DMA_CR_EMLM(1U)); + EDMA_BASE(base)->CR = tmpreg; +#else + tmpreg = EDMA_MP_BASE(base)->MP_CSR; +#if defined FSL_FEATURE_EDMA_HAS_GLOBAL_MASTER_ID_REPLICATION && FSL_FEATURE_EDMA_HAS_GLOBAL_MASTER_ID_REPLICATION + tmpreg = (tmpreg & ~(DMA_MP_CSR_HAE_MASK | DMA_MP_CSR_ERCA_MASK | DMA_MP_CSR_EDBG_MASK | DMA_MP_CSR_GCLC_MASK | + DMA_MP_CSR_GMRC_MASK | DMA_MP_CSR_HALT_MASK)) | + DMA_MP_CSR_GMRC(config->enableMasterIdReplication) | DMA_MP_CSR_HAE(config->enableHaltOnError) | + DMA_MP_CSR_ERCA(config->enableRoundRobinArbitration) | DMA_MP_CSR_EDBG(config->enableDebugMode) | + DMA_MP_CSR_GCLC(config->enableGlobalChannelLink); +#else + tmpreg = (tmpreg & ~(DMA_MP_CSR_HAE_MASK | DMA_MP_CSR_ERCA_MASK | DMA_MP_CSR_EDBG_MASK | DMA_MP_CSR_GCLC_MASK | + DMA_MP_CSR_HALT_MASK)) | + DMA_MP_CSR_HAE(config->enableHaltOnError) | DMA_MP_CSR_ERCA(config->enableRoundRobinArbitration) | + DMA_MP_CSR_EDBG(config->enableDebugMode) | DMA_MP_CSR_GCLC(config->enableGlobalChannelLink); +#endif + EDMA_MP_BASE(base)->MP_CSR = tmpreg; + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG && FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG + /* channel transfer configuration */ + for (i = 0U; i < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base); i++) + { + if (config->channelConfig[i] != NULL) + { + EDMA_InitChannel(base, i, config->channelConfig[i]); + } + } +#endif +#endif +} + +/*! + * brief Deinitializes the eDMA peripheral. + * + * This function gates the eDMA clock. + * + * param base eDMA peripheral base address. + */ +void EDMA_Deinit(EDMA_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Gate EDMA peripheral clock */ + CLOCK_DisableClock(s_edmaClockName[EDMA_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG && FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG +/*! + * brief EDMA Channel initialization + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param channelConfig pointer to user's eDMA channel config structure, see edma_channel_config_t for detail. + */ +void EDMA_InitChannel(EDMA_Type *base, uint32_t channel, edma_channel_config_t *channelConfig) +{ + assert(channelConfig != NULL); + + EDMA_SetChannelPreemptionConfig(base, channel, &channelConfig->channelPreemptionConfig); + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE && FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE + EDMA_SetChannelSwapSize(base, channel, channelConfig->channelSwapSize); +#endif + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE && FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE + EDMA_SetChannelMemoryAttribute(base, channel, channelConfig->channelWriteMemoryAttribute, + channelConfig->channelReadMemoryAttribute); +#endif +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_SIGN_EXTENSION && FSL_FEATURE_EDMA_HAS_CHANNEL_SIGN_EXTENSION + EDMA_SetChannelSignExtension(base, channel, channelConfig->channelDataSignExtensionBitPosition); +#endif +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE && FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE + EDMA_SetChannelAccessType(base, channel, channelConfig->channelAccessType); +#endif + +#if (defined FSL_FEATURE_EDMA_HAS_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) || \ + (defined FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX) + if (0U != (uint32_t)channelConfig->channelRequestSource) + { + /* dma request source */ + EDMA_SetChannelMux(base, channel, (int32_t)channelConfig->channelRequestSource); + } +#endif + + /* master ID replication */ + EDMA_EnableChannelMasterIDReplication(base, channel, channelConfig->enableMasterIDReplication); +#if !(defined(FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC) && FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC) + /* dma transfer security level */ + EDMA_SetChannelSecurityLevel(base, channel, channelConfig->securityLevel); +#endif + /* dma transfer protection level */ + EDMA_SetChannelProtectionLevel(base, channel, channelConfig->protectionLevel); +} +#endif + +/*! + * brief Gets the eDMA default configuration structure. + * + * This function sets the configuration structure to default values. + * The default configuration is set to the following values. + * code + * config.enableContinuousLinkMode = false; + * config.enableHaltOnError = true; + * config.enableRoundRobinArbitration = false; + * config.enableDebugMode = false; + * endcode + * + * param config A pointer to the eDMA configuration structure. + */ +void EDMA_GetDefaultConfig(edma_config_t *config) +{ + assert(config != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + config->enableRoundRobinArbitration = false; + + config->enableHaltOnError = true; + +#if defined FSL_FEATURE_EDMA_HAS_CONTINUOUS_LINK_MODE && FSL_FEATURE_EDMA_HAS_CONTINUOUS_LINK_MODE + config->enableContinuousLinkMode = false; +#endif + +#if defined FSL_FEATURE_EDMA_HAS_GLOBAL_MASTER_ID_REPLICATION && FSL_FEATURE_EDMA_HAS_GLOBAL_MASTER_ID_REPLICATION + config->enableMasterIdReplication = false; +#endif + + config->enableDebugMode = false; + + config->enableGlobalChannelLink = true; +} + +/*! + * brief Sets all TCD registers to default values. + * + * This function sets TCD registers for this channel to default values. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * note This function must not be called while the channel transfer is ongoing + * or it causes unpredictable results. + * note This function enables the auto stop request feature. + */ +void EDMA_ResetChannel(EDMA_Type *base, uint32_t channel) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + /* reset channel CSR */ + EDMA_ClearChannelStatusFlags(base, channel, (uint32_t)kEDMA_DoneFlag | (uint32_t)kEDMA_ErrorFlag); + /* reset channel TCD */ + EDMA_TcdResetExt(base, EDMA_TCD_BASE(base, channel)); +} + +/*! + * brief Configures the eDMA transfer attribute. + * + * This function configures the transfer attribute, including source address, destination address, + * transfer size, address offset, and so on. It also configures the scatter gather feature if the + * user supplies the TCD address. + * Example: + * code + * edma_transfer_t config; + * edma_tcd_t tcd; + * config.srcAddr = ..; + * config.destAddr = ..; + * ... + * EDMA_SetTransferConfig(DMA0, channel, &config, &stcd); + * endcode + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param config Pointer to eDMA transfer configuration structure. + * param nextTcd Point to TCD structure. It can be NULL if users + * do not want to enable scatter/gather feature. + * note If nextTcd is not NULL, it means scatter gather feature is enabled + * and DREQ bit is cleared in the previous transfer configuration, which + * is set in the eDMA_ResetChannel. + */ +void EDMA_SetTransferConfig(EDMA_Type *base, + uint32_t channel, + const edma_transfer_config_t *config, + edma_tcd_t *nextTcd) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + assert(config != NULL); + + EDMA_TcdSetTransferConfigExt(base, EDMA_TCD_BASE(base, channel), config, + (edma_tcd_t *)CONVERT_TO_DMA_ADDRESS(nextTcd)); +} + +/*! + * brief Configures the eDMA minor offset feature. + * + * The minor offset means that the signed-extended value is added to the source address or destination + * address after each minor loop. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param config A pointer to the minor offset configuration structure. + */ +void EDMA_SetMinorOffsetConfig(EDMA_Type *base, uint32_t channel, const edma_minor_offset_config_t *config) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + assert(config != NULL); + + uint32_t tmpreg; + + tmpreg = EDMA_TCD_NBYTES(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)); + tmpreg &= ~(DMA_NBYTES_MLOFFYES_SMLOE_MASK | DMA_NBYTES_MLOFFYES_DMLOE_MASK | DMA_NBYTES_MLOFFYES_MLOFF_MASK); + tmpreg |= + (DMA_NBYTES_MLOFFYES_SMLOE(config->enableSrcMinorOffset) | + DMA_NBYTES_MLOFFYES_DMLOE(config->enableDestMinorOffset) | DMA_NBYTES_MLOFFYES_MLOFF(config->minorOffset)); + EDMA_TCD_NBYTES(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) = tmpreg; +} + +/*! + * brief Configures the eDMA channel TCD major offset feature. + * + * Adjustment value added to the source address at the completion of the major iteration count + * + * param base eDMA peripheral base address. + * param channel edma channel number. + * param sourceOffset source address offset. + * param destOffset destination address offset. + */ +void EDMA_SetMajorOffsetConfig(EDMA_Type *base, uint32_t channel, int32_t sourceOffset, int32_t destOffset) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + EDMA_TCD_SLAST(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) = (uint32_t)sourceOffset; + EDMA_TCD_DLAST_SGA(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) = (uint32_t)destOffset; +} + +/*! + * brief Configures the eDMA channel preemption feature. + * + * This function configures the channel preemption attribute and the priority of the channel. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number + * param config A pointer to the channel preemption configuration structure. + */ +void EDMA_SetChannelPreemptionConfig(EDMA_Type *base, uint32_t channel, const edma_channel_Preemption_config_t *config) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + assert(config != NULL); + + bool tmpEnablePreemptAbility = config->enablePreemptAbility; + bool tmpEnablchannelPreemption = config->enableChannelPreemption; + uint8_t tmpChannelPriority = config->channelPriority; + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + + volatile uint8_t *tmpReg = &EDMA_BASE(base)->DCHPRI3; + + ((volatile uint8_t *)tmpReg)[DMA_DCHPRI_INDEX(channel)] = + (DMA_DCHPRI0_DPA((true == tmpEnablePreemptAbility ? 0U : 1U)) | + DMA_DCHPRI0_ECP((true == tmpEnablchannelPreemption ? 1U : 0U)) | DMA_DCHPRI0_CHPRI(tmpChannelPriority)); +#else + EDMA_CHANNEL_BASE(base, channel)->CH_PRI = DMA_CH_PRI_ECP(tmpEnablchannelPreemption) | + DMA_CH_PRI_DPA(tmpEnablePreemptAbility) | + DMA_CH_PRI_APL(tmpChannelPriority); +#endif +} + +/*! + * brief Sets the channel link for the eDMA transfer. + * + * This function configures either the minor link or the major link mode. The minor link means that the channel link is + * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is + * exhausted. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param type A channel link type, which can be one of the following: + * arg kEDMA_LinkNone + * arg kEDMA_MinorLink + * arg kEDMA_MajorLink + * param linkedChannel The linked channel number. + * note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. + */ +void EDMA_SetChannelLink(EDMA_Type *base, uint32_t channel, edma_channel_link_type_t type, uint32_t linkedChannel) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + assert(linkedChannel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + EDMA_TcdSetChannelLinkExt(base, EDMA_TCD_BASE(base, channel), type, linkedChannel); +} + +#if defined FSL_FEATURE_EDMA_HAS_BANDWIDTH && FSL_FEATURE_EDMA_HAS_BANDWIDTH +/*! + * brief Sets the bandwidth for the eDMA transfer. + * + * Because the eDMA processes the minor loop, it continuously generates read/write sequences + * until the minor count is exhausted. The bandwidth forces the eDMA to stall after the completion of + * each read/write access to control the bus request bandwidth seen by the crossbar switch. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param bandWidth A bandwidth setting, which can be one of the following: + * arg kEDMABandwidthStallNone + * arg kEDMABandwidthStall4Cycle + * arg kEDMABandwidthStall8Cycle + */ +void EDMA_SetBandWidth(EDMA_Type *base, uint32_t channel, edma_bandwidth_t bandWidth) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) = + (uint16_t)((EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) & (~DMA_CSR_BWC_MASK)) | + DMA_CSR_BWC(bandWidth)); +} +#endif + +/*! + * brief Sets the source modulo and the destination modulo for the eDMA transfer. + * + * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) + * calculation is performed or the original register value. It provides the ability to implement a circular data + * queue easily. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param srcModulo A source modulo value. + * param destModulo A destination modulo value. + */ +void EDMA_SetModulo(EDMA_Type *base, uint32_t channel, edma_modulo_t srcModulo, edma_modulo_t destModulo) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + uint16_t tmpreg = EDMA_TCD_ATTR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) & + (~(uint16_t)(DMA_ATTR_SMOD_MASK | DMA_ATTR_DMOD_MASK)); + EDMA_TCD_ATTR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) = + tmpreg | DMA_ATTR_DMOD(destModulo) | DMA_ATTR_SMOD(srcModulo); +} + +/*! + * brief Sets all fields to default values for the TCD structure. + * + * This function sets all fields for this TCD structure to default value. + * + * param base eDMA peripheral base address. + * param tcd Pointer to the TCD structure. + * note This function enables the auto stop request feature. + */ +void EDMA_TcdResetExt(EDMA_Type *base, edma_tcd_t *tcd) +{ + assert(tcd != NULL); + assert(((uint32_t)tcd & 0x1FU) == 0U); + + /* Reset channel TCD */ + EDMA_TCD_SADDR(tcd, EDMA_TCD_TYPE(base)) = 0U; + EDMA_TCD_SOFF(tcd, EDMA_TCD_TYPE(base)) = 0U; + EDMA_TCD_ATTR(tcd, EDMA_TCD_TYPE(base)) = 0U; + EDMA_TCD_NBYTES(tcd, EDMA_TCD_TYPE(base)) = 0U; + EDMA_TCD_SLAST(tcd, EDMA_TCD_TYPE(base)) = 0U; + EDMA_TCD_DADDR(tcd, EDMA_TCD_TYPE(base)) = 0U; + EDMA_TCD_DOFF(tcd, EDMA_TCD_TYPE(base)) = 0U; + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) = 0U; + EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(base)) = 0U; + /* Enable auto disable request feature */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) = DMA_CSR_DREQ(1U); + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) = 0U; +} + +/*! + * brief Configures the eDMA TCD transfer attribute. + * + * The TCD is a transfer control descriptor. The content of the TCD is the same as the hardware TCD registers. + * The TCD is used in the scatter-gather mode. + * This function configures the TCD transfer attribute, including source address, destination address, + * transfer size, address offset, and so on. It also configures the scatter gather feature if the + * user supplies the next TCD address. + * Example: + * code + * edma_transfer_t config = { + * ... + * } + * edma_tcd_t tcd __aligned(32); + * edma_tcd_t nextTcd __aligned(32); + * EDMA_TcdSetTransferConfig(&tcd, &config, &nextTcd); + * endcode + * + * param base eDMA peripheral base address. + * param tcd Pointer to the TCD structure. + * param config Pointer to eDMA transfer configuration structure. + * param nextTcd Pointer to the next TCD structure. It can be NULL if users + * do not want to enable scatter/gather feature. + * note TCD address should be 32 bytes aligned or it causes an eDMA error. + * note If the nextTcd is not NULL, the scatter gather feature is enabled + * and DREQ bit is cleared in the previous transfer configuration, which + * is set in the EDMA_TcdReset. + */ +void EDMA_TcdSetTransferConfigExt(EDMA_Type *base, + edma_tcd_t *tcd, + const edma_transfer_config_t *config, + edma_tcd_t *nextTcd) +{ + assert(tcd != NULL); + assert(((uint32_t)tcd & 0x1FU) == 0U); + assert(config != NULL); + + EDMA_ConfigChannelSoftwareTCDExt(base, tcd, config); + + if (nextTcd != NULL) + { + EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(base)) = CONVERT_TO_DMA_ADDRESS(nextTcd); + /* + Before call EDMA_TcdSetTransferConfig or EDMA_SetTransferConfig, + user must call EDMA_TcdReset or EDMA_ResetChannel which will set + DREQ, so must use "|" or "&" rather than "=". + + Clear the DREQ bit because scatter gather has been enabled, so the + previous transfer is not the last transfer, and channel request should + be enabled at the next transfer(the next TCD). + */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) = + (EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) | (uint16_t)DMA_CSR_ESG_MASK) & ~(uint16_t)DMA_CSR_DREQ_MASK; + } +} + +/*! + * brief Sets TCD fields according to the user's channel transfer configuration structure, see + * edma_transfer_config_t. + * + * Application should be careful about the TCD pool buffer storage class, + * - For the platform has cache, the software TCD should be put in non cache section + * - The TCD pool buffer should have a consistent storage class. + * + * param base eDMA peripheral base address. + * param tcd Pointer to the TCD structure. + * param transfer channel transfer configuration pointer. + * + */ +void EDMA_ConfigChannelSoftwareTCDExt(EDMA_Type *base, edma_tcd_t *tcd, const edma_transfer_config_t *transfer) +{ + assert(transfer != NULL); + assert((transfer->minorLoopBytes % (1UL << ((uint32_t)transfer->srcTransferSize))) == 0U); + assert((transfer->minorLoopBytes % (1UL << ((uint32_t)transfer->destTransferSize))) == 0U); + assert(((uint32_t)transfer->srcOffset % (1UL << ((uint32_t)transfer->srcTransferSize))) == 0U); + assert(((uint32_t)transfer->destOffset % (1UL << ((uint32_t)transfer->destTransferSize))) == 0U); + assert((transfer->srcAddr % (1UL << ((uint32_t)transfer->srcTransferSize))) == 0U); + assert((transfer->destAddr % (1UL << ((uint32_t)transfer->destTransferSize))) == 0U); + assert((transfer->srcAddr % (1UL << ((uint32_t)transfer->srcAddrModulo))) == 0U); + assert((transfer->destAddr % (1UL << ((uint32_t)transfer->dstAddrModulo))) == 0U); + + uint16_t tmpreg; + + EDMA_TCD_SADDR(tcd, EDMA_TCD_TYPE(base)) = CONVERT_TO_DMA_ADDRESS(transfer->srcAddr); + /* destination address */ + EDMA_TCD_DADDR(tcd, EDMA_TCD_TYPE(base)) = CONVERT_TO_DMA_ADDRESS(transfer->destAddr); + /* Source data and destination data transfer size */ + EDMA_TCD_ATTR(tcd, EDMA_TCD_TYPE(base)) = + DMA_ATTR_SSIZE(transfer->srcTransferSize) | DMA_ATTR_DSIZE(transfer->destTransferSize); + + /* Source address signed offset */ + EDMA_TCD_SOFF(tcd, EDMA_TCD_TYPE(base)) = (uint16_t)(transfer->srcOffset); + /* Destination address signed offset */ + EDMA_TCD_DOFF(tcd, EDMA_TCD_TYPE(base)) = (uint16_t)(transfer->destOffset); + + if (((transfer->enableSrcMinorLoopOffset) || (transfer->enableDstMinorLoopOffset))) + { + EDMA_TCD_NBYTES(tcd, EDMA_TCD_TYPE(base)) = DMA_NBYTES_MLOFFYES_NBYTES(transfer->minorLoopBytes) | + DMA_NBYTES_MLOFFYES_MLOFF(transfer->minorLoopOffset) | + DMA_NBYTES_MLOFFYES_DMLOE(transfer->enableDstMinorLoopOffset) | + DMA_NBYTES_MLOFFYES_SMLOE(transfer->enableSrcMinorLoopOffset); + } + else + { + EDMA_TCD_NBYTES(tcd, EDMA_TCD_TYPE(base)) = DMA_NBYTES_MLOFFNO_NBYTES(transfer->minorLoopBytes); + } + + /* Current major iteration count */ + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) = (uint16_t)(transfer->majorLoopCounts); + /* Starting major iteration count */ + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) = (uint16_t)(transfer->majorLoopCounts); + /* reset CSR firstly */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) = DMA_CSR_DREQ(1U); + /* Enable scatter/gather processing */ + if (transfer->linkTCD != NULL) + { + EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(base)) = CONVERT_TO_DMA_ADDRESS((uint32_t)((uint8_t *)transfer->linkTCD)); + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) = + (EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) | (uint16_t)DMA_CSR_ESG_MASK) & ~(uint16_t)DMA_CSR_DREQ_MASK; + } + else + { + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_ESG_MASK; + EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(base)) = (uint32_t)transfer->dstMajorLoopOffset; + } + + /* configure interrupt/auto disable channel request */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) |= (transfer->enabledInterruptMask & (~(uint16_t)kEDMA_ErrorInterruptEnable)); + + /* Minor link config */ + if (transfer->enableChannelMinorLoopLink) + { + /* Enable minor link */ + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) |= DMA_CITER_ELINKYES_ELINK_MASK; + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) |= DMA_BITER_ELINKYES_ELINK_MASK; + /* Set linked channel */ + tmpreg = EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) & (~(uint16_t)DMA_CITER_ELINKYES_LINKCH_MASK); + tmpreg |= DMA_CITER_ELINKYES_LINKCH(transfer->minorLoopLinkChannel); + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) = tmpreg; + tmpreg = EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) & (~(uint16_t)DMA_BITER_ELINKYES_LINKCH_MASK); + tmpreg |= DMA_BITER_ELINKYES_LINKCH(transfer->minorLoopLinkChannel); + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) = tmpreg; + } + /* Major link config */ + if (transfer->enableChannelMajorLoopLink) + { + /* Enable major link */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) |= DMA_CSR_MAJORELINK_MASK; + /* Set major linked channel */ + tmpreg = EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) & (~(uint16_t)DMA_CSR_MAJORLINKCH_MASK); + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) = tmpreg | DMA_CSR_MAJORLINKCH(transfer->majorLoopLinkChannel); + } + + /* clear link relate field if no channel link enabled */ + if ((!transfer->enableChannelMajorLoopLink) && (!transfer->enableChannelMinorLoopLink)) + { + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CITER_ELINKYES_ELINK_MASK; + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_BITER_ELINKYES_ELINK_MASK; + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_MAJORELINK_MASK; + } + + /* major loop offset */ + EDMA_TCD_SLAST(tcd, EDMA_TCD_TYPE(base)) = (uint32_t)transfer->srcMajorLoopOffset; + /* modulo feature */ + tmpreg = EDMA_TCD_ATTR(tcd, EDMA_TCD_TYPE(base)) & (~(uint16_t)(DMA_ATTR_SMOD_MASK | DMA_ATTR_DMOD_MASK)); + EDMA_TCD_ATTR(tcd, EDMA_TCD_TYPE(base)) = + tmpreg | DMA_ATTR_DMOD(transfer->dstAddrModulo) | DMA_ATTR_SMOD(transfer->srcAddrModulo); +} + +/*! + * brief Configures the eDMA TCD minor offset feature. + * + * A minor offset is a signed-extended value added to the source address or a destination + * address after each minor loop. + * + * param base eDMA peripheral base address. + * param tcd A point to the TCD structure. + * param config A pointer to the minor offset configuration structure. + */ +void EDMA_TcdSetMinorOffsetConfigExt(EDMA_Type *base, edma_tcd_t *tcd, const edma_minor_offset_config_t *config) +{ + assert(tcd != NULL); + assert(((uint32_t)tcd & 0x1FU) == 0U); + + uint32_t tmpreg; + + tmpreg = EDMA_TCD_NBYTES(tcd, EDMA_TCD_TYPE(base)) & + ~(DMA_NBYTES_MLOFFYES_SMLOE_MASK | DMA_NBYTES_MLOFFYES_DMLOE_MASK | DMA_NBYTES_MLOFFYES_MLOFF_MASK); + tmpreg |= + (DMA_NBYTES_MLOFFYES_SMLOE(config->enableSrcMinorOffset) | + DMA_NBYTES_MLOFFYES_DMLOE(config->enableDestMinorOffset) | DMA_NBYTES_MLOFFYES_MLOFF(config->minorOffset)); + EDMA_TCD_NBYTES(tcd, EDMA_TCD_TYPE(base)) = tmpreg; +} + +/*! + * brief Configures the eDMA TCD major offset feature. + * + * Adjustment value added to the source address at the completion of the major iteration count + * + * param base eDMA peripheral base address. + * param tcd A point to the TCD structure. + * param sourceOffset source address offset. + * param destOffset destination address offset. + */ +void EDMA_TcdSetMajorOffsetConfigExt(EDMA_Type *base, edma_tcd_t *tcd, int32_t sourceOffset, int32_t destOffset) +{ + assert(tcd != NULL); + assert(((uint32_t)tcd & 0x1FU) == 0U); + + EDMA_TCD_SLAST(tcd, EDMA_TCD_TYPE(base)) = (uint32_t)sourceOffset; + EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(base)) = (uint32_t)destOffset; +} + +/*! + * brief Sets the channel link for the eDMA TCD. + * + * This function configures either a minor link or a major link. The minor link means the channel link is + * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is + * exhausted. + * + * note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. + * param base eDMA peripheral base address. + * param tcd Point to the TCD structure. + * param type Channel link type, it can be one of: + * arg kEDMA_LinkNone + * arg kEDMA_MinorLink + * arg kEDMA_MajorLink + * param linkedChannel The linked channel number. + */ +void EDMA_TcdSetChannelLinkExt(EDMA_Type *base, edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel) +{ + assert(tcd != NULL); + assert(((uint32_t)tcd & 0x1FU) == 0U); + assert(linkedChannel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); + + if (type == kEDMA_MinorLink) /* Minor link config */ + { + uint16_t tmpreg; + + /* Enable minor link */ + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) |= DMA_CITER_ELINKYES_ELINK_MASK; + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) |= DMA_BITER_ELINKYES_ELINK_MASK; + /* Set linked channel */ + tmpreg = EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) & (~(uint16_t)DMA_CITER_ELINKYES_LINKCH_MASK); + tmpreg |= DMA_CITER_ELINKYES_LINKCH(linkedChannel); + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) = tmpreg; + tmpreg = EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) & (~(uint16_t)DMA_BITER_ELINKYES_LINKCH_MASK); + tmpreg |= DMA_BITER_ELINKYES_LINKCH(linkedChannel); + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) = tmpreg; + } + else if (type == kEDMA_MajorLink) /* Major link config */ + { + uint16_t tmpreg; + + /* Enable major link */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) |= DMA_CSR_MAJORELINK_MASK; + /* Set major linked channel */ + tmpreg = EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) & (~(uint16_t)DMA_CSR_MAJORLINKCH_MASK); + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) = tmpreg | DMA_CSR_MAJORLINKCH(linkedChannel); + } + else /* Link none */ + { + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CITER_ELINKYES_ELINK_MASK; + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_BITER_ELINKYES_ELINK_MASK; + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_MAJORELINK_MASK; + } +} + +/*! + * brief Sets the source modulo and the destination modulo for the eDMA TCD. + * + * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) + * calculation is performed or the original register value. It provides the ability to implement a circular data + * queue easily. + * + * param base eDMA peripheral base address. + * param tcd A pointer to the TCD structure. + * param srcModulo A source modulo value. + * param destModulo A destination modulo value. + */ +void EDMA_TcdSetModuloExt(EDMA_Type *base, edma_tcd_t *tcd, edma_modulo_t srcModulo, edma_modulo_t destModulo) +{ + assert(tcd != NULL); + assert(((uint32_t)tcd & 0x1FU) == 0U); + + uint16_t tmpreg; + + tmpreg = EDMA_TCD_ATTR(tcd, EDMA_TCD_TYPE(base)) & (~(uint16_t)(DMA_ATTR_SMOD_MASK | DMA_ATTR_DMOD_MASK)); + EDMA_TCD_ATTR(tcd, EDMA_TCD_TYPE(base)) = tmpreg | DMA_ATTR_DMOD(destModulo) | DMA_ATTR_SMOD(srcModulo); +} + +/*! + * brief Enables the interrupt source for the eDMA TCD. + * + * param base eDMA peripheral base address. + * param tcd Point to the TCD structure. + * param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_TcdEnableInterruptsExt(EDMA_Type *base, edma_tcd_t *tcd, uint32_t mask) +{ + assert(tcd != NULL); + + /* Enable Major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) + { + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) |= DMA_CSR_INTMAJOR_MASK; + } + + /* Enable Half major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) + { + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) |= DMA_CSR_INTHALF_MASK; + } +} + +/*! + * brief Disables the interrupt source for the eDMA TCD. + * + * param base eDMA peripheral base address. + * param tcd Point to the TCD structure. + * param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_TcdDisableInterruptsExt(EDMA_Type *base, edma_tcd_t *tcd, uint32_t mask) +{ + assert(tcd != NULL); + + /* Disable Major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) + { + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_INTMAJOR_MASK; + } + + /* Disable Half major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) + { + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_INTHALF_MASK; + } +} + +/*! + * brief Sets all fields to default values for the TCD structure. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_TcdResetExt + * + * This function sets all fields for this TCD structure to default value. + * + * param tcd Pointer to the TCD structure. + * note This function enables the auto stop request feature. + */ +void EDMA_TcdReset(edma_tcd_t *tcd) +{ + assert(tcd != NULL); + + /* Reset channel TCD */ + EDMA_TCD_SADDR(tcd, kEDMA_EDMA4Flag) = 0U; + EDMA_TCD_SOFF(tcd, kEDMA_EDMA4Flag) = 0U; + EDMA_TCD_ATTR(tcd, kEDMA_EDMA4Flag) = 0U; + EDMA_TCD_NBYTES(tcd, kEDMA_EDMA4Flag) = 0U; + EDMA_TCD_SLAST(tcd, kEDMA_EDMA4Flag) = 0U; + EDMA_TCD_DADDR(tcd, kEDMA_EDMA4Flag) = 0U; + EDMA_TCD_DOFF(tcd, kEDMA_EDMA4Flag) = 0U; + EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) = 0U; + EDMA_TCD_DLAST_SGA(tcd, kEDMA_EDMA4Flag) = 0U; + /* Enable auto disable request feature */ + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) = DMA_CSR_DREQ(1U); + EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) = 0U; +} + +/*! + * brief Configures the eDMA TCD transfer attribute. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_TcdSetTransferConfigExt + * + * The TCD is a transfer control descriptor. The content of the TCD is the same as the hardware TCD registers. + * The TCD is used in the scatter-gather mode. + * This function configures the TCD transfer attribute, including source address, destination address, + * transfer size, address offset, and so on. It also configures the scatter gather feature if the + * user supplies the next TCD address. + * Example: + * code + * edma_transfer_t config = { + * ... + * } + * edma_tcd_t tcd __aligned(32); + * edma_tcd_t nextTcd __aligned(32); + * EDMA_TcdSetTransferConfig(&tcd, &config, &nextTcd); + * endcode + * + * param tcd Pointer to the TCD structure. + * param config Pointer to eDMA transfer configuration structure. + * param nextTcd Pointer to the next TCD structure. It can be NULL if users + * do not want to enable scatter/gather feature. + * note TCD address should be 32 bytes aligned or it causes an eDMA error. + * note If the nextTcd is not NULL, the scatter gather feature is enabled + * and DREQ bit is cleared in the previous transfer configuration, which + * is set in the EDMA_TcdReset. + */ +void EDMA_TcdSetTransferConfig(edma_tcd_t *tcd, const edma_transfer_config_t *config, edma_tcd_t *nextTcd) +{ + assert(tcd != NULL); + assert(config != NULL); + + EDMA_ConfigChannelSoftwareTCD(tcd, config); + + if (nextTcd != NULL) + { + EDMA_TCD_DLAST_SGA(tcd, kEDMA_EDMA4Flag) = CONVERT_TO_DMA_ADDRESS(nextTcd); + /* + Before call EDMA_TcdSetTransferConfig or EDMA_SetTransferConfig, + user must call EDMA_TcdReset or EDMA_ResetChannel which will set + DREQ, so must use "|" or "&" rather than "=". + + Clear the DREQ bit because scatter gather has been enabled, so the + previous transfer is not the last transfer, and channel request should + be enabled at the next transfer(the next TCD). + */ + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) = + (EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) | (uint16_t)DMA_CSR_ESG_MASK) & ~(uint16_t)DMA_CSR_DREQ_MASK; + } +} + +/*! + * brief Sets TCD fields according to the user's channel transfer configuration structure, see + * edma_transfer_config_t. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_ConfigChannelSoftwareTCDExt + * + * Application should be careful about the TCD pool buffer storage class, + * - For the platform has cache, the software TCD should be put in non cache section + * - The TCD pool buffer should have a consistent storage class. + * + * param tcd Pointer to the TCD structure. + * param transfer channel transfer configuration pointer. + * + */ +void EDMA_ConfigChannelSoftwareTCD(edma_tcd_t *tcd, const edma_transfer_config_t *transfer) +{ + assert(transfer != NULL); + assert((transfer->minorLoopBytes % (1UL << ((uint32_t)transfer->srcTransferSize))) == 0U); + assert((transfer->minorLoopBytes % (1UL << ((uint32_t)transfer->destTransferSize))) == 0U); + assert(((uint32_t)transfer->srcOffset % (1UL << ((uint32_t)transfer->srcTransferSize))) == 0U); + assert(((uint32_t)transfer->destOffset % (1UL << ((uint32_t)transfer->destTransferSize))) == 0U); + assert((transfer->srcAddr % (1UL << ((uint32_t)transfer->srcTransferSize))) == 0U); + assert((transfer->destAddr % (1UL << ((uint32_t)transfer->destTransferSize))) == 0U); + assert((transfer->srcAddr % (1UL << ((uint32_t)transfer->srcAddrModulo))) == 0U); + assert((transfer->destAddr % (1UL << ((uint32_t)transfer->dstAddrModulo))) == 0U); + + uint16_t tmpreg; + + EDMA_TCD_SADDR(tcd, kEDMA_EDMA4Flag) = CONVERT_TO_DMA_ADDRESS(transfer->srcAddr); + /* destination address */ + EDMA_TCD_DADDR(tcd, kEDMA_EDMA4Flag) = CONVERT_TO_DMA_ADDRESS(transfer->destAddr); + /* Source data and destination data transfer size */ + EDMA_TCD_ATTR(tcd, kEDMA_EDMA4Flag) = + DMA_ATTR_SSIZE(transfer->srcTransferSize) | DMA_ATTR_DSIZE(transfer->destTransferSize); + + /* Source address signed offset */ + EDMA_TCD_SOFF(tcd, kEDMA_EDMA4Flag) = (uint16_t)(transfer->srcOffset); + /* Destination address signed offset */ + EDMA_TCD_DOFF(tcd, kEDMA_EDMA4Flag) = (uint16_t)(transfer->destOffset); + + if (((transfer->enableSrcMinorLoopOffset) || (transfer->enableDstMinorLoopOffset))) + { + EDMA_TCD_NBYTES(tcd, kEDMA_EDMA4Flag) = DMA_NBYTES_MLOFFYES_NBYTES(transfer->minorLoopBytes) | + DMA_NBYTES_MLOFFYES_MLOFF(transfer->minorLoopOffset) | + DMA_NBYTES_MLOFFYES_DMLOE(transfer->enableDstMinorLoopOffset) | + DMA_NBYTES_MLOFFYES_SMLOE(transfer->enableSrcMinorLoopOffset); + } + else + { + EDMA_TCD_NBYTES(tcd, kEDMA_EDMA4Flag) = DMA_NBYTES_MLOFFNO_NBYTES(transfer->minorLoopBytes); + } + + /* Current major iteration count */ + EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) = (uint16_t)(transfer->majorLoopCounts); + /* Starting major iteration count */ + EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) = (uint16_t)(transfer->majorLoopCounts); + /* reset CSR firstly */ + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) = DMA_CSR_DREQ(1U); + /* Enable scatter/gather processing */ + if (transfer->linkTCD != NULL) + { + EDMA_TCD_DLAST_SGA(tcd, kEDMA_EDMA4Flag) = CONVERT_TO_DMA_ADDRESS((uint32_t)((uint8_t *)transfer->linkTCD)); + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) = + (EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) | (uint16_t)DMA_CSR_ESG_MASK) & ~(uint16_t)DMA_CSR_DREQ_MASK; + } + else + { + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_CSR_ESG_MASK; + EDMA_TCD_DLAST_SGA(tcd, kEDMA_EDMA4Flag) = (uint32_t)transfer->dstMajorLoopOffset; + } + + /* configure interrupt/auto disable channel request */ + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) |= (transfer->enabledInterruptMask & (~(uint16_t)kEDMA_ErrorInterruptEnable)); + + /* Minor link config */ + if (transfer->enableChannelMinorLoopLink) + { + /* Enable minor link */ + EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) |= DMA_CITER_ELINKYES_ELINK_MASK; + EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) |= DMA_BITER_ELINKYES_ELINK_MASK; + /* Set linked channel */ + tmpreg = EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) & (~(uint16_t)DMA_CITER_ELINKYES_LINKCH_MASK); + tmpreg |= DMA_CITER_ELINKYES_LINKCH(transfer->minorLoopLinkChannel); + EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) = tmpreg; + tmpreg = EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) & (~(uint16_t)DMA_BITER_ELINKYES_LINKCH_MASK); + tmpreg |= DMA_BITER_ELINKYES_LINKCH(transfer->minorLoopLinkChannel); + EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) = tmpreg; + } + /* Major link config */ + if (transfer->enableChannelMajorLoopLink) + { + /* Enable major link */ + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) |= DMA_CSR_MAJORELINK_MASK; + /* Set major linked channel */ + tmpreg = EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) & (~(uint16_t)DMA_CSR_MAJORLINKCH_MASK); + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) = tmpreg | DMA_CSR_MAJORLINKCH(transfer->majorLoopLinkChannel); + } + + /* clear link relate field if no channel link enabled */ + if ((!transfer->enableChannelMajorLoopLink) && (!transfer->enableChannelMinorLoopLink)) + { + EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_CITER_ELINKYES_ELINK_MASK; + EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_BITER_ELINKYES_ELINK_MASK; + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_CSR_MAJORELINK_MASK; + } + + /* major loop offset */ + EDMA_TCD_SLAST(tcd, kEDMA_EDMA4Flag) = (uint32_t)transfer->srcMajorLoopOffset; + /* modulo feature */ + tmpreg = EDMA_TCD_ATTR(tcd, kEDMA_EDMA4Flag) & (~(uint16_t)(DMA_ATTR_SMOD_MASK | DMA_ATTR_DMOD_MASK)); + EDMA_TCD_ATTR(tcd, kEDMA_EDMA4Flag) = + tmpreg | DMA_ATTR_DMOD(transfer->dstAddrModulo) | DMA_ATTR_SMOD(transfer->srcAddrModulo); +} + +/*! + * brief Configures the eDMA TCD minor offset feature. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_TcdSetMinorOffsetConfigExt + * + * A minor offset is a signed-extended value added to the source address or a destination + * address after each minor loop. + * + * param tcd A point to the TCD structure. + * param config A pointer to the minor offset configuration structure. + */ +void EDMA_TcdSetMinorOffsetConfig(edma_tcd_t *tcd, const edma_minor_offset_config_t *config) +{ + assert(tcd != NULL); + + uint32_t tmpreg; + + tmpreg = EDMA_TCD_NBYTES(tcd, kEDMA_EDMA4Flag) & + ~(DMA_NBYTES_MLOFFYES_SMLOE_MASK | DMA_NBYTES_MLOFFYES_DMLOE_MASK | DMA_NBYTES_MLOFFYES_MLOFF_MASK); + tmpreg |= + (DMA_NBYTES_MLOFFYES_SMLOE(config->enableSrcMinorOffset) | + DMA_NBYTES_MLOFFYES_DMLOE(config->enableDestMinorOffset) | DMA_NBYTES_MLOFFYES_MLOFF(config->minorOffset)); + EDMA_TCD_NBYTES(tcd, kEDMA_EDMA4Flag) = tmpreg; +} + +/*! + * brief Configures the eDMA TCD major offset feature. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_TcdSetMajorOffsetConfigExt + * + * Adjustment value added to the source address at the completion of the major iteration count + * + * param tcd A point to the TCD structure. + * param sourceOffset source address offset. + * param destOffset destination address offset. + */ +void EDMA_TcdSetMajorOffsetConfig(edma_tcd_t *tcd, int32_t sourceOffset, int32_t destOffset) +{ + assert(tcd != NULL); + + EDMA_TCD_SLAST(tcd, kEDMA_EDMA4Flag) = (uint32_t)sourceOffset; + EDMA_TCD_DLAST_SGA(tcd, kEDMA_EDMA4Flag) = (uint32_t)destOffset; +} + +/*! + * brief Sets the channel link for the eDMA TCD. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_TcdSetChannelLinkExt + * + * This function configures either a minor link or a major link. The minor link means the channel link is + * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is + * exhausted. + * + * note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. + * param tcd Point to the TCD structure. + * param type Channel link type, it can be one of: + * arg kEDMA_LinkNone + * arg kEDMA_MinorLink + * arg kEDMA_MajorLink + * param linkedChannel The linked channel number. + */ +void EDMA_TcdSetChannelLink(edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel) +{ + assert(tcd != NULL); + assert(linkedChannel < (uint32_t)FSL_FEATURE_EDMA_MODULE_CHANNEL); + + if (type == kEDMA_MinorLink) /* Minor link config */ + { + uint16_t tmpreg; + + /* Enable minor link */ + EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) |= DMA_CITER_ELINKYES_ELINK_MASK; + EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) |= DMA_BITER_ELINKYES_ELINK_MASK; + /* Set linked channel */ + tmpreg = EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) & (~(uint16_t)DMA_CITER_ELINKYES_LINKCH_MASK); + tmpreg |= DMA_CITER_ELINKYES_LINKCH(linkedChannel); + EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) = tmpreg; + tmpreg = EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) & (~(uint16_t)DMA_BITER_ELINKYES_LINKCH_MASK); + tmpreg |= DMA_BITER_ELINKYES_LINKCH(linkedChannel); + EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) = tmpreg; + } + else if (type == kEDMA_MajorLink) /* Major link config */ + { + uint16_t tmpreg; + + /* Enable major link */ + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) |= DMA_CSR_MAJORELINK_MASK; + /* Set major linked channel */ + tmpreg = EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) & (~(uint16_t)DMA_CSR_MAJORLINKCH_MASK); + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) = tmpreg | DMA_CSR_MAJORLINKCH(linkedChannel); + } + else /* Link none */ + { + EDMA_TCD_CITER(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_CITER_ELINKYES_ELINK_MASK; + EDMA_TCD_BITER(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_BITER_ELINKYES_ELINK_MASK; + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_CSR_MAJORELINK_MASK; + } +} + +/*! + * brief Sets the source modulo and the destination modulo for the eDMA TCD. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_TcdSetModuloExt + * + * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) + * calculation is performed or the original register value. It provides the ability to implement a circular data + * queue easily. + * + * param tcd A pointer to the TCD structure. + * param srcModulo A source modulo value. + * param destModulo A destination modulo value. + */ +void EDMA_TcdSetModulo(edma_tcd_t *tcd, edma_modulo_t srcModulo, edma_modulo_t destModulo) +{ + assert(tcd != NULL); + + uint16_t tmpreg; + + tmpreg = EDMA_TCD_ATTR(tcd, kEDMA_EDMA4Flag) & (~(uint16_t)(DMA_ATTR_SMOD_MASK | DMA_ATTR_DMOD_MASK)); + EDMA_TCD_ATTR(tcd, kEDMA_EDMA4Flag) = tmpreg | DMA_ATTR_DMOD(destModulo) | DMA_ATTR_SMOD(srcModulo); +} + +/*! + * brief Enables the interrupt source for the eDMA TCD. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_TcdEnableInterruptsExt + * + * param tcd Point to the TCD structure. + * param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_TcdEnableInterrupts(edma_tcd_t *tcd, uint32_t mask) +{ + assert(tcd != NULL); + + /* Enable Major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) + { + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) |= DMA_CSR_INTMAJOR_MASK; + } + + /* Enable Half major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) + { + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) |= DMA_CSR_INTHALF_MASK; + } +} + +/*! + * brief Disables the interrupt source for the eDMA TCD. + * + * Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API ref + * EDMA_TcdDisableInterruptsExt + * + * param tcd Point to the TCD structure. + * param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_TcdDisableInterrupts(edma_tcd_t *tcd, uint32_t mask) +{ + assert(tcd != NULL); + + /* Disable Major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) + { + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_CSR_INTMAJOR_MASK; + } + + /* Disable Half major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) + { + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) &= ~(uint16_t)DMA_CSR_INTHALF_MASK; + } +} + +/*! + * brief Gets the remaining major loop count from the eDMA current channel TCD. + * + * This function checks the TCD (Task Control Descriptor) status for a specified + * eDMA channel and returns the number of major loop count that has not finished. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * return Major loop count which has not been transferred yet for the current TCD. + * note 1. This function can only be used to get unfinished major loop count of transfer without + * the next TCD, or it might be inaccuracy. + * 2. The unfinished/remaining transfer bytes cannot be obtained directly from registers while + * the channel is running. + * Because to calculate the remaining bytes, the initial NBYTES configured in DMA_TCDn_NBYTES_MLNO + * register is needed while the eDMA IP does not support getting it while a channel is active. + * In another word, the NBYTES value reading is always the actual (decrementing) NBYTES value the dma_engine + * is working with while a channel is running. + * Consequently, to get the remaining transfer bytes, a software-saved initial value of NBYTES (for example + * copied before enabling the channel) is needed. The formula to calculate it is shown below: + * RemainingBytes = RemainingMajorLoopCount * NBYTES(initially configured) + */ +uint32_t EDMA_GetRemainingMajorLoopCount(EDMA_Type *base, uint32_t channel) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + uint32_t remainingCount = 0; + + if (0U != DMA_GET_DONE_STATUS(base, channel)) + { + remainingCount = 0; + } + else + { + /* Calculate the unfinished bytes */ + if (0U != (EDMA_TCD_CITER(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) & DMA_CITER_ELINKNO_ELINK_MASK)) + { + remainingCount = (((uint32_t)EDMA_TCD_CITER(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) & + DMA_CITER_ELINKYES_CITER_MASK) >> + DMA_CITER_ELINKYES_CITER_SHIFT); + } + else + { + remainingCount = (((uint32_t)EDMA_TCD_CITER(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) & + DMA_CITER_ELINKNO_CITER_MASK) >> + DMA_CITER_ELINKNO_CITER_SHIFT); + } + } + + return remainingCount; +} + +/*! + * brief Enables the interrupt source for the eDMA transfer. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_EnableChannelInterrupts(EDMA_Type *base, uint32_t channel, uint32_t mask) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + /* Enable error interrupt */ + if (0U != (mask & (uint32_t)kEDMA_ErrorInterruptEnable)) + { + DMA_ENABLE_ERROR_INT(base, channel); + } + + /* Enable Major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) + { + DMA_ENABLE_MAJOR_INT(base, channel); + } + + /* Enable Half major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) + { + DMA_ENABLE_HALF_INT(base, channel); + } +} + +/*! + * brief Disables the interrupt source for the eDMA transfer. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param mask The mask of the interrupt source to be set. Use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_DisableChannelInterrupts(EDMA_Type *base, uint32_t channel, uint32_t mask) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + /* Disable error interrupt */ + if (0U != (mask & (uint32_t)kEDMA_ErrorInterruptEnable)) + { + DMA_DISABLE_ERROR_INT(base, channel); + } + + /* Disable Major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_MajorInterruptEnable)) + { + DMA_DISABLE_MAJOR_INT(base, channel); + } + + /* Disable Half major interrupt */ + if (0U != (mask & (uint32_t)kEDMA_HalfInterruptEnable)) + { + DMA_DISABLE_HALF_INT(base, channel); + } +} + +/*! + * brief Gets the eDMA channel status flags. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * return The mask of channel status flags. Users need to use the + * _edma_channel_status_flags type to decode the return variables. + */ +uint32_t EDMA_GetChannelStatusFlags(EDMA_Type *base, uint32_t channel) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + uint32_t retval = 0; + + /* Get DONE bit flag */ + retval |= DMA_GET_DONE_STATUS(base, channel); + /* Get ERROR bit flag */ + retval |= (DMA_GET_ERROR_STATUS(base, channel) << 1U); + /* Get INT bit flag */ + retval |= (DMA_GET_INT_STATUS(base, channel) << 2U); + + return retval; +} + +/*! + * brief Clears the eDMA channel status flags. + * + * param base eDMA peripheral base address. + * param channel eDMA channel number. + * param mask The mask of channel status to be cleared. Users need to use + * the defined _edma_channel_status_flags type. + */ +void EDMA_ClearChannelStatusFlags(EDMA_Type *base, uint32_t channel, uint32_t mask) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + /* Clear DONE bit flag */ + if (0U != (mask & (uint32_t)kEDMA_DoneFlag)) + { + DMA_CLEAR_DONE_STATUS(base, channel); + } + /* Clear ERROR bit flag */ + if (0U != (mask & (uint32_t)kEDMA_ErrorFlag)) + { + DMA_CLEAR_ERROR_STATUS(base, channel); + } + /* Clear INT bit flag */ + if (0U != (mask & (uint32_t)kEDMA_InterruptFlag)) + { + DMA_CLEAR_INT_STATUS(base, channel); + } +} + +/*! + * brief Creates the eDMA handle. + * + * This function is called if using the transactional API for eDMA. This function + * initializes the internal state of the eDMA handle. + * + * param handle eDMA handle pointer. The eDMA handle stores callback function and + * parameters. + * param base eDMA peripheral base address. + * param channel eDMA channel number. + */ +void EDMA_CreateHandle(edma_handle_t *handle, EDMA_Type *base, uint32_t channel) +{ + assert(handle != NULL); + assert(FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base) != -1); + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + uint32_t edmaInstance; + edma_tcd_t *tcdRegs; + + /* Zero the handle */ + (void)memset(handle, 0, sizeof(*handle)); + + handle->channel = channel; + + /* Get the DMA instance number */ + edmaInstance = EDMA_GetInstance(base); + s_EDMAHandle[edmaInstance][channel] = handle; + /* Enable NVIC interrupt */ + (void)EnableIRQ(s_edmaIRQNumber[edmaInstance][channel]); + + handle->tcdBase = EDMA_TCD_BASE(base, channel); + handle->channelBase = EDMA_CHANNEL_BASE(base, channel); + handle->base = base; + /* + Reset TCD registers to zero. Unlike the EDMA_TcdReset(DREQ will be set), + CSR will be 0. Because in order to suit EDMA busy check mechanism in + EDMA_SubmitTransfer, CSR must be set 0. + */ + tcdRegs = handle->tcdBase; + EDMA_TCD_SADDR(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_SOFF(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_ATTR(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_NBYTES(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_SLAST(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_DADDR(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_DOFF(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_CITER(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_DLAST_SGA(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(base)) = 0; + EDMA_TCD_BITER(tcdRegs, EDMA_TCD_TYPE(base)) = 0; +} + +/*! + * brief Installs the TCDs memory pool into the eDMA handle. + * + * This function is called after the EDMA_CreateHandle to use scatter/gather feature. This function shall only be used + * while users need to use scatter gather mode. Scatter gather mode enables EDMA to load a new transfer control block + * (tcd) in hardware, and automatically reconfigure that DMA channel for a new transfer. + * Users need to prepare tcd memory and also configure tcds using interface EDMA_SubmitTransfer. + * + * param handle eDMA handle pointer. + * param tcdPool A memory pool to store TCDs. It must be 32 bytes aligned. + * param tcdSize The number of TCD slots. + */ +void EDMA_InstallTCDMemory(edma_handle_t *handle, edma_tcd_t *tcdPool, uint32_t tcdSize) +{ + assert(handle != NULL); + assert(((uint32_t)tcdPool & 0x1FU) == 0U); + + /* Initialize tcd queue attribute. */ + /* header should initial as 1, since that it is used to point to the next TCD to be loaded into TCD memory, + * In EDMA driver IRQ handler, header will be used to calculate how many tcd has done, for example, + * If application submit 4 transfer request, A->B->C->D, + * when A finshed, the header is 0, C is the next TCD to be load, since B is already loaded, + * according to EDMA driver IRQ handler, tcdDone = C - A - header = 2 - header = 2, but actually only 1 TCD done, + * so the issue will be the wrong TCD done count will pass to application in first TCD interrupt. + * During first submit, the header should be assigned to 1, since 0 is current one and 1 is next TCD to be loaded, + * but software cannot know which submission is the first one, so assign 1 to header here. + */ + handle->header = 1; + handle->tcdUsed = 0; + handle->tcdSize = (int8_t)tcdSize; + handle->tcdPool = tcdPool; +} + +/*! + * brief Installs a callback function for the eDMA transfer. + * + * This callback is called in the eDMA IRQ handler. Use the callback to do something after + * the current major loop transfer completes. This function will be called every time one tcd finished transfer. + * + * param handle eDMA handle pointer. + * param callback eDMA callback function pointer. + * param userData A parameter for the callback function. + */ +void EDMA_SetCallback(edma_handle_t *handle, edma_callback callback, void *userData) +{ + assert(handle != NULL); + + handle->callback = callback; + handle->userData = userData; +} + +static edma_transfer_size_t EDMA_TransferWidthMapping(uint32_t width) +{ + edma_transfer_size_t transferSize = kEDMA_TransferSize1Bytes; + + /* map width to register value */ + switch (width) + { + /* width 8bit */ + case 1U: + transferSize = kEDMA_TransferSize1Bytes; + break; + /* width 16bit */ + case 2U: + transferSize = kEDMA_TransferSize2Bytes; + break; + /* width 32bit */ + case 4U: + transferSize = kEDMA_TransferSize4Bytes; + break; +#if (defined(FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) + /* width 64bit */ + case 8U: + transferSize = kEDMA_TransferSize8Bytes; + break; +#endif +#if (defined(FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) + /* width 128bit */ + case 16U: + transferSize = kEDMA_TransferSize16Bytes; + break; +#endif + /* width 256bit */ + case 32U: + transferSize = kEDMA_TransferSize32Bytes; + break; +#if (defined(FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) + /* width 512bit */ + case 64U: + transferSize = kEDMA_TransferSize64Bytes; + break; +#endif +#if (defined(FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) + /* width 1024bit */ + case 128U: + transferSize = kEDMA_TransferSize128Bytes; + break; +#endif + default: + /* All the cases have been listed above, the default clause should not be reached. */ + assert(false); + break; + } + + return transferSize; +} + +/*! + * brief Prepares the eDMA transfer structure configurations. + * + * This function prepares the transfer configuration structure according to the user input. + * + * param config The user configuration structure of type edma_transfer_t. + * param srcAddr eDMA transfer source address. + * param srcWidth eDMA transfer source address width(bytes). + * param srcOffset source address offset. + * param destAddr eDMA transfer destination address. + * param destWidth eDMA transfer destination address width(bytes). + * param destOffset destination address offset. + * param bytesEachRequest eDMA transfer bytes per channel request. + * param transferBytes eDMA transfer bytes to be transferred. + * note The data address and the data width must be consistent. For example, if the SRC + * is 4 bytes, the source address must be 4 bytes aligned, or it results in + * source address error (SAE). + * User can check if 128 bytes support is available for specific instance by + * FSL_FEATURE_EDMA_INSTANCE_SUPPORT_128_BYTES_TRANSFERn. + */ +void EDMA_PrepareTransferConfig(edma_transfer_config_t *config, + void *srcAddr, + uint32_t srcWidth, + int16_t srcOffset, + void *destAddr, + uint32_t destWidth, + int16_t destOffset, + uint32_t bytesEachRequest, + uint32_t transferBytes) +{ + assert(config != NULL); + assert(srcAddr != NULL); + assert(destAddr != NULL); +#if (defined(FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) + assert((srcWidth != 0U) && (srcWidth <= 128U) && ((srcWidth & (srcWidth - 1U)) == 0U)); + assert((destWidth != 0U) && (destWidth <= 128U) && ((destWidth & (destWidth - 1U)) == 0U)); +#elif (defined(FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) + assert((srcWidth != 0U) && (srcWidth <= 64U) && ((srcWidth & (srcWidth - 1U)) == 0U)); + assert((destWidth != 0U) && (destWidth <= 64U) && ((destWidth & (destWidth - 1U)) == 0U)); +#else + assert((srcWidth != 0U) && (srcWidth <= 32U) && ((srcWidth & (srcWidth - 1U)) == 0U)); + assert((destWidth != 0U) && (destWidth <= 32U) && ((destWidth & (destWidth - 1U)) == 0U)); +#endif +#if (!defined(FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) || !FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) + assert(srcWidth != 8U); + assert(srcWidth != 8U); +#endif +#if (!defined(FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) || !FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) + assert(srcWidth != 16U); + assert(srcWidth != 16U); +#endif +#if (!defined(FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) || !FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) + assert(srcWidth != 64U); + assert(srcWidth != 64U); +#endif + assert((transferBytes % bytesEachRequest) == 0U); + assert((((uint32_t)(uint8_t *)srcAddr) % srcWidth) == 0U); + assert((((uint32_t)(uint8_t *)destAddr) % destWidth) == 0U); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + config->destAddr = CONVERT_TO_DMA_ADDRESS((uint32_t)(uint32_t *)destAddr); + config->srcAddr = CONVERT_TO_DMA_ADDRESS((uint32_t)(uint32_t *)srcAddr); + config->minorLoopBytes = bytesEachRequest; + config->majorLoopCounts = transferBytes / bytesEachRequest; + config->srcTransferSize = EDMA_TransferWidthMapping(srcWidth); + config->destTransferSize = EDMA_TransferWidthMapping(destWidth); + config->destOffset = destOffset; + config->srcOffset = srcOffset; + /* enable major interrupt by default */ + config->enabledInterruptMask = (uint16_t)kEDMA_MajorInterruptEnable; +} + +/*! + * brief Prepares the eDMA transfer structure. + * + * This function prepares the transfer configuration structure according to the user input. + * + * param config The user configuration structure of type edma_transfer_t. + * param srcAddr eDMA transfer source address. + * param srcWidth eDMA transfer source address width(bytes). + * param destAddr eDMA transfer destination address. + * param destWidth eDMA transfer destination address width(bytes). + * param bytesEachRequest eDMA transfer bytes per channel request. + * param transferBytes eDMA transfer bytes to be transferred. + * param type eDMA transfer type. + * note The data address and the data width must be consistent. For example, if the SRC + * is 4 bytes, the source address must be 4 bytes aligned, or it results in + * source address error (SAE). + */ +void EDMA_PrepareTransfer(edma_transfer_config_t *config, + void *srcAddr, + uint32_t srcWidth, + void *destAddr, + uint32_t destWidth, + uint32_t bytesEachRequest, + uint32_t transferBytes, + edma_transfer_type_t type) +{ + assert(config != NULL); + + int16_t srcOffset = 0, destOffset = 0; + + switch (type) + { + case kEDMA_MemoryToMemory: + destOffset = (int16_t)destWidth; + srcOffset = (int16_t)srcWidth; + break; + case kEDMA_MemoryToPeripheral: + destOffset = 0; + srcOffset = (int16_t)srcWidth; + break; + case kEDMA_PeripheralToMemory: + destOffset = (int16_t)destWidth; + srcOffset = 0; + break; + case kEDMA_PeripheralToPeripheral: + destOffset = 0; + srcOffset = 0; + break; + default: + /* All the cases have been listed above, the default clause should not be reached. */ + assert(false); + break; + } + + EDMA_PrepareTransferConfig(config, srcAddr, srcWidth, srcOffset, destAddr, destWidth, destOffset, bytesEachRequest, + transferBytes); +} + +/*! + * brief Prepares the eDMA transfer content descriptor. + * + * This function prepares the transfer content descriptor structure according to the user input. + * + * param handle eDMA handle pointer. + * param tcd Pointer to eDMA transfer content descriptor structure. + * param srcAddr eDMA transfer source address. + * param srcWidth eDMA transfer source address width(bytes). + * param srcOffset source address offset. + * param destAddr eDMA transfer destination address. + * param destWidth eDMA transfer destination address width(bytes). + * param destOffset destination address offset. + * param bytesEachRequest eDMA transfer bytes per channel request. + * param transferBytes eDMA transfer bytes to be transferred. + * param nextTcd eDMA transfer linked TCD address. + * + * note The data address and the data width must be consistent. For example, if the SRC + * is 4 bytes, the source address must be 4 bytes aligned, or it results in + * source address error (SAE). + */ +void EDMA_PrepareTransferTCD(edma_handle_t *handle, + edma_tcd_t *tcd, + void *srcAddr, + uint32_t srcWidth, + int16_t srcOffset, + void *destAddr, + uint32_t destWidth, + int16_t destOffset, + uint32_t bytesEachRequest, + uint32_t transferBytes, + edma_tcd_t *nextTcd) +{ + assert(tcd != NULL); + assert(srcAddr != NULL); + assert(destAddr != NULL); +#if (defined(FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) + assert((srcWidth != 0U) && (srcWidth <= 128U) && ((srcWidth & (srcWidth - 1U)) == 0U) && + (FSL_FEATURE_EDMA_INSTANCE_SUPPORT_128_BYTES_TRANSFERn(handle->base) == 1)); + assert((destWidth != 0U) && (destWidth <= 128U) && ((destWidth & (destWidth - 1U)) == 0U) && + (FSL_FEATURE_EDMA_INSTANCE_SUPPORT_128_BYTES_TRANSFERn(handle->base) == 1)); +#elif (defined(FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) + assert((srcWidth != 0U) && (srcWidth <= 64U) && ((srcWidth & (srcWidth - 1U)) == 0U)); + assert((destWidth != 0U) && (destWidth <= 64U) && ((destWidth & (destWidth - 1U)) == 0U)); +#else + assert((srcWidth != 0U) && (srcWidth <= 32U) && ((srcWidth & (srcWidth - 1U)) == 0U)); + assert((destWidth != 0U) && (destWidth <= 32U) && ((destWidth & (destWidth - 1U)) == 0U)); +#endif +#if (!defined(FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) || !FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) + assert(srcWidth != 8U); + assert(srcWidth != 8U); +#endif +#if (!defined(FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) || !FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) + assert(srcWidth != 16U); + assert(srcWidth != 16U); +#endif +#if (!defined(FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) || !FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) + assert(srcWidth != 64U); + assert(srcWidth != 64U); +#endif + assert((transferBytes % bytesEachRequest) == 0U); + assert((((uint32_t)(uint32_t *)srcAddr) % srcWidth) == 0U); + assert((((uint32_t)(uint32_t *)destAddr) % destWidth) == 0U); + + edma_transfer_size_t srcTransferSize = EDMA_TransferWidthMapping(srcWidth), + destTransferSize = EDMA_TransferWidthMapping(srcWidth); + + /* Initializes the configure structure to zero. */ + EDMA_TcdResetExt(handle->base, tcd); + assert((bytesEachRequest % (1UL << ((uint32_t)srcTransferSize))) == 0U); + assert((bytesEachRequest % (1UL << ((uint32_t)destTransferSize))) == 0U); + assert(((uint32_t)srcOffset % (1UL << ((uint32_t)srcTransferSize))) == 0U); + assert(((uint32_t)destOffset % (1UL << ((uint32_t)destTransferSize))) == 0U); + assert(((uint32_t)(uint32_t *)srcAddr % (1UL << ((uint32_t)srcTransferSize))) == 0U); + assert(((uint32_t)(uint32_t *)destAddr % (1UL << ((uint32_t)destTransferSize))) == 0U); + + EDMA_TCD_SADDR(tcd, EDMA_TCD_TYPE(handle->base)) = CONVERT_TO_DMA_ADDRESS((uint32_t *)srcAddr); + /* destination address */ + EDMA_TCD_DADDR(tcd, EDMA_TCD_TYPE(handle->base)) = CONVERT_TO_DMA_ADDRESS((uint32_t *)destAddr); + /* Source data and destination data transfer size */ + EDMA_TCD_ATTR(tcd, EDMA_TCD_TYPE(handle->base)) = DMA_ATTR_SSIZE(srcTransferSize) | DMA_ATTR_DSIZE(destTransferSize); + + /* Source address signed offset */ + EDMA_TCD_SOFF(tcd, EDMA_TCD_TYPE(handle->base)) = (uint16_t)(srcOffset); + /* Destination address signed offset */ + EDMA_TCD_DOFF(tcd, EDMA_TCD_TYPE(handle->base)) = (uint16_t)(destOffset); + + EDMA_TCD_NBYTES(tcd, EDMA_TCD_TYPE(handle->base)) = DMA_NBYTES_MLOFFNO_NBYTES(bytesEachRequest); + + /* Current major iteration count */ + EDMA_TCD_CITER(tcd, EDMA_TCD_TYPE(handle->base)) = (uint16_t)(transferBytes / bytesEachRequest); + /* Starting major iteration count */ + EDMA_TCD_BITER(tcd, EDMA_TCD_TYPE(handle->base)) = (uint16_t)(transferBytes / bytesEachRequest); + /* reset CSR firstly */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(handle->base)) = DMA_CSR_DREQ(1U); + /* Enable scatter/gather processing */ + if (nextTcd != NULL) + { + EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(handle->base)) = CONVERT_TO_DMA_ADDRESS(nextTcd); + /* + Before call EDMA_TcdSetTransferConfig or EDMA_SetTransferConfig, + user must call EDMA_TcdReset or EDMA_ResetChannel which will set + DREQ, so must use "|" or "&" rather than "=". + + Clear the DREQ bit because scatter gather has been enabled, so the + previous transfer is not the last transfer, and channel request should + be enabled at the next transfer(the next TCD). + */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(handle->base)) = + (EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(handle->base)) | (uint16_t)DMA_CSR_ESG_MASK) & ~(uint16_t)DMA_CSR_DREQ_MASK; + } + + /* configure interrupt/auto disable channel request, enable major interrupt by default */ + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(handle->base)) |= + (EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(handle->base)) & (~(uint16_t)kEDMA_ErrorInterruptEnable)) | + (uint16_t)kEDMA_MajorInterruptEnable; +} + +/*! + * brief Submits the eDMA transfer content descriptor. + * + * This function submits the eDMA transfer request according to the transfer content descriptor. + * In scatter gather mode, call this function will add a configured tcd to the circular list of tcd pool. + * The tcd pools is setup by call function EDMA_InstallTCDMemory before. + * + * Typical user case: + * 1. submit single transfer + * code + * edma_tcd_t tcd; + * EDMA_PrepareTransferTCD(handle, tcd, ....) + * EDMA_SubmitTransferTCD(handle, tcd) + * EDMA_StartTransfer(handle) + * endcode + * + * 2. submit static link transfer, + * code + * edma_tcd_t tcd[2]; + * EDMA_PrepareTransferTCD(handle, &tcd[0], ....) + * EDMA_PrepareTransferTCD(handle, &tcd[1], ....) + * EDMA_SubmitTransferTCD(handle, &tcd[0]) + * EDMA_StartTransfer(handle) + * endcode + * + * 3. submit dynamic link transfer + * code + * edma_tcd_t tcdpool[2]; + * EDMA_InstallTCDMemory(&g_DMA_Handle, tcdpool, 2); + * edma_tcd_t tcd; + * EDMA_PrepareTransferTCD(handle, tcd, ....) + * EDMA_SubmitTransferTCD(handle, tcd) + * EDMA_PrepareTransferTCD(handle, tcd, ....) + * EDMA_SubmitTransferTCD(handle, tcd) + * EDMA_StartTransfer(handle) + * endcode + * + * 4. submit loop transfer + * code + * edma_tcd_t tcd[2]; + * EDMA_PrepareTransferTCD(handle, &tcd[0], ...,&tcd[1]) + * EDMA_PrepareTransferTCD(handle, &tcd[1], ..., &tcd[0]) + * EDMA_SubmitTransferTCD(handle, &tcd[0]) + * EDMA_StartTransfer(handle) + * endcode + * + * param handle eDMA handle pointer. + * param tcd Pointer to eDMA transfer content descriptor structure. + * + * retval kStatus_EDMA_Success It means submit transfer request succeed. + * retval kStatus_EDMA_QueueFull It means TCD queue is full. Submit transfer request is not allowed. + * retval kStatus_EDMA_Busy It means the given channel is busy, need to submit request later. + */ +status_t EDMA_SubmitTransferTCD(edma_handle_t *handle, edma_tcd_t *tcd) +{ + assert(handle != NULL); + assert(handle->tcdBase != NULL); + + edma_tcd_t *tcdRegs = handle->tcdBase; + + if (handle->tcdPool == NULL) + { + /* + * Check if EDMA channel is busy: + * 1. if channel active bit is set, it implies that minor loop is executing, then channel is busy + * 2. if channel active bit is not set and BITER not equal to CITER, it implies that major loop is executing, + * then channel is busy + * + * There is one case can not be covered in below condition: + * When transfer request is submitted, but no request from peripheral, that is to say channel sevice doesn't + * begin, if application would like to submit another transfer , then the TCD will be overwritten, since the + * ACTIVE is 0 and BITER = CITER, for such case, it is a scatter gather(link TCD) case actually, so + * application should enabled TCD pool for dynamic scatter gather mode by calling EDMA_InstallTCDMemory. + */ +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + if (((tcdRegs->CSR & DMA_CSR_ACTIVE_MASK) != 0U) || +#else + if (((handle->channelBase->CH_CSR & DMA_CH_CSR_ACTIVE_MASK) != 0U) || +#endif + (((EDMA_TCD_CITER(tcdRegs, EDMA_TCD_TYPE(handle->base)) & DMA_CITER_ELINKNO_CITER_MASK) != + (EDMA_TCD_BITER(tcdRegs, EDMA_TCD_TYPE(handle->base)) & DMA_BITER_ELINKNO_BITER_MASK)))) + { + return kStatus_EDMA_Busy; + } + else + { + EDMA_InstallTCD(handle->base, handle->channel, tcd); + /* Enable auto disable request feature */ + EDMA_EnableAutoStopRequest(handle->base, handle->channel, true); + /* Enable major interrupt */ + EDMA_EnableChannelInterrupts(handle->base, handle->channel, kEDMA_MajorInterruptEnable); + + return kStatus_Success; + } + } + else /* Use the TCD queue. */ + { + uint32_t primask; + uint16_t csr; + int8_t currentTcd; + int8_t previousTcd; + int8_t nextTcd; + int8_t tmpTcdUsed; + int8_t tmpTcdSize; + + /* Check if tcd pool is full. */ + primask = DisableGlobalIRQ(); + tmpTcdUsed = handle->tcdUsed; + tmpTcdSize = handle->tcdSize; + if (tmpTcdUsed >= tmpTcdSize) + { + EnableGlobalIRQ(primask); + + return kStatus_EDMA_QueueFull; + } + currentTcd = handle->tail; + handle->tcdUsed++; + /* Calculate index of next TCD */ + nextTcd = currentTcd + 1; + if (nextTcd == handle->tcdSize) + { + nextTcd = 0; + } + /* Advance queue tail index */ + handle->tail = nextTcd; + EnableGlobalIRQ(primask); + /* Calculate index of previous TCD */ + previousTcd = currentTcd != 0 ? currentTcd - 1 : (handle->tcdSize - 1); + + /* Configure current TCD block. */ + EDMA_TcdResetExt(handle->base, &handle->tcdPool[currentTcd]); + (void)memcpy(&handle->tcdPool[currentTcd], tcd, sizeof(edma_tcd_t)); + + /* Enable major interrupt */ + EDMA_TCD_CSR((&handle->tcdPool[currentTcd]), EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_INTMAJOR_MASK; + + if ((EDMA_TCD_DLAST_SGA(tcd, EDMA_TCD_TYPE(handle->base)) == 0U) || + ((EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(handle->base)) & DMA_CSR_ESG_MASK) == 0U)) + { + /* Link current TCD with next TCD for identification of current TCD */ + EDMA_TCD_DLAST_SGA((&handle->tcdPool[currentTcd]), EDMA_TCD_TYPE(handle->base)) = + CONVERT_TO_DMA_ADDRESS((uint32_t)&handle->tcdPool[nextTcd]); + } + + /* Chain from previous descriptor unless tcd pool size is 1(this descriptor is its own predecessor). */ + if (currentTcd != previousTcd) + { +#if defined FSL_FEATURE_EDMA_HAS_ERRATA_51327 + if (EDMA_CheckErrata(handle->base, &handle->tcdPool[previousTcd]) != kStatus_Success) + { + return kStatus_InvalidArgument; + } +#endif + /* Enable scatter/gather feature in the previous TCD block. */ + csr = EDMA_TCD_CSR((&handle->tcdPool[previousTcd]), EDMA_TCD_TYPE(handle->base)) | + ((uint16_t)DMA_CSR_ESG_MASK); + csr &= ~((uint16_t)DMA_CSR_DREQ_MASK); + EDMA_TCD_CSR((&handle->tcdPool[previousTcd]), EDMA_TCD_TYPE(handle->base)) = csr; + /* + Check if the TCD block in the registers is the previous one (points to current TCD block). It + is used to check if the previous TCD linked has been loaded in TCD register. If so, it need to + link the TCD register in case link the current TCD with the dead chain when TCD loading occurs + before link the previous TCD block. + */ + if (EDMA_TCD_DLAST_SGA(tcdRegs, EDMA_TCD_TYPE(handle->base)) == + CONVERT_TO_DMA_ADDRESS((uint32_t)&handle->tcdPool[currentTcd])) + { + /* Clear the DREQ bits for the dynamic scatter gather */ + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_DREQ_MASK; + /* Enable scatter/gather also in the TCD registers. */ + csr = EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) | DMA_CSR_ESG_MASK; + /* Must write the CSR register one-time, because the transfer maybe finished anytime. */ + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) = csr; + /* + It is very important to check the ESG bit! + Because this hardware design: if DONE bit is set, the ESG bit can not be set. So it can + be used to check if the dynamic TCD link operation is successful. If ESG bit is not set + and the DLAST_SGA is not the next TCD address(it means the dynamic TCD link succeed and + the current TCD block has been loaded into TCD registers), it means transfer finished + and TCD link operation fail, so must install TCD content into TCD registers and enable + transfer again. And if ESG is set, it means transfer has not finished, so TCD dynamic + link succeed. + */ + if (0U != (EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) & DMA_CSR_ESG_MASK)) + { + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) &= ~(uint16_t)DMA_CSR_DREQ_MASK; + return kStatus_Success; + } + /* + Check whether the current TCD block is already loaded in the TCD registers. It is another + condition when ESG bit is not set: it means the dynamic TCD link succeed and the current + TCD block has been loaded into TCD registers. + */ + if (EDMA_TCD_DLAST_SGA(tcdRegs, EDMA_TCD_TYPE(handle->base)) == + CONVERT_TO_DMA_ADDRESS((uint32_t)&handle->tcdPool[nextTcd])) + { + return kStatus_Success; + } + /* + If go to this, means the previous transfer finished, and the DONE bit is set. + So shall configure TCD registers. + */ + } + else if (EDMA_TCD_DLAST_SGA(tcdRegs, EDMA_TCD_TYPE(handle->base)) != 0UL) + { + /* The current TCD block has been linked successfully. */ + return kStatus_Success; + } + else + { + /* + DLAST_SGA is 0 and it means the first submit transfer, so shall configure + TCD registers. + */ + } + } + /* There is no live chain, TCD block need to be installed in TCD registers. */ + EDMA_InstallTCD(handle->base, handle->channel, &handle->tcdPool[currentTcd]); + + return kStatus_Success; + } +} + +/*! + * brief Submits the eDMA transfer request. + * + * This function submits the eDMA transfer request according to the transfer configuration structure. + * In scatter gather mode, call this function will add a configured tcd to the circular list of tcd pool. + * The tcd pools is setup by call function EDMA_InstallTCDMemory before. + * + * param handle eDMA handle pointer. + * param config Pointer to eDMA transfer configuration structure. + * retval kStatus_EDMA_Success It means submit transfer request succeed. + * retval kStatus_EDMA_QueueFull It means TCD queue is full. Submit transfer request is not allowed. + * retval kStatus_EDMA_Busy It means the given channel is busy, need to submit request later. + */ +status_t EDMA_SubmitTransfer(edma_handle_t *handle, const edma_transfer_config_t *config) +{ + assert(handle != NULL); + assert(config != NULL); + assert(handle->tcdBase != NULL); +#if (defined(FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) + assert(((config->srcTransferSize != kEDMA_TransferSize128Bytes) && + (config->destTransferSize != kEDMA_TransferSize128Bytes)) || + (FSL_FEATURE_EDMA_INSTANCE_SUPPORT_128_BYTES_TRANSFERn(handle->base) == 1)); +#endif + edma_tcd_t *tcdRegs = handle->tcdBase; + + if (handle->tcdPool == NULL) + { + /* + * Check if EDMA channel is busy: + * 1. if channel active bit is set, it implies that minor loop is executing, then channel is busy + * 2. if channel active bit is not set and BITER not equal to CITER, it implies that major loop is executing, + * then channel is busy + * + * There is one case can not be covered in below condition: + * When transfer request is submitted, but no request from peripheral, that is to say channel sevice doesn't + * begin, if application would like to submit another transfer , then the TCD will be overwritten, since the + * ACTIVE is 0 and BITER = CITER, for such case, it is a scatter gather(link TCD) case actually, so + * application should enabled TCD pool for dynamic scatter gather mode by calling EDMA_InstallTCDMemory. + */ +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + if (((tcdRegs->CSR & DMA_CSR_ACTIVE_MASK) != 0U) || +#else + if (((handle->channelBase->CH_CSR & DMA_CH_CSR_ACTIVE_MASK) != 0U) || +#endif + (((EDMA_TCD_CITER(tcdRegs, EDMA_TCD_TYPE(handle->base)) & DMA_CITER_ELINKNO_CITER_MASK) != + (EDMA_TCD_BITER(tcdRegs, EDMA_TCD_TYPE(handle->base)) & DMA_BITER_ELINKNO_BITER_MASK)))) + { + return kStatus_EDMA_Busy; + } + else + { + EDMA_TcdSetTransferConfigExt(handle->base, tcdRegs, config, NULL); + /* Enable auto disable request feature */ + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_DREQ_MASK; + /* Enable major interrupt */ + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_INTMAJOR_MASK; + + return kStatus_Success; + } + } + else /* Use the TCD queue. */ + { + uint32_t primask; + uint16_t csr; + int8_t currentTcd; + int8_t previousTcd; + int8_t nextTcd; + int8_t tmpTcdUsed; + int8_t tmpTcdSize; + + /* Check if tcd pool is full. */ + primask = DisableGlobalIRQ(); + tmpTcdUsed = handle->tcdUsed; + tmpTcdSize = handle->tcdSize; + if (tmpTcdUsed >= tmpTcdSize) + { + EnableGlobalIRQ(primask); + + return kStatus_EDMA_QueueFull; + } + currentTcd = handle->tail; + handle->tcdUsed++; + /* Calculate index of next TCD */ + nextTcd = currentTcd + 1; + if (nextTcd == handle->tcdSize) + { + nextTcd = 0; + } + /* Advance queue tail index */ + handle->tail = nextTcd; + EnableGlobalIRQ(primask); + /* Calculate index of previous TCD */ + previousTcd = currentTcd != 0 ? currentTcd - 1 : (handle->tcdSize - 1); + /* Configure current TCD block. */ + EDMA_TcdResetExt(handle->base, &handle->tcdPool[currentTcd]); + EDMA_TcdSetTransferConfigExt(handle->base, &handle->tcdPool[currentTcd], config, NULL); + /* Enable major interrupt */ + EDMA_TCD_CSR((&handle->tcdPool[currentTcd]), EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_INTMAJOR_MASK; + /* Link current TCD with next TCD for identification of current TCD */ + EDMA_TCD_DLAST_SGA((&handle->tcdPool[currentTcd]), EDMA_TCD_TYPE(handle->base)) = + CONVERT_TO_DMA_ADDRESS((uint32_t)&handle->tcdPool[nextTcd]); + /* Chain from previous descriptor unless tcd pool size is 1(this descriptor is its own predecessor). */ + if (currentTcd != previousTcd) + { +#if defined FSL_FEATURE_EDMA_HAS_ERRATA_51327 + if (EDMA_CheckErrata(handle->base, &handle->tcdPool[previousTcd]) != kStatus_Success) + { + return kStatus_InvalidArgument; + } +#endif + /* Enable scatter/gather feature in the previous TCD block. */ + csr = EDMA_TCD_CSR((&handle->tcdPool[previousTcd]), EDMA_TCD_TYPE(handle->base)) | + ((uint16_t)DMA_CSR_ESG_MASK); + csr &= ~((uint16_t)DMA_CSR_DREQ_MASK); + EDMA_TCD_CSR((&handle->tcdPool[previousTcd]), EDMA_TCD_TYPE(handle->base)) = csr; + /* + Check if the TCD block in the registers is the previous one (points to current TCD block). It + is used to check if the previous TCD linked has been loaded in TCD register. If so, it need to + link the TCD register in case link the current TCD with the dead chain when TCD loading occurs + before link the previous TCD block. + */ + if (EDMA_TCD_DLAST_SGA(handle->tcdBase, EDMA_TCD_TYPE(handle->base)) == + CONVERT_TO_DMA_ADDRESS((uint32_t)&handle->tcdPool[currentTcd])) + { + /* Clear the DREQ bits for the dynamic scatter gather */ + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_DREQ_MASK; + /* Enable scatter/gather also in the TCD registers. */ + csr = EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) | DMA_CSR_ESG_MASK; + /* Must write the CSR register one-time, because the transfer maybe finished anytime. */ + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) = csr; + /* + It is very important to check the ESG bit! + Because this hardware design: if DONE bit is set, the ESG bit can not be set. So it can + be used to check if the dynamic TCD link operation is successful. If ESG bit is not set + and the DLAST_SGA is not the next TCD address(it means the dynamic TCD link succeed and + the current TCD block has been loaded into TCD registers), it means transfer finished + and TCD link operation fail, so must install TCD content into TCD registers and enable + transfer again. And if ESG is set, it means transfer has not finished, so TCD dynamic + link succeed. + */ + if (0U != (EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) & DMA_CSR_ESG_MASK)) + { + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) &= ~(uint16_t)DMA_CSR_DREQ_MASK; + return kStatus_Success; + } + /* + Check whether the current TCD block is already loaded in the TCD registers. It is another + condition when ESG bit is not set: it means the dynamic TCD link succeed and the current + TCD block has been loaded into TCD registers. + */ + if (EDMA_TCD_DLAST_SGA(handle->tcdBase, EDMA_TCD_TYPE(handle->base)) == + CONVERT_TO_DMA_ADDRESS((uint32_t)&handle->tcdPool[nextTcd])) + { + return kStatus_Success; + } + /* + If go to this, means the previous transfer finished, and the DONE bit is set. + So shall configure TCD registers. + */ + } + else if (EDMA_TCD_DLAST_SGA(handle->tcdBase, EDMA_TCD_TYPE(handle->base)) != 0UL) + { + /* The current TCD block has been linked successfully. */ + return kStatus_Success; + } + else + { + /* + DLAST_SGA is 0 and it means the first submit transfer, so shall configure + TCD registers. + */ + } + } + /* There is no live chain, TCD block need to be installed in TCD registers. */ + EDMA_InstallTCD(handle->base, handle->channel, &handle->tcdPool[currentTcd]); + + return kStatus_Success; + } +} + +/*! + * brief Submits the eDMA scatter gather transfer configurations. + * + * The function is target for submit loop transfer request, + * the ring transfer request means that the transfer request TAIL is link to HEAD, such as, + * A->B->C->D->A, or A->A + * + * To use the ring transfer feature, the application should allocate several transfer object, such as + * @code + * edma_channel_transfer_config_t transfer[2]; + * EDMA_TransferSubmitLoopTransfer(handle, &transfer, 2U); + * @endcode + * Then eDMA driver will link transfer[0] and transfer[1] to each other + * + * note Application should check the return value of this function to avoid transfer request + * submit failed + * + * param handle eDMA handle pointer + * param transfer pointer to user's eDMA channel configure structure, see edma_channel_transfer_config_t for detail + * param transferLoopCount the count of the transfer ring, if loop count is 1, that means that the one will link to + * itself. + * + * retval #kStatus_Success It means submit transfer request succeed + * retval #kStatus_EDMA_Busy channel is in busy status + * retval #kStatus_InvalidArgument Invalid Argument + */ +status_t EDMA_SubmitLoopTransfer(edma_handle_t *handle, edma_transfer_config_t *transfer, uint32_t transferLoopCount) +{ + assert(transfer != NULL); + assert(handle != NULL); + assert(handle->tcdPool != NULL); + + uint32_t i = 0U; + + if (handle->tcdSize < (int8_t)transferLoopCount) + { + return kStatus_InvalidArgument; + } + + /* + * Check if EDMA channel is busy: + * 1. if channel active bit is set, it implies that minor loop is executing, then channel is busy + * 2. if channel active bit is not set and BITER not equal to CITER, it implies that major loop is executing, + * then channel is busy + * + * There is one case can not be covered in below condition: + * When transfer request is submitted, but no request from peripheral, that is to say channel service doesn't + * begin, if application would like to submit another transfer , then the TCD will be overwritten, since the + * ACTIVE is 0 and BITER = CITER, for such case, it is a scatter gather(link TCD) case actually, so + * application should enabled TCD pool for dynamic scatter gather mode by calling EDMA_InstallTCDMemory. + */ +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + if (((handle->tcdBase->CSR & DMA_CSR_ACTIVE_MASK) != 0U) || +#else + if (((handle->channelBase->CH_CSR & DMA_CH_CSR_ACTIVE_MASK) != 0U) || +#endif + (((EDMA_TCD_CITER(handle->tcdBase, EDMA_TCD_TYPE(handle->base)) & DMA_CITER_ELINKNO_CITER_MASK) != + (EDMA_TCD_BITER(handle->tcdBase, EDMA_TCD_TYPE(handle->base)) & DMA_BITER_ELINKNO_BITER_MASK)))) + { + return kStatus_EDMA_Busy; + } + + (void)memset(handle->tcdPool, 0, (uint32_t)handle->tcdSize * sizeof(edma_tcd_t)); + for (i = 0U; i < transferLoopCount - 1UL; i++) + { + transfer[i].linkTCD = &handle->tcdPool[i + 1UL]; + EDMA_ConfigChannelSoftwareTCDExt(handle->base, &(handle->tcdPool[i]), &transfer[i]); +#if defined FSL_FEATURE_EDMA_HAS_ERRATA_51327 + if (EDMA_CheckErrata(handle->base, &(handle->tcdPool[i])) != kStatus_Success) + { + return kStatus_InvalidArgument; + } +#endif + } + + /* prepare last one in the ring and link it to the HEAD of the ring */ + transfer[i].linkTCD = &handle->tcdPool[0]; + EDMA_ConfigChannelSoftwareTCDExt(handle->base, &(handle->tcdPool[i]), &transfer[i]); + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + if (((transfer->enableSrcMinorLoopOffset) || (transfer->enableDstMinorLoopOffset))) + { + EDMA_EnableMinorLoopMapping(handle->psBase, true); + } +#endif + /* There is no live chain, TCD block need to be installed in TCD registers. */ + EDMA_InstallTCD(handle->base, handle->channel, &handle->tcdPool[0U]); + + /* enable interrupt */ + EDMA_EnableChannelInterrupts(handle->base, handle->channel, + ((uint32_t)transfer->enabledInterruptMask & ~((uint32_t)kEDMA_ErrorInterruptEnable))); + + return kStatus_Success; +} + +/*! + * brief eDMA starts transfer. + * + * This function enables the channel request. Users can call this function after submitting the transfer request + * or before submitting the transfer request. + * + * param handle eDMA handle pointer. + */ +void EDMA_StartTransfer(edma_handle_t *handle) +{ + assert(handle != NULL); + + edma_tcd_t *tcdRegs = handle->tcdBase; + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + if (handle->tcdPool == NULL) + { + handle->base->SERQ = DMA_SERQ_SERQ(handle->channel); + } + else /* Use the TCD queue. */ + { + uint32_t primask; + + /* Check if there was at least one descriptor submitted since reset (TCD in registers is valid) */ + if (tcdRegs->DLAST_SGA != 0U) + { + primask = DisableGlobalIRQ(); + /* Check if channel request is actually disable. */ + if ((handle->base->ERQ & ((uint32_t)1U << handle->channel)) == 0U) + { + /* Check if transfer is paused. */ + tmpCSR = tcdRegs->CSR; + if ((0U == (tmpCSR & DMA_CSR_DONE_MASK)) || (0U != (tmpCSR & DMA_CSR_ESG_MASK))) + { + /* + Re-enable channel request must be as soon as possible, so must put it into + critical section to avoid task switching or interrupt service routine. + */ + handle->base->SERQ = DMA_SERQ_SERQ(handle->channel); + } + } + EnableGlobalIRQ(primask); + } + } +#else +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX +#if defined FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX + if (((uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_MUXn(handle->base) == 1U) && + (EDMA_MP_BASE(handle->base)->MP_REGS.EDMA5_REG.CH_MUX[handle->channel] == 0U) && + (FSL_FEATURE_EDMA_INSTANCE_HAS_MP_CHANNEL_MUXn(handle->base) == 1U)) + { + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_START_MASK; + } + else if (((uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_MUXn(handle->base) == 1U) && + handle->channelBase->CH_REGS.EDMA4_REG.CH_MUX == 0U && + !(FSL_FEATURE_EDMA_INSTANCE_HAS_MP_CHANNEL_MUXn(handle->base) == 1U)) + { + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_START_MASK; + } + else +#else + if (((uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_MUXn(handle->base) == 1U) && + handle->channelBase->CH_REGS.EDMA4_REG.CH_MUX == 0U) + { + EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) |= DMA_CSR_START_MASK; + } + else +#endif +#endif + if (handle->tcdPool == NULL) + { + handle->channelBase->CH_CSR |= DMA_CH_CSR_ERQ_MASK; + } + else + { + /* Check if channel request is actually disable. */ + if ((handle->channelBase->CH_CSR & DMA_CH_CSR_ERQ_MASK) == 0U) + { + /* Check if transfer is paused. */ + if ((!((handle->channelBase->CH_CSR & DMA_CH_CSR_DONE_MASK) != 0U)) || + ((EDMA_TCD_CSR(tcdRegs, EDMA_TCD_TYPE(handle->base)) & DMA_CSR_ESG_MASK) != 0U)) + { + /* + Re-enable channel request must be as soon as possible, so must put it into + critical section to avoid task switching or interrupt service routine. + */ + handle->channelBase->CH_CSR |= DMA_CH_CSR_ERQ_MASK; + } + } + } +#endif +} + +/*! + * brief eDMA stops transfer. + * + * This function disables the channel request to pause the transfer. Users can call EDMA_StartTransfer() + * again to resume the transfer. + * + * param handle eDMA handle pointer. + */ +void EDMA_StopTransfer(edma_handle_t *handle) +{ + assert(handle != NULL); +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + handle->base->CERQ = DMA_CERQ_CERQ(handle->channel); +#else + handle->channelBase->CH_CSR = handle->channelBase->CH_CSR & (~(DMA_CH_CSR_DONE_MASK | DMA_CH_CSR_ERQ_MASK)); +#endif +} + +/*! + * brief eDMA aborts transfer. + * + * This function disables the channel request and clear transfer status bits. + * Users can submit another transfer after calling this API. + * + * param handle DMA handle pointer. + */ +void EDMA_AbortTransfer(edma_handle_t *handle) +{ + EDMA_StopTransfer(handle); + /* + Clear CSR to release channel. Because if the given channel started transfer, + CSR will be not zero. Because if it is the last transfer, DREQ will be set. + If not, ESG will be set. + */ + EDMA_TcdResetExt(handle->base, handle->tcdBase); + + /* Handle the tcd */ + if (handle->tcdPool != NULL) + { + handle->header = 1; + handle->tail = 0; + handle->tcdUsed = 0; + } +} + +/*! + * brief eDMA IRQ handler for the current major loop transfer completion. + * + * This function clears the channel major interrupt flag and calls + * the callback function if it is not NULL. + * + * Note: + * For the case using TCD queue, when the major iteration count is exhausted, additional operations are performed. + * These include the final address adjustments and reloading of the BITER field into the CITER. + * Assertion of an optional interrupt request also occurs at this time, as does a possible fetch of a new TCD from + * memory using the scatter/gather address pointer included in the descriptor (if scatter/gather is enabled). + * + * For instance, when the time interrupt of TCD[0] happens, the TCD[1] has already been loaded into the eDMA engine. + * As sga and sga_index are calculated based on the DLAST_SGA bitfield lies in the TCD_CSR register, the sga_index + * in this case should be 2 (DLAST_SGA of TCD[1] stores the address of TCD[2]). Thus, the "tcdUsed" updated should be + * (tcdUsed - 2U) which indicates the number of TCDs can be loaded in the memory pool (because TCD[0] and TCD[1] have + * been loaded into the eDMA engine at this point already.). + * + * For the last two continuous ISRs in a scatter/gather process, they both load the last TCD (The last ISR does not + * load a new TCD) from the memory pool to the eDMA engine when major loop completes. + * Therefore, ensure that the header and tcdUsed updated are identical for them. + * tcdUsed are both 0 in this case as no TCD to be loaded. + * + * See the "eDMA basic data flow" in the eDMA Functional description section of the Reference Manual for + * further details. + * + * param handle eDMA handle pointer. + */ +void EDMA_HandleIRQ(edma_handle_t *handle) +{ + assert(handle != NULL); + + bool transfer_done; + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + /* Check if transfer is already finished. */ + transfer_done = ((handle->tcdBase->CSR & DMA_CSR_DONE_MASK) != 0U); +#else + transfer_done = (bool)(handle->channelBase->CH_CSR & DMA_CH_CSR_DONE_MASK); +#endif + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + if ((handle->base->INT >> channel) != 0U) + { + handle->base->CINT = channel; + } +#else + if ((handle->channelBase->CH_INT & DMA_CH_INT_INT_MASK) != 0U) + { + handle->channelBase->CH_INT |= DMA_CH_INT_INT_MASK; + } +#endif + + if (handle->tcdPool == NULL) + { + if (handle->callback != NULL) + { + (handle->callback)(handle, handle->userData, transfer_done, 0); + } + } + else /* Use the TCD queue. Please refer to the API descriptions in the eDMA header file for detailed information. */ + { + uint32_t sga = (uint32_t)EDMA_TCD_DLAST_SGA(handle->tcdBase, EDMA_TCD_TYPE(handle->base)); + uint32_t sga_index; + int32_t tcds_done; + uint8_t new_header; + bool esg = ((EDMA_TCD_CSR(handle->tcdBase, EDMA_TCD_TYPE(handle->base)) & DMA_CSR_ESG_MASK) != 0U); + + /* Get the offset of the next transfer TCD blocks to be loaded into the eDMA engine. */ + sga -= CONVERT_TO_DMA_ADDRESS((uint32_t)handle->tcdPool); + /* Get the index of the next transfer TCD blocks to be loaded into the eDMA engine. */ + sga_index = sga / sizeof(edma_tcd_t); + /* Adjust header positions. */ + if (transfer_done) + { + /* New header shall point to the next TCD to be loaded (current one is already finished) */ + new_header = (uint8_t)sga_index; + } + else + { + /* New header shall point to this descriptor currently loaded (not finished yet) */ + new_header = sga_index != 0U ? (uint8_t)sga_index - 1U : (uint8_t)handle->tcdSize - 1U; + } + /* Calculate the number of finished TCDs */ + if (new_header == (uint8_t)handle->header) + { + int8_t tmpTcdUsed = handle->tcdUsed; + int8_t tmpTcdSize = handle->tcdSize; + + /* check esg here for the case that application submit only one request, once the request complete: + * new_header(1) = handle->header(1) + * tcdUsed(1) != tcdSize(>1) + * As the application submit only once, so scatter gather must not enabled, then tcds_done should be 1 + */ + if ((tmpTcdUsed == tmpTcdSize) || (!esg)) + { + tcds_done = handle->tcdUsed; + } + else + { + /* No TCD in the memory are going to be loaded or internal error occurs. */ + tcds_done = 0; + } + } + else + { + tcds_done = (int32_t)new_header - (int32_t)handle->header; + if (tcds_done < 0) + { + tcds_done += handle->tcdSize; + } + /* + * While code run to here, it means a TCD transfer Done and a new TCD has loaded to the hardware + * so clear DONE here to allow submit scatter gather transfer request in the callback to avoid TCD + * overwritten. + */ + if (transfer_done) + { +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + handle->base->CDNE = handle->channel; +#else + handle->channelBase->CH_CSR |= DMA_CH_CSR_DONE_MASK; +#endif + } + } + /* Advance header which points to the TCD to be loaded into the eDMA engine from memory. */ + handle->header = (int8_t)new_header; + /* Release TCD blocks. tcdUsed is the TCD number which can be used/loaded in the memory pool. */ + handle->tcdUsed -= (int8_t)tcds_done; + /* Invoke callback function. */ + if (NULL != handle->callback) + { + (handle->callback)(handle, handle->userData, transfer_done, tcds_done); + } + + /* + * 1.clear the DONE bit here is meaningful for below cases: + * A new TCD has been loaded to EDMA already: + * need to clear the DONE bit in the IRQ handler to avoid TCD in EDMA been overwritten + * if peripheral request isn't coming before next transfer request. + * 2. Don't clear DONE bit for below case, + * for the case that transfer request submitted in the privious edma callback, this is a case that doesn't + * need scatter gather, so keep DONE bit during the next transfer request submission will re-install the TCD and + * the DONE bit will be cleared together with TCD re-installation. + */ + if (transfer_done) + { + if ((EDMA_TCD_CSR(handle->tcdBase, EDMA_TCD_TYPE(handle->base)) & DMA_CSR_ESG_MASK) != 0U) + { +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + handle->base->CDNE = handle->channel; +#else + handle->channelBase->CH_CSR |= DMA_CH_CSR_DONE_MASK; +#endif + } + } + } +} + +void EDMA_DriverIRQHandler(uint32_t instance, uint32_t channel); +void EDMA_DriverIRQHandler(uint32_t instance, uint32_t channel) +{ +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + if ((s_edmaBases[instance]->INT >> channel) != 0U) + { + EDMA_HandleIRQ(s_EDMAHandle[instance][channel]); + } +#else + if ((EDMA_CHANNEL_BASE(s_edmaBases[instance], channel)->CH_INT & DMA_CH_INT_INT_MASK) != 0U) + { + EDMA_HandleIRQ(s_EDMAHandle[instance][channel]); + } +#endif + SDK_ISR_EXIT_BARRIER; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma.h new file mode 100644 index 00000000000..aafd8603ee1 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma.h @@ -0,0 +1,1893 @@ +/* + * Copyright 2022-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_EDMA_H_ +#define FSL_EDMA_H_ + +#include "fsl_common.h" +#include "fsl_edma_core.h" +/*! + * @addtogroup edma + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief eDMA driver version */ +#define FSL_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 10, 0)) /*!< Version 2.10.0. */ +/*! @} */ + +/*! @brief eDMA driver name */ +#ifndef FSL_EDMA_DRIVER_EDMA4 +#define FSL_EDMA_DRIVER_EDMA4 (1) +#endif + +/*!@brief Macro used for allocate edma TCD */ +#define EDMA_ALLOCATE_TCD(name, number) AT_NONCACHEABLE_SECTION_ALIGN(edma_tcd_t name[number], EDMA_TCD_ALIGN_SIZE) + +/*! @brief _edma_transfer_status eDMA transfer status */ +enum +{ + kStatus_EDMA_QueueFull = MAKE_STATUS(kStatusGroup_EDMA, 0), /*!< TCD queue is full. */ + kStatus_EDMA_Busy = MAKE_STATUS(kStatusGroup_EDMA, 1), /*!< Channel is busy and can't handle the + transfer request. */ +}; + +/*! @brief Compute the offset unit from DCHPRI3 */ +#define DMA_DCHPRI_INDEX(channel) (((channel) & ~0x03U) | (3U - ((channel)&0x03U))) + +/*! @brief eDMA transfer configuration */ +typedef enum _edma_transfer_size +{ + kEDMA_TransferSize1Bytes = 0x0U, /*!< Source/Destination data transfer size is 1 byte every time */ + kEDMA_TransferSize2Bytes = 0x1U, /*!< Source/Destination data transfer size is 2 bytes every time */ + kEDMA_TransferSize4Bytes = 0x2U, /*!< Source/Destination data transfer size is 4 bytes every time */ +#if (defined(FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_8_BYTES_TRANSFER) + kEDMA_TransferSize8Bytes = 0x3U, /*!< Source/Destination data transfer size is 8 bytes every time */ +#endif +#if (defined(FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) + kEDMA_TransferSize16Bytes = 0x4U, /*!< Source/Destination data transfer size is 16 bytes every time */ +#endif + kEDMA_TransferSize32Bytes = 0x5U, /*!< Source/Destination data transfer size is 32 bytes every time */ +#if (defined(FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_64_BYTES_TRANSFER) + kEDMA_TransferSize64Bytes = 0x6U, /*!< Source/Destination data transfer size is 64 bytes every time */ +#endif +#if (defined(FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_128_BYTES_TRANSFER) + kEDMA_TransferSize128Bytes = 0x7U, /*!< Source/Destination data transfer size is 128 bytes every time */ +#endif +} edma_transfer_size_t; + +/*! @brief eDMA modulo configuration */ +typedef enum _edma_modulo +{ + kEDMA_ModuloDisable = 0x0U, /*!< Disable modulo */ + kEDMA_Modulo2bytes, /*!< Circular buffer size is 2 bytes. */ + kEDMA_Modulo4bytes, /*!< Circular buffer size is 4 bytes. */ + kEDMA_Modulo8bytes, /*!< Circular buffer size is 8 bytes. */ + kEDMA_Modulo16bytes, /*!< Circular buffer size is 16 bytes. */ + kEDMA_Modulo32bytes, /*!< Circular buffer size is 32 bytes. */ + kEDMA_Modulo64bytes, /*!< Circular buffer size is 64 bytes. */ + kEDMA_Modulo128bytes, /*!< Circular buffer size is 128 bytes. */ + kEDMA_Modulo256bytes, /*!< Circular buffer size is 256 bytes. */ + kEDMA_Modulo512bytes, /*!< Circular buffer size is 512 bytes. */ + kEDMA_Modulo1Kbytes, /*!< Circular buffer size is 1 K bytes. */ + kEDMA_Modulo2Kbytes, /*!< Circular buffer size is 2 K bytes. */ + kEDMA_Modulo4Kbytes, /*!< Circular buffer size is 4 K bytes. */ + kEDMA_Modulo8Kbytes, /*!< Circular buffer size is 8 K bytes. */ + kEDMA_Modulo16Kbytes, /*!< Circular buffer size is 16 K bytes. */ + kEDMA_Modulo32Kbytes, /*!< Circular buffer size is 32 K bytes. */ + kEDMA_Modulo64Kbytes, /*!< Circular buffer size is 64 K bytes. */ + kEDMA_Modulo128Kbytes, /*!< Circular buffer size is 128 K bytes. */ + kEDMA_Modulo256Kbytes, /*!< Circular buffer size is 256 K bytes. */ + kEDMA_Modulo512Kbytes, /*!< Circular buffer size is 512 K bytes. */ + kEDMA_Modulo1Mbytes, /*!< Circular buffer size is 1 M bytes. */ + kEDMA_Modulo2Mbytes, /*!< Circular buffer size is 2 M bytes. */ + kEDMA_Modulo4Mbytes, /*!< Circular buffer size is 4 M bytes. */ + kEDMA_Modulo8Mbytes, /*!< Circular buffer size is 8 M bytes. */ + kEDMA_Modulo16Mbytes, /*!< Circular buffer size is 16 M bytes. */ + kEDMA_Modulo32Mbytes, /*!< Circular buffer size is 32 M bytes. */ + kEDMA_Modulo64Mbytes, /*!< Circular buffer size is 64 M bytes. */ + kEDMA_Modulo128Mbytes, /*!< Circular buffer size is 128 M bytes. */ + kEDMA_Modulo256Mbytes, /*!< Circular buffer size is 256 M bytes. */ + kEDMA_Modulo512Mbytes, /*!< Circular buffer size is 512 M bytes. */ + kEDMA_Modulo1Gbytes, /*!< Circular buffer size is 1 G bytes. */ + kEDMA_Modulo2Gbytes, /*!< Circular buffer size is 2 G bytes. */ +} edma_modulo_t; + +#if defined FSL_FEATURE_EDMA_HAS_BANDWIDTH && FSL_FEATURE_EDMA_HAS_BANDWIDTH +/*! @brief Bandwidth control */ +typedef enum _edma_bandwidth +{ + kEDMA_BandwidthStallNone = 0x0U, /*!< No eDMA engine stalls. */ + kEDMA_BandwidthStall4Cycle = 0x2U, /*!< eDMA engine stalls for 4 cycles after each read/write. */ + kEDMA_BandwidthStall8Cycle = 0x3U, /*!< eDMA engine stalls for 8 cycles after each read/write. */ +} edma_bandwidth_t; +#endif + +/*! @brief Channel link type */ +typedef enum _edma_channel_link_type +{ + kEDMA_LinkNone = 0x0U, /*!< No channel link */ + kEDMA_MinorLink, /*!< Channel link after each minor loop */ + kEDMA_MajorLink, /*!< Channel link while major loop count exhausted */ +} edma_channel_link_type_t; + +/*!@brief _edma_channel_status_flags eDMA channel status flags. */ +enum +{ + kEDMA_DoneFlag = 0x1U, /*!< DONE flag, set while transfer finished, CITER value exhausted*/ + kEDMA_ErrorFlag = 0x2U, /*!< eDMA error flag, an error occurred in a transfer */ + kEDMA_InterruptFlag = 0x4U, /*!< eDMA interrupt flag, set while an interrupt occurred of this channel */ +}; + +/*! @brief _edma_error_status_flags eDMA channel error status flags. */ +enum +{ + kEDMA_DestinationBusErrorFlag = DMA_ERR_DBE_FLAG, /*!< Bus error on destination address */ + kEDMA_SourceBusErrorFlag = DMA_ERR_SBE_FLAG, /*!< Bus error on the source address */ + kEDMA_ScatterGatherErrorFlag = DMA_ERR_SGE_FLAG, /*!< Error on the Scatter/Gather address, not 32byte aligned. */ + kEDMA_NbytesErrorFlag = DMA_ERR_NCE_FLAG, /*!< NBYTES/CITER configuration error */ + kEDMA_DestinationOffsetErrorFlag = DMA_ERR_DOE_FLAG, /*!< Destination offset not aligned with destination size */ + kEDMA_DestinationAddressErrorFlag = DMA_ERR_DAE_FLAG, /*!< Destination address not aligned with destination size */ + kEDMA_SourceOffsetErrorFlag = DMA_ERR_SOE_FLAG, /*!< Source offset not aligned with source size */ + kEDMA_SourceAddressErrorFlag = DMA_ERR_SAE_FLAG, /*!< Source address not aligned with source size*/ + kEDMA_ErrorChannelFlag = DMA_ERR_ERRCHAN_FLAG, /*!< Error channel number of the cancelled channel number */ +#if defined(FSL_FEATURE_EDMA_HAS_PRIORITY_ERROR) && (FSL_FEATURE_EDMA_HAS_PRIORITY_ERROR > 1) + kEDMA_ChannelPriorityErrorFlag = DMA_ERR_CPE_FLAG, /*!< Channel priority is not unique. */ +#endif + kEDMA_TransferCanceledFlag = DMA_ERR_ECX_FLAG, /*!< Transfer cancelled */ +#if defined(FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT) && (FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT > 1) + kEDMA_GroupPriorityErrorFlag = DMA_ERR_GPE_FLAG, /*!< Group priority is not unique. */ +#endif + kEDMA_ValidFlag = (int)DMA_ERR_FLAG, /*!< No error occurred, this bit is 0. Otherwise, it is 1. */ +}; + +/*! @brief _edma_interrupt_enable eDMA interrupt source */ +enum +{ + kEDMA_ErrorInterruptEnable = 0x1U, /*!< Enable interrupt while channel error occurs. */ + kEDMA_MajorInterruptEnable = DMA_CSR_INTMAJOR_MASK, /*!< Enable interrupt while major count exhausted. */ + kEDMA_HalfInterruptEnable = DMA_CSR_INTHALF_MASK, /*!< Enable interrupt while major count to half value. */ +}; + +/*! @brief eDMA transfer type */ +typedef enum _edma_transfer_type +{ + kEDMA_MemoryToMemory = 0x0U, /*!< Transfer from memory to memory */ + kEDMA_PeripheralToMemory, /*!< Transfer from peripheral to memory */ + kEDMA_MemoryToPeripheral, /*!< Transfer from memory to peripheral */ + kEDMA_PeripheralToPeripheral, /*!< Transfer from Peripheral to peripheral */ +} edma_transfer_type_t; + +/*! @brief eDMA channel priority configuration */ +typedef struct _edma_channel_Preemption_config +{ + bool enableChannelPreemption; /*!< If true: a channel can be suspended by other channel with higher priority */ + bool enablePreemptAbility; /*!< If true: a channel can suspend other channel with low priority */ + uint8_t channelPriority; /*!< Channel priority */ +} edma_channel_Preemption_config_t; + +/*! @brief eDMA minor offset configuration */ +typedef struct _edma_minor_offset_config +{ + bool enableSrcMinorOffset; /*!< Enable(true) or Disable(false) source minor loop offset. */ + bool enableDestMinorOffset; /*!< Enable(true) or Disable(false) destination minor loop offset. */ + uint32_t minorOffset; /*!< Offset for a minor loop mapping. */ +} edma_minor_offset_config_t; + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG && FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE && FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE +/*! @brief eDMA channel memory attribute */ +typedef enum edma_channel_memory_attribute +{ + kEDMA_ChannelNoWriteNoReadNoCacheNoBuffer = + 0x0U, /*!< No write allocate, no read allocate, non-cacheable, non-bufferable. */ + kEDMA_ChannelNoWriteNoReadNoCacheBufferable, /*!< No write allocate, no read allocate, non-cacheable, bufferable. + */ + kEDMA_ChannelNoWriteNoReadCacheableNoBuffer, /*!< No write allocate, no read allocate, cacheable, non-bufferable. + */ + kEDMA_ChannelNoWriteNoReadCacheableBufferable, /*!< No write allocate, no read allocate, cacheable, bufferable. */ + kEDMA_ChannelNoWriteReadNoCacheNoBuffer, /*!< No write allocate, read allocate, non-cacheable, non-bufferable. */ + kEDMA_ChannelNoWriteReadNoCacheBufferable, /*!< No write allocate, read allocate, non-cacheable, bufferable. */ + kEDMA_ChannelNoWriteReadCacheableNoBuffer, /*!< No write allocate, read allocate, cacheable, non-bufferable. */ + kEDMA_ChannelNoWriteReadCacheableBufferable, /*!< No write allocate, read allocate, cacheable, bufferable. */ + kEDMA_ChannelWriteNoReadNoCacheNoBuffer, /*!< write allocate, no read allocate, non-cacheable, non-bufferable. */ + kEDMA_ChannelWriteNoReadNoCacheBufferable, /*!< write allocate, no read allocate, non-cacheable, bufferable. */ + kEDMA_ChannelWriteNoReadCacheableNoBuffer, /*!< write allocate, no read allocate, cacheable, non-bufferable. */ + kEDMA_ChannelWriteNoReadCacheableBufferable, /*!< write allocate, no read allocate, cacheable, bufferable. */ + kEDMA_ChannelWriteReadNoCacheNoBuffer, /*!< write allocate, read allocate, non-cacheable, non-bufferable. */ + kEDMA_ChannelWriteReadNoCacheBufferable, /*!< write allocate, read allocate, non-cacheable, bufferable. */ + kEDMA_ChannelWriteReadCacheableNoBuffer, /*!< write allocate, read allocate, cacheable, non-bufferable. */ + kEDMA_ChannelWriteReadCacheableBufferable, /*!< write allocate, read allocate, cacheable, bufferable. */ +} edma_channel_memory_attribute_t; +#endif + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE && FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE +/*! @brief eDMA4 channel swap size */ +typedef enum _edma_channel_swap_size +{ + kEDMA_ChannelSwapDisabled = 0x0U, /*!< Swap is disabled. */ + kEDMA_ChannelReadWith8bitSwap = 0x1U, /*!< Swap occurs with respect to the read 8bit. */ + kEDMA_ChannelReadWith16bitSwap = 0x2U, /*!< Swap occurs with respect to the read 16bit. */ + kEDMA_ChannelReadWith32bitSwap = 0x3U, /*!< Swap occurs with respect to the read 32bit. */ + kEDMA_ChannelWriteWith8bitSwap = 0x9U, /*!< Swap occurs with respect to the write 8bit. */ + kEDMA_ChannelWriteWith16bitSwap = 0x10U, /*!< Swap occurs with respect to the write 16bit. */ + kEDMA_ChannelWriteWith32bitSwap = 0x11U, /*!< Swap occurs with respect to the write 32bit. */ +} edma_channel_swap_size_t; +#endif + +/*! @brief eDMA channel system bus information, _edma_channel_sys_bus_info*/ +enum +{ +#if !(defined(FSL_FEATURE_EDMA_HAS_NO_CH_SBR_ATTR) && FSL_FEATURE_EDMA_HAS_NO_CH_SBR_ATTR) + kEDMA_AttributeOutput = DMA_CH_SBR_ATTR_MASK, /*!< DMA's AHB system bus attribute output value. */ +#endif + + kEDMA_PrivilegedAccessLevel = DMA_CH_SBR_PAL_MASK, /*!< Privileged Access Level for DMA transfers. 0b - User + protection level; 1b - Privileged protection level. */ + kEDMA_MasterId = + DMA_CH_SBR_MID_MASK, /*!< DMA's master ID when channel is active and master ID replication is enabled. */ +}; + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE && FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE +/*! @brief eDMA4 channel access type */ +typedef enum _edma_channel_access_type +{ + kEDMA_ChannelDataAccess = 0x0U, /*!< Data access for eDMA4 transfers. */ + kEDMA_ChannelInstructionAccess = 0x1U, /*!< Instruction access for eDMA4 transfers. */ +} edma_channel_access_type_t; +#endif + +/*! @brief eDMA4 channel protection level */ +typedef enum _edma_channel_protection_level +{ + kEDMA_ChannelProtectionLevelUser = 0x0U, /*!< user protection level for eDMA transfers. */ + kEDMA_ChannelProtectionLevelPrivileged = 0x1U, /*!< Privileged protection level eDMA transfers. */ +} edma_channel_protection_level_t; + +#if !(defined(FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC) && FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC) + +/*! @brief eDMA4 channel security level */ +typedef enum _edma_channel_security_level +{ + kEDMA_ChannelSecurityLevelNonSecure = 0x0U, /*!< non secure level for eDMA transfers. */ + kEDMA_ChannelSecurityLevelSecure = 0x1U, /*!< secure level for eDMA transfers. */ +} edma_channel_security_level_t; +#endif + +/*! @brief eDMA4 channel configuration*/ +typedef struct _edma_channel_config +{ + edma_channel_Preemption_config_t channelPreemptionConfig; /*!< channel preemption configuration */ + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE && FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE + edma_channel_memory_attribute_t channelReadMemoryAttribute; /*!< channel memory read attribute configuration */ + edma_channel_memory_attribute_t channelWriteMemoryAttribute; /*!< channel memory write attribute configuration */ +#endif + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE && FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE + edma_channel_swap_size_t channelSwapSize; /*!< channel swap size configuration */ +#endif + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE && FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE + edma_channel_access_type_t channelAccessType; /*!< channel access type configuration */ +#endif + + uint8_t channelDataSignExtensionBitPosition; /*!< channel data sign extension bit psition configuration */ + +#if (defined FSL_FEATURE_EDMA_HAS_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) || (defined FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX) + int channelRequestSource; /*!< hardware service request source for the channel */ +#endif + + bool enableMasterIDReplication; /*!< enable master ID replication */ +#if !(defined(FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC) && FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC) + edma_channel_security_level_t securityLevel; /*!< security level */ +#endif + edma_channel_protection_level_t protectionLevel; /*!< protection level */ + +} edma_channel_config_t; +#endif + +/*! + * @brief eDMA TCD. + * + * This structure is same as TCD register which is described in reference manual, + * and is used to configure the scatter/gather feature as a next hardware TCD. + */ +typedef edma_core_tcd_t edma_tcd_t; + +/*! @brief edma4 channel transfer configuration + * + * The transfer configuration structure support full feature configuration of the transfer control descriptor. + * + * @note User should pay attention to the transfer size alignment limitation + * 1. the bytesEachRequest should align with the srcWidthOfEachTransfer and the dstWidthOfEachTransfer + * that is to say bytesEachRequest % srcWidthOfEachTransfer should be 0 + * 2. the srcOffsetOfEachTransfer and dstOffsetOfEachTransfer must be aligne with transfer width + * 3. the totalBytes should align with the bytesEachRequest + * 4. the srcAddr should align with the srcWidthOfEachTransfer + * 5. the dstAddr should align with the dstWidthOfEachTransfer + * 6. the srcAddr should align with srcAddrModulo if modulo feature is enabled + * 7. the dstAddr should align with dstAddrModulo if modulo feature is enabled + * If anyone of above condition can not be satisfied, the edma4 interfaces will generate assert error. + * + * 1.To perform a simple transfer, below members should be initialized at least + * .srcAddr - source address + * .dstAddr - destination address + * .srcWidthOfEachTransfer - data width of source address + * .dstWidthOfEachTransfer - data width of destination address, normally it should be as same as + * srcWidthOfEachTransfer .bytesEachRequest - bytes to be transferred in each DMA request .totalBytes - total + * bytes to be transferred .srcOffsetOfEachTransfer - offset value in bytes unit to be applied to source address as + * each source read is completed .dstOffsetOfEachTransfer - offset value in bytes unit to be applied to destination + * address as each destination write is completed enablchannelRequest - channel request can be enabled together with + * transfer configure submission + * + * 2.The transfer configuration structure also support advance feature: + * Programmable source/destination address range(MODULO) + * Programmable minor loop offset + * Programmable major loop offset + * Programmable channel chain feature + * Programmable channel transfer control descriptor link feature + * + */ +typedef struct _edma_transfer_config +{ + uint32_t srcAddr; /*!< Source data address. */ + uint32_t destAddr; /*!< Destination data address. */ + edma_transfer_size_t srcTransferSize; /*!< Source data transfer size. */ + edma_transfer_size_t destTransferSize; /*!< Destination data transfer size. */ + int16_t srcOffset; /*!< Sign-extended offset value in byte unit applied to the current source + address to form the next-state value as each source read is completed */ + int16_t destOffset; /*!< Sign-extended offset value in byte unit applied to the current destination + address to form the next-state value as each destination write is completed. */ + uint32_t minorLoopBytes; /*!< bytes in each minor loop or each request + * range: 1 - (2^30 -1) when minor loop mapping is enabled + * range: 1 - (2^10 - 1) when minor loop mapping is enabled and source or dest minor + * loop offset is enabled + * range: 1 - (2^32 - 1) when minor loop mapping is disabled + */ + uint32_t majorLoopCounts; /*!< minor loop counts in each major loop, should be 1 at least for each + * transfer range: (0 - (2^15 - 1)) when minor loop channel link is + * disabled range: (0 - (2^9 - 1)) when minor loop channel link is enabled + * total bytes in a transfer = minorLoopCountsEachMajorLoop * + * bytesEachMinorLoop + */ + + uint16_t enabledInterruptMask; /*!< channel interrupt to enable, can be OR'ed value of _edma_interrupt_enable */ + + edma_modulo_t srcAddrModulo; /*!< source circular data queue range */ + int32_t srcMajorLoopOffset; /*!< source major loop offset */ + + edma_modulo_t dstAddrModulo; /*!< destination circular data queue range */ + int32_t dstMajorLoopOffset; /*!< destination major loop offset */ + + bool enableSrcMinorLoopOffset; /*!< enable source minor loop offset */ + bool enableDstMinorLoopOffset; /*!< enable dest minor loop offset */ + int32_t minorLoopOffset; /*!< burst offset, the offset will be applied after minor loop update */ + + bool enableChannelMajorLoopLink; /*!< channel link when major loop complete */ + uint32_t majorLoopLinkChannel; /*!< major loop link channel number */ + + bool enableChannelMinorLoopLink; /*!< channel link when minor loop complete */ + uint32_t minorLoopLinkChannel; /*!< minor loop link channel number */ + + edma_tcd_t *linkTCD; /*!< pointer to the link transfer control descriptor */ +} edma_transfer_config_t; + +/*! @brief eDMA global configuration structure.*/ +typedef struct _edma_config +{ +#if defined FSL_FEATURE_EDMA_HAS_CONTINUOUS_LINK_MODE && FSL_FEATURE_EDMA_HAS_CONTINUOUS_LINK_MODE + bool enableContinuousLinkMode; /*!< Enable (true) continuous link mode. Upon minor loop completion, the channel + activates again if that channel has a minor loop channel link enabled and + the link channel is itself. */ +#endif + +#if defined FSL_FEATURE_EDMA_HAS_GLOBAL_MASTER_ID_REPLICATION && FSL_FEATURE_EDMA_HAS_GLOBAL_MASTER_ID_REPLICATION + bool enableMasterIdReplication; /*!< Enable (true) master ID replication. If Master ID replication is disabled, the + privileged protection level (supervisor mode) for eDMA4 transfers is used. */ +#endif + + bool enableGlobalChannelLink; /*!< Enable(true) channel linking is available and controlled by each channel's link + settings. */ + + bool enableHaltOnError; /*!< Enable (true) transfer halt on error. Any error causes the HALT bit to set. + Subsequently, all service requests are ignored until the HALT bit is cleared.*/ + + bool enableDebugMode; /*!< Enable(true) eDMA4 debug mode. When in debug mode, the eDMA4 stalls the start of + a new channel. Executing channels are allowed to complete. */ + + bool enableRoundRobinArbitration; /*!< Enable(true) channel linking is available and controlled by each channel's + link settings. */ +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG && FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG + edma_channel_config_t *channelConfig[FSL_FEATURE_EDMA_MODULE_CHANNEL]; /*!< channel preemption configuration */ +#endif +} edma_config_t; + +/*! @brief Callback for eDMA */ +struct _edma_handle; + +/*! @brief Define callback function for eDMA. + * + * This callback function is called in the EDMA interrupt handle. + * In normal mode, run into callback function means the transfer users need is done. + * In scatter gather mode, run into callback function means a transfer control block (tcd) is finished. Not + * all transfer finished, users can get the finished tcd numbers using interface EDMA_GetUnusedTCDNumber. + * + * @param handle EDMA handle pointer, users shall not touch the values inside. + * @param userData The callback user parameter pointer. Users can use this parameter to involve things users need to + * change in EDMA callback function. + * @param transferDone If the current loaded transfer done. In normal mode it means if all transfer done. In scatter + * gather mode, this parameter shows is the current transfer block in EDMA register is done. As the + * load of core is different, it will be different if the new tcd loaded into EDMA registers while + * this callback called. If true, it always means new tcd still not loaded into registers, while + * false means new tcd already loaded into registers. + * @param tcds How many tcds are done from the last callback. This parameter only used in scatter gather mode. It + * tells user how many tcds are finished between the last callback and this. + */ +typedef void (*edma_callback)(struct _edma_handle *handle, void *userData, bool transferDone, uint32_t tcds); + +/*! @brief eDMA transfer handle structure */ +typedef struct _edma_handle +{ + edma_callback callback; /*!< Callback function for major count exhausted. */ + void *userData; /*!< Callback function parameter. */ + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG && FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG + EDMA_ChannelType *channelBase; /*!< eDMA peripheral channel base address. */ +#endif + EDMA_Type *base; /*!< eDMA peripheral base address*/ + EDMA_TCDType *tcdBase; /*!< eDMA peripheral tcd base address. */ + + edma_tcd_t *tcdPool; /*!< Pointer to memory stored TCDs. */ + uint32_t channel; /*!< eDMA channel number. */ + + volatile int8_t header; /*!< The first TCD index. Should point to the next TCD to be loaded into the eDMA engine. */ + volatile int8_t tail; /*!< The last TCD index. Should point to the next TCD to be stored into the memory pool. */ + volatile int8_t tcdUsed; /*!< The number of used TCD slots. Should reflect the number of TCDs can be used/loaded in + the memory. */ + volatile int8_t tcdSize; /*!< The total number of TCD slots in the queue. */ +} edma_handle_t; +/******************************************************************************* + * APIs + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*! + * @name eDMA initialization and de-initialization + * @{ + */ + +/*! + * @brief Initializes the eDMA peripheral. + * + * This function ungates the eDMA clock and configures the eDMA peripheral according + * to the configuration structure. + * + * @param base eDMA peripheral base address. + * @param config A pointer to the configuration structure, see "edma_config_t". + * @note This function enables the minor loop map feature. + */ +void EDMA_Init(EDMA_Type *base, const edma_config_t *config); + +/*! + * @brief Deinitializes the eDMA peripheral. + * + * This function gates the eDMA clock. + * + * @param base eDMA peripheral base address. + */ +void EDMA_Deinit(EDMA_Type *base); + +/*! + * @brief Push content of TCD structure into hardware TCD register. + * + * @param base EDMA peripheral base address. + * @param channel EDMA channel number. + * @param tcd Point to TCD structure. + */ +void EDMA_InstallTCD(EDMA_Type *base, uint32_t channel, edma_tcd_t *tcd); + +/*! + * @brief Gets the eDMA default configuration structure. + * + * This function sets the configuration structure to default values. + * The default configuration is set to the following values. + * @code + * config.enableContinuousLinkMode = false; + * config.enableHaltOnError = true; + * config.enableRoundRobinArbitration = false; + * config.enableDebugMode = false; + * @endcode + * + * @param config A pointer to the eDMA configuration structure. + */ +void EDMA_GetDefaultConfig(edma_config_t *config); + +#if defined(FSL_FEATURE_DMA_HAS_CONTINUOUS_CHANNEL_LINK) && FSL_FEATURE_DMA_HAS_CONTINUOUS_CHANNEL_LINK +/*! + * @brief Enable/Disable continuous channel link mode. + * + * @note Do not use continuous link mode with a channel linking to itself if there is only one minor loop + * iteration per service request, for example, if the channel's NBYTES value is the same as either + * the source or destination size. The same data transfer profile can be achieved by simply + * increasing the NBYTES value, which provides more efficient, faster processing. + * + * @param base EDMA peripheral base address. + * @param enable true is enable, false is disable. + */ +static inline void EDMA_EnableContinuousChannelLinkMode(EDMA_Type *base, bool enable) +{ + if (enable) + { + EDMA_BASE(base)->CR |= DMA_CR_CLM_MASK; + } + else + { + EDMA_BASE(base)->CR &= ~DMA_CR_CLM_MASK; + } +} +#endif + +#if defined(FSL_FEATURE_DMA_HAS_MINOR_LOOP_MAPPING) && FSL_FEATURE_DMA_HAS_MINOR_LOOP_MAPPING +/*! + * @brief Enable/Disable minor loop mapping. + * + * The TCDn.word2 is redefined to include individual enable fields, an offset field, and the + * NBYTES field. + * + * @param base EDMA peripheral base address. + * @param enable true is enable, false is disable. + */ +static inline void EDMA_EnableMinorLoopMapping(EDMA_Type *base, bool enable) +{ + if (enable) + { + EDMA_BASE(base)->CR |= DMA_CR_EMLM_MASK; + } + else + { + EDMA_BASE(base)->CR &= ~DMA_CR_EMLM_MASK; + } +} +#endif + +/*! @} */ +/*! + * @name eDMA Channel Operation + * @{ + */ + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG && FSL_FEATURE_EDMA_HAS_CHANNEL_CONFIG +/*! + * @brief EDMA Channel initialization + * + * @param base eDMA4 peripheral base address. + * @param channel eDMA4 channel number. + * @param channelConfig pointer to user's eDMA4 channel config structure, see edma_channel_config_t for detail. + */ +void EDMA_InitChannel(EDMA_Type *base, uint32_t channel, edma_channel_config_t *channelConfig); + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE && FSL_FEATURE_EDMA_HAS_CHANNEL_MEMORY_ATTRIBUTE +/*! + * @brief Set channel memory attribute. + * + * @param base eDMA4 peripheral base address. + * @param channel eDMA4 channel number. + * @param writeAttribute Attributes associated with a write transaction. + * @param readAttribute Attributes associated with a read transaction. + */ +static inline void EDMA_SetChannelMemoryAttribute(EDMA_Type *base, + uint32_t channel, + edma_channel_memory_attribute_t writeAttribute, + edma_channel_memory_attribute_t readAttribute) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + if (0U != (uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_MEMORY_ATTRIBUTEn(base)) + { +#if defined FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX + if ((uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_MP_CHANNEL_MUXn(base) == 1U) + { + EDMA_CHANNEL_BASE(base, channel)->CH_REGS.EDMA5_REG.CH_MATTR = + DMA_CH_MATTR_WCACHE(writeAttribute) | DMA_CH_MATTR_RCACHE(readAttribute); + } + else +#endif + { + EDMA_CHANNEL_BASE(base, channel)->CH_REGS.EDMA4_REG.CH_MATTR = + DMA_CH_MATTR_WCACHE(writeAttribute) | DMA_CH_MATTR_RCACHE(readAttribute); + } + } +} +#endif + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_SIGN_EXTENSION && FSL_FEATURE_EDMA_HAS_CHANNEL_SIGN_EXTENSION +/*! + * @brief Set channel sign extension. + * + * @param base eDMA4 peripheral base address. + * @param channel eDMA4 channel number. + * @param position A non-zero value specifing the sign extend bit position. + * If 0, sign extension is disabled. + */ +static inline void EDMA_SetChannelSignExtension(EDMA_Type *base, uint32_t channel, uint8_t position) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + if (0U != (uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_SIGN_EXTENSIONn(base)) + { + EDMA_CHANNEL_BASE(base, channel)->CH_CSR = + (EDMA_CHANNEL_BASE(base, channel)->CH_CSR & (~DMA_CH_CSR_SIGNEXT_MASK)) | + ((uint32_t)position << DMA_CH_CSR_SIGNEXT_SHIFT); + } +} +#endif + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE && FSL_FEATURE_EDMA_HAS_CHANNEL_SWAP_SIZE +/*! + * @brief Set channel swap size. + * + * @param base eDMA4 peripheral base address. + * @param channel eDMA4 channel number. + * @param swapSize Swap occurs with respect to the specified transfer size. + * If 0, swap is disabled. + */ +static inline void EDMA_SetChannelSwapSize(EDMA_Type *base, uint32_t channel, edma_channel_swap_size_t swapSize) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + if (0U != (uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_SWAP_SIZEn(base)) + { + EDMA_CHANNEL_BASE(base, channel)->CH_CSR = + (EDMA_CHANNEL_BASE(base, channel)->CH_CSR & (~DMA_CH_CSR_SWAP_MASK)) | + ((uint32_t)swapSize << DMA_CH_CSR_SWAP_SHIFT); + } +} +#endif + +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE && FSL_FEATURE_EDMA_HAS_CHANNEL_ACCESS_TYPE +/*! + * @brief Set channel access type. + * + * @param base eDMA4 peripheral base address. + * @param channel eDMA4 channel number. + * @param channelAccessType eDMA4's transactions type on the system bus when the channel is active. + */ +static inline void EDMA_SetChannelAccessType(EDMA_Type *base, + uint32_t channel, + edma_channel_access_type_t channelAccessType) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + if (0U != (uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_ACCESS_TYPEn(base)) + { +#if defined FSL_FEATURE_EDMA_HAS_PROT_REGISTER && FSL_FEATURE_EDMA_HAS_PROT_REGISTER + if (FSL_FEATURE_EDMA_INSTANCE_HAS_PROT_REGISTERn(base) == 1) + { + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_PROT[channel] = + (EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_PROT[channel] & (~DMA_CH_SBR_INSTR_MASK)) | + ((uint32_t)channelAccessType << DMA_CH_SBR_INSTR_SHIFT); + } + else +#endif + { + EDMA_CHANNEL_BASE(base, channel)->CH_SBR = + (EDMA_CHANNEL_BASE(base, channel)->CH_SBR & (~DMA_CH_SBR_INSTR_MASK)) | + ((uint32_t)channelAccessType << DMA_CH_SBR_INSTR_SHIFT); + } + } +} +#endif + +#if (defined FSL_FEATURE_EDMA_HAS_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) || \ + (defined FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX) +/*! + * @brief Set channel request source. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param channelRequestSource eDMA hardware service request source for the channel. User need to use + * the dma_request_source_t type as the input parameter. Note that devices + * may use other enum type to express dma request source and User can fined it in + * SOC header or fsl_edma_soc.h. + */ +static inline void EDMA_SetChannelMux(EDMA_Type *base, uint32_t channel, int32_t channelRequestSource) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + if ((uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_CHANNEL_MUXn(base) == 1U) + { + /* Reset channel mux */ +#if defined FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_MP_CHANNEL_MUX + if ((uint32_t)FSL_FEATURE_EDMA_INSTANCE_HAS_MP_CHANNEL_MUXn(base) == 1U) + { + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_MUX[channel] = DMA_CH_MUX_SOURCE(0); + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_MUX[channel] = DMA_CH_MUX_SOURCE(channelRequestSource); + } + else +#endif + { +#if defined FSL_FEATURE_EDMA_HAS_CHANNEL_MUX && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX + EDMA_CHANNEL_BASE(base, channel)->CH_REGS.EDMA4_REG.CH_MUX = DMA_CH_MUX_SOURCE(0); + EDMA_CHANNEL_BASE(base, channel)->CH_REGS.EDMA4_REG.CH_MUX = DMA_CH_MUX_SOURCE(channelRequestSource); +#endif + } + } +} +#endif + +/*! + * @brief Gets the channel identification and attribute information on the system bus interface. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @return The mask of the channel system bus information. Users need to use the + * _edma_channel_sys_bus_info type to decode the return variables. + */ +static inline uint32_t EDMA_GetChannelSystemBusInformation(EDMA_Type *base, uint32_t channel) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + return EDMA_CHANNEL_BASE(base, channel)->CH_SBR; +} + +/*! + * @brief Set channel master ID replication. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param enable true is enable, false is disable. + */ +static inline void EDMA_EnableChannelMasterIDReplication(EDMA_Type *base, uint32_t channel, bool enable) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + +#if defined FSL_FEATURE_EDMA_HAS_PROT_REGISTER && FSL_FEATURE_EDMA_HAS_PROT_REGISTER + if (FSL_FEATURE_EDMA_INSTANCE_HAS_PROT_REGISTERn(base) == 1) + { + if (enable) + { + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_PROT[channel] |= DMA_CH_SBR_EMI_MASK; + } + else + { + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_PROT[channel] &= ~DMA_CH_SBR_EMI_MASK; + } + } + else +#endif + { + if (enable) + { + EDMA_CHANNEL_BASE(base, channel)->CH_SBR |= DMA_CH_SBR_EMI_MASK; + } + else + { + EDMA_CHANNEL_BASE(base, channel)->CH_SBR &= ~DMA_CH_SBR_EMI_MASK; + } + } +} + +#if !(defined(FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC) && FSL_FEATURE_EDMA_HAS_NO_CH_SBR_SEC) +/*! + * @brief Set channel security level. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param level security level. + */ +static inline void EDMA_SetChannelSecurityLevel(EDMA_Type *base, uint32_t channel, edma_channel_security_level_t level) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + +#if defined FSL_FEATURE_EDMA_HAS_PROT_REGISTER && FSL_FEATURE_EDMA_HAS_PROT_REGISTER + if (FSL_FEATURE_EDMA_INSTANCE_HAS_PROT_REGISTERn(base) == 1) + { + if (level == kEDMA_ChannelSecurityLevelSecure) + { + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_PROT[channel] |= DMA_CH_SBR_SEC_MASK; + } + else + { + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_PROT[channel] &= ~DMA_CH_SBR_SEC_MASK; + } + } + else +#endif + { + if (level == kEDMA_ChannelSecurityLevelSecure) + { + EDMA_CHANNEL_BASE(base, channel)->CH_SBR |= DMA_CH_SBR_SEC_MASK; + } + else + { + EDMA_CHANNEL_BASE(base, channel)->CH_SBR &= ~DMA_CH_SBR_SEC_MASK; + } + } +} +#endif + +/*! + * @brief Set channel security level. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param level security level. + */ +static inline void EDMA_SetChannelProtectionLevel(EDMA_Type *base, + uint32_t channel, + edma_channel_protection_level_t level) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + +#if defined FSL_FEATURE_EDMA_HAS_PROT_REGISTER && FSL_FEATURE_EDMA_HAS_PROT_REGISTER + if (FSL_FEATURE_EDMA_INSTANCE_HAS_PROT_REGISTERn(base) == 1) + { + if (level == kEDMA_ChannelProtectionLevelPrivileged) + { + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_PROT[channel] |= DMA_CH_SBR_PAL_MASK; + } + else + { + EDMA_MP_BASE(base)->MP_REGS.EDMA5_REG.CH_PROT[channel] &= ~DMA_CH_SBR_PAL_MASK; + } + } + else +#endif + { + if (level == kEDMA_ChannelProtectionLevelPrivileged) + { + EDMA_CHANNEL_BASE(base, channel)->CH_SBR |= DMA_CH_SBR_PAL_MASK; + } + else + { + EDMA_CHANNEL_BASE(base, channel)->CH_SBR &= ~DMA_CH_SBR_PAL_MASK; + } + } +} + +#endif +/*! + * @brief Sets all TCD registers to default values. + * + * This function sets TCD registers for this channel to default values. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @note This function must not be called while the channel transfer is ongoing + * or it causes unpredictable results. + * @note This function enables the auto stop request feature. + */ +void EDMA_ResetChannel(EDMA_Type *base, uint32_t channel); + +/*! + * @brief Configures the eDMA transfer attribute. + * + * This function configures the transfer attribute, including source address, destination address, + * transfer size, address offset, and so on. It also configures the scatter gather feature if the + * user supplies the TCD address. + * Example: + * @code + * edma_transfer_t config; + * edma_tcd_t tcd; + * config.srcAddr = ..; + * config.destAddr = ..; + * ... + * EDMA_SetTransferConfig(DMA0, channel, &config, &stcd); + * @endcode + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param config Pointer to eDMA transfer configuration structure. + * @param nextTcd Point to TCD structure. It can be NULL if users + * do not want to enable scatter/gather feature. + * @note If nextTcd is not NULL, it means scatter gather feature is enabled + * and DREQ bit is cleared in the previous transfer configuration, which + * is set in the eDMA_ResetChannel. + */ +void EDMA_SetTransferConfig(EDMA_Type *base, + uint32_t channel, + const edma_transfer_config_t *config, + edma_tcd_t *nextTcd); + +/*! + * @brief Configures the eDMA minor offset feature. + * + * The minor offset means that the signed-extended value is added to the source address or destination + * address after each minor loop. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param config A pointer to the minor offset configuration structure. + */ +void EDMA_SetMinorOffsetConfig(EDMA_Type *base, uint32_t channel, const edma_minor_offset_config_t *config); + +/*! + * @brief Configures the eDMA channel preemption feature. + * + * This function configures the channel preemption attribute and the priority of the channel. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number + * @param config A pointer to the channel preemption configuration structure. + */ +void EDMA_SetChannelPreemptionConfig(EDMA_Type *base, uint32_t channel, const edma_channel_Preemption_config_t *config); + +/*! + * @brief Sets the channel link for the eDMA transfer. + * + * This function configures either the minor link or the major link mode. The minor link means that the channel link is + * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is + * exhausted. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param type A channel link type, which can be one of the following: + * @arg kEDMA_LinkNone + * @arg kEDMA_MinorLink + * @arg kEDMA_MajorLink + * @param linkedChannel The linked channel number. + * @note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. + */ +void EDMA_SetChannelLink(EDMA_Type *base, uint32_t channel, edma_channel_link_type_t type, uint32_t linkedChannel); + +#if defined FSL_FEATURE_EDMA_HAS_BANDWIDTH && FSL_FEATURE_EDMA_HAS_BANDWIDTH +/*! + * @brief Sets the bandwidth for the eDMA transfer. + * + * Because the eDMA processes the minor loop, it continuously generates read/write sequences + * until the minor count is exhausted. The bandwidth forces the eDMA to stall after the completion of + * each read/write access to control the bus request bandwidth seen by the crossbar switch. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param bandWidth A bandwidth setting, which can be one of the following: + * @arg kEDMABandwidthStallNone + * @arg kEDMABandwidthStall4Cycle + * @arg kEDMABandwidthStall8Cycle + */ +void EDMA_SetBandWidth(EDMA_Type *base, uint32_t channel, edma_bandwidth_t bandWidth); +#endif + +/*! + * @brief Sets the source modulo and the destination modulo for the eDMA transfer. + * + * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) + * calculation is performed or the original register value. It provides the ability to implement a circular data + * queue easily. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param srcModulo A source modulo value. + * @param destModulo A destination modulo value. + */ +void EDMA_SetModulo(EDMA_Type *base, uint32_t channel, edma_modulo_t srcModulo, edma_modulo_t destModulo); + +#if defined(FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT) && FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT +/*! + * @brief Enables an async request for the eDMA transfer. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param enable The command to enable (true) or disable (false). + */ +static inline void EDMA_EnableAsyncRequest(EDMA_Type *base, uint32_t channel, bool enable) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + EDMA_BASE(base)->EARS &= ~((uint32_t)1U << channel); + EDMA_BASE(base)->EARS |= ((uint32_t)(true == enable ? 1U : 0U) << channel); +#else + if (enable) + { + EDMA_CHANNEL_BASE(base, channel)->CH_CSR |= DMA_CH_CSR_EARQ_MASK; + } + else + { + EDMA_CHANNEL_BASE(base, channel)->CH_CSR &= ~DMA_CH_CSR_EARQ_MASK; + } +#endif +} +#endif + +/*! + * @brief Enables an auto stop request for the eDMA transfer. + * + * If enabling the auto stop request, the eDMA hardware automatically disables the hardware channel request. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param enable The command to enable (true) or disable (false). + */ +static inline void EDMA_EnableAutoStopRequest(EDMA_Type *base, uint32_t channel, bool enable) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + + if (enable) + { + EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) |= DMA_CSR_DREQ_MASK; + } + else + { + EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_DREQ_MASK; + } +} + +/*! + * @brief Enables the interrupt source for the eDMA transfer. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_EnableChannelInterrupts(EDMA_Type *base, uint32_t channel, uint32_t mask); + +/*! + * @brief Disables the interrupt source for the eDMA transfer. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param mask The mask of the interrupt source to be set. Use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_DisableChannelInterrupts(EDMA_Type *base, uint32_t channel, uint32_t mask); + +/*! + * @brief Configures the eDMA channel TCD major offset feature. + * + * Adjustment value added to the source address at the completion of the major iteration count + * + * @param base eDMA peripheral base address. + * @param channel edma channel number. + * @param sourceOffset source address offset will be applied to source address after major loop done. + * @param destOffset destination address offset will be applied to source address after major loop done. + */ +void EDMA_SetMajorOffsetConfig(EDMA_Type *base, uint32_t channel, int32_t sourceOffset, int32_t destOffset); + +/*! @} */ +/*! + * @name eDMA TCD Operation + * @{ + */ +/*! + * @brief Sets TCD fields according to the user's channel transfer configuration structure, @ref + * edma_transfer_config_t. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_ConfigChannelSoftwareTCDExt + * + * Application should be careful about the TCD pool buffer storage class, + * - For the platform has cache, the software TCD should be put in non cache section + * - The TCD pool buffer should have a consistent storage class. + * + * @param tcd Pointer to the TCD structure. + * @param transfer channel transfer configuration pointer. + * + * @note This function enables the auto stop request feature. + */ +void EDMA_ConfigChannelSoftwareTCD(edma_tcd_t *tcd, const edma_transfer_config_t *transfer); + +/*! + * @brief Sets all fields to default values for the TCD structure. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdResetExt + * + * This function sets all fields for this TCD structure to default value. + * + * @param tcd Pointer to the TCD structure. + * @note This function enables the auto stop request feature. + */ +void EDMA_TcdReset(edma_tcd_t *tcd); + +/*! + * @brief Configures the eDMA TCD transfer attribute. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdSetTransferConfigExt + * + * The TCD is a transfer control descriptor. The content of the TCD is the same as the hardware TCD registers. + * The TCD is used in the scatter-gather mode. + * This function configures the TCD transfer attribute, including source address, destination address, + * transfer size, address offset, and so on. It also configures the scatter gather feature if the + * user supplies the next TCD address. + * Example: + * @code + * edma_transfer_t config = { + * ... + * } + * edma_tcd_t tcd __aligned(32); + * edma_tcd_t nextTcd __aligned(32); + * EDMA_TcdSetTransferConfig(&tcd, &config, &nextTcd); + * @endcode + * + * @param tcd Pointer to the TCD structure. + * @param config Pointer to eDMA transfer configuration structure. + * @param nextTcd Pointer to the next TCD structure. It can be NULL if users + * do not want to enable scatter/gather feature. + * @note TCD address should be 32 bytes aligned or it causes an eDMA error. + * @note If the nextTcd is not NULL, the scatter gather feature is enabled + * and DREQ bit is cleared in the previous transfer configuration, which + * is set in the EDMA_TcdReset. + */ +void EDMA_TcdSetTransferConfig(edma_tcd_t *tcd, const edma_transfer_config_t *config, edma_tcd_t *nextTcd); + +/*! + * @brief Configures the eDMA TCD minor offset feature. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdSetMinorOffsetConfigExt + * + * A minor offset is a signed-extended value added to the source address or a destination + * address after each minor loop. + * + * @param tcd A point to the TCD structure. + * @param config A pointer to the minor offset configuration structure. + */ +void EDMA_TcdSetMinorOffsetConfig(edma_tcd_t *tcd, const edma_minor_offset_config_t *config); + +/*! + * @brief Sets the channel link for the eDMA TCD. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdSetChannelLinkExt + * + * This function configures either a minor link or a major link. The minor link means the channel link is + * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is + * exhausted. + * + * @note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. + * @param tcd Point to the TCD structure. + * @param type Channel link type, it can be one of: + * @arg kEDMA_LinkNone + * @arg kEDMA_MinorLink + * @arg kEDMA_MajorLink + * @param linkedChannel The linked channel number. + */ +void EDMA_TcdSetChannelLink(edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel); + +#if defined FSL_FEATURE_EDMA_HAS_BANDWIDTH && FSL_FEATURE_EDMA_HAS_BANDWIDTH +/*! + * @brief Sets the bandwidth for the eDMA TCD. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdSetBandWidthExt + * + * Because the eDMA processes the minor loop, it continuously generates read/write sequences + * until the minor count is exhausted. The bandwidth forces the eDMA to stall after the completion of + * each read/write access to control the bus request bandwidth seen by the crossbar switch. + * @param tcd A pointer to the TCD structure. + * @param bandWidth A bandwidth setting, which can be one of the following: + * @arg kEDMABandwidthStallNone + * @arg kEDMABandwidthStall4Cycle + * @arg kEDMABandwidthStall8Cycle + */ +static inline void EDMA_TcdSetBandWidth(edma_tcd_t *tcd, edma_bandwidth_t bandWidth) +{ + assert(tcd != NULL); + + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) = + (uint16_t)((EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) & (~DMA_CSR_BWC_MASK)) | DMA_CSR_BWC(bandWidth)); +} +#endif + +/*! + * @brief Sets the source modulo and the destination modulo for the eDMA TCD. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdSetModuloExt + * + * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) + * calculation is performed or the original register value. It provides the ability to implement a circular data + * queue easily. + * + * @param tcd A pointer to the TCD structure. + * @param srcModulo A source modulo value. + * @param destModulo A destination modulo value. + */ +void EDMA_TcdSetModulo(edma_tcd_t *tcd, edma_modulo_t srcModulo, edma_modulo_t destModulo); + +/*! + * @brief Sets the auto stop request for the eDMA TCD. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdEnableAutoStopRequestExt + * + * If enabling the auto stop request, the eDMA hardware automatically disables the hardware channel request. + * + * @param tcd A pointer to the TCD structure. + * @param enable The command to enable (true) or disable (false). + */ +static inline void EDMA_TcdEnableAutoStopRequest(edma_tcd_t *tcd, bool enable) +{ + assert(tcd != NULL); + + EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) = (uint16_t)((EDMA_TCD_CSR(tcd, kEDMA_EDMA4Flag) & (~DMA_CSR_DREQ_MASK)) | + DMA_CSR_DREQ((true == enable ? 1U : 0U))); +} + +/*! + * @brief Enables the interrupt source for the eDMA TCD. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdEnableInterruptsExt + * + * @param tcd Point to the TCD structure. + * @param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_TcdEnableInterrupts(edma_tcd_t *tcd, uint32_t mask); + +/*! + * @brief Disables the interrupt source for the eDMA TCD. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdDisableInterruptsExt + * + * @param tcd Point to the TCD structure. + * @param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_TcdDisableInterrupts(edma_tcd_t *tcd, uint32_t mask); + +/*! + * @brief Configures the eDMA TCD major offset feature. + * + * @Note This API only supports EDMA4 TCD type. It can be used to support all types with extension API @ref + * EDMA_TcdSetMajorOffsetConfigExt + * + * Adjustment value added to the source address at the completion of the major iteration count + * + * @param tcd A point to the TCD structure. + * @param sourceOffset source address offset wiil be applied to source address after major loop done. + * @param destOffset destination address offset will be applied to source address after major loop done. + */ +void EDMA_TcdSetMajorOffsetConfig(edma_tcd_t *tcd, int32_t sourceOffset, int32_t destOffset); + +/*! + * @brief Sets TCD fields according to the user's channel transfer configuration structure, @ref + * edma_transfer_config_t. + * + * Application should be careful about the TCD pool buffer storage class, + * - For the platform has cache, the software TCD should be put in non cache section + * - The TCD pool buffer should have a consistent storage class. + * + * @param base eDMA peripheral base address. + * @param tcd Pointer to the TCD structure. + * @param transfer channel transfer configuration pointer. + * + * @note This function enables the auto stop request feature. + */ +void EDMA_ConfigChannelSoftwareTCDExt(EDMA_Type *base, edma_tcd_t *tcd, const edma_transfer_config_t *transfer); + +/*! + * @brief Sets all fields to default values for the TCD structure. + * + * This function sets all fields for this TCD structure to default value. + * + * @param base eDMA peripheral base address. + * @param tcd Pointer to the TCD structure. + * @note This function enables the auto stop request feature. + */ +void EDMA_TcdResetExt(EDMA_Type *base, edma_tcd_t *tcd); + +/*! + * @brief Configures the eDMA TCD transfer attribute. + * + * The TCD is a transfer control descriptor. The content of the TCD is the same as the hardware TCD registers. + * The TCD is used in the scatter-gather mode. + * This function configures the TCD transfer attribute, including source address, destination address, + * transfer size, address offset, and so on. It also configures the scatter gather feature if the + * user supplies the next TCD address. + * Example: + * @code + * edma_transfer_t config = { + * ... + * } + * edma_tcd_t tcd __aligned(32); + * edma_tcd_t nextTcd __aligned(32); + * EDMA_TcdSetTransferConfig(&tcd, &config, &nextTcd); + * @endcode + * + * @param base eDMA peripheral base address. + * @param tcd Pointer to the TCD structure. + * @param config Pointer to eDMA transfer configuration structure. + * @param nextTcd Pointer to the next TCD structure. It can be NULL if users + * do not want to enable scatter/gather feature. + * @note TCD address should be 32 bytes aligned or it causes an eDMA error. + * @note If the nextTcd is not NULL, the scatter gather feature is enabled + * and DREQ bit is cleared in the previous transfer configuration, which + * is set in the EDMA_TcdReset. + */ +void EDMA_TcdSetTransferConfigExt(EDMA_Type *base, + edma_tcd_t *tcd, + const edma_transfer_config_t *config, + edma_tcd_t *nextTcd); + +/*! + * @brief Configures the eDMA TCD minor offset feature. + * + * A minor offset is a signed-extended value added to the source address or a destination + * address after each minor loop. + * + * @param base eDMA peripheral base address. + * @param tcd A point to the TCD structure. + * @param config A pointer to the minor offset configuration structure. + */ +void EDMA_TcdSetMinorOffsetConfigExt(EDMA_Type *base, edma_tcd_t *tcd, const edma_minor_offset_config_t *config); + +/*! + * @brief Sets the channel link for the eDMA TCD. + * + * This function configures either a minor link or a major link. The minor link means the channel link is + * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is + * exhausted. + * + * @note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid. + * @param base eDMA peripheral base address. + * @param tcd Point to the TCD structure. + * @param type Channel link type, it can be one of: + * @arg kEDMA_LinkNone + * @arg kEDMA_MinorLink + * @arg kEDMA_MajorLink + * @param linkedChannel The linked channel number. + */ +void EDMA_TcdSetChannelLinkExt(EDMA_Type *base, edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel); + +#if defined FSL_FEATURE_EDMA_HAS_BANDWIDTH && FSL_FEATURE_EDMA_HAS_BANDWIDTH +/*! + * @brief Sets the bandwidth for the eDMA TCD. + * + * Because the eDMA processes the minor loop, it continuously generates read/write sequences + * until the minor count is exhausted. The bandwidth forces the eDMA to stall after the completion of + * each read/write access to control the bus request bandwidth seen by the crossbar switch. + * @param base eDMA peripheral base address. + * @param tcd A pointer to the TCD structure. + * @param bandWidth A bandwidth setting, which can be one of the following: + * @arg kEDMABandwidthStallNone + * @arg kEDMABandwidthStall4Cycle + * @arg kEDMABandwidthStall8Cycle + */ +static inline void EDMA_TcdSetBandWidthExt(EDMA_Type *base, edma_tcd_t *tcd, edma_bandwidth_t bandWidth) +{ + assert(tcd != NULL); + assert(((uint32_t)tcd & 0x1FU) == 0U); + + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) = + (uint16_t)((EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) & (~DMA_CSR_BWC_MASK)) | DMA_CSR_BWC(bandWidth)); +} +#endif + +/*! + * @brief Sets the source modulo and the destination modulo for the eDMA TCD. + * + * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF) + * calculation is performed or the original register value. It provides the ability to implement a circular data + * queue easily. + * + * @param base eDMA peripheral base address. + * @param tcd A pointer to the TCD structure. + * @param srcModulo A source modulo value. + * @param destModulo A destination modulo value. + */ +void EDMA_TcdSetModuloExt(EDMA_Type *base, edma_tcd_t *tcd, edma_modulo_t srcModulo, edma_modulo_t destModulo); + +/*! + * @brief Sets the auto stop request for the eDMA TCD. + * + * If enabling the auto stop request, the eDMA hardware automatically disables the hardware channel request. + * + * @param base eDMA peripheral base address. + * @param tcd A pointer to the TCD structure. + * @param enable The command to enable (true) or disable (false). + */ +static inline void EDMA_TcdEnableAutoStopRequestExt(EDMA_Type *base, edma_tcd_t *tcd, bool enable) +{ + assert(tcd != NULL); + assert(((uint32_t)tcd & 0x1FU) == 0U); + + EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) = (uint16_t)((EDMA_TCD_CSR(tcd, EDMA_TCD_TYPE(base)) & (~DMA_CSR_DREQ_MASK)) | + DMA_CSR_DREQ((true == enable ? 1U : 0U))); +} + +/*! + * @brief Enables the interrupt source for the eDMA TCD. + * + * @param base eDMA peripheral base address. + * @param tcd Point to the TCD structure. + * @param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_TcdEnableInterruptsExt(EDMA_Type *base, edma_tcd_t *tcd, uint32_t mask); + +/*! + * @brief Disables the interrupt source for the eDMA TCD. + * + * @param base eDMA peripheral base address. + * @param tcd Point to the TCD structure. + * @param mask The mask of interrupt source to be set. Users need to use + * the defined edma_interrupt_enable_t type. + */ +void EDMA_TcdDisableInterruptsExt(EDMA_Type *base, edma_tcd_t *tcd, uint32_t mask); + +/*! + * @brief Configures the eDMA TCD major offset feature. + * + * Adjustment value added to the source address at the completion of the major iteration count + * + * @param base eDMA peripheral base address. + * @param tcd A point to the TCD structure. + * @param sourceOffset source address offset wiil be applied to source address after major loop done. + * @param destOffset destination address offset will be applied to source address after major loop done. + */ +void EDMA_TcdSetMajorOffsetConfigExt(EDMA_Type *base, edma_tcd_t *tcd, int32_t sourceOffset, int32_t destOffset); + +/*! @} */ +/*! + * @name eDMA Channel Transfer Operation + * @{ + */ + +/*! + * @brief Enables the eDMA hardware channel request. + * + * This function enables the hardware channel request. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + */ +static inline void EDMA_EnableChannelRequest(EDMA_Type *base, uint32_t channel) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + EDMA_BASE(base)->SERQ = DMA_SERQ_SERQ(channel); +#else + EDMA_CHANNEL_BASE(base, channel)->CH_CSR |= DMA_CH_CSR_ERQ_MASK; +#endif +} + +/*! + * @brief Disables the eDMA hardware channel request. + * + * This function disables the hardware channel request. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + */ +static inline void EDMA_DisableChannelRequest(EDMA_Type *base, uint32_t channel) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + EDMA_BASE(base)->CERQ = DMA_CERQ_CERQ(channel); +#else + EDMA_CHANNEL_BASE(base, channel)->CH_CSR &= ~DMA_CH_CSR_ERQ_MASK; +#endif +} + +/*! + * @brief Starts the eDMA transfer by using the software trigger. + * + * This function starts a minor loop transfer. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + */ +static inline void EDMA_TriggerChannelStart(EDMA_Type *base, uint32_t channel) +{ + assert(channel < (uint32_t)FSL_FEATURE_EDMA_INSTANCE_CHANNELn(base)); + +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + EDMA_BASE(base)->SSRT = DMA_SSRT_SSRT(channel); +#else + EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) |= DMA_CSR_START_MASK; +#endif +} + +/*! @} */ +/*! + * @name eDMA Channel Status Operation + * @{ + */ + +/*! + * @brief Gets the remaining major loop count from the eDMA current channel TCD. + * + * This function checks the TCD (Task Control Descriptor) status for a specified + * eDMA channel and returns the number of major loop count that has not finished. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @return Major loop count which has not been transferred yet for the current TCD. + * @note 1. This function can only be used to get unfinished major loop count of transfer without + * the next TCD, or it might be inaccuracy. + * 2. The unfinished/remaining transfer bytes cannot be obtained directly from registers while + * the channel is running. + * Because to calculate the remaining bytes, the initial NBYTES configured in DMA_TCDn_NBYTES_MLNO + * register is needed while the eDMA IP does not support getting it while a channel is active. + * In another word, the NBYTES value reading is always the actual (decrementing) NBYTES value the dma_engine + * is working with while a channel is running. + * Consequently, to get the remaining transfer bytes, a software-saved initial value of NBYTES (for example + * copied before enabling the channel) is needed. The formula to calculate it is shown below: + * RemainingBytes = RemainingMajorLoopCount * NBYTES(initially configured) + */ +uint32_t EDMA_GetRemainingMajorLoopCount(EDMA_Type *base, uint32_t channel); + +/*! + * @brief Gets the eDMA channel error status flags. + * + * @param base eDMA peripheral base address. + * @return The mask of error status flags. Users need to use the + * _edma_error_status_flags type to decode the return variables. + */ +static inline uint32_t EDMA_GetErrorStatusFlags(EDMA_Type *base) +{ +#if defined FSL_EDMA_SOC_IP_EDMA && FSL_EDMA_SOC_IP_EDMA + return EDMA_BASE(base)->ES; +#else + return EDMA_MP_BASE(base)->MP_ES; +#endif +} + +/*! + * @brief Gets the eDMA channel status flags. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @return The mask of channel status flags. Users need to use the + * _edma_channel_status_flags type to decode the return variables. + */ +uint32_t EDMA_GetChannelStatusFlags(EDMA_Type *base, uint32_t channel); + +/*! + * @brief Clears the eDMA channel status flags. + * + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + * @param mask The mask of channel status to be cleared. Users need to use + * the defined _edma_channel_status_flags type. + */ +void EDMA_ClearChannelStatusFlags(EDMA_Type *base, uint32_t channel, uint32_t mask); + +/*! @} */ +/*! + * @name eDMA Transactional Operation + */ + +/*! + * @brief Creates the eDMA handle. + * + * This function is called if using the transactional API for eDMA. This function + * initializes the internal state of the eDMA handle. + * + * @param handle eDMA handle pointer. The eDMA handle stores callback function and + * parameters. + * @param base eDMA peripheral base address. + * @param channel eDMA channel number. + */ +void EDMA_CreateHandle(edma_handle_t *handle, EDMA_Type *base, uint32_t channel); + +/*! + * @brief Installs the TCDs memory pool into the eDMA handle. + * + * This function is called after the EDMA_CreateHandle to use scatter/gather feature. This function shall only be used + * while users need to use scatter gather mode. Scatter gather mode enables EDMA to load a new transfer control block + * (tcd) in hardware, and automatically reconfigure that DMA channel for a new transfer. + * Users need to prepare tcd memory and also configure tcds using interface EDMA_SubmitTransfer. + * + * @param handle eDMA handle pointer. + * @param tcdPool A memory pool to store TCDs. It must be 32 bytes aligned. + * @param tcdSize The number of TCD slots. + */ +void EDMA_InstallTCDMemory(edma_handle_t *handle, edma_tcd_t *tcdPool, uint32_t tcdSize); + +/*! + * @brief Installs a callback function for the eDMA transfer. + * + * This callback is called in the eDMA IRQ handler. Use the callback to do something after + * the current major loop transfer completes. This function will be called every time one tcd finished transfer. + * + * @param handle eDMA handle pointer. + * @param callback eDMA callback function pointer. + * @param userData A parameter for the callback function. + */ +void EDMA_SetCallback(edma_handle_t *handle, edma_callback callback, void *userData); + +/*! + * @brief Prepares the eDMA transfer structure configurations. + * + * This function prepares the transfer configuration structure according to the user input. + * + * @param config The user configuration structure of type edma_transfer_t. + * @param srcAddr eDMA transfer source address. + * @param srcWidth eDMA transfer source address width(bytes). + * @param srcOffset source address offset. + * @param destAddr eDMA transfer destination address. + * @param destWidth eDMA transfer destination address width(bytes). + * @param destOffset destination address offset. + * @param bytesEachRequest eDMA transfer bytes per channel request. + * @param transferBytes eDMA transfer bytes to be transferred. + * @note The data address and the data width must be consistent. For example, if the SRC + * is 4 bytes, the source address must be 4 bytes aligned, or it results in + * source address error (SAE). + * User can check if 128 bytes support is available for specific instance by + * FSL_FEATURE_EDMA_INSTANCE_SUPPORT_128_BYTES_TRANSFERn. + */ +void EDMA_PrepareTransferConfig(edma_transfer_config_t *config, + void *srcAddr, + uint32_t srcWidth, + int16_t srcOffset, + void *destAddr, + uint32_t destWidth, + int16_t destOffset, + uint32_t bytesEachRequest, + uint32_t transferBytes); + +/*! + * @brief Prepares the eDMA transfer structure. + * + * This function prepares the transfer configuration structure according to the user input. + * + * @param config The user configuration structure of type edma_transfer_t. + * @param srcAddr eDMA transfer source address. + * @param srcWidth eDMA transfer source address width(bytes). + * @param destAddr eDMA transfer destination address. + * @param destWidth eDMA transfer destination address width(bytes). + * @param bytesEachRequest eDMA transfer bytes per channel request. + * @param transferBytes eDMA transfer bytes to be transferred. + * @param type eDMA transfer type. + * @note The data address and the data width must be consistent. For example, if the SRC + * is 4 bytes, the source address must be 4 bytes aligned, or it results in + * source address error (SAE). + */ +void EDMA_PrepareTransfer(edma_transfer_config_t *config, + void *srcAddr, + uint32_t srcWidth, + void *destAddr, + uint32_t destWidth, + uint32_t bytesEachRequest, + uint32_t transferBytes, + edma_transfer_type_t type); + +/*! + * @brief Prepares the eDMA transfer content descriptor. + * + * This function prepares the transfer content descriptor structure according to the user input. + * + * @param handle eDMA handle pointer. + * @param tcd Pointer to eDMA transfer content descriptor structure. + * @param srcAddr eDMA transfer source address. + * @param srcWidth eDMA transfer source address width(bytes). + * @param srcOffset source address offset. + * @param destAddr eDMA transfer destination address. + * @param destWidth eDMA transfer destination address width(bytes). + * @param destOffset destination address offset. + * @param bytesEachRequest eDMA transfer bytes per channel request. + * @param transferBytes eDMA transfer bytes to be transferred. + * @param nextTcd eDMA transfer linked TCD address. + * + * @note The data address and the data width must be consistent. For example, if the SRC + * is 4 bytes, the source address must be 4 bytes aligned, or it results in + * source address error (SAE). + */ +void EDMA_PrepareTransferTCD(edma_handle_t *handle, + edma_tcd_t *tcd, + void *srcAddr, + uint32_t srcWidth, + int16_t srcOffset, + void *destAddr, + uint32_t destWidth, + int16_t destOffset, + uint32_t bytesEachRequest, + uint32_t transferBytes, + edma_tcd_t *nextTcd); + +/*! + * @brief Submits the eDMA transfer content descriptor. + * + * This function submits the eDMA transfer request according to the transfer content descriptor. + * In scatter gather mode, call this function will add a configured tcd to the circular list of tcd pool. + * The tcd pools is setup by call function EDMA_InstallTCDMemory before. + * + * Typical user case: + * 1. submit single transfer + * @code + * edma_tcd_t tcd; + * EDMA_PrepareTransferTCD(handle, tcd, ....) + * EDMA_SubmitTransferTCD(handle, tcd) + * EDMA_StartTransfer(handle) + * @endcode + * + * 2. submit static link transfer, + * @code + * edma_tcd_t tcd[2]; + * EDMA_PrepareTransferTCD(handle, &tcd[0], ....) + * EDMA_PrepareTransferTCD(handle, &tcd[1], ....) + * EDMA_SubmitTransferTCD(handle, &tcd[0]) + * EDMA_StartTransfer(handle) + * @endcode + * + * 3. submit dynamic link transfer + * @code + * edma_tcd_t tcdpool[2]; + * EDMA_InstallTCDMemory(&g_DMA_Handle, tcdpool, 2); + * edma_tcd_t tcd; + * EDMA_PrepareTransferTCD(handle, tcd, ....) + * EDMA_SubmitTransferTCD(handle, tcd) + * EDMA_PrepareTransferTCD(handle, tcd, ....) + * EDMA_SubmitTransferTCD(handle, tcd) + * EDMA_StartTransfer(handle) + * @endcode + * + * 4. submit loop transfer + * @code + * edma_tcd_t tcd[2]; + * EDMA_PrepareTransferTCD(handle, &tcd[0], ...,&tcd[1]) + * EDMA_PrepareTransferTCD(handle, &tcd[1], ..., &tcd[0]) + * EDMA_SubmitTransferTCD(handle, &tcd[0]) + * EDMA_StartTransfer(handle) + * @endcode + * + * @param handle eDMA handle pointer. + * @param tcd Pointer to eDMA transfer content descriptor structure. + * + * @retval kStatus_EDMA_Success It means submit transfer request succeed. + * @retval kStatus_EDMA_QueueFull It means TCD queue is full. Submit transfer request is not allowed. + * @retval kStatus_EDMA_Busy It means the given channel is busy, need to submit request later. + */ +status_t EDMA_SubmitTransferTCD(edma_handle_t *handle, edma_tcd_t *tcd); + +/*! + * @brief Submits the eDMA transfer request. + * + * This function submits the eDMA transfer request according to the transfer configuration structure. + * In scatter gather mode, call this function will add a configured tcd to the circular list of tcd pool. + * The tcd pools is setup by call function EDMA_InstallTCDMemory before. + * + * @param handle eDMA handle pointer. + * @param config Pointer to eDMA transfer configuration structure. + * @retval kStatus_EDMA_Success It means submit transfer request succeed. + * @retval kStatus_EDMA_QueueFull It means TCD queue is full. Submit transfer request is not allowed. + * @retval kStatus_EDMA_Busy It means the given channel is busy, need to submit request later. + */ +status_t EDMA_SubmitTransfer(edma_handle_t *handle, const edma_transfer_config_t *config); + +/*! + * @brief Submits the eDMA scatter gather transfer configurations. + * + * The function is target for submit loop transfer request, + * the ring transfer request means that the transfer request TAIL is link to HEAD, such as, + * A->B->C->D->A, or A->A + * + * To use the ring transfer feature, the application should allocate several transfer object, such as + * @code + * edma_channel_transfer_config_t transfer[2]; + * EDMA_TransferSubmitLoopTransfer(psHandle, &transfer, 2U); + * @endcode + * Then eDMA driver will link transfer[0] and transfer[1] to each other + * + * @note Application should check the return value of this function to avoid transfer request + * submit failed + * + * @param handle eDMA handle pointer + * @param transfer pointer to user's eDMA channel configure structure, see edma_channel_transfer_config_t for detail + * @param transferLoopCount the count of the transfer ring, if loop count is 1, that means that the one will link to + * itself. + * + * @retval #kStatus_Success It means submit transfer request succeed + * @retval #kStatus_EDMA_Busy channel is in busy status + * @retval #kStatus_InvalidArgument Invalid Argument + */ +status_t EDMA_SubmitLoopTransfer(edma_handle_t *handle, edma_transfer_config_t *transfer, uint32_t transferLoopCount); + +/*! + * @brief eDMA starts transfer. + * + * This function enables the channel request. Users can call this function after submitting the transfer request + * or before submitting the transfer request. + * + * @param handle eDMA handle pointer. + */ +void EDMA_StartTransfer(edma_handle_t *handle); + +/*! + * @brief eDMA stops transfer. + * + * This function disables the channel request to pause the transfer. Users can call EDMA_StartTransfer() + * again to resume the transfer. + * + * @param handle eDMA handle pointer. + */ +void EDMA_StopTransfer(edma_handle_t *handle); + +/*! + * @brief eDMA aborts transfer. + * + * This function disables the channel request and clear transfer status bits. + * Users can submit another transfer after calling this API. + * + * @param handle DMA handle pointer. + */ +void EDMA_AbortTransfer(edma_handle_t *handle); + +/*! + * @brief Get unused TCD slot number. + * + * This function gets current tcd index which is run. If the TCD pool pointer is NULL, it will return 0. + * + * @param handle DMA handle pointer. + * @return The unused tcd slot number. + */ +static inline uint32_t EDMA_GetUnusedTCDNumber(edma_handle_t *handle) +{ + int8_t tmpTcdSize = handle->tcdSize; + int8_t tmpTcdUsed = handle->tcdUsed; + return ((uint32_t)tmpTcdSize - (uint32_t)tmpTcdUsed); +} + +/*! + * @brief Get the next tcd address. + * + * This function gets the next tcd address. If this is last TCD, return 0. + * + * @param handle DMA handle pointer. + * @return The next TCD address. + */ +static inline uint32_t EDMA_GetNextTCDAddress(edma_handle_t *handle) +{ + return (uint32_t)(EDMA_TCD_DLAST_SGA(handle->tcdBase, EDMA_TCD_TYPE(handle->base))); +} + +/*! + * @brief eDMA IRQ handler for the current major loop transfer completion. + * + * This function clears the channel major interrupt flag and calls + * the callback function if it is not NULL. + * + * Note: + * For the case using TCD queue, when the major iteration count is exhausted, additional operations are performed. + * These include the final address adjustments and reloading of the BITER field into the CITER. + * Assertion of an optional interrupt request also occurs at this time, as does a possible fetch of a new TCD from + * memory using the scatter/gather address pointer included in the descriptor (if scatter/gather is enabled). + * + * For instance, when the time interrupt of TCD[0] happens, the TCD[1] has already been loaded into the eDMA engine. + * As sga and sga_index are calculated based on the DLAST_SGA bitfield lies in the TCD_CSR register, the sga_index + * in this case should be 2 (DLAST_SGA of TCD[1] stores the address of TCD[2]). Thus, the "tcdUsed" updated should be + * (tcdUsed - 2U) which indicates the number of TCDs can be loaded in the memory pool (because TCD[0] and TCD[1] have + * been loaded into the eDMA engine at this point already.). + * + * For the last two continuous ISRs in a scatter/gather process, they both load the last TCD (The last ISR does not + * load a new TCD) from the memory pool to the eDMA engine when major loop completes. + * Therefore, ensure that the header and tcdUsed updated are identical for them. + * tcdUsed are both 0 in this case as no TCD to be loaded. + * + * See the "eDMA basic data flow" in the eDMA Functional description section of the Reference Manual for + * further details. + * + * @param handle eDMA handle pointer. + */ +void EDMA_HandleIRQ(edma_handle_t *handle); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @} */ + +#endif /*FSL_EDMA_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_core.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_core.h new file mode 100644 index 00000000000..482f4e19883 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_core.h @@ -0,0 +1,357 @@ +/* + * Copyright 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_EDMA_CORE_H_ +#define FSL_EDMA_CORE_H_ + +#include "fsl_edma_soc.h" + +/*! + * @addtogroup edma_core + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DMA_CSR_INTMAJOR_MASK (0x2U) +#define DMA_CSR_INTHALF_MASK (0x4U) +#define DMA_CSR_DREQ_MASK (0x8U) +#define DMA_CSR_ESG_MASK (0x10U) +#define DMA_CSR_BWC_MASK (0xC000U) +#define DMA_CSR_BWC(x) (((uint16_t)(((uint16_t)(x)) << (14U))) & (0xC000U)) +#define DMA_CSR_START_MASK (0x1U) +#define DMA_CITER_ELINKNO_CITER_MASK (0x7FFFU) +#define DMA_BITER_ELINKNO_BITER_MASK (0x7FFFU) +#define DMA_CITER_ELINKNO_CITER_SHIFT (0U) +#define DMA_CITER_ELINKYES_CITER_MASK (0x1FFU) +#define DMA_CITER_ELINKYES_CITER_SHIFT (0U) +#define DMA_ATTR_SMOD_MASK (0xF800U) +#define DMA_ATTR_DMOD_MASK (0xF8U) +#define DMA_CITER_ELINKNO_ELINK_MASK (0x8000U) +#define DMA_CSR_MAJORELINK_MASK (0x20U) +#define DMA_BITER_ELINKYES_ELINK_MASK (0x8000U) +#define DMA_CITER_ELINKYES_ELINK_MASK (0x8000U) +#define DMA_CSR_MAJORLINKCH_MASK (0x1F00U) +#define DMA_BITER_ELINKYES_LINKCH_MASK (0x3E00U) +#define DMA_CITER_ELINKYES_LINKCH_MASK (0x3E00U) +#define DMA_NBYTES_MLOFFYES_MLOFF_MASK (0x3FFFFC00U) +#define DMA_NBYTES_MLOFFYES_DMLOE_MASK (0x40000000U) +#define DMA_NBYTES_MLOFFYES_SMLOE_MASK (0x80000000U) +#define DMA_NBYTES_MLOFFNO_NBYTES_MASK (0x3FFFFFFFU) +#define DMA_ATTR_DMOD(x) (((uint16_t)(((uint16_t)(x)) << (3U))) & (0xF8U)) +#define DMA_ATTR_SMOD(x) (((uint16_t)(((uint16_t)(x)) << (11U))) & (0xF800U)) +#define DMA_BITER_ELINKYES_LINKCH(x) (((uint16_t)(((uint16_t)(x)) << (9U))) & (0x3E00U)) +#define DMA_CITER_ELINKYES_LINKCH(x) (((uint16_t)(((uint16_t)(x)) << (9U))) & (0x3E00U)) +#define DMA_NBYTES_MLOFFYES_MLOFF(x) (((uint32_t)(((uint32_t)(x)) << (10U))) & (0x3FFFFC00U)) +#define DMA_NBYTES_MLOFFYES_DMLOE(x) (((uint32_t)(((uint32_t)(x)) << (30U))) & (0x40000000U)) +#define DMA_NBYTES_MLOFFYES_SMLOE(x) (((uint32_t)(((uint32_t)(x)) << (31U))) & (0x80000000U)) +#define DMA_NBYTES_MLOFFNO_NBYTES(x) (((uint32_t)(((uint32_t)(x)) << (0U))) & (0x3FFFFFFFU)) +#define DMA_NBYTES_MLOFFYES_NBYTES(x) (((uint32_t)(((uint32_t)(x)) << (0U))) & (0x3FFU)) +#define DMA_ATTR_DSIZE(x) (((uint16_t)(((uint16_t)(x)) << (0U))) & (0x7U)) +#define DMA_ATTR_SSIZE(x) (((uint16_t)(((uint16_t)(x)) << (8U))) & (0x700U)) +#define DMA_CSR_DREQ(x) (((uint16_t)(((uint16_t)(x)) << (3U))) & (0x8U)) +#define DMA_CSR_MAJORLINKCH(x) (((uint16_t)(((uint16_t)(x)) << (8U))) & (0x1F00U)) +#define DMA_CH_MATTR_WCACHE(x) (((uint16_t)(((uint16_t)(x)) << (4U))) & (0xF0U)) +#define DMA_CH_MATTR_RCACHE(x) (((uint16_t)(((uint16_t)(x)) << (0U))) & (0xFU)) +#define DMA_CH_CSR_SIGNEXT_MASK (0x3F0000U) +#define DMA_CH_CSR_SIGNEXT_SHIFT (16U) +#define DMA_CH_CSR_SWAP_MASK (0xF000U) +#define DMA_CH_CSR_SWAP_SHIFT (12U) +#define DMA_CH_SBR_INSTR_MASK (0x2000U) +#define DMA_CH_SBR_INSTR_SHIFT (13U) +#define DMA_CH_MUX_SOURCE(x) (((uint32_t)(((uint32_t)(x)) << (0U))) & (0xFFU)) + +/*! @brief DMA error flag */ +#if defined(FSL_EDMA_SOC_IP_EDMA) && FSL_EDMA_SOC_IP_EDMA +#define DMA_ERR_DBE_FLAG DMA_ES_DBE_MASK +#define DMA_ERR_SBE_FLAG DMA_ES_SBE_MASK +#define DMA_ERR_SGE_FLAG DMA_ES_SGE_MASK +#define DMA_ERR_NCE_FLAG DMA_ES_NCE_MASK +#define DMA_ERR_DOE_FLAG DMA_ES_DOE_MASK +#define DMA_ERR_DAE_FLAG DMA_ES_DAE_MASK +#define DMA_ERR_SOE_FLAG DMA_ES_SOE_MASK +#define DMA_ERR_SAE_FLAG DMA_ES_SAE_MASK +#define DMA_ERR_ERRCHAN_FLAG DMA_ES_ERRCHN_MASK +#define DMA_ERR_CPE_FLAG DMA_ES_CPE_MASK +#define DMA_ERR_ECX_FLAG DMA_ES_ECX_MASK +#if defined(FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT) && (FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT > 1) +#define DMA_ERR_GPE_FLAG DMA_ES_GPE_MASK +#endif +#define DMA_ERR_FLAG DMA_ES_VLD_MASK + +/*! @brief get/clear DONE status*/ +#define DMA_CLEAR_DONE_STATUS(base, channel) (EDMA_BASE(base)->CDNE = (uint8_t)channel) +#define DMA_GET_DONE_STATUS(base, channel) \ + ((EDMA_TCD_BASE(base, channel)->CSR & DMA_CSR_DONE_MASK) >> DMA_CSR_DONE_SHIFT) +/*! @brief enable/disable error interrupt*/ +#define DMA_ENABLE_ERROR_INT(base, channel) (base->EEI |= ((uint32_t)0x1U << channel)) +#define DMA_DISABLE_ERROR_INT(base, channel) (base->EEI &= (~((uint32_t)0x1U << channel))) +/*! @brief get/clear error status*/ +#define DMA_GET_ERROR_STATUS(base, channel) (((uint32_t)EDMA_BASE(base)->ERR >> channel) & 0x1U) +#define DMA_CLEAR_ERROR_STATUS(base, channel) ((uint32_t)EDMA_BASE(base)->CERR = (uint8_t)channel) +/*! @brief get/clear int status*/ +#define DMA_GET_INT_STATUS(base, channel) ((((uint32_t)EDMA_BASE(base)->INT >> channel) & 0x1U)) +#define DMA_CLEAR_INT_STATUS(base, channel) ((uint32_t)EDMA_BASE(base)->CINT = (uint8_t)channel) + +#else + +#define DMA_ERR_DBE_FLAG DMA_MP_ES_DBE_MASK +#define DMA_ERR_SBE_FLAG DMA_MP_ES_SBE_MASK +#define DMA_ERR_SGE_FLAG DMA_MP_ES_SGE_MASK +#define DMA_ERR_NCE_FLAG DMA_MP_ES_NCE_MASK +#define DMA_ERR_DOE_FLAG DMA_MP_ES_DOE_MASK +#define DMA_ERR_DAE_FLAG DMA_MP_ES_DAE_MASK +#define DMA_ERR_SOE_FLAG DMA_MP_ES_SOE_MASK +#define DMA_ERR_SAE_FLAG DMA_MP_ES_SAE_MASK +#define DMA_ERR_ERRCHAN_FLAG DMA_MP_ES_ERRCHN_MASK +#define DMA_ERR_ECX_FLAG DMA_MP_ES_ECX_MASK +#define DMA_ERR_FLAG DMA_MP_ES_VLD_MASK + +/*! @brief get/clear DONE bit*/ +#define DMA_CLEAR_DONE_STATUS(base, channel) (EDMA_CHANNEL_BASE(base, channel)->CH_CSR |= DMA_CH_CSR_DONE_MASK) +#define DMA_GET_DONE_STATUS(base, channel) \ + ((EDMA_CHANNEL_BASE(base, channel)->CH_CSR & DMA_CH_CSR_DONE_MASK) >> DMA_CH_CSR_DONE_SHIFT) +/*! @brief enable/disable error interupt*/ +#define DMA_ENABLE_ERROR_INT(base, channel) (EDMA_CHANNEL_BASE(base, channel)->CH_CSR |= DMA_CH_CSR_EEI_MASK) +#define DMA_DISABLE_ERROR_INT(base, channel) (EDMA_CHANNEL_BASE(base, channel)->CH_CSR &= ~DMA_CH_CSR_EEI_MASK) +/*! @brief get/clear error status*/ +#define DMA_CLEAR_ERROR_STATUS(base, channel) (EDMA_CHANNEL_BASE(base, channel)->CH_ES |= DMA_CH_ES_ERR_MASK) +#define DMA_GET_ERROR_STATUS(base, channel) \ + (((uint32_t)EDMA_CHANNEL_BASE(base, channel)->CH_ES >> DMA_CH_ES_ERR_SHIFT) & 0x1U) +/*! @brief get/clear INT status*/ +#define DMA_CLEAR_INT_STATUS(base, channel) (EDMA_CHANNEL_BASE(base, channel)->CH_INT = DMA_CH_INT_INT_MASK) +#define DMA_GET_INT_STATUS(base, channel) ((((uint32_t)EDMA_CHANNEL_BASE(base, channel)->CH_INT) & 0x1U)) +#endif /*FSL_EDMA_SOC_IP_EDMA*/ + +/*! @brief enable/dsiable MAJOR/HALF INT*/ +#define DMA_ENABLE_MAJOR_INT(base, channel) \ + (EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) |= DMA_CSR_INTMAJOR_MASK) +#define DMA_ENABLE_HALF_INT(base, channel) \ + (EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) |= DMA_CSR_INTHALF_MASK) +#define DMA_DISABLE_MAJOR_INT(base, channel) \ + (EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_INTMAJOR_MASK) +#define DMA_DISABLE_HALF_INT(base, channel) \ + (EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_INTHALF_MASK) + +/*!@brief EDMA tcd align size */ +#define EDMA_TCD_ALIGN_SIZE (32U) + +/*!@brief edma core channel struture definition */ +typedef struct _edma_core_mp +{ + __IO uint32_t MP_CSR; /**< Channel Control and Status, array offset: 0x10000, array step: 0x10000 */ + __IO uint32_t MP_ES; /**< Channel Error Status, array offset: 0x10004, array step: 0x10000 */ + union + { + struct + { + __IO uint32_t MP_INT_LOW; /**< Channel Control and Status, array offset: 0x10008, array step: 0x10000 */ + __I uint32_t MP_INT_HIGH; /**< Channel Control and Status, array offset: 0x1000C, array step: 0x10000 */ + __I uint32_t MP_HRS_LOW; /**< Channel Control and Status, array offset: 0x10010, array step: 0x10000 */ + __I uint32_t MP_HRS_HIGH; /**< Channel Control and Status, array offset: 0x10014, array step: 0x10000 */ + uint8_t RESERVED_0[8]; + __IO uint32_t MP_STOPCH; /**< Channel Control and Status, array offset: 0x10020, array step: 0x10000 */ + uint8_t RESERVED_1[12]; + __I uint32_t MP_SSR_LOW; /**< Channel Control and Status, array offset: 0x10030, array step: 0x10000 */ + __I uint32_t MP_SSR_HIGH; /**< Channel Control and Status, array offset: 0x10034, array step: 0x10000 */ + uint8_t RESERVED_2[200]; + __IO uint32_t CH_GRPRI[64]; /**< Channel Control and Status, array offset: 0x10100, array step: 0x10000 */ + __IO uint32_t CH_MUX[64]; /**< Channel Control and Status, array offset: 0x10200, array step: 0x10000 */ + uint8_t RESERVED_3[256]; + __IO uint32_t CH_PROT[64]; /**< Channel Control and Status, array offset: 0x10400, array step: 0x10000 */ + } EDMA5_REG; + } MP_REGS; +} edma_core_mp_t; + +/*!@brief edma core channel struture definition */ +typedef struct _edma_core_channel +{ + __IO uint32_t CH_CSR; /**< Channel Control and Status, array offset: 0x10000, array step: 0x10000 */ + __IO uint32_t CH_ES; /**< Channel Error Status, array offset: 0x10004, array step: 0x10000 */ + __IO uint32_t CH_INT; /**< Channel Interrupt Status, array offset: 0x10008, array step: 0x10000 */ + __IO uint32_t CH_SBR; /**< Channel System Bus, array offset: 0x1000C, array step: 0x10000 */ + __IO uint32_t CH_PRI; /**< Channel Priority, array offset: 0x10010, array step: 0x10000 */ + union + { + struct + { + __IO uint8_t RESERVED_1[4]; + __IO uint32_t CH_MATTR; /**< Memory Attributes Register, array offset: 0x10018, array step: 0x8000 */ + } EDMA5_REG; + struct + { + __IO uint32_t CH_MUX; /**< Channel Multiplexor Configuration, array offset: 0x10014, array step: 0x10000 */ + __IO uint16_t CH_MATTR; /**< Memory Attributes Register, array offset: 0x10018, array step: 0x8000 */ + } EDMA4_REG; + } CH_REGS; +} edma_core_channel_t; + +/*! @brief eDMA tcd flag type */ +typedef enum _edma_tcd_type +{ + kEDMA_EDMA4Flag = 0x0U, /*!< Data access for eDMA4 transfers. */ + kEDMA_EDMA5Flag = 0x1U, /*!< Instruction access for eDMA4 transfers. */ +} edma_tcd_type_t; + +/*!@brief edma5 core TCD struture definition */ +typedef struct _edma5_core_tcd +{ + __IO uint32_t SADDR; /*!< SADDR register, used to save source address */ + __IO uint32_t SADDR_HIGH; /*!< SADDR HIGH register, used to save source address */ + __IO uint16_t SOFF; /*!< SOFF register, save offset bytes every transfer */ + __IO uint16_t ATTR; /*!< ATTR register, source/destination transfer size and modulo */ + __IO uint32_t NBYTES; /*!< Nbytes register, minor loop length in bytes */ + __IO uint32_t SLAST; /*!< SLAST register */ + __IO uint32_t SLAST_SDA_HIGH; /*!< SLAST SDA HIGH register */ + __IO uint32_t DADDR; /*!< DADDR register, used for destination address */ + __IO uint32_t DADDR_HIGH; /*!< DADDR HIGH register, used for destination address */ + __IO uint32_t DLAST_SGA; /*!< DLASTSGA register, next tcd address used in scatter-gather mode */ + __IO uint32_t DLAST_SGA_HIGH; /*!< DLASTSGA HIGH register, next tcd address used in scatter-gather mode */ + __IO uint16_t DOFF; /*!< DOFF register, used for destination offset */ + __IO uint16_t CITER; /*!< CITER register, current minor loop numbers, for unfinished minor loop.*/ + __IO uint16_t CSR; /*!< CSR register, for TCD control status */ + __IO uint16_t BITER; /*!< BITER register, begin minor loop count. */ + uint8_t RESERVED[16]; /*!< Aligned 64 bytes */ +} edma5_core_tcd_t; + +/*!@brief edma4 core TCD struture definition */ +typedef struct _edma4_core_tcd +{ + __IO uint32_t SADDR; /*!< SADDR register, used to save source address */ + __IO uint16_t SOFF; /*!< SOFF register, save offset bytes every transfer */ + __IO uint16_t ATTR; /*!< ATTR register, source/destination transfer size and modulo */ + __IO uint32_t NBYTES; /*!< Nbytes register, minor loop length in bytes */ + __IO uint32_t SLAST; /*!< SLAST register */ + __IO uint32_t DADDR; /*!< DADDR register, used for destination address */ + __IO uint16_t DOFF; /*!< DOFF register, used for destination offset */ + __IO uint16_t CITER; /*!< CITER register, current minor loop numbers, for unfinished minor loop.*/ + __IO uint32_t DLAST_SGA; /*!< DLASTSGA register, next tcd address used in scatter-gather mode */ + __IO uint16_t CSR; /*!< CSR register, for TCD control status */ + __IO uint16_t BITER; /*!< BITER register, begin minor loop count. */ +} edma4_core_tcd_t; + +/*!@brief edma core TCD struture definition */ +typedef struct _edma_core_tcd +{ + union + { + edma4_core_tcd_t edma4_tcd; +#if defined FSL_EDMA_SOC_IP_DMA5 && FSL_EDMA_SOC_IP_DMA5 + edma5_core_tcd_t edma5_tcd; +#endif /* FSL_EDMA_SOC_IP_DMA5 */ + } TCD_REGS; +} edma_core_tcd_t; + +/*!@brief EDMA typedef */ +typedef edma_core_channel_t EDMA_ChannelType; +typedef edma_core_tcd_t EDMA_TCDType; +typedef void EDMA_Type; + +/*!@brief EDMA base address convert macro */ +#define EDMA_BASE(base) +#define EDMA_CHANNEL_BASE(base, channel) \ + ((edma_core_channel_t *)((uint32_t)(uint32_t *)(base) + EDMA_CHANNEL_OFFSET + \ + (channel)*EDMA_CHANNEL_ARRAY_STEP(base))) +#define EDMA_TCD_BASE(base, channel) \ + ((edma_core_tcd_t *)((uint32_t)(uint32_t *)(base) + EDMA_CHANNEL_OFFSET + \ + (channel)*EDMA_CHANNEL_ARRAY_STEP(base) + 0x20U)) +#define EDMA_MP_BASE(base) ((edma_core_mp_t *)((uint32_t)(uint32_t *)(base))) + +/*!@brief EDMA TCD type macro */ +#if defined FSL_FEATURE_EDMA_TCD_TYPEn +#define EDMA_TCD_TYPE(x) FSL_FEATURE_EDMA_TCD_TYPEn(x) +#else +#define EDMA_TCD_TYPE(x) (0) +#endif + +#if defined FSL_EDMA_SOC_IP_DMA5 && FSL_EDMA_SOC_IP_DMA5 +/*!@brief EDMA TCD address convert macro */ +#define EDMA_TCD_SADDR(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SADDR)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->SADDR)))) + +#define EDMA_TCD_SOFF(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SOFF)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->SOFF)))) + +#define EDMA_TCD_ATTR(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->ATTR)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->ATTR)))) + +#define EDMA_TCD_NBYTES(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->NBYTES)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->NBYTES)))) + +#define EDMA_TCD_SLAST(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SLAST)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->SLAST)))) + +#define EDMA_TCD_DADDR(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DADDR)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->DADDR)))) + +#define EDMA_TCD_DOFF(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DOFF)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->DOFF)))) + +#define EDMA_TCD_CITER(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->CITER)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->CITER)))) + +#define EDMA_TCD_DLAST_SGA(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? \ + (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DLAST_SGA)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->DLAST_SGA)))) + +#define EDMA_TCD_CSR(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->CSR)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->CSR)))) + +#define EDMA_TCD_BITER(tcd, flag) \ + (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->BITER)) : \ + (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->BITER)))) +#else +/*!@brief EDMA TCD address convert macro */ +#define EDMA_TCD_SADDR(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SADDR) + +#define EDMA_TCD_SOFF(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SOFF) + +#define EDMA_TCD_ATTR(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->ATTR) + +#define EDMA_TCD_NBYTES(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->NBYTES) + +#define EDMA_TCD_SLAST(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SLAST) + +#define EDMA_TCD_DADDR(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DADDR) + +#define EDMA_TCD_DOFF(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DOFF) + +#define EDMA_TCD_CITER(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->CITER) + +#define EDMA_TCD_DLAST_SGA(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DLAST_SGA) + +#define EDMA_TCD_CSR(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->CSR) + +#define EDMA_TCD_BITER(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->BITER) +#endif /* FSL_EDMA_SOC_IP_DMA5 */ +/******************************************************************************* + * API + ******************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +/*! + * @} + */ + +#endif /* FSL_EDMA_CORE_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_soc.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_soc.c new file mode 100644 index 00000000000..f32c9e0e1b4 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_soc.c @@ -0,0 +1,112 @@ +/* + * Copyright 2022 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_edma_soc.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.edma_soc" +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +extern void DMA_CH0_DriverIRQHandler(void); +extern void DMA_CH1_DriverIRQHandler(void); +extern void DMA_CH2_DriverIRQHandler(void); +extern void DMA_CH3_DriverIRQHandler(void); +extern void DMA_CH4_DriverIRQHandler(void); +extern void DMA_CH5_DriverIRQHandler(void); +extern void DMA_CH6_DriverIRQHandler(void); +extern void DMA_CH7_DriverIRQHandler(void); +extern void EDMA_DriverIRQHandler(uint32_t instance, uint32_t channel); +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * brief DMA instance 0, channel 0 IRQ handler. + * + */ +void DMA_CH0_DriverIRQHandler(void) +{ + /* Instance 0 channel 0 */ + EDMA_DriverIRQHandler(0U, 0U); +} + +/*! + * brief DMA instance 0, channel 1 IRQ handler. + * + */ +void DMA_CH1_DriverIRQHandler(void) +{ + /* Instance 0 channel 1 */ + EDMA_DriverIRQHandler(0U, 1U); +} + +/*! + * brief DMA instance 0, channel 2 IRQ handler. + * + */ +void DMA_CH2_DriverIRQHandler(void) +{ + /* Instance 0 channel 2 */ + EDMA_DriverIRQHandler(0U, 2U); +} + +/*! + * brief DMA instance 0, channel 3 IRQ handler. + * + */ +void DMA_CH3_DriverIRQHandler(void) +{ + /* Instance 0 channel 3 */ + EDMA_DriverIRQHandler(0U, 3U); +} + +/*! + * brief DMA instance 0, channel 4 IRQ handler. + * + */ +void DMA_CH4_DriverIRQHandler(void) +{ + /* Instance 0 channel 4 */ + EDMA_DriverIRQHandler(0U, 4U); +} +/*! + * brief DMA instance 0, channel 5 IRQ handler. + * + */ +void DMA_CH5_DriverIRQHandler(void) +{ + /* Instance 0 channel 5 */ + EDMA_DriverIRQHandler(0U, 5U); +} + +/*! + * brief DMA instance 0, channel 6 IRQ handler. + * + */ +void DMA_CH6_DriverIRQHandler(void) +{ + /* Instance 0 channel 6 */ + EDMA_DriverIRQHandler(0U, 6U); +} + +/*! + * brief DMA instance 0, channel 7 IRQ handler. + * + */ +void DMA_CH7_DriverIRQHandler(void) +{ + /* Instance 0 channel 7 */ + EDMA_DriverIRQHandler(0U, 7U); +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_soc.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_soc.h new file mode 100644 index 00000000000..7090fdc6f5c --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_edma_soc.h @@ -0,0 +1,64 @@ +/* + * Copyright 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_EDMA_SOC_H_ +#define _FSL_EDMA_SOC_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup edma_soc + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @name Driver version */ +/*@{*/ +/*! @brief Driver version 2.0.0. */ +#define FSL_EDMA_SOC_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) +/*@}*/ + +/*!@brief DMA IP version */ +#define FSL_EDMA_SOC_IP_DMA3 (1) +#define FSL_EDMA_SOC_IP_DMA4 (0) + +/*!@brief DMA base table */ +#define EDMA_BASE_PTRS \ + { \ + DMA0 \ + } + +#define EDMA_CHN_IRQS \ + { \ + { \ + DMA_CH0_IRQn, DMA_CH1_IRQn, DMA_CH2_IRQn, DMA_CH3_IRQn, DMA_CH4_IRQn, DMA_CH5_IRQn, DMA_CH6_IRQn, \ + DMA_CH7_IRQn \ + } \ + } + +/*!@brief EDMA base address convert macro */ +#define EDMA_CHANNEL_OFFSET 0x1000U +#define EDMA_CHANNEL_ARRAY_STEP(base) (0x1000U) + +/******************************************************************************* + * API + ******************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +/*! + * @} + */ + +#endif /* _FSL_EDMA_SOC_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eim.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eim.c new file mode 100644 index 00000000000..bae11683f40 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eim.c @@ -0,0 +1,312 @@ +/* + * Copyright 2022 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_eim.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.eim" +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to EIM bases for each instance. */ +static EIM_Type *const s_eimBases[] = EIM_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to EIM clocks for each instance. */ +static const clock_ip_name_t s_eimClocks[] = EIM_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t EIM_GetInstance(EIM_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_eimBases); instance++) + { + if (s_eimBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_eimBases)); + + return instance; +} + +/*! + * brief EIM module initialization function. + * + * param base EIM base address. + */ +void EIM_Init(EIM_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate EIM clock. */ + CLOCK_EnableClock(s_eimClocks[EIM_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + base->EIMCR = 0x00U; + base->EICHEN = 0x00U; +} + +/*! + * brief Deinitializes the EIM. + * + */ +void EIM_Deinit(EIM_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate EIM clock. */ + CLOCK_DisableClock(s_eimClocks[EIM_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +void EIM_InjectCheckBitError(EIM_Type *base, eim_memory_channel_t channel, uint8_t mask) +{ + switch ((uint8_t)channel) + { + case 0U: + base->EICHD0_WORD0 = EIM_EICHD0_WORD0_CHKBIT_MASK(mask); + break; +#ifdef EIM_EICHEN_EICH1EN_MASK + case 1U: + base->EICHD1_WORD0 = EIM_EICHD1_WORD0_CHKBIT_MASK(mask); + break; +#endif + +#ifdef EIM_EICHEN_EICH2EN_MASK + case 2U: + base->EICHD2_WORD0 = EIM_EICHD2_WORD0_CHKBIT_MASK(mask); + break; +#endif +#ifdef EIM_EICHEN_EICH3EN_MASK + case 3U: + base->EICHD3_WORD0 = EIM_EICHD3_WORD0_CHKBIT_MASK(mask); + break; +#endif +#ifdef EIM_EICHEN_EICH4EN_MASK + case 4U: + base->EICHD4_WORD0 = EIM_EICHD4_WORD0_CHKBIT_MASK(mask); + break; +#endif +#ifdef EIM_EICHEN_EICH5EN_MASK + case 5U: + base->EICHD5_WORD0 = EIM_EICHD5_WORD0_CHKBIT_MASK(mask); + break; +#endif +#ifdef EIM_EICHEN_EICH6EN_MASK + case 6U: + base->EICHD6_WORD0 = EIM_EICHD6_WORD0_CHKBIT_MASK(mask); + break; +#endif +#ifdef EIM_EICHEN_EICH7EN_MASK + case 7U: + base->EICHD7_WORD0 = EIM_EICHD7_WORD0_CHKBIT_MASK(mask); + break; +#endif +#ifdef EIM_EICHEN_EICH8EN_MASK + case 8U: + base->EICHD8_WORD0 = EIM_EICHD8_WORD0_CHKBIT_MASK(mask); + break; +#endif + default: + assert(NULL); + break; + } +} + +uint8_t EIM_GetCheckBitMask(EIM_Type *base, eim_memory_channel_t channel) +{ + uint8_t mask = 0x00U; + + switch ((uint8_t)channel) + { + case 0U: + mask = (uint8_t)((base->EICHD0_WORD0 & EIM_EICHD0_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD0_WORD0_CHKBIT_MASK_SHIFT); + break; +#ifdef EIM_EICHEN_EICH1EN_MASK + case 1U: + mask = (uint8_t)((base->EICHD1_WORD0 & EIM_EICHD1_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD1_WORD0_CHKBIT_MASK_SHIFT); + break; +#endif +#ifdef EIM_EICHEN_EICH2EN_MASK + case 2U: + mask = (uint8_t)((base->EICHD2_WORD0 & EIM_EICHD2_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD2_WORD0_CHKBIT_MASK_SHIFT); + break; +#endif +#ifdef EIM_EICHEN_EICH3EN_MASK + case 3U: + mask = (uint8_t)((base->EICHD3_WORD0 & EIM_EICHD3_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD3_WORD0_CHKBIT_MASK_SHIFT); + break; +#endif +#ifdef EIM_EICHEN_EICH4EN_MASK + case 4U: + mask = (uint8_t)((base->EICHD4_WORD0 & EIM_EICHD4_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD4_WORD0_CHKBIT_MASK_SHIFT); + break; +#endif +#ifdef EIM_EICHEN_EICH5EN_MASK + case 5U: + mask = (uint8_t)((base->EICHD5_WORD0 & EIM_EICHD5_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD5_WORD0_CHKBIT_MASK_SHIFT); + break; +#endif +#ifdef EIM_EICHEN_EICH6EN_MASK + case 6U: + mask = (uint8_t)((base->EICHD6_WORD0 & EIM_EICHD6_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD6_WORD0_CHKBIT_MASK_SHIFT); + break; +#endif +#ifdef EIM_EICHEN_EICH7EN_MASK + case 7U: + mask = (uint8_t)((base->EICHD7_WORD0 & EIM_EICHD7_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD7_WORD0_CHKBIT_MASK_SHIFT); + break; +#endif +#ifdef EIM_EICHEN_EICH8EN_MASK + case 8U: + mask = (uint8_t)((base->EICHD8_WORD0 & EIM_EICHD8_WORD0_CHKBIT_MASK_MASK) >> + EIM_EICHD8_WORD0_CHKBIT_MASK_SHIFT); + break; +#endif + default: + assert(NULL); + break; + } + + return mask; +} + +void EIM_InjectDataBitError(EIM_Type *base, eim_memory_channel_t channel, uint8_t mask) +{ + switch ((uint8_t)channel) + { + case 0U: + base->EICHD0_WORD1 = mask; + break; +#ifdef EIM_EICHEN_EICH1EN_MASK + case 1U: + base->EICHD1_WORD1 = mask; + break; +#endif +#ifdef EIM_EICHEN_EICH2EN_MASK + case 2U: + base->EICHD2_WORD1 = mask; + break; +#endif +#ifdef EIM_EICHEN_EICH3EN_MASK + case kEIM_MemoryChannelRAMC: + base->EICHD3_WORD1 = mask; + break; +#endif +#ifdef EIM_EICHEN_EICH4EN_MASK + case kEIM_MemoryChannelRAMD: + base->EICHD4_WORD1 = mask; + break; +#endif +#ifdef EIM_EICHEN_EICH5EN_MASK + case kEIM_MemoryChannelRAME: + base->EICHD5_WORD1 = mask; + break; +#endif +#ifdef EIM_EICHEN_EICH6EN_MASK + case kEIM_MemoryChannelRAMF: + base->EICHD6_WORD1 = mask; + break; +#endif +#ifdef EIM_EICHEN_EICH7EN_MASK + case kEIM_MemoryChannelLPCACRAM: + base->EICHD7_WORD1 = mask; + break; +#endif +#ifdef EIM_EICHEN_EICH8EN_MASK + case kEIM_MemoryChannelPKCRAM: + base->EICHD8_WORD1 = mask; + break; +#endif + default: + assert(NULL); + break; + } +} + +uint32_t EIM_GetDataBitMask(EIM_Type *base, eim_memory_channel_t channel) +{ + uint32_t mask = 0x00U; + + switch ((uint8_t)channel) + { + case 0U: + mask = (base->EICHD0_WORD0 & EIM_EICHD0_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD0_WORD1_B0_3DATA_MASK_SHIFT; + break; + +#ifdef EIM_EICHEN_EICH1EN_MASK + case 1U: + mask = (base->EICHD1_WORD0 & EIM_EICHD1_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD1_WORD1_B0_3DATA_MASK_SHIFT; + break; +#endif +#ifdef EIM_EICHEN_EICH2EN_MASK + case 2U: + mask = (base->EICHD2_WORD0 & EIM_EICHD2_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD2_WORD1_B0_3DATA_MASK_SHIFT; + break; +#endif +#ifdef EIM_EICHEN_EICH3EN_MASK + case 3U: + mask = (base->EICHD3_WORD0 & EIM_EICHD3_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD3_WORD1_B0_3DATA_MASK_SHIFT; + break; +#endif +#ifdef EIM_EICHEN_EICH4EN_MASK + case 4U: + mask = (base->EICHD4_WORD0 & EIM_EICHD4_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD4_WORD1_B0_3DATA_MASK_SHIFT; + break; +#endif +#ifdef EIM_EICHEN_EICH5EN_MASK + case 5U: + mask = (base->EICHD5_WORD0 & EIM_EICHD5_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD5_WORD1_B0_3DATA_MASK_SHIFT; + break; +#endif +#ifdef EIM_EICHEN_EICH6EN_MASK + case 6U: + mask = (base->EICHD6_WORD0 & EIM_EICHD6_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD6_WORD1_B0_3DATA_MASK_SHIFT; + break; +#endif +#ifdef EIM_EICHEN_EICH7EN_MASK + case 7U: + mask = (base->EICHD7_WORD0 & EIM_EICHD7_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD7_WORD1_B0_3DATA_MASK_SHIFT; + break; +#endif +#ifdef EIM_EICHEN_EICH8EN_MASK + case 8U: + mask = (base->EICHD8_WORD1 & EIM_EICHD8_WORD1_B0_3DATA_MASK_MASK) >> EIM_EICHD8_WORD1_B0_3DATA_MASK_SHIFT; + break; +#endif + default: + assert(NULL); + break; + } + + return mask; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eim.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eim.h new file mode 100644 index 00000000000..799ff3f20a5 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eim.h @@ -0,0 +1,144 @@ +/* + * Copyright 2022 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_EIM_H_ +#define FSL_EIM_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup eim + * @{ + */ + +/****************************************************************************** + * Definitions. + *****************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief Driver version. */ +#define FSL_ERM_DRIVER_VERSION (MAKE_VERSION(2U, 0U, 1U)) +/*! @} */ + +/******************************************************************************* + * APIs + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief EIM module initialization function. + * + * @param base EIM base address. + */ +void EIM_Init(EIM_Type *base); + +/*! + * @brief De-initializes the EIM. + * + */ +void EIM_Deinit(EIM_Type *base); + +/*! @} */ + +/*! + * @name functional + * @{ + */ + +/*! + * @brief EIM module enable global error injection. + * + * @param base EIM base address. + * @param mask The interrupts to enable. + */ +static inline void EIM_EnableGlobalErrorInjection(EIM_Type *base, bool enable) +{ + if (enable) + { + base->EIMCR = EIM_EIMCR_GEIEN_MASK; + } + else + { + base->EIMCR = ~EIM_EIMCR_GEIEN_MASK; + } +} + +/*! + * @brief EIM module enable error injection for memory channel n, this function enables the corresponding error + * injection channel. The Global Error Injection Enable function must also be called to enable error injection. + * + * @param base EIM base address. + * @param mask The interrupts to enable. Refer to "_eim_error_injection_channel_enable" enumeration. + */ +static inline void EIM_EnableErrorInjectionChannels(EIM_Type *base, uint32_t mask) +{ + base->EICHEN |= mask; +} + +/*! + * @brief EIM module disable error injection for memory channel n. + * + * @param base EIM base address. + * @param mask The interrupts to enable. Refer to "_eim_error_injection_channel_enable" enumeration. + */ +static inline void EIM_DisableErrorInjectionChannels(EIM_Type *base, uint32_t mask) +{ + base->EICHEN &= ~mask; +} + +/*! + * @brief EIM module inject checkbit error for memory channel n, an attempt to invert more than 2 bits in one operation + * might result in undefined behavior. + * + * @param base EIM base address. + * @param channel memory channel. + * @param mask The interrupts to enable. + */ +void EIM_InjectCheckBitError(EIM_Type *base, eim_memory_channel_t channel, uint8_t mask); + +/*! + * @brief EIM module get checkbit mask for memory channel n. + * + * @param base EIM base address. + * @param channel memory channel. + * @retval return checkbit mask. + */ +uint8_t EIM_GetCheckBitMask(EIM_Type *base, eim_memory_channel_t channel); + +/*! + * @brief EIM module inject databit error for memory channel n, an attempt to invert more than 2 bits in one operation + * might result in undefined behavior. + * + * @param base EIM base address. + * @param channel memory channel. + * @param mask The interrupts to enable. + */ +void EIM_InjectDataBitError(EIM_Type *base, eim_memory_channel_t channel, uint8_t mask); + +/*! + * @brief EIM module get databit mask for memory channel n. + * + * @param base EIM base address. + * @param channel memory channel. + * @retval return checkbit mask. + */ +uint32_t EIM_GetDataBitMask(EIM_Type *base, eim_memory_channel_t channel); + +/*! @}*/ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eqdc.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eqdc.c new file mode 100644 index 00000000000..00f5fd8859b --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eqdc.c @@ -0,0 +1,301 @@ +/* + * Copyright 2022, 2023 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_eqdc.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.eqdc" +#endif + +#if defined(EQDC_RSTS) +#define EQDC_RESETS_ARRAY EQDC_RSTS +#endif +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Get instance number for EQDC module. + * + * @param base EQDC peripheral base address + */ +static uint32_t EQDC_GetInstance(EQDC_Type *base); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to EQDC bases for each instance. */ +static EQDC_Type *const s_eqdcBases[] = EQDC_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to EQDC clocks for each instance. */ +#if defined(QDC_CLOCKS) +static const clock_ip_name_t s_eqdcClocks[] = QDC_CLOCKS; +#elif defined(ENC_CLOCKS) +static const clock_ip_name_t s_eqdcClocks[] = ENC_CLOCKS; +#endif +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(EQDC_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_eqdcResets[] = EQDC_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t EQDC_GetInstance(EQDC_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_eqdcBases); instance++) + { + if (s_eqdcBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_eqdcBases)); + + return instance; +} + +/* + * Initializes the EQDC module. + * + * This function initializes the EQDC by enabling the IP bus clock (optional). + * + * param base EQDC peripheral base address. + * param psConfig Pointer to configuration structure. + */ +void EQDC_Init(EQDC_Type *base, const eqdc_config_t *psConfig) +{ + assert(NULL != psConfig); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable the clock. */ + CLOCK_EnableClock(s_eqdcClocks[EQDC_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(EQDC_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_eqdcResets[EQDC_GetInstance(base)]); +#endif + + /* Initialize Double-set registers */ + EQDC_ClearBufferedRegisterLoadUpdateMode(base); + EQDC_ClearEqdcLdok(base); + + /* Counter value. */ + EQDC_SetPositionCounterValue(base, psConfig->positionCounterValue); + + /* Initial value. */ + EQDC_SetInitialPositionValue(base, psConfig->positionInitialValue); + + /* Modulus value. */ + EQDC_SetPositionModulusValue(base, psConfig->positionModulusValue); + + /* Compare value. */ + EQDC_SetPositionCompare0Value(base, psConfig->positionCompareValue[0]); + EQDC_SetPositionCompare1Value(base, psConfig->positionCompareValue[1]); + EQDC_SetPositionCompare2Value(base, psConfig->positionCompareValue[2]); + EQDC_SetPositionCompare3Value(base, psConfig->positionCompareValue[3]); + + EQDC_SetEqdcLdok(base); + while (EQDC_GetEqdcLdok(base) != 0U) + { + } + + /* Watchdog. */ + EQDC_SetWatchdogTimeout(base, psConfig->watchdogTimeoutValue); + + /* Clear EQDC_REV */ + base->REV = 0U; + + /* EQDC_IMR. */ + base->IMR = EQDC_IMR_FPHA(psConfig->filterPhaseA) | EQDC_IMR_FPHB(psConfig->filterPhaseB) | + EQDC_IMR_FIND_PRE(psConfig->filterIndPre) | EQDC_IMR_FHOM_ENA(psConfig->filterHomEna); + + /* EQDC_FILT. */ + base->FILT = EQDC_FILT_PRSC(psConfig->prescaler) | /* Prescaler used by LASTEDGE and POSDPER. */ + EQDC_FILT_FILT_CS(psConfig->filterClockSourceselection) | + EQDC_FILT_FILT_CNT(psConfig->filterSampleCount) | EQDC_FILT_FILT_PER(psConfig->filterSamplePeriod); + + /* EQDC_CTRL. */ + base->CTRL = EQDC_CTRL_W1C_FLAGS | /* W1C flags. */ + (uint16_t)psConfig->homeEnableInitPosCounterMode | /* HOME Enable trigger. */ + (uint16_t)psConfig->indexPresetInitPosCounterMode | /* INDEX Preset trigger. */ + EQDC_CTRL_REV(psConfig->enableReverseDirection) | /* Reverse direction. */ + EQDC_CTRL_WDE(psConfig->enableWatchdog) | /* Enable watchdog. */ + EQDC_CTRL_DMAEN(psConfig->enableDma); /* Enable Dma. */ + + /* Set mode of count. */ + EQDC_SetCountMode(base, psConfig->countMode); /* eqdcoder count mode. */ + + /* EQDC_CTRL2. */ + base->CTRL2 = + EQDC_CTRL2_ONCE(psConfig->countOnce) | + EQDC_CTRL2_INITPOS(psConfig->enableTriggerInitPositionCounter) | /* TRIGGER initializes position counter. */ +#if (defined(FSL_FEATURE_EQDC_CTRL2_HAS_EMIP_BIT_FIELD) && FSL_FEATURE_EQDC_CTRL2_HAS_EMIP_BIT_FIELD) + EQDC_CTRL2_EMIP(psConfig->enableIndexInitPositionCounter)| /* Index Event Edge Mark initializes position counter */ +#endif /* FSL_FEATURE_EQDC_CTRL2_HAS_EMIP_BIT_FIELD */ + EQDC_CTRL2_PMEN(psConfig->enablePeriodMeasurement) | /* Enable period measurement. */ + EQDC_CTRL2_OUTCTL(psConfig->outputPulseMode) | /* Output pulse. */ + EQDC_CTRL2_REVMOD(psConfig->revolutionCountCondition) | /* Revolution count condition. */ + EQDC_CTRL2_LDMOD(psConfig->bufferedRegisterLoadMode) | /* Buffered register load (Update) mode select. */ + EQDC_CTRL2_UPDPOS(psConfig->enableTriggerClearPositionRegisters) | /* TRIGGER clears position register. */ + EQDC_CTRL2_UPDHLD(psConfig->enableTriggerHoldPositionRegisters); /* TRIGGER loads position registers. */ + + /* Set mode of operation. */ + EQDC_SetOperateMode(base, psConfig->operateMode); /* eqdcoder work mode. */ + + /* Enable interrupts. */ + EQDC_EnableInterrupts(base, psConfig->enabledInterruptsMask); +} + +/* + * De-initializes the EQDC module. + * + * This function deinitializes the EQDC by: + * 1. Disables the IP bus clock (optional). + * + * param base EQDC peripheral base address. + */ +void EQDC_Deinit(EQDC_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Disable the clock. */ + CLOCK_DisableClock(s_eqdcClocks[EQDC_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * Gets an available pre-defined configuration. + * + * The default value are: + * psConfig->enableReverseDirection = false; + * psConfig->countOnce = false; + * psConfig->operateMode = kEQDC_QuadratureDecodeOperationMode; + * psConfig->countMode = kEQDC_QuadratureX4; + * psConfig->homeEnableInitPosCounterMode = kEQDC_HomeInitPosCounterDisabled; + * psConfig->indexPresetInitPosCounterMode = kEQDC_IndexInitPosCounterDisabled; + * psConfig->enableIndexInitPositionCounter = false; + * psConfig->enableDma = false; + * psConfig->bufferedRegisterLoadMode = false; + * psConfig->enableTriggerInitPositionCounter = false; + * psConfig->enableTriggerClearPositionRegisters = false; + * psConfig->enableTriggerHoldPositionRegisters = false; + * psConfig->enableWatchdog = false; + * psConfig->watchdogTimeoutValue = 0xFFFFU; + * psConfig->filterPhaseA = 0U; + * psConfig->filterPhaseB = 0U; + * psConfig->filterIndPre = 0U; + * psConfig->filterHomEna = 0U; + * psConfig->filterClockSourceselection = false; + * psConfig->filterSampleCount = kEQDC_Filter3Samples; + * psConfig->filterSamplePeriod = 0U; + * psConfig->outputPulseMode = kEQDC_OutputPulseOnCounterEqualCompare; + * psConfig->positionCompareValue[0] = 0xFFFFFFFFU; + * psConfig->positionCompareValue[1] = 0xFFFFFFFFU; + * psConfig->positionCompareValue[2] = 0xFFFFFFFFU; + * psConfig->positionCompareValue[3] = 0xFFFFFFFFU; + * psConfig->revolutionCountCondition = kEQDC_RevolutionCountOnIndexPulse; + * psConfig->positionModulusValue = 0U; + * psConfig->positionInitialValue = 0U; + * psConfig->positionCounterValue = 0U; + * psConfig->enablePeriodMeasurement = false; + * psConfig->prescaler = kEQDC_Prescaler1; + * psConfig->enabledInterruptsMask = 0U; + * + * param psConfig Pointer to configuration structure. + */ +void EQDC_GetDefaultConfig(eqdc_config_t *psConfig) +{ + assert(NULL != psConfig); + + psConfig->enableReverseDirection = false; + psConfig->countOnce = false; + psConfig->operateMode = kEQDC_QuadratureDecodeOperationMode; /*!< Decode Mode. */ + psConfig->countMode = kEQDC_QuadratureX4; + psConfig->homeEnableInitPosCounterMode = kEQDC_HomeInitPosCounterDisabled; + psConfig->indexPresetInitPosCounterMode = kEQDC_IndexInitPosCounterDisabled; +#if (defined(FSL_FEATURE_EQDC_CTRL2_HAS_EMIP_BIT_FIELD) && FSL_FEATURE_EQDC_CTRL2_HAS_EMIP_BIT_FIELD) + psConfig->enableIndexInitPositionCounter = false; +#endif /* FSL_FEATURE_EQDC_CTRL2_HAS_EMIP_BIT_FIELD */ + psConfig->enableDma = false; + psConfig->bufferedRegisterLoadMode = false; + psConfig->enableTriggerInitPositionCounter = false; + psConfig->enableTriggerClearPositionRegisters = false; + psConfig->enableTriggerHoldPositionRegisters = false; + psConfig->enableWatchdog = false; + psConfig->watchdogTimeoutValue = 0xFFFFU; + psConfig->filterPhaseA = 0U; + psConfig->filterPhaseB = 0U; + psConfig->filterIndPre = 0U; + psConfig->filterHomEna = 0U; + psConfig->filterClockSourceselection = false; + psConfig->filterSampleCount = kEQDC_Filter3Samples; + psConfig->filterSamplePeriod = 0U; + psConfig->outputPulseMode = kEQDC_OutputPulseOnCounterEqualCompare; + psConfig->positionCompareValue[0] = 0xFFFFFFFFU; + psConfig->positionCompareValue[1] = 0xFFFFFFFFU; + psConfig->positionCompareValue[2] = 0xFFFFFFFFU; + psConfig->positionCompareValue[3] = 0xFFFFFFFFU; + psConfig->revolutionCountCondition = kEQDC_RevolutionCountOnIndexPulse; + psConfig->positionModulusValue = 0U; + psConfig->positionInitialValue = 0U; + psConfig->positionCounterValue = 0U; + psConfig->enablePeriodMeasurement = false; + psConfig->prescaler = kEQDC_Prescaler1; + psConfig->enabledInterruptsMask = 0U; +} + +/* + * Initializes the mode of operation. + * + * The Quadrature Decoder operates in following 4 operation modes: + * 1.Quadrature Decode(QDC) Operation Mode (CTRL[PH1] = 0,CTRL2[OPMODE] = 0) + * 2.Quadrature Count(QCT) Operation Mode (CTRL[PH1] = 0,CTRL2[OPMODE] = 1) + * 3.Single Phase Decode(PH1DC) Operation Mode (CTRL[PH1] = 1,CTRL2[OPMODE] = 0) + * 4.Single Phase Count(PH1CT) Operation Mode (CTRL[PH1] = 1,CTRL2[OPMODE] = 1) + * + * param base EQDC peripheral base address. + * param psConfig Pointer to configuration structure. + */ +void EQDC_SetOperateMode(EQDC_Type *base, eqdc_operate_mode_t operateMode) +{ + switch (operateMode) + { + case kEQDC_QuadratureDecodeOperationMode: + base->CTRL &= ~EQDC_CTRL_PH1_MASK; + base->CTRL2 &= ~EQDC_CTRL2_OPMODE_MASK; + break; + + case kEQDC_QuadratureCountOperationMode: + base->CTRL &= ~EQDC_CTRL_PH1_MASK; + base->CTRL2 |= EQDC_CTRL2_OPMODE_MASK; + break; + + case kEQDC_SinglePhaseDecodeOperationMode: + base->CTRL |= EQDC_CTRL_PH1_MASK; + base->CTRL2 &= ~EQDC_CTRL2_OPMODE_MASK; + break; + + case kEQDC_SinglePhaseCountOperationMode: + base->CTRL |= EQDC_CTRL_PH1_MASK; + base->CTRL2 |= EQDC_CTRL2_OPMODE_MASK; + break; + + default: + assert(false); + break; + } +} \ No newline at end of file diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eqdc.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eqdc.h new file mode 100644 index 00000000000..3f3ef5baf54 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_eqdc.h @@ -0,0 +1,1211 @@ +/* + * Copyright 2022, 2023 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_EQDC_H_ +#define FSL_EQDC_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup eqdc + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define FSL_EQDC_DRIVER_VERSION (MAKE_VERSION(2, 3, 0)) + +/*! @brief W1C bits in EQDC CTRL registers. */ +#define EQDC_CTRL_W1C_FLAGS (EQDC_CTRL_HIRQ_MASK | EQDC_CTRL_XIRQ_MASK | EQDC_CTRL_WDIRQ_MASK) + +/*! @brief W1C bits in EQDC INTCTRL registers. */ +#define EQDC_INTCTRL_W1C_FLAGS \ + (EQDC_INTCTRL_SABIRQ_MASK | EQDC_INTCTRL_DIRIRQ_MASK | EQDC_INTCTRL_RUIRQ_MASK | EQDC_INTCTRL_ROIRQ_MASK | \ + EQDC_INTCTRL_CMP0IRQ_MASK | EQDC_INTCTRL_CMP1IRQ_MASK | EQDC_INTCTRL_CMP2IRQ_MASK | EQDC_INTCTRL_CMP3IRQ_MASK) + +/*! @brief Interrupt enable bits in EQDC CTRL registers. */ +#define EQDC_CTRL_INT_EN (EQDC_CTRL_HIE_MASK | EQDC_CTRL_XIE_MASK | EQDC_CTRL_WDIE_MASK) + +/*! @brief Interrupt enable bits in EQDC INTCTRL registers. */ +#if (defined(FSL_FEATURE_EQDC_HAS_NO_COMPARE_INTERRUPT) && FSL_FEATURE_EQDC_HAS_NO_COMPARE_INTERRUPT) +#define EQDC_INTCTRL_INT_EN \ + (EQDC_INTCTRL_SABIE_MASK | EQDC_INTCTRL_DIRIE_MASK | EQDC_INTCTRL_RUIE_MASK | EQDC_INTCTRL_ROIE_MASK) +#else +#define EQDC_INTCTRL_INT_EN \ + (EQDC_INTCTRL_SABIE_MASK | EQDC_INTCTRL_DIRIE_MASK | EQDC_INTCTRL_RUIE_MASK | EQDC_INTCTRL_ROIE_MASK | \ + EQDC_INTCTRL_CMP0IE_MASK | EQDC_INTCTRL_CMP1IE_MASK | EQDC_INTCTRL_CMP2IE_MASK | EQDC_INTCTRL_CMP3IE_MASK) +#endif + +/*! @brief Interrupt flag bits in EQDC CTRL registers. */ +#define EQDC_CTRL_INT_FLAGS (EQDC_CTRL_HIRQ_MASK | EQDC_CTRL_XIRQ_MASK | EQDC_CTRL_WDIRQ_MASK) + +/*! @brief Interrupt flag bits in EQDC INTCTRL registers. */ +#define EQDC_INTCTRL_INT_FLAGS \ + (EQDC_INTCTRL_SABIRQ_MASK | EQDC_INTCTRL_DIRIRQ_MASK | EQDC_INTCTRL_RUIRQ_MASK | EQDC_INTCTRL_ROIRQ_MASK | \ + EQDC_INTCTRL_CMP0IRQ_MASK | EQDC_INTCTRL_CMP1IRQ_MASK | EQDC_INTCTRL_CMP2IRQ_MASK | EQDC_INTCTRL_CMP3IRQ_MASK) + +#if !(defined(FSL_FEATURE_EQDC_HAS_NO_COMPARE_INTERRUPT) && FSL_FEATURE_EQDC_HAS_NO_COMPARE_INTERRUPT) +#define kEQDC_PositionCompare0InerruptEnable kEQDC_PositionCompare0InterruptEnable +#define kEQDC_PositionCompare1InerruptEnable kEQDC_PositionCompare1InterruptEnable +#define kEQDC_PositionCompare2InerruptEnable kEQDC_PositionCompare2InterruptEnable +#define kEQDC_PositionCompare3InerruptEnable kEQDC_PositionCompare3InterruptEnable +#endif + +/*! + * @brief EQDC status flags, these flags indicate the counter's events. + * @anchor _eqdc_status_flags + */ +enum _eqdc_status_flags +{ + kEQDC_HomeEnableTransitionFlag = EQDC_CTRL_HIRQ_MASK, /*!< HOME/ENABLE signal transition occured. */ + kEQDC_IndexPresetPulseFlag = EQDC_CTRL_XIRQ_MASK, /*!< INDEX/PRESET pulse occured. */ + kEQDC_WatchdogTimeoutFlag = EQDC_CTRL_WDIRQ_MASK, /*!< Watchdog timeout occured. */ + + kEQDC_SimultPhaseChangeFlag = (uint32_t)EQDC_INTCTRL_SABIRQ_MASK + << 16U, /*!< Simultaneous change of PHASEA and PHASEB occured. */ + kEQDC_CountDirectionChangeFlag = (uint32_t)EQDC_INTCTRL_DIRIRQ_MASK + << 16U, /*!< Count direction change interrupt enable. */ + kEQDC_PositionRollOverFlag = (uint32_t)EQDC_INTCTRL_ROIRQ_MASK + << 16U, /*!< Position counter rolls over from 0xFFFFFFFF to 0, or + from MOD value to INIT value. */ + kEQDC_PositionRollUnderFlag = (uint32_t)EQDC_INTCTRL_RUIRQ_MASK + << 16U, /*!< Position register roll under from 0 to 0xFFFFFFFF, or + from INIT value to MOD value. */ + + kEQDC_PositionCompare0Flag = (uint32_t)EQDC_INTCTRL_CMP0IRQ_MASK + << 16U, /*!< Position counter match the COMP0 value. */ + kEQDC_PositionCompare1Flag = (uint32_t)EQDC_INTCTRL_CMP1IRQ_MASK + << 16U, /*!< Position counter match the COMP1 value. */ + kEQDC_PositionCompare2Flag = (uint32_t)EQDC_INTCTRL_CMP2IRQ_MASK + << 16U, /*!< Position counter match the COMP2 value. */ + kEQDC_PositionCompare3Flag = (uint32_t)EQDC_INTCTRL_CMP3IRQ_MASK + << 16U, /*!< Position counter match the COMP3 value. */ + + kEQDC_StatusAllFlags = kEQDC_HomeEnableTransitionFlag | kEQDC_IndexPresetPulseFlag | kEQDC_WatchdogTimeoutFlag | + kEQDC_SimultPhaseChangeFlag | kEQDC_PositionRollOverFlag | kEQDC_PositionRollUnderFlag | + kEQDC_PositionCompare0Flag | kEQDC_PositionCompare1Flag | kEQDC_PositionCompare2Flag | + kEQDC_PositionCompare3Flag +}; + +/*! + * @brief Signal status, these flags indicate the raw and filtered input signal status. + * @anchor _eqdc_signal_status + */ +enum _eqdc_signal_status +{ + kEQDC_SignalStatusRawHomeEnable = EQDC_IMR_HOME_ENABLE_MASK, /*!< Raw HOME/ENABLE input. */ + kEQDC_SignalStatusRawIndexPreset = EQDC_IMR_INDEX_PRESET_MASK, /*!< Raw INDEX/PRESET input. */ + kEQDC_SignalStatusRawPhaseB = EQDC_IMR_PHB_MASK, /*!< Raw PHASEB input. */ + kEQDC_SignalStatusRawPhaseA = EQDC_IMR_PHA_MASK, /*!< Raw PHASEA input. */ + kEQDC_SignalStatusFilteredHomeEnable = EQDC_IMR_FHOM_ENA_MASK, /*!< The filtered HOME/ENABLE input. */ + kEQDC_SignalStatusFilteredIndexPreset = EQDC_IMR_FIND_PRE_MASK, /*!< The filtered INDEX/PRESET input. */ + kEQDC_SignalStatusFilteredPhaseB = EQDC_IMR_FPHB_MASK, /*!< The filtered PHASEB input. */ + kEQDC_SignalStatusFilteredPhaseA = EQDC_IMR_FPHA_MASK, /*!< The filtered PHASEA input. */ + + kEQDC_SignalStatusPositionCompare0Flag = EQDC_IMR_CMPF0_MASK, /*!< Position Compare 0 Flag Output. */ + kEQDC_SignalStatusPositionCompare1Flag = EQDC_IMR_CMP1F_MASK, /*!< Position Compare 1 Flag Output. */ + kEQDC_SignalStatusPositionCompare2Flag = EQDC_IMR_CMP2F_MASK, /*!< Position Compare 2 Flag Output. */ + kEQDC_SignalStatusPositionCompare3Flag = EQDC_IMR_CMP3F_MASK, /*!< Position Compare 3 Flag Output. */ + kEQDC_SignalStatusCountDirectionFlagHold = EQDC_IMR_DIRH_MASK, /*!< Count Direction Flag Hold. */ + kEQDC_SignalStatusCountDirectionFlag = EQDC_IMR_DIR_MASK, /*!< Count Direction Flag Output. */ + + kEQDC_SignalStatusAllFlags = kEQDC_SignalStatusRawHomeEnable | kEQDC_SignalStatusRawIndexPreset | + kEQDC_SignalStatusRawPhaseB | kEQDC_SignalStatusRawPhaseA | + kEQDC_SignalStatusFilteredHomeEnable | kEQDC_SignalStatusFilteredIndexPreset | + kEQDC_SignalStatusFilteredPhaseB | kEQDC_SignalStatusFilteredPhaseA | + kEQDC_SignalStatusPositionCompare0Flag | kEQDC_SignalStatusPositionCompare1Flag | + kEQDC_SignalStatusPositionCompare2Flag | kEQDC_SignalStatusPositionCompare3Flag | + kEQDC_SignalStatusCountDirectionFlagHold | kEQDC_SignalStatusCountDirectionFlag +}; + +/*! + * @brief Interrupt enable/disable mask. + * @anchor _eqdc_interrupt_enable + */ +enum _eqdc_interrupt_enable +{ + kEQDC_HomeEnableTransitionInterruptEnable = + EQDC_CTRL_HIE_MASK, /*!< HOME/ENABLE signal transition interrupt enable. */ + kEQDC_IndexPresetPulseInterruptEnable = EQDC_CTRL_XIE_MASK, /*!< INDEX/PRESET pulse interrupt enable. */ + kEQDC_WatchdogTimeoutInterruptEnable = EQDC_CTRL_WDIE_MASK, /*!< Watchdog timeout interrupt enable. */ + + kEQDC_SimultPhaseChangeInterruptEnable = (uint32_t)EQDC_INTCTRL_SABIE_MASK + << 16U, /*!< Simultaneous PHASEA and PHASEB change interrupt enable. */ + kEQDC_CountDirectionChangeInterruptEnable = (uint32_t)EQDC_INTCTRL_DIRIE_MASK + << 16U, /*!< Count direction change interrupt enable. */ + kEQDC_PositionRollOverInterruptEnable = (uint32_t)EQDC_INTCTRL_ROIE_MASK << 16U, /*!< Roll-over interrupt enable. */ + kEQDC_PositionRollUnderInterruptEnable = (uint32_t)EQDC_INTCTRL_RUIE_MASK + << 16U, /*!< Roll-under interrupt enable. */ + +#if !(defined(FSL_FEATURE_EQDC_HAS_NO_COMPARE_INTERRUPT) && FSL_FEATURE_EQDC_HAS_NO_COMPARE_INTERRUPT) + kEQDC_PositionCompare0InterruptEnable = (uint32_t)EQDC_INTCTRL_CMP0IE_MASK + << 16U, /*!< Position compare 0 interrupt enable. */ + kEQDC_PositionCompare1InterruptEnable = (uint32_t)EQDC_INTCTRL_CMP1IE_MASK + << 16U, /*!< Position compare 1 interrupt enable. */ + kEQDC_PositionCompare2InterruptEnable = (uint32_t)EQDC_INTCTRL_CMP2IE_MASK + << 16U, /*!< Position compare 2 interrupt enable. */ + kEQDC_PositionCompare3InterruptEnable = (uint32_t)EQDC_INTCTRL_CMP3IE_MASK + << 16U, /*!< Position compare 3 interrupt enable. */ +#endif + +#if (defined(FSL_FEATURE_EQDC_HAS_NO_COMPARE_INTERRUPT) && FSL_FEATURE_EQDC_HAS_NO_COMPARE_INTERRUPT) + kEQDC_AllInterruptEnable = kEQDC_HomeEnableTransitionInterruptEnable | kEQDC_IndexPresetPulseInterruptEnable | + kEQDC_WatchdogTimeoutInterruptEnable | kEQDC_SimultPhaseChangeInterruptEnable | + kEQDC_CountDirectionChangeInterruptEnable | kEQDC_PositionRollOverInterruptEnable | + kEQDC_PositionRollUnderInterruptEnable +#else + kEQDC_AllInterruptEnable = kEQDC_HomeEnableTransitionInterruptEnable | kEQDC_IndexPresetPulseInterruptEnable | + kEQDC_WatchdogTimeoutInterruptEnable | kEQDC_SimultPhaseChangeInterruptEnable | + kEQDC_CountDirectionChangeInterruptEnable | kEQDC_PositionRollOverInterruptEnable | + kEQDC_PositionRollUnderInterruptEnable | kEQDC_PositionCompare0InterruptEnable | + kEQDC_PositionCompare1InterruptEnable | kEQDC_PositionCompare2InterruptEnable | + kEQDC_PositionCompare3InterruptEnable +#endif +}; + +/*! + * @brief Define HOME/ENABLE signal's trigger mode. + */ +typedef enum _eqdc_home_enable_init_pos_counter_mode +{ + /*! Don't use HOME/ENABLE signal to initialize the position counter. */ + kEQDC_HomeInitPosCounterDisabled = 0U, + + /*! Use positive going edge to trigger initialization of position counters. */ + kEQDC_HomeInitPosCounterOnRisingEdge = EQDC_CTRL_HIP_MASK, + + /*! Use negative going edge to trigger initialization of position counters. */ + kEQDC_HomeInitPosCounterOnFallingEdge = EQDC_CTRL_HIP_MASK | EQDC_CTRL_HNE_MASK, +} eqdc_home_enable_init_pos_counter_mode_t; + +/*! + * @brief Define INDEX/PRESET signal's trigger mode. + */ +typedef enum _eqdc_index_preset_init_pos_counter_mode +{ + /*! INDEX/PRESET pulse does not initialize the position counter. */ + kEQDC_IndexInitPosCounterDisabled = 0U, + + /*! Use INDEX/PRESET pulse rising edge to initialize position counter. */ + kEQDC_IndexInitPosCounterOnRisingEdge = EQDC_CTRL_XIP_MASK, + + /*! Use INDEX/PRESET pulse falling edge to initialize position counter. */ + kEQDC_IndexInitPosCounterOnFallingEdge = EQDC_CTRL_XIP_MASK | EQDC_CTRL_XNE_MASK, +} eqdc_index_preset_init_pos_counter_mode_t; + +/*! + * @brief Define type for decoder opertion mode. + * + * The Quadrature Decoder operates in following 4 operation modes: + * 1.Quadrature Decode(QDC) Operation Mode (CTRL[PH1] = 0,CTRL2[OPMODE] = 0) + * In QDC operation mode, Module uses PHASEA, PHASEB, INDEX, HOME, TRIGGER + * and ICAP[3:1] to decode the PHASEA and PHASEB signals from Speed/Position sensor. + * 2.Quadrature Count(QCT) Operation Mode (CTRL[PH1] = 0,CTRL2[OPMODE] = 1) + * In QCT operation mode, Module uses PHASEA, PHASEB, PRESET, ENABLE, + * TRIGGER and ICAP[3:1] to count the PHASEA and PHASEB signals from Speed/Position sensor. + * 3.Single Phase Decode(PH1DC) Operation Mode (CTRL[PH1] = 1,CTRL2[OPMODE] = 0) + * In PH1DC operation mode, the module uses PHASEA, PHASEB, INDEX, HOME, + * TRIGGER and ICAP[3:1] to decode the PHASEA and PHASEB signals from Speed/Position sensor. + * 4.Single Phase Count(PH1CT) Operation Mode (CTRL[PH1] = 1,CTRL2[OPMODE] = 1) + * In PH1CT operation mode, the module uses PHASEA, PHASEB, PRESET, ENABLE, + * TRIGGER and ICAP[3:1] to count the PHASEA and PHASEB signals from Speed/Position sensor. + */ +typedef enum _eqdc_operate_mode +{ + kEQDC_QuadratureDecodeOperationMode = 0U, /*!< Use standard quadrature decoder with PHASEA/PHASEB, INDEX/HOME. */ + kEQDC_QuadratureCountOperationMode, /*!< Use quadrature count operation mode with PHASEA/PHASEB, PRESET/ENABLE. */ + kEQDC_SinglePhaseDecodeOperationMode, /*!< Use single phase quadrature decoder with PHASEA/PHASEB, INDEX/HOME. */ + kEQDC_SinglePhaseCountOperationMode, /*!< Use single phase count decoder with PHASEA/PHASEB, PRESET/ENABLE. */ +} eqdc_operate_mode_t; + +/*! + * @brief Define type for decoder count mode. + * + * In decode mode, it uses the standard quadrature decoder with PHASEA and PHASEB, + * PHASEA = 0 and PHASEB = 0 mean reverse direction. + * - If PHASEA leads PHASEB, then motion is in the positive direction. + * - If PHASEA trails PHASEB,then motion is in the negative direction. + * In single phase mode, there are three count modes: + * - In Signed Count mode (Single Edge). Both position counter (POS) and position difference counter (POSD) count + * on the input PHASEA rising edge while the input PHASEB provides the selected position counter direction + * (up/down). If CTRL[REV] is 1, then the position counter will count in the opposite direction. + * - In Signed Count mode (double edge), both position counter (POS) and + * position difference counter (POSD) count the input PHASEA on both rising edge and falling edge while the input + * PHASEB provides the selected position counter direction (up/down). + * - In UP/DOWN Pulse Count mode. Both position counter (POS) and position difference counter (POSD) count in the + * up direction when input PHASEA rising edge occurs. Both counters count in the down direction when input PHASEB rising + * edge occurs. If CTRL[REV] is 1, then the position counter will count in the opposite direction. + */ +typedef enum _eqdc_count_mode +{ + kEQDC_QuadratureX4 = 0U, /*!< Active on kEQDC_QuadratureDecodeOperationMode/kEQDC_QuadratureCountOperationMode. */ + kEQDC_QuadratureX2 = 1U, /*!< Active on kEQDC_QuadratureDecodeOperationMode/kEQDC_QuadratureCountOperationMode. */ + kEQDC_QuadratureX1 = 2U, /*!< Active on kEQDC_QuadratureDecodeOperationMode/kEQDC_QuadratureCountOperationMode. */ + kEQDC_UpDownPulseCount = + 0U, /*!< Active on kEQDC_SinglePhaseDecodeOperationMode/kEQDC_SinglePhaseCountOperationMode. */ + kEQDC_SignedCountDoubleEdge = + 1U, /*!< Active on kEQDC_SinglePhaseDecodeOperationMode/kEQDC_SinglePhaseCountOperationMode. */ + kEQDC_SignedCountSingleEdge = + 2U, /*!< Active on kEQDC_SinglePhaseDecodeOperationMode/kEQDC_SinglePhaseCountOperationMode. */ +} eqdc_count_mode_t; + +/*! + * @brief Define type for the condition of POSMATCH pulses. + */ +typedef enum _eqdc_output_pulse_mode +{ + kEQDC_OutputPulseOnCounterEqualCompare = 0U, /*!< POSMATCH pulses when a match occurs between the position counters + (POS) and the compare value (UCOMPx/LCOMPx)(x range is 0-3). */ + kEQDC_OutputPulseOnReadingPositionCounter, /*!< POSMATCH pulses when reading position counter(POS and LPOS), + revolution counter(REV), position difference counter(POSD). */ +} eqdc_output_pulse_mode_t; + +/*! + * @brief Define type for determining how the revolution counter (REV) is incremented/decremented. + */ +typedef enum _eqdc_revolution_count_condition +{ + kEQDC_RevolutionCountOnIndexPulse = 0U, /*!< Use INDEX pulse to increment/decrement revolution counter. */ + kEQDC_RevolutionCountOnRollOverModulus, /*!< Use modulus counting roll-over/under to increment/decrement revolution + counter. */ +} eqdc_revolution_count_condition_t; + +/*! + * @brief Input Filter Sample Count + * + * The Input Filter Sample Count represents the number of consecutive samples + * that must agree, before the input filter accepts an input transition + */ +typedef enum _eqdc_filter_sample_count +{ + kEQDC_Filter3Samples = 0U, /*!< 3 samples. */ + kEQDC_Filter4Samples = 1U, /*!< 4 samples. */ + kEQDC_Filter5Samples = 2U, /*!< 5 samples. */ + kEQDC_Filter6Samples = 3U, /*!< 6 samples. */ + kEQDC_Filter7Samples = 4U, /*!< 7 samples. */ + kEQDC_Filter8Samples = 5U, /*!< 8 samples. */ + kEQDC_Filter9Samples = 6U, /*!< 9 samples. */ + kEQDC_Filter10Samples = 7U, /*!< 10 samples. */ +} eqdc_filter_sample_count_t; + +/*! + * @brief Count direction. + */ +typedef enum _eqdc_count_direction_flag +{ + kEQDC_CountDirectionDown = 0U, /*!< Last count was in down direction. */ + kEQDC_CountDirectionUp, /*!< Last count was in up direction. */ +} eqdc_count_direction_flag_t; + +/*! + * @brief Prescaler used by Last Edge Time (LASTEDGE) and + * Position Difference Period Counter (POSDPER). + */ +typedef enum _eqdc_prescaler +{ + kEQDC_Prescaler1 = 0U, /*!< Prescaler value 1. */ + kEQDC_Prescaler2 = 1U, /*!< Prescaler value 2. */ + kEQDC_Prescaler4 = 2U, /*!< Prescaler value 4. */ + kEQDC_Prescaler8 = 3U, /*!< Prescaler value 8. */ + kEQDC_Prescaler16 = 4U, /*!< Prescaler value 16. */ + kEQDC_Prescaler32 = 5U, /*!< Prescaler value 32. */ + kEQDC_Prescaler64 = 6U, /*!< Prescaler value 64. */ + kEQDC_Prescaler128 = 7U, /*!< Prescaler value 128. */ + kEQDC_Prescaler256 = 8U, /*!< Prescaler value 256. */ + kEQDC_Prescaler512 = 9U, /*!< Prescaler value 512. */ + kEQDC_Prescaler1024 = 10U, /*!< Prescaler value 1024. */ + kEQDC_Prescaler2048 = 11U, /*!< Prescaler value 2048. */ + kEQDC_Prescaler4096 = 12U, /*!< Prescaler value 4096. */ + kEQDC_Prescaler8192 = 13U, /*!< Prescaler value 8192. */ + kEQDC_Prescaler16384 = 14U, /*!< Prescaler value 16384. */ + kEQDC_Prescaler32768 = 15U, /*!< Prescaler value 32768. */ +} eqdc_prescaler_t; + +/*! + * @brief Define user configuration structure for EQDC module. + */ +typedef struct _eqdc_config +{ + /* Basic counter. */ + bool enableReverseDirection; /*!< Enable reverse direction counting. */ + bool countOnce; /*!< Selects modulo loop or one shot counting mode. */ + + bool enableDma; /*!< Enable DMA for new written buffer values of COMPx/INIT/MOD(x range is 0-3) */ + bool bufferedRegisterLoadMode; /*!enableReverseDirection = false; + psConfig->countOnce = false; + psConfig->operateMode = kEQDC_QuadratureDecodeOperationMode; + psConfig->countMode = kEQDC_QuadratureX4; + psConfig->homeEnableInitPosCounterMode = kEQDC_HomeInitPosCounterDisabled; + psConfig->indexPresetInitPosCounterMode = kEQDC_IndexInitPosCounterDisabled; + psConfig->enableIndexInitPositionCounter = false; + psConfig->enableDma = false; + psConfig->bufferedRegisterLoadMode = false; + psConfig->enableTriggerInitPositionCounter = false; + psConfig->enableTriggerClearPositionRegisters = false; + psConfig->enableTriggerHoldPositionRegisters = false; + psConfig->enableWatchdog = false; + psConfig->watchdogTimeoutValue = 0xFFFFU; + psConfig->filterPhaseA = 0U; + psConfig->filterPhaseB = 0U; + psConfig->filterIndPre = 0U; + psConfig->filterHomEna = 0U; + psConfig->filterClockSourceselection = false; + psConfig->filterSampleCount = kEQDC_Filter3Samples; + psConfig->filterSamplePeriod = 0U; + psConfig->outputPulseMode = kEQDC_OutputPulseOnCounterEqualCompare; + psConfig->positionCompareValue[0] = 0xFFFFFFFFU; + psConfig->positionCompareValue[1] = 0xFFFFFFFFU; + psConfig->positionCompareValue[2] = 0xFFFFFFFFU; + psConfig->positionCompareValue[3] = 0xFFFFFFFFU; + psConfig->revolutionCountCondition = kEQDC_RevolutionCountOnIndexPulse; + psConfig->positionModulusValue = 0U; + psConfig->positionInitialValue = 0U; + psConfig->positionCounterValue = 0U; + psConfig->enablePeriodMeasurement = false; + psConfig->prescaler = kEQDC_Prescaler1; + psConfig->enabledInterruptsMask = 0U; + @endcode + * + * @param psConfig Pointer to configuration structure. + */ +void EQDC_GetDefaultConfig(eqdc_config_t *psConfig); + +/*! + * @brief De-initializes the EQDC module. + * + * This function deinitializes the EQDC by disabling the IP bus clock (optional). + * + * @param base EQDC peripheral base address. + */ +void EQDC_Deinit(EQDC_Type *base); + +/*! + * @brief Initializes the mode of operation. + * + * This function initializes mode of operation by enabling the IP bus clock (optional). + * + * @param base EQDC peripheral base address. + * @param operateMode Select operation mode. + */ +void EQDC_SetOperateMode(EQDC_Type *base, eqdc_operate_mode_t operateMode); + +/*! + * @brief Initializes the mode of count. + * + * These bits control the basic counting and behavior of Position Counter and Position Difference Counter. + * Setting CTRL[REV] to 1 can reverse the counting direction. + * 1.In quadrature Mode (CTRL[PH1] = 0): + * 00b - CM0: Normal/Reverse Quadrature X4 + * 01b - CM1: Normal/Reverse Quadrature X2 + * 10b - CM2: Normal/Reverse Quadrature X1 + * 11b - CM3: Reserved + * 2.In Single Phase Mode (CTRL[PH1] = 1): + * 00b - CM0: UP/DOWN Pulse Count Mode + * 01b - CM1: Signed Mode, count PHASEA rising/falling edge, position counter counts up when PHASEB + * is low and counts down when PHASEB is high + * 10b - CM2: Signed Count Mode,count PHASEA rising edge only, position counter counts up when + * PHASEB is low and counts down when PHASEB is high + * 11b - CM3: Reserved + * + * @param base EQDC peripheral base address. + * @param countMode Select count mode. + */ +static inline void EQDC_SetCountMode(EQDC_Type *base, eqdc_count_mode_t countMode) +{ + base->CTRL2 = (base->CTRL2 & (uint16_t)(~EQDC_CTRL2_CMODE_MASK)) | EQDC_CTRL2_CMODE(countMode); +} + +/*! @} */ + +/*! + * @name Watchdog + * @{ + */ + +/*! + * @brief Enable watchdog for EQDC module. + * + * @param base EQDC peripheral base address + * @param bEnable Enables or disables the watchdog + */ +static inline void EQDC_EnableWatchdog(EQDC_Type *base, bool bEnable) +{ + if (bEnable) + { + base->CTRL = (base->CTRL & (~EQDC_CTRL_W1C_FLAGS)) | EQDC_CTRL_WDE_MASK; + } + else + { + base->CTRL = (base->CTRL & (~(EQDC_CTRL_W1C_FLAGS | EQDC_CTRL_WDE_MASK))); + } +} + +/*! + * @brief Set watchdog timeout value. + * + * @param base EQDC peripheral base address + * @param u16Timeout Number of clock cycles, plus one clock cycle that the + * watchdog timer counts before timing out + */ +static inline void EQDC_SetWatchdogTimeout(EQDC_Type *base, uint16_t u16Timeout) +{ + base->WTR = u16Timeout; +} + +/*! @} */ + +/*! + * @name DMA + * @{ + */ + +/*! + * @brief Enable DMA for EQDC module. + * + * @param base EQDC peripheral base address + * @param bEnable Enables or disables the DMA + */ +static inline void EQDC_EnableDMA(EQDC_Type *base, bool bEnable) +{ + if (bEnable) + { + base->CTRL |= EQDC_CTRL_DMAEN_MASK; + } + else + { +#if (defined(FSL_FEATURE_EQDC_HAS_ERRATA_051383) && FSL_FEATURE_EQDC_HAS_ERRATA_051383) + /* Quadrature decoder CTRL[DMAEN] bit can not be cleared except do EQDC reset*/ + assert(false); +#else + base->CTRL &= ~EQDC_CTRL_DMAEN_MASK; +#endif + } +} + +/*! @} */ + +/*! + * @name Double-set Registers Loading Operation + * @{ + */ + +/*! + * @brief Set Buffered Register Load (Update) Mode. + * + * This bit selects the loading time point of the buffered compare registers UCOMPx/LCOMPx, x=0~3, + * initial register (UINIT/LINIT), and modulus register (UMOD/LMOD). + * Buffered registers are loaded and take effect at the next roll-over or roll-under if CTRL[LDOK] is set. + * + * @param base EQDC peripheral base address + */ +static inline void EQDC_SetBufferedRegisterLoadUpdateMode(EQDC_Type *base) +{ + base->CTRL2 |= EQDC_CTRL2_LDMOD_MASK; +} + +/*! + * @brief Clear Buffered Register Load (Update) Mode. + * + * Buffered Register Load (Update) Mode bit selects the loading time point of the buffered compare registers + * UCOMPx/LCOMPx, x=0~3, initial register (UINIT/LINIT), and modulus register (UMOD/LMOD). Buffered registers are loaded + * and take effect immediately upon CTRL[LDOK] is set. + * + * @param base EQDC peripheral base address + */ +static inline void EQDC_ClearBufferedRegisterLoadUpdateMode(EQDC_Type *base) +{ + base->CTRL2 &= ~EQDC_CTRL2_LDMOD_MASK; +} + +/*! + * @brief Set load okay. + * + * Load okay enables that the outer-set values of buffered compare registers (UCOMPx/LCOMPx, x=0~3), + * initial register(UINIT/LINIT) and modulus register(UMOD/LMOD) can be loaded into their inner-sets and + * take effect. + * When LDOK is set, this loading action occurs at the next position counter roll-over or roll-under if + * CTRL2[LDMOD] is set, or it occurs immediately if CTRL2[LDMOD] is cleared. LDOK is automatically + * cleared after the values in outer-set is loaded into the inner-set. + * + * @param base EQDC peripheral base address. + */ +static inline void EQDC_SetEqdcLdok(EQDC_Type *base) +{ + base->CTRL |= EQDC_CTRL_LDOK_MASK; +} + +/*! + * @brief Get load okay. + * + * @param base EQDC peripheral base address. + */ +static inline uint8_t EQDC_GetEqdcLdok(EQDC_Type *base) +{ + return base->CTRL & EQDC_CTRL_LDOK_MASK; +} + +/*! + * @brief Clear load okay. + * + * @param base EQDC peripheral base address. + */ +static inline void EQDC_ClearEqdcLdok(EQDC_Type *base) +{ + base->CTRL &= ~EQDC_CTRL_LDOK_MASK; +} + +/*! @} */ + +/*! + * @name Status + * @{ + */ +/*! + * @brief Get the status flags. + * + * @param base EQDC peripheral base address. + * + * @return Logical OR'ed value of the status flags, @ref _eqdc_status_flags. + */ +static inline uint32_t EQDC_GetStatusFlags(EQDC_Type *base) +{ + uint32_t u32Flags = 0U; + + u32Flags = (uint32_t)(base->CTRL) & EQDC_CTRL_INT_FLAGS; + + u32Flags |= ((uint32_t)(base->INTCTRL) & EQDC_INTCTRL_INT_FLAGS) << 16; + return u32Flags; +} + +/*! + * @brief Clear the status flags. + * + * @param base EQDC peripheral base address. + * @param u32Flags Logical OR'ed value of the flags to clear, @ref _eqdc_status_flags. + */ +static inline void EQDC_ClearStatusFlags(EQDC_Type *base, uint32_t u32Flags) +{ + if (0U != (u32Flags & EQDC_CTRL_INT_FLAGS)) + { + base->CTRL = (base->CTRL & (~EQDC_CTRL_W1C_FLAGS)) | (u32Flags & EQDC_CTRL_INT_FLAGS); + } + + if (0U != ((u32Flags >> 16) & EQDC_INTCTRL_INT_FLAGS)) + { + base->INTCTRL = (base->INTCTRL & (~EQDC_INTCTRL_W1C_FLAGS)) | ((u32Flags >> 16) & EQDC_INTCTRL_INT_FLAGS); + } +} + +/*! + * @brief Get the signals' real-time status. + * + * @param base EQDC peripheral base address. + * @return Logical OR'ed value of the real-time signal status, @ref _eqdc_signal_status. + */ +static inline uint16_t EQDC_GetSignalStatusFlags(EQDC_Type *base) +{ + return base->IMR; +} + +/*! + * @brief Get the direction of the last count. + * + * @param base EQDC peripheral base address. + * @return Direction of the last count. + */ +static inline eqdc_count_direction_flag_t EQDC_GetLastCountDirection(EQDC_Type *base) +{ + return ((0U != (base->IMR & EQDC_IMR_DIR_MASK)) ? kEQDC_CountDirectionUp : kEQDC_CountDirectionDown); +} +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enable the interrupts. + * + * @param base EQDC peripheral base address. + * @param u32Interrupts Logical OR'ed value of the interrupts, @ref _eqdc_interrupt_enable. + */ +static inline void EQDC_EnableInterrupts(EQDC_Type *base, uint32_t u32Interrupts) +{ + if (0U != (u32Interrupts & EQDC_CTRL_INT_EN)) + { + base->CTRL = (base->CTRL & (~EQDC_CTRL_W1C_FLAGS)) | (u32Interrupts & EQDC_CTRL_INT_EN); + } + + if (0U != ((u32Interrupts >> 16) & EQDC_INTCTRL_INT_EN)) + { + base->INTCTRL = (base->INTCTRL & (~EQDC_INTCTRL_W1C_FLAGS)) | ((u32Interrupts >> 16) & EQDC_INTCTRL_INT_EN); + } +} + +/*! + * @brief Disable the interrupts. + * + * @param base EQDC peripheral base address. + * @param u32Interrupts Logical OR'ed value of the interrupts, @ref _eqdc_interrupt_enable. + */ +static inline void EQDC_DisableInterrupts(EQDC_Type *base, uint32_t u32Interrupts) +{ + if (0U != (u32Interrupts & EQDC_CTRL_INT_EN)) + { + base->CTRL = (base->CTRL & (~EQDC_CTRL_W1C_FLAGS)) & (~(u32Interrupts & EQDC_CTRL_INT_EN)); + } + + if (0U != ((u32Interrupts >> 16) & EQDC_INTCTRL_INT_EN)) + { + base->INTCTRL = (base->INTCTRL & (~EQDC_INTCTRL_W1C_FLAGS)) & (~((u32Interrupts >> 16) & EQDC_INTCTRL_INT_EN)); + } +} + +/*! @} */ + +/*! + * @name Counter Operation + * @{ + */ + +/*! + * @brief Load the initial position value to position counter. + * + * Software trigger to load the initial position value (UINIT and LINIT) contents + * to position counter (UPOS and LPOS), so that to provide the consistent + * operation the position counter registers. + * + * @param base EQDC peripheral base address. + */ +static inline void EQDC_DoSoftwareLoadInitialPositionValue(EQDC_Type *base) +{ + base->CTRL = (base->CTRL & (~EQDC_CTRL_W1C_FLAGS)) | EQDC_CTRL_SWIP_MASK; +} + +/*! + * @brief Set initial position value for EQDC module. + * + * Set the position counter initial value (UINIT, LINIT). + * After writing values to the UINIT and LINIT registers, the values are "buffered" into outer-set + * registers temporarily. Values will be loaded into inner-set registers and take effect using + * the following two methods: + * 1. If CTRL2[LDMODE] is 1, "buffered" values are loaded into inner-set and take effect + * at the next roll-over or roll-under if CTRL[LDOK] is set. + * 2. If CTRL2[LDMODE] is 0, "buffered" values are loaded into inner-set and take effect + * immediately when CTRL[LDOK] is set. + * + * @param base EQDC peripheral base address + * @param u32PositionInitValue Position initial value + */ +static inline void EQDC_SetInitialPositionValue(EQDC_Type *base, uint32_t u32PositionInitValue) +{ + base->UINIT = (uint16_t)(u32PositionInitValue >> 16U); + base->LINIT = (uint16_t)(u32PositionInitValue); +} + +/*! + * @brief Set position counter value. + * + * Set the position counter value (POS or UPOS, LPOS). + * + * @param base EQDC peripheral base address + * @param positionCounterValue Position counter value + */ +static inline void EQDC_SetPositionCounterValue(EQDC_Type *base, uint32_t positionCounterValue) +{ + base->UPOS = (uint16_t)(positionCounterValue >> 16U); + base->LPOS = (uint16_t)(positionCounterValue); +} + +/*! + * @brief Set position counter modulus value. + * + * Set the position counter modulus value (UMOD, LMOD). + * After writing values to the UMOD and LMOD registers, the values are "buffered" into outer-set + * registers temporarily. Values will be loaded into inner-set registers and take effect using + * the following two methods: + * 1. If CTRL2[LDMODE] is 1, "buffered" values are loaded into inner-set and take effect + * at the next roll-over or roll-under if CTRL[LDOK] is set. + * 2. If CTRL2[LDMODE] is 0, "buffered" values are loaded into inner-set and take effect + * immediately when CTRL[LDOK] is set. + * + * @param base EQDC peripheral base address + * @param positionModulusValue Position modulus value + */ +static inline void EQDC_SetPositionModulusValue(EQDC_Type *base, uint32_t positionModulusValue) +{ + base->UMOD = (uint16_t)(positionModulusValue >> 16U); + base->LMOD = (uint16_t)(positionModulusValue); +} + +/*! + * @brief Set position counter compare 0 value. + * + * Set the position counter compare 0 value (UCOMP0, LCOMP0). + * After writing values to the UCOMP0 and LCOMP0 registers, the values are "buffered" into outer-set + * registers temporarily. Values will be loaded into inner-set registers and take effect using + * the following two methods: + * 1. If CTRL2[LDMODE] is 1, "buffered" values are loaded into inner-set and take effect + * at the next roll-over or roll-under if CTRL[LDOK] is set. + * 2. If CTRL2[LDMODE] is 0, "buffered" values are loaded into inner-set and take effect + * immediately when CTRL[LDOK] is set. + * + * @param base EQDC peripheral base address + * @param u32PositionComp0Value Position modulus value + */ +static inline void EQDC_SetPositionCompare0Value(EQDC_Type *base, uint32_t u32PositionComp0Value) +{ + base->UCOMP0 = (uint16_t)(u32PositionComp0Value >> 16U); + base->LCOMP0 = (uint16_t)(u32PositionComp0Value); +} + +/*! + * @brief Set position counter compare 1 value. + * + * Set the position counter compare 1 value (UCOMP1, LCOMP1). + * After writing values to the UCOMP1 and LCOMP1 registers, the values are "buffered" into outer-set + * registers temporarily. Values will be loaded into inner-set registers and take effect using + * the following two methods: + * 1. If CTRL2[LDMODE] is 1, "buffered" values are loaded into inner-set and take effect + * at the next roll-over or roll-under if CTRL[LDOK] is set. + * 2. If CTRL2[LDMODE] is 0, "buffered" values are loaded into inner-set and take effect + * immediately when CTRL[LDOK] is set. + * + * @param base EQDC peripheral base address + * @param u32PositionComp1Value Position modulus value + */ +static inline void EQDC_SetPositionCompare1Value(EQDC_Type *base, uint32_t u32PositionComp1Value) +{ + base->UCOMP1 = (uint16_t)(u32PositionComp1Value >> 16U); + base->LCOMP1 = (uint16_t)(u32PositionComp1Value); +} + +/*! + * @brief Set position counter compare 2 value. + * + * Set the position counter compare 2 value (UCOMP2, LCOMP2). + * After writing values to the UCOMP2 and LCOMP2 registers, the values are "buffered" into outer-set + * registers temporarily. Values will be loaded into inner-set registers and take effect using + * the following two methods: + * 1. If CTRL2[LDMODE] is 1, "buffered" values are loaded into inner-set and take effect + * at the next roll-over or roll-under if CTRL[LDOK] is set. + * 2. If CTRL2[LDMODE] is 0, "buffered" values are loaded into inner-set and take effect + * immediately when CTRL[LDOK] is set. + * + * @param base EQDC peripheral base address + * @param u32PositionComp2Value Position modulus value + */ +static inline void EQDC_SetPositionCompare2Value(EQDC_Type *base, uint32_t u32PositionComp2Value) +{ + base->UCOMP2 = (uint16_t)(u32PositionComp2Value >> 16U); + base->LCOMP2 = (uint16_t)(u32PositionComp2Value); +} + +/*! + * @brief Set position counter compare 3 value. + * + * Set the position counter compare 3 value (UCOMP3, LCOMP3). + * After writing values to the UCOMP3 and LCOMP3 registers, the values are "buffered" into outer-set + * registers temporarily. Values will be loaded into inner-set registers and take effect using + * the following two methods: + * 1. If CTRL2[LDMODE] is 1, "buffered" values are loaded into inner-set and take effect + * at the next roll-over or roll-under if CTRL[LDOK] is set. + * 2. If CTRL2[LDMODE] is 0, "buffered" values are loaded into inner-set and take effect + * immediately when CTRL[LDOK] is set. + * + * @param base EQDC peripheral base address + * @param u32PositionComp3Value Position modulus value + */ +static inline void EQDC_SetPositionCompare3Value(EQDC_Type *base, uint32_t u32PositionComp3Value) +{ + base->UCOMP3 = (uint16_t)(u32PositionComp3Value >> 16U); + base->LCOMP3 = (uint16_t)(u32PositionComp3Value); +} + +/*! + * @brief Get the current position counter's value. + * + * @param base EQDC peripheral base address. + * + * @return Current position counter's value. + */ +static inline uint32_t EQDC_GetPosition(EQDC_Type *base) +{ + uint32_t u32Pos; + + u32Pos = base->UPOS; /* Get upper 16 bits and make a snapshot. */ + u32Pos <<= 16U; + u32Pos |= base->LPOSH; /* Get lower 16 bits from hold register. */ + + return u32Pos; +} + +/*! + * @brief Get the hold position counter's value. + * + * The position counter (POS or UPOS, LPOS) value is loaded to hold position (POSH or UPOSH, LPOSH) + * when: + * 1. Position register (POS or UPOS, LPOS), or position difference register (POSD), + * or revolution register (REV) is read. + * 2. TRIGGER happens and TRIGGER is enabled to update the hold registers. + * + * @param base EQDC peripheral base address. + * @return Hold position counter's value. + */ +static inline uint32_t EQDC_GetHoldPosition(EQDC_Type *base) +{ + uint32_t u32Pos; + + u32Pos = base->UPOSH; /* Get upper 16 bits from hold register. */ + u32Pos <<= 16U; + u32Pos |= base->LPOSH; /* Get lower 16 bits from hold register. */ + + return u32Pos; +} + +/*! + * @brief Get the hold position counter1's value. + * + * The Upper Position Counter Hold Register 1(UPOSH1) shares the same address with UCOMP1. + * When read, this register means the value of UPOSH1, which is the upper 16 bits of POSH1. + * The Lower Position Counter Hold Register 1(LPOSH1) shares the same address with LCOMP1. + * When read, this register means the value of LPOSH1, which is the lower 16 bits of POSH1. + * Position counter is captured into POSH1 on the rising edge of ICAP[1]. + * + * @param base EQDC peripheral base address. + * @return Hold position counter1's value. + */ +static inline uint32_t EQDC_GetHoldPosition1(EQDC_Type *base) +{ + uint32_t u32Pos; + + u32Pos = base->UPOSH1; /* Get upper 16 bits from hold register. */ + u32Pos <<= 16U; + u32Pos |= base->LPOSH1; /* Get lower 16 bits from hold register. */ + + return u32Pos; +} + +/*! + * @brief Get the hold position counter2's value. + * + * The Upper Position Counter Hold Register 2(UPOSH2) shares the same address with UCOMP2. + * When read,this register means the value of UPOSH2, which is the upper 16 bits of POSH2. + * The Lower Position Counter Hold Register 2(LPOSH2) shares the same address with LCOMP2. + * When read, this register means the value of LPOSH2, which is the lower 16 bits of POSH2. + * Position counter is captured into POSH2 on the rising edge of ICAP[2]. + * + * @param base EQDC peripheral base address. + * @return Hold position counter2's value. + */ +static inline uint32_t EQDC_GetHoldPosition2(EQDC_Type *base) +{ + uint32_t u32Pos; + + u32Pos = base->UPOSH2; /* Get upper 16 bits from hold register. */ + u32Pos <<= 16U; + u32Pos |= base->LPOSH2; /* Get lower 16 bits from hold register. */ + + return u32Pos; +} + +/*! + * @brief Get the hold position counter3's value. + * + * The Upper Position Counter Hold Register 3(UPOSH3) shares the same address with UCOMP3. + * When read,this register means the value of UPOSH3, which is the upper 16 bits of POSH3. + * The Lower Position Counter Hold Register 3(LPOSH3) shares the same address with LCOMP3. + * When read, this register means the value of LPOSH3, which is the lower 16 bits of POSH3. + * Position counter is captured into POSH3 on the rising edge of ICAP[3]. + * + * @param base EQDC peripheral base address. + * @return Hold position counter3's value. + */ +static inline uint32_t EQDC_GetHoldPosition3(EQDC_Type *base) +{ + uint32_t u32Pos; + + u32Pos = base->UPOSH3; /* Get upper 16 bits from hold register. */ + u32Pos <<= 16U; + u32Pos |= base->LPOSH3; /* Get lower 16 bits from hold register. */ + + return u32Pos; +} + +/*! + * @brief Get the position difference counter's value. + * + * @param base EQDC peripheral base address. + * @return The position difference counter's value. + */ +static inline uint16_t EQDC_GetPositionDifference(EQDC_Type *base) +{ + return base->POSD; +} + +/*! + * @brief Get the hold position difference counter's value. + * + * The position difference (POSD) value is loaded to hold position difference (POSDH) + * when: + * 1. Position register (POS or UPOS, LPOS), or position difference register (POSD), + * or revolution register (REV) is read. When Period Measurement is enabled (CTRL3[PMEN] = 1), + * POSDH will only be udpated when reading POSD. + * 2. TRIGGER happens and TRIGGER is enabled to update the hold registers. + * + * @param base EQDC peripheral base address. + * @return Hold position difference counter's value. + */ +static inline uint16_t EQDC_GetHoldPositionDifference(EQDC_Type *base) +{ + return base->POSDH; +} + +/*! + * @brief Get the revolution counter's value. + * + * Get the revolution counter (REV) value. + * + * @param base EQDC peripheral base address. + * @return The revolution counter's value. + */ +static inline uint16_t EQDC_GetRevolution(EQDC_Type *base) +{ + return base->REV; +} + +/*! + * @brief Get the hold revolution counter's value. + * + * The revolution counter (REV) value is loaded to hold revolution (REVH) + * when: + * 1. Position register (POS or UPOS, LPOS), or position difference register (POSD), + * or revolution register (REV) is read. + * 2. TRIGGER happens and TRIGGER is enabled to update the hold registers. + * + * @param base EQDC peripheral base address. + * @return Hold position revolution counter's value. + */ +static inline uint16_t EQDC_GetHoldRevolution(EQDC_Type *base) +{ + return base->REVH; +} + +/*! + * @brief Get the last edge time. + * + * Last edge time (LASTEDGE) is the time since the last edge occurred on PHASEA or PHASEB. + * The last edge time register counts up using the peripheral clock after prescaler. + * Any edge on PHASEA or PHASEB will reset this register to 0 and start counting. + * If the last edge timer count reaches 0xffff, the counting will stop in order to + * prevent an overflow.Counting will continue when an edge occurs on + * PHASEA or PHASEB. + * + * @param base EQDC peripheral base address. + * + * @return The last edge time. + */ +static inline uint16_t EQDC_GetLastEdgeTime(EQDC_Type *base) +{ + return base->LASTEDGE; +} + +/*! + * @brief Get the hold last edge time. + * + * The hold of last edge time(LASTEDGEH) is update to last edge time(LASTEDGE) + * when the position difference register register (POSD) is read. + * + * @param base EQDC peripheral base address. + * @return Hold of last edge time. + */ +static inline uint16_t EQDC_GetHoldLastEdgeTime(EQDC_Type *base) +{ + return base->LASTEDGEH; +} + +/*! + * @brief Get the Position Difference Period counter value + * + * The Position Difference Period counter (POSDPER) counts up using the + * prescaled peripheral clock. When reading the position difference register(POSD), + * the last edge time (LASTEDGE) will be loaded to position difference period counter(POSDPER). + * If the POSDPER count reaches 0xffff, the counting will stop in order to prevent an + * overflow. Counting will continue when an edge occurs on PHASEA or PHASEB. + * + * @param base EQDC peripheral base address. + * @return The position difference period counter value. + */ +static inline uint16_t EQDC_GetPositionDifferencePeriod(EQDC_Type *base) +{ + return base->POSDPER; +} + +/*! + * @brief Get buffered Position Difference Period counter value + * + * The Bufferd Position Difference Period (POSDPERBFR) value is updated with + * the position difference period counter(POSDPER) when any edge occurs + * on PHASEA or PHASEB. + * + * @param base EQDC peripheral base address. + * @return The buffered position difference period counter value. + */ +static inline uint16_t EQDC_GetBufferedPositionDifferencePeriod(EQDC_Type *base) +{ + return base->POSDPERBFR; +} + +/*! + * @brief Get Hold Position Difference Period counter value + * + * The hold position difference period(POSDPERH) is updated with the value of + * buffered position difference period(POSDPERBFR) when the + * position difference(POSD) register is read. + * + * @param base EQDC peripheral base address. + * @return The hold position difference period counter value. + */ +static inline uint16_t EQDC_GetHoldPositionDifferencePeriod(EQDC_Type *base) +{ + return base->POSDPERH; +} + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* FSL_EQDC_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_erm.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_erm.c new file mode 100644 index 00000000000..cdd35b56b09 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_erm.c @@ -0,0 +1,317 @@ +/* + * Copyright 2022 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_erm.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.erm" +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to ERM bases for each instance. */ +static ERM_Type *const s_ermBases[] = ERM_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to ERM clocks for each instance. */ +static const clock_ip_name_t s_ermClocks[] = ERM_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t ERM_GetInstance(ERM_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_ermBases); instance++) + { + if (s_ermBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_ermBases)); + + return instance; +} + +/*! + * brief ERM module initialization function. + * + * param base ERM base address. + */ +void ERM_Init(ERM_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate ERM clock. */ + CLOCK_EnableClock(s_ermClocks[ERM_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + base->CR0 = 0x00U; +#ifdef ERM_CR1_ENCIE8_MASK + base->CR1 = 0x00U; +#endif + base->SR0 = 0xFFFFFFFFU; +#ifdef ERM_SR1_SBC8_MASK + base->SR1 = 0xFFFFFFFFU; +#endif +} + +/*! + * brief Deinitializes the ERM. + * + */ +void ERM_Deinit(ERM_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate ERM clock. */ + CLOCK_DisableClock(s_ermClocks[ERM_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +uint32_t ERM_GetMemoryErrorAddr(ERM_Type *base, erm_memory_channel_t channel) +{ + uint32_t absoluteErrorAddress = 0x00U; + + switch ((uint8_t)channel) + { + case 0U: + absoluteErrorAddress = base->EAR0; + break; +#ifdef ERM_EAR1_EAR_MASK + case 1U: + absoluteErrorAddress = base->EAR1; + break; +#endif +#ifdef ERM_EAR2_EAR_MASK + case 2U: + absoluteErrorAddress = base->EAR2; + break; +#endif +#ifdef ERM_EAR3_EAR_MASK + case 3U: + absoluteErrorAddress = base->EAR3; + break; +#endif +#ifdef ERM_EAR4_EAR_MASK + case 4U: + absoluteErrorAddress = base->EAR4; + break; +#endif +#ifdef ERM_EAR5_EAR_MASK + case 5U: + absoluteErrorAddress = base->EAR5; + break; +#endif +#ifdef ERM_EAR6_EAR_MASK + case 6U: + absoluteErrorAddress = base->EAR6; + break; +#endif + default: + assert(NULL); + break; + } + + return absoluteErrorAddress; +} + +uint32_t ERM_GetSyndrome(ERM_Type *base, erm_memory_channel_t channel) +{ + uint32_t syndrome = 0x00U; + + switch ((uint8_t)channel) + { + case 0U: + syndrome = (base->SYN0 & ERM_SYN0_SYNDROME_MASK) >> ERM_SYN0_SYNDROME_SHIFT; + break; +#ifdef ERM_SYN1_SYNDROME_MASK + case 1U: + syndrome = (base->SYN1 & ERM_SYN1_SYNDROME_MASK) >> ERM_SYN1_SYNDROME_SHIFT; + break; +#endif +#ifdef ERM_SYN2_SYNDROME_MASK + case 2U: + syndrome = (base->SYN2 & ERM_SYN2_SYNDROME_MASK) >> ERM_SYN2_SYNDROME_SHIFT; + break; +#endif +#ifdef ERM_SYN3_SYNDROME_MASK + case 3U: + syndrome = (base->SYN3 & ERM_SYN3_SYNDROME_MASK) >> ERM_SYN3_SYNDROME_SHIFT; + break; +#endif +#ifdef ERM_SYN4_SYNDROME_MASK + case 4U: + syndrome = (base->SYN4 & ERM_SYN4_SYNDROME_MASK) >> ERM_SYN4_SYNDROME_SHIFT; + break; +#endif +#ifdef ERM_SYN5_SYNDROME_MASK + case 5U: + syndrome = (base->SYN5 & ERM_SYN5_SYNDROME_MASK) >> ERM_SYN5_SYNDROME_SHIFT; + break; +#endif +#ifdef ERM_SYN6_SYNDROME_MASK + case 6U: + syndrome = (base->SYN6 & ERM_SYN6_SYNDROME_MASK) >> ERM_SYN6_SYNDROME_SHIFT; + break; +#endif +#ifdef ERM_SYN7_SYNDROME_MASK + case 7U: + syndrome = (base->SYN7 & ERM_SYN6_SYNDROME_MASK) >> ERM_SYN7_SYNDROME_SHIFT; + break; +#endif +#ifdef ERM_SYN8_SYNDROME_MASK + case 8U: + syndrome = (base->SYN8 & ERM_SYN8_SYNDROME_MASK) >> ERM_SYN8_SYNDROME_SHIFT; + break; +#endif +#ifdef ERM_SYN9_SYNDROME_MASK + case 8U: + syndrome = (base->SYN9 & ERM_SYN9_SYNDROME_MASK) >> ERM_SYN9_SYNDROME_SHIFT; + break; +#endif + default: + assert(NULL); + break; + } + + return syndrome; +} + +uint32_t ERM_GetErrorCount(ERM_Type *base, erm_memory_channel_t channel) +{ + uint32_t count = 0x00U; + + switch ((uint8_t)channel) + { + case 0U: + count = (base->CORR_ERR_CNT0 & ERM_CORR_ERR_CNT0_COUNT_MASK) >> ERM_CORR_ERR_CNT0_COUNT_SHIFT; + break; +#ifdef ERM_CORR_ERR_CNT1_COUNT_MASK + case 1U: + count = (base->CORR_ERR_CNT1 & ERM_CORR_ERR_CNT1_COUNT_MASK) >> ERM_CORR_ERR_CNT1_COUNT_SHIFT; + break; +#endif +#ifdef ERM_CORR_ERR_CNT2_COUNT_MASK + case 2U: + count = (base->CORR_ERR_CNT2 & ERM_CORR_ERR_CNT2_COUNT_MASK) >> ERM_CORR_ERR_CNT2_COUNT_SHIFT; + break; +#endif +#ifdef ERM_CORR_ERR_CNT3_COUNT_MASK + case 3U: + count = (base->CORR_ERR_CNT3 & ERM_CORR_ERR_CNT3_COUNT_MASK) >> ERM_CORR_ERR_CNT3_COUNT_SHIFT; + break; +#endif +#ifdef ERM_CORR_ERR_CNT4_COUNT_MASK + case 4U: + count = (base->CORR_ERR_CNT4 & ERM_CORR_ERR_CNT4_COUNT_MASK) >> ERM_CORR_ERR_CNT4_COUNT_SHIFT; + break; +#endif +#ifdef ERM_CORR_ERR_CNT5_COUNT_MASK + case 5U: + count = (base->CORR_ERR_CNT5 & ERM_CORR_ERR_CNT5_COUNT_MASK) >> ERM_CORR_ERR_CNT5_COUNT_SHIFT; + break; +#endif +#ifdef ERM_CORR_ERR_CNT6_COUNT_MASK + case 6U: + count = (base->CORR_ERR_CNT6 & ERM_CORR_ERR_CNT6_COUNT_MASK) >> ERM_CORR_ERR_CNT6_COUNT_SHIFT; + break; +#endif +#ifdef ERM_CORR_ERR_CNT7_COUNT_MASK + case 7U: + count = (base->CORR_ERR_CNT7 & ERM_CORR_ERR_CNT7_COUNT_MASK) >> ERM_CORR_ERR_CNT7_COUNT_SHIFT; + break; +#endif +#ifdef ERM_CORR_ERR_CNT8_COUNT_MASK + case 8U: + count = (base->CORR_ERR_CNT8 & ERM_CORR_ERR_CNT8_COUNT_MASK) >> ERM_CORR_ERR_CNT8_COUNT_SHIFT; + break; +#endif +#ifdef ERM_CORR_ERR_CNT9_COUNT_MASK + case 9U: + count = (base->CORR_ERR_CNT9 & ERM_CORR_ERR_CNT9_COUNT_MASK) >> ERM_CORR_ERR_CNT9_COUNT_SHIFT; + break; +#endif + default: + assert(NULL); + break; + } + + return count; +} + +void ERM_ResetErrorCount(ERM_Type *base, erm_memory_channel_t channel) +{ + switch ((uint8_t)channel) + { + case 0U: + base->CORR_ERR_CNT0 = 0x00U; + break; + +#ifdef ERM_CORR_ERR_CNT1_COUNT_MASK + case 1U: + base->CORR_ERR_CNT1 = 0x00U; + break; +#endif +#ifdef ERM_CORR_ERR_CNT2_COUNT_MASK + case 2U: + base->CORR_ERR_CNT2 = 0x00U; + break; +#endif +#ifdef ERM_CORR_ERR_CNT3_COUNT_MASK + case 3U: + base->CORR_ERR_CNT3 = 0x00U; + break; +#endif +#ifdef ERM_CORR_ERR_CNT4_COUNT_MASK + case 4U: + base->CORR_ERR_CNT4 = 0x00U; + break; +#endif +#ifdef ERM_CORR_ERR_CNT5_COUNT_MASK + case 5U: + base->CORR_ERR_CNT5 = 0x00U; + break; +#endif +#ifdef ERM_CORR_ERR_CNT6_COUNT_MASK + case 6U: + base->CORR_ERR_CNT6 = 0x00U; + break; +#endif +#ifdef ERM_CORR_ERR_CNT6_COUNT_MASK + case 7U: + base->CORR_ERR_CNT7 = 0x00U; + break; +#endif +#ifdef ERM_CORR_ERR_CNT8_COUNT_MASK + case 8U: + base->CORR_ERR_CNT8 = 0x00U; + break; +#endif +#ifdef ERM_CORR_ERR_CNT9_COUNT_MASK + case 9U: + base->CORR_ERR_CNT9 = 0x00U; + break; +#endif + default: + assert(NULL); + break; + } +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_erm.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_erm.h new file mode 100644 index 00000000000..45303523e76 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_erm.h @@ -0,0 +1,235 @@ +/* + * Copyright 2022 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_ERM_H_ +#define FSL_ERM_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup erm + * @{ + */ + +/****************************************************************************** + * Definitions. + *****************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief Driver version. */ +#define FSL_ERM_DRIVER_VERSION (MAKE_VERSION(2U, 0U, 1U)) +/*! @} */ + +/*! + * @brief ERM interrupt configuration structure, default settings all disabled, _erm_interrupt_enable. + * + * This structure contains the settings for all of the ERM interrupt configurations. + */ +enum +{ + kERM_SingleCorrectionIntEnable = 0x08U, /*!< Single Correction Interrupt Notification enable.*/ + kERM_NonCorrectableIntEnable = 0x04U, /*!< Non-Correction Interrupt Notification enable.*/ + + kERM_AllInterruptsEnable = 0xFFFFFFFFUL, /*!< All Interrupts enable */ +}; + +/*! + * @brief ERM interrupt status, _erm_interrupt_flag. + * + * This provides constants for the ERM event status for use in the ERM functions. + */ +enum +{ + kERM_SingleBitCorrectionIntFlag = 0x08U, /*!< Single-Bit Correction Event.*/ + kERM_NonCorrectableErrorIntFlag = 0x04U, /*!< Non-Correctable Error Event.*/ + + kERM_AllIntsFlag = 0xFFFFFFFFUL, /*!< All Events. */ +}; + +/******************************************************************************* + * APIs + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and de-initialization + * @{ + */ + +/*! + * @brief ERM module initialization function. + * + * @param base ERM base address. + */ +void ERM_Init(ERM_Type *base); + +/*! + * @brief De-initializes the ERM. + * + */ +void ERM_Deinit(ERM_Type *base); + +/*! @} */ + +/*! + * @name Interrupt + * @{ + */ +/*! + * @brief ERM enable interrupts. + * + * @param base ERM peripheral base address. + * @param channel memory channel. + * @param mask single correction interrupt or non-correction interrupt enable to disable for one specific memory region. + * Refer to "_erm_interrupt_enable" enumeration. + */ +static inline void ERM_EnableInterrupts(ERM_Type *base, erm_memory_channel_t channel, uint32_t mask) +{ + uint32_t temp = 0x00U; + if ((uint32_t)channel <= 0x07U) + { + temp = base->CR0; + base->CR0 = + (temp & ~(0x0CUL << ((0x07U - (uint32_t)channel) * 4U))) | (mask << ((0x07U - (uint32_t)channel) * 4U)); + } +#ifdef ERM_CR1_ESCIE8_MASK + else + { + temp = base->CR1; + base->CR1 = (temp & ~(0x0CUL << ((0x07U + 0x08U - (uint32_t)channel) * 4U))) | + (mask << ((0x07U + 0x08U - (uint32_t)channel) * 4U)); + } +#endif +} + +/*! + * @brief ERM module disable interrupts. + * + * @param base ERM base address. + * @param channel memory channel. + * @param mask single correction interrupt or non-correction interrupt enable to disable for one specific memory region. + * Refer to "_erm_interrupt_enable" enumeration. + */ +static inline void ERM_DisableInterrupts(ERM_Type *base, erm_memory_channel_t channel, uint32_t mask) +{ + if ((uint32_t)channel <= 0x07U) + { + base->CR0 &= ~(mask << ((0x07U - (uint32_t)channel) * 4U)); + } +#ifdef ERM_CR1_ESCIE8_MASK + else + { + base->CR1 &= ~(mask << ((0x07U + 0x08U - (uint32_t)channel) * 4U)); + } +#endif +} + +/*! + * @brief Gets ERM interrupt flags. + * + * @param base ERM peripheral base address. + * @return ERM event flags. + */ +static inline uint32_t ERM_GetInterruptStatus(ERM_Type *base, erm_memory_channel_t channel) +{ + if ((uint32_t)channel <= 0x07U) + { + return ((base->SR0 & (uint32_t)kERM_AllIntsFlag) >> (0x07U - (uint32_t)channel) * 4U); + } +#ifdef ERM_SR1_SBC8_MASK + else + { + return ((base->SR1 & (uint32_t)kERM_AllIntsFlag) >> ((0x07U + 0x08U - (uint32_t)channel) * 4U)); + } +#else + { + return 0; + } +#endif +} + +/*! + * @brief ERM module clear interrupt status flag. + * + * @param base ERM base address. + * @param mask event flag to clear. Refer to "_erm_interrupt_flag" enumeration. + */ +static inline void ERM_ClearInterruptStatus(ERM_Type *base, erm_memory_channel_t channel, uint32_t mask) +{ + if ((uint32_t)channel <= 0x07U) + { + base->SR0 = mask << ((0x07U - (uint32_t)channel) * 4U); + } +#ifdef ERM_SR1_SBC8_MASK + else + { + base->SR1 = mask << ((0x07U + 0x08U - (uint32_t)channel) * 4U); + } +#endif +} + +/*! @} */ + +/*! + * @name functional + * @{ + */ + +/*! + * @brief ERM get memory error absolute address, which capturing the address of the last ECC event in Memory n. + * + * @param base ERM base address. + * @param channel memory channel. + * @retval memory error absolute address. + */ + +uint32_t ERM_GetMemoryErrorAddr(ERM_Type *base, erm_memory_channel_t channel); + +/*! + * @brief ERM get syndrome, which identifies the pertinent bit position on a correctable, single-bit data inversion or a + * non-correctable, single-bit address inversion. The syndrome value does not provide any additional diagnostic + * information on non-correctable, multi-bit inversions. + * + * @param base ERM base address. + * @param channel memory channel. + * @retval syndrome value. + */ +uint32_t ERM_GetSyndrome(ERM_Type *base, erm_memory_channel_t channel); + +/*! + * @brief ERM get error count, which records the count value of the number of correctable ECC error events for Memory + * n. Non-correctable errors are considered a serious fault, so the ERM does not provide any mechanism to count + * non-correctable errors. Only correctable errors are counted. + * + * @param base ERM base address. + * @param channel memory channel. + * @retval error count. + */ +uint32_t ERM_GetErrorCount(ERM_Type *base, erm_memory_channel_t channel); + +/*! + * @brief ERM reset error count. + * + * @param base ERM base address. + * @param channel memory channel. + */ +void ERM_ResetErrorCount(ERM_Type *base, erm_memory_channel_t channel); + +/*! @}*/ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan.c new file mode 100644 index 00000000000..8717791e182 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan.c @@ -0,0 +1,4927 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexcan.h" + +/* + * $Coverage Justification Reference$ + * + * $Justification flexcan_c_ref_1$ + * The FLEXCAN_ReadRxFifo() return fail only when Rx FIFO is diabled. But in IRQ handler, will first check whether the + * FIFO is enabled, and only call FLEXCAN_ReadRxFifo if the FIFO is enabled. So to cover this line/branch, need to + * interrupt the current execution by a high priority IRQ after confirming that the FIFO is enabled, and disabled the + * FIFO in the high priority interrupt. It is difficult to simulate this situation in unit test, so add Justification. + * + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexcan" +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) +#define RXINTERMISSION (CAN_DBG1_CFSM(0x2f)) +#define TXINTERMISSION (CAN_DBG1_CFSM(0x14)) +#define BUSIDLE (CAN_DBG1_CFSM(0x02)) +#define CBN_VALUE3 (CAN_DBG1_CBN(0x03)) +#define DELAY_BUSIDLE (200) +#endif + +/* According to CiA doc 1301 v1.0.0, specified data/nominal phase sample point postion for CAN FD at 80 MHz. */ +#define IDEAL_DATA_SP_1 (800U) +#define IDEAL_DATA_SP_2 (750U) +#define IDEAL_DATA_SP_3 (700U) +#define IDEAL_DATA_SP_4 (625U) +#define IDEAL_NOMINAL_SP (800U) + +/* According to CiA doc 301 v4.2.0 and previous version. */ +#define IDEAL_SP_LOW (750U) +#define IDEAL_SP_MID (800U) +#define IDEAL_SP_HIGH (875U) + +#define IDEAL_SP_FACTOR (1000U) + +/* Define the max value of bit timing segments when use different timing register. */ +#define MAX_PROPSEG (CAN_CTRL1_PROPSEG_MASK >> CAN_CTRL1_PROPSEG_SHIFT) +#define MAX_PSEG1 (CAN_CTRL1_PSEG1_MASK >> CAN_CTRL1_PSEG1_SHIFT) +#define MAX_PSEG2 (CAN_CTRL1_PSEG2_MASK >> CAN_CTRL1_PSEG2_SHIFT) +#define MAX_RJW (CAN_CTRL1_RJW_MASK >> CAN_CTRL1_RJW_SHIFT) +#define MAX_PRESDIV (CAN_CTRL1_PRESDIV_MASK >> CAN_CTRL1_PRESDIV_SHIFT) +#define CTRL1_MAX_TIME_QUANTA (1U + MAX_PROPSEG + 1U + MAX_PSEG1 + 1U + MAX_PSEG2 + 1U) +#define CTRL1_MIN_TIME_QUANTA (8U) + +#define MAX_EPROPSEG (CAN_CBT_EPROPSEG_MASK >> CAN_CBT_EPROPSEG_SHIFT) +#define MAX_EPSEG1 (CAN_CBT_EPSEG1_MASK >> CAN_CBT_EPSEG1_SHIFT) +#define MAX_EPSEG2 (CAN_CBT_EPSEG2_MASK >> CAN_CBT_EPSEG2_SHIFT) +#define MAX_ERJW (CAN_CBT_ERJW_MASK >> CAN_CBT_ERJW_SHIFT) +#define MAX_EPRESDIV (CAN_CBT_EPRESDIV_MASK >> CAN_CBT_EPRESDIV_SHIFT) +#define CBT_MAX_TIME_QUANTA (1U + MAX_EPROPSEG + 1U + MAX_EPSEG1 + 1U + MAX_EPSEG2 + 1U) +#define CBT_MIN_TIME_QUANTA (8U) + +#define MAX_FPROPSEG (CAN_FDCBT_FPROPSEG_MASK >> CAN_FDCBT_FPROPSEG_SHIFT) +#define MAX_FPSEG1 (CAN_FDCBT_FPSEG1_MASK >> CAN_FDCBT_FPSEG1_SHIFT) +#define MAX_FPSEG2 (CAN_FDCBT_FPSEG2_MASK >> CAN_FDCBT_FPSEG2_SHIFT) +#define MAX_FRJW (CAN_FDCBT_FRJW_MASK >> CAN_FDCBT_FRJW_SHIFT) +#define MAX_FPRESDIV (CAN_FDCBT_FPRESDIV_MASK >> CAN_FDCBT_FPRESDIV_SHIFT) +#define FDCBT_MAX_TIME_QUANTA (1U + MAX_FPROPSEG + 0U + MAX_FPSEG1 + 1U + MAX_FPSEG2 + 1U) +#define FDCBT_MIN_TIME_QUANTA (5U) + +#define MAX_TDCOFF ((uint32_t)CAN_FDCTRL_TDCOFF_MASK >> CAN_FDCTRL_TDCOFF_SHIFT) + +#define MAX_NTSEG1 (CAN_ENCBT_NTSEG1_MASK >> CAN_ENCBT_NTSEG1_SHIFT) +#define MAX_NTSEG2 (CAN_ENCBT_NTSEG2_MASK >> CAN_ENCBT_NTSEG2_SHIFT) +#define MAX_NRJW (CAN_ENCBT_NRJW_MASK >> CAN_ENCBT_NRJW_SHIFT) +#define MAX_ENPRESDIV (CAN_EPRS_ENPRESDIV_MASK >> CAN_EPRS_ENPRESDIV_SHIFT) +#define ENCBT_MAX_TIME_QUANTA (1U + MAX_NTSEG1 + 1U + MAX_NTSEG2 + 1U) +#define ENCBT_MIN_TIME_QUANTA (8U) + +#define MAX_DTSEG1 (CAN_EDCBT_DTSEG1_MASK >> CAN_EDCBT_DTSEG1_SHIFT) +#define MAX_DTSEG2 (CAN_EDCBT_DTSEG2_MASK >> CAN_EDCBT_DTSEG2_SHIFT) +#define MAX_DRJW (CAN_EDCBT_DRJW_MASK >> CAN_EDCBT_DRJW_SHIFT) +#define MAX_EDPRESDIV (CAN_EPRS_EDPRESDIV_MASK >> CAN_EPRS_EDPRESDIV_SHIFT) +#define EDCBT_MAX_TIME_QUANTA (1U + MAX_DTSEG1 + 1U + MAX_DTSEG2 + 1U) +#define EDCBT_MIN_TIME_QUANTA (5U) + +#define MAX_ETDCOFF ((uint32_t)CAN_ETDC_ETDCOFF_MASK >> CAN_ETDC_ETDCOFF_SHIFT) + +/* TSEG1 corresponds to the sum of xPROPSEG and xPSEG1, TSEG2 corresponds to the xPSEG2 value. */ +#define MIN_TIME_SEGMENT1 (2U) +#define MIN_TIME_SEGMENT2 (2U) + +/* Define maximum CAN and CAN FD bit rate supported by FLEXCAN. */ +#if (defined(FSL_FEATURE_FLEXCAN_MAX_CANFD_BITRATE)) +#define MAX_CANFD_BITRATE ((uint32_t)(FSL_FEATURE_FLEXCAN_MAX_CANFD_BITRATE)) +#else +#define MAX_CANFD_BITRATE (8000000U) +#endif +#define MAX_CAN_BITRATE (1000000U) + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595) +#define CAN_ESR1_FLTCONF_BUSOFF CAN_ESR1_FLTCONF(2U) +#endif + +/* Define the range of memory that needs to be initialized when the device has memory error detection feature. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +#define CAN_INIT_RXFIR ((uintptr_t)base + 0x4Cu) +#define CAN_INIT_MEMORY_BASE_1 (uint32_t *)((uintptr_t)base + (uintptr_t)FSL_FEATURE_FLEXCAN_INIT_MEMORY_BASE_1) +#define CAN_INIT_MEMORY_SIZE_1 FSL_FEATURE_FLEXCAN_INIT_MEMORY_SIZE_1 +#define CAN_INIT_MEMORY_BASE_2 (uint32_t *)((uintptr_t)base + (uintptr_t)FSL_FEATURE_FLEXCAN_INIT_MEMORY_BASE_2) +#define CAN_INIT_MEMORY_SIZE_2 FSL_FEATURE_FLEXCAN_INIT_MEMORY_SIZE_2 +#endif + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +#ifndef CAN_CLOCK_CHECK_NO_AFFECTS +/* If no define such MACRO, it mean that the CAN in current device have no clock affect issue. */ +#define CAN_CLOCK_CHECK_NO_AFFECTS (true) +#endif /* CAN_CLOCK_CHECK_NO_AFFECTS */ +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(FLEXCAN_RSTS) +#define FLEXCAN_RESETS_ARRAY FLEXCAN_RSTS +#elif defined(FLEXCAN_RSTS_N) +#define FLEXCAN_RESETS_ARRAY FLEXCAN_RSTS_N +#endif + +/*! @brief FlexCAN Internal State. */ +enum _flexcan_state +{ + kFLEXCAN_StateIdle = 0x0, /*!< MB/RxFIFO idle.*/ + kFLEXCAN_StateRxData = 0x1, /*!< MB receiving.*/ + kFLEXCAN_StateRxRemote = 0x2, /*!< MB receiving remote reply.*/ + kFLEXCAN_StateTxData = 0x3, /*!< MB transmitting.*/ + kFLEXCAN_StateTxRemote = 0x4, /*!< MB transmitting remote request.*/ + kFLEXCAN_StateRxFifo = 0x5, /*!< RxFIFO receiving.*/ +}; + +/*! @brief FlexCAN message buffer CODE for Rx buffers. */ +enum _flexcan_mb_code_rx +{ + kFLEXCAN_RxMbInactive = 0x0, /*!< MB is not active.*/ + kFLEXCAN_RxMbFull = 0x2, /*!< MB is full.*/ + kFLEXCAN_RxMbEmpty = 0x4, /*!< MB is active and empty.*/ + kFLEXCAN_RxMbOverrun = 0x6, /*!< MB is overwritten into a full buffer.*/ + kFLEXCAN_RxMbBusy = 0x8, /*!< FlexCAN is updating the contents of the MB, The CPU must not access the MB.*/ + kFLEXCAN_RxMbRanswer = 0xA, /*!< A frame was configured to recognize a Remote Request Frame and transmit a + Response Frame in return.*/ + kFLEXCAN_RxMbNotUsed = 0xF, /*!< Not used.*/ +}; + +/*! @brief FlexCAN message buffer CODE FOR Tx buffers. */ +enum _flexcan_mb_code_tx +{ + kFLEXCAN_TxMbInactive = 0x8, /*!< MB is not active.*/ + kFLEXCAN_TxMbAbort = 0x9, /*!< MB is aborted.*/ + kFLEXCAN_TxMbDataOrRemote = 0xC, /*!< MB is a TX Data Frame(when MB RTR = 0) or MB is a TX Remote Request + Frame (when MB RTR = 1).*/ + kFLEXCAN_TxMbTanswer = 0xE, /*!< MB is a TX Response Request Frame from an incoming Remote Request Frame.*/ + kFLEXCAN_TxMbNotUsed = 0xF, /*!< Not used.*/ +}; + +/* Typedef for interrupt handler. */ +typedef void (*flexcan_isr_t)(CAN_Type *base, flexcan_handle_t *handle); + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +#if !defined(NDEBUG) +/*! + * @brief Check if Message Buffer is occupied by Rx FIFO. + * + * This function check if Message Buffer is occupied by Rx FIFO. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The FlexCAN Message Buffer index. + * @return TRUE if the index MB is occupied by Rx FIFO, FALSE if the index MB not occupied by Rx FIFO. + */ +static bool FLEXCAN_IsMbOccupied(CAN_Type *base, uint8_t mbIdx); +#endif + +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) +/*! + * @brief Get the first valid Message buffer ID of give FlexCAN instance. + * + * This function is a helper function for Errata 5641 workaround. + * + * @param base FlexCAN peripheral base address. + * @return The first valid Message Buffer Number. + */ +static uint8_t FLEXCAN_GetFirstValidMb(CAN_Type *base); +#endif + +/*! + * @brief Reset the FlexCAN Instance. + * + * Restores the FlexCAN module to reset state, notice that this function + * will set all the registers to reset state so the FlexCAN module can not work + * after calling this API. + * + * @param base FlexCAN peripheral base address. + */ +static void FLEXCAN_Reset(CAN_Type *base); + +/*! + * @brief Calculates the segment values for a single bit time for classical CAN. + * + * This function use to calculates the Classical CAN segment values which will be set in CTRL1/CBT/ENCBT register. + * + * @param base FlexCAN peripheral base address. + * @param tqNum Number of time quantas per bit, range in 8 ~ 25 when use CTRL1, range in 8 ~ 129 when use CBT, range in + * 8 ~ 385 when use ENCBT. param pTimingConfig Pointer to the FlexCAN timing configuration structure. + */ +static void FLEXCAN_GetSegments(CAN_Type *base, + uint32_t bitRate, + uint32_t tqNum, + flexcan_timing_config_t *pTimingConfig); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Get Mailbox offset number by dword. + * + * This function gets the offset number of the specified mailbox. + * Mailbox is not consecutive between memory regions when payload is not 8 bytes + * so need to calculate the specified mailbox address. + * For example, in the first memory region, MB[0].CS address is 0x4002_4080. For 32 bytes + * payload frame, the second mailbox is ((1/12)*512 + 1%12*40)/4 = 10, meaning 10 dword + * after the 0x4002_4080, which is actually the address of mailbox MB[1].CS. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx Mailbox index. + */ +static uint32_t FLEXCAN_GetFDMailboxOffset(CAN_Type *base, uint8_t mbIdx); + +/*! + * @brief Calculates the segment values for a single bit time for CAN FD data phase. + * + * This function use to calculates the CAN FD data phase segment values which will be set in CFDCBT/EDCBT + * register. + * + * @param bitRateFD Data phase bit rate + * @param tqNum Number of time quanta per bit + * @param pTimingConfig Pointer to the FlexCAN timing configuration structure. + */ +static void FLEXCAN_FDGetSegments(uint32_t bitRateFD, uint32_t tqNum, flexcan_timing_config_t *pTimingConfig); + +/*! + * @brief Calculates the improved timing values by specific bit rate for CAN FD nominal phase. + * + * This function use to calculates the CAN FD nominal phase timing values according to the given nominal phase bit rate. + * The Calculated timing values will be set in CBT/ENCBT registers. The calculation is based on the recommendation of + * the CiA 1301 v1.0.0 document. + * + * @param bitRate The CAN FD nominal phase speed in bps defined by user, should be less than or equal to 1Mbps. + * @param sourceClock_Hz The Source clock frequency in Hz. + * @param pTimingConfig Pointer to the FlexCAN timing configuration structure. + * + * @return TRUE if timing configuration found, FALSE if failed to find configuration. + */ +static bool FLEXCAN_CalculateImprovedNominalTimingValues(uint32_t bitRate, + uint32_t sourceClock_Hz, + flexcan_timing_config_t *pTimingConfig); + +#endif + +/*! + * @brief Check unhandle interrupt events + * + * @param base FlexCAN peripheral base address. + * @return TRUE if unhandled interrupt action exist, FALSE if no unhandlered interrupt action exist. + */ +static bool FLEXCAN_CheckUnhandleInterruptEvents(CAN_Type *base); + +/*! + * @brief Sub Handler Data Trasfered Events + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param pResult Pointer to the Handle result. + * + * @return the status after handle each data transfered event. + */ +static status_t FLEXCAN_SubHandlerForDataTransfered(CAN_Type *base, flexcan_handle_t *handle, uint32_t *pResult); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * @brief Sub Handler Ehanced Rx FIFO event + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param flags FlexCAN interrupt flags. + * + * @return the status after handle Ehanced Rx FIFO event. + */ +static status_t FLEXCAN_SubHandlerForEhancedRxFifo(CAN_Type *base, flexcan_handle_t *handle, uint64_t flags); +#endif + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Array of FlexCAN peripheral base address. */ +static CAN_Type *const s_flexcanBases[] = CAN_BASE_PTRS; + +/* Array of FlexCAN IRQ number. */ +static const IRQn_Type s_flexcanRxWarningIRQ[] = CAN_Rx_Warning_IRQS; +static const IRQn_Type s_flexcanTxWarningIRQ[] = CAN_Tx_Warning_IRQS; +static const IRQn_Type s_flexcanWakeUpIRQ[] = CAN_Wake_Up_IRQS; +static const IRQn_Type s_flexcanErrorIRQ[] = CAN_Error_IRQS; +static const IRQn_Type s_flexcanBusOffIRQ[] = CAN_Bus_Off_IRQS; +static const IRQn_Type s_flexcanMbIRQ[] = CAN_ORed_Message_buffer_IRQS; + +/* Array of FlexCAN handle. */ +static flexcan_handle_t *s_flexcanHandle[ARRAY_SIZE(s_flexcanBases)]; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/* Array of FlexCAN clock name. */ +static const clock_ip_name_t s_flexcanClock[] = FLEXCAN_CLOCKS; +#if defined(FLEXCAN_PERIPH_CLOCKS) +/* Array of FlexCAN serial clock name. */ +static const clock_ip_name_t s_flexcanPeriphClock[] = FLEXCAN_PERIPH_CLOCKS; +#endif /* FLEXCAN_PERIPH_CLOCKS */ +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(FLEXCAN_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_flexcanResets[] = FLEXCAN_RESETS_ARRAY; +#endif + +/* FlexCAN ISR for transactional APIs. */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +static flexcan_isr_t s_flexcanIsr = (flexcan_isr_t)DefaultISR; +#else +static flexcan_isr_t s_flexcanIsr; +#endif + +/******************************************************************************* + * Implementation of 32-bit memset + ******************************************************************************/ + +static void flexcan_memset(void *s, uint32_t c, size_t n) +{ + size_t m; + volatile uint32_t *ptr = s; + + m = n / sizeof(*ptr); + + while ((m--) != (size_t)0) + { + *ptr++ = c; + } +} + +/******************************************************************************* + * Code + ******************************************************************************/ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Determine whether the FlexCAN instance support CAN FD mode at run time. + * + * note Use this API only if different soc parts share the SOC part name macro define. Otherwise, a different SOC part + * name can be used to determine at compile time whether the FlexCAN instance supports CAN FD mode or not. + * If need use this API to determine if CAN FD mode is supported, the FLEXCAN_Init function needs to be + * executed first, and then call this API and use the return to value determines whether to supports CAN FD mode, + * if return true, continue calling FLEXCAN_FDInit to enable CAN FD mode. + * + * param base FlexCAN peripheral base address. + * return return TRUE if instance support CAN FD mode, FALSE if instance only support classic CAN (2.0) mode. + */ +bool FLEXCAN_IsInstanceHasFDMode(CAN_Type *base) +{ + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + /* Enable CAN FD operation. */ + base->MCR |= CAN_MCR_FDEN_MASK; + + /* There are some SoC parts that don't support CAN FD. + * Checking if FDEN bit is really set to 1 is a way to ensure that CAN FD is supported. + * When SoC parts don't support CAN FD, FDEN bit stuck at 0 and can't be set to 1. */ + if (0U == (base->MCR & CAN_MCR_FDEN_MASK)) + { + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); + return false; + } + else + { + /* Clear CAN FD operation. */ + base->MCR &= ~CAN_MCR_FDEN_MASK; + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); + return true; + } +} +#endif + +/*! + * brief Get the FlexCAN instance from peripheral base address. + * + * param base FlexCAN peripheral base address. + * return FlexCAN instance. + */ +uint32_t FLEXCAN_GetInstance(CAN_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_flexcanBases); instance++) + { + if (s_flexcanBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_flexcanBases)); + + return instance; +} + +/*! + * brief Enter FlexCAN Freeze Mode. + * + * This function makes the FlexCAN work under Freeze Mode. + * + * param base FlexCAN peripheral base address. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_9595) +void FLEXCAN_EnterFreezeMode(CAN_Type *base) +{ + uint32_t u32TimeoutCount = 0U; + uint32_t u32TempMCR = 0U; + uint32_t u32TempIMASK1 = 0U; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + uint32_t u32TempIMASK2 = 0U; +#endif + + /* Step1: set FRZ enable in MCR. */ + base->MCR |= CAN_MCR_FRZ_MASK; + + /* Step2: to check if MDIS bit set in MCR. if yes, clear it. */ + if (0U != (base->MCR & CAN_MCR_MDIS_MASK)) + { + base->MCR &= ~CAN_MCR_MDIS_MASK; + } + + /* Step3: polling LPMACK. */ + u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT; + while ((0U == (base->MCR & CAN_MCR_LPMACK_MASK)) && (u32TimeoutCount > 0U)) + { + u32TimeoutCount--; + } + + /* Step4: to check FLTCONF in ESR1 register */ + if (0U == (base->ESR1 & CAN_ESR1_FLTCONF_BUSOFF)) + { + /* Error Active and Error Passive state */ + /* Step5B: Set Halt bits. */ + base->MCR |= CAN_MCR_HALT_MASK; + + /* Step6B: Poll the MCR register until the Freeze Acknowledge (FRZACK) bit is set, timeout need more than 178 + * CAN bit length, so 20 multiply timeout is enough. */ + u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT * 20U; + while ((0U == (base->MCR & CAN_MCR_FRZACK_MASK)) && (u32TimeoutCount > 0U)) + { + u32TimeoutCount--; + } + + /* Merge ERRATA_9595 and ERRATA_8341 because both errata exist on some platform. */ + if (0U == u32TimeoutCount) + { + /* backup MCR and IMASK register. */ + u32TempMCR = base->MCR; + u32TempIMASK1 = base->IMASK1; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + u32TempIMASK2 = base->IMASK2; +#endif + /* Set the Soft Reset bit ((SOFTRST) in the MCR.*/ + base->MCR |= CAN_MCR_SOFTRST_MASK; + + /* Poll the MCR register until the Soft Reset (SOFTRST) bit is cleared, timeout need more than 178 + * CAN bit length, so 20 multiply timeout is enough. */ + u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT * 20U; + while ((CAN_MCR_SOFTRST_MASK == (base->MCR & CAN_MCR_SOFTRST_MASK)) && (u32TimeoutCount > 0U)) + { + u32TimeoutCount--; + } + + /* Reconfig MCR. */ + base->MCR = u32TempMCR; + + /* Reconfig IMASK. */ + base->IMASK1 = u32TempIMASK1; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + base->IMASK2 = u32TempIMASK2; +#endif + } + } + else + { + /* Bus Off state */ + /* backup MCR and IMASK register. Errata document not descript it, but we need backup for step 8A and 9A. */ + u32TempMCR = base->MCR; + u32TempIMASK1 = base->IMASK1; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + u32TempIMASK2 = base->IMASK2; +#endif + + /* Step5A: Set the Soft Reset bit ((SOFTRST) in the MCR.*/ + base->MCR |= CAN_MCR_SOFTRST_MASK; + + /* Step6A: Poll the MCR register until the Soft Reset (SOFTRST) bit is cleared. */ + u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT; + while ((CAN_MCR_SOFTRST_MASK == (base->MCR & CAN_MCR_SOFTRST_MASK)) && (u32TimeoutCount > 0U)) + { + u32TimeoutCount--; + } + + /* Step7A: Poll the MCR register until the Freeze Acknowledge (FRZACK) bit is set. */ + u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT; + while ((0U == (base->MCR & CAN_MCR_FRZACK_MASK)) && (u32TimeoutCount > 0U)) + { + u32TimeoutCount--; + } + + /* Step8A: reconfig MCR. */ + base->MCR = u32TempMCR; + + /* Step9A: reconfig IMASK. */ + base->IMASK1 = u32TempIMASK1; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + base->IMASK2 = u32TempIMASK2; +#endif + } +} +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_8341) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_8341) +void FLEXCAN_EnterFreezeMode(CAN_Type *base) +{ + uint32_t u32TimeoutCount = 0U; + uint32_t u32TempMCR = 0U; + uint32_t u32TempIMASK1 = 0U; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + uint32_t u32TempIMASK2 = 0U; +#endif + + /* Step1: set FRZ and HALT bit enable in MCR. */ + base->MCR |= CAN_MCR_FRZ_MASK; + base->MCR |= CAN_MCR_HALT_MASK; + + /* Step2: to check if MDIS bit set in MCR. if yes, clear it. */ + if (0U != (base->MCR & CAN_MCR_MDIS_MASK)) + { + base->MCR &= ~CAN_MCR_MDIS_MASK; + } + + /* Step3: Poll the MCR register until the Freeze Acknowledge (FRZACK) bit is set. */ + u32TimeoutCount = (uint32_t)FLEXCAN_WAIT_TIMEOUT * 100U; + while ((0U == (base->MCR & CAN_MCR_FRZACK_MASK)) && (u32TimeoutCount > 0U)) + { + u32TimeoutCount--; + } + + /* Step4: check whether the timeout reached. if no skip step5 to step8. */ + if (0U == u32TimeoutCount) + { + /* backup MCR and IMASK register. Errata document not descript it, but we need backup for step 8A and 9A. */ + u32TempMCR = base->MCR; + u32TempIMASK1 = base->IMASK1; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + u32TempIMASK2 = base->IMASK2; +#endif + /* Step5: Set the Soft Reset bit ((SOFTRST) in the MCR.*/ + base->MCR |= CAN_MCR_SOFTRST_MASK; + + /* Step6: Poll the MCR register until the Soft Reset (SOFTRST) bit is cleared. */ + while (CAN_MCR_SOFTRST_MASK == (base->MCR & CAN_MCR_SOFTRST_MASK)) + { + } + + /* Step7: reconfig MCR. */ + base->MCR = u32TempMCR; + + /* Step8: reconfig IMASK. */ + base->IMASK1 = u32TempIMASK1; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + base->IMASK2 = u32TempIMASK2; +#endif + } +} +#else +void FLEXCAN_EnterFreezeMode(CAN_Type *base) +{ + /* Set Freeze, Halt bits. */ + base->MCR |= CAN_MCR_FRZ_MASK; + base->MCR |= CAN_MCR_HALT_MASK; + while (0U == (base->MCR & CAN_MCR_FRZACK_MASK)) + { + } +} +#endif + +/*! + * brief Exit FlexCAN Freeze Mode. + * + * This function makes the FlexCAN leave Freeze Mode. + * + * param base FlexCAN peripheral base address. + */ +void FLEXCAN_ExitFreezeMode(CAN_Type *base) +{ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /* Clean FlexCAN Access With Non-Correctable Error Interrupt Flag to avoid be put in freeze mode. */ + FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_FlexCanAccessNonCorrectableErrorIntFlag | + (uint64_t)kFLEXCAN_FlexCanAccessNonCorrectableErrorOverrunFlag); +#endif + + /* Clear Freeze, Halt bits. */ + base->MCR &= ~CAN_MCR_HALT_MASK; + base->MCR &= ~CAN_MCR_FRZ_MASK; + + /* Wait until the FlexCAN Module exit freeze mode. */ + while (0U != (base->MCR & CAN_MCR_FRZACK_MASK)) + { + } +} + +#if !defined(NDEBUG) +/*! + * brief Check if Message Buffer is occupied by Rx FIFO. + * + * This function check if Message Buffer is occupied by Rx FIFO. + * + * param base FlexCAN peripheral base address. + * param mbIdx The FlexCAN Message Buffer index. + * return TRUE if the index MB is occupied by Rx FIFO, FALSE if the index MB not occupied by Rx FIFO. + */ +static bool FLEXCAN_IsMbOccupied(CAN_Type *base, uint8_t mbIdx) +{ + uint8_t lastOccupiedMb; + bool fgRet; + + /* Is Rx FIFO enabled? */ + if (0U != (base->MCR & CAN_MCR_RFEN_MASK)) + { + /* Get RFFN value. */ + lastOccupiedMb = (uint8_t)((base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT); + /* Calculate the number of last Message Buffer occupied by Rx FIFO. */ + lastOccupiedMb = ((lastOccupiedMb + 1U) * 2U) + 5U; + +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) + /* the first valid MB should be occupied by ERRATA 5461 or 5829. */ + lastOccupiedMb += 1U; +#endif + fgRet = (mbIdx <= lastOccupiedMb); + } + else + { +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) + if (0U == mbIdx) + { + fgRet = true; + } + else +#endif + { + fgRet = false; + } + } + + return fgRet; +} +#endif + +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) +/*! + * brief Get the first valid Message buffer ID of give FlexCAN instance. + * + * This function is a helper function for Errata 5641 workaround. + * + * param base FlexCAN peripheral base address. + * return The first valid Message Buffer Number. + */ +static uint8_t FLEXCAN_GetFirstValidMb(CAN_Type *base) +{ + uint8_t firstValidMbNum; + + if (0U != (base->MCR & CAN_MCR_RFEN_MASK)) + { + firstValidMbNum = (uint8_t)((base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT); + firstValidMbNum = ((firstValidMbNum + 1U) * 2U) + 6U; + } + else + { + firstValidMbNum = 0U; + } + + return firstValidMbNum; +} +#endif + +/*! + * brief Reset the FlexCAN Instance. + * + * Restores the FlexCAN module to reset state, notice that this function + * will set all the registers to reset state so the FlexCAN module can not work + * after calling this API. + * + * param base FlexCAN peripheral base address. + */ +static void FLEXCAN_Reset(CAN_Type *base) +{ + /* The module must should be first exit from low power + * mode, and then soft reset can be applied. + */ + assert(0U == (base->MCR & CAN_MCR_MDIS_MASK)); + + uint8_t i; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) + if (0 != (FSL_FEATURE_FLEXCAN_INSTANCE_HAS_DOZE_MODE_SUPPORTn(base))) + { + /* De-assert DOZE Enable Bit. */ + base->MCR &= ~CAN_MCR_DOZE_MASK; + } +#endif + + /* Wait until FlexCAN exit from any Low Power Mode. */ + while (0U != (base->MCR & CAN_MCR_LPMACK_MASK)) + { + } + + /* Assert Soft Reset Signal. */ + base->MCR |= CAN_MCR_SOFTRST_MASK; + /* Wait until FlexCAN reset completes. */ + while (0U != (base->MCR & CAN_MCR_SOFTRST_MASK)) + { + } + +/* Reset MCR register. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_GLITCH_FILTER) && FSL_FEATURE_FLEXCAN_HAS_GLITCH_FILTER) + base->MCR |= CAN_MCR_WRNEN_MASK | CAN_MCR_WAKSRC_MASK | + CAN_MCR_MAXMB((uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base) - 1U); +#else + base->MCR |= + CAN_MCR_WRNEN_MASK | CAN_MCR_MAXMB((uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base) - 1U); +#endif + + /* Reset CTRL1 and CTRL2 register, default to eanble SMP feature which enable three sample point to determine the + * received bit's value of the. */ + base->CTRL1 = CAN_CTRL1_SMP_MASK; + base->CTRL2 = CAN_CTRL2_TASD(0x16) | CAN_CTRL2_RRS_MASK | CAN_CTRL2_EACEN_MASK; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /* Enable unrestricted write access to FlexCAN memory. */ + base->CTRL2 |= CAN_CTRL2_WRMFRZ_MASK; + /* Do memory initialization for all FlexCAN RAM in order to have the parity bits in memory properly + updated. */ + *(volatile uint32_t *)CAN_INIT_RXFIR = 0x0U; + flexcan_memset(CAN_INIT_MEMORY_BASE_1, 0, CAN_INIT_MEMORY_SIZE_1); + flexcan_memset(CAN_INIT_MEMORY_BASE_2, 0, CAN_INIT_MEMORY_SIZE_2); + /* Disable unrestricted write access to FlexCAN memory. */ + base->CTRL2 &= ~CAN_CTRL2_WRMFRZ_MASK; + + /* Clean all memory error flags. */ + FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_AllMemoryErrorFlag); +#else + /* Only need clean all Message Buffer memory. */ + flexcan_memset((void *)&base->MB[0], 0, sizeof(base->MB)); +#endif + + /* Clean all individual Rx Mask of Message Buffers. */ + for (i = 0; i < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); i++) + { + base->RXIMR[i] = 0x3FFFFFFF; + } + + /* Clean Global Mask of Message Buffers. */ + base->RXMGMASK = 0x3FFFFFFF; + /* Clean Global Mask of Message Buffer 14. */ + base->RX14MASK = 0x3FFFFFFF; + /* Clean Global Mask of Message Buffer 15. */ + base->RX15MASK = 0x3FFFFFFF; + /* Clean Global Mask of Rx FIFO. */ + base->RXFGMASK = 0x3FFFFFFF; +} + +/*! + * brief Set bit rate of FlexCAN classical CAN frame or CAN FD frame nominal phase. + * + * This function set the bit rate of classical CAN frame or CAN FD frame nominal phase base on + * FLEXCAN_CalculateImprovedTimingValues() API calculated timing values. + * + * note Calling FLEXCAN_SetBitRate() overrides the bit rate set in FLEXCAN_Init(). + * + * param base FlexCAN peripheral base address. + * param sourceClock_Hz Source Clock in Hz. + * param bitRate_Bps Bit rate in Bps. + * return kStatus_Success - Set CAN baud rate (only Nominal phase) successfully. + */ +status_t FLEXCAN_SetBitRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t bitRate_Bps) +{ + flexcan_timing_config_t timingCfg; + status_t result = kStatus_Fail; + + if (FLEXCAN_CalculateImprovedTimingValues(base, bitRate_Bps, sourceClock_Hz, &timingCfg)) + { + FLEXCAN_SetTimingConfig(base, &timingCfg); + result = kStatus_Success; + } + + return result; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Set bit rate of FlexCAN FD frame. + * + * This function set the baud rate of FLEXCAN FD base on FLEXCAN_FDCalculateImprovedTimingValues() API calculated timing + * values. + * + * @param base FlexCAN peripheral base address. + * @param sourceClock_Hz Source Clock in Hz. + * @param bitRateN_Bps Nominal bit Rate in Bps. + * @param bitRateD_Bps Data bit Rate in Bps. + * @return kStatus_Success - Set CAN FD bit rate (include Nominal and Data phase) successfully. + */ +status_t FLEXCAN_SetFDBitRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t bitRateN_Bps, uint32_t bitRateD_Bps) +{ + flexcan_timing_config_t timingCfg; + status_t result = kStatus_Fail; + + if (FLEXCAN_FDCalculateImprovedTimingValues(base, bitRateN_Bps, bitRateD_Bps, sourceClock_Hz, &timingCfg)) + { + FLEXCAN_SetFDTimingConfig(base, &timingCfg); + result = kStatus_Success; + } + + return result; +} +#endif + +/*! + * brief Initializes a FlexCAN instance. + * + * This function initializes the FlexCAN module with user-defined settings. + * This example shows how to set up the flexcan_config_t parameters and how + * to call the FLEXCAN_Init function by passing in these parameters. + * code + * flexcan_config_t flexcanConfig; + * flexcanConfig.clkSrc = kFLEXCAN_ClkSrc0; + * flexcanConfig.bitRate = 1000000U; + * flexcanConfig.maxMbNum = 16; + * flexcanConfig.enableLoopBack = false; + * flexcanConfig.enableSelfWakeup = false; + * flexcanConfig.enableIndividMask = false; + * flexcanConfig.disableSelfReception = false; + * flexcanConfig.enableListenOnlyMode = false; + * flexcanConfig.enableDoze = false; + * flexcanConfig.timingConfig = timingConfig; + * FLEXCAN_Init(CAN0, &flexcanConfig, 40000000UL); + * endcode + * + * param base FlexCAN peripheral base address. + * param pConfig Pointer to the user-defined configuration structure. + * param sourceClock_Hz FlexCAN Protocol Engine clock source frequency in Hz. + */ +void FLEXCAN_Init(CAN_Type *base, const flexcan_config_t *pConfig, uint32_t sourceClock_Hz) +{ + /* Assertion. */ + assert(NULL != pConfig); + assert((pConfig->maxMbNum > 0U) && + (pConfig->maxMbNum <= (uint8_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base))); + + uint32_t mcrTemp; + uint32_t ctrl1Temp; +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + uint32_t instance; +#endif + flexcan_timing_config_t timingCfg = pConfig->timingConfig; + /* FlexCAN classical CAN frame or CAN FD frame nominal phase timing setting formula: + * quantum = 1 + (phaseSeg1 + 1) + (phaseSeg2 + 1) + (propSeg + 1); + */ + uint32_t quantum = (1U + ((uint32_t)timingCfg.phaseSeg1 + 1U) + ((uint32_t)timingCfg.phaseSeg2 + 1U) + + ((uint32_t)timingCfg.propSeg + 1U)); + uint32_t tqFre = pConfig->bitRate * quantum; + uint16_t maxDivider; + + /* Assertion: Check bit rate value. */ + assert((pConfig->bitRate != 0U) && (pConfig->bitRate <= 1000000U) && (tqFre <= sourceClock_Hz)); +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) + { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + assert((tqFre * MAX_ENPRESDIV) >= sourceClock_Hz); + maxDivider = MAX_ENPRESDIV; +#else + assert((tqFre * MAX_EPRESDIV) >= sourceClock_Hz); + maxDivider = MAX_EPRESDIV; +#endif + } + else + { + assert((tqFre * MAX_PRESDIV) >= sourceClock_Hz); + maxDivider = MAX_PRESDIV; + } +#else + assert((tqFre * MAX_PRESDIV) >= sourceClock_Hz); + maxDivider = MAX_PRESDIV; +#endif + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + instance = FLEXCAN_GetInstance(base); + /* Enable FlexCAN clock. */ + (void)CLOCK_EnableClock(s_flexcanClock[instance]); + /* + * Check the CAN clock in this device whether affected by Other clock gate + * If it affected, we'd better to change other clock source, + * If user insist on using that clock source, user need open these gate at same time, + * In this scene, User need to care the power consumption. + */ + assert(CAN_CLOCK_CHECK_NO_AFFECTS); +#if defined(FLEXCAN_PERIPH_CLOCKS) + /* Enable FlexCAN serial clock. */ + (void)CLOCK_EnableClock(s_flexcanPeriphClock[instance]); +#endif /* FLEXCAN_PERIPH_CLOCKS */ +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(FLEXCAN_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_flexcanResets[FLEXCAN_GetInstance(base)]); +#endif + +#if defined(CAN_CTRL1_CLKSRC_MASK) +#if (defined(FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE) && FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE) + if (0 == FSL_FEATURE_FLEXCAN_INSTANCE_SUPPORT_ENGINE_CLK_SEL_REMOVEn(base)) +#endif /* FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE */ + { + /* Disable FlexCAN Module. */ + FLEXCAN_Enable(base, false); + + /* Protocol-Engine clock source selection, This bit must be set + * when FlexCAN Module in Disable Mode. + */ + base->CTRL1 = (kFLEXCAN_ClkSrc0 == pConfig->clkSrc) ? (base->CTRL1 & ~CAN_CTRL1_CLKSRC_MASK) : + (base->CTRL1 | CAN_CTRL1_CLKSRC_MASK); + } +#endif /* CAN_CTRL1_CLKSRC_MASK */ + + /* Enable FlexCAN Module for configuration. */ + FLEXCAN_Enable(base, true); + + /* Reset to known status. */ + FLEXCAN_Reset(base); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /* Enable to update in MCER. */ + base->CTRL2 |= CAN_CTRL2_ECRWRE_MASK; + base->MECR &= ~CAN_MECR_ECRWRDIS_MASK; + + /* Enable/Disable Memory Error Detection and Correction.*/ + base->MECR = (pConfig->enableMemoryErrorControl) ? (base->MECR & ~CAN_MECR_ECCDIS_MASK) : + (base->MECR | CAN_MECR_ECCDIS_MASK); + + /* Enable/Disable Non-Correctable Errors In FlexCAN Access Put Device In Freeze Mode. */ + base->MECR = (pConfig->enableNonCorrectableErrorEnterFreeze) ? (base->MECR | CAN_MECR_NCEFAFRZ_MASK) : + (base->MECR & ~CAN_MECR_NCEFAFRZ_MASK); + /* Lock MCER register. */ + base->CTRL2 &= ~CAN_CTRL2_ECRWRE_MASK; +#endif + + /* Save current CTRL1 value and enable to enter Freeze mode(enabled by default). */ + ctrl1Temp = base->CTRL1; + + /* Save current MCR value and enable to enter Freeze mode(enabled by default). */ + mcrTemp = base->MCR; + + /* Enable Loop Back Mode? */ + ctrl1Temp = (pConfig->enableLoopBack) ? (ctrl1Temp | CAN_CTRL1_LPB_MASK) : (ctrl1Temp & ~CAN_CTRL1_LPB_MASK); + + /* Enable Timer Sync? */ + ctrl1Temp = (pConfig->enableTimerSync) ? (ctrl1Temp | CAN_CTRL1_TSYN_MASK) : (ctrl1Temp & ~CAN_CTRL1_TSYN_MASK); + + /* Enable Listen Only Mode? */ + ctrl1Temp = (pConfig->enableListenOnlyMode) ? ctrl1Temp | CAN_CTRL1_LOM_MASK : ctrl1Temp & ~CAN_CTRL1_LOM_MASK; + +#if !(defined(FSL_FEATURE_FLEXCAN_HAS_NO_SUPV_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_NO_SUPV_SUPPORT) + /* Enable Supervisor Mode? */ + mcrTemp = (pConfig->enableSupervisorMode) ? mcrTemp | CAN_MCR_SUPV_MASK : mcrTemp & ~CAN_MCR_SUPV_MASK; +#endif + + /* Set the maximum number of Message Buffers */ + mcrTemp = (mcrTemp & ~CAN_MCR_MAXMB_MASK) | CAN_MCR_MAXMB((uint32_t)pConfig->maxMbNum - 1U); + + /* Enable Self Wake Up Mode and configure the wake up source. */ + mcrTemp = (pConfig->enableSelfWakeup) ? (mcrTemp | CAN_MCR_SLFWAK_MASK) : (mcrTemp & ~CAN_MCR_SLFWAK_MASK); + mcrTemp = (kFLEXCAN_WakeupSrcFiltered == pConfig->wakeupSrc) ? (mcrTemp | CAN_MCR_WAKSRC_MASK) : + (mcrTemp & ~CAN_MCR_WAKSRC_MASK); +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + /* Enable Pretended Networking Mode? When Pretended Networking mode is set, Self Wake Up feature must be disabled.*/ + mcrTemp = (pConfig->enablePretendedeNetworking) ? ((mcrTemp & ~CAN_MCR_SLFWAK_MASK) | CAN_MCR_PNET_EN_MASK) : + (mcrTemp & ~CAN_MCR_PNET_EN_MASK); +#endif + + /* Enable Individual Rx Masking and Queue feature? */ + mcrTemp = (pConfig->enableIndividMask) ? (mcrTemp | CAN_MCR_IRMQ_MASK) : (mcrTemp & ~CAN_MCR_IRMQ_MASK); + + /* Disable Self Reception? */ + mcrTemp = (pConfig->disableSelfReception) ? mcrTemp | CAN_MCR_SRXDIS_MASK : mcrTemp & ~CAN_MCR_SRXDIS_MASK; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) + if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_DOZE_MODE_SUPPORTn(base)) + { + /* Enable Doze Mode? */ + mcrTemp = (pConfig->enableDoze) ? (mcrTemp | CAN_MCR_DOZE_MASK) : (mcrTemp & ~CAN_MCR_DOZE_MASK); + } +#endif + + /* Write back CTRL1 Configuration to register. */ + base->CTRL1 = ctrl1Temp; + + /* Write back MCR Configuration to register. */ + base->MCR = mcrTemp; + + /* Check whether Nominal Bit Rate Prescaler is overflow. */ + if ((sourceClock_Hz / tqFre - 1U) > maxDivider) + { + timingCfg.preDivider = maxDivider; + } + else + { + timingCfg.preDivider = (uint16_t)(sourceClock_Hz / tqFre) - 1U; + } + + /* Update actual timing characteristic. */ + FLEXCAN_SetTimingConfig(base, &timingCfg); +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Initializes a FlexCAN instance. + * + * This function initializes the FlexCAN module with user-defined settings. + * This example shows how to set up the flexcan_config_t parameters and how + * to call the FLEXCAN_FDInit function by passing in these parameters. + * code + * flexcan_config_t flexcanConfig; + * flexcanConfig.clkSrc = kFLEXCAN_ClkSrc0; + * flexcanConfig.bitRate = 1000000U; + * flexcanConfig.bitRateFD = 2000000U; + * flexcanConfig.maxMbNum = 16; + * flexcanConfig.enableLoopBack = false; + * flexcanConfig.enableSelfWakeup = false; + * flexcanConfig.enableIndividMask = false; + * flexcanConfig.disableSelfReception = false; + * flexcanConfig.enableListenOnlyMode = false; + * flexcanConfig.enableDoze = false; + * flexcanConfig.timingConfig = timingConfig; + * FLEXCAN_FDInit(CAN0, &flexcanConfig, 80000000UL, kFLEXCAN_16BperMB, true); + * endcode + * + * param base FlexCAN peripheral base address. + * param pConfig Pointer to the user-defined configuration structure. + * param sourceClock_Hz FlexCAN Protocol Engine clock source frequency in Hz. + * param dataSize FlexCAN Message Buffer payload size. The actual transmitted or received CAN FD frame data size needs + * to be less than or equal to this value. + * param brs True if bit rate switch is enabled in FD mode. + */ +void FLEXCAN_FDInit( + CAN_Type *base, const flexcan_config_t *pConfig, uint32_t sourceClock_Hz, flexcan_mb_size_t dataSize, bool brs) +{ + assert((uint32_t)dataSize <= 3U); + assert(((pConfig->bitRate < pConfig->bitRateFD) && brs) || ((pConfig->bitRate == pConfig->bitRateFD) && (!brs))); + + uint32_t fdctrl = 0U; + flexcan_timing_config_t timingCfg = pConfig->timingConfig; + /* FlexCAN FD frame data phase timing setting formula: + * quantum = 1 + (fphaseSeg1 + 1) + (fphaseSeg2 + 1) + fpropSeg; + */ + uint32_t quantum = (1U + ((uint32_t)timingCfg.fphaseSeg1 + 1U) + ((uint32_t)timingCfg.fphaseSeg2 + 1U) + + (uint32_t)timingCfg.fpropSeg); + uint32_t tqFre = pConfig->bitRateFD * quantum; + uint16_t maxDivider; + + /* Check bit rate value. */ + assert((pConfig->bitRateFD <= MAX_CANFD_BITRATE) && (tqFre <= sourceClock_Hz)); +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + assert((tqFre * MAX_EDPRESDIV) >= sourceClock_Hz); + maxDivider = MAX_EDPRESDIV; +#else + assert((tqFre * MAX_FPRESDIV) >= sourceClock_Hz); + maxDivider = MAX_FPRESDIV; +#endif + + /* Initialization of classical CAN. */ + FLEXCAN_Init(base, pConfig, sourceClock_Hz); + + /* Check whether Data Bit Rate Prescaler is overflow. */ + if ((sourceClock_Hz / tqFre - 1U) > maxDivider) + { + timingCfg.fpreDivider = maxDivider; + } + else + { + timingCfg.fpreDivider = (uint16_t)(sourceClock_Hz / tqFre) - 1U; + } + + /* Update actual timing characteristic. */ + FLEXCAN_SetFDTimingConfig(base, &timingCfg); + + /* read FDCTRL register. */ + fdctrl = base->FDCTRL; + + /* Enable FD operation and set bit rate switch. */ + if (brs) + { + fdctrl |= CAN_FDCTRL_FDRATE_MASK; + } + else + { + fdctrl &= ~CAN_FDCTRL_FDRATE_MASK; + } + + /* Before use "|=" operation for multi-bits field, CPU should clean previous Setting. */ + fdctrl = (fdctrl & ~CAN_FDCTRL_MBDSR0_MASK) | CAN_FDCTRL_MBDSR0(dataSize); +#if defined(CAN_FDCTRL_MBDSR1_MASK) + fdctrl = (fdctrl & ~CAN_FDCTRL_MBDSR1_MASK) | CAN_FDCTRL_MBDSR1(dataSize); +#endif +#if defined(CAN_FDCTRL_MBDSR2_MASK) + fdctrl = (fdctrl & ~CAN_FDCTRL_MBDSR2_MASK) | CAN_FDCTRL_MBDSR2(dataSize); +#endif +#if defined(CAN_FDCTRL_MBDSR3_MASK) + fdctrl = (fdctrl & ~CAN_FDCTRL_MBDSR3_MASK) | CAN_FDCTRL_MBDSR3(dataSize); +#endif + + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + /* Enable CAN FD operation. */ + base->MCR |= CAN_MCR_FDEN_MASK; + /* Clear SMP bit when CAN FD is enabled (CAN FD only can use one regular sample point plus one optional secondary + * sampling point). */ + base->CTRL1 &= ~CAN_CTRL1_SMP_MASK; + + if (brs && !(pConfig->enableLoopBack)) + { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* The TDC offset should be configured as shown in this equation : offset = DTSEG1 + 2 */ + if (((uint32_t)pConfig->timingConfig.fphaseSeg1 + pConfig->timingConfig.fpropSeg + 2U) * + (pConfig->timingConfig.fpreDivider + 1U) < + MAX_ETDCOFF) + { + base->ETDC = + CAN_ETDC_ETDCEN_MASK | CAN_ETDC_TDMDIS(!pConfig->enableTransceiverDelayMeasure) | + CAN_ETDC_ETDCOFF(((uint32_t)pConfig->timingConfig.fphaseSeg1 + pConfig->timingConfig.fpropSeg + 2U) * + (pConfig->timingConfig.fpreDivider + 1U)); + } + else + { + /* Enable the Transceiver Delay Compensation */ + base->ETDC = CAN_ETDC_ETDCEN_MASK | CAN_ETDC_TDMDIS(!pConfig->enableTransceiverDelayMeasure) | + CAN_ETDC_ETDCOFF(MAX_ETDCOFF); + } +#else + /* The TDC offset should be configured as shown in this equation : offset = PSEG1 + PROPSEG + 2 */ + if (((uint32_t)pConfig->timingConfig.fphaseSeg1 + pConfig->timingConfig.fpropSeg + 2U) * + (pConfig->timingConfig.fpreDivider + 1U) < + MAX_TDCOFF) + { + fdctrl = + (fdctrl & ~CAN_FDCTRL_TDCOFF_MASK) | + CAN_FDCTRL_TDCOFF(((uint32_t)pConfig->timingConfig.fphaseSeg1 + pConfig->timingConfig.fpropSeg + 2U) * + (pConfig->timingConfig.fpreDivider + 1U)); + } + else + { + fdctrl = (fdctrl & ~CAN_FDCTRL_TDCOFF_MASK) | CAN_FDCTRL_TDCOFF(MAX_TDCOFF); + } + /* Enable the Transceiver Delay Compensation */ + fdctrl = (fdctrl & ~CAN_FDCTRL_TDCEN_MASK) | CAN_FDCTRL_TDCEN_MASK; +#endif + } + + /* update the FDCTL register. */ + base->FDCTRL = fdctrl; + + /* Enable CAN FD ISO mode by default. */ + base->CTRL2 |= CAN_CTRL2_ISOCANFDEN_MASK; + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} +#endif + +/*! + * brief De-initializes a FlexCAN instance. + * + * This function disables the FlexCAN module clock and sets all register values + * to the reset value. + * + * param base FlexCAN peripheral base address. + */ +void FLEXCAN_Deinit(CAN_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + uint32_t instance; +#endif + /* Reset all Register Contents. */ + FLEXCAN_Reset(base); + + /* Disable FlexCAN module. */ + FLEXCAN_Enable(base, false); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + instance = FLEXCAN_GetInstance(base); +#if defined(FLEXCAN_PERIPH_CLOCKS) + /* Disable FlexCAN serial clock. */ + (void)CLOCK_DisableClock(s_flexcanPeriphClock[instance]); +#endif /* FLEXCAN_PERIPH_CLOCKS */ + /* Disable FlexCAN clock. */ + (void)CLOCK_DisableClock(s_flexcanClock[instance]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * brief Gets the default configuration structure. + * + * This function initializes the FlexCAN configuration structure to default values. The default + * values are as follows. + * flexcanConfig->clkSrc = kFLEXCAN_ClkSrc0; + * flexcanConfig->bitRate = 1000000U; + * flexcanConfig->bitRateFD = 2000000U; + * flexcanConfig->maxMbNum = 16; + * flexcanConfig->enableLoopBack = false; + * flexcanConfig->enableSelfWakeup = false; + * flexcanConfig->enableIndividMask = false; + * flexcanConfig->disableSelfReception = false; + * flexcanConfig->enableListenOnlyMode = false; + * flexcanConfig->enableDoze = false; + * flexcanConfig->enablePretendedeNetworking = false; + * flexcanConfig->enableMemoryErrorControl = true; + * flexcanConfig->enableNonCorrectableErrorEnterFreeze = true; + * flexcanConfig->enableTransceiverDelayMeasure = true; + * flexcanConfig.timingConfig = timingConfig; + * + * param pConfig Pointer to the FlexCAN configuration structure. + */ +void FLEXCAN_GetDefaultConfig(flexcan_config_t *pConfig) +{ + /* Assertion. */ + assert(NULL != pConfig); + + /* Initializes the configure structure to zero. */ + (void)memset(pConfig, 0, sizeof(*pConfig)); + + /* Initialize FlexCAN Module config struct with default value. */ + pConfig->clkSrc = kFLEXCAN_ClkSrc0; + pConfig->bitRate = 1000000U; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + pConfig->bitRateFD = 2000000U; +#endif + pConfig->maxMbNum = 16; + pConfig->enableLoopBack = false; + pConfig->enableTimerSync = true; + pConfig->enableSelfWakeup = false; + pConfig->wakeupSrc = kFLEXCAN_WakeupSrcUnfiltered; + pConfig->enableIndividMask = false; + pConfig->disableSelfReception = false; + pConfig->enableListenOnlyMode = false; +#if !(defined(FSL_FEATURE_FLEXCAN_HAS_NO_SUPV_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_NO_SUPV_SUPPORT) + pConfig->enableSupervisorMode = true; +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) + pConfig->enableDoze = false; +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + pConfig->enablePretendedeNetworking = false; +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + pConfig->enableMemoryErrorControl = true; + pConfig->enableNonCorrectableErrorEnterFreeze = true; +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + pConfig->enableTransceiverDelayMeasure = true; +#endif + + /* Default protocol timing configuration, nominal bit time quantum is 10 (80% SP), data bit time quantum is 5 + * (60%). Suggest use FLEXCAN_CalculateImprovedTimingValues/FLEXCAN_FDCalculateImprovedTimingValues to get the + * improved timing configuration.*/ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + pConfig->timingConfig.phaseSeg1 = 1; + pConfig->timingConfig.phaseSeg2 = 1; + pConfig->timingConfig.propSeg = 4; + pConfig->timingConfig.rJumpwidth = 1; + pConfig->timingConfig.fphaseSeg1 = 1; + pConfig->timingConfig.fphaseSeg2 = 1; + pConfig->timingConfig.fpropSeg = 0; + pConfig->timingConfig.frJumpwidth = 1; +#else + pConfig->timingConfig.phaseSeg1 = 1; + pConfig->timingConfig.phaseSeg2 = 1; + pConfig->timingConfig.propSeg = 4; + pConfig->timingConfig.rJumpwidth = 1; +#endif +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) +/*! + * brief Configures the FlexCAN Pretended Networking mode. + * + * This function configures the FlexCAN Pretended Networking mode with given configuration. + * + * param base FlexCAN peripheral base address. + * param pConfig Pointer to the FlexCAN Rx FIFO configuration structure. + */ +void FLEXCAN_SetPNConfig(CAN_Type *base, const flexcan_pn_config_t *pConfig) +{ + /* Assertion. */ + assert(NULL != pConfig); + assert(0U != pConfig->matchNum); + uint32_t pnctrl; + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + pnctrl = (pConfig->matchNum > 1U) ? CAN_CTRL1_PN_FCS(0x2U | (uint32_t)pConfig->matchSrc) : + CAN_CTRL1_PN_FCS(pConfig->matchSrc); + pnctrl |= (pConfig->enableMatch) ? (CAN_CTRL1_PN_WUMF_MSK_MASK) : 0U; + pnctrl |= (pConfig->enableTimeout) ? (CAN_CTRL1_PN_WTOF_MSK_MASK) : 0U; + pnctrl |= CAN_CTRL1_PN_NMATCH(pConfig->matchNum) | CAN_CTRL1_PN_IDFS(pConfig->idMatchMode) | + CAN_CTRL1_PN_PLFS(pConfig->dataMatchMode); + base->CTRL1_PN = pnctrl; + base->CTRL2_PN = CAN_CTRL2_PN_MATCHTO(pConfig->timeoutValue); + base->FLT_ID1 = pConfig->idLower; + base->FLT_ID2_IDMASK = pConfig->idUpper; + base->FLT_DLC = CAN_FLT_DLC_FLT_DLC_LO(pConfig->lengthLower) | CAN_FLT_DLC_FLT_DLC_HI(pConfig->lengthUpper); + base->PL1_LO = pConfig->lowerWord0; + base->PL1_HI = pConfig->lowerWord1; + base->PL2_PLMASK_LO = pConfig->upperWord0; + base->PL2_PLMASK_HI = pConfig->upperWord1; + + FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_PNMatchIntFlag | (uint64_t)kFLEXCAN_PNTimeoutIntFlag); + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} + +/*! + * brief Reads a FlexCAN Message from Wake Up MB. + * + * This function reads a CAN message from the FlexCAN Wake up Message Buffers. There are four Wake up Message Buffers + * (WMBs) used to store incoming messages in Pretended Networking mode. The WMB index indicates the arrival order. The + * last message is stored in WMB3. + * + * param base FlexCAN peripheral base address. + * param pRxFrame Pointer to CAN message frame structure for reception. + * param mbIdx The FlexCAN Wake up Message Buffer index. Range in 0x0 ~ 0x3. + * retval kStatus_Success - Read Message from Wake up Message Buffer successfully. + * retval kStatus_Fail - Wake up Message Buffer has no valid content. + */ +status_t FLEXCAN_ReadPNWakeUpMB(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame) +{ + /* Assertion. */ + assert(NULL != pRxFrame); + assert(mbIdx <= 0x3U); + + uint32_t cs_temp; + status_t status; + + /* Check if Wake Up MB has valid content. */ + if (CAN_WU_MTC_MCOUNTER(mbIdx) < (base->WU_MTC & CAN_WU_MTC_MCOUNTER_MASK)) + { + /* Read CS field of wake up Message Buffer. */ + cs_temp = base->WMB[mbIdx].CS; + + /* Store Message ID. */ + pRxFrame->id = base->WMB[mbIdx].ID & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK); + + /* Get the message ID and format. */ + pRxFrame->format = (cs_temp & CAN_CS_IDE_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameFormatExtend : + (uint8_t)kFLEXCAN_FrameFormatStandard; + + /* Get the message type. */ + pRxFrame->type = + (cs_temp & CAN_CS_RTR_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameTypeRemote : (uint8_t)kFLEXCAN_FrameTypeData; + + /* Get the message length. */ + pRxFrame->length = (uint8_t)((cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT); + + /* Messages received during Pretended Networking mode don't have time stamps, and the respective field in the + WMB structure must be ignored. */ + pRxFrame->timestamp = 0x0; + + /* Store Message Payload. */ + pRxFrame->dataWord0 = base->WMB[mbIdx].D03; + pRxFrame->dataWord1 = base->WMB[mbIdx].D47; + + status = kStatus_Success; + } + else + { + status = kStatus_Fail; + } + + return status; +} +#endif + +/*! + * brief Sets the FlexCAN classical protocol timing characteristic. + * + * This function gives user settings to classical CAN or CAN FD nominal phase timing characteristic. + * The function is for an experienced user. For less experienced users, call the FLEXCAN_GetDefaultConfig() + * and get the default timing characteristicsthe, then call FLEXCAN_Init() and fill the + * bit rate field. + * + * note Calling FLEXCAN_SetTimingConfig() overrides the bit rate set + * in FLEXCAN_Init(). + * + * param base FlexCAN peripheral base address. + * param pConfig Pointer to the timing configuration structure. + */ +void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *pConfig) +{ + /* Assertion. */ + assert(NULL != pConfig); + + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) + { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* Enable extended Bit Timing register ENCBT. */ + base->CTRL2 |= CAN_CTRL2_BTE_MASK; + + /* Updating Timing Setting according to configuration structure. */ + base->EPRS = (base->EPRS & (~CAN_EPRS_ENPRESDIV_MASK)) | CAN_EPRS_ENPRESDIV(pConfig->preDivider); + base->ENCBT = CAN_ENCBT_NRJW(pConfig->rJumpwidth) | + CAN_ENCBT_NTSEG1((uint32_t)pConfig->phaseSeg1 + pConfig->propSeg + 1U) | + CAN_ENCBT_NTSEG2(pConfig->phaseSeg2); +#else + /* On RT106x devices, a single write may be ignored, so it is necessary to read back the register value to + * determine whether the value is written successfully. */ + + do + { + /* Enable Bit Timing register CBT, updating Timing Setting according to configuration structure. */ + base->CBT = CAN_CBT_BTF_MASK | CAN_CBT_EPRESDIV(pConfig->preDivider) | CAN_CBT_ERJW(pConfig->rJumpwidth) | + CAN_CBT_EPSEG1(pConfig->phaseSeg1) | CAN_CBT_EPSEG2(pConfig->phaseSeg2) | + CAN_CBT_EPROPSEG(pConfig->propSeg); + + } while ((CAN_CBT_EPRESDIV(pConfig->preDivider) | CAN_CBT_ERJW(pConfig->rJumpwidth) | + CAN_CBT_EPSEG1(pConfig->phaseSeg1) | CAN_CBT_EPSEG2(pConfig->phaseSeg2) | + CAN_CBT_EPROPSEG(pConfig->propSeg)) != + (base->CBT & (CAN_CBT_EPRESDIV_MASK | CAN_CBT_ERJW_MASK | CAN_CBT_EPSEG1_MASK | CAN_CBT_EPSEG2_MASK | + CAN_CBT_EPROPSEG_MASK))); +#endif + } + else + { + /* Cleaning previous Timing Setting. */ + base->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_RJW_MASK | CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK | + CAN_CTRL1_PROPSEG_MASK); + + /* Updating Timing Setting according to configuration structure. */ + base->CTRL1 |= (CAN_CTRL1_PRESDIV(pConfig->preDivider) | CAN_CTRL1_RJW(pConfig->rJumpwidth) | + CAN_CTRL1_PSEG1(pConfig->phaseSeg1) | CAN_CTRL1_PSEG2(pConfig->phaseSeg2) | + CAN_CTRL1_PROPSEG(pConfig->propSeg)); + } +#else + /* Cleaning previous Timing Setting. */ + base->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_RJW_MASK | CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK | + CAN_CTRL1_PROPSEG_MASK); + + /* Updating Timing Setting according to configuration structure. */ + base->CTRL1 |= (CAN_CTRL1_PRESDIV(pConfig->preDivider) | CAN_CTRL1_RJW(pConfig->rJumpwidth) | + CAN_CTRL1_PSEG1(pConfig->phaseSeg1) | CAN_CTRL1_PSEG2(pConfig->phaseSeg2) | + CAN_CTRL1_PROPSEG(pConfig->propSeg)); +#endif + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Sets the FlexCAN FD data phase timing characteristic. + * + * This function gives user settings to CAN FD data phase timing characteristic. + * The function is for an experienced user. For less experienced users, call the FLEXCAN_GetDefaultConfig() + * and get the default timing characteristicsthe, then call FLEXCAN_FDInit() and fill the + * data phase bit rate field. + * + * note Calling FLEXCAN_SetFDTimingConfig() overrides the bit rate set + * in FLEXCAN_FDInit(). + * + * param base FlexCAN peripheral base address. + * param pConfig Pointer to the timing configuration structure. + */ +void FLEXCAN_SetFDTimingConfig(CAN_Type *base, const flexcan_timing_config_t *pConfig) +{ + /* Assertion. */ + assert(NULL != pConfig); + + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* Enable extended Bit Timing register EDCBT. */ + base->CTRL2 |= CAN_CTRL2_BTE_MASK; + + base->EPRS = (base->EPRS & (~CAN_EPRS_EDPRESDIV_MASK)) | CAN_EPRS_EDPRESDIV(pConfig->fpreDivider); + base->EDCBT = CAN_EDCBT_DRJW(pConfig->frJumpwidth) | CAN_EDCBT_DTSEG2(pConfig->fphaseSeg2) | + CAN_EDCBT_DTSEG1((uint32_t)pConfig->fphaseSeg1 + pConfig->fpropSeg); +#else + /* Enable Bit Timing register FDCBT,*/ + base->CBT |= CAN_CBT_BTF_MASK; + + /* On RT106x devices, a single write may be ignored, so it is necessary to read back the register value to determine + * whether the value is written successfully. */ + do + { + /* Updating Timing Setting according to configuration structure. */ + base->FDCBT = (CAN_FDCBT_FPRESDIV(pConfig->fpreDivider) | CAN_FDCBT_FRJW(pConfig->frJumpwidth) | + CAN_FDCBT_FPSEG1(pConfig->fphaseSeg1) | CAN_FDCBT_FPSEG2(pConfig->fphaseSeg2) | + CAN_FDCBT_FPROPSEG(pConfig->fpropSeg)); + } while ((CAN_FDCBT_FPRESDIV(pConfig->fpreDivider) | CAN_FDCBT_FRJW(pConfig->frJumpwidth) | + CAN_FDCBT_FPSEG1(pConfig->fphaseSeg1) | CAN_FDCBT_FPSEG2(pConfig->fphaseSeg2) | + CAN_FDCBT_FPROPSEG(pConfig->fpropSeg)) != + (base->FDCBT & (CAN_FDCBT_FPRESDIV_MASK | CAN_FDCBT_FRJW_MASK | CAN_FDCBT_FPSEG1_MASK | + CAN_FDCBT_FPSEG2_MASK | CAN_FDCBT_FPROPSEG_MASK))); +#endif + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} +#endif + +/*! + * brief Sets the FlexCAN receive message buffer global mask. + * + * This function sets the global mask for the FlexCAN message buffer in a matching process. + * The configuration is only effective when the Rx individual mask is disabled in the FLEXCAN_Init(). + * + * param base FlexCAN peripheral base address. + * param mask Rx Message Buffer Global Mask value. + */ +void FLEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask) +{ + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + + /* Setting Rx Message Buffer Global Mask value. */ + base->RXMGMASK = mask; + base->RX14MASK = mask; + base->RX15MASK = mask; + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} + +/*! + * brief Sets the FlexCAN receive FIFO global mask. + * + * This function sets the global mask for FlexCAN FIFO in a matching process. + * + * param base FlexCAN peripheral base address. + * param mask Rx Fifo Global Mask value. + */ +void FLEXCAN_SetRxFifoGlobalMask(CAN_Type *base, uint32_t mask) +{ + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + + /* Setting Rx FIFO Global Mask value. */ + base->RXFGMASK = mask; + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} + +/*! + * brief Sets the FlexCAN receive individual mask. + * + * This function sets the individual mask for the FlexCAN matching process. + * The configuration is only effective when the Rx individual mask is enabled in the FLEXCAN_Init(). + * If the Rx FIFO is disabled, the individual mask is applied to the corresponding Message Buffer. + * If the Rx FIFO is enabled, the individual mask for Rx FIFO occupied Message Buffer is applied to + * the Rx Filter with the same index. Note that only the first 32 + * individual masks can be used as the Rx FIFO filter mask. + * + * param base FlexCAN peripheral base address. + * param maskIdx The Index of individual Mask. + * param mask Rx Individual Mask value. + */ +void FLEXCAN_SetRxIndividualMask(CAN_Type *base, uint8_t maskIdx, uint32_t mask) +{ + assert(maskIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); + + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + + /* Setting Rx Individual Mask value. */ + base->RXIMR[maskIdx] = mask; + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} + +/*! + * brief Configures a FlexCAN transmit message buffer. + * + * This function aborts the previous transmission, cleans the Message Buffer, and + * configures it as a Transmit Message Buffer. + * + * param base FlexCAN peripheral base address. + * param mbIdx The Message Buffer index. + * param enable Enable/disable Tx Message Buffer. + * - true: Enable Tx Message Buffer. + * - false: Disable Tx Message Buffer. + */ +void FLEXCAN_SetTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable) +{ + /* Assertion. */ + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + /* Inactivate Message Buffer. */ + if (enable) + { + base->MB[mbIdx].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive); + } + else + { + base->MB[mbIdx].CS = 0; + } + + /* Clean Message Buffer content. */ + base->MB[mbIdx].ID = 0x0; + base->MB[mbIdx].WORD0 = 0x0; + base->MB[mbIdx].WORD1 = 0x0; +} + +/*! + * brief Calculates the segment values for a single bit time for classical CAN. + * + * This function use to calculates the Classical CAN segment values which will be set in CTRL1/CBT/ENCBT register. + * + * param bitRate The classical CAN bit rate in bps. + * param base FlexCAN peripheral base address. + * param tqNum Number of time quantas per bit, range in 8 ~ 25 when use CTRL1, range in 8 ~ 129 when use CBT, range in + * 8 ~ 385 when use ENCBT. param pTimingConfig Pointer to the FlexCAN timing configuration structure. + */ +static void FLEXCAN_GetSegments(CAN_Type *base, + uint32_t bitRate, + uint32_t tqNum, + flexcan_timing_config_t *pTimingConfig) +{ + uint32_t ideal_sp; + uint32_t seg1Max, proSegMax; + uint32_t seg1Temp; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) + { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* Maximum value allowed in ENCBT register. */ + seg1Max = MAX_NTSEG2 + 1U; + proSegMax = MAX_NTSEG1 - MAX_NTSEG2; +#else + /* Maximum value allowed in CBT register. */ + seg1Max = MAX_EPSEG1 + 1U; + proSegMax = MAX_EPROPSEG + 1U; +#endif + } + else + { + /* Maximum value allowed in CTRL1 register. */ + seg1Max = MAX_PSEG1 + 1U; + proSegMax = MAX_PROPSEG + 1U; + } +#else + /* Maximum value allowed in CTRL1 register. */ + seg1Max = MAX_PSEG1 + 1U; + proSegMax = MAX_PROPSEG + 1U; +#endif + + /* Try to find the ideal sample point, according to CiA 301 doc.*/ + if (bitRate == 1000000U) + { + ideal_sp = IDEAL_SP_LOW; + } + else if (bitRate >= 800000U) + { + ideal_sp = IDEAL_SP_MID; + } + else + { + ideal_sp = IDEAL_SP_HIGH; + } + /* Calculates phaseSeg2. */ + pTimingConfig->phaseSeg2 = (uint8_t)(tqNum - (tqNum * ideal_sp) / (uint32_t)IDEAL_SP_FACTOR); + if (pTimingConfig->phaseSeg2 < MIN_TIME_SEGMENT2) + { + pTimingConfig->phaseSeg2 = MIN_TIME_SEGMENT2; + } + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) + { +#if !(defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + if (pTimingConfig->phaseSeg2 > (uint8_t)(MAX_EPSEG2 + 1U)) + { + pTimingConfig->phaseSeg2 = (uint8_t)(MAX_EPSEG2 + 1U); + } +#endif + } +#endif + + /* Calculates phaseSeg1 and propSeg and try to make phaseSeg1 equal to phaseSeg2. */ + if ((tqNum - pTimingConfig->phaseSeg2 - 1U) > (seg1Max + proSegMax)) + { + seg1Temp = seg1Max + proSegMax; + pTimingConfig->phaseSeg2 = (uint8_t)(tqNum - 1U - seg1Temp); + } + else + { + seg1Temp = tqNum - pTimingConfig->phaseSeg2 - 1U; + } + if (seg1Temp > (pTimingConfig->phaseSeg2 + proSegMax)) + { + pTimingConfig->propSeg = (uint8_t)proSegMax; + pTimingConfig->phaseSeg1 = (uint8_t)(seg1Temp - proSegMax); + } + else + { + pTimingConfig->propSeg = (uint8_t)(seg1Temp - pTimingConfig->phaseSeg2); + pTimingConfig->phaseSeg1 = pTimingConfig->phaseSeg2; + } + + /* rJumpwidth (sjw) is the minimum value of phaseSeg1 and phaseSeg2. */ + pTimingConfig->rJumpwidth = + (pTimingConfig->phaseSeg1 > pTimingConfig->phaseSeg2) ? pTimingConfig->phaseSeg2 : pTimingConfig->phaseSeg1; +#if !(defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (pTimingConfig->rJumpwidth > (MAX_RJW + 1U)) + { + pTimingConfig->rJumpwidth = (uint8_t)(MAX_RJW + 1U); + } +#else + if (0 == FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) + { + if (pTimingConfig->rJumpwidth > (MAX_RJW + 1U)) + { + pTimingConfig->rJumpwidth = (uint8_t)(MAX_RJW + 1U); + } + } +#endif + + pTimingConfig->phaseSeg1 -= 1U; + pTimingConfig->phaseSeg2 -= 1U; + pTimingConfig->propSeg -= 1U; + pTimingConfig->rJumpwidth -= 1U; +} + +/*! + * brief Calculates the improved timing values by specific bit Rates for classical CAN. + * + * This function use to calculates the Classical CAN timing values according to the given bit rate. The Calculated + * timing values will be set in CTRL1/CBT/ENCBT register. The calculation is based on the recommendation of the CiA 301 + * v4.2.0 and previous version document. + * + * param base FlexCAN peripheral base address. + * param bitRate The classical CAN speed in bps defined by user, should be less than or equal to 1Mbps. + * param sourceClock_Hz The Source clock frequency in Hz. + * param pTimingConfig Pointer to the FlexCAN timing configuration structure. + * + * return TRUE if timing configuration found, FALSE if failed to find configuration. + */ +bool FLEXCAN_CalculateImprovedTimingValues(CAN_Type *base, + uint32_t bitRate, + uint32_t sourceClock_Hz, + flexcan_timing_config_t *pTimingConfig) +{ + /* Observe bit rate maximums. */ + assert(bitRate <= MAX_CAN_BITRATE); + + uint32_t clk; + uint32_t tqNum, tqMin, pdivMAX; + uint32_t spTemp = 1000U; + flexcan_timing_config_t configTemp = {0}; + bool fgRet = false; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) + { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* Auto Improved Protocal timing for ENCBT. */ + tqNum = ENCBT_MAX_TIME_QUANTA; + tqMin = ENCBT_MIN_TIME_QUANTA; + pdivMAX = MAX_ENPRESDIV; +#else + /* Auto Improved Protocal timing for CBT. */ + tqNum = CBT_MAX_TIME_QUANTA; + tqMin = CBT_MIN_TIME_QUANTA; + pdivMAX = MAX_PRESDIV; +#endif + } + else + { + /* Auto Improved Protocal timing for CTRL1. */ + tqNum = CTRL1_MAX_TIME_QUANTA; + tqMin = CTRL1_MIN_TIME_QUANTA; + pdivMAX = MAX_PRESDIV; + } +#else + /* Auto Improved Protocal timing for CTRL1. */ + tqNum = CTRL1_MAX_TIME_QUANTA; + tqMin = CTRL1_MIN_TIME_QUANTA; + pdivMAX = MAX_PRESDIV; +#endif + do + { + clk = bitRate * tqNum; + if (clk > sourceClock_Hz) + { + continue; /* tqNum too large, clk has been exceed sourceClock_Hz. */ + } + + if ((sourceClock_Hz / clk * clk) != sourceClock_Hz) + { + continue; /* Non-supporting: the frequency of clock source is not divisible by target bit rate, the user + should change a divisible bit rate. */ + } + + configTemp.preDivider = (uint16_t)(sourceClock_Hz / clk) - 1U; + if (configTemp.preDivider > pdivMAX) + { + break; /* The frequency of source clock is too large or the bit rate is too small, the pre-divider could + not handle it. */ + } + + /* Calculates the best timing configuration under current tqNum. */ + FLEXCAN_GetSegments(base, bitRate, tqNum, &configTemp); + /* Determine whether the calculated timing configuration can get the optimal sampling point. */ + if (((((uint32_t)configTemp.phaseSeg2 + 1U) * 1000U) / tqNum) < spTemp) + { + spTemp = (((uint32_t)configTemp.phaseSeg2 + 1U) * 1000U) / tqNum; + pTimingConfig->preDivider = configTemp.preDivider; + pTimingConfig->rJumpwidth = configTemp.rJumpwidth; + pTimingConfig->phaseSeg1 = configTemp.phaseSeg1; + pTimingConfig->phaseSeg2 = configTemp.phaseSeg2; + pTimingConfig->propSeg = configTemp.propSeg; + } + fgRet = true; + } while (--tqNum >= tqMin); + + return fgRet; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Get Mailbox offset number by dword. + * + * This function gets the offset number of the specified mailbox. + * Mailbox is not consecutive between memory regions when payload is not 8 bytes + * so need to calculate the specified mailbox address. + * For example, in the first memory region, MB[0].CS address is 0x4002_4080. For 32 bytes + * payload frame, the second mailbox is ((1/12)*512 + 1%12*40)/4 = 10, meaning 10 dword + * after the 0x4002_4080, which is actually the address of mailbox MB[1].CS. + * + * param base FlexCAN peripheral base address. + * param mbIdx Mailbox index. + */ +static uint32_t FLEXCAN_GetFDMailboxOffset(CAN_Type *base, uint8_t mbIdx) +{ + uint32_t offset = 0; + uint32_t dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; + if (dataSize == (uint32_t)kFLEXCAN_8BperMB) + { + offset = (((uint32_t)mbIdx / 32U) * 512U + ((uint32_t)mbIdx % 32U) * 16U); + } + else if (dataSize == (uint32_t)kFLEXCAN_16BperMB) + { + offset = (((uint32_t)mbIdx / 21U) * 512U + ((uint32_t)mbIdx % 21U) * 24U); + } + else if (dataSize == (uint32_t)kFLEXCAN_32BperMB) + { + offset = (((uint32_t)mbIdx / 12U) * 512U + ((uint32_t)mbIdx % 12U) * 40U); + } + else + { + offset = (((uint32_t)mbIdx / 7U) * 512U + ((uint32_t)mbIdx % 7U) * 72U); + } + + /* To get the dword aligned offset, need to divide by 4. */ + offset = offset / 4U; + return offset; +} + +/*! + * brief Calculates the segment values for a single bit time for CAN FD data phase. + * + * This function use to calculates the CAN FD data phase segment values which will be set in CFDCBT/EDCBT + * register. + * + * param bitRateFD CAN FD data phase bit rate. + * param tqNum Number of time quanta per bit + * param pTimingConfig Pointer to the FlexCAN timing configuration structure. + */ +static void FLEXCAN_FDGetSegments(uint32_t bitRateFD, uint32_t tqNum, flexcan_timing_config_t *pTimingConfig) +{ + uint32_t ideal_sp; + uint32_t seg1Max, proSegMax, seg2Max; + uint32_t seg1Temp; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* Maximum value allowed in EDCBT register. */ + seg1Max = MAX_DTSEG2 + 1U; + proSegMax = MAX_DTSEG1 - MAX_DTSEG2; + seg2Max = MAX_DTSEG2 + 1U; +#else + /* Maximum value allowed in FDCBT register. */ + seg1Max = MAX_FPSEG1 + 1U; + proSegMax = MAX_FPROPSEG; + seg2Max = MAX_FPSEG2 + 1U; +#endif + + /* According to CiA doc 1301 v1.0.0, which specified data phase sample point postion for CAN FD at 80 MHz. */ + if (bitRateFD <= 1000000U) + { + ideal_sp = IDEAL_DATA_SP_1; + } + else if (bitRateFD <= 2000000U) + { + ideal_sp = IDEAL_DATA_SP_2; + } + else if (bitRateFD <= 4000000U) + { + ideal_sp = IDEAL_DATA_SP_3; + } + else + { + ideal_sp = IDEAL_DATA_SP_4; + } + + /* Calculates fphaseSeg2. */ + pTimingConfig->fphaseSeg2 = (uint8_t)(tqNum - (tqNum * ideal_sp) / (uint32_t)IDEAL_SP_FACTOR); + if (pTimingConfig->fphaseSeg2 < MIN_TIME_SEGMENT2) + { + pTimingConfig->fphaseSeg2 = MIN_TIME_SEGMENT2; + } + else if (pTimingConfig->fphaseSeg2 > seg2Max) + { + pTimingConfig->fphaseSeg2 = (uint8_t)seg2Max; + } + else + { + ; /* Intentional empty */ + } + + /* Calculates fphaseSeg1 and fpropSeg and try to make phaseSeg1 equal to phaseSeg2 */ + if ((tqNum - pTimingConfig->fphaseSeg2 - 1U) > (seg1Max + proSegMax)) + { + seg1Temp = seg1Max + proSegMax; + pTimingConfig->fphaseSeg2 = (uint8_t)(tqNum - 1U - seg1Temp); + } + else + { + seg1Temp = tqNum - pTimingConfig->fphaseSeg2 - 1U; + } + if (seg1Temp > (pTimingConfig->fphaseSeg2 + proSegMax)) + { + pTimingConfig->fpropSeg = (uint8_t)proSegMax; + pTimingConfig->fphaseSeg1 = (uint8_t)(seg1Temp - proSegMax); + } + else if (seg1Temp > pTimingConfig->fphaseSeg2) + { + pTimingConfig->fpropSeg = (uint8_t)(seg1Temp - pTimingConfig->fphaseSeg2); + pTimingConfig->fphaseSeg1 = pTimingConfig->fphaseSeg2; + } + else + { + pTimingConfig->fpropSeg = 0U; + pTimingConfig->fphaseSeg1 = (uint8_t)seg1Temp; + } + + /* rJumpwidth (sjw) is the minimum value of phaseSeg1 and phaseSeg2. */ + pTimingConfig->frJumpwidth = + (pTimingConfig->fphaseSeg1 > pTimingConfig->fphaseSeg2) ? pTimingConfig->fphaseSeg2 : pTimingConfig->fphaseSeg1; + + pTimingConfig->fphaseSeg1 -= 1U; + pTimingConfig->fphaseSeg2 -= 1U; + pTimingConfig->frJumpwidth -= 1U; +} + +/*! + * brief Calculates the improved timing values by specific bit rate for CAN FD nominal phase. + * + * This function use to calculates the CAN FD nominal phase timing values according to the given nominal phase bit rate. + * The Calculated timing values will be set in CBT/ENCBT registers. The calculation is based on the recommendation of + * the CiA 1301 v1.0.0 document. + * + * param bitRate The CAN FD nominal phase speed in bps defined by user, should be less than or equal to 1Mbps. + * param sourceClock_Hz The Source clock frequency in Hz. + * param pTimingConfig Pointer to the FlexCAN timing configuration structure. + * + * return TRUE if timing configuration found, FALSE if failed to find configuration. + */ +static bool FLEXCAN_CalculateImprovedNominalTimingValues(uint32_t bitRate, + uint32_t sourceClock_Hz, + flexcan_timing_config_t *pTimingConfig) +{ + /* Observe bit rate maximums. */ + assert(bitRate <= MAX_CAN_BITRATE); + + uint32_t clk; + uint32_t tqNum, tqMin, pdivMAX, seg1Max, proSegMax, seg1Temp; + uint32_t spTemp = 1000U; + flexcan_timing_config_t configTemp = {0}; + bool fgRet = false; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* Auto Improved Protocal timing for ENCBT. */ + tqNum = ENCBT_MAX_TIME_QUANTA; + tqMin = ENCBT_MIN_TIME_QUANTA; + pdivMAX = MAX_ENPRESDIV; + seg1Max = MAX_NTSEG2 + 1U; + proSegMax = MAX_NTSEG1 - MAX_NTSEG2; +#else + /* Auto Improved Protocal timing for CBT. */ + tqNum = CBT_MAX_TIME_QUANTA; + tqMin = CBT_MIN_TIME_QUANTA; + pdivMAX = MAX_PRESDIV; + seg1Max = MAX_EPSEG1 + 1U; + proSegMax = MAX_EPROPSEG + 1U; +#endif + + do + { + clk = bitRate * tqNum; + if (clk > sourceClock_Hz) + { + continue; /* tqNum too large, clk has been exceed sourceClock_Hz. */ + } + + if ((sourceClock_Hz / clk * clk) != sourceClock_Hz) + { + continue; /* Non-supporting: the frequency of clock source is not divisible by target bit rate, the user + should change a divisible bit rate. */ + } + + configTemp.preDivider = (uint16_t)(sourceClock_Hz / clk) - 1U; + if (configTemp.preDivider > pdivMAX) + { + break; /* The frequency of source clock is too large or the bit rate is too small, the pre-divider could + not handle it. */ + } + + /* Calculates the best timing configuration under current tqNum. */ + configTemp.phaseSeg2 = (uint8_t)(tqNum - (tqNum * IDEAL_NOMINAL_SP) / (uint32_t)IDEAL_SP_FACTOR); + + /* Calculates phaseSeg1 and propSeg and try to make phaseSeg1 equal to phaseSeg2. */ + if ((tqNum - configTemp.phaseSeg2 - 1U) > (seg1Max + proSegMax)) + { + seg1Temp = seg1Max + proSegMax; + configTemp.phaseSeg2 = (uint8_t)(tqNum - 1U - seg1Temp); + } + else + { + seg1Temp = tqNum - configTemp.phaseSeg2 - 1U; + } + if (seg1Temp > (configTemp.phaseSeg2 + proSegMax)) + { + configTemp.propSeg = (uint8_t)proSegMax; + configTemp.phaseSeg1 = (uint8_t)(seg1Temp - proSegMax); + } + else + { + configTemp.propSeg = (uint8_t)(seg1Temp - configTemp.phaseSeg2); + configTemp.phaseSeg1 = configTemp.phaseSeg2; + } + + /* rJumpwidth (sjw) is the minimum value of phaseSeg1 and phaseSeg2. */ + configTemp.rJumpwidth = + (configTemp.phaseSeg1 > configTemp.phaseSeg2) ? configTemp.phaseSeg2 : configTemp.phaseSeg1; + configTemp.phaseSeg1 -= 1U; + configTemp.phaseSeg2 -= 1U; + configTemp.propSeg -= 1U; + configTemp.rJumpwidth -= 1U; + + if (((((uint32_t)configTemp.phaseSeg2 + 1U) * 1000U) / tqNum) < spTemp) + { + spTemp = (((uint32_t)configTemp.phaseSeg2 + 1U) * 1000U) / tqNum; + pTimingConfig->preDivider = configTemp.preDivider; + pTimingConfig->rJumpwidth = configTemp.rJumpwidth; + pTimingConfig->phaseSeg1 = configTemp.phaseSeg1; + pTimingConfig->phaseSeg2 = configTemp.phaseSeg2; + pTimingConfig->propSeg = configTemp.propSeg; + } + fgRet = true; + } while (--tqNum >= tqMin); + + return fgRet; +} + +/*! + * brief Calculates the improved timing values by specific bit rates for CAN FD. + * + * This function use to calculates the CAN FD timing values according to the given nominal phase bit rate and data phase + * bit rate. The Calculated timing values will be set in CBT/ENCBT and FDCBT/EDCBT registers. The calculation is based + * on the recommendation of the CiA 1301 v1.0.0 document. + * + * param bitRate The CAN FD nominal phase speed in bps defined by user. + * param bitRateFD The CAN FD data phase speed in bps defined by user. Equal to bitRate means disable bit rate + * switching. param sourceClock_Hz The Source clock frequency in Hz. param pTimingConfig Pointer to the FlexCAN timing + * configuration structure. + * + * return TRUE if timing configuration found, FALSE if failed to find configuration + */ +bool FLEXCAN_FDCalculateImprovedTimingValues(CAN_Type *base, + uint32_t bitRate, + uint32_t bitRateFD, + uint32_t sourceClock_Hz, + flexcan_timing_config_t *pTimingConfig) +{ + /* Observe bit rate maximums */ + assert(bitRate <= MAX_CANFD_BITRATE); + assert(bitRateFD <= MAX_CANFD_BITRATE); + /* Data phase bit rate need greater or equal to nominal phase bit rate. */ + assert(bitRate <= bitRateFD); + + uint32_t clk; + uint32_t tqMin, pdivMAX, tqTemp; + bool fgRet = false; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + /* Auto Improved Protocal timing for EDCBT. */ + tqTemp = EDCBT_MAX_TIME_QUANTA; + tqMin = EDCBT_MIN_TIME_QUANTA; + pdivMAX = MAX_EDPRESDIV; +#else + /* Auto Improved Protocal timing for FDCBT. */ + tqTemp = FDCBT_MAX_TIME_QUANTA; + tqMin = FDCBT_MIN_TIME_QUANTA; + pdivMAX = MAX_FPRESDIV; +#endif + + if (bitRate != bitRateFD) + { + /* To minimize errors when processing FD frames, try to get the same bit rate prescaler value for nominal phase + and data phase. */ + do + { + clk = bitRateFD * tqTemp; + if (clk > sourceClock_Hz) + { + continue; /* tqTemp too large, clk x tqTemp has been exceed sourceClock_Hz. */ + } + + if ((sourceClock_Hz / clk * clk) != sourceClock_Hz) + { + continue; /* the frequency of clock source is not divisible by target bit rate. */ + } + + pTimingConfig->fpreDivider = (uint16_t)(sourceClock_Hz / clk) - 1U; + + if (pTimingConfig->fpreDivider > pdivMAX) + { + break; /* The frequency of source clock is too large or the bit rate is too small, the pre-divider + could not handle it. */ + } + + /* Calculates the best data phase timing configuration. */ + FLEXCAN_FDGetSegments(bitRateFD, tqTemp, pTimingConfig); + + if (FLEXCAN_CalculateImprovedNominalTimingValues( + bitRate, sourceClock_Hz / ((uint32_t)pTimingConfig->fpreDivider + 1U), pTimingConfig)) + { + fgRet = true; + if (pTimingConfig->preDivider == 0U) + { + pTimingConfig->preDivider = pTimingConfig->fpreDivider; + break; + } + else + { + pTimingConfig->preDivider = + (pTimingConfig->preDivider + 1U) * (pTimingConfig->fpreDivider + 1U) - 1U; + continue; + } + } + } while (--tqTemp >= tqMin); + } + else + { + if (FLEXCAN_CalculateImprovedNominalTimingValues(bitRate, sourceClock_Hz, pTimingConfig)) + { + /* No need data phase timing configuration, data phase rate equal to nominal phase rate, user don't use Brs + feature. */ + pTimingConfig->fpreDivider = 0U; + pTimingConfig->frJumpwidth = 0U; + pTimingConfig->fphaseSeg1 = 0U; + pTimingConfig->fphaseSeg2 = 0U; + pTimingConfig->fpropSeg = 0U; + fgRet = true; + } + } + return fgRet; +} + +/*! + * brief Configures a FlexCAN transmit message buffer. + * + * This function aborts the previous transmission, cleans the Message Buffer, and + * configures it as a Transmit Message Buffer. + * + * param base FlexCAN peripheral base address. + * param mbIdx The Message Buffer index. + * param enable Enable/disable Tx Message Buffer. + * - true: Enable Tx Message Buffer. + * - false: Disable Tx Message Buffer. + */ +void FLEXCAN_SetFDTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable) +{ + /* Assertion. */ + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + uint8_t cnt = 0; + uint8_t payload_dword = 1; + uint32_t dataSize; + dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; + volatile uint32_t *mbAddr = &(base->MB[0].CS); + uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) + uint32_t availoffset = FLEXCAN_GetFDMailboxOffset(base, FLEXCAN_GetFirstValidMb(base)); +#endif + + /* Inactivate Message Buffer. */ + if (enable) + { + /* Inactivate by writing CS. */ + mbAddr[offset] = CAN_CS_CODE(kFLEXCAN_TxMbInactive); + } + else + { + mbAddr[offset] = 0x0; + } + + /* Calculate the DWORD number, dataSize 0/1/2/3 corresponds to 8/16/32/64 + Bytes payload. */ + for (cnt = 0; cnt < (dataSize + 1U); cnt++) + { + payload_dword *= 2U; + } + + /* Clean ID. */ + mbAddr[offset + 1U] = 0x0U; + /* Clean Message Buffer content, DWORD by DWORD. */ + for (cnt = 0; cnt < payload_dword; cnt++) + { + mbAddr[offset + 2U + cnt] = 0x0U; + } + +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) + mbAddr[availoffset] = CAN_CS_CODE(kFLEXCAN_TxMbInactive); +#endif +} +#endif /* FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE */ + +/*! + * brief Configures a FlexCAN Receive Message Buffer. + * + * This function cleans a FlexCAN build-in Message Buffer and configures it + * as a Receive Message Buffer. + * + * param base FlexCAN peripheral base address. + * param mbIdx The Message Buffer index. + * param pRxMbConfig Pointer to the FlexCAN Message Buffer configuration structure. + * param enable Enable/disable Rx Message Buffer. + * - true: Enable Rx Message Buffer. + * - false: Disable Rx Message Buffer. + */ +void FLEXCAN_SetRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable) +{ + /* Assertion. */ + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); + assert(((NULL != pRxMbConfig) || (false == enable))); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + uint32_t cs_temp = 0; + + /* Inactivate Message Buffer. */ + base->MB[mbIdx].CS = 0; + + /* Clean Message Buffer content. */ + base->MB[mbIdx].ID = 0x0; + base->MB[mbIdx].WORD0 = 0x0; + base->MB[mbIdx].WORD1 = 0x0; + + if (enable) + { + /* Setup Message Buffer ID. */ + base->MB[mbIdx].ID = pRxMbConfig->id; + + /* Setup Message Buffer format. */ + if (kFLEXCAN_FrameFormatExtend == pRxMbConfig->format) + { + cs_temp |= CAN_CS_IDE_MASK; + } + + /* Setup Message Buffer type. */ + if (kFLEXCAN_FrameTypeRemote == pRxMbConfig->type) + { + cs_temp |= CAN_CS_RTR_MASK; + } + + /* Activate Rx Message Buffer. */ + cs_temp |= CAN_CS_CODE(kFLEXCAN_RxMbEmpty); + base->MB[mbIdx].CS = cs_temp; + } +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Configures a FlexCAN Receive Message Buffer. + * + * This function cleans a FlexCAN build-in Message Buffer and configures it + * as a Receive Message Buffer. + * + * param base FlexCAN peripheral base address. + * param mbIdx The Message Buffer index. + * param pRxMbConfig Pointer to the FlexCAN Message Buffer configuration structure. + * param enable Enable/disable Rx Message Buffer. + * - true: Enable Rx Message Buffer. + * - false: Disable Rx Message Buffer. + */ +void FLEXCAN_SetFDRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable) +{ + /* Assertion. */ + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); + assert(((NULL != pRxMbConfig) || (false == enable))); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + uint32_t cs_temp = 0; + uint8_t cnt = 0; + volatile uint32_t *mbAddr = &(base->MB[0].CS); + uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); + uint8_t payload_dword; + uint32_t dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; + + /* Inactivate Message Buffer. */ + mbAddr[offset] = 0U; + + /* Clean Message Buffer content. */ + mbAddr[offset + 1U] = 0U; + /* Calculate the DWORD number, dataSize 0/1/2/3 corresponds to 8/16/32/64 + Bytes payload. */ + payload_dword = (2U << dataSize); + for (cnt = 0; cnt < payload_dword; cnt++) + { + mbAddr[offset + 2U + cnt] = 0x0; + } + + if (enable) + { + /* Setup Message Buffer ID. */ + mbAddr[offset + 1U] = pRxMbConfig->id; + + /* Setup Message Buffer format. */ + if (kFLEXCAN_FrameFormatExtend == pRxMbConfig->format) + { + cs_temp |= CAN_CS_IDE_MASK; + } + + /* Setup Message Buffer type. */ + if (kFLEXCAN_FrameTypeRemote == pRxMbConfig->type) + { + cs_temp |= CAN_CS_RTR_MASK; + } + + /* Activate Rx Message Buffer. */ + cs_temp |= CAN_CS_CODE(kFLEXCAN_RxMbEmpty); + mbAddr[offset] = cs_temp; + } +} +#endif + +/*! + * brief Configures the FlexCAN Legacy Rx FIFO. + * + * This function configures the FlexCAN Rx FIFO with given configuration. + * note Legacy Rx FIFO only can receive classic CAN message. + * + * param base FlexCAN peripheral base address. + * param pRxFifoConfig Pointer to the FlexCAN Legacy Rx FIFO configuration structure. Can be NULL when enable parameter + * is false. + * param enable Enable/disable Legacy Rx FIFO. + * - true: Enable Legacy Rx FIFO. + * - false: Disable Legacy Rx FIFO. + */ +void FLEXCAN_SetRxFifoConfig(CAN_Type *base, const flexcan_rx_fifo_config_t *pRxFifoConfig, bool enable) +{ + /* Assertion. */ + assert((NULL != pRxFifoConfig) || (false == enable)); + + volatile uint32_t *mbAddr; + uint8_t i, j, k, rffn = 0, numMbOccupy; + uint32_t setup_mb = 0; + + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + + if (enable) + { + assert(pRxFifoConfig->idFilterNum <= 128U); +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + /* Legacy Rx FIFO and Enhanced Rx FIFO cannot be enabled at the same time. */ + assert((base->ERFCR & CAN_ERFCR_ERFEN_MASK) == 0U); +#endif + + /* Get the setup_mb value. */ + setup_mb = (uint8_t)((base->MCR & CAN_MCR_MAXMB_MASK) >> CAN_MCR_MAXMB_SHIFT); + setup_mb = (setup_mb < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base)) ? + setup_mb : + (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); + + /* Determine RFFN value. */ + for (i = 0; i <= 0xFU; i++) + { + if ((8U * (i + 1U)) >= pRxFifoConfig->idFilterNum) + { + rffn = i; + assert(((setup_mb - 8U) - (2U * rffn)) > 0U); + + base->CTRL2 = (base->CTRL2 & ~CAN_CTRL2_RFFN_MASK) | CAN_CTRL2_RFFN(rffn); + break; + } + } + + /* caculate the Number of Mailboxes occupied by RX Legacy FIFO and the filter. */ + numMbOccupy = 6U + (rffn + 1U) * 2U; + + /* Copy ID filter table to Message Buffer Region (Fix MISRA_C-2012 Rule 18.1). */ + j = 0U; + for (i = 6U; i < numMbOccupy; i++) + { + /* Get address for current mail box. */ + mbAddr = &(base->MB[i].CS); + + /* One Mail box contain 4U DWORD registers. */ + for (k = 0; k < 4U; k++) + { + /* Fill all valid filter in the mail box occupied by filter. + * Disable unused Rx FIFO Filter, the other rest of register in the last Mail box occupied by fiter set + * as 0xffffffff. + */ + mbAddr[k] = (j < pRxFifoConfig->idFilterNum) ? (pRxFifoConfig->idFilterTable[j]) : 0xFFFFFFFFU; + + /* Try to fill next filter in current Mail Box. */ + j++; + } + } + + /* Setup ID Fitlter Type. */ + switch (pRxFifoConfig->idFilterType) + { + case kFLEXCAN_RxFifoFilterTypeA: + base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x0); + break; + case kFLEXCAN_RxFifoFilterTypeB: + base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x1); + break; + case kFLEXCAN_RxFifoFilterTypeC: + base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x2); + break; + case kFLEXCAN_RxFifoFilterTypeD: + /* All frames rejected. */ + base->MCR = (base->MCR & ~CAN_MCR_IDAM_MASK) | CAN_MCR_IDAM(0x3); + break; + default: + /* All the cases have been listed above, the default clause should not be reached. */ + assert(false); + break; + } + + /* Setting Message Reception Priority. */ + base->CTRL2 = (pRxFifoConfig->priority == kFLEXCAN_RxFifoPrioHigh) ? (base->CTRL2 & ~CAN_CTRL2_MRP_MASK) : + (base->CTRL2 | CAN_CTRL2_MRP_MASK); + + /* Enable Rx Message FIFO. */ + base->MCR |= CAN_MCR_RFEN_MASK; + } + else + { + rffn = (uint8_t)((base->CTRL2 & CAN_CTRL2_RFFN_MASK) >> CAN_CTRL2_RFFN_SHIFT); + /* caculate the Number of Mailboxes occupied by RX Legacy FIFO and the filter. */ + numMbOccupy = 6U + (rffn + 1U) * 2U; + + /* Disable Rx Message FIFO. */ + base->MCR &= ~CAN_MCR_RFEN_MASK; + + /* Clean MB0 ~ MB5 and all MB occupied by ID filters (Fix MISRA_C-2012 Rule 18.1). */ + + for (i = 0; i < numMbOccupy; i++) + { + FLEXCAN_SetRxMbConfig(base, i, NULL, false); + } + } + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * brief Configures the FlexCAN Enhanced Rx FIFO. + * + * This function configures the Enhanced Rx FIFO with given configuration. + * note Enhanced Rx FIFO support receive classic CAN or CAN FD messages, Legacy Rx FIFO and Enhanced Rx FIFO + * cannot be enabled at the same time. + * + * param base FlexCAN peripheral base address. + * param pConfig Pointer to the FlexCAN Enhanced Rx FIFO configuration structure. Can be NULL when enable parameter + * is false. + * param enable Enable/disable Enhanced Rx FIFO. + * - true: Enable Enhanced Rx FIFO. + * - false: Disable Enhanced Rx FIFO. + */ +void FLEXCAN_SetEnhancedRxFifoConfig(CAN_Type *base, const flexcan_enhanced_rx_fifo_config_t *pConfig, bool enable) +{ + /* Assertion. */ + assert((NULL != pConfig) || (false == enable)); + uint32_t i; + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + + if (enable) + { + /* Each pair of filter elements occupies 2 words and can consist of one extended ID filter element or two + * standard ID filter elements. */ + assert((((uint32_t)pConfig->idFilterPairNum * 2UL) < + (uint32_t)FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_FILTER_MAX_NUMBER) && + (pConfig->extendIdFilterNum <= pConfig->idFilterPairNum) && (0UL != pConfig->idFilterPairNum)); + + /* The Enhanced Rx FIFO Watermark cannot be greater than the enhanced Rx FIFO size. */ + assert(pConfig->fifoWatermark < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_SIZE); + + /* Legacy Rx FIFO and Enhanced Rx FIFO cannot be enabled at the same time. */ + assert((base->MCR & CAN_MCR_RFEN_MASK) == 0U); + + /* Reset Enhanced Rx FIFO engine and clear flags. */ + base->ERFSR |= CAN_ERFSR_ERFCLR_MASK | CAN_ERFSR_ERFUFW_MASK | CAN_ERFSR_ERFOVF_MASK | CAN_ERFSR_ERFWMI_MASK | + CAN_ERFSR_ERFDA_MASK; + /* Setting Enhanced Rx FIFO. */ + base->ERFCR = CAN_ERFCR_DMALW(pConfig->dmaPerReadLength) | CAN_ERFCR_NEXIF(pConfig->extendIdFilterNum) | + CAN_ERFCR_NFE((uint32_t)pConfig->idFilterPairNum - 1UL) | CAN_ERFCR_ERFWM(pConfig->fifoWatermark); + /* Copy ID filter table to Enhanced Rx FIFO Filter Element registers. */ + for (i = 0; i < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_FILTER_MAX_NUMBER; i++) + { + base->ERFFEL[i] = (i < ((uint32_t)pConfig->idFilterPairNum * 2U)) ? pConfig->idFilterTable[i] : 0xFFFFFFFFU; + } + + /* Setting Message Reception Priority. */ + base->CTRL2 = (pConfig->priority == kFLEXCAN_RxFifoPrioHigh) ? (base->CTRL2 & ~CAN_CTRL2_MRP_MASK) : + (base->CTRL2 | CAN_CTRL2_MRP_MASK); + /* Enable Enhanced Rx FIFO. */ + base->ERFCR |= CAN_ERFCR_ERFEN_MASK; + } + else + { + /* Disable Enhanced Rx FIFO. */ + base->ERFCR = 0U; + /* Reset Enhanced Rx FIFO engine and clear flags. */ + base->ERFSR |= CAN_ERFSR_ERFCLR_MASK | CAN_ERFSR_ERFUFW_MASK | CAN_ERFSR_ERFOVF_MASK | CAN_ERFSR_ERFWMI_MASK | + CAN_ERFSR_ERFDA_MASK; + /* Clean all Enhanced Rx FIFO Filter Element registers. */ + for (i = 0; i < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO_FILTER_MAX_NUMBER; i++) + { + base->ERFFEL[i] = 0xFFFFFFFFU; + } + } + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); +} +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) && FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) +/*! + * brief Enables or disables the FlexCAN Legacy/Enhanced Rx FIFO DMA request. + * + * This function enables or disables the DMA feature of FlexCAN build-in Rx FIFO. + * + * param base FlexCAN peripheral base address. + * param enable true to enable, false to disable. + */ +void FLEXCAN_EnableRxFifoDMA(CAN_Type *base, bool enable) +{ + if (enable) + { + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + + /* Enable FlexCAN DMA. */ + base->MCR |= CAN_MCR_DMA_MASK; + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); + } + else + { + /* Enter Freeze Mode. */ + FLEXCAN_EnterFreezeMode(base); + + /* Disable FlexCAN DMA. */ + base->MCR &= ~CAN_MCR_DMA_MASK; + + /* Exit Freeze Mode. */ + FLEXCAN_ExitFreezeMode(base); + } +} +#endif /* FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA */ + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +/*! + * brief Gets the FlexCAN Memory Error Report registers status. + * + * This function gets the FlexCAN Memory Error Report registers status. + * + * param base FlexCAN peripheral base address. + * param errorStatus Pointer to FlexCAN Memory Error Report registers status structure. + */ +void FLEXCAN_GetMemoryErrorReportStatus(CAN_Type *base, flexcan_memory_error_report_status_t *errorStatus) +{ + uint32_t temp; + /* Disable updates of the error report registers. */ + base->MECR |= CAN_MECR_RERRDIS_MASK; + + errorStatus->accessAddress = (uint16_t)(base->RERRAR & CAN_RERRAR_ERRADDR_MASK); + errorStatus->errorData = base->RERRDR; + errorStatus->errorType = + (base->RERRAR & CAN_RERRAR_NCE_MASK) == 0U ? kFLEXCAN_CorrectableError : kFLEXCAN_NonCorrectableError; + + temp = (base->RERRAR & CAN_RERRAR_SAID_MASK) >> CAN_RERRAR_SAID_SHIFT; + switch (temp) + { + case (uint32_t)kFLEXCAN_MoveOutFlexCanAccess: + case (uint32_t)kFLEXCAN_MoveInAccess: + case (uint32_t)kFLEXCAN_TxArbitrationAccess: + case (uint32_t)kFLEXCAN_RxMatchingAccess: + case (uint32_t)kFLEXCAN_MoveOutHostAccess: + errorStatus->accessType = (flexcan_memory_access_type_t)temp; + break; + default: + assert(false); + break; + } + + for (uint32_t i = 0; i < 4U; i++) + { + temp = (base->RERRSYNR & ((uint32_t)CAN_RERRSYNR_SYND0_MASK << (i * 8U))) >> (i * 8U); + errorStatus->byteStatus[i].byteIsRead = (base->RERRSYNR & ((uint32_t)CAN_RERRSYNR_BE0_MASK << (i * 8U))) != 0U; + switch (temp) + { + case CAN_RERRSYNR_SYND0(kFLEXCAN_NoError): + case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits0Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits1Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits2Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits3Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_ParityBits4Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits0Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits1Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits2Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits3Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits4Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits5Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits6Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_DataBits7Error): + case CAN_RERRSYNR_SYND0(kFLEXCAN_AllZeroError): + case CAN_RERRSYNR_SYND0(kFLEXCAN_AllOneError): + errorStatus->byteStatus[i].bitAffected = (flexcan_byte_error_syndrome_t)temp; + break; + default: + errorStatus->byteStatus[i].bitAffected = kFLEXCAN_NonCorrectableErrors; + break; + } + } + + /* Re-enable updates of the error report registers. */ + base->MECR &= CAN_MECR_RERRDIS_MASK; +} +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) +/*! + * FlexCAN: A frame with wrong ID or payload is transmitted into + * the CAN bus when the Message Buffer under transmission is + * either aborted or deactivated while the CAN bus is in the Bus Idle state + * + * This function to do workaround for ERR006032 + * + * param base FlexCAN peripheral base address. + * param mbIdx The FlexCAN Message Buffer index. + */ +static void FLEXCAN_ERRATA_6032(CAN_Type *base, volatile uint32_t *mbCSAddr) +{ + uint32_t dbg_temp = 0U; + uint32_t u32TempCS = 0U; + uint32_t u32Timeout = DELAY_BUSIDLE; + /*disable ALL interrupts to prevent any context switching*/ + uint32_t irqMask = DisableGlobalIRQ(); + dbg_temp = (uint32_t)(base->DBG1); + switch (dbg_temp & CAN_DBG1_CFSM_MASK) + { + case RXINTERMISSION: + if (CBN_VALUE3 == (dbg_temp & CAN_DBG1_CBN_MASK)) + { + /*wait until CFSM is different from RXINTERMISSION */ + while (RXINTERMISSION == (base->DBG1 & CAN_DBG1_CFSM_MASK)) + { + __NOP(); + } + } + break; + case TXINTERMISSION: + if (CBN_VALUE3 == (dbg_temp & CAN_DBG1_CBN_MASK)) + { + /*wait until CFSM is different from TXINTERMISSION*/ + while (TXINTERMISSION == (base->DBG1 & CAN_DBG1_CFSM_MASK)) + { + __NOP(); + } + } + break; + default: + /* To avoid MISRA-C 2012 rule 16.4 issue. */ + break; + } + /*Anyway, BUSIDLE need to delay*/ + if (BUSIDLE == (base->DBG1 & CAN_DBG1_CFSM_MASK)) + { + while (u32Timeout-- > 0U) + { + __NOP(); + } + + /*Write 0x0 into Code field of CS word.*/ + u32TempCS = (uint32_t)(*mbCSAddr); + u32TempCS &= ~CAN_CS_CODE_MASK; + *mbCSAddr = u32TempCS; + } + /*restore interruption*/ + EnableGlobalIRQ(irqMask); +} +#endif + +/*! + * brief Writes a FlexCAN Message to the Transmit Message Buffer. + * + * This function writes a CAN Message to the specified Transmit Message Buffer + * and changes the Message Buffer state to start CAN Message transmit. After + * that the function returns immediately. + * + * param base FlexCAN peripheral base address. + * param mbIdx The FlexCAN Message Buffer index. + * param pTxFrame Pointer to CAN message frame to be sent. + * retval kStatus_Success - Write Tx Message Buffer Successfully. + * retval kStatus_Fail - Tx Message Buffer is currently in use. + */ +status_t FLEXCAN_WriteTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_frame_t *pTxFrame) +{ + /* Assertion. */ + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); + assert(NULL != pTxFrame); + assert(pTxFrame->length <= 8U); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + uint32_t cs_temp = 0; + status_t status; + + /* Check if Message Buffer is available. */ + if (CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) != (base->MB[mbIdx].CS & CAN_CS_CODE_MASK)) + { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) + FLEXCAN_ERRATA_6032(base, &(base->MB[mbIdx].CS)); +#endif + /* Inactive Tx Message Buffer. */ + base->MB[mbIdx].CS = (base->MB[mbIdx].CS & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive); + + /* Fill Message ID field. */ + base->MB[mbIdx].ID = pTxFrame->id; + + /* Fill Message Format field. */ + if ((uint32_t)kFLEXCAN_FrameFormatExtend == pTxFrame->format) + { + cs_temp |= CAN_CS_SRR_MASK | CAN_CS_IDE_MASK; + } + + /* Fill Message Type field. */ + if ((uint32_t)kFLEXCAN_FrameTypeRemote == pTxFrame->type) + { + cs_temp |= CAN_CS_RTR_MASK; + } + + cs_temp |= CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) | CAN_CS_DLC(pTxFrame->length); + + /* Load Message Payload. */ + base->MB[mbIdx].WORD0 = pTxFrame->dataWord0; + base->MB[mbIdx].WORD1 = pTxFrame->dataWord1; + + /* Activate Tx Message Buffer. */ + base->MB[mbIdx].CS = cs_temp; + +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) + base->MB[FLEXCAN_GetFirstValidMb(base)].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive); + base->MB[FLEXCAN_GetFirstValidMb(base)].CS = CAN_CS_CODE(kFLEXCAN_TxMbInactive); +#endif + + status = kStatus_Success; + } + else + { + /* Tx Message Buffer is activated, return immediately. */ + status = kStatus_Fail; + } + + return status; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Writes a FlexCAN FD Message to the Transmit Message Buffer. + * + * This function writes a CAN FD Message to the specified Transmit Message Buffer + * and changes the Message Buffer state to start CAN FD Message transmit. After + * that the function returns immediately. + * + * param base FlexCAN peripheral base address. + * param mbIdx The FlexCAN FD Message Buffer index. + * param pTxFrame Pointer to CAN FD message frame to be sent. + * retval kStatus_Success - Write Tx Message Buffer Successfully. + * retval kStatus_Fail - Tx Message Buffer is currently in use. + */ +status_t FLEXCAN_WriteFDTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_fd_frame_t *pTxFrame) +{ + /* Assertion. */ + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); + assert(NULL != pTxFrame); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + status_t status; + uint32_t cs_temp = 0; + uint8_t cnt = 0; + uint32_t can_cs = 0; + uint8_t payload_dword = 1; + uint32_t dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) + uint32_t availoffset = FLEXCAN_GetFDMailboxOffset(base, FLEXCAN_GetFirstValidMb(base)); +#endif + volatile uint32_t *mbAddr = &(base->MB[0].CS); + uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); + + can_cs = mbAddr[offset]; + /* Check if Message Buffer is available. */ + if (CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) != (can_cs & CAN_CS_CODE_MASK)) + { +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_6032) + FLEXCAN_ERRATA_6032(base, &(mbAddr[offset])); +#endif + /* Inactive Tx Message Buffer and Fill Message ID field. */ + mbAddr[offset] = (can_cs & ~CAN_CS_CODE_MASK) | CAN_CS_CODE(kFLEXCAN_TxMbInactive); + mbAddr[offset + 1U] = pTxFrame->id; + + /* Fill Message Format field. */ + if ((uint32_t)kFLEXCAN_FrameFormatExtend == pTxFrame->format) + { + cs_temp |= CAN_CS_SRR_MASK | CAN_CS_IDE_MASK; + } + + /* Fill Message Type field. */ + if ((uint32_t)kFLEXCAN_FrameTypeRemote == pTxFrame->type) + { + cs_temp |= CAN_CS_RTR_MASK; + } + + cs_temp |= CAN_CS_CODE(kFLEXCAN_TxMbDataOrRemote) | CAN_CS_DLC(pTxFrame->length) | CAN_CS_EDL(pTxFrame->edl) | + CAN_CS_BRS(pTxFrame->brs); + + /* Calculate the DWORD number, dataSize 0/1/2/3 corresponds to 8/16/32/64 + Bytes payload. */ + for (cnt = 0; cnt < (dataSize + 1U); cnt++) + { + payload_dword *= 2U; + } + + /* Load Message Payload and Activate Tx Message Buffer. */ + for (cnt = 0; cnt < payload_dword; cnt++) + { + mbAddr[offset + 2U + cnt] = pTxFrame->dataWord[cnt]; + } + mbAddr[offset] = cs_temp; + +#if ((defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5641) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829) && FSL_FEATURE_FLEXCAN_HAS_ERRATA_5829)) + mbAddr[availoffset] = CAN_CS_CODE(kFLEXCAN_TxMbInactive); + mbAddr[availoffset] = CAN_CS_CODE(kFLEXCAN_TxMbInactive); +#endif + + status = kStatus_Success; + } + else + { + /* Tx Message Buffer is activated, return immediately. */ + status = kStatus_Fail; + } + + return status; +} +#endif + +/*! + * brief Reads a FlexCAN Message from Receive Message Buffer. + * + * 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. + * + * param base FlexCAN peripheral base address. + * param mbIdx The FlexCAN Message Buffer index. + * param pRxFrame Pointer to CAN message frame structure for reception. + * retval kStatus_Success - Rx Message Buffer is full and has been read successfully. + * retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. + * retval kStatus_Fail - Rx Message Buffer is empty. + */ +status_t FLEXCAN_ReadRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame) +{ + /* Assertion. */ + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); + assert(NULL != pRxFrame); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + uint32_t cs_temp; + uint32_t rx_code; + status_t status; + + /* Read CS field of Rx Message Buffer to lock Message Buffer. */ + cs_temp = base->MB[mbIdx].CS; + /* Get Rx Message Buffer Code field. */ + rx_code = (cs_temp & CAN_CS_CODE_MASK) >> CAN_CS_CODE_SHIFT; + + /* Check to see if Rx Message Buffer is full. */ + if (((uint32_t)kFLEXCAN_RxMbFull == rx_code) || ((uint32_t)kFLEXCAN_RxMbOverrun == rx_code)) + { + /* Store Message ID. */ + pRxFrame->id = base->MB[mbIdx].ID & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK); + + /* Get the message ID and format. */ + pRxFrame->format = (cs_temp & CAN_CS_IDE_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameFormatExtend : + (uint8_t)kFLEXCAN_FrameFormatStandard; + + /* Get the message type. */ + pRxFrame->type = + (cs_temp & CAN_CS_RTR_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameTypeRemote : (uint8_t)kFLEXCAN_FrameTypeData; + + /* Get the message length. */ + pRxFrame->length = (uint8_t)((cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT); + + /* Get the time stamp. */ + pRxFrame->timestamp = (uint16_t)((cs_temp & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); + + /* Store Message Payload. */ + pRxFrame->dataWord0 = base->MB[mbIdx].WORD0; + pRxFrame->dataWord1 = base->MB[mbIdx].WORD1; + + /* Read free-running timer to unlock Rx Message Buffer. */ + (void)base->TIMER; + + if ((uint32_t)kFLEXCAN_RxMbFull == rx_code) + { + status = kStatus_Success; + } + else + { + status = kStatus_FLEXCAN_RxOverflow; + } + } + else + { + /* Read free-running timer to unlock Rx Message Buffer. */ + (void)base->TIMER; + + status = kStatus_Fail; + } + + return status; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Reads a FlexCAN FD Message from Receive Message Buffer. + * + * This function reads a CAN FD message from a specified Receive Message Buffer. + * The function fills a receive CAN FD message frame structure with + * just received data and activates the Message Buffer again. + * The function returns immediately. + * + * param base FlexCAN peripheral base address. + * param mbIdx The FlexCAN FD Message Buffer index. + * param pRxFrame Pointer to CAN FD message frame structure for reception. + * retval kStatus_Success - Rx Message Buffer is full and has been read successfully. + * retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. + * retval kStatus_Fail - Rx Message Buffer is empty. + */ +status_t FLEXCAN_ReadFDRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame) +{ + /* Assertion. */ + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); + assert(NULL != pRxFrame); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + status_t status; + uint32_t cs_temp; + uint8_t rx_code; + uint8_t cnt = 0; + uint32_t can_id = 0; + uint32_t dataSize; + dataSize = (base->FDCTRL & CAN_FDCTRL_MBDSR0_MASK) >> CAN_FDCTRL_MBDSR0_SHIFT; + uint8_t payload_dword = 1; + volatile uint32_t *mbAddr = &(base->MB[0].CS); + uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); + + /* Read CS field of Rx Message Buffer to lock Message Buffer. */ + cs_temp = mbAddr[offset]; + can_id = mbAddr[offset + 1U]; + + /* Get Rx Message Buffer Code field. */ + rx_code = (uint8_t)((cs_temp & CAN_CS_CODE_MASK) >> CAN_CS_CODE_SHIFT); + + /* Check to see if Rx Message Buffer is full. */ + if (((uint8_t)kFLEXCAN_RxMbFull == rx_code) || ((uint8_t)kFLEXCAN_RxMbOverrun == rx_code)) + { + /* Store Message ID. */ + pRxFrame->id = can_id & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK); + + /* Get the message ID and format. */ + pRxFrame->format = (cs_temp & CAN_CS_IDE_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameFormatExtend : + (uint8_t)kFLEXCAN_FrameFormatStandard; + + /* Get Bit Rate Switch flag. */ + pRxFrame->brs = (cs_temp & CAN_CS_BRS_MASK) != 0U ? 1U : 0U; + + /* Get Extended Data Length flag. */ + pRxFrame->edl = (cs_temp & CAN_CS_EDL_MASK) != 0U ? 1U : 0U; + + /* Get the message type. */ + pRxFrame->type = + (cs_temp & CAN_CS_RTR_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameTypeRemote : (uint8_t)kFLEXCAN_FrameTypeData; + + /* Get the message length. */ + pRxFrame->length = (uint8_t)((cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT); + + /* Get the time stamp. */ + pRxFrame->timestamp = (uint16_t)((cs_temp & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); + + /* Calculate the DWORD number, dataSize 0/1/2/3 corresponds to 8/16/32/64 + Bytes payload. */ + for (cnt = 0; cnt < (dataSize + 1U); cnt++) + { + payload_dword *= 2U; + } + + /* Store Message Payload. */ + for (cnt = 0; cnt < payload_dword; cnt++) + { + pRxFrame->dataWord[cnt] = mbAddr[offset + 2U + cnt]; + } + + /* Read free-running timer to unlock Rx Message Buffer. */ + (void)base->TIMER; + + if ((uint32_t)kFLEXCAN_RxMbFull == rx_code) + { + status = kStatus_Success; + } + else + { + status = kStatus_FLEXCAN_RxOverflow; + } + } + else + { + /* Read free-running timer to unlock Rx Message Buffer. */ + (void)base->TIMER; + + status = kStatus_Fail; + } + + return status; +} +#endif + +/*! + * brief Reads a FlexCAN Message from Legacy Rx FIFO. + * + * This function reads a CAN message from the FlexCAN Legacy Rx FIFO. + * + * param base FlexCAN peripheral base address. + * param pRxFrame Pointer to CAN message frame structure for reception. + * retval kStatus_Success - Read Message from Rx FIFO successfully. + * retval kStatus_Fail - Rx FIFO is not enabled. + */ +status_t FLEXCAN_ReadRxFifo(CAN_Type *base, flexcan_frame_t *pRxFrame) +{ + /* Assertion. */ + assert(NULL != pRxFrame); + + uint32_t cs_temp; + status_t status; + + /* Check if Legacy Rx FIFO is Enabled. */ + if (0U != (base->MCR & CAN_MCR_RFEN_MASK)) + { + /* Read CS field of Rx Message Buffer to lock Message Buffer. */ + cs_temp = base->MB[0].CS; + + /* Read data from Rx FIFO output port. */ + /* Store Message ID. */ + pRxFrame->id = base->MB[0].ID & (CAN_ID_EXT_MASK | CAN_ID_STD_MASK); + + /* Get the message ID and format. */ + pRxFrame->format = (cs_temp & CAN_CS_IDE_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameFormatExtend : + (uint8_t)kFLEXCAN_FrameFormatStandard; + + /* Get the message type. */ + pRxFrame->type = + (cs_temp & CAN_CS_RTR_MASK) != 0U ? (uint8_t)kFLEXCAN_FrameTypeRemote : (uint8_t)kFLEXCAN_FrameTypeData; + + /* Get the message length. */ + pRxFrame->length = (uint8_t)((cs_temp & CAN_CS_DLC_MASK) >> CAN_CS_DLC_SHIFT); + + /* Get the time stamp. */ + pRxFrame->timestamp = (uint16_t)((cs_temp & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); + + /* Store Message Payload. */ + pRxFrame->dataWord0 = base->MB[0].WORD0; + pRxFrame->dataWord1 = base->MB[0].WORD1; + + /* Store ID Filter Hit Index. */ + pRxFrame->idhit = (uint16_t)(base->RXFIR & CAN_RXFIR_IDHIT_MASK); + + /* Read free-running timer to unlock Rx Message Buffer. */ + (void)base->TIMER; + + status = kStatus_Success; + } + else + { + status = kStatus_Fail; + } + + return status; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * brief Reads a FlexCAN Message from Enhanced Rx FIFO. + * + * This function reads a CAN or CAN FD message from the FlexCAN Enhanced Rx FIFO. + * + * param base FlexCAN peripheral base address. + * param pRxFrame Pointer to CAN FD message frame structure for reception. + * retval kStatus_Success - Read Message from Rx FIFO successfully. + * retval kStatus_Fail - Rx FIFO is not enabled. + */ +status_t FLEXCAN_ReadEnhancedRxFifo(CAN_Type *base, flexcan_fd_frame_t *pRxFrame) +{ + /* Assertion. */ + assert(NULL != pRxFrame); + + status_t status; + uint32_t idHitOff; + + /* Check if Enhanced Rx FIFO is Enabled. */ + if (0U != (base->ERFCR & CAN_ERFCR_ERFEN_MASK)) + { + /* Enhanced Rx FIFO ID HIT offset is changed dynamically according to data length code (DLC) . */ + idHitOff = (DLC_LENGTH_DECODE(((flexcan_fd_frame_t *)E_RX_FIFO(base))->length) + 3U) / 4U + 3U; + /* Copy CAN FD Message from Enhanced Rx FIFO, should use the DLC value to identify the bytes that belong to the + * message which is being read. */ + (void)memcpy((void *)pRxFrame, (void *)(uint32_t *)E_RX_FIFO(base), sizeof(uint32_t) * idHitOff); + pRxFrame->idhit = pRxFrame->dataWord[idHitOff - 3U]; + /* Clear the unused frame data. */ + for (uint32_t i = (idHitOff - 3U); i < 16U; i++) + { + pRxFrame->dataWord[i] = 0x0; + } + + /* Clear data available flag to let FlexCAN know one frame has been read from the Enhanced Rx FIFO. */ + base->ERFSR = CAN_ERFSR_ERFDA_MASK; + status = kStatus_Success; + } + else + { + status = kStatus_Fail; + } + + return status; +} +#endif + +/*! + * brief Performs a polling send transaction on the CAN bus. + * + * note A transfer handle does not need to be created before calling this API. + * + * param base FlexCAN peripheral base pointer. + * param mbIdx The FlexCAN Message Buffer index. + * param pTxFrame Pointer to CAN message frame to be sent. + * retval kStatus_Success - Write Tx Message Buffer Successfully. + * retval kStatus_Fail - Tx Message Buffer is currently in use. + */ +status_t FLEXCAN_TransferSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pTxFrame) +{ + status_t status; + + /* Write Tx Message Buffer to initiate a data sending. */ + if (kStatus_Success == FLEXCAN_WriteTxMb(base, mbIdx, (const flexcan_frame_t *)(uintptr_t)pTxFrame)) + { + /* Wait until CAN Message send out. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (mbIdx >= 64U) + { + while (0U == FLEXCAN_GetHigh64MbStatusFlags(base, (uint64_t)1U << (mbIdx - 64U))) + { + } + FLEXCAN_ClearHigh64MbStatusFlags(base, (uint64_t)1U << (mbIdx - 64U)); + } + else + { + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint64_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER) && FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER) + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint64_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << mbIdx); +#else + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint32_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint32_t)1U << mbIdx); +#endif + + /*After TX MB tranfered success, update the Timestamp from MB[mbIdx].CS register*/ + pTxFrame->timestamp = (uint16_t)((base->MB[mbIdx].CS & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); + + status = kStatus_Success; + } + else + { + status = kStatus_Fail; + } + + return status; +} + +/*! + * brief Performs a polling receive transaction on the CAN bus. + * + * note A transfer handle does not need to be created before calling this API. + * + * param base FlexCAN peripheral base pointer. + * param mbIdx The FlexCAN Message Buffer index. + * param pRxFrame Pointer to CAN message frame structure for reception. + * retval kStatus_Success - Rx Message Buffer is full and has been read successfully. + * retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. + * retval kStatus_Fail - Rx Message Buffer is empty. + */ +status_t FLEXCAN_TransferReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame) +{ +/* Wait until Rx Message Buffer non-empty. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (mbIdx >= 64U) + { + while (0U == FLEXCAN_GetHigh64MbStatusFlags(base, (uint64_t)1U << (mbIdx - 64U))) + { + } + FLEXCAN_ClearHigh64MbStatusFlags(base, (uint64_t)1U << (mbIdx - 64U)); + } + else + { + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint64_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER) && FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER) + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint64_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << mbIdx); +#else + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint32_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint32_t)1U << mbIdx); +#endif + + /* Read Received CAN Message. */ + return FLEXCAN_ReadRxMb(base, mbIdx, pRxFrame); +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Performs a polling send transaction on the CAN bus. + * + * note A transfer handle does not need to be created before calling this API. + * + * param base FlexCAN peripheral base pointer. + * param mbIdx The FlexCAN FD Message Buffer index. + * param pTxFrame Pointer to CAN FD message frame to be sent. + * retval kStatus_Success - Write Tx Message Buffer Successfully. + * retval kStatus_Fail - Tx Message Buffer is currently in use. + */ +status_t FLEXCAN_TransferFDSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pTxFrame) +{ + status_t status; + + /* Write Tx Message Buffer to initiate a data sending. */ + if (kStatus_Success == FLEXCAN_WriteFDTxMb(base, mbIdx, (const flexcan_fd_frame_t *)(uintptr_t)pTxFrame)) + { + /* Wait until CAN Message send out. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (mbIdx >= 64U) + { + while (0U == FLEXCAN_GetHigh64MbStatusFlags(base, (uint64_t)1U << (mbIdx - 64U))) + { + } + FLEXCAN_ClearHigh64MbStatusFlags(base, (uint64_t)1U << (mbIdx - 64U)); + } + else + { + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint64_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER) && FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER) + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint64_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << mbIdx); +#else + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint32_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint32_t)1U << mbIdx); +#endif + /*After TX MB tranfered success, update the Timestamp from base->MB[offset for CAN FD].CS register*/ + volatile uint32_t *mbAddr = &(base->MB[0].CS); + uint32_t offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); + pTxFrame->timestamp = (uint16_t)((mbAddr[offset] & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); + + status = kStatus_Success; + } + else + { + status = kStatus_Fail; + } + + return status; +} + +/*! + * brief Performs a polling receive transaction on the CAN bus. + * + * note A transfer handle does not need to be created before calling this API. + * + * param base FlexCAN peripheral base pointer. + * param mbIdx The FlexCAN FD Message Buffer index. + * param pRxFrame Pointer to CAN FD message frame structure for reception. + * retval kStatus_Success - Rx Message Buffer is full and has been read successfully. + * retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. + * retval kStatus_Fail - Rx Message Buffer is empty. + */ +status_t FLEXCAN_TransferFDReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame) +{ +/* Wait until Rx Message Buffer non-empty. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (mbIdx >= 64U) + { + while (0U == FLEXCAN_GetHigh64MbStatusFlags(base, (uint64_t)1U << (mbIdx - 64U))) + { + } + FLEXCAN_ClearHigh64MbStatusFlags(base, (uint64_t)1U << (mbIdx - 64U)); + } + else + { + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint64_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER) && FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER) + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint64_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << mbIdx); +#else + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint32_t)1U << mbIdx)) + { + } + FLEXCAN_ClearMbStatusFlags(base, (uint32_t)1U << mbIdx); +#endif + + /* Read Received CAN Message. */ + return FLEXCAN_ReadFDRxMb(base, mbIdx, pRxFrame); +} +#endif + +/*! + * brief Performs a polling receive transaction from Legacy Rx FIFO on the CAN bus. + * + * note A transfer handle does not need to be created before calling this API. + * + * param base FlexCAN peripheral base pointer. + * param pRxFrame Pointer to CAN message frame structure for reception. + * retval kStatus_Success - Read Message from Rx FIFO successfully. + * retval kStatus_Fail - Rx FIFO is not enabled. + */ +status_t FLEXCAN_TransferReceiveFifoBlocking(CAN_Type *base, flexcan_frame_t *pRxFrame) +{ + status_t rxFifoStatus; + + /* Wait until Legacy Rx FIFO non-empty. */ + while (0U == FLEXCAN_GetMbStatusFlags(base, (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag)) + { + } + + /* Read data from Legacy Rx FIFO. */ + rxFifoStatus = FLEXCAN_ReadRxFifo(base, pRxFrame); + + /* Clean Rx Fifo available flag. */ + FLEXCAN_ClearMbStatusFlags(base, (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag); + + return rxFifoStatus; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * brief Performs a polling receive transaction from Enhanced Rx FIFO on the CAN bus. + * + * note A transfer handle does not need to be created before calling this API. + * + * param base FlexCAN peripheral base pointer. + * param pRxFrame Pointer to CAN FD message frame structure for reception. + * retval kStatus_Success - Read Message from Rx FIFO successfully. + * retval kStatus_Fail - Rx FIFO is not enabled. + */ +status_t FLEXCAN_TransferReceiveEnhancedFifoBlocking(CAN_Type *base, flexcan_fd_frame_t *pRxFrame) +{ + status_t rxFifoStatus; + + /* Wait until Enhanced Rx FIFO non-empty. */ + while (0U == (FLEXCAN_GetStatusFlags(base) & (uint64_t)kFLEXCAN_ERxFifoDataAvlIntFlag)) + { + } + + /* Read data from Enhanced Rx FIFO */ + rxFifoStatus = FLEXCAN_ReadEnhancedRxFifo(base, pRxFrame); + + return rxFifoStatus; +} +#endif + +/*! + * brief Initializes the FlexCAN handle. + * + * This function initializes the FlexCAN handle, which can be used for other FlexCAN + * transactional APIs. Usually, for a specified FlexCAN instance, + * call this API once to get the initialized handle. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param callback The callback function. + * param userData The parameter of the callback function. + */ +void FLEXCAN_TransferCreateHandle(CAN_Type *base, + flexcan_handle_t *handle, + flexcan_transfer_callback_t callback, + void *userData) +{ + assert(NULL != handle); + + uint8_t instance; + + /* Clean FlexCAN transfer handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Get instance from peripheral base address. */ + instance = (uint8_t)FLEXCAN_GetInstance(base); + + /* Save the context in global variables to support the double weak mechanism. */ + s_flexcanHandle[instance] = handle; + + /* Register Callback function. */ + handle->callback = callback; + handle->userData = userData; + + s_flexcanIsr = FLEXCAN_TransferHandleIRQ; + + /* We Enable Error & Status interrupt here, because this interrupt just + * report current status of FlexCAN module through Callback function. + * It is insignificance without a available callback function. + */ + if (handle->callback != NULL) + { + FLEXCAN_EnableInterrupts( + base, (uint32_t)kFLEXCAN_BusOffInterruptEnable | (uint32_t)kFLEXCAN_ErrorInterruptEnable | + (uint32_t)kFLEXCAN_RxWarningInterruptEnable | (uint32_t)kFLEXCAN_TxWarningInterruptEnable | + (uint32_t)kFLEXCAN_WakeUpInterruptEnable +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + | (uint64_t)kFLEXCAN_PNMatchWakeUpInterruptEnable | + (uint64_t)kFLEXCAN_PNTimeoutWakeUpInterruptEnable +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + | (uint64_t)kFLEXCAN_HostAccessNCErrorInterruptEnable | + (uint64_t)kFLEXCAN_FlexCanAccessNCErrorInterruptEnable | + (uint64_t)kFLEXCAN_HostOrFlexCanCErrorInterruptEnable +#endif + ); + } + else + { + FLEXCAN_DisableInterrupts( + base, (uint32_t)kFLEXCAN_BusOffInterruptEnable | (uint32_t)kFLEXCAN_ErrorInterruptEnable | + (uint32_t)kFLEXCAN_RxWarningInterruptEnable | (uint32_t)kFLEXCAN_TxWarningInterruptEnable | + (uint32_t)kFLEXCAN_WakeUpInterruptEnable +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + | (uint64_t)kFLEXCAN_PNMatchWakeUpInterruptEnable | + (uint64_t)kFLEXCAN_PNTimeoutWakeUpInterruptEnable +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + | (uint64_t)kFLEXCAN_HostAccessNCErrorInterruptEnable | + (uint64_t)kFLEXCAN_FlexCanAccessNCErrorInterruptEnable | + (uint64_t)kFLEXCAN_HostOrFlexCanCErrorInterruptEnable +#endif + ); + } + + /* Enable interrupts in NVIC. */ + (void)EnableIRQ((IRQn_Type)(s_flexcanRxWarningIRQ[instance])); + (void)EnableIRQ((IRQn_Type)(s_flexcanTxWarningIRQ[instance])); + (void)EnableIRQ((IRQn_Type)(s_flexcanWakeUpIRQ[instance])); + (void)EnableIRQ((IRQn_Type)(s_flexcanErrorIRQ[instance])); + (void)EnableIRQ((IRQn_Type)(s_flexcanBusOffIRQ[instance])); + (void)EnableIRQ((IRQn_Type)(s_flexcanMbIRQ[instance])); +} + +/*! + * brief Sends a message using IRQ. + * + * This function sends a message using IRQ. This is a non-blocking function, which returns + * right away. When messages have been sent out, the send callback function is called. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param pMbXfer FlexCAN Message Buffer transfer structure. See the #flexcan_mb_transfer_t. + * retval kStatus_Success Start Tx Message Buffer sending process successfully. + * retval kStatus_Fail Write Tx Message Buffer failed. + * retval kStatus_FLEXCAN_TxBusy Tx Message Buffer is in use. + */ +status_t FLEXCAN_TransferSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer) +{ + /* Assertion. */ + assert(NULL != handle); + assert(NULL != pMbXfer); + assert(pMbXfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, pMbXfer->mbIdx)); +#endif + + status_t status; + + /* Check if Message Buffer is idle. */ + if ((uint8_t)kFLEXCAN_StateIdle == handle->mbState[pMbXfer->mbIdx]) + { + /* Distinguish transmit type. */ + if ((uint32_t)kFLEXCAN_FrameTypeRemote == pMbXfer->frame->type) + { + handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateTxRemote; + } + else + { + handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateTxData; + } + + if (kStatus_Success == + FLEXCAN_WriteTxMb(base, pMbXfer->mbIdx, (const flexcan_frame_t *)(uintptr_t)pMbXfer->frame)) + { + /* Enable Message Buffer Interrupt. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (pMbXfer->mbIdx >= 64U) + { + FLEXCAN_EnableHigh64MbInterrupts(base, (uint64_t)1U << (pMbXfer->mbIdx - 64U)); + } + else + { + FLEXCAN_EnableMbInterrupts(base, (uint64_t)1U << pMbXfer->mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_EnableMbInterrupts(base, (uint64_t)1U << pMbXfer->mbIdx); +#else + FLEXCAN_EnableMbInterrupts(base, (uint32_t)1U << pMbXfer->mbIdx); +#endif + status = kStatus_Success; + } + else + { + handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateIdle; + status = kStatus_Fail; + } + } + else + { + status = kStatus_FLEXCAN_TxBusy; + } + + return status; +} + +/*! + * brief Receives a message using IRQ. + * + * This function receives a message using IRQ. This is non-blocking function, which returns + * right away. When the message has been received, the receive callback function is called. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param pMbXfer FlexCAN Message Buffer transfer structure. See the #flexcan_mb_transfer_t. + * retval kStatus_Success - Start Rx Message Buffer receiving process successfully. + * retval kStatus_FLEXCAN_RxBusy - Rx Message Buffer is in use. + */ +status_t FLEXCAN_TransferReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer) +{ + status_t status; + + /* Assertion. */ + assert(NULL != handle); + assert(NULL != pMbXfer); + assert(pMbXfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, pMbXfer->mbIdx)); +#endif + + /* Check if Message Buffer is idle. */ + if ((uint8_t)kFLEXCAN_StateIdle == handle->mbState[pMbXfer->mbIdx]) + { + handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateRxData; + + /* Register Message Buffer. */ + handle->mbFrameBuf[pMbXfer->mbIdx] = pMbXfer->frame; + + /* Enable Message Buffer Interrupt. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (pMbXfer->mbIdx >= 64U) + { + FLEXCAN_EnableHigh64MbInterrupts(base, (uint64_t)1U << (pMbXfer->mbIdx - 64U)); + } + else + { + FLEXCAN_EnableMbInterrupts(base, (uint64_t)1U << pMbXfer->mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_EnableMbInterrupts(base, (uint64_t)1U << pMbXfer->mbIdx); +#else + FLEXCAN_EnableMbInterrupts(base, (uint32_t)1U << pMbXfer->mbIdx); +#endif + + status = kStatus_Success; + } + else + { + status = kStatus_FLEXCAN_RxBusy; + } + + return status; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Sends a message using IRQ. + * + * This function sends a message using IRQ. This is a non-blocking function, which returns + * right away. When messages have been sent out, the send callback function is called. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param pMbXfer FlexCAN FD Message Buffer transfer structure. See the #flexcan_mb_transfer_t. + * retval kStatus_Success Start Tx Message Buffer sending process successfully. + * retval kStatus_Fail Write Tx Message Buffer failed. + * retval kStatus_FLEXCAN_TxBusy Tx Message Buffer is in use. + */ +status_t FLEXCAN_TransferFDSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer) +{ + /* Assertion. */ + assert(NULL != handle); + assert(NULL != pMbXfer); + assert(pMbXfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, pMbXfer->mbIdx)); +#endif + + status_t status; + + /* Check if Message Buffer is idle. */ + if ((uint8_t)kFLEXCAN_StateIdle == handle->mbState[pMbXfer->mbIdx]) + { + /* Distinguish transmit type. */ + if ((uint32_t)kFLEXCAN_FrameTypeRemote == pMbXfer->framefd->type) + { + handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateTxRemote; + } + else + { + handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateTxData; + } + + if (kStatus_Success == + FLEXCAN_WriteFDTxMb(base, pMbXfer->mbIdx, (const flexcan_fd_frame_t *)(uintptr_t)pMbXfer->framefd)) + { + /* Enable Message Buffer Interrupt. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (pMbXfer->mbIdx >= 64U) + { + FLEXCAN_EnableHigh64MbInterrupts(base, (uint64_t)1U << (pMbXfer->mbIdx - 64U)); + } + else + { + FLEXCAN_EnableMbInterrupts(base, (uint64_t)1U << pMbXfer->mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_EnableMbInterrupts(base, (uint64_t)1U << pMbXfer->mbIdx); +#else + FLEXCAN_EnableMbInterrupts(base, (uint32_t)1U << pMbXfer->mbIdx); +#endif + + status = kStatus_Success; + } + else + { + handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateIdle; + status = kStatus_Fail; + } + } + else + { + status = kStatus_FLEXCAN_TxBusy; + } + + return status; +} + +/*! + * brief Receives a message using IRQ. + * + * This function receives a message using IRQ. This is non-blocking function, which returns + * right away. When the message has been received, the receive callback function is called. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param pMbXfer FlexCAN FD Message Buffer transfer structure. See the #flexcan_mb_transfer_t. + * retval kStatus_Success - Start Rx Message Buffer receiving process successfully. + * retval kStatus_FLEXCAN_RxBusy - Rx Message Buffer is in use. + */ +status_t FLEXCAN_TransferFDReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer) +{ + /* Assertion. */ + assert(NULL != handle); + assert(NULL != pMbXfer); + assert(pMbXfer->mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, pMbXfer->mbIdx)); +#endif + + status_t status; + + /* Check if Message Buffer is idle. */ + if ((uint8_t)kFLEXCAN_StateIdle == handle->mbState[pMbXfer->mbIdx]) + { + handle->mbState[pMbXfer->mbIdx] = (uint8_t)kFLEXCAN_StateRxData; + + /* Register Message Buffer. */ + handle->mbFDFrameBuf[pMbXfer->mbIdx] = pMbXfer->framefd; + + /* Enable Message Buffer Interrupt. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (pMbXfer->mbIdx >= 64U) + { + FLEXCAN_EnableHigh64MbInterrupts(base, (uint64_t)1U << (pMbXfer->mbIdx - 64U)); + } + else + { + FLEXCAN_EnableMbInterrupts(base, (uint64_t)1U << pMbXfer->mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_EnableMbInterrupts(base, (uint64_t)1U << pMbXfer->mbIdx); +#else + FLEXCAN_EnableMbInterrupts(base, (uint32_t)1U << pMbXfer->mbIdx); +#endif + + status = kStatus_Success; + } + else + { + status = kStatus_FLEXCAN_RxBusy; + } + + return status; +} +#endif + +/*! + * brief Receives a message from Legacy Rx FIFO using IRQ. + * + * This function receives a message using IRQ. This is a non-blocking function, which returns + * right away. When all messages have been received, the receive callback function is called. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param pFifoXfer FlexCAN Rx FIFO transfer structure. See the ref flexcan_fifo_transfer_t. + * retval kStatus_Success - Start Rx FIFO receiving process successfully. + * retval kStatus_FLEXCAN_RxFifoBusy - Rx FIFO is currently in use. + */ +status_t FLEXCAN_TransferReceiveFifoNonBlocking(CAN_Type *base, + flexcan_handle_t *handle, + flexcan_fifo_transfer_t *pFifoXfer) +{ + /* Assertion. */ + assert(NULL != handle); + assert(NULL != pFifoXfer); + + status_t status; + uint32_t irqMask = (uint32_t)kFLEXCAN_RxFifoOverflowFlag | (uint32_t)kFLEXCAN_RxFifoWarningFlag; + + /* Check if Message Buffer is idle. */ + if ((uint8_t)kFLEXCAN_StateIdle == handle->rxFifoState) + { + handle->rxFifoState = (uint8_t)kFLEXCAN_StateRxFifo; + + /* Register Message Buffer. */ + handle->rxFifoFrameBuf = pFifoXfer->frame; + handle->rxFifoFrameNum = pFifoXfer->frameNum; + handle->rxFifoTransferTotalNum = pFifoXfer->frameNum; + + if (handle->rxFifoTransferTotalNum < 5U) + { + /* Enable data available interrupt. */ + irqMask |= (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag; + } + + /* Enable Message Buffer Interrupt. */ + FLEXCAN_EnableMbInterrupts(base, irqMask); + + status = kStatus_Success; + } + else + { + status = kStatus_FLEXCAN_RxFifoBusy; + } + + return status; +} + +/*! + * brief Gets the Legacy Rx Fifo transfer status during a interrupt non-blocking receive. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param count Number of CAN messages receive so far by the non-blocking transaction. + * retval kStatus_InvalidArgument count is Invalid. + * retval kStatus_Success Successfully return the count. + */ + +status_t FLEXCAN_TransferGetReceiveFifoCount(CAN_Type *base, flexcan_handle_t *handle, size_t *count) +{ + assert(NULL != handle); + + status_t result = kStatus_Success; + + if (handle->rxFifoState == (uint32_t)kFLEXCAN_StateIdle) + { + result = kStatus_NoTransferInProgress; + } + else + { + *count = handle->rxFifoTransferTotalNum - handle->rxFifoFrameNum; + } + + return result; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * brief Receives a message from Enhanced Rx FIFO using IRQ. + * + * This function receives a message using IRQ. This is a non-blocking function, which returns + * right away. When all messages have been received, the receive callback function is called. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param pFifoXfer FlexCAN Rx FIFO transfer structure. See the ref flexcan_fifo_transfer_t. + * retval kStatus_Success - Start Rx FIFO receiving process successfully. + * retval kStatus_FLEXCAN_RxFifoBusy - Rx FIFO is currently in use. + */ +status_t FLEXCAN_TransferReceiveEnhancedFifoNonBlocking(CAN_Type *base, + flexcan_handle_t *handle, + flexcan_fifo_transfer_t *pFifoXfer) +{ + /* Assertion. */ + assert(NULL != handle); + assert(NULL != pFifoXfer); + + status_t status; + uint32_t watermark = ((base->ERFCR & CAN_ERFCR_ERFWM_MASK) >> CAN_ERFCR_ERFWM_SHIFT) + 1U; + uint64_t irqMask = + (uint64_t)kFLEXCAN_ERxFifoUnderflowInterruptEnable | (uint64_t)kFLEXCAN_ERxFifoOverflowInterruptEnable; + + /* Check if Enhanced Rx FIFO is idle. */ + if ((uint8_t)kFLEXCAN_StateIdle == handle->rxFifoState) + { + handle->rxFifoState = (uint8_t)kFLEXCAN_StateRxFifo; + + /* Register Message Buffer. */ + handle->rxFifoFDFrameBuf = pFifoXfer->framefd; + handle->rxFifoFrameNum = pFifoXfer->frameNum; + handle->rxFifoTransferTotalNum = pFifoXfer->frameNum; + + if (handle->rxFifoTransferTotalNum >= watermark) + { + /* Enable watermark interrupt. */ + irqMask |= (uint64_t)kFLEXCAN_ERxFifoWatermarkInterruptEnable; + } + else + { + /* Enable data available interrupt. */ + irqMask |= (uint64_t)kFLEXCAN_ERxFifoDataAvlInterruptEnable; + } + /* Enable Enhanced Rx FIFO Interrupt. */ + FLEXCAN_EnableInterrupts(base, irqMask); + + status = kStatus_Success; + } + else + { + status = kStatus_FLEXCAN_RxFifoBusy; + } + + return status; +} +#endif + +/*! + * brief Aborts the interrupt driven message send process. + * + * This function aborts the interrupt driven message send process. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param mbIdx The FlexCAN Message Buffer index. + */ +void FLEXCAN_TransferAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx) +{ + uint16_t timestamp; + + /* Assertion. */ + assert(NULL != handle); + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + /* Disable Message Buffer Interrupt. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (mbIdx >= 64U) + { + FLEXCAN_DisableHigh64MbInterrupts(base, (uint64_t)1U << (mbIdx - 64U)); + } + else + { + FLEXCAN_DisableMbInterrupts(base, (uint64_t)1U << mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_DisableMbInterrupts(base, (uint64_t)1U << mbIdx); +#else + FLEXCAN_DisableMbInterrupts(base, (uint32_t)1U << mbIdx); +#endif + + /* Update the TX frame 's time stamp by MB[mbIdx].cs. */ + timestamp = (uint16_t)((base->MB[mbIdx].CS & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); + handle->timestamp[mbIdx] = timestamp; + + /* Clean Message Buffer. */ + FLEXCAN_SetTxMbConfig(base, mbIdx, true); + + handle->mbState[mbIdx] = (uint8_t)kFLEXCAN_StateIdle; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * brief Aborts the interrupt driven message send process. + * + * This function aborts the interrupt driven message send process. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param mbIdx The FlexCAN FD Message Buffer index. + */ +void FLEXCAN_TransferFDAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx) +{ + volatile uint32_t *mbAddr; + uint32_t offset; + uint16_t timestamp; + + /* Assertion. */ + assert(NULL != handle); + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + /* Disable Message Buffer Interrupt. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (mbIdx >= 64U) + { + FLEXCAN_DisableHigh64MbInterrupts(base, (uint64_t)1U << (mbIdx - 64U)); + } + else + { + FLEXCAN_DisableMbInterrupts(base, (uint64_t)1U << mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_DisableMbInterrupts(base, (uint64_t)1U << mbIdx); +#else + FLEXCAN_DisableMbInterrupts(base, (uint32_t)1U << mbIdx); +#endif + + /* Update the TX frame 's time stamp by base->MB[offset for CAN FD].CS. */ + mbAddr = &(base->MB[0].CS); + offset = FLEXCAN_GetFDMailboxOffset(base, mbIdx); + timestamp = (uint16_t)((mbAddr[offset] & CAN_CS_TIME_STAMP_MASK) >> CAN_CS_TIME_STAMP_SHIFT); + handle->timestamp[mbIdx] = timestamp; + + /* Clean Message Buffer. */ + FLEXCAN_SetFDTxMbConfig(base, mbIdx, true); + + handle->mbState[mbIdx] = (uint8_t)kFLEXCAN_StateIdle; +} + +/*! + * brief Aborts the interrupt driven message receive process. + * + * This function aborts the interrupt driven message receive process. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param mbIdx The FlexCAN FD Message Buffer index. + */ +void FLEXCAN_TransferFDAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx) +{ + /* Assertion. */ + assert(NULL != handle); + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + /* Disable Message Buffer Interrupt. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (mbIdx >= 64U) + { + FLEXCAN_DisableHigh64MbInterrupts(base, (uint64_t)1U << (mbIdx - 64U)); + } + else + { + FLEXCAN_DisableMbInterrupts(base, (uint64_t)1U << mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_DisableMbInterrupts(base, (uint64_t)1U << mbIdx); +#else + FLEXCAN_DisableMbInterrupts(base, (uint32_t)1U << mbIdx); +#endif + + /* Un-register handle. */ + handle->mbFDFrameBuf[mbIdx] = NULL; + handle->mbState[mbIdx] = (uint8_t)kFLEXCAN_StateIdle; +} +#endif + +/*! + * brief Aborts the interrupt driven message receive process. + * + * This function aborts the interrupt driven message receive process. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param mbIdx The FlexCAN Message Buffer index. + */ +void FLEXCAN_TransferAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx) +{ + /* Assertion. */ + assert(NULL != handle); + assert(mbIdx <= (base->MCR & CAN_MCR_MAXMB_MASK)); +#if !defined(NDEBUG) + assert(!FLEXCAN_IsMbOccupied(base, mbIdx)); +#endif + + /* Disable Message Buffer Interrupt. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (mbIdx >= 64U) + { + FLEXCAN_DisableHigh64MbInterrupts(base, (uint64_t)1U << (mbIdx - 64U)); + } + else + { + FLEXCAN_DisableMbInterrupts(base, (uint64_t)1U << mbIdx); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_DisableMbInterrupts(base, (uint64_t)1U << mbIdx); +#else + FLEXCAN_DisableMbInterrupts(base, (uint32_t)1U << mbIdx); +#endif + + /* Un-register handle. */ + handle->mbFrameBuf[mbIdx] = NULL; + handle->mbState[mbIdx] = (uint8_t)kFLEXCAN_StateIdle; +} + +/*! + * brief Aborts the interrupt driven message receive from Legacy Rx FIFO process. + * + * This function aborts the interrupt driven message receive from Legacy Rx FIFO process. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + */ +void FLEXCAN_TransferAbortReceiveFifo(CAN_Type *base, flexcan_handle_t *handle) +{ + /* Assertion. */ + assert(NULL != handle); + + /* Check if Rx FIFO is enabled. */ + if (0U != (base->MCR & CAN_MCR_RFEN_MASK)) + { + /* Disable Rx Message FIFO Interrupts. */ + FLEXCAN_DisableMbInterrupts(base, (uint32_t)kFLEXCAN_RxFifoOverflowFlag | (uint32_t)kFLEXCAN_RxFifoWarningFlag | + (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag); + + /* Un-register handle. */ + handle->rxFifoFrameBuf = NULL; + /* Clear transfer count. */ + handle->rxFifoFrameNum = 0U; + handle->rxFifoTransferTotalNum = 0U; + } + + handle->rxFifoState = (uint8_t)kFLEXCAN_StateIdle; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * brief Aborts the interrupt driven message receive from Enhanced Rx FIFO process. + * + * This function aborts the interrupt driven message receive from Rx FIFO process. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + */ +void FLEXCAN_TransferAbortReceiveEnhancedFifo(CAN_Type *base, flexcan_handle_t *handle) +{ + /* Assertion. */ + assert(NULL != handle); + + /* Check if Enhanced Rx FIFO is enabled. */ + if (0U != (base->ERFCR & CAN_ERFCR_ERFEN_MASK)) + { + /* Disable all Rx Message FIFO interrupts. */ + FLEXCAN_DisableInterrupts(base, (uint64_t)kFLEXCAN_ERxFifoUnderflowInterruptEnable | + (uint64_t)kFLEXCAN_ERxFifoOverflowInterruptEnable | + (uint64_t)kFLEXCAN_ERxFifoWatermarkInterruptEnable | + (uint64_t)kFLEXCAN_ERxFifoDataAvlInterruptEnable); + + /* Un-register handle. */ + handle->rxFifoFDFrameBuf = NULL; + /* Clear transfer count. */ + handle->rxFifoFrameNum = 0U; + handle->rxFifoTransferTotalNum = 0U; + } + + handle->rxFifoState = (uint8_t)kFLEXCAN_StateIdle; +} +#endif + +/*! + * brief Gets the detail index of Mailbox's Timestamp by handle. + * + * Then function can only be used when calling non-blocking Data transfer (TX/RX) API, + * After TX/RX data transfer done (User can get the status by handler's callback function), + * we can get the detail index of Mailbox's timestamp by handle, + * Detail non-blocking data transfer API (TX/RX) contain. + * -FLEXCAN_TransferSendNonBlocking + * -FLEXCAN_TransferFDSendNonBlocking + * -FLEXCAN_TransferReceiveNonBlocking + * -FLEXCAN_TransferFDReceiveNonBlocking + * -FLEXCAN_TransferReceiveFifoNonBlocking + * + * param handle FlexCAN handle pointer. + * param mbIdx The FlexCAN FD Message Buffer index. + * return the index of mailbox 's timestamp stored in the handle. + * + */ +uint32_t FLEXCAN_GetTimeStamp(flexcan_handle_t *handle, uint8_t mbIdx) +{ + /* Assertion. */ + assert(NULL != handle); + + return (uint32_t)(handle->timestamp[mbIdx]); +} + +/*! + * brief Check unhandle interrupt events + * + * param base FlexCAN peripheral base address. + * return TRUE if unhandled interrupt action exist, FALSE if no unhandlered interrupt action exist. + */ +static bool FLEXCAN_CheckUnhandleInterruptEvents(CAN_Type *base) +{ + uint64_t tempmask; + uint64_t tempflag; + bool fgRet = false; + + if (0U == (FLEXCAN_GetStatusFlags(base) & + (FLEXCAN_ERROR_AND_STATUS_INIT_FLAG | FLEXCAN_WAKE_UP_FLAG | FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_FLAG))) + { + /* If no error, wake_up or enhanced RX FIFO status, Checking whether exist MB interrupt status and legacy RX + * FIFO interrupt status */ + tempmask = (uint64_t)base->IMASK1; + tempflag = (uint64_t)base->IFLAG1; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + tempmask |= ((uint64_t)base->IMASK2) << 32; + tempflag |= ((uint64_t)base->IFLAG2) << 32; +#endif + fgRet = (0U != (tempmask & tempflag)); +#if defined(CAN_IMASK3_BUF95TO64M_MASK) + if (0U != (base->IMASK3 & base->IFLAG3)) + { + fgRet = true; + } +#endif +#if defined(CAN_IMASK4_BUF127TO96M_MASK) + if (0U != (base->IMASK4 & base->IFLAG4)) + { + fgRet = true; + } +#endif + } +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + else if (0U != (FLEXCAN_GetStatusFlags(base) & FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_FLAG)) + { + /* Checking whether exist enhanced RX FIFO interrupt status. */ + tempmask = (uint64_t)base->ERFIER; + tempflag = (uint64_t)base->ERFSR; + fgRet = (0U != (tempmask & tempflag)); + } +#endif + else + { + /* Exist error or wake up flag. */ + fgRet = true; + } + + return fgRet; +} + +/*! + * brief Sub Handler Legacy Rx FIFO Trasfered Events + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param result The MB flag number. + * + * return the status after handle transfered event. + */ +static status_t FLEXCAN_SubHandlerForLegacyRxFIFO(CAN_Type *base, flexcan_handle_t *handle, uint32_t result) +{ + uint32_t u32mask = 1; + status_t status = kStatus_FLEXCAN_UnHandled; + + switch (u32mask << result) + { + case kFLEXCAN_RxFifoOverflowFlag: + status = kStatus_FLEXCAN_RxFifoOverflow; + break; + + case kFLEXCAN_RxFifoWarningFlag: + if ((handle->rxFifoFrameNum > 5U) && (0U != (base->IFLAG1 & (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag))) + { + for (uint32_t i = 0; i < 5UL; i++) + { + status = FLEXCAN_ReadRxFifo(base, handle->rxFifoFrameBuf); + /* + * $Branch Coverage Justification$ + * (kStatus_Success != status) not covered. $ref flexcan_c_ref_1$. + */ + if (kStatus_Success == status) + { + /* Align the current rxfifo timestamp to the timestamp array by handle. */ + handle->timestamp[i] = handle->rxFifoFrameBuf->timestamp; + handle->rxFifoFrameBuf++; + handle->rxFifoFrameNum--; + /* Clean Rx Fifo available flag to discard the frame that has been read. */ + FLEXCAN_ClearMbStatusFlags(base, (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag); + } + else + { + /* + * $Line Coverage Justification$ + * $ref flexcan_c_ref_1$. + */ + return kStatus_FLEXCAN_RxFifoDisabled; + } + } + if (handle->rxFifoFrameNum < 5UL) + { + /* Enable data avaliable interrupt. */ + FLEXCAN_EnableMbInterrupts(base, (uint32_t)kFLEXCAN_RxFifoFrameAvlFlag); + } + status = kStatus_FLEXCAN_RxFifoBusy; + } + else + { + /* Should enter case kFLEXCAN_RxFifoFrameAvlFlag but not, means previous transfer may have + * overflow*/ + status = kStatus_FLEXCAN_RxFifoWarning; + } + break; + + case kFLEXCAN_RxFifoFrameAvlFlag: + /* Whether still has CAN messages remaining to be received. */ + if (handle->rxFifoFrameNum > 0U) + { + status = FLEXCAN_ReadRxFifo(base, handle->rxFifoFrameBuf); + /* + * $Branch Coverage Justification$ + * (kStatus_Success != status) not covered. $ref flexcan_c_ref_1$. + */ + if (kStatus_Success == status) + { + /* Align the current (index 0) rxfifo timestamp to the timestamp array by handle. */ + handle->timestamp[0] = handle->rxFifoFrameBuf->timestamp; + handle->rxFifoFrameBuf++; + handle->rxFifoFrameNum--; + } + else + { + /* + * $Line Coverage Justification$ + * $ref flexcan_c_ref_1$. + */ + return kStatus_FLEXCAN_RxFifoDisabled; + } + } + if (handle->rxFifoFrameNum == 0U) + { + /* Stop receiving Ehanced Rx FIFO when the transmission is over. */ + FLEXCAN_TransferAbortReceiveFifo(base, handle); + status = kStatus_FLEXCAN_RxFifoIdle; + } + else + { + /* Continue use data avaliable interrupt. */ + status = kStatus_FLEXCAN_RxFifoBusy; + } + break; + + default: + status = kStatus_FLEXCAN_UnHandled; + break; + } + + return status; +} + +/*! + * brief Sub Handler Message Buffer Trasfered Events + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param result The MB flag number. + * + * return the status after handle transfered event. + */ +static status_t FLEXCAN_SubHandlerForMB(CAN_Type *base, flexcan_handle_t *handle, uint32_t result) +{ + status_t status = kStatus_FLEXCAN_UnHandled; + + /* Get current State of Message Buffer. */ + switch (handle->mbState[result]) + { + /* Solve Rx Data Frame. */ + case (uint8_t)kFLEXCAN_StateRxData: +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0U != (base->MCR & CAN_MCR_FDEN_MASK)) + { + status = FLEXCAN_ReadFDRxMb(base, (uint8_t)result, handle->mbFDFrameBuf[result]); + if ((kStatus_Success == status) || (kStatus_FLEXCAN_RxOverflow == status)) + { + /* Align the current index of RX MB timestamp to the timestamp array by handle. */ + handle->timestamp[result] = handle->mbFDFrameBuf[result]->timestamp; + + if (kStatus_Success == status) + { + status = kStatus_FLEXCAN_RxIdle; + } + } + } + else +#endif + { + status = FLEXCAN_ReadRxMb(base, (uint8_t)result, handle->mbFrameBuf[result]); + if ((kStatus_Success == status) || (kStatus_FLEXCAN_RxOverflow == status)) + { + /* Align the current index of RX MB timestamp to the timestamp array by handle. */ + handle->timestamp[result] = handle->mbFrameBuf[result]->timestamp; + + if (kStatus_Success == status) + { + status = kStatus_FLEXCAN_RxIdle; + } + } + } +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0U != (base->MCR & CAN_MCR_FDEN_MASK)) + { + FLEXCAN_TransferFDAbortReceive(base, handle, (uint8_t)result); + } + else +#endif + { + FLEXCAN_TransferAbortReceive(base, handle, (uint8_t)result); + } + break; + + /* Sove Rx Remote Frame. User need to Read the frame in Mail box in time by Read from MB API. */ + case (uint8_t)kFLEXCAN_StateRxRemote: + status = kStatus_FLEXCAN_RxRemote; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0U != (base->MCR & CAN_MCR_FDEN_MASK)) + { + FLEXCAN_TransferFDAbortReceive(base, handle, (uint8_t)result); + } + else +#endif + { + FLEXCAN_TransferAbortReceive(base, handle, (uint8_t)result); + } + break; + + /* Solve Tx Data Frame. */ + case (uint8_t)kFLEXCAN_StateTxData: + status = kStatus_FLEXCAN_TxIdle; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0U != (base->MCR & CAN_MCR_FDEN_MASK)) + { + FLEXCAN_TransferFDAbortSend(base, handle, (uint8_t)result); + } + else +#endif + { + FLEXCAN_TransferAbortSend(base, handle, (uint8_t)result); + } + break; + + /* Solve Tx Remote Frame. */ + case (uint8_t)kFLEXCAN_StateTxRemote: + handle->mbState[result] = (uint8_t)kFLEXCAN_StateRxRemote; + status = kStatus_FLEXCAN_TxSwitchToRx; + break; + + default: + status = kStatus_FLEXCAN_UnHandled; + break; + } + + return status; +} + +/*! + * brief Sub Handler Data Trasfered Events + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param pResult Pointer to the Handle result. + * + * return the status after handle each data transfered event. + */ +static status_t FLEXCAN_SubHandlerForDataTransfered(CAN_Type *base, flexcan_handle_t *handle, uint32_t *pResult) +{ + status_t status = kStatus_FLEXCAN_UnHandled; + uint32_t result = 0xFFU; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + uint32_t intflag[4] = {(base->IMASK1 & base->IFLAG1), (base->IMASK2 & base->IFLAG2), 0U, 0U}; +#if defined(CAN_IMASK3_BUF95TO64M_MASK) + intflag[2] = base->IMASK3 & base->IFLAG3; +#endif +#if defined(CAN_IMASK4_BUF127TO96M_MASK) + intflag[3] = base->IMASK4 & base->IFLAG4; +#endif +#else + uint32_t intflag = base->IMASK1 & base->IFLAG1; +#endif + + /* For this implementation, we solve the Message with lowest MB index first. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + for (uint32_t i = 0U; i < 4U; i++) + { + if (intflag[i] != 0U) + { + for (uint32_t j = 0U; j < 32U; j++) + { + if (0UL != (intflag[i] & ((uint32_t)1UL << j))) + { + result = i * 32U + j; + break; + } + } + break; + } + } +#else + for (result = 0U; result < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base); result++) + { + if (0UL != (intflag & ((uint32_t)1UL << result))) + { + break; + } + } +#endif + + /* find Message to deal with. */ + if (result < (uint32_t)FSL_FEATURE_FLEXCAN_HAS_MESSAGE_BUFFER_MAX_NUMBERn(base)) + { + /* Solve Legacy Rx FIFO interrupt. */ + if (((uint8_t)kFLEXCAN_StateIdle != handle->rxFifoState) && (result <= (uint32_t)CAN_IFLAG1_BUF7I_SHIFT) && + ((base->MCR & CAN_MCR_RFEN_MASK) != 0U)) + { + status = FLEXCAN_SubHandlerForLegacyRxFIFO(base, handle, result); + /* + * $Branch Coverage Justification$ + * (status == kStatus_FLEXCAN_RxFifoDisabled) not covered. $ref flexcan_c_ref_1$. + */ + if (status == kStatus_FLEXCAN_RxFifoDisabled) + { + /* + * $Line Coverage Justification$ + * $ref flexcan_c_ref_1$. + */ + return status; + } + } + else + { + status = FLEXCAN_SubHandlerForMB(base, handle, result); + } + + /* Clear resolved Message Buffer IRQ. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) + if (result >= 64U) + { + FLEXCAN_ClearHigh64MbStatusFlags(base, (uint64_t)1U << (result - 64U)); + } + else + { + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << result); + } +#elif (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + FLEXCAN_ClearMbStatusFlags(base, (uint64_t)1U << result); +#else + FLEXCAN_ClearMbStatusFlags(base, (uint32_t)1U << result); +#endif + } + + *pResult = result; + + return status; +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * brief Sub Handler Ehanced Rx FIFO event + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param flags FlexCAN interrupt flags. + * + * return the status after handle Ehanced Rx FIFO event. + */ +static status_t FLEXCAN_SubHandlerForEhancedRxFifo(CAN_Type *base, flexcan_handle_t *handle, uint64_t flags) +{ + uint32_t watermark = ((base->ERFCR & CAN_ERFCR_ERFWM_MASK) >> CAN_ERFCR_ERFWM_SHIFT) + 1U; + uint32_t transferFrames; + + status_t status; + /* Solve Ehanced Rx FIFO interrupt. */ + if ((0u != (flags & (uint64_t)kFLEXCAN_ERxFifoUnderflowIntFlag)) && + (0u != (base->ERFIER & CAN_ERFIER_ERFUFWIE_MASK))) + { + status = kStatus_FLEXCAN_RxFifoUnderflow; + FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_ERxFifoUnderflowIntFlag); + } + else if ((0u != (flags & (uint64_t)kFLEXCAN_ERxFifoOverflowIntFlag)) && + (0u != (base->ERFIER & CAN_ERFIER_ERFOVFIE_MASK))) + { + status = kStatus_FLEXCAN_RxFifoOverflow; + FLEXCAN_ClearStatusFlags(base, (uint64_t)kFLEXCAN_ERxFifoOverflowIntFlag); + } + else if ((0u != (flags & (uint64_t)kFLEXCAN_ERxFifoWatermarkIntFlag)) && + (0u != (base->ERFIER & CAN_ERFIER_ERFWMIIE_MASK))) + { + /* Whether the number of CAN messages remaining to be received is greater than the watermark. */ + transferFrames = (handle->rxFifoFrameNum > watermark) ? watermark : handle->rxFifoFrameNum; + + for (uint32_t i = 0; i < transferFrames; i++) + { + status = FLEXCAN_ReadEnhancedRxFifo(base, handle->rxFifoFDFrameBuf); + + if (kStatus_Success == status) + { + handle->rxFifoFDFrameBuf++; + handle->rxFifoFrameNum--; + /* Clear data Watermark flag due to has read back one frame. */ + base->ERFSR = CAN_ERFSR_ERFWMI_MASK; + } + else + { + return kStatus_FLEXCAN_RxFifoDisabled; + } + } + if (handle->rxFifoFrameNum == 0U) + { + /* Stop receiving Ehanced Rx FIFO when the transmission is over. */ + FLEXCAN_TransferAbortReceiveEnhancedFifo(base, handle); + status = kStatus_FLEXCAN_RxFifoIdle; + } + else if (handle->rxFifoFrameNum < watermark) + { + /* Disable watermark interrupt and enable data avaliable interrupt. */ + FLEXCAN_DisableInterrupts(base, (uint64_t)kFLEXCAN_ERxFifoWatermarkInterruptEnable); + FLEXCAN_EnableInterrupts(base, (uint64_t)kFLEXCAN_ERxFifoDataAvlInterruptEnable); + status = kStatus_FLEXCAN_RxFifoBusy; + } + else + { + /* Continue use watermark interrupt. */ + status = kStatus_FLEXCAN_RxFifoBusy; + } + } + else + { + /* Data available status, check Whether still has CAN messages remaining to be received. */ + if (handle->rxFifoFrameNum > 0U) + { + status = FLEXCAN_ReadEnhancedRxFifo(base, handle->rxFifoFDFrameBuf); + + if (kStatus_Success == status) + { + handle->rxFifoFDFrameBuf++; + handle->rxFifoFrameNum--; + } + else + { + return kStatus_FLEXCAN_RxFifoDisabled; + } + } + if (handle->rxFifoFrameNum == 0U) + { + /* Stop receiving Ehanced Rx FIFO when the transmission is over. */ + FLEXCAN_TransferAbortReceiveEnhancedFifo(base, handle); + status = kStatus_FLEXCAN_RxFifoIdle; + } + else + { + /* Continue use data avaliable interrupt. */ + status = kStatus_FLEXCAN_RxFifoBusy; + } + } + return status; +} +#endif + +/*! + * brief FlexCAN IRQ handle function. + * + * This function handles the FlexCAN Error, the Message Buffer, and the Rx FIFO IRQ request. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + */ +void FLEXCAN_TransferHandleIRQ(CAN_Type *base, flexcan_handle_t *handle) +{ + /* Assertion. */ + assert(NULL != handle); + + status_t status; + uint32_t mbNum = 0xFFU; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + uint64_t result = 0U; +#else + uint32_t result = 0U; +#endif + do + { + /* Get Current FlexCAN Module Error and Status. */ + result = FLEXCAN_GetStatusFlags(base); + + /* To handle FlexCAN Error and Status Interrupt first. */ + if (0U != (result & FLEXCAN_ERROR_AND_STATUS_INIT_FLAG)) + { + status = kStatus_FLEXCAN_ErrorStatus; + /* Clear FlexCAN Error and Status Interrupt. */ + FLEXCAN_ClearStatusFlags(base, FLEXCAN_ERROR_AND_STATUS_INIT_FLAG); + } + else if (0U != (result & FLEXCAN_WAKE_UP_FLAG)) + { + status = kStatus_FLEXCAN_WakeUp; + FLEXCAN_ClearStatusFlags(base, FLEXCAN_WAKE_UP_FLAG); + } +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + else if (0U != (FLEXCAN_EFIFO_STATUS_UNMASK(result & FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_FLAG) & base->ERFIER)) + { + status = FLEXCAN_SubHandlerForEhancedRxFifo(base, handle, result); + } +#endif + else + { + /* To handle Message Buffer or Legacy Rx FIFO transfer. */ + status = FLEXCAN_SubHandlerForDataTransfered(base, handle, &mbNum); + result = mbNum; + } + + /* Calling Callback Function if has one. */ + if (handle->callback != NULL) + { + handle->callback(base, handle, status, result, handle->userData); + } + } while (FLEXCAN_CheckUnhandleInterruptEvents(base)); +} + +#if defined(CAN0) +void CAN0_DriverIRQHandler(void); +void CAN0_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[0]); + + s_flexcanIsr(CAN0, s_flexcanHandle[0]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CAN1) +void CAN1_DriverIRQHandler(void); +void CAN1_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[1]); + + s_flexcanIsr(CAN1, s_flexcanHandle[1]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CAN2) +void CAN2_DriverIRQHandler(void); +void CAN2_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[2]); + + s_flexcanIsr(CAN2, s_flexcanHandle[2]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CAN3) +void CAN3_DriverIRQHandler(void); +void CAN3_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[3]); + + s_flexcanIsr(CAN3, s_flexcanHandle[3]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CAN4) +void CAN4_DriverIRQHandler(void); +void CAN4_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[4]); + + s_flexcanIsr(CAN4, s_flexcanHandle[4]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(DMA__CAN0) +void DMA_FLEXCAN0_INT_DriverIRQHandler(void); +void DMA_FLEXCAN0_INT_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN0)]); + + s_flexcanIsr(DMA__CAN0, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN0)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(DMA__CAN1) +void DMA_FLEXCAN1_INT_DriverIRQHandler(void); +void DMA_FLEXCAN1_INT_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN1)]); + + s_flexcanIsr(DMA__CAN1, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN1)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(DMA__CAN2) +void DMA_FLEXCAN2_INT_DriverIRQHandler(void); +void DMA_FLEXCAN2_INT_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN2)]); + + s_flexcanIsr(DMA__CAN2, s_flexcanHandle[FLEXCAN_GetInstance(DMA__CAN2)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(ADMA__CAN0) +void ADMA_FLEXCAN0_INT_DriverIRQHandler(void); +void ADMA_FLEXCAN0_INT_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN0)]); + + s_flexcanIsr(ADMA__CAN0, s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN0)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(ADMA__CAN1) +void ADMA_FLEXCAN1_INT_DriverIRQHandler(void); +void ADMA_FLEXCAN1_INT_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN1)]); + + s_flexcanIsr(ADMA__CAN1, s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN1)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(ADMA__CAN2) +void ADMA_FLEXCAN2_INT_DriverIRQHandler(void); +void ADMA_FLEXCAN2_INT_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN2)]); + + s_flexcanIsr(ADMA__CAN2, s_flexcanHandle[FLEXCAN_GetInstance(ADMA__CAN2)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(FLEXCAN1) +void CAN_FD1_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[1]); + + s_flexcanIsr(FLEXCAN1, s_flexcanHandle[1]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(FLEXCAN2) +void CAN_FD2_DriverIRQHandler(void) +{ + assert(NULL != s_flexcanHandle[2]); + + s_flexcanIsr(FLEXCAN2, s_flexcanHandle[2]); + SDK_ISR_EXIT_BARRIER; +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan.h new file mode 100644 index 00000000000..9170938afe5 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan.h @@ -0,0 +1,2360 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_FLEXCAN_H_ +#define FSL_FLEXCAN_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup flexcan_driver + * @{ + */ + +/****************************************************************************** + * Definitions + *****************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FlexCAN driver version. */ +#define FSL_FLEXCAN_DRIVER_VERSION (MAKE_VERSION(2, 11, 6)) +/*! @} */ + +#if !(defined(FLEXCAN_WAIT_TIMEOUT) && FLEXCAN_WAIT_TIMEOUT) +/* Define to 1000 means keep waiting 1000 times until the flag is assert/deassert. */ +#define FLEXCAN_WAIT_TIMEOUT (1000U) +#endif + +/*! @brief FlexCAN frame length helper macro. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +#define DLC_LENGTH_DECODE(dlc) (((dlc) <= 8U) ? (dlc) : (((dlc) <= 12U) ? (((dlc)-6U) * 4U) : (((dlc)-11U) * 16U))) +#endif + +/*! @brief FlexCAN Frame ID helper macro. */ +#define FLEXCAN_ID_STD(id) \ + (((uint32_t)(((uint32_t)(id)) << CAN_ID_STD_SHIFT)) & CAN_ID_STD_MASK) /*!< Standard Frame ID helper macro. */ +#define FLEXCAN_ID_EXT(id) \ + (((uint32_t)(((uint32_t)(id)) << CAN_ID_EXT_SHIFT)) & \ + (CAN_ID_EXT_MASK | CAN_ID_STD_MASK)) /*!< Extend Frame ID helper macro. */ + +/*! @brief FlexCAN Rx Message Buffer Mask helper macro. */ +#define FLEXCAN_RX_MB_STD_MASK(id, rtr, ide) \ + (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ + FLEXCAN_ID_STD(id)) /*!< Standard Rx Message Buffer Mask helper macro. */ +#define FLEXCAN_RX_MB_EXT_MASK(id, rtr, ide) \ + (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ + FLEXCAN_ID_EXT(id)) /*!< Extend Rx Message Buffer Mask helper macro. */ + +/*! @brief FlexCAN Legacy Rx FIFO Mask helper macro. */ +#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_A(id, rtr, ide) \ + (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ + (FLEXCAN_ID_STD(id) << 1)) /*!< Standard Rx FIFO Mask helper macro Type A helper macro. */ +#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_HIGH(id, rtr, ide) \ + (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ + (((uint32_t)(id)&0x7FF) << 19)) /*!< Standard Rx FIFO Mask helper macro Type B upper part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_LOW(id, rtr, ide) \ + (((uint32_t)((uint32_t)(rtr) << 15) | (uint32_t)((uint32_t)(ide) << 14)) | \ + (((uint32_t)(id)&0x7FF) << 3)) /*!< Standard Rx FIFO Mask helper macro Type B lower part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_HIGH(id) \ + (((uint32_t)(id)&0x7F8) << 21) /*!< Standard Rx FIFO Mask helper macro Type C upper part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_HIGH(id) \ + (((uint32_t)(id)&0x7F8) << 13) /*!< Standard Rx FIFO Mask helper macro Type C mid-upper part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_LOW(id) \ + (((uint32_t)(id)&0x7F8) << 5) /*!< Standard Rx FIFO Mask helper macro Type C mid-lower part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_LOW(id) \ + (((uint32_t)(id)&0x7F8) >> 3) /*!< Standard Rx FIFO Mask helper macro Type C lower part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_A(id, rtr, ide) \ + (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ + (FLEXCAN_ID_EXT(id) << 1)) /*!< Extend Rx FIFO Mask helper macro Type A helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_HIGH(id, rtr, ide) \ + ( \ + ((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \ + ((FLEXCAN_ID_EXT(id) & 0x1FFF8000) \ + << 1)) /*!< Extend Rx FIFO Mask helper macro Type B upper part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_LOW(id, rtr, ide) \ + (((uint32_t)((uint32_t)(rtr) << 15) | (uint32_t)((uint32_t)(ide) << 14)) | \ + ((FLEXCAN_ID_EXT(id) & 0x1FFF8000) >> \ + 15)) /*!< Extend Rx FIFO Mask helper macro Type B lower part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_HIGH(id) \ + ((FLEXCAN_ID_EXT(id) & 0x1FE00000) << 3) /*!< Extend Rx FIFO Mask helper macro Type C upper part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_HIGH(id) \ + ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> \ + 5) /*!< Extend Rx FIFO Mask helper macro Type C mid-upper part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_LOW(id) \ + ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> \ + 13) /*!< Extend Rx FIFO Mask helper macro Type C mid-lower part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_LOW(id) \ + ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> 21) /*!< Extend Rx FIFO Mask helper macro Type C lower part helper macro. */ + +/*! @brief FlexCAN Rx FIFO Filter helper macro. */ +#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_A(id, rtr, ide) \ + FLEXCAN_RX_FIFO_STD_MASK_TYPE_A(id, rtr, ide) /*!< Standard Rx FIFO Filter helper macro Type A helper macro. */ +#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_B_HIGH(id, rtr, ide) \ + FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_HIGH( \ + id, rtr, ide) /*!< Standard Rx FIFO Filter helper macro Type B upper part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_B_LOW(id, rtr, ide) \ + FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_LOW( \ + id, rtr, ide) /*!< Standard Rx FIFO Filter helper macro Type B lower part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_HIGH(id) \ + FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_HIGH( \ + id) /*!< Standard Rx FIFO Filter helper macro Type C upper part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_MID_HIGH(id) \ + FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_HIGH( \ + id) /*!< Standard Rx FIFO Filter helper macro Type C mid-upper part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_MID_LOW(id) \ + FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_LOW( \ + id) /*!< Standard Rx FIFO Filter helper macro Type C mid-lower part helper macro. */ +#define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_LOW(id) \ + FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_LOW( \ + id) /*!< Standard Rx FIFO Filter helper macro Type C lower part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_A(id, rtr, ide) \ + FLEXCAN_RX_FIFO_EXT_MASK_TYPE_A(id, rtr, ide) /*!< Extend Rx FIFO Filter helper macro Type A helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_B_HIGH(id, rtr, ide) \ + FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_HIGH( \ + id, rtr, ide) /*!< Extend Rx FIFO Filter helper macro Type B upper part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_B_LOW(id, rtr, ide) \ + FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_LOW( \ + id, rtr, ide) /*!< Extend Rx FIFO Filter helper macro Type B lower part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_HIGH(id) \ + FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_HIGH( \ + id) /*!< Extend Rx FIFO Filter helper macro Type C upper part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_MID_HIGH(id) \ + FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_HIGH( \ + id) /*!< Extend Rx FIFO Filter helper macro Type C mid-upper part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_MID_LOW(id) \ + FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_LOW( \ + id) /*!< Extend Rx FIFO Filter helper macro Type C mid-lower part helper macro. */ +#define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_LOW(id) \ + FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_LOW(id) /*!< Extend Rx FIFO Filter helper macro Type C lower part helper macro. */ + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! @brief FlexCAN Enhanced Rx FIFO Filter and Mask helper macro. */ +#define ENHANCED_RX_FIFO_FSCH(x) (((uint32_t)(((uint32_t)(x)) << 30)) & 0xC0000000U) +#define RTR_STD_HIGH(x) (((uint32_t)(((uint32_t)(x)) << 27)) & 0x08000000U) +#define RTR_STD_LOW(x) (((uint32_t)(((uint32_t)(x)) << 11)) & 0x00000800U) +#define RTR_EXT(x) (((uint32_t)(((uint32_t)(x)) << 29)) & 0x40000000U) +#define ID_STD_LOW(id) (((uint32_t)id) & 0x7FFU) +#define ID_STD_HIGH(id) (((uint32_t)(((uint32_t)(id)) << 16)) & 0x07FF0000U) +#define ID_EXT(id) (((uint32_t)id) & 0x1FFFFFFFU) + +/*! Standard ID filter element with filter + mask scheme. */ +#define FLEXCAN_ENHANCED_RX_FIFO_STD_MASK_AND_FILTER(id, rtr, id_mask, rtr_mask) \ + (ENHANCED_RX_FIFO_FSCH(0x0) | RTR_STD_HIGH(rtr) | ID_STD_HIGH(id) | RTR_STD_LOW(rtr_mask) | ID_STD_LOW(id_mask)) +/*! Standard ID filter element with filter range. */ +#define FLEXCAN_ENHANCED_RX_FIFO_STD_FILTER_WITH_RANGE(id_upper, rtr, id_lower, rtr_mask) \ + (ENHANCED_RX_FIFO_FSCH(0x1) | RTR_STD_HIGH(rtr) | ID_STD_HIGH(id_upper) | RTR_STD_LOW(rtr_mask) | \ + ID_STD_LOW(id_lower)) +/*! Standard ID filter element with two filters without masks. */ +#define FLEXCAN_ENHANCED_RX_FIFO_STD_TWO_FILTERS(id1, rtr1, id2, rtr2) \ + (ENHANCED_RX_FIFO_FSCH(0x2) | RTR_STD_HIGH(rtr1) | ID_STD_HIGH(id1) | RTR_STD_LOW(rtr2) | ID_STD_LOW(id2)) +/*! Extended ID filter element with filter + mask scheme low word. */ +#define FLEXCAN_ENHANCED_RX_FIFO_EXT_MASK_AND_FILTER_LOW(id, rtr) \ + (ENHANCED_RX_FIFO_FSCH(0x0) | RTR_EXT(rtr) | ID_EXT(id)) +/*! Extended ID filter element with filter + mask scheme high word. */ +#define FLEXCAN_ENHANCED_RX_FIFO_EXT_MASK_AND_FILTER_HIGH(id_mask, rtr_mask) \ + (ENHANCED_RX_FIFO_FSCH(0x0) | RTR_EXT(rtr_mask) | ID_EXT(id_mask)) +/*! Extended ID filter element with range scheme low word. */ +#define FLEXCAN_ENHANCED_RX_FIFO_EXT_FILTER_WITH_RANGE_LOW(id_upper, rtr) \ + (ENHANCED_RX_FIFO_FSCH(0x1) | RTR_EXT(rtr) | ID_EXT(id_upper)) +/*! Extended ID filter element with range scheme high word. */ +#define FLEXCAN_ENHANCED_RX_FIFO_EXT_FILTER_WITH_RANGE_HIGH(id_lower, rtr_mask) \ + (ENHANCED_RX_FIFO_FSCH(0x1) | RTR_EXT(rtr_mask) | ID_EXT(id_lower)) +/*! Extended ID filter element with two filters without masks low word. */ +#define FLEXCAN_ENHANCED_RX_FIFO_EXT_TWO_FILTERS_LOW(id2, rtr2) \ + (ENHANCED_RX_FIFO_FSCH(0x2) | RTR_EXT(rtr2) | ID_EXT(id2)) +/*! Extended ID filter element with two filters without masks high word. */ +#define FLEXCAN_ENHANCED_RX_FIFO_EXT_TWO_FILTERS_HIGH(id1, rtr1) \ + (ENHANCED_RX_FIFO_FSCH(0x2) | RTR_EXT(rtr1) | ID_EXT(id1)) +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) +/*! @brief FlexCAN Pretended Networking ID Mask helper macro. */ +#define FLEXCAN_PN_STD_MASK(id, rtr) \ + ((uint32_t)((uint32_t)(rtr) << CAN_FLT_ID1_FLT_RTR_SHIFT) | \ + FLEXCAN_ID_STD(id)) /*!< Standard Rx Message Buffer Mask helper macro. */ +#define FLEXCAN_PN_EXT_MASK(id, rtr) \ + ((uint32_t)CAN_FLT_ID1_FLT_IDE_MASK | (uint32_t)((uint32_t)(rtr) << CAN_FLT_ID1_FLT_RTR_SHIFT) | \ + FLEXCAN_ID_EXT(id)) /*!< Extend Rx Message Buffer Mask helper macro. */ +#endif + +/*! @brief FlexCAN interrupt/status flag helper macro. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) +#define FLEXCAN_PN_INT_MASK(x) (((uint64_t)(((uint64_t)(x)) << 32)) & 0x3000000000000U) +#define FLEXCAN_PN_INT_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 32)) & 0x00030000U) +#define FLEXCAN_PN_STATUS_MASK(x) (((uint64_t)(((uint64_t)(x)) << 16)) & 0x300000000U) +#define FLEXCAN_PN_STATUS_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 16)) & 0x00030000U) +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +#define FLEXCAN_EFIFO_INT_MASK(x) (((uint64_t)(((uint64_t)(x)) << 32)) & 0xF000000000000000U) +#define FLEXCAN_EFIFO_INT_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 32)) & 0xF0000000U) +#define FLEXCAN_EFIFO_STATUS_MASK(x) (((uint64_t)(((uint64_t)(x)) << 32)) & 0xF003000000000000U) +#define FLEXCAN_EFIFO_STATUS_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 32)) & 0xF0030000U) +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +#define FLEXCAN_MECR_INT_MASK(x) (((uint64_t)(((uint64_t)(x)) << 16)) & 0xD00000000U) +#define FLEXCAN_MECR_INT_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 16)) & 0x000D0000U) +#define FLEXCAN_MECR_STATUS_MASK(x) (((uint64_t)(((uint64_t)(x)) << 34)) & 0x34003400000000U) +#define FLEXCAN_MECR_STATUS_UNMASK(x) (((uint32_t)(((uint64_t)(x)) >> 34)) & 0x000D000DU) +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +#define FLEXCAN_ERROR_AND_STATUS_INIT_FLAG \ + ((uint32_t)kFLEXCAN_ErrorOverrunFlag | (uint32_t)kFLEXCAN_FDErrorIntFlag | (uint32_t)kFLEXCAN_BusoffDoneIntFlag | \ + (uint32_t)kFLEXCAN_TxWarningIntFlag | (uint32_t)kFLEXCAN_RxWarningIntFlag | (uint32_t)kFLEXCAN_BusOffIntFlag | \ + (uint32_t)kFLEXCAN_ErrorIntFlag | FLEXCAN_MEMORY_ERROR_INIT_FLAG) +#else +#define FLEXCAN_ERROR_AND_STATUS_INIT_FLAG \ + ((uint32_t)kFLEXCAN_TxWarningIntFlag | (uint32_t)kFLEXCAN_RxWarningIntFlag | (uint32_t)kFLEXCAN_BusOffIntFlag | \ + (uint32_t)kFLEXCAN_ErrorIntFlag | FLEXCAN_MEMORY_ERROR_INIT_FLAG) +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) +#define FLEXCAN_WAKE_UP_FLAG \ + ((uint32_t)kFLEXCAN_WakeUpIntFlag | (uint64_t)kFLEXCAN_PNMatchIntFlag | (uint64_t)kFLEXCAN_PNTimeoutIntFlag) +#else +#define FLEXCAN_WAKE_UP_FLAG ((uint32_t)kFLEXCAN_WakeUpIntFlag) +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +#define FLEXCAN_MEMORY_ERROR_INIT_FLAG ((uint64_t)kFLEXCAN_AllMemoryErrorFlag) +#else +#define FLEXCAN_MEMORY_ERROR_INIT_FLAG (0U) +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +#define FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_FLAG \ + ((uint64_t)kFLEXCAN_ERxFifoUnderflowIntFlag | (uint64_t)kFLEXCAN_ERxFifoOverflowIntFlag | \ + (uint64_t)kFLEXCAN_ERxFifoWatermarkIntFlag | (uint64_t)kFLEXCAN_ERxFifoDataAvlIntFlag) +#endif +/*! @brief FlexCAN Enhanced Rx FIFO base address helper macro. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +#define E_RX_FIFO(base) ((uintptr_t)(base) + 0x2000U) +#else +#define FLEXCAN_MEMORY_ENHANCED_RX_FIFO_INIT_FLAG (0U) +#endif +/*! @brief FlexCAN transfer status. */ +enum +{ + kStatus_FLEXCAN_TxBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 0), /*!< Tx Message Buffer is Busy. */ + kStatus_FLEXCAN_TxIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 1), /*!< Tx Message Buffer is Idle. */ + kStatus_FLEXCAN_TxSwitchToRx = MAKE_STATUS( + kStatusGroup_FLEXCAN, 2), /*!< Remote Message is send out and Message buffer changed to Receive one. */ + kStatus_FLEXCAN_RxBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 3), /*!< Rx Message Buffer is Busy. */ + kStatus_FLEXCAN_RxIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 4), /*!< Rx Message Buffer is Idle. */ + kStatus_FLEXCAN_RxOverflow = MAKE_STATUS(kStatusGroup_FLEXCAN, 5), /*!< Rx Message Buffer is Overflowed. */ + kStatus_FLEXCAN_RxFifoBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 6), /*!< Rx Message FIFO is Busy. */ + kStatus_FLEXCAN_RxFifoIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 7), /*!< Rx Message FIFO is Idle. */ + kStatus_FLEXCAN_RxFifoOverflow = MAKE_STATUS(kStatusGroup_FLEXCAN, 8), /*!< Rx Message FIFO is overflowed. */ + kStatus_FLEXCAN_RxFifoWarning = MAKE_STATUS(kStatusGroup_FLEXCAN, 9), /*!< Rx Message FIFO is almost overflowed. */ + kStatus_FLEXCAN_RxFifoDisabled = + MAKE_STATUS(kStatusGroup_FLEXCAN, 10), /*!< Rx Message FIFO is disabled during reading. */ + kStatus_FLEXCAN_ErrorStatus = MAKE_STATUS(kStatusGroup_FLEXCAN, 11), /*!< FlexCAN Module Error and Status. */ + kStatus_FLEXCAN_WakeUp = MAKE_STATUS(kStatusGroup_FLEXCAN, 12), /*!< FlexCAN is waken up from STOP mode. */ + kStatus_FLEXCAN_UnHandled = MAKE_STATUS(kStatusGroup_FLEXCAN, 13), /*!< UnHadled Interrupt asserted. */ + kStatus_FLEXCAN_RxRemote = MAKE_STATUS(kStatusGroup_FLEXCAN, 14), /*!< Rx Remote Message Received in Mail box. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + kStatus_FLEXCAN_RxFifoUnderflow = + MAKE_STATUS(kStatusGroup_FLEXCAN, 15), /*!< Enhanced Rx Message FIFO is underflow. */ +#endif +}; + +/*! @brief FlexCAN frame format. */ +typedef enum _flexcan_frame_format +{ + kFLEXCAN_FrameFormatStandard = 0x0U, /*!< Standard frame format attribute. */ + kFLEXCAN_FrameFormatExtend = 0x1U, /*!< Extend frame format attribute. */ +} flexcan_frame_format_t; + +/*! @brief FlexCAN frame type. */ +typedef enum _flexcan_frame_type +{ + kFLEXCAN_FrameTypeData = 0x0U, /*!< Data frame type attribute. */ + kFLEXCAN_FrameTypeRemote = 0x1U, /*!< Remote frame type attribute. */ +} flexcan_frame_type_t; + +/*! @brief FlexCAN clock source. + * @deprecated Do not use the kFLEXCAN_ClkSrcOs. It has been superceded kFLEXCAN_ClkSrc0 + * @deprecated Do not use the kFLEXCAN_ClkSrcPeri. It has been superceded kFLEXCAN_ClkSrc1 + */ +typedef enum _flexcan_clock_source +{ + kFLEXCAN_ClkSrcOsc = 0x0U, /*!< FlexCAN Protocol Engine clock from Oscillator. */ + kFLEXCAN_ClkSrcPeri = 0x1U, /*!< FlexCAN Protocol Engine clock from Peripheral Clock. */ + kFLEXCAN_ClkSrc0 = 0x0U, /*!< FlexCAN Protocol Engine clock selected by user as SRC == 0. */ + kFLEXCAN_ClkSrc1 = 0x1U, /*!< FlexCAN Protocol Engine clock selected by user as SRC == 1. */ +} flexcan_clock_source_t; + +/*! @brief FlexCAN wake up source. */ +typedef enum _flexcan_wake_up_source +{ + kFLEXCAN_WakeupSrcUnfiltered = 0x0U, /*!< FlexCAN uses unfiltered Rx input to detect edge. */ + kFLEXCAN_WakeupSrcFiltered = 0x1U, /*!< FlexCAN uses filtered Rx input to detect edge. */ +} flexcan_wake_up_source_t; + +/*! @brief FlexCAN Rx Fifo Filter type. */ +typedef enum _flexcan_rx_fifo_filter_type +{ + kFLEXCAN_RxFifoFilterTypeA = 0x0U, /*!< One full ID (standard and extended) per ID Filter element. */ + kFLEXCAN_RxFifoFilterTypeB = + 0x1U, /*!< Two full standard IDs or two partial 14-bit ID slices per ID Filter Table element. */ + kFLEXCAN_RxFifoFilterTypeC = + 0x2U, /*!< Four partial 8-bit Standard or extended ID slices per ID Filter Table element. */ + kFLEXCAN_RxFifoFilterTypeD = 0x3U, /*!< All frames rejected. */ +} flexcan_rx_fifo_filter_type_t; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief FlexCAN Message Buffer Payload size. + */ +typedef enum _flexcan_mb_size +{ + kFLEXCAN_8BperMB = 0x0U, /*!< Selects 8 bytes per Message Buffer. */ + kFLEXCAN_16BperMB = 0x1U, /*!< Selects 16 bytes per Message Buffer. */ + kFLEXCAN_32BperMB = 0x2U, /*!< Selects 32 bytes per Message Buffer. */ + kFLEXCAN_64BperMB = 0x3U, /*!< Selects 64 bytes per Message Buffer. */ +} flexcan_mb_size_t; + +/*! + * @brief FlexCAN CAN FD frame supporting data length (available DLC values). + * + * For Tx, when the Data size corresponding to DLC value stored in the MB selected for transmission is larger than the + * MB Payload size, FlexCAN adds the necessary number of bytes with constant 0xCC pattern to complete the expected DLC. + * For Rx, when the Data size corresponding to DLC value received from the CAN bus is larger than the MB Payload size, + * the high order bytes that do not fit the Payload size will lose. + */ +enum _flexcan_fd_frame_length +{ + kFLEXCAN_0BperFrame = 0x0U, /*!< Frame contains 0 valid data bytes. */ + kFLEXCAN_1BperFrame, /*!< Frame contains 1 valid data bytes. */ + kFLEXCAN_2BperFrame, /*!< Frame contains 2 valid data bytes. */ + kFLEXCAN_3BperFrame, /*!< Frame contains 3 valid data bytes. */ + kFLEXCAN_4BperFrame, /*!< Frame contains 4 valid data bytes. */ + kFLEXCAN_5BperFrame, /*!< Frame contains 5 valid data bytes. */ + kFLEXCAN_6BperFrame, /*!< Frame contains 6 valid data bytes. */ + kFLEXCAN_7BperFrame, /*!< Frame contains 7 valid data bytes. */ + kFLEXCAN_8BperFrame, /*!< Frame contains 8 valid data bytes. */ + kFLEXCAN_12BperFrame, /*!< Frame contains 12 valid data bytes. */ + kFLEXCAN_16BperFrame, /*!< Frame contains 16 valid data bytes. */ + kFLEXCAN_20BperFrame, /*!< Frame contains 20 valid data bytes. */ + kFLEXCAN_24BperFrame, /*!< Frame contains 24 valid data bytes. */ + kFLEXCAN_32BperFrame, /*!< Frame contains 32 valid data bytes. */ + kFLEXCAN_48BperFrame, /*!< Frame contains 48 valid data bytes. */ + kFLEXCAN_64BperFrame, /*!< Frame contains 64 valid data bytes. */ +}; +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! @brief FlexCAN Enhanced Rx Fifo DMA transfer per read length enumerations. */ +typedef enum _flexcan_efifo_dma_per_read_length +{ + kFLEXCAN_1WordPerRead = 0x0U, /*!< Transfer 1 32-bit words (CS).*/ + kFLEXCAN_2WordPerRead, /*!< Transfer 2 32-bit words (CS + ID).*/ + kFLEXCAN_3WordPerRead, /*!< Transfer 3 32-bit words (CS + ID + 1~4 bytes data).*/ + kFLEXCAN_4WordPerRead, /*!< Transfer 4 32-bit words (CS + ID + 5~8 bytes data).*/ + kFLEXCAN_5WordPerRead, /*!< Transfer 5 32-bit words (CS + ID + 9~12 bytes data).*/ + kFLEXCAN_6WordPerRead, /*!< Transfer 6 32-bit words (CS + ID + 13~16 bytes data).*/ + kFLEXCAN_7WordPerRead, /*!< Transfer 7 32-bit words (CS + ID + 17~20 bytes data).*/ + kFLEXCAN_8WordPerRead, /*!< Transfer 8 32-bit words (CS + ID + 21~24 bytes data).*/ + kFLEXCAN_9WordPerRead, /*!< Transfer 9 32-bit words (CS + ID + 25~28 bytes data).*/ + kFLEXCAN_10WordPerRead, /*!< Transfer 10 32-bit words (CS + ID + 29~32 bytes data).*/ + kFLEXCAN_11WordPerRead, /*!< Transfer 11 32-bit words (CS + ID + 33~36 bytes data).*/ + kFLEXCAN_12WordPerRead, /*!< Transfer 12 32-bit words (CS + ID + 37~40 bytes data).*/ + kFLEXCAN_13WordPerRead, /*!< Transfer 13 32-bit words (CS + ID + 41~44 bytes data).*/ + kFLEXCAN_14WordPerRead, /*!< Transfer 14 32-bit words (CS + ID + 45~48 bytes data).*/ + kFLEXCAN_15WordPerRead, /*!< Transfer 15 32-bit words (CS + ID + 49~52 bytes data).*/ + kFLEXCAN_16WordPerRead, /*!< Transfer 16 32-bit words (CS + ID + 53~56 bytes data).*/ + kFLEXCAN_17WordPerRead, /*!< Transfer 17 32-bit words (CS + ID + 57~60 bytes data).*/ + kFLEXCAN_18WordPerRead, /*!< Transfer 18 32-bit words (CS + ID + 61~64 bytes data).*/ + kFLEXCAN_19WordPerRead /*!< Transfer 19 32-bit words (CS + ID + 64 bytes data + ID HIT).*/ +} flexcan_efifo_dma_per_read_length_t; +#endif + +/*! + * @brief FlexCAN Enhanced/Legacy Rx FIFO priority. + * + * The matching process starts from the Rx MB(or Enhanced/Legacy Rx FIFO) with higher priority. + * If no MB(or Enhanced/Legacy Rx FIFO filter) is satisfied, the matching process goes on with + * the Enhanced/Legacy Rx FIFO(or Rx MB) with lower priority. + */ +typedef enum _flexcan_rx_fifo_priority +{ + kFLEXCAN_RxFifoPrioLow = 0x0U, /*!< Matching process start from Rx Message Buffer first. */ + kFLEXCAN_RxFifoPrioHigh = 0x1U, /*!< Matching process start from Enhanced/Legacy Rx FIFO first. */ +} flexcan_rx_fifo_priority_t; + +/*! + * @brief FlexCAN interrupt enable enumerations. + * + * This provides constants for the FlexCAN interrupt enable enumerations for use in the FlexCAN functions. + * @note FlexCAN Message Buffers and Legacy Rx FIFO interrupts not included in. + */ +enum _flexcan_interrupt_enable +{ + kFLEXCAN_BusOffInterruptEnable = CAN_CTRL1_BOFFMSK_MASK, /*!< Bus Off interrupt, use bit 15. */ + kFLEXCAN_ErrorInterruptEnable = CAN_CTRL1_ERRMSK_MASK, /*!< CAN Error interrupt, use bit 14. */ + kFLEXCAN_TxWarningInterruptEnable = CAN_CTRL1_TWRNMSK_MASK, /*!< Tx Warning interrupt, use bit 11. */ + kFLEXCAN_RxWarningInterruptEnable = CAN_CTRL1_RWRNMSK_MASK, /*!< Rx Warning interrupt, use bit 10. */ + kFLEXCAN_WakeUpInterruptEnable = CAN_MCR_WAKMSK_MASK, /*!< Self Wake Up interrupt, use bit 26. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + kFLEXCAN_FDErrorInterruptEnable = CAN_CTRL2_ERRMSK_FAST_MASK, /*!< CAN FD Error interrupt, use bit 31. */ +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + /*! PN Match Wake Up interrupt, use high word bit 17. */ + kFLEXCAN_PNMatchWakeUpInterruptEnable = FLEXCAN_PN_INT_MASK(CAN_CTRL1_PN_WTOF_MSK_MASK), + /*! PN Timeout Wake Up interrupt, use high word bit 16. */ + kFLEXCAN_PNTimeoutWakeUpInterruptEnable = FLEXCAN_PN_INT_MASK(CAN_CTRL1_PN_WUMF_MSK_MASK), +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + /*!< Enhanced Rx FIFO Underflow interrupt, use high word bit 31. */ + kFLEXCAN_ERxFifoUnderflowInterruptEnable = FLEXCAN_EFIFO_INT_MASK(CAN_ERFIER_ERFUFWIE_MASK), + /*!< Enhanced Rx FIFO Overflow interrupt, use high word bit 30. */ + kFLEXCAN_ERxFifoOverflowInterruptEnable = FLEXCAN_EFIFO_INT_MASK(CAN_ERFIER_ERFOVFIE_MASK), + /*!< Enhanced Rx FIFO Watermark interrupt, use high word bit 29. */ + kFLEXCAN_ERxFifoWatermarkInterruptEnable = FLEXCAN_EFIFO_INT_MASK(CAN_ERFIER_ERFWMIIE_MASK), + /*!< Enhanced Rx FIFO Data Avilable interrupt, use high word bit 28. */ + kFLEXCAN_ERxFifoDataAvlInterruptEnable = FLEXCAN_EFIFO_INT_MASK(CAN_ERFIER_ERFDAIE_MASK), +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /*! Host Access With Non-Correctable Errors interrupt, use high word bit 0. */ + kFLEXCAN_HostAccessNCErrorInterruptEnable = FLEXCAN_MECR_INT_MASK(CAN_MECR_HANCEI_MSK_MASK), + /*! FlexCAN Access With Non-Correctable Errors interrupt, use high word bit 2. */ + kFLEXCAN_FlexCanAccessNCErrorInterruptEnable = FLEXCAN_MECR_INT_MASK(CAN_MECR_FANCEI_MSK_MASK), + /*! Host or FlexCAN Access With Correctable Errors interrupt, use high word bit 3. */ + kFLEXCAN_HostOrFlexCanCErrorInterruptEnable = FLEXCAN_MECR_INT_MASK(CAN_MECR_CEI_MSK_MASK), +#endif +}; + +/*! + * @brief FlexCAN status flags. + * + * This provides constants for the FlexCAN status flags for use in the FlexCAN functions. + * @note The CPU read action clears the bits corresponding to the FlEXCAN_ErrorFlag macro, therefore user need to + * read status flags and distinguish which error is occur using @ref _flexcan_error_flags enumerations. + */ +enum _flexcan_flags +{ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + kFLEXCAN_ErrorOverrunFlag = CAN_ESR1_ERROVR_MASK, /*!< Error Overrun Status. */ + kFLEXCAN_FDErrorIntFlag = CAN_ESR1_ERRINT_FAST_MASK, /*!< CAN FD Error Interrupt Flag. */ + kFLEXCAN_BusoffDoneIntFlag = CAN_ESR1_BOFFDONEINT_MASK, /*!< Bus Off process completed Interrupt Flag. */ +#endif + kFLEXCAN_SynchFlag = CAN_ESR1_SYNCH_MASK, /*!< CAN Synchronization Status. */ + kFLEXCAN_TxWarningIntFlag = CAN_ESR1_TWRNINT_MASK, /*!< Tx Warning Interrupt Flag. */ + kFLEXCAN_RxWarningIntFlag = CAN_ESR1_RWRNINT_MASK, /*!< Rx Warning Interrupt Flag. */ + kFLEXCAN_IdleFlag = CAN_ESR1_IDLE_MASK, /*!< FlexCAN In IDLE Status. */ + kFLEXCAN_FaultConfinementFlag = CAN_ESR1_FLTCONF_MASK, /*!< FlexCAN Fault Confinement State. */ + kFLEXCAN_TransmittingFlag = CAN_ESR1_TX_MASK, /*!< FlexCAN In Transmission Status. */ + kFLEXCAN_ReceivingFlag = CAN_ESR1_RX_MASK, /*!< FlexCAN In Reception Status. */ + kFLEXCAN_BusOffIntFlag = CAN_ESR1_BOFFINT_MASK, /*!< Bus Off Interrupt Flag. */ + kFLEXCAN_ErrorIntFlag = CAN_ESR1_ERRINT_MASK, /*!< CAN Error Interrupt Flag. */ + kFLEXCAN_WakeUpIntFlag = CAN_ESR1_WAKINT_MASK, /*!< Self Wake-Up Interrupt Flag. */ + kFLEXCAN_ErrorFlag = + (uint32_t)(/*!< All FlexCAN Read Clear Error Status. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + CAN_ESR1_STFERR_FAST_MASK | CAN_ESR1_FRMERR_FAST_MASK | CAN_ESR1_CRCERR_FAST_MASK | + CAN_ESR1_BIT0ERR_FAST_MASK | CAN_ESR1_BIT1ERR_FAST_MASK | CAN_ESR1_ERROVR_MASK | +#endif + CAN_ESR1_TXWRN_MASK | CAN_ESR1_RXWRN_MASK | CAN_ESR1_BIT1ERR_MASK | CAN_ESR1_BIT0ERR_MASK | + CAN_ESR1_ACKERR_MASK | CAN_ESR1_CRCERR_MASK | CAN_ESR1_FRMERR_MASK | CAN_ESR1_STFERR_MASK), +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + kFLEXCAN_PNMatchIntFlag = FLEXCAN_PN_STATUS_MASK(CAN_WU_MTC_WUMF_MASK), /*!< PN Matching Event Interrupt Flag. */ + kFLEXCAN_PNTimeoutIntFlag = FLEXCAN_PN_STATUS_MASK(CAN_WU_MTC_WTOF_MASK), /*!< PN Timeout Event Interrupt Flag. */ +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + kFLEXCAN_ERxFifoUnderflowIntFlag = + FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFUFW_MASK), /*!< Enhanced Rx FIFO underflow Interrupt Flag. */ + kFLEXCAN_ERxFifoOverflowIntFlag = + FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFOVF_MASK), /*!< Enhanced Rx FIFO overflow Interrupt Flag. */ + kFLEXCAN_ERxFifoWatermarkIntFlag = + FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFWMI_MASK), /*!< Enhanced Rx FIFO watermark Interrupt Flag. */ + kFLEXCAN_ERxFifoDataAvlIntFlag = + FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFDA_MASK), /*!< Enhanced Rx FIFO data available Interrupt Flag. */ + kFLEXCAN_ERxFifoEmptyFlag = FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFE_MASK), /*!< Enhanced Rx FIFO empty status. */ + kFLEXCAN_ERxFifoFullFlag = FLEXCAN_EFIFO_STATUS_MASK(CAN_ERFSR_ERFF_MASK), /*!< Enhanced Rx FIFO full status. */ +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /*! Host Access With Non-Correctable Error Interrupt Flag. */ + kFLEXCAN_HostAccessNonCorrectableErrorIntFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_HANCEIF_MASK), + /*! FlexCAN Access With Non-Correctable Error Interrupt Flag. */ + kFLEXCAN_FlexCanAccessNonCorrectableErrorIntFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_FANCEIF_MASK), + /*! Correctable Error Interrupt Flag. */ + kFLEXCAN_CorrectableErrorIntFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_CEIF_MASK), + /*! Host Access With Non-Correctable Error Interrupt Overrun Flag. */ + kFLEXCAN_HostAccessNonCorrectableErrorOverrunFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_HANCEIOF_MASK), + /*! FlexCAN Access With Non-Correctable Error Interrupt Overrun Flag. */ + kFLEXCAN_FlexCanAccessNonCorrectableErrorOverrunFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_FANCEIOF_MASK), + /*! Correctable Error Interrupt Overrun Flag. */ + kFLEXCAN_CorrectableErrorOverrunFlag = FLEXCAN_MECR_INT_MASK(CAN_ERRSR_CEIOF_MASK), + /*! All Memory Error Flags. */ + kFLEXCAN_AllMemoryErrorFlag = + (kFLEXCAN_HostAccessNonCorrectableErrorIntFlag | kFLEXCAN_FlexCanAccessNonCorrectableErrorIntFlag | + kFLEXCAN_CorrectableErrorIntFlag | kFLEXCAN_HostAccessNonCorrectableErrorOverrunFlag | + kFLEXCAN_FlexCanAccessNonCorrectableErrorOverrunFlag | kFLEXCAN_CorrectableErrorOverrunFlag) +#endif +}; + +/*! + * @brief FlexCAN error status flags. + * + * The FlexCAN Error Status enumerations is used to report current error of the FlexCAN bus. + * This enumerations should be used with KFLEXCAN_ErrorFlag in @ref _flexcan_flags enumerations + * to ditermine which error is generated. + */ +enum _flexcan_error_flags +{ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + kFLEXCAN_FDStuffingError = CAN_ESR1_STFERR_FAST_MASK, /*!< Stuffing Error. */ + kFLEXCAN_FDFormError = CAN_ESR1_FRMERR_FAST_MASK, /*!< Form Error. */ + kFLEXCAN_FDCrcError = CAN_ESR1_CRCERR_FAST_MASK, /*!< Cyclic Redundancy Check Error. */ + kFLEXCAN_FDBit0Error = CAN_ESR1_BIT0ERR_FAST_MASK, /*!< Unable to send dominant bit. */ + kFLEXCAN_FDBit1Error = (int)CAN_ESR1_BIT1ERR_FAST_MASK, /*!< Unable to send recessive bit. */ +#endif + kFLEXCAN_TxErrorWarningFlag = CAN_ESR1_TXWRN_MASK, /*!< Tx Error Warning Status. */ + kFLEXCAN_RxErrorWarningFlag = CAN_ESR1_RXWRN_MASK, /*!< Rx Error Warning Status. */ + kFLEXCAN_StuffingError = CAN_ESR1_STFERR_MASK, /*!< Stuffing Error. */ + kFLEXCAN_FormError = CAN_ESR1_FRMERR_MASK, /*!< Form Error. */ + kFLEXCAN_CrcError = CAN_ESR1_CRCERR_MASK, /*!< Cyclic Redundancy Check Error. */ + kFLEXCAN_AckError = CAN_ESR1_ACKERR_MASK, /*!< Received no ACK on transmission. */ + kFLEXCAN_Bit0Error = CAN_ESR1_BIT0ERR_MASK, /*!< Unable to send dominant bit. */ + kFLEXCAN_Bit1Error = CAN_ESR1_BIT1ERR_MASK, /*!< Unable to send recessive bit. */ +}; + +/*! + * @brief FlexCAN Legacy Rx FIFO status flags. + * + * The FlexCAN Legacy Rx FIFO Status enumerations are used to determine the status of the + * Rx FIFO. Because Rx FIFO occupy the MB0 ~ MB7 (Rx Fifo filter also occupies + * more Message Buffer space), Rx FIFO status flags are mapped to the corresponding + * Message Buffer status flags. + */ +enum +{ + kFLEXCAN_RxFifoOverflowFlag = CAN_IFLAG1_BUF7I_MASK, /*!< Rx FIFO overflow flag. */ + kFLEXCAN_RxFifoWarningFlag = CAN_IFLAG1_BUF6I_MASK, /*!< Rx FIFO almost full flag. */ + kFLEXCAN_RxFifoFrameAvlFlag = CAN_IFLAG1_BUF5I_MASK, /*!< Frames available in Rx FIFO flag. */ +}; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +/*! + * @brief FlexCAN Memory Error Type. + */ +typedef enum _flexcan_memory_error_type +{ + kFLEXCAN_CorrectableError = 0U, /*!< The memory error is correctable which means on bit error. */ + kFLEXCAN_NonCorrectableError /*!< The memory error is non-correctable which means two bit errors. */ +} flexcan_memory_error_type_t; + +/*! + * @brief FlexCAN Memory Access Type. + */ +typedef enum _flexcan_memory_access_type +{ + kFLEXCAN_MoveOutFlexCanAccess = 0U, /*!< The memory error was detected during move-out FlexCAN access. */ + kFLEXCAN_MoveInAccess, /*!< The memory error was detected during move-in FlexCAN access. */ + kFLEXCAN_TxArbitrationAccess, /*!< The memory error was detected during Tx Arbitration FlexCAN access. */ + kFLEXCAN_RxMatchingAccess, /*!< The memory error was detected during Rx Matching FlexCAN access. */ + kFLEXCAN_MoveOutHostAccess /*!< The memory error was detected during Rx Matching Host (CPU) access. */ +} flexcan_memory_access_type_t; + +/*! + * @brief FlexCAN Memory Error Byte Syndrome. + */ +typedef enum _flexcan_byte_error_syndrome +{ + kFLEXCAN_NoError = 0U, /*!< No bit error in this byte. */ + kFLEXCAN_ParityBits0Error = 1U, /*!< Parity bit 0 error in this byte. */ + kFLEXCAN_ParityBits1Error = 2U, /*!< Parity bit 1 error in this byte. */ + kFLEXCAN_ParityBits2Error = 4U, /*!< Parity bit 2 error in this byte. */ + kFLEXCAN_ParityBits3Error = 8U, /*!< Parity bit 3 error in this byte. */ + kFLEXCAN_ParityBits4Error = 16U, /*!< Parity bit 4 error in this byte. */ + kFLEXCAN_DataBits0Error = 28U, /*!< Data bit 0 error in this byte. */ + kFLEXCAN_DataBits1Error = 22U, /*!< Data bit 1 error in this byte. */ + kFLEXCAN_DataBits2Error = 19U, /*!< Data bit 2 error in this byte. */ + kFLEXCAN_DataBits3Error = 25U, /*!< Data bit 3 error in this byte. */ + kFLEXCAN_DataBits4Error = 26U, /*!< Data bit 4 error in this byte. */ + kFLEXCAN_DataBits5Error = 7U, /*!< Data bit 5 error in this byte. */ + kFLEXCAN_DataBits6Error = 21U, /*!< Data bit 6 error in this byte. */ + kFLEXCAN_DataBits7Error = 14U, /*!< Data bit 7 error in this byte. */ + kFLEXCAN_AllZeroError = 6U, /*!< All-zeros non-correctable error in this byte. */ + kFLEXCAN_AllOneError = 31U, /*!< All-ones non-correctable error in this byte. */ + kFLEXCAN_NonCorrectableErrors /*!< Non-correctable error in this byte. */ +} flexcan_byte_error_syndrome_t; + +/*! + * @brief FlexCAN memory error register status structure + * + * This structure contains the memory access properties that caused a memory error access. + * It is used as the parameter of FLEXCAN_GetMemoryErrorReportStatus() function. And user can + * use FLEXCAN_GetMemoryErrorReportStatus to get the status of the last memory error access. + */ +typedef struct _flexcan_memory_error_report_status +{ + flexcan_memory_error_type_t errorType; /*!< The type of memory error that giving rise to the report. */ + flexcan_memory_access_type_t accessType; /*!< The type of memory access that giving rise to the memory error. */ + uint16_t accessAddress; /*!< The address where memory error detected. */ + uint32_t errorData; /*!< The raw data word read from memory with error. */ + struct + { + bool byteIsRead; /*!< The byte n (0~3) was read or not. */ + /*!< The type of error and which bit in byte (n) is affected by the error. */ + flexcan_byte_error_syndrome_t bitAffected; + } byteStatus[4]; +} flexcan_memory_error_report_status_t; +#endif + +#if defined(__CC_ARM) +#pragma anon_unions +#endif +/*! @brief FlexCAN message frame structure. */ +typedef struct _flexcan_frame +{ + struct + { + uint32_t timestamp : 16; /*!< FlexCAN internal Free-Running Counter Time Stamp. */ + uint32_t length : 4; /*!< CAN frame data length in bytes (Range: 0~8). */ + uint32_t type : 1; /*!< CAN Frame Type(DATA or REMOTE). */ + uint32_t format : 1; /*!< CAN Frame Identifier(STD or EXT format). */ + uint32_t : 1; /*!< Reserved. */ + uint32_t idhit : 9; /*!< CAN Rx FIFO filter hit id(This value is only used in Rx FIFO receive mode). */ + }; + struct + { + uint32_t id : 29; /*!< CAN Frame Identifier, should be set using FLEXCAN_ID_EXT() or FLEXCAN_ID_STD() macro. */ + uint32_t : 3; /*!< Reserved. */ + }; + union + { + struct + { + uint32_t dataWord0; /*!< CAN Frame payload word0. */ + uint32_t dataWord1; /*!< CAN Frame payload word1. */ + }; + struct + { + uint8_t dataByte3; /*!< CAN Frame payload byte3. */ + uint8_t dataByte2; /*!< CAN Frame payload byte2. */ + uint8_t dataByte1; /*!< CAN Frame payload byte1. */ + uint8_t dataByte0; /*!< CAN Frame payload byte0. */ + uint8_t dataByte7; /*!< CAN Frame payload byte7. */ + uint8_t dataByte6; /*!< CAN Frame payload byte6. */ + uint8_t dataByte5; /*!< CAN Frame payload byte5. */ + uint8_t dataByte4; /*!< CAN Frame payload byte4. */ + }; + }; +} flexcan_frame_t; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! @brief CAN FD message frame structure. + * + * The CAN FD message supporting up to sixty four bytes can be used for a data frame, depending on the length + * selected for the message buffers. The length should be a enumeration member, see @ref _flexcan_fd_frame_length. + */ +typedef struct _flexcan_fd_frame +{ + struct + { + uint32_t timestamp : 16; /*!< FlexCAN internal Free-Running Counter Time Stamp. */ + uint32_t length : 4; /*!< CAN FD frame data length code (DLC), range see @ref _flexcan_fd_frame_length, When the + length <= 8, it equal to the data length, otherwise the number of valid frame data is + not equal to the length value. user can + use DLC_LENGTH_DECODE(length) macro to get the number of valid data bytes. */ + uint32_t type : 1; /*!< CAN Frame Type(DATA or REMOTE). */ + uint32_t format : 1; /*!< CAN Frame Identifier(STD or EXT format). */ + uint32_t srr : 1; /*!< Substitute Remote request. */ + uint32_t : 6; + uint32_t esi : 1; /*!< Error State Indicator. */ + uint32_t brs : 1; /*!< Bit Rate Switch. */ + uint32_t edl : 1; /*!< Extended Data Length. */ + }; + struct + { + uint32_t id : 29; /*!< CAN Frame Identifier, should be set using FLEXCAN_ID_EXT() or FLEXCAN_ID_STD() macro. */ + uint32_t : 3; /*!< Reserved. */ + }; + union + { + struct + { + uint32_t dataWord[16]; /*!< CAN FD Frame payload, 16 double word maximum. */ + }; + /* Note: the maximum databyte* below is actually 64, user can add them if needed, + or just use dataWord[*] instead. */ + struct + { + uint8_t dataByte3; /*!< CAN Frame payload byte3. */ + uint8_t dataByte2; /*!< CAN Frame payload byte2. */ + uint8_t dataByte1; /*!< CAN Frame payload byte1. */ + uint8_t dataByte0; /*!< CAN Frame payload byte0. */ + uint8_t dataByte7; /*!< CAN Frame payload byte7. */ + uint8_t dataByte6; /*!< CAN Frame payload byte6. */ + uint8_t dataByte5; /*!< CAN Frame payload byte5. */ + uint8_t dataByte4; /*!< CAN Frame payload byte4. */ + }; + }; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + /*! @note ID HIT offset is changed dynamically according to data length code (DLC), when DLC is 15, they will be + * located below. Using FLEXCAN_FixEnhancedRxFifoFrameIdHit API is recommended to ensure this idhit value is + * correct.*/ + uint32_t idhit; /*!< CAN Enhanced Rx FIFO filter hit id (This value is only used in Enhanced Rx FIFO receive + mode). */ +#endif +} flexcan_fd_frame_t; +#endif + +/*! @brief FlexCAN protocol timing characteristic configuration structure. */ +typedef struct _flexcan_timing_config +{ + uint16_t preDivider; /*!< Classic CAN or CAN FD nominal phase bit rate prescaler. */ + uint8_t rJumpwidth; /*!< Classic CAN or CAN FD nominal phase Re-sync Jump Width. */ + uint8_t phaseSeg1; /*!< Classic CAN or CAN FD nominal phase Segment 1. */ + uint8_t phaseSeg2; /*!< Classic CAN or CAN FD nominal phase Segment 2. */ + uint8_t propSeg; /*!< Classic CAN or CAN FD nominal phase Propagation Segment. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + uint16_t fpreDivider; /*!< CAN FD data phase bit rate prescaler. */ + uint8_t frJumpwidth; /*!< CAN FD data phase Re-sync Jump Width. */ + uint8_t fphaseSeg1; /*!< CAN FD data phase Phase Segment 1. */ + uint8_t fphaseSeg2; /*!< CAN FD data phase Phase Segment 2. */ + uint8_t fpropSeg; /*!< CAN FD data phase Propagation Segment. */ +#endif +} flexcan_timing_config_t; + +/*! @brief FlexCAN module configuration structure. + * @deprecated Do not use the baudRate. It has been superceded bitRate + * @deprecated Do not use the baudRateFD. It has been superceded bitRateFD + */ +typedef struct _flexcan_config +{ + union + { + struct + { + uint32_t baudRate; /*!< FlexCAN bit rate in bps, for classical CAN or CANFD nominal phase. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + uint32_t baudRateFD; /*!< FlexCAN FD bit rate in bps, for CANFD data phase. */ +#endif + }; + struct + { + uint32_t bitRate; /*!< FlexCAN bit rate in bps, for classical CAN or CANFD nominal phase. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + uint32_t bitRateFD; /*!< FlexCAN FD bit rate in bps, for CANFD data phase. */ +#endif + }; + }; + flexcan_clock_source_t clkSrc; /*!< Clock source for FlexCAN Protocol Engine. */ + flexcan_wake_up_source_t wakeupSrc; /*!< Wake up source selection. */ + uint8_t maxMbNum; /*!< The maximum number of Message Buffers used by user. */ + bool enableLoopBack; /*!< Enable or Disable Loop Back Self Test Mode. */ + bool enableTimerSync; /*!< Enable or Disable Timer Synchronization. */ + bool enableSelfWakeup; /*!< Enable or Disable Self Wakeup Mode. */ + bool enableIndividMask; /*!< Enable or Disable Rx Individual Mask and Queue feature. */ + bool disableSelfReception; /*!< Enable or Disable Self Reflection. */ + bool enableListenOnlyMode; /*!< Enable or Disable Listen Only Mode. */ +#if !(defined(FSL_FEATURE_FLEXCAN_HAS_NO_SUPV_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_NO_SUPV_SUPPORT) + bool enableSupervisorMode; /*!< Enable or Disable Supervisor Mode, enable this mode will make registers allow only + Supervisor access. */ +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) + bool enableDoze; /*!< Enable or Disable Doze Mode. */ +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + bool enablePretendedeNetworking; /*!< Enable or Disable the Pretended Networking mode. */ +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + bool enableMemoryErrorControl; /*!< Enable or Disable the memory errors detection and correction mechanism. */ + bool enableNonCorrectableErrorEnterFreeze; /*!< Enable or Disable Non-Correctable Errors In FlexCAN Access Put + Device In Freeze Mode. */ +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_BIT_TIMING_REG) + bool enableTransceiverDelayMeasure; /*!< Enable or Disable the transceiver delay measurement, when it is enabled, + then the secondary sample point position is determined by the sum of the + transceiver delay measurement plus the enhanced TDC offset. */ +#endif + flexcan_timing_config_t timingConfig; /* Protocol timing . */ +} flexcan_config_t; + +/*! + * @brief FlexCAN Receive Message Buffer configuration structure + * + * This structure is used as the parameter of FLEXCAN_SetRxMbConfig() function. + * The FLEXCAN_SetRxMbConfig() function is used to configure FlexCAN Receive + * Message Buffer. The function abort previous receiving process, clean the + * Message Buffer and activate the Rx Message Buffer using given Message Buffer + * setting. + */ +typedef struct _flexcan_rx_mb_config +{ + uint32_t id; /*!< CAN Message Buffer Frame Identifier, should be set using + FLEXCAN_ID_EXT() or FLEXCAN_ID_STD() macro. */ + flexcan_frame_format_t format; /*!< CAN Frame Identifier format(Standard of Extend). */ + flexcan_frame_type_t type; /*!< CAN Frame Type(Data or Remote). */ +} flexcan_rx_mb_config_t; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) +/*! @brief FlexCAN Pretended Networking match source selection. */ +typedef enum _flexcan_pn_match_source +{ + kFLEXCAN_PNMatSrcID = 0U, /*!< Message match with ID filtering. */ + kFLEXCAN_PNMatSrcIDAndData, /*!< Message match with ID filtering and payload filtering. */ +} flexcan_pn_match_source_t; + +/*! @brief FlexCAN Pretended Networking mode match type. */ +typedef enum _flexcan_pn_match_mode +{ + kFLEXCAN_PNMatModeEqual = 0x0U, /*!< Match upon ID/Payload contents against an exact target value. */ + kFLEXCAN_PNMatModeGreater, /*!< Match upon an ID/Payload value greater than or equal to a specified target value. + */ + kFLEXCAN_PNMatModeSmaller, /*!< Match upon an ID/Payload value smaller than or equal to a specified target value. + */ + kFLEXCAN_PNMatModeRange, /*!< Match upon an ID/Payload value inside a range, greater than or equal to a specified + lower limit, and smaller than or equal to a specified upper limit */ +} flexcan_pn_match_mode_t; + +/*! + * @brief FlexCAN Pretended Networking configuration structure + * + * This structure is used as the parameter of FLEXCAN_SetPNConfig() function. + * The FLEXCAN_SetPNConfig() function is used to configure FlexCAN Networking work mode. + */ +typedef struct _flexcan_pn_config +{ + bool enableTimeout; /*!< Enable or Disable timeout event trigger wakeup.*/ + uint16_t timeoutValue; /*!< The timeout value that generates a wakeup event, the counter timer is incremented based + on 64 times the CAN Bit Time unit. */ + bool enableMatch; /*!< Enable or Disable match event trigger wakeup.*/ + flexcan_pn_match_source_t matchSrc; /*!< Selects the match source (ID and/or data match) to trigger wakeup. */ + uint8_t matchNum; /*!< The number of times a given message must match the predefined ID and/or data before + generating a wakeup event, range in 0x1 ~ 0xFF. */ + flexcan_pn_match_mode_t idMatchMode; /*!< The ID match type. */ + flexcan_pn_match_mode_t dataMatchMode; /*!< The data match type. */ + uint32_t idLower; /*!< The ID target values 1 which used either for ID match "equal to", "smaller than", + "greater than" comparisons, or as the lower limit value in ID match "range detection". */ + uint32_t idUpper; /*!< The ID target values 2 which used only as the upper limit value in ID match "range + detection" or used to store the ID mask in "equal to". */ + uint8_t lengthLower; /*!< The lower limit for length of data bytes which used only in data match "range + detection". Range in 0x0 ~ 0x8.*/ + uint8_t lengthUpper; /*!< The upper limit for length of data bytes which used only in data match "range + detection". Range in 0x0 ~ 0x8.*/ + union + { + /*!< The data target values 1 which used either for data match "equal to", "smaller than", + "greater than" comparisons, or as the lower limit value in data match "range + detection". */ + struct + { + uint32_t lowerWord0; /*!< CAN Frame payload word0. */ + uint32_t lowerWord1; /*!< CAN Frame payload word1. */ + }; + struct + { + uint8_t lowerByte3; /*!< CAN Frame payload byte3. */ + uint8_t lowerByte2; /*!< CAN Frame payload byte2. */ + uint8_t lowerByte1; /*!< CAN Frame payload byte1. */ + uint8_t lowerByte0; /*!< CAN Frame payload byte0. */ + uint8_t lowerByte7; /*!< CAN Frame payload byte7. */ + uint8_t lowerByte6; /*!< CAN Frame payload byte6. */ + uint8_t lowerByte5; /*!< CAN Frame payload byte5. */ + uint8_t lowerByte4; /*!< CAN Frame payload byte4. */ + }; + }; + union + { + /*!< The data target values 2 which used only as the upper limit value in data match "range + detection" or used to store the data mask in "equal to". */ + struct + { + uint32_t upperWord0; /*!< CAN Frame payload word0. */ + uint32_t upperWord1; /*!< CAN Frame payload word1. */ + }; + struct + { + uint8_t upperByte3; /*!< CAN Frame payload byte3. */ + uint8_t upperByte2; /*!< CAN Frame payload byte2. */ + uint8_t upperByte1; /*!< CAN Frame payload byte1. */ + uint8_t upperByte0; /*!< CAN Frame payload byte0. */ + uint8_t upperByte7; /*!< CAN Frame payload byte7. */ + uint8_t upperByte6; /*!< CAN Frame payload byte6. */ + uint8_t upperByte5; /*!< CAN Frame payload byte5. */ + uint8_t upperByte4; /*!< CAN Frame payload byte4. */ + }; + }; +} flexcan_pn_config_t; +#endif + +/*! @brief FlexCAN Legacy Rx FIFO configuration structure. */ +typedef struct _flexcan_rx_fifo_config +{ + uint32_t *idFilterTable; /*!< Pointer to the FlexCAN Legacy Rx FIFO identifier filter table. */ + uint8_t idFilterNum; /*!< The FlexCAN Legacy Rx FIFO Filter elements quantity. */ + flexcan_rx_fifo_filter_type_t idFilterType; /*!< The FlexCAN Legacy Rx FIFO Filter type. */ + flexcan_rx_fifo_priority_t priority; /*!< The FlexCAN Legacy Rx FIFO receive priority. */ +} flexcan_rx_fifo_config_t; + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! @brief FlexCAN Enhanced Rx FIFO Standard ID filter element structure. */ +typedef struct _flexcan_enhanced_rx_fifo_std_id_filter +{ + uint32_t filterType : 2; /*!< FlexCAN internal Free-Running Counter Time Stamp. */ + uint32_t : 2; + uint32_t rtr1 : 1; /*!< CAN FD frame data length code (DLC), range see @ref _flexcan_fd_frame_length, When the + length <= 8, it equal to the data length, otherwise the number of valid frame data is + not equal to the length value. user can + use DLC_LENGTH_DECODE(length) macro to get the number of valid data bytes. */ + uint32_t std1 : 11; /*!< CAN Frame Type(DATA or REMOTE). */ + uint32_t : 4; + uint32_t rtr2 : 1; /*!< CAN Frame Identifier(STD or EXT format). */ + uint32_t std2 : 11; /*!< Substitute Remote request. */ +} flexcan_enhanced_rx_fifo_std_id_filter_t; + +/*! @brief FlexCAN Enhanced Rx FIFO Extended ID filter element structure. */ +typedef struct _flexcan_enhanced_rx_fifo_ext_id_filter +{ + uint32_t filterType : 2; /*!< FlexCAN internal Free-Running Counter Time Stamp. */ + uint32_t rtr1 : 1; /*!< CAN FD frame data length code (DLC), range see @ref _flexcan_fd_frame_length, When the + length <= 8, it equal to the data length, otherwise the number of valid frame data is + not equal to the length value. user can + use DLC_LENGTH_DECODE(length) macro to get the number of valid data bytes. */ + uint32_t std1 : 29; /*!< CAN Frame Type(DATA or REMOTE). */ + uint32_t : 2; + uint32_t rtr2 : 1; /*!< CAN Frame Identifier(STD or EXT format). */ + uint32_t std2 : 29; /*!< Substitute Remote request. */ +} flexcan_enhanced_rx_fifo_ext_id_filter_t; +/*! @brief FlexCAN Enhanced Rx FIFO configuration structure. */ +typedef struct _flexcan_enhanced_rx_fifo_config +{ + uint32_t *idFilterTable; /*!< Pointer to the FlexCAN Enhanced Rx FIFO identifier filter table, each table member + occupies 32 bit word, table size should be equal to idFilterNum. There are two types of + Enhanced Rx FIFO filter elements that can be stored in table : extended-ID filter element + (1 word, occupie 1 table members) and standard-ID filter element (2 words, occupies 2 table + members), the extended-ID filter element needs to be placed in front of the table. */ + uint8_t idFilterPairNum; /*!< idFilterPairNum is the Enhanced Rx FIFO identifier filter element pair numbers, + each pair of filter elements occupies 2 words and can consist of one extended ID filter + element or two standard ID filter elements. */ + uint8_t extendIdFilterNum; /*!< The number of extended ID filter element items in the FlexCAN enhanced Rx FIFO + identifier filter table, each extended-ID filter element occupies 2 words, + extendIdFilterNum need less than or equal to idFilterPairNum. */ + uint8_t fifoWatermark; /*!< (fifoWatermark + 1) is the minimum number of CAN messages stored in the Enhanced RX FIFO + which can trigger FIFO watermark interrupt or a DMA request. */ + flexcan_efifo_dma_per_read_length_t dmaPerReadLength; /*!< Define the length of each read of the Enhanced RX FIFO + element by the DAM, see @ref _flexcan_fd_frame_length. */ + flexcan_rx_fifo_priority_t priority; /*!< The FlexCAN Enhanced Rx FIFO receive priority. */ +} flexcan_enhanced_rx_fifo_config_t; +#endif + +/*! @brief FlexCAN Message Buffer transfer. */ +typedef struct _flexcan_mb_transfer +{ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + flexcan_fd_frame_t *framefd; +#endif + flexcan_frame_t *frame; /*!< The buffer of CAN Message to be transfer. */ + uint8_t mbIdx; /*!< The index of Message buffer used to transfer Message. */ +} flexcan_mb_transfer_t; + +/*! @brief FlexCAN Rx FIFO transfer. */ +typedef struct _flexcan_fifo_transfer +{ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + flexcan_fd_frame_t *framefd; /*!< The buffer of CAN Message to be received from Enhanced Rx FIFO. */ +#endif + flexcan_frame_t *frame; /*!< The buffer of CAN Message to be received from Legacy Rx FIFO. */ + size_t frameNum; /*!< Number of CAN Message need to be received from Legacy or Ehanced Rx FIFO. */ +} flexcan_fifo_transfer_t; + +/*! @brief FlexCAN handle structure definition. */ +typedef struct _flexcan_handle flexcan_handle_t; + +/*! @brief FlexCAN transfer callback function. + * + * The FlexCAN transfer callback returns a value from the underlying layer. + * If the status equals to kStatus_FLEXCAN_ErrorStatus, the result parameter is the Content of + * FlexCAN status register which can be used to get the working status(or error status) of FlexCAN module. + * If the status equals to other FlexCAN Message Buffer transfer status, the result is the index of + * Message Buffer that generate transfer event. + * If the status equals to other FlexCAN Message Buffer transfer status, the result is meaningless and should be + * Ignored. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +#define FLEXCAN_CALLBACK(x) \ + void(x)(CAN_Type * base, flexcan_handle_t * handle, status_t status, uint64_t result, void *userData) +typedef void (*flexcan_transfer_callback_t)( + CAN_Type *base, flexcan_handle_t *handle, status_t status, uint64_t result, void *userData); +#else +#define FLEXCAN_CALLBACK(x) \ + void(x)(CAN_Type * base, flexcan_handle_t * handle, status_t status, uint32_t result, void *userData) +typedef void (*flexcan_transfer_callback_t)( + CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData); +#endif + +/*! @brief FlexCAN handle structure. */ +struct _flexcan_handle +{ + flexcan_transfer_callback_t callback; /*!< Callback function. */ + void *userData; /*!< FlexCAN callback function parameter.*/ + flexcan_frame_t + *volatile mbFrameBuf[CAN_WORD1_COUNT]; /*!< The buffer for received CAN data from Message Buffers. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + flexcan_fd_frame_t + *volatile mbFDFrameBuf[CAN_WORD1_COUNT]; /*!< The buffer for received CAN FD data from Message Buffers. */ +#endif + flexcan_frame_t *volatile rxFifoFrameBuf; /*!< The buffer for received CAN data from Legacy Rx FIFO. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + flexcan_fd_frame_t *volatile rxFifoFDFrameBuf; /*!< The buffer for received CAN FD data from Ehanced Rx FIFO. */ +#endif + size_t rxFifoFrameNum; /*!< The number of CAN messages remaining to be received from Legacy or Ehanced Rx FIFO. */ + size_t rxFifoTransferTotalNum; /*!< Total CAN Message number need to be received from Legacy or Ehanced Rx FIFO. */ + volatile uint8_t mbState[CAN_WORD1_COUNT]; /*!< Message Buffer transfer state. */ + volatile uint8_t rxFifoState; /*!< Rx FIFO transfer state. */ + volatile uint32_t timestamp[CAN_WORD1_COUNT]; /*!< Mailbox transfer timestamp. */ +}; + +/****************************************************************************** + * API + *****************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and deinitialization + * @{ + */ + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Determine whether the FlexCAN instance support CAN FD mode at run time. + * + * @note Use this API only if different soc parts share the SOC part name macro define. Otherwise, a different SOC part + * name can be used to determine at compile time whether the FlexCAN instance supports CAN FD mode or not. + * If need use this API to determine if CAN FD mode is supported, the FLEXCAN_Init function needs to be + * executed first, and then call this API and use the return to value determines whether to supports CAN FD mode, + * if return true, continue calling FLEXCAN_FDInit to enable CAN FD mode. + * + * @param base FlexCAN peripheral base address. + * @return return TRUE if instance support CAN FD mode, FALSE if instance only support classic CAN (2.0) mode. + */ +bool FLEXCAN_IsInstanceHasFDMode(CAN_Type *base); +#endif + +/*! + * @brief Enter FlexCAN Freeze Mode. + * + * This function makes the FlexCAN work under Freeze Mode. + * + * @param base FlexCAN peripheral base address. + */ +void FLEXCAN_EnterFreezeMode(CAN_Type *base); + +/*! + * @brief Exit FlexCAN Freeze Mode. + * + * This function makes the FlexCAN leave Freeze Mode. + * + * @param base FlexCAN peripheral base address. + */ +void FLEXCAN_ExitFreezeMode(CAN_Type *base); + +/*! + * @brief Get the FlexCAN instance from peripheral base address. + * + * @param base FlexCAN peripheral base address. + * @return FlexCAN instance. + */ +uint32_t FLEXCAN_GetInstance(CAN_Type *base); + +/*! + * @brief Calculates the improved timing values by specific bit Rates for classical CAN. + * + * This function use to calculates the Classical CAN timing values according to the given bit rate. The Calculated + * timing values will be set in CTRL1/CBT/ENCBT register. The calculation is based on the recommendation of the CiA 301 + * v4.2.0 and previous version document. + * + * @param base FlexCAN peripheral base address. + * @param bitRate The classical CAN speed in bps defined by user, should be less than or equal to 1Mbps. + * @param sourceClock_Hz The Source clock frequency in Hz. + * @param pTimingConfig Pointer to the FlexCAN timing configuration structure. + * + * @return TRUE if timing configuration found, FALSE if failed to find configuration. + */ +bool FLEXCAN_CalculateImprovedTimingValues(CAN_Type *base, + uint32_t bitRate, + uint32_t sourceClock_Hz, + flexcan_timing_config_t *pTimingConfig); + +/*! + * @brief Initializes a FlexCAN instance. + * + * This function initializes the FlexCAN module with user-defined settings. + * This example shows how to set up the flexcan_config_t parameters and how + * to call the FLEXCAN_Init function by passing in these parameters. + * @code + * flexcan_config_t flexcanConfig; + * flexcanConfig.clkSrc = kFLEXCAN_ClkSrc0; + * flexcanConfig.bitRate = 1000000U; + * flexcanConfig.maxMbNum = 16; + * flexcanConfig.enableLoopBack = false; + * flexcanConfig.enableSelfWakeup = false; + * flexcanConfig.enableIndividMask = false; + * flexcanConfig.enableDoze = false; + * flexcanConfig.disableSelfReception = false; + * flexcanConfig.enableListenOnlyMode = false; + * flexcanConfig.timingConfig = timingConfig; + * FLEXCAN_Init(CAN0, &flexcanConfig, 40000000UL); + * @endcode + * + * @param base FlexCAN peripheral base address. + * @param pConfig Pointer to the user-defined configuration structure. + * @param sourceClock_Hz FlexCAN Protocol Engine clock source frequency in Hz. + */ +void FLEXCAN_Init(CAN_Type *base, const flexcan_config_t *pConfig, uint32_t sourceClock_Hz); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Calculates the improved timing values by specific bit rates for CANFD. + * + * This function use to calculates the CANFD timing values according to the given nominal phase bit rate and data phase + * bit rate. The Calculated timing values will be set in CBT/ENCBT and FDCBT/EDCBT registers. The calculation is based + * on the recommendation of the CiA 1301 v1.0.0 document. + * + * @param base FlexCAN peripheral base address. + * @param bitRate The CANFD bus control speed in bps defined by user. + * @param bitRateFD The CAN FD data phase speed in bps defined by user. Equal to bitRate means disable bit rate + * switching. + * @param sourceClock_Hz The Source clock frequency in Hz. + * @param pTimingConfig Pointer to the FlexCAN timing configuration structure. + * + * @return TRUE if timing configuration found, FALSE if failed to find configuration + */ +bool FLEXCAN_FDCalculateImprovedTimingValues(CAN_Type *base, + uint32_t bitRate, + uint32_t bitRateFD, + uint32_t sourceClock_Hz, + flexcan_timing_config_t *pTimingConfig); +/*! + * @brief Initializes a FlexCAN instance. + * + * This function initializes the FlexCAN module with user-defined settings. + * This example shows how to set up the flexcan_config_t parameters and how + * to call the FLEXCAN_FDInit function by passing in these parameters. + * @code + * flexcan_config_t flexcanConfig; + * flexcanConfig.clkSrc = kFLEXCAN_ClkSrc0; + * flexcanConfig.bitRate = 1000000U; + * flexcanConfig.bitRateFD = 2000000U; + * flexcanConfig.maxMbNum = 16; + * flexcanConfig.enableLoopBack = false; + * flexcanConfig.enableSelfWakeup = false; + * flexcanConfig.enableIndividMask = false; + * flexcanConfig.disableSelfReception = false; + * flexcanConfig.enableListenOnlyMode = false; + * flexcanConfig.enableDoze = false; + * flexcanConfig.timingConfig = timingConfig; + * FLEXCAN_FDInit(CAN0, &flexcanConfig, 80000000UL, kFLEXCAN_16BperMB, true); + * @endcode + * + * @param base FlexCAN peripheral base address. + * @param pConfig Pointer to the user-defined configuration structure. + * @param sourceClock_Hz FlexCAN Protocol Engine clock source frequency in Hz. + * @param dataSize FlexCAN Message Buffer payload size. The actual transmitted or received CAN FD frame data size needs + * to be less than or equal to this value. + * @param brs True if bit rate switch is enabled in FD mode. + */ +void FLEXCAN_FDInit( + CAN_Type *base, const flexcan_config_t *pConfig, uint32_t sourceClock_Hz, flexcan_mb_size_t dataSize, bool brs); +#endif + +/*! + * @brief De-initializes a FlexCAN instance. + * + * This function disables the FlexCAN module clock and sets all register values + * to the reset value. + * + * @param base FlexCAN peripheral base address. + */ +void FLEXCAN_Deinit(CAN_Type *base); + +/*! + * @brief Gets the default configuration structure. + * + * This function initializes the FlexCAN configuration structure to default values. The default + * values are as follows. + * flexcanConfig->clkSrc = kFLEXCAN_ClkSrc0; + * flexcanConfig->bitRate = 1000000U; + * flexcanConfig->bitRateFD = 2000000U; + * flexcanConfig->maxMbNum = 16; + * flexcanConfig->enableLoopBack = false; + * flexcanConfig->enableSelfWakeup = false; + * flexcanConfig->enableIndividMask = false; + * flexcanConfig->disableSelfReception = false; + * flexcanConfig->enableListenOnlyMode = false; + * flexcanConfig->enableDoze = false; + * flexcanConfig->enableMemoryErrorControl = true; + * flexcanConfig->enableNonCorrectableErrorEnterFreeze = true; + * flexcanConfig.timingConfig = timingConfig; + * + * @param pConfig Pointer to the FlexCAN configuration structure. + */ +void FLEXCAN_GetDefaultConfig(flexcan_config_t *pConfig); + +/*! @} */ + +/*! + * @name Configuration. + * @{ + */ + +/*! + * @brief Sets the FlexCAN classical CAN protocol timing characteristic. + * + * This function gives user settings to classical CAN or CAN FD nominal phase timing characteristic. + * The function is for an experienced user. For less experienced users, call the FLEXCAN_SetBitRate() instead. + * + * @note Calling FLEXCAN_SetTimingConfig() overrides the bit rate set in FLEXCAN_Init() or FLEXCAN_SetBitRate(). + * + * @param base FlexCAN peripheral base address. + * @param pConfig Pointer to the timing configuration structure. + */ +void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *pConfig); + +/*! + * @brief Set bit rate of FlexCAN classical CAN frame or CAN FD frame nominal phase. + * + * This function set the bit rate of classical CAN frame or CAN FD frame nominal phase base on + * FLEXCAN_CalculateImprovedTimingValues() API calculated timing values. + * + * @note Calling FLEXCAN_SetBitRate() overrides the bit rate set in FLEXCAN_Init(). + * + * @param base FlexCAN peripheral base address. + * @param sourceClock_Hz Source Clock in Hz. + * @param bitRate_Bps Bit rate in Bps. + * @return kStatus_Success - Set CAN baud rate (only Nominal phase) successfully. + */ +status_t FLEXCAN_SetBitRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t bitRate_Bps); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Sets the FlexCAN CANFD data phase timing characteristic. + * + * This function gives user settings to CANFD data phase timing characteristic. + * The function is for an experienced user. For less experienced users, call the FLEXCAN_SetFDBitRate() + * to set both Nominal/Data bit Rate instead. + * + * @note Calling FLEXCAN_SetFDTimingConfig() overrides the data phase bit rate set in + * FLEXCAN_FDInit()/FLEXCAN_SetFDBitRate(). + * + * @param base FlexCAN peripheral base address. + * @param pConfig Pointer to the timing configuration structure. + */ +void FLEXCAN_SetFDTimingConfig(CAN_Type *base, const flexcan_timing_config_t *pConfig); + +/*! + * @brief Set bit rate of FlexCAN FD frame. + * + * This function set the baud rate of FLEXCAN FD base on FLEXCAN_FDCalculateImprovedTimingValues() API calculated timing + * values. + * + * @param base FlexCAN peripheral base address. + * @param sourceClock_Hz Source Clock in Hz. + * @param bitRateN_Bps Nominal bit Rate in Bps. + * @param bitRateD_Bps Data bit Rate in Bps. + * @return kStatus_Success - Set CAN FD bit rate (include Nominal and Data phase) successfully. + */ +status_t FLEXCAN_SetFDBitRate(CAN_Type *base, uint32_t sourceClock_Hz, uint32_t bitRateN_Bps, uint32_t bitRateD_Bps); +#endif + +/*! + * @brief Sets the FlexCAN receive message buffer global mask. + * + * This function sets the global mask for the FlexCAN message buffer in a matching process. + * The configuration is only effective when the Rx individual mask is disabled in the FLEXCAN_Init(). + * + * @param base FlexCAN peripheral base address. + * @param mask Rx Message Buffer Global Mask value. + */ +void FLEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask); + +/*! + * @brief Sets the FlexCAN receive FIFO global mask. + * + * This function sets the global mask for FlexCAN FIFO in a matching process. + * + * @param base FlexCAN peripheral base address. + * @param mask Rx Fifo Global Mask value. + */ +void FLEXCAN_SetRxFifoGlobalMask(CAN_Type *base, uint32_t mask); + +/*! + * @brief Sets the FlexCAN receive individual mask. + * + * This function sets the individual mask for the FlexCAN matching process. + * The configuration is only effective when the Rx individual mask is enabled in the FLEXCAN_Init(). + * If the Rx FIFO is disabled, the individual mask is applied to the corresponding Message Buffer. + * If the Rx FIFO is enabled, the individual mask for Rx FIFO occupied Message Buffer is applied to + * the Rx Filter with the same index. Note that only the first 32 + * individual masks can be used as the Rx FIFO filter mask. + * + * @param base FlexCAN peripheral base address. + * @param maskIdx The Index of individual Mask. + * @param mask Rx Individual Mask value. + */ +void FLEXCAN_SetRxIndividualMask(CAN_Type *base, uint8_t maskIdx, uint32_t mask); + +/*! + * @brief Configures a FlexCAN transmit message buffer. + * + * This function aborts the previous transmission, cleans the Message Buffer, and + * configures it as a Transmit Message Buffer. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The Message Buffer index. + * @param enable Enable/disable Tx Message Buffer. + * - true: Enable Tx Message Buffer. + * - false: Disable Tx Message Buffer. + */ +void FLEXCAN_SetTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Configures a FlexCAN transmit message buffer. + * + * This function aborts the previous transmission, cleans the Message Buffer, and + * configures it as a Transmit Message Buffer. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The Message Buffer index. + * @param enable Enable/disable Tx Message Buffer. + * - true: Enable Tx Message Buffer. + * - false: Disable Tx Message Buffer. + */ +void FLEXCAN_SetFDTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable); +#endif + +/*! + * @brief Configures a FlexCAN Receive Message Buffer. + * + * This function cleans a FlexCAN build-in Message Buffer and configures it + * as a Receive Message Buffer. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The Message Buffer index. + * @param pRxMbConfig Pointer to the FlexCAN Message Buffer configuration structure. + * @param enable Enable/disable Rx Message Buffer. + * - true: Enable Rx Message Buffer. + * - false: Disable Rx Message Buffer. + */ +void FLEXCAN_SetRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Configures a FlexCAN Receive Message Buffer. + * + * This function cleans a FlexCAN build-in Message Buffer and configures it + * as a Receive Message Buffer. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The Message Buffer index. + * @param pRxMbConfig Pointer to the FlexCAN Message Buffer configuration structure. + * @param enable Enable/disable Rx Message Buffer. + * - true: Enable Rx Message Buffer. + * - false: Disable Rx Message Buffer. + */ +void FLEXCAN_SetFDRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *pRxMbConfig, bool enable); +#endif + +/*! + * @brief Configures the FlexCAN Legacy Rx FIFO. + * + * This function configures the FlexCAN Rx FIFO with given configuration. + * @note Legacy Rx FIFO only can receive classic CAN message. + * + * @param base FlexCAN peripheral base address. + * @param pRxFifoConfig Pointer to the FlexCAN Legacy Rx FIFO configuration structure. Can be NULL when enable parameter + * is false. + * @param enable Enable/disable Legacy Rx FIFO. + * - true: Enable Legacy Rx FIFO. + * - false: Disable Legacy Rx FIFO. + */ +void FLEXCAN_SetRxFifoConfig(CAN_Type *base, const flexcan_rx_fifo_config_t *pRxFifoConfig, bool enable); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * @brief Configures the FlexCAN Enhanced Rx FIFO. + * + * This function configures the Enhanced Rx FIFO with given configuration. + * @note Enhanced Rx FIFO support receive classic CAN or CAN FD messages, Legacy Rx FIFO and Enhanced Rx FIFO + * cannot be enabled at the same time. + * + * @param base FlexCAN peripheral base address. + * @param pConfig Pointer to the FlexCAN Enhanced Rx FIFO configuration structure. Can be NULL when enable parameter + * is false. + * @param enable Enable/disable Enhanced Rx FIFO. + * - true: Enable Enhanced Rx FIFO. + * - false: Disable Enhanced Rx FIFO. + */ +void FLEXCAN_SetEnhancedRxFifoConfig(CAN_Type *base, const flexcan_enhanced_rx_fifo_config_t *pConfig, bool enable); +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) +/*! + * @brief Configures the FlexCAN Pretended Networking mode. + * + * This function configures the FlexCAN Pretended Networking mode with given configuration. + * + * @param base FlexCAN peripheral base address. + * @param pConfig Pointer to the FlexCAN Rx FIFO configuration structure. + */ +void FLEXCAN_SetPNConfig(CAN_Type *base, const flexcan_pn_config_t *pConfig); +#endif +/*! @} */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets the FlexCAN module interrupt flags. + * + * This function gets all FlexCAN status flags. The flags are returned as the logical + * OR value of the enumerators @ref _flexcan_flags. To check the specific status, + * compare the return value with enumerators in @ref _flexcan_flags. + * + * @param base FlexCAN peripheral base address. + * @return FlexCAN status flags which are ORed by the enumerators in the _flexcan_flags. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +static inline uint64_t FLEXCAN_GetStatusFlags(CAN_Type *base) +{ + uint64_t tempflag = (uint64_t)base->ESR1; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + /* Get PN Wake Up status. */ + tempflag |= FLEXCAN_PN_STATUS_MASK(base->WU_MTC); +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + /* Get Enhanced Rx FIFO status. */ + tempflag |= FLEXCAN_EFIFO_STATUS_MASK(base->ERFSR); +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /* Get Memory Error status. */ + tempflag |= FLEXCAN_MECR_STATUS_MASK(base->ERRSR); +#endif + return tempflag; +} +#else +static inline uint32_t FLEXCAN_GetStatusFlags(CAN_Type *base) +{ + return base->ESR1; +} +#endif +/*! + * @brief Clears status flags with the provided mask. + * + * This function clears the FlexCAN status flags with a provided mask. An automatically cleared flag + * can't be cleared by this function. + * + * @param base FlexCAN peripheral base address. + * @param mask The status flags to be cleared, it is logical OR value of @ref _flexcan_flags. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +static inline void FLEXCAN_ClearStatusFlags(CAN_Type *base, uint64_t mask) +{ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + /* Clear PN Wake Up status. */ + base->WU_MTC = FLEXCAN_PN_STATUS_UNMASK(mask); +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + /* Clear Enhanced Rx FIFO status. */ + base->ERFSR = FLEXCAN_EFIFO_STATUS_UNMASK(mask); +#endif +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /* Clear Memory Error status. */ + base->ERRSR = FLEXCAN_MECR_STATUS_UNMASK(mask); +#endif + base->ESR1 = (uint32_t)(mask & 0xFFFFFFFFU); +} +#else +static inline void FLEXCAN_ClearStatusFlags(CAN_Type *base, uint32_t mask) +{ + /* Write 1 to clear status flag. */ + base->ESR1 = mask; +} +#endif +/*! + * @brief Gets the FlexCAN Bus Error Counter value. + * + * This function gets the FlexCAN Bus Error Counter value for both Tx and + * Rx direction. These values may be needed in the upper layer error handling. + * + * @param base FlexCAN peripheral base address. + * @param txErrBuf Buffer to store Tx Error Counter value. + * @param rxErrBuf Buffer to store Rx Error Counter value. + */ +static inline void FLEXCAN_GetBusErrCount(CAN_Type *base, uint8_t *txErrBuf, uint8_t *rxErrBuf) +{ + if (NULL != txErrBuf) + { + *txErrBuf = (uint8_t)((base->ECR & CAN_ECR_TXERRCNT_MASK) >> CAN_ECR_TXERRCNT_SHIFT); + } + + if (NULL != rxErrBuf) + { + *rxErrBuf = (uint8_t)((base->ECR & CAN_ECR_RXERRCNT_MASK) >> CAN_ECR_RXERRCNT_SHIFT); + } +} + +/*! + * @brief Gets the FlexCAN Message Buffer interrupt flags. + * + * This function gets the interrupt flags of a given Message Buffers. + * + * @param base FlexCAN peripheral base address. + * @param mask The ORed FlexCAN Message Buffer mask. + * @return The status of given Message Buffers. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) +static inline uint64_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint64_t mask) +#else +static inline uint32_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint32_t mask) +#endif +{ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + uint64_t tempflag = (uint64_t)base->IFLAG1; + return (tempflag | (((uint64_t)base->IFLAG2) << 32)) & mask; +#else + return (base->IFLAG1 & mask); +#endif +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) +/*! + * @brief Gets the FlexCAN High 64 Message Buffer interrupt flags. + * + * Valid only if the number of available MBs exceeds 64. + * + * @param base FlexCAN peripheral base address. + * @param mask The ORed FlexCAN Message Buffer mask. + * @return The status of given Message Buffers. + */ +static inline uint64_t FLEXCAN_GetHigh64MbStatusFlags(CAN_Type *base, uint64_t mask) +{ + uint64_t tempflag = 0U; +#if defined(CAN_IFLAG3_BUF95TO64_MASK) + tempflag |= (uint64_t)base->IFLAG3; +#endif +#if defined(CAN_IFLAG4_BUF127TO96_MASK) + tempflag |= (uint64_t)base->IFLAG4; +#endif + return (tempflag & mask); +} +#endif + +/*! + * @brief Clears the FlexCAN Message Buffer interrupt flags. + * + * This function clears the interrupt flags of a given Message Buffers. + * + * @param base FlexCAN peripheral base address. + * @param mask The ORed FlexCAN Message Buffer mask. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) +static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint64_t mask) +#else +static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint32_t mask) +#endif +{ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + base->IFLAG1 = (uint32_t)(mask & 0xFFFFFFFFU); + base->IFLAG2 = (uint32_t)(mask >> 32); +#else + base->IFLAG1 = mask; +#endif +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) +/*! + * @brief Clears the FlexCAN High 64 Message Buffer interrupt flags. + * + * Valid only if the number of available MBs exceeds 64. + * + * @param base FlexCAN peripheral base address. + * @param mask The ORed FlexCAN Message Buffer mask. + */ +static inline void FLEXCAN_ClearHigh64MbStatusFlags(CAN_Type *base, uint64_t mask) +{ +#if defined(CAN_IFLAG3_BUF95TO64_MASK) + base->IFLAG3 = (uint32_t)(mask & 0xFFFFFFFFU); +#endif +#if defined(CAN_IFLAG4_BUF127TO96_MASK) + base->IFLAG4 = (uint32_t)(mask >> 32U); +#endif +} +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +/*! + * @brief Gets the FlexCAN Memory Error Report registers status. + * + * This function gets the FlexCAN Memory Error Report registers status. + * + * @param base FlexCAN peripheral base address. + * @param errorStatus Pointer to FlexCAN Memory Error Report registers status structure. + */ +void FLEXCAN_GetMemoryErrorReportStatus(CAN_Type *base, flexcan_memory_error_report_status_t *errorStatus); +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) +/*! + * @brief Gets the FlexCAN Number of Matches when in Pretended Networking. + * + * This function gets the number of times a given message has matched the predefined filtering criteria for ID and/or PL + * before a wakeup event. + * + * @param base FlexCAN peripheral base address. + * @return The number of received wake up msessages. + */ +static inline uint8_t FLEXCAN_GetPNMatchCount(CAN_Type *base) +{ + return (uint8_t)((base->WU_MTC & CAN_WU_MTC_MCOUNTER_MASK) >> CAN_WU_MTC_MCOUNTER_SHIFT); +} +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * @brief Gets the number of FlexCAN Enhanced Rx FIFO available frames. + * + * This function gets the number of CAN messages stored in the Enhanced Rx FIFO. + * + * @param base FlexCAN peripheral base address. + * @return The number of available CAN messages stored in the Enhanced Rx FIFO. + */ +static inline uint32_t FLEXCAN_GetEnhancedFifoDataCount(CAN_Type *base) +{ + return (base->ERFSR & CAN_ERFSR_ERFEL_MASK); +} +#endif +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables FlexCAN interrupts according to the provided mask. + * + * This function enables the FlexCAN interrupts according to the provided mask. The mask + * is a logical OR of enumeration members, see @ref _flexcan_interrupt_enable. + * + * @param base FlexCAN peripheral base address. + * @param mask The interrupts to enable. Logical OR of @ref _flexcan_interrupt_enable. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +static inline void FLEXCAN_EnableInterrupts(CAN_Type *base, uint64_t mask) +#else +static inline void FLEXCAN_EnableInterrupts(CAN_Type *base, uint32_t mask) +#endif +{ + uint32_t primask = DisableGlobalIRQ(); + + /* Solve Self Wake Up interrupt. */ + base->MCR |= (uint32_t)(mask & (uint32_t)kFLEXCAN_WakeUpInterruptEnable); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) + { + /* Solve CAN FD frames data phase error interrupt. */ + base->CTRL2 |= (uint32_t)(mask & (uint32_t)kFLEXCAN_FDErrorInterruptEnable); + } +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + /* Solve PN Wake Up interrupt. */ + base->CTRL1_PN |= FLEXCAN_PN_INT_UNMASK(mask); +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + /* Solve Enhanced Rx FIFO interrupt. */ + base->ERFIER |= FLEXCAN_EFIFO_INT_UNMASK(mask); +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /* Solve Memory Error interrupt. */ + base->MECR |= FLEXCAN_MECR_INT_UNMASK(mask); +#endif + + /* Solve interrupt enable bits in CTRL1 register. */ + base->CTRL1 |= + (uint32_t)(mask & ((uint32_t)kFLEXCAN_BusOffInterruptEnable | (uint32_t)kFLEXCAN_ErrorInterruptEnable | + (uint32_t)kFLEXCAN_RxWarningInterruptEnable | (uint32_t)kFLEXCAN_TxWarningInterruptEnable)); + + EnableGlobalIRQ(primask); +} + +/*! + * @brief Disables FlexCAN interrupts according to the provided mask. + * + * This function disables the FlexCAN interrupts according to the provided mask. The mask + * is a logical OR of enumeration members, see @ref _flexcan_interrupt_enable. + * + * @param base FlexCAN peripheral base address. + * @param mask The interrupts to disable. Logical OR of @ref _flexcan_interrupt_enable. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) || \ + (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) +static inline void FLEXCAN_DisableInterrupts(CAN_Type *base, uint64_t mask) +#else +static inline void FLEXCAN_DisableInterrupts(CAN_Type *base, uint32_t mask) +#endif +{ + uint32_t primask = DisableGlobalIRQ(); + + /* Solve Wake Up Interrupt. */ + base->MCR &= ~(uint32_t)(mask & (uint32_t)kFLEXCAN_WakeUpInterruptEnable); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) + if (0 != FSL_FEATURE_FLEXCAN_INSTANCE_HAS_FLEXIBLE_DATA_RATEn(base)) + { + /* Solve CAN FD frames data phase error interrupt. */ + base->CTRL2 &= ~(uint32_t)(mask & (uint32_t)kFLEXCAN_FDErrorInterruptEnable); + } +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) + /* Solve PN Wake Up Interrupt. */ + base->CTRL1_PN &= ~FLEXCAN_PN_STATUS_UNMASK(mask); +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + /* Solve Enhanced Rx FIFO interrupt. */ + base->ERFIER &= ~FLEXCAN_EFIFO_INT_UNMASK(mask); +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) && FSL_FEATURE_FLEXCAN_HAS_MEMORY_ERROR_CONTROL) + /* Solve Memory Error Interrupt. */ + base->MECR &= ~FLEXCAN_MECR_STATUS_UNMASK(mask); +#endif + + /* Solve interrupt enable bits in CTRL1 register. */ + base->CTRL1 &= + ~(uint32_t)(mask & ((uint32_t)kFLEXCAN_BusOffInterruptEnable | (uint32_t)kFLEXCAN_ErrorInterruptEnable | + (uint32_t)kFLEXCAN_RxWarningInterruptEnable | (uint32_t)kFLEXCAN_TxWarningInterruptEnable)); + + EnableGlobalIRQ(primask); +} + +/*! + * @brief Enables FlexCAN Message Buffer interrupts. + * + * This function enables the interrupts of given Message Buffers. + * + * @param base FlexCAN peripheral base address. + * @param mask The ORed FlexCAN Message Buffer mask. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) +static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint64_t mask) +#else +static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint32_t mask) +#endif +{ + uint32_t primask = DisableGlobalIRQ(); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + base->IMASK1 |= (uint32_t)(mask & 0xFFFFFFFFU); + base->IMASK2 |= (uint32_t)(mask >> 32); +#else + base->IMASK1 |= mask; +#endif + EnableGlobalIRQ(primask); +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) +/*! + * @brief Enables FlexCAN high 64 Message Buffer interrupts. + * + * Valid only if the number of available MBs exceeds 64. + * + * @param base FlexCAN peripheral base address. + * @param mask The ORed FlexCAN Message Buffer mask. + */ +static inline void FLEXCAN_EnableHigh64MbInterrupts(CAN_Type *base, uint64_t mask) +{ + uint32_t primask = DisableGlobalIRQ(); + +#if defined(CAN_IMASK3_BUF95TO64M_MASK) + base->IMASK3 |= (uint32_t)(mask & 0xFFFFFFFFU); +#endif +#if defined(CAN_IMASK4_BUF127TO96_MASK) + base->IMASK4 |= (uint32_t)(mask >> 32U); +#endif + EnableGlobalIRQ(primask); +} +#endif + +/*! + * @brief Disables FlexCAN Message Buffer interrupts. + * + * This function disables the interrupts of given Message Buffers. + * + * @param base FlexCAN peripheral base address. + * @param mask The ORed FlexCAN Message Buffer mask. + */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) +static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint64_t mask) +#else +static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint32_t mask) +#endif +{ + uint32_t primask = DisableGlobalIRQ(); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) + base->IMASK1 &= ~((uint32_t)(mask & 0xFFFFFFFFU)); + base->IMASK2 &= ~((uint32_t)(mask >> 32)); +#else + base->IMASK1 &= ~mask; +#endif + EnableGlobalIRQ(primask); +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) && FSL_FEATURE_FLEXCAN_HAS_MORE_THAN_64_MB) +/*! + * @brief Disables FlexCAN high 64 Message Buffer interrupts. + * + * Valid only if the number of available MBs exceeds 64. + * + * @param base FlexCAN peripheral base address. + * @param mask The ORed FlexCAN Message Buffer mask. + */ +static inline void FLEXCAN_DisableHigh64MbInterrupts(CAN_Type *base, uint64_t mask) +{ + uint32_t primask = DisableGlobalIRQ(); + +#if defined(CAN_IMASK3_BUF95TO64M_MASK) + base->IMASK3 &= ~((uint32_t)(mask & 0xFFFFFFFFU)); +#endif +#if defined(CAN_IMASK4_BUF127TO96_MASK) + base->IMASK4 &= ~((uint32_t)(mask >> 32U)); +#endif + EnableGlobalIRQ(primask); +} +#endif + +/*! @} */ + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) && FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) +/*! + * @name DMA Control + * @{ + */ + +/*! + * @brief Enables or disables the FlexCAN Rx FIFO DMA request. + * + * This function enables or disables the DMA feature of FlexCAN build-in Rx FIFO. + * + * @param base FlexCAN peripheral base address. + * @param enable true to enable, false to disable. + */ +void FLEXCAN_EnableRxFifoDMA(CAN_Type *base, bool enable); + +/*! + * @brief Gets the Rx FIFO Head address. + * + * This function returns the FlexCAN Rx FIFO Head address, which is mainly used for the DMA/eDMA use case. + * + * @param base FlexCAN peripheral base address. + * @return FlexCAN Rx FIFO Head address. + */ +static inline uintptr_t FLEXCAN_GetRxFifoHeadAddr(CAN_Type *base) +{ + return (uintptr_t) & (base->MB[0].CS); +} + +/*! @} */ +#endif /* FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA */ + +/*! + * @name Bus Operations + * @{ + */ + +/*! + * @brief Enables or disables the FlexCAN module operation. + * + * This function enables or disables the FlexCAN module. + * + * @param base FlexCAN base pointer. + * @param enable true to enable, false to disable. + */ +static inline void FLEXCAN_Enable(CAN_Type *base, bool enable) +{ + if (enable) + { + base->MCR &= ~CAN_MCR_MDIS_MASK; + + /* Wait FlexCAN exit from low-power mode. */ + while (0U != (base->MCR & CAN_MCR_LPMACK_MASK)) + { + } + } + else + { + base->MCR |= CAN_MCR_MDIS_MASK; + + /* Wait FlexCAN enter low-power mode. */ + while (0U == (base->MCR & CAN_MCR_LPMACK_MASK)) + { + } + } +} + +/*! + * @brief Writes a FlexCAN Message to the Transmit Message Buffer. + * + * This function writes a CAN Message to the specified Transmit Message Buffer + * and changes the Message Buffer state to start CAN Message transmit. After + * that the function returns immediately. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The FlexCAN Message Buffer index. + * @param pTxFrame Pointer to CAN message frame to be sent. + * @retval kStatus_Success - Write Tx Message Buffer Successfully. + * @retval kStatus_Fail - Tx Message Buffer is currently in use. + */ +status_t FLEXCAN_WriteTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_frame_t *pTxFrame); + +/*! + * @brief Reads a FlexCAN Message from Receive Message Buffer. + * + * 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. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The FlexCAN Message Buffer index. + * @param pRxFrame Pointer to CAN message frame structure for reception. + * @retval kStatus_Success - Rx Message Buffer is full and has been read successfully. + * @retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. + * @retval kStatus_Fail - Rx Message Buffer is empty. + */ +status_t FLEXCAN_ReadRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Writes a FlexCAN FD Message to the Transmit Message Buffer. + * + * This function writes a CAN FD Message to the specified Transmit Message Buffer + * and changes the Message Buffer state to start CAN FD Message transmit. After + * that the function returns immediately. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The FlexCAN FD Message Buffer index. + * @param pTxFrame Pointer to CAN FD message frame to be sent. + * @retval kStatus_Success - Write Tx Message Buffer Successfully. + * @retval kStatus_Fail - Tx Message Buffer is currently in use. + */ +status_t FLEXCAN_WriteFDTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_fd_frame_t *pTxFrame); + +/*! + * @brief Reads a FlexCAN FD Message from Receive Message Buffer. + * + * This function reads a CAN FD message from a specified Receive Message Buffer. + * The function fills a receive CAN FD message frame structure with + * just received data and activates the Message Buffer again. + * The function returns immediately. + * + * @param base FlexCAN peripheral base address. + * @param mbIdx The FlexCAN FD Message Buffer index. + * @param pRxFrame Pointer to CAN FD message frame structure for reception. + * @retval kStatus_Success - Rx Message Buffer is full and has been read successfully. + * @retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. + * @retval kStatus_Fail - Rx Message Buffer is empty. + */ +status_t FLEXCAN_ReadFDRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame); +#endif + +/*! + * @brief Reads a FlexCAN Message from Legacy Rx FIFO. + * + * This function reads a CAN message from the FlexCAN Legacy Rx FIFO. + * + * @param base FlexCAN peripheral base address. + * @param pRxFrame Pointer to CAN message frame structure for reception. + * @retval kStatus_Success - Read Message from Rx FIFO successfully. + * @retval kStatus_Fail - Rx FIFO is not enabled. + */ +status_t FLEXCAN_ReadRxFifo(CAN_Type *base, flexcan_frame_t *pRxFrame); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * @brief Reads a FlexCAN Message from Enhanced Rx FIFO. + * + * This function reads a CAN or CAN FD message from the FlexCAN Enhanced Rx FIFO. + * + * @param base FlexCAN peripheral base address. + * @param pRxFrame Pointer to CAN FD message frame structure for reception. + * @retval kStatus_Success - Read Message from Rx FIFO successfully. + * @retval kStatus_Fail - Rx FIFO is not enabled. + */ +status_t FLEXCAN_ReadEnhancedRxFifo(CAN_Type *base, flexcan_fd_frame_t *pRxFrame); +#endif + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_PN_MODE) && FSL_FEATURE_FLEXCAN_HAS_PN_MODE) +/*! + * @brief Reads a FlexCAN Message from Wake Up MB. + * + * This function reads a CAN message from the FlexCAN Wake up Message Buffers. There are four Wake up Message Buffers + * (WMBs) used to store incoming messages in Pretended Networking mode. The WMB index indicates the arrival order. The + * last message is stored in WMB3. + * + * @param base FlexCAN peripheral base address. + * @param pRxFrame Pointer to CAN message frame structure for reception. + * @param mbIdx The FlexCAN Wake up Message Buffer index. Range in 0x0 ~ 0x3. + * @retval kStatus_Success - Read Message from Wake up Message Buffer successfully. + * @retval kStatus_Fail - Wake up Message Buffer has no valid content. + */ +status_t FLEXCAN_ReadPNWakeUpMB(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame); +#endif +/*! @} */ + +/*! + * @name Transactional + * @{ + */ + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) +/*! + * @brief Performs a polling send transaction on the CAN bus. + * + * @note A transfer handle does not need to be created before calling this API. + * + * @param base FlexCAN peripheral base pointer. + * @param mbIdx The FlexCAN FD Message Buffer index. + * @param pTxFrame Pointer to CAN FD message frame to be sent. + * @retval kStatus_Success - Write Tx Message Buffer Successfully. + * @retval kStatus_Fail - Tx Message Buffer is currently in use. + */ +status_t FLEXCAN_TransferFDSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pTxFrame); + +/*! + * @brief Performs a polling receive transaction on the CAN bus. + * + * @note A transfer handle does not need to be created before calling this API. + * + * @param base FlexCAN peripheral base pointer. + * @param mbIdx The FlexCAN FD Message Buffer index. + * @param pRxFrame Pointer to CAN FD message frame structure for reception. + * @retval kStatus_Success - Rx Message Buffer is full and has been read successfully. + * @retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. + * @retval kStatus_Fail - Rx Message Buffer is empty. + */ +status_t FLEXCAN_TransferFDReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *pRxFrame); + +/*! + * @brief Sends a message using IRQ. + * + * This function sends a message using IRQ. This is a non-blocking function, which returns + * right away. When messages have been sent out, the send callback function is called. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param pMbXfer FlexCAN FD Message Buffer transfer structure. See the #flexcan_mb_transfer_t. + * @retval kStatus_Success Start Tx Message Buffer sending process successfully. + * @retval kStatus_Fail Write Tx Message Buffer failed. + * @retval kStatus_FLEXCAN_TxBusy Tx Message Buffer is in use. + */ +status_t FLEXCAN_TransferFDSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer); + +/*! + * @brief Receives a message using IRQ. + * + * This function receives a message using IRQ. This is non-blocking function, which returns + * right away. When the message has been received, the receive callback function is called. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param pMbXfer FlexCAN FD Message Buffer transfer structure. See the #flexcan_mb_transfer_t. + * @retval kStatus_Success - Start Rx Message Buffer receiving process successfully. + * @retval kStatus_FLEXCAN_RxBusy - Rx Message Buffer is in use. + */ +status_t FLEXCAN_TransferFDReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer); + +/*! + * @brief Aborts the interrupt driven message send process. + * + * This function aborts the interrupt driven message send process. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param mbIdx The FlexCAN FD Message Buffer index. + */ +void FLEXCAN_TransferFDAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx); + +/*! + * @brief Aborts the interrupt driven message receive process. + * + * This function aborts the interrupt driven message receive process. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param mbIdx The FlexCAN FD Message Buffer index. + */ +void FLEXCAN_TransferFDAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx); +#endif + +/*! + * @brief Performs a polling send transaction on the CAN bus. + * + * @note A transfer handle does not need to be created before calling this API. + * + * @param base FlexCAN peripheral base pointer. + * @param mbIdx The FlexCAN Message Buffer index. + * @param pTxFrame Pointer to CAN message frame to be sent. + * @retval kStatus_Success - Write Tx Message Buffer Successfully. + * @retval kStatus_Fail - Tx Message Buffer is currently in use. + */ +status_t FLEXCAN_TransferSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pTxFrame); + +/*! + * @brief Performs a polling receive transaction on the CAN bus. + * + * @note A transfer handle does not need to be created before calling this API. + * + * @param base FlexCAN peripheral base pointer. + * @param mbIdx The FlexCAN Message Buffer index. + * @param pRxFrame Pointer to CAN message frame structure for reception. + * @retval kStatus_Success - Rx Message Buffer is full and has been read successfully. + * @retval kStatus_FLEXCAN_RxOverflow - Rx Message Buffer is already overflowed and has been read successfully. + * @retval kStatus_Fail - Rx Message Buffer is empty. + */ +status_t FLEXCAN_TransferReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *pRxFrame); + +/*! + * @brief Performs a polling receive transaction from Legacy Rx FIFO on the CAN bus. + * + * @note A transfer handle does not need to be created before calling this API. + * + * @param base FlexCAN peripheral base pointer. + * @param pRxFrame Pointer to CAN message frame structure for reception. + * @retval kStatus_Success - Read Message from Rx FIFO successfully. + * @retval kStatus_Fail - Rx FIFO is not enabled. + */ +status_t FLEXCAN_TransferReceiveFifoBlocking(CAN_Type *base, flexcan_frame_t *pRxFrame); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * @brief Performs a polling receive transaction from Enhanced Rx FIFO on the CAN bus. + * + * @note A transfer handle does not need to be created before calling this API. + * + * @param base FlexCAN peripheral base pointer. + * @param pRxFrame Pointer to CAN FD message frame structure for reception. + * @retval kStatus_Success - Read Message from Rx FIFO successfully. + * @retval kStatus_Fail - Rx FIFO is not enabled. + */ +status_t FLEXCAN_TransferReceiveEnhancedFifoBlocking(CAN_Type *base, flexcan_fd_frame_t *pRxFrame); +#endif + +/*! + * @brief Initializes the FlexCAN handle. + * + * This function initializes the FlexCAN handle, which can be used for other FlexCAN + * transactional APIs. Usually, for a specified FlexCAN instance, + * call this API once to get the initialized handle. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param callback The callback function. + * @param userData The parameter of the callback function. + */ +void FLEXCAN_TransferCreateHandle(CAN_Type *base, + flexcan_handle_t *handle, + flexcan_transfer_callback_t callback, + void *userData); + +/*! + * @brief Sends a message using IRQ. + * + * This function sends a message using IRQ. This is a non-blocking function, which returns + * right away. When messages have been sent out, the send callback function is called. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param pMbXfer FlexCAN Message Buffer transfer structure. See the #flexcan_mb_transfer_t. + * @retval kStatus_Success Start Tx Message Buffer sending process successfully. + * @retval kStatus_Fail Write Tx Message Buffer failed. + * @retval kStatus_FLEXCAN_TxBusy Tx Message Buffer is in use. + */ +status_t FLEXCAN_TransferSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer); + +/*! + * @brief Receives a message using IRQ. + * + * This function receives a message using IRQ. This is non-blocking function, which returns + * right away. When the message has been received, the receive callback function is called. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param pMbXfer FlexCAN Message Buffer transfer structure. See the #flexcan_mb_transfer_t. + * @retval kStatus_Success - Start Rx Message Buffer receiving process successfully. + * @retval kStatus_FLEXCAN_RxBusy - Rx Message Buffer is in use. + */ +status_t FLEXCAN_TransferReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *pMbXfer); + +/*! + * @brief Receives a message from Rx FIFO using IRQ. + * + * This function receives a message using IRQ. This is a non-blocking function, which returns + * right away. When all messages have been received, the receive callback function is called. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param pFifoXfer FlexCAN Rx FIFO transfer structure. See the @ref flexcan_fifo_transfer_t. + * @retval kStatus_Success - Start Rx FIFO receiving process successfully. + * @retval kStatus_FLEXCAN_RxFifoBusy - Rx FIFO is currently in use. + */ +status_t FLEXCAN_TransferReceiveFifoNonBlocking(CAN_Type *base, + flexcan_handle_t *handle, + flexcan_fifo_transfer_t *pFifoXfer); + +/*! + * @brief Gets the Legacy Rx Fifo transfer status during a interrupt non-blocking receive. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param count Number of CAN messages receive so far by the non-blocking transaction. + * @retval kStatus_InvalidArgument count is Invalid. + * @retval kStatus_Success Successfully return the count. + */ + +status_t FLEXCAN_TransferGetReceiveFifoCount(CAN_Type *base, flexcan_handle_t *handle, size_t *count); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * @brief Receives a message from Enhanced Rx FIFO using IRQ. + * + * This function receives a message using IRQ. This is a non-blocking function, which returns + * right away. When all messages have been received, the receive callback function is called. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param pFifoXfer FlexCAN Rx FIFO transfer structure. See the ref flexcan_fifo_transfer_t.@ + * @retval kStatus_Success - Start Rx FIFO receiving process successfully. + * @retval kStatus_FLEXCAN_RxFifoBusy - Rx FIFO is currently in use. + */ +status_t FLEXCAN_TransferReceiveEnhancedFifoNonBlocking(CAN_Type *base, + flexcan_handle_t *handle, + flexcan_fifo_transfer_t *pFifoXfer); + +/*! + * @brief Gets the Enhanced Rx Fifo transfer status during a interrupt non-blocking receive. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param count Number of CAN messages receive so far by the non-blocking transaction. + * @retval kStatus_InvalidArgument count is Invalid. + * @retval kStatus_Success Successfully return the count. + */ + +static inline status_t FLEXCAN_TransferGetReceiveEnhancedFifoCount(CAN_Type *base, + flexcan_handle_t *handle, + size_t *count) +{ + return FLEXCAN_TransferGetReceiveFifoCount(base, handle, count); +} +#endif + +/*! + * @brief Gets the detail index of Mailbox's Timestamp by handle. + * + * Then function can only be used when calling non-blocking Data transfer (TX/RX) API, + * After TX/RX data transfer done (User can get the status by handler's callback function), + * we can get the detail index of Mailbox's timestamp by handle, + * Detail non-blocking data transfer API (TX/RX) contain. + * -FLEXCAN_TransferSendNonBlocking + * -FLEXCAN_TransferFDSendNonBlocking + * -FLEXCAN_TransferReceiveNonBlocking + * -FLEXCAN_TransferFDReceiveNonBlocking + * -FLEXCAN_TransferReceiveFifoNonBlocking + * + * @param handle FlexCAN handle pointer. + * @param mbIdx The FlexCAN Message Buffer index. + * @retval the index of mailbox 's timestamp stored in the handle. + * + */ +uint32_t FLEXCAN_GetTimeStamp(flexcan_handle_t *handle, uint8_t mbIdx); + +/*! + * @brief Aborts the interrupt driven message send process. + * + * This function aborts the interrupt driven message send process. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param mbIdx The FlexCAN Message Buffer index. + */ +void FLEXCAN_TransferAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx); + +/*! + * @brief Aborts the interrupt driven message receive process. + * + * This function aborts the interrupt driven message receive process. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param mbIdx The FlexCAN Message Buffer index. + */ +void FLEXCAN_TransferAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx); + +/*! + * @brief Aborts the interrupt driven message receive from Rx FIFO process. + * + * This function aborts the interrupt driven message receive from Rx FIFO process. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + */ +void FLEXCAN_TransferAbortReceiveFifo(CAN_Type *base, flexcan_handle_t *handle); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * @brief Aborts the interrupt driven message receive from Enhanced Rx FIFO process. + * + * This function aborts the interrupt driven message receive from Enhanced Rx FIFO process. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + */ +void FLEXCAN_TransferAbortReceiveEnhancedFifo(CAN_Type *base, flexcan_handle_t *handle); +#endif + +/*! + * @brief FlexCAN IRQ handle function. + * + * This function handles the FlexCAN Error, the Message Buffer, and the Rx FIFO IRQ request. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + */ +void FLEXCAN_TransferHandleIRQ(CAN_Type *base, flexcan_handle_t *handle); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_FLEXCAN_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan_edma.c new file mode 100644 index 00000000000..a5f68487f31 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan_edma.c @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexcan_edma.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexcan_edma" +#endif + +/*base->ERFCR & CAN_ERFCR_ERFEN_MASK)) + { + framefd = flexcanPrivateHandle->handle->framefd; + for (uint32_t i = 0; i < flexcanPrivateHandle->handle->frameNum; i++) + { + /* Enhanced Rx FIFO ID HIT offset is changed dynamically according to data length code (DLC) . */ + idHitIndex = (DLC_LENGTH_DECODE(framefd->length) + 3U) / 4U; + framefd->idhit = framefd->dataWord[idHitIndex]; + /* Clear the unused frame data. */ + for (uint32_t j = idHitIndex; j < 16U; j++) + { + framefd->dataWord[j] = 0x0U; + } + framefd++; + } + } +#endif + /* Disable transfer. */ + FLEXCAN_TransferAbortReceiveFifoEDMA(flexcanPrivateHandle->base, flexcanPrivateHandle->handle); + + if (NULL != flexcanPrivateHandle->handle->callback) + { + flexcanPrivateHandle->handle->callback(flexcanPrivateHandle->base, flexcanPrivateHandle->handle, + kStatus_FLEXCAN_RxFifoIdle, flexcanPrivateHandle->handle->userData); + } + } +} + +/*! + * brief Initializes the FlexCAN handle, which is used in transactional functions. + * + * param base FlexCAN peripheral base address. + * param handle Pointer to flexcan_edma_handle_t structure. + * param callback The callback function. + * param userData The parameter of the callback function. + * param rxFifoEdmaHandle User-requested DMA handle for Rx FIFO DMA transfer. + */ +void FLEXCAN_TransferCreateHandleEDMA(CAN_Type *base, + flexcan_edma_handle_t *handle, + flexcan_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *rxFifoEdmaHandle) +{ + assert(NULL != handle); + + uint32_t instance = FLEXCAN_GetInstance(base); + s_flexcanEdmaPrivateHandle[instance].base = base; + s_flexcanEdmaPrivateHandle[instance].handle = handle; + + (void)memset(handle, 0, sizeof(flexcan_edma_handle_t)); + + handle->rxFifoState = (uint8_t)KFLEXCAN_RxFifoIdle; + handle->rxFifoEdmaHandle = rxFifoEdmaHandle; + + /* Register Callback. */ + handle->callback = callback; + handle->userData = userData; + + /* Configure Legacy/Enhanced Rx FIFO DMA callback. */ + EDMA_SetCallback(handle->rxFifoEdmaHandle, FLEXCAN_ReceiveFifoEDMACallback, &s_flexcanEdmaPrivateHandle[instance]); +} + +/*! + * brief Prepares the eDMA transfer configuration for FLEXCAN Legacy RX FIFO. + * + * This function prepares the eDMA transfer configuration structure according to FLEXCAN Legacy RX FIFO. + * + * param base FlexCAN peripheral base address. + * param pFifoXfer FlexCAN Rx FIFO EDMA transfer structure, see #flexcan_fifo_transfer_t. + * param pEdmaConfig The user configuration structure of type edma_transfer_t. + * + */ +void FLEXCAN_PrepareTransfConfiguration(CAN_Type *base, + flexcan_fifo_transfer_t *pFifoXfer, + edma_transfer_config_t *pEdmaConfig) +{ + assert(NULL != pFifoXfer); + assert(NULL != pFifoXfer->frame); + assert(NULL != pEdmaConfig); + + flexcan_frame_t *fifoAddr = (flexcan_frame_t *)FLEXCAN_GetRxFifoHeadAddr(base); + +#if (defined(FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) && FSL_FEATURE_EDMA_SUPPORT_16_BYTES_TRANSFER) + EDMA_PrepareTransfer(pEdmaConfig, (void *)fifoAddr, sizeof(flexcan_frame_t), (void *)pFifoXfer->frame, + sizeof(uint32_t), sizeof(flexcan_frame_t), sizeof(flexcan_frame_t) * pFifoXfer->frameNum, + kEDMA_PeripheralToMemory); +#else + /* The Data Size of FLEXCAN Legacy RX FIFO output port is 16 Bytes, but lots of chips not support 16Bytes width DMA + * transfer. These chips always support 4Byte width memory transfer, so we need prepare Memory to Memory mode by 4 + * Bytes width mode. + */ + EDMA_PrepareTransfer(pEdmaConfig, (void *)fifoAddr, 4U, (void *)pFifoXfer->frame, sizeof(uint32_t), + sizeof(flexcan_frame_t), sizeof(flexcan_frame_t) * pFifoXfer->frameNum, kEDMA_MemoryToMemory); +#endif +} + +/*! + * brief Start Transfer Data from the FLEXCAN Legacy Rx FIFO using eDMA. + * + * This function to Update edma transfer confiugration and Start eDMA transfer + * + * param base FlexCAN peripheral base address. + * param handle Pointer to flexcan_edma_handle_t structure. + * param pEdmaConfig The user configuration structure of type edma_transfer_t. + * retval kStatus_Success if succeed, others failed. + * retval kStatus_FLEXCAN_RxFifoBusy Previous transfer ongoing. + */ +status_t FLEXCAN_StartTransferDatafromRxFIFO(CAN_Type *base, + flexcan_edma_handle_t *handle, + edma_transfer_config_t *pEdmaConfig) +{ + assert(NULL != handle->rxFifoEdmaHandle); + assert(NULL != pEdmaConfig); + status_t status; + + /* If previous Rx FIFO receive not finished. */ + if ((uint8_t)KFLEXCAN_RxFifoBusy == handle->rxFifoState) + { + status = kStatus_FLEXCAN_RxFifoBusy; + } + else + { + handle->rxFifoState = (uint8_t)KFLEXCAN_RxFifoBusy; + + /* Enable FlexCAN Rx FIFO EDMA. */ + FLEXCAN_EnableRxFifoDMA(base, true); + + /* Submit configuration. */ + (void)EDMA_SubmitTransfer(handle->rxFifoEdmaHandle, (const edma_transfer_config_t *)pEdmaConfig); + EDMA_SetModulo(handle->rxFifoEdmaHandle->base, handle->rxFifoEdmaHandle->channel, kEDMA_Modulo16bytes, + kEDMA_ModuloDisable); + /* Start transfer. */ + EDMA_StartTransfer(handle->rxFifoEdmaHandle); + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Receives the CAN Messages from the Legacy Rx FIFO using eDMA. + * + * This function receives the CAN Message using eDMA. This is a non-blocking function, which returns + * right away. After the CAN Message is received, the receive callback function is called. + * + * param base FlexCAN peripheral base address. + * param handle Pointer to flexcan_edma_handle_t structure. + * param pFifoXfer FlexCAN Rx FIFO EDMA transfer structure, see #flexcan_fifo_transfer_t. + * retval kStatus_Success if succeed, others failed. + * retval kStatus_FLEXCAN_RxFifoBusy Previous transfer ongoing. + */ +status_t FLEXCAN_TransferReceiveFifoEDMA(CAN_Type *base, + flexcan_edma_handle_t *handle, + flexcan_fifo_transfer_t *pFifoXfer) +{ + assert(NULL != handle->rxFifoEdmaHandle); + assert(NULL != pFifoXfer->frame); + + edma_transfer_config_t dmaXferConfig = {0}; + status_t status; + + handle->frameNum = pFifoXfer->frameNum; + /* Prepare transfer. */ + FLEXCAN_PrepareTransfConfiguration(base, pFifoXfer, &dmaXferConfig); + + /* Submit configuration and start edma transfer. */ + status = FLEXCAN_StartTransferDatafromRxFIFO(base, handle, &dmaXferConfig); + + return status; +} + +/*! + * brief Gets the Legacy Rx Fifo transfer status during a interrupt non-blocking receive. + * + * param base FlexCAN peripheral base address. + * param handle FlexCAN handle pointer. + * param count Number of CAN messages receive so far by the non-blocking transaction. + * retval kStatus_InvalidArgument count is Invalid. + * retval kStatus_Success Successfully return the count. + */ + +status_t FLEXCAN_TransferGetReceiveFifoCountEMDA(CAN_Type *base, flexcan_edma_handle_t *handle, size_t *count) +{ + assert(NULL != handle); + + status_t result = kStatus_Success; + + if (handle->rxFifoState == (uint32_t)KFLEXCAN_RxFifoIdle) + { + result = kStatus_NoTransferInProgress; + } + else + { + *count = handle->frameNum - + EDMA_GetRemainingMajorLoopCount(handle->rxFifoEdmaHandle->base, handle->rxFifoEdmaHandle->channel); + } + + return result; +} + +/*! + * brief Aborts the receive Legacy/Enhanced Rx FIFO process which used eDMA. + * + * This function aborts the receive Legacy/Enhanced Rx FIFO process which used eDMA. + * + * param base FlexCAN peripheral base address. + * param handle Pointer to flexcan_edma_handle_t structure. + */ +void FLEXCAN_TransferAbortReceiveFifoEDMA(CAN_Type *base, flexcan_edma_handle_t *handle) +{ + assert(NULL != handle->rxFifoEdmaHandle); + + /* Stop transfer. */ + EDMA_AbortTransfer(handle->rxFifoEdmaHandle); + + handle->rxFifoState = (uint8_t)KFLEXCAN_RxFifoIdle; +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + handle->framefd = NULL; +#endif + handle->frameNum = 0U; + /* Disable FlexCAN Legacy/Enhanced Rx FIFO EDMA. */ + FLEXCAN_EnableRxFifoDMA(base, false); +} + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * brief Receives the CAN FD Message from the Enhanced Rx FIFO using eDMA. + * + * This function receives the CAN FD Message using eDMA. This is a non-blocking function, which returns + * right away. After the CAN Message is received, the receive callback function is called. + * + * param base FlexCAN peripheral base address. + * param handle Pointer to flexcan_edma_handle_t structure. + * param pFifoXfer FlexCAN Rx FIFO EDMA transfer structure, see #flexcan_fifo_transfer_t. + * retval kStatus_Success if succeed, others failed. + * retval kStatus_FLEXCAN_RxFifoBusy Previous transfer ongoing. + * retval kStatus_InvalidArgument The watermark configuration is invalid, the watermark need be set to + 1 to do successfully EDMA transfer with this API. + */ +status_t FLEXCAN_TransferReceiveEnhancedFifoEDMA(CAN_Type *base, + flexcan_edma_handle_t *handle, + flexcan_fifo_transfer_t *pFifoXfer) +{ + assert(NULL != handle->rxFifoEdmaHandle); + assert(NULL != pFifoXfer->framefd); + + edma_transfer_config_t dmaXferConfig; + edma_minor_offset_config_t dmaMinorOffsetConfig; + status_t status; + flexcan_fd_frame_t *fifoAddr = (flexcan_fd_frame_t *)E_RX_FIFO(base); + uint32_t perReadWords = ((base->ERFCR & CAN_ERFCR_DMALW_MASK) >> CAN_ERFCR_DMALW_SHIFT) + 1U; + uint32_t watermark = ((base->ERFCR & CAN_ERFCR_ERFWM_MASK) >> CAN_ERFCR_ERFWM_SHIFT) + 1U; + + /* If previous Rx FIFO receive not finished. */ + if ((uint8_t)KFLEXCAN_RxFifoBusy == handle->rxFifoState) + { + status = kStatus_FLEXCAN_RxFifoBusy; + } + else + { + handle->frameNum = pFifoXfer->frameNum; + handle->framefd = pFifoXfer->framefd; + /*!< To reduce the complexity of DMA software configuration, need to set watermark to 1 to make that each DMA + request read once Rx FIFO. Because a DMA transfer cannot be dynamically changed, Number of words read per + transfer (ERFCR[DMALW] + 1) should be programmed so that the Enhanced Rx FIFO element can store the largest + CAN message present on the CAN bus. */ + if ((watermark != 1U) || ((sizeof(uint32_t) * perReadWords) != sizeof(flexcan_fd_frame_t))) + { + return kStatus_InvalidArgument; + } + + /* Prepare transfer. */ + EDMA_PrepareTransfer( + &dmaXferConfig, (void *)fifoAddr, sizeof(uint32_t), (void *)pFifoXfer->framefd, sizeof(uint32_t), + sizeof(uint32_t) * perReadWords, /* minor loop bytes : 4* perReadWords */ + sizeof(uint32_t) * perReadWords * handle->frameNum, /* major loop counts : handle->frameNum */ + kEDMA_MemoryToMemory); + /* Submit configuration. */ + (void)EDMA_SubmitTransfer(handle->rxFifoEdmaHandle, &dmaXferConfig); + + dmaMinorOffsetConfig.enableDestMinorOffset = false; + dmaMinorOffsetConfig.enableSrcMinorOffset = true; + dmaMinorOffsetConfig.minorOffset = 128U - sizeof(uint32_t) * perReadWords; + EDMA_SetMinorOffsetConfig(handle->rxFifoEdmaHandle->base, handle->rxFifoEdmaHandle->channel, + &dmaMinorOffsetConfig); + + EDMA_SetModulo(handle->rxFifoEdmaHandle->base, handle->rxFifoEdmaHandle->channel, kEDMA_Modulo128bytes, + kEDMA_ModuloDisable); + + handle->rxFifoState = (uint8_t)KFLEXCAN_RxFifoBusy; + + /* Enable FlexCAN Rx FIFO EDMA. */ + FLEXCAN_EnableRxFifoDMA(base, true); + /* Start transfer. */ + EDMA_StartTransfer(handle->rxFifoEdmaHandle); + + status = kStatus_Success; + } + + return status; +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan_edma.h new file mode 100644 index 00000000000..90d78ef6690 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexcan_edma.h @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_FLEXCAN_EDMA_H_ +#define FSL_FLEXCAN_EDMA_H_ + +#include "fsl_flexcan.h" +#include "fsl_edma.h" + +/*! + * @addtogroup flexcan_edma_driver + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FlexCAN EDMA driver version. */ +#define FSL_FLEXCAN_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 11, 3)) +/*! @} */ + +/* Forward declaration of the handle typedef. */ +typedef struct _flexcan_edma_handle flexcan_edma_handle_t; + +/*! @brief FlexCAN transfer callback function. */ +typedef void (*flexcan_edma_transfer_callback_t)(CAN_Type *base, + flexcan_edma_handle_t *handle, + status_t status, + void *userData); + +/*! + * @brief FlexCAN eDMA handle + */ +struct _flexcan_edma_handle +{ + flexcan_edma_transfer_callback_t callback; /*!< Callback function. */ + void *userData; /*!< FlexCAN callback function parameter.*/ + edma_handle_t *rxFifoEdmaHandle; /*!< The EDMA handler for Rx FIFO. */ + volatile uint8_t rxFifoState; /*!< Rx FIFO transfer state. */ + size_t frameNum; /*!< The number of messages that need to be received. */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) + flexcan_fd_frame_t *framefd; /*!< Point to the buffer of CAN Message to be received from Enhanced Rx FIFO. */ +#endif +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name eDMA transactional + * @{ + */ + +/*! + * @brief Initializes the FlexCAN handle, which is used in transactional functions. + * + * @param base FlexCAN peripheral base address. + * @param handle Pointer to flexcan_edma_handle_t structure. + * @param callback The callback function. + * @param userData The parameter of the callback function. + * @param rxFifoEdmaHandle User-requested DMA handle for Rx FIFO DMA transfer. + */ +void FLEXCAN_TransferCreateHandleEDMA(CAN_Type *base, + flexcan_edma_handle_t *handle, + flexcan_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *rxFifoEdmaHandle); + +/*! + * @brief Prepares the eDMA transfer configuration for FLEXCAN Legacy RX FIFO. + * + * This function prepares the eDMA transfer configuration structure according to FLEXCAN Legacy RX FIFO. + * + * @param base FlexCAN peripheral base address. + * @param pFifoXfer FlexCAN Rx FIFO EDMA transfer structure, see #flexcan_fifo_transfer_t. + * @param pEdmaConfig The user configuration structure of type edma_transfer_t. + * + */ +void FLEXCAN_PrepareTransfConfiguration(CAN_Type *base, + flexcan_fifo_transfer_t *pFifoXfer, + edma_transfer_config_t *pEdmaConfig); + +/*! + * @brief Start Transfer Data from the FLEXCAN Legacy Rx FIFO using eDMA. + * + * This function to Update edma transfer confiugration and Start eDMA transfer + * + * @param base FlexCAN peripheral base address. + * @param handle Pointer to flexcan_edma_handle_t structure. + * @param pEdmaConfig The user configuration structure of type edma_transfer_t. + * @retval kStatus_Success if succeed, others failed. + * @retval kStatus_FLEXCAN_RxFifoBusy Previous transfer ongoing. + */ +status_t FLEXCAN_StartTransferDatafromRxFIFO(CAN_Type *base, + flexcan_edma_handle_t *handle, + edma_transfer_config_t *pEdmaConfig); + +/*! + * @brief Receives the CAN Message from the Legacy Rx FIFO using eDMA. + * + * This function receives the CAN Message using eDMA. This is a non-blocking function, which returns + * right away. After the CAN Message is received, the receive callback function is called. + * + * @param base FlexCAN peripheral base address. + * @param handle Pointer to flexcan_edma_handle_t structure. + * @param pFifoXfer FlexCAN Rx FIFO EDMA transfer structure, see #flexcan_fifo_transfer_t. + * @retval kStatus_Success if succeed, others failed. + * @retval kStatus_FLEXCAN_RxFifoBusy Previous transfer ongoing. + */ +status_t FLEXCAN_TransferReceiveFifoEDMA(CAN_Type *base, + flexcan_edma_handle_t *handle, + flexcan_fifo_transfer_t *pFifoXfer); +/*! + * @brief Gets the Legacy Rx Fifo transfer status during a interrupt non-blocking receive. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param count Number of CAN messages receive so far by the non-blocking transaction. + * @retval kStatus_InvalidArgument count is Invalid. + * @retval kStatus_Success Successfully return the count. + */ + +status_t FLEXCAN_TransferGetReceiveFifoCountEMDA(CAN_Type *base, flexcan_edma_handle_t *handle, size_t *count); +/*! + * @brief Aborts the receive Legacy/Enhanced Rx FIFO process which used eDMA. + * + * This function aborts the receive Legacy/Enhanced Rx FIFO process which used eDMA. + * + * @param base FlexCAN peripheral base address. + * @param handle Pointer to flexcan_edma_handle_t structure. + */ +void FLEXCAN_TransferAbortReceiveFifoEDMA(CAN_Type *base, flexcan_edma_handle_t *handle); + +#if (defined(FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) && FSL_FEATURE_FLEXCAN_HAS_ENHANCED_RX_FIFO) +/*! + * @brief Receives the CAN FD Message from the Enhanced Rx FIFO using eDMA. + * + * This function receives the CAN FD Message using eDMA. This is a non-blocking function, which returns + * right away. After the CAN Message is received, the receive callback function is called. + * + * @param base FlexCAN peripheral base address. + * @param handle Pointer to flexcan_edma_handle_t structure. + * @param pFifoXfer FlexCAN Rx FIFO EDMA transfer structure, see #flexcan_fifo_transfer_t. + * @retval kStatus_Success if succeed, others failed. + * @retval kStatus_FLEXCAN_RxFifoBusy Previous transfer ongoing. + */ +status_t FLEXCAN_TransferReceiveEnhancedFifoEDMA(CAN_Type *base, + flexcan_edma_handle_t *handle, + flexcan_fifo_transfer_t *pFifoXfer); +/*! + * @brief Gets the Enhanced Rx Fifo transfer status during a interrupt non-blocking receive. + * + * @param base FlexCAN peripheral base address. + * @param handle FlexCAN handle pointer. + * @param count Number of CAN messages receive so far by the non-blocking transaction. + * @retval kStatus_InvalidArgument count is Invalid. + * @retval kStatus_Success Successfully return the count. + */ + +static inline status_t FLEXCAN_TransferGetReceiveEnhancedFifoCountEMDA(CAN_Type *base, + flexcan_edma_handle_t *handle, + size_t *count) +{ + return FLEXCAN_TransferGetReceiveFifoCountEMDA(base, handle, count); +} +#endif + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_FLEXCAN_EDMA_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio.c new file mode 100644 index 00000000000..52741f2a4de --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio.c @@ -0,0 +1,511 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexio" +#endif + +/*< @brief user configurable flexio handle count. */ +#define FLEXIO_HANDLE_COUNT 2 + +#if defined(FLEXIO_RSTS) +#define FLEXIO_RESETS_ARRAY FLEXIO_RSTS +#elif defined(FLEXIO_RSTS_N) +#define FLEXIO_RESETS_ARRAY FLEXIO_RSTS_N +#endif + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to flexio bases for each instance. */ +FLEXIO_Type *const s_flexioBases[] = FLEXIO_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to flexio clocks for each instance. */ +const clock_ip_name_t s_flexioClocks[] = FLEXIO_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +/*< @brief pointer to array of FLEXIO handle. */ +static void *s_flexioHandle[FLEXIO_HANDLE_COUNT]; + +/*< @brief pointer to array of FLEXIO IP types. */ +static void *s_flexioType[FLEXIO_HANDLE_COUNT]; + +/*< @brief pointer to array of FLEXIO Isr. */ +static flexio_isr_t s_flexioIsr[FLEXIO_HANDLE_COUNT]; + +/* FlexIO common IRQ Handler. */ +static void FLEXIO_CommonIRQHandler(void); + +#if defined(FLEXIO_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_flexioResets[] = FLEXIO_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Codes + ******************************************************************************/ + +/*! + * brief Get instance number for FLEXIO module. + * + * param base FLEXIO peripheral base address. + */ +uint32_t FLEXIO_GetInstance(FLEXIO_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_flexioBases); instance++) + { + if (s_flexioBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_flexioBases)); + + return instance; +} + +/*! + * brief Configures the FlexIO with a FlexIO configuration. The configuration structure + * can be filled by the user or be set with default values by FLEXIO_GetDefaultConfig(). + * + * Example + code + flexio_config_t config = { + .enableFlexio = true, + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false + }; + FLEXIO_Configure(base, &config); + endcode + * + * param base FlexIO peripheral base address + * param userConfig pointer to flexio_config_t structure +*/ +void FLEXIO_Init(FLEXIO_Type *base, const flexio_config_t *userConfig) +{ + uint32_t ctrlReg = 0; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + CLOCK_EnableClock(s_flexioClocks[FLEXIO_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(FLEXIO_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_flexioResets[FLEXIO_GetInstance(base)]); +#endif + + FLEXIO_Reset(base); + + ctrlReg = base->CTRL; + ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); + ctrlReg |= (FLEXIO_CTRL_DBGE(userConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(userConfig->enableFastAccess) | + FLEXIO_CTRL_FLEXEN(userConfig->enableFlexio)); + if (!userConfig->enableInDoze) + { + ctrlReg |= FLEXIO_CTRL_DOZEN_MASK; + } + + base->CTRL = ctrlReg; +} + +/*! + * brief Gates the FlexIO clock. Call this API to stop the FlexIO clock. + * + * note After calling this API, call the FLEXO_Init to use the FlexIO module. + * + * param base FlexIO peripheral base address + */ +void FLEXIO_Deinit(FLEXIO_Type *base) +{ + FLEXIO_Enable(base, false); +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + CLOCK_DisableClock(s_flexioClocks[FLEXIO_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * brief Gets the default configuration to configure the FlexIO module. The configuration + * can used directly to call the FLEXIO_Configure(). + * + * Example: + code + flexio_config_t config; + FLEXIO_GetDefaultConfig(&config); + endcode + * + * param userConfig pointer to flexio_config_t structure +*/ +void FLEXIO_GetDefaultConfig(flexio_config_t *userConfig) +{ + assert(userConfig != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(userConfig, 0, sizeof(*userConfig)); + + userConfig->enableFlexio = true; + userConfig->enableInDoze = false; + userConfig->enableInDebug = true; + userConfig->enableFastAccess = false; +} + +/*! + * brief Resets the FlexIO module. + * + * param base FlexIO peripheral base address + */ +void FLEXIO_Reset(FLEXIO_Type *base) +{ + /*do software reset, software reset operation affect all other FLEXIO registers except CTRL*/ + base->CTRL |= FLEXIO_CTRL_SWRST_MASK; + base->CTRL = 0; +} + +/*! + * brief Gets the shifter buffer address for the DMA transfer usage. + * + * param base FlexIO peripheral base address + * param type Shifter type of flexio_shifter_buffer_type_t + * param index Shifter index + * return Corresponding shifter buffer index + */ +uint32_t FLEXIO_GetShifterBufferAddress(FLEXIO_Type *base, flexio_shifter_buffer_type_t type, uint8_t index) +{ + assert(index < FLEXIO_SHIFTBUF_COUNT); + + uint32_t address = 0; + + switch (type) + { + case kFLEXIO_ShifterBuffer: + address = (uint32_t) & (base->SHIFTBUF[index]); + break; + + case kFLEXIO_ShifterBufferBitSwapped: + address = (uint32_t) & (base->SHIFTBUFBIS[index]); + break; + + case kFLEXIO_ShifterBufferByteSwapped: + address = (uint32_t) & (base->SHIFTBUFBYS[index]); + break; + + case kFLEXIO_ShifterBufferBitByteSwapped: + address = (uint32_t) & (base->SHIFTBUFBBS[index]); + break; + +#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP + case kFLEXIO_ShifterBufferNibbleByteSwapped: + address = (uint32_t) & (base->SHIFTBUFNBS[index]); + break; + +#endif +#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP + case kFLEXIO_ShifterBufferHalfWordSwapped: + address = (uint32_t) & (base->SHIFTBUFHWS[index]); + break; + +#endif +#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP + case kFLEXIO_ShifterBufferNibbleSwapped: + address = (uint32_t) & (base->SHIFTBUFNIS[index]); + break; + +#endif + default: + address = (uint32_t) & (base->SHIFTBUF[index]); + break; + } + return address; +} + +/*! + * brief Configures the shifter with the shifter configuration. The configuration structure + * covers both the SHIFTCTL and SHIFTCFG registers. To configure the shifter to the proper + * mode, select which timer controls the shifter to shift, whether to generate start bit/stop + * bit, and the polarity of start bit and stop bit. + * + * Example + code + flexio_shifter_config_t config = { + .timerSelect = 0, + .timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive, + .pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection, + .pinPolarity = kFLEXIO_PinActiveLow, + .shifterMode = kFLEXIO_ShifterModeTransmit, + .inputSource = kFLEXIO_ShifterInputFromPin, + .shifterStop = kFLEXIO_ShifterStopBitHigh, + .shifterStart = kFLEXIO_ShifterStartBitLow + }; + FLEXIO_SetShifterConfig(base, &config); + endcode + * + * param base FlexIO peripheral base address + * param index Shifter index + * param shifterConfig Pointer to flexio_shifter_config_t structure +*/ +void FLEXIO_SetShifterConfig(FLEXIO_Type *base, uint8_t index, const flexio_shifter_config_t *shifterConfig) +{ + base->SHIFTCFG[index] = FLEXIO_SHIFTCFG_INSRC(shifterConfig->inputSource) +#if FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH + | FLEXIO_SHIFTCFG_PWIDTH(shifterConfig->parallelWidth) +#endif /* FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH */ + | FLEXIO_SHIFTCFG_SSTOP(shifterConfig->shifterStop) | + FLEXIO_SHIFTCFG_SSTART(shifterConfig->shifterStart); + + base->SHIFTCTL[index] = + FLEXIO_SHIFTCTL_TIMSEL(shifterConfig->timerSelect) | FLEXIO_SHIFTCTL_TIMPOL(shifterConfig->timerPolarity) | + FLEXIO_SHIFTCTL_PINCFG(shifterConfig->pinConfig) | FLEXIO_SHIFTCTL_PINSEL(shifterConfig->pinSelect) | + FLEXIO_SHIFTCTL_PINPOL(shifterConfig->pinPolarity) | FLEXIO_SHIFTCTL_SMOD(shifterConfig->shifterMode); +} + +/*! + * brief Configures the timer with the timer configuration. The configuration structure + * covers both the TIMCTL and TIMCFG registers. To configure the timer to the proper + * mode, select trigger source for timer and the timer pin output and the timing for timer. + * + * Example + code + flexio_timer_config_t config = { + .triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(0), + .triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow, + .triggerSource = kFLEXIO_TimerTriggerSourceInternal, + .pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection, + .pinSelect = 0, + .pinPolarity = kFLEXIO_PinActiveHigh, + .timerMode = kFLEXIO_TimerModeDual8BitBaudBit, + .timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset, + .timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput, + .timerReset = kFLEXIO_TimerResetOnTimerPinEqualToTimerOutput, + .timerDisable = kFLEXIO_TimerDisableOnTimerCompare, + .timerEnable = kFLEXIO_TimerEnableOnTriggerHigh, + .timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable, + .timerStart = kFLEXIO_TimerStartBitEnabled + }; + FLEXIO_SetTimerConfig(base, &config); + endcode + * + * param base FlexIO peripheral base address + * param index Timer index + * param timerConfig Pointer to the flexio_timer_config_t structure +*/ +void FLEXIO_SetTimerConfig(FLEXIO_Type *base, uint8_t index, const flexio_timer_config_t *timerConfig) +{ + base->TIMCFG[index] = + FLEXIO_TIMCFG_TIMOUT(timerConfig->timerOutput) | FLEXIO_TIMCFG_TIMDEC(timerConfig->timerDecrement) | + FLEXIO_TIMCFG_TIMRST(timerConfig->timerReset) | FLEXIO_TIMCFG_TIMDIS(timerConfig->timerDisable) | + FLEXIO_TIMCFG_TIMENA(timerConfig->timerEnable) | FLEXIO_TIMCFG_TSTOP(timerConfig->timerStop) | + FLEXIO_TIMCFG_TSTART(timerConfig->timerStart); + + base->TIMCMP[index] = FLEXIO_TIMCMP_CMP(timerConfig->timerCompare); + + base->TIMCTL[index] = FLEXIO_TIMCTL_TRGSEL(timerConfig->triggerSelect) | + FLEXIO_TIMCTL_TRGPOL(timerConfig->triggerPolarity) | + FLEXIO_TIMCTL_TRGSRC(timerConfig->triggerSource) | + FLEXIO_TIMCTL_PINCFG(timerConfig->pinConfig) | FLEXIO_TIMCTL_PINSEL(timerConfig->pinSelect) | + FLEXIO_TIMCTL_PINPOL(timerConfig->pinPolarity) | FLEXIO_TIMCTL_TIMOD(timerConfig->timerMode); +} + +/*! + * brief Registers the handle and the interrupt handler for the FlexIO-simulated peripheral. + * + * param base Pointer to the FlexIO simulated peripheral type. + * param handle Pointer to the handler for FlexIO simulated peripheral. + * param isr FlexIO simulated peripheral interrupt handler. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_RegisterHandleIRQ(void *base, void *handle, flexio_isr_t isr) +{ + assert(base != NULL); + assert(handle != NULL); + assert(isr != NULL); + + uint8_t index; + + /* Find the an empty handle pointer to store the handle. */ + for (index = 0U; index < (uint8_t)FLEXIO_HANDLE_COUNT; index++) + { + if (s_flexioHandle[index] == NULL) + { + /* Register FLEXIO simulated driver base, handle and isr. */ + s_flexioType[index] = base; + s_flexioHandle[index] = handle; + s_flexioIsr[index] = isr; + break; + } + } + + if (index == (uint8_t)FLEXIO_HANDLE_COUNT) + { + return kStatus_OutOfRange; + } + else + { + return kStatus_Success; + } +} + +/*! + * brief Unregisters the handle and the interrupt handler for the FlexIO-simulated peripheral. + * + * param base Pointer to the FlexIO simulated peripheral type. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_UnregisterHandleIRQ(void *base) +{ + assert(base != NULL); + + uint8_t index; + + /* Find the index from base address mappings. */ + for (index = 0U; index < (uint8_t)FLEXIO_HANDLE_COUNT; index++) + { + if (s_flexioType[index] == base) + { + /* Unregister FLEXIO simulated driver handle and isr. */ + s_flexioType[index] = NULL; + s_flexioHandle[index] = NULL; + s_flexioIsr[index] = NULL; + break; + } + } + + if (index == (uint8_t)FLEXIO_HANDLE_COUNT) + { + return kStatus_OutOfRange; + } + else + { + return kStatus_Success; + } +} + +static void FLEXIO_CommonIRQHandler(void) +{ + uint8_t index; + + for (index = 0U; index < (uint8_t)FLEXIO_HANDLE_COUNT; index++) + { + if (s_flexioHandle[index] != NULL) + { + s_flexioIsr[index](s_flexioType[index], s_flexioHandle[index]); + } + } + SDK_ISR_EXIT_BARRIER; +} + +#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER) && FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER +/*! + * brief Configure a FLEXIO pin used by the board. + * + * To Config the FLEXIO PIN, define a pin configuration, as either input or output, in the user file. + * Then, call the FLEXIO_SetPinConfig() function. + * + * This is an example to define an input pin or an output pin configuration. + * code + * Define a digital input pin configuration, + * flexio_gpio_config_t config = + * { + * kFLEXIO_DigitalInput, + * 0U, + * kFLEXIO_FlagRisingEdgeEnable | kFLEXIO_InputInterruptEnable, + * } + * Define a digital output pin configuration, + * flexio_gpio_config_t config = + * { + * kFLEXIO_DigitalOutput, + * 0U, + * 0U + * } + * endcode + * param base FlexIO peripheral base address + * param pin FLEXIO pin number. + * param config FLEXIO pin configuration pointer. + */ +void FLEXIO_SetPinConfig(FLEXIO_Type *base, uint32_t pin, flexio_gpio_config_t *config) +{ + assert(NULL != config); + IRQn_Type flexio_irqs[] = FLEXIO_IRQS; + + if (config->pinDirection == kFLEXIO_DigitalInput) + { + base->PINOUTE &= ~(1UL << pin); + if (0U != (config->inputConfig & (uint8_t)kFLEXIO_InputInterruptEnable)) + { + base->PINIEN = 1UL << pin; + /* Clear pending NVIC IRQ before enable NVIC IRQ. */ + NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_GetInstance(base)]); + /* Enable interrupt in NVIC. */ + (void)EnableIRQ(flexio_irqs[FLEXIO_GetInstance(base)]); + } + + if (0U != (config->inputConfig & (uint8_t)kFLEXIO_FlagRisingEdgeEnable)) + { + base->PINREN = 1UL << pin; + } + + if (0U != (config->inputConfig & (uint8_t)kFLEXIO_FlagFallingEdgeEnable)) + { + base->PINFEN = 1UL << pin; + } + } + else + { + FLEXIO_EnablePinOutput(base, pin); + FLEXIO_PinWrite(base, pin, config->outputLogic); + } +} +#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER*/ + +void FLEXIO_DriverIRQHandler(void); +void FLEXIO_DriverIRQHandler(void) +{ + FLEXIO_CommonIRQHandler(); +} + +void FLEXIO0_DriverIRQHandler(void); +void FLEXIO0_DriverIRQHandler(void) +{ + FLEXIO_CommonIRQHandler(); +} + +void FLEXIO1_DriverIRQHandler(void); +void FLEXIO1_DriverIRQHandler(void) +{ + FLEXIO_CommonIRQHandler(); +} + +void UART2_FLEXIO_DriverIRQHandler(void); +void UART2_FLEXIO_DriverIRQHandler(void) +{ + FLEXIO_CommonIRQHandler(); +} + +void FLEXIO2_DriverIRQHandler(void); +void FLEXIO2_DriverIRQHandler(void) +{ + FLEXIO_CommonIRQHandler(); +} + +void FLEXIO3_DriverIRQHandler(void); +void FLEXIO3_DriverIRQHandler(void) +{ + FLEXIO_CommonIRQHandler(); +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio.h new file mode 100644 index 00000000000..1e1bc6278d0 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio.h @@ -0,0 +1,917 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020, 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_FLEXIO_H_ +#define FSL_FLEXIO_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup flexio_driver + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FlexIO driver version. */ +#define FSL_FLEXIO_DRIVER_VERSION (MAKE_VERSION(2, 2, 2)) +/*! @} */ + +/*! @brief Calculate FlexIO timer trigger.*/ +#define FLEXIO_TIMER_TRIGGER_SEL_PININPUT(x) ((uint32_t)(x) << 1U) +#define FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(x) (((uint32_t)(x) << 2U) | 0x1U) +#define FLEXIO_TIMER_TRIGGER_SEL_TIMn(x) (((uint32_t)(x) << 2U) | 0x3U) + +/*! @brief Define time of timer trigger polarity.*/ +typedef enum _flexio_timer_trigger_polarity +{ + kFLEXIO_TimerTriggerPolarityActiveHigh = 0x0U, /*!< Active high. */ + kFLEXIO_TimerTriggerPolarityActiveLow = 0x1U, /*!< Active low. */ +} flexio_timer_trigger_polarity_t; + +/*! @brief Define type of timer trigger source.*/ +typedef enum _flexio_timer_trigger_source +{ + kFLEXIO_TimerTriggerSourceExternal = 0x0U, /*!< External trigger selected. */ + kFLEXIO_TimerTriggerSourceInternal = 0x1U, /*!< Internal trigger selected. */ +} flexio_timer_trigger_source_t; + +/*! @brief Define type of timer/shifter pin configuration.*/ +typedef enum _flexio_pin_config +{ + kFLEXIO_PinConfigOutputDisabled = 0x0U, /*!< Pin output disabled. */ + kFLEXIO_PinConfigOpenDrainOrBidirection = 0x1U, /*!< Pin open drain or bidirectional output enable. */ + kFLEXIO_PinConfigBidirectionOutputData = 0x2U, /*!< Pin bidirectional output data. */ + kFLEXIO_PinConfigOutput = 0x3U, /*!< Pin output. */ +} flexio_pin_config_t; + +/*! @brief Definition of pin polarity.*/ +typedef enum _flexio_pin_polarity +{ + kFLEXIO_PinActiveHigh = 0x0U, /*!< Active high. */ + kFLEXIO_PinActiveLow = 0x1U, /*!< Active low. */ +} flexio_pin_polarity_t; + +/*! @brief Define type of timer work mode.*/ +typedef enum _flexio_timer_mode +{ + kFLEXIO_TimerModeDisabled = 0x0U, /*!< Timer Disabled. */ + kFLEXIO_TimerModeDual8BitBaudBit = 0x1U, /*!< Dual 8-bit counters baud/bit mode. */ + kFLEXIO_TimerModeDual8BitPWM = 0x2U, /*!< Dual 8-bit counters PWM mode. */ + kFLEXIO_TimerModeSingle16Bit = 0x3U, /*!< Single 16-bit counter mode. */ +} flexio_timer_mode_t; + +/*! @brief Define type of timer initial output or timer reset condition.*/ +typedef enum _flexio_timer_output +{ + kFLEXIO_TimerOutputOneNotAffectedByReset = 0x0U, /*!< Logic one when enabled and is not affected by timer + reset. */ + kFLEXIO_TimerOutputZeroNotAffectedByReset = 0x1U, /*!< Logic zero when enabled and is not affected by timer + reset. */ + kFLEXIO_TimerOutputOneAffectedByReset = 0x2U, /*!< Logic one when enabled and on timer reset. */ + kFLEXIO_TimerOutputZeroAffectedByReset = 0x3U, /*!< Logic zero when enabled and on timer reset. */ +} flexio_timer_output_t; + +/*! @brief Define type of timer decrement.*/ +typedef enum _flexio_timer_decrement_source +{ + kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput = 0x0U, /*!< Decrement counter on FlexIO clock, Shift clock + equals Timer output. */ + kFLEXIO_TimerDecSrcOnTriggerInputShiftTimerOutput, /*!< Decrement counter on Trigger input (both edges), + Shift clock equals Timer output. */ + kFLEXIO_TimerDecSrcOnPinInputShiftPinInput, /*!< Decrement counter on Pin input (both edges), + Shift clock equals Pin input. */ + kFLEXIO_TimerDecSrcOnTriggerInputShiftTriggerInput /*!< Decrement counter on Trigger input (both edges), + Shift clock equals Trigger input. */ +#if (defined(FSL_FEATURE_FLEXIO_TIMCFG_TIMDCE_FIELD_WIDTH) && (FSL_FEATURE_FLEXIO_TIMCFG_TIMDCE_FIELD_WIDTH == 3)) + , + kFLEXIO_TimerDecSrcDiv16OnFlexIOClockShiftTimerOutput, /*!< Decrement counter on FlexIO clock divided by 16, + Shift clock equals Timer output. */ + kFLEXIO_TimerDecSrcDiv256OnFlexIOClockShiftTimerOutput, /*!< Decrement counter on FlexIO clock divided by 256, + Shift clock equals Timer output. */ + kFLEXIO_TimerRisSrcOnPinInputShiftPinInput, /*!< Decrement counter on Pin input (rising edges), + Shift clock equals Pin input. */ + kFLEXIO_TimerRisSrcOnTriggerInputShiftTriggerInput /*!< Decrement counter on Trigger input (rising edges), Shift + clock equals Trigger input. */ +#endif /* FSL_FEATURE_FLEXIO_TIMCFG_TIMDCE_FIELD_WIDTH */ +} flexio_timer_decrement_source_t; + +/*! @brief Define type of timer reset condition.*/ +typedef enum _flexio_timer_reset_condition +{ + kFLEXIO_TimerResetNever = 0x0U, /*!< Timer never reset. */ + kFLEXIO_TimerResetOnTimerPinEqualToTimerOutput = 0x2U, /*!< Timer reset on Timer Pin equal to Timer Output. */ + kFLEXIO_TimerResetOnTimerTriggerEqualToTimerOutput = 0x3U, /*!< Timer reset on Timer Trigger equal to + Timer Output. */ + kFLEXIO_TimerResetOnTimerPinRisingEdge = 0x4U, /*!< Timer reset on Timer Pin rising edge. */ + kFLEXIO_TimerResetOnTimerTriggerRisingEdge = 0x6U, /*!< Timer reset on Trigger rising edge. */ + kFLEXIO_TimerResetOnTimerTriggerBothEdge = 0x7U, /*!< Timer reset on Trigger rising or falling edge. */ +} flexio_timer_reset_condition_t; + +/*! @brief Define type of timer disable condition.*/ +typedef enum _flexio_timer_disable_condition +{ + kFLEXIO_TimerDisableNever = 0x0U, /*!< Timer never disabled. */ + kFLEXIO_TimerDisableOnPreTimerDisable = 0x1U, /*!< Timer disabled on Timer N-1 disable. */ + kFLEXIO_TimerDisableOnTimerCompare = 0x2U, /*!< Timer disabled on Timer compare. */ + kFLEXIO_TimerDisableOnTimerCompareTriggerLow = 0x3U, /*!< Timer disabled on Timer compare and Trigger Low. */ + kFLEXIO_TimerDisableOnPinBothEdge = 0x4U, /*!< Timer disabled on Pin rising or falling edge. */ + kFLEXIO_TimerDisableOnPinBothEdgeTriggerHigh = 0x5U, /*!< Timer disabled on Pin rising or falling edge provided + Trigger is high. */ + kFLEXIO_TimerDisableOnTriggerFallingEdge = 0x6U, /*!< Timer disabled on Trigger falling edge. */ +} flexio_timer_disable_condition_t; + +/*! @brief Define type of timer enable condition.*/ +typedef enum _flexio_timer_enable_condition +{ + kFLEXIO_TimerEnabledAlways = 0x0U, /*!< Timer always enabled. */ + kFLEXIO_TimerEnableOnPrevTimerEnable = 0x1U, /*!< Timer enabled on Timer N-1 enable. */ + kFLEXIO_TimerEnableOnTriggerHigh = 0x2U, /*!< Timer enabled on Trigger high. */ + kFLEXIO_TimerEnableOnTriggerHighPinHigh = 0x3U, /*!< Timer enabled on Trigger high and Pin high. */ + kFLEXIO_TimerEnableOnPinRisingEdge = 0x4U, /*!< Timer enabled on Pin rising edge. */ + kFLEXIO_TimerEnableOnPinRisingEdgeTriggerHigh = 0x5U, /*!< Timer enabled on Pin rising edge and Trigger high. */ + kFLEXIO_TimerEnableOnTriggerRisingEdge = 0x6U, /*!< Timer enabled on Trigger rising edge. */ + kFLEXIO_TimerEnableOnTriggerBothEdge = 0x7U, /*!< Timer enabled on Trigger rising or falling edge. */ +} flexio_timer_enable_condition_t; + +/*! @brief Define type of timer stop bit generate condition.*/ +typedef enum _flexio_timer_stop_bit_condition +{ + kFLEXIO_TimerStopBitDisabled = 0x0U, /*!< Stop bit disabled. */ + kFLEXIO_TimerStopBitEnableOnTimerCompare = 0x1U, /*!< Stop bit is enabled on timer compare. */ + kFLEXIO_TimerStopBitEnableOnTimerDisable = 0x2U, /*!< Stop bit is enabled on timer disable. */ + kFLEXIO_TimerStopBitEnableOnTimerCompareDisable = 0x3U, /*!< Stop bit is enabled on timer compare and timer + disable. */ +} flexio_timer_stop_bit_condition_t; + +/*! @brief Define type of timer start bit generate condition.*/ +typedef enum _flexio_timer_start_bit_condition +{ + kFLEXIO_TimerStartBitDisabled = 0x0U, /*!< Start bit disabled. */ + kFLEXIO_TimerStartBitEnabled = 0x1U, /*!< Start bit enabled. */ +} flexio_timer_start_bit_condition_t; + +/*! @brief FlexIO as PWM channel output state */ +typedef enum _flexio_timer_output_state +{ + kFLEXIO_PwmLow = 0, /*!< The output state of PWM channel is low */ + kFLEXIO_PwmHigh, /*!< The output state of PWM channel is high */ +} flexio_timer_output_state_t; + +/*! @brief Define type of timer polarity for shifter control. */ +typedef enum _flexio_shifter_timer_polarity +{ + kFLEXIO_ShifterTimerPolarityOnPositive = 0x0U, /*!< Shift on positive edge of shift clock. */ + kFLEXIO_ShifterTimerPolarityOnNegitive = 0x1U, /*!< Shift on negative edge of shift clock. */ +} flexio_shifter_timer_polarity_t; + +/*! @brief Define type of shifter working mode.*/ +typedef enum _flexio_shifter_mode +{ + kFLEXIO_ShifterDisabled = 0x0U, /*!< Shifter is disabled. */ + kFLEXIO_ShifterModeReceive = 0x1U, /*!< Receive mode. */ + kFLEXIO_ShifterModeTransmit = 0x2U, /*!< Transmit mode. */ + kFLEXIO_ShifterModeMatchStore = 0x4U, /*!< Match store mode. */ + kFLEXIO_ShifterModeMatchContinuous = 0x5U, /*!< Match continuous mode. */ +#if FSL_FEATURE_FLEXIO_HAS_STATE_MODE + kFLEXIO_ShifterModeState = 0x6U, /*!< SHIFTBUF contents are used for storing + programmable state attributes. */ +#endif /* FSL_FEATURE_FLEXIO_HAS_STATE_MODE */ +#if FSL_FEATURE_FLEXIO_HAS_LOGIC_MODE + kFLEXIO_ShifterModeLogic = 0x7U, /*!< SHIFTBUF contents are used for implementing + programmable logic look up table. */ +#endif /* FSL_FEATURE_FLEXIO_HAS_LOGIC_MODE */ +} flexio_shifter_mode_t; + +/*! @brief Define type of shifter input source.*/ +typedef enum _flexio_shifter_input_source +{ + kFLEXIO_ShifterInputFromPin = 0x0U, /*!< Shifter input from pin. */ + kFLEXIO_ShifterInputFromNextShifterOutput = 0x1U, /*!< Shifter input from Shifter N+1. */ +} flexio_shifter_input_source_t; + +/*! @brief Define of STOP bit configuration.*/ +typedef enum _flexio_shifter_stop_bit +{ + kFLEXIO_ShifterStopBitDisable = 0x0U, /*!< Disable shifter stop bit. */ + kFLEXIO_ShifterStopBitLow = 0x2U, /*!< Set shifter stop bit to logic low level. */ + kFLEXIO_ShifterStopBitHigh = 0x3U, /*!< Set shifter stop bit to logic high level. */ +} flexio_shifter_stop_bit_t; + +/*! @brief Define type of START bit configuration.*/ +typedef enum _flexio_shifter_start_bit +{ + kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable = 0x0U, /*!< Disable shifter start bit, transmitter loads + data on enable. */ + kFLEXIO_ShifterStartBitDisabledLoadDataOnShift = 0x1U, /*!< Disable shifter start bit, transmitter loads + data on first shift. */ + kFLEXIO_ShifterStartBitLow = 0x2U, /*!< Set shifter start bit to logic low level. */ + kFLEXIO_ShifterStartBitHigh = 0x3U, /*!< Set shifter start bit to logic high level. */ +} flexio_shifter_start_bit_t; + +/*! @brief Define FlexIO shifter buffer type*/ +typedef enum _flexio_shifter_buffer_type +{ + kFLEXIO_ShifterBuffer = 0x0U, /*!< Shifter Buffer N Register. */ + kFLEXIO_ShifterBufferBitSwapped = 0x1U, /*!< Shifter Buffer N Bit Byte Swapped Register. */ + kFLEXIO_ShifterBufferByteSwapped = 0x2U, /*!< Shifter Buffer N Byte Swapped Register. */ + kFLEXIO_ShifterBufferBitByteSwapped = 0x3U, /*!< Shifter Buffer N Bit Swapped Register. */ +#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP + kFLEXIO_ShifterBufferNibbleByteSwapped = 0x4U, /*!< Shifter Buffer N Nibble Byte Swapped Register. */ +#endif /*FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP*/ +#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP + kFLEXIO_ShifterBufferHalfWordSwapped = 0x5U, /*!< Shifter Buffer N Half Word Swapped Register. */ +#endif +#if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP + kFLEXIO_ShifterBufferNibbleSwapped = 0x6U, /*!< Shifter Buffer N Nibble Swapped Register. */ +#endif +} flexio_shifter_buffer_type_t; + +/*! @brief Define FlexIO user configuration structure. */ +typedef struct _flexio_config_ +{ + bool enableFlexio; /*!< Enable/disable FlexIO module */ + bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode */ + bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode */ + bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, fast access requires + the FlexIO clock to be at least twice the frequency of the bus clock. */ +} flexio_config_t; + +/*! @brief Define FlexIO timer configuration structure. */ +typedef struct _flexio_timer_config +{ + /* Trigger. */ + uint32_t triggerSelect; /*!< The internal trigger selection number using MACROs. */ + flexio_timer_trigger_polarity_t triggerPolarity; /*!< Trigger Polarity. */ + flexio_timer_trigger_source_t triggerSource; /*!< Trigger Source, internal (see 'trgsel') or external. */ + /* Pin. */ + flexio_pin_config_t pinConfig; /*!< Timer Pin Configuration. */ + uint32_t pinSelect; /*!< Timer Pin number Select. */ + flexio_pin_polarity_t pinPolarity; /*!< Timer Pin Polarity. */ + /* Timer. */ + flexio_timer_mode_t timerMode; /*!< Timer work Mode. */ + flexio_timer_output_t timerOutput; /*!< Configures the initial state of the Timer Output and + whether it is affected by the Timer reset. */ + flexio_timer_decrement_source_t timerDecrement; /*!< Configures the source of the Timer decrement and the + source of the Shift clock. */ + flexio_timer_reset_condition_t timerReset; /*!< Configures the condition that causes the timer counter + (and optionally the timer output) to be reset. */ + flexio_timer_disable_condition_t timerDisable; /*!< Configures the condition that causes the Timer to be + disabled and stop decrementing. */ + flexio_timer_enable_condition_t timerEnable; /*!< Configures the condition that causes the Timer to be + enabled and start decrementing. */ + flexio_timer_stop_bit_condition_t timerStop; /*!< Timer STOP Bit generation. */ + flexio_timer_start_bit_condition_t timerStart; /*!< Timer STRAT Bit generation. */ + uint32_t timerCompare; /*!< Value for Timer Compare N Register. */ +} flexio_timer_config_t; + +/*! @brief Define FlexIO shifter configuration structure. */ +typedef struct _flexio_shifter_config +{ + /* Timer. */ + uint32_t timerSelect; /*!< Selects which Timer is used for controlling the + logic/shift register and generating the Shift clock. */ + flexio_shifter_timer_polarity_t timerPolarity; /*!< Timer Polarity. */ + /* Pin. */ + flexio_pin_config_t pinConfig; /*!< Shifter Pin Configuration. */ + uint32_t pinSelect; /*!< Shifter Pin number Select. */ + flexio_pin_polarity_t pinPolarity; /*!< Shifter Pin Polarity. */ + /* Shifter. */ + flexio_shifter_mode_t shifterMode; /*!< Configures the mode of the Shifter. */ +#if FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH + uint32_t parallelWidth; /*!< Configures the parallel width when using parallel mode.*/ +#endif /* FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH */ + flexio_shifter_input_source_t inputSource; /*!< Selects the input source for the shifter. */ + flexio_shifter_stop_bit_t shifterStop; /*!< Shifter STOP bit. */ + flexio_shifter_start_bit_t shifterStart; /*!< Shifter START bit. */ +} flexio_shifter_config_t; + +#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER) && FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER +/*! @brief FLEXIO gpio direction definition */ +typedef enum _flexio_gpio_direction +{ + kFLEXIO_DigitalInput = 0U, /*!< Set current pin as digital input*/ + kFLEXIO_DigitalOutput = 1U, /*!< Set current pin as digital output*/ +} flexio_gpio_direction_t; + +/*! @brief FLEXIO gpio input config */ +typedef enum _flexio_pin_input_config +{ + kFLEXIO_InputInterruptDisabled = 0x0U, /*!< Interrupt request is disabled. */ + kFLEXIO_InputInterruptEnable = 0x1U, /*!< Interrupt request is enable. */ + kFLEXIO_FlagRisingEdgeEnable = 0x2U, /*!< Input pin flag on rising edge. */ + kFLEXIO_FlagFallingEdgeEnable = 0x4U, /*!< Input pin flag on falling edge. */ +} flexio_pin_input_config_t; + +/*! + * @brief The FLEXIO pin configuration structure. + * + * Each pin can only be configured as either an output pin or an input pin at a time. + * If configured as an input pin, use inputConfig param. + * If configured as an output pin, use outputLogic. + */ +typedef struct _flexio_gpio_config +{ + flexio_gpio_direction_t pinDirection; /*!< FLEXIO pin direction, input or output */ + uint8_t outputLogic; /*!< Set a default output logic, which has no use in input */ + uint8_t inputConfig; /*!< Set an input config */ +} flexio_gpio_config_t; +#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER*/ + +/*! @brief typedef for FlexIO simulated driver interrupt handler.*/ +typedef void (*flexio_isr_t)(void *base, void *handle); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to flexio bases for each instance. */ +extern FLEXIO_Type *const s_flexioBases[]; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to flexio clocks for each instance. */ +extern const clock_ip_name_t s_flexioClocks[]; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /*_cplusplus*/ + +/*! + * @name FlexIO Initialization and De-initialization + * @{ + */ + +/*! + * @brief Gets the default configuration to configure the FlexIO module. The configuration + * can used directly to call the FLEXIO_Configure(). + * + * Example: + @code + flexio_config_t config; + FLEXIO_GetDefaultConfig(&config); + @endcode + * + * @param userConfig pointer to flexio_config_t structure +*/ +void FLEXIO_GetDefaultConfig(flexio_config_t *userConfig); + +/*! + * @brief Configures the FlexIO with a FlexIO configuration. The configuration structure + * can be filled by the user or be set with default values by FLEXIO_GetDefaultConfig(). + * + * Example + @code + flexio_config_t config = { + .enableFlexio = true, + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false + }; + FLEXIO_Configure(base, &config); + @endcode + * + * @param base FlexIO peripheral base address + * @param userConfig pointer to flexio_config_t structure +*/ +void FLEXIO_Init(FLEXIO_Type *base, const flexio_config_t *userConfig); + +/*! + * @brief Gates the FlexIO clock. Call this API to stop the FlexIO clock. + * + * @note After calling this API, call the FLEXO_Init to use the FlexIO module. + * + * @param base FlexIO peripheral base address + */ +void FLEXIO_Deinit(FLEXIO_Type *base); + +/*! + * @brief Get instance number for FLEXIO module. + * + * @param base FLEXIO peripheral base address. + */ +uint32_t FLEXIO_GetInstance(FLEXIO_Type *base); + +/*! @} */ + +/*! + * @name FlexIO Basic Operation + * @{ + */ + +/*! + * @brief Resets the FlexIO module. + * + * @param base FlexIO peripheral base address + */ +void FLEXIO_Reset(FLEXIO_Type *base); + +/*! + * @brief Enables the FlexIO module operation. + * + * @param base FlexIO peripheral base address + * @param enable true to enable, false to disable. + */ +static inline void FLEXIO_Enable(FLEXIO_Type *base, bool enable) +{ + if (enable) + { + base->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; + } + else + { + base->CTRL &= ~FLEXIO_CTRL_FLEXEN_MASK; + } +} + +#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS +/*! + * @brief Reads the input data on each of the FlexIO pins. + * + * @param base FlexIO peripheral base address + * @return FlexIO pin input data + */ +static inline uint32_t FLEXIO_ReadPinInput(FLEXIO_Type *base) +{ + return base->PIN; +} +#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ + +#if defined(FSL_FEATURE_FLEXIO_HAS_STATE_MODE) && FSL_FEATURE_FLEXIO_HAS_STATE_MODE +/*! + * @brief Gets the current state pointer for state mode use. + * + * @param base FlexIO peripheral base address + * @return current State pointer + */ +static inline uint8_t FLEXIO_GetShifterState(FLEXIO_Type *base) +{ + return ((uint8_t)(base->SHIFTSTATE) & FLEXIO_SHIFTSTATE_STATE_MASK); +} +#endif /*FSL_FEATURE_FLEXIO_HAS_STATE_MODE*/ + +/*! + * @brief Configures the shifter with the shifter configuration. The configuration structure + * covers both the SHIFTCTL and SHIFTCFG registers. To configure the shifter to the proper + * mode, select which timer controls the shifter to shift, whether to generate start bit/stop + * bit, and the polarity of start bit and stop bit. + * + * Example + @code + flexio_shifter_config_t config = { + .timerSelect = 0, + .timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive, + .pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection, + .pinPolarity = kFLEXIO_PinActiveLow, + .shifterMode = kFLEXIO_ShifterModeTransmit, + .inputSource = kFLEXIO_ShifterInputFromPin, + .shifterStop = kFLEXIO_ShifterStopBitHigh, + .shifterStart = kFLEXIO_ShifterStartBitLow + }; + FLEXIO_SetShifterConfig(base, &config); + @endcode + * + * @param base FlexIO peripheral base address + * @param index Shifter index + * @param shifterConfig Pointer to flexio_shifter_config_t structure +*/ +void FLEXIO_SetShifterConfig(FLEXIO_Type *base, uint8_t index, const flexio_shifter_config_t *shifterConfig); +/*! + * @brief Configures the timer with the timer configuration. The configuration structure + * covers both the TIMCTL and TIMCFG registers. To configure the timer to the proper + * mode, select trigger source for timer and the timer pin output and the timing for timer. + * + * Example + @code + flexio_timer_config_t config = { + .triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(0), + .triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow, + .triggerSource = kFLEXIO_TimerTriggerSourceInternal, + .pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection, + .pinSelect = 0, + .pinPolarity = kFLEXIO_PinActiveHigh, + .timerMode = kFLEXIO_TimerModeDual8BitBaudBit, + .timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset, + .timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput, + .timerReset = kFLEXIO_TimerResetOnTimerPinEqualToTimerOutput, + .timerDisable = kFLEXIO_TimerDisableOnTimerCompare, + .timerEnable = kFLEXIO_TimerEnableOnTriggerHigh, + .timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable, + .timerStart = kFLEXIO_TimerStartBitEnabled + }; + FLEXIO_SetTimerConfig(base, &config); + @endcode + * + * @param base FlexIO peripheral base address + * @param index Timer index + * @param timerConfig Pointer to the flexio_timer_config_t structure +*/ +void FLEXIO_SetTimerConfig(FLEXIO_Type *base, uint8_t index, const flexio_timer_config_t *timerConfig); + +/*! + * @brief This function set the value of the prescaler on flexio channels + * + * @param base Pointer to the FlexIO simulated peripheral type. + * @param index Timer index + * @param clocksource Set clock value + */ +static inline void FLEXIO_SetClockMode(FLEXIO_Type *base, uint8_t index, flexio_timer_decrement_source_t clocksource) +{ + uint32_t reg = base->TIMCFG[index]; + + reg &= ~FLEXIO_TIMCFG_TIMDEC_MASK; + + reg |= FLEXIO_TIMCFG_TIMDEC(clocksource); + + base->TIMCFG[index] = reg; +} + +/*! @} */ + +/*! + * @name FlexIO Interrupt Operation + * @{ + */ + +/*! + * @brief Enables the shifter status interrupt. The interrupt generates when the corresponding SSF is set. + * + * @param base FlexIO peripheral base address + * @param mask The shifter status mask which can be calculated by (1 << shifter index) + * @note For multiple shifter status interrupt enable, for example, two shifter status enable, can calculate + * the mask by using ((1 << shifter index0) | (1 << shifter index1)) + */ +static inline void FLEXIO_EnableShifterStatusInterrupts(FLEXIO_Type *base, uint32_t mask) +{ + base->SHIFTSIEN |= mask; +} + +/*! + * @brief Disables the shifter status interrupt. The interrupt won't generate when the corresponding SSF is set. + * + * @param base FlexIO peripheral base address + * @param mask The shifter status mask which can be calculated by (1 << shifter index) + * @note For multiple shifter status interrupt enable, for example, two shifter status enable, can calculate + * the mask by using ((1 << shifter index0) | (1 << shifter index1)) + */ +static inline void FLEXIO_DisableShifterStatusInterrupts(FLEXIO_Type *base, uint32_t mask) +{ + base->SHIFTSIEN &= ~mask; +} + +/*! + * @brief Enables the shifter error interrupt. The interrupt generates when the corresponding SEF is set. + * + * @param base FlexIO peripheral base address + * @param mask The shifter error mask which can be calculated by (1 << shifter index) + * @note For multiple shifter error interrupt enable, for example, two shifter error enable, can calculate + * the mask by using ((1 << shifter index0) | (1 << shifter index1)) + */ +static inline void FLEXIO_EnableShifterErrorInterrupts(FLEXIO_Type *base, uint32_t mask) +{ + base->SHIFTEIEN |= mask; +} + +/*! + * @brief Disables the shifter error interrupt. The interrupt won't generate when the corresponding SEF is set. + * + * @param base FlexIO peripheral base address + * @param mask The shifter error mask which can be calculated by (1 << shifter index) + * @note For multiple shifter error interrupt enable, for example, two shifter error enable, can calculate + * the mask by using ((1 << shifter index0) | (1 << shifter index1)) + */ +static inline void FLEXIO_DisableShifterErrorInterrupts(FLEXIO_Type *base, uint32_t mask) +{ + base->SHIFTEIEN &= ~mask; +} + +/*! + * @brief Enables the timer status interrupt. The interrupt generates when the corresponding SSF is set. + * + * @param base FlexIO peripheral base address + * @param mask The timer status mask which can be calculated by (1 << timer index) + * @note For multiple timer status interrupt enable, for example, two timer status enable, can calculate + * the mask by using ((1 << timer index0) | (1 << timer index1)) + */ +static inline void FLEXIO_EnableTimerStatusInterrupts(FLEXIO_Type *base, uint32_t mask) +{ + base->TIMIEN |= mask; +} + +/*! + * @brief Disables the timer status interrupt. The interrupt won't generate when the corresponding SSF is set. + * + * @param base FlexIO peripheral base address + * @param mask The timer status mask which can be calculated by (1 << timer index) + * @note For multiple timer status interrupt enable, for example, two timer status enable, can calculate + * the mask by using ((1 << timer index0) | (1 << timer index1)) + */ +static inline void FLEXIO_DisableTimerStatusInterrupts(FLEXIO_Type *base, uint32_t mask) +{ + base->TIMIEN &= ~mask; +} + +/*! @} */ + +/*! + * @name FlexIO Status Operation + * @{ + */ + +/*! + * @brief Gets the shifter status flags. + * + * @param base FlexIO peripheral base address + * @return Shifter status flags + */ +static inline uint32_t FLEXIO_GetShifterStatusFlags(FLEXIO_Type *base) +{ + return ((base->SHIFTSTAT) & FLEXIO_SHIFTSTAT_SSF_MASK); +} + +/*! + * @brief Clears the shifter status flags. + * + * @param base FlexIO peripheral base address + * @param mask The shifter status mask which can be calculated by (1 << shifter index) + * @note For clearing multiple shifter status flags, for example, two shifter status flags, can calculate + * the mask by using ((1 << shifter index0) | (1 << shifter index1)) + */ +static inline void FLEXIO_ClearShifterStatusFlags(FLEXIO_Type *base, uint32_t mask) +{ + base->SHIFTSTAT = mask; +} + +/*! + * @brief Gets the shifter error flags. + * + * @param base FlexIO peripheral base address + * @return Shifter error flags + */ +static inline uint32_t FLEXIO_GetShifterErrorFlags(FLEXIO_Type *base) +{ + return ((base->SHIFTERR) & FLEXIO_SHIFTERR_SEF_MASK); +} + +/*! + * @brief Clears the shifter error flags. + * + * @param base FlexIO peripheral base address + * @param mask The shifter error mask which can be calculated by (1 << shifter index) + * @note For clearing multiple shifter error flags, for example, two shifter error flags, can calculate + * the mask by using ((1 << shifter index0) | (1 << shifter index1)) + */ +static inline void FLEXIO_ClearShifterErrorFlags(FLEXIO_Type *base, uint32_t mask) +{ + base->SHIFTERR = mask; +} + +/*! + * @brief Gets the timer status flags. + * + * @param base FlexIO peripheral base address + * @return Timer status flags + */ +static inline uint32_t FLEXIO_GetTimerStatusFlags(FLEXIO_Type *base) +{ + return ((base->TIMSTAT) & FLEXIO_TIMSTAT_TSF_MASK); +} + +/*! + * @brief Clears the timer status flags. + * + * @param base FlexIO peripheral base address + * @param mask The timer status mask which can be calculated by (1 << timer index) + * @note For clearing multiple timer status flags, for example, two timer status flags, can calculate + * the mask by using ((1 << timer index0) | (1 << timer index1)) + */ +static inline void FLEXIO_ClearTimerStatusFlags(FLEXIO_Type *base, uint32_t mask) +{ + base->TIMSTAT = mask; +} + +/*! @} */ + +/*! + * @name FlexIO DMA Operation + * @{ + */ + +/*! + * @brief Enables/disables the shifter status DMA. The DMA request generates when the corresponding SSF is set. + * + * @note For multiple shifter status DMA enables, for example, calculate + * the mask by using ((1 << shifter index0) | (1 << shifter index1)) + * + * @param base FlexIO peripheral base address + * @param mask The shifter status mask which can be calculated by (1 << shifter index) + * @param enable True to enable, false to disable. + */ +static inline void FLEXIO_EnableShifterStatusDMA(FLEXIO_Type *base, uint32_t mask, bool enable) +{ + if (enable) + { + base->SHIFTSDEN |= mask; + } + else + { + base->SHIFTSDEN &= ~mask; + } +} + +/*! + * @brief Gets the shifter buffer address for the DMA transfer usage. + * + * @param base FlexIO peripheral base address + * @param type Shifter type of flexio_shifter_buffer_type_t + * @param index Shifter index + * @return Corresponding shifter buffer index + */ +uint32_t FLEXIO_GetShifterBufferAddress(FLEXIO_Type *base, flexio_shifter_buffer_type_t type, uint8_t index); + +/*! + * @brief Registers the handle and the interrupt handler for the FlexIO-simulated peripheral. + * + * @param base Pointer to the FlexIO simulated peripheral type. + * @param handle Pointer to the handler for FlexIO simulated peripheral. + * @param isr FlexIO simulated peripheral interrupt handler. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_RegisterHandleIRQ(void *base, void *handle, flexio_isr_t isr); + +/*! + * @brief Unregisters the handle and the interrupt handler for the FlexIO-simulated peripheral. + * + * @param base Pointer to the FlexIO simulated peripheral type. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_UnregisterHandleIRQ(void *base); +/*! @} */ + +#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER) && FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER + +/*! + * @brief Configure a FLEXIO pin used by the board. + * + * To Config the FLEXIO PIN, define a pin configuration, as either input or output, in the user file. + * Then, call the FLEXIO_SetPinConfig() function. + * + * This is an example to define an input pin or an output pin configuration. + * @code + * Define a digital input pin configuration, + * flexio_gpio_config_t config = + * { + * kFLEXIO_DigitalInput, + * 0U, + * kFLEXIO_FlagRisingEdgeEnable | kFLEXIO_InputInterruptEnable, + * } + * Define a digital output pin configuration, + * flexio_gpio_config_t config = + * { + * kFLEXIO_DigitalOutput, + * 0U, + * 0U + * } + * @endcode + * @param base FlexIO peripheral base address + * @param pin FLEXIO pin number. + * @param config FLEXIO pin configuration pointer. + */ +void FLEXIO_SetPinConfig(FLEXIO_Type *base, uint32_t pin, flexio_gpio_config_t *config); + +/*! + * @name GPIO Output Operations + * @{ + */ + +/*! + * @brief Sets the output level of the multiple FLEXIO pins to the logic 0. + * + * @param base FlexIO peripheral base address + * @param mask FLEXIO pin number mask + */ +static inline void FLEXIO_ClearPortOutput(FLEXIO_Type *base, uint32_t mask) +{ + base->PINOUTCLR = mask; +} + +/*! + * @brief Sets the output level of the multiple FLEXIO pins to the logic 1. + * + * @param base FlexIO peripheral base address + * @param mask FLEXIO pin number mask + */ +static inline void FLEXIO_SetPortOutput(FLEXIO_Type *base, uint32_t mask) +{ + base->PINOUTSET = mask; +} + +/*! + * @brief Reverses the current output logic of the multiple FLEXIO pins. + * + * @param base FlexIO peripheral base address + * @param mask FLEXIO pin number mask + */ +static inline void FLEXIO_TogglePortOutput(FLEXIO_Type *base, uint32_t mask) +{ + base->PINOUTTOG = mask; +} + +/*! + * @brief Sets the output level of the FLEXIO pins to the logic 1 or 0. + * + * @param base FlexIO peripheral base address + * @param pin FLEXIO pin number. + * @param output FLEXIO pin output logic level. + * - 0: corresponding pin output low-logic level. + * - 1: corresponding pin output high-logic level. + */ +static inline void FLEXIO_PinWrite(FLEXIO_Type *base, uint32_t pin, uint8_t output) +{ + if (output == 0U) + { + FLEXIO_ClearPortOutput(base, 1UL << pin); + } + else + { + FLEXIO_SetPortOutput(base, 1UL << pin); + } +} + +/*! + * @brief Enables the FLEXIO output pin function. + * + * @param base FlexIO peripheral base address + * @param pin FLEXIO pin number. + */ +static inline void FLEXIO_EnablePinOutput(FLEXIO_Type *base, uint32_t pin) +{ + base->PINOUTE |= (1UL << pin); +} +/*! @} */ + +/*! + * @name FLEXIO PIN Input Operations + * @{ + */ + +/*! + * @brief Reads the current input value of the FLEXIO pin. + * + * @param base FlexIO peripheral base address + * @param pin FLEXIO pin number. + * @retval FLEXIO port input value + * - 0: corresponding pin input low-logic level. + * - 1: corresponding pin input high-logic level. + */ +static inline uint32_t FLEXIO_PinRead(FLEXIO_Type *base, uint32_t pin) +{ + return (((base->PIN) >> pin) & 0x01U); +} + +/*! + * @brief Gets the FLEXIO input pin status. + * + * @param base FlexIO peripheral base address + * @param pin FLEXIO pin number. + * @retval FLEXIO port input status + * - 0: corresponding pin input capture no status. + * - 1: corresponding pin input capture rising or falling edge. + */ +static inline uint32_t FLEXIO_GetPinStatus(FLEXIO_Type *base, uint32_t pin) +{ + return (((base->PINSTAT) >> pin) & 0x01U); +} + +/*! + * @brief Clears the multiple FLEXIO input pins status. + * + * @param base FlexIO peripheral base address + * @param mask FLEXIO pin number mask + */ +static inline void FLEXIO_ClearPortStatus(FLEXIO_Type *base, uint32_t mask) +{ + base->PINSTAT = mask; +} +/*! @} */ + +#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_REGISTER*/ + +#if defined(__cplusplus) +} +#endif /*_cplusplus*/ +/*! @} */ + +#endif /*FSL_FLEXIO_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_i2c_master.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_i2c_master.c new file mode 100644 index 00000000000..9239527c6fa --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_i2c_master.c @@ -0,0 +1,1377 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexio_i2c_master.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexio_i2c_master" +#endif + +/*! @brief FLEXIO I2C transfer state */ +enum _flexio_i2c_master_transfer_states +{ + kFLEXIO_I2C_Idle = 0x0U, /*!< I2C bus idle */ + kFLEXIO_I2C_Start = 0x1U, /*!< I2C start phase */ + kFLEXIO_I2C_SendCommand = 0x2U, /*!< Send command byte phase */ + kFLEXIO_I2C_SendData = 0x3U, /*!< Send data transfer phase*/ + kFLEXIO_I2C_ReceiveDataBegin = 0x4U, /*!< Receive data begin transfer phase*/ + kFLEXIO_I2C_ReceiveData = 0x5U, /*!< Receive data transfer phase*/ +}; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/*! + * @brief Set up master transfer, send slave address and decide the initial + * transfer state. + * + * @param base pointer to FLEXIO_I2C_Type structure + * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * @param transfer pointer to flexio_i2c_master_transfer_t structure + */ +static status_t FLEXIO_I2C_MasterTransferInitStateMachine(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + flexio_i2c_master_transfer_t *xfer); + +/*! + * @brief Master run transfer state machine to perform a byte of transfer. + * + * @param base pointer to FLEXIO_I2C_Type structure + * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * @param statusFlags flexio i2c hardware status + * @retval kStatus_Success Successfully run state machine + * @retval kStatus_FLEXIO_I2C_Nak Receive Nak during transfer + */ +static status_t FLEXIO_I2C_MasterTransferRunStateMachine(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags); + +/*! + * @brief Complete transfer, disable interrupt and call callback. + * + * @param base pointer to FLEXIO_I2C_Type structure + * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * @param status flexio transfer status + */ +static void FLEXIO_I2C_MasterTransferComplete(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + status_t status); + +/*! + * @brief introduce function FLEXIO_I2C_MasterTransferStateMachineStart. + * This function was deal with Initial state, i2c start state. + * + * @param base pointer to FLEXIO_I2C_Type structure + * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state + */ +static void FLEXIO_I2C_MasterTransferStateMachineStart(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle); + +/*! + * @brief introduce function FLEXIO_I2C_MasterTransferStateMachineSendCommand. + * This function was deal with Check address only needed for transfer with subaddress . + * + * @param base pointer to FLEXIO_I2C_Type structure + * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * @param statusFlags flexio i2c hardware status + * + * @return default is true when No abnormality. + * @return false when time out. + */ +static bool FLEXIO_I2C_MasterTransferStateMachineSendCommand(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags); + +/*! + * @brief introduce function FLEXIO_I2C_MasterTransferStateMachineSendData. + * This function was deal with Send command byte. + * + * @param base pointer to FLEXIO_I2C_Type structure + * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * @param statusFlags flexio i2c hardware status + * + * @return default is true when No abnormality. + * @return false when time out. + */ +static bool FLEXIO_I2C_MasterTransferStateMachineSendData(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags); + +/*! + * @brief introduce function FLEXIO_I2C_MasterTransferStateMachineReceiveDataBegin. + * This function was deal with Receive Data Begin. + * + * @param base pointer to FLEXIO_I2C_Type structure + * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * @param statusFlags flexio i2c hardware status + * + * @return default is true when No abnormality. + * @return false when time out. + */ +static bool FLEXIO_I2C_MasterTransferStateMachineReceiveDataBegin(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags); + +/*! + * @brief introduce function Case_kFLEXIO_I2C_ReceiveDataBegin. + * This function was deal with Receive Data. + * + * @param base pointer to FLEXIO_I2C_Type structure + * @param handle pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * @param statusFlags flexio i2c hardware status + * + * @return default is kStatus_Success when No abnormality. + * @return kStatus_FLEXIO_I2C_Nak when ReceiveNakFlag is not set. + * @return kStatus_FLEXIO_I2C_Timeout when time out. + */ +static status_t FLEXIO_I2C_MasterTransferStateMachineReceiveData(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags); + +/******************************************************************************* + * Codes + ******************************************************************************/ + +static uint32_t FLEXIO_I2C_GetInstance(FLEXIO_I2C_Type *base) +{ + return FLEXIO_GetInstance(base->flexioBase); +} + +static status_t FLEXIO_I2C_MasterTransferInitStateMachine(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + flexio_i2c_master_transfer_t *xfer) +{ + bool needRestart; + uint32_t byteCount; + + /* Init the handle member. */ + handle->transfer.slaveAddress = xfer->slaveAddress; + handle->transfer.direction = xfer->direction; + handle->transfer.subaddress = xfer->subaddress; + handle->transfer.subaddressSize = xfer->subaddressSize; + handle->transfer.data = xfer->data; + handle->transfer.dataSize = xfer->dataSize; + handle->transfer.flags = xfer->flags; + handle->transferSize = xfer->dataSize; + + /* Initial state, i2c start state. */ + handle->state = (uint8_t)kFLEXIO_I2C_Start; + + /* Clear all status before transfer. */ + FLEXIO_I2C_MasterClearStatusFlags(base, (uint32_t)kFLEXIO_I2C_ReceiveNakFlag); + + /* Calculate whether need to send re-start. */ + needRestart = (handle->transfer.subaddressSize != 0U) && (handle->transfer.direction == kFLEXIO_I2C_Read); + handle->needRestart = needRestart; + + /* Calculate total byte count in a frame. */ + byteCount = 1U; + + if (!needRestart) + { + byteCount += handle->transfer.dataSize; + } + + if (handle->transfer.subaddressSize != 0U) + { + byteCount += handle->transfer.subaddressSize; + } + + /* Configure data count. */ + if (FLEXIO_I2C_MasterSetTransferCount(base, (uint16_t)byteCount) != kStatus_Success) + { + return kStatus_InvalidArgument; + } + + /* Configure timer1 disable condition. */ + uint32_t tmpConfig = base->flexioBase->TIMCFG[base->timerIndex[1]]; + tmpConfig &= ~FLEXIO_TIMCFG_TIMDIS_MASK; + tmpConfig |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnPreTimerDisable); + base->flexioBase->TIMCFG[base->timerIndex[1]] = tmpConfig; + +#if I2C_RETRY_TIMES + uint32_t waitTimes = I2C_RETRY_TIMES; + while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return kStatus_FLEXIO_I2C_Timeout; + } +#else + while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) + { + } +#endif + + return kStatus_Success; +} + +static void FLEXIO_I2C_MasterTransferStateMachineStart(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle) +{ + if (handle->needRestart) + { + FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, kFLEXIO_I2C_Write); + } + else + { + FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, handle->transfer.direction); + } + if (handle->transfer.subaddressSize == 0U) + { + if (handle->transfer.direction == kFLEXIO_I2C_Write) + { + /* Next state, send data. */ + handle->state = (uint8_t)kFLEXIO_I2C_SendData; + } + else + { + /* Next state, receive data begin. */ + handle->state = (uint8_t)kFLEXIO_I2C_ReceiveDataBegin; + } + } + else + { + /* Next state, send command byte. */ + handle->state = (uint8_t)kFLEXIO_I2C_SendCommand; + } +} + +static bool FLEXIO_I2C_MasterTransferStateMachineSendCommand(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags) +{ + if ((statusFlags & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) + { + if (handle->transfer.subaddressSize > 0U) + { + handle->transfer.subaddressSize--; + FLEXIO_I2C_MasterWriteByte(base, ((handle->transfer.subaddress) >> (8U * handle->transfer.subaddressSize))); + + if (handle->transfer.subaddressSize == 0U) + { + /* Load re-start in advance. */ + if (handle->transfer.direction == kFLEXIO_I2C_Read) + { +#if I2C_RETRY_TIMES + while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return false; + } +#else + while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) + { + } +#endif + FLEXIO_I2C_MasterRepeatedStart(base); + } + } + } + else + { + if (handle->transfer.direction == kFLEXIO_I2C_Write) + { + /* Send first byte of data. */ + if (handle->transfer.dataSize > 0U) + { + /* Next state, send data. */ + handle->state = (uint8_t)kFLEXIO_I2C_SendData; + + FLEXIO_I2C_MasterWriteByte(base, *handle->transfer.data); + handle->transfer.data++; + handle->transfer.dataSize--; + } + else + { + FLEXIO_I2C_MasterStop(base); + +#if I2C_RETRY_TIMES + while ((0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return false; + } +#else + while (0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) + { + } +#endif + (void)FLEXIO_I2C_MasterReadByte(base); + + handle->state = (uint8_t)kFLEXIO_I2C_Idle; + } + } + else + { + (void)FLEXIO_I2C_MasterSetTransferCount(base, (uint16_t)(handle->transfer.dataSize + 1U)); + /* Delay at least one clock cycle so that the restart setup time is up to spec standard. */ + SDK_DelayAtLeastUs(1000000UL / base->baudrate, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); + FLEXIO_I2C_MasterStart(base, handle->transfer.slaveAddress, kFLEXIO_I2C_Read); + + /* Next state, receive data begin. */ + handle->state = (uint8_t)kFLEXIO_I2C_ReceiveDataBegin; + } + } + } + return true; +} + +static bool FLEXIO_I2C_MasterTransferStateMachineSendData(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags) +{ + if ((statusFlags & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) + { + /* Send one byte of data. */ + if (handle->transfer.dataSize > 0U) + { + FLEXIO_I2C_MasterWriteByte(base, *handle->transfer.data); + + handle->transfer.data++; + handle->transfer.dataSize--; + } + else + { + FLEXIO_I2C_MasterStop(base); + +#if I2C_RETRY_TIMES + while ((0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return false; + } +#else + while (0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) + { + } +#endif + (void)FLEXIO_I2C_MasterReadByte(base); + + handle->state = (uint8_t)kFLEXIO_I2C_Idle; + } + } + return true; +} + +static bool FLEXIO_I2C_MasterTransferStateMachineReceiveDataBegin(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags) +{ + if ((statusFlags & (uint32_t)kFLEXIO_I2C_RxFullFlag) != 0U) + { + handle->state = (uint8_t)kFLEXIO_I2C_ReceiveData; + /* Send nak at the last receive byte. */ + if (handle->transfer.dataSize == 1U) + { + FLEXIO_I2C_MasterEnableAck(base, false); +#if I2C_RETRY_TIMES + while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return false; + } +#else + while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) + { + } +#endif + FLEXIO_I2C_MasterStop(base); + } + else + { + FLEXIO_I2C_MasterEnableAck(base, true); + } + } + else if ((statusFlags & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) + { + /* Read one byte of data. */ + FLEXIO_I2C_MasterWriteByte(base, 0xFFFFFFFFU); + } + else + { + ; /* Avoid MISRA 2012 rule 15.7 */ + } + return true; +} + +static status_t FLEXIO_I2C_MasterTransferStateMachineReceiveData(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags) +{ + if ((statusFlags & (uint32_t)kFLEXIO_I2C_RxFullFlag) != 0U) + { + *handle->transfer.data = FLEXIO_I2C_MasterReadByte(base); + handle->transfer.data++; + if (0U != handle->transfer.dataSize--) + { + if (handle->transfer.dataSize == 0U) + { + FLEXIO_I2C_MasterDisableInterrupts(base, (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); + handle->state = (uint8_t)kFLEXIO_I2C_Idle; + /* Return nak if ReceiveNakFlag is not set */ + if ((statusFlags & (uint32_t)kFLEXIO_I2C_ReceiveNakFlag) == 0U) + { + return kStatus_FLEXIO_I2C_Nak; + } + } + + /* Send nak at the last receive byte. */ + if (handle->transfer.dataSize == 1U) + { + FLEXIO_I2C_MasterEnableAck(base, false); +#if I2C_RETRY_TIMES + while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return kStatus_FLEXIO_I2C_Timeout; + } +#else + while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) + { + } +#endif + FLEXIO_I2C_MasterStop(base); + } + } + } + else if ((statusFlags & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) + { + if (handle->transfer.dataSize > 1U) + { + FLEXIO_I2C_MasterWriteByte(base, 0xFFFFFFFFU); + } + } + else + { + ; /* Avoid MISRA 2012 rule 15.7 */ + } + return kStatus_Success; +} + +static status_t FLEXIO_I2C_MasterTransferRunStateMachine(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + uint32_t statusFlags) +{ + status_t status; +#if I2C_RETRY_TIMES + uint32_t waitTimes = I2C_RETRY_TIMES; +#endif + + if ((statusFlags & (uint32_t)kFLEXIO_I2C_ReceiveNakFlag) != 0U) + { + /* Clear receive nak flag. */ + FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]); + + if ((!((handle->state == (uint8_t)kFLEXIO_I2C_SendData) && (handle->transfer.dataSize == 0U))) && + (!(((handle->state == (uint8_t)kFLEXIO_I2C_ReceiveData) || + (handle->state == (uint8_t)kFLEXIO_I2C_ReceiveDataBegin)) && + (handle->transfer.dataSize == 1U)))) + { + (void)FLEXIO_I2C_MasterReadByte(base); + + FLEXIO_I2C_MasterAbortStop(base); + + /* Delay one clk cycle to ensure the bus is idle. */ + SDK_DelayAtLeastUs(1000000UL / base->baudrate, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); + + handle->state = (uint8_t)kFLEXIO_I2C_Idle; + + return kStatus_FLEXIO_I2C_Nak; + } + } + + if (((statusFlags & (uint8_t)kFLEXIO_I2C_RxFullFlag) != 0U) && (handle->state != (uint8_t)kFLEXIO_I2C_ReceiveData)) + { + (void)FLEXIO_I2C_MasterReadByte(base); + } + + switch (handle->state) + { + /* Initial state, i2c start state. */ + case (uint8_t)kFLEXIO_I2C_Start: + /* Send address byte first. */ + FLEXIO_I2C_MasterTransferStateMachineStart(base, handle); + break; + + /* Check address only needed for transfer with subaddress */ + case (uint8_t)kFLEXIO_I2C_SendCommand: + if (false == FLEXIO_I2C_MasterTransferStateMachineSendCommand(base, handle, statusFlags)) + { + return kStatus_FLEXIO_I2C_Timeout; + } + break; + + /* Send command byte. */ + case (uint8_t)kFLEXIO_I2C_SendData: + if (false == FLEXIO_I2C_MasterTransferStateMachineSendData(base, handle, statusFlags)) + { + return kStatus_FLEXIO_I2C_Timeout; + } + break; + + case (uint8_t)kFLEXIO_I2C_ReceiveDataBegin: + if (false == FLEXIO_I2C_MasterTransferStateMachineReceiveDataBegin(base, handle, statusFlags)) + { + return kStatus_FLEXIO_I2C_Timeout; + } + break; + + case (uint8_t)kFLEXIO_I2C_ReceiveData: + status = FLEXIO_I2C_MasterTransferStateMachineReceiveData(base, handle, statusFlags); + if (kStatus_Success != status) + { + return status; + } + break; + + default: + /* Add comment to avoid MISRA violation */ + break; + } + + return kStatus_Success; +} + +static void FLEXIO_I2C_MasterTransferComplete(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + status_t status) +{ + FLEXIO_I2C_MasterDisableInterrupts( + base, (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable | (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); + + if (handle->completionCallback != NULL) + { + handle->completionCallback(base, handle, status, handle->userData); + } +} + +#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS +/*! + * brief Make sure the bus isn't already pulled down. + * + * Check the FLEXIO pin status to see whether either of SDA and SCL pin is pulled down. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * retval kStatus_Success + * retval kStatus_FLEXIO_I2C_Busy + */ +status_t FLEXIO_I2C_CheckForBusyBus(FLEXIO_I2C_Type *base) +{ + uint32_t mask; + /* If in certain loops the SDA/SCL is continuously pulled down, then return bus busy status. */ + /* The loop count is determined by maximum CPU clock frequency */ + for (uint32_t i = 0U; i < SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY / 600000U; ++i) + { + mask = 1UL << base->SDAPinIndex | 1UL << base->SCLPinIndex; + if ((FLEXIO_ReadPinInput(base->flexioBase) & mask) == mask) + { + return kStatus_Success; + } + } + return kStatus_FLEXIO_I2C_Busy; +} +#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ + +/*! + * brief Ungates the FlexIO clock, resets the FlexIO module, and configures the FlexIO I2C + * hardware configuration. + * + * Example + code + FLEXIO_I2C_Type base = { + .flexioBase = FLEXIO, + .SDAPinIndex = 0, + .SCLPinIndex = 1, + .shifterIndex = {0,1}, + .timerIndex = {0,1} + }; + flexio_i2c_master_config_t config = { + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false, + .baudRate_Bps = 100000 + }; + FLEXIO_I2C_MasterInit(base, &config, srcClock_Hz); + endcode + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param masterConfig Pointer to flexio_i2c_master_config_t structure. + * param srcClock_Hz FlexIO source clock in Hz. + * retval kStatus_Success Initialization successful + * retval kStatus_InvalidArgument The source clock exceed upper range limitation +*/ +status_t FLEXIO_I2C_MasterInit(FLEXIO_I2C_Type *base, flexio_i2c_master_config_t *masterConfig, uint32_t srcClock_Hz) +{ + assert((base != NULL) && (masterConfig != NULL)); + + flexio_shifter_config_t shifterConfig; + flexio_timer_config_t timerConfig; + uint32_t controlVal = 0; + uint16_t timerDiv = 0; + status_t result = kStatus_Success; + + (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); + (void)memset(&timerConfig, 0, sizeof(timerConfig)); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate flexio clock. */ + CLOCK_EnableClock(s_flexioClocks[FLEXIO_I2C_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + /* Do hardware configuration. */ + /* 1. Configure the shifter 0 for tx. */ + shifterConfig.timerSelect = base->timerIndex[2]; + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; + shifterConfig.pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection; + shifterConfig.pinSelect = base->SDAPinIndex; + shifterConfig.pinPolarity = kFLEXIO_PinActiveLow; + shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; + shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitHigh; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitLow; + + FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig); + + /* 2. Configure the shifter 1 for rx. */ + shifterConfig.timerSelect = base->timerIndex[2]; + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; + shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + shifterConfig.pinSelect = base->SDAPinIndex; + shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; + shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; + shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitLow; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; + + FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig); + + /*3. Configure the timer 0 and timer 1 for generating bit clock. */ + /* timer 1 is used to config baudrate */ + timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); + timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; + timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; + timerConfig.pinConfig = kFLEXIO_PinConfigOpenDrainOrBidirection; + timerConfig.pinSelect = base->SCLPinIndex; + timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; + timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; + timerConfig.timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset; + timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; + timerConfig.timerReset = kFLEXIO_TimerResetOnTimerPinEqualToTimerOutput; + timerConfig.timerDisable = kFLEXIO_TimerDisableOnPreTimerDisable; + timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; + timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; + timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; + + /* Set TIMCMP = (baud rate divider / 2) - 1. */ + timerDiv = (uint16_t)(srcClock_Hz / masterConfig->baudRate_Bps) / 2U - 1U; + /* Calculate and assign the actual baudrate. */ + base->baudrate = srcClock_Hz / (2U * ((uint32_t)timerDiv + 1U)); + + timerConfig.timerCompare = timerDiv; + + FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[1], &timerConfig); + + /* timer 0 is used to config total shift clock edges */ + timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); + timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; + timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; + timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + timerConfig.pinSelect = base->SCLPinIndex; + timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; + timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; + timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; + timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput; + timerConfig.timerReset = kFLEXIO_TimerResetNever; + timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; + timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; + timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; + timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; + + /* Set TIMCMP when confinguring transfer bytes. */ + FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig); + + /* 4. Configure the timer 2 for controlling shifters. */ + timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); + timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; + timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; + timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + timerConfig.pinSelect = base->SCLPinIndex; + timerConfig.pinPolarity = kFLEXIO_PinActiveLow; + timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; + timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; + timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput; + timerConfig.timerReset = kFLEXIO_TimerResetNever; + timerConfig.timerDisable = kFLEXIO_TimerDisableOnPreTimerDisable; + timerConfig.timerEnable = kFLEXIO_TimerEnableOnPrevTimerEnable; + timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerCompare; + timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; + + /* Set TIMCMP[15:0] = (number of bits x 2) - 1. */ + timerConfig.timerCompare = 8U * 2U - 1U; + + FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[2], &timerConfig); + + /* Configure FLEXIO I2C Master. */ + controlVal = base->flexioBase->CTRL; + controlVal &= + ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); + controlVal |= (FLEXIO_CTRL_DBGE(masterConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(masterConfig->enableFastAccess) | + FLEXIO_CTRL_FLEXEN(masterConfig->enableMaster)); + if (!masterConfig->enableInDoze) + { + controlVal |= FLEXIO_CTRL_DOZEN_MASK; + } + + base->flexioBase->CTRL = controlVal; + /* Disable internal IRQs. */ + FLEXIO_I2C_MasterDisableInterrupts( + base, (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable | (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); + return result; +} + +/*! + * brief De-initializes the FlexIO I2C master peripheral. Calling this API Resets the FlexIO I2C master + * shifer and timer config, module can't work unless the FLEXIO_I2C_MasterInit is called. + * + * param base pointer to FLEXIO_I2C_Type structure. + */ +void FLEXIO_I2C_MasterDeinit(FLEXIO_I2C_Type *base) +{ + base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = 0; + base->flexioBase->SHIFTCTL[base->shifterIndex[0]] = 0; + base->flexioBase->SHIFTCFG[base->shifterIndex[1]] = 0; + base->flexioBase->SHIFTCTL[base->shifterIndex[1]] = 0; + base->flexioBase->TIMCFG[base->timerIndex[0]] = 0; + base->flexioBase->TIMCMP[base->timerIndex[0]] = 0; + base->flexioBase->TIMCTL[base->timerIndex[0]] = 0; + base->flexioBase->TIMCFG[base->timerIndex[1]] = 0; + base->flexioBase->TIMCMP[base->timerIndex[1]] = 0; + base->flexioBase->TIMCTL[base->timerIndex[1]] = 0; + base->flexioBase->TIMCFG[base->timerIndex[2]] = 0; + base->flexioBase->TIMCMP[base->timerIndex[2]] = 0; + base->flexioBase->TIMCTL[base->timerIndex[2]] = 0; + /* Clear the shifter flag. */ + base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[0]); + base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[1]); + /* Clear the timer flag. */ + base->flexioBase->TIMSTAT = (1UL << base->timerIndex[0]); + base->flexioBase->TIMSTAT = (1UL << base->timerIndex[1]); + base->flexioBase->TIMSTAT = (1UL << base->timerIndex[2]); +} + +/*! + * brief Gets the default configuration to configure the FlexIO module. The configuration + * can be used directly for calling the FLEXIO_I2C_MasterInit(). + * + * Example: + code + flexio_i2c_master_config_t config; + FLEXIO_I2C_MasterGetDefaultConfig(&config); + endcode + * param masterConfig Pointer to flexio_i2c_master_config_t structure. +*/ +void FLEXIO_I2C_MasterGetDefaultConfig(flexio_i2c_master_config_t *masterConfig) +{ + assert(masterConfig != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(masterConfig, 0, sizeof(*masterConfig)); + + masterConfig->enableMaster = true; + masterConfig->enableInDoze = false; + masterConfig->enableInDebug = true; + masterConfig->enableFastAccess = false; + + /* Default baud rate at 100kbps. */ + masterConfig->baudRate_Bps = 100000U; +} + +/*! + * brief Gets the FlexIO I2C master status flags. + * + * param base Pointer to FLEXIO_I2C_Type structure + * return Status flag, use status flag to AND #_flexio_i2c_master_status_flags can get the related status. + */ + +uint32_t FLEXIO_I2C_MasterGetStatusFlags(FLEXIO_I2C_Type *base) +{ + uint32_t status = 0; + + status = + ((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0])) >> base->shifterIndex[0]); + status |= + (((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) + << 1U); + status |= + (((FLEXIO_GetShifterErrorFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) + << 2U); + + return status; +} + +/*! + * brief Clears the FlexIO I2C master status flags. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param mask Status flag. + * The parameter can be any combination of the following values: + * arg kFLEXIO_I2C_RxFullFlag + * arg kFLEXIO_I2C_ReceiveNakFlag + */ + +void FLEXIO_I2C_MasterClearStatusFlags(FLEXIO_I2C_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_I2C_TxEmptyFlag) != 0U) + { + FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[0]); + } + + if ((mask & (uint32_t)kFLEXIO_I2C_RxFullFlag) != 0U) + { + FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[1]); + } + + if ((mask & (uint32_t)kFLEXIO_I2C_ReceiveNakFlag) != 0U) + { + FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Enables the FlexIO i2c master interrupt requests. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param mask Interrupt source. + * Currently only one interrupt request source: + * arg kFLEXIO_I2C_TransferCompleteInterruptEnable + */ +void FLEXIO_I2C_MasterEnableInterrupts(FLEXIO_I2C_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable) != 0U) + { + FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); + } + if ((mask & (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable) != 0U) + { + FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Disables the FlexIO I2C master interrupt requests. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param mask Interrupt source. + */ +void FLEXIO_I2C_MasterDisableInterrupts(FLEXIO_I2C_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable) != 0U) + { + FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); + } + if ((mask & (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable) != 0U) + { + FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Sets the FlexIO I2C master transfer baudrate. + * + * param base Pointer to FLEXIO_I2C_Type structure + * param baudRate_Bps the baud rate value in HZ + * param srcClock_Hz source clock in HZ + */ +void FLEXIO_I2C_MasterSetBaudRate(FLEXIO_I2C_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz) +{ + uint16_t timerDiv = 0; + FLEXIO_Type *flexioBase = base->flexioBase; + + /* Set TIMCMP = (baud rate divider / 2) - 1.*/ + timerDiv = (uint16_t)((srcClock_Hz / baudRate_Bps) / 2U - 1U); + + flexioBase->TIMCMP[base->timerIndex[1]] = timerDiv; + + /* Calculate and assign the actual baudrate. */ + base->baudrate = srcClock_Hz / (2U * ((uint32_t)timerDiv + 1U)); +} + +/*! + * brief Sets the number of bytes to be transferred from a start signal to a stop signal. + * + * note Call this API before a transfer begins because the timer generates a number of clocks according + * to the number of bytes that need to be transferred. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param count Number of bytes need to be transferred from a start signal to a re-start/stop signal + * retval kStatus_Success Successfully configured the count. + * retval kStatus_InvalidArgument Input argument is invalid. + */ +status_t FLEXIO_I2C_MasterSetTransferCount(FLEXIO_I2C_Type *base, uint16_t count) +{ + /* Calculate whether the transfer count is larger than the max value compare register can achieve */ + if (count > ((0xFFFFUL - 1UL) / (16UL + 1UL + 1UL))) + { + return kStatus_InvalidArgument; + } + + uint32_t timerConfig = 0U; + FLEXIO_Type *flexioBase = base->flexioBase; + + flexioBase->TIMCMP[base->timerIndex[0]] = (uint32_t)count * 18U + 1U; + timerConfig = flexioBase->TIMCFG[base->timerIndex[0]]; + timerConfig &= ~FLEXIO_TIMCFG_TIMDIS_MASK; + timerConfig |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare); + flexioBase->TIMCFG[base->timerIndex[0]] = timerConfig; + + return kStatus_Success; +} + +/*! + * brief Sends START + 7-bit address to the bus. + * + * note This API should be called when the transfer configuration is ready to send a START signal + * and 7-bit address to the bus. This is a non-blocking API, which returns directly after the address + * is put into the data register but the address transfer is not finished on the bus. Ensure that + * the kFLEXIO_I2C_RxFullFlag status is asserted before calling this API. + * param base Pointer to FLEXIO_I2C_Type structure. + * param address 7-bit address. + * param direction transfer direction. + * This parameter is one of the values in flexio_i2c_direction_t: + * arg kFLEXIO_I2C_Write: Transmit + * arg kFLEXIO_I2C_Read: Receive + */ + +void FLEXIO_I2C_MasterStart(FLEXIO_I2C_Type *base, uint8_t address, flexio_i2c_direction_t direction) +{ + uint32_t data; + + data = ((uint32_t)address) << 1U | ((direction == kFLEXIO_I2C_Read) ? 1U : 0U); + + FLEXIO_I2C_MasterWriteByte(base, data); +} + +/*! + * brief Sends the repeated start signal on the bus. + * + * param base Pointer to FLEXIO_I2C_Type structure. + */ +void FLEXIO_I2C_MasterRepeatedStart(FLEXIO_I2C_Type *base) +{ + /* Prepare for RESTART condition, no stop.*/ + FLEXIO_I2C_MasterWriteByte(base, 0xFFFFFFFFU); +} + +/*! + * brief Sends the stop signal on the bus. + * + * param base Pointer to FLEXIO_I2C_Type structure. + */ +void FLEXIO_I2C_MasterStop(FLEXIO_I2C_Type *base) +{ + /* Prepare normal stop. */ + (void)FLEXIO_I2C_MasterSetTransferCount(base, 0x0U); + FLEXIO_I2C_MasterWriteByte(base, 0x0U); +} + +/*! + * brief Sends the stop signal when transfer is still on-going. + * + * param base Pointer to FLEXIO_I2C_Type structure. + */ +void FLEXIO_I2C_MasterAbortStop(FLEXIO_I2C_Type *base) +{ + uint32_t tmpConfig; + + /* Prepare abort stop. */ + /* Disable timer 0. */ + tmpConfig = base->flexioBase->TIMCFG[base->timerIndex[0]]; + tmpConfig &= ~FLEXIO_TIMCFG_TIMDIS_MASK; + tmpConfig |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnPinBothEdge); + base->flexioBase->TIMCFG[base->timerIndex[0]] = tmpConfig; + + /* Disable timer 1. */ + tmpConfig = base->flexioBase->TIMCFG[base->timerIndex[1]]; + tmpConfig &= ~FLEXIO_TIMCFG_TIMDIS_MASK; + tmpConfig |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnPinBothEdge); + base->flexioBase->TIMCFG[base->timerIndex[1]] = tmpConfig; +} + +/*! + * brief Configures the sent ACK/NAK for the following byte. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param enable True to configure send ACK, false configure to send NAK. + */ +void FLEXIO_I2C_MasterEnableAck(FLEXIO_I2C_Type *base, bool enable) +{ + uint32_t tmpConfig = 0; + + tmpConfig = base->flexioBase->SHIFTCFG[base->shifterIndex[0]]; + tmpConfig &= ~FLEXIO_SHIFTCFG_SSTOP_MASK; + if (enable) + { + tmpConfig |= FLEXIO_SHIFTCFG_SSTOP(kFLEXIO_ShifterStopBitLow); + } + else + { + tmpConfig |= FLEXIO_SHIFTCFG_SSTOP(kFLEXIO_ShifterStopBitHigh); + } + base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = tmpConfig; +} + +/*! + * brief Sends a buffer of data in bytes. + * + * note This function blocks via polling until all bytes have been sent. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param txBuff The data bytes to send. + * param txSize The number of data bytes to send. + * retval kStatus_Success Successfully write data. + * retval kStatus_FLEXIO_I2C_Nak Receive NAK during writing data. + * retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. + */ +status_t FLEXIO_I2C_MasterWriteBlocking(FLEXIO_I2C_Type *base, const uint8_t *txBuff, uint8_t txSize) +{ + assert(txBuff != NULL); + assert(txSize != 0U); + + uint32_t status; +#if I2C_RETRY_TIMES + uint32_t waitTimes = I2C_RETRY_TIMES; +#endif + + while (0U != txSize--) + { + FLEXIO_I2C_MasterWriteByte(base, *txBuff++); + + /* Wait until data transfer complete. */ +#if I2C_RETRY_TIMES + waitTimes = I2C_RETRY_TIMES; + while ((0U == ((status = FLEXIO_I2C_MasterGetStatusFlags(base)) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return kStatus_FLEXIO_I2C_Timeout; + } +#else + while (0U == ((status = FLEXIO_I2C_MasterGetStatusFlags(base)) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) + { + } +#endif + + if ((status & (uint32_t)kFLEXIO_I2C_ReceiveNakFlag) != 0U) + { + FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]); + return kStatus_FLEXIO_I2C_Nak; + } + } + return kStatus_Success; +} + +/*! + * brief Receives a buffer of bytes. + * + * note This function blocks via polling until all bytes have been received. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param rxBuff The buffer to store the received bytes. + * param rxSize The number of data bytes to be received. + * retval kStatus_Success Successfully read data. + * retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. + */ +status_t FLEXIO_I2C_MasterReadBlocking(FLEXIO_I2C_Type *base, uint8_t *rxBuff, uint8_t rxSize) +{ + assert(rxBuff != NULL); + assert(rxSize != 0U); + +#if I2C_RETRY_TIMES + uint32_t waitTimes = I2C_RETRY_TIMES; +#endif + + while (0U != rxSize--) + { + /* Wait until data transfer complete. */ +#if I2C_RETRY_TIMES + waitTimes = I2C_RETRY_TIMES; + while ((0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return kStatus_FLEXIO_I2C_Timeout; + } +#else + while (0U == (FLEXIO_I2C_MasterGetStatusFlags(base) & (uint32_t)kFLEXIO_I2C_RxFullFlag)) + { + } +#endif + *rxBuff++ = FLEXIO_I2C_MasterReadByte(base); + } + return kStatus_Success; +} + +/*! + * brief Performs a master polling transfer on the I2C bus. + * + * note The API does not return until the transfer succeeds or fails due + * to receiving NAK. + * + * param base pointer to FLEXIO_I2C_Type structure. + * param xfer pointer to flexio_i2c_master_transfer_t structure. + * return status of status_t. + */ +status_t FLEXIO_I2C_MasterTransferBlocking(FLEXIO_I2C_Type *base, flexio_i2c_master_transfer_t *xfer) +{ + assert(xfer != NULL); + +#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS + /* Return an error if the bus is already in use not by us.*/ + status_t status = FLEXIO_I2C_CheckForBusyBus(base); + if (status != kStatus_Success) + { + return status; + } +#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ + + flexio_i2c_master_handle_t tmpHandle; + uint32_t statusFlags; + status_t result = kStatus_Success; +#if I2C_RETRY_TIMES + uint32_t waitTimes = I2C_RETRY_TIMES; +#endif + + /* Zero the handle. */ + (void)memset(&tmpHandle, 0, sizeof(tmpHandle)); + + /* Set up transfer machine. */ + result = FLEXIO_I2C_MasterTransferInitStateMachine(base, &tmpHandle, xfer); + if (result != kStatus_Success) + { + return result; + } + + do + { + /* Wait either tx empty or rx full flag is asserted. */ +#if I2C_RETRY_TIMES + waitTimes = I2C_RETRY_TIMES; + while ((0U == ((statusFlags = FLEXIO_I2C_MasterGetStatusFlags(base)) & + ((uint32_t)kFLEXIO_I2C_TxEmptyFlag | (uint32_t)kFLEXIO_I2C_RxFullFlag))) && + (0U != --waitTimes)) + { + } + if (0U == waitTimes) + { + return kStatus_FLEXIO_I2C_Timeout; + } +#else + while (0U == ((statusFlags = FLEXIO_I2C_MasterGetStatusFlags(base)) & + ((uint32_t)kFLEXIO_I2C_TxEmptyFlag | (uint32_t)kFLEXIO_I2C_RxFullFlag))) + { + } +#endif + FLEXIO_ClearTimerStatusFlags(base->flexioBase, ((1UL << base->timerIndex[0]) | (1UL << base->timerIndex[1]))); + result = FLEXIO_I2C_MasterTransferRunStateMachine(base, &tmpHandle, statusFlags); + + } while ((tmpHandle.state != (uint8_t)kFLEXIO_I2C_Idle) && (result == kStatus_Success)); + + /* Timer disable on timer compare, wait until bit clock TSF set, which means timer disable and stop has been sent. + */ + while (0U == (FLEXIO_GetTimerStatusFlags(base->flexioBase) & (1UL << base->timerIndex[1]))) + { + } + + return result; +} + +/*! + * brief Initializes the I2C handle which is used in transactional functions. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param handle Pointer to flexio_i2c_master_handle_t structure to store the transfer state. + * param callback Pointer to user callback function. + * param userData User param passed to the callback function. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO type/handle/isr table out of range. + */ +status_t FLEXIO_I2C_MasterTransferCreateHandle(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + flexio_i2c_master_transfer_callback_t callback, + void *userData) +{ + assert(handle != NULL); + + IRQn_Type flexio_irqs[] = FLEXIO_IRQS; + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Register callback and userData. */ + handle->completionCallback = callback; + handle->userData = userData; + + /* Clear pending NVIC IRQ before enable NVIC IRQ. */ + NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_I2C_GetInstance(base)]); + (void)EnableIRQ(flexio_irqs[FLEXIO_I2C_GetInstance(base)]); + + /* Save the context in global variables to support the double weak mechanism. */ + return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_I2C_MasterTransferHandleIRQ); +} + +/*! + * brief Performs a master interrupt non-blocking transfer on the I2C bus. + * + * note The API returns immediately after the transfer initiates. + * Call FLEXIO_I2C_MasterTransferGetCount to poll the transfer status to check whether + * the transfer is finished. If the return status is not kStatus_FLEXIO_I2C_Busy, the transfer + * is finished. + * + * param base Pointer to FLEXIO_I2C_Type structure + * param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * param xfer pointer to flexio_i2c_master_transfer_t structure + * retval kStatus_Success Successfully start a transfer. + * retval kStatus_FLEXIO_I2C_Busy FlexIO I2C is not idle, is running another transfer. + */ +status_t FLEXIO_I2C_MasterTransferNonBlocking(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + flexio_i2c_master_transfer_t *xfer) +{ + assert(handle != NULL); + assert(xfer != NULL); + + status_t result = kStatus_Success; + +#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS + /* Return an error if the bus is already in use not by us.*/ + result = FLEXIO_I2C_CheckForBusyBus(base); + if (result != kStatus_Success) + { + return result; + } +#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ + + if (handle->state != (uint8_t)kFLEXIO_I2C_Idle) + { + return kStatus_FLEXIO_I2C_Busy; + } + else + { + /* Set up transfer machine. */ + result = FLEXIO_I2C_MasterTransferInitStateMachine(base, handle, xfer); + if (result != kStatus_Success) + { + return result; + } + + /* Enable both tx empty and rxfull interrupt. */ + FLEXIO_I2C_MasterEnableInterrupts( + base, (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable | (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); + + return kStatus_Success; + } +} + +/*! + * brief Aborts an interrupt non-blocking transfer early. + * + * note This API can be called at any time when an interrupt non-blocking transfer initiates + * to abort the transfer early. + * + * param base Pointer to FLEXIO_I2C_Type structure + * param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state + */ +void FLEXIO_I2C_MasterTransferAbort(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle) +{ + assert(handle != NULL); + + /* Disable interrupts. */ + FLEXIO_I2C_MasterDisableInterrupts( + base, (uint32_t)kFLEXIO_I2C_TxEmptyInterruptEnable | (uint32_t)kFLEXIO_I2C_RxFullInterruptEnable); + + /* Reset to idle state. */ + handle->state = (uint8_t)kFLEXIO_I2C_Idle; +} + +/*! + * brief Gets the master transfer status during a interrupt non-blocking transfer. + * + * param base Pointer to FLEXIO_I2C_Type structure. + * param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state. + * param count Number of bytes transferred so far by the non-blocking transaction. + * retval kStatus_InvalidArgument count is Invalid. + * retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. + * retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_I2C_MasterTransferGetCount(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle, size_t *count) +{ + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (handle->state == (uint8_t)kFLEXIO_I2C_Idle) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + *count = handle->transferSize - handle->transfer.dataSize; + + return kStatus_Success; +} + +/*! + * brief Master interrupt handler. + * + * param i2cType Pointer to FLEXIO_I2C_Type structure + * param i2cHandle Pointer to flexio_i2c_master_transfer_t structure + */ +void FLEXIO_I2C_MasterTransferHandleIRQ(void *i2cType, void *i2cHandle) +{ + FLEXIO_I2C_Type *base = (FLEXIO_I2C_Type *)i2cType; + flexio_i2c_master_handle_t *handle = (flexio_i2c_master_handle_t *)i2cHandle; + uint32_t statusFlags; + status_t result; + + statusFlags = FLEXIO_I2C_MasterGetStatusFlags(base); + + result = FLEXIO_I2C_MasterTransferRunStateMachine(base, handle, statusFlags); + + if (handle->state == (uint8_t)kFLEXIO_I2C_Idle) + { + FLEXIO_I2C_MasterTransferComplete(base, handle, result); + } +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_i2c_master.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_i2c_master.h new file mode 100644 index 00000000000..6b33abe22ca --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_i2c_master.h @@ -0,0 +1,485 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_FLEXIO_I2C_MASTER_H_ +#define FSL_FLEXIO_I2C_MASTER_H_ + +#include "fsl_common.h" +#include "fsl_flexio.h" + +/*! + * @addtogroup flexio_i2c_master + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +#define FSL_FLEXIO_I2C_MASTER_DRIVER_VERSION (MAKE_VERSION(2, 5, 0)) +/*! @} */ + +/*! @brief Retry times for waiting flag. */ +#ifndef I2C_RETRY_TIMES +#define I2C_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ +#endif + +/*! @brief FlexIO I2C transfer status*/ +enum +{ + kStatus_FLEXIO_I2C_Busy = MAKE_STATUS(kStatusGroup_FLEXIO_I2C, 0), /*!< I2C is busy doing transfer. */ + kStatus_FLEXIO_I2C_Idle = MAKE_STATUS(kStatusGroup_FLEXIO_I2C, 1), /*!< I2C is busy doing transfer. */ + kStatus_FLEXIO_I2C_Nak = MAKE_STATUS(kStatusGroup_FLEXIO_I2C, 2), /*!< NAK received during transfer. */ + kStatus_FLEXIO_I2C_Timeout = MAKE_STATUS(kStatusGroup_FLEXIO_I2C, 3), /*!< Timeout polling status flags. */ +}; + +/*! @brief Define FlexIO I2C master interrupt mask. */ +enum _flexio_i2c_master_interrupt +{ + kFLEXIO_I2C_TxEmptyInterruptEnable = 0x1U, /*!< Tx buffer empty interrupt enable. */ + kFLEXIO_I2C_RxFullInterruptEnable = 0x2U, /*!< Rx buffer full interrupt enable. */ +}; + +/*! @brief Define FlexIO I2C master status mask. */ +enum _flexio_i2c_master_status_flags +{ + kFLEXIO_I2C_TxEmptyFlag = 0x1U, /*!< Tx shifter empty flag. */ + kFLEXIO_I2C_RxFullFlag = 0x2U, /*!< Rx shifter full/Transfer complete flag. */ + kFLEXIO_I2C_ReceiveNakFlag = 0x4U, /*!< Receive NAK flag. */ +}; + +/*! @brief Direction of master transfer.*/ +typedef enum _flexio_i2c_direction +{ + kFLEXIO_I2C_Write = 0x0U, /*!< Master send to slave. */ + kFLEXIO_I2C_Read = 0x1U, /*!< Master receive from slave. */ +} flexio_i2c_direction_t; + +/*! @brief Define FlexIO I2C master access structure typedef. */ +typedef struct _flexio_i2c_type +{ + FLEXIO_Type *flexioBase; /*!< FlexIO base pointer. */ + uint8_t SDAPinIndex; /*!< Pin select for I2C SDA. */ + uint8_t SCLPinIndex; /*!< Pin select for I2C SCL. */ + uint8_t shifterIndex[2]; /*!< Shifter index used in FlexIO I2C. */ + uint8_t timerIndex[3]; /*!< Timer index used in FlexIO I2C. */ + uint32_t baudrate; /*!< Master transfer baudrate, used to calculate delay time. */ +} FLEXIO_I2C_Type; + +/*! @brief Define FlexIO I2C master user configuration structure. */ +typedef struct _flexio_i2c_master_config +{ + bool enableMaster; /*!< Enables the FlexIO I2C peripheral at initialization time. */ + bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode. */ + bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode. */ + bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, fast access requires + the FlexIO clock to be at least twice the frequency of the bus clock. */ + uint32_t baudRate_Bps; /*!< Baud rate in Bps. */ +} flexio_i2c_master_config_t; + +/*! @brief Define FlexIO I2C master transfer structure. */ +typedef struct _flexio_i2c_master_transfer +{ + uint32_t flags; /*!< Transfer flag which controls the transfer, reserved for FlexIO I2C. */ + uint8_t slaveAddress; /*!< 7-bit slave address. */ + flexio_i2c_direction_t direction; /*!< Transfer direction, read or write. */ + uint32_t subaddress; /*!< Sub address. Transferred MSB first. */ + uint8_t subaddressSize; /*!< Size of command buffer. */ + uint8_t volatile *data; /*!< Transfer buffer. */ + volatile size_t dataSize; /*!< Transfer size. */ +} flexio_i2c_master_transfer_t; + +/*! @brief FlexIO I2C master handle typedef. */ +typedef struct _flexio_i2c_master_handle flexio_i2c_master_handle_t; + +/*! @brief FlexIO I2C master transfer callback typedef. */ +typedef void (*flexio_i2c_master_transfer_callback_t)(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + status_t status, + void *userData); + +/*! @brief Define FlexIO I2C master handle structure. */ +struct _flexio_i2c_master_handle +{ + flexio_i2c_master_transfer_t transfer; /*!< FlexIO I2C master transfer copy. */ + size_t transferSize; /*!< Total bytes to be transferred. */ + uint8_t state; /*!< Transfer state maintained during transfer. */ + flexio_i2c_master_transfer_callback_t completionCallback; /*!< Callback function called at transfer event. */ + /*!< Callback function called at transfer event. */ + void *userData; /*!< Callback parameter passed to callback function. */ + bool needRestart; /*!< Whether master needs to send re-start signal. */ +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /*_cplusplus*/ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +#if defined(FSL_FEATURE_FLEXIO_HAS_PIN_STATUS) && FSL_FEATURE_FLEXIO_HAS_PIN_STATUS +/*! + * @brief Make sure the bus isn't already pulled down. + * + * Check the FLEXIO pin status to see whether either of SDA and SCL pin is pulled down. + * + * @param base Pointer to FLEXIO_I2C_Type structure.. + * @retval kStatus_Success + * @retval kStatus_FLEXIO_I2C_Busy + */ +status_t FLEXIO_I2C_CheckForBusyBus(FLEXIO_I2C_Type *base); +#endif /*FSL_FEATURE_FLEXIO_HAS_PIN_STATUS*/ + +/*! + * @brief Ungates the FlexIO clock, resets the FlexIO module, and configures the FlexIO I2C + * hardware configuration. + * + * Example + @code + FLEXIO_I2C_Type base = { + .flexioBase = FLEXIO, + .SDAPinIndex = 0, + .SCLPinIndex = 1, + .shifterIndex = {0,1}, + .timerIndex = {0,1} + }; + flexio_i2c_master_config_t config = { + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false, + .baudRate_Bps = 100000 + }; + FLEXIO_I2C_MasterInit(base, &config, srcClock_Hz); + @endcode + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param masterConfig Pointer to flexio_i2c_master_config_t structure. + * @param srcClock_Hz FlexIO source clock in Hz. + * @retval kStatus_Success Initialization successful + * @retval kStatus_InvalidArgument The source clock exceed upper range limitation +*/ +status_t FLEXIO_I2C_MasterInit(FLEXIO_I2C_Type *base, flexio_i2c_master_config_t *masterConfig, uint32_t srcClock_Hz); + +/*! + * @brief De-initializes the FlexIO I2C master peripheral. Calling this API Resets the FlexIO I2C master + * shifer and timer config, module can't work unless the FLEXIO_I2C_MasterInit is called. + * + * @param base pointer to FLEXIO_I2C_Type structure. + */ +void FLEXIO_I2C_MasterDeinit(FLEXIO_I2C_Type *base); + +/*! + * @brief Gets the default configuration to configure the FlexIO module. The configuration + * can be used directly for calling the FLEXIO_I2C_MasterInit(). + * + * Example: + @code + flexio_i2c_master_config_t config; + FLEXIO_I2C_MasterGetDefaultConfig(&config); + @endcode + * @param masterConfig Pointer to flexio_i2c_master_config_t structure. +*/ +void FLEXIO_I2C_MasterGetDefaultConfig(flexio_i2c_master_config_t *masterConfig); + +/*! + * @brief Enables/disables the FlexIO module operation. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param enable Pass true to enable module, false does not have any effect. + */ +static inline void FLEXIO_I2C_MasterEnable(FLEXIO_I2C_Type *base, bool enable) +{ + if (enable) + { + base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; + } +} + +/*! @} */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets the FlexIO I2C master status flags. + * + * @param base Pointer to FLEXIO_I2C_Type structure + * @return Status flag, use status flag to AND #_flexio_i2c_master_status_flags can get the related status. + */ + +uint32_t FLEXIO_I2C_MasterGetStatusFlags(FLEXIO_I2C_Type *base); + +/*! + * @brief Clears the FlexIO I2C master status flags. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param mask Status flag. + * The parameter can be any combination of the following values: + * @arg kFLEXIO_I2C_RxFullFlag + * @arg kFLEXIO_I2C_ReceiveNakFlag + */ + +void FLEXIO_I2C_MasterClearStatusFlags(FLEXIO_I2C_Type *base, uint32_t mask); + +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables the FlexIO i2c master interrupt requests. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param mask Interrupt source. + * Currently only one interrupt request source: + * @arg kFLEXIO_I2C_TransferCompleteInterruptEnable + */ +void FLEXIO_I2C_MasterEnableInterrupts(FLEXIO_I2C_Type *base, uint32_t mask); + +/*! + * @brief Disables the FlexIO I2C master interrupt requests. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param mask Interrupt source. + */ +void FLEXIO_I2C_MasterDisableInterrupts(FLEXIO_I2C_Type *base, uint32_t mask); + +/*! @} */ + +/*! + * @name Bus Operations + * @{ + */ + +/*! + * @brief Sets the FlexIO I2C master transfer baudrate. + * + * @param base Pointer to FLEXIO_I2C_Type structure + * @param baudRate_Bps the baud rate value in HZ + * @param srcClock_Hz source clock in HZ + */ +void FLEXIO_I2C_MasterSetBaudRate(FLEXIO_I2C_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); + +/*! + * @brief Sends START + 7-bit address to the bus. + * + * @note This API should be called when the transfer configuration is ready to send a START signal + * and 7-bit address to the bus. This is a non-blocking API, which returns directly after the address + * is put into the data register but the address transfer is not finished on the bus. Ensure that + * the kFLEXIO_I2C_RxFullFlag status is asserted before calling this API. + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param address 7-bit address. + * @param direction transfer direction. + * This parameter is one of the values in flexio_i2c_direction_t: + * @arg kFLEXIO_I2C_Write: Transmit + * @arg kFLEXIO_I2C_Read: Receive + */ + +void FLEXIO_I2C_MasterStart(FLEXIO_I2C_Type *base, uint8_t address, flexio_i2c_direction_t direction); + +/*! + * @brief Sends the stop signal on the bus. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + */ +void FLEXIO_I2C_MasterStop(FLEXIO_I2C_Type *base); + +/*! + * @brief Sends the repeated start signal on the bus. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + */ +void FLEXIO_I2C_MasterRepeatedStart(FLEXIO_I2C_Type *base); + +/*! + * @brief Sends the stop signal when transfer is still on-going. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + */ +void FLEXIO_I2C_MasterAbortStop(FLEXIO_I2C_Type *base); + +/*! + * @brief Configures the sent ACK/NAK for the following byte. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param enable True to configure send ACK, false configure to send NAK. + */ +void FLEXIO_I2C_MasterEnableAck(FLEXIO_I2C_Type *base, bool enable); + +/*! + * @brief Sets the number of bytes to be transferred from a start signal to a stop signal. + * + * @note Call this API before a transfer begins because the timer generates a number of clocks according + * to the number of bytes that need to be transferred. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param count Number of bytes need to be transferred from a start signal to a re-start/stop signal + * @retval kStatus_Success Successfully configured the count. + * @retval kStatus_InvalidArgument Input argument is invalid. + */ +status_t FLEXIO_I2C_MasterSetTransferCount(FLEXIO_I2C_Type *base, uint16_t count); + +/*! + * @brief Writes one byte of data to the I2C bus. + * + * @note This is a non-blocking API, which returns directly after the data is put into the + * data register but the data transfer is not finished on the bus. Ensure that + * the TxEmptyFlag is asserted before calling this API. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param data a byte of data. + */ +static inline void FLEXIO_I2C_MasterWriteByte(FLEXIO_I2C_Type *base, uint32_t data) +{ + base->flexioBase->SHIFTBUFBBS[base->shifterIndex[0]] = data; +} + +/*! + * @brief Reads one byte of data from the I2C bus. + * + * @note This is a non-blocking API, which returns directly after the data is read from the + * data register. Ensure that the data is ready in the register. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @return data byte read. + */ +static inline uint8_t FLEXIO_I2C_MasterReadByte(FLEXIO_I2C_Type *base) +{ + return (uint8_t)(base->flexioBase->SHIFTBUFBIS[base->shifterIndex[1]]); +} + +/*! + * @brief Sends a buffer of data in bytes. + * + * @note This function blocks via polling until all bytes have been sent. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param txBuff The data bytes to send. + * @param txSize The number of data bytes to send. + * @retval kStatus_Success Successfully write data. + * @retval kStatus_FLEXIO_I2C_Nak Receive NAK during writing data. + * @retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. + */ +status_t FLEXIO_I2C_MasterWriteBlocking(FLEXIO_I2C_Type *base, const uint8_t *txBuff, uint8_t txSize); + +/*! + * @brief Receives a buffer of bytes. + * + * @note This function blocks via polling until all bytes have been received. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param rxBuff The buffer to store the received bytes. + * @param rxSize The number of data bytes to be received. + * @retval kStatus_Success Successfully read data. + * @retval kStatus_FLEXIO_I2C_Timeout Timeout polling status flags. + */ +status_t FLEXIO_I2C_MasterReadBlocking(FLEXIO_I2C_Type *base, uint8_t *rxBuff, uint8_t rxSize); + +/*! + * @brief Performs a master polling transfer on the I2C bus. + * + * @note The API does not return until the transfer succeeds or fails due + * to receiving NAK. + * + * @param base pointer to FLEXIO_I2C_Type structure. + * @param xfer pointer to flexio_i2c_master_transfer_t structure. + * @return status of status_t. + */ +status_t FLEXIO_I2C_MasterTransferBlocking(FLEXIO_I2C_Type *base, flexio_i2c_master_transfer_t *xfer); +/*! @} */ + +/*Transactional APIs*/ + +/*! + * @name Transactional + * @{ + */ + +/*! + * @brief Initializes the I2C handle which is used in transactional functions. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param handle Pointer to flexio_i2c_master_handle_t structure to store the transfer state. + * @param callback Pointer to user callback function. + * @param userData User param passed to the callback function. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO type/handle/isr table out of range. + */ +status_t FLEXIO_I2C_MasterTransferCreateHandle(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + flexio_i2c_master_transfer_callback_t callback, + void *userData); + +/*! + * @brief Performs a master interrupt non-blocking transfer on the I2C bus. + * + * @note The API returns immediately after the transfer initiates. + * Call FLEXIO_I2C_MasterTransferGetCount to poll the transfer status to check whether + * the transfer is finished. If the return status is not kStatus_FLEXIO_I2C_Busy, the transfer + * is finished. + * + * @param base Pointer to FLEXIO_I2C_Type structure + * @param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state + * @param xfer pointer to flexio_i2c_master_transfer_t structure + * @retval kStatus_Success Successfully start a transfer. + * @retval kStatus_FLEXIO_I2C_Busy FlexIO I2C is not idle, is running another transfer. + */ +status_t FLEXIO_I2C_MasterTransferNonBlocking(FLEXIO_I2C_Type *base, + flexio_i2c_master_handle_t *handle, + flexio_i2c_master_transfer_t *xfer); + +/*! + * @brief Gets the master transfer status during a interrupt non-blocking transfer. + * + * @param base Pointer to FLEXIO_I2C_Type structure. + * @param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state. + * @param count Number of bytes transferred so far by the non-blocking transaction. + * @retval kStatus_InvalidArgument count is Invalid. + * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. + * @retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_I2C_MasterTransferGetCount(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle, size_t *count); + +/*! + * @brief Aborts an interrupt non-blocking transfer early. + * + * @note This API can be called at any time when an interrupt non-blocking transfer initiates + * to abort the transfer early. + * + * @param base Pointer to FLEXIO_I2C_Type structure + * @param handle Pointer to flexio_i2c_master_handle_t structure which stores the transfer state + */ +void FLEXIO_I2C_MasterTransferAbort(FLEXIO_I2C_Type *base, flexio_i2c_master_handle_t *handle); + +/*! + * @brief Master interrupt handler. + * + * @param i2cType Pointer to FLEXIO_I2C_Type structure + * @param i2cHandle Pointer to flexio_i2c_master_transfer_t structure + */ +void FLEXIO_I2C_MasterTransferHandleIRQ(void *i2cType, void *i2cHandle); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif /*_cplusplus*/ +/*! @} */ + +#endif /*FSL_FLEXIO_I2C_MASTER_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd.c new file mode 100644 index 00000000000..217b6595a32 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd.c @@ -0,0 +1,1334 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexio_mculcd.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexio_mculcd" +#endif + +/******************************************************************************* + * Definitations + ******************************************************************************/ + +enum _mculcd_transfer_state +{ + kFLEXIO_MCULCD_StateIdle, /*!< No transfer in progress. */ + kFLEXIO_MCULCD_StateReadArray, /*!< Reading array in progress. */ + kFLEXIO_MCULCD_StateWriteArray, /*!< Writing array in progress. */ + kFLEXIO_MCULCD_StateWriteSameValue, /*!< Writing the same value in progress. */ +}; + +/* The TIMCFG[0:7] is used for baud rate divider in dual 8-bit counters baud/bit mode. */ +#define FLEXIO_BAUDRATE_DIV_MASK 0xFFU + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * brief Ungates the FlexIO clock, resets the FlexIO module, configures the + * FlexIO MCULCD hardware, and configures the FlexIO MCULCD with FlexIO MCULCD + * configuration. + * The configuration structure can be filled by the user, or be set with default + * values + * by the ref FLEXIO_MCULCD_GetDefaultConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param config Pointer to the flexio_mculcd_config_t structure. + * param srcClock_Hz FlexIO source clock in Hz. + * retval kStatus_Success Initialization success. + * retval kStatus_InvalidArgument Initialization failed because of invalid + * argument. + */ +status_t FLEXIO_MCULCD_Init(FLEXIO_MCULCD_Type *base, flexio_mculcd_config_t *config, uint32_t srcClock_Hz) +{ + assert(NULL != config); + status_t status; + + flexio_config_t flexioConfig = {config->enable, config->enableInDoze, config->enableInDebug, + config->enableFastAccess}; + + FLEXIO_Init(base->flexioBase, &flexioConfig); + + status = FLEXIO_MCULCD_SetBaudRate(base, config->baudRate_Bps, srcClock_Hz); + + if (kStatus_Success == status) + { + base->setCSPin(true); + base->setRSPin(true); + } + + return status; +} + +/*! + * brief Resets the FLEXIO_MCULCD timer and shifter configuration. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + */ +void FLEXIO_MCULCD_Deinit(FLEXIO_MCULCD_Type *base) +{ + FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); + FLEXIO_MCULCD_ClearSingleBeatReadConfig(base); +} + +/*! + * brief Gets the default configuration to configure the FlexIO MCULCD. + * + * The default configuration value is: + * code + * config->enable = true; + * config->enableInDoze = false; + * config->enableInDebug = true; + * config->enableFastAccess = true; + * config->baudRate_Bps = 96000000U; + * endcode + * param Config Pointer to the flexio_mculcd_config_t structure. + */ +void FLEXIO_MCULCD_GetDefaultConfig(flexio_mculcd_config_t *config) +{ + assert(NULL != config); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + config->enable = true; + config->enableInDoze = false; + config->enableInDebug = true; + config->enableFastAccess = true; + config->baudRate_Bps = 96000000U; +} + +/*! + * brief Set desired baud rate. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param baudRate_Bps Desired baud rate in bit-per-second for all data lines combined. + * param srcClock_Hz FLEXIO clock frequency in Hz. + * retval kStatus_Success Set successfully. + * retval kStatus_InvalidArgument Could not set the baud rate. + */ +status_t FLEXIO_MCULCD_SetBaudRate(FLEXIO_MCULCD_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz) +{ + uint32_t baudRateDiv; + uint32_t baudRatePerDataLine; + uint32_t timerCompare; + status_t status; + + baudRatePerDataLine = baudRate_Bps / (uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH; + + baudRateDiv = (srcClock_Hz + baudRatePerDataLine) / (baudRatePerDataLine * 2U); + + if ((0U == baudRateDiv) || (baudRateDiv > (FLEXIO_BAUDRATE_DIV_MASK + 1U))) + { + status = kStatus_InvalidArgument; + } + else + { + baudRateDiv--; + + timerCompare = base->flexioBase->TIMCMP[base->timerIndex]; + + timerCompare = (timerCompare & ~FLEXIO_BAUDRATE_DIV_MASK) | baudRateDiv; + + base->flexioBase->TIMCMP[base->timerIndex] = timerCompare; + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Gets FlexIO MCULCD status flags. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * return status flag; OR'ed value or the ref _flexio_mculcd_status_flags. + * + * note Don't use this function with DMA APIs. + */ +uint32_t FLEXIO_MCULCD_GetStatusFlags(FLEXIO_MCULCD_Type *base) +{ + uint32_t ret = 0U; + uint32_t flags; + + /* Get shifter status. */ + flags = FLEXIO_GetShifterStatusFlags(base->flexioBase); + + if (0U != (flags & (1UL << base->rxShifterEndIndex))) + { + ret |= (uint32_t)kFLEXIO_MCULCD_RxFullFlag; + } + + if (0U != (flags & (1UL << base->txShifterStartIndex))) + { + ret |= (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag; + } + + return ret; +} + +/*! + * brief Clears FlexIO MCULCD status flags. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param mask Status to clear, it is the OR'ed value of ref + * _flexio_mculcd_status_flags. + * + * note Don't use this function with DMA APIs. + */ +void FLEXIO_MCULCD_ClearStatusFlags(FLEXIO_MCULCD_Type *base, uint32_t mask) +{ + uint32_t flags = 0U; + + /* Clear the shifter flags. */ + if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_RxFullFlag)) + { + flags |= (1UL << base->rxShifterEndIndex); + } + + if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag)) + { + flags |= (1UL << base->txShifterStartIndex); + } + + FLEXIO_ClearShifterStatusFlags(base->flexioBase, flags); +} + +/*! + * brief Enables the FlexIO MCULCD interrupt. + * + * This function enables the FlexIO MCULCD interrupt. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param mask Interrupts to enable, it is the OR'ed value of ref + * _flexio_mculcd_interrupt_enable. + */ +void FLEXIO_MCULCD_EnableInterrupts(FLEXIO_MCULCD_Type *base, uint32_t mask) +{ + uint32_t interrupts = 0U; + + /* Enable shifter interrupts. */ + if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_RxFullFlag)) + { + interrupts |= (1UL << base->rxShifterEndIndex); + } + + if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag)) + { + interrupts |= (1UL << base->txShifterStartIndex); + } + + FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, interrupts); +} + +/*! + * brief Disables the FlexIO MCULCD interrupt. + * + * This function disables the FlexIO MCULCD interrupt. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param mask Interrupts to disable, it is the OR'ed value of ref + * _flexio_mculcd_interrupt_enable. + */ +void FLEXIO_MCULCD_DisableInterrupts(FLEXIO_MCULCD_Type *base, uint32_t mask) +{ + uint32_t interrupts = 0U; + + /* Disable shifter interrupts. */ + if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_RxFullFlag)) + { + interrupts |= (1UL << base->rxShifterEndIndex); + } + + if (0U != (mask & (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag)) + { + interrupts |= (1UL << base->txShifterStartIndex); + } + + FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, interrupts); +} + +/*! + * brief Read data from the FLEXIO MCULCD RX shifter buffer. + * + * Read data from the RX shift buffer directly, it does no check whether the + * buffer is empty or not. + * + * If the data bus width is 8-bit: + * code + * uint8_t value; + * value = (uint8_t)FLEXIO_MCULCD_ReadData(base); + * endcode + * + * If the data bus width is 16-bit: + * code + * uint16_t value; + * value = (uint16_t)FLEXIO_MCULCD_ReadData(base); + * endcode + * + * note This function returns the RX shifter buffer value (32-bit) directly. + * The return value should be converted according to data bus width. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * return The data read out. + * + * note Don't use this function with DMA APIs. + */ +uint32_t FLEXIO_MCULCD_ReadData(FLEXIO_MCULCD_Type *base) +{ +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + return base->flexioBase->SHIFTBUFBYS[base->rxShifterEndIndex]; +#else + return base->flexioBase->SHIFTBUFHWS[base->rxShifterEndIndex]; +#endif +} + +/*! + * brief Configures the FLEXIO MCULCD to single beats write mode. + * + * At the begining multiple beats write operation, the FLEXIO MCULCD is configured to + * multiple beats write mode using this function. After write operation, the configuration + * is cleared by ref FLEXIO_MCULCD_ClearSingleBeatWriteConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + * + * note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_SetSingleBeatWriteConfig(FLEXIO_MCULCD_Type *base) +{ + /* + * This function will be called at the beginning of every data writing. For + * performance consideration, it access the FlexIO registers directly, but not + * call FlexIO driver APIs. + */ + + uint32_t timerCompare; + uint32_t timerControl; + + /* Enable the TX Shifter output. */ + base->flexioBase->SHIFTCFG[base->txShifterStartIndex] = + FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U) | + FLEXIO_SHIFTCFG_INSRC(kFLEXIO_ShifterInputFromNextShifterOutput); + + base->flexioBase->SHIFTCTL[base->txShifterStartIndex] = + FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnPositive) | + FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutput) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | + FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit); + + timerCompare = base->flexioBase->TIMCMP[base->timerIndex] & 0xFFU; + + /* + * TIMCMP[15:8] = (number of beats x 2) - 1. Because the number of beat is 1, + * so the TIMCMP[15:8] is 1. + */ + base->flexioBase->TIMCMP[base->timerIndex] = (1UL << 8U) | timerCompare; + + /* Use TX shifter flag as the inverted timer trigger. Timer output to WR/EN pin. */ + base->flexioBase->TIMCFG[base->timerIndex] = + FLEXIO_TIMCFG_TIMOUT(kFLEXIO_TimerOutputOneNotAffectedByReset) | + FLEXIO_TIMCFG_TIMDEC(kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput) | + FLEXIO_TIMCFG_TIMRST(kFLEXIO_TimerResetNever) | FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare) | + FLEXIO_TIMCFG_TIMENA(kFLEXIO_TimerEnableOnTriggerHigh) | FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitDisabled) | + FLEXIO_TIMCFG_TSTART(kFLEXIO_TimerStartBitDisabled); + + /* When initially configure the timer pin as output, the pin may be driven low causing glitch on bus. + Configure the pin as bidirection output first then perform a subsequent write to change to output to avoid the + issue. */ + timerControl = FLEXIO_TIMCTL_TRGSEL(FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->txShifterStartIndex)) | + FLEXIO_TIMCTL_TRGPOL(kFLEXIO_TimerTriggerPolarityActiveLow) | + FLEXIO_TIMCTL_TRGSRC(kFLEXIO_TimerTriggerSourceInternal) | + FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigBidirectionOutputData) | + FLEXIO_TIMCTL_PINSEL(base->ENWRPinIndex) | FLEXIO_TIMCTL_PINPOL(kFLEXIO_PinActiveLow) | + FLEXIO_TIMCTL_TIMOD(kFLEXIO_TimerModeDual8BitBaudBit); + + base->flexioBase->TIMCTL[base->timerIndex] = timerControl; + timerControl = (timerControl & ~FLEXIO_TIMCTL_PINCFG_MASK) | FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigOutput); + base->flexioBase->TIMCTL[base->timerIndex] = timerControl; +} + +/*! + * brief Clear the FLEXIO MCULCD single beats write mode configuration. + * + * Clear the write configuration set by ref FLEXIO_MCULCD_SetSingleBeatWriteConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + * + * note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_ClearSingleBeatWriteConfig(FLEXIO_MCULCD_Type *base) +{ + /* Disable the timer. */ + /* Set to bidirection output first then set to disable to avoid glitch on bus. */ + base->flexioBase->TIMCTL[base->timerIndex] = + (base->flexioBase->TIMCTL[base->timerIndex] & ~FLEXIO_TIMCTL_PINCFG_MASK) | + FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigBidirectionOutputData); + base->flexioBase->TIMCTL[base->timerIndex] = 0U; + base->flexioBase->TIMCFG[base->timerIndex] = 0U; + /* Clear the timer flag. */ + base->flexioBase->TIMSTAT = (1UL << base->timerIndex); + /* Stop the TX shifter. */ + base->flexioBase->SHIFTCTL[base->txShifterStartIndex] = 0U; + base->flexioBase->SHIFTCFG[base->txShifterStartIndex] = 0U; + /* Clear the shifter flag. */ + base->flexioBase->SHIFTSTAT = (1UL << base->txShifterStartIndex); +} + +/*! + * brief Configures the FLEXIO MCULCD to single beats read mode. + * + * At the begining or multiple beats read operation, the FLEXIO MCULCD is configured + * to multiple beats read mode using this function. After read operation, the configuration + * is cleared by ref FLEXIO_MCULCD_ClearSingleBeatReadConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + * + * note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_SetSingleBeatReadConfig(FLEXIO_MCULCD_Type *base) +{ + /* + * This function will be called at the beginning of every data reading. For + * performance consideration, it access the FlexIO registers directly, but not + * call FlexIO driver APIs. + */ + + uint8_t timerPin; + uint32_t timerCompare; + flexio_pin_polarity_t timerPinPolarity; + + /* Timer output to RD pin (8080 mode), to WR/EN pin in 6800 mode. */ + if (kFLEXIO_MCULCD_8080 == base->busType) + { + timerPin = base->RDPinIndex; + timerPinPolarity = kFLEXIO_PinActiveLow; + } + else + { + timerPin = base->ENWRPinIndex; + timerPinPolarity = kFLEXIO_PinActiveHigh; + } + + /* Enable the RX Shifter input. */ + base->flexioBase->SHIFTCFG[base->rxShifterEndIndex] = + FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U); + + base->flexioBase->SHIFTCTL[base->rxShifterEndIndex] = + FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnNegitive) | + FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutputDisabled) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | + FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeReceive); + + /* Use RX shifter flag as the inverted timer trigger. */ + base->flexioBase->TIMCFG[base->timerIndex] = + FLEXIO_TIMCFG_TIMOUT(kFLEXIO_TimerOutputOneNotAffectedByReset) | + FLEXIO_TIMCFG_TIMDEC(kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput) | + FLEXIO_TIMCFG_TIMRST(kFLEXIO_TimerResetNever) | FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare) | + FLEXIO_TIMCFG_TIMENA(kFLEXIO_TimerEnableOnTriggerHigh) | + FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitEnableOnTimerDisable) | + FLEXIO_TIMCFG_TSTART(kFLEXIO_TimerStartBitDisabled); + + timerCompare = base->flexioBase->TIMCMP[base->timerIndex] & 0xFFU; + + /* + * TIMCMP[15:8] = (number of beats x 2) - 1. Because the number of beat is 1, + * so the TIMCMP[15:8] is 1. + */ + base->flexioBase->TIMCMP[base->timerIndex] = (1UL << 8U) | timerCompare; + + base->flexioBase->TIMCTL[base->timerIndex] |= + FLEXIO_TIMCTL_TRGSEL(FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->rxShifterEndIndex)) | + FLEXIO_TIMCTL_TRGPOL(kFLEXIO_TimerTriggerPolarityActiveLow) | + FLEXIO_TIMCTL_TRGSRC(kFLEXIO_TimerTriggerSourceInternal) | FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigOutput) | + FLEXIO_TIMCTL_PINSEL(timerPin) | FLEXIO_TIMCTL_PINPOL(timerPinPolarity) | + FLEXIO_TIMCTL_TIMOD(kFLEXIO_TimerModeDual8BitBaudBit); +} + +/*! + * brief Clear the FLEXIO MCULCD single beats read mode configuration. + * + * Clear the read configuration set by ref FLEXIO_MCULCD_SetSingleBeatReadConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + * + * note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_ClearSingleBeatReadConfig(FLEXIO_MCULCD_Type *base) +{ + /* Disable the timer. */ + /* Set to bidirection output first then set to disable to avoid glitch on bus. */ + base->flexioBase->TIMCTL[base->timerIndex] = + (base->flexioBase->TIMCTL[base->timerIndex] & ~FLEXIO_TIMCTL_PINCFG_MASK) | + FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigBidirectionOutputData); + base->flexioBase->TIMCTL[base->timerIndex] = 0U; + base->flexioBase->TIMCFG[base->timerIndex] = 0U; + /* Clear the timer flag. */ + base->flexioBase->TIMSTAT = (1UL << base->timerIndex); + /* Stop the RX shifter. */ + base->flexioBase->SHIFTCTL[base->rxShifterEndIndex] = 0U; + base->flexioBase->SHIFTCFG[base->rxShifterEndIndex] = 0U; + /* Clear the shifter flag. */ + base->flexioBase->SHIFTSTAT = (1UL << base->rxShifterEndIndex); +} + +/*! + * brief Configures the FLEXIO MCULCD to multiple beats write mode. + * + * At the begining multiple beats write operation, the FLEXIO MCULCD is configured to + * multiple beats write mode using this function. After write operation, the configuration + * is cleared by ref FLEXIO_MCULCD_ClearMultBeatsWriteConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + * + * note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_SetMultiBeatsWriteConfig(FLEXIO_MCULCD_Type *base) +{ + /* + * This function will be called at the beginning of every data writing. For + * performance consideration, it access the FlexIO registers directly, but not + * call FlexIO driver APIs. + */ + + uint32_t timerCompare; + uint32_t timerControl; + uint8_t beats; + uint8_t i; + + /* Enable the TX Shifter output. */ + base->flexioBase->SHIFTCFG[base->txShifterStartIndex] = + FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U) | + FLEXIO_SHIFTCFG_INSRC(kFLEXIO_ShifterInputFromNextShifterOutput); + + base->flexioBase->SHIFTCTL[base->txShifterStartIndex] = + FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnPositive) | + FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutput) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | + FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit); + + for (i = base->txShifterStartIndex + 1U; i <= base->txShifterEndIndex; i++) + { + base->flexioBase->SHIFTCFG[i] = FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U) | + FLEXIO_SHIFTCFG_INSRC(kFLEXIO_ShifterInputFromNextShifterOutput); + + base->flexioBase->SHIFTCTL[i] = + FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnPositive) | + FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutputDisabled) | FLEXIO_SHIFTCTL_PINSEL(0) | + FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit); + } + + timerCompare = base->flexioBase->TIMCMP[base->timerIndex] & 0xFFU; + +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + beats = 4U * (base->txShifterEndIndex - base->txShifterStartIndex + 1U); +#else + beats = 2U * (base->txShifterEndIndex - base->txShifterStartIndex + 1U); +#endif + + /* + * TIMCMP[15:8] = (number of beats x 2) - 1. + */ + base->flexioBase->TIMCMP[base->timerIndex] = ((beats * 2UL - 1UL) << 8U) | timerCompare; + + /* Use TX shifter flag as the inverted timer trigger. Timer output to WR/EN pin. */ + base->flexioBase->TIMCFG[base->timerIndex] = + FLEXIO_TIMCFG_TIMOUT(kFLEXIO_TimerOutputOneNotAffectedByReset) | + FLEXIO_TIMCFG_TIMDEC(kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput) | + FLEXIO_TIMCFG_TIMRST(kFLEXIO_TimerResetNever) | FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare) | + FLEXIO_TIMCFG_TIMENA(kFLEXIO_TimerEnableOnTriggerHigh) | FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitDisabled) | + FLEXIO_TIMCFG_TSTART(kFLEXIO_TimerStartBitDisabled); + + /* When initially configure the timer pin as output, the pin may be driven low causing glitch on bus. + Configure the pin as bidirection output first then perform a subsequent write to change to output to avoid the + issue. */ + timerControl = FLEXIO_TIMCTL_TRGSEL(FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->txShifterEndIndex)) | + FLEXIO_TIMCTL_TRGPOL(kFLEXIO_TimerTriggerPolarityActiveLow) | + FLEXIO_TIMCTL_TRGSRC(kFLEXIO_TimerTriggerSourceInternal) | + FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigBidirectionOutputData) | + FLEXIO_TIMCTL_PINSEL(base->ENWRPinIndex) | FLEXIO_TIMCTL_PINPOL(kFLEXIO_PinActiveLow) | + FLEXIO_TIMCTL_TIMOD(kFLEXIO_TimerModeDual8BitBaudBit); + + base->flexioBase->TIMCTL[base->timerIndex] = timerControl; + timerControl = (timerControl & ~FLEXIO_TIMCTL_PINCFG_MASK) | FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigOutput); + base->flexioBase->TIMCTL[base->timerIndex] = timerControl; +} + +/*! + * brief Clear the FLEXIO MCULCD multiple beats write mode configuration. + * + * Clear the write configuration set by ref FLEXIO_MCULCD_SetMultBeatsWriteConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + * + * note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_ClearMultiBeatsWriteConfig(FLEXIO_MCULCD_Type *base) +{ + uint8_t i; + uint32_t statusFlags = 0U; + + /* Disable the timer. */ + /* Set to bidirection output first then set to disable to avoid glitch on bus. */ + base->flexioBase->TIMCTL[base->timerIndex] = + (base->flexioBase->TIMCTL[base->timerIndex] & ~FLEXIO_TIMCTL_PINCFG_MASK) | + FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigBidirectionOutputData); + base->flexioBase->TIMCTL[base->timerIndex] = 0U; + base->flexioBase->TIMCFG[base->timerIndex] = 0U; + /* Clear the timer flag. */ + base->flexioBase->TIMSTAT = (1UL << base->timerIndex); + + /* Stop the TX shifter. */ + for (i = base->txShifterStartIndex; i <= base->txShifterEndIndex; i++) + { + base->flexioBase->SHIFTCFG[i] = 0U; + base->flexioBase->SHIFTCTL[i] = 0U; + statusFlags |= (1UL << i); + } + /* Clear the shifter flag. */ + base->flexioBase->SHIFTSTAT = statusFlags; +} + +/*! + * brief Configures the FLEXIO MCULCD to multiple beats read mode. + * + * At the begining or multiple beats read operation, the FLEXIO MCULCD is configured + * to multiple beats read mode using this function. After read operation, the configuration + * is cleared by ref FLEXIO_MCULCD_ClearMultBeatsReadConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + * + * note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_SetMultiBeatsReadConfig(FLEXIO_MCULCD_Type *base) +{ + /* + * This function will be called at the beginning of every data reading. For + * performance consideration, it access the FlexIO registers directly, but not + * call FlexIO driver APIs. + */ + + uint8_t timerPin; + uint8_t beats; + uint8_t i; + uint32_t timerCompare; + flexio_pin_polarity_t timerPinPolarity; + + /* Timer output to RD pin (8080 mode), to WR/EN pin in 6800 mode. */ + if (kFLEXIO_MCULCD_8080 == base->busType) + { + timerPin = base->RDPinIndex; + timerPinPolarity = kFLEXIO_PinActiveLow; + } + else + { + timerPin = base->ENWRPinIndex; + timerPinPolarity = kFLEXIO_PinActiveHigh; + } + + /* Enable the RX Shifter input. */ + for (i = base->rxShifterStartIndex; i < base->rxShifterEndIndex; i++) + { + base->flexioBase->SHIFTCFG[i] = FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U) | + FLEXIO_SHIFTCFG_INSRC(kFLEXIO_ShifterInputFromNextShifterOutput); + + base->flexioBase->SHIFTCTL[i] = + FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnNegitive) | + FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutputDisabled) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | + FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeReceive); + } + + base->flexioBase->SHIFTCFG[base->rxShifterEndIndex] = + FLEXIO_SHIFTCFG_PWIDTH((uint32_t)FLEXIO_MCULCD_DATA_BUS_WIDTH - 1U); + base->flexioBase->SHIFTCTL[base->rxShifterEndIndex] = + FLEXIO_SHIFTCTL_TIMSEL(base->timerIndex) | FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnNegitive) | + FLEXIO_SHIFTCTL_PINCFG(kFLEXIO_PinConfigOutputDisabled) | FLEXIO_SHIFTCTL_PINSEL(base->dataPinStartIndex) | + FLEXIO_SHIFTCTL_PINPOL(kFLEXIO_PinActiveHigh) | FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeReceive); + + timerCompare = base->flexioBase->TIMCMP[base->timerIndex] & 0xFFU; + +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + beats = 4U * (base->rxShifterEndIndex - base->rxShifterStartIndex + 1U); +#else + beats = 2U * (base->rxShifterEndIndex - base->rxShifterStartIndex + 1U); +#endif + + /* + * TIMCMP[15:8] = (number of beats x 2) - 1. + */ + base->flexioBase->TIMCMP[base->timerIndex] = ((beats * 2UL - 1UL) << 8U) | timerCompare; + + /* Use RX shifter flag as the inverted timer trigger. */ + base->flexioBase->TIMCFG[base->timerIndex] = + FLEXIO_TIMCFG_TIMOUT(kFLEXIO_TimerOutputOneNotAffectedByReset) | + FLEXIO_TIMCFG_TIMDEC(kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput) | + FLEXIO_TIMCFG_TIMRST(kFLEXIO_TimerResetNever) | FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare) | + FLEXIO_TIMCFG_TIMENA(kFLEXIO_TimerEnableOnTriggerHigh) | + FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitEnableOnTimerDisable) | + FLEXIO_TIMCFG_TSTART(kFLEXIO_TimerStartBitDisabled); + + base->flexioBase->TIMCTL[base->timerIndex] |= + FLEXIO_TIMCTL_TRGSEL(FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->rxShifterEndIndex)) | + FLEXIO_TIMCTL_TRGPOL(kFLEXIO_TimerTriggerPolarityActiveLow) | + FLEXIO_TIMCTL_TRGSRC(kFLEXIO_TimerTriggerSourceInternal) | FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigOutput) | + FLEXIO_TIMCTL_PINSEL(timerPin) | FLEXIO_TIMCTL_PINPOL(timerPinPolarity) | + FLEXIO_TIMCTL_TIMOD(kFLEXIO_TimerModeDual8BitBaudBit); +} + +/*! + * brief Clear the FLEXIO MCULCD multiple beats read mode configuration. + * + * Clear the read configuration set by ref FLEXIO_MCULCD_SetMultBeatsReadConfig. + * + * param base Pointer to the FLEXIO_MCULCD_Type. + * + * note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_ClearMultiBeatsReadConfig(FLEXIO_MCULCD_Type *base) +{ + uint8_t i; + uint32_t statusFlags = 0U; + + /* Disable the timer. */ + /* Set to bidirection output first then set to disable to avoid glitch on bus. */ + base->flexioBase->TIMCTL[base->timerIndex] = + (base->flexioBase->TIMCTL[base->timerIndex] & ~FLEXIO_TIMCTL_PINCFG_MASK) | + FLEXIO_TIMCTL_PINCFG(kFLEXIO_PinConfigBidirectionOutputData); + base->flexioBase->TIMCTL[base->timerIndex] = 0U; + base->flexioBase->TIMCFG[base->timerIndex] = 0U; + /* Clear the timer flag. */ + base->flexioBase->TIMSTAT = (1UL << base->timerIndex); + /* Stop the RX shifter. */ + for (i = base->rxShifterStartIndex; i <= base->rxShifterEndIndex; i++) + { + base->flexioBase->SHIFTCTL[i] = 0U; + base->flexioBase->SHIFTCFG[i] = 0U; + statusFlags |= (1UL << i); + } + /* Clear the shifter flag. */ + base->flexioBase->SHIFTSTAT = statusFlags; +} + +/*! + * brief Wait for transmit data send out finished. + * + * Currently there is no effective method to wait for the data send out + * from the shiter, so here use a while loop to wait. + * + * note This is an internal used function. + */ +void FLEXIO_MCULCD_WaitTransmitComplete(void) +{ + uint32_t i = FLEXIO_MCULCD_WAIT_COMPLETE_TIME; + + while (0U != (i--)) + { + __NOP(); + } +} + +/*! + * brief Send command in blocking way. + * + * This function sends the command and returns when the command has been sent + * out. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param command The command to send. + */ +void FLEXIO_MCULCD_WriteCommandBlocking(FLEXIO_MCULCD_Type *base, uint32_t command) +{ + FLEXIO_Type *flexioBase = base->flexioBase; + + /* De-assert the RS pin. */ + base->setRSPin(false); + + /* For 6800, de-assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(false); + } + + /* Configure the timer and TX shifter. */ + FLEXIO_MCULCD_SetSingleBeatWriteConfig(base); + + /* Write command to shifter buffer. */ + flexioBase->SHIFTBUF[base->txShifterStartIndex] = command; + + /* Wait for command send out. */ + while (0U == ((1UL << base->timerIndex) & FLEXIO_GetTimerStatusFlags(flexioBase))) + { + } + + /* Stop the timer and TX shifter. */ + FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); + + /* Assert the RS pin. */ + base->setRSPin(true); + /* For 6800, assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(true); + } +} + +/*! + * brief Send data array in blocking way. + * + * This function sends the data array and returns when the data sent out. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param data The data array to send. + * param size How many bytes to write. + */ +void FLEXIO_MCULCD_WriteDataArrayBlocking(FLEXIO_MCULCD_Type *base, const void *data, size_t size) +{ + assert(size > 0U); + + uint32_t i; +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + const uint8_t *data8Bit; +#else + const uint16_t *data16Bit; +#endif + FLEXIO_Type *flexioBase = base->flexioBase; + + /* Assert the RS pin. */ + base->setRSPin(true); + /* For 6800, de-assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(false); + } + + /* Configure the timer and TX shifter. */ + FLEXIO_MCULCD_SetSingleBeatWriteConfig(base); + +/* If data bus width is 8. */ +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + data8Bit = (const uint8_t *)data; + + for (i = 0; i < size; i++) + { + flexioBase->SHIFTBUF[base->txShifterStartIndex] = data8Bit[i]; + + /* Wait for the data send out. */ + while (0U == ((1UL << base->timerIndex) & flexioBase->TIMSTAT)) + { + } + + /* Clear the timer stat. */ + flexioBase->TIMSTAT = 1UL << base->timerIndex; + } +#else + data16Bit = (const uint16_t *)data; + size /= 2U; + + for (i = 0; i < size; i++) + { + flexioBase->SHIFTBUF[base->txShifterStartIndex] = data16Bit[i]; + + /* Wait for the data send out. */ + while (0U == ((1UL << base->timerIndex) & flexioBase->TIMSTAT)) + { + } + + /* Clear the timer stat. */ + flexioBase->TIMSTAT = 1UL << base->timerIndex; + } +#endif + + /* Stop the timer and TX shifter. */ + FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); +} + +/*! + * brief Read data into array in blocking way. + * + * This function reads the data into array and returns when the data read + * finished. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param data The array to save the data. + * param size How many bytes to read. + */ +void FLEXIO_MCULCD_ReadDataArrayBlocking(FLEXIO_MCULCD_Type *base, void *data, size_t size) +{ + assert(size > 0U); + + uint32_t i; + +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + uint8_t *data8Bit = (uint8_t *)data; +#else + uint16_t *data16Bit = (uint16_t *)data; +#endif + FLEXIO_Type *flexioBase = base->flexioBase; + + /* Assert the RS pin. */ + base->setRSPin(true); + /* For 6800, de-assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(false); + } + + /* Enable the timer and RX shifter. */ + FLEXIO_MCULCD_SetSingleBeatReadConfig(base); + +/* If data bus width is 8. */ +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + for (i = 0; i < (size - 1U); i++) + { + /* Wait for shifter buffer full. */ + while (0U == ((1UL << base->rxShifterEndIndex) & FLEXIO_GetShifterStatusFlags(flexioBase))) + { + } + + data8Bit[i] = (uint8_t)flexioBase->SHIFTBUFBYS[base->rxShifterEndIndex]; + } +#else + /* Data bus width is 16. */ + size /= 2U; + + for (i = 0; i < (size - 1U); i++) + { + /* Wait for shifter buffer full. */ + while (0U == ((1UL << base->rxShifterEndIndex) & FLEXIO_GetShifterStatusFlags(flexioBase))) + { + } + + data16Bit[i] = (uint16_t)flexioBase->SHIFTBUFHWS[base->rxShifterEndIndex]; + } +#endif + + /* Wait for shifter buffer full. */ + while (0U == ((1UL << base->rxShifterEndIndex) & FLEXIO_GetShifterStatusFlags(flexioBase))) + { + } + + /* Stop the timer and disable the RX shifter. */ + FLEXIO_MCULCD_ClearSingleBeatReadConfig(base); + +/* Read out the last data. */ +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + data8Bit[i] = (uint8_t)flexioBase->SHIFTBUFBYS[base->rxShifterEndIndex]; +#else + data16Bit[i] = (uint16_t)flexioBase->SHIFTBUFHWS[base->rxShifterEndIndex]; +#endif +} + +/*! + * brief Send the same value many times in blocking way. + * + * This function sends the same value many times. It could be used to clear the + * LCD screen. If the data bus width is 8, this function will send LSB 8 bits of + * p sameValue for p size times. If the data bus is 16, this function will send + * LSB 16 bits of p sameValue for p size / 2 times. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param sameValue The same value to send. + * param size How many bytes to send. + */ +void FLEXIO_MCULCD_WriteSameValueBlocking(FLEXIO_MCULCD_Type *base, uint32_t sameValue, size_t size) +{ + assert(size > 0U); + + uint32_t i; + FLEXIO_Type *flexioBase = base->flexioBase; + +#if (16 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + size /= 2U; +#endif + + /* Assert the RS pin. */ + base->setRSPin(true); + /* For 6800, de-assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(false); + } + + /* Configure the timer and TX shifter. */ + FLEXIO_MCULCD_SetSingleBeatWriteConfig(base); + + for (i = 0; i < size; i++) + { + flexioBase->SHIFTBUF[base->txShifterStartIndex] = sameValue; + + /* Wait for the data send out. */ + while (0U == ((1UL << base->timerIndex) & flexioBase->TIMSTAT)) + { + } + + /* Clear the timer stat. */ + flexioBase->TIMSTAT = 1UL << base->timerIndex; + } + + /* Stop the timer and TX shifter. */ + FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); +} + +/*! + * brief Performs a polling transfer. + * + * note The API does not return until the transfer finished. + * + * param base pointer to FLEXIO_MCULCD_Type structure. + * param xfer pointer to flexio_mculcd_transfer_t structure. + */ +void FLEXIO_MCULCD_TransferBlocking(FLEXIO_MCULCD_Type *base, flexio_mculcd_transfer_t *xfer) +{ + FLEXIO_MCULCD_StartTransfer(base); + + if (!xfer->dataOnly) + { + FLEXIO_MCULCD_WriteCommandBlocking(base, xfer->command); + } + + if (xfer->dataSize > 0U) + { + if (kFLEXIO_MCULCD_ReadArray == xfer->mode) + { + FLEXIO_MCULCD_ReadDataArrayBlocking(base, (uint8_t *)(xfer->dataAddrOrSameValue), xfer->dataSize); + } + else if (kFLEXIO_MCULCD_WriteArray == xfer->mode) + { + FLEXIO_MCULCD_WriteDataArrayBlocking(base, (uint8_t *)(xfer->dataAddrOrSameValue), xfer->dataSize); + } + else + { + FLEXIO_MCULCD_WriteSameValueBlocking(base, xfer->dataAddrOrSameValue, xfer->dataSize); + } + } + + FLEXIO_MCULCD_StopTransfer(base); +} + +/*! + * brief Initializes the FlexIO MCULCD handle, which is used in transactional + * functions. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + * param callback The callback function. + * param userData The parameter of the callback function. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_MCULCD_TransferCreateHandle(FLEXIO_MCULCD_Type *base, + flexio_mculcd_handle_t *handle, + flexio_mculcd_transfer_callback_t callback, + void *userData) +{ + assert(NULL != handle); + + IRQn_Type flexio_irqs[] = FLEXIO_IRQS; + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + + /* Register callback and userData. */ + handle->completionCallback = callback; + handle->userData = userData; + + /* Enable interrupt in NVIC. */ + (void)EnableIRQ(flexio_irqs[FLEXIO_GetInstance(base->flexioBase)]); + + /* Save the context in global variables to support the double weak mechanism. + */ + return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_MCULCD_TransferHandleIRQ); +} + +/*! + * brief Transfer data using IRQ. + * + * This function sends data using IRQ. This is a non-blocking function, which + * returns right away. When all data is sent out/received, the callback + * function is called. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + * param xfer FlexIO MCULCD transfer structure. See #flexio_mculcd_transfer_t. + * retval kStatus_Success Successfully start a transfer. + * retval kStatus_InvalidArgument Input argument is invalid. + * retval kStatus_FLEXIO_MCULCD_Busy MCULCD is busy with another transfer. + */ +status_t FLEXIO_MCULCD_TransferNonBlocking(FLEXIO_MCULCD_Type *base, + flexio_mculcd_handle_t *handle, + flexio_mculcd_transfer_t *xfer) +{ + /* If previous transfer is in progress. */ + if ((uint32_t)kFLEXIO_MCULCD_StateIdle != handle->state) + { + return kStatus_FLEXIO_MCULCD_Busy; + } + + /* Set the state in handle. */ + if (kFLEXIO_MCULCD_ReadArray == xfer->mode) + { + handle->state = (uint32_t)kFLEXIO_MCULCD_StateReadArray; + } + else if (kFLEXIO_MCULCD_WriteArray == xfer->mode) + { + handle->state = (uint32_t)kFLEXIO_MCULCD_StateWriteArray; + } + else + { + handle->state = (uint32_t)kFLEXIO_MCULCD_StateWriteSameValue; + } + + /* Assert the nCS. */ + FLEXIO_MCULCD_StartTransfer(base); + + if (!xfer->dataOnly) + { + /* Send the command. */ + FLEXIO_MCULCD_WriteCommandBlocking(base, xfer->command); + } + + /* If transfer count is 0 (only to send command), return directly. */ + if (0U == xfer->dataSize) + { + handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + + /* De-assert the nCS. */ + FLEXIO_MCULCD_StopTransfer(base); + + if (NULL != handle->completionCallback) + { + handle->completionCallback(base, handle, kStatus_FLEXIO_MCULCD_Idle, handle->userData); + } + } + else + { +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + handle->dataCount = xfer->dataSize; +#else + handle->dataCount = xfer->dataSize / 2U; +#endif + + handle->remainingCount = handle->dataCount; + + handle->dataAddrOrSameValue = xfer->dataAddrOrSameValue; + + /* Enable interrupt. */ + if (kFLEXIO_MCULCD_ReadArray == xfer->mode) + { + /* For 6800, assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(true); + } + FLEXIO_MCULCD_SetSingleBeatReadConfig(base); + FLEXIO_MCULCD_EnableInterrupts(base, (uint32_t)kFLEXIO_MCULCD_RxFullInterruptEnable); + } + else + { + /* For 6800, de-assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(false); + } + FLEXIO_MCULCD_SetSingleBeatWriteConfig(base); + FLEXIO_MCULCD_EnableInterrupts(base, (uint32_t)kFLEXIO_MCULCD_TxEmptyInterruptEnable); + } + } + + return kStatus_Success; +} + +/*! + * brief Aborts the data transfer, which used IRQ. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + */ +void FLEXIO_MCULCD_TransferAbort(FLEXIO_MCULCD_Type *base, flexio_mculcd_handle_t *handle) +{ + /* If no transfer in process, return directly. */ + if ((uint32_t)kFLEXIO_MCULCD_StateIdle == handle->state) + { + return; + } + + /* Disable the interrupt. */ + FLEXIO_MCULCD_DisableInterrupts( + base, (uint32_t)kFLEXIO_MCULCD_RxFullInterruptEnable | (uint32_t)kFLEXIO_MCULCD_TxEmptyInterruptEnable); + + if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == handle->state) + { + /* Stop the timer and disable the RX shifter. */ + FLEXIO_MCULCD_ClearSingleBeatReadConfig(base); + } + else + { + /* Stop the timer and disable the TX shifter. */ + FLEXIO_MCULCD_ClearSingleBeatWriteConfig(base); + } + + /* Clean the flags. */ + FLEXIO_MCULCD_ClearStatusFlags(base, (uint32_t)kFLEXIO_MCULCD_TxEmptyFlag | (uint32_t)kFLEXIO_MCULCD_RxFullFlag); + + /* De-assert the nCS. */ + FLEXIO_MCULCD_StopTransfer(base); + + handle->dataCount = 0; + handle->remainingCount = 0; + handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; +} + +/*! + * brief Gets the data transfer status which used IRQ. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + * param count How many bytes transferred so far by the non-blocking transaction. + * retval kStatus_Success Get the transferred count Successfully. + * retval kStatus_NoTransferInProgress No transfer in process. + */ +status_t FLEXIO_MCULCD_TransferGetCount(FLEXIO_MCULCD_Type *base, flexio_mculcd_handle_t *handle, size_t *count) +{ + assert(NULL != count); + + if ((uint32_t)kFLEXIO_MCULCD_StateIdle == handle->state) + { + return kStatus_NoTransferInProgress; + } + + *count = handle->dataCount - handle->remainingCount; + +#if (16 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + *count *= 2U; +#endif + + return kStatus_Success; +} + +/*! + * brief FlexIO MCULCD IRQ handler function. + * + * param base Pointer to the FLEXIO_MCULCD_Type structure. + * param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + */ +void FLEXIO_MCULCD_TransferHandleIRQ(void *base, void *handle) +{ + FLEXIO_MCULCD_Type *flexioLcdMcuBase = (FLEXIO_MCULCD_Type *)base; + flexio_mculcd_handle_t *flexioLcdMcuHandle = (flexio_mculcd_handle_t *)handle; + uint32_t statusFlags = FLEXIO_MCULCD_GetStatusFlags(flexioLcdMcuBase); + uint32_t data; + + if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == flexioLcdMcuHandle->state) + { + /* Handle the reading process. */ + while ((0U != ((uint32_t)kFLEXIO_MCULCD_RxFullFlag & statusFlags)) && (flexioLcdMcuHandle->remainingCount > 0U)) + { + if (1U == flexioLcdMcuHandle->remainingCount) + { + /* If this is the last data, stop the RX shifter and timer. */ + FLEXIO_MCULCD_DisableInterrupts(flexioLcdMcuBase, (uint32_t)kFLEXIO_MCULCD_RxFullInterruptEnable); + FLEXIO_MCULCD_ClearSingleBeatReadConfig(flexioLcdMcuBase); + FLEXIO_MCULCD_StopTransfer(flexioLcdMcuBase); + } + + /* Read out the data. */ + data = FLEXIO_MCULCD_ReadData(flexioLcdMcuBase); + +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + *(uint8_t *)(flexioLcdMcuHandle->dataAddrOrSameValue) = (uint8_t)data; + flexioLcdMcuHandle->dataAddrOrSameValue++; +#else + *(uint16_t *)(flexioLcdMcuHandle->dataAddrOrSameValue) = (uint16_t)data; + flexioLcdMcuHandle->dataAddrOrSameValue += 2U; +#endif + + flexioLcdMcuHandle->remainingCount--; + + /* Transfer finished, call the callback. */ + if (0U == flexioLcdMcuHandle->remainingCount) + { + flexioLcdMcuHandle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + + if (NULL != flexioLcdMcuHandle->completionCallback) + { + flexioLcdMcuHandle->completionCallback(flexioLcdMcuBase, flexioLcdMcuHandle, + kStatus_FLEXIO_MCULCD_Idle, flexioLcdMcuHandle->userData); + } + } + + /* Is the shifter buffer ready to send the next data? */ + statusFlags = FLEXIO_MCULCD_GetStatusFlags(flexioLcdMcuBase); + } + } + else + { + /* Handle the writing process. */ + while ((0U != ((uint32_t)kFLEXIO_MCULCD_TxEmptyFlag & statusFlags)) && + (flexioLcdMcuHandle->remainingCount > 0U)) + { + /* Send the data. */ + if ((uint32_t)kFLEXIO_MCULCD_StateWriteSameValue == flexioLcdMcuHandle->state) + { + data = flexioLcdMcuHandle->dataAddrOrSameValue; + } + else + { +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + data = *(uint8_t *)(flexioLcdMcuHandle->dataAddrOrSameValue); + flexioLcdMcuHandle->dataAddrOrSameValue++; +#else + data = *(uint16_t *)(flexioLcdMcuHandle->dataAddrOrSameValue); + flexioLcdMcuHandle->dataAddrOrSameValue += 2U; +#endif + } + + /* If this is the last data to send, delay to wait for the data shift out. */ + if (1U == flexioLcdMcuHandle->remainingCount) + { + FLEXIO_MCULCD_DisableInterrupts(flexioLcdMcuBase, (uint32_t)kFLEXIO_MCULCD_TxEmptyInterruptEnable); + + /* Write the last data. */ + FLEXIO_MCULCD_WriteData(flexioLcdMcuBase, data); + + /* Wait for the last data send finished. */ + FLEXIO_MCULCD_WaitTransmitComplete(); + flexioLcdMcuHandle->remainingCount = 0; + + FLEXIO_MCULCD_ClearSingleBeatWriteConfig(flexioLcdMcuBase); + FLEXIO_MCULCD_StopTransfer(flexioLcdMcuBase); + flexioLcdMcuHandle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + + if (NULL != flexioLcdMcuHandle->completionCallback) + { + flexioLcdMcuHandle->completionCallback(flexioLcdMcuBase, flexioLcdMcuHandle, + kStatus_FLEXIO_MCULCD_Idle, flexioLcdMcuHandle->userData); + } + } + else + { + FLEXIO_MCULCD_WriteData(flexioLcdMcuBase, data); + flexioLcdMcuHandle->remainingCount--; + } + /* Is the shifter buffer ready to send the next data? */ + statusFlags = FLEXIO_MCULCD_GetStatusFlags(flexioLcdMcuBase); + } + } +} \ No newline at end of file diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd.h new file mode 100644 index 00000000000..298287b48da --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd.h @@ -0,0 +1,686 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_FLEXIO_MCULCD_H_ +#define FSL_FLEXIO_MCULCD_H_ + +#include "fsl_common.h" +#include "fsl_flexio.h" + +/*! + * @addtogroup flexio_mculcd + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FlexIO MCULCD driver version. */ +#define FSL_FLEXIO_MCULCD_DRIVER_VERSION (MAKE_VERSION(2, 1, 0)) +/*! @} */ + +#ifndef FLEXIO_MCULCD_WAIT_COMPLETE_TIME +/*! + * @brief The delay time to wait for FLEXIO transmit complete. + * + * Currently there is no method to detect whether the data has been + * sent out from the shifter, so the driver use a software delay for this. When + * the data is written to shifter buffer, the driver call the delay + * function to wait for the data shift out. + * If this value is too small, then the last few bytes might be lost when writing + * data using interrupt method or DMA method. + */ +#define FLEXIO_MCULCD_WAIT_COMPLETE_TIME 512 +#endif + +#ifndef FLEXIO_MCULCD_DATA_BUS_WIDTH +/*! + * @brief The data bus width, must be 8 or 16. + */ +#define FLEXIO_MCULCD_DATA_BUS_WIDTH 16UL +#endif + +#if (16UL != FLEXIO_MCULCD_DATA_BUS_WIDTH) && (8UL != FLEXIO_MCULCD_DATA_BUS_WIDTH) +#error Only support data bus 8-bit or 16-bit +#endif + +/*! @brief FlexIO LCD transfer status */ +enum +{ + kStatus_FLEXIO_MCULCD_Idle = MAKE_STATUS(kStatusGroup_FLEXIO_MCULCD, 0), /*!< FlexIO LCD is idle. */ + kStatus_FLEXIO_MCULCD_Busy = MAKE_STATUS(kStatusGroup_FLEXIO_MCULCD, 1), /*!< FlexIO LCD is busy */ + kStatus_FLEXIO_MCULCD_Error = MAKE_STATUS(kStatusGroup_FLEXIO_MCULCD, 2), /*!< FlexIO LCD error occurred */ +}; + +/*! @brief Define FlexIO MCULCD pixel format. */ +typedef enum _flexio_mculcd_pixel_format +{ + kFLEXIO_MCULCD_RGB565 = 0, /*!< RGB565, 16-bit. */ + kFLEXIO_MCULCD_BGR565, /*!< BGR565, 16-bit. */ + kFLEXIO_MCULCD_RGB888, /*!< RGB888, 24-bit. */ + kFLEXIO_MCULCD_BGR888, /*!< BGR888, 24-bit. */ +} flexio_mculcd_pixel_format_t; + +/*! @brief Define FlexIO MCULCD bus type. */ +typedef enum _flexio_mculcd_bus +{ + kFLEXIO_MCULCD_8080, /*!< Using Intel 8080 bus. */ + kFLEXIO_MCULCD_6800, /*!< Using Motorola 6800 bus. */ +} flexio_mculcd_bus_t; + +/*! @brief Define FlexIO MCULCD interrupt mask. */ +enum _flexio_mculcd_interrupt_enable +{ + kFLEXIO_MCULCD_TxEmptyInterruptEnable = (1U << 0U), /*!< Transmit buffer empty interrupt enable. */ + kFLEXIO_MCULCD_RxFullInterruptEnable = (1U << 1U), /*!< Receive buffer full interrupt enable. */ +}; + +/*! @brief Define FlexIO MCULCD status mask. */ +enum _flexio_mculcd_status_flags +{ + kFLEXIO_MCULCD_TxEmptyFlag = (1U << 0U), /*!< Transmit buffer empty flag. */ + kFLEXIO_MCULCD_RxFullFlag = (1U << 1U), /*!< Receive buffer full flag. */ +}; + +/*! @brief Define FlexIO MCULCD DMA mask. */ +enum _flexio_mculcd_dma_enable +{ + kFLEXIO_MCULCD_TxDmaEnable = 0x1U, /*!< Tx DMA request source */ + kFLEXIO_MCULCD_RxDmaEnable = 0x2U, /*!< Rx DMA request source */ +}; + +/*! @brief Function to set or clear the CS and RS pin. */ +typedef void (*flexio_mculcd_pin_func_t)(bool set); + +/*! @brief Define FlexIO MCULCD access structure typedef. */ +typedef struct _flexio_mculcd_type +{ + FLEXIO_Type *flexioBase; /*!< FlexIO base pointer. */ + flexio_mculcd_bus_t busType; /*!< The bus type, 8080 or 6800. */ + uint8_t dataPinStartIndex; /*!< Start index of the data pin, the FlexIO pin dataPinStartIndex + to (dataPinStartIndex + FLEXIO_MCULCD_DATA_BUS_WIDTH -1) + will be used for data transfer. Only support data bus width 8 and 16. */ + uint8_t ENWRPinIndex; /*!< Pin select for WR(8080 mode), EN(6800 mode). */ + uint8_t RDPinIndex; /*!< Pin select for RD(8080 mode), not used in 6800 mode. */ + uint8_t txShifterStartIndex; /*!< Start index of shifters used for data write, it must be 0 or 4. */ + uint8_t txShifterEndIndex; /*!< End index of shifters used for data write. */ + uint8_t rxShifterStartIndex; /*!< Start index of shifters used for data read. */ + uint8_t rxShifterEndIndex; /*!< End index of shifters used for data read, it must be 3 or 7. */ + uint8_t timerIndex; /*!< Timer index used in FlexIO MCULCD. */ + flexio_mculcd_pin_func_t setCSPin; /*!< Function to set or clear the CS pin. */ + flexio_mculcd_pin_func_t setRSPin; /*!< Function to set or clear the RS pin. */ + flexio_mculcd_pin_func_t setRDWRPin; /*!< Function to set or clear the RD/WR pin, only used in 6800 mode. */ +} FLEXIO_MCULCD_Type; + +/*! @brief Define FlexIO MCULCD configuration structure. */ +typedef struct _flexio_mculcd_config +{ + bool enable; /*!< Enable/disable FlexIO MCULCD after configuration. */ + bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode. */ + bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode. */ + bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, + fast access requires the FlexIO clock to be at least + twice the frequency of the bus clock. */ + uint32_t baudRate_Bps; /*!< Baud rate in bit-per-second for all data lines combined. */ +} flexio_mculcd_config_t; + +/*! @brief Transfer mode.*/ +typedef enum _flexio_mculcd_transfer_mode +{ + kFLEXIO_MCULCD_ReadArray, /*!< Read data into an array. */ + kFLEXIO_MCULCD_WriteArray, /*!< Write data from an array. */ + kFLEXIO_MCULCD_WriteSameValue, /*!< Write the same value many times. */ +} flexio_mculcd_transfer_mode_t; + +/*! @brief Define FlexIO MCULCD transfer structure. */ +typedef struct _flexio_mculcd_transfer +{ + uint32_t command; /*!< Command to send. */ + uint32_t dataAddrOrSameValue; /*!< When sending the same value for many times, + this is the value to send. When writing or reading array, + this is the address of the data array. */ + size_t dataSize; /*!< How many bytes to transfer. */ + flexio_mculcd_transfer_mode_t mode; /*!< Transfer mode. */ + bool dataOnly; /*!< Send data only when tx without the command. */ +} flexio_mculcd_transfer_t; + +/*! @brief typedef for flexio_mculcd_handle_t in advance. */ +typedef struct _flexio_mculcd_handle flexio_mculcd_handle_t; + +/*! @brief FlexIO MCULCD callback for finished transfer. + * + * When transfer finished, the callback function is called and returns the + * @p status as kStatus_FLEXIO_MCULCD_Idle. + */ +typedef void (*flexio_mculcd_transfer_callback_t)(FLEXIO_MCULCD_Type *base, + flexio_mculcd_handle_t *handle, + status_t status, + void *userData); + +/*! @brief Define FlexIO MCULCD handle structure. */ +struct _flexio_mculcd_handle +{ + uint32_t dataAddrOrSameValue; /*!< When sending the same value for many times, + this is the value to send. When writing or reading array, + this is the address of the data array. */ + size_t dataCount; /*!< Total count to be transferred. */ + volatile size_t remainingCount; /*!< Remaining count to transfer. */ + volatile uint32_t state; /*!< FlexIO MCULCD internal state. */ + flexio_mculcd_transfer_callback_t completionCallback; /*!< FlexIO MCULCD transfer completed callback. */ + void *userData; /*!< Callback parameter. */ +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /*_cplusplus*/ + +/*! + * @name FlexIO MCULCD Configuration + * @{ + */ + +/*! + * @brief Ungates the FlexIO clock, resets the FlexIO module, configures the + * FlexIO MCULCD hardware, and configures the FlexIO MCULCD with FlexIO MCULCD + * configuration. + * The configuration structure can be filled by the user, or be set with default + * values + * by the @ref FLEXIO_MCULCD_GetDefaultConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param config Pointer to the flexio_mculcd_config_t structure. + * @param srcClock_Hz FlexIO source clock in Hz. + * @retval kStatus_Success Initialization success. + * @retval kStatus_InvalidArgument Initialization failed because of invalid + * argument. + */ +status_t FLEXIO_MCULCD_Init(FLEXIO_MCULCD_Type *base, flexio_mculcd_config_t *config, uint32_t srcClock_Hz); + +/*! + * @brief Resets the FLEXIO_MCULCD timer and shifter configuration. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + */ +void FLEXIO_MCULCD_Deinit(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Gets the default configuration to configure the FlexIO MCULCD. + * + * The default configuration value is: + * @code + * config->enable = true; + * config->enableInDoze = false; + * config->enableInDebug = true; + * config->enableFastAccess = true; + * config->baudRate_Bps = 96000000U; + * @endcode + * @param config Pointer to the flexio_mculcd_config_t structure. + */ +void FLEXIO_MCULCD_GetDefaultConfig(flexio_mculcd_config_t *config); + +/*! @} */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets FlexIO MCULCD status flags. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @return status flag; OR'ed value or the @ref _flexio_mculcd_status_flags. + * + * @note Don't use this function with DMA APIs. + */ +uint32_t FLEXIO_MCULCD_GetStatusFlags(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Clears FlexIO MCULCD status flags. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param mask Status to clear, it is the OR'ed value of @ref + * _flexio_mculcd_status_flags. + * + * @note Don't use this function with DMA APIs. + */ +void FLEXIO_MCULCD_ClearStatusFlags(FLEXIO_MCULCD_Type *base, uint32_t mask); + +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables the FlexIO MCULCD interrupt. + * + * This function enables the FlexIO MCULCD interrupt. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param mask Interrupts to enable, it is the OR'ed value of @ref + * _flexio_mculcd_interrupt_enable. + */ +void FLEXIO_MCULCD_EnableInterrupts(FLEXIO_MCULCD_Type *base, uint32_t mask); + +/*! + * @brief Disables the FlexIO MCULCD interrupt. + * + * This function disables the FlexIO MCULCD interrupt. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param mask Interrupts to disable, it is the OR'ed value of @ref + * _flexio_mculcd_interrupt_enable. + */ +void FLEXIO_MCULCD_DisableInterrupts(FLEXIO_MCULCD_Type *base, uint32_t mask); + +/*! @} */ + +/*! + * @name DMA Control + * @{ + */ + +/*! + * @brief Enables/disables the FlexIO MCULCD transmit DMA. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param enable True means enable DMA, false means disable DMA. + */ +static inline void FLEXIO_MCULCD_EnableTxDMA(FLEXIO_MCULCD_Type *base, bool enable) +{ + FLEXIO_EnableShifterStatusDMA(base->flexioBase, (1UL << base->txShifterStartIndex), enable); +} + +/*! + * @brief Enables/disables the FlexIO MCULCD receive DMA. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param enable True means enable DMA, false means disable DMA. + */ +static inline void FLEXIO_MCULCD_EnableRxDMA(FLEXIO_MCULCD_Type *base, bool enable) +{ + FLEXIO_EnableShifterStatusDMA(base->flexioBase, (1UL << base->rxShifterEndIndex), enable); +} + +/*! + * @brief Gets the FlexIO MCULCD transmit data register address. + * + * This function returns the MCULCD data register address, which is mainly used + * by DMA/eDMA. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @return FlexIO MCULCD transmit data register address. + */ +static inline uint32_t FLEXIO_MCULCD_GetTxDataRegisterAddress(FLEXIO_MCULCD_Type *base) +{ + return (uint32_t) & (base->flexioBase->SHIFTBUF[base->txShifterStartIndex]); +} + +/*! + * @brief Gets the FlexIO MCULCD receive data register address. + * + * This function returns the MCULCD data register address, which is mainly used + * by DMA/eDMA. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @return FlexIO MCULCD receive data register address. + */ +static inline uint32_t FLEXIO_MCULCD_GetRxDataRegisterAddress(FLEXIO_MCULCD_Type *base) +{ + return (uint32_t) & (base->flexioBase->SHIFTBUF[base->rxShifterStartIndex]); +} + +/*! @} */ + +/*! + * @name Bus Operations + * @{ + */ + +/*! + * @brief Set desired baud rate. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param baudRate_Bps Desired baud rate in bit-per-second for all data lines combined. + * @param srcClock_Hz FLEXIO clock frequency in Hz. + * @retval kStatus_Success Set successfully. + * @retval kStatus_InvalidArgument Could not set the baud rate. + */ +status_t FLEXIO_MCULCD_SetBaudRate(FLEXIO_MCULCD_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); + +/*! + * @brief Configures the FLEXIO MCULCD to multiple beats write mode. + * + * At the begining multiple beats write operation, the FLEXIO MCULCD is configured to + * multiple beats write mode using this function. After write operation, the configuration + * is cleared by @ref FLEXIO_MCULCD_ClearSingleBeatWriteConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * + * @note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_SetSingleBeatWriteConfig(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Clear the FLEXIO MCULCD multiple beats write mode configuration. + * + * Clear the write configuration set by @ref FLEXIO_MCULCD_SetSingleBeatWriteConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * + * @note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_ClearSingleBeatWriteConfig(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Configures the FLEXIO MCULCD to multiple beats read mode. + * + * At the begining or multiple beats read operation, the FLEXIO MCULCD is configured + * to multiple beats read mode using this function. After read operation, the configuration + * is cleared by @ref FLEXIO_MCULCD_ClearSingleBeatReadConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * + * @note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_SetSingleBeatReadConfig(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Clear the FLEXIO MCULCD multiple beats read mode configuration. + * + * Clear the read configuration set by @ref FLEXIO_MCULCD_SetSingleBeatReadConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * + * @note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_ClearSingleBeatReadConfig(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Configures the FLEXIO MCULCD to multiple beats write mode. + * + * At the begining multiple beats write operation, the FLEXIO MCULCD is configured to + * multiple beats write mode using this function. After write operation, the configuration + * is cleared by FLEXIO_MCULCD_ClearMultBeatsWriteConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * + * @note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_SetMultiBeatsWriteConfig(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Clear the FLEXIO MCULCD multiple beats write mode configuration. + * + * Clear the write configuration set by FLEXIO_MCULCD_SetMultBeatsWriteConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * + * @note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_ClearMultiBeatsWriteConfig(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Configures the FLEXIO MCULCD to multiple beats read mode. + * + * At the begining or multiple beats read operation, the FLEXIO MCULCD is configured + * to multiple beats read mode using this function. After read operation, the configuration + * is cleared by FLEXIO_MCULCD_ClearMultBeatsReadConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * + * @note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_SetMultiBeatsReadConfig(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Clear the FLEXIO MCULCD multiple beats read mode configuration. + * + * Clear the read configuration set by FLEXIO_MCULCD_SetMultBeatsReadConfig. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * + * @note This is an internal used function, upper layer should not use. + */ +void FLEXIO_MCULCD_ClearMultiBeatsReadConfig(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Enables/disables the FlexIO MCULCD module operation. + * + * @param base Pointer to the FLEXIO_MCULCD_Type. + * @param enable True to enable, false does not have any effect. + */ +static inline void FLEXIO_MCULCD_Enable(FLEXIO_MCULCD_Type *base, bool enable) +{ + if (enable) + { + FLEXIO_Enable(base->flexioBase, enable); + } +} + +/*! + * @brief Read data from the FLEXIO MCULCD RX shifter buffer. + * + * Read data from the RX shift buffer directly, it does no check whether the + * buffer is empty or not. + * + * If the data bus width is 8-bit: + * @code + * uint8_t value; + * value = (uint8_t)FLEXIO_MCULCD_ReadData(base); + * @endcode + * + * If the data bus width is 16-bit: + * @code + * uint16_t value; + * value = (uint16_t)FLEXIO_MCULCD_ReadData(base); + * @endcode + * + * @note This function returns the RX shifter buffer value (32-bit) directly. + * The return value should be converted according to data bus width. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @return The data read out. + * + * @note Don't use this function with DMA APIs. + */ +uint32_t FLEXIO_MCULCD_ReadData(FLEXIO_MCULCD_Type *base); + +/*! + * @brief Write data into the FLEXIO MCULCD TX shifter buffer. + * + * Write data into the TX shift buffer directly, it does no check whether the + * buffer is full or not. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param data The data to write. + * + * @note Don't use this function with DMA APIs. + */ +static inline void FLEXIO_MCULCD_WriteData(FLEXIO_MCULCD_Type *base, uint32_t data) +{ + base->flexioBase->SHIFTBUF[base->txShifterStartIndex] = data; +} + +/*! + * @brief Assert the nCS to start transfer. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + */ +static inline void FLEXIO_MCULCD_StartTransfer(FLEXIO_MCULCD_Type *base) +{ + base->setCSPin(false); +} + +/*! + * @brief De-assert the nCS to stop transfer. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + */ +static inline void FLEXIO_MCULCD_StopTransfer(FLEXIO_MCULCD_Type *base) +{ + base->setCSPin(true); +} + +/*! + * @brief Wait for transmit data send out finished. + * + * Currently there is no effective method to wait for the data send out + * from the shiter, so here use a while loop to wait. + * + * @note This is an internal used function. + */ +void FLEXIO_MCULCD_WaitTransmitComplete(void); + +/*! + * @brief Send command in blocking way. + * + * This function sends the command and returns when the command has been sent + * out. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param command The command to send. + */ +void FLEXIO_MCULCD_WriteCommandBlocking(FLEXIO_MCULCD_Type *base, uint32_t command); + +/*! + * @brief Send data array in blocking way. + * + * This function sends the data array and returns when the data sent out. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param data The data array to send. + * @param size How many bytes to write. + */ +void FLEXIO_MCULCD_WriteDataArrayBlocking(FLEXIO_MCULCD_Type *base, const void *data, size_t size); + +/*! + * @brief Read data into array in blocking way. + * + * This function reads the data into array and returns when the data read + * finished. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param data The array to save the data. + * @param size How many bytes to read. + */ +void FLEXIO_MCULCD_ReadDataArrayBlocking(FLEXIO_MCULCD_Type *base, void *data, size_t size); + +/*! + * @brief Send the same value many times in blocking way. + * + * This function sends the same value many times. It could be used to clear the + * LCD screen. If the data bus width is 8, this function will send LSB 8 bits of + * @p sameValue for @p size times. If the data bus is 16, this function will send + * LSB 16 bits of @p sameValue for @p size / 2 times. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param sameValue The same value to send. + * @param size How many bytes to send. + */ +void FLEXIO_MCULCD_WriteSameValueBlocking(FLEXIO_MCULCD_Type *base, uint32_t sameValue, size_t size); + +/*! + * @brief Performs a polling transfer. + * + * @note The API does not return until the transfer finished. + * + * @param base pointer to FLEXIO_MCULCD_Type structure. + * @param xfer pointer to flexio_mculcd_transfer_t structure. + */ +void FLEXIO_MCULCD_TransferBlocking(FLEXIO_MCULCD_Type *base, flexio_mculcd_transfer_t *xfer); +/*! @} */ + +/*! + * @name Transactional + * @{ + */ + +/*! + * @brief Initializes the FlexIO MCULCD handle, which is used in transactional + * functions. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + * @param callback The callback function. + * @param userData The parameter of the callback function. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_MCULCD_TransferCreateHandle(FLEXIO_MCULCD_Type *base, + flexio_mculcd_handle_t *handle, + flexio_mculcd_transfer_callback_t callback, + void *userData); + +/*! + * @brief Transfer data using IRQ. + * + * This function sends data using IRQ. This is a non-blocking function, which + * returns right away. When all data is sent out/received, the callback + * function is called. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + * @param xfer FlexIO MCULCD transfer structure. See #flexio_mculcd_transfer_t. + * @retval kStatus_Success Successfully start a transfer. + * @retval kStatus_InvalidArgument Input argument is invalid. + * @retval kStatus_FLEXIO_MCULCD_Busy MCULCD is busy with another transfer. + */ +status_t FLEXIO_MCULCD_TransferNonBlocking(FLEXIO_MCULCD_Type *base, + flexio_mculcd_handle_t *handle, + flexio_mculcd_transfer_t *xfer); + +/*! + * @brief Aborts the data transfer, which used IRQ. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + */ +void FLEXIO_MCULCD_TransferAbort(FLEXIO_MCULCD_Type *base, flexio_mculcd_handle_t *handle); + +/*! + * @brief Gets the data transfer status which used IRQ. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + * @param count How many bytes transferred so far by the non-blocking transaction. + * @retval kStatus_Success Get the transferred count Successfully. + * @retval kStatus_NoTransferInProgress No transfer in process. + */ +status_t FLEXIO_MCULCD_TransferGetCount(FLEXIO_MCULCD_Type *base, flexio_mculcd_handle_t *handle, size_t *count); + +/*! + * @brief FlexIO MCULCD IRQ handler function. + * + * @param base Pointer to the FLEXIO_MCULCD_Type structure. + * @param handle Pointer to the flexio_mculcd_handle_t structure to store the + * transfer state. + */ +void FLEXIO_MCULCD_TransferHandleIRQ(void *base, void *handle); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif /*_cplusplus*/ +/*! @} */ + +#endif /*FSL_FLEXIO_MCULCD_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd_edma.c new file mode 100644 index 00000000000..0c52c4e8c08 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd_edma.c @@ -0,0 +1,568 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2019,2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexio_mculcd_edma.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexio_mculcd_edma" +#endif + +#define EDMA_MAX_MAJOR_COUNT (DMA_CITER_ELINKNO_CITER_MASK >> DMA_CITER_ELINKNO_CITER_SHIFT) + +enum +{ + kFLEXIO_MCULCD_StateIdle, /*!< No transfer in progress. */ + kFLEXIO_MCULCD_StateReadArray, /*!< Reading array in progress. */ + kFLEXIO_MCULCD_StateWriteArray, /*!< Writing array in progress. */ + kFLEXIO_MCULCD_StateWriteSameValue, /*!< Writing the same value in progress. + */ +}; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/*! + * @brief EDMA callback function for FLEXIO MCULCD TX. + * + * For details, see @ref edma_callback. + */ +static void FLEXIO_MCULCD_TxEDMACallback(edma_handle_t *DmaHandle, void *param, bool transferDone, uint32_t tcds); + +/*! + * @brief EDMA callback function for FLEXIO MCULCD RX. + * + * For details, see @ref edma_callback. + */ +static void FLEXIO_MCULCD_RxEDMACallback(edma_handle_t *DmaHandle, void *param, bool transferDone, uint32_t tcds); + +/*! + * @brief Set EDMA config for FLEXIO MCULCD transfer. + * + * @param base pointer to FLEXIO_MCULCD_Type structure. + * @param handle pointer to flexio_mculcd_edma_handle_t structure to store the + * transfer state. + */ +static void FLEXIO_MCULCD_EDMAConfig(FLEXIO_MCULCD_Type *base, flexio_mculcd_edma_handle_t *handle); + +/*! + * @brief Convert the FlexIO shifter number to eDMA modulo. + * + * @param shifterNum The FlexIO shifter number. + * @param modulo The modulo number. + * @retval Get the modulo successfully. + * @retval Could not get the modulo for the shifter number. + */ +static bool FLEXIO_MCULCD_GetEDMAModulo(uint8_t shifterNum, edma_modulo_t *modulo); + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +static void FLEXIO_MCULCD_TxEDMACallback(edma_handle_t *DmaHandle, void *param, bool transferDone, uint32_t tcds) +{ + tcds = tcds; + flexio_mculcd_edma_handle_t *flexioLcdMcuHandle = (flexio_mculcd_edma_handle_t *)param; + FLEXIO_MCULCD_Type *flexioLcdMcuBase = flexioLcdMcuHandle->base; + + if (transferDone) + { + if (flexioLcdMcuHandle->remainingCount >= flexioLcdMcuHandle->minorLoopBytes) + { + FLEXIO_MCULCD_EDMAConfig(flexioLcdMcuBase, flexioLcdMcuHandle); + EDMA_StartTransfer(flexioLcdMcuHandle->txDmaHandle); + } + else + { + FLEXIO_MCULCD_EnableTxDMA(flexioLcdMcuBase, false); + + /* Now the data are in shifter, wait for the data send out from the shifter. */ + FLEXIO_MCULCD_WaitTransmitComplete(); + + /* Disable the TX shifter and the timer. */ + FLEXIO_MCULCD_ClearMultiBeatsWriteConfig(flexioLcdMcuBase); + + /* Send the remaining data. */ + if (0U != flexioLcdMcuHandle->remainingCount) + { + if ((uint32_t)kFLEXIO_MCULCD_StateWriteSameValue == flexioLcdMcuHandle->state) + { + FLEXIO_MCULCD_WriteSameValueBlocking(flexioLcdMcuBase, flexioLcdMcuHandle->dataAddrOrSameValue, + flexioLcdMcuHandle->remainingCount); + } + else + { + FLEXIO_MCULCD_WriteDataArrayBlocking(flexioLcdMcuBase, + (uint8_t *)flexioLcdMcuHandle->dataAddrOrSameValue, + flexioLcdMcuHandle->remainingCount); + } + } + + /* De-assert nCS. */ + FLEXIO_MCULCD_StopTransfer(flexioLcdMcuBase); + + /* Change the state. */ + flexioLcdMcuHandle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + flexioLcdMcuHandle->dataCount = 0; + flexioLcdMcuHandle->remainingCount = 0; + + /* Callback to inform upper layer. */ + if (NULL != flexioLcdMcuHandle->completionCallback) + { + flexioLcdMcuHandle->completionCallback(flexioLcdMcuBase, flexioLcdMcuHandle, kStatus_FLEXIO_MCULCD_Idle, + flexioLcdMcuHandle->userData); + } + } + } +} + +static void FLEXIO_MCULCD_RxEDMACallback(edma_handle_t *DmaHandle, void *param, bool transferDone, uint32_t tcds) +{ + tcds = tcds; + uint32_t i; + uint32_t rxBufAddr; + flexio_mculcd_edma_handle_t *flexioLcdMcuHandle = (flexio_mculcd_edma_handle_t *)param; + FLEXIO_MCULCD_Type *flexioLcdMcuBase = flexioLcdMcuHandle->base; + FLEXIO_Type *flexioBase = flexioLcdMcuBase->flexioBase; + + if (transferDone) + { + if (flexioLcdMcuHandle->remainingCount >= (2U * flexioLcdMcuHandle->minorLoopBytes)) + { + FLEXIO_MCULCD_EDMAConfig(flexioLcdMcuBase, flexioLcdMcuHandle); + EDMA_StartTransfer(flexioLcdMcuHandle->rxDmaHandle); + } + else + { + FLEXIO_MCULCD_EnableRxDMA(flexioLcdMcuBase, false); + + /* Wait the data saved to the shifter buffer. */ + while (0U == ((1UL << flexioLcdMcuBase->rxShifterEndIndex) & FLEXIO_GetShifterStatusFlags(flexioBase))) + { + } + + /* Disable the RX shifter and the timer. */ + FLEXIO_MCULCD_ClearMultiBeatsReadConfig(flexioLcdMcuBase); + + rxBufAddr = FLEXIO_MCULCD_GetRxDataRegisterAddress(flexioLcdMcuBase); + +/* Read out the data. */ +#if (defined(__CORTEX_M) && (__CORTEX_M == 0)) + /* Cortex M0 and M0+ only support aligned access. */ + for (i = 0; i < flexioLcdMcuHandle->rxShifterNum * 4; i++) + { + ((uint8_t *)(flexioLcdMcuHandle->dataAddrOrSameValue))[i] = ((volatile uint8_t *)rxBufAddr)[i]; + } +#else + for (i = 0; i < flexioLcdMcuHandle->rxShifterNum; i++) + { + ((uint32_t *)(flexioLcdMcuHandle->dataAddrOrSameValue))[i] = ((volatile uint32_t *)rxBufAddr)[i]; + } +#endif + flexioLcdMcuHandle->remainingCount -= flexioLcdMcuHandle->minorLoopBytes; + + if (0U != flexioLcdMcuHandle->remainingCount) + { + FLEXIO_MCULCD_ReadDataArrayBlocking( + flexioLcdMcuBase, + (uint8_t *)(flexioLcdMcuHandle->dataAddrOrSameValue + flexioLcdMcuHandle->minorLoopBytes), + flexioLcdMcuHandle->remainingCount); + } + + /* De-assert nCS. */ + FLEXIO_MCULCD_StopTransfer(flexioLcdMcuBase); + + /* Change the state. */ + flexioLcdMcuHandle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + flexioLcdMcuHandle->dataCount = 0; + flexioLcdMcuHandle->remainingCount = 0; + + /* Callback to inform upper layer. */ + if (NULL != flexioLcdMcuHandle->completionCallback) + { + flexioLcdMcuHandle->completionCallback(flexioLcdMcuBase, flexioLcdMcuHandle, kStatus_FLEXIO_MCULCD_Idle, + flexioLcdMcuHandle->userData); + } + } + } +} + +static void FLEXIO_MCULCD_EDMAConfig(FLEXIO_MCULCD_Type *base, flexio_mculcd_edma_handle_t *handle) +{ + edma_transfer_config_t xferConfig = {0}; + edma_transfer_size_t transferSize = kEDMA_TransferSize1Bytes; + int16_t offset; + uint32_t majorLoopCounts; + uint32_t transferCount; + +#if (8 == FLEXIO_MCULCD_DATA_BUS_WIDTH) + transferSize = kEDMA_TransferSize1Bytes; + offset = 1; +#else + transferSize = kEDMA_TransferSize2Bytes; + offset = 2; +#endif + + majorLoopCounts = handle->remainingCount / handle->minorLoopBytes; + + /* For reading, the last minor loop data is not tranfered by DMA. */ + if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == handle->state) + { + majorLoopCounts--; + } + + if (majorLoopCounts > EDMA_MAX_MAJOR_COUNT) + { + majorLoopCounts = EDMA_MAX_MAJOR_COUNT; + } + + transferCount = majorLoopCounts * handle->minorLoopBytes; + + if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == handle->state) + { + xferConfig.srcAddr = FLEXIO_MCULCD_GetRxDataRegisterAddress(base); + xferConfig.destAddr = handle->dataAddrOrSameValue; + xferConfig.srcTransferSize = kEDMA_TransferSize4Bytes; + xferConfig.destTransferSize = transferSize; + xferConfig.srcOffset = 4; + xferConfig.destOffset = offset; + xferConfig.minorLoopBytes = handle->minorLoopBytes; + xferConfig.majorLoopCounts = majorLoopCounts; + handle->remainingCount -= transferCount; + handle->dataAddrOrSameValue += transferCount; + (void)EDMA_SubmitTransfer(handle->rxDmaHandle, &xferConfig); + EDMA_SetModulo(handle->rxDmaHandle->base, handle->rxDmaHandle->channel, handle->rxEdmaModulo, + kEDMA_ModuloDisable); + } + else + { + if ((uint32_t)kFLEXIO_MCULCD_StateWriteArray == handle->state) + { + xferConfig.srcAddr = handle->dataAddrOrSameValue; + xferConfig.srcOffset = offset; + handle->dataAddrOrSameValue += transferCount; + } + else + { + xferConfig.srcAddr = (uint32_t)(&(handle->dataAddrOrSameValue)); + xferConfig.srcOffset = 0; + } + xferConfig.destAddr = FLEXIO_MCULCD_GetTxDataRegisterAddress(base); + xferConfig.srcTransferSize = transferSize; + xferConfig.destTransferSize = kEDMA_TransferSize4Bytes; + xferConfig.destOffset = 4; + xferConfig.minorLoopBytes = handle->minorLoopBytes; + xferConfig.majorLoopCounts = majorLoopCounts; + handle->remainingCount -= transferCount; + (void)EDMA_SubmitTransfer(handle->txDmaHandle, &xferConfig); + EDMA_SetModulo(handle->txDmaHandle->base, handle->txDmaHandle->channel, kEDMA_ModuloDisable, + handle->txEdmaModulo); + } +} + +static bool FLEXIO_MCULCD_GetEDMAModulo(uint8_t shifterNum, edma_modulo_t *modulo) +{ + bool ret = true; + + switch (shifterNum) + { + case 1U: + *modulo = kEDMA_Modulo4bytes; + break; + case 2U: + *modulo = kEDMA_Modulo8bytes; + break; + case 4U: + *modulo = kEDMA_Modulo16bytes; + break; + case 8U: + *modulo = kEDMA_Modulo32bytes; + break; + default: + ret = false; + break; + } + + return ret; +} + +/*! + * brief Initializes the FLEXO MCULCD master eDMA handle. + * + * This function initializes the FLEXO MCULCD master eDMA handle which can be + * used for other FLEXO MCULCD transactional APIs. For a specified FLEXO MCULCD + * instance, call this API once to get the initialized handle. + * + * param base Pointer to FLEXIO_MCULCD_Type structure. + * param handle Pointer to flexio_mculcd_edma_handle_t structure to store the + * transfer state. + * param callback MCULCD transfer complete callback, NULL means no callback. + * param userData callback function parameter. + * param txDmaHandle User requested eDMA handle for FlexIO MCULCD eDMA TX, + * the DMA request source of this handle should be the first of TX shifters. + * param rxDmaHandle User requested eDMA handle for FlexIO MCULCD eDMA RX, + * the DMA request source of this handle should be the last of RX shifters. + * retval kStatus_Success Successfully create the handle. + */ +status_t FLEXIO_MCULCD_TransferCreateHandleEDMA(FLEXIO_MCULCD_Type *base, + flexio_mculcd_edma_handle_t *handle, + flexio_mculcd_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txDmaHandle, + edma_handle_t *rxDmaHandle) +{ + assert(NULL != handle); + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Initialize the state. */ + handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + + /* Register callback and userData. */ + handle->completionCallback = callback; + handle->userData = userData; + + handle->base = base; + handle->txShifterNum = base->txShifterEndIndex - base->txShifterStartIndex + 1U; + handle->rxShifterNum = base->rxShifterEndIndex - base->rxShifterStartIndex + 1U; + + if (NULL != rxDmaHandle) + { + if (!FLEXIO_MCULCD_GetEDMAModulo(handle->rxShifterNum, &handle->rxEdmaModulo)) + { + return kStatus_InvalidArgument; + } + + handle->rxDmaHandle = rxDmaHandle; + EDMA_SetCallback(rxDmaHandle, FLEXIO_MCULCD_RxEDMACallback, handle); + } + + if (NULL != txDmaHandle) + { + if (!FLEXIO_MCULCD_GetEDMAModulo(handle->txShifterNum, &handle->txEdmaModulo)) + { + return kStatus_InvalidArgument; + } + + handle->txDmaHandle = txDmaHandle; + EDMA_SetCallback(txDmaHandle, FLEXIO_MCULCD_TxEDMACallback, handle); + } + + return kStatus_Success; +} + +/*! + * brief Performs a non-blocking FlexIO MCULCD transfer using eDMA. + * + * This function returns immediately after transfer initiates. To check whether + * the transfer is completed, user could: + * 1. Use the transfer completed callback; + * 2. Polling function ref FLEXIO_MCULCD_GetTransferCountEDMA + * + * param base pointer to FLEXIO_MCULCD_Type structure. + * param handle pointer to flexio_mculcd_edma_handle_t structure to store the + * transfer state. + * param xfer Pointer to FlexIO MCULCD transfer structure. + * retval kStatus_Success Successfully start a transfer. + * retval kStatus_InvalidArgument Input argument is invalid. + * retval kStatus_FLEXIO_MCULCD_Busy FlexIO MCULCD is not idle, it is running another + * transfer. + */ +status_t FLEXIO_MCULCD_TransferEDMA(FLEXIO_MCULCD_Type *base, + flexio_mculcd_edma_handle_t *handle, + flexio_mculcd_transfer_t *xfer) +{ + assert(NULL != handle); + assert(NULL != xfer); + + /* + * The data transfer mechanism: + * + * Read: + * Assume the data length is Lr = (n1 * minorLoopBytes + n2), where + * n2 < minorLoopBytes. + * If (n1 <= 1), then all data are sent using blocking method. + * If (n1 > 1), then the beginning ((n1-1) * minorLoopBytes) are read + * using DMA, the left (minorLoopBytes + n2) are read using blocking method. + * + * Write: + * Assume the data length is Lw = (n1 * minorLoopBytes + n2), where + * n2 < minorLoopBytes. + * If (n1 = 0), then all data are sent using blocking method. + * If (n1 >= 1), then the beginning (n1 * minorLoopBytes) are sent + * using DMA, the left n2 are sent using blocking method. + */ + + /* Check if the device is busy. */ + if ((uint32_t)kFLEXIO_MCULCD_StateIdle != handle->state) + { + return kStatus_FLEXIO_MCULCD_Busy; + } + + /* Set the state in handle. */ + if (kFLEXIO_MCULCD_ReadArray == xfer->mode) + { + handle->state = (uint32_t)kFLEXIO_MCULCD_StateReadArray; + handle->minorLoopBytes = handle->rxShifterNum * 4UL; + } + else + { + handle->minorLoopBytes = handle->txShifterNum * 4UL; + + if (kFLEXIO_MCULCD_WriteArray == xfer->mode) + { + handle->state = (uint32_t)kFLEXIO_MCULCD_StateWriteArray; + } + else + { + handle->state = (uint32_t)kFLEXIO_MCULCD_StateWriteSameValue; + } + } + + /* + * For TX, if data is less than one minor loop, then use polling method. + * For RX, if data is less than two minor loop, then use polling method. + */ + if ((xfer->dataSize < handle->minorLoopBytes) || + ((kFLEXIO_MCULCD_ReadArray == xfer->mode) && (xfer->dataSize < 2U * (handle->minorLoopBytes)))) + { + FLEXIO_MCULCD_TransferBlocking(base, xfer); + + handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + + /* Callback to inform upper layer. */ + if (NULL != handle->completionCallback) + { + handle->completionCallback(base, handle, kStatus_FLEXIO_MCULCD_Idle, handle->userData); + } + } + else + { + handle->dataCount = xfer->dataSize; + handle->remainingCount = xfer->dataSize; + handle->dataAddrOrSameValue = xfer->dataAddrOrSameValue; + + /* Setup DMA to transfer data. */ + /* Assert the nCS. */ + FLEXIO_MCULCD_StartTransfer(base); + + if (!xfer->dataOnly) + { + /* Send the command. */ + FLEXIO_MCULCD_WriteCommandBlocking(base, xfer->command); + } + + /* Setup the DMA configuration. */ + FLEXIO_MCULCD_EDMAConfig(base, handle); + + /* Start the transfer. */ + if (kFLEXIO_MCULCD_ReadArray == xfer->mode) + { + /* For 6800, assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(true); + } + FLEXIO_MCULCD_SetMultiBeatsReadConfig(base); + FLEXIO_MCULCD_EnableRxDMA(base, true); + EDMA_StartTransfer(handle->rxDmaHandle); + } + else + { + /* For 6800, de-assert the RDWR pin. */ + if (kFLEXIO_MCULCD_6800 == base->busType) + { + base->setRDWRPin(false); + } + FLEXIO_MCULCD_SetMultiBeatsWriteConfig(base); + FLEXIO_MCULCD_EnableTxDMA(base, true); + EDMA_StartTransfer(handle->txDmaHandle); + } + } + + return kStatus_Success; +} + +/*! + * brief Aborts a FlexIO MCULCD transfer using eDMA. + * + * param base pointer to FLEXIO_MCULCD_Type structure. + * param handle FlexIO MCULCD eDMA handle pointer. + */ +void FLEXIO_MCULCD_TransferAbortEDMA(FLEXIO_MCULCD_Type *base, flexio_mculcd_edma_handle_t *handle) +{ + assert(NULL != handle); + + /* Disable dma. */ + if (NULL != handle->txDmaHandle) + { + EDMA_AbortTransfer(handle->txDmaHandle); + } + if (NULL != handle->rxDmaHandle) + { + EDMA_AbortTransfer(handle->rxDmaHandle); + } + + /* Disable DMA enable bit. */ + FLEXIO_MCULCD_EnableTxDMA(handle->base, false); + FLEXIO_MCULCD_EnableRxDMA(handle->base, false); + + /* Set the handle state. */ + handle->state = (uint32_t)kFLEXIO_MCULCD_StateIdle; + handle->dataCount = 0; +} + +/*! + * brief Gets the remaining bytes for FlexIO MCULCD eDMA transfer. + * + * param base pointer to FLEXIO_MCULCD_Type structure. + * param handle FlexIO MCULCD eDMA handle pointer. + * param count Number of count transferred so far by the eDMA transaction. + * retval kStatus_Success Get the transferred count Successfully. + * retval kStatus_NoTransferInProgress No transfer in process. + */ +status_t FLEXIO_MCULCD_TransferGetCountEDMA(FLEXIO_MCULCD_Type *base, + flexio_mculcd_edma_handle_t *handle, + size_t *count) +{ + assert(NULL != handle); + assert(NULL != count); + uint32_t state = handle->state; + + if ((uint32_t)kFLEXIO_MCULCD_StateIdle == state) + { + return kStatus_NoTransferInProgress; + } + else + { + *count = handle->dataCount - handle->remainingCount; + + if ((uint32_t)kFLEXIO_MCULCD_StateReadArray == state) + { + *count -= handle->minorLoopBytes * + EDMA_GetRemainingMajorLoopCount(handle->rxDmaHandle->base, handle->rxDmaHandle->channel); + } + else + { + *count -= handle->minorLoopBytes * + EDMA_GetRemainingMajorLoopCount(handle->txDmaHandle->base, handle->txDmaHandle->channel); + } + } + + return kStatus_Success; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd_edma.h new file mode 100644 index 00000000000..98da16eef92 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_mculcd_edma.h @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020,2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_FLEXIO_MCULCD_EDMA_H_ +#define FSL_FLEXIO_MCULCD_EDMA_H_ + +#include "fsl_edma.h" +#include "fsl_flexio_mculcd.h" + +/*! + * @addtogroup flexio_edma_mculcd + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @{ */ +/*! @brief FlexIO MCULCD EDMA driver version. */ +#define FSL_FLEXIO_MCULCD_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 0, 5)) +/*! @} */ + +/*! @brief typedef for flexio_mculcd_edma_handle_t in advance. */ +typedef struct _flexio_mculcd_edma_handle flexio_mculcd_edma_handle_t; + +/*! @brief FlexIO MCULCD master callback for transfer complete. + * + * When transfer finished, the callback function is called and returns the + * @p status as kStatus_FLEXIO_MCULCD_Idle. + */ +typedef void (*flexio_mculcd_edma_transfer_callback_t)(FLEXIO_MCULCD_Type *base, + flexio_mculcd_edma_handle_t *handle, + status_t status, + void *userData); + +/*! @brief FlexIO MCULCD eDMA transfer handle, users should not touch the + * content of the handle.*/ +struct _flexio_mculcd_edma_handle +{ + FLEXIO_MCULCD_Type *base; /*!< Pointer to the FLEXIO_MCULCD_Type. */ + uint8_t txShifterNum; /*!< Number of shifters used for TX. */ + uint8_t rxShifterNum; /*!< Number of shifters used for RX. */ + uint32_t minorLoopBytes; /*!< eDMA transfer minor loop bytes. */ + edma_modulo_t txEdmaModulo; /*!< Modulo value for the FlexIO shifter buffer access. */ + edma_modulo_t rxEdmaModulo; /*!< Modulo value for the FlexIO shifter buffer access. */ + uint32_t dataAddrOrSameValue; /*!< When sending the same value for many times, + this is the value to send. When writing or + reading array, this is the address of the + data array. */ + size_t dataCount; /*!< Total count to be transferred. */ + volatile size_t remainingCount; /*!< Remaining count still not transfered. */ + volatile uint32_t state; /*!< FlexIO MCULCD driver internal state. */ + edma_handle_t *txDmaHandle; /*!< DMA handle for MCULCD TX */ + edma_handle_t *rxDmaHandle; /*!< DMA handle for MCULCD RX */ + flexio_mculcd_edma_transfer_callback_t completionCallback; /*!< Callback for MCULCD DMA transfer */ + void *userData; /*!< User Data for MCULCD DMA callback */ +}; + +/******************************************************************************* + * APIs + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name eDMA Transactional + * @{ + */ + +/*! + * @brief Initializes the FLEXO MCULCD master eDMA handle. + * + * This function initializes the FLEXO MCULCD master eDMA handle which can be + * used for other FLEXO MCULCD transactional APIs. For a specified FLEXO MCULCD + * instance, call this API once to get the initialized handle. + * + * @param base Pointer to FLEXIO_MCULCD_Type structure. + * @param handle Pointer to flexio_mculcd_edma_handle_t structure to store the + * transfer state. + * @param callback MCULCD transfer complete callback, NULL means no callback. + * @param userData callback function parameter. + * @param txDmaHandle User requested eDMA handle for FlexIO MCULCD eDMA TX, + * the DMA request source of this handle should be the first of TX shifters. + * @param rxDmaHandle User requested eDMA handle for FlexIO MCULCD eDMA RX, + * the DMA request source of this handle should be the last of RX shifters. + * @retval kStatus_Success Successfully create the handle. + */ +status_t FLEXIO_MCULCD_TransferCreateHandleEDMA(FLEXIO_MCULCD_Type *base, + flexio_mculcd_edma_handle_t *handle, + flexio_mculcd_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txDmaHandle, + edma_handle_t *rxDmaHandle); + +/*! + * @brief Performs a non-blocking FlexIO MCULCD transfer using eDMA. + * + * This function returns immediately after transfer initiates. To check whether + * the transfer is completed, user could: + * 1. Use the transfer completed callback; + * 2. Polling function FLEXIO_MCULCD_GetTransferCountEDMA + * + * @param base pointer to FLEXIO_MCULCD_Type structure. + * @param handle pointer to flexio_mculcd_edma_handle_t structure to store the + * transfer state. + * @param xfer Pointer to FlexIO MCULCD transfer structure. + * @retval kStatus_Success Successfully start a transfer. + * @retval kStatus_InvalidArgument Input argument is invalid. + * @retval kStatus_FLEXIO_MCULCD_Busy FlexIO MCULCD is not idle, it is running another + * transfer. + */ +status_t FLEXIO_MCULCD_TransferEDMA(FLEXIO_MCULCD_Type *base, + flexio_mculcd_edma_handle_t *handle, + flexio_mculcd_transfer_t *xfer); + +/*! + * @brief Aborts a FlexIO MCULCD transfer using eDMA. + * + * @param base pointer to FLEXIO_MCULCD_Type structure. + * @param handle FlexIO MCULCD eDMA handle pointer. + */ +void FLEXIO_MCULCD_TransferAbortEDMA(FLEXIO_MCULCD_Type *base, flexio_mculcd_edma_handle_t *handle); + +/*! + * @brief Gets the remaining bytes for FlexIO MCULCD eDMA transfer. + * + * @param base pointer to FLEXIO_MCULCD_Type structure. + * @param handle FlexIO MCULCD eDMA handle pointer. + * @param count Number of count transferred so far by the eDMA transaction. + * @retval kStatus_Success Get the transferred count Successfully. + * @retval kStatus_NoTransferInProgress No transfer in process. + */ +status_t FLEXIO_MCULCD_TransferGetCountEDMA(FLEXIO_MCULCD_Type *base, + flexio_mculcd_edma_handle_t *handle, + size_t *count); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* FSL_FLEXIO_MCULCD_EDMA_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi.c new file mode 100644 index 00000000000..96c9a7c0acc --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi.c @@ -0,0 +1,1565 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020, 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexio_spi.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexio_spi" +#endif + +/*! @brief FLEXIO SPI transfer state, which is used for SPI transactiaonl APIs' internal state. */ +enum _flexio_spi_transfer_states +{ + kFLEXIO_SPI_Idle = 0x0U, /*!< Nothing in the transmitter/receiver's queue. */ + kFLEXIO_SPI_Busy, /*!< Transmiter/Receive's queue is not finished. */ +}; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/*! + * @brief Send a piece of data for SPI. + * + * This function computes the number of data to be written into D register or Tx FIFO, + * and write the data into it. At the same time, this function updates the values in + * master handle structure. + * + * @param base pointer to FLEXIO_SPI_Type structure + * @param handle Pointer to SPI master handle structure. + */ +static void FLEXIO_SPI_TransferSendTransaction(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle); + +/*! + * @brief Receive a piece of data for SPI master. + * + * This function computes the number of data to receive from D register or Rx FIFO, + * and write the data to destination address. At the same time, this function updates + * the values in master handle structure. + * + * @param base pointer to FLEXIO_SPI_Type structure + * @param handle Pointer to SPI master handle structure. + */ +static void FLEXIO_SPI_TransferReceiveTransaction(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle); + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Codes + ******************************************************************************/ + +static uint32_t FLEXIO_SPI_GetInstance(FLEXIO_SPI_Type *base) +{ + return FLEXIO_GetInstance(base->flexioBase); +} + +static void FLEXIO_SPI_TransferSendTransaction(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle) +{ + uint32_t tmpData = FLEXIO_SPI_DUMMYDATA; + + if (handle->txData != NULL) + { + /* Transmit data and update tx size/buff. */ + if (handle->bytePerFrame == 1U) + { + tmpData = (uint32_t) * (handle->txData); + handle->txData++; + } + else if (handle->bytePerFrame == 2U) + { + if (handle->direction == kFLEXIO_SPI_MsbFirst) + { + tmpData = (uint32_t)(handle->txData[0]) << 8U; + tmpData += (uint32_t)handle->txData[1]; + } + else + { + tmpData = (uint32_t)(handle->txData[1]) << 8U; + tmpData += (uint32_t)handle->txData[0]; + } + handle->txData += 2U; + } + else + { + if (handle->direction == kFLEXIO_SPI_MsbFirst) + { + tmpData = (uint32_t)(handle->txData[0]) << 24U; + tmpData += (uint32_t)(handle->txData[1]) << 16U; + tmpData += (uint32_t)(handle->txData[2]) << 8U; + tmpData += (uint32_t)handle->txData[3]; + } + else + { + tmpData = (uint32_t)(handle->txData[3]) << 24U; + tmpData += (uint32_t)(handle->txData[2]) << 16U; + tmpData += (uint32_t)(handle->txData[1]) << 8U; + tmpData += (uint32_t)handle->txData[0]; + } + handle->txData += 4U; + } + } + else + { + tmpData = FLEXIO_SPI_DUMMYDATA; + } + + handle->txRemainingBytes -= handle->bytePerFrame; + + FLEXIO_SPI_WriteData(base, handle->direction, tmpData); + + if (0U == handle->txRemainingBytes) + { + FLEXIO_SPI_DisableInterrupts(base, (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable); + } +} + +static void FLEXIO_SPI_TransferReceiveTransaction(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle) +{ + uint32_t tmpData; + + tmpData = FLEXIO_SPI_ReadData(base, handle->direction); + + if (handle->rxData != NULL) + { + if (handle->bytePerFrame == 1U) + { + *handle->rxData = (uint8_t)tmpData; + } + else if (handle->bytePerFrame == 2U) + { + if (handle->direction == kFLEXIO_SPI_LsbFirst) + { + *handle->rxData = (uint8_t)(tmpData >> 8); + handle->rxData++; + *handle->rxData = (uint8_t)tmpData; + } + else + { + *handle->rxData = (uint8_t)tmpData; + handle->rxData++; + *handle->rxData = (uint8_t)(tmpData >> 8); + } + } + else + { + if (handle->direction == kFLEXIO_SPI_LsbFirst) + { + *handle->rxData = (uint8_t)(tmpData >> 24U); + handle->rxData++; + *handle->rxData = (uint8_t)(tmpData >> 16U); + handle->rxData++; + *handle->rxData = (uint8_t)(tmpData >> 8U); + handle->rxData++; + *handle->rxData = (uint8_t)tmpData; + } + else + { + *handle->rxData = (uint8_t)tmpData; + handle->rxData++; + *handle->rxData = (uint8_t)(tmpData >> 8U); + handle->rxData++; + *handle->rxData = (uint8_t)(tmpData >> 16U); + handle->rxData++; + *handle->rxData = (uint8_t)(tmpData >> 24U); + } + } + handle->rxData++; + } + handle->rxRemainingBytes -= handle->bytePerFrame; +} + +/*! + * brief Ungates the FlexIO clock, resets the FlexIO module, configures the FlexIO SPI master hardware, + * and configures the FlexIO SPI with FlexIO SPI master configuration. The + * configuration structure can be filled by the user, or be set with default values + * by the FLEXIO_SPI_MasterGetDefaultConfig(). + * + * note 1.FlexIO SPI master only support CPOL = 0, which means clock inactive low. + * 2.For FlexIO SPI master, the input valid time is 1.5 clock cycles, for slave the output valid time + * is 2.5 clock cycles. So if FlexIO SPI master communicates with other spi IPs, the maximum baud + * rate is FlexIO clock frequency divided by 2*2=4. If FlexIO SPI master communicates with FlexIO + * SPI slave, the maximum baud rate is FlexIO clock frequency divided by (1.5+2.5)*2=8. + * + * Example + code + FLEXIO_SPI_Type spiDev = { + .flexioBase = FLEXIO, + .SDOPinIndex = 0, + .SDIPinIndex = 1, + .SCKPinIndex = 2, + .CSnPinIndex = 3, + .shifterIndex = {0,1}, + .timerIndex = {0,1} + }; + flexio_spi_master_config_t config = { + .enableMaster = true, + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false, + .baudRate_Bps = 500000, + .phase = kFLEXIO_SPI_ClockPhaseFirstEdge, + .direction = kFLEXIO_SPI_MsbFirst, + .dataMode = kFLEXIO_SPI_8BitMode + }; + FLEXIO_SPI_MasterInit(&spiDev, &config, srcClock_Hz); + endcode + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param masterConfig Pointer to the flexio_spi_master_config_t structure. + * param srcClock_Hz FlexIO source clock in Hz. +*/ +void FLEXIO_SPI_MasterInit(FLEXIO_SPI_Type *base, flexio_spi_master_config_t *masterConfig, uint32_t srcClock_Hz) +{ + assert(base != NULL); + assert(masterConfig != NULL); + + flexio_shifter_config_t shifterConfig; + flexio_timer_config_t timerConfig; + uint32_t ctrlReg = 0; + uint16_t timerDiv = 0; + uint16_t timerCmp = 0; + + /* Clear the shifterConfig & timerConfig struct. */ + (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); + (void)memset(&timerConfig, 0, sizeof(timerConfig)); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate flexio clock. */ + CLOCK_EnableClock(s_flexioClocks[FLEXIO_SPI_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + /* Configure FLEXIO SPI Master */ + ctrlReg = base->flexioBase->CTRL; + ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); + ctrlReg |= (FLEXIO_CTRL_DBGE(masterConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(masterConfig->enableFastAccess) | + FLEXIO_CTRL_FLEXEN(masterConfig->enableMaster)); + if (!masterConfig->enableInDoze) + { + ctrlReg |= FLEXIO_CTRL_DOZEN_MASK; + } + + base->flexioBase->CTRL = ctrlReg; + + /* Do hardware configuration. */ + /* 1. Configure the shifter 0 for tx. */ + shifterConfig.timerSelect = base->timerIndex[0]; + shifterConfig.pinConfig = kFLEXIO_PinConfigOutput; + shifterConfig.pinSelect = base->SDOPinIndex; + shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; + shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; + shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; + if (masterConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) + { + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; + } + else + { + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitLow; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnShift; + } + + FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig); + + /* 2. Configure the shifter 1 for rx. */ + shifterConfig.timerSelect = base->timerIndex[0]; + shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + shifterConfig.pinSelect = base->SDIPinIndex; + shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; + shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; + shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; + if (masterConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) + { + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; + } + else + { + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; + } + + FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig); + + /*3. Configure the timer 0 for SCK. */ + timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); + timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; + timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; + timerConfig.pinConfig = kFLEXIO_PinConfigOutput; + timerConfig.pinSelect = base->SCKPinIndex; + timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; + timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit; + timerConfig.timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset; + timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; + timerConfig.timerReset = kFLEXIO_TimerResetNever; + timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; + timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; + timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable; + timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; + /* Low 8-bits are used to configure baudrate. */ + timerDiv = (uint16_t)(srcClock_Hz / masterConfig->baudRate_Bps); + timerDiv = timerDiv / 2U - 1U; + /* High 8-bits are used to configure shift clock edges(transfer width). */ + timerCmp = ((uint16_t)masterConfig->dataMode * 2U - 1U) << 8U; + timerCmp |= timerDiv; + + timerConfig.timerCompare = timerCmp; + + FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig); + + /* 4. Configure the timer 1 for CSn. */ + timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_TIMn(base->timerIndex[0]); + timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh; + timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; + timerConfig.pinConfig = kFLEXIO_PinConfigOutput; + timerConfig.pinSelect = base->CSnPinIndex; + timerConfig.pinPolarity = kFLEXIO_PinActiveLow; + timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; + timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; + timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; + timerConfig.timerReset = kFLEXIO_TimerResetNever; + timerConfig.timerDisable = kFLEXIO_TimerDisableOnPreTimerDisable; + timerConfig.timerEnable = kFLEXIO_TimerEnableOnPrevTimerEnable; + timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; + timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; + + timerConfig.timerCompare = 0xFFFFU; /* Never compare. */ + + FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[1], &timerConfig); +} + +/*! + * brief Resets the FlexIO SPI timer and shifter config. + * + * param base Pointer to the FLEXIO_SPI_Type. + */ +void FLEXIO_SPI_MasterDeinit(FLEXIO_SPI_Type *base) +{ + base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = 0; + base->flexioBase->SHIFTCTL[base->shifterIndex[0]] = 0; + base->flexioBase->SHIFTCFG[base->shifterIndex[1]] = 0; + base->flexioBase->SHIFTCTL[base->shifterIndex[1]] = 0; + base->flexioBase->TIMCFG[base->timerIndex[0]] = 0; + base->flexioBase->TIMCMP[base->timerIndex[0]] = 0; + base->flexioBase->TIMCTL[base->timerIndex[0]] = 0; + base->flexioBase->TIMCFG[base->timerIndex[1]] = 0; + base->flexioBase->TIMCMP[base->timerIndex[1]] = 0; + base->flexioBase->TIMCTL[base->timerIndex[1]] = 0; +} + +/*! + * brief Gets the default configuration to configure the FlexIO SPI master. The configuration + * can be used directly by calling the FLEXIO_SPI_MasterConfigure(). + * Example: + code + flexio_spi_master_config_t masterConfig; + FLEXIO_SPI_MasterGetDefaultConfig(&masterConfig); + endcode + * param masterConfig Pointer to the flexio_spi_master_config_t structure. +*/ +void FLEXIO_SPI_MasterGetDefaultConfig(flexio_spi_master_config_t *masterConfig) +{ + assert(masterConfig != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(masterConfig, 0, sizeof(*masterConfig)); + + masterConfig->enableMaster = true; + masterConfig->enableInDoze = false; + masterConfig->enableInDebug = true; + masterConfig->enableFastAccess = false; + /* Default baud rate 500kbps. */ + masterConfig->baudRate_Bps = 500000U; + /* Default CPHA = 0. */ + masterConfig->phase = kFLEXIO_SPI_ClockPhaseFirstEdge; + /* Default bit count at 8. */ + masterConfig->dataMode = kFLEXIO_SPI_8BitMode; +} + +/*! + * brief Ungates the FlexIO clock, resets the FlexIO module, configures the FlexIO SPI slave hardware + * configuration, and configures the FlexIO SPI with FlexIO SPI slave configuration. The + * configuration structure can be filled by the user, or be set with default values + * by the FLEXIO_SPI_SlaveGetDefaultConfig(). + * + * note 1.Only one timer is needed in the FlexIO SPI slave. As a result, the second timer index is ignored. + * 2.FlexIO SPI slave only support CPOL = 0, which means clock inactive low. + * 3.For FlexIO SPI master, the input valid time is 1.5 clock cycles, for slave the output valid time + * is 2.5 clock cycles. So if FlexIO SPI slave communicates with other spi IPs, the maximum baud + * rate is FlexIO clock frequency divided by 3*2=6. If FlexIO SPI slave communicates with FlexIO + * SPI master, the maximum baud rate is FlexIO clock frequency divided by (1.5+2.5)*2=8. + * Example + code + FLEXIO_SPI_Type spiDev = { + .flexioBase = FLEXIO, + .SDOPinIndex = 0, + .SDIPinIndex = 1, + .SCKPinIndex = 2, + .CSnPinIndex = 3, + .shifterIndex = {0,1}, + .timerIndex = {0} + }; + flexio_spi_slave_config_t config = { + .enableSlave = true, + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false, + .phase = kFLEXIO_SPI_ClockPhaseFirstEdge, + .direction = kFLEXIO_SPI_MsbFirst, + .dataMode = kFLEXIO_SPI_8BitMode + }; + FLEXIO_SPI_SlaveInit(&spiDev, &config); + endcode + * param base Pointer to the FLEXIO_SPI_Type structure. + * param slaveConfig Pointer to the flexio_spi_slave_config_t structure. +*/ +void FLEXIO_SPI_SlaveInit(FLEXIO_SPI_Type *base, flexio_spi_slave_config_t *slaveConfig) +{ + assert((base != NULL) && (slaveConfig != NULL)); + + flexio_shifter_config_t shifterConfig; + flexio_timer_config_t timerConfig; + uint32_t ctrlReg = 0; + + /* Clear the shifterConfig & timerConfig struct. */ + (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); + (void)memset(&timerConfig, 0, sizeof(timerConfig)); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate flexio clock. */ + CLOCK_EnableClock(s_flexioClocks[FLEXIO_SPI_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + /* Configure FLEXIO SPI Slave */ + ctrlReg = base->flexioBase->CTRL; + ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); + ctrlReg |= (FLEXIO_CTRL_DBGE(slaveConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(slaveConfig->enableFastAccess) | + FLEXIO_CTRL_FLEXEN(slaveConfig->enableSlave)); + if (!slaveConfig->enableInDoze) + { + ctrlReg |= FLEXIO_CTRL_DOZEN_MASK; + } + + base->flexioBase->CTRL = ctrlReg; + + /* Do hardware configuration. */ + /* 1. Configure the shifter 0 for tx. */ + shifterConfig.timerSelect = base->timerIndex[0]; + shifterConfig.pinConfig = kFLEXIO_PinConfigOutput; + shifterConfig.pinSelect = base->SDOPinIndex; + shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; + shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; + shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; + if (slaveConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) + { + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; + } + else + { + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnShift; + } + + FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig); + + /* 2. Configure the shifter 1 for rx. */ + shifterConfig.timerSelect = base->timerIndex[0]; + shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + shifterConfig.pinSelect = base->SDIPinIndex; + shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; + shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; + shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitDisable; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitDisabledLoadDataOnEnable; + if (slaveConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) + { + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; + } + else + { + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; + } + + FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig); + + /*3. Configure the timer 0 for shift clock. */ + timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->CSnPinIndex); + timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; + timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; + timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + timerConfig.pinSelect = base->SCKPinIndex; + timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; + timerConfig.timerMode = kFLEXIO_TimerModeSingle16Bit; + timerConfig.timerOutput = kFLEXIO_TimerOutputZeroNotAffectedByReset; + timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnPinInputShiftPinInput; + timerConfig.timerReset = kFLEXIO_TimerResetNever; + timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerRisingEdge; + timerConfig.timerStop = kFLEXIO_TimerStopBitDisabled; + if (slaveConfig->phase == kFLEXIO_SPI_ClockPhaseFirstEdge) + { + timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; + timerConfig.timerStart = kFLEXIO_TimerStartBitDisabled; + } + else + { + timerConfig.timerDisable = kFLEXIO_TimerDisableOnTriggerFallingEdge; + timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; + } + + timerConfig.timerCompare = (uint32_t)slaveConfig->dataMode * 2U - 1U; + + FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig); +} + +/*! + * brief Gates the FlexIO clock. + * + * param base Pointer to the FLEXIO_SPI_Type. + */ +void FLEXIO_SPI_SlaveDeinit(FLEXIO_SPI_Type *base) +{ + FLEXIO_SPI_MasterDeinit(base); +} + +/*! + * brief Gets the default configuration to configure the FlexIO SPI slave. The configuration + * can be used directly for calling the FLEXIO_SPI_SlaveConfigure(). + * Example: + code + flexio_spi_slave_config_t slaveConfig; + FLEXIO_SPI_SlaveGetDefaultConfig(&slaveConfig); + endcode + * param slaveConfig Pointer to the flexio_spi_slave_config_t structure. +*/ +void FLEXIO_SPI_SlaveGetDefaultConfig(flexio_spi_slave_config_t *slaveConfig) +{ + assert(slaveConfig != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(slaveConfig, 0, sizeof(*slaveConfig)); + + slaveConfig->enableSlave = true; + slaveConfig->enableInDoze = false; + slaveConfig->enableInDebug = true; + slaveConfig->enableFastAccess = false; + /* Default CPHA = 0. */ + slaveConfig->phase = kFLEXIO_SPI_ClockPhaseFirstEdge; + /* Default bit count at 8. */ + slaveConfig->dataMode = kFLEXIO_SPI_8BitMode; +} + +/*! + * brief Enables the FlexIO SPI interrupt. + * + * This function enables the FlexIO SPI interrupt. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param mask interrupt source. The parameter can be any combination of the following values: + * arg kFLEXIO_SPI_RxFullInterruptEnable + * arg kFLEXIO_SPI_TxEmptyInterruptEnable + */ +void FLEXIO_SPI_EnableInterrupts(FLEXIO_SPI_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable) != 0U) + { + FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); + } + if ((mask & (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable) != 0U) + { + FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Disables the FlexIO SPI interrupt. + * + * This function disables the FlexIO SPI interrupt. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param mask interrupt source The parameter can be any combination of the following values: + * arg kFLEXIO_SPI_RxFullInterruptEnable + * arg kFLEXIO_SPI_TxEmptyInterruptEnable + */ +void FLEXIO_SPI_DisableInterrupts(FLEXIO_SPI_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable) != 0U) + { + FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); + } + if ((mask & (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable) != 0U) + { + FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Enables/disables the FlexIO SPI transmit DMA. This function enables/disables the FlexIO SPI Tx DMA, + * which means that asserting the kFLEXIO_SPI_TxEmptyFlag does/doesn't trigger the DMA request. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param mask SPI DMA source. + * param enable True means enable DMA, false means disable DMA. + */ +void FLEXIO_SPI_EnableDMA(FLEXIO_SPI_Type *base, uint32_t mask, bool enable) +{ + if ((mask & (uint32_t)kFLEXIO_SPI_TxDmaEnable) != 0U) + { + FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterIndex[0], enable); + } + + if ((mask & (uint32_t)kFLEXIO_SPI_RxDmaEnable) != 0U) + { + FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterIndex[1], enable); + } +} + +/*! + * brief Gets FlexIO SPI status flags. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * return status flag; Use the status flag to AND the following flag mask and get the status. + * arg kFLEXIO_SPI_TxEmptyFlag + * arg kFLEXIO_SPI_RxEmptyFlag + */ + +uint32_t FLEXIO_SPI_GetStatusFlags(FLEXIO_SPI_Type *base) +{ + uint32_t shifterStatus = FLEXIO_GetShifterStatusFlags(base->flexioBase); + uint32_t status = 0; + + status = ((shifterStatus & (1UL << base->shifterIndex[0])) >> base->shifterIndex[0]); + status |= (((shifterStatus & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) << 1U); + + return status; +} + +/*! + * brief Clears FlexIO SPI status flags. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param mask status flag + * The parameter can be any combination of the following values: + * arg kFLEXIO_SPI_TxEmptyFlag + * arg kFLEXIO_SPI_RxEmptyFlag + */ + +void FLEXIO_SPI_ClearStatusFlags(FLEXIO_SPI_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag) != 0U) + { + FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[0]); + } + if ((mask & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag) != 0U) + { + FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Sets baud rate for the FlexIO SPI transfer, which is only used for the master. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param baudRate_Bps Baud Rate needed in Hz. + * param srcClockHz SPI source clock frequency in Hz. + */ +void FLEXIO_SPI_MasterSetBaudRate(FLEXIO_SPI_Type *base, uint32_t baudRate_Bps, uint32_t srcClockHz) +{ + uint16_t timerDiv = 0; + uint16_t timerCmp = 0; + FLEXIO_Type *flexioBase = base->flexioBase; + + /* Set TIMCMP[7:0] = (baud rate divider / 2) - 1.*/ + timerDiv = (uint16_t)(srcClockHz / baudRate_Bps); + timerDiv = timerDiv / 2U - 1U; + + timerCmp = (uint16_t)(flexioBase->TIMCMP[base->timerIndex[0]]); + timerCmp &= 0xFF00U; + timerCmp |= timerDiv; + + flexioBase->TIMCMP[base->timerIndex[0]] = timerCmp; +} + +/*! + * brief Sends a buffer of data bytes. + * + * note This function blocks using the polling method until all bytes have been sent. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param direction Shift direction of MSB first or LSB first. + * param buffer The data bytes to send. + * param size The number of data bytes to send. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. + */ +status_t FLEXIO_SPI_WriteBlocking(FLEXIO_SPI_Type *base, + flexio_spi_shift_direction_t direction, + const uint8_t *buffer, + size_t size) +{ + assert(buffer != NULL); + assert(size != 0U); + +#if SPI_RETRY_TIMES + uint32_t waitTimes; +#endif + + while (0U != size--) + { + /* Wait until data transfer complete. */ +#if SPI_RETRY_TIMES + waitTimes = SPI_RETRY_TIMES; + while ((0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag)) && + (0U != --waitTimes)) +#else + while (0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag)) +#endif + { + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return kStatus_FLEXIO_SPI_Timeout; + } +#endif + FLEXIO_SPI_WriteData(base, direction, *buffer++); + } + + return kStatus_Success; +} + +/*! + * brief Receives a buffer of bytes. + * + * note This function blocks using the polling method until all bytes have been received. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param direction Shift direction of MSB first or LSB first. + * param buffer The buffer to store the received bytes. + * param size The number of data bytes to be received. + * param direction Shift direction of MSB first or LSB first. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. + */ +status_t FLEXIO_SPI_ReadBlocking(FLEXIO_SPI_Type *base, + flexio_spi_shift_direction_t direction, + uint8_t *buffer, + size_t size) +{ + assert(buffer != NULL); + assert(size != 0U); + +#if SPI_RETRY_TIMES + uint32_t waitTimes; +#endif + + while (0U != size--) + { + /* Wait until data transfer complete. */ +#if SPI_RETRY_TIMES + waitTimes = SPI_RETRY_TIMES; + while ((0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag)) && + (0U != --waitTimes)) +#else + while (0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag)) +#endif + { + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return kStatus_FLEXIO_SPI_Timeout; + } +#endif + *buffer++ = (uint8_t)FLEXIO_SPI_ReadData(base, direction); + } + + return kStatus_Success; +} + +/*! + * brief Receives a buffer of bytes. + * + * note This function blocks via polling until all bytes have been received. + * + * param base pointer to FLEXIO_SPI_Type structure + * param xfer FlexIO SPI transfer structure, see #flexio_spi_transfer_t. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. + */ +status_t FLEXIO_SPI_MasterTransferBlocking(FLEXIO_SPI_Type *base, flexio_spi_transfer_t *xfer) +{ + flexio_spi_shift_direction_t direction; + uint8_t bytesPerFrame; + uint32_t dataMode = 0; + uint16_t timerCmp = (uint16_t)(base->flexioBase->TIMCMP[base->timerIndex[0]]); + uint32_t tmpData = FLEXIO_SPI_DUMMYDATA; + uint8_t dataFormat = FLEXIO_SPI_XFER_DATA_FORMAT(xfer->flags); +#if SPI_RETRY_TIMES + uint32_t waitTimes; +#endif + + timerCmp &= 0x00FFU; + + if ((xfer->flags & (uint8_t)kFLEXIO_SPI_csContinuous) != 0U) + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TSTOP_MASK) | + FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitDisabled); + } + else + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TSTOP_MASK) | + FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitEnableOnTimerDisable); + } + + /* Configure the values in handle. */ + switch (dataFormat) + { + case (uint8_t)kFLEXIO_SPI_8bitMsb: + dataMode = (8UL * 2UL - 1UL) << 8U; + bytesPerFrame = 1U; + direction = kFLEXIO_SPI_MsbFirst; + break; + + case (uint8_t)kFLEXIO_SPI_8bitLsb: + dataMode = (8UL * 2UL - 1UL) << 8U; + bytesPerFrame = 1U; + direction = kFLEXIO_SPI_LsbFirst; + break; + + case (uint8_t)kFLEXIO_SPI_16bitMsb: + dataMode = (16UL * 2UL - 1UL) << 8U; + bytesPerFrame = 2U; + direction = kFLEXIO_SPI_MsbFirst; + break; + + case (uint8_t)kFLEXIO_SPI_16bitLsb: + dataMode = (16UL * 2UL - 1UL) << 8U; + bytesPerFrame = 2U; + direction = kFLEXIO_SPI_LsbFirst; + break; + + case (uint8_t)kFLEXIO_SPI_32bitMsb: + dataMode = (32UL * 2UL - 1UL) << 8U; + bytesPerFrame = 4U; + direction = kFLEXIO_SPI_MsbFirst; + break; + + case (uint8_t)kFLEXIO_SPI_32bitLsb: + dataMode = (32UL * 2UL - 1UL) << 8U; + bytesPerFrame = 4U; + direction = kFLEXIO_SPI_LsbFirst; + break; + + default: + dataMode = (8UL * 2UL - 1UL) << 8U; + bytesPerFrame = 1U; + direction = kFLEXIO_SPI_MsbFirst; + assert(true); + break; + } + + dataMode |= timerCmp; + + /* Transfer size should be bytesPerFrame divisible. */ + if ((xfer->dataSize % bytesPerFrame) != 0U) + { + return kStatus_InvalidArgument; + } + + /* Configure transfer size. */ + base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; + + while (xfer->dataSize != 0U) + { + /* Wait until data transfer complete. */ +#if SPI_RETRY_TIMES + waitTimes = SPI_RETRY_TIMES; + while ((0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag)) && + (0U != --waitTimes)) +#else + while (0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag)) +#endif + { + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return kStatus_FLEXIO_SPI_Timeout; + } +#endif + if (xfer->txData != NULL) + { + /* Transmit data and update tx size/buff. */ + if (bytesPerFrame == 1U) + { + tmpData = (uint32_t) * (xfer->txData); + xfer->txData++; + } + else if (bytesPerFrame == 2U) + { + if (direction == kFLEXIO_SPI_MsbFirst) + { + tmpData = (uint32_t)(xfer->txData[0]) << 8U; + tmpData += (uint32_t)xfer->txData[1]; + } + else + { + tmpData = (uint32_t)(xfer->txData[1]) << 8U; + tmpData += (uint32_t)xfer->txData[0]; + } + xfer->txData += 2U; + } + else + { + if (direction == kFLEXIO_SPI_MsbFirst) + { + tmpData = (uint32_t)(xfer->txData[0]) << 24U; + tmpData += (uint32_t)(xfer->txData[1]) << 16U; + tmpData += (uint32_t)(xfer->txData[2]) << 8U; + tmpData += (uint32_t)xfer->txData[3]; + } + else + { + tmpData = (uint32_t)(xfer->txData[3]) << 24U; + tmpData += (uint32_t)(xfer->txData[2]) << 16U; + tmpData += (uint32_t)(xfer->txData[1]) << 8U; + tmpData += (uint32_t)xfer->txData[0]; + } + xfer->txData += 4U; + } + } + else + { + tmpData = FLEXIO_SPI_DUMMYDATA; + } + + xfer->dataSize -= bytesPerFrame; + + FLEXIO_SPI_WriteData(base, direction, tmpData); + +#if SPI_RETRY_TIMES + waitTimes = SPI_RETRY_TIMES; + while ((0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag)) && + (0U != --waitTimes)) +#else + while (0U == (FLEXIO_SPI_GetStatusFlags(base) & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag)) +#endif + { + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return kStatus_FLEXIO_SPI_Timeout; + } +#endif + tmpData = FLEXIO_SPI_ReadData(base, direction); + + if (xfer->rxData != NULL) + { + if (bytesPerFrame == 1U) + { + *xfer->rxData = (uint8_t)tmpData; + } + else if (bytesPerFrame == 2U) + { + if (direction == kFLEXIO_SPI_LsbFirst) + { + *xfer->rxData = (uint8_t)(tmpData >> 8); + xfer->rxData++; + *xfer->rxData = (uint8_t)tmpData; + } + else + { + *xfer->rxData = (uint8_t)tmpData; + xfer->rxData++; + *xfer->rxData = (uint8_t)(tmpData >> 8); + } + } + else + { + if (direction == kFLEXIO_SPI_LsbFirst) + { + *xfer->rxData = (uint8_t)(tmpData >> 24U); + xfer->rxData++; + *xfer->rxData = (uint8_t)(tmpData >> 16U); + xfer->rxData++; + *xfer->rxData = (uint8_t)(tmpData >> 8U); + xfer->rxData++; + *xfer->rxData = (uint8_t)tmpData; + } + else + { + *xfer->rxData = (uint8_t)tmpData; + xfer->rxData++; + *xfer->rxData = (uint8_t)(tmpData >> 8U); + xfer->rxData++; + *xfer->rxData = (uint8_t)(tmpData >> 16U); + xfer->rxData++; + *xfer->rxData = (uint8_t)(tmpData >> 24U); + } + } + xfer->rxData++; + } + } + + return kStatus_Success; +} + +/*! + * brief Initializes the FlexIO SPI Master handle, which is used in transactional functions. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + * param callback The callback function. + * param userData The parameter of the callback function. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_SPI_MasterTransferCreateHandle(FLEXIO_SPI_Type *base, + flexio_spi_master_handle_t *handle, + flexio_spi_master_transfer_callback_t callback, + void *userData) +{ + assert(handle != NULL); + + IRQn_Type flexio_irqs[] = FLEXIO_IRQS; + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Register callback and userData. */ + handle->callback = callback; + handle->userData = userData; + + /* Clear pending NVIC IRQ before enable NVIC IRQ. */ + NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_SPI_GetInstance(base)]); + /* Enable interrupt in NVIC. */ + (void)EnableIRQ(flexio_irqs[FLEXIO_SPI_GetInstance(base)]); + + /* Save the context in global variables to support the double weak mechanism. */ + return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_SPI_MasterTransferHandleIRQ); +} + +/*! + * brief Master transfer data using IRQ. + * + * This function sends data using IRQ. This is a non-blocking function, which returns + * right away. When all data is sent out/received, the callback function is called. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + * param xfer FlexIO SPI transfer structure. See #flexio_spi_transfer_t. + * retval kStatus_Success Successfully start a transfer. + * retval kStatus_InvalidArgument Input argument is invalid. + * retval kStatus_FLEXIO_SPI_Busy SPI is not idle, is running another transfer. + */ +status_t FLEXIO_SPI_MasterTransferNonBlocking(FLEXIO_SPI_Type *base, + flexio_spi_master_handle_t *handle, + flexio_spi_transfer_t *xfer) +{ + assert(handle != NULL); + assert(xfer != NULL); + + uint32_t dataMode = 0; + uint16_t timerCmp = (uint16_t)base->flexioBase->TIMCMP[base->timerIndex[0]]; + uint32_t tmpData = FLEXIO_SPI_DUMMYDATA; + uint8_t dataFormat = FLEXIO_SPI_XFER_DATA_FORMAT(xfer->flags); + + timerCmp &= 0x00FFU; + + /* Check if SPI is busy. */ + if (handle->state == (uint32_t)kFLEXIO_SPI_Busy) + { + return kStatus_FLEXIO_SPI_Busy; + } + + /* Check if the argument is legal. */ + if ((xfer->txData == NULL) && (xfer->rxData == NULL)) + { + return kStatus_InvalidArgument; + } + + /* Timer1 controls the CS signal which enables/disables(asserts/deasserts) when timer0 enable/disable. Timer0 + enables when tx shifter is written and disables when timer compare. The timer compare event causes the + transmit shift registers to load which generates a tx register empty event. Since when timer stop bit is + disabled, a timer enable condition can be detected in the same cycle as a timer disable condition, so if + software writes the tx register upon the detection of tx register empty event, the timer enable condition + is triggered again, then the CS signal can remain low until software no longer writes the tx register. */ + if ((xfer->flags & (uint8_t)kFLEXIO_SPI_csContinuous) != 0U) + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TSTOP_MASK) | + FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitDisabled); + } + else + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TSTOP_MASK) | + FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitEnableOnTimerDisable); + } + + /* Configure the values in handle */ + switch (dataFormat) + { + case (uint8_t)kFLEXIO_SPI_8bitMsb: + dataMode = (8UL * 2UL - 1UL) << 8U; + handle->bytePerFrame = 1U; + handle->direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_8bitLsb: + dataMode = (8UL * 2UL - 1UL) << 8U; + handle->bytePerFrame = 1U; + handle->direction = kFLEXIO_SPI_LsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_16bitMsb: + dataMode = (16UL * 2UL - 1UL) << 8U; + handle->bytePerFrame = 2U; + handle->direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_16bitLsb: + dataMode = (16UL * 2UL - 1UL) << 8U; + handle->bytePerFrame = 2U; + handle->direction = kFLEXIO_SPI_LsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_32bitMsb: + dataMode = (32UL * 2UL - 1UL) << 8U; + handle->bytePerFrame = 4U; + handle->direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_32bitLsb: + dataMode = (32UL * 2UL - 1UL) << 8U; + handle->bytePerFrame = 4U; + handle->direction = kFLEXIO_SPI_LsbFirst; + break; + default: + dataMode = (8UL * 2UL - 1UL) << 8U; + handle->bytePerFrame = 1U; + handle->direction = kFLEXIO_SPI_MsbFirst; + assert(true); + break; + } + + dataMode |= timerCmp; + + /* Transfer size should be bytesPerFrame divisible. */ + if ((xfer->dataSize % handle->bytePerFrame) != 0U) + { + return kStatus_InvalidArgument; + } + + /* Configure transfer size. */ + base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; + + handle->state = (uint32_t)kFLEXIO_SPI_Busy; + handle->txData = xfer->txData; + handle->rxData = xfer->rxData; + handle->rxRemainingBytes = xfer->dataSize; + + /* Save total transfer size. */ + handle->transferSize = xfer->dataSize; + + /* Send first byte of data to trigger the rx interrupt. */ + if (handle->txData != NULL) + { + /* Transmit data and update tx size/buff. */ + if (handle->bytePerFrame == 1U) + { + tmpData = (uint32_t) * (handle->txData); + handle->txData++; + } + else if (handle->bytePerFrame == 2U) + { + if (handle->direction == kFLEXIO_SPI_MsbFirst) + { + tmpData = (uint32_t)(handle->txData[0]) << 8U; + tmpData += (uint32_t)handle->txData[1]; + } + else + { + tmpData = (uint32_t)(handle->txData[1]) << 8U; + tmpData += (uint32_t)handle->txData[0]; + } + handle->txData += 2U; + } + else + { + if (handle->direction == kFLEXIO_SPI_MsbFirst) + { + tmpData = (uint32_t)(handle->txData[0]) << 24U; + tmpData += (uint32_t)(handle->txData[1]) << 16U; + tmpData += (uint32_t)(handle->txData[2]) << 8U; + tmpData += (uint32_t)handle->txData[3]; + } + else + { + tmpData = (uint32_t)(handle->txData[3]) << 24U; + tmpData += (uint32_t)(handle->txData[2]) << 16U; + tmpData += (uint32_t)(handle->txData[1]) << 8U; + tmpData += (uint32_t)handle->txData[0]; + } + handle->txData += 4U; + } + } + else + { + tmpData = FLEXIO_SPI_DUMMYDATA; + } + + handle->txRemainingBytes = xfer->dataSize - handle->bytePerFrame; + + FLEXIO_SPI_WriteData(base, handle->direction, tmpData); + + /* Enable transmit and receive interrupt to handle rx. */ + FLEXIO_SPI_EnableInterrupts(base, (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable); + + if ((xfer->flags & (uint8_t)kFLEXIO_SPI_csContinuous) != 0U) + { + FLEXIO_SPI_EnableInterrupts(base, (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable); + } + + return kStatus_Success; +} + +/*! + * brief Gets the data transfer status which used IRQ. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + * param count Number of bytes transferred so far by the non-blocking transaction. + * retval kStatus_InvalidArgument count is Invalid. + * retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_SPI_MasterTransferGetCount(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Return remaing bytes in different cases. */ + if (handle->rxData != NULL) + { + *count = handle->transferSize - handle->rxRemainingBytes; + } + else + { + *count = handle->transferSize - handle->txRemainingBytes; + } + + return kStatus_Success; +} + +/*! + * brief Aborts the master data transfer, which used IRQ. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + */ +void FLEXIO_SPI_MasterTransferAbort(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle) +{ + assert(handle != NULL); + + FLEXIO_SPI_DisableInterrupts(base, (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable); + FLEXIO_SPI_DisableInterrupts(base, (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable); + + /* Transfer finished, set the state to idle. */ + handle->state = (uint32_t)kFLEXIO_SPI_Idle; + + /* Clear the internal state. */ + handle->rxRemainingBytes = 0; + handle->txRemainingBytes = 0; +} + +/*! + * brief FlexIO SPI master IRQ handler function. + * + * param spiType Pointer to the FLEXIO_SPI_Type structure. + * param spiHandle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + */ +void FLEXIO_SPI_MasterTransferHandleIRQ(void *spiType, void *spiHandle) +{ + assert(spiHandle != NULL); + + flexio_spi_master_handle_t *handle = (flexio_spi_master_handle_t *)spiHandle; + FLEXIO_SPI_Type *base; + uint32_t status; + + if (handle->state == (uint32_t)kFLEXIO_SPI_Idle) + { + return; + } + + base = (FLEXIO_SPI_Type *)spiType; + status = FLEXIO_SPI_GetStatusFlags(base); + + /* Receive interrupt. */ + if ((status & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag) == 0U) + { + FLEXIO_SPI_TransferSendTransaction(base, handle); + return; + } + + /* Handle rx. */ + if (handle->rxRemainingBytes != 0U) + { + FLEXIO_SPI_TransferReceiveTransaction(base, handle); + } + + /* Handle tx. */ + if (((status & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag) != 0U) && (handle->txRemainingBytes != 0U)) + { + FLEXIO_SPI_TransferSendTransaction(base, handle); + } + + /* All the transfer finished. */ + if ((handle->txRemainingBytes == 0U) && (handle->rxRemainingBytes == 0U)) + { + FLEXIO_SPI_MasterTransferAbort(base, handle); + if (handle->callback != NULL) + { + (handle->callback)(base, handle, kStatus_FLEXIO_SPI_Idle, handle->userData); + } + } +} + +/*! + * brief Initializes the FlexIO SPI Slave handle, which is used in transactional functions. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. + * param callback The callback function. + * param userData The parameter of the callback function. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_SPI_SlaveTransferCreateHandle(FLEXIO_SPI_Type *base, + flexio_spi_slave_handle_t *handle, + flexio_spi_slave_transfer_callback_t callback, + void *userData) +{ + assert(handle != NULL); + + IRQn_Type flexio_irqs[] = FLEXIO_IRQS; + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Register callback and userData. */ + handle->callback = callback; + handle->userData = userData; + + /* Clear pending NVIC IRQ before enable NVIC IRQ. */ + NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_SPI_GetInstance(base)]); + /* Enable interrupt in NVIC. */ + (void)EnableIRQ(flexio_irqs[FLEXIO_SPI_GetInstance(base)]); + + /* Save the context in global variables to support the double weak mechanism. */ + return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_SPI_SlaveTransferHandleIRQ); +} + +/*! + * brief Slave transfer data using IRQ. + * + * This function sends data using IRQ. This is a non-blocking function, which returns + * right away. When all data is sent out/received, the callback function is called. + * param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + * param xfer FlexIO SPI transfer structure. See #flexio_spi_transfer_t. + * retval kStatus_Success Successfully start a transfer. + * retval kStatus_InvalidArgument Input argument is invalid. + * retval kStatus_FLEXIO_SPI_Busy SPI is not idle; it is running another transfer. + */ +status_t FLEXIO_SPI_SlaveTransferNonBlocking(FLEXIO_SPI_Type *base, + flexio_spi_slave_handle_t *handle, + flexio_spi_transfer_t *xfer) +{ + assert(handle != NULL); + assert(xfer != NULL); + + uint32_t dataMode = 0; + uint8_t dataFormat = FLEXIO_SPI_XFER_DATA_FORMAT(xfer->flags); + + /* Check if SPI is busy. */ + if (handle->state == (uint32_t)kFLEXIO_SPI_Busy) + { + return kStatus_FLEXIO_SPI_Busy; + } + + /* Check if the argument is legal. */ + if ((xfer->txData == NULL) && (xfer->rxData == NULL)) + { + return kStatus_InvalidArgument; + } + + /* SCK timer use CS pin as inverted trigger so timer should be disbaled on trigger falling edge(CS re-asserts). */ + /* However if CPHA is first edge mode, timer will restart each time right after timer compare event occur and + before CS pin re-asserts, which triggers another shifter load. To avoid this, when in CS dis-continuous mode, + timer should disable in timer compare rather than trigger falling edge(CS re-asserts), and in CS continuous mode, + tx/rx shifters should be flushed after transfer finishes and before next transfer starts. */ + FLEXIO_SPI_FlushShifters(base); + if ((xfer->flags & (uint8_t)kFLEXIO_SPI_csContinuous) != 0U) + { + base->flexioBase->TIMCFG[base->timerIndex[0]] |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTriggerFallingEdge); + } + else + { + if ((base->flexioBase->SHIFTCTL[base->shifterIndex[0]] & FLEXIO_SHIFTCTL_TIMPOL_MASK) == + FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnNegitive)) + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TIMDIS_MASK) | + FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare); + } + else + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TIMDIS_MASK) | + FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTriggerFallingEdge); + } + } + + /* Configure the values in handle */ + switch (dataFormat) + { + case (uint8_t)kFLEXIO_SPI_8bitMsb: + dataMode = 8U * 2U - 1U; + handle->bytePerFrame = 1U; + handle->direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_8bitLsb: + dataMode = 8U * 2U - 1U; + handle->bytePerFrame = 1U; + handle->direction = kFLEXIO_SPI_LsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_16bitMsb: + dataMode = 16U * 2U - 1U; + handle->bytePerFrame = 2U; + handle->direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_16bitLsb: + dataMode = 16U * 2U - 1U; + handle->bytePerFrame = 2U; + handle->direction = kFLEXIO_SPI_LsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_32bitMsb: + dataMode = 32UL * 2UL - 1UL; + handle->bytePerFrame = 4U; + handle->direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_32bitLsb: + dataMode = 32UL * 2UL - 1UL; + handle->bytePerFrame = 4U; + handle->direction = kFLEXIO_SPI_LsbFirst; + break; + default: + dataMode = 8UL * 2UL - 1UL; + handle->bytePerFrame = 1U; + handle->direction = kFLEXIO_SPI_MsbFirst; + assert(true); + break; + } + + /* Transfer size should be bytesPerFrame divisible. */ + if ((xfer->dataSize % handle->bytePerFrame) != 0U) + { + return kStatus_InvalidArgument; + } + + /* Configure transfer size. */ + base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; + + handle->state = (uint32_t)kFLEXIO_SPI_Busy; + handle->txData = xfer->txData; + handle->rxData = xfer->rxData; + handle->txRemainingBytes = xfer->dataSize; + handle->rxRemainingBytes = xfer->dataSize; + + /* Save total transfer size. */ + handle->transferSize = xfer->dataSize; + + /* Enable transmit and receive interrupt to handle tx and rx. */ + FLEXIO_SPI_EnableInterrupts(base, (uint32_t)kFLEXIO_SPI_TxEmptyInterruptEnable); + FLEXIO_SPI_EnableInterrupts(base, (uint32_t)kFLEXIO_SPI_RxFullInterruptEnable); + + return kStatus_Success; +} + +/*! + * brief FlexIO SPI slave IRQ handler function. + * + * param spiType Pointer to the FLEXIO_SPI_Type structure. + * param spiHandle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. + */ +void FLEXIO_SPI_SlaveTransferHandleIRQ(void *spiType, void *spiHandle) +{ + assert(spiHandle != NULL); + + flexio_spi_master_handle_t *handle = (flexio_spi_master_handle_t *)spiHandle; + FLEXIO_SPI_Type *base; + uint32_t status; + + if (handle->state == (uint32_t)kFLEXIO_SPI_Idle) + { + return; + } + + base = (FLEXIO_SPI_Type *)spiType; + status = FLEXIO_SPI_GetStatusFlags(base); + + /* Handle tx. */ + if (((status & (uint32_t)kFLEXIO_SPI_TxBufferEmptyFlag) != 0U) && (handle->txRemainingBytes != 0U)) + { + FLEXIO_SPI_TransferSendTransaction(base, handle); + } + + /* Handle rx. */ + if (((status & (uint32_t)kFLEXIO_SPI_RxBufferFullFlag) != 0U) && (handle->rxRemainingBytes != 0U)) + { + FLEXIO_SPI_TransferReceiveTransaction(base, handle); + } + + /* All the transfer finished. */ + if ((handle->txRemainingBytes == 0U) && (handle->rxRemainingBytes == 0U)) + { + FLEXIO_SPI_SlaveTransferAbort(base, handle); + if (handle->callback != NULL) + { + (handle->callback)(base, handle, kStatus_FLEXIO_SPI_Idle, handle->userData); + } + } +} + +/*! + * brief Flush tx/rx shifters. + * + * param base Pointer to the FLEXIO_SPI_Type structure. + */ +void FLEXIO_SPI_FlushShifters(FLEXIO_SPI_Type *base) +{ + /* Disable then re-enable to flush the tx shifter. */ + base->flexioBase->SHIFTCTL[base->shifterIndex[0]] &= ~FLEXIO_SHIFTCTL_SMOD_MASK; + base->flexioBase->SHIFTCTL[base->shifterIndex[0]] |= FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit); + /* Read to flush the rx shifter. */ + (void)base->flexioBase->SHIFTBUF[base->shifterIndex[1]]; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi.h new file mode 100644 index 00000000000..cae17a802c9 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi.h @@ -0,0 +1,718 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020, 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_FLEXIO_SPI_H_ +#define FSL_FLEXIO_SPI_H_ + +#include "fsl_common.h" +#include "fsl_flexio.h" + +/*! + * @addtogroup flexio_spi + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FlexIO SPI driver version. */ +#define FSL_FLEXIO_SPI_DRIVER_VERSION (MAKE_VERSION(2, 3, 4)) +/*! @} */ + +#ifndef FLEXIO_SPI_DUMMYDATA +/*! @brief FlexIO SPI dummy transfer data, the data is sent while txData is NULL. */ +#define FLEXIO_SPI_DUMMYDATA (0x00U) +#endif + +/*! @brief Retry times for waiting flag. */ +#ifndef SPI_RETRY_TIMES +#define SPI_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ +#endif + +/*! @brief Get the transfer data format of width and bit order. */ +#define FLEXIO_SPI_XFER_DATA_FORMAT(flag) ((flag) & (0x7U)) + +/*! @brief Error codes for the FlexIO SPI driver. */ +enum +{ + kStatus_FLEXIO_SPI_Busy = MAKE_STATUS(kStatusGroup_FLEXIO_SPI, 1), /*!< FlexIO SPI is busy. */ + kStatus_FLEXIO_SPI_Idle = MAKE_STATUS(kStatusGroup_FLEXIO_SPI, 2), /*!< SPI is idle */ + kStatus_FLEXIO_SPI_Error = MAKE_STATUS(kStatusGroup_FLEXIO_SPI, 3), /*!< FlexIO SPI error. */ + kStatus_FLEXIO_SPI_Timeout = + MAKE_STATUS(kStatusGroup_FLEXIO_SPI, 4), /*!< FlexIO SPI timeout polling status flags. */ +}; + +/*! @brief FlexIO SPI clock phase configuration. */ +typedef enum _flexio_spi_clock_phase +{ + kFLEXIO_SPI_ClockPhaseFirstEdge = 0x0U, /*!< First edge on SPSCK occurs at the middle of the first + * cycle of a data transfer. */ + kFLEXIO_SPI_ClockPhaseSecondEdge = 0x1U, /*!< First edge on SPSCK occurs at the start of the + * first cycle of a data transfer. */ +} flexio_spi_clock_phase_t; + +/*! @brief FlexIO SPI data shifter direction options. */ +typedef enum _flexio_spi_shift_direction +{ + kFLEXIO_SPI_MsbFirst = 0, /*!< Data transfers start with most significant bit. */ + kFLEXIO_SPI_LsbFirst = 1, /*!< Data transfers start with least significant bit. */ +} flexio_spi_shift_direction_t; + +/*! @brief FlexIO SPI data length mode options. */ +typedef enum _flexio_spi_data_bitcount_mode +{ + kFLEXIO_SPI_8BitMode = 0x08U, /*!< 8-bit data transmission mode. */ + kFLEXIO_SPI_16BitMode = 0x10U, /*!< 16-bit data transmission mode. */ + kFLEXIO_SPI_32BitMode = 0x20U, /*!< 32-bit data transmission mode. */ +} flexio_spi_data_bitcount_mode_t; + +/*! @brief Define FlexIO SPI interrupt mask. */ +enum _flexio_spi_interrupt_enable +{ + kFLEXIO_SPI_TxEmptyInterruptEnable = 0x1U, /*!< Transmit buffer empty interrupt enable. */ + kFLEXIO_SPI_RxFullInterruptEnable = 0x2U, /*!< Receive buffer full interrupt enable. */ +}; + +/*! @brief Define FlexIO SPI status mask. */ +enum _flexio_spi_status_flags +{ + kFLEXIO_SPI_TxBufferEmptyFlag = 0x1U, /*!< Transmit buffer empty flag. */ + kFLEXIO_SPI_RxBufferFullFlag = 0x2U, /*!< Receive buffer full flag. */ +}; + +/*! @brief Define FlexIO SPI DMA mask. */ +enum _flexio_spi_dma_enable +{ + kFLEXIO_SPI_TxDmaEnable = 0x1U, /*!< Tx DMA request source */ + kFLEXIO_SPI_RxDmaEnable = 0x2U, /*!< Rx DMA request source */ + kFLEXIO_SPI_DmaAllEnable = 0x3U, /*!< All DMA request source*/ +}; + +/*! @brief Define FlexIO SPI transfer flags. + * @note Use kFLEXIO_SPI_csContinuous and one of the other flags to OR together to form the transfer flag. */ +enum _flexio_spi_transfer_flags +{ + kFLEXIO_SPI_8bitMsb = 0x0U, /*!< FlexIO SPI 8-bit MSB first */ + kFLEXIO_SPI_8bitLsb = 0x1U, /*!< FlexIO SPI 8-bit LSB first */ + kFLEXIO_SPI_16bitMsb = 0x2U, /*!< FlexIO SPI 16-bit MSB first */ + kFLEXIO_SPI_16bitLsb = 0x3U, /*!< FlexIO SPI 16-bit LSB first */ + kFLEXIO_SPI_32bitMsb = 0x4U, /*!< FlexIO SPI 32-bit MSB first */ + kFLEXIO_SPI_32bitLsb = 0x5U, /*!< FlexIO SPI 32-bit LSB first */ + kFLEXIO_SPI_csContinuous = 0x8U, /*!< Enable the CS signal continuous mode */ +}; + +/*! @brief Define FlexIO SPI access structure typedef. */ +typedef struct _flexio_spi_type +{ + FLEXIO_Type *flexioBase; /*!< FlexIO base pointer. */ + uint8_t SDOPinIndex; /*!< Pin select for data output. To set SDO pin in Hi-Z state, user needs to mux the pin as + GPIO input and disable all pull up/down in application. */ + uint8_t SDIPinIndex; /*!< Pin select for data input. */ + uint8_t SCKPinIndex; /*!< Pin select for clock. */ + uint8_t CSnPinIndex; /*!< Pin select for enable. */ + uint8_t shifterIndex[2]; /*!< Shifter index used in FlexIO SPI. */ + uint8_t timerIndex[2]; /*!< Timer index used in FlexIO SPI. */ +} FLEXIO_SPI_Type; + +/*! @brief Define FlexIO SPI master configuration structure. */ +typedef struct _flexio_spi_master_config +{ + bool enableMaster; /*!< Enable/disable FlexIO SPI master after configuration. */ + bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode. */ + bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode. */ + bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, + fast access requires the FlexIO clock to be at least + twice the frequency of the bus clock. */ + uint32_t baudRate_Bps; /*!< Baud rate in Bps. */ + flexio_spi_clock_phase_t phase; /*!< Clock phase. */ + flexio_spi_data_bitcount_mode_t dataMode; /*!< 8bit or 16bit mode. */ +} flexio_spi_master_config_t; + +/*! @brief Define FlexIO SPI slave configuration structure. */ +typedef struct _flexio_spi_slave_config +{ + bool enableSlave; /*!< Enable/disable FlexIO SPI slave after configuration. */ + bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode. */ + bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode. */ + bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, + fast access requires the FlexIO clock to be at least + twice the frequency of the bus clock. */ + flexio_spi_clock_phase_t phase; /*!< Clock phase. */ + flexio_spi_data_bitcount_mode_t dataMode; /*!< 8bit or 16bit mode. */ +} flexio_spi_slave_config_t; + +/*! @brief Define FlexIO SPI transfer structure. */ +typedef struct _flexio_spi_transfer +{ + const uint8_t *txData; /*!< Send buffer. */ + uint8_t *rxData; /*!< Receive buffer. */ + size_t dataSize; /*!< Transfer bytes. */ + uint8_t flags; /*!< FlexIO SPI control flag, MSB first or LSB first. */ +} flexio_spi_transfer_t; + +/*! @brief typedef for flexio_spi_master_handle_t in advance. */ +typedef struct _flexio_spi_master_handle flexio_spi_master_handle_t; + +/*! @brief Slave handle is the same with master handle. */ +typedef flexio_spi_master_handle_t flexio_spi_slave_handle_t; + +/*! @brief FlexIO SPI master callback for finished transmit */ +typedef void (*flexio_spi_master_transfer_callback_t)(FLEXIO_SPI_Type *base, + flexio_spi_master_handle_t *handle, + status_t status, + void *userData); + +/*! @brief FlexIO SPI slave callback for finished transmit */ +typedef void (*flexio_spi_slave_transfer_callback_t)(FLEXIO_SPI_Type *base, + flexio_spi_slave_handle_t *handle, + status_t status, + void *userData); + +/*! @brief Define FlexIO SPI handle structure. */ +struct _flexio_spi_master_handle +{ + const uint8_t *txData; /*!< Transfer buffer. */ + uint8_t *rxData; /*!< Receive buffer. */ + size_t transferSize; /*!< Total bytes to be transferred. */ + volatile size_t txRemainingBytes; /*!< Send data remaining in bytes. */ + volatile size_t rxRemainingBytes; /*!< Receive data remaining in bytes. */ + volatile uint32_t state; /*!< FlexIO SPI internal state. */ + uint8_t bytePerFrame; /*!< SPI mode, 2bytes or 1byte in a frame */ + flexio_spi_shift_direction_t direction; /*!< Shift direction. */ + flexio_spi_master_transfer_callback_t callback; /*!< FlexIO SPI callback. */ + void *userData; /*!< Callback parameter. */ +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /*_cplusplus*/ + +/*! + * @name FlexIO SPI Configuration + * @{ + */ + +/*! + * @brief Ungates the FlexIO clock, resets the FlexIO module, configures the FlexIO SPI master hardware, + * and configures the FlexIO SPI with FlexIO SPI master configuration. The + * configuration structure can be filled by the user, or be set with default values + * by the FLEXIO_SPI_MasterGetDefaultConfig(). + * + * @note 1.FlexIO SPI master only support CPOL = 0, which means clock inactive low. + * 2.For FlexIO SPI master, the input valid time is 1.5 clock cycles, for slave the output valid time + * is 2.5 clock cycles. So if FlexIO SPI master communicates with other spi IPs, the maximum baud + * rate is FlexIO clock frequency divided by 2*2=4. If FlexIO SPI master communicates with FlexIO + * SPI slave, the maximum baud rate is FlexIO clock frequency divided by (1.5+2.5)*2=8. + * + * Example + @code + FLEXIO_SPI_Type spiDev = { + .flexioBase = FLEXIO, + .SDOPinIndex = 0, + .SDIPinIndex = 1, + .SCKPinIndex = 2, + .CSnPinIndex = 3, + .shifterIndex = {0,1}, + .timerIndex = {0,1} + }; + flexio_spi_master_config_t config = { + .enableMaster = true, + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false, + .baudRate_Bps = 500000, + .phase = kFLEXIO_SPI_ClockPhaseFirstEdge, + .direction = kFLEXIO_SPI_MsbFirst, + .dataMode = kFLEXIO_SPI_8BitMode + }; + FLEXIO_SPI_MasterInit(&spiDev, &config, srcClock_Hz); + @endcode + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param masterConfig Pointer to the flexio_spi_master_config_t structure. + * @param srcClock_Hz FlexIO source clock in Hz. +*/ +void FLEXIO_SPI_MasterInit(FLEXIO_SPI_Type *base, flexio_spi_master_config_t *masterConfig, uint32_t srcClock_Hz); + +/*! + * @brief Resets the FlexIO SPI timer and shifter config. + * + * @param base Pointer to the FLEXIO_SPI_Type. + */ +void FLEXIO_SPI_MasterDeinit(FLEXIO_SPI_Type *base); + +/*! + * @brief Gets the default configuration to configure the FlexIO SPI master. The configuration + * can be used directly by calling the FLEXIO_SPI_MasterConfigure(). + * Example: + @code + flexio_spi_master_config_t masterConfig; + FLEXIO_SPI_MasterGetDefaultConfig(&masterConfig); + @endcode + * @param masterConfig Pointer to the flexio_spi_master_config_t structure. +*/ +void FLEXIO_SPI_MasterGetDefaultConfig(flexio_spi_master_config_t *masterConfig); + +/*! + * @brief Ungates the FlexIO clock, resets the FlexIO module, configures the FlexIO SPI slave hardware + * configuration, and configures the FlexIO SPI with FlexIO SPI slave configuration. The + * configuration structure can be filled by the user, or be set with default values + * by the FLEXIO_SPI_SlaveGetDefaultConfig(). + * + * @note 1.Only one timer is needed in the FlexIO SPI slave. As a result, the second timer index is ignored. + * 2.FlexIO SPI slave only support CPOL = 0, which means clock inactive low. + * 3.For FlexIO SPI master, the input valid time is 1.5 clock cycles, for slave the output valid time + * is 2.5 clock cycles. So if FlexIO SPI slave communicates with other spi IPs, the maximum baud + * rate is FlexIO clock frequency divided by 3*2=6. If FlexIO SPI slave communicates with FlexIO + * SPI master, the maximum baud rate is FlexIO clock frequency divided by (1.5+2.5)*2=8. + * Example + @code + FLEXIO_SPI_Type spiDev = { + .flexioBase = FLEXIO, + .SDOPinIndex = 0, + .SDIPinIndex = 1, + .SCKPinIndex = 2, + .CSnPinIndex = 3, + .shifterIndex = {0,1}, + .timerIndex = {0} + }; + flexio_spi_slave_config_t config = { + .enableSlave = true, + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false, + .phase = kFLEXIO_SPI_ClockPhaseFirstEdge, + .direction = kFLEXIO_SPI_MsbFirst, + .dataMode = kFLEXIO_SPI_8BitMode + }; + FLEXIO_SPI_SlaveInit(&spiDev, &config); + @endcode + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param slaveConfig Pointer to the flexio_spi_slave_config_t structure. +*/ +void FLEXIO_SPI_SlaveInit(FLEXIO_SPI_Type *base, flexio_spi_slave_config_t *slaveConfig); + +/*! + * @brief Gates the FlexIO clock. + * + * @param base Pointer to the FLEXIO_SPI_Type. + */ +void FLEXIO_SPI_SlaveDeinit(FLEXIO_SPI_Type *base); + +/*! + * @brief Gets the default configuration to configure the FlexIO SPI slave. The configuration + * can be used directly for calling the FLEXIO_SPI_SlaveConfigure(). + * Example: + @code + flexio_spi_slave_config_t slaveConfig; + FLEXIO_SPI_SlaveGetDefaultConfig(&slaveConfig); + @endcode + * @param slaveConfig Pointer to the flexio_spi_slave_config_t structure. +*/ +void FLEXIO_SPI_SlaveGetDefaultConfig(flexio_spi_slave_config_t *slaveConfig); + +/*! @} */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets FlexIO SPI status flags. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @return status flag; Use the status flag to AND the following flag mask and get the status. + * @arg kFLEXIO_SPI_TxEmptyFlag + * @arg kFLEXIO_SPI_RxEmptyFlag + */ + +uint32_t FLEXIO_SPI_GetStatusFlags(FLEXIO_SPI_Type *base); + +/*! + * @brief Clears FlexIO SPI status flags. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param mask status flag + * The parameter can be any combination of the following values: + * @arg kFLEXIO_SPI_TxEmptyFlag + * @arg kFLEXIO_SPI_RxEmptyFlag + */ + +void FLEXIO_SPI_ClearStatusFlags(FLEXIO_SPI_Type *base, uint32_t mask); + +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables the FlexIO SPI interrupt. + * + * This function enables the FlexIO SPI interrupt. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param mask interrupt source. The parameter can be any combination of the following values: + * @arg kFLEXIO_SPI_RxFullInterruptEnable + * @arg kFLEXIO_SPI_TxEmptyInterruptEnable + */ +void FLEXIO_SPI_EnableInterrupts(FLEXIO_SPI_Type *base, uint32_t mask); + +/*! + * @brief Disables the FlexIO SPI interrupt. + * + * This function disables the FlexIO SPI interrupt. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param mask interrupt source The parameter can be any combination of the following values: + * @arg kFLEXIO_SPI_RxFullInterruptEnable + * @arg kFLEXIO_SPI_TxEmptyInterruptEnable + */ +void FLEXIO_SPI_DisableInterrupts(FLEXIO_SPI_Type *base, uint32_t mask); + +/*! @} */ + +/*! + * @name DMA Control + * @{ + */ + +/*! + * @brief Enables/disables the FlexIO SPI transmit DMA. This function enables/disables the FlexIO SPI Tx DMA, + * which means that asserting the kFLEXIO_SPI_TxEmptyFlag does/doesn't trigger the DMA request. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param mask SPI DMA source. + * @param enable True means enable DMA, false means disable DMA. + */ +void FLEXIO_SPI_EnableDMA(FLEXIO_SPI_Type *base, uint32_t mask, bool enable); + +/*! + * @brief Gets the FlexIO SPI transmit data register address for MSB first transfer. + * + * This function returns the SPI data register address, which is mainly used by DMA/eDMA. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param direction Shift direction of MSB first or LSB first. + * @return FlexIO SPI transmit data register address. + */ +static inline uint32_t FLEXIO_SPI_GetTxDataRegisterAddress(FLEXIO_SPI_Type *base, + flexio_spi_shift_direction_t direction) +{ + if (direction == kFLEXIO_SPI_MsbFirst) + { + return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBufferBitSwapped, + base->shifterIndex[0]) + + 3U; + } + else + { + return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBuffer, base->shifterIndex[0]); + } +} + +/*! + * @brief Gets the FlexIO SPI receive data register address for the MSB first transfer. + * + * This function returns the SPI data register address, which is mainly used by DMA/eDMA. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param direction Shift direction of MSB first or LSB first. + * @return FlexIO SPI receive data register address. + */ +static inline uint32_t FLEXIO_SPI_GetRxDataRegisterAddress(FLEXIO_SPI_Type *base, + flexio_spi_shift_direction_t direction) +{ + if (direction == kFLEXIO_SPI_MsbFirst) + { + return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBufferBitSwapped, base->shifterIndex[1]); + } + else + { + return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBuffer, base->shifterIndex[1]) + 3U; + } +} + +/*! @} */ + +/*! + * @name Bus Operations + * @{ + */ + +/*! + * @brief Enables/disables the FlexIO SPI module operation. + * + * @param base Pointer to the FLEXIO_SPI_Type. + * @param enable True to enable, false does not have any effect. + */ +static inline void FLEXIO_SPI_Enable(FLEXIO_SPI_Type *base, bool enable) +{ + if (enable) + { + base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; + } +} + +/*! + * @brief Sets baud rate for the FlexIO SPI transfer, which is only used for the master. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param baudRate_Bps Baud Rate needed in Hz. + * @param srcClockHz SPI source clock frequency in Hz. + */ +void FLEXIO_SPI_MasterSetBaudRate(FLEXIO_SPI_Type *base, uint32_t baudRate_Bps, uint32_t srcClockHz); + +/*! + * @brief Writes one byte of data, which is sent using the MSB method. + * + * @note This is a non-blocking API, which returns directly after the data is put into the + * data register but the data transfer is not finished on the bus. Ensure that + * the TxEmptyFlag is asserted before calling this API. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param direction Shift direction of MSB first or LSB first. + * @param data 8/16/32 bit data. + */ +static inline void FLEXIO_SPI_WriteData(FLEXIO_SPI_Type *base, flexio_spi_shift_direction_t direction, uint32_t data) +{ + if (direction == kFLEXIO_SPI_MsbFirst) + { + base->flexioBase->SHIFTBUFBBS[base->shifterIndex[0]] = data; + } + else + { + base->flexioBase->SHIFTBUF[base->shifterIndex[0]] = data; + } +} + +/*! + * @brief Reads 8 bit/16 bit data. + * + * @note This is a non-blocking API, which returns directly after the data is read from the + * data register. Ensure that the RxFullFlag is asserted before calling this API. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param direction Shift direction of MSB first or LSB first. + * @return 8 bit/16 bit data received. + */ +static inline uint32_t FLEXIO_SPI_ReadData(FLEXIO_SPI_Type *base, flexio_spi_shift_direction_t direction) +{ + if (direction == kFLEXIO_SPI_MsbFirst) + { + return (uint32_t)(base->flexioBase->SHIFTBUFBIS[base->shifterIndex[1]]); + } + else + { + return (uint32_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]); + } +} + +/*! + * @brief Sends a buffer of data bytes. + * + * @note This function blocks using the polling method until all bytes have been sent. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param direction Shift direction of MSB first or LSB first. + * @param buffer The data bytes to send. + * @param size The number of data bytes to send. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. + */ +status_t FLEXIO_SPI_WriteBlocking(FLEXIO_SPI_Type *base, + flexio_spi_shift_direction_t direction, + const uint8_t *buffer, + size_t size); + +/*! + * @brief Receives a buffer of bytes. + * + * @note This function blocks using the polling method until all bytes have been received. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param direction Shift direction of MSB first or LSB first. + * @param buffer The buffer to store the received bytes. + * @param size The number of data bytes to be received. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. + */ +status_t FLEXIO_SPI_ReadBlocking(FLEXIO_SPI_Type *base, + flexio_spi_shift_direction_t direction, + uint8_t *buffer, + size_t size); + +/*! + * @brief Receives a buffer of bytes. + * + * @note This function blocks via polling until all bytes have been received. + * + * @param base pointer to FLEXIO_SPI_Type structure + * @param xfer FlexIO SPI transfer structure, see #flexio_spi_transfer_t. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_FLEXIO_SPI_Timeout The transfer timed out and was aborted. + */ +status_t FLEXIO_SPI_MasterTransferBlocking(FLEXIO_SPI_Type *base, flexio_spi_transfer_t *xfer); + +/*! + * @brief Flush tx/rx shifters. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + */ +void FLEXIO_SPI_FlushShifters(FLEXIO_SPI_Type *base); +/*! @} */ + +/*Transactional APIs*/ + +/*! + * @name Transactional + * @{ + */ + +/*! + * @brief Initializes the FlexIO SPI Master handle, which is used in transactional functions. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + * @param callback The callback function. + * @param userData The parameter of the callback function. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_SPI_MasterTransferCreateHandle(FLEXIO_SPI_Type *base, + flexio_spi_master_handle_t *handle, + flexio_spi_master_transfer_callback_t callback, + void *userData); + +/*! + * @brief Master transfer data using IRQ. + * + * This function sends data using IRQ. This is a non-blocking function, which returns + * right away. When all data is sent out/received, the callback function is called. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + * @param xfer FlexIO SPI transfer structure. See #flexio_spi_transfer_t. + * @retval kStatus_Success Successfully start a transfer. + * @retval kStatus_InvalidArgument Input argument is invalid. + * @retval kStatus_FLEXIO_SPI_Busy SPI is not idle, is running another transfer. + */ +status_t FLEXIO_SPI_MasterTransferNonBlocking(FLEXIO_SPI_Type *base, + flexio_spi_master_handle_t *handle, + flexio_spi_transfer_t *xfer); + +/*! + * @brief Aborts the master data transfer, which used IRQ. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + */ +void FLEXIO_SPI_MasterTransferAbort(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle); + +/*! + * @brief Gets the data transfer status which used IRQ. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param handle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + * @param count Number of bytes transferred so far by the non-blocking transaction. + * @retval kStatus_InvalidArgument count is Invalid. + * @retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_SPI_MasterTransferGetCount(FLEXIO_SPI_Type *base, flexio_spi_master_handle_t *handle, size_t *count); + +/*! + * @brief FlexIO SPI master IRQ handler function. + * + * @param spiType Pointer to the FLEXIO_SPI_Type structure. + * @param spiHandle Pointer to the flexio_spi_master_handle_t structure to store the transfer state. + */ +void FLEXIO_SPI_MasterTransferHandleIRQ(void *spiType, void *spiHandle); + +/*! + * @brief Initializes the FlexIO SPI Slave handle, which is used in transactional functions. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. + * @param callback The callback function. + * @param userData The parameter of the callback function. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_SPI_SlaveTransferCreateHandle(FLEXIO_SPI_Type *base, + flexio_spi_slave_handle_t *handle, + flexio_spi_slave_transfer_callback_t callback, + void *userData); + +/*! + * @brief Slave transfer data using IRQ. + * + * This function sends data using IRQ. This is a non-blocking function, which returns + * right away. When all data is sent out/received, the callback function is called. + * @param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param xfer FlexIO SPI transfer structure. See #flexio_spi_transfer_t. + * @retval kStatus_Success Successfully start a transfer. + * @retval kStatus_InvalidArgument Input argument is invalid. + * @retval kStatus_FLEXIO_SPI_Busy SPI is not idle; it is running another transfer. + */ +status_t FLEXIO_SPI_SlaveTransferNonBlocking(FLEXIO_SPI_Type *base, + flexio_spi_slave_handle_t *handle, + flexio_spi_transfer_t *xfer); + +/*! + * @brief Aborts the slave data transfer which used IRQ, share same API with master. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. + */ +static inline void FLEXIO_SPI_SlaveTransferAbort(FLEXIO_SPI_Type *base, flexio_spi_slave_handle_t *handle) +{ + FLEXIO_SPI_MasterTransferAbort(base, handle); +} +/*! + * @brief Gets the data transfer status which used IRQ, share same API with master. + * + * @param base Pointer to the FLEXIO_SPI_Type structure. + * @param handle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. + * @param count Number of bytes transferred so far by the non-blocking transaction. + * @retval kStatus_InvalidArgument count is Invalid. + * @retval kStatus_Success Successfully return the count. + */ +static inline status_t FLEXIO_SPI_SlaveTransferGetCount(FLEXIO_SPI_Type *base, + flexio_spi_slave_handle_t *handle, + size_t *count) +{ + return FLEXIO_SPI_MasterTransferGetCount(base, handle, count); +} + +/*! + * @brief FlexIO SPI slave IRQ handler function. + * + * @param spiType Pointer to the FLEXIO_SPI_Type structure. + * @param spiHandle Pointer to the flexio_spi_slave_handle_t structure to store the transfer state. + */ +void FLEXIO_SPI_SlaveTransferHandleIRQ(void *spiType, void *spiHandle); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif /*_cplusplus*/ +/*! @} */ + +#endif /*FSL_FLEXIO_SPI_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi_edma.c new file mode 100644 index 00000000000..c1feba0f001 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi_edma.c @@ -0,0 +1,565 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020, 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexio_spi_edma.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexio_spi_edma" +#endif + +/*base, (uint32_t)kFLEXIO_SPI_TxDmaEnable, false); + + /* change the state */ + spiPrivateHandle->handle->txInProgress = false; + + /* All finished, call the callback */ + if ((spiPrivateHandle->handle->txInProgress == false) && (spiPrivateHandle->handle->rxInProgress == false)) + { + if (spiPrivateHandle->handle->callback != NULL) + { + (spiPrivateHandle->handle->callback)(spiPrivateHandle->base, spiPrivateHandle->handle, kStatus_Success, + spiPrivateHandle->handle->userData); + } + } + } +} + +static void FLEXIO_SPI_RxEDMACallback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + tcds = tcds; + flexio_spi_master_edma_private_handle_t *spiPrivateHandle = (flexio_spi_master_edma_private_handle_t *)param; + + if (transferDone) + { + /* Disable Rx dma */ + FLEXIO_SPI_EnableDMA(spiPrivateHandle->base, (uint32_t)kFLEXIO_SPI_RxDmaEnable, false); + + /* change the state */ + spiPrivateHandle->handle->rxInProgress = false; + + /* All finished, call the callback */ + if ((spiPrivateHandle->handle->txInProgress == false) && (spiPrivateHandle->handle->rxInProgress == false)) + { + if (spiPrivateHandle->handle->callback != NULL) + { + (spiPrivateHandle->handle->callback)(spiPrivateHandle->base, spiPrivateHandle->handle, kStatus_Success, + spiPrivateHandle->handle->userData); + } + } + } +} + +static status_t FLEXIO_SPI_EDMAConfig(FLEXIO_SPI_Type *base, + flexio_spi_master_edma_handle_t *handle, + flexio_spi_transfer_t *xfer) +{ + edma_transfer_config_t xferConfig = {0}; + flexio_spi_shift_direction_t direction = kFLEXIO_SPI_MsbFirst; + uint8_t bytesPerFrame; + uint8_t dataFormat = FLEXIO_SPI_XFER_DATA_FORMAT(xfer->flags); + + /* Configure the values in handle. */ + switch (dataFormat) + { + case (uint8_t)kFLEXIO_SPI_8bitMsb: + bytesPerFrame = 1U; + direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_8bitLsb: + bytesPerFrame = 1U; + direction = kFLEXIO_SPI_LsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_16bitMsb: + bytesPerFrame = 2U; + direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_16bitLsb: + bytesPerFrame = 2U; + direction = kFLEXIO_SPI_LsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_32bitMsb: + bytesPerFrame = 4U; + direction = kFLEXIO_SPI_MsbFirst; + break; + case (uint8_t)kFLEXIO_SPI_32bitLsb: + bytesPerFrame = 4U; + direction = kFLEXIO_SPI_LsbFirst; + break; + default: + bytesPerFrame = 1U; + direction = kFLEXIO_SPI_MsbFirst; + assert(true); + break; + } + + /* Transfer size should be bytesPerFrame divisible. */ + if ((xfer->dataSize % bytesPerFrame) != 0U) + { + return kStatus_InvalidArgument; + } + + /* Save total transfer size. */ + handle->transferSize = xfer->dataSize; + + /* Configure tx transfer EDMA. */ + xferConfig.destAddr = FLEXIO_SPI_GetTxDataRegisterAddress(base, direction); + xferConfig.destOffset = 0; + if (bytesPerFrame == 1U) + { + xferConfig.srcTransferSize = kEDMA_TransferSize1Bytes; + xferConfig.destTransferSize = kEDMA_TransferSize1Bytes; + xferConfig.minorLoopBytes = 1U; + } + else if (bytesPerFrame == 2U) + { + if (direction == kFLEXIO_SPI_MsbFirst) + { + xferConfig.destAddr -= 1U; + } + xferConfig.srcTransferSize = kEDMA_TransferSize2Bytes; + xferConfig.destTransferSize = kEDMA_TransferSize2Bytes; + xferConfig.minorLoopBytes = 2U; + } + else + { + if (direction == kFLEXIO_SPI_MsbFirst) + { + xferConfig.destAddr -= 3U; + } + xferConfig.srcTransferSize = kEDMA_TransferSize4Bytes; + xferConfig.destTransferSize = kEDMA_TransferSize4Bytes; + xferConfig.minorLoopBytes = 4U; + } + + /* Configure DMA channel. */ + if (xfer->txData != NULL) + { + xferConfig.srcOffset = (int16_t)bytesPerFrame; + xferConfig.srcAddr = (uint32_t)(xfer->txData); + } + else + { + /* Disable the source increasement and source set to dummyData. */ + xferConfig.srcOffset = 0; + xferConfig.srcAddr = (uint32_t)(&s_dummyData); + } + + xferConfig.majorLoopCounts = (xfer->dataSize / xferConfig.minorLoopBytes); + + /* Store the initially configured eDMA minor byte transfer count into the FLEXIO SPI handle */ + handle->nbytes = (uint8_t)xferConfig.minorLoopBytes; + + if (handle->txHandle != NULL) + { + (void)EDMA_SubmitTransfer(handle->txHandle, &xferConfig); + } + + /* Configure rx transfer EDMA. */ + if (xfer->rxData != NULL) + { + xferConfig.srcAddr = FLEXIO_SPI_GetRxDataRegisterAddress(base, direction); + if (bytesPerFrame == 2U) + { + if (direction == kFLEXIO_SPI_LsbFirst) + { + xferConfig.srcAddr -= 1U; + } + } + else if (bytesPerFrame == 4U) + { + if (direction == kFLEXIO_SPI_LsbFirst) + { + xferConfig.srcAddr -= 3U; + } + } + else + { + } + xferConfig.srcOffset = 0; + xferConfig.destAddr = (uint32_t)(xfer->rxData); + xferConfig.destOffset = (int16_t)bytesPerFrame; + (void)EDMA_SubmitTransfer(handle->rxHandle, &xferConfig); + handle->rxInProgress = true; + FLEXIO_SPI_EnableDMA(base, (uint32_t)kFLEXIO_SPI_RxDmaEnable, true); + EDMA_StartTransfer(handle->rxHandle); + } + + /* Always start tx transfer. */ + if (handle->txHandle != NULL) + { + handle->txInProgress = true; + FLEXIO_SPI_EnableDMA(base, (uint32_t)kFLEXIO_SPI_TxDmaEnable, true); + EDMA_StartTransfer(handle->txHandle); + } + + return kStatus_Success; +} + +/*! + * brief Initializes the FlexIO SPI master eDMA handle. + * + * This function initializes the FlexIO SPI master eDMA handle which can be used for other FlexIO SPI master + * transactional + * APIs. + * For a specified FlexIO SPI instance, call this API once to get the initialized handle. + * + * param base Pointer to FLEXIO_SPI_Type structure. + * param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state. + * param callback SPI callback, NULL means no callback. + * param userData callback function parameter. + * param txHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer. + * param rxHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range. + */ +status_t FLEXIO_SPI_MasterTransferCreateHandleEDMA(FLEXIO_SPI_Type *base, + flexio_spi_master_edma_handle_t *handle, + flexio_spi_master_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txHandle, + edma_handle_t *rxHandle) +{ + assert(handle != NULL); + + uint8_t index = 0; + + /* Find the an empty handle pointer to store the handle. */ + for (index = 0U; index < (uint8_t)FLEXIO_SPI_HANDLE_COUNT; index++) + { + if (s_edmaPrivateHandle[index].base == NULL) + { + s_edmaPrivateHandle[index].base = base; + s_edmaPrivateHandle[index].handle = handle; + break; + } + } + + if (index == (uint16_t)FLEXIO_SPI_HANDLE_COUNT) + { + return kStatus_OutOfRange; + } + + /* Set spi base to handle. */ + handle->txHandle = txHandle; + handle->rxHandle = rxHandle; + + /* Register callback and userData. */ + handle->callback = callback; + handle->userData = userData; + + /* Set SPI state to idle. */ + handle->txInProgress = false; + handle->rxInProgress = false; + + /* Install callback for Tx/Rx dma channel. */ + if (handle->txHandle != NULL) + { + EDMA_SetCallback(handle->txHandle, FLEXIO_SPI_TxEDMACallback, &s_edmaPrivateHandle[index]); + } + if (handle->rxHandle != NULL) + { + EDMA_SetCallback(handle->rxHandle, FLEXIO_SPI_RxEDMACallback, &s_edmaPrivateHandle[index]); + } + + return kStatus_Success; +} + +/*! + * brief Performs a non-blocking FlexIO SPI transfer using eDMA. + * + * note This interface returns immediately after transfer initiates. Call + * FLEXIO_SPI_MasterGetTransferCountEDMA to poll the transfer status and check + * whether the FlexIO SPI transfer is finished. + * + * param base Pointer to FLEXIO_SPI_Type structure. + * param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state. + * param xfer Pointer to FlexIO SPI transfer structure. + * retval kStatus_Success Successfully start a transfer. + * retval kStatus_InvalidArgument Input argument is invalid. + * retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer. + */ +status_t FLEXIO_SPI_MasterTransferEDMA(FLEXIO_SPI_Type *base, + flexio_spi_master_edma_handle_t *handle, + flexio_spi_transfer_t *xfer) +{ + assert(handle != NULL); + assert(xfer != NULL); + + uint32_t dataMode = 0; + uint16_t timerCmp = (uint16_t)base->flexioBase->TIMCMP[base->timerIndex[0]]; + uint8_t dataFormat = FLEXIO_SPI_XFER_DATA_FORMAT(xfer->flags); + + timerCmp &= 0x00FFU; + + /* Check if the device is busy. */ + if ((handle->txInProgress) || (handle->rxInProgress)) + { + return kStatus_FLEXIO_SPI_Busy; + } + + /* Check if input parameter invalid. */ + if (((xfer->txData == NULL) && (xfer->rxData == NULL)) || (xfer->dataSize == 0U)) + { + return kStatus_InvalidArgument; + } + + /* Timer1 controls the CS signal which enables/disables(asserts/deasserts) when timer0 enable/disable. Timer0 + enables when tx shifter is written and disables when timer compare. The timer compare event causes the + transmit shift registers to load which generates a tx register empty event. Since when timer stop bit is + disabled, a timer enable condition can be detected in the same cycle as a timer disable condition, so if + software writes the tx register upon the detection of tx register empty event, the timer enable condition + is triggered again, then the CS signal can remain low until software no longer writes the tx register. */ + if ((xfer->flags & (uint8_t)kFLEXIO_SPI_csContinuous) != 0U) + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TSTOP_MASK) | + FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitDisabled); + } + else + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TSTOP_MASK) | + FLEXIO_TIMCFG_TSTOP(kFLEXIO_TimerStopBitEnableOnTimerDisable); + } + + /* configure data mode. */ + if ((dataFormat == (uint8_t)kFLEXIO_SPI_8bitMsb) || (dataFormat == (uint8_t)kFLEXIO_SPI_8bitLsb)) + { + dataMode = (8UL * 2UL - 1UL) << 8U; + } + else if ((dataFormat == (uint8_t)kFLEXIO_SPI_16bitMsb) || (dataFormat == (uint8_t)kFLEXIO_SPI_16bitLsb)) + { + dataMode = (16UL * 2UL - 1UL) << 8U; + } + else if ((dataFormat == (uint8_t)kFLEXIO_SPI_32bitMsb) || (dataFormat == (uint8_t)kFLEXIO_SPI_32bitLsb)) + { + dataMode = (32UL * 2UL - 1UL) << 8U; + } + else + { + dataMode = (8UL * 2UL - 1UL) << 8U; + } + + dataMode |= timerCmp; + + base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; + + return FLEXIO_SPI_EDMAConfig(base, handle, xfer); +} + +/*! + * brief Gets the remaining bytes for FlexIO SPI eDMA transfer. + * + * param base Pointer to FLEXIO_SPI_Type structure. + * param handle FlexIO SPI eDMA handle pointer. + * param count Number of bytes transferred so far by the non-blocking transaction. + */ +status_t FLEXIO_SPI_MasterTransferGetCountEDMA(FLEXIO_SPI_Type *base, + flexio_spi_master_edma_handle_t *handle, + size_t *count) +{ + assert(handle != NULL); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + if (handle->rxInProgress) + { + *count = + (handle->transferSize - (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount( + handle->rxHandle->base, handle->rxHandle->channel)); + } + else + { + *count = + (handle->transferSize - (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount( + handle->txHandle->base, handle->txHandle->channel)); + } + + return kStatus_Success; +} + +/*! + * brief Aborts a FlexIO SPI transfer using eDMA. + * + * param base Pointer to FLEXIO_SPI_Type structure. + * param handle FlexIO SPI eDMA handle pointer. + */ +void FLEXIO_SPI_MasterTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_master_edma_handle_t *handle) +{ + assert(handle != NULL); + + /* Disable dma. */ + EDMA_AbortTransfer(handle->txHandle); + EDMA_AbortTransfer(handle->rxHandle); + + /* Disable DMA enable bit. */ + FLEXIO_SPI_EnableDMA(base, (uint32_t)kFLEXIO_SPI_DmaAllEnable, false); + + /* Set the handle state. */ + handle->txInProgress = false; + handle->rxInProgress = false; +} + +/*! + * brief Performs a non-blocking FlexIO SPI transfer using eDMA. + * + * note This interface returns immediately after transfer initiates. Call + * FLEXIO_SPI_SlaveGetTransferCountEDMA to poll the transfer status and + * check whether the FlexIO SPI transfer is finished. + * + * param base Pointer to FLEXIO_SPI_Type structure. + * param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state. + * param xfer Pointer to FlexIO SPI transfer structure. + * retval kStatus_Success Successfully start a transfer. + * retval kStatus_InvalidArgument Input argument is invalid. + * retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer. + */ +status_t FLEXIO_SPI_SlaveTransferEDMA(FLEXIO_SPI_Type *base, + flexio_spi_slave_edma_handle_t *handle, + flexio_spi_transfer_t *xfer) +{ + assert(handle != NULL); + assert(xfer != NULL); + + uint32_t dataMode = 0U; + uint8_t dataFormat = FLEXIO_SPI_XFER_DATA_FORMAT(xfer->flags); + + /* Check if the device is busy. */ + if ((handle->txInProgress) || (handle->rxInProgress)) + { + return kStatus_FLEXIO_SPI_Busy; + } + + /* SCK timer use CS pin as inverted trigger so timer should be disbaled on trigger falling edge(CS re-asserts). */ + /* However if CPHA is first edge mode, timer will restart each time right after timer compare event occur and + before CS pin re-asserts, which triggers another shifter load. To avoid this, when in CS dis-continuous mode, + timer should disable in timer compare rather than trigger falling edge(CS re-asserts), and in CS continuous mode, + tx/rx shifters should be flushed after transfer finishes and before next transfer starts. */ + FLEXIO_SPI_FlushShifters(base); + if ((xfer->flags & (uint8_t)kFLEXIO_SPI_csContinuous) != 0U) + { + base->flexioBase->TIMCFG[base->timerIndex[0]] |= FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTriggerFallingEdge); + } + else + { + if ((base->flexioBase->SHIFTCTL[base->shifterIndex[0]] & FLEXIO_SHIFTCTL_TIMPOL_MASK) == + FLEXIO_SHIFTCTL_TIMPOL(kFLEXIO_ShifterTimerPolarityOnNegitive)) + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TIMDIS_MASK) | + FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTimerCompare); + } + else + { + base->flexioBase->TIMCFG[base->timerIndex[0]] = + (base->flexioBase->TIMCFG[base->timerIndex[0]] & ~FLEXIO_TIMCFG_TIMDIS_MASK) | + FLEXIO_TIMCFG_TIMDIS(kFLEXIO_TimerDisableOnTriggerFallingEdge); + } + } + + /* Check if input parameter invalid. */ + if (((xfer->txData == NULL) && (xfer->rxData == NULL)) || (xfer->dataSize == 0U)) + { + return kStatus_InvalidArgument; + } + + /* configure data mode. */ + if ((dataFormat == (uint8_t)kFLEXIO_SPI_8bitMsb) || (dataFormat == (uint8_t)kFLEXIO_SPI_8bitLsb)) + { + dataMode = 8U * 2U - 1U; + } + else if ((dataFormat == (uint8_t)kFLEXIO_SPI_16bitMsb) || (dataFormat == (uint8_t)kFLEXIO_SPI_16bitLsb)) + { + dataMode = 16U * 2U - 1U; + } + else if ((dataFormat == (uint8_t)kFLEXIO_SPI_32bitMsb) || (dataFormat == (uint8_t)kFLEXIO_SPI_32bitLsb)) + { + dataMode = 32UL * 2UL - 1UL; + } + else + { + dataMode = 8U * 2U - 1U; + } + + base->flexioBase->TIMCMP[base->timerIndex[0]] = dataMode; + + return FLEXIO_SPI_EDMAConfig(base, handle, xfer); +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi_edma.h new file mode 100644 index 00000000000..7e98f199105 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_spi_edma.h @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020, 2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_FLEXIO_SPI_EDMA_H_ +#define FSL_FLEXIO_SPI_EDMA_H_ + +#include "fsl_flexio_spi.h" +#include "fsl_edma.h" + +/*! + * @addtogroup flexio_edma_spi + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FlexIO SPI EDMA driver version. */ +#define FSL_FLEXIO_SPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 3, 0)) +/*! @} */ + +/*! @brief typedef for flexio_spi_master_edma_handle_t in advance. */ +typedef struct _flexio_spi_master_edma_handle flexio_spi_master_edma_handle_t; + +/*! @brief Slave handle is the same with master handle. */ +typedef flexio_spi_master_edma_handle_t flexio_spi_slave_edma_handle_t; + +/*! @brief FlexIO SPI master callback for finished transmit */ +typedef void (*flexio_spi_master_edma_transfer_callback_t)(FLEXIO_SPI_Type *base, + flexio_spi_master_edma_handle_t *handle, + status_t status, + void *userData); + +/*! @brief FlexIO SPI slave callback for finished transmit */ +typedef void (*flexio_spi_slave_edma_transfer_callback_t)(FLEXIO_SPI_Type *base, + flexio_spi_slave_edma_handle_t *handle, + status_t status, + void *userData); + +/*! @brief FlexIO SPI eDMA transfer handle, users should not touch the content of the handle.*/ +struct _flexio_spi_master_edma_handle +{ + size_t transferSize; /*!< Total bytes to be transferred. */ + uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ + bool txInProgress; /*!< Send transfer in progress */ + bool rxInProgress; /*!< Receive transfer in progress */ + edma_handle_t *txHandle; /*!< DMA handler for SPI send */ + edma_handle_t *rxHandle; /*!< DMA handler for SPI receive */ + flexio_spi_master_edma_transfer_callback_t callback; /*!< Callback for SPI DMA transfer */ + void *userData; /*!< User Data for SPI DMA callback */ +}; + +/******************************************************************************* + * APIs + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name eDMA Transactional + * @{ + */ + +/*! + * @brief Initializes the FlexIO SPI master eDMA handle. + * + * This function initializes the FlexIO SPI master eDMA handle which can be used for other FlexIO SPI master + * transactional + * APIs. + * For a specified FlexIO SPI instance, call this API once to get the initialized handle. + * + * @param base Pointer to FLEXIO_SPI_Type structure. + * @param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state. + * @param callback SPI callback, NULL means no callback. + * @param userData callback function parameter. + * @param txHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer. + * @param rxHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range. + */ +status_t FLEXIO_SPI_MasterTransferCreateHandleEDMA(FLEXIO_SPI_Type *base, + flexio_spi_master_edma_handle_t *handle, + flexio_spi_master_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txHandle, + edma_handle_t *rxHandle); + +/*! + * @brief Performs a non-blocking FlexIO SPI transfer using eDMA. + * + * @note This interface returns immediately after transfer initiates. Call + * FLEXIO_SPI_MasterGetTransferCountEDMA to poll the transfer status and check + * whether the FlexIO SPI transfer is finished. + * + * @param base Pointer to FLEXIO_SPI_Type structure. + * @param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state. + * @param xfer Pointer to FlexIO SPI transfer structure. + * @retval kStatus_Success Successfully start a transfer. + * @retval kStatus_InvalidArgument Input argument is invalid. + * @retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer. + */ +status_t FLEXIO_SPI_MasterTransferEDMA(FLEXIO_SPI_Type *base, + flexio_spi_master_edma_handle_t *handle, + flexio_spi_transfer_t *xfer); + +/*! + * @brief Aborts a FlexIO SPI transfer using eDMA. + * + * @param base Pointer to FLEXIO_SPI_Type structure. + * @param handle FlexIO SPI eDMA handle pointer. + */ +void FLEXIO_SPI_MasterTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_master_edma_handle_t *handle); + +/*! + * @brief Gets the number of bytes transferred so far using FlexIO SPI master eDMA. + * + * @param base Pointer to FLEXIO_SPI_Type structure. + * @param handle FlexIO SPI eDMA handle pointer. + * @param count Number of bytes transferred so far by the non-blocking transaction. + */ +status_t FLEXIO_SPI_MasterTransferGetCountEDMA(FLEXIO_SPI_Type *base, + flexio_spi_master_edma_handle_t *handle, + size_t *count); + +/*! + * @brief Initializes the FlexIO SPI slave eDMA handle. + * + * This function initializes the FlexIO SPI slave eDMA handle. + * + * @param base Pointer to FLEXIO_SPI_Type structure. + * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state. + * @param callback SPI callback, NULL means no callback. + * @param userData callback function parameter. + * @param txHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer. + * @param rxHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer. + */ +static inline void FLEXIO_SPI_SlaveTransferCreateHandleEDMA(FLEXIO_SPI_Type *base, + flexio_spi_slave_edma_handle_t *handle, + flexio_spi_slave_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txHandle, + edma_handle_t *rxHandle) +{ + (void)FLEXIO_SPI_MasterTransferCreateHandleEDMA(base, handle, callback, userData, txHandle, rxHandle); +} + +/*! + * @brief Performs a non-blocking FlexIO SPI transfer using eDMA. + * + * @note This interface returns immediately after transfer initiates. Call + * FLEXIO_SPI_SlaveGetTransferCountEDMA to poll the transfer status and + * check whether the FlexIO SPI transfer is finished. + * + * @param base Pointer to FLEXIO_SPI_Type structure. + * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state. + * @param xfer Pointer to FlexIO SPI transfer structure. + * @retval kStatus_Success Successfully start a transfer. + * @retval kStatus_InvalidArgument Input argument is invalid. + * @retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer. + */ +status_t FLEXIO_SPI_SlaveTransferEDMA(FLEXIO_SPI_Type *base, + flexio_spi_slave_edma_handle_t *handle, + flexio_spi_transfer_t *xfer); + +/*! + * @brief Aborts a FlexIO SPI transfer using eDMA. + * + * @param base Pointer to FLEXIO_SPI_Type structure. + * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state. + */ +static inline void FLEXIO_SPI_SlaveTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_slave_edma_handle_t *handle) +{ + FLEXIO_SPI_MasterTransferAbortEDMA(base, handle); +} + +/*! + * @brief Gets the number of bytes transferred so far using FlexIO SPI slave eDMA. + * + * @param base Pointer to FLEXIO_SPI_Type structure. + * @param handle FlexIO SPI eDMA handle pointer. + * @param count Number of bytes transferred so far by the non-blocking transaction. + */ +static inline status_t FLEXIO_SPI_SlaveTransferGetCountEDMA(FLEXIO_SPI_Type *base, + flexio_spi_slave_edma_handle_t *handle, + size_t *count) +{ + return FLEXIO_SPI_MasterTransferGetCountEDMA(base, handle, count); +} + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart.c new file mode 100644 index 00000000000..13890caee7d --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart.c @@ -0,0 +1,1023 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexio_uart.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexio_uart" +#endif + +/*flexioBase); +} + +static size_t FLEXIO_UART_TransferGetRxRingBufferLength(flexio_uart_handle_t *handle) +{ + size_t size; + uint16_t rxRingBufferHead = handle->rxRingBufferHead; + uint16_t rxRingBufferTail = handle->rxRingBufferTail; + + if (rxRingBufferTail > rxRingBufferHead) + { + size = (size_t)rxRingBufferHead + handle->rxRingBufferSize - (size_t)rxRingBufferTail; + } + else + { + size = (size_t)rxRingBufferHead - (size_t)rxRingBufferTail; + } + + return size; +} + +static bool FLEXIO_UART_TransferIsRxRingBufferFull(flexio_uart_handle_t *handle) +{ + bool full; + + if (FLEXIO_UART_TransferGetRxRingBufferLength(handle) == (handle->rxRingBufferSize - 1U)) + { + full = true; + } + else + { + full = false; + } + + return full; +} + +/*! + * brief Ungates the FlexIO clock, resets the FlexIO module, configures FlexIO UART + * hardware, and configures the FlexIO UART with FlexIO UART configuration. + * The configuration structure can be filled by the user or be set with + * default values by FLEXIO_UART_GetDefaultConfig(). + * + * Example + code + FLEXIO_UART_Type base = { + .flexioBase = FLEXIO, + .TxPinIndex = 0, + .RxPinIndex = 1, + .shifterIndex = {0,1}, + .timerIndex = {0,1} + }; + flexio_uart_config_t config = { + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false, + .baudRate_Bps = 115200U, + .bitCountPerChar = 8 + }; + FLEXIO_UART_Init(base, &config, srcClock_Hz); + endcode + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param userConfig Pointer to the flexio_uart_config_t structure. + * param srcClock_Hz FlexIO source clock in Hz. + * retval kStatus_Success Configuration success. + * retval kStatus_FLEXIO_UART_BaudrateNotSupport Baudrate is not supported for current clock source frequency. +*/ +status_t FLEXIO_UART_Init(FLEXIO_UART_Type *base, const flexio_uart_config_t *userConfig, uint32_t srcClock_Hz) +{ + assert((base != NULL) && (userConfig != NULL)); + + flexio_shifter_config_t shifterConfig; + flexio_timer_config_t timerConfig; + uint32_t ctrlReg = 0; + uint16_t timerDiv = 0; + uint16_t timerCmp = 0; + uint32_t calculatedBaud; + uint32_t diff; + status_t result = kStatus_Success; + + /* Clear the shifterConfig & timerConfig struct. */ + (void)memset(&shifterConfig, 0, sizeof(shifterConfig)); + (void)memset(&timerConfig, 0, sizeof(timerConfig)); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate flexio clock. */ + CLOCK_EnableClock(s_flexioClocks[FLEXIO_UART_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + /* Configure FLEXIO UART */ + ctrlReg = base->flexioBase->CTRL; + ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK); + ctrlReg |= (FLEXIO_CTRL_DBGE(userConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(userConfig->enableFastAccess) | + FLEXIO_CTRL_FLEXEN(userConfig->enableUart)); + if (!userConfig->enableInDoze) + { + ctrlReg |= FLEXIO_CTRL_DOZEN_MASK; + } + + base->flexioBase->CTRL = ctrlReg; + + /* Do hardware configuration. */ + /* 1. Configure the shifter 0 for tx. */ + shifterConfig.timerSelect = base->timerIndex[0]; + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive; + shifterConfig.pinConfig = kFLEXIO_PinConfigOutput; + shifterConfig.pinSelect = base->TxPinIndex; + shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; + shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit; + shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitHigh; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitLow; + + FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig); + + /*2. Configure the timer 0 for tx. */ + timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]); + timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow; + timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal; + timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + timerConfig.pinSelect = base->TxPinIndex; + timerConfig.pinPolarity = kFLEXIO_PinActiveHigh; + timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit; + timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset; + timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; + timerConfig.timerReset = kFLEXIO_TimerResetNever; + timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; + timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh; + timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable; + timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; + + timerDiv = (uint16_t)(srcClock_Hz / userConfig->baudRate_Bps); + timerDiv = timerDiv / 2U - 1U; + + if (timerDiv > 0xFFU) + { + /* Check whether the calculated timerDiv is within allowed range. */ + return kStatus_FLEXIO_UART_BaudrateNotSupport; + } + else + { + /* Check to see if actual baud rate is within 3% of desired baud rate + * based on the best calculated timerDiv value */ + calculatedBaud = srcClock_Hz / (((uint32_t)timerDiv + 1U) * 2U); + /* timerDiv cannot be larger than the ideal divider, so calculatedBaud is definitely larger + than configured baud */ + diff = calculatedBaud - userConfig->baudRate_Bps; + if (diff > ((userConfig->baudRate_Bps / 100U) * 3U)) + { + return kStatus_FLEXIO_UART_BaudrateNotSupport; + } + } + + timerCmp = ((uint16_t)userConfig->bitCountPerChar * 2U - 1U) << 8U; + timerCmp |= timerDiv; + + timerConfig.timerCompare = timerCmp; + + FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig); + + /* 3. Configure the shifter 1 for rx. */ + shifterConfig.timerSelect = base->timerIndex[1]; + shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive; + shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + shifterConfig.pinSelect = base->RxPinIndex; + shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh; + shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive; + shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin; + shifterConfig.shifterStop = kFLEXIO_ShifterStopBitHigh; + shifterConfig.shifterStart = kFLEXIO_ShifterStartBitLow; + + FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig); + + /* 4. Configure the timer 1 for rx. */ + timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->RxPinIndex); + timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh; + timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceExternal; + timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled; + timerConfig.pinSelect = base->RxPinIndex; + timerConfig.pinPolarity = kFLEXIO_PinActiveLow; + timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit; + timerConfig.timerOutput = kFLEXIO_TimerOutputOneAffectedByReset; + timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput; + timerConfig.timerReset = kFLEXIO_TimerResetOnTimerPinRisingEdge; + timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare; + timerConfig.timerEnable = kFLEXIO_TimerEnableOnPinRisingEdge; + timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable; + timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled; + + timerConfig.timerCompare = timerCmp; + + FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[1], &timerConfig); + + return result; +} + +/*! + * brief Resets the FlexIO UART shifter and timer config. + * + * note After calling this API, call the FLEXO_UART_Init to use the FlexIO UART module. + * + * param base Pointer to FLEXIO_UART_Type structure + */ +void FLEXIO_UART_Deinit(FLEXIO_UART_Type *base) +{ + base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = 0; + base->flexioBase->SHIFTCTL[base->shifterIndex[0]] = 0; + base->flexioBase->SHIFTCFG[base->shifterIndex[1]] = 0; + base->flexioBase->SHIFTCTL[base->shifterIndex[1]] = 0; + base->flexioBase->TIMCFG[base->timerIndex[0]] = 0; + base->flexioBase->TIMCMP[base->timerIndex[0]] = 0; + base->flexioBase->TIMCTL[base->timerIndex[0]] = 0; + base->flexioBase->TIMCFG[base->timerIndex[1]] = 0; + base->flexioBase->TIMCMP[base->timerIndex[1]] = 0; + base->flexioBase->TIMCTL[base->timerIndex[1]] = 0; + /* Clear the shifter flag. */ + base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[0]); + base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[1]); + /* Clear the timer flag. */ + base->flexioBase->TIMSTAT = (1UL << base->timerIndex[0]); + base->flexioBase->TIMSTAT = (1UL << base->timerIndex[1]); +} + +/*! + * brief Gets the default configuration to configure the FlexIO UART. The configuration + * can be used directly for calling the FLEXIO_UART_Init(). + * Example: + code + flexio_uart_config_t config; + FLEXIO_UART_GetDefaultConfig(&userConfig); + endcode + * param userConfig Pointer to the flexio_uart_config_t structure. +*/ +void FLEXIO_UART_GetDefaultConfig(flexio_uart_config_t *userConfig) +{ + assert(userConfig != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(userConfig, 0, sizeof(*userConfig)); + + userConfig->enableUart = true; + userConfig->enableInDoze = false; + userConfig->enableInDebug = true; + userConfig->enableFastAccess = false; + /* Default baud rate 115200. */ + userConfig->baudRate_Bps = 115200U; + /* Default bit count at 8. */ + userConfig->bitCountPerChar = kFLEXIO_UART_8BitsPerChar; +} + +/*! + * brief Enables the FlexIO UART interrupt. + * + * This function enables the FlexIO UART interrupt. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param mask Interrupt source. + */ +void FLEXIO_UART_EnableInterrupts(FLEXIO_UART_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable) != 0U) + { + FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); + } + if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable) != 0U) + { + FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Disables the FlexIO UART interrupt. + * + * This function disables the FlexIO UART interrupt. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param mask Interrupt source. + */ +void FLEXIO_UART_DisableInterrupts(FLEXIO_UART_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable) != 0U) + { + FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]); + } + if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable) != 0U) + { + FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Gets the FlexIO UART status flags. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * return FlexIO UART status flags. + */ + +uint32_t FLEXIO_UART_GetStatusFlags(FLEXIO_UART_Type *base) +{ + uint32_t status = 0U; + status = + ((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0])) >> base->shifterIndex[0]); + status |= + (((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) + << 1U); + status |= + (((FLEXIO_GetShifterErrorFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1])) + << 2U); + return status; +} + +/*! + * brief Gets the FlexIO UART status flags. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param mask Status flag. + * The parameter can be any combination of the following values: + * arg kFLEXIO_UART_TxDataRegEmptyFlag + * arg kFLEXIO_UART_RxEmptyFlag + * arg kFLEXIO_UART_RxOverRunFlag + */ + +void FLEXIO_UART_ClearStatusFlags(FLEXIO_UART_Type *base, uint32_t mask) +{ + if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyFlag) != 0U) + { + FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[0]); + } + if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag) != 0U) + { + FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[1]); + } + if ((mask & (uint32_t)kFLEXIO_UART_RxOverRunFlag) != 0U) + { + FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]); + } +} + +/*! + * brief Sends a buffer of data bytes. + * + * note This function blocks using the polling method until all bytes have been sent. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param txData The data bytes to send. + * param txSize The number of data bytes to send. + * retval kStatus_FLEXIO_UART_Timeout Transmission timed out and was aborted. + * retval kStatus_Success Successfully wrote all data. + */ +status_t FLEXIO_UART_WriteBlocking(FLEXIO_UART_Type *base, const uint8_t *txData, size_t txSize) +{ + assert(txData != NULL); + assert(txSize != 0U); +#if UART_RETRY_TIMES + uint32_t waitTimes; +#endif + + while (0U != txSize--) + { + /* Wait until data transfer complete. */ +#if UART_RETRY_TIMES + waitTimes = UART_RETRY_TIMES; + while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) && + (0U != --waitTimes)) +#else + while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) +#endif + { + } +#if UART_RETRY_TIMES + if (0U == waitTimes) + { + return kStatus_FLEXIO_UART_Timeout; + } +#endif + + base->flexioBase->SHIFTBUF[base->shifterIndex[0]] = *txData++; + } + return kStatus_Success; +} + +/*! + * brief Receives a buffer of bytes. + * + * note This function blocks using the polling method until all bytes have been received. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param rxData The buffer to store the received bytes. + * param rxSize The number of data bytes to be received. + * retval kStatus_FLEXIO_UART_Timeout Transmission timed out and was aborted. + * retval kStatus_Success Successfully received all data. + */ +status_t FLEXIO_UART_ReadBlocking(FLEXIO_UART_Type *base, uint8_t *rxData, size_t rxSize) +{ + assert(rxData != NULL); + assert(rxSize != 0U); +#if UART_RETRY_TIMES + uint32_t waitTimes; +#endif + + while (0U != rxSize--) + { + /* Wait until data transfer complete. */ +#if UART_RETRY_TIMES + waitTimes = UART_RETRY_TIMES; + while ((0U == (FLEXIO_UART_GetStatusFlags(base) & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag)) && + (0U != --waitTimes)) +#else + while (0U == (FLEXIO_UART_GetStatusFlags(base) & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag)) +#endif + { + } +#if UART_RETRY_TIMES + if (0U == waitTimes) + { + return kStatus_FLEXIO_UART_Timeout; + } +#endif + + *rxData++ = (uint8_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]); + } + return kStatus_Success; +} + +/*! + * brief Initializes the UART handle. + * + * This function initializes the FlexIO UART handle, which can be used for other FlexIO + * UART transactional APIs. Call this API once to get the + * initialized handle. + * + * The UART driver supports the "background" receiving, which means that users can set up + * a RX ring buffer optionally. Data received is stored into the ring buffer even when + * the user doesn't call the FLEXIO_UART_TransferReceiveNonBlocking() API. If there is already data + * received in the ring buffer, users can get the received data from the ring buffer + * directly. The ring buffer is disabled if passing NULL as p ringBuffer. + * + * param base to FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * param callback The callback function. + * param userData The parameter of the callback function. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_UART_TransferCreateHandle(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + flexio_uart_transfer_callback_t callback, + void *userData) +{ + assert(handle != NULL); + + IRQn_Type flexio_irqs[] = FLEXIO_IRQS; + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Set the TX/RX state. */ + handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; + handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; + + /* Set the callback and user data. */ + handle->callback = callback; + handle->userData = userData; + + /* Clear pending NVIC IRQ before enable NVIC IRQ. */ + NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_UART_GetInstance(base)]); + /* Enable interrupt in NVIC. */ + (void)EnableIRQ(flexio_irqs[FLEXIO_UART_GetInstance(base)]); + + /* Save the context in global variables to support the double weak mechanism. */ + return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_UART_TransferHandleIRQ); +} + +/*! + * brief Sets up the RX ring buffer. + * + * This function sets up the RX ring buffer to a specific UART handle. + * + * When the RX ring buffer is used, data received is stored into the ring buffer even when + * the user doesn't call the UART_ReceiveNonBlocking() API. If there is already data received + * in the ring buffer, users can get the received data from the ring buffer directly. + * + * note When using the RX ring buffer, one byte is reserved for internal use. In other + * words, if p ringBufferSize is 32, only 31 bytes are used for saving data. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. + * param ringBufferSize Size of the ring buffer. + */ +void FLEXIO_UART_TransferStartRingBuffer(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + uint8_t *ringBuffer, + size_t ringBufferSize) +{ + assert(handle != NULL); + + /* Setup the ringbuffer address */ + if (ringBuffer != NULL) + { + handle->rxRingBuffer = ringBuffer; + handle->rxRingBufferSize = ringBufferSize; + handle->rxRingBufferHead = 0U; + handle->rxRingBufferTail = 0U; + + /* Enable the interrupt to accept the data when user need the ring buffer. */ + FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); + } +} + +/*! + * brief Aborts the background transfer and uninstalls the ring buffer. + * + * This function aborts the background transfer and uninstalls the ring buffer. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + */ +void FLEXIO_UART_TransferStopRingBuffer(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle) +{ + assert(handle != NULL); + + if (handle->rxState == (uint8_t)kFLEXIO_UART_RxIdle) + { + FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); + } + + handle->rxRingBuffer = NULL; + handle->rxRingBufferSize = 0U; + handle->rxRingBufferHead = 0U; + handle->rxRingBufferTail = 0U; +} + +/*! + * brief Transmits a buffer of data using the interrupt method. + * + * This function sends data using an interrupt method. This is a non-blocking function, + * which returns directly without waiting for all data to be written to the TX register. When + * all data is written to the TX register in ISR, the FlexIO UART driver calls the callback + * function and passes the ref kStatus_FLEXIO_UART_TxIdle as status parameter. + * + * note The kStatus_FLEXIO_UART_TxIdle is passed to the upper layer when all data is written + * to the TX register. However, it does not ensure that all data is sent out. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * param xfer FlexIO UART transfer structure. See #flexio_uart_transfer_t. + * retval kStatus_Success Successfully starts the data transmission. + * retval kStatus_UART_TxBusy Previous transmission still not finished, data not written to the TX register. + */ +status_t FLEXIO_UART_TransferSendNonBlocking(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + flexio_uart_transfer_t *xfer) +{ + status_t status; + + /* Return error if xfer invalid. */ + if ((0U == xfer->dataSize) || (NULL == xfer->txData)) + { + return kStatus_InvalidArgument; + } + + /* Return error if current TX busy. */ + if ((uint8_t)kFLEXIO_UART_TxBusy == handle->txState) + { + status = kStatus_FLEXIO_UART_TxBusy; + } + else + { + handle->txData = xfer->txData; + handle->txDataSize = xfer->dataSize; + handle->txDataSizeAll = xfer->dataSize; + handle->txState = (uint8_t)kFLEXIO_UART_TxBusy; + + /* Enable transmiter interrupt. */ + FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable); + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Aborts the interrupt-driven data transmit. + * + * This function aborts the interrupt-driven data sending. Get the remainBytes to find out + * how many bytes are still not sent out. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + */ +void FLEXIO_UART_TransferAbortSend(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle) +{ + /* Disable the transmitter and disable the interrupt. */ + FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable); + + handle->txDataSize = 0U; + handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; +} + +/*! + * brief Gets the number of bytes sent. + * + * This function gets the number of bytes sent driven by interrupt. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * param count Number of bytes sent so far by the non-blocking transaction. + * retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. + * retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_UART_TransferGetSendCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + assert(count != NULL); + + if ((uint8_t)kFLEXIO_UART_TxIdle == handle->txState) + { + return kStatus_NoTransferInProgress; + } + + *count = handle->txDataSizeAll - handle->txDataSize; + + return kStatus_Success; +} + +/*! + * brief Receives a buffer of data using the interrupt method. + * + * This function receives data using the interrupt method. This is a non-blocking function, + * which returns without waiting for all data to be received. + * If the RX ring buffer is used and not empty, the data in ring buffer is copied and + * the parameter p receivedBytes shows how many bytes are copied from the ring buffer. + * After copying, if the data in ring buffer is not enough to read, the receive + * request is saved by the UART driver. When new data arrives, the receive request + * is serviced first. When all data is received, the UART driver notifies the upper layer + * through a callback function and passes the status parameter ref kStatus_UART_RxIdle. + * For example, if the upper layer needs 10 bytes but there are only 5 bytes in the ring buffer, + * the 5 bytes are copied to xfer->data. This function returns with the + * parameter p receivedBytes set to 5. For the last 5 bytes, newly arrived data is + * saved from the xfer->data[5]. When 5 bytes are received, the UART driver notifies upper layer. + * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt + * to receive data to xfer->data. When all data is received, the upper layer is notified. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * param xfer UART transfer structure. See #flexio_uart_transfer_t. + * param receivedBytes Bytes received from the ring buffer directly. + * retval kStatus_Success Successfully queue the transfer into the transmit queue. + * retval kStatus_FLEXIO_UART_RxBusy Previous receive request is not finished. + */ +status_t FLEXIO_UART_TransferReceiveNonBlocking(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + flexio_uart_transfer_t *xfer, + size_t *receivedBytes) +{ + uint32_t i; + status_t status; + /* How many bytes to copy from ring buffer to user memory. */ + size_t bytesToCopy = 0U; + /* How many bytes to receive. */ + size_t bytesToReceive; + /* How many bytes currently have received. */ + size_t bytesCurrentReceived; + + /* Return error if xfer invalid. */ + if ((0U == xfer->dataSize) || (NULL == xfer->rxData)) + { + return kStatus_InvalidArgument; + } + + /* How to get data: + 1. If RX ring buffer is not enabled, then save xfer->data and xfer->dataSize + to uart handle, enable interrupt to store received data to xfer->data. When + all data received, trigger callback. + 2. If RX ring buffer is enabled and not empty, get data from ring buffer first. + If there are enough data in ring buffer, copy them to xfer->data and return. + If there are not enough data in ring buffer, copy all of them to xfer->data, + save the xfer->data remained empty space to uart handle, receive data + to this empty space and trigger callback when finished. */ + + if ((uint8_t)kFLEXIO_UART_RxBusy == handle->rxState) + { + status = kStatus_FLEXIO_UART_RxBusy; + } + else + { + bytesToReceive = xfer->dataSize; + bytesCurrentReceived = 0U; + + /* If RX ring buffer is used. */ + if (handle->rxRingBuffer != NULL) + { + /* Disable FLEXIO_UART RX IRQ, protect ring buffer. */ + FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); + + /* How many bytes in RX ring buffer currently. */ + bytesToCopy = FLEXIO_UART_TransferGetRxRingBufferLength(handle); + + if (bytesToCopy != 0U) + { + bytesToCopy = MIN(bytesToReceive, bytesToCopy); + + bytesToReceive -= bytesToCopy; + + /* Copy data from ring buffer to user memory. */ + for (i = 0U; i < bytesToCopy; i++) + { + xfer->rxData[bytesCurrentReceived++] = handle->rxRingBuffer[handle->rxRingBufferTail]; + + /* Wrap to 0. Not use modulo (%) because it might be large and slow. */ + if ((uint32_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize) + { + handle->rxRingBufferTail = 0U; + } + else + { + handle->rxRingBufferTail++; + } + } + } + + /* If ring buffer does not have enough data, still need to read more data. */ + if (bytesToReceive != 0U) + { + /* No data in ring buffer, save the request to UART handle. */ + handle->rxData = xfer->rxData + bytesCurrentReceived; + handle->rxDataSize = bytesToReceive; + handle->rxDataSizeAll = xfer->dataSize; + handle->rxState = (uint8_t)kFLEXIO_UART_RxBusy; + } + + /* Enable FLEXIO_UART RX IRQ if previously enabled. */ + FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); + + /* Call user callback since all data are received. */ + if (0U == bytesToReceive) + { + if (handle->callback != NULL) + { + handle->callback(base, handle, kStatus_FLEXIO_UART_RxIdle, handle->userData); + } + } + } + /* Ring buffer not used. */ + else + { + handle->rxData = xfer->rxData + bytesCurrentReceived; + handle->rxDataSize = bytesToReceive; + handle->rxDataSizeAll = bytesToReceive; + handle->rxState = (uint8_t)kFLEXIO_UART_RxBusy; + + /* Enable RX interrupt. */ + FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); + } + + /* Return the how many bytes have read. */ + if (receivedBytes != NULL) + { + *receivedBytes = bytesCurrentReceived; + } + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Aborts the receive data which was using IRQ. + * + * This function aborts the receive data which was using IRQ. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + */ +void FLEXIO_UART_TransferAbortReceive(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle) +{ + /* Only abort the receive to handle->rxData, the RX ring buffer is still working. */ + if (NULL == handle->rxRingBuffer) + { + /* Disable RX interrupt. */ + FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); + } + + handle->rxDataSize = 0U; + handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; +} + +/*! + * brief Gets the number of bytes received. + * + * This function gets the number of bytes received driven by interrupt. + * + * param base Pointer to the FLEXIO_UART_Type structure. + * param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * param count Number of bytes received so far by the non-blocking transaction. + * retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. + * retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_UART_TransferGetReceiveCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + assert(count != NULL); + + if ((uint8_t)kFLEXIO_UART_RxIdle == handle->rxState) + { + return kStatus_NoTransferInProgress; + } + + *count = handle->rxDataSizeAll - handle->rxDataSize; + + return kStatus_Success; +} + +/*! + * brief FlexIO UART IRQ handler function. + * + * This function processes the FlexIO UART transmit and receives the IRQ request. + * + * param uartType Pointer to the FLEXIO_UART_Type structure. + * param uartHandle Pointer to the flexio_uart_handle_t structure to store the transfer state. + */ +void FLEXIO_UART_TransferHandleIRQ(void *uartType, void *uartHandle) +{ + uint8_t count = 1; + FLEXIO_UART_Type *base = (FLEXIO_UART_Type *)uartType; + flexio_uart_handle_t *handle = (flexio_uart_handle_t *)uartHandle; + uint16_t rxRingBufferHead; + + /* Read the status back. */ + uint32_t status = FLEXIO_UART_GetStatusFlags(base); + + /* If RX overrun. */ + if (((uint32_t)kFLEXIO_UART_RxOverRunFlag & status) != 0U) + { + /* Clear Overrun flag. */ + FLEXIO_UART_ClearStatusFlags(base, (uint32_t)kFLEXIO_UART_RxOverRunFlag); + + /* Trigger callback. */ + if (handle->callback != NULL) + { + handle->callback(base, handle, kStatus_FLEXIO_UART_RxHardwareOverrun, handle->userData); + } + } + + /* Receive data register full */ + if ((((uint32_t)kFLEXIO_UART_RxDataRegFullFlag & status) != 0U) && + ((base->flexioBase->SHIFTSIEN & (1UL << base->shifterIndex[1])) != 0U)) + { + /* If handle->rxDataSize is not 0, first save data to handle->rxData. */ + if (handle->rxDataSize != 0U) + { + /* Using non block API to read the data from the registers. */ + FLEXIO_UART_ReadByte(base, handle->rxData); + handle->rxDataSize--; + handle->rxData++; + count--; + + /* If all the data required for upper layer is ready, trigger callback. */ + if (0U == handle->rxDataSize) + { + handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; + + if (handle->callback != NULL) + { + handle->callback(base, handle, kStatus_FLEXIO_UART_RxIdle, handle->userData); + } + } + } + + if (handle->rxRingBuffer != NULL) + { + if (count != 0U) + { + /* If RX ring buffer is full, trigger callback to notify over run. */ + if (FLEXIO_UART_TransferIsRxRingBufferFull(handle)) + { + if (handle->callback != NULL) + { + handle->callback(base, handle, kStatus_FLEXIO_UART_RxRingBufferOverrun, handle->userData); + } + } + + /* If ring buffer is still full after callback function, the oldest data is overridden. */ + if (FLEXIO_UART_TransferIsRxRingBufferFull(handle)) + { + /* Increase handle->rxRingBufferTail to make room for new data. */ + if ((uint32_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize) + { + handle->rxRingBufferTail = 0U; + } + else + { + handle->rxRingBufferTail++; + } + } + + /* Read data. */ + rxRingBufferHead = handle->rxRingBufferHead; + handle->rxRingBuffer[rxRingBufferHead] = + (uint8_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]); + + /* Increase handle->rxRingBufferHead. */ + if ((uint32_t)handle->rxRingBufferHead + 1U == handle->rxRingBufferSize) + { + handle->rxRingBufferHead = 0U; + } + else + { + handle->rxRingBufferHead++; + } + } + } + /* If no receive requst pending, stop RX interrupt. */ + else if (0U == handle->rxDataSize) + { + FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable); + } + else + { + } + } + + /* Send data register empty and the interrupt is enabled. */ + if ((((uint32_t)kFLEXIO_UART_TxDataRegEmptyFlag & status) != 0U) && + ((base->flexioBase->SHIFTSIEN & (1UL << base->shifterIndex[0])) != 0U)) + { + if (handle->txDataSize != 0U) + { + /* Using non block API to write the data to the registers. */ + FLEXIO_UART_WriteByte(base, handle->txData); + handle->txData++; + handle->txDataSize--; + + /* If all the data are written to data register, TX finished. */ + if (0U == handle->txDataSize) + { + handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; + + /* Disable TX register empty interrupt. */ + FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable); + + /* Trigger callback. */ + if (handle->callback != NULL) + { + handle->callback(base, handle, kStatus_FLEXIO_UART_TxIdle, handle->userData); + } + } + } + } +} + +/*! + * brief Flush tx/rx shifters. + * + * param base Pointer to the FLEXIO_UART_Type structure. + */ +void FLEXIO_UART_FlushShifters(FLEXIO_UART_Type *base) +{ + /* Disable then re-enable to flush the tx shifter. */ + base->flexioBase->SHIFTCTL[base->shifterIndex[0]] &= ~FLEXIO_SHIFTCTL_SMOD_MASK; + base->flexioBase->SHIFTCTL[base->shifterIndex[0]] |= FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit); + /* Read to flush the rx shifter. */ + (void)base->flexioBase->SHIFTBUF[base->shifterIndex[1]]; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart.h new file mode 100644 index 00000000000..d6f36bf3235 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart.h @@ -0,0 +1,588 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_FLEXIO_UART_H_ +#define FSL_FLEXIO_UART_H_ + +#include "fsl_common.h" +#include "fsl_flexio.h" + +/*! + * @addtogroup flexio_uart + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FlexIO UART driver version. */ +#define FSL_FLEXIO_UART_DRIVER_VERSION (MAKE_VERSION(2, 5, 0)) +/*! @} */ + +/*! @brief Retry times for waiting flag. */ +#ifndef UART_RETRY_TIMES +#define UART_RETRY_TIMES 0U /* Defining to zero means to keep waiting for the flag until it is assert/deassert. */ +#endif + +/*! @brief Error codes for the UART driver. */ +enum +{ + kStatus_FLEXIO_UART_TxBusy = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 0), /*!< Transmitter is busy. */ + kStatus_FLEXIO_UART_RxBusy = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 1), /*!< Receiver is busy. */ + kStatus_FLEXIO_UART_TxIdle = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 2), /*!< UART transmitter is idle. */ + kStatus_FLEXIO_UART_RxIdle = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 3), /*!< UART receiver is idle. */ + kStatus_FLEXIO_UART_ERROR = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 4), /*!< ERROR happens on UART. */ + kStatus_FLEXIO_UART_RxRingBufferOverrun = + MAKE_STATUS(kStatusGroup_FLEXIO_UART, 5), /*!< UART RX software ring buffer overrun. */ + kStatus_FLEXIO_UART_RxHardwareOverrun = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 6), /*!< UART RX receiver overrun. */ + kStatus_FLEXIO_UART_Timeout = MAKE_STATUS(kStatusGroup_FLEXIO_UART, 7), /*!< UART times out. */ + kStatus_FLEXIO_UART_BaudrateNotSupport = + MAKE_STATUS(kStatusGroup_FLEXIO_UART, 8) /*!< Baudrate is not supported in current clock source */ +}; + +/*! @brief FlexIO UART bit count per char. */ +typedef enum _flexio_uart_bit_count_per_char +{ + kFLEXIO_UART_7BitsPerChar = 7U, /*!< 7-bit data characters */ + kFLEXIO_UART_8BitsPerChar = 8U, /*!< 8-bit data characters */ + kFLEXIO_UART_9BitsPerChar = 9U, /*!< 9-bit data characters */ +} flexio_uart_bit_count_per_char_t; + +/*! @brief Define FlexIO UART interrupt mask. */ +enum _flexio_uart_interrupt_enable +{ + kFLEXIO_UART_TxDataRegEmptyInterruptEnable = 0x1U, /*!< Transmit buffer empty interrupt enable. */ + kFLEXIO_UART_RxDataRegFullInterruptEnable = 0x2U, /*!< Receive buffer full interrupt enable. */ +}; + +/*! @brief Define FlexIO UART status mask. */ +enum _flexio_uart_status_flags +{ + kFLEXIO_UART_TxDataRegEmptyFlag = 0x1U, /*!< Transmit buffer empty flag. */ + kFLEXIO_UART_RxDataRegFullFlag = 0x2U, /*!< Receive buffer full flag. */ + kFLEXIO_UART_RxOverRunFlag = 0x4U, /*!< Receive buffer over run flag. */ +}; + +/*! @brief Define FlexIO UART access structure typedef. */ +typedef struct _flexio_uart_type +{ + FLEXIO_Type *flexioBase; /*!< FlexIO base pointer. */ + uint8_t TxPinIndex; /*!< Pin select for UART_Tx. */ + uint8_t RxPinIndex; /*!< Pin select for UART_Rx. */ + uint8_t shifterIndex[2]; /*!< Shifter index used in FlexIO UART. */ + uint8_t timerIndex[2]; /*!< Timer index used in FlexIO UART. */ +} FLEXIO_UART_Type; + +/*! @brief Define FlexIO UART user configuration structure. */ +typedef struct _flexio_uart_config +{ + bool enableUart; /*!< Enable/disable FlexIO UART TX & RX. */ + bool enableInDoze; /*!< Enable/disable FlexIO operation in doze mode*/ + bool enableInDebug; /*!< Enable/disable FlexIO operation in debug mode*/ + bool enableFastAccess; /*!< Enable/disable fast access to FlexIO registers, + fast access requires the FlexIO clock to be at least + twice the frequency of the bus clock. */ + uint32_t baudRate_Bps; /*!< Baud rate in Bps. */ + flexio_uart_bit_count_per_char_t bitCountPerChar; /*!< number of bits, 7/8/9 -bit */ +} flexio_uart_config_t; + +/*! @brief Define FlexIO UART transfer structure. */ +typedef struct _flexio_uart_transfer +{ + /* + * Use separate TX and RX data pointer, because TX data is const data. + * The member data is kept for backward compatibility. + */ + union + { + uint8_t *data; /*!< The buffer of data to be transfer.*/ + uint8_t *rxData; /*!< The buffer to receive data. */ + const uint8_t *txData; /*!< The buffer of data to be sent. */ + }; + size_t dataSize; /*!< Transfer size*/ +} flexio_uart_transfer_t; + +/* Forward declaration of the handle typedef. */ +typedef struct _flexio_uart_handle flexio_uart_handle_t; + +/*! @brief FlexIO UART transfer callback function. */ +typedef void (*flexio_uart_transfer_callback_t)(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + status_t status, + void *userData); + +/*! @brief Define FLEXIO UART handle structure*/ +struct _flexio_uart_handle +{ + const uint8_t *volatile txData; /*!< Address of remaining data to send. */ + volatile size_t txDataSize; /*!< Size of the remaining data to send. */ + uint8_t *volatile rxData; /*!< Address of remaining data to receive. */ + volatile size_t rxDataSize; /*!< Size of the remaining data to receive. */ + size_t txDataSizeAll; /*!< Total bytes to be sent. */ + size_t rxDataSizeAll; /*!< Total bytes to be received. */ + + uint8_t *rxRingBuffer; /*!< Start address of the receiver ring buffer. */ + size_t rxRingBufferSize; /*!< Size of the ring buffer. */ + volatile uint16_t rxRingBufferHead; /*!< Index for the driver to store received data into ring buffer. */ + volatile uint16_t rxRingBufferTail; /*!< Index for the user to get data from the ring buffer. */ + + flexio_uart_transfer_callback_t callback; /*!< Callback function. */ + void *userData; /*!< UART callback function parameter.*/ + + volatile uint8_t txState; /*!< TX transfer state. */ + volatile uint8_t rxState; /*!< RX transfer state */ +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /*_cplusplus*/ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Ungates the FlexIO clock, resets the FlexIO module, configures FlexIO UART + * hardware, and configures the FlexIO UART with FlexIO UART configuration. + * The configuration structure can be filled by the user or be set with + * default values by FLEXIO_UART_GetDefaultConfig(). + * + * Example + @code + FLEXIO_UART_Type base = { + .flexioBase = FLEXIO, + .TxPinIndex = 0, + .RxPinIndex = 1, + .shifterIndex = {0,1}, + .timerIndex = {0,1} + }; + flexio_uart_config_t config = { + .enableInDoze = false, + .enableInDebug = true, + .enableFastAccess = false, + .baudRate_Bps = 115200U, + .bitCountPerChar = 8 + }; + FLEXIO_UART_Init(base, &config, srcClock_Hz); + @endcode + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param userConfig Pointer to the flexio_uart_config_t structure. + * @param srcClock_Hz FlexIO source clock in Hz. + * @retval kStatus_Success Configuration success. + * @retval kStatus_FLEXIO_UART_BaudrateNotSupport Baudrate is not supported for current clock source frequency. +*/ +status_t FLEXIO_UART_Init(FLEXIO_UART_Type *base, const flexio_uart_config_t *userConfig, uint32_t srcClock_Hz); + +/*! + * @brief Resets the FlexIO UART shifter and timer config. + * + * @note After calling this API, call the FLEXO_UART_Init to use the FlexIO UART module. + * + * @param base Pointer to FLEXIO_UART_Type structure + */ +void FLEXIO_UART_Deinit(FLEXIO_UART_Type *base); + +/*! + * @brief Gets the default configuration to configure the FlexIO UART. The configuration + * can be used directly for calling the FLEXIO_UART_Init(). + * Example: + @code + flexio_uart_config_t config; + FLEXIO_UART_GetDefaultConfig(&userConfig); + @endcode + * @param userConfig Pointer to the flexio_uart_config_t structure. +*/ +void FLEXIO_UART_GetDefaultConfig(flexio_uart_config_t *userConfig); + +/*! @} */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets the FlexIO UART status flags. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @return FlexIO UART status flags. + */ + +uint32_t FLEXIO_UART_GetStatusFlags(FLEXIO_UART_Type *base); + +/*! + * @brief Gets the FlexIO UART status flags. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param mask Status flag. + * The parameter can be any combination of the following values: + * @arg kFLEXIO_UART_TxDataRegEmptyFlag + * @arg kFLEXIO_UART_RxEmptyFlag + * @arg kFLEXIO_UART_RxOverRunFlag + */ + +void FLEXIO_UART_ClearStatusFlags(FLEXIO_UART_Type *base, uint32_t mask); + +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables the FlexIO UART interrupt. + * + * This function enables the FlexIO UART interrupt. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param mask Interrupt source. + */ +void FLEXIO_UART_EnableInterrupts(FLEXIO_UART_Type *base, uint32_t mask); + +/*! + * @brief Disables the FlexIO UART interrupt. + * + * This function disables the FlexIO UART interrupt. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param mask Interrupt source. + */ +void FLEXIO_UART_DisableInterrupts(FLEXIO_UART_Type *base, uint32_t mask); + +/*! @} */ + +/*! + * @name DMA Control + * @{ + */ + +/*! + * @brief Gets the FlexIO UARt transmit data register address. + * + * This function returns the UART data register address, which is mainly used by DMA/eDMA. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @return FlexIO UART transmit data register address. + */ +static inline uint32_t FLEXIO_UART_GetTxDataRegisterAddress(FLEXIO_UART_Type *base) +{ + return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBuffer, base->shifterIndex[0]); +} + +/*! + * @brief Gets the FlexIO UART receive data register address. + * + * This function returns the UART data register address, which is mainly used by DMA/eDMA. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @return FlexIO UART receive data register address. + */ +static inline uint32_t FLEXIO_UART_GetRxDataRegisterAddress(FLEXIO_UART_Type *base) +{ + return FLEXIO_GetShifterBufferAddress(base->flexioBase, kFLEXIO_ShifterBufferByteSwapped, base->shifterIndex[1]); +} + +/*! + * @brief Enables/disables the FlexIO UART transmit DMA. + * This function enables/disables the FlexIO UART Tx DMA, + * which means asserting the kFLEXIO_UART_TxDataRegEmptyFlag does/doesn't trigger the DMA request. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param enable True to enable, false to disable. + */ +static inline void FLEXIO_UART_EnableTxDMA(FLEXIO_UART_Type *base, bool enable) +{ + FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterIndex[0], enable); +} + +/*! + * @brief Enables/disables the FlexIO UART receive DMA. + * This function enables/disables the FlexIO UART Rx DMA, + * which means asserting kFLEXIO_UART_RxDataRegFullFlag does/doesn't trigger the DMA request. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param enable True to enable, false to disable. + */ +static inline void FLEXIO_UART_EnableRxDMA(FLEXIO_UART_Type *base, bool enable) +{ + FLEXIO_EnableShifterStatusDMA(base->flexioBase, 1UL << base->shifterIndex[1], enable); +} + +/*! @} */ + +/*! + * @name Bus Operations + * @{ + */ + +/*! + * @brief Enables/disables the FlexIO UART module operation. + * + * @param base Pointer to the FLEXIO_UART_Type. + * @param enable True to enable, false does not have any effect. + */ +static inline void FLEXIO_UART_Enable(FLEXIO_UART_Type *base, bool enable) +{ + if (enable) + { + base->flexioBase->CTRL |= FLEXIO_CTRL_FLEXEN_MASK; + } +} + +/*! + * @brief Writes one byte of data. + * + * @note This is a non-blocking API, which returns directly after the data is put into the + * data register. Ensure that the TxEmptyFlag is asserted before calling + * this API. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param buffer The data bytes to send. + */ +static inline void FLEXIO_UART_WriteByte(FLEXIO_UART_Type *base, const uint8_t *buffer) +{ + base->flexioBase->SHIFTBUF[base->shifterIndex[0]] = *buffer; +} + +/*! + * @brief Reads one byte of data. + * + * @note This is a non-blocking API, which returns directly after the data is read from the + * data register. Ensure that the RxFullFlag is asserted before calling this API. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param buffer The buffer to store the received bytes. + */ +static inline void FLEXIO_UART_ReadByte(FLEXIO_UART_Type *base, uint8_t *buffer) +{ + *buffer = (uint8_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]); +} + +/*! + * @brief Sends a buffer of data bytes. + * + * @note This function blocks using the polling method until all bytes have been sent. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param txData The data bytes to send. + * @param txSize The number of data bytes to send. + * @retval kStatus_FLEXIO_UART_Timeout Transmission timed out and was aborted. + * @retval kStatus_Success Successfully wrote all data. + */ +status_t FLEXIO_UART_WriteBlocking(FLEXIO_UART_Type *base, const uint8_t *txData, size_t txSize); + +/*! + * @brief Receives a buffer of bytes. + * + * @note This function blocks using the polling method until all bytes have been received. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param rxData The buffer to store the received bytes. + * @param rxSize The number of data bytes to be received. + * @retval kStatus_FLEXIO_UART_Timeout Transmission timed out and was aborted. + * @retval kStatus_Success Successfully received all data. + */ +status_t FLEXIO_UART_ReadBlocking(FLEXIO_UART_Type *base, uint8_t *rxData, size_t rxSize); + +/*! @} */ + +/*! + * @name Transactional + * @{ + */ + +/*! + * @brief Initializes the UART handle. + * + * This function initializes the FlexIO UART handle, which can be used for other FlexIO + * UART transactional APIs. Call this API once to get the + * initialized handle. + * + * The UART driver supports the "background" receiving, which means that users can set up + * a RX ring buffer optionally. Data received is stored into the ring buffer even when + * the user doesn't call the FLEXIO_UART_TransferReceiveNonBlocking() API. If there is already data + * received in the ring buffer, users can get the received data from the ring buffer + * directly. The ring buffer is disabled if passing NULL as @p ringBuffer. + * + * @param base to FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * @param callback The callback function. + * @param userData The parameter of the callback function. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO type/handle/ISR table out of range. + */ +status_t FLEXIO_UART_TransferCreateHandle(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + flexio_uart_transfer_callback_t callback, + void *userData); + +/*! + * @brief Sets up the RX ring buffer. + * + * This function sets up the RX ring buffer to a specific UART handle. + * + * When the RX ring buffer is used, data received is stored into the ring buffer even when + * the user doesn't call the UART_ReceiveNonBlocking() API. If there is already data received + * in the ring buffer, users can get the received data from the ring buffer directly. + * + * @note When using the RX ring buffer, one byte is reserved for internal use. In other + * words, if @p ringBufferSize is 32, only 31 bytes are used for saving data. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * @param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. + * @param ringBufferSize Size of the ring buffer. + */ +void FLEXIO_UART_TransferStartRingBuffer(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + uint8_t *ringBuffer, + size_t ringBufferSize); + +/*! + * @brief Aborts the background transfer and uninstalls the ring buffer. + * + * This function aborts the background transfer and uninstalls the ring buffer. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + */ +void FLEXIO_UART_TransferStopRingBuffer(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle); + +/*! + * @brief Transmits a buffer of data using the interrupt method. + * + * This function sends data using an interrupt method. This is a non-blocking function, + * which returns directly without waiting for all data to be written to the TX register. When + * all data is written to the TX register in ISR, the FlexIO UART driver calls the callback + * function and passes the @ref kStatus_FLEXIO_UART_TxIdle as status parameter. + * + * @note The kStatus_FLEXIO_UART_TxIdle is passed to the upper layer when all data is written + * to the TX register. However, it does not ensure that all data is sent out. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * @param xfer FlexIO UART transfer structure. See #flexio_uart_transfer_t. + * @retval kStatus_Success Successfully starts the data transmission. + * @retval kStatus_UART_TxBusy Previous transmission still not finished, data not written to the TX register. + */ +status_t FLEXIO_UART_TransferSendNonBlocking(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + flexio_uart_transfer_t *xfer); + +/*! + * @brief Aborts the interrupt-driven data transmit. + * + * This function aborts the interrupt-driven data sending. Get the remainBytes to find out + * how many bytes are still not sent out. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + */ +void FLEXIO_UART_TransferAbortSend(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle); + +/*! + * @brief Gets the number of bytes sent. + * + * This function gets the number of bytes sent driven by interrupt. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * @param count Number of bytes sent so far by the non-blocking transaction. + * @retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. + * @retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_UART_TransferGetSendCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count); + +/*! + * @brief Receives a buffer of data using the interrupt method. + * + * This function receives data using the interrupt method. This is a non-blocking function, + * which returns without waiting for all data to be received. + * If the RX ring buffer is used and not empty, the data in ring buffer is copied and + * the parameter @p receivedBytes shows how many bytes are copied from the ring buffer. + * After copying, if the data in ring buffer is not enough to read, the receive + * request is saved by the UART driver. When new data arrives, the receive request + * is serviced first. When all data is received, the UART driver notifies the upper layer + * through a callback function and passes the status parameter kStatus_UART_RxIdle. + * For example, if the upper layer needs 10 bytes but there are only 5 bytes in the ring buffer, + * the 5 bytes are copied to xfer->data. This function returns with the + * parameter @p receivedBytes set to 5. For the last 5 bytes, newly arrived data is + * saved from the xfer->data[5]. When 5 bytes are received, the UART driver notifies upper layer. + * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt + * to receive data to xfer->data. When all data is received, the upper layer is notified. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * @param xfer UART transfer structure. See #flexio_uart_transfer_t. + * @param receivedBytes Bytes received from the ring buffer directly. + * @retval kStatus_Success Successfully queue the transfer into the transmit queue. + * @retval kStatus_FLEXIO_UART_RxBusy Previous receive request is not finished. + */ +status_t FLEXIO_UART_TransferReceiveNonBlocking(FLEXIO_UART_Type *base, + flexio_uart_handle_t *handle, + flexio_uart_transfer_t *xfer, + size_t *receivedBytes); + +/*! + * @brief Aborts the receive data which was using IRQ. + * + * This function aborts the receive data which was using IRQ. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + */ +void FLEXIO_UART_TransferAbortReceive(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle); + +/*! + * @brief Gets the number of bytes received. + * + * This function gets the number of bytes received driven by interrupt. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + * @param handle Pointer to the flexio_uart_handle_t structure to store the transfer state. + * @param count Number of bytes received so far by the non-blocking transaction. + * @retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. + * @retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_UART_TransferGetReceiveCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count); + +/*! + * @brief FlexIO UART IRQ handler function. + * + * This function processes the FlexIO UART transmit and receives the IRQ request. + * + * @param uartType Pointer to the FLEXIO_UART_Type structure. + * @param uartHandle Pointer to the flexio_uart_handle_t structure to store the transfer state. + */ +void FLEXIO_UART_TransferHandleIRQ(void *uartType, void *uartHandle); + +/*! + * @brief Flush tx/rx shifters. + * + * @param base Pointer to the FLEXIO_UART_Type structure. + */ +void FLEXIO_UART_FlushShifters(FLEXIO_UART_Type *base); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif /*_cplusplus*/ +/*! @} */ + +#endif /*FSL_FLEXIO_UART_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart_edma.c new file mode 100644 index 00000000000..f2502c9df20 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart_edma.c @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_flexio_uart_edma.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.flexio_uart_edma" +#endif + +/*handle != NULL); + + /* Avoid the warning for unused variables. */ + handle = handle; + tcds = tcds; + + if (transferDone) + { + FLEXIO_UART_TransferAbortSendEDMA(uartPrivateHandle->base, uartPrivateHandle->handle); + + if (uartPrivateHandle->handle->callback != NULL) + { + uartPrivateHandle->handle->callback(uartPrivateHandle->base, uartPrivateHandle->handle, + kStatus_FLEXIO_UART_TxIdle, uartPrivateHandle->handle->userData); + } + } +} + +static void FLEXIO_UART_TransferReceiveEDMACallback(edma_handle_t *handle, + void *param, + bool transferDone, + uint32_t tcds) +{ + flexio_uart_edma_private_handle_t *uartPrivateHandle = (flexio_uart_edma_private_handle_t *)param; + + assert(uartPrivateHandle->handle != NULL); + + /* Avoid the warning for unused variables. */ + handle = handle; + tcds = tcds; + + if (transferDone) + { + /* Disable transfer. */ + FLEXIO_UART_TransferAbortReceiveEDMA(uartPrivateHandle->base, uartPrivateHandle->handle); + + if (uartPrivateHandle->handle->callback != NULL) + { + uartPrivateHandle->handle->callback(uartPrivateHandle->base, uartPrivateHandle->handle, + kStatus_FLEXIO_UART_RxIdle, uartPrivateHandle->handle->userData); + } + } +} + +/*! + * brief Initializes the UART handle which is used in transactional functions. + * + * param base Pointer to FLEXIO_UART_Type. + * param handle Pointer to flexio_uart_edma_handle_t structure. + * param callback The callback function. + * param userData The parameter of the callback function. + * param rxEdmaHandle User requested DMA handle for RX DMA transfer. + * param txEdmaHandle User requested DMA handle for TX DMA transfer. + * retval kStatus_Success Successfully create the handle. + * retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range. + */ +status_t FLEXIO_UART_TransferCreateHandleEDMA(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + flexio_uart_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txEdmaHandle, + edma_handle_t *rxEdmaHandle) +{ + assert(handle != NULL); + + uint8_t index = 0U; + + /* Find the an empty handle pointer to store the handle. */ + for (index = 0U; index < (uint8_t)FLEXIO_UART_HANDLE_COUNT; index++) + { + if (s_edmaPrivateHandle[index].base == NULL) + { + s_edmaPrivateHandle[index].base = base; + s_edmaPrivateHandle[index].handle = handle; + break; + } + } + + if (index == (uint8_t)FLEXIO_UART_HANDLE_COUNT) + { + return kStatus_OutOfRange; + } + + (void)memset(handle, 0, sizeof(*handle)); + + handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; + handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; + + handle->rxEdmaHandle = rxEdmaHandle; + handle->txEdmaHandle = txEdmaHandle; + + handle->callback = callback; + handle->userData = userData; + + /* Configure TX. */ + if (txEdmaHandle != NULL) + { + EDMA_SetCallback(handle->txEdmaHandle, FLEXIO_UART_TransferSendEDMACallback, &s_edmaPrivateHandle); + } + + /* Configure RX. */ + if (rxEdmaHandle != NULL) + { + EDMA_SetCallback(handle->rxEdmaHandle, FLEXIO_UART_TransferReceiveEDMACallback, &s_edmaPrivateHandle); + } + + return kStatus_Success; +} + +/*! + * brief Sends data using eDMA. + * + * This function sends data using eDMA. This is a non-blocking function, which returns + * right away. When all data is sent out, the send callback function is called. + * + * param base Pointer to FLEXIO_UART_Type + * param handle UART handle pointer. + * param xfer UART eDMA transfer structure, see #flexio_uart_transfer_t. + * retval kStatus_Success if succeed, others failed. + * retval kStatus_FLEXIO_UART_TxBusy Previous transfer on going. + */ +status_t FLEXIO_UART_TransferSendEDMA(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + flexio_uart_transfer_t *xfer) +{ + assert(handle->txEdmaHandle != NULL); + + edma_transfer_config_t xferConfig; + status_t status; + + /* Return error if xfer invalid. */ + if ((0U == xfer->dataSize) || (NULL == xfer->data)) + { + return kStatus_InvalidArgument; + } + + /* If previous TX not finished. */ + if ((uint8_t)kFLEXIO_UART_TxBusy == handle->txState) + { + status = kStatus_FLEXIO_UART_TxBusy; + } + else + { + handle->txState = (uint8_t)kFLEXIO_UART_TxBusy; + handle->txDataSizeAll = xfer->dataSize; + + /* Prepare transfer. */ + EDMA_PrepareTransfer(&xferConfig, xfer->data, sizeof(uint8_t), + (uint32_t *)FLEXIO_UART_GetTxDataRegisterAddress(base), sizeof(uint8_t), sizeof(uint8_t), + xfer->dataSize, kEDMA_MemoryToPeripheral); + + /* Store the initially configured eDMA minor byte transfer count into the FLEXIO UART handle */ + handle->nbytes = 1U; + + /* Submit transfer. */ + (void)EDMA_SubmitTransfer(handle->txEdmaHandle, &xferConfig); + EDMA_StartTransfer(handle->txEdmaHandle); + + /* Enable UART TX EDMA. */ + FLEXIO_UART_EnableTxDMA(base, true); + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Receives data using eDMA. + * + * This function receives data using eDMA. This is a non-blocking function, which returns + * right away. When all data is received, the receive callback function is called. + * + * param base Pointer to FLEXIO_UART_Type + * param handle Pointer to flexio_uart_edma_handle_t structure + * param xfer UART eDMA transfer structure, see #flexio_uart_transfer_t. + * retval kStatus_Success if succeed, others failed. + * retval kStatus_UART_RxBusy Previous transfer on going. + */ +status_t FLEXIO_UART_TransferReceiveEDMA(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + flexio_uart_transfer_t *xfer) +{ + assert(handle->rxEdmaHandle != NULL); + + edma_transfer_config_t xferConfig; + status_t status; + + /* Return error if xfer invalid. */ + if ((0U == xfer->dataSize) || (NULL == xfer->data)) + { + return kStatus_InvalidArgument; + } + + /* If previous RX not finished. */ + if ((uint8_t)kFLEXIO_UART_RxBusy == handle->rxState) + { + status = kStatus_FLEXIO_UART_RxBusy; + } + else + { + handle->rxState = (uint8_t)kFLEXIO_UART_RxBusy; + handle->rxDataSizeAll = xfer->dataSize; + + /* Prepare transfer. */ + EDMA_PrepareTransfer(&xferConfig, (uint32_t *)FLEXIO_UART_GetRxDataRegisterAddress(base), sizeof(uint8_t), + xfer->data, sizeof(uint8_t), sizeof(uint8_t), xfer->dataSize, kEDMA_PeripheralToMemory); + + /* Store the initially configured eDMA minor byte transfer count into the FLEXIO UART handle */ + handle->nbytes = (uint8_t)sizeof(uint8_t); + + /* Submit transfer. */ + (void)EDMA_SubmitTransfer(handle->rxEdmaHandle, &xferConfig); + EDMA_StartTransfer(handle->rxEdmaHandle); + + /* Enable UART RX EDMA. */ + FLEXIO_UART_EnableRxDMA(base, true); + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Aborts the sent data which using eDMA. + * + * This function aborts sent data which using eDMA. + * + * param base Pointer to FLEXIO_UART_Type + * param handle Pointer to flexio_uart_edma_handle_t structure + */ +void FLEXIO_UART_TransferAbortSendEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle) +{ + assert(handle->txEdmaHandle != NULL); + + /* Disable UART TX EDMA. */ + FLEXIO_UART_EnableTxDMA(base, false); + + /* Stop transfer. */ + EDMA_StopTransfer(handle->txEdmaHandle); + + handle->txState = (uint8_t)kFLEXIO_UART_TxIdle; +} + +/*! + * brief Aborts the receive data which using eDMA. + * + * This function aborts the receive data which using eDMA. + * + * param base Pointer to FLEXIO_UART_Type + * param handle Pointer to flexio_uart_edma_handle_t structure + */ +void FLEXIO_UART_TransferAbortReceiveEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle) +{ + assert(handle->rxEdmaHandle != NULL); + + /* Disable UART RX EDMA. */ + FLEXIO_UART_EnableRxDMA(base, false); + + /* Stop transfer. */ + EDMA_StopTransfer(handle->rxEdmaHandle); + + handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle; +} + +/*! + * brief Gets the number of bytes received. + * + * This function gets the number of bytes received. + * + * param base Pointer to FLEXIO_UART_Type + * param handle Pointer to flexio_uart_edma_handle_t structure + * param count Number of bytes received so far by the non-blocking transaction. + * retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. + * retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_UART_TransferGetReceiveCountEDMA(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + size_t *count) +{ + assert(handle != NULL); + assert(handle->rxEdmaHandle != NULL); + assert(count != NULL); + + if ((uint8_t)kFLEXIO_UART_RxIdle == handle->rxState) + { + return kStatus_NoTransferInProgress; + } + + *count = handle->rxDataSizeAll - + (uint32_t)handle->nbytes * + EDMA_GetRemainingMajorLoopCount(handle->rxEdmaHandle->base, handle->rxEdmaHandle->channel); + + return kStatus_Success; +} + +/*! + * brief Gets the number of bytes sent out. + * + * This function gets the number of bytes sent out. + * + * param base Pointer to FLEXIO_UART_Type + * param handle Pointer to flexio_uart_edma_handle_t structure + * param count Number of bytes sent so far by the non-blocking transaction. + * retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. + * retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_UART_TransferGetSendCountEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + assert(handle->txEdmaHandle != NULL); + assert(count != NULL); + + if ((uint8_t)kFLEXIO_UART_TxIdle == handle->txState) + { + return kStatus_NoTransferInProgress; + } + + *count = handle->txDataSizeAll - + (uint32_t)handle->nbytes * + EDMA_GetRemainingMajorLoopCount(handle->txEdmaHandle->base, handle->txEdmaHandle->channel); + + return kStatus_Success; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart_edma.h new file mode 100644 index 00000000000..c8d0a04369b --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_flexio_uart_edma.h @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_FLEXIO_UART_EDMA_H_ +#define FSL_FLEXIO_UART_EDMA_H_ + +#include "fsl_flexio_uart.h" +#include "fsl_edma.h" + +/*! + * @addtogroup flexio_edma_uart + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FlexIO UART EDMA driver version. */ +#define FSL_FLEXIO_UART_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 4, 1)) +/*! @} */ + +/* Forward declaration of the handle typedef. */ +typedef struct _flexio_uart_edma_handle flexio_uart_edma_handle_t; + +/*! @brief UART transfer callback function. */ +typedef void (*flexio_uart_edma_transfer_callback_t)(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + status_t status, + void *userData); + +/*! + * @brief UART eDMA handle + */ +struct _flexio_uart_edma_handle +{ + flexio_uart_edma_transfer_callback_t callback; /*!< Callback function. */ + void *userData; /*!< UART callback function parameter.*/ + + size_t txDataSizeAll; /*!< Total bytes to be sent. */ + size_t rxDataSizeAll; /*!< Total bytes to be received. */ + + edma_handle_t *txEdmaHandle; /*!< The eDMA TX channel used. */ + edma_handle_t *rxEdmaHandle; /*!< The eDMA RX channel used. */ + + uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ + + volatile uint8_t txState; /*!< TX transfer state. */ + volatile uint8_t rxState; /*!< RX transfer state */ +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name eDMA transactional + * @{ + */ + +/*! + * @brief Initializes the UART handle which is used in transactional functions. + * + * @param base Pointer to FLEXIO_UART_Type. + * @param handle Pointer to flexio_uart_edma_handle_t structure. + * @param callback The callback function. + * @param userData The parameter of the callback function. + * @param rxEdmaHandle User requested DMA handle for RX DMA transfer. + * @param txEdmaHandle User requested DMA handle for TX DMA transfer. + * @retval kStatus_Success Successfully create the handle. + * @retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range. + */ +status_t FLEXIO_UART_TransferCreateHandleEDMA(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + flexio_uart_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txEdmaHandle, + edma_handle_t *rxEdmaHandle); + +/*! + * @brief Sends data using eDMA. + * + * This function sends data using eDMA. This is a non-blocking function, which returns + * right away. When all data is sent out, the send callback function is called. + * + * @param base Pointer to FLEXIO_UART_Type + * @param handle UART handle pointer. + * @param xfer UART eDMA transfer structure, see #flexio_uart_transfer_t. + * @retval kStatus_Success if succeed, others failed. + * @retval kStatus_FLEXIO_UART_TxBusy Previous transfer on going. + */ +status_t FLEXIO_UART_TransferSendEDMA(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + flexio_uart_transfer_t *xfer); + +/*! + * @brief Receives data using eDMA. + * + * This function receives data using eDMA. This is a non-blocking function, which returns + * right away. When all data is received, the receive callback function is called. + * + * @param base Pointer to FLEXIO_UART_Type + * @param handle Pointer to flexio_uart_edma_handle_t structure + * @param xfer UART eDMA transfer structure, see #flexio_uart_transfer_t. + * @retval kStatus_Success if succeed, others failed. + * @retval kStatus_UART_RxBusy Previous transfer on going. + */ +status_t FLEXIO_UART_TransferReceiveEDMA(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + flexio_uart_transfer_t *xfer); + +/*! + * @brief Aborts the sent data which using eDMA. + * + * This function aborts sent data which using eDMA. + * + * @param base Pointer to FLEXIO_UART_Type + * @param handle Pointer to flexio_uart_edma_handle_t structure + */ +void FLEXIO_UART_TransferAbortSendEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle); + +/*! + * @brief Aborts the receive data which using eDMA. + * + * This function aborts the receive data which using eDMA. + * + * @param base Pointer to FLEXIO_UART_Type + * @param handle Pointer to flexio_uart_edma_handle_t structure + */ +void FLEXIO_UART_TransferAbortReceiveEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle); + +/*! + * @brief Gets the number of bytes sent out. + * + * This function gets the number of bytes sent out. + * + * @param base Pointer to FLEXIO_UART_Type + * @param handle Pointer to flexio_uart_edma_handle_t structure + * @param count Number of bytes sent so far by the non-blocking transaction. + * @retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. + * @retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_UART_TransferGetSendCountEDMA(FLEXIO_UART_Type *base, flexio_uart_edma_handle_t *handle, size_t *count); + +/*! + * @brief Gets the number of bytes received. + * + * This function gets the number of bytes received. + * + * @param base Pointer to FLEXIO_UART_Type + * @param handle Pointer to flexio_uart_edma_handle_t structure + * @param count Number of bytes received so far by the non-blocking transaction. + * @retval kStatus_NoTransferInProgress transfer has finished or no transfer in progress. + * @retval kStatus_Success Successfully return the count. + */ +status_t FLEXIO_UART_TransferGetReceiveCountEDMA(FLEXIO_UART_Type *base, + flexio_uart_edma_handle_t *handle, + size_t *count); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_UART_EDMA_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_freqme.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_freqme.c new file mode 100644 index 00000000000..459bbb6f3a0 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_freqme.c @@ -0,0 +1,155 @@ +/* + * Copyright 2021-2022 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_freqme.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpc_freqme" +#endif + +#if defined(FREQME_RSTS_N) +#define FREQME_RESETS_ARRAY FREQME_RSTS_N +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static uint32_t FREQME_GetInstance(FREQME_Type *base); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Array to map freqme instance number to base address. */ +static FREQME_Type *const s_freqmeBases[] = FREQME_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to FREQME clocks for each instance. */ +static const clock_ip_name_t s_freqmeClocks[] = FREQME_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(FREQME_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_freqmeResets[] = FREQME_RESETS_ARRAY; +#endif +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t FREQME_GetInstance(FREQME_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0U; instance < ARRAY_SIZE(s_freqmeBases); instance++) + { + if (s_freqmeBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_freqmeBases)); + + return instance; +} + +/*! + * brief Initialize freqme module, set operate mode, operate mode attribute and initialize measurement cycle. + * + * param base FREQME peripheral base address. + * param config The pointer to module basic configuration, please refer to freq_measure_config_t. + */ +void FREQME_Init(FREQME_Type *base, const freq_measure_config_t *config) +{ + assert(config); + + uint32_t tmp32 = 0UL; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable FREQME clock. */ + CLOCK_EnableClock(s_freqmeClocks[FREQME_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(FREQME_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_freqmeResets[FREQME_GetInstance(base)]); +#endif + + if (config->startMeasurement) + { + tmp32 |= FREQME_CTRL_W_MEASURE_IN_PROGRESS_MASK; + } + tmp32 |= FREQME_CTRL_W_CONTINUOUS_MODE_EN(config->enableContinuousMode) | + FREQME_CTRL_W_PULSE_MODE(config->operateMode); + if (config->operateMode == kFREQME_FreqMeasurementMode) + { + tmp32 |= FREQME_CTRL_W_REF_SCALE(config->operateModeAttribute.refClkScaleFactor); + } + else + { + tmp32 |= FREQME_CTRL_W_PULSE_POL(config->operateModeAttribute.pulsePolarity); + } + + base->CTRL_W = tmp32; +} + +/*! + * brief Get default configuration. + * + * code + * config->operateMode = kFREQME_FreqMeasurementMode; + * config->operateModeAttribute.refClkScaleFactor = 0U; + * config->enableContinuousMode = false; + * config->startMeasurement = false; + * endcode + * + * param config The pointer to module basic configuration, please refer to freq_measure_config_t. + */ +void FREQME_GetDefaultConfig(freq_measure_config_t *config) +{ + assert(config); + + (void)memset(config, 0, sizeof(*config)); + + config->operateMode = kFREQME_FreqMeasurementMode; + config->operateModeAttribute.refClkScaleFactor = 0U; + config->enableContinuousMode = false; + config->startMeasurement = false; +} + +/*! + * brief Calculate the frequency of selected target clock. + * + * note The formula: Ftarget = (RESULT - 2) * Freference / 2 ^ REF_SCALE. + * + * note This function only useful when the operate mode is selected as frequency measurement mode. + * + * param base FREQME peripheral base address. + * param refClkFrequency The frequency of reference clock. + * return The frequency of target clock, if the output result is 0, please check the module's operate mode. + */ +uint32_t FREQME_CalculateTargetClkFreq(FREQME_Type *base, uint32_t refClkFrequency) +{ + uint32_t measureResult = 0UL; + uint32_t targetFreq = 0UL; + uint64_t tmp64 = 0ULL; + + while ((base->CTRL_R & FREQME_CTRL_R_MEASURE_IN_PROGRESS_MASK) != 0UL) + { + } + + if (!FREQME_CheckOperateMode(base)) + { + measureResult = base->CTRL_R & FREQME_CTRL_R_RESULT_MASK; + tmp64 = ((uint64_t)measureResult - 2ULL) * (uint64_t)refClkFrequency; + targetFreq = (uint32_t)(tmp64 / (1ULL << (uint64_t)FREQME_GetReferenceClkScaleValue(base))); + } + + return targetFreq; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_freqme.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_freqme.h new file mode 100644 index 00000000000..dd1ee29d668 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_freqme.h @@ -0,0 +1,441 @@ +/* + * Copyright 2021-2022 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_FREQME_H_ +#define FSL_FREQME_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lpc_freqme + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief FREQME driver version 2.1.2. */ +#define FSL_FREQME_DRIVER_VERSION (MAKE_VERSION(2, 1, 2)) +/*! @} */ + +/*! + * @brief The enumeration of interrupt status flags. + * @anchor _freqme_interrupt_status_flags + */ +enum _freqme_interrupt_status_flags +{ + kFREQME_UnderflowInterruptStatusFlag = FREQME_CTRLSTAT_LT_MIN_STAT_MASK, /*!< Indicate the measurement is + just done and the result is less + than minimun value. */ + kFREQME_OverflowInterruptStatusFlag = FREQME_CTRLSTAT_GT_MAX_STAT_MASK, /*!< Indicate the measurement is + just done and the result is greater + than maximum value. */ + kFREQME_ReadyInterruptStatusFlag = FREQME_CTRLSTAT_RESULT_READY_STAT_MASK, /*!< Indicate the measurement is + just done and the result is ready to + read. */ + kFREQME_AllInterruptStatusFlags = FREQME_CTRLSTAT_LT_MIN_STAT_MASK | FREQME_CTRLSTAT_GT_MAX_STAT_MASK | + FREQME_CTRLSTAT_RESULT_READY_STAT_MASK, /*!< All interrupt + status flags. */ +}; + +/*! + * @brief The enumeration of interrupts, including underflow interrupt, overflow interrupt, + * and result ready interrupt. + * @anchor _freqme_interrupt_enable + */ +enum _freqme_interrupt_enable +{ + kFREQME_UnderflowInterruptEnable = FREQME_CTRL_W_LT_MIN_INT_EN_MASK, /*!< Enable interrupt when the result is + less than minimum value. */ + kFREQME_OverflowInterruptEnable = FREQME_CTRL_W_GT_MAX_INT_EN_MASK, /*!< Enable interrupt when the result is + greater than maximum value. */ + kFREQME_ReadyInterruptEnable = FREQME_CTRL_W_RESULT_READY_INT_EN_MASK, /*!< Enable interrupt when a + measurement completes and the result + is ready. */ +}; + +/*! + * @brief FREQME module operate mode enumeration, including frequency measurement mode + * and pulse width measurement mode. + */ +typedef enum _freqme_operate_mode +{ + kFREQME_FreqMeasurementMode = 0U, /*!< The module works in the frequency measurement mode. */ + kFREOME_PulseWidthMeasurementMode, /*!< The module works in the pulse width measurement mode. */ +} freqme_operate_mode_t; + +/*! + * @brief The enumeration of pulse polarity. + */ +typedef enum _freqme_pulse_polarity +{ + kFREQME_PulseHighPeriod = 0U, /*!< Select high period of the reference clock. */ + kFREQME_PulseLowPeriod, /*!< Select low period of the reference clock. */ +} freqme_pulse_polarity_t; + +/*! + * @brief The union of operate mode attribute. + * @note If the operate mode is selected as frequency measurement mode the member \b refClkScaleFactor should be used, + * if the operate mode is selected as pulse width measurement mode the member \b pulsePolarity should be used. + */ +typedef union _freqme_mode_attribute +{ + uint8_t refClkScaleFactor; /*!< Only useful in frequency measurement operate mode, + used to set the reference clock counter scaling factor. */ + freqme_pulse_polarity_t pulsePolarity; /*!< Only Useful in pulse width measurement operate mode, + used to set period polarity. */ +} freqme_mode_attribute_t; + +/*! + * @brief The structure of freqme module basic configuration, + * including operate mode, operate mode attribute and so on. + */ +typedef struct _freq_measure_config +{ + freqme_operate_mode_t operateMode; /*!< Select operate mode, please refer to @ref freqme_operate_mode_t. */ + freqme_mode_attribute_t operateModeAttribute; /*!< Used to set the attribute of the selected operate mode, if + the operate mode is selected as @ref kFREQME_FreqMeasurementMode + set freqme_mode_attribute_t::refClkScaleFactor, if operate mode is + selected as @ref kFREOME_PulseWidthMeasurementMode, please set + freqme_mode_attribute_t::pulsePolarity. */ + + bool enableContinuousMode; /*!< Enable/disable continuous mode, if continuous mode is enable, + the measurement is performed continuously and the result for the + last completed measurement is available in the result register. */ + bool startMeasurement; +} freq_measure_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Basic Control APIs + * @{ + */ +/*! + * @brief Initialize freqme module, set operate mode, operate mode attribute and initialize measurement cycle. + * + * @param base FREQME peripheral base address. + * @param config The pointer to module basic configuration, please refer to @ref freq_measure_config_t. + */ +void FREQME_Init(FREQME_Type *base, const freq_measure_config_t *config); + +/*! + * @brief Get default configuration. + * + * @code + * config->operateMode = kFREQME_FreqMeasurementMode; + * config->operateModeAttribute.refClkScaleFactor = 0U; + * config->enableContinuousMode = false; + * config->startMeasurement = false; + * @endcode + * + * @param config The pointer to module basic configuration, please refer to @ref freq_measure_config_t. + */ +void FREQME_GetDefaultConfig(freq_measure_config_t *config); + +/*! + * @brief Start frequency or pulse width measurement process. + * + * @param base FREQME peripheral base address. + */ +static inline void FREQME_StartMeasurementCycle(FREQME_Type *base) +{ + uint32_t tmp32; + + tmp32 = base->CTRLSTAT; + tmp32 &= ~(FREQME_CTRLSTAT_LT_MIN_STAT_MASK | FREQME_CTRLSTAT_MEASURE_IN_PROGRESS_MASK | + FREQME_CTRLSTAT_GT_MAX_STAT_MASK | FREQME_CTRLSTAT_RESULT_READY_STAT_MASK); + tmp32 |= FREQME_CTRL_W_MEASURE_IN_PROGRESS_MASK; + base->CTRL_W = tmp32; +} + +/*! + * @brief Force the termination of any measurement cycle currently in progress and resets RESULT or just reset + * RESULT if the module in idle state. + * + * @param base FREQME peripheral base address. + */ +static inline void FREQME_TerminateMeasurementCycle(FREQME_Type *base) +{ + uint32_t tmp32; + + tmp32 = base->CTRLSTAT; + tmp32 &= ~(FREQME_CTRLSTAT_LT_MIN_STAT_MASK | FREQME_CTRLSTAT_MEASURE_IN_PROGRESS_MASK | + FREQME_CTRLSTAT_GT_MAX_STAT_MASK | FREQME_CTRLSTAT_RESULT_READY_STAT_MASK); + base->CTRL_W = tmp32; +} + +/*! + * @brief Enable/disable Continuous mode. + * + * @param base FREQME peripheral base address. + * @param enable Used to enable/disable continuous mode, + * - \b true Enable Continuous mode. + * - \b false Disable Continuous mode. + */ +static inline void FREQME_EnableContinuousMode(FREQME_Type *base, bool enable) +{ + uint32_t tmp32; + + tmp32 = base->CTRLSTAT; + tmp32 &= ~(FREQME_CTRLSTAT_LT_MIN_STAT_MASK | FREQME_CTRLSTAT_CONTINUOUS_MODE_EN_MASK | + FREQME_CTRLSTAT_GT_MAX_STAT_MASK | FREQME_CTRLSTAT_RESULT_READY_STAT_MASK); + if (enable) + { + tmp32 |= FREQME_CTRL_W_CONTINUOUS_MODE_EN_MASK; + } + + base->CTRL_W = tmp32; +} + +/*! + * @brief Check whether continuous mode is enabled. + * + * @param base FREQME peripheral base address. + * @retval True Continuous mode is enabled, the measurement is performed continuously. + * @retval False Continuous mode is disabled. + */ +static inline bool FREQME_CheckContinuousMode(FREQME_Type *base) +{ + return (bool)((base->CTRLSTAT & FREQME_CTRLSTAT_CONTINUOUS_MODE_EN_MASK) != 0UL); +} + +/*! + * @brief Set operate mode of freqme module. + * + * @param base FREQME peripheral base address. + * @param operateMode The operate mode to be set, please refer to @ref freqme_operate_mode_t. + */ +static inline void FREQME_SetOperateMode(FREQME_Type *base, freqme_operate_mode_t operateMode) +{ + uint32_t tmp32; + + tmp32 = base->CTRLSTAT; + tmp32 &= ~(FREQME_CTRLSTAT_LT_MIN_STAT_MASK | FREQME_CTRLSTAT_PULSE_MODE_MASK | + FREQME_CTRLSTAT_GT_MAX_STAT_MASK | FREQME_CTRLSTAT_RESULT_READY_STAT_MASK); + if (operateMode == kFREOME_PulseWidthMeasurementMode) + { + tmp32 |= FREQME_CTRL_W_PULSE_MODE_MASK; + } + + base->CTRL_W = tmp32; +} + +/*! + * @brief Check module's operate mode. + * + * @param base FREQME peripheral base address. + * @retval True Pulse width measurement mode. + * @retval False Frequency measurement mode. + */ +static inline bool FREQME_CheckOperateMode(FREQME_Type *base) +{ + return (bool)((base->CTRLSTAT & FREQME_CTRLSTAT_PULSE_MODE_MASK) != 0UL); + +} + +/*! + * @brief Set the minimum expected value for the measurement result. + * + * @param base FREQME peripheral base address. + * @param minValue The minimum value to set, please note that this value is 31 bits width. + */ +static inline void FREQME_SetMinExpectedValue(FREQME_Type *base, uint32_t minValue) +{ + base->MIN = minValue; +} + +/*! + * @brief Set the maximum expected value for the measurement result. + * + * @param base FREQME peripheral base address. + * @param maxValue The maximum value to set, please note that this value is 31 bits width. + */ +static inline void FREQME_SetMaxExpectedValue(FREQME_Type *base, uint32_t maxValue) +{ + base->MAX = maxValue; +} + +/*! @} */ + +/*! + * @name Frequency Measurement Mode Control APIs + * @{ + */ + +/*! + * @brief Calculate the frequency of selected target clock。 + * + * @note The formula: Ftarget = (RESULT - 2) * Freference / 2 ^ REF_SCALE. + * + * @note This function only useful when the operate mode is selected as frequency measurement mode. + * + * @param base FREQME peripheral base address. + * @param refClkFrequency The frequency of reference clock. + * @return The frequency of target clock the unit is Hz, if the output result is 0, please check the module's + * operate mode. + */ +uint32_t FREQME_CalculateTargetClkFreq(FREQME_Type *base, uint32_t refClkFrequency); + +/*! + * @brief Get reference clock scaling factor. + * + * @param base FREQME peripheral base address. + * @return Reference clock scaling factor, the reference count cycle is 2 ^ ref_scale. + */ +static inline uint8_t FREQME_GetReferenceClkScaleValue(FREQME_Type *base) +{ + return (uint8_t)(base->CTRLSTAT & FREQME_CTRLSTAT_REF_SCALE_MASK); +} + +/*! @} */ + +/*! + * @name Pulse Width Measurement Mode Control APIs + * @{ + */ + +/*! + * @brief Set pulse polarity when operate mode is selected as Pulse Width Measurement mode. + * + * @param base FREQME peripheral base address. + * @param pulsePolarity The pulse polarity to be set, please refer to @ref freqme_pulse_polarity_t. + */ +static inline void FREQME_SetPulsePolarity(FREQME_Type *base, freqme_pulse_polarity_t pulsePolarity) +{ + uint32_t tmp32; + + tmp32 = base->CTRLSTAT; + tmp32 &= ~(FREQME_CTRLSTAT_LT_MIN_STAT_MASK | FREQME_CTRLSTAT_PULSE_POL_MASK | + FREQME_CTRLSTAT_GT_MAX_STAT_MASK | FREQME_CTRLSTAT_RESULT_READY_STAT_MASK); + + if (pulsePolarity != kFREQME_PulseHighPeriod) + { + tmp32 |= FREQME_CTRL_W_PULSE_POL_MASK; + } + + base->CTRL_W = tmp32; +} + +/*! + * @brief Check pulse polarity when the operate mode is selected as pulse width measurement mode. + * + * @param base FREQME peripheral base address. + * @retval True Low period. + * @retval False High period. + */ +static inline bool FREQME_CheckPulsePolarity(FREQME_Type *base) +{ + return (bool)((base->CTRLSTAT & FREQME_CTRLSTAT_PULSE_POL_MASK) != 0UL); +} + +/*! + * @brief Get measurement result, if operate mode is selected as pulse width measurement mode this function can + * be used to calculate pulse width. + * + * @note Pulse width = counter result / Frequency of target clock. + * + * @param base FREQME peripheral base address. + * @return Measurement result. + */ +static inline uint32_t FREQME_GetMeasurementResult(FREQME_Type *base) +{ + return base->CTRL_R & FREQME_CTRL_R_RESULT_MASK; +} + +/*! @} */ + +/*! + * @name Status Control APIs + * @{ + */ + +/*! + * @brief Get interrupt status flags, such as overflow interrupt status flag, + * underflow interrupt status flag, and so on. + * + * @param base FREQME peripheral base address. + * @return Current interrupt status flags, should be the OR'ed value of @ref _freqme_interrupt_status_flags. + */ +static inline uint32_t FREQME_GetInterruptStatusFlags(FREQME_Type *base) +{ + return (base->CTRLSTAT & (uint32_t)kFREQME_AllInterruptStatusFlags); +} + +/*! + * @brief Clear interrupt status flags. + * + * @param base FREQME peripheral base address. + * @param statusFlags The combination of interrupt status flags to clear, + * should be the OR'ed value of @ref _freqme_interrupt_status_flags. + */ +static inline void FREQME_ClearInterruptStatusFlags(FREQME_Type *base, uint32_t statusFlags) +{ + base->CTRLSTAT |= statusFlags; +} + +/*! @} */ + +/*! + * @name Interrupt Control APIs + * @{ + */ + +/*! + * @brief Enable interrupts, such as result ready interrupt, overflow interrupt and so on. + * + * @param base FREQME peripheral base address. + * @param masks The mask of interrupts to enable, should be the OR'ed value of @ref _freqme_interrupt_enable. + */ +static inline void FREQME_EnableInterrupts(FREQME_Type *base, uint32_t masks) +{ + uint32_t tmp32; + + tmp32 = base->CTRLSTAT; + tmp32 &= ~(FREQME_CTRLSTAT_LT_MIN_STAT_MASK | FREQME_CTRLSTAT_LT_MIN_INT_EN_MASK | + FREQME_CTRLSTAT_GT_MAX_STAT_MASK | FREQME_CTRLSTAT_GT_MAX_INT_EN_MASK | + FREQME_CTRLSTAT_RESULT_READY_INT_EN_MASK | FREQME_CTRLSTAT_RESULT_READY_STAT_MASK); + + tmp32 |= masks; + base->CTRL_W = tmp32; +} + +/*! + * @brief Disable interrupts, such as result ready interrupt, overflow interrupt and so on. + * + * @param base FREQME peripheral base address. + * @param masks The mask of interrupts to disable, should be the OR'ed value of @ref _freqme_interrupt_enable. + */ +static inline void FREQME_DisableInterrupts(FREQME_Type *base, uint32_t masks) +{ + uint32_t tmp32; + + tmp32 = base->CTRLSTAT; + tmp32 &= ~(FREQME_CTRLSTAT_LT_MIN_STAT_MASK | FREQME_CTRLSTAT_GT_MAX_STAT_MASK | + FREQME_CTRLSTAT_RESULT_READY_STAT_MASK | masks); + + base->CTRL_W = tmp32; +} + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* FSL_FREQME_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_glikey.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_glikey.c new file mode 100644 index 00000000000..ee585b8077d --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_glikey.c @@ -0,0 +1,403 @@ +/* + * Copyright 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_common.h" +#include "fsl_glikey.h" + +/******************************************************************************* + * Definitions + *******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.glikey" +#endif + +#define GLIKEY_SFR_LOCK 0x05u +#define GLIKEY_SFR_UNLOCK 0x0Au + +/* Define to select between write to CTRL0_WR_0 or CTRL1_WR_1 */ +#define WR_EN0 (0x0Fu) +#define WR_EN1 (0xF0u) + +#define WR_EN0_VALUE_SHIFT (0u) +#define WR_EN1_VALUE_SHIFT (16u) + +#define CTRL_SEL_CODEWORD_SHIFT (24u) + +#define WR_0_INIT (0x2u) +#define WR_1_INIT (0x0u) + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static inline void Glikey_Internal_Set_WR_0(GLIKEY_Type *base, uint32_t value); +static inline void Glikey_Internal_Set_WR_1(GLIKEY_Type *base, uint32_t value); +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * Weak implementation of GLIKEY IRQ, should be re-defined by user when using GLIKEY IRQ + +__WEAK void GLIKEY0_DriverIRQHandler(void) +{ + GLIKEY generates IRQ until corresponding bit in STATUS is cleared by calling + GLIKEY_ClearStatusFlags(); +} +*/ + +static inline void Glikey_Internal_Set_WR_0(GLIKEY_Type *base, uint32_t value) +{ + uint32_t ctrl0 = ((GLIKEY_Type *)base)->CTRL_0; + + /* Clear WR_0 */ + ctrl0 = ctrl0 & (~GLIKEY_CTRL_0_WR_EN_0_MASK); + + /* Assign value */ + ((GLIKEY_Type *)base)->CTRL_0 = ctrl0 | GLIKEY_CTRL_0_WR_EN_0(value); +} + +static inline void Glikey_Internal_Set_WR_1(GLIKEY_Type *base, uint32_t value) +{ + uint32_t ctrl1 = ((GLIKEY_Type *)base)->CTRL_1; + + /* Clear WR_1 */ + ctrl1 = ctrl1 & (~GLIKEY_CTRL_1_WR_EN_1_MASK); + + /* Assign value */ + ((GLIKEY_Type *)base)->CTRL_1 = ctrl1 | GLIKEY_CTRL_1_WR_EN_1(value); +} + +uint32_t GLIKEY_GetStatus(GLIKEY_Type *base) +{ + return ((GLIKEY_Type *)base)->STATUS; +} + +status_t GLIKEY_IsLocked(GLIKEY_Type *base) +{ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked == retCode) + { + return kStatus_GLIKEY_NotLocked; + } + else + { + return kStatus_GLIKEY_Locked; + } +} + +status_t GLIKEY_CheckLock(GLIKEY_Type *base) +{ + uint32_t sfrLock = (((GLIKEY_Type *)base)->CTRL_1 & GLIKEY_CTRL_1_SFR_LOCK_MASK) >> GLIKEY_CTRL_1_SFR_LOCK_SHIFT; + + if (GLIKEY_SFR_UNLOCK != sfrLock) /* Locked */ + { + return kStatus_GLIKEY_LockedError; + } + + return kStatus_GLIKEY_NotLocked; +} + +#if defined(GLIKEY_VERSION_FSM_CONFIG) +status_t GLIKEY_GetVersion(GLIKEY_Type *base, uint32_t *result) +{ + *result = ((GLIKEY_Type *)base)->VERSION; + + return kStatus_Success; +} +#endif + +status_t GLIKEY_SyncReset(GLIKEY_Type *base) +{ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + /* Set CTRL_0.SFT_RST = 1 */ + ((GLIKEY_Type *)base)->CTRL_0 |= GLIKEY_CTRL_0_SFT_RST_MASK; + + return kStatus_Success; +} + +status_t GLIKEY_SetIntEnable(GLIKEY_Type *base, uint32_t value) +{ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + ((GLIKEY_Type *)base)->INTR_CTRL = GLIKEY_INTR_CTRL_INT_EN(value); + + return kStatus_Success; +} + +status_t GLIKEY_GetIntEnable(GLIKEY_Type *base, uint32_t *value) +{ + *value = ((GLIKEY_Type *)base)->INTR_CTRL & GLIKEY_INTR_CTRL_INT_EN_MASK; + + return kStatus_Success; +} + +status_t GLIKEY_ClearIntStatus(GLIKEY_Type *base) +{ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + ((GLIKEY_Type *)base)->INTR_CTRL |= GLIKEY_INTR_CTRL_INT_CLR_MASK; + + return kStatus_Success; +} + +status_t GLIKEY_SetIntStatus(GLIKEY_Type *base) +{ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + ((GLIKEY_Type *)base)->INTR_CTRL |= GLIKEY_INTR_CTRL_INT_SET_MASK; + + return kStatus_Success; +} + +status_t GLIKEY_Lock(GLIKEY_Type *base) +{ + /* Check if SFR_LOCK is locked */ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) /* Glikey is not locked -> lock */ + { + uint32_t ctrl1 = ((GLIKEY_Type *)base)->CTRL_1; + /* Clear SFR_LOCK */ + ctrl1 = ctrl1 & (~GLIKEY_CTRL_1_SFR_LOCK_MASK); + /* Lock Gliekey */ + ((GLIKEY_Type *)base)->CTRL_1 = ctrl1 | GLIKEY_CTRL_1_SFR_LOCK(GLIKEY_SFR_LOCK); + } + + return kStatus_Success; +} + +status_t GLIKEY_IsIndexLocked(GLIKEY_Type *base, uint32_t index) +{ + /* Set CTRL_1.READ_INDEX = index */ + uint32_t ctr1Val = ((GLIKEY_Type *)base)->CTRL_1; + /* Clear READ_INDEX */ + ctr1Val = ctr1Val & (~GLIKEY_CTRL_1_READ_INDEX_MASK); + /* Set index value */ + ((GLIKEY_Type *)base)->CTRL_1 = ctr1Val | GLIKEY_CTRL_1_READ_INDEX(index); + + /* Check ERROR_STATUS */ + if (0u != (GLIKEY_GetStatus(base) & GLIKEY_STATUS_ERROR_STATUS_MASK)) + { + return kStatus_Fail; + } + + /* Check if STATUS.LOCK_STATUS is 0 */ + if (0u == (GLIKEY_GetStatus(base) & GLIKEY_STATUS_LOCK_STATUS_MASK)) + { + return kStatus_GLIKEY_NotLocked; + } + else + { + return kStatus_GLIKEY_Locked; + } +} + +status_t GLIKEY_LockIndex(GLIKEY_Type *base) +{ + /* Check if Glikey SFR locked */ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + /* Check if FSM is in WR_EN state */ + uint32_t state = (GLIKEY_GetStatus(base) & GLIKEY_STATUS_FSM_STATE_MASK) >> GLIKEY_STATUS_FSM_STATE_SHIFT; + if (GLIKEY_FSM_WR_EN == state) + { + /* Set WR_EN0 = b11 */ + ((GLIKEY_Type *)base)->CTRL_0 |= GLIKEY_CTRL_0_WR_EN_0(0x3u); + return kStatus_GLIKEY_Locked; + } + else + { + return kStatus_GLIKEY_DisabledError; + } +} + +status_t GLIKEY_StartEnable(GLIKEY_Type *base, uint32_t index) +{ + /* Check if Glikey SFR locked */ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + /* Check if index is locked */ + retCode = GLIKEY_IsIndexLocked(base, index); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + /* CTRL0 */ + uint32_t ctrl0 = ((GLIKEY_Type *)base)->CTRL_0; + /* Clear old index */ + ctrl0 = ctrl0 & (~GLIKEY_CTRL_0_WRITE_INDEX_MASK); + /* Clear old CTRL0.WR_EN_0 */ + ctrl0 = ctrl0 & (~GLIKEY_CTRL_0_WR_EN_0_MASK); + /* Set new index */ + ctrl0 |= GLIKEY_CTRL_0_WRITE_INDEX(index); + + /* Start the enable process by writting 0x01 to CTRL0.WR_EN_0 */ + ctrl0 = ctrl0 | ((uint32_t)0x01u << GLIKEY_CTRL_0_WR_EN_0_SHIFT); + + /* Write to CTRL0 (new index and WR_EN_0 = 0x01) */ + ((GLIKEY_Type *)base)->CTRL_0 = ctrl0; + + /* CTRL1 */ + uint32_t ctrl1 = ((GLIKEY_Type *)base)->CTRL_1; + /* Clear CTRL1.WR_EN_1 */ + ctrl1 &= ~GLIKEY_CTRL_1_WR_EN_1_MASK; + ((GLIKEY_Type*)base)->CTRL_1 = ctrl1; + + return kStatus_Success; +} + +status_t GLIKEY_ContinueEnable(GLIKEY_Type *base, uint32_t codeword) +{ + /* Check if Glikey SFR locked */ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + /* Set correctly we_en0 and wr_en1 according to codeword */ + /* Select between CTRL0/CTRL1 */ + if (WR_EN1 == (codeword >> CTRL_SEL_CODEWORD_SHIFT)) + { + Glikey_Internal_Set_WR_1(base, codeword >> WR_EN1_VALUE_SHIFT); + } + else if (WR_EN0 == (codeword >> CTRL_SEL_CODEWORD_SHIFT)) + { + Glikey_Internal_Set_WR_0(base, codeword >> WR_EN0_VALUE_SHIFT); + } + else + { + return kStatus_Fail; + } + + if (0u != (GLIKEY_GetStatus(base) & GLIKEY_STATUS_ERROR_STATUS_MASK)) + { + return kStatus_GLIKEY_DisabledError; + } + + /* Validate codeword - check if XXYZ^UUVW == 0xFFFF */ + if (0xFFFFu != (((codeword) ^ (codeword >> 16u)) & 0xFFFFu)) + { + return kStatus_Fail; + } + + return kStatus_Success; +} + +status_t GLIKEY_EndOperation(GLIKEY_Type *base) +{ + /* Check if Glikey SFR locked */ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + // check state + uint32_t state = (GLIKEY_GetStatus(base) & GLIKEY_STATUS_FSM_STATE_MASK) >> GLIKEY_STATUS_FSM_STATE_SHIFT; + + switch (state) + { + case GLIKEY_FSM_LOCKED: + { + /* If locked -> try to go to init with wr_en0 = WR_0_INIT (0x02); wr_en1 = WR_1_INIT (0x00) */ + Glikey_Internal_Set_WR_0(base, WR_0_INIT); + Glikey_Internal_Set_WR_1(base, WR_1_INIT); + + /* if still locked return locked - need to change index */ + if (GLIKEY_FSM_LOCKED == + (GLIKEY_GetStatus(base) & GLIKEY_STATUS_FSM_STATE_MASK) >> GLIKEY_STATUS_FSM_STATE_SHIFT) + { + return kStatus_GLIKEY_Locked; + } + + retCode = kStatus_Success; + break; + } + + case GLIKEY_FSM_SSR_RESET: + case GLIKEY_FSM_WR_EN: + { + /* If FSM in RESET -> wr_en0 = WR_0_INIT; wr_en1 = WR_1_INIT */ + /* If FSM in WR_EN -> wr_en0 = WR_0_INIT; wr_en1 = WR_1_INIT */ + Glikey_Internal_Set_WR_0(base, WR_0_INIT); + Glikey_Internal_Set_WR_1(base, WR_1_INIT); + + retCode = kStatus_Success; + break; + } + + default: + /* Disabled error */ + retCode = kStatus_GLIKEY_DisabledError; + break; + } + + return retCode; +} + +status_t GLIKEY_ResetIndex(GLIKEY_Type *base, uint32_t index) +{ + /* Check if Glikey SFR locked */ + status_t retCode = GLIKEY_CheckLock(base); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + /* Check if index is locked */ + retCode = GLIKEY_IsIndexLocked(base, index); + if (kStatus_GLIKEY_NotLocked != retCode) + { + return retCode; + } + + /* Check if FSM is in INIT state */ + uint32_t state = (GLIKEY_GetStatus(base) & GLIKEY_STATUS_FSM_STATE_MASK) >> GLIKEY_STATUS_FSM_STATE_SHIFT; + if (GLIKEY_FSM_INIT == state) + { + /* CTRL0.WRITE_INDEX = index */ + uint32_t ctrl0 = ((GLIKEY_Type *)base)->CTRL_0; + /* Clear index */ + ctrl0 = ctrl0 & (~GLIKEY_CTRL_0_WRITE_INDEX_MASK); + /* Write new value */ + ((GLIKEY_Type *)base)->CTRL_0 = ctrl0 | GLIKEY_CTRL_0_WRITE_INDEX(index); + + return kStatus_Success; + } + else + { + return kStatus_GLIKEY_DisabledError; + } +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_glikey.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_glikey.h new file mode 100644 index 00000000000..795d6d56ce9 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_glikey.h @@ -0,0 +1,311 @@ +/* + * Copyright 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_GLIKEY_H_ +#define _FSL_GLIKEY_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup GLIKEY + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + *******************************************************************************/ + +/*! @name Driver version */ +/*@{*/ +/*! @brief Defines GLIKEY driver version 2.0.0. + * + * Change log: + * - Version 2.0.0 + * - Initial version + */ +#define FSL_GLIKEY_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) + +enum +{ + kStatus_GLIKEY_LockedError = + MAKE_STATUS(kStatusGroup_GLIKEY, 0x1u), /*!< GLIKEY status for locked SFR registers (unexpected) . */ + kStatus_GLIKEY_NotLocked = MAKE_STATUS(kStatusGroup_GLIKEY, 0x2u), /*!< GLIKEY status for unlocked SFR registers. */ + kStatus_GLIKEY_Locked = MAKE_STATUS(kStatusGroup_GLIKEY, 0x3u), /*!< GLIKEY status for locked SFR registers. */ + kStatus_GLIKEY_DisabledError = MAKE_STATUS(kStatusGroup_GLIKEY, 0x4u), /*!< GLIKEY status for disabled error. */ +}; + +/* [Design] + Value: XX YZ UU VW + - XX: F0: write to WR_EN1, 0F: do not write to WR_EN1 + - UU: F0: write to WR_EN0, 0F: do not write to WR_EN0 + - Y: equal to ^ W + - Z: value to write to WR_EN1 or equal to ~W + - V: equal to ^ Z + - W: value to write to WR_EN0 or equal to ~Z + Invariant: XXYZ ^ UUVW == 0xFFFF +*/ +#define GLIKEY_CODEWORD_STEP1 ((uint32_t)0xF0C10F3EU) /*< Codeword for transition from STEP1 --> STEP2 */ +#define GLIKEY_CODEWORD_STEP2 ((uint32_t)0x0F1DF0E2U) /*< Codeword for transition from STEP2 --> STEP3 */ +#define GLIKEY_CODEWORD_STEP3 ((uint32_t)0xF0B00F4FU) /*< Codeword for transition from STEP3 --> STEP4 */ +#define GLIKEY_CODEWORD_STEP4 ((uint32_t)0x0F4EF0B1U) /*< Codeword for transition from STEP4 --> STEP5 */ +#define GLIKEY_CODEWORD_STEP5 ((uint32_t)0xF0810F7EU) /*< Codeword for transition from STEP5 --> STEP6 */ +#define GLIKEY_CODEWORD_STEP6 ((uint32_t)0x0F5DF0A2U) /*< Codeword for transition from STEP6 --> STEP7 */ +#define GLIKEY_CODEWORD_STEP7 ((uint32_t)0xF0700F8FU) /*< Codeword for transition from STEP7 --> STEP8 */ +#define GLIKEY_CODEWORD_STEP_EN ((uint32_t)0x0FFFF000U) /*< Codeword for transition from STEP 4/8 --> WR_EN */ + +#define GLIKEY_FSM_WR_DIS 0x0Bu +#define GLIKEY_FSM_INIT 0x16u +#define GLIKEY_FSM_STEP1 0x2Cu +#define GLIKEY_FSM_STEP2 0x58u +#define GLIKEY_FSM_STEP3 0xB0u +#define GLIKEY_FSM_STEP4 0x160u +#define GLIKEY_FSM_LOCKED 0xC01u +#define GLIKEY_FSM_WR_EN 0x1802u +#define GLIKEY_FSM_SSR_RESET 0x1005u + +/*@}*/ + +/******************************************************************************* + * API + *******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*! + * @name GLIKEY Functional Operation + * @{ + */ + +/*! + * @brief Retreives the current status of Glikey. + * + * @param[in] base The base address of the Glikey instance + * + * @return Glikey status information + */ +uint32_t GLIKEY_GetStatus(GLIKEY_Type *base); + +/*! + * @brief Get if Glikey is locked + * + * This operation returns the locking status of Glikey. + * + * @return Status + * @retval kStatus_GLIKEY_Locked if locked + * @retval kStatus_GLIKEY_NotLocked if unlocked + */ +status_t GLIKEY_IsLocked(GLIKEY_Type *base); + +/*! + * @brief Check if Glikey is locked + * + * This operation returns the locking status of Glikey. + * + * @return Status kStatus_Success if success + * @retval kStatus_GLIKEY_LockedError if locked + * @retval kStatus_GLIKEY_NotLocked if unlocked + */ +status_t GLIKEY_CheckLock(GLIKEY_Type *base); + +/*! + * @brief Retreives the version and configuration of Glikey. + * + * + * @param[in] base The base address of the Glikey instance + * @param[out] result Pointer which will be filled with the Glikey hardware version + * + * @return Status kStatus_Success if success + */ +status_t GLIKEY_GetVersion(GLIKEY_Type *base, uint32_t *result); + +/*! + * @brief Perform a synchronous reset of Glikey. + * + * This function performs a synchrounous reset of the Glikey. This results in: + * - Glikey will return to the INIT state, unless it is in the LOCK state + * + * @param[in] base The base address of the Glikey instance + * + * @return Status kStatus_Success if success + * Possible errors: kStatus_GLIKEY_LockedError + */ +status_t GLIKEY_SyncReset(GLIKEY_Type *base); + +/*! + * @brief Set interrupt enable flag of Glikey. + * + * @param[in] base The base address of the Glikey instance + * @param[in] value Value to set the interrupt enable flag to, see #[TODO: add reference to constants] + * + * @return Status kStatus_Success if success + * Possible errors: kStatus_GLIKEY_LockedError + */ +status_t GLIKEY_SetIntEnable(GLIKEY_Type *base, uint32_t value); + +/*! + * @brief Get interrupt enable flag of Glikey. + * + * @param[in] base The base address of the Glikey instance + * @param[out] value Pointer which will be filled with the interrupt enable status, see #[TODO: add reference to + * constants] + * + * @return Status kStatus_Success if success + */ +status_t GLIKEY_GetIntEnable(GLIKEY_Type *base, uint32_t *value); + +/*! + * @brief Clear the interrupt status flag of Glikey. + * + * @param[in] base The base address of the Glikey instance + * + * @return Status kStatus_Success if success + * Possible errors: kStatus_GLIKEY_LockedError + */ +status_t GLIKEY_ClearIntStatus(GLIKEY_Type *base); + +/*! + * @brief Set the interrupt status flag of Glikey. + * + * @param[in] base The base address of the Glikey instance + * + * @return Status kStatus_Success if success + * Possible errors: kStatus_GLIKEY_LockedError + */ +status_t GLIKEY_SetIntStatus(GLIKEY_Type *base); + +/*! + * @brief Lock Glikey SFR (Special Function Registers) interface + * + * This operation locks the Glikey SFR interface if it is not locked yet. + * + * @param[in] base The base address of the Glikey instance + * + * @return Status kStatus_Success if success + */ +status_t GLIKEY_Lock(GLIKEY_Type *base); + +/*! + * @brief Lock Glikey index + * + * This operation is used to lock a Glikey index. It can only be executed from the WR_EN state, + * executing it from any other state will result in Glikey entering WR_DIS state. When this happens + * Glikey requires a reset (synchrous or asynchronous) to go back to INIT state. + * If the Glikey SFR lock is active this operation will return an error. + * + * @param[in] base The base address of the Glikey instance + * + * @return Status kStatus_Success if success + * Possible errors: kStatus_GLIKEY_LockedError, kStatus_GLIKEY_DisabledError + */ +status_t GLIKEY_LockIndex(GLIKEY_Type *base); + +/*! + * @brief Check if Glikey index is locked + * + * This operation returns the locking status of Glikey index. + * + * @param[in] base The base address of the Glikey instance + * @param[in] index The index of the Glikey instance + * + * @return kStatus_GLIKEY_Locked if locked, kStatus_GLIKEY_NotLocked if unlocked + * Possible errors: kStatus_Fail + */ +status_t GLIKEY_IsIndexLocked(GLIKEY_Type *base, uint32_t index); + +/** + * @brief Start Glikey enable + * + * This operation is used to set a new index and start a the sequence to enable it. It needs to be + * started from the INIT state. If the new index is already locked Glikey will go to LOCKED state, + * otherwise it will go to STEP1 state. + * If this operation is used when Glikey is in any state other than INIT Glikey will go to WR_DIS + * state. It can only recover from this state through a reset (synchrounous or asyncrhonous). + * If the Glikey SFR lock is active this operation will return an error. + * + * @param[in] base The base address of the Glikey instance + * @param[in] index The index of the Glikey instance + * + * @return Status kStatus_Success if success + * Possible errors: kStatus_GLIKEY_LockedError, kStatus_Fail + */ +status_t GLIKEY_StartEnable(GLIKEY_Type *base, uint32_t index); + +/** + * @brief Continue Glikey enable + * + * This operation is used to progress through the different states of the state machine, starting + * from STEP1 until the state WR_EN is reached. Each next state of the state machine can only be + * reached by providing the right codeword to this function. If anything goes wrong the state machine + * will go to WR_DIS state and can only recover from it through a reset (synchrous or asynchronous). + * If the Glikey SFR lock is active this operation will return an error. + * + * @param[in] base The base address of the Glikey instance + * @param[in] codeword Encoded word for progressing to next FSM state (see GLIKEY_CODEWORD_STEPx/EN) + * + * @return Status kStatus_Success if success + * Possible errors: kStatus_GLIKEY_LockedError, kStatus_Fail, kStatus_GLIKEY_DisabledError + */ +/* [Design] + - Check if Glikey is locked + if ( GLIKEY_LOCKED == GLIKEY_GET_SFR_LOCK(base) ) return NXPCLGLIKEY_STATUS_LOCKED_ERROR + - Decode the codeword and write to Glikey CTRL[] + Write GLIKEY_CTRL(base, EnableSelect, EnableValue) + - Check if an error occured + - the only possible error here is FSM error which results in a transition to WR_DIS state + - alternatively this can be confirmed by checking FSM state value + - Only now we will check if the codeword itself is valid + - this is done in this order to assure that the state machine reaches WR_DIS state when needed + - check if XXYZ^UUVW == 0xFFFF and return kStatus_Fail when it fails + - Return kStatus_Success +*/ +status_t GLIKEY_ContinueEnable(GLIKEY_Type *base, uint32_t codeword); + +/** + * @brief End Glikey operation + * + * This operation is used to end a Glikey operation. It can only be executed from the WR_EN, LOCKED + * and RESET states. Executing it from any other state will result in Glikey entering WR_DIS state. + * When this happens Glikey requires a reset (synchrous or asynchronous) to go back to INIT state. + * After this operation Glikey will go to INIT state or stay in LOCKED state when the index was locked. + * If the Glikey SFR lock is active this operation will return an error. + * + * @return A code-flow protected error code (see @ref nxpCsslFlowProtection) + * + * @param[in] base The base address of the Glikey instance + * + * @return Status kStatus_Success if success, kStatus_GLIKEY_Locked if index is still locked + * Possible errors: kStatus_GLIKEY_LockedError, kStatus_GLIKEY_DisabledError + */ +status_t GLIKEY_EndOperation(GLIKEY_Type *base); + +/** + * @brief Reset Glikey index + * + * This operation is used to reset a Glikey index. It can only be executed from the INIT state, + * executing it from any other state will result in Glikey entering WR_DIS state. When this happens + * Glikey requires a reset (synchrous or asynchronous) to go back to INIT state. + * If the Glikey SFR lock is active or the index is locked this operation will return an error. + * + * @return A code-flow protected error code (see @ref nxpCsslFlowProtection) + * + * @return Status kStatus_Success if success, kStatus_GLIKEY_Locked if index is still locked + * Possible errors: kStatus_GLIKEY_LockedError, kStatus_GLIKEY_DisabledError + */ +status_t GLIKEY_ResetIndex(GLIKEY_Type *base, uint32_t index); + +/*! @}*/ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @}*/ /* end of group glikey */ + +#endif /* _FSL_GLIKEY_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_gpio.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_gpio.c new file mode 100644 index 00000000000..3e32730d1cd --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_gpio.c @@ -0,0 +1,444 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2019, 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.gpio" +#endif + +#if defined(GPIO_RSTS) +#define GPIO_RESETS_ARRAY GPIO_RSTS +#endif + +/******************************************************************************* + * Variables + ******************************************************************************/ + +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +static PORT_Type *const s_portBases[] = PORT_BASE_PTRS; +static GPIO_Type *const s_gpioBases[] = GPIO_BASE_PTRS; +#else +#if defined(GPIO_RESETS_ARRAY) +static GPIO_Type *const s_gpioBases[] = GPIO_BASE_PTRS; +#endif +#endif + +#if defined(FSL_FEATURE_SOC_FGPIO_COUNT) && FSL_FEATURE_SOC_FGPIO_COUNT + +#if defined(FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL) && FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Array to map FGPIO instance number to clock name. */ +static const clock_ip_name_t s_fgpioClockName[] = FGPIO_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#endif /* FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL */ + +#endif /* FSL_FEATURE_SOC_FGPIO_COUNT */ + +#if defined(GPIO_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_gpioResets[] = GPIO_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +/*! + * @brief Gets the GPIO instance according to the GPIO base + * + * @param base GPIO peripheral base pointer(PTA, PTB, PTC, etc.) + * @retval GPIO instance + */ +static uint32_t GPIO_GetInstance(GPIO_Type *base); +#endif +/******************************************************************************* + * Code + ******************************************************************************/ +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) || defined(GPIO_RESETS_ARRAY) +static uint32_t GPIO_GetInstance(GPIO_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_gpioBases); instance++) + { + if (s_gpioBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_gpioBases)); + + return instance; +} +#endif +/*! + * brief Initializes a GPIO pin used by the board. + * + * To initialize the GPIO, define a pin configuration, as either input or output, in the user file. + * Then, call the GPIO_PinInit() function. + * + * This is an example to define an input pin or an output pin configuration. + * code + * Define a digital input pin configuration, + * gpio_pin_config_t config = + * { + * kGPIO_DigitalInput, + * 0, + * } + * Define a digital output pin configuration, + * gpio_pin_config_t config = + * { + * kGPIO_DigitalOutput, + * 0, + * } + * endcode + * + * param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * param pin GPIO port pin number + * param config GPIO pin configuration pointer + */ +void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config) +{ + assert(NULL != config); + +#if defined(GPIO_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_gpioResets[GPIO_GetInstance(base)]); +#endif + + if (config->pinDirection == kGPIO_DigitalInput) + { + base->PDDR &= GPIO_FIT_REG(~(1UL << pin)); + } + else + { + GPIO_PinWrite(base, pin, config->outputLogic); + base->PDDR |= GPIO_FIT_REG((1UL << pin)); + } +} + +#if defined(FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER) && FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER +void GPIO_GetVersionInfo(GPIO_Type *base, gpio_version_info_t *info) +{ + info->feature = (uint16_t)base->VERID; + info->minor = (uint8_t)(base->VERID >> GPIO_VERID_MINOR_SHIFT); + info->major = (uint8_t)(base->VERID >> GPIO_VERID_MAJOR_SHIFT); +} +#endif /* FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER */ + +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +/*! + * brief Reads the GPIO port interrupt status flag. + * + * If a pin is configured to generate the DMA request, the corresponding flag + * is cleared automatically at the completion of the requested DMA transfer. + * Otherwise, the flag remains set until a logic one is written to that flag. + * If configured for a level sensitive interrupt that remains asserted, the flag + * is set again immediately. + * + * param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * retval The current GPIO port interrupt status flag, for example, 0x00010001 means the + * pin 0 and 17 have the interrupt. + */ +uint32_t GPIO_PortGetInterruptFlags(GPIO_Type *base) +{ + uint8_t instance; + PORT_Type *portBase; + instance = (uint8_t)GPIO_GetInstance(base); + portBase = s_portBases[instance]; + return portBase->ISFR; +} +#else +/*! + * brief Read the GPIO interrupt status flags. + * + * param base GPIO peripheral base pointer. (GPIOA, GPIOB, GPIOC, and so on.) + * return The current GPIO's interrupt status flag. + * '1' means the related pin's flag is set, '0' means the related pin's flag not set. + * For example, the return value 0x00010001 means the pin 0 and 17 have the interrupt pending. + */ +uint32_t GPIO_GpioGetInterruptFlags(GPIO_Type *base) +{ + return base->ISFR[0]; +} +#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) +/*! + * brief Read the GPIO interrupt status flags based on selected interrupt channel(IRQS). + * param base GPIO peripheral base pointer. (GPIOA, GPIOB, GPIOC, and so on.) + * param channel '0' means selete interrupt channel 0, '1' means selete interrupt channel 1. + * + * return The current GPIO's interrupt status flag based on the selected interrupt channel. + * '1' means the related pin's flag is set, '0' means the related pin's flag not set. + * For example, the return value 0x00010001 means the pin 0 and 17 have the interrupt pending. + */ +uint32_t GPIO_GpioGetInterruptChannelFlags(GPIO_Type *base, uint32_t channel) +{ + assert(channel < 2U); + return base->ISFR[channel]; +} +#endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT */ +/*! + * brief Read individual pin's interrupt status flag. + * + * param base GPIO peripheral base pointer. (GPIOA, GPIOB, GPIOC, and so on) + * param pin GPIO specific pin number. + * return The current selected pin's interrupt status flag. + */ +uint8_t GPIO_PinGetInterruptFlag(GPIO_Type *base, uint32_t pin) +{ + return (uint8_t)((base->ICR[pin] & GPIO_ICR_ISF_MASK) >> GPIO_ICR_ISF_SHIFT); +} +#endif /* FSL_FEATURE_PORT_HAS_NO_INTERRUPT */ + +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +/*! + * brief Clears multiple GPIO pin interrupt status flags. + * + * param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * param mask GPIO pin number macro + */ +void GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t mask) +{ + uint8_t instance; + PORT_Type *portBase; + instance = (uint8_t)GPIO_GetInstance(base); + portBase = s_portBases[instance]; + portBase->ISFR = mask; +} +#else +/*! + * brief Clears GPIO pin interrupt status flags. + * + * param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * param mask GPIO pin number macro + */ +void GPIO_GpioClearInterruptFlags(GPIO_Type *base, uint32_t mask) +{ + base->ISFR[0] = GPIO_FIT_REG(mask); +} +#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) +/*! + * brief Clears GPIO pin interrupt status flags based on selected interrupt channel(IRQS). + * + * param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * param mask GPIO pin number macro + * param channel '0' means selete interrupt channel 0, '1' means selete interrupt channel 1. + */ +void GPIO_GpioClearInterruptChannelFlags(GPIO_Type *base, uint32_t mask, uint32_t channel) +{ + assert(channel < 2U); + base->ISFR[channel] = GPIO_FIT_REG(mask); +} +#endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT */ +/*! + * brief Clear GPIO individual pin's interrupt status flag. + * + * param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on). + * param pin GPIO specific pin number. + */ +void GPIO_PinClearInterruptFlag(GPIO_Type *base, uint32_t pin) +{ + base->ICR[pin] |= GPIO_FIT_REG(GPIO_ICR_ISF(1U)); +} +#endif /* FSL_FEATURE_PORT_HAS_NO_INTERRUPT */ + +#if defined(FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER +/*! + * brief The GPIO module supports a device-specific number of data ports, organized as 32-bit + * words/8-bit Bytes. Each 32-bit/8-bit data port includes a GACR register, which defines the byte-level + * attributes required for a successful access to the GPIO programming model. If the GPIO module's GACR register + * organized as 32-bit words, the attribute controls for the 4 data bytes in the GACR follow a standard little + * endian data convention. + * + * param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * param attribute GPIO checker attribute + */ +void GPIO_CheckAttributeBytes(GPIO_Type *base, gpio_checker_attribute_t attribute) +{ +#if defined(FSL_FEATURE_GPIO_REGISTERS_WIDTH) && (FSL_FEATURE_GPIO_REGISTERS_WIDTH == 8U) + base->GACR = ((uint8_t)attribute << GPIO_GACR_ACB_SHIFT); +#else + base->GACR = ((uint32_t)attribute << GPIO_GACR_ACB0_SHIFT) | ((uint32_t)attribute << GPIO_GACR_ACB1_SHIFT) | + ((uint32_t)attribute << GPIO_GACR_ACB2_SHIFT) | ((uint32_t)attribute << GPIO_GACR_ACB3_SHIFT); +#endif /* FSL_FEATURE_GPIO_REGISTERS_WIDTH */ +} +#endif + +#if defined(FSL_FEATURE_SOC_FGPIO_COUNT) && FSL_FEATURE_SOC_FGPIO_COUNT + +/******************************************************************************* + * Variables + ******************************************************************************/ +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +static FGPIO_Type *const s_fgpioBases[] = FGPIO_BASE_PTRS; +#endif +/******************************************************************************* + * Prototypes + ******************************************************************************/ +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +/*! + * @brief Gets the FGPIO instance according to the GPIO base + * + * @param base FGPIO peripheral base pointer(PTA, PTB, PTC, etc.) + * @retval FGPIO instance + */ +static uint32_t FGPIO_GetInstance(FGPIO_Type *base); +#endif +/******************************************************************************* + * Code + ******************************************************************************/ +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +static uint32_t FGPIO_GetInstance(FGPIO_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_fgpioBases); instance++) + { + if (s_fgpioBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_fgpioBases)); + + return instance; +} +#endif +#if defined(FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL) && FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL +/*! + * brief Initializes the FGPIO peripheral. + * + * This function ungates the FGPIO clock. + * + * param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + */ +void FGPIO_PortInit(FGPIO_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate FGPIO periphral clock */ + CLOCK_EnableClock(s_fgpioClockName[FGPIO_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} +#endif /* FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL */ + +/*! + * brief Initializes a FGPIO pin used by the board. + * + * To initialize the FGPIO driver, define a pin configuration, as either input or output, in the user file. + * Then, call the FGPIO_PinInit() function. + * + * This is an example to define an input pin or an output pin configuration: + * code + * Define a digital input pin configuration, + * gpio_pin_config_t config = + * { + * kGPIO_DigitalInput, + * 0, + * } + * Define a digital output pin configuration, + * gpio_pin_config_t config = + * { + * kGPIO_DigitalOutput, + * 0, + * } + * endcode + * + * param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * param pin FGPIO port pin number + * param config FGPIO pin configuration pointer + */ +void FGPIO_PinInit(FGPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config) +{ + assert(NULL != config); + + if (config->pinDirection == kGPIO_DigitalInput) + { + base->PDDR &= ~(1UL << pin); + } + else + { + FGPIO_PinWrite(base, pin, config->outputLogic); + base->PDDR |= (1UL << pin); + } +} +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +/*! + * brief Reads the FGPIO port interrupt status flag. + * + * If a pin is configured to generate the DMA request, the corresponding flag + * is cleared automatically at the completion of the requested DMA transfer. + * Otherwise, the flag remains set until a logic one is written to that flag. + * If configured for a level-sensitive interrupt that remains asserted, the flag + * is set again immediately. + * + * param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * retval The current FGPIO port interrupt status flags, for example, 0x00010001 means the + * pin 0 and 17 have the interrupt. + */ +uint32_t FGPIO_PortGetInterruptFlags(FGPIO_Type *base) +{ + uint8_t instance; + instance = (uint8_t)FGPIO_GetInstance(base); + PORT_Type *portBase; + portBase = s_portBases[instance]; + return portBase->ISFR; +} + +/*! + * brief Clears the multiple FGPIO pin interrupt status flag. + * + * param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * param mask FGPIO pin number macro + */ +void FGPIO_PortClearInterruptFlags(FGPIO_Type *base, uint32_t mask) +{ + uint8_t instance; + instance = (uint8_t)FGPIO_GetInstance(base); + PORT_Type *portBase; + portBase = s_portBases[instance]; + portBase->ISFR = mask; +} +#endif +#if defined(FSL_FEATURE_FGPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_FGPIO_HAS_ATTRIBUTE_CHECKER +/*! + * brief The FGPIO module supports a device-specific number of data ports, organized as 32-bit + * words. Each 32-bit data port includes a GACR register, which defines the byte-level + * attributes required for a successful access to the GPIO programming model. The attribute controls for the 4 data + * bytes in the GACR follow a standard little endian + * data convention. + * + * param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * param attribute FGPIO checker attribute + */ +void FGPIO_CheckAttributeBytes(FGPIO_Type *base, gpio_checker_attribute_t attribute) +{ + base->GACR = ((uint32_t)attribute << FGPIO_GACR_ACB0_SHIFT) | ((uint32_t)attribute << FGPIO_GACR_ACB1_SHIFT) | + ((uint32_t)attribute << FGPIO_GACR_ACB2_SHIFT) | ((uint32_t)attribute << FGPIO_GACR_ACB3_SHIFT); +} +#endif + +#endif /* FSL_FEATURE_SOC_FGPIO_COUNT */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_gpio.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_gpio.h new file mode 100644 index 00000000000..a91fa403efd --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_gpio.h @@ -0,0 +1,799 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_GPIO_H_ +#define FSL_GPIO_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup gpio + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief GPIO driver version. */ +#define FSL_GPIO_DRIVER_VERSION (MAKE_VERSION(2, 7, 3)) +/*! @} */ + +#if defined(FSL_FEATURE_GPIO_REGISTERS_WIDTH) && (FSL_FEATURE_GPIO_REGISTERS_WIDTH == 8U) +#define GPIO_FIT_REG(value) \ + ((uint8_t)(value)) /*!< For some platforms with 8-bit register width, cast the type to uint8_t */ +#else +#define GPIO_FIT_REG(value) ((uint32_t)(value)) +#endif /*FSL_FEATURE_GPIO_REGISTERS_WIDTH*/ + +/*! @brief GPIO direction definition */ +typedef enum _gpio_pin_direction +{ + kGPIO_DigitalInput = 0U, /*!< Set current pin as digital input*/ + kGPIO_DigitalOutput = 1U, /*!< Set current pin as digital output*/ +} gpio_pin_direction_t; + +#if defined(FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER +/*! @brief GPIO checker attribute */ +typedef enum _gpio_checker_attribute +{ + kGPIO_UsernonsecureRWUsersecureRWPrivilegedsecureRW = + 0x00U, /*!< User nonsecure:Read+Write; User Secure:Read+Write; Privileged Secure:Read+Write */ + kGPIO_UsernonsecureRUsersecureRWPrivilegedsecureRW = + 0x01U, /*!< User nonsecure:Read; User Secure:Read+Write; Privileged Secure:Read+Write */ + kGPIO_UsernonsecureNUsersecureRWPrivilegedsecureRW = + 0x02U, /*!< User nonsecure:None; User Secure:Read+Write; Privileged Secure:Read+Write */ + kGPIO_UsernonsecureRUsersecureRPrivilegedsecureRW = + 0x03U, /*!< User nonsecure:Read; User Secure:Read; Privileged Secure:Read+Write */ + kGPIO_UsernonsecureNUsersecureRPrivilegedsecureRW = + 0x04U, /*!< User nonsecure:None; User Secure:Read; Privileged Secure:Read+Write */ + kGPIO_UsernonsecureNUsersecureNPrivilegedsecureRW = + 0x05U, /*!< User nonsecure:None; User Secure:None; Privileged Secure:Read+Write */ + kGPIO_UsernonsecureNUsersecureNPrivilegedsecureR = + 0x06U, /*!< User nonsecure:None; User Secure:None; Privileged Secure:Read */ + kGPIO_UsernonsecureNUsersecureNPrivilegedsecureN = + 0x07U, /*!< User nonsecure:None; User Secure:None; Privileged Secure:None */ + kGPIO_IgnoreAttributeCheck = 0x80U, /*!< Ignores the attribute check */ +} gpio_checker_attribute_t; +#endif + +/*! + * @brief The GPIO pin configuration structure. + * + * Each pin can only be configured as either an output pin or an input pin at a time. + * If configured as an input pin, leave the outputConfig unused. + * Note that in some use cases, the corresponding port property should be configured in advance + * with the PORT_SetPinConfig(). + */ +typedef struct _gpio_pin_config +{ + gpio_pin_direction_t pinDirection; /*!< GPIO direction, input or output */ + /* Output configurations; ignore if configured as an input pin */ + uint8_t outputLogic; /*!< Set a default output logic, which has no use in input */ +} gpio_pin_config_t; + +#if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \ + !(defined(FSL_FEATURE_SOC_PORT_COUNT)) +/*! @brief Configures the interrupt generation condition. */ +typedef enum _gpio_interrupt_config +{ + kGPIO_InterruptStatusFlagDisabled = 0x0U, /*!< Interrupt status flag is disabled. */ + kGPIO_DMARisingEdge = 0x1U, /*!< ISF flag and DMA request on rising edge. */ + kGPIO_DMAFallingEdge = 0x2U, /*!< ISF flag and DMA request on falling edge. */ + kGPIO_DMAEitherEdge = 0x3U, /*!< ISF flag and DMA request on either edge. */ + kGPIO_FlagRisingEdge = 0x05U, /*!< Flag sets on rising edge. */ + kGPIO_FlagFallingEdge = 0x06U, /*!< Flag sets on falling edge. */ + kGPIO_FlagEitherEdge = 0x07U, /*!< Flag sets on either edge. */ + kGPIO_InterruptLogicZero = 0x8U, /*!< Interrupt when logic zero. */ + kGPIO_InterruptRisingEdge = 0x9U, /*!< Interrupt on rising edge. */ + kGPIO_InterruptFallingEdge = 0xAU, /*!< Interrupt on falling edge. */ + kGPIO_InterruptEitherEdge = 0xBU, /*!< Interrupt on either edge. */ + kGPIO_InterruptLogicOne = 0xCU, /*!< Interrupt when logic one. */ + kGPIO_ActiveHighTriggerOutputEnable = 0xDU, /*!< Enable active high-trigger output. */ + kGPIO_ActiveLowTriggerOutputEnable = 0xEU, /*!< Enable active low-trigger output. */ +} gpio_interrupt_config_t; +#endif + +#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) +/*! @brief Configures the selection of interrupt/DMA request/trigger output. */ +typedef enum _gpio_interrupt_selection +{ + kGPIO_InterruptOutput0 = 0x0U, /*!< Interrupt/DMA request/trigger output 0. */ + kGPIO_InterruptOutput1 = 0x1U, /*!< Interrupt/DMA request/trigger output 1. */ +} gpio_interrupt_selection_t; +#endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT */ + +#if defined(FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER) && FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER +/*! @brief GPIO version information. */ +typedef struct _gpio_version_info +{ + uint16_t feature; /*!< Feature Specification Number. */ + uint8_t minor; /*!< Minor Version Number. */ + uint8_t major; /*!< Major Version Number. */ +} gpio_version_info_t; +#endif /* FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER */ + +#if defined(FSL_FEATURE_GPIO_HAS_SECURE_PRIVILEGE_CONTROL) && FSL_FEATURE_GPIO_HAS_SECURE_PRIVILEGE_CONTROL +/*! @brief GPIO pin and interrupt control. */ +typedef enum +{ + kGPIO_PinControlNonSecure = 0x01U, /*!< Pin Control Non-Secure. */ + kGPIO_InterruptControlNonSecure = 0x02U, /*!< Interrupt Control Non-Secure. */ + kGPIO_PinControlNonPrivilege = 0x04U, /*!< Pin Control Non-Privilege. */ + kGPIO_InterruptControlNonPrivilege = 0x08U, /*!< Interrupt Control Non-Privilege. */ +} gpio_pin_interrupt_control_t; +#endif /* FSL_FEATURE_GPIO_HAS_SECURE_PRIVILEGE_CONTROL */ + +/*! @} */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @addtogroup gpio_driver + * @{ + */ + +/*! @name GPIO Configuration */ +/*! @{ */ + +/*! + * @brief Initializes a GPIO pin used by the board. + * + * To initialize the GPIO, define a pin configuration, as either input or output, in the user file. + * Then, call the GPIO_PinInit() function. + * + * This is an example to define an input pin or an output pin configuration. + * @code + * Define a digital input pin configuration, + * gpio_pin_config_t config = + * { + * kGPIO_DigitalInput, + * 0, + * } + * Define a digital output pin configuration, + * gpio_pin_config_t config = + * { + * kGPIO_DigitalOutput, + * 0, + * } + * @endcode + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param pin GPIO port pin number + * @param config GPIO pin configuration pointer + */ +void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config); + +#if defined(FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER) && FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER +/*! + * @brief Get GPIO version information. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param info GPIO version information + */ +void GPIO_GetVersionInfo(GPIO_Type *base, gpio_version_info_t *info); +#endif /* FSL_FEATURE_GPIO_HAS_VERSION_INFO_REGISTER */ + +#if defined(FSL_FEATURE_GPIO_HAS_SECURE_PRIVILEGE_CONTROL) && FSL_FEATURE_GPIO_HAS_SECURE_PRIVILEGE_CONTROL +/*! + * @brief lock or unlock secure privilege. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask pin or interrupt macro + */ +static inline void GPIO_SecurePrivilegeLock(GPIO_Type *base, gpio_pin_interrupt_control_t mask) +{ + base->LOCK |= GPIO_FIT_REG(mask); +} + +/*! + * @brief Enable Pin Control Non-Secure. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_EnablePinControlNonSecure(GPIO_Type *base, uint32_t mask) +{ + base->PCNS |= GPIO_FIT_REG(mask); +} + +/*! + * @brief Disable Pin Control Non-Secure. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_DisablePinControlNonSecure(GPIO_Type *base, uint32_t mask) +{ + base->PCNS &= GPIO_FIT_REG(~mask); +} + +/*! + * @brief Enable Pin Control Non-Privilege. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_EnablePinControlNonPrivilege(GPIO_Type *base, uint32_t mask) +{ + base->PCNP |= GPIO_FIT_REG(mask); +} + +/*! + * @brief Disable Pin Control Non-Privilege. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_DisablePinControlNonPrivilege(GPIO_Type *base, uint32_t mask) +{ + base->PCNP &= GPIO_FIT_REG(~mask); +} + +/*! + * @brief Enable Interrupt Control Non-Secure. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_EnableInterruptControlNonSecure(GPIO_Type *base, uint32_t mask) +{ + base->ICNS |= GPIO_FIT_REG(mask); +} + +/*! + * @brief Disable Interrupt Control Non-Secure. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_DisableInterruptControlNonSecure(GPIO_Type *base, uint32_t mask) +{ + base->ICNS &= GPIO_FIT_REG(~mask); +} + +/*! + * @brief Enable Interrupt Control Non-Privilege. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_EnableInterruptControlNonPrivilege(GPIO_Type *base, uint32_t mask) +{ + base->ICNP |= GPIO_FIT_REG(mask); +} + +/*! + * @brief Disable Interrupt Control Non-Privilege. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_DisableInterruptControlNonPrivilege(GPIO_Type *base, uint32_t mask) +{ + base->ICNP &= GPIO_FIT_REG(~mask); +} +#endif /* FSL_FEATURE_GPIO_HAS_SECURE_PRIVILEGE_CONTROL */ + +#if defined(FSL_FEATURE_GPIO_HAS_PORT_INPUT_CONTROL) && FSL_FEATURE_GPIO_HAS_PORT_INPUT_CONTROL +/*! + * @brief Enable port input. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_PortInputEnable(GPIO_Type *base, uint32_t mask) +{ + base->PIDR &= GPIO_FIT_REG(~mask); +} + +/*! + * @brief Disable port input. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_PortInputDisable(GPIO_Type *base, uint32_t mask) +{ + base->PIDR |= GPIO_FIT_REG(mask); +} +#endif /* FSL_FEATURE_GPIO_HAS_PORT_INPUT_CONTROL */ + +/*! @} */ + +/*! @name GPIO Output Operations */ +/*! @{ */ + +/*! + * @brief Sets the output level of the multiple GPIO pins to the logic 1 or 0. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param pin GPIO pin number + * @param output GPIO pin output logic level. + * - 0: corresponding pin output low-logic level. + * - 1: corresponding pin output high-logic level. + */ +static inline void GPIO_PinWrite(GPIO_Type *base, uint32_t pin, uint8_t output) +{ +#if !(defined(FSL_FEATURE_GPIO_HAS_NO_INDEP_OUTPUT_CONTROL) && FSL_FEATURE_GPIO_HAS_NO_INDEP_OUTPUT_CONTROL) + if (output == 0U) + { + base->PCOR = GPIO_FIT_REG(1UL << pin); + } + else + { + base->PSOR = GPIO_FIT_REG(1UL << pin); + } +#else + if (output == 0U) + { + base->PDOR |= GPIO_FIT_REG(1UL << pin); + } + else + { + base->PDOR &= ~GPIO_FIT_REG(1UL << pin); + } +#endif +} + +/*! + * @brief Sets the output level of the multiple GPIO pins to the logic 1. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_PortSet(GPIO_Type *base, uint32_t mask) +{ +#if !(defined(FSL_FEATURE_GPIO_HAS_NO_INDEP_OUTPUT_CONTROL) && FSL_FEATURE_GPIO_HAS_NO_INDEP_OUTPUT_CONTROL) + base->PSOR = GPIO_FIT_REG(mask); +#else + base->PDOR |= GPIO_FIT_REG(mask); +#endif +} + +/*! + * @brief Sets the output level of the multiple GPIO pins to the logic 0. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_PortClear(GPIO_Type *base, uint32_t mask) +{ +#if !(defined(FSL_FEATURE_GPIO_HAS_NO_INDEP_OUTPUT_CONTROL) && FSL_FEATURE_GPIO_HAS_NO_INDEP_OUTPUT_CONTROL) + base->PCOR = GPIO_FIT_REG(mask); +#else + base->PDOR &= ~GPIO_FIT_REG(mask); +#endif +} + +/*! + * @brief Reverses the current output logic of the multiple GPIO pins. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +static inline void GPIO_PortToggle(GPIO_Type *base, uint32_t mask) +{ +#if !(defined(FSL_FEATURE_GPIO_HAS_NO_INDEP_OUTPUT_CONTROL) && FSL_FEATURE_GPIO_HAS_NO_INDEP_OUTPUT_CONTROL) + base->PTOR = GPIO_FIT_REG(mask); +#else + base->PDOR ^= GPIO_FIT_REG(mask); +#endif +} + +/*! @} */ + +/*! @name GPIO Input Operations */ +/*! @{ */ + +/*! + * @brief Reads the current input value of the GPIO port. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param pin GPIO pin number + * @retval GPIO port input value + * - 0: corresponding pin input low-logic level. + * - 1: corresponding pin input high-logic level. + */ +static inline uint32_t GPIO_PinRead(GPIO_Type *base, uint32_t pin) +{ + return (((uint32_t)(base->PDIR) >> pin) & 0x01UL); +} + +/*! @} */ + +/*! @name GPIO Interrupt */ +/*! @{ */ +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) +/*! + * @brief Reads the GPIO port interrupt status flag. + * + * If a pin is configured to generate the DMA request, the corresponding flag + * is cleared automatically at the completion of the requested DMA transfer. + * Otherwise, the flag remains set until a logic one is written to that flag. + * If configured for a level sensitive interrupt that remains asserted, the flag + * is set again immediately. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @retval The current GPIO port interrupt status flag, for example, 0x00010001 means the + * pin 0 and 17 have the interrupt. + */ +uint32_t GPIO_PortGetInterruptFlags(GPIO_Type *base); + +/*! + * @brief Clears multiple GPIO pin interrupt status flags. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +void GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t mask); +#else +/*! + * @brief Configures the gpio pin interrupt/DMA request. + * + * @param base GPIO peripheral base pointer. + * @param pin GPIO pin number. + * @param config GPIO pin interrupt configuration. + * - #kGPIO_InterruptStatusFlagDisabled: Interrupt/DMA request disabled. + * - #kGPIO_DMARisingEdge : DMA request on rising edge(if the DMA requests exit). + * - #kGPIO_DMAFallingEdge: DMA request on falling edge(if the DMA requests exit). + * - #kGPIO_DMAEitherEdge : DMA request on either edge(if the DMA requests exit). + * - #kGPIO_FlagRisingEdge : Flag sets on rising edge(if the Flag states exit). + * - #kGPIO_FlagFallingEdge : Flag sets on falling edge(if the Flag states exit). + * - #kGPIO_FlagEitherEdge : Flag sets on either edge(if the Flag states exit). + * - #kGPIO_InterruptLogicZero : Interrupt when logic zero. + * - #kGPIO_InterruptRisingEdge : Interrupt on rising edge. + * - #kGPIO_InterruptFallingEdge: Interrupt on falling edge. + * - #kGPIO_InterruptEitherEdge : Interrupt on either edge. + * - #kGPIO_InterruptLogicOne : Interrupt when logic one. + * - #kGPIO_ActiveHighTriggerOutputEnable : Enable active high-trigger output (if the trigger states exit). + * - #kGPIO_ActiveLowTriggerOutputEnable : Enable active low-trigger output (if the trigger states exit). + */ +static inline void GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t pin, gpio_interrupt_config_t config) +{ + assert(base); + + base->ICR[pin] = GPIO_FIT_REG((base->ICR[pin] & ~GPIO_ICR_IRQC_MASK) | GPIO_ICR_IRQC(config)); +} + +#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) +/*! + * @brief Configures the gpio pin interrupt/DMA request/trigger output channel selection. + * + * @param base GPIO peripheral base pointer. + * @param pin GPIO pin number. + * @param selection GPIO pin interrupt output selection. + * - #kGPIO_InterruptOutput0: Interrupt/DMA request/trigger output 0. + * - #kGPIO_InterruptOutput1 : Interrupt/DMA request/trigger output 1. + */ +static inline void GPIO_SetPinInterruptChannel(GPIO_Type *base, uint32_t pin, gpio_interrupt_selection_t selection) +{ + assert(base); + + base->ICR[pin] = GPIO_FIT_REG((base->ICR[pin] & ~GPIO_ICR_IRQS_MASK) | GPIO_ICR_IRQS(selection)); +} +#endif +/*! + * @brief Read the GPIO interrupt status flags. + * + * @param base GPIO peripheral base pointer. (GPIOA, GPIOB, GPIOC, and so on.) + * @return The current GPIO's interrupt status flag. + * '1' means the related pin's flag is set, '0' means the related pin's flag not set. + * For example, the return value 0x00010001 means the pin 0 and 17 have the interrupt pending. + */ +uint32_t GPIO_GpioGetInterruptFlags(GPIO_Type *base); +#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) +/*! + * @brief Read the GPIO interrupt status flags based on selected interrupt channel(IRQS). + * + * @param base GPIO peripheral base pointer. (GPIOA, GPIOB, GPIOC, and so on.) + * @param channel '0' means selete interrupt channel 0, '1' means selete interrupt channel 1. + * @return The current GPIO's interrupt status flag based on the selected interrupt channel. + * '1' means the related pin's flag is set, '0' means the related pin's flag not set. + * For example, the return value 0x00010001 means the pin 0 and 17 have the interrupt pending. + */ +uint32_t GPIO_GpioGetInterruptChannelFlags(GPIO_Type *base, uint32_t channel); +#endif +/*! + * @brief Read individual pin's interrupt status flag. + * + * @param base GPIO peripheral base pointer. (GPIOA, GPIOB, GPIOC, and so on) + * @param pin GPIO specific pin number. + * @return The current selected pin's interrupt status flag. + */ +uint8_t GPIO_PinGetInterruptFlag(GPIO_Type *base, uint32_t pin); + +/*! + * @brief Clears GPIO pin interrupt status flags. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + */ +void GPIO_GpioClearInterruptFlags(GPIO_Type *base, uint32_t mask); +#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) && FSL_FEATURE_GPIO_HAS_INTERRUPT_CHANNEL_SELECT) +/*! + * @brief Clears GPIO pin interrupt status flags based on selected interrupt channel(IRQS). + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param mask GPIO pin number macro + * @param channel '0' means selete interrupt channel 0, '1' means selete interrupt channel 1. + */ +void GPIO_GpioClearInterruptChannelFlags(GPIO_Type *base, uint32_t mask, uint32_t channel); +#endif +/*! + * @brief Clear GPIO individual pin's interrupt status flag. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on). + * @param pin GPIO specific pin number. + */ +void GPIO_PinClearInterruptFlag(GPIO_Type *base, uint32_t pin); + +/*! + * @brief Reads the GPIO DMA request flags. + * The corresponding flag will be cleared automatically at the completion of the requested + * DMA transfer + */ +static inline uint32_t GPIO_GetPinsDMARequestFlags(GPIO_Type *base) +{ + assert(base); + return (base->ISFR[1]); +} + +/*! + * @brief Sets the GPIO interrupt configuration in PCR register for multiple pins. + * + * @param base GPIO peripheral base pointer. + * @param mask GPIO pin number macro. + * @param config GPIO pin interrupt configuration. + * - #kGPIO_InterruptStatusFlagDisabled: Interrupt disabled. + * - #kGPIO_DMARisingEdge : DMA request on rising edge(if the DMA requests exit). + * - #kGPIO_DMAFallingEdge: DMA request on falling edge(if the DMA requests exit). + * - #kGPIO_DMAEitherEdge : DMA request on either edge(if the DMA requests exit). + * - #kGPIO_FlagRisingEdge : Flag sets on rising edge(if the Flag states exit). + * - #kGPIO_FlagFallingEdge : Flag sets on falling edge(if the Flag states exit). + * - #kGPIO_FlagEitherEdge : Flag sets on either edge(if the Flag states exit). + * - #kGPIO_InterruptLogicZero : Interrupt when logic zero. + * - #kGPIO_InterruptRisingEdge : Interrupt on rising edge. + * - #kGPIO_InterruptFallingEdge: Interrupt on falling edge. + * - #kGPIO_InterruptEitherEdge : Interrupt on either edge. + * - #kGPIO_InterruptLogicOne : Interrupt when logic one. + * - #kGPIO_ActiveHighTriggerOutputEnable : Enable active high-trigger output (if the trigger states exit). + * - #kGPIO_ActiveLowTriggerOutputEnable : Enable active low-trigger output (if the trigger states exit).. + */ +static inline void GPIO_SetMultipleInterruptPinsConfig(GPIO_Type *base, uint32_t mask, gpio_interrupt_config_t config) +{ + assert(base); + + if (0UL != (mask & 0xffffUL)) + { + base->GICLR = GPIO_FIT_REG((GPIO_ICR_IRQC(config)) | (mask & 0xffffU)); + } + mask = mask >> 16U; + if (mask != 0UL) + { + base->GICHR = GPIO_FIT_REG((GPIO_ICR_IRQC(config)) | (mask & 0xffffU)); + } +} +#endif + +#if defined(FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER +/*! + * brief The GPIO module supports a device-specific number of data ports, organized as 32-bit + * words/8-bit Bytes. Each 32-bit/8-bit data port includes a GACR register, which defines the byte-level + * attributes required for a successful access to the GPIO programming model. If the GPIO module's GACR register + * organized as 32-bit words, the attribute controls for the 4 data bytes in the GACR follow a standard little + * endian data convention. + * + * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) + * @param attribute GPIO checker attribute + */ +void GPIO_CheckAttributeBytes(GPIO_Type *base, gpio_checker_attribute_t attribute); +#endif + +/*! @} */ +/*! @} */ + +/*! + * @addtogroup fgpio_driver + * @{ + */ + +/* + * Introduces the FGPIO feature. + * + * The FGPIO features are only support on some Kinetis MCUs. The FGPIO registers are aliased to the IOPORT + * interface. Accesses via the IOPORT interface occur in parallel with any instruction fetches and + * complete in a single cycle. This aliased Fast GPIO memory map is called FGPIO. + */ + +#if defined(FSL_FEATURE_SOC_FGPIO_COUNT) && FSL_FEATURE_SOC_FGPIO_COUNT + +/*! @name FGPIO Configuration */ +/*! @{ */ + +#if defined(FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL) && FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL +/*! + * @brief Initializes the FGPIO peripheral. + * + * This function ungates the FGPIO clock. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + */ +void FGPIO_PortInit(FGPIO_Type *base); +#endif /* FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL */ + +/*! + * @brief Initializes a FGPIO pin used by the board. + * + * To initialize the FGPIO driver, define a pin configuration, as either input or output, in the user file. + * Then, call the FGPIO_PinInit() function. + * + * This is an example to define an input pin or an output pin configuration: + * @code + * Define a digital input pin configuration, + * gpio_pin_config_t config = + * { + * kGPIO_DigitalInput, + * 0, + * } + * Define a digital output pin configuration, + * gpio_pin_config_t config = + * { + * kGPIO_DigitalOutput, + * 0, + * } + * @endcode + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param pin FGPIO port pin number + * @param config FGPIO pin configuration pointer + */ +void FGPIO_PinInit(FGPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config); + +/*! @} */ + +/*! @name FGPIO Output Operations */ +/*! @{ */ + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 1 or 0. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param pin FGPIO pin number + * @param output FGPIOpin output logic level. + * - 0: corresponding pin output low-logic level. + * - 1: corresponding pin output high-logic level. + */ +static inline void FGPIO_PinWrite(FGPIO_Type *base, uint32_t pin, uint8_t output) +{ + if (output == 0U) + { + base->PCOR = 1UL << pin; + } + else + { + base->PSOR = 1UL << pin; + } +} + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 1. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +static inline void FGPIO_PortSet(FGPIO_Type *base, uint32_t mask) +{ + base->PSOR = mask; +} + +/*! + * @brief Sets the output level of the multiple FGPIO pins to the logic 0. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +static inline void FGPIO_PortClear(FGPIO_Type *base, uint32_t mask) +{ + base->PCOR = mask; +} + +/*! + * @brief Reverses the current output logic of the multiple FGPIO pins. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +static inline void FGPIO_PortToggle(FGPIO_Type *base, uint32_t mask) +{ + base->PTOR = mask; +} +/*! @} */ + +/*! @name FGPIO Input Operations */ +/*! @{ */ + +/*! + * @brief Reads the current input value of the FGPIO port. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param pin FGPIO pin number + * @retval FGPIO port input value + * - 0: corresponding pin input low-logic level. + * - 1: corresponding pin input high-logic level. + */ +static inline uint32_t FGPIO_PinRead(FGPIO_Type *base, uint32_t pin) +{ + return (((base->PDIR) >> pin) & 0x01U); +} +/*! @} */ + +/*! @name FGPIO Interrupt */ +/*! @{ */ +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \ + defined(FSL_FEATURE_SOC_PORT_COUNT) + +/*! + * @brief Reads the FGPIO port interrupt status flag. + * + * If a pin is configured to generate the DMA request, the corresponding flag + * is cleared automatically at the completion of the requested DMA transfer. + * Otherwise, the flag remains set until a logic one is written to that flag. + * If configured for a level-sensitive interrupt that remains asserted, the flag + * is set again immediately. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @retval The current FGPIO port interrupt status flags, for example, 0x00010001 means the + * pin 0 and 17 have the interrupt. + */ +uint32_t FGPIO_PortGetInterruptFlags(FGPIO_Type *base); + +/*! + * @brief Clears the multiple FGPIO pin interrupt status flag. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param mask FGPIO pin number macro + */ +void FGPIO_PortClearInterruptFlags(FGPIO_Type *base, uint32_t mask); +#endif +#if defined(FSL_FEATURE_FGPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_FGPIO_HAS_ATTRIBUTE_CHECKER +/*! + * @brief The FGPIO module supports a device-specific number of data ports, organized as 32-bit + * words. Each 32-bit data port includes a GACR register, which defines the byte-level + * attributes required for a successful access to the GPIO programming model. The attribute controls for the 4 data + * bytes in the GACR follow a standard little endian + * data convention. + * + * @param base FGPIO peripheral base pointer (FGPIOA, FGPIOB, FGPIOC, and so on.) + * @param attribute FGPIO checker attribute + */ +void FGPIO_CheckAttributeBytes(FGPIO_Type *base, gpio_checker_attribute_t attribute); +#endif /* FSL_FEATURE_FGPIO_HAS_ATTRIBUTE_CHECKER */ + +/*! @} */ + +#endif /* FSL_FEATURE_SOC_FGPIO_COUNT */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ + +#endif /* FSL_GPIO_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c.c new file mode 100644 index 00000000000..dc10970b5af --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c.c @@ -0,0 +1,3572 @@ +/* + * Copyright 2018-2024 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_i3c.h" +#if !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) +#include "fsl_reset.h" +#endif +#include +#include + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.i3c" +#endif + +#define I3C_BROADCASE_ADDR (0x7EU) + +#define NSEC_PER_SEC (1000000000UL) +#define FSL_I3C_ERROR_RATE_MAX (10U) +#define FSL_I3C_PPBAUD_DIV_MAX ((I3C_MCONFIG_PPBAUD_MASK >> I3C_MCONFIG_PPBAUD_SHIFT) + 1U) +#define FSL_I3C_ODBAUD_DIV_MAX ((I3C_MCONFIG_ODBAUD_MASK >> I3C_MCONFIG_ODBAUD_SHIFT) + 1U) +#define FSL_I3C_I2CBAUD_DIV_MAX (((I3C_MCONFIG_I2CBAUD_MASK >> I3C_MCONFIG_I2CBAUD_SHIFT) + 1U) / 2U) + +/*! @brief Common sets of flags used by the driver. */ +enum _i3c_flag_constants +{ + /*! All flags which are cleared by the driver upon starting a transfer. */ + kMasterClearFlags = kI3C_MasterSlaveStartFlag | kI3C_MasterControlDoneFlag | kI3C_MasterCompleteFlag | + kI3C_MasterArbitrationWonFlag | kI3C_MasterSlave2MasterFlag | kI3C_MasterErrorFlag, + + /*! IRQ sources enabled by the non-blocking transactional API. */ + kMasterIrqFlags = kI3C_MasterSlaveStartFlag | kI3C_MasterControlDoneFlag | kI3C_MasterCompleteFlag | + kI3C_MasterRxReadyFlag /* | kI3C_MasterTxReadyFlag */ | kI3C_MasterArbitrationWonFlag | + kI3C_MasterErrorFlag | kI3C_MasterSlave2MasterFlag, + + /*! Errors to check for. */ + kMasterErrorFlags = kI3C_MasterErrorNackFlag | kI3C_MasterErrorWriteAbortFlag | +#if !defined(FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM) || (!FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM) + kI3C_MasterErrorTermFlag | +#endif + kI3C_MasterErrorParityFlag | kI3C_MasterErrorCrcFlag | kI3C_MasterErrorReadFlag | + kI3C_MasterErrorWriteFlag | kI3C_MasterErrorMsgFlag | kI3C_MasterErrorInvalidReqFlag | + kI3C_MasterErrorTimeoutFlag, + /*! All flags which are cleared by the driver upon starting a transfer. */ + kSlaveClearFlags = kI3C_SlaveBusStartFlag | kI3C_SlaveMatchedFlag | kI3C_SlaveBusStopFlag, + + /*! IRQ sources enabled by the non-blocking transactional API. */ + kSlaveIrqFlags = kI3C_SlaveBusStartFlag | kI3C_SlaveMatchedFlag | kI3C_SlaveBusStopFlag | kI3C_SlaveRxReadyFlag | + kI3C_SlaveDynamicAddrChangedFlag | kI3C_SlaveReceivedCCCFlag | kI3C_SlaveErrorFlag | + kI3C_SlaveHDRCommandMatchFlag | kI3C_SlaveCCCHandledFlag | kI3C_SlaveEventSentFlag, + + /*! Errors to check for. */ + kSlaveErrorFlags = kI3C_SlaveErrorOverrunFlag | kI3C_SlaveErrorUnderrunFlag | kI3C_SlaveErrorUnderrunNakFlag | + kI3C_SlaveErrorTermFlag | kI3C_SlaveErrorInvalidStartFlag | kI3C_SlaveErrorSdrParityFlag | + kI3C_SlaveErrorHdrParityFlag | kI3C_SlaveErrorHdrCRCFlag | kI3C_SlaveErrorS0S1Flag | + kI3C_SlaveErrorOverreadFlag | kI3C_SlaveErrorOverwriteFlag, +}; + +/*! @brief States for the state machine used by transactional APIs. */ +enum _i3c_transfer_states +{ + kIdleState = 0, + kIBIWonState, + kSlaveStartState, + kSendCommandState, + kWaitRepeatedStartCompleteState, + kTransferDataState, + kStopState, + kWaitForCompletionState, +}; + +/*! + * @brief Used for conversion between `uint8_t*` and `uint32_t`. + */ +typedef union i3c_puint8_to_u32 +{ + uint8_t *puint8; + uint32_t u32; + const uint8_t *cpuint8; +} i3c_puint8_to_u32_t; + +/* + * MDATACTRL |= I3C_MDATACTRL_FLUSHTB_MASK | I3C_MDATACTRL_FLUSHFB_MASK; + } + + return result; +} + +status_t I3C_MasterWaitForCtrlDone(I3C_Type *base, bool waitIdle) +{ + status_t result = kStatus_Success; + uint32_t status, errStatus; +#if I3C_RETRY_TIMES + uint32_t waitTimes = I3C_RETRY_TIMES; +#endif + +#if I3C_RETRY_TIMES + while ((result == kStatus_Success) && (--waitTimes)) +#else + while (result == kStatus_Success) +#endif + { + status = I3C_MasterGetStatusFlags(base); + errStatus = I3C_MasterGetErrorStatusFlags(base); + /* Check for error flags. */ + result = I3C_MasterCheckAndClearError(base, errStatus); + /* Check if the control finishes. */ + if (0UL != (status & (uint32_t)kI3C_MasterControlDoneFlag)) + { + I3C_MasterClearStatusFlags(base, (uint32_t)kI3C_MasterControlDoneFlag); + if (!waitIdle) + { + break; + } + } + /* kI3C_MasterControlDoneFlag only indicates ACK got, need to wait for SDA high. */ + if (waitIdle && I3C_MasterGetState(base) == kI3C_MasterStateIdle) + { + break; + } + } + +#if I3C_RETRY_TIMES + if (waitTimes == 0) + { + return kStatus_I3C_Timeout; + } +#endif + + return result; +} + +static status_t I3C_MasterWaitForTxReady(I3C_Type *base, uint8_t byteCounts) +{ + uint32_t errStatus; + status_t result; + size_t txCount; + size_t txFifoSize = + 2UL << ((base->SCAPABILITIES & I3C_SCAPABILITIES_FIFOTX_MASK) >> I3C_SCAPABILITIES_FIFOTX_SHIFT); + +#if I3C_RETRY_TIMES + uint32_t waitTimes = I3C_RETRY_TIMES; +#endif + do + { + /* Get the number of words in the tx fifo and compute empty slots. */ + I3C_MasterGetFifoCounts(base, NULL, &txCount); + txCount = txFifoSize - txCount; + + /* Check for error flags. */ + errStatus = I3C_MasterGetErrorStatusFlags(base); + result = I3C_MasterCheckAndClearError(base, errStatus); + if (kStatus_Success != result) + { + return result; + } +#if I3C_RETRY_TIMES + } while ((txCount < byteCounts) && (--waitTimes)); + + if (waitTimes == 0) + { + return kStatus_I3C_Timeout; + } +#else + } while (txCount < byteCounts); +#endif + + return kStatus_Success; +} + +static status_t I3C_MasterWaitForComplete(I3C_Type *base, bool waitIdle) +{ + uint32_t status, errStatus; + status_t result = kStatus_Success; +#if I3C_RETRY_TIMES + uint32_t waitTimes = I3C_RETRY_TIMES; +#endif + do + { + status = I3C_MasterGetStatusFlags(base); + errStatus = I3C_MasterGetErrorStatusFlags(base); + result = I3C_MasterCheckAndClearError(base, errStatus); +#if I3C_RETRY_TIMES + } while (((status & (uint32_t)kI3C_MasterCompleteFlag) != (uint32_t)kI3C_MasterCompleteFlag) && + (result == kStatus_Success) && --waitTimes); +#else + } while (((status & (uint32_t)kI3C_MasterCompleteFlag) != (uint32_t)kI3C_MasterCompleteFlag) && + (result == kStatus_Success)); +#endif + + I3C_MasterClearStatusFlags(base, (uint32_t)kI3C_MasterCompleteFlag); + +#if I3C_RETRY_TIMES + if (waitTimes == 0UL) + { + return kStatus_I3C_Timeout; + } +#endif + + if (waitIdle) + { +#if I3C_RETRY_TIMES + while ((I3C_MasterGetState(base) != kI3C_MasterStateIdle) && --waitTimes) +#else + while (I3C_MasterGetState(base) != kI3C_MasterStateIdle) +#endif + { + } + } + + return result; +} + +/*! + * @brief Convert provided flags to status code, and clear any errors if present. + * @param base The I3C peripheral base address. + * @param status Current status flags value that will be checked. + * @retval #kStatus_Success + * @retval #kStatus_I3C_OverrunError + * @retval #kStatus_I3C_UnderrunError + * @retval #kStatus_I3C_UnderrunNak + * @retval #kStatus_I3C_Term + * @retval #kStatus_I3C_InvalidStart + * @retval #kStatus_I3C_SdrParityError + * @retval #kStatus_I3C_HdrParityError + * @retval #kStatus_I3C_CrcError + * @retval #kStatus_I3C_S0S1Error + * @retval #kStatus_I3C_ReadFifoError + * @retval #kStatus_I3C_WriteFifoError + */ +status_t I3C_SlaveCheckAndClearError(I3C_Type *base, uint32_t status) +{ + status_t result = kStatus_Success; + + /* Check for error. These errors cause a stop to automatically be sent. We must */ + /* clear the errors before a new transfer can start. */ + status &= (uint32_t)kSlaveErrorFlags; + +#if defined(I3C_DMA_IGNORE_FIFO_ERROR) + status &= ~((uint32_t)kI3C_SlaveErrorUnderrunFlag | (uint32_t)kI3C_SlaveErrorOverwriteFlag); + I3C_SlaveClearErrorStatusFlags(base, + ((uint32_t)kI3C_SlaveErrorUnderrunFlag | (uint32_t)kI3C_SlaveErrorOverwriteFlag)); +#endif + + if (0UL != status) + { + /* Select the correct error code. Ordered by severity, with bus issues first. */ + if (0UL != (status & (uint32_t)kI3C_SlaveErrorOverrunFlag)) + { + result = kStatus_I3C_OverrunError; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorUnderrunFlag)) + { + result = kStatus_I3C_UnderrunError; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorUnderrunNakFlag)) + { + result = kStatus_I3C_UnderrunNak; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorTermFlag)) + { + result = kStatus_I3C_Term; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorInvalidStartFlag)) + { + result = kStatus_I3C_InvalidStart; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorSdrParityFlag)) + { + result = kStatus_I3C_SdrParityError; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorHdrParityFlag)) + { + result = kStatus_I3C_HdrParityError; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorHdrCRCFlag)) + { + result = kStatus_I3C_CrcError; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorS0S1Flag)) + { + result = kStatus_I3C_S0S1Error; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorOverreadFlag)) + { + result = kStatus_I3C_ReadFifoError; + } + else if (0UL != (status & (uint32_t)kI3C_SlaveErrorOverwriteFlag)) + { + result = kStatus_I3C_WriteFifoError; + } + else + { + assert(false); + } + + /* Clear the flags. */ + I3C_SlaveClearErrorStatusFlags(base, status); + + /* Reset fifos. These flags clear automatically. */ + base->SDATACTRL |= I3C_SDATACTRL_FLUSHTB_MASK | I3C_SDATACTRL_FLUSHFB_MASK; + } + + return result; +} + +static status_t I3C_SlaveWaitForTxReady(I3C_Type *base) +{ + uint32_t errStatus; + status_t result; + size_t txCount; + size_t txFifoSize = + 2UL << ((base->SCAPABILITIES & I3C_SCAPABILITIES_FIFOTX_MASK) >> I3C_SCAPABILITIES_FIFOTX_SHIFT); + +#if I3C_RETRY_TIMES + uint32_t waitTimes = I3C_RETRY_TIMES; +#endif + do + { + /* Get the number of words in the tx fifo and compute empty slots. */ + I3C_SlaveGetFifoCounts(base, NULL, &txCount); + txCount = txFifoSize - txCount; + + /* Check for error flags. */ + errStatus = I3C_SlaveGetErrorStatusFlags(base); + result = I3C_SlaveCheckAndClearError(base, errStatus); + if (kStatus_Success != result) + { + return result; + } +#if I3C_RETRY_TIMES + } while ((txCount == 0UL) && (--waitTimes)); + + if (waitTimes == 0) + { + return kStatus_I3C_Timeout; + } +#else + } while (txCount == 0UL); +#endif + + return kStatus_Success; +} + +static status_t I3C_MasterEmitStop(I3C_Type *base, bool waitIdle) +{ + status_t result = kStatus_Success; + + /* Return an error if the bus is not in transaction. */ + if (I3C_MasterGetState(base) != kI3C_MasterStateNormAct) + { + return kStatus_I3C_InvalidReq; + } + + /* Send the STOP signal */ + base->MCTRL = (base->MCTRL & ~(I3C_MCTRL_REQUEST_MASK | I3C_MCTRL_DIR_MASK | I3C_MCTRL_RDTERM_MASK)) | + I3C_MCTRL_REQUEST(kI3C_RequestEmitStop); + + /* Wait for the stop operation finishes. */ + /* Also check for errors while waiting. */ + result = I3C_MasterWaitForCtrlDone(base, waitIdle); + + return result; +} + +/*! + * brief I3C master get IBI Type. + * + * param base The I3C peripheral base address. + * param i3c_ibi_type_t Type of #i3c_ibi_type_t. + */ +i3c_ibi_type_t I3C_GetIBIType(I3C_Type *base) +{ + uint32_t ibiValue = (base->MSTATUS & I3C_MSTATUS_IBITYPE_MASK) >> I3C_MSTATUS_IBITYPE_SHIFT; + i3c_ibi_type_t ibiType = kI3C_IbiNormal; + + switch (ibiValue) + { + case 3L: + ibiType = kI3C_IbiHotJoin; + break; + case 2L: + ibiType = kI3C_IbiMasterRequest; + break; + default: + ibiType = kI3C_IbiNormal; + break; + } + + return ibiType; +} + +/*! + * @brief Make sure the bus isn't already busy. + * + * A busy bus is allowed if we are the one driving it. + * + * @param base The I3C peripheral base address. + * @retval #kStatus_Success + * @retval #kStatus_I3C_Busy + */ +/* Not static so it can be used from fsl_i3c_edma.c. */ +status_t I3C_CheckForBusyBus(I3C_Type *base) +{ + return (I3C_MasterGetBusIdleState(base) == true) ? kStatus_Success : kStatus_I3C_Busy; +} + +/* brief Provides a default configuration for the I3C peripheral. + * + */ +void I3C_GetDefaultConfig(i3c_config_t *config) +{ + assert(NULL != config); + + (void)memset(config, 0, sizeof(*config)); + + config->enableMaster = kI3C_MasterCapable; + config->disableTimeout = false; + config->hKeep = kI3C_MasterHighKeeperNone; + config->enableOpenDrainStop = true; + config->enableOpenDrainHigh = true; + config->baudRate_Hz.i2cBaud = 400000U; + config->baudRate_Hz.i3cPushPullBaud = 12500000U; + config->baudRate_Hz.i3cOpenDrainBaud = 2500000U; + config->masterDynamicAddress = 0x0AU; /* Default master dynamic address. */ +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + config->slowClock_Hz = 0; /* Not update the Soc default setting. */ +#endif + config->enableSlave = true; + config->vendorID = 0x11BU; +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) + config->enableRandomPart = false; +#endif + config->partNumber = 0; + config->dcr = 0; /* Generic device. */ + config->bcr = 0; /* BCR[7:6]: device role, I3C slave(2b'00), BCR[5]: SDR Only / SDR and HDR Capable, SDR and HDR + Capable(1b'1), BCR[4]: Bridge Identifier, Not a bridge device(1b'0), BCR[3]: Offline Capable, + device is offline capable(1b'1), BCR[2]: IBI Payload, No data byte following(1b'0), BCR[1]: IBI + Request Capable, capable(1b'1), BCR[0]: Max Data Speed Limitation, has limitation(1b'1). */ + config->hdrMode = (uint8_t)kI3C_HDRModeDDR; + config->nakAllRequest = false; + config->ignoreS0S1Error = false; + config->offline = false; + config->matchSlaveStartStop = false; + config->maxWriteLength = 256U; + config->maxReadLength = 256U; +} + +/*! + * @brief Initializes the I3C peripheral. + * + */ +void I3C_Init(I3C_Type *base, const i3c_config_t *config, uint32_t sourceClock_Hz) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) || \ + !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) + uint32_t instance = I3C_GetInstance(base); +#endif + uint32_t configValue; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate the clock. */ + CLOCK_EnableClock(kI3cClocks[instance]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) + /* Reset the I3C module */ + RESET_PeripheralReset(kI3cResets[instance]); +#endif + + if ((config->masterDynamicAddress != 0U) && (config->enableMaster == kI3C_MasterOn)) + { + base->MDYNADDR &= ~I3C_MDYNADDR_DADDR_MASK; + base->MDYNADDR |= I3C_MDYNADDR_DADDR(config->masterDynamicAddress) | I3C_MDYNADDR_DAVALID_MASK; + } + + base->MCONFIG = I3C_MCONFIG_MSTENA(config->enableMaster) | I3C_MCONFIG_DISTO(config->disableTimeout) | + I3C_MCONFIG_HKEEP(config->hKeep) | I3C_MCONFIG_ODSTOP(config->enableOpenDrainStop) | + I3C_MCONFIG_ODHPP(config->enableOpenDrainHigh); + +#if defined(FSL_FEATURE_I3C_HAS_START_SCL_DELAY) && FSL_FEATURE_I3C_HAS_START_SCL_DELAY + base->MCONFIG_EXT = I3C_MCONFIG_EXT_I3C_CAS_DEL(config->startSclDelay) | I3C_MCONFIG_EXT_I3C_CASR_DEL(config->restartSclDelay); +#endif + + I3C_MasterSetWatermarks(base, kI3C_TxTriggerUntilOneLessThanFull, kI3C_RxTriggerOnNotEmpty, true, true); + + I3C_MasterSetBaudRate(base, &config->baudRate_Hz, sourceClock_Hz); + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + assert((config->slowClock_Hz >= 1000000U) || (config->slowClock_Hz == 0U)); + + uint8_t matchCount; + /* Set as (slowClk(MHz) - 1) to generate 1us clock cycle. Controller uses it to count 100us timeout. Target uses it as IBI request to drive SDA low. + Note: Use BAMATCH = 1 to generate 1us clock cycle if slow clock is 1MHz. The value of 0 would not give a correct match indication. */ + if (config->slowClock_Hz != 0U) + { + matchCount = (uint8_t)(config->slowClock_Hz / 1000000UL) - 1U; + matchCount = (matchCount == 0U) ? 1U : matchCount; + } + else + { + /* BAMATCH has default value based on Soc default slow clock after reset, using this default value when slowClock_Hz is 0. */ + matchCount = (uint8_t)((base->SCONFIG & I3C_SCONFIG_BAMATCH_MASK) >> I3C_SCONFIG_BAMATCH_SHIFT); + } +#endif + + configValue = base->SCONFIG; + + configValue &= + ~(I3C_SCONFIG_SADDR_MASK | +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + I3C_SCONFIG_BAMATCH_MASK | +#endif + I3C_SCONFIG_OFFLINE_MASK | +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) + I3C_SCONFIG_IDRAND_MASK | +#endif +#if defined(FSL_FEATURE_I3C_HAS_HDROK) && FSL_FEATURE_I3C_HAS_HDROK + I3C_SCONFIG_HDROK_MASK | +#else + I3C_SCONFIG_DDROK_MASK | +#endif + I3C_SCONFIG_S0IGNORE_MASK | I3C_SCONFIG_MATCHSS_MASK | I3C_SCONFIG_NACK_MASK | I3C_SCONFIG_SLVENA_MASK); + + configValue |= I3C_SCONFIG_SADDR(config->staticAddr) | +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + I3C_SCONFIG_BAMATCH(matchCount) | +#endif + I3C_SCONFIG_OFFLINE(config->offline) | +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) + I3C_SCONFIG_IDRAND(config->enableRandomPart) | +#endif +#if defined(FSL_FEATURE_I3C_HAS_HDROK) && FSL_FEATURE_I3C_HAS_HDROK + I3C_SCONFIG_HDROK((0U != (config->hdrMode & (uint8_t)kI3C_HDRModeDDR)) ? 1U : 0U) | +#else + I3C_SCONFIG_DDROK((0U != (config->hdrMode & (uint8_t)kI3C_HDRModeDDR)) ? 1U : 0U) | +#endif + I3C_SCONFIG_S0IGNORE(config->ignoreS0S1Error) | I3C_SCONFIG_MATCHSS(config->matchSlaveStartStop) | + I3C_SCONFIG_NACK(config->nakAllRequest) | I3C_SCONFIG_SLVENA(config->enableSlave); + + base->SVENDORID &= ~I3C_SVENDORID_VID_MASK; + base->SVENDORID |= I3C_SVENDORID_VID(config->vendorID); + +#if defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND + base->SIDPARTNO = config->partNumber; +#else + if (!config->enableRandomPart) + { + base->SIDPARTNO = config->partNumber; + } +#endif + + base->SIDEXT &= ~(I3C_SIDEXT_BCR_MASK | I3C_SIDEXT_DCR_MASK); + base->SIDEXT |= I3C_SIDEXT_BCR(config->bcr) | I3C_SIDEXT_DCR(config->dcr); + + base->SMAXLIMITS &= ~(I3C_SMAXLIMITS_MAXRD_MASK | I3C_SMAXLIMITS_MAXWR_MASK); + base->SMAXLIMITS |= (I3C_SMAXLIMITS_MAXRD(config->maxReadLength) | I3C_SMAXLIMITS_MAXWR(config->maxWriteLength)); + + base->SCONFIG = configValue; +} + +/*! + * brief Provides a default configuration for the I3C master peripheral. + * + * This function provides the following default configuration for the I3C master peripheral: + * code + * masterConfig->enableMaster = kI3C_MasterOn; + * masterConfig->disableTimeout = false; + * masterConfig->hKeep = kI3C_MasterHighKeeperNone; + * masterConfig->enableOpenDrainStop = true; + * masterConfig->enableOpenDrainHigh = true; + * masterConfig->baudRate_Hz = 100000U; + * masterConfig->busType = kI3C_TypeI2C; + * endcode + * + * After calling this function, you can override any settings in order to customize the configuration, + * prior to initializing the master driver with I3C_MasterInit(). + * + * param[out] masterConfig User provided configuration structure for default values. Refer to #i3c_master_config_t. + */ +void I3C_MasterGetDefaultConfig(i3c_master_config_t *masterConfig) +{ + (void)memset(masterConfig, 0, sizeof(*masterConfig)); + + masterConfig->enableMaster = kI3C_MasterOn; + masterConfig->disableTimeout = false; + masterConfig->hKeep = kI3C_MasterHighKeeperNone; + masterConfig->enableOpenDrainStop = true; + masterConfig->enableOpenDrainHigh = true; + masterConfig->baudRate_Hz.i2cBaud = 400000U; + masterConfig->baudRate_Hz.i3cPushPullBaud = 12500000U; + masterConfig->baudRate_Hz.i3cOpenDrainBaud = 2500000U; +} + +/*! + * brief Initializes the I3C master peripheral. + * + * This function enables the peripheral clock and initializes the I3C master peripheral as described by the user + * provided configuration. A software reset is performed prior to configuration. + * + * param base The I3C peripheral base address. + * param masterConfig User provided peripheral configuration. Use I3C_MasterGetDefaultConfig() to get a set of + * defaults that you can override. + * param sourceClock_Hz Frequency in Hertz of the I3C functional clock. Used to calculate the baud rate divisors, + * filter widths, and timeout periods. + */ +void I3C_MasterInit(I3C_Type *base, const i3c_master_config_t *masterConfig, uint32_t sourceClock_Hz) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) || \ + !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) + uint32_t instance = I3C_GetInstance(base); +#endif + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate the clock. */ + CLOCK_EnableClock(kI3cClocks[instance]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) + /* Reset the I3C module */ + RESET_PeripheralReset(kI3cResets[instance]); +#endif + base->MCONFIG = I3C_MCONFIG_MSTENA(masterConfig->enableMaster) | I3C_MCONFIG_DISTO(masterConfig->disableTimeout) | + I3C_MCONFIG_HKEEP(masterConfig->hKeep) | I3C_MCONFIG_ODSTOP(masterConfig->enableOpenDrainStop) | + I3C_MCONFIG_ODHPP(masterConfig->enableOpenDrainHigh); + +#if defined(FSL_FEATURE_I3C_HAS_START_SCL_DELAY) && FSL_FEATURE_I3C_HAS_START_SCL_DELAY + base->MCONFIG_EXT = I3C_MCONFIG_EXT_I3C_CAS_DEL(masterConfig->startSclDelay) | I3C_MCONFIG_EXT_I3C_CASR_DEL(masterConfig->restartSclDelay); +#endif + + I3C_MasterSetWatermarks(base, kI3C_TxTriggerUntilOneLessThanFull, kI3C_RxTriggerOnNotEmpty, true, true); + + I3C_MasterSetBaudRate(base, &masterConfig->baudRate_Hz, sourceClock_Hz); + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + assert((masterConfig->slowClock_Hz >= 1000000U) || (masterConfig->slowClock_Hz == 0U)); + + uint32_t configValue; + uint8_t matchCount; + + /* BAMATCH has default value based on Soc default slow clock after reset, using this default value when slowClock_Hz is 0. */ + if (masterConfig->slowClock_Hz != 0U) + { + /* Set as (slowClk(MHz) - 1) to generate 1us clock cycle for 100us timeout. Note: Use BAMATCH = 1 to generate 1us clock cycle + if slow clock is 1MHz. The value of 0 would not give a correct match indication. */ + matchCount = (uint8_t)(masterConfig->slowClock_Hz / 1000000UL) - 1U; + matchCount = (matchCount == 0U) ? 1U : matchCount; + + configValue = base->SCONFIG & I3C_SCONFIG_BAMATCH_MASK; + configValue |= I3C_SCONFIG_BAMATCH(matchCount); + base->SCONFIG = configValue; + } +#endif +} + +/*! + * @brief Gets the I3C master state. + * + * @param base The I3C peripheral base address. + * @return I3C master state. + */ +i3c_master_state_t I3C_MasterGetState(I3C_Type *base) +{ + uint32_t masterState = (base->MSTATUS & I3C_MSTATUS_STATE_MASK) >> I3C_MSTATUS_STATE_SHIFT; + i3c_master_state_t returnCode; + + switch (masterState) + { + case (uint32_t)kI3C_MasterStateIdle: + returnCode = kI3C_MasterStateIdle; + break; + case (uint32_t)kI3C_MasterStateSlvReq: + returnCode = kI3C_MasterStateSlvReq; + break; + case (uint32_t)kI3C_MasterStateMsgSdr: + returnCode = kI3C_MasterStateMsgSdr; + break; + case (uint32_t)kI3C_MasterStateNormAct: + returnCode = kI3C_MasterStateNormAct; + break; + case (uint32_t)kI3C_MasterStateDdr: + returnCode = kI3C_MasterStateDdr; + break; + case (uint32_t)kI3C_MasterStateDaa: + returnCode = kI3C_MasterStateDaa; + break; + case (uint32_t)kI3C_MasterStateIbiAck: + returnCode = kI3C_MasterStateIbiAck; + break; + case (uint32_t)kI3C_MasterStateIbiRcv: + returnCode = kI3C_MasterStateIbiRcv; + break; + default: + returnCode = kI3C_MasterStateIdle; + break; + } + + return returnCode; +} + +/*! + * brief Deinitializes the I3C master peripheral. + * + * This function disables the I3C master peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * param base The I3C peripheral base address. + */ +void I3C_MasterDeinit(I3C_Type *base) +{ + uint32_t idx = I3C_GetInstance(base); + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) + /* Reset the I3C module */ + RESET_PeripheralReset(kI3cResets[idx]); +#endif + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Gate clock. */ + CLOCK_DisableClock(kI3cClocks[idx]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + /* Reset handle pointer. */ + s_i3cMasterHandle[idx] = NULL; +} + +static uint32_t I3C_CalcErrorRatio(uint32_t curFreq, uint32_t desiredFreq) +{ + if (curFreq > desiredFreq) + { + return (curFreq - desiredFreq) * 100UL / desiredFreq; + } + else + { + return (desiredFreq - curFreq) * 100UL / desiredFreq; + } +} + +/*! + * brief Sets the I3C bus frequency for master transactions. + * + * The I3C master is automatically disabled and re-enabled as necessary to configure the baud + * rate. Do not call this function during a transfer, or the transfer is aborted. + * + * param base The I3C peripheral base address. + * param baudRate_Hz Pointer to structure of requested bus frequency in Hertz. + * param sourceClock_Hz I3C functional clock frequency in Hertz. + */ +void I3C_MasterSetBaudRate(I3C_Type *base, const i3c_baudrate_hz_t *baudRate_Hz, uint32_t sourceClock_Hz) +{ + uint32_t div, freq; + uint32_t divEven, divOdd; + uint32_t ppBaud, odBaud, i2cBaud; + uint32_t errRate0, errRate1; + uint32_t i3cPPBaud_HZ = baudRate_Hz->i3cPushPullBaud; + uint32_t i3cPPBaudMax_HZ = i3cPPBaud_HZ / 10U + i3cPPBaud_HZ; /* max is 1.1*i3cPPBaud_HZ */ + uint32_t i3cODBaud_HZ = baudRate_Hz->i3cOpenDrainBaud; + uint32_t i3cODBaudMax_HZ = i3cODBaud_HZ / 10U + i3cODBaud_HZ; /* max is 1.1*i3cODBaud_HZ */ + uint32_t i2cBaud_HZ = baudRate_Hz->i2cBaud; + uint32_t i3cPPLow_Ns, i3cOdLow_Ns; + bool isODHigh = (0U != (base->MCONFIG & I3C_MCONFIG_ODHPP_MASK)) ? true : false; + + /* Find out the div to generate target freq */ + freq = sourceClock_Hz / 2UL; + /* ppFreq = FCLK / 2 / (PPBAUD + 1)), 0 <= PPBAUD <= 15 */ + /* We need PPBAUD generate 12.5MHz or so. */ + div = freq / i3cPPBaud_HZ; + div = (div == 0UL) ? 1UL : div; + if (freq / div > i3cPPBaudMax_HZ) + { + div++; + } + assert(div <= FSL_I3C_PPBAUD_DIV_MAX); + ppBaud = div - 1UL; + freq /= div; + + i3cPPLow_Ns = (uint32_t)(NSEC_PER_SEC / (2UL * freq)); + + /* We need ODBAUD generate 2.5MHz or so. */ + if (isODHigh) + { + /* odFreq = (2*freq) / (ODBAUD + 2), 1 <= ODBAUD <= 255 */ + div = (2UL * freq) / i3cODBaud_HZ; + div = div < 2UL ? 2UL : div; + if ((2UL * freq / div) > i3cODBaudMax_HZ) + { + div++; + } + odBaud = div - 2UL; + freq = (2UL * freq) / div; + } + else + { + /* odFreq = ppFreq / (ODBAUD + 1), 1 <= ODBAUD <= 255 */ + div = freq / i3cODBaud_HZ; + div = div < 1UL ? 1UL : div; + if (freq / div > i3cODBaudMax_HZ) + { + div++; + } + odBaud = div - 1UL; + freq /= div; + } + + i3cOdLow_Ns = (odBaud + 1UL) * i3cPPLow_Ns; + + /* i2cFreq = odFreq / (I2CBAUD + 1), 0 <= I2CBAUD <= 7 (I2CBAUD need << 1 in register) */ + /* i2cFreq = NSEC_PER_SEC / (I2CBAUD + 1)*i3cOdLow_Ns */ + divEven = (sourceClock_Hz / i2cBaud_HZ) / (2UL * (ppBaud + 1UL) * (odBaud + 1UL)); + divEven = divEven == 0UL ? 1UL : divEven; + errRate0 = I3C_CalcErrorRatio((uint32_t)(NSEC_PER_SEC / (2UL * divEven * i3cOdLow_Ns)), i2cBaud_HZ); + + divOdd = ((sourceClock_Hz / i2cBaud_HZ) / ((ppBaud + 1UL) * (odBaud + 1UL) - 1UL)) / 2UL; + divOdd = divOdd == 0UL ? 1UL : divOdd; + errRate1 = I3C_CalcErrorRatio((uint32_t)(NSEC_PER_SEC / ((2UL * divOdd + 1UL) * i3cOdLow_Ns)), i2cBaud_HZ); + + if (errRate0 < FSL_I3C_ERROR_RATE_MAX || errRate1 < FSL_I3C_ERROR_RATE_MAX) + { + /* Use this div */ + i2cBaud = errRate0 < errRate1 ? (divEven - 1UL) * 2UL : (divOdd - 1UL) * 2UL + 1UL; + } + else + { + /* Use div + 1, unless current freq is already lower than desired. */ + i2cBaud = freq / divEven < i2cBaud_HZ ? (divEven - 1UL) * 2UL : divEven * 2UL; + } + + base->MCONFIG = (base->MCONFIG & ~(I3C_MCONFIG_PPBAUD_MASK | I3C_MCONFIG_PPLOW_MASK | I3C_MCONFIG_ODBAUD_MASK | + I3C_MCONFIG_I2CBAUD_MASK)) | + I3C_MCONFIG_PPBAUD(ppBaud) | I3C_MCONFIG_ODBAUD(odBaud) | I3C_MCONFIG_I2CBAUD(i2cBaud); +} + +/*! + * brief Sends a START signal and slave address on the I2C/I3C bus, receive size is also specified + * in the call. + * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure + * that another master is not occupying the bus. Then a START signal is transmitted, followed by the + * 7-bit address specified in the a address parameter. Note that this function does not actually wait + * until the START and address are successfully sent on the bus before returning. + * + * param base The I3C peripheral base address. + * param type The bus type to use in this transaction. + * param address 7-bit slave device address, in bits [6:0]. + * param dir Master transfer direction, either #kI3C_Read or #kI3C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * param rxSize Read terminate size for the followed read transfer, limit to 255 bytes. + * retval #kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. + * retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + */ +status_t I3C_MasterStartWithRxSize( + I3C_Type *base, i3c_bus_type_t type, uint8_t address, i3c_direction_t dir, uint8_t rxSize) +{ + i3c_master_state_t masterState = I3C_MasterGetState(base); + bool checkDdrState = (type == kI3C_TypeI3CDdr) ? (masterState != kI3C_MasterStateDdr) : true; + if ((masterState != kI3C_MasterStateIdle) && (masterState != kI3C_MasterStateNormAct) && checkDdrState) + { + return kStatus_I3C_Busy; + } + + return I3C_MasterRepeatedStartWithRxSize(base, type, address, dir, rxSize); +} + +/*! + * brief Sends a START signal and slave address on the I2C/I3C bus. + * + * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure + * that another master is not occupying the bus. Then a START signal is transmitted, followed by the + * 7-bit address specified in the a address parameter. Note that this function does not actually wait + * until the START and address are successfully sent on the bus before returning. + * + * param base The I3C peripheral base address. + * param type The bus type to use in this transaction. + * param address 7-bit slave device address, in bits [6:0]. + * param dir Master transfer direction, either #kI3C_Read or #kI3C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * retval #kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. + * retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + */ +status_t I3C_MasterStart(I3C_Type *base, i3c_bus_type_t type, uint8_t address, i3c_direction_t dir) +{ + i3c_master_state_t masterState = I3C_MasterGetState(base); + bool checkDdrState = (type == kI3C_TypeI3CDdr) ? (masterState != kI3C_MasterStateDdr) : true; + if ((masterState != kI3C_MasterStateIdle) && (masterState != kI3C_MasterStateNormAct) && checkDdrState) + { + return kStatus_I3C_Busy; + } + + return I3C_MasterStartWithRxSize(base, type, address, dir, 0); +} + +/*! + * brief Sends a repeated START signal and slave address on the I2C/I3C bus, receive size is also specified + * in the call. + * + * This function is used to send a Repeated START signal when a transfer is already in progress. Like + * I3C_MasterStart(), it also sends the specified 7-bit address. Call this API also configures the read + * terminate size for the following read transfer. For example, set the rxSize = 2, the following read transfer + * will be terminated after two bytes of data received. Write transfer will not be affected by the rxSize + * configuration. + * + * note This function exists primarily to maintain compatible APIs between I3C and I2C drivers, + * as well as to better document the intent of code that uses these APIs. + * + * param base The I3C peripheral base address. + * param type The bus type to use in this transaction. + * param address 7-bit slave device address, in bits [6:0]. + * param dir Master transfer direction, either #kI3C_Read or #kI3C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * param rxSize Read terminate size for the followed read transfer, limit to 255 bytes. + * retval #kStatus_Success Repeated START signal and address were successfully enqueued in the transmit FIFO. + */ +status_t I3C_MasterRepeatedStartWithRxSize( + I3C_Type *base, i3c_bus_type_t type, uint8_t address, i3c_direction_t dir, uint8_t rxSize) +{ + uint32_t mctrlVal; + + /* Clear all flags. */ + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + +#if defined(FSL_FEATURE_I3C_HAS_ERRATA_051617) && (FSL_FEATURE_I3C_HAS_ERRATA_051617) + /* ERRATA051617: When used as I2C controller generates repeated START randomly before the STOP under PVT condition. + This issue is caused by a glitch at the output of an internal clock MUX. The glitch when generates acts as a clock + pulse which causes the SDA line to fall early during SCL high period and creates the unintended Repeated START before + actual STOP. */ + if (type == kI3C_TypeI2C) + { + base->MCONFIG |= I3C_MCONFIG_SKEW(1); + } + else + { + base->MCONFIG &= ~I3C_MCONFIG_SKEW_MASK; + } +#endif + + /* Issue start command. */ + mctrlVal = base->MCTRL; + mctrlVal &= ~(I3C_MCTRL_TYPE_MASK | I3C_MCTRL_REQUEST_MASK | I3C_MCTRL_DIR_MASK | I3C_MCTRL_ADDR_MASK | + I3C_MCTRL_RDTERM_MASK); + mctrlVal |= I3C_MCTRL_TYPE(type) | I3C_MCTRL_REQUEST(kI3C_RequestEmitStartAddr) | I3C_MCTRL_DIR(dir) | + I3C_MCTRL_ADDR(address) | I3C_MCTRL_RDTERM(rxSize); + + base->MCTRL = mctrlVal; + + return kStatus_Success; +} +/*! + * brief Sends a STOP signal on the I2C/I3C bus. + * + * This function does not return until the STOP signal is seen on the bus, or an error occurs. + * + * param base The I3C peripheral base address. + * retval #kStatus_Success The STOP signal was successfully sent on the bus and the transaction terminated. + * retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + * retval #kStatus_I3C_Nak The slave device sent a NAK in response to a byte. + * retval #kStatus_I3C_FifoError FIFO under run or overrun. + * retval #kStatus_I3C_ArbitrationLost Arbitration lost error. + * retval #kStatus_I3C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t I3C_MasterStop(I3C_Type *base) +{ + return I3C_MasterEmitStop(base, true); +} + +/*! + * brief I3C master emit request. + * + * param base The I3C peripheral base address. + * param masterReq I3C master request of type #i3c_bus_request_t + */ +void I3C_MasterEmitRequest(I3C_Type *base, i3c_bus_request_t masterReq) +{ + uint32_t mctrlReg = base->MCTRL; + + mctrlReg &= ~I3C_MCTRL_REQUEST_MASK; + + if (masterReq == kI3C_RequestProcessDAA) + { + mctrlReg &= ~I3C_MCTRL_TYPE_MASK; + } + + mctrlReg |= I3C_MCTRL_REQUEST(masterReq); + + base->MCTRL = mctrlReg; +} + +/*! + * brief I3C master register IBI rule. + * + * param base The I3C peripheral base address. + * param ibiRule Pointer to ibi rule description of type #i3c_register_ibi_addr_t + */ +void I3C_MasterRegisterIBI(I3C_Type *base, i3c_register_ibi_addr_t *ibiRule) +{ + assert(NULL != ibiRule); + uint32_t ruleValue = I3C_MIBIRULES_MSB0_MASK; + + for (uint32_t count = 0; count < ARRAY_SIZE(ibiRule->address); count++) + { + ruleValue |= ((uint32_t)ibiRule->address[count]) << (count * I3C_MIBIRULES_ADDR1_SHIFT); + } + + ruleValue &= ~I3C_MIBIRULES_NOBYTE_MASK; + + if (!ibiRule->ibiHasPayload) + { + ruleValue |= I3C_MIBIRULES_NOBYTE_MASK; + } + + base->MIBIRULES = ruleValue; +} + +/*! + * brief I3C master get IBI rule. + * + * param base The I3C peripheral base address. + * param ibiRule Pointer to store the read out ibi rule description. + */ +void I3C_MasterGetIBIRules(I3C_Type *base, i3c_register_ibi_addr_t *ibiRule) +{ + assert(NULL != ibiRule); + + uint32_t ruleValue = base->MIBIRULES; + + for (uint32_t count = 0; count < ARRAY_SIZE(ibiRule->address); count++) + { + ibiRule->address[count] = + (uint8_t)(ruleValue >> (count * I3C_MIBIRULES_ADDR1_SHIFT)) & I3C_MIBIRULES_ADDR0_MASK; + } + + ibiRule->ibiHasPayload = (0U == (ruleValue & I3C_MIBIRULES_NOBYTE_MASK)); +} + +/*! + * brief Performs a polling receive transfer on the I2C/I3C bus. + * + * param base The I3C peripheral base address. + * param rxBuff The pointer to the data to be transferred. + * param rxSize The length in bytes of the data to be transferred. + * param flags Bit mask of options for the transfer. See enumeration #_i3c_master_transfer_flags for available options. + * retval #kStatus_Success Data was received successfully. + * retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + * retval #kStatus_I3C_Nak The slave device sent a NAK in response to a byte. + * retval #kStatus_I3C_FifoError FIFO under run or overrun. + * retval #kStatus_I3C_ArbitrationLost Arbitration lost error. + * retval #kStatus_I3C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t I3C_MasterReceive(I3C_Type *base, void *rxBuff, size_t rxSize, uint32_t flags) +{ + status_t result = kStatus_Success; + bool isRxAutoTerm = ((flags & (uint32_t)kI3C_TransferRxAutoTermFlag) != 0UL); + bool completed = false; + uint32_t status; + uint8_t *buf; + + assert(NULL != rxBuff); + + /* Handle empty read. */ + if (rxSize == 0UL) + { + return kStatus_Success; + } + +#if I3C_RETRY_TIMES + uint32_t waitTimes = I3C_RETRY_TIMES; +#endif + + /* Receive data */ + buf = (uint8_t *)rxBuff; + + while ((rxSize != 0UL) || !completed) + { +#if I3C_RETRY_TIMES + if (--waitTimes == 0) + { + return kStatus_I3C_Timeout; + } +#endif + /* Check for errors. */ + result = I3C_MasterCheckAndClearError(base, I3C_MasterGetErrorStatusFlags(base)); + if (kStatus_Success != result) + { + return result; + } + + /* Check complete flag */ + if (!completed) + { + status = I3C_MasterGetStatusFlags(base) & (uint32_t)kI3C_MasterCompleteFlag; + if (0UL != status) + { + completed = true; + /* Clear complete flag */ + I3C_MasterClearStatusFlags(base, (uint32_t)kI3C_MasterCompleteFlag); + /* Send stop if needed */ + if ((flags & (uint32_t)kI3C_TransferNoStopFlag) == 0UL) + { + if (I3C_MasterGetState(base) == kI3C_MasterStateDdr) + { + I3C_MasterEmitRequest(base, kI3C_RequestForceExit); + result = I3C_MasterWaitForCtrlDone(base, false); + } + else + { + result = I3C_MasterEmitStop(base, false); + } + if (kStatus_Success != result) + { + return result; + } + } + } + } + + /* Check RX data */ + if ((0UL != rxSize) && (0UL != (base->MDATACTRL & I3C_MDATACTRL_RXCOUNT_MASK))) + { + *buf++ = (uint8_t)(base->MRDATAB & I3C_MRDATAB_VALUE_MASK); + rxSize--; + if ((flags & (uint32_t)kI3C_TransferDisableRxTermFlag) == 0UL) + { + if ((!isRxAutoTerm) && (rxSize == 1U)) + { + base->MCTRL |= I3C_MCTRL_RDTERM(1U); + } + } + } + } + + /* Wait idle if stop is sent. */ + if ((flags & (uint32_t)kI3C_TransferNoStopFlag) == 0UL) + { +#if I3C_RETRY_TIMES + while ((I3C_MasterGetState(base) != kI3C_MasterStateIdle) && --waitTimes) +#else + while (I3C_MasterGetState(base) != kI3C_MasterStateIdle) +#endif + { + } + } + return result; +} + +/*! + * brief Performs a polling send transfer on the I2C/I3C bus. + * + * Sends up to a txSize number of bytes to the previously addressed slave device. The slave may + * reply with a NAK to any byte in order to terminate the transfer early. If this happens, this + * function returns #kStatus_I3C_Nak. + * + * param base The I3C peripheral base address. + * param txBuff The pointer to the data to be transferred. + * param txSize The length in bytes of the data to be transferred. + * param flags Bit mask of options for the transfer. See enumeration #_i3c_master_transfer_flags for available options. + * retval #kStatus_Success Data was sent successfully. + * retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + * retval #kStatus_I3C_Nak The slave device sent a NAK in response to a byte. + * retval #kStatus_I3C_FifoError FIFO under run or over run. + * retval #kStatus_I3C_ArbitrationLost Arbitration lost error. + * retval #kStatus_I3C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t I3C_MasterSend(I3C_Type *base, const void *txBuff, size_t txSize, uint32_t flags) +{ + i3c_puint8_to_u32_t buf; + buf.cpuint8 = (const uint8_t *)((const void *)txBuff); + status_t result = kStatus_Success; + bool enableWord = ((flags & (uint32_t)kI3C_TransferWordsFlag) == (uint32_t)kI3C_TransferWordsFlag) ? true : false; + uint8_t byteCounts = enableWord ? 2U : 1U; + + assert(NULL != txBuff); + if (enableWord) + { + assert(txSize % 2UL == 0UL); + } + + /* Send data buffer */ + while (0UL != txSize) + { + /* Wait until there is room in the fifo. This also checks for errors. */ + result = I3C_MasterWaitForTxReady(base, byteCounts); + if (kStatus_Success != result) + { + return result; + } + + /* Write byte into I3C master data register. */ + if (txSize > byteCounts) + { + if (enableWord) + { + base->MWDATAH = (uint32_t)buf.cpuint8[1] << 8UL | (uint32_t)buf.cpuint8[0]; + } + else + { + base->MWDATAB = *buf.cpuint8; + } + } + else + { + if (enableWord) + { + base->MWDATAHE = (uint32_t)buf.cpuint8[1] << 8UL | (uint32_t)buf.cpuint8[0]; + } + else + { + base->MWDATABE = *buf.cpuint8; + } + } + + buf.u32 = buf.u32 + byteCounts; + txSize = txSize - byteCounts; + } + + result = I3C_MasterWaitForComplete(base, false); + if ((result == kStatus_Success) && ((flags & (uint32_t)kI3C_TransferNoStopFlag) == 0UL)) + { + if (I3C_MasterGetState(base) == kI3C_MasterStateDdr) + { + I3C_MasterEmitRequest(base, kI3C_RequestForceExit); + result = I3C_MasterWaitForCtrlDone(base, false); + } + else + { + result = I3C_MasterEmitStop(base, true); + } + } + + return result; +} + +/*! + * brief Performs a DAA in the i3c bus with specified temporary baud rate. + * + * param base The I3C peripheral base address. + * param addressList The pointer for address list which is used to do DAA. + * param count The address count in the address list. + * param daaBaudRate The temporary baud rate in DAA process, NULL for using initial setting. + * The initial setting is set back between the completion of the DAA and the return of this function. + * retval #kStatus_Success The transaction was started successfully. + * retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + * retval #kStatus_I3C_SlaveCountExceed The I3C slave count has exceed the definition in I3C_MAX_DEVCNT. + */ +status_t I3C_MasterProcessDAASpecifiedBaudrate(I3C_Type *base, + uint8_t *addressList, + uint32_t count, + i3c_master_daa_baudrate_t *daaBaudRate) +{ + assert(addressList != NULL); + assert(count != 0U); + + status_t result = kStatus_Success; + uint8_t rxBuffer[8] = {0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU}; + uint32_t masterConfig = 0; + uint32_t devCount = 0; + uint8_t rxSize = 0; + bool mctrlDone = false; + i3c_baudrate_hz_t baudRate_Hz; + uint32_t errStatus; + uint32_t status; + size_t rxCount; + + /* Return an error if the bus is already in use not by us. */ + result = I3C_CheckForBusyBus(base); + if (kStatus_Success != result) + { + return result; + } + + /* Clear all flags. */ + I3C_MasterClearErrorStatusFlags(base, (uint32_t)kMasterErrorFlags); + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + + /* Disable I3C IRQ sources while we configure stuff. */ + uint32_t enabledInts = I3C_MasterGetEnabledInterrupts(base); + I3C_MasterDisableInterrupts(base, enabledInts); + + /* Temporarily adjust baud rate before DAA. */ + if (daaBaudRate != NULL) + { + masterConfig = base->MCONFIG; + /* Set non-zero value for I2C baud rate which is useless here. */ + baudRate_Hz.i2cBaud = 1; + baudRate_Hz.i3cOpenDrainBaud = daaBaudRate->i3cOpenDrainBaud; + baudRate_Hz.i3cPushPullBaud = daaBaudRate->i3cPushPullBaud; + I3C_MasterSetBaudRate(base, &baudRate_Hz, daaBaudRate->sourceClock_Hz); + } + + /* Emit process DAA */ + I3C_MasterEmitRequest(base, kI3C_RequestProcessDAA); + + do + { + status = I3C_MasterGetStatusFlags(base); + + /* Check for error flags. */ + errStatus = I3C_MasterGetErrorStatusFlags(base); + result = I3C_MasterCheckAndClearError(base, errStatus); + if (kStatus_Success != result) + { + break; + } + + if ((!mctrlDone) || (rxSize < 8U)) + { + I3C_MasterGetFifoCounts(base, &rxCount, NULL); + + if (rxCount != 0U) + { + rxBuffer[rxSize++] = (uint8_t)(base->MRDATAB & I3C_MRDATAB_VALUE_MASK); + } + + if ((status & (uint32_t)kI3C_MasterControlDoneFlag) != 0U) + { + I3C_MasterClearStatusFlags(base, (uint32_t)kI3C_MasterControlDoneFlag); + mctrlDone = true; + } + } + else if ((I3C_MasterGetState(base) == kI3C_MasterStateDaa) && + (0UL != (I3C_MasterGetStatusFlags(base) & (uint32_t)kI3C_MasterBetweenFlag))) + { + if (((devCount + 1UL) > count) || ((devCount + 1UL) > I3C_MAX_DEVCNT)) + { + result = kStatus_I3C_SlaveCountExceed; + break; + } + + /* Assign the dynamic address from address list. */ + devList[devCount].dynamicAddr = *addressList++; + base->MWDATAB = devList[devCount].dynamicAddr; + + /* Emit process DAA again. */ + I3C_MasterEmitRequest(base, kI3C_RequestProcessDAA); + + devList[devCount].vendorID = (((uint16_t)rxBuffer[0] << 8U | (uint16_t)rxBuffer[1]) & 0xFFFEU) >> 1U; + devList[devCount].partNumber = ((uint32_t)rxBuffer[2] << 24U | (uint32_t)rxBuffer[3] << 16U | + (uint32_t)rxBuffer[4] << 8U | (uint32_t)rxBuffer[5]); + devList[devCount].bcr = rxBuffer[6]; + devList[devCount].dcr = rxBuffer[7]; + devCount++; + usedDevCount++; + + /* Ready to handle next device. */ + mctrlDone = false; + rxSize = 0; + } + else + { + /* Intentional empty */ + } + } while ((status & (uint32_t)kI3C_MasterCompleteFlag) != (uint32_t)kI3C_MasterCompleteFlag); + + /* Master stops DAA if slave device number exceeds the prepared address number. */ + if (result == kStatus_I3C_SlaveCountExceed) + { + /* Send the STOP signal */ + base->MCTRL = (base->MCTRL & ~(I3C_MCTRL_REQUEST_MASK | I3C_MCTRL_DIR_MASK | I3C_MCTRL_RDTERM_MASK)) | + I3C_MCTRL_REQUEST(kI3C_RequestEmitStop); + } + + /* Set back initial baud rate after DAA is over. */ + if (daaBaudRate != NULL) + { + base->MCONFIG = masterConfig; + } + + /* Clear all flags. */ + I3C_MasterClearErrorStatusFlags(base, (uint32_t)kMasterErrorFlags); + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + + /* Enable I3C IRQ sources while we configure stuff. */ + I3C_MasterEnableInterrupts(base, enabledInts); + + return result; +} + +/*! + * brief Get device information list after DAA process is done. + * + * param base The I3C peripheral base address. + * param[out] count The pointer to store the available device count. + * return Pointer to the i3c_device_info_t array. + */ +i3c_device_info_t *I3C_MasterGetDeviceListAfterDAA(I3C_Type *base, uint8_t *count) +{ + assert(NULL != count); + + *count = usedDevCount; + + return devList; +} + +/*! + * @brief introduce function I3C_MasterClearFlagsAndEnableIRQ. + * + * This function was used of Clear all flags and Enable I3C IRQ sources for @param *base. + * + * @param base The I3C peripheral base address. + */ +static void I3C_MasterClearFlagsAndEnableIRQ(I3C_Type *base) +{ + /* Clear all flags. */ + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + /* Enable I3C IRQ sources. */ + I3C_MasterEnableInterrupts(base, (uint32_t)kMasterIrqFlags); +} + +/*! + * @brief introduce function I3C_MasterTransferNoStartFlag. + * + * This function was used of Check if device request wins arbitration. + * + * @param base The I3C peripheral base address. + * @param transfer Pointer to the transfer structure. + * @retval #true if the device wins arbitration. + * @retval #false if the device not wins arbitration. + */ +static bool I3C_MasterTransferNoStartFlag(I3C_Type *base, i3c_master_transfer_t *transfer) +{ + /* Wait tx fifo empty. */ + size_t txCount = 0xFFUL; + + while (txCount != 0U) + { + I3C_MasterGetFifoCounts(base, NULL, &txCount); + } + + /* Check if device request wins arbitration. */ + if (0UL != (I3C_MasterGetStatusFlags(base) & (uint32_t)kI3C_MasterArbitrationWonFlag)) + { + I3C_MasterClearFlagsAndEnableIRQ(base); + return true; + } + return false; +} + +/*! + * brief Performs a master polling transfer on the I2C/I3C bus. + * + * note The API does not return until the transfer succeeds or fails due + * to error happens during transfer. + * + * param base The I3C peripheral base address. + * param transfer Pointer to the transfer structure. + * retval #kStatus_Success Data was received successfully. + * retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + * retval #kStatus_I3C_Nak The slave device sent a NAK in response to a byte. + * retval #kStatus_I3C_FifoError FIFO under run or overrun. + * retval #kStatus_I3C_ArbitrationLost Arbitration lost error. + * retval #kStatus_I3C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t I3C_MasterTransferBlocking(I3C_Type *base, i3c_master_transfer_t *transfer) +{ + assert(NULL != transfer); + assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); + + status_t result = kStatus_Success; + i3c_direction_t direction = transfer->direction; + i3c_master_state_t masterState = I3C_MasterGetState(base); + bool checkDdrState = false; + i3c_rx_term_ops_t rxTermOps; + + /* Return an error if the bus is already in use not by us. */ + checkDdrState = (transfer->busType == kI3C_TypeI3CDdr) ? (masterState != kI3C_MasterStateDdr) : true; + + if ((masterState != kI3C_MasterStateIdle) && (masterState != kI3C_MasterStateNormAct) && checkDdrState) + { + return kStatus_I3C_Busy; + } + + /* Clear all flags. */ + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + /* Reset fifos. These flags clear automatically. */ + base->MDATACTRL |= I3C_MDATACTRL_FLUSHTB_MASK | I3C_MDATACTRL_FLUSHFB_MASK; + + /* Disable I3C IRQ sources while we configure stuff. */ + I3C_MasterDisableInterrupts(base, (uint32_t)kMasterIrqFlags); + + if (transfer->busType != kI3C_TypeI3CDdr) + { + direction = (0UL != transfer->subaddressSize) ? kI3C_Write : transfer->direction; + } + + /* True: Set Rx termination bytes at start point, False: Set Rx termination one bytes in advance. */ + if ((transfer->flags & (uint32_t)kI3C_TransferDisableRxTermFlag) != 0U) + { + rxTermOps = kI3C_RxTermDisable; + } + else if (transfer->dataSize <= 255U) + { + rxTermOps = kI3C_RxAutoTerm; + } + else + { + rxTermOps = kI3C_RxTermLastByte; + } + + if (0UL != (transfer->flags & (uint32_t)kI3C_TransferStartWithBroadcastAddr)) + { + if (0UL != (transfer->flags & (uint32_t)kI3C_TransferNoStartFlag)) + { + return kStatus_InvalidArgument; + } + + if (0UL != (transfer->flags & (uint32_t)kI3C_TransferRepeatedStartFlag)) + { + return kStatus_InvalidArgument; + } + + /* Issue 0x7E as start. */ + result = I3C_MasterStart(base, transfer->busType, 0x7E, kI3C_Write); + if (result != kStatus_Success) + { + return result; + } + + result = I3C_MasterWaitForCtrlDone(base, false); + if (result != kStatus_Success) + { + return result; + } + } + + if (0UL == (transfer->flags & (uint32_t)kI3C_TransferNoStartFlag)) + { + if ((direction == kI3C_Read) && (rxTermOps == kI3C_RxAutoTerm)) + { + result = I3C_MasterStartWithRxSize(base, transfer->busType, transfer->slaveAddress, direction, + (uint8_t)transfer->dataSize); + } + else + { + result = I3C_MasterStart(base, transfer->busType, transfer->slaveAddress, direction); + } + if (result != kStatus_Success) + { + return result; + } + + result = I3C_MasterWaitForCtrlDone(base, false); + if (result != kStatus_Success) + { + return result; + } + + if (true == I3C_MasterTransferNoStartFlag(base, transfer)) + { + return kStatus_I3C_IBIWon; + } + } + else + { + if ((direction == kI3C_Read) && (rxTermOps != kI3C_RxTermDisable)) + { + /* Can't set Rx termination more than one bytes in advance without START. */ + rxTermOps = kI3C_RxTermLastByte; + } + } + + /* Subaddress, MSB first. */ + if (0U != transfer->subaddressSize) + { + uint32_t subaddressRemaining = transfer->subaddressSize; + while (0UL != subaddressRemaining--) + { + uint8_t subaddressByte = (uint8_t)((transfer->subaddress >> (8UL * subaddressRemaining)) & 0xFFUL); + + result = I3C_MasterWaitForTxReady(base, 1U); + + if ((0UL == subaddressRemaining) && ((transfer->direction == kI3C_Read) || (0UL == transfer->dataSize)) && + (transfer->busType != kI3C_TypeI3CDdr)) + { + base->MWDATABE = subaddressByte; + result = I3C_MasterWaitForComplete(base, false); + if (kStatus_Success != result) + { + if (result == kStatus_I3C_Nak) + { + (void)I3C_MasterEmitStop(base, true); + } + I3C_MasterClearFlagsAndEnableIRQ(base); + return result; + } + } + else + { + base->MWDATAB = subaddressByte; + } + } + /* Need to send repeated start if switching directions to read. */ + if ((transfer->busType != kI3C_TypeI3CDdr) && (0UL != transfer->dataSize) && (transfer->direction == kI3C_Read)) + { + if (rxTermOps == kI3C_RxAutoTerm) + { + result = I3C_MasterRepeatedStartWithRxSize(base, transfer->busType, transfer->slaveAddress, kI3C_Read, + (uint8_t)transfer->dataSize); + } + else + { + result = I3C_MasterRepeatedStart(base, transfer->busType, transfer->slaveAddress, kI3C_Read); + } + + if (kStatus_Success != result) + { + I3C_MasterClearFlagsAndEnableIRQ(base); + return result; + } + + result = I3C_MasterWaitForCtrlDone(base, false); + if (result != kStatus_Success) + { + return result; + } + } + } + + if (rxTermOps == kI3C_RxAutoTerm) + { + transfer->flags |= (uint32_t)kI3C_TransferRxAutoTermFlag; + } + else + { + transfer->flags &= ~(uint32_t)kI3C_TransferRxAutoTermFlag; + } + + /* Transmit data. */ + if ((transfer->direction == kI3C_Write) && (transfer->dataSize > 0UL)) + { + /* Send Data. */ + result = I3C_MasterSend(base, transfer->data, transfer->dataSize, transfer->flags); + } + /* Receive Data. */ + else if ((transfer->direction == kI3C_Read) && (transfer->dataSize > 0UL)) + { + result = I3C_MasterReceive(base, transfer->data, transfer->dataSize, transfer->flags); + } + else + { + if ((transfer->flags & (uint32_t)kI3C_TransferNoStopFlag) == 0UL) + { + result = I3C_MasterEmitStop(base, true); + } + } + + if (result == kStatus_I3C_Nak) + { + (void)I3C_MasterEmitStop(base, true); + } + + I3C_MasterClearFlagsAndEnableIRQ(base); + + return result; +} + +/*! + * brief Creates a new handle for the I3C master non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the I3C_MasterTransferAbort() API shall be called. + * + * + * note The function also enables the NVIC IRQ for the input I3C. Need to notice + * that on some SoCs the I3C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + * + * param base The I3C peripheral base address. + * param[out] handle Pointer to the I3C master driver handle. + * param callback User provided pointer to the asynchronous callback function. + * param userData User provided pointer to the application callback data. + */ +void I3C_MasterTransferCreateHandle(I3C_Type *base, + i3c_master_handle_t *handle, + const i3c_master_transfer_callback_t *callback, + void *userData) +{ + uint32_t instance; + + assert(NULL != handle); + + /* Clear out the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Look up instance number */ + instance = I3C_GetInstance(base); + + /* Save base and instance. */ + handle->callback = *callback; + handle->userData = userData; + + /* Save this handle for IRQ use. */ + s_i3cMasterHandle[instance] = handle; + + /* Set irq handler. */ + s_i3cMasterIsr = I3C_MasterTransferHandleIRQ; + + /* Clear all flags. */ + I3C_MasterClearErrorStatusFlags(base, (uint32_t)kMasterErrorFlags); + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + /* Reset fifos. These flags clear automatically. */ + base->MDATACTRL |= I3C_MDATACTRL_FLUSHTB_MASK | I3C_MDATACTRL_FLUSHFB_MASK; + + /* Enable NVIC IRQ, this only enables the IRQ directly connected to the NVIC. + In some cases the I3C IRQ is configured through INTMUX, user needs to enable + INTMUX IRQ in application code. */ + (void)EnableIRQ(kI3cIrqs[instance]); + + /* Clear internal IRQ enables and enable NVIC IRQ. */ + I3C_MasterEnableInterrupts(base, (uint32_t)kMasterIrqFlags); +} + +static void I3C_TransferStateMachineIBIWonState(I3C_Type *base, + i3c_master_handle_t *handle, + i3c_master_state_machine_param_t *stateParams) +{ + assert(NULL != base && NULL != handle && NULL != stateParams); + if (stateParams->masterState == kI3C_MasterStateIbiAck) + { + handle->ibiType = I3C_GetIBIType(base); + if (handle->callback.ibiCallback != NULL) + { + handle->callback.ibiCallback(base, handle, handle->ibiType, kI3C_IbiAckNackPending); + } + else + { + I3C_MasterEmitIBIResponse(base, kI3C_IbiRespNack); + } + } + + /* Make sure there is data in the rx fifo. */ + if (0UL != stateParams->rxCount) + { + if ((handle->ibiBuff == NULL) && (handle->callback.ibiCallback != NULL)) + { + handle->callback.ibiCallback(base, handle, kI3C_IbiNormal, kI3C_IbiDataBuffNeed); + } + uint8_t tempData = (uint8_t)base->MRDATAB; + if (handle->ibiBuff != NULL) + { + handle->ibiBuff[handle->ibiPayloadSize++] = tempData; + } + (stateParams->rxCount)--; + return; + } + else if (0UL != (stateParams->status & (uint32_t)kI3C_MasterCompleteFlag)) + { + handle->ibiType = I3C_GetIBIType(base); + handle->ibiAddress = I3C_GetIBIAddress(base); + stateParams->state_complete = true; + stateParams->result = kStatus_I3C_IBIWon; + } + else + { + stateParams->state_complete = true; + } +} + +static void I3C_TransferStateMachineSendCommandState(I3C_Type *base, + i3c_master_handle_t *handle, + i3c_master_state_machine_param_t *stateParams) +{ + assert(NULL != base && NULL != handle && NULL != stateParams); + I3C_MasterEnableInterrupts(base, (uint32_t)kI3C_MasterTxReadyFlag); + /* Make sure there is room in the tx fifo for the next command. */ + if (0UL == (stateParams->txCount)--) + { + stateParams->state_complete = true; + return; + } + if (handle->transfer.subaddressSize > 1U) + { + handle->transfer.subaddressSize--; + base->MWDATAB = (uint8_t)((handle->transfer.subaddress) >> (8U * handle->transfer.subaddressSize)); + } + else if (handle->transfer.subaddressSize == 1U) + { + handle->transfer.subaddressSize--; + + if ((handle->transfer.direction == kI3C_Read) || (0UL == handle->transfer.dataSize)) + { + base->MWDATABE = (uint8_t)((handle->transfer.subaddress) >> (8U * handle->transfer.subaddressSize)); + + if (handle->transfer.busType != kI3C_TypeI3CDdr) + { + if (0UL == handle->transfer.dataSize) + { + handle->state = (uint8_t)kWaitForCompletionState; + } + else + { + /* xfer->dataSize != 0U, xfer->direction = kI3C_Read */ + handle->state = (uint8_t)kWaitRepeatedStartCompleteState; + } + } + else + { + handle->state = (uint8_t)kTransferDataState; + } + } + else + { + /* Next state, transfer data. */ + handle->state = (uint8_t)kTransferDataState; + base->MWDATAB = (uint8_t)((handle->transfer.subaddress) >> (8U * handle->transfer.subaddressSize)); + } + } + else + { + /* Eliminate misra 15.7*/ + } +} + +static void I3C_TransferStateMachineWaitRepeatedStartCompleteState(I3C_Type *base, + i3c_master_handle_t *handle, + i3c_master_state_machine_param_t *stateParams) +{ + assert(NULL != base && NULL != handle && NULL != stateParams); + /* We stay in this state until the master complete. */ + if (0UL != (stateParams->status & (uint32_t)kI3C_MasterCompleteFlag)) + { + handle->state = (uint8_t)kTransferDataState; + I3C_MasterDisableInterrupts(base, (uint32_t)kI3C_MasterTxReadyFlag); + + if (handle->remainingBytes < 256U) + { + handle->rxTermOps = (handle->rxTermOps == kI3C_RxTermDisable) ? handle->rxTermOps : kI3C_RxAutoTerm; + stateParams->result = + I3C_MasterRepeatedStartWithRxSize(base, handle->transfer.busType, handle->transfer.slaveAddress, + kI3C_Read, (uint8_t)handle->remainingBytes); + } + else + { + stateParams->result = + I3C_MasterRepeatedStart(base, handle->transfer.busType, handle->transfer.slaveAddress, kI3C_Read); + } + } + + stateParams->state_complete = true; +} + +static void I3C_TransferStateMachineTransferDataState(I3C_Type *base, + i3c_master_handle_t *handle, + i3c_master_state_machine_param_t *stateParams) +{ + assert(NULL != base && NULL != handle && NULL != stateParams); + + i3c_puint8_to_u32_t dataBuff; + if (handle->transfer.direction == kI3C_Write) + { + /* Make sure there is room in the tx fifo. */ + if (0UL == (stateParams->txCount)--) + { + stateParams->state_complete = true; + return; + } + + /* Put byte to send in fifo. */ + dataBuff.puint8 = (uint8_t *)handle->transfer.data; + if (handle->transfer.dataSize > 1U) + { + base->MWDATAB = *dataBuff.puint8; + } + else + { + base->MWDATABE = *dataBuff.puint8; + } + dataBuff.u32 = dataBuff.u32 + 1U; + (handle->transfer.dataSize)--; + handle->transfer.data = (void *)(dataBuff.puint8); + + /* Move to stop when the transfer is done. */ + if (--handle->remainingBytes == 0UL) + { + handle->state = (uint8_t)kWaitForCompletionState; + } + } + else + { + /* Make sure there is data in the rx fifo. */ + if (0UL == (stateParams->rxCount)--) + { + stateParams->state_complete = true; + return; + } + + /* Read byte from fifo. */ + dataBuff.puint8 = (uint8_t *)handle->transfer.data; + *dataBuff.puint8 = (uint8_t)base->MRDATAB; + dataBuff.u32 = dataBuff.u32 + 1U; + handle->transfer.data = (void *)(dataBuff.puint8); + + /* Move to stop when the transfer is done. */ + if (--handle->remainingBytes == 0UL) + { + handle->state = (uint8_t)kWaitForCompletionState; + } + + if ((handle->rxTermOps == kI3C_RxTermLastByte) && (handle->remainingBytes == 1UL)) + { + base->MCTRL |= I3C_MCTRL_RDTERM(1UL); + } + } +} + +static void I3C_TransferStateMachineWaitForCompletionState(i3c_master_handle_t *handle, + i3c_master_state_machine_param_t *stateParams) +{ + /* We stay in this state until the maste complete. */ + if (0UL != (stateParams->status & (uint32_t)kI3C_MasterCompleteFlag)) + { + handle->state = (uint8_t)kStopState; + } + else + { + stateParams->state_complete = true; + } +} + +static void I3C_TransferStateMachineStopState(I3C_Type *base, + i3c_master_handle_t *handle, + i3c_master_state_machine_param_t *stateParams) +{ + /* Only issue a stop transition if the caller requested it. */ + if (0UL == (handle->transfer.flags & (uint32_t)kI3C_TransferNoStopFlag)) + { + /* Make sure there is room in the tx fifo for the stop command. */ + if (0UL == (stateParams->txCount)--) + { + stateParams->state_complete = true; + return; + } + if (handle->transfer.busType == kI3C_TypeI3CDdr) + { + I3C_MasterEmitRequest(base, kI3C_RequestForceExit); + } + else + { + (void)I3C_MasterEmitStop(base, false); + } + } + stateParams->state_complete = true; +} + +static status_t I3C_RunTransferStateMachine(I3C_Type *base, i3c_master_handle_t *handle, bool *isDone) +{ + i3c_master_state_machine_param_t stateParams; + (void)memset(&stateParams, 0, sizeof(stateParams)); + + stateParams.result = kStatus_Success; + stateParams.state_complete = false; + + /* Set default isDone return value. */ + *isDone = false; + + uint32_t errStatus; + size_t txFifoSize = + 2UL << ((base->SCAPABILITIES & I3C_SCAPABILITIES_FIFOTX_MASK) >> I3C_SCAPABILITIES_FIFOTX_SHIFT); + + /* Check for errors. */ + stateParams.status = (uint32_t)I3C_MasterGetPendingInterrupts(base); + I3C_MasterClearStatusFlags(base, stateParams.status); + + stateParams.masterState = I3C_MasterGetState(base); + errStatus = I3C_MasterGetErrorStatusFlags(base); + stateParams.result = I3C_MasterCheckAndClearError(base, errStatus); + if (kStatus_Success != stateParams.result) + { + return stateParams.result; + } + + if (0UL != (stateParams.status & (uint32_t)kI3C_MasterSlave2MasterFlag)) + { + if (handle->callback.slave2Master != NULL) + { + handle->callback.slave2Master(base, handle->userData); + } + } + + if ((0UL != (stateParams.status & (uint32_t)kI3C_MasterSlaveStartFlag)) && + (handle->transfer.busType != kI3C_TypeI2C)) + { + handle->state = (uint8_t)kSlaveStartState; + } + + if ((stateParams.masterState == kI3C_MasterStateIbiRcv) || (stateParams.masterState == kI3C_MasterStateIbiAck)) + { + handle->state = (uint8_t)kIBIWonState; + } + + if (handle->state == (uint8_t)kIdleState) + { + return stateParams.result; + } + + /* Get fifo counts and compute room in tx fifo. */ + I3C_MasterGetFifoCounts(base, &stateParams.rxCount, &stateParams.txCount); + stateParams.txCount = txFifoSize - stateParams.txCount; + + while (!stateParams.state_complete) + { + /* Execute the state. */ + switch (handle->state) + { + case (uint8_t)kSlaveStartState: + /* Emit start + 0x7E */ + I3C_MasterEmitRequest(base, kI3C_RequestAutoIbi); + handle->state = (uint8_t)kIBIWonState; + stateParams.state_complete = true; + break; + + case (uint8_t)kIBIWonState: + I3C_TransferStateMachineIBIWonState(base, handle, &stateParams); + break; + + case (uint8_t)kSendCommandState: + I3C_TransferStateMachineSendCommandState(base, handle, &stateParams); + break; + + case (uint8_t)kWaitRepeatedStartCompleteState: + I3C_TransferStateMachineWaitRepeatedStartCompleteState(base, handle, &stateParams); + break; + + case (uint8_t)kTransferDataState: + I3C_TransferStateMachineTransferDataState(base, handle, &stateParams); + break; + + case (uint8_t)kWaitForCompletionState: + I3C_TransferStateMachineWaitForCompletionState(handle, &stateParams); + break; + + case (uint8_t)kStopState: + I3C_TransferStateMachineStopState(base, handle, &stateParams); + *isDone = true; + break; + + default: + assert(false); + break; + } + } + return stateParams.result; +} + +static status_t I3C_InitTransferStateMachine(I3C_Type *base, i3c_master_handle_t *handle) +{ + i3c_master_transfer_t *xfer = &handle->transfer; + status_t result = kStatus_Success; + i3c_direction_t direction = xfer->direction; + + if (xfer->busType != kI3C_TypeI3CDdr) + { + direction = (0UL != xfer->subaddressSize) ? kI3C_Write : xfer->direction; + } + + if (0UL != (xfer->flags & (uint32_t)kI3C_TransferStartWithBroadcastAddr)) + { + if (0UL != (xfer->flags & (uint32_t)kI3C_TransferNoStartFlag)) + { + return kStatus_InvalidArgument; + } + + if (0UL != (xfer->flags & (uint32_t)kI3C_TransferRepeatedStartFlag)) + { + return kStatus_InvalidArgument; + } + + /* Issue 0x7E as start. */ + result = I3C_MasterStart(base, xfer->busType, 0x7E, kI3C_Write); + if (result != kStatus_Success) + { + return result; + } + + result = I3C_MasterWaitForCtrlDone(base, false); + if (result != kStatus_Success) + { + return result; + } + } + + /* Handle no start option. */ + if (0U != (xfer->flags & (uint32_t)kI3C_TransferNoStartFlag)) + { + /* No need to send start flag, directly go to send command or data */ + if (xfer->subaddressSize > 0UL) + { + handle->state = (uint8_t)kSendCommandState; + } + else + { + if (direction == kI3C_Write) + { + /* Next state, send data. */ + handle->state = (uint8_t)kTransferDataState; + } + else + { + /* Only support write with no stop signal. */ + return kStatus_InvalidArgument; + } + } + I3C_MasterTransferHandleIRQ(base, handle); + return result; + } + /* If repeated start is requested, send repeated start. */ + else if (0U != (xfer->flags & (uint32_t)kI3C_TransferRepeatedStartFlag)) + { + result = I3C_MasterRepeatedStart(base, xfer->busType, xfer->slaveAddress, direction); + } + else /* For normal transfer, send start. */ + { + result = I3C_MasterStart(base, xfer->busType, xfer->slaveAddress, direction); + } + + if (xfer->subaddressSize > 0U) + { + handle->state = (uint8_t)kSendCommandState; + } + else if (xfer->dataSize != 0U) + { + handle->state = (uint8_t)kTransferDataState; + } + else + { + handle->state = (uint8_t)kStopState; + } + + if ((handle->remainingBytes < 256U) && (direction == kI3C_Read)) + { + handle->rxTermOps = (handle->rxTermOps == kI3C_RxTermDisable) ? handle->rxTermOps : kI3C_RxAutoTerm; + base->MCTRL |= I3C_MCTRL_RDTERM(handle->remainingBytes); + } + + return result; +} + +/*! + * brief Performs a non-blocking transaction on the I2C/I3C bus. + * + * param base The I3C peripheral base address. + * param handle Pointer to the I3C master driver handle. + * param transfer The pointer to the transfer descriptor. + * retval #kStatus_Success The transaction was started successfully. + * retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + */ +status_t I3C_MasterTransferNonBlocking(I3C_Type *base, i3c_master_handle_t *handle, i3c_master_transfer_t *transfer) +{ + assert(NULL != handle); + assert(NULL != transfer); + assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); + i3c_master_state_t masterState = I3C_MasterGetState(base); + bool checkDdrState = false; + + /* Return busy if another transaction is in progress. */ + if (handle->state != (uint8_t)kIdleState) + { + return kStatus_I3C_Busy; + } + + /* Return an error if the bus is already in use not by us. */ + checkDdrState = (transfer->busType == kI3C_TypeI3CDdr) ? (masterState != kI3C_MasterStateDdr) : true; + if ((masterState != kI3C_MasterStateIdle) && (masterState != kI3C_MasterStateNormAct) && checkDdrState) + { + return kStatus_I3C_Busy; + } + + /* Disable I3C IRQ sources while we configure stuff. */ + I3C_MasterDisableInterrupts(base, (uint32_t)kMasterIrqFlags); + + /* Save transfer into handle. */ + handle->transfer = *transfer; + handle->remainingBytes = transfer->dataSize; + + /* Configure IBI response type. */ + base->MCTRL &= ~I3C_MCTRL_IBIRESP_MASK; + base->MCTRL |= I3C_MCTRL_IBIRESP(transfer->ibiResponse); + + /* Clear all flags. */ + I3C_MasterClearErrorStatusFlags(base, (uint32_t)kMasterErrorFlags); + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + /* Reset fifos. These flags clear automatically. */ + base->MDATACTRL |= I3C_MDATACTRL_FLUSHTB_MASK | I3C_MDATACTRL_FLUSHFB_MASK; + + if ((transfer->flags & (uint32_t)kI3C_TransferDisableRxTermFlag) != 0U) + { + handle->rxTermOps = kI3C_RxTermDisable; + } + else if (transfer->dataSize <= 255U) + { + handle->rxTermOps = kI3C_RxAutoTerm; + } + else + { + handle->rxTermOps = kI3C_RxTermLastByte; + } + + /* Generate commands to send. */ + (void)I3C_InitTransferStateMachine(base, handle); + + /* Enable I3C internal IRQ sources. NVIC IRQ was enabled in CreateHandle() */ + I3C_MasterEnableInterrupts(base, (uint32_t)kMasterIrqFlags); + + if (transfer->direction == kI3C_Write) + { + I3C_MasterEnableInterrupts(base, (uint32_t)kI3C_MasterTxReadyFlag); + } + + return kStatus_Success; +} + +/*! + * brief Returns number of bytes transferred so far. + * param base The I3C peripheral base address. + * param handle Pointer to the I3C master driver handle. + * param[out] count Number of bytes transferred so far by the non-blocking transaction. + * retval #kStatus_Success + * retval #kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. + */ +status_t I3C_MasterTransferGetCount(I3C_Type *base, i3c_master_handle_t *handle, size_t *count) +{ + assert(NULL != handle); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (handle->state == (uint8_t)kIdleState) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + uint8_t state; + uint32_t remainingBytes; + uint32_t dataSize; + + /* Cache some fields with IRQs disabled. This ensures all field values */ + /* are synchronized with each other during an ongoing transfer. */ + uint32_t irqs = I3C_MasterGetEnabledInterrupts(base); + I3C_MasterDisableInterrupts(base, irqs); + state = handle->state; + remainingBytes = handle->remainingBytes; + dataSize = handle->transfer.dataSize; + I3C_MasterEnableInterrupts(base, irqs); + + /* Get transfer count based on current transfer state. */ + switch (state) + { + case (uint8_t)kIdleState: + case (uint8_t)kSendCommandState: + *count = 0; + break; + + case (uint8_t)kTransferDataState: + *count = dataSize - remainingBytes; + break; + + case (uint8_t)kStopState: + case (uint8_t)kWaitForCompletionState: + default: + *count = dataSize; + break; + } + + return kStatus_Success; +} + +/*! + * brief Terminates a non-blocking I3C master transmission early. + * + * note It is not safe to call this function from an IRQ handler that has a higher priority than the + * I3C peripheral's IRQ priority. + * + * param base The I3C peripheral base address. + * param handle Pointer to the I3C master driver handle. + * retval #kStatus_Success A transaction was successfully aborted. + * retval #kStatus_I3C_Idle There is not a non-blocking transaction currently in progress. + */ +void I3C_MasterTransferAbort(I3C_Type *base, i3c_master_handle_t *handle) +{ + if (handle->state != (uint8_t)kIdleState) + { + /* Disable internal IRQ enables. */ + I3C_MasterDisableInterrupts(base, (uint32_t)kMasterIrqFlags); + + /* Reset fifos. These flags clear automatically. */ + base->MDATACTRL |= I3C_MDATACTRL_FLUSHTB_MASK | I3C_MDATACTRL_FLUSHFB_MASK; + + /* Send a stop command to finalize the transfer. */ + (void)I3C_MasterStop(base); + + /* Reset handle. */ + handle->state = (uint8_t)kIdleState; + } +} + +/*! + * brief Reusable routine to handle master interrupts. + * note This function does not need to be called unless you are reimplementing the + * nonblocking API's interrupt handler routines to add special functionality. + * param base The I3C peripheral base address. + * param intHandle Pointer to the I3C master driver handle. + */ +void I3C_MasterTransferHandleIRQ(I3C_Type *base, void *intHandle) +{ + i3c_master_handle_t *handle = (i3c_master_handle_t *)intHandle; + status_t result; + bool isDone; + + /* Don't do anything if we don't have a valid handle. */ + if (NULL == handle) + { + return; + } + + result = I3C_RunTransferStateMachine(base, handle, &isDone); + + if (handle->state == (uint8_t)kIdleState) + { + I3C_MasterDisableInterrupts(base, (uint32_t)kI3C_MasterTxReadyFlag); + return; + } + + if (isDone || (result != kStatus_Success)) + { + /* XXX need to handle data that may be in rx fifo below watermark level? */ + + /* XXX handle error, terminate xfer */ + if ((result == kStatus_I3C_Nak) || (result == kStatus_I3C_IBIWon)) + { + (void)I3C_MasterEmitStop(base, false); + } + + /* Disable internal IRQ enables. */ + I3C_MasterDisableInterrupts(base, (uint32_t)kI3C_MasterTxReadyFlag); + + /* Set handle to idle state. */ + handle->state = (uint8_t)kIdleState; + + /* Invoke IBI user callback. */ + if ((result == kStatus_I3C_IBIWon) && (handle->callback.ibiCallback != NULL)) + { + handle->callback.ibiCallback(base, handle, handle->ibiType, kI3C_IbiReady); + handle->ibiPayloadSize = 0; + } + + /* Invoke callback. */ + if (NULL != handle->callback.transferComplete) + { + handle->callback.transferComplete(base, handle, result, handle->userData); + } + } +} + +/*! + * brief Provides a default configuration for the I3C slave peripheral. + * + * This function provides the following default configuration for the I3C slave peripheral: + * code + * slaveConfig->enableslave = true; + * endcode + * + * After calling this function, you can override any settings in order to customize the configuration, + * prior to initializing the slave driver with I3C_SlaveInit(). + * + * param[out] slaveConfig User provided configuration structure for default values. Refer to #i3c_slave_config_t. + */ +void I3C_SlaveGetDefaultConfig(i3c_slave_config_t *slaveConfig) +{ + assert(NULL != slaveConfig); + + (void)memset(slaveConfig, 0, sizeof(*slaveConfig)); + + slaveConfig->enableSlave = true; +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) && FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) + slaveConfig->isHotJoin = false; +#endif + slaveConfig->vendorID = 0x11BU; +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) + slaveConfig->enableRandomPart = false; +#endif + slaveConfig->partNumber = 0; + slaveConfig->dcr = 0; /* Generic device. */ + slaveConfig->bcr = + 0; /* BCR[7:6]: device role, I3C slave(2b'00), BCR[5]: SDR Only / SDR and HDR Capable, SDR and HDR + Capable(1b'1), BCR[4]: Bridge Identifier, Not a bridge device(1b'0), BCR[3]: Offline Capable, device is + offline capable(1b'1), BCR[2]: IBI Payload, No data byte following(1b'0), BCR[1]: IBI Request Capable, + capable(1b'1), BCR[0]: Max Data Speed Limitation, has limitation(1b'1). */ + slaveConfig->hdrMode = (uint8_t)kI3C_HDRModeDDR; + slaveConfig->nakAllRequest = false; + slaveConfig->ignoreS0S1Error = true; + slaveConfig->offline = false; + slaveConfig->matchSlaveStartStop = false; + slaveConfig->maxWriteLength = 256U; + slaveConfig->maxReadLength = 256U; +} + +/*! + * brief Initializes the I3C slave peripheral. + * + * This function enables the peripheral clock and initializes the I3C slave peripheral as described by the user + * provided configuration. + * + * param base The I3C peripheral base address. + * param slaveConfig User provided peripheral configuration. Use I3C_SlaveGetDefaultConfig() to get a set of + * defaults that you can override. + * param slowClock_Hz Frequency in Hertz of the I3C slow clock. Used to calculate the bus match condition values. + * If FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH defines as 1, this parameter is useless. + */ +void I3C_SlaveInit(I3C_Type *base, const i3c_slave_config_t *slaveConfig, uint32_t slowClock_Hz) +{ + assert(NULL != slaveConfig); + assert((slowClock_Hz >= 1000000U) || (slowClock_Hz == 0U)); + + uint32_t configValue; +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) || \ + !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) + uint32_t instance = I3C_GetInstance(base); +#endif + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate the clock. */ + CLOCK_EnableClock(kI3cClocks[instance]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) + /* Reset the I3C module */ + RESET_PeripheralReset(kI3cResets[instance]); +#endif + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + uint8_t matchCount; + /* Set as (slowClk(MHz) - 1) to generate 1us clock cycle for IBI request to drive SDA low. Note: Use BAMATCH = 1 to + generate 1us clock cycle if slow clock is 1MHz. The value of 0 would not give a correct match indication. */ + if (slowClock_Hz != 0U) + { + matchCount = (uint8_t)(slowClock_Hz / 1000000UL) - 1U; + matchCount = (matchCount == 0U) ? 1U : matchCount; + } + else + { + /* BAMATCH has default value based on Soc default slow clock after reset, using this default value when slowClock_Hz is 0. */ + matchCount = (uint8_t)((base->SCONFIG & I3C_SCONFIG_BAMATCH_MASK) >> I3C_SCONFIG_BAMATCH_SHIFT); + } +#endif + + configValue = base->SCONFIG; + configValue &= + ~(I3C_SCONFIG_SADDR_MASK | +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + I3C_SCONFIG_BAMATCH_MASK | +#endif + I3C_SCONFIG_OFFLINE_MASK | +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) + I3C_SCONFIG_IDRAND_MASK | +#endif +#if defined(FSL_FEATURE_I3C_HAS_HDROK) && FSL_FEATURE_I3C_HAS_HDROK + I3C_SCONFIG_HDROK_MASK | +#else + I3C_SCONFIG_DDROK_MASK | +#endif + I3C_SCONFIG_S0IGNORE_MASK | I3C_SCONFIG_MATCHSS_MASK | I3C_SCONFIG_NACK_MASK | I3C_SCONFIG_SLVENA_MASK); + configValue |= I3C_SCONFIG_SADDR(slaveConfig->staticAddr) | +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + I3C_SCONFIG_BAMATCH(matchCount) | +#endif + I3C_SCONFIG_OFFLINE(slaveConfig->offline) | +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) + I3C_SCONFIG_IDRAND(slaveConfig->enableRandomPart) | +#endif +#if defined(FSL_FEATURE_I3C_HAS_HDROK) && FSL_FEATURE_I3C_HAS_HDROK + I3C_SCONFIG_HDROK((0U != (slaveConfig->hdrMode & (uint8_t)kI3C_HDRModeDDR)) ? 1U : 0U) | +#else + I3C_SCONFIG_DDROK((0U != (slaveConfig->hdrMode & (uint8_t)kI3C_HDRModeDDR)) ? 1U : 0U) | +#endif + I3C_SCONFIG_S0IGNORE(slaveConfig->ignoreS0S1Error) | + I3C_SCONFIG_MATCHSS(slaveConfig->matchSlaveStartStop) | + I3C_SCONFIG_NACK(slaveConfig->nakAllRequest) | I3C_SCONFIG_SLVENA(slaveConfig->enableSlave); + + base->SVENDORID &= ~I3C_SVENDORID_VID_MASK; + base->SVENDORID |= I3C_SVENDORID_VID(slaveConfig->vendorID); + +#if defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_IDRAND + base->SIDPARTNO = slaveConfig->partNumber; +#else + if (!slaveConfig->enableRandomPart) + { + base->SIDPARTNO = slaveConfig->partNumber; + } +#endif + + base->SIDEXT &= ~(I3C_SIDEXT_BCR_MASK | I3C_SIDEXT_DCR_MASK); + base->SIDEXT |= I3C_SIDEXT_BCR(slaveConfig->bcr) | I3C_SIDEXT_DCR(slaveConfig->dcr); + + base->SMAXLIMITS &= ~(I3C_SMAXLIMITS_MAXRD_MASK | I3C_SMAXLIMITS_MAXWR_MASK); + base->SMAXLIMITS |= + (I3C_SMAXLIMITS_MAXRD(slaveConfig->maxReadLength) | I3C_SMAXLIMITS_MAXWR(slaveConfig->maxWriteLength)); + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) && FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) + if (slaveConfig->isHotJoin) + { + I3C_SlaveRequestEvent(base, kI3C_SlaveEventHotJoinReq); + } +#endif + base->SCONFIG = configValue; +} + +/*! + * brief Deinitializes the I3C master peripheral. + * + * This function disables the I3C master peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * param base The I3C peripheral base address. + */ +void I3C_SlaveDeinit(I3C_Type *base) +{ + uint32_t idx = I3C_GetInstance(base); + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_RESET) && FSL_FEATURE_I3C_HAS_NO_RESET) + /* Reset the I3C module */ + RESET_PeripheralReset(kI3cResets[idx]); +#endif + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Gate clock. */ + CLOCK_DisableClock(kI3cClocks[idx]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + + /* Reset handle pointer */ + s_i3cSlaveHandle[idx] = NULL; +} + +/*! + * @brief Gets the I3C slave state. + * + * @param base The I3C peripheral base address. + * @return I3C slave activity state, refer #i3c_slave_activity_state_t. + */ +i3c_slave_activity_state_t I3C_SlaveGetActivityState(I3C_Type *base) +{ + uint8_t activeState = (uint8_t)((base->SSTATUS & I3C_SSTATUS_ACTSTATE_MASK) >> I3C_SSTATUS_ACTSTATE_SHIFT); + i3c_slave_activity_state_t returnCode; + switch (activeState) + { + case (uint8_t)kI3C_SlaveNoLatency: + returnCode = kI3C_SlaveNoLatency; + break; + case (uint8_t)kI3C_SlaveLatency1Ms: + returnCode = kI3C_SlaveLatency1Ms; + break; + case (uint8_t)kI3C_SlaveLatency100Ms: + returnCode = kI3C_SlaveLatency100Ms; + break; + case (uint8_t)kI3C_SlaveLatency10S: + returnCode = kI3C_SlaveLatency10S; + break; + default: + returnCode = kI3C_SlaveNoLatency; + break; + } + + return returnCode; +} + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) && FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) +/*! + * brief I3C slave request event. + * + * param base The I3C peripheral base address. + * param event I3C slave event of type #i3c_slave_event_t + * param data IBI data if In-band interrupt has data, only applicable for event type #kI3C_SlaveEventIBI + */ +void I3C_SlaveRequestEvent(I3C_Type *base, i3c_slave_event_t event) +{ + uint32_t ctrlValue = base->SCTRL; + + ctrlValue &= ~I3C_SCTRL_EVENT_MASK; + ctrlValue |= I3C_SCTRL_EVENT(event); + + base->SCTRL = ctrlValue; +} + +/*! + * brief I3C slave request event. + * deprecated Do not use this function. It has been superseded by @ref I3C_SlaveRequestIBIWithData. + * + * param base The I3C peripheral base address. + * param data IBI data + * param dataSize IBI data size. + */ +void I3C_SlaveRequestIBIWithSingleData(I3C_Type *base, uint8_t data, size_t dataSize) +{ + uint32_t ctrlValue = base->SCTRL; + + ctrlValue &= ~(I3C_SCTRL_EVENT_MASK | I3C_SCTRL_IBIDATA_MASK); + ctrlValue |= I3C_SCTRL_EVENT(1U) | I3C_SCTRL_IBIDATA(data); + + base->SCTRL = ctrlValue; +} + +/*! + * brief I3C slave request IBI event with data payload(mandatory and extended). + * + * param base The I3C peripheral base address. + * param data Pointer to IBI data to be sent in the request. + * param dataSize IBI data size. + */ +void I3C_SlaveRequestIBIWithData(I3C_Type *base, uint8_t *data, size_t dataSize) +{ + assert((dataSize > 0U) && (dataSize <= 8U)); + + uint32_t ctrlValue; + +#if (defined(I3C_IBIEXT1_MAX_MASK) && I3C_IBIEXT1_MAX_MASK) + if (dataSize > 1U) + { + ctrlValue = I3C_IBIEXT1_EXT1(data[1]); + if (dataSize > 2U) + { + ctrlValue |= I3C_IBIEXT1_EXT2(data[2]); + } + if (dataSize > 3U) + { + ctrlValue |= I3C_IBIEXT1_EXT3(data[3]); + } + ctrlValue |= I3C_IBIEXT1_CNT(dataSize - 1U); + base->IBIEXT1 = ctrlValue; + } + + if (dataSize > 4U) + { + ctrlValue = I3C_IBIEXT2_EXT4(data[4]); + if (dataSize > 5U) + { + ctrlValue |= I3C_IBIEXT2_EXT5(data[5]); + } + if (dataSize > 6U) + { + ctrlValue |= I3C_IBIEXT2_EXT6(data[6]); + } + if (dataSize > 7U) + { + ctrlValue |= I3C_IBIEXT2_EXT7(data[7]); + } + base->IBIEXT2 = ctrlValue; + } +#endif + + ctrlValue = base->SCTRL; +#if (defined(I3C_IBIEXT1_MAX_MASK) && I3C_IBIEXT1_MAX_MASK) + ctrlValue &= ~(I3C_SCTRL_EVENT_MASK | I3C_SCTRL_IBIDATA_MASK | I3C_SCTRL_EXTDATA_MASK); + ctrlValue |= I3C_SCTRL_EVENT(1U) | I3C_SCTRL_IBIDATA(data[0]) | I3C_SCTRL_EXTDATA(dataSize > 1U); +#else + ctrlValue &= ~(I3C_SCTRL_EVENT_MASK | I3C_SCTRL_IBIDATA_MASK); + ctrlValue |= I3C_SCTRL_EVENT(1U) | I3C_SCTRL_IBIDATA(data[0]); +#endif + base->SCTRL = ctrlValue; +} +#endif /* !(defined(FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) && FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) */ + +/*! + * brief Performs a polling send transfer on the I3C bus. + * + * param base The I3C peripheral base address. + * param txBuff The pointer to the data to be transferred. + * param txSize The length in bytes of the data to be transferred. + * return Error or success status returned by API. + */ +status_t I3C_SlaveSend(I3C_Type *base, const void *txBuff, size_t txSize) +{ + const uint8_t *buf = (const uint8_t *)((const void *)txBuff); + status_t result = kStatus_Success; + + assert(NULL != txBuff); + + /* Send data buffer */ + while (0UL != txSize--) + { + /* Wait until there is room in the fifo. This also checks for errors. */ + result = I3C_SlaveWaitForTxReady(base); + if (kStatus_Success != result) + { + return result; + } + + /* Write byte into I3C slave data register. */ + if (0UL != txSize) + { + base->SWDATAB = *buf++; + } + else + { + base->SWDATABE = *buf++; + } + } + + return result; +} + +/*! + * brief Performs a polling receive transfer on the I3C bus. + * + * param base The I3C peripheral base address. + * param rxBuff The pointer to the data to be transferred. + * param rxSize The length in bytes of the data to be transferred. + * return Error or success status returned by API. + */ +status_t I3C_SlaveReceive(I3C_Type *base, void *rxBuff, size_t rxSize) +{ + status_t result = kStatus_Success; + uint8_t *buf; + + assert(NULL != rxBuff); + + /* Handle empty read. */ + if (0UL == rxSize) + { + return kStatus_Success; + } + +#if I3C_RETRY_TIMES + uint32_t waitTimes = I3C_RETRY_TIMES; +#endif + + /* Receive data */ + buf = (uint8_t *)rxBuff; + while (0UL != rxSize) + { +#if I3C_RETRY_TIMES + if (--waitTimes == 0) + { + return kStatus_I3C_Timeout; + } +#endif + /* Check for errors. */ + result = I3C_SlaveCheckAndClearError(base, I3C_SlaveGetErrorStatusFlags(base)); + if (kStatus_Success != result) + { + return result; + } + + /* Check RX data */ + if (0UL != (base->SDATACTRL & I3C_SDATACTRL_RXCOUNT_MASK)) + { + *buf++ = (uint8_t)(base->SRDATAB & I3C_SRDATAB_DATA0_MASK); + rxSize--; + } + } + + return result; +} + +/*! + * brief Creates a new handle for the I3C slave non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the I3C_SlaveTransferAbort() API shall be called. + * + * note The function also enables the NVIC IRQ for the input I3C. Need to notice + * that on some SoCs the I3C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + + * param base The I3C peripheral base address. + * param[out] handle Pointer to the I3C slave driver handle. + * param callback User provided pointer to the asynchronous callback function. + * param userData User provided pointer to the application callback data. + */ +void I3C_SlaveTransferCreateHandle(I3C_Type *base, + i3c_slave_handle_t *handle, + i3c_slave_transfer_callback_t callback, + void *userData) +{ + uint32_t instance; + + assert(NULL != handle); + + /* Clear out the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Look up instance number */ + instance = I3C_GetInstance(base); + + /* Save base and instance. */ + handle->callback = callback; + handle->userData = userData; + + /* Save Tx FIFO Size. */ + handle->txFifoSize = + 2U << ((base->SCAPABILITIES & I3C_SCAPABILITIES_FIFOTX_MASK) >> I3C_SCAPABILITIES_FIFOTX_SHIFT); + + /* Save this handle for IRQ use. */ + s_i3cSlaveHandle[instance] = handle; + + /* Set irq handler. */ + s_i3cSlaveIsr = I3C_SlaveTransferHandleIRQ; + + /* Clear internal IRQ enables and enable NVIC IRQ. */ + I3C_SlaveDisableInterrupts(base, (uint32_t)kSlaveIrqFlags); + (void)EnableIRQ(kI3cIrqs[instance]); +} + +/*! + * brief Starts accepting slave transfers. + * + * Call this API after calling I2C_SlaveInit() and I3C_SlaveTransferCreateHandle() to start processing + * transactions driven by an I2C master. The slave monitors the I2C bus and pass events to the + * callback that was passed into the call to I3C_SlaveTransferCreateHandle(). The callback is always invoked + * from the interrupt context. + * + * The set of events received by the callback is customizable. To do so, set the a eventMask parameter to + * the OR'd combination of #i3c_slave_transfer_event_t enumerators for the events you wish to receive. + * The #kI3C_SlaveTransmitEvent and #kI3C_SlaveReceiveEvent events are always enabled and do not need + * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and + * receive events that are always enabled. In addition, the #kI3C_SlaveAllEvents constant is provided as + * a convenient way to enable all events. + * + * param base The I3C peripheral base address. + * param handle Pointer to #i3c_slave_handle_t structure which stores the transfer state. + * param eventMask Bit mask formed by OR'ing together #i3c_slave_transfer_event_t enumerators to specify + * which events to send to the callback. Other accepted values are 0 to get a default set of + * only the transmit and receive events, and #kI3C_SlaveAllEvents to enable all events. + * + * retval #kStatus_Success Slave transfers were successfully started. + * retval #kStatus_I3C_Busy Slave transfers have already been started on this handle. + */ +status_t I3C_SlaveTransferNonBlocking(I3C_Type *base, i3c_slave_handle_t *handle, uint32_t eventMask) +{ + assert(NULL != handle); + + /* Return busy if another transaction is in progress. */ + if (handle->isBusy) + { + return kStatus_I3C_Busy; + } + + /* Disable I3C IRQ sources while we configure stuff. */ + I3C_SlaveDisableInterrupts(base, (uint32_t)kSlaveIrqFlags); + + /* Clear transfer in handle. */ + (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); + + /* Set up event mask. tx and rx are always enabled. */ + handle->eventMask = eventMask | (uint32_t)kI3C_SlaveTransmitEvent | (uint32_t)kI3C_SlaveReceiveEvent; + + /* Clear all flags. */ + I3C_SlaveClearStatusFlags(base, (uint32_t)kSlaveClearFlags); + + /* Enable I3C internal IRQ sources. NVIC IRQ was enabled in CreateHandle() */ + I3C_SlaveEnableInterrupts(base, (uint32_t)kSlaveIrqFlags); + + return kStatus_Success; +} + +/*! + * brief Gets the slave transfer status during a non-blocking transfer. + * param base The I3C peripheral base address. + * param handle Pointer to i2c_slave_handle_t structure. + * param[out] count Pointer to a value to hold the number of bytes transferred. May be NULL if the count is not + * required. + * retval #kStatus_Success + * retval #kStatus_NoTransferInProgress + */ +status_t I3C_SlaveTransferGetCount(I3C_Type *base, i3c_slave_handle_t *handle, size_t *count) +{ + assert(NULL != handle); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (!handle->isBusy) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + /* For an active transfer, just return the count from the handle. */ + *count = handle->transferredCount; + + return kStatus_Success; +} + +/*! + * brief Aborts the slave non-blocking transfers. + * note This API could be called at any time to stop slave for handling the bus events. + * param base The I3C peripheral base address. + * param handle Pointer to #i3c_slave_handle_t structure which stores the transfer state. + * retval #kStatus_Success + * retval #kStatus_I3C_Idle + */ +void I3C_SlaveTransferAbort(I3C_Type *base, i3c_slave_handle_t *handle) +{ + assert(NULL != handle); + + /* Return idle if no transaction is in progress. */ + if (handle->isBusy) + { + /* Disable I3C IRQ sources. */ + I3C_SlaveDisableInterrupts(base, (uint32_t)kSlaveIrqFlags); + + /* Reset transfer info. */ + (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); + + /* We're no longer busy. */ + handle->isBusy = false; + } +} + +static bool I3C_SlaveTransferHandleGetStatusFlags(I3C_Type *base, + i3c_slave_handle_t *handle, + i3c_slave_handleIrq_param_t *stateParams) +{ + assert(NULL != base && NULL != handle && NULL != stateParams); + /* Check for a valid handle in case of a spurious interrupt. */ + uint32_t errFlags; + stateParams->flags = I3C_SlaveGetStatusFlags(base); + errFlags = I3C_SlaveGetErrorStatusFlags(base); + + stateParams->pendingInts = I3C_SlaveGetPendingInterrupts(base); + stateParams->enabledInts = I3C_SlaveGetEnabledInterrupts(base); + + if (0UL != (errFlags & (uint32_t)kSlaveErrorFlags)) + { + handle->transfer.event = (uint32_t)kI3C_SlaveCompletionEvent; + handle->transfer.completionStatus = I3C_SlaveCheckAndClearError(base, errFlags); + + if ((0UL != (handle->eventMask & (uint32_t)kI3C_SlaveCompletionEvent)) && (NULL != handle->callback)) + { + handle->callback(base, &handle->transfer, handle->userData); + } + return false; + } + return true; +} + +static void I3C_SlaveTransferHandleBusStart(I3C_Type *base, i3c_slave_transfer_t *xfer, uint32_t *pendingInts) +{ + base->SDATACTRL |= I3C_SDATACTRL_FLUSHTB_MASK; + xfer->txDataSize = 0; + I3C_SlaveEnableInterrupts(base, (uint32_t)kI3C_SlaveTxReadyFlag); + (*pendingInts) |= (uint32_t)kI3C_SlaveTxReadyFlag; +} + +static void I3C_SlaveTransferHandleEventSent(I3C_Type *base, i3c_slave_handle_t *handle, i3c_slave_transfer_t *xfer) +{ + xfer->event = (uint32_t)kI3C_SlaveRequestSentEvent; + if ((0UL != (handle->eventMask & xfer->event)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } +} + +static void I3C_SlaveTransferHandleReceivedCCC(I3C_Type *base, i3c_slave_handle_t *handle, i3c_slave_transfer_t *xfer) +{ + handle->isBusy = true; + xfer->event = (uint32_t)kI3C_SlaveReceivedCCCEvent; + if ((0UL != (handle->eventMask & xfer->event)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } +} + +static void I3C_SlaveTransferHandleBusStop(I3C_Type *base, + i3c_slave_handle_t *handle, + i3c_slave_handleIrq_param_t *stateParams) +{ + assert(NULL != base && NULL != handle && NULL != stateParams); + I3C_SlaveDisableInterrupts(base, (uint32_t)kI3C_SlaveTxReadyFlag); + stateParams->pendingInts &= ~(uint32_t)kI3C_SlaveTxReadyFlag; + base->SDATACTRL |= I3C_SDATACTRL_FLUSHTB_MASK | I3C_SDATACTRL_FLUSHFB_MASK; + if (handle->isBusy) + { + handle->transfer.event = (uint32_t)kI3C_SlaveCompletionEvent; + handle->transfer.completionStatus = kStatus_Success; + handle->transfer.transferredCount = handle->transferredCount; + handle->isBusy = false; + + if (handle->wasTransmit) + { + /* Subtract one from the transmit count to offset the fact that I3C asserts the */ + /* tx flag before it sees the nack from the master-receiver, thus causing one more */ + /* count that the master actually receives. */ + --handle->transfer.transferredCount; + handle->wasTransmit = false; + } + + if ((0UL != (handle->eventMask & handle->transfer.event)) && (NULL != handle->callback)) + { + handle->callback(base, &handle->transfer, handle->userData); + } + + /* Clean up transfer info on completion, after the callback has been invoked. */ + (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); + } +} + +static void I3C_SlaveTransferHandleMatched(I3C_Type *base, i3c_slave_handle_t *handle, i3c_slave_transfer_t *xfer) +{ + assert(NULL != base && NULL != handle && NULL != xfer); + xfer->event = (uint32_t)kI3C_SlaveAddressMatchEvent; + handle->isBusy = true; + if ((0UL != (handle->eventMask & (uint32_t)kI3C_SlaveAddressMatchEvent)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } +} + +static void I3C_SlaveTransferHandleTxReady(I3C_Type *base, + i3c_slave_handle_t *handle, + i3c_slave_handleIrq_param_t *stateParams) +{ + assert(NULL != base && NULL != handle && NULL != stateParams); + handle->wasTransmit = true; + + /* If we're out of data, invoke callback to get more. */ + if ((NULL == handle->transfer.txData) || (0UL == handle->transfer.txDataSize)) + { + handle->transfer.event = (uint32_t)kI3C_SlaveTransmitEvent; + if (0UL != (stateParams->flags & (uint32_t)kI3C_SlaveBusHDRModeFlag)) + { + handle->transfer.event |= (uint32_t)kI3C_SlaveHDRCommandMatchEvent; + handle->isBusy = true; + } + if (NULL != handle->callback) + { + handle->callback(base, &handle->transfer, handle->userData); + } + + /* Clear the transferred count now that we have a new buffer. */ + handle->transferredCount = 0; + } + + if ((NULL == handle->transfer.txData) || (0UL == handle->transfer.txDataSize)) + { + I3C_SlaveDisableInterrupts(base, (uint32_t)kI3C_SlaveTxReadyFlag); + (stateParams->pendingInts) &= ~(uint32_t)kI3C_SlaveTxReadyFlag; + } + + /* Transmit a byte. */ + while ((handle->transfer.txDataSize != 0UL) && ((stateParams->txCount) != 0U)) + { + if (handle->transfer.txDataSize > 1UL) + { + base->SWDATAB = *handle->transfer.txData++; + } + else + { + base->SWDATABE = *handle->transfer.txData++; + I3C_SlaveDisableInterrupts(base, (uint32_t)kI3C_SlaveTxReadyFlag); + } + --(handle->transfer.txDataSize); + ++(handle->transferredCount); + (stateParams->txCount)--; + } +} + +static void I3C_SlaveTransferHandleRxReady(I3C_Type *base, + i3c_slave_handle_t *handle, + i3c_slave_handleIrq_param_t *stateParams) +{ + assert(NULL != base && NULL != handle && NULL != stateParams); + /* If we're out of room in the buffer, invoke callback to get another. */ + if ((NULL == handle->transfer.rxData) || (0UL == handle->transfer.rxDataSize)) + { + handle->transfer.event = (uint32_t)kI3C_SlaveReceiveEvent; + if (0UL != (stateParams->flags & (uint32_t)kI3C_SlaveBusHDRModeFlag)) + { + handle->transfer.event |= (uint32_t)kI3C_SlaveHDRCommandMatchEvent; + handle->isBusy = true; + } + if (NULL != handle->callback) + { + handle->callback(base, &handle->transfer, handle->userData); + } + handle->transferredCount = 0; + } + /* Receive a byte. */ + while ((stateParams->rxCount != 0U) && ((handle->transfer.rxData != NULL) && (handle->transfer.rxDataSize != 0UL))) + { + *(handle->transfer.rxData++) = (uint8_t)base->SRDATAB; + --(handle->transfer.rxDataSize); + ++(handle->transferredCount); + (stateParams->rxCount)--; + } +} + +/*! + * brief Reusable routine to handle slave interrupts. + * note This function does not need to be called unless you are reimplementing the + * non blocking API's interrupt handler routines to add special functionality. + * param base The I3C peripheral base address. + * param intHandle Pointer to #i3c_slave_handle_t structure which stores the transfer state. + */ +void I3C_SlaveTransferHandleIRQ(I3C_Type *base, void *intHandle) +{ + i3c_slave_handleIrq_param_t stateParams; + + (void)memset(&stateParams, 0, sizeof(stateParams)); + i3c_slave_handle_t *handle = (i3c_slave_handle_t *)intHandle; + + /* Check for a valid handle in case of a spurious interrupt. */ + if (NULL == handle) + { + return; + } + + /* Get status flags. */ + if (false == I3C_SlaveTransferHandleGetStatusFlags(base, handle, &stateParams)) + { + return; + } + + /* Clear status flags. */ + I3C_SlaveClearStatusFlags(base, stateParams.flags); + + if (0UL != (stateParams.flags & (uint32_t)kI3C_SlaveBusStartFlag)) + { + I3C_SlaveTransferHandleBusStart(base, &handle->transfer, &stateParams.pendingInts); + } + + if (0UL != (stateParams.flags & (uint32_t)kI3C_SlaveEventSentFlag)) + { + I3C_SlaveTransferHandleEventSent(base, handle, &handle->transfer); + } + + if (0UL != (stateParams.flags & (uint32_t)kI3C_SlaveReceivedCCCFlag)) + { + I3C_SlaveTransferHandleReceivedCCC(base, handle, &handle->transfer); + } + + if (0UL != (stateParams.flags & (uint32_t)kI3C_SlaveMatchedFlag)) + { + I3C_SlaveTransferHandleMatched(base, handle, &handle->transfer); + } + + /* Get fifo counts and compute room in tx fifo. */ + I3C_SlaveGetFifoCounts(base, &stateParams.rxCount, &stateParams.txCount); + stateParams.txCount = handle->txFifoSize - stateParams.txCount; + + /* Handle transmit and receive. */ + if ((0UL != (stateParams.flags & (uint32_t)kI3C_SlaveTxReadyFlag)) && + (0UL != (stateParams.pendingInts & (uint32_t)kI3C_SlaveTxReadyFlag))) + { + I3C_SlaveTransferHandleTxReady(base, handle, &stateParams); + } + + if ((0UL != (stateParams.flags & (uint32_t)kI3C_SlaveRxReadyFlag)) && + (0UL != (stateParams.enabledInts & (uint32_t)kI3C_SlaveRxReadyFlag))) + { + I3C_SlaveTransferHandleRxReady(base, handle, &stateParams); + } + + /* Handle stop event. */ + if (0UL != (stateParams.flags & (uint32_t)kI3C_SlaveBusStopFlag)) + { + I3C_SlaveTransferHandleBusStop(base, handle, &stateParams); + } +} + +static void I3C_CommonIRQHandler(I3C_Type *base, uint32_t instance) +{ + /* Check for master IRQ. */ + if (((uint32_t)kI3C_MasterOn == (base->MCONFIG & I3C_MCONFIG_MSTENA_MASK)) && (NULL != s_i3cMasterIsr)) + { + /* Master mode. */ + s_i3cMasterIsr(base, s_i3cMasterHandle[instance]); + } + + /* Check for slave IRQ. */ + if ((I3C_SCONFIG_SLVENA_MASK == (base->SCONFIG & I3C_SCONFIG_SLVENA_MASK)) && (NULL != s_i3cSlaveIsr)) + { + /* Slave mode. */ + s_i3cSlaveIsr(base, s_i3cSlaveHandle[instance]); + } + SDK_ISR_EXIT_BARRIER; +} + +#if defined(I3C) +/* Implementation of I3C handler named in startup code. */ +void I3C0_DriverIRQHandler(void); +void I3C0_DriverIRQHandler(void) +{ + I3C_CommonIRQHandler(I3C, 0); +} +#endif + +#if defined(I3C0) +/* Implementation of I3C0 handler named in startup code. */ +void I3C0_DriverIRQHandler(void); +void I3C0_DriverIRQHandler(void) +{ + I3C_CommonIRQHandler(I3C0, 0); +} +#endif + +#if defined(I3C1) +/* Implementation of I3C1 handler named in startup code. */ +void I3C1_DriverIRQHandler(void); +void I3C1_DriverIRQHandler(void) +{ + I3C_CommonIRQHandler(I3C1, 1); +} +#endif + +#if defined(I3C2) +/* Implementation of I3C2 handler named in startup code. */ +void I3C2_DriverIRQHandler(void); +void I3C2_DriverIRQHandler(void) +{ + I3C_CommonIRQHandler(I3C2, 2); +} +#endif + +#if defined(I3C3) +/* Implementation of I3C3 handler named in startup code. */ +void I3C3_DriverIRQHandler(void); +void I3C3_DriverIRQHandler(void) +{ + I3C_CommonIRQHandler(I3C3, 3); +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c.h new file mode 100644 index 00000000000..2a3b5dae82f --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c.h @@ -0,0 +1,1899 @@ +/* + * Copyright 2018-2024 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_I3C_H_ +#define FSL_I3C_H_ + +#include "fsl_common.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @addtogroup i3c + * @{ + */ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief I3C driver version */ +#define FSL_I3C_DRIVER_VERSION (MAKE_VERSION(2, 12, 0)) +/*! @} */ + +/*! @brief Timeout times for waiting flag. */ +#ifndef I3C_RETRY_TIMES +#define I3C_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ +#endif + +#define I3C_MAX_DEVCNT 10U + +#ifndef I3C_IBI_BUFF_SIZE +#define I3C_IBI_BUFF_SIZE 10U +#endif + +/*! @brief I3C status return codes. */ +enum +{ + kStatus_I3C_Busy = MAKE_STATUS(kStatusGroup_I3C, 0), /*!< The master is already performing a transfer. */ + kStatus_I3C_Idle = MAKE_STATUS(kStatusGroup_I3C, 1), /*!< The slave driver is idle. */ + kStatus_I3C_Nak = MAKE_STATUS(kStatusGroup_I3C, 2), /*!< The slave device sent a NAK in response to an address. */ + kStatus_I3C_WriteAbort = + MAKE_STATUS(kStatusGroup_I3C, 3), /*!< The slave device sent a NAK in response to a write. */ + kStatus_I3C_Term = MAKE_STATUS(kStatusGroup_I3C, 4), /*!< The master terminates slave read. */ + kStatus_I3C_HdrParityError = MAKE_STATUS(kStatusGroup_I3C, 5), /*!< Parity error from DDR read. */ + kStatus_I3C_CrcError = MAKE_STATUS(kStatusGroup_I3C, 6), /*!< CRC error from DDR read. */ + kStatus_I3C_ReadFifoError = MAKE_STATUS(kStatusGroup_I3C, 7), /*!< Read from M/SRDATAB register when FIFO empty. */ + kStatus_I3C_WriteFifoError = MAKE_STATUS(kStatusGroup_I3C, 8), /*!< Write to M/SWDATAB register when FIFO full. */ + kStatus_I3C_MsgError = + MAKE_STATUS(kStatusGroup_I3C, 9), /*!< Message SDR/DDR mismatch or read/write message in wrong state */ + kStatus_I3C_InvalidReq = MAKE_STATUS(kStatusGroup_I3C, 10), /*!< Invalid use of request. */ + kStatus_I3C_Timeout = MAKE_STATUS(kStatusGroup_I3C, 11), /*!< The module has stalled too long in a frame. */ + kStatus_I3C_SlaveCountExceed = + MAKE_STATUS(kStatusGroup_I3C, 12), /*!< The I3C slave count has exceed the definition in I3C_MAX_DEVCNT. */ + kStatus_I3C_IBIWon = MAKE_STATUS( + kStatusGroup_I3C, 13), /*!< The I3C slave event IBI or MR or HJ won the arbitration on a header address. */ + kStatus_I3C_OverrunError = MAKE_STATUS(kStatusGroup_I3C, 14), /*!< Slave internal from-bus buffer/FIFO overrun. */ + kStatus_I3C_UnderrunError = MAKE_STATUS(kStatusGroup_I3C, 15), /*!< Slave internal to-bus buffer/FIFO underrun */ + kStatus_I3C_UnderrunNak = + MAKE_STATUS(kStatusGroup_I3C, 16), /*!< Slave internal from-bus buffer/FIFO underrun and NACK error */ + kStatus_I3C_InvalidStart = MAKE_STATUS(kStatusGroup_I3C, 17), /*!< Slave invalid start flag */ + kStatus_I3C_SdrParityError = MAKE_STATUS(kStatusGroup_I3C, 18), /*!< SDR parity error */ + kStatus_I3C_S0S1Error = MAKE_STATUS(kStatusGroup_I3C, 19), /*!< S0 or S1 error */ +}; + +/*! @brief I3C HDR modes. */ +typedef enum _i3c_hdr_mode +{ + kI3C_HDRModeNone = 0x00U, /* Do not support HDR mode. */ + kI3C_HDRModeDDR = 0x01U, /* HDR-DDR Mode. */ + kI3C_HDRModeTSP = 0x02U, /* HDR-TSP Mode. */ + kI3C_HDRModeTSL = 0x04U, /* HDR-TSL Mode. */ +} i3c_hdr_mode_t; + +/*! @brief I3C device information. */ +typedef struct _i3c_device_info +{ + uint8_t dynamicAddr; /*!< Device dynamic address. */ + uint8_t staticAddr; /*!< Static address. */ + uint8_t dcr; /*!< Device characteristics register information. */ + uint8_t bcr; /*!< Bus characteristics register information. */ + uint16_t vendorID; /*!< Device vendor ID(manufacture ID). */ + uint32_t partNumber; /*!< Device part number info */ + uint16_t maxReadLength; /*!< Maximum read length. */ + uint16_t maxWriteLength; /*!< Maximum write length. */ + uint8_t hdrMode; /*!< Support hdr mode, could be OR logic in i3c_hdr_mode. */ +} i3c_device_info_t; + +/*! @} */ + +/*! + * @addtogroup i3c_master_driver + * @{ + */ + +/*! + * @brief I3C master peripheral flags. + * + * The following status register flags can be cleared: + * - #kI3C_MasterSlaveStartFlag + * - #kI3C_MasterControlDoneFlag + * - #kI3C_MasterCompleteFlag + * - #kI3C_MasterArbitrationWonFlag + * - #kI3C_MasterSlave2MasterFlag + * + * All flags except #kI3C_MasterBetweenFlag and #kI3C_MasterNackDetectFlag can be enabled as + * interrupts. + * + * @note These enums are meant to be OR'd together to form a bit mask. + */ +enum _i3c_master_flags +{ + kI3C_MasterBetweenFlag = I3C_MSTATUS_BETWEEN_MASK, /*!< Between messages/DAAs flag */ + kI3C_MasterNackDetectFlag = I3C_MSTATUS_NACKED_MASK, /*!< NACK detected flag */ + kI3C_MasterSlaveStartFlag = I3C_MSTATUS_SLVSTART_MASK, /*!< Slave request start flag */ + kI3C_MasterControlDoneFlag = I3C_MSTATUS_MCTRLDONE_MASK, /*!< Master request complete flag */ + kI3C_MasterCompleteFlag = I3C_MSTATUS_COMPLETE_MASK, /*!< Transfer complete flag */ + kI3C_MasterRxReadyFlag = I3C_MSTATUS_RXPEND_MASK, /*!< Rx data ready in Rx buffer flag */ + kI3C_MasterTxReadyFlag = I3C_MSTATUS_TXNOTFULL_MASK, /*!< Tx buffer ready for Tx data flag */ + kI3C_MasterArbitrationWonFlag = I3C_MSTATUS_IBIWON_MASK, /*!< Header address won arbitration flag */ + kI3C_MasterErrorFlag = I3C_MSTATUS_ERRWARN_MASK, /*!< Error occurred flag */ + kI3C_MasterSlave2MasterFlag = I3C_MSTATUS_NOWMASTER_MASK, /*!< Switch from slave to master flag */ + kI3C_MasterClearFlags = kI3C_MasterSlaveStartFlag | kI3C_MasterControlDoneFlag | kI3C_MasterCompleteFlag | + kI3C_MasterArbitrationWonFlag | kI3C_MasterSlave2MasterFlag | kI3C_MasterErrorFlag, +}; + +/*! + * @brief I3C master error flags to indicate the causes. + * + * @note These enums are meant to be OR'd together to form a bit mask. + */ +enum _i3c_master_error_flags +{ + kI3C_MasterErrorNackFlag = I3C_MERRWARN_NACK_MASK, /*!< Slave NACKed the last address */ + kI3C_MasterErrorWriteAbortFlag = I3C_MERRWARN_WRABT_MASK, /*!< Slave NACKed the write data */ +#if !defined(FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM) || (!FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM) + kI3C_MasterErrorTermFlag = I3C_MERRWARN_TERM_MASK, /*!< Master terminates slave read */ +#endif + kI3C_MasterErrorParityFlag = I3C_MERRWARN_HPAR_MASK, /*!< Parity error from DDR read */ + kI3C_MasterErrorCrcFlag = I3C_MERRWARN_HCRC_MASK, /*!< CRC error from DDR read */ + kI3C_MasterErrorReadFlag = I3C_MERRWARN_OREAD_MASK, /*!< Read from MRDATAB register when FIFO empty */ + kI3C_MasterErrorWriteFlag = I3C_MERRWARN_OWRITE_MASK, /*!< Write to MWDATAB register when FIFO full */ + kI3C_MasterErrorMsgFlag = I3C_MERRWARN_MSGERR_MASK, /*!< Message SDR/DDR mismatch or + read/write message in wrong state */ + kI3C_MasterErrorInvalidReqFlag = I3C_MERRWARN_INVREQ_MASK, /*!< Invalid use of request */ + kI3C_MasterErrorTimeoutFlag = I3C_MERRWARN_TIMEOUT_MASK, /*!< The module has stalled too long in a frame */ + kI3C_MasterAllErrorFlags = kI3C_MasterErrorNackFlag | kI3C_MasterErrorWriteAbortFlag | +#if !defined(FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM) || (!FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM) + kI3C_MasterErrorTermFlag | +#endif + kI3C_MasterErrorParityFlag | kI3C_MasterErrorCrcFlag | kI3C_MasterErrorReadFlag | + kI3C_MasterErrorWriteFlag | kI3C_MasterErrorMsgFlag | kI3C_MasterErrorInvalidReqFlag | + kI3C_MasterErrorTimeoutFlag, /*!< All error flags */ +}; + +/*! @brief I3C working master state. */ +typedef enum _i3c_master_state +{ + kI3C_MasterStateIdle = 0U, /*!< Bus stopped. */ + kI3C_MasterStateSlvReq = 1U, /*!< Bus stopped but slave holding SDA low. */ + kI3C_MasterStateMsgSdr = 2U, /*!< In SDR Message mode from using MWMSG_SDR. */ + kI3C_MasterStateNormAct = 3U, /*!< In normal active SDR mode. */ + kI3C_MasterStateDdr = 4U, /*!< In DDR Message mode. */ + kI3C_MasterStateDaa = 5U, /*!< In ENTDAA mode. */ + kI3C_MasterStateIbiAck = 6U, /*!< Waiting on IBI ACK/NACK decision. */ + kI3C_MasterStateIbiRcv = 7U, /*!< receiving IBI. */ +} i3c_master_state_t; + +/*! @brief I3C master enable configuration. */ +typedef enum _i3c_master_enable +{ + kI3C_MasterOff = 0U, /*!< Master off. */ + kI3C_MasterOn = 1U, /*!< Master on. */ + kI3C_MasterCapable = 2U /*!< Master capable. */ +} i3c_master_enable_t; + +/*! @brief I3C high keeper configuration. */ +typedef enum _i3c_master_hkeep +{ + kI3C_MasterHighKeeperNone = 0U, /*!< Use PUR to hold SCL high. */ + kI3C_MasterHighKeeperWiredIn = 1U, /*!< Use pin_HK controls. */ + kI3C_MasterPassiveSDA = 2U, /*!< Hi-Z for Bus Free and hold SDA. */ + kI3C_MasterPassiveSDASCL = 3U /*!< Hi-Z both for Bus Free, and can Hi-Z SDA for hold. */ +} i3c_master_hkeep_t; + +/*! @brief Emits the requested operation when doing in pieces vs. by message. */ +typedef enum _i3c_bus_request +{ + kI3C_RequestNone = 0U, /*!< No request. */ + kI3C_RequestEmitStartAddr = 1U, /*!< Request to emit start and address on bus. */ + kI3C_RequestEmitStop = 2U, /*!< Request to emit stop on bus. */ + kI3C_RequestIbiAckNack = 3U, /*!< Manual IBI ACK or NACK. */ + kI3C_RequestProcessDAA = 4U, /*!< Process DAA. */ + kI3C_RequestForceExit = 6U, /*!< Request to force exit. */ + kI3C_RequestAutoIbi = 7U, /*!< Hold in stopped state, but Auto-emit START,7E. */ +} i3c_bus_request_t; + +/*! @brief Bus type with EmitStartAddr. */ +typedef enum _i3c_bus_type +{ + kI3C_TypeI3CSdr = 0U, /*!< SDR mode of I3C. */ + kI3C_TypeI2C = 1U, /*!< Standard i2c protocol. */ + kI3C_TypeI3CDdr = 2U, /*!< HDR-DDR mode of I3C. */ +} i3c_bus_type_t; + +/*! @brief IBI response. */ +typedef enum _i3c_ibi_response +{ + kI3C_IbiRespAck = 0U, /*!< ACK with no mandatory byte. */ + kI3C_IbiRespNack = 1U, /*!< NACK. */ + kI3C_IbiRespAckMandatory = 2U, /*!< ACK with mandatory byte. */ + kI3C_IbiRespManual = 3U, /*!< Reserved. */ +} i3c_ibi_response_t; + +/*! @brief IBI type. */ +typedef enum _i3c_ibi_type +{ + kI3C_IbiNormal = 0U, /*!< In-band interrupt. */ + kI3C_IbiHotJoin = 1U, /*!< slave hot join. */ + kI3C_IbiMasterRequest = 2U, /*!< slave master ship request. */ +} i3c_ibi_type_t; + +/*! @brief IBI state. */ +typedef enum _i3c_ibi_state +{ + kI3C_IbiReady = 0U, /*!< In-band interrupt ready state, ready for user to handle. */ + kI3C_IbiDataBuffNeed = 1U, /*!< In-band interrupt need data buffer for data receive. */ + kI3C_IbiAckNackPending = 2U, /*!< In-band interrupt Ack/Nack pending for decision. */ +} i3c_ibi_state_t; + +/*! @brief Direction of master and slave transfers. */ +typedef enum _i3c_direction +{ + kI3C_Write = 0U, /*!< Master transmit. */ + kI3C_Read = 1U /*!< Master receive. */ +} i3c_direction_t; + +/*! @brief Watermark of TX int/dma trigger level. */ +typedef enum _i3c_tx_trigger_level +{ + kI3C_TxTriggerOnEmpty = 0U, /*!< Trigger on empty. */ + kI3C_TxTriggerUntilOneQuarterOrLess = 1U, /*!< Trigger on 1/4 full or less. */ + kI3C_TxTriggerUntilOneHalfOrLess = 2U, /*!< Trigger on 1/2 full or less. */ + kI3C_TxTriggerUntilOneLessThanFull = 3U, /*!< Trigger on 1 less than full or less. */ +} i3c_tx_trigger_level_t; + +/*! @brief Watermark of RX int/dma trigger level. */ +typedef enum _i3c_rx_trigger_level +{ + kI3C_RxTriggerOnNotEmpty = 0U, /*!< Trigger on not empty. */ + kI3C_RxTriggerUntilOneQuarterOrMore = 1U, /*!< Trigger on 1/4 full or more. */ + kI3C_RxTriggerUntilOneHalfOrMore = 2U, /*!< Trigger on 1/2 full or more. */ + kI3C_RxTriggerUntilThreeQuarterOrMore = 3U, /*!< Trigger on 3/4 full or more. */ +} i3c_rx_trigger_level_t; + +/*! @brief I3C master read termination operations. */ +typedef enum _i3c_rx_term_ops +{ + kI3C_RxTermDisable = 0U, /*!< Master doesn't terminate read, used for CCC transfer. */ + kI3C_RxAutoTerm = 1U, /*!< Master auto terminate read after receiving specified bytes(<=255). */ + kI3C_RxTermLastByte = 2U, /*!< Master terminates read at any time after START, no length limitation. */ +} i3c_rx_term_ops_t; + +/*! @brief I3C start SCL delay options. */ +typedef enum _i3c_start_scl_delay +{ + kI3C_NoDelay = 0U, /*!< No delay. */ + kI3C_IncreaseSclHalfPeriod = 1U, /*!< Increases SCL clock period by 1/2. */ + kI3C_IncreaseSclOnePeriod = 2U, /*!< Increases SCL clock period by 1. */ + kI3C_IncreaseSclOneAndHalfPeriod = 3U, /*!< Increases SCL clock period by 1 1/2 */ +} i3c_start_scl_delay_t; + +/*! @brief Structure with setting master IBI rules and slave registry. */ +typedef struct _i3c_register_ibi_addr +{ + uint8_t address[5]; /*!< Address array for registry. */ + bool ibiHasPayload; /*!< Whether the address array has mandatory IBI byte. */ +} i3c_register_ibi_addr_t; + +/*! @brief Structure with I3C baudrate settings. */ +typedef struct _i3c_baudrate +{ + uint32_t i2cBaud; /*!< Desired I2C baud rate in Hertz. */ + uint32_t i3cPushPullBaud; /*!< Desired I3C push-pull baud rate in Hertz. */ + uint32_t i3cOpenDrainBaud; /*!< Desired I3C open-drain baud rate in Hertz. */ +} i3c_baudrate_hz_t; + +/*! @brief I3C DAA baud rate configuration. */ +typedef struct _i3c_master_daa_baudrate +{ + uint32_t sourceClock_Hz; /*!< FCLK, function clock in Hertz. */ + uint32_t i3cPushPullBaud; /*!< Desired I3C push-pull baud rate in Hertz. */ + uint32_t i3cOpenDrainBaud; /*!< Desired I3C open-drain baud rate in Hertz. */ +} i3c_master_daa_baudrate_t; + +/*! + * @brief Structure with settings to initialize the I3C master module. + * + * This structure holds configuration settings for the I3C peripheral. To initialize this + * structure to reasonable defaults, call the I3C_MasterGetDefaultConfig() function and + * pass a pointer to your configuration structure instance. + * + * The configuration structure can be made constant so it resides in flash. + */ +typedef struct _i3c_master_config +{ + i3c_master_enable_t enableMaster; /*!< Enable master mode. */ + bool disableTimeout; /*!< Whether to disable timeout to prevent the ERRWARN. */ + i3c_master_hkeep_t hKeep; /*!< High keeper mode setting. */ + bool enableOpenDrainStop; /*!< Whether to emit open-drain speed STOP. */ + bool enableOpenDrainHigh; /*!< Enable Open-Drain High to be 1 PPBAUD count for i3c messages, or 1 ODBAUD. */ + i3c_baudrate_hz_t baudRate_Hz; /*!< Desired baud rate settings. */ +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) && FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH) + uint32_t slowClock_Hz; /*!< Slow clock frequency. */ +#endif +#if defined(FSL_FEATURE_I3C_HAS_START_SCL_DELAY) && FSL_FEATURE_I3C_HAS_START_SCL_DELAY + i3c_start_scl_delay_t startSclDelay; /*!< I3C SCL delay after START. */ + i3c_start_scl_delay_t restartSclDelay; /*!< I3C SCL delay after Repeated START. */ +#endif +} i3c_master_config_t; + +/* Forward declaration of the transfer descriptor and handle typedefs. */ +typedef struct _i3c_master_transfer i3c_master_transfer_t; +typedef struct _i3c_master_handle i3c_master_handle_t; + +/*! @brief i3c master callback functions. */ +typedef struct _i3c_master_transfer_callback +{ + void (*slave2Master)(I3C_Type *base, void *userData); /*!< Transfer complete callback */ + void (*ibiCallback)(I3C_Type *base, + i3c_master_handle_t *handle, + i3c_ibi_type_t ibiType, + i3c_ibi_state_t ibiState); /*!< IBI event callback */ + void (*transferComplete)(I3C_Type *base, + i3c_master_handle_t *handle, + status_t completionStatus, + void *userData); /*!< Transfer complete callback */ +} i3c_master_transfer_callback_t; +/*! + * @brief Transfer option flags. + * + * @note These enumerations are intended to be OR'd together to form a bit mask of options for + * the #_i3c_master_transfer::flags field. + */ +enum _i3c_master_transfer_flags +{ + kI3C_TransferDefaultFlag = 0x00U, /*!< Transfer starts with a start signal, stops with a stop signal. */ + kI3C_TransferNoStartFlag = 0x01U, /*!< Don't send a start condition, address, and sub address */ + kI3C_TransferRepeatedStartFlag = 0x02U, /*!< Send a repeated start condition */ + kI3C_TransferNoStopFlag = 0x04U, /*!< Don't send a stop condition. */ + kI3C_TransferWordsFlag = 0x08U, /*!< Transfer in words, else transfer in bytes. */ + kI3C_TransferDisableRxTermFlag = 0x10U, /*!< Disable Rx termination. Note: It's for I3C CCC transfer. */ + kI3C_TransferRxAutoTermFlag = + 0x20U, /*!< Set Rx auto-termination. Note: It's adaptive based on Rx size(<=255 bytes) except in I3C_MasterReceive. */ + kI3C_TransferStartWithBroadcastAddr = 0x40U, /*!< Start transfer with 0x7E, then read/write data with device address. */ +}; + +/*! + * @brief Non-blocking transfer descriptor structure. + * + * This structure is used to pass transaction parameters to the I3C_MasterTransferNonBlocking() API. + */ +struct _i3c_master_transfer +{ + uint32_t flags; /*!< Bit mask of options for the transfer. See enumeration #_i3c_master_transfer_flags for available + options. Set to 0 or #kI3C_TransferDefaultFlag for normal transfers. */ + uint8_t slaveAddress; /*!< The 7-bit slave address. */ + i3c_direction_t direction; /*!< Either #kI3C_Read or #kI3C_Write. */ + uint32_t subaddress; /*!< Sub address. Transferred MSB first. */ + size_t subaddressSize; /*!< Length of sub address to send in bytes. Maximum size is 4 bytes. */ + void *data; /*!< Pointer to data to transfer. */ + size_t dataSize; /*!< Number of bytes to transfer. */ + i3c_bus_type_t busType; /*!< bus type. */ + i3c_ibi_response_t ibiResponse; /*!< ibi response during transfer. */ +}; + +/*! + * @brief Driver handle for master non-blocking APIs. + * @note The contents of this structure are private and subject to change. + */ +struct _i3c_master_handle +{ + uint8_t state; /*!< Transfer state machine current state. */ + uint32_t remainingBytes; /*!< Remaining byte count in current state. */ + i3c_rx_term_ops_t rxTermOps; /*!< Read termination operation. */ + i3c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ + uint8_t ibiAddress; /*!< Slave address which request IBI. */ + uint8_t *ibiBuff; /*!< Pointer to IBI buffer to keep ibi bytes. */ + size_t ibiPayloadSize; /*!< IBI payload size. */ + i3c_ibi_type_t ibiType; /*!< IBI type. */ + i3c_master_transfer_callback_t callback; /*!< Callback functions pointer. */ + void *userData; /*!< Application data passed to callback. */ +}; + +/*! @brief Typedef for master interrupt handler. */ +typedef void (*i3c_master_isr_t)(I3C_Type *base, void *handle); + +/*! @} */ + +/*! + * @addtogroup i3c_slave_driver + * @{ + */ + +/*! + * @brief I3C slave peripheral flags. + * + * The following status register flags can be cleared: + * - #kI3C_SlaveBusStartFlag + * - #kI3C_SlaveMatchedFlag + * - #kI3C_SlaveBusStopFlag + * + * Only below flags can be enabled as interrupts. + * - #kI3C_SlaveBusStartFlag + * - #kI3C_SlaveMatchedFlag + * - #kI3C_SlaveBusStopFlag + * - #kI3C_SlaveRxReadyFlag + * - #kI3C_SlaveTxReadyFlag + * - #kI3C_SlaveDynamicAddrChangedFlag + * - #kI3C_SlaveReceivedCCCFlag + * - #kI3C_SlaveErrorFlag + * - #kI3C_SlaveHDRCommandMatchFlag + * - #kI3C_SlaveCCCHandledFlag + * - #kI3C_SlaveEventSentFlag + + * @note These enums are meant to be OR'd together to form a bit mask. + */ +enum _i3c_slave_flags +{ + kI3C_SlaveNotStopFlag = I3C_SSTATUS_STNOTSTOP_MASK, /*!< Slave status not stop flag */ + kI3C_SlaveMessageFlag = I3C_SSTATUS_STMSG_MASK, /*!< Slave status message, indicating slave is + listening to the bus traffic or responding */ + kI3C_SlaveRequiredReadFlag = I3C_SSTATUS_STREQRD_MASK, /*!< Slave status required, either is master doing SDR + read from slave, or is IBI pushing out. */ + kI3C_SlaveRequiredWriteFlag = I3C_SSTATUS_STREQWR_MASK, /*!< Slave status request write, master is doing SDR + write to slave, except slave in ENTDAA mode */ + kI3C_SlaveBusDAAFlag = I3C_SSTATUS_STDAA_MASK, /*!< I3C bus is in ENTDAA mode */ + kI3C_SlaveBusHDRModeFlag = I3C_SSTATUS_STHDR_MASK, /*!< I3C bus is in HDR mode */ + kI3C_SlaveBusStartFlag = I3C_SSTATUS_START_MASK, /*!< Start/Re-start event is seen since the bus was last cleared */ + kI3C_SlaveMatchedFlag = I3C_SSTATUS_MATCHED_MASK, /*!< Slave address(dynamic/static) matched since last cleared */ + kI3C_SlaveBusStopFlag = I3C_SSTATUS_STOP_MASK, /*!enableMaster = kI3C_MasterCapable; + * config->disableTimeout = false; + * config->hKeep = kI3C_MasterHighKeeperNone; + * config->enableOpenDrainStop = true; + * config->enableOpenDrainHigh = true; + * config->baudRate_Hz.i2cBaud = 400000U; + * config->baudRate_Hz.i3cPushPullBaud = 12500000U; + * config->baudRate_Hz.i3cOpenDrainBaud = 2500000U; + * config->masterDynamicAddress = 0x0AU; + * config->slowClock_Hz = 1000000U; + * config->enableSlave = true; + * config->vendorID = 0x11BU; + * config->enableRandomPart = false; + * config->partNumber = 0; + * config->dcr = 0; + * config->bcr = 0; + * config->hdrMode = (uint8_t)kI3C_HDRModeDDR; + * config->nakAllRequest = false; + * config->ignoreS0S1Error = false; + * config->offline = false; + * config->matchSlaveStartStop = false; + * @endcode + * + * After calling this function, you can override any settings in order to customize the configuration, + * prior to initializing the common I3C driver with I3C_Init(). + * + * @param[out] config User provided configuration structure for default values. Refer to #i3c_config_t. + */ +void I3C_GetDefaultConfig(i3c_config_t *config); + +/*! + * @brief Initializes the I3C peripheral. + * This function enables the peripheral clock and initializes the I3C peripheral as described by the user + * provided configuration. This will initialize both the master peripheral and slave peripheral so that I3C + * module could work as pure master, pure slave or secondary master, etc. + * A software reset is performed prior to configuration. + * + * @param base The I3C peripheral base address. + * @param config User provided peripheral configuration. Use I3C_GetDefaultConfig() to get a set of + * defaults that you can override. + * @param sourceClock_Hz Frequency in Hertz of the I3C functional clock. Used to calculate the baud rate divisors, + * filter widths, and timeout periods. + */ +void I3C_Init(I3C_Type *base, const i3c_config_t *config, uint32_t sourceClock_Hz); + +/*! @} */ + +/*! + * @addtogroup i3c_master_driver + * @{ + */ + +/*! @name Initialization and deinitialization */ +/*! @{ */ + +/*! + * @brief Provides a default configuration for the I3C master peripheral. + * + * This function provides the following default configuration for the I3C master peripheral: + * @code + * masterConfig->enableMaster = kI3C_MasterOn; + * masterConfig->disableTimeout = false; + * masterConfig->hKeep = kI3C_MasterHighKeeperNone; + * masterConfig->enableOpenDrainStop = true; + * masterConfig->enableOpenDrainHigh = true; + * masterConfig->baudRate_Hz = 100000U; + * masterConfig->busType = kI3C_TypeI2C; + * @endcode + * + * After calling this function, you can override any settings in order to customize the configuration, + * prior to initializing the master driver with I3C_MasterInit(). + * + * @param[out] masterConfig User provided configuration structure for default values. Refer to #i3c_master_config_t. + */ +void I3C_MasterGetDefaultConfig(i3c_master_config_t *masterConfig); + +/*! + * @brief Initializes the I3C master peripheral. + * + * This function enables the peripheral clock and initializes the I3C master peripheral as described by the user + * provided configuration. A software reset is performed prior to configuration. + * + * @param base The I3C peripheral base address. + * @param masterConfig User provided peripheral configuration. Use I3C_MasterGetDefaultConfig() to get a set of + * defaults that you can override. + * @param sourceClock_Hz Frequency in Hertz of the I3C functional clock. Used to calculate the baud rate divisors, + * filter widths, and timeout periods. + */ +void I3C_MasterInit(I3C_Type *base, const i3c_master_config_t *masterConfig, uint32_t sourceClock_Hz); + +/*! + * @brief Deinitializes the I3C master peripheral. + * + * This function disables the I3C master peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * @param base The I3C peripheral base address. + */ +void I3C_MasterDeinit(I3C_Type *base); + +/* Not static so it can be used from fsl_i3c_dma.c. */ +status_t I3C_MasterCheckAndClearError(I3C_Type *base, uint32_t status); + +/* Not static so it can be used from fsl_i3c_dma.c. */ +status_t I3C_MasterWaitForCtrlDone(I3C_Type *base, bool waitIdle); + +/* Not static so it can be used from fsl_i3c_dma.c. */ +status_t I3C_CheckForBusyBus(I3C_Type *base); + +/*! + * @brief Set I3C module master mode. + * + * @param base The I3C peripheral base address. + * @param enable Enable master mode. + */ +static inline void I3C_MasterEnable(I3C_Type *base, i3c_master_enable_t enable) +{ + base->MCONFIG = (base->MCONFIG & ~I3C_MCONFIG_MSTENA_MASK) | I3C_MCONFIG_MSTENA(enable); +} + +/*! @} */ + +/*! @name Status */ +/*! @{ */ + +/*! + * @brief Gets the I3C master status flags. + * + * A bit mask with the state of all I3C master status flags is returned. For each flag, the corresponding bit + * in the return value is set if the flag is asserted. + * + * @param base The I3C peripheral base address. + * @return State of the status flags: + * - 1: related status flag is set. + * - 0: related status flag is not set. + * @see _i3c_master_flags + */ +static inline uint32_t I3C_MasterGetStatusFlags(I3C_Type *base) +{ + return base->MSTATUS & ~(I3C_MSTATUS_STATE_MASK | I3C_MSTATUS_IBITYPE_MASK); +} + +/*! + * @brief Clears the I3C master status flag state. + * + * The following status register flags can be cleared: + * - #kI3C_MasterSlaveStartFlag + * - #kI3C_MasterControlDoneFlag + * - #kI3C_MasterCompleteFlag + * - #kI3C_MasterArbitrationWonFlag + * - #kI3C_MasterSlave2MasterFlag + * + * Attempts to clear other flags has no effect. + * + * @param base The I3C peripheral base address. + * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of + * #_i3c_master_flags enumerators OR'd together. You may pass the result of a previous call to + * I3C_MasterGetStatusFlags(). + * @see _i3c_master_flags. + */ +static inline void I3C_MasterClearStatusFlags(I3C_Type *base, uint32_t statusMask) +{ + base->MSTATUS = statusMask; +} + +/*! + * @brief Gets the I3C master error status flags. + * + * A bit mask with the state of all I3C master error status flags is returned. For each flag, the corresponding bit + * in the return value is set if the flag is asserted. + * + * @param base The I3C peripheral base address. + * @return State of the error status flags: + * - 1: related status flag is set. + * - 0: related status flag is not set. + * @see _i3c_master_error_flags + */ +static inline uint32_t I3C_MasterGetErrorStatusFlags(I3C_Type *base) +{ + return base->MERRWARN; +} + +/*! + * @brief Clears the I3C master error status flag state. + * + * @param base The I3C peripheral base address. + * @param statusMask A bitmask of error status flags that are to be cleared. The mask is composed of + * #_i3c_master_error_flags enumerators OR'd together. You may pass the result of a previous call to + * I3C_MasterGetStatusFlags(). + * @see _i3c_master_error_flags. + */ +static inline void I3C_MasterClearErrorStatusFlags(I3C_Type *base, uint32_t statusMask) +{ + while ((base->MERRWARN & statusMask) != 0U) + { + base->MERRWARN = statusMask; + } +} + +/*! + * @brief Gets the I3C master state. + * + * @param base The I3C peripheral base address. + * @return I3C master state. + */ +i3c_master_state_t I3C_MasterGetState(I3C_Type *base); + +/*! @} */ + +/*! @name Interrupts */ +/*! @{ */ + +/*! + * @brief Enables the I3C master interrupt requests. + * + * All flags except #kI3C_MasterBetweenFlag and #kI3C_MasterNackDetectFlag can be enabled as + * interrupts. + * + * @param base The I3C peripheral base address. + * @param interruptMask Bit mask of interrupts to enable. See #_i3c_master_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void I3C_MasterEnableInterrupts(I3C_Type *base, uint32_t interruptMask) +{ + base->MINTSET |= interruptMask; +} + +/*! + * @brief Disables the I3C master interrupt requests. + * + * All flags except #kI3C_MasterBetweenFlag and #kI3C_MasterNackDetectFlag can be enabled as + * interrupts. + * + * @param base The I3C peripheral base address. + * @param interruptMask Bit mask of interrupts to disable. See #_i3c_master_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void I3C_MasterDisableInterrupts(I3C_Type *base, uint32_t interruptMask) +{ + base->MINTCLR = interruptMask; +} + +/*! + * @brief Returns the set of currently enabled I3C master interrupt requests. + * + * @param base The I3C peripheral base address. + * @return A bitmask composed of #_i3c_master_flags enumerators OR'd together to indicate the + * set of enabled interrupts. + */ +static inline uint32_t I3C_MasterGetEnabledInterrupts(I3C_Type *base) +{ + return base->MINTSET; +} + +/*! + * @brief Returns the set of pending I3C master interrupt requests. + * + * @param base The I3C peripheral base address. + * @return A bitmask composed of #_i3c_master_flags enumerators OR'd together to indicate the + * set of pending interrupts. + */ +static inline uint32_t I3C_MasterGetPendingInterrupts(I3C_Type *base) +{ + return base->MINTMASKED; +} + +/*! @} */ + +/*! @name DMA control */ +/*! @{ */ + +/*! + * @brief Enables or disables I3C master DMA requests. + * + * @param base The I3C peripheral base address. + * @param enableTx Enable flag for transmit DMA request. Pass true for enable, false for disable. + * @param enableRx Enable flag for receive DMA request. Pass true for enable, false for disable. + * @param width DMA read/write unit in bytes. + */ +static inline void I3C_MasterEnableDMA(I3C_Type *base, bool enableTx, bool enableRx, uint32_t width) +{ + assert(width <= 2U); + base->MDMACTRL = + I3C_MDMACTRL_DMAFB(enableRx ? 2U : 0U) | I3C_MDMACTRL_DMATB(enableTx ? 2U : 0U) | I3C_MDMACTRL_DMAWIDTH(width); +} + +/*! + * @brief Gets I3C master transmit data register address for DMA transfer. + * + * @param base The I3C peripheral base address. + * @param width DMA read/write unit in bytes. + * @return The I3C Master Transmit Data Register address. + */ +static inline uint32_t I3C_MasterGetTxFifoAddress(I3C_Type *base, uint32_t width) +{ + assert(width <= 2U); + return (uint32_t)((width == 2U) ? &base->MWDATAH : &base->MWDATAB); +} + +/*! + * @brief Gets I3C master receive data register address for DMA transfer. + * + * @param base The I3C peripheral base address. + * @param width DMA read/write unit in bytes. + * @return The I3C Master Receive Data Register address. + */ +static inline uint32_t I3C_MasterGetRxFifoAddress(I3C_Type *base, uint32_t width) +{ + assert(width <= 2U); + return (uint32_t)((width == 2U) ? &base->MRDATAH : &base->MRDATAB); +} + +/*! @} */ + +/*! @name FIFO control */ +/*! @{ */ + +/*! + * @brief Sets the watermarks for I3C master FIFOs. + * + * @param base The I3C peripheral base address. + * @param txLvl Transmit FIFO watermark level. The #kI3C_MasterTxReadyFlag flag is set whenever + * the number of words in the transmit FIFO reaches @a txLvl. + * @param rxLvl Receive FIFO watermark level. The #kI3C_MasterRxReadyFlag flag is set whenever + * the number of words in the receive FIFO reaches @a rxLvl. + * @param flushTx true if TX FIFO is to be cleared, otherwise TX FIFO remains unchanged. + * @param flushRx true if RX FIFO is to be cleared, otherwise RX FIFO remains unchanged. + */ +static inline void I3C_MasterSetWatermarks( + I3C_Type *base, i3c_tx_trigger_level_t txLvl, i3c_rx_trigger_level_t rxLvl, bool flushTx, bool flushRx) +{ + base->MDATACTRL = I3C_MDATACTRL_UNLOCK_MASK | I3C_MDATACTRL_TXTRIG(txLvl) | I3C_MDATACTRL_RXTRIG(rxLvl) | + (flushTx ? I3C_MDATACTRL_FLUSHTB_MASK : 0U) | (flushRx ? I3C_MDATACTRL_FLUSHFB_MASK : 0U); +} + +/*! + * @brief Gets the current number of bytes in the I3C master FIFOs. + * + * @param base The I3C peripheral base address. + * @param[out] txCount Pointer through which the current number of bytes in the transmit FIFO is returned. + * Pass NULL if this value is not required. + * @param[out] rxCount Pointer through which the current number of bytes in the receive FIFO is returned. + * Pass NULL if this value is not required. + */ +static inline void I3C_MasterGetFifoCounts(I3C_Type *base, size_t *rxCount, size_t *txCount) +{ + if (NULL != txCount) + { + *txCount = (base->MDATACTRL & I3C_MDATACTRL_TXCOUNT_MASK) >> I3C_MDATACTRL_TXCOUNT_SHIFT; + } + if (NULL != rxCount) + { + *rxCount = (base->MDATACTRL & I3C_MDATACTRL_RXCOUNT_MASK) >> I3C_MDATACTRL_RXCOUNT_SHIFT; + } +} + +/*! @} */ + +/*! @name Bus operations */ +/*! @{ */ + +/*! + * @brief Sets the I3C bus frequency for master transactions. + * + * The I3C master is automatically disabled and re-enabled as necessary to configure the baud + * rate. Do not call this function during a transfer, or the transfer is aborted. + * + * @param base The I3C peripheral base address. + * @param baudRate_Hz Pointer to structure of requested bus frequency in Hertz. + * @param sourceClock_Hz I3C functional clock frequency in Hertz. + */ +void I3C_MasterSetBaudRate(I3C_Type *base, const i3c_baudrate_hz_t *baudRate_Hz, uint32_t sourceClock_Hz); + +/*! + * @brief Returns whether the bus is idle. + * + * Requires the master mode to be enabled. + * + * @param base The I3C peripheral base address. + * @retval true Bus is busy. + * @retval false Bus is idle. + */ +static inline bool I3C_MasterGetBusIdleState(I3C_Type *base) +{ + return ((base->MSTATUS & I3C_MSTATUS_STATE_MASK) == (uint32_t)kI3C_MasterStateIdle ? true : false); +} + +/*! + * @brief Sends a START signal and slave address on the I2C/I3C bus, receive size is also specified + * in the call. + * + * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure + * that another master is not occupying the bus. Then a START signal is transmitted, followed by the + * 7-bit address specified in the a address parameter. Note that this function does not actually wait + * until the START and address are successfully sent on the bus before returning. + * + * @param base The I3C peripheral base address. + * @param type The bus type to use in this transaction. + * @param address 7-bit slave device address, in bits [6:0]. + * @param dir Master transfer direction, either #kI3C_Read or #kI3C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * @param rxSize Read terminate size for the followed read transfer, limit to 255 bytes. + * @retval #kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. + * @retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + */ +status_t I3C_MasterStartWithRxSize( + I3C_Type *base, i3c_bus_type_t type, uint8_t address, i3c_direction_t dir, uint8_t rxSize); + +/*! + * @brief Sends a START signal and slave address on the I2C/I3C bus. + * + * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure + * that another master is not occupying the bus. Then a START signal is transmitted, followed by the + * 7-bit address specified in the @a address parameter. Note that this function does not actually wait + * until the START and address are successfully sent on the bus before returning. + * + * @param base The I3C peripheral base address. + * @param type The bus type to use in this transaction. + * @param address 7-bit slave device address, in bits [6:0]. + * @param dir Master transfer direction, either #kI3C_Read or #kI3C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * @retval #kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. + * @retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + */ +status_t I3C_MasterStart(I3C_Type *base, i3c_bus_type_t type, uint8_t address, i3c_direction_t dir); + +/*! + * @brief Sends a repeated START signal and slave address on the I2C/I3C bus, receive size is also specified + * in the call. + * + * This function is used to send a Repeated START signal when a transfer is already in progress. Like + * I3C_MasterStart(), it also sends the specified 7-bit address. Call this API also configures the read + * terminate size for the following read transfer. For example, set the rxSize = 2, the following read transfer + * will be terminated after two bytes of data received. Write transfer will not be affected by the rxSize + * configuration. + * + * @note This function exists primarily to maintain compatible APIs between I3C and I2C drivers, + * as well as to better document the intent of code that uses these APIs. + * + * @param base The I3C peripheral base address. + * @param type The bus type to use in this transaction. + * @param address 7-bit slave device address, in bits [6:0]. + * @param dir Master transfer direction, either #kI3C_Read or #kI3C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * @param rxSize Read terminate size for the followed read transfer, limit to 255 bytes. + * @retval #kStatus_Success Repeated START signal and address were successfully enqueued in the transmit FIFO. + */ +status_t I3C_MasterRepeatedStartWithRxSize( + I3C_Type *base, i3c_bus_type_t type, uint8_t address, i3c_direction_t dir, uint8_t rxSize); + +/*! + * @brief Sends a repeated START signal and slave address on the I2C/I3C bus. + * + * This function is used to send a Repeated START signal when a transfer is already in progress. Like + * I3C_MasterStart(), it also sends the specified 7-bit address. + * + * @note This function exists primarily to maintain compatible APIs between I3C and I2C drivers, + * as well as to better document the intent of code that uses these APIs. + * + * @param base The I3C peripheral base address. + * @param type The bus type to use in this transaction. + * @param address 7-bit slave device address, in bits [6:0]. + * @param dir Master transfer direction, either #kI3C_Read or #kI3C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * @retval #kStatus_Success Repeated START signal and address were successfully enqueued in the transmit FIFO. + */ +static inline status_t I3C_MasterRepeatedStart(I3C_Type *base, + i3c_bus_type_t type, + uint8_t address, + i3c_direction_t dir) +{ + return I3C_MasterRepeatedStartWithRxSize(base, type, address, dir, 0); +} + +/*! + * @brief Performs a polling send transfer on the I2C/I3C bus. + * + * Sends up to @a txSize number of bytes to the previously addressed slave device. The slave may + * reply with a NAK to any byte in order to terminate the transfer early. If this happens, this + * function returns #kStatus_I3C_Nak. + * + * @param base The I3C peripheral base address. + * @param txBuff The pointer to the data to be transferred. + * @param txSize The length in bytes of the data to be transferred. + * @param flags Bit mask of options for the transfer. See enumeration #_i3c_master_transfer_flags for available options. + * @retval #kStatus_Success Data was sent successfully. + * @retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_I3C_Timeout The module has stalled too long in a frame. + * @retval #kStatus_I3C_Nak The slave device sent a NAK in response to an address. + * @retval #kStatus_I3C_WriteAbort The slave device sent a NAK in response to a write. + * @retval #kStatus_I3C_MsgError Message SDR/DDR mismatch or read/write message in wrong state. + * @retval #kStatus_I3C_WriteFifoError Write to M/SWDATAB register when FIFO full. + * @retval #kStatus_I3C_InvalidReq Invalid use of request. + */ +status_t I3C_MasterSend(I3C_Type *base, const void *txBuff, size_t txSize, uint32_t flags); + +/*! + * @brief Performs a polling receive transfer on the I2C/I3C bus. + * + * @param base The I3C peripheral base address. + * @param rxBuff The pointer to the data to be transferred. + * @param rxSize The length in bytes of the data to be transferred. + * @param flags Bit mask of options for the transfer. See enumeration #_i3c_master_transfer_flags for available options. + * @retval #kStatus_Success Data was received successfully. + * @retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_I3C_Timeout The module has stalled too long in a frame. + * @retval #kStatus_I3C_Term The master terminates slave read. + * @retval #kStatus_I3C_HdrParityError Parity error from DDR read. + * @retval #kStatus_I3C_CrcError CRC error from DDR read. + * @retval #kStatus_I3C_MsgError Message SDR/DDR mismatch or read/write message in wrong state. + * @retval #kStatus_I3C_ReadFifoError Read from M/SRDATAB register when FIFO empty. + * @retval #kStatus_I3C_InvalidReq Invalid use of request. + */ +status_t I3C_MasterReceive(I3C_Type *base, void *rxBuff, size_t rxSize, uint32_t flags); + +/*! + * @brief Sends a STOP signal on the I2C/I3C bus. + * + * This function does not return until the STOP signal is seen on the bus, or an error occurs. + * + * @param base The I3C peripheral base address. + * @retval #kStatus_Success The STOP signal was successfully sent on the bus and the transaction terminated. + * @retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_I3C_Timeout The module has stalled too long in a frame. + * @retval #kStatus_I3C_InvalidReq Invalid use of request. + */ +status_t I3C_MasterStop(I3C_Type *base); + +/*! + * @brief I3C master emit request. + * + * @param base The I3C peripheral base address. + * @param masterReq I3C master request of type #i3c_bus_request_t + */ +void I3C_MasterEmitRequest(I3C_Type *base, i3c_bus_request_t masterReq); + +/*! + * @brief I3C master emit request. + * + * @param base The I3C peripheral base address. + * @param ibiResponse I3C master emit IBI response of type #i3c_ibi_response_t + */ +static inline void I3C_MasterEmitIBIResponse(I3C_Type *base, i3c_ibi_response_t ibiResponse) +{ + uint32_t ctrlVal = base->MCTRL; + ctrlVal &= ~(I3C_MCTRL_IBIRESP_MASK | I3C_MCTRL_REQUEST_MASK); + ctrlVal |= I3C_MCTRL_IBIRESP((uint32_t)ibiResponse) | I3C_MCTRL_REQUEST(kI3C_RequestIbiAckNack); + base->MCTRL = ctrlVal; +} + +/*! + * @brief I3C master register IBI rule. + * + * @param base The I3C peripheral base address. + * @param ibiRule Pointer to ibi rule description of type #i3c_register_ibi_addr_t + */ +void I3C_MasterRegisterIBI(I3C_Type *base, i3c_register_ibi_addr_t *ibiRule); + +/*! + * @brief I3C master get IBI rule. + * + * @param base The I3C peripheral base address. + * @param ibiRule Pointer to store the read out ibi rule description. + */ +void I3C_MasterGetIBIRules(I3C_Type *base, i3c_register_ibi_addr_t *ibiRule); + +/*! + * @brief I3C master get IBI Type. + * + * @param base The I3C peripheral base address. + * @retval i3c_ibi_type_t Type of #i3c_ibi_type_t. + */ +i3c_ibi_type_t I3C_GetIBIType(I3C_Type *base); + +/*! + * @brief I3C master get IBI Address. + * + * @param base The I3C peripheral base address. + * @retval The 8-bit IBI address. + */ +static inline uint8_t I3C_GetIBIAddress(I3C_Type *base) +{ + return (uint8_t)((base->MSTATUS & I3C_MSTATUS_IBIADDR_MASK) >> I3C_MSTATUS_IBIADDR_SHIFT); +} + +/*! + * @brief Performs a DAA in the i3c bus with specified temporary baud rate. + * + * @param base The I3C peripheral base address. + * @param addressList The pointer for address list which is used to do DAA. + * @param count The address count in the address list. + * @param daaBaudRate The temporary baud rate in DAA process, NULL for using initial setting. + * The initial setting is set back between the completion of the DAA and the return of this function. + * @retval #kStatus_Success The transaction was started successfully. + * @retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + * @retval #kStatus_I3C_SlaveCountExceed The I3C slave count has exceed the definition in I3C_MAX_DEVCNT. + */ +status_t I3C_MasterProcessDAASpecifiedBaudrate(I3C_Type *base, + uint8_t *addressList, + uint32_t count, + i3c_master_daa_baudrate_t *daaBaudRate); + +/*! + * @brief Performs a DAA in the i3c bus. + * + * @param base The I3C peripheral base address. + * @param addressList The pointer for address list which is used to do DAA. + * @param count The address count in the address list. + * The initial setting is set back between the completion of the DAA and the return of this function. + * @retval #kStatus_Success The transaction was started successfully. + * @retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + * @retval #kStatus_I3C_SlaveCountExceed The I3C slave count has exceed the definition in I3C_MAX_DEVCNT. + */ +static inline status_t I3C_MasterProcessDAA(I3C_Type *base, uint8_t *addressList, uint32_t count) +{ + return I3C_MasterProcessDAASpecifiedBaudrate(base, addressList, count, NULL); +} + +/*! + * @brief Get device information list after DAA process is done. + * + * @param base The I3C peripheral base address. + * @param[out] count The pointer to store the available device count. + * @return Pointer to the i3c_device_info_t array. + */ +i3c_device_info_t *I3C_MasterGetDeviceListAfterDAA(I3C_Type *base, uint8_t *count); +/*! + * @brief Performs a master polling transfer on the I2C/I3C bus. + * + * @note The API does not return until the transfer succeeds or fails due + * to error happens during transfer. + * + * @param base The I3C peripheral base address. + * @param transfer Pointer to the transfer structure. + * @retval #kStatus_Success Data was received successfully. + * @retval #kStatus_I3C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_I3C_IBIWon The I3C slave event IBI or MR or HJ won the arbitration on a header address. + * @retval #kStatus_I3C_Timeout The module has stalled too long in a frame. + * @retval #kStatus_I3C_Nak The slave device sent a NAK in response to an address. + * @retval #kStatus_I3C_WriteAbort The slave device sent a NAK in response to a write. + * @retval #kStatus_I3C_Term The master terminates slave read. + * @retval #kStatus_I3C_HdrParityError Parity error from DDR read. + * @retval #kStatus_I3C_CrcError CRC error from DDR read. + * @retval #kStatus_I3C_MsgError Message SDR/DDR mismatch or read/write message in wrong state. + * @retval #kStatus_I3C_ReadFifoError Read from M/SRDATAB register when FIFO empty. + * @retval #kStatus_I3C_WriteFifoError Write to M/SWDATAB register when FIFO full. + * @retval #kStatus_I3C_InvalidReq Invalid use of request. + */ +status_t I3C_MasterTransferBlocking(I3C_Type *base, i3c_master_transfer_t *transfer); + +/*! @} */ + +/*! @name Non-blocking */ +/*! @{ */ + +/*! + * @brief Creates a new handle for the I3C master non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the I3C_MasterTransferAbort() API shall be called. + * + * + * @note The function also enables the NVIC IRQ for the input I3C. Need to notice + * that on some SoCs the I3C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + * + * @param base The I3C peripheral base address. + * @param[out] handle Pointer to the I3C master driver handle. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + */ +void I3C_MasterTransferCreateHandle(I3C_Type *base, + i3c_master_handle_t *handle, + const i3c_master_transfer_callback_t *callback, + void *userData); + +/*! + * @brief Performs a non-blocking transaction on the I2C/I3C bus. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C master driver handle. + * @param transfer The pointer to the transfer descriptor. + * @retval #kStatus_Success The transaction was started successfully. + * @retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + */ +status_t I3C_MasterTransferNonBlocking(I3C_Type *base, i3c_master_handle_t *handle, i3c_master_transfer_t *transfer); + +/*! + * @brief Returns number of bytes transferred so far. + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C master driver handle. + * @param[out] count Number of bytes transferred so far by the non-blocking transaction. + * @retval #kStatus_Success + * @retval #kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. + */ +status_t I3C_MasterTransferGetCount(I3C_Type *base, i3c_master_handle_t *handle, size_t *count); + +/*! + * @brief Terminates a non-blocking I3C master transmission early. + * + * @note It is not safe to call this function from an IRQ handler that has a higher priority than the + * I3C peripheral's IRQ priority. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C master driver handle. + * @retval #kStatus_Success A transaction was successfully aborted. + * @retval #kStatus_I3C_Idle There is not a non-blocking transaction currently in progress. + */ +void I3C_MasterTransferAbort(I3C_Type *base, i3c_master_handle_t *handle); + +/*! @} */ + +/*! @name IRQ handler */ +/*! @{ */ + +/*! + * @brief Reusable routine to handle master interrupts. + * @note This function does not need to be called unless you are reimplementing the + * nonblocking API's interrupt handler routines to add special functionality. + * @param base The I3C peripheral base address. + * @param intHandle Pointer to the I3C master driver handle. + */ +void I3C_MasterTransferHandleIRQ(I3C_Type *base, void *intHandle); + +/*! @} */ + +/*! @} */ + +/*! + * @addtogroup i3c_slave_driver + * @{ + */ + +/*! @name Initialization and deinitialization */ +/*! @{ */ + +/*! + * @brief Provides a default configuration for the I3C slave peripheral. + * + * This function provides the following default configuration for the I3C slave peripheral: + * @code + * slaveConfig->enableslave = true; + * @endcode + * + * After calling this function, you can override any settings in order to customize the configuration, + * prior to initializing the slave driver with I3C_SlaveInit(). + * + * @param[out] slaveConfig User provided configuration structure for default values. Refer to #i3c_slave_config_t. + */ +void I3C_SlaveGetDefaultConfig(i3c_slave_config_t *slaveConfig); + +/*! + * @brief Initializes the I3C slave peripheral. + * + * This function enables the peripheral clock and initializes the I3C slave peripheral as described by the user + * provided configuration. + * + * @param base The I3C peripheral base address. + * @param slaveConfig User provided peripheral configuration. Use I3C_SlaveGetDefaultConfig() to get a set of + * defaults that you can override. + * @param slowClock_Hz Frequency in Hertz of the I3C slow clock. Used to calculate the bus match condition values. + * If FSL_FEATURE_I3C_HAS_NO_SCONFIG_BAMATCH defines as 1, this parameter is useless. + */ +void I3C_SlaveInit(I3C_Type *base, const i3c_slave_config_t *slaveConfig, uint32_t slowClock_Hz); + +/*! + * @brief Deinitializes the I3C slave peripheral. + * + * This function disables the I3C slave peripheral and gates the clock. + * + * @param base The I3C peripheral base address. + */ +void I3C_SlaveDeinit(I3C_Type *base); + +/*! + * @brief Enable/Disable Slave. + * + * @param base The I3C peripheral base address. + * @param isEnable Enable or disable. + */ +static inline void I3C_SlaveEnable(I3C_Type *base, bool isEnable) +{ + base->SCONFIG = (base->SCONFIG & ~I3C_SCONFIG_SLVENA_MASK) | I3C_SCONFIG_SLVENA(isEnable); +} + +/*! @} */ + +/*! @name Status */ +/*! @{ */ + +/*! + * @brief Gets the I3C slave status flags. + * + * A bit mask with the state of all I3C slave status flags is returned. For each flag, the corresponding bit + * in the return value is set if the flag is asserted. + * + * @param base The I3C peripheral base address. + * @return State of the status flags: + * - 1: related status flag is set. + * - 0: related status flag is not set. + * @see _i3c_slave_flags + */ +static inline uint32_t I3C_SlaveGetStatusFlags(I3C_Type *base) +{ + return base->SSTATUS & ~(I3C_SSTATUS_EVDET_MASK | I3C_SSTATUS_ACTSTATE_MASK | I3C_SSTATUS_TIMECTRL_MASK); +} + +/*! + * @brief Clears the I3C slave status flag state. + * + * The following status register flags can be cleared: + * - #kI3C_SlaveBusStartFlag + * - #kI3C_SlaveMatchedFlag + * - #kI3C_SlaveBusStopFlag + * + * Attempts to clear other flags has no effect. + * + * @param base The I3C peripheral base address. + * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of + * #_i3c_slave_flags enumerators OR'd together. You may pass the result of a previous call to + * I3C_SlaveGetStatusFlags(). + * @see _i3c_slave_flags. + */ +static inline void I3C_SlaveClearStatusFlags(I3C_Type *base, uint32_t statusMask) +{ + base->SSTATUS = statusMask; +} + +/*! + * @brief Gets the I3C slave error status flags. + * + * A bit mask with the state of all I3C slave error status flags is returned. For each flag, the corresponding bit + * in the return value is set if the flag is asserted. + * + * @param base The I3C peripheral base address. + * @return State of the error status flags: + * - 1: related status flag is set. + * - 0: related status flag is not set. + * @see _i3c_slave_error_flags + */ +static inline uint32_t I3C_SlaveGetErrorStatusFlags(I3C_Type *base) +{ + return base->SERRWARN; +} + +/*! + * @brief Clears the I3C slave error status flag state. + * + * @param base The I3C peripheral base address. + * @param statusMask A bitmask of error status flags that are to be cleared. The mask is composed of + * #_i3c_slave_error_flags enumerators OR'd together. You may pass the result of a previous call to + * I3C_SlaveGetErrorStatusFlags(). + * @see _i3c_slave_error_flags. + */ +static inline void I3C_SlaveClearErrorStatusFlags(I3C_Type *base, uint32_t statusMask) +{ + base->SERRWARN = statusMask; +} + +/*! + * @brief Gets the I3C slave state. + * + * @param base The I3C peripheral base address. + * @return I3C slave activity state, refer #i3c_slave_activity_state_t. + */ +i3c_slave_activity_state_t I3C_SlaveGetActivityState(I3C_Type *base); + +/* Not static so it can be used from fsl_i3c_dma.c. */ +status_t I3C_SlaveCheckAndClearError(I3C_Type *base, uint32_t status); +/*! @} */ + +/*! @name Interrupts */ +/*! @{ */ + +/*! + * @brief Enables the I3C slave interrupt requests. + * + * Only below flags can be enabled as interrupts. + * - #kI3C_SlaveBusStartFlag + * - #kI3C_SlaveMatchedFlag + * - #kI3C_SlaveBusStopFlag + * - #kI3C_SlaveRxReadyFlag + * - #kI3C_SlaveTxReadyFlag + * - #kI3C_SlaveDynamicAddrChangedFlag + * - #kI3C_SlaveReceivedCCCFlag + * - #kI3C_SlaveErrorFlag + * - #kI3C_SlaveHDRCommandMatchFlag + * - #kI3C_SlaveCCCHandledFlag + * - #kI3C_SlaveEventSentFlag + * + * @param base The I3C peripheral base address. + * @param interruptMask Bit mask of interrupts to enable. See #_i3c_slave_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void I3C_SlaveEnableInterrupts(I3C_Type *base, uint32_t interruptMask) +{ + base->SINTSET |= interruptMask; +} + +/*! + * @brief Disables the I3C slave interrupt requests. + * + * Only below flags can be disabled as interrupts. + * - #kI3C_SlaveBusStartFlag + * - #kI3C_SlaveMatchedFlag + * - #kI3C_SlaveBusStopFlag + * - #kI3C_SlaveRxReadyFlag + * - #kI3C_SlaveTxReadyFlag + * - #kI3C_SlaveDynamicAddrChangedFlag + * - #kI3C_SlaveReceivedCCCFlag + * - #kI3C_SlaveErrorFlag + * - #kI3C_SlaveHDRCommandMatchFlag + * - #kI3C_SlaveCCCHandledFlag + * - #kI3C_SlaveEventSentFlag + * + * @param base The I3C peripheral base address. + * @param interruptMask Bit mask of interrupts to disable. See #_i3c_slave_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void I3C_SlaveDisableInterrupts(I3C_Type *base, uint32_t interruptMask) +{ + base->SINTCLR = interruptMask; +} + +/*! + * @brief Returns the set of currently enabled I3C slave interrupt requests. + * + * @param base The I3C peripheral base address. + * @return A bitmask composed of #_i3c_slave_flags enumerators OR'd together to indicate the + * set of enabled interrupts. + */ +static inline uint32_t I3C_SlaveGetEnabledInterrupts(I3C_Type *base) +{ + return base->SINTSET; +} + +/*! + * @brief Returns the set of pending I3C slave interrupt requests. + * + * @param base The I3C peripheral base address. + * @return A bitmask composed of #_i3c_slave_flags enumerators OR'd together to indicate the + * set of pending interrupts. + */ +static inline uint32_t I3C_SlaveGetPendingInterrupts(I3C_Type *base) +{ + return base->SINTMASKED; +} + +/*! @} */ + +/*! @name DMA control */ +/*! @{ */ + +/*! + * @brief Enables or disables I3C slave DMA requests. + * + * @param base The I3C peripheral base address. + * @param enableTx Enable flag for transmit DMA request. Pass true for enable, false for disable. + * @param enableRx Enable flag for receive DMA request. Pass true for enable, false for disable. + * @param width DMA read/write unit in bytes. + */ +static inline void I3C_SlaveEnableDMA(I3C_Type *base, bool enableTx, bool enableRx, uint32_t width) +{ + assert(width <= 2U); + base->SDMACTRL = + I3C_SDMACTRL_DMAFB(enableRx ? 2U : 0U) | I3C_SDMACTRL_DMATB(enableTx ? 2U : 0U) | I3C_SDMACTRL_DMAWIDTH(width); +} + +/*! + * @brief Gets I3C slave transmit data register address for DMA transfer. + * + * @param base The I3C peripheral base address. + * @param width DMA read/write unit in bytes. + * @return The I3C Slave Transmit Data Register address. + */ +static inline uint32_t I3C_SlaveGetTxFifoAddress(I3C_Type *base, uint32_t width) +{ + assert(width <= 2U); + return (uint32_t)((width == 2U) ? &base->SWDATAH : &base->SWDATAB); +} + +/*! + * @brief Gets I3C slave receive data register address for DMA transfer. + * + * @param base The I3C peripheral base address. + * @param width DMA read/write unit in bytes. + * @return The I3C Slave Receive Data Register address. + */ +static inline uint32_t I3C_SlaveGetRxFifoAddress(I3C_Type *base, uint32_t width) +{ + assert(width <= 2U); + return (uint32_t)((width == 2U) ? &base->SRDATAH : &base->SRDATAB); +} + +/*! @} */ + +/*! @name FIFO control */ +/*! @{ */ + +/*! + * @brief Sets the watermarks for I3C slave FIFOs. + * + * @param base The I3C peripheral base address. + * @param txLvl Transmit FIFO watermark level. The #kI3C_SlaveTxReadyFlag flag is set whenever + * the number of words in the transmit FIFO reaches @a txLvl. + * @param rxLvl Receive FIFO watermark level. The #kI3C_SlaveRxReadyFlag flag is set whenever + * the number of words in the receive FIFO reaches @a rxLvl. + * @param flushTx true if TX FIFO is to be cleared, otherwise TX FIFO remains unchanged. + * @param flushRx true if RX FIFO is to be cleared, otherwise RX FIFO remains unchanged. + */ +static inline void I3C_SlaveSetWatermarks( + I3C_Type *base, i3c_tx_trigger_level_t txLvl, i3c_rx_trigger_level_t rxLvl, bool flushTx, bool flushRx) +{ + base->SDATACTRL = I3C_SDATACTRL_UNLOCK_MASK | I3C_SDATACTRL_TXTRIG(txLvl) | I3C_SDATACTRL_RXTRIG(rxLvl) | + (flushTx ? I3C_SDATACTRL_FLUSHTB_MASK : 0U) | (flushRx ? I3C_SDATACTRL_FLUSHFB_MASK : 0U); +} + +/*! + * @brief Gets the current number of bytes in the I3C slave FIFOs. + * + * @param base The I3C peripheral base address. + * @param[out] txCount Pointer through which the current number of bytes in the transmit FIFO is returned. + * Pass NULL if this value is not required. + * @param[out] rxCount Pointer through which the current number of bytes in the receive FIFO is returned. + * Pass NULL if this value is not required. + */ +static inline void I3C_SlaveGetFifoCounts(I3C_Type *base, size_t *rxCount, size_t *txCount) +{ + if (NULL != txCount) + { + *txCount = (base->SDATACTRL & I3C_SDATACTRL_TXCOUNT_MASK) >> I3C_SDATACTRL_TXCOUNT_SHIFT; + } + if (NULL != rxCount) + { + *rxCount = (base->SDATACTRL & I3C_SDATACTRL_RXCOUNT_MASK) >> I3C_SDATACTRL_RXCOUNT_SHIFT; + } +} + +/*! @} */ + +/*! @name Bus operations */ +/*! @{ */ + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) && FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) +/*! + * @brief I3C slave request event. + * + * @param base The I3C peripheral base address. + * @param event I3C slave event of type #i3c_slave_event_t + */ +void I3C_SlaveRequestEvent(I3C_Type *base, i3c_slave_event_t event); +#endif + +/*! + * @brief Performs a polling send transfer on the I3C bus. + * + * @param base The I3C peripheral base address. + * @param txBuff The pointer to the data to be transferred. + * @param txSize The length in bytes of the data to be transferred. + * @return Error or success status returned by API. + */ +status_t I3C_SlaveSend(I3C_Type *base, const void *txBuff, size_t txSize); + +/*! + * @brief Performs a polling receive transfer on the I3C bus. + * + * @param base The I3C peripheral base address. + * @param rxBuff The pointer to the data to be transferred. + * @param rxSize The length in bytes of the data to be transferred. + * @return Error or success status returned by API. + */ +status_t I3C_SlaveReceive(I3C_Type *base, void *rxBuff, size_t rxSize); + +/*! @} */ + +/*! @name Slave non-blocking */ +/*! @{ */ + +/*! + * @brief Creates a new handle for the I3C slave non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the I3C_SlaveTransferAbort() API shall be called. + * + * @note The function also enables the NVIC IRQ for the input I3C. Need to notice + * that on some SoCs the I3C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + + * @param base The I3C peripheral base address. + * @param[out] handle Pointer to the I3C slave driver handle. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + */ +void I3C_SlaveTransferCreateHandle(I3C_Type *base, + i3c_slave_handle_t *handle, + i3c_slave_transfer_callback_t callback, + void *userData); + +/*! + * @brief Starts accepting slave transfers. + * + * Call this API after calling I2C_SlaveInit() and I3C_SlaveTransferCreateHandle() to start processing + * transactions driven by an I2C master. The slave monitors the I2C bus and pass events to the + * callback that was passed into the call to I3C_SlaveTransferCreateHandle(). The callback is always invoked + * from the interrupt context. + * + * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to + * the OR'd combination of #i3c_slave_transfer_event_t enumerators for the events you wish to receive. + * The #kI3C_SlaveTransmitEvent and #kI3C_SlaveReceiveEvent events are always enabled and do not need + * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and + * receive events that are always enabled. In addition, the #kI3C_SlaveAllEvents constant is provided as + * a convenient way to enable all events. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to struct: _i3c_slave_handle structure which stores the transfer state. + * @param eventMask Bit mask formed by OR'ing together #i3c_slave_transfer_event_t enumerators to specify + * which events to send to the callback. Other accepted values are 0 to get a default set of + * only the transmit and receive events, and #kI3C_SlaveAllEvents to enable all events. + * + * @retval #kStatus_Success Slave transfers were successfully started. + * @retval #kStatus_I3C_Busy Slave transfers have already been started on this handle. + */ +status_t I3C_SlaveTransferNonBlocking(I3C_Type *base, i3c_slave_handle_t *handle, uint32_t eventMask); + +/*! + * @brief Gets the slave transfer status during a non-blocking transfer. + * @param base The I3C peripheral base address. + * @param handle Pointer to i2c_slave_handle_t structure. + * @param[out] count Pointer to a value to hold the number of bytes transferred. May be NULL if the count is not + * required. + * @retval #kStatus_Success + * @retval #kStatus_NoTransferInProgress + */ +status_t I3C_SlaveTransferGetCount(I3C_Type *base, i3c_slave_handle_t *handle, size_t *count); + +/*! + * @brief Aborts the slave non-blocking transfers. + * @note This API could be called at any time to stop slave for handling the bus events. + * @param base The I3C peripheral base address. + * @param handle Pointer to struct: _i3c_slave_handle structure which stores the transfer state. + * @retval #kStatus_Success + * @retval #kStatus_I3C_Idle + */ +void I3C_SlaveTransferAbort(I3C_Type *base, i3c_slave_handle_t *handle); + +/*! @} */ + +/*! @name Slave IRQ handler */ +/*! @{ */ + +/*! + * @brief Reusable routine to handle slave interrupts. + * @note This function does not need to be called unless you are reimplementing the + * non blocking API's interrupt handler routines to add special functionality. + * @param base The I3C peripheral base address. + * @param intHandle Pointer to struct: _i3c_slave_handle structure which stores the transfer state. + */ +void I3C_SlaveTransferHandleIRQ(I3C_Type *base, void *intHandle); + +#if !(defined(FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) && FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) +/*! + * @brief I3C slave request IBI event with data payload(mandatory and extended). + * + * @param base The I3C peripheral base address. + * @param data Pointer to IBI data to be sent in the request. + * @param dataSize IBI data size. + */ +void I3C_SlaveRequestIBIWithData(I3C_Type *base, uint8_t *data, size_t dataSize); + +/*! + * @brief I3C slave request IBI event with single data. + * @deprecated Do not use this function. It has been superseded by @ref I3C_SlaveRequestIBIWithData. + * + * @param base The I3C peripheral base address. + * @param data IBI data to be sent in the request. + * @param dataSize IBI data size. + */ +void I3C_SlaveRequestIBIWithSingleData(I3C_Type *base, uint8_t data, size_t dataSize); +#endif /* !(defined(FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) && FSL_FEATURE_I3C_HAS_NO_SLAVE_IBI_MR_HJ) */ + +/*! @} */ +/*! @} */ +#if defined(__cplusplus) +} +#endif + +#endif /* FSL_I3C_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c_edma.c new file mode 100644 index 00000000000..7ff5e8a6d04 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c_edma.c @@ -0,0 +1,1057 @@ +/* + * Copyright 2022-2023 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_i3c_edma.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.i3c_edma" +#endif + +/*! @brief States for the state machine used by transactional APIs. */ +enum _i3c_edma_transfer_states +{ + kIdleState = 0, + kIBIWonState, + kSlaveStartState, + kSendCommandState, + kWaitRepeatedStartCompleteState, + kTransmitDataState, + kReceiveDataState, + kStopState, + kWaitForCompletionState, + kAddressMatchState, +}; + +/*! @brief Common sets of flags used by the driver. */ +enum _i3c_edma_flag_constants +{ + /*! All flags which are cleared by the driver upon starting a transfer. */ + kMasterClearFlags = kI3C_MasterSlaveStartFlag | kI3C_MasterControlDoneFlag | kI3C_MasterCompleteFlag | + kI3C_MasterArbitrationWonFlag | kI3C_MasterSlave2MasterFlag | kI3C_MasterErrorFlag, + + /*! IRQ sources enabled by the non-blocking transactional API. */ + kMasterDMAIrqFlags = kI3C_MasterSlaveStartFlag | kI3C_MasterControlDoneFlag | kI3C_MasterCompleteFlag | + kI3C_MasterArbitrationWonFlag | kI3C_MasterErrorFlag | kI3C_MasterSlave2MasterFlag, + + /*! Errors to check for. */ + kMasterErrorFlags = kI3C_MasterErrorNackFlag | kI3C_MasterErrorWriteAbortFlag | +#if !defined(FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM) || (!FSL_FEATURE_I3C_HAS_NO_MERRWARN_TERM) + kI3C_MasterErrorTermFlag | +#endif + kI3C_MasterErrorParityFlag | kI3C_MasterErrorCrcFlag | kI3C_MasterErrorReadFlag | + kI3C_MasterErrorWriteFlag | kI3C_MasterErrorMsgFlag | kI3C_MasterErrorInvalidReqFlag | + kI3C_MasterErrorTimeoutFlag, + /*! All flags which are cleared by the driver upon starting a transfer. */ + kSlaveClearFlags = kI3C_SlaveBusStartFlag | kI3C_SlaveMatchedFlag | kI3C_SlaveBusStopFlag, + + /*! IRQ sources enabled by the non-blocking transactional API. */ + kSlaveDMAIrqFlags = kI3C_SlaveBusStartFlag | kI3C_SlaveMatchedFlag | + kI3C_SlaveBusStopFlag | /*kI3C_SlaveRxReadyFlag |*/ + kI3C_SlaveDynamicAddrChangedFlag | kI3C_SlaveReceivedCCCFlag | kI3C_SlaveErrorFlag | + kI3C_SlaveHDRCommandMatchFlag | kI3C_SlaveCCCHandledFlag | kI3C_SlaveEventSentFlag, + + /*! Errors to check for. */ + kSlaveErrorFlags = kI3C_SlaveErrorOverrunFlag | kI3C_SlaveErrorUnderrunFlag | kI3C_SlaveErrorUnderrunNakFlag | + kI3C_SlaveErrorTermFlag | kI3C_SlaveErrorInvalidStartFlag | kI3C_SlaveErrorSdrParityFlag | + kI3C_SlaveErrorHdrParityFlag | kI3C_SlaveErrorHdrCRCFlag | kI3C_SlaveErrorS0S1Flag | + kI3C_SlaveErrorOverreadFlag | kI3C_SlaveErrorOverwriteFlag, +}; +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Array to map I3C instance number to base pointer. */ +static I3C_Type *const kI3cBases[] = I3C_BASE_PTRS; + +/*! @brief Array to store the END byte of I3C teransfer. */ +static uint8_t i3cEndByte[ARRAY_SIZE(kI3cBases)] = {0}; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void I3C_MasterRunEDMATransfer( + I3C_Type *base, i3c_master_edma_handle_t *handle, void *data, size_t dataSize, i3c_direction_t direction); + +/******************************************************************************* + * Code + ******************************************************************************/ +static void I3C_MasterTransferEDMACallbackRx(edma_handle_t *dmaHandle, void *param, bool transferDone, uint32_t tcds) +{ + i3c_master_edma_handle_t *i3cHandle = (i3c_master_edma_handle_t *)param; + + if (transferDone) + { + /* Terminate following data if present. */ + i3cHandle->base->MCTRL |= I3C_MCTRL_RDTERM(1U); + +#if defined(FSL_FEATURE_I3C_HAS_ERRATA_052086) && (FSL_FEATURE_I3C_HAS_ERRATA_052086) + if (i3cHandle->transfer.dataSize > 1U) + { + size_t rxCount; + /* Read out the last byte data. */ + do + { + I3C_MasterGetFifoCounts(i3cHandle->base, &rxCount, NULL); + } while (rxCount == 0U); + *(uint8_t *)((uint32_t)(uint32_t *)i3cHandle->transfer.data + i3cHandle->transfer.dataSize - 1U) = + (uint8_t)i3cHandle->base->MRDATAB; + } +#endif + + /* Disable I3C Rx DMA. */ + i3cHandle->base->MDATACTRL &= ~I3C_MDMACTRL_DMAFB_MASK; + } +} + +static void I3C_MasterTransferEDMACallbackTx(edma_handle_t *dmaHandle, void *param, bool transferDone, uint32_t tcds) +{ + i3c_master_edma_handle_t *i3cHandle = (i3c_master_edma_handle_t *)param; + uint32_t instance; + + if (transferDone) + { + /* Disable I3C Tx DMA. */ + i3cHandle->base->MDATACTRL &= ~I3C_MDMACTRL_DMATB_MASK; + + if (i3cHandle->transferCount != 1U) + { + instance = I3C_GetInstance(i3cHandle->base); + /* Ensure there's space in the Tx FIFO. */ + while ((i3cHandle->base->MDATACTRL & I3C_MDATACTRL_TXFULL_MASK) != 0U) + { + } + i3cHandle->base->MWDATABE = i3cEndByte[instance]; + } + } +} +/*! + * brief Prepares the transfer state machine and fills in the command buffer. + * param handle Master nonblocking driver handle. + */ +static status_t I3C_MasterInitTransferStateMachineEDMA(I3C_Type *base, i3c_master_edma_handle_t *handle) +{ + i3c_master_transfer_t *xfer = &handle->transfer; + status_t result = kStatus_Success; + i3c_direction_t direction = xfer->direction; + + /* Calculate command count and put into command buffer. */ + handle->subaddressCount = 0U; + if (xfer->subaddressSize != 0U) + { + for (uint32_t i = xfer->subaddressSize; i > 0U; i--) + { + handle->subaddressBuffer[handle->subaddressCount++] = (uint8_t)((xfer->subaddress) >> (8U * (i - 1U))); + } + } + + /* Start condition shall be ommited, switch directly to next phase */ + if (xfer->dataSize == 0U) + { + handle->state = (uint8_t)kStopState; + } + + if (0UL != (xfer->flags & (uint32_t)kI3C_TransferStartWithBroadcastAddr)) + { + if (0UL != (xfer->flags & (uint32_t)kI3C_TransferNoStartFlag)) + { + return kStatus_InvalidArgument; + } + + if (0UL != (xfer->flags & (uint32_t)kI3C_TransferRepeatedStartFlag)) + { + return kStatus_InvalidArgument; + } + + /* Issue 0x7E as start. */ + result = I3C_MasterStart(base, xfer->busType, 0x7E, kI3C_Write); + if (result != kStatus_Success) + { + return result; + } + + result = I3C_MasterWaitForCtrlDone(base, false); + if (result != kStatus_Success) + { + return result; + } + } + + /* Handle no start option. */ + if (0U != (xfer->flags & (uint32_t)kI3C_TransferNoStartFlag)) + { + /* No need to send start flag, directly go to send command or data */ + if (xfer->subaddressSize > 0UL) + { + handle->state = (uint8_t)kSendCommandState; + } + else + { + if (direction == kI3C_Write) + { + /* Next state, send data. */ + handle->state = (uint8_t)kTransmitDataState; + } + else + { + /* Only support write with no stop signal. */ + return kStatus_InvalidArgument; + } + } + } + else + { + if (xfer->subaddressSize != 0U) + { + handle->state = (uint8_t)kSendCommandState; + } + else + { + if (handle->transfer.direction == kI3C_Write) + { + handle->state = (uint8_t)kTransmitDataState; + } + else if (handle->transfer.direction == kI3C_Read) + { + handle->state = (uint8_t)kReceiveDataState; + } + else + { + return kStatus_InvalidArgument; + } + } + + if (handle->transfer.direction == kI3C_Read) + { + I3C_MasterRunEDMATransfer(base, handle, xfer->data, xfer->dataSize, kI3C_Read); + } + + if (handle->state != (uint8_t)kStopState) + { + /* If repeated start is requested, send repeated start. */ + if (0U != (xfer->flags & (uint32_t)kI3C_TransferRepeatedStartFlag)) + { + result = I3C_MasterRepeatedStart(base, xfer->busType, xfer->slaveAddress, direction); + } + else /* For normal transfer, send start. */ + { + result = I3C_MasterStart(base, xfer->busType, xfer->slaveAddress, direction); + } + } + } + + I3C_MasterTransferEDMAHandleIRQ(base, handle); + return result; +} + +static void I3C_MasterRunEDMATransfer( + I3C_Type *base, i3c_master_edma_handle_t *handle, void *data, size_t dataSize, i3c_direction_t direction) +{ + bool isEnableTxDMA = false; + bool isEnableRxDMA = false; + edma_transfer_config_t xferConfig; + uint32_t instance; + uint32_t address; + uint32_t width; + + handle->transferCount = dataSize; + + switch (direction) + { + case kI3C_Write: + if (dataSize != 1U) + { + address = (uint32_t)&base->MWDATAB1; + /* Cause controller sends command and data with same interface, need special buffer to store the END byte. */ + instance = I3C_GetInstance(base); + i3cEndByte[instance] = *(uint8_t *)((uint32_t)(uint32_t *)data + dataSize - 1U); + dataSize--; + } + else + { + address = (uint32_t)&base->MWDATABE; + } + EDMA_PrepareTransfer(&xferConfig, data, sizeof(uint8_t), (uint32_t *)address, sizeof(uint8_t), 1, dataSize, + kEDMA_MemoryToPeripheral); + (void)EDMA_SubmitTransfer(handle->txDmaHandle, &xferConfig); + EDMA_StartTransfer(handle->txDmaHandle); + isEnableTxDMA = true; + width = 1U; + break; + + case kI3C_Read: +#if defined(FSL_FEATURE_I3C_HAS_ERRATA_052086) && (FSL_FEATURE_I3C_HAS_ERRATA_052086) + /* ERRATA052086: Soc integration issue results in target misses the last DMA request to copy the + last one byte from controler when transmission data size is > 1 byte. Resolution: Triggering DMA + interrupt one byte in advance, then receive the last one byte data after DMA transmission finishes. */ + if (dataSize > 1U) + { + dataSize--; + } +#endif + address = (uint32_t)&base->MRDATAB; + EDMA_PrepareTransfer(&xferConfig, (uint32_t *)address, sizeof(uint8_t), data, sizeof(uint8_t), 1, dataSize, + kEDMA_PeripheralToMemory); + (void)EDMA_SubmitTransfer(handle->rxDmaHandle, &xferConfig); + EDMA_StartTransfer(handle->rxDmaHandle); + isEnableRxDMA = true; + width = 1U; + break; + + default: + /* This should never happen */ + assert(false); + break; + } + + I3C_MasterEnableDMA(base, isEnableTxDMA, isEnableRxDMA, width); +} + +static status_t I3C_MasterRunTransferStateMachineEDMA(I3C_Type *base, i3c_master_edma_handle_t *handle, bool *isDone) +{ + uint32_t status; + uint32_t errStatus; + status_t result = kStatus_Success; + i3c_master_transfer_t *xfer; + size_t rxCount = 0; + bool state_complete = false; + + /* Set default isDone return value. */ + *isDone = false; + + /* Check for errors. */ + status = (uint32_t)I3C_MasterGetPendingInterrupts(base); + I3C_MasterClearStatusFlags(base, status); + + i3c_master_state_t masterState = I3C_MasterGetState(base); + errStatus = I3C_MasterGetErrorStatusFlags(base); + result = I3C_MasterCheckAndClearError(base, errStatus); + if (kStatus_Success != result) + { + return result; + } + + if (0UL != (status & (uint32_t)kI3C_MasterSlave2MasterFlag)) + { + if (handle->callback.slave2Master != NULL) + { + handle->callback.slave2Master(base, handle->userData); + } + } + + if ((0UL != (status & (uint32_t)kI3C_MasterSlaveStartFlag)) && (handle->transfer.busType != kI3C_TypeI2C)) + { + handle->state = (uint8_t)kSlaveStartState; + } + + if ((masterState == kI3C_MasterStateIbiRcv) || (masterState == kI3C_MasterStateIbiAck)) + { + handle->state = (uint8_t)kIBIWonState; + } + + if (handle->state == (uint8_t)kIdleState) + { + return result; + } + + if (handle->state == (uint8_t)kIBIWonState) + { + /* Get fifo counts and compute room in tx fifo. */ + rxCount = (base->MDATACTRL & I3C_MDATACTRL_RXCOUNT_MASK) >> I3C_MDATACTRL_RXCOUNT_SHIFT; + } + + /* Get pointer to private data. */ + xfer = &handle->transfer; + + while (!state_complete) + { + /* Execute the state. */ + switch (handle->state) + { + case (uint8_t)kSlaveStartState: + /* Emit start + 0x7E */ + I3C_MasterEmitRequest(base, kI3C_RequestAutoIbi); + handle->state = (uint8_t)kIBIWonState; + state_complete = true; + break; + + case (uint8_t)kIBIWonState: + if (masterState == kI3C_MasterStateIbiAck) + { + handle->ibiType = I3C_GetIBIType(base); + if (handle->callback.ibiCallback != NULL) + { + handle->callback.ibiCallback(base, handle, handle->ibiType, kI3C_IbiAckNackPending); + } + else + { + I3C_MasterEmitIBIResponse(base, kI3C_IbiRespNack); + } + } + + /* Make sure there is data in the rx fifo. */ + if (0UL != rxCount) + { + if ((handle->ibiBuff == NULL) && (handle->callback.ibiCallback != NULL)) + { + handle->callback.ibiCallback(base, handle, kI3C_IbiNormal, kI3C_IbiDataBuffNeed); + } + uint8_t tempData = (uint8_t)base->MRDATAB; + if (handle->ibiBuff != NULL) + { + handle->ibiBuff[handle->ibiPayloadSize++] = tempData; + } + rxCount--; + break; + } + else if (0UL != (status & (uint32_t)kI3C_MasterCompleteFlag)) + { + handle->ibiType = I3C_GetIBIType(base); + handle->ibiAddress = I3C_GetIBIAddress(base); + state_complete = true; + result = kStatus_I3C_IBIWon; + } + else + { + state_complete = true; + } + break; + + case (uint8_t)kSendCommandState: + I3C_MasterRunEDMATransfer(base, handle, handle->subaddressBuffer, handle->subaddressCount, kI3C_Write); + + if ((xfer->direction == kI3C_Read) || (0UL == xfer->dataSize)) + { + if (0UL == xfer->dataSize) + { + handle->state = (uint8_t)kWaitForCompletionState; + } + else + { + /* xfer->dataSize != 0U, xfer->direction = kI3C_Read */ + handle->state = (uint8_t)kWaitRepeatedStartCompleteState; + } + } + else + { + /* Next state, transfer data. */ + handle->state = (uint8_t)kTransmitDataState; + } + + state_complete = true; + break; + + case (uint8_t)kWaitRepeatedStartCompleteState: + /* We stay in this state until the maste complete. */ + if (0UL != (status & (uint32_t)kI3C_MasterCompleteFlag)) + { + handle->state = (uint8_t)kReceiveDataState; + /* Send repeated start and slave address. */ + result = I3C_MasterRepeatedStart(base, xfer->busType, xfer->slaveAddress, kI3C_Read); + } + + state_complete = true; + break; + + case (uint8_t)kTransmitDataState: + I3C_MasterRunEDMATransfer(base, handle, xfer->data, xfer->dataSize, kI3C_Write); + handle->state = (uint8_t)kWaitForCompletionState; + + state_complete = true; + break; + + case (uint8_t)kReceiveDataState: + /* Do DMA read. */ + handle->state = (uint8_t)kWaitForCompletionState; + + state_complete = true; + break; + + case (uint8_t)kWaitForCompletionState: + /* We stay in this state until the maste complete. */ + if (0UL != (status & (uint32_t)kI3C_MasterCompleteFlag)) + { + handle->state = (uint8_t)kStopState; + } + else + { + state_complete = true; + } + break; + + case (uint8_t)kStopState: + /* Only issue a stop transition if the caller requested it. */ + if (0UL == (xfer->flags & (uint32_t)kI3C_TransferNoStopFlag)) + { + if (xfer->busType == kI3C_TypeI3CDdr) + { + I3C_MasterEmitRequest(base, kI3C_RequestForceExit); + } + else + { + I3C_MasterEmitRequest(base, kI3C_RequestEmitStop); + result = I3C_MasterWaitForCtrlDone(base, false); + } + } + *isDone = true; + state_complete = true; + break; + + default: + assert(false); + break; + } + } + return result; +} + +void I3C_MasterTransferCreateHandleEDMA(I3C_Type *base, + i3c_master_edma_handle_t *handle, + const i3c_master_edma_callback_t *callback, + void *userData, + edma_handle_t *rxDmaHandle, + edma_handle_t *txDmaHandle) +{ + uint32_t instance; + + assert(NULL != handle); + + /* Clear out the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Look up instance number */ + instance = I3C_GetInstance(base); + + handle->base = base; + handle->txDmaHandle = txDmaHandle; + handle->rxDmaHandle = rxDmaHandle; + handle->callback = *callback; + handle->userData = userData; + + /* Save this handle for IRQ use. */ + s_i3cMasterHandle[instance] = handle; + + /* Set irq handler. */ + s_i3cMasterIsr = I3C_MasterTransferEDMAHandleIRQ; + + EDMA_SetCallback(handle->rxDmaHandle, I3C_MasterTransferEDMACallbackRx, handle); + EDMA_SetCallback(handle->txDmaHandle, I3C_MasterTransferEDMACallbackTx, handle); + + /* Clear all flags. */ + I3C_MasterClearErrorStatusFlags(base, (uint32_t)kMasterErrorFlags); + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + /* Reset fifos. These flags clear automatically. */ + base->MDATACTRL |= I3C_MDATACTRL_FLUSHTB_MASK | I3C_MDATACTRL_FLUSHFB_MASK; + + /* Enable NVIC IRQ, this only enables the IRQ directly connected to the NVIC. + In some cases the I3C IRQ is configured through INTMUX, user needs to enable + INTMUX IRQ in application code. */ + (void)EnableIRQ(kI3cIrqs[instance]); + + /* Clear internal IRQ enables and enable NVIC IRQ. */ + I3C_MasterEnableInterrupts(base, (uint32_t)kMasterDMAIrqFlags); +} + +/*! + * brief Performs a non-blocking DMA transaction on the I2C/I3C bus. + * + * param base The I3C peripheral base address. + * param handle Pointer to the I3C master driver handle. + * param transfer The pointer to the transfer descriptor. + * retval #kStatus_Success The transaction was started successfully. + * retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + */ +status_t I3C_MasterTransferEDMA(I3C_Type *base, i3c_master_edma_handle_t *handle, i3c_master_transfer_t *transfer) +{ + assert(NULL != handle); + assert(NULL != transfer); + assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); + i3c_master_state_t masterState = I3C_MasterGetState(base); + bool checkDdrState = false; + + /* Return busy if another transaction is in progress. */ + if (handle->state != (uint8_t)kIdleState) + { + return kStatus_I3C_Busy; + } + + /* Return an error if the bus is already in use not by us. */ + checkDdrState = (transfer->busType == kI3C_TypeI3CDdr) ? (masterState != kI3C_MasterStateDdr) : true; + if ((masterState != kI3C_MasterStateIdle) && (masterState != kI3C_MasterStateNormAct) && checkDdrState) + { + return kStatus_I3C_Busy; + } + + /* Disable I3C IRQ sources while we configure stuff. */ + I3C_MasterDisableInterrupts( + base, ((uint32_t)kMasterDMAIrqFlags | (uint32_t)kI3C_MasterRxReadyFlag | (uint32_t)kI3C_MasterTxReadyFlag)); + + /* Save transfer into handle. */ + handle->transfer = *transfer; + + /* Configure IBI response type. */ + base->MCTRL &= ~I3C_MCTRL_IBIRESP_MASK; + base->MCTRL |= I3C_MCTRL_IBIRESP(transfer->ibiResponse); + + /* Clear all flags. */ + I3C_MasterClearErrorStatusFlags(base, (uint32_t)kMasterErrorFlags); + I3C_MasterClearStatusFlags(base, (uint32_t)kMasterClearFlags); + /* Reset fifos. These flags clear automatically. */ + base->MDATACTRL |= I3C_MDATACTRL_FLUSHTB_MASK | I3C_MDATACTRL_FLUSHFB_MASK; + + /* Generate commands to send. */ + (void)I3C_MasterInitTransferStateMachineEDMA(base, handle); + + /* Enable I3C internal IRQ sources. NVIC IRQ was enabled in CreateHandle() */ + I3C_MasterEnableInterrupts(base, (uint32_t)(kMasterDMAIrqFlags)); + + if (transfer->busType == kI3C_TypeI2C) + { + I3C_MasterDisableInterrupts(base, (uint32_t)kI3C_MasterSlaveStartFlag); + } + + return kStatus_Success; +} + +void I3C_MasterTransferEDMAHandleIRQ(I3C_Type *base, void *i3cHandle) +{ + i3c_master_edma_handle_t *handle = (i3c_master_edma_handle_t *)i3cHandle; + + bool isDone; + status_t result; + + /* Don't do anything if we don't have a valid handle. */ + if (NULL == handle) + { + return; + } + + result = I3C_MasterRunTransferStateMachineEDMA(base, handle, &isDone); + + if (handle->state == (uint8_t)kIdleState) + { + return; + } + + if (isDone || (result != kStatus_Success)) + { + /* XXX need to handle data that may be in rx fifo below watermark level? */ + + /* XXX handle error, terminate xfer */ + if ((result == kStatus_I3C_Nak) || (result == kStatus_I3C_IBIWon)) + { + I3C_MasterEmitRequest(base, kI3C_RequestEmitStop); + (void)I3C_MasterWaitForCtrlDone(base, false); + } + + /* Set handle to idle state. */ + handle->state = (uint8_t)kIdleState; + + /* Invoke IBI user callback. */ + if ((result == kStatus_I3C_IBIWon) && (handle->callback.ibiCallback != NULL)) + { + handle->callback.ibiCallback(base, handle, handle->ibiType, kI3C_IbiReady); + handle->ibiPayloadSize = 0; + } + + /* Invoke callback. */ + if (NULL != handle->callback.transferComplete) + { + handle->callback.transferComplete(base, handle, result, handle->userData); + } + } +} + +/*! + * brief Get master transfer status during a dma non-blocking transfer + * + * param base I3C peripheral base address + * param handle pointer to i2c_master_edma_handle_t structure + * param count Number of bytes transferred so far by the non-blocking transaction. + */ +status_t I3C_MasterTransferGetCountEDMA(I3C_Type *base, i3c_master_edma_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (handle->state == (uint8_t)kIdleState) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + /* There is no necessity to disable interrupts as we read a single integer value */ + i3c_direction_t dir = handle->transfer.direction; + + if (dir == kI3C_Read) + { + *count = handle->transferCount - + 1U * EDMA_GetRemainingMajorLoopCount(handle->rxDmaHandle->base, handle->rxDmaHandle->channel); + } + else + { + *count = handle->transferCount - + 1U * EDMA_GetRemainingMajorLoopCount(handle->txDmaHandle->base, handle->txDmaHandle->channel); + } + + return kStatus_Success; +} + +/*! + * brief Abort a master edma non-blocking transfer in a early time + * + * param base I3C peripheral base address + * param handle pointer to i2c_master_edma_handle_t structure + */ +void I3C_MasterTransferAbortEDMA(I3C_Type *base, i3c_master_edma_handle_t *handle) +{ + if (handle->state != (uint8_t)kIdleState) + { + EDMA_AbortTransfer(handle->txDmaHandle); + EDMA_AbortTransfer(handle->rxDmaHandle); + + I3C_MasterEnableDMA(base, false, false, 0); + + /* Reset fifos. These flags clear automatically. */ + base->MDATACTRL |= I3C_MDATACTRL_FLUSHTB_MASK | I3C_MDATACTRL_FLUSHFB_MASK; + + /* Send a stop command to finalize the transfer. */ + (void)I3C_MasterStop(base); + + /* Reset handle. */ + handle->state = (uint8_t)kIdleState; + } +} + +static void I3C_SlaveTransferEDMACallback(edma_handle_t *dmaHandle, void *param, bool transferDone, uint32_t tcds) +{ + i3c_slave_edma_handle_t *i3cHandle = (i3c_slave_edma_handle_t *)param; + + if (transferDone) + { + /* Simply disable dma enablement */ + if (i3cHandle->txDmaHandle == dmaHandle) + { + i3cHandle->base->SDMACTRL &= ~I3C_SDMACTRL_DMATB_MASK; + + if (i3cHandle->transfer.txDataSize > 1U) + { + /* Ensure there's space in the Tx FIFO. */ + while ((i3cHandle->base->SDATACTRL & I3C_SDATACTRL_TXFULL_MASK) != 0U) + { + } + /* Send the last byte. */ + i3cHandle->base->SWDATABE = *(uint8_t *)((uintptr_t)i3cHandle->transfer.txData + i3cHandle->transfer.txDataSize - 1U); + } + } + else + { +#if defined(FSL_FEATURE_I3C_HAS_ERRATA_052086) && (FSL_FEATURE_I3C_HAS_ERRATA_052086) + if (i3cHandle->transfer.rxDataSize > 1U) + { + size_t rxCount; + /* Read out the last byte data. */ + do + { + I3C_SlaveGetFifoCounts(i3cHandle->base, &rxCount, NULL); + } while (rxCount == 0U); + *(uint8_t *)((uintptr_t)i3cHandle->transfer.rxData + i3cHandle->transfer.rxDataSize - 1U) = + (uint8_t)i3cHandle->base->SRDATAB; + } +#endif + i3cHandle->base->SDMACTRL &= ~I3C_SDMACTRL_DMAFB_MASK; + } + } +} + +/*! + * brief Create a new handle for the I3C slave DMA APIs. + * + * The creation of a handle is for use with the DMA APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the I3C_SlaveTransferAbortDMA() API shall be called. + * + * For devices where the I3C send and receive DMA requests are OR'd together, the @a txDmaHandle + * parameter is ignored and may be set to NULL. + * + * param base The I3C peripheral base address. + * param handle Pointer to the I3C slave driver handle. + * param callback User provided pointer to the asynchronous callback function. + * param userData User provided pointer to the application callback data. + * param rxDmaHandle Handle for the DMA receive channel. Created by the user prior to calling this function. + * param txDmaHandle Handle for the DMA transmit channel. Created by the user prior to calling this function. + */ +void I3C_SlaveTransferCreateHandleEDMA(I3C_Type *base, + i3c_slave_edma_handle_t *handle, + i3c_slave_edma_callback_t callback, + void *userData, + edma_handle_t *rxDmaHandle, + edma_handle_t *txDmaHandle) +{ + uint32_t instance; + + assert(NULL != handle); + + /* Clear out the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Look up instance number */ + instance = I3C_GetInstance(base); + + handle->base = base; + handle->txDmaHandle = txDmaHandle; + handle->rxDmaHandle = rxDmaHandle; + handle->callback = callback; + handle->userData = userData; + + /* Save this handle for IRQ use. */ + s_i3cSlaveHandle[instance] = handle; + + /* Set irq handler. */ + s_i3cSlaveIsr = I3C_SlaveTransferEDMAHandleIRQ; + + EDMA_SetCallback(handle->rxDmaHandle, I3C_SlaveTransferEDMACallback, handle); + EDMA_SetCallback(handle->txDmaHandle, I3C_SlaveTransferEDMACallback, handle); + + /* Clear internal IRQ enables and enable NVIC IRQ. */ + I3C_SlaveDisableInterrupts(base, (uint32_t)kSlaveDMAIrqFlags); + + /* Enable NVIC IRQ, this only enables the IRQ directly connected to the NVIC. + In some cases the I3C IRQ is configured through INTMUX, user needs to enable + INTMUX IRQ in application code. */ + (void)EnableIRQ(kI3cIrqs[instance]); + + /* Enable IRQ. */ + I3C_SlaveEnableInterrupts(base, (uint32_t)kSlaveDMAIrqFlags); +} + +static void I3C_SlavePrepareTxEDMA(I3C_Type *base, i3c_slave_edma_handle_t *handle) +{ + edma_transfer_config_t txConfig; + uint32_t *txFifoBase; + i3c_slave_edma_transfer_t *xfer = &handle->transfer; + + if (xfer->txDataSize == 1U) + { + txFifoBase = (uint32_t *)(uintptr_t)&base->SWDATABE; + EDMA_PrepareTransfer(&txConfig, xfer->txData, 1, (void *)txFifoBase, 1, 1, xfer->txDataSize, + kEDMA_MemoryToPeripheral); + } + else + { + txFifoBase = (uint32_t *)(uintptr_t)&base->SWDATAB1; + EDMA_PrepareTransfer(&txConfig, xfer->txData, 1, (void *)txFifoBase, 1, 1, xfer->txDataSize - 1U, + kEDMA_MemoryToPeripheral); + } + + (void)EDMA_SubmitTransfer(handle->txDmaHandle, &txConfig); + EDMA_StartTransfer(handle->txDmaHandle); +} + +static void I3C_SlavePrepareRxEDMA(I3C_Type *base, i3c_slave_edma_handle_t *handle) +{ + uint32_t *rxFifoBase = (uint32_t *)(uintptr_t)&base->SRDATAB; + i3c_slave_edma_transfer_t *xfer = &handle->transfer; + size_t dataSize = xfer->rxDataSize; + edma_transfer_config_t rxConfig; + +#if defined(FSL_FEATURE_I3C_HAS_ERRATA_052086) && (FSL_FEATURE_I3C_HAS_ERRATA_052086) + /* ERRATA052086: Soc integration issue results in target misses the last DMA request to copy the + last one byte from controler when transmission data size is > 1 byte. Resolution: Triggering DMA + interrupt one byte in advance, then receive the last one byte data after DMA transmission finishes. */ + if (dataSize > 1U) + { + dataSize--; + } +#endif + + EDMA_PrepareTransfer(&rxConfig, (void *)rxFifoBase, 1, xfer->rxData, 1, 1, dataSize, + kEDMA_PeripheralToMemory); + (void)EDMA_SubmitTransfer(handle->rxDmaHandle, &rxConfig); + EDMA_StartTransfer(handle->rxDmaHandle); +} + +/*! + * brief Prepares for a non-blocking DMA-based transaction on the I3C bus. + * + * The API will do DMA configuration according to the input transfer descriptor, and the data will be transferred when + * there's bus master requesting transfer from/to this slave. So the timing of call to this API need be aligned + * with master application to ensure the transfer is executed as expected. + * Callback specified when the @a handle was created is invoked when the transaction has completed. + * + * param base The I3C peripheral base address. + * param handle Pointer to the I3C slave driver handle. + * param transfer The pointer to the transfer descriptor. + * param eventMask Bit mask formed by OR'ing together #i3c_slave_transfer_event_t enumerators to specify + * which events to send to the callback. The transmit and receive events is not allowed to be enabled. + * retval kStatus_Success The transaction was started successfully. + * retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or another DMA + * transaction is already in progress. + * retval #kStatus_Fail The transaction can't be set. + */ +status_t I3C_SlaveTransferEDMA(I3C_Type *base, + i3c_slave_edma_handle_t *handle, + i3c_slave_edma_transfer_t *transfer, + uint32_t eventMask) +{ + assert(NULL != handle); + assert(NULL != transfer); + + bool txDmaEn = false, rxDmaEn = false; + uint32_t width; + + if (handle->isBusy) + { + return kStatus_I3C_Busy; + } + /* Clear all flags. */ + I3C_SlaveClearErrorStatusFlags(base, (uint32_t)kSlaveErrorFlags); + I3C_SlaveClearStatusFlags(base, (uint32_t)kSlaveClearFlags); + /* Reset fifos. These flags clear automatically. */ + base->SDATACTRL |= I3C_SDATACTRL_FLUSHTB_MASK | I3C_SDATACTRL_FLUSHFB_MASK; + + handle->transfer = *transfer; + + /* Set up event mask. */ + handle->eventMask = eventMask; + + if ((transfer->txData != NULL) && (transfer->txDataSize != 0U)) + { + I3C_SlavePrepareTxEDMA(base, handle); + txDmaEn = true; + width = 1U; + } + + if ((transfer->rxData != NULL) && (transfer->rxDataSize != 0U)) + { + I3C_SlavePrepareRxEDMA(base, handle); + rxDmaEn = true; + width = 1U; + } + + if (txDmaEn || rxDmaEn) + { + I3C_SlaveEnableDMA(base, txDmaEn, rxDmaEn, width); + return kStatus_Success; + } + else + { + return kStatus_Fail; + } +} + +void I3C_SlaveTransferEDMAHandleIRQ(I3C_Type *base, void *i3cHandle) +{ + uint32_t flags; + uint32_t errFlags; + i3c_slave_edma_transfer_t *xfer; + + i3c_slave_edma_handle_t *handle = (i3c_slave_edma_handle_t *)i3cHandle; + /* Check for a valid handle in case of a spurious interrupt. */ + if (NULL == handle) + { + return; + } + + xfer = &handle->transfer; + + /* Get status flags. */ + flags = I3C_SlaveGetStatusFlags(base); + errFlags = I3C_SlaveGetErrorStatusFlags(base); + + /* Clear status flags. */ + I3C_SlaveClearStatusFlags(base, flags); + + if (0UL != (errFlags & (uint32_t)kSlaveErrorFlags)) + { + xfer->event = (uint32_t)kI3C_SlaveCompletionEvent; + xfer->completionStatus = I3C_SlaveCheckAndClearError(base, errFlags); + + if ((0UL != (handle->eventMask & (uint32_t)kI3C_SlaveCompletionEvent)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + return; + } + + if (0UL != (flags & (uint32_t)kI3C_SlaveEventSentFlag)) + { + xfer->event = (uint32_t)kI3C_SlaveRequestSentEvent; + if ((0UL != (handle->eventMask & xfer->event)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + } + + if (0UL != (flags & (uint32_t)kI3C_SlaveReceivedCCCFlag)) + { + handle->isBusy = true; + xfer->event = (uint32_t)kI3C_SlaveReceivedCCCEvent; + if ((0UL != (handle->eventMask & xfer->event)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + } + + if (0UL != (flags & (uint32_t)kI3C_SlaveBusStopFlag)) + { + if (handle->isBusy == true) + { + xfer->event = (uint32_t)kI3C_SlaveCompletionEvent; + xfer->completionStatus = kStatus_Success; + handle->isBusy = false; + + if ((0UL != (handle->eventMask & xfer->event)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + I3C_SlaveTransferAbortEDMA(base, handle); + } + else + { + return; + } + } + + if (0UL != (flags & (uint32_t)kI3C_SlaveMatchedFlag)) + { + xfer->event = (uint32_t)kI3C_SlaveAddressMatchEvent; + handle->isBusy = true; + if ((0UL != (handle->eventMask & (uint32_t)kI3C_SlaveAddressMatchEvent)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + } +} + +/*! + * brief Abort a slave dma non-blocking transfer in a early time + * + * param base I3C peripheral base address + * param handle pointer to i3c_slave_edma_handle_t structure + */ +void I3C_SlaveTransferAbortEDMA(I3C_Type *base, i3c_slave_edma_handle_t *handle) +{ + if (handle->isBusy != false) + { + EDMA_AbortTransfer(handle->txDmaHandle); + EDMA_AbortTransfer(handle->rxDmaHandle); + + I3C_SlaveEnableDMA(base, false, false, 0); + + /* Reset fifos. These flags clear automatically. */ + base->SDATACTRL |= I3C_SDATACTRL_FLUSHTB_MASK | I3C_SDATACTRL_FLUSHFB_MASK; + } +} \ No newline at end of file diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c_edma.h new file mode 100644 index 00000000000..8396e350d35 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_i3c_edma.h @@ -0,0 +1,279 @@ +/* + * Copyright 2022-2023 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_I3C_EDMA_H_ +#define FSL_I3C_EDMA_H_ + +#include "fsl_i3c.h" +#include "fsl_edma.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief I3C EDMA driver version. */ +#define FSL_I3C_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 2, 9)) +/*! @} */ + +/*! + * @addtogroup i3c_master_edma_driver + * @{ + */ + +/* Forward declaration of the transfer descriptor and handle typedefs. */ +typedef struct _i3c_master_edma_handle i3c_master_edma_handle_t; + +/*! @brief i3c master callback functions. */ +typedef struct _i3c_master_edma_callback +{ + void (*slave2Master)(I3C_Type *base, void *userData); /*!< Transfer complete callback */ + void (*ibiCallback)(I3C_Type *base, + i3c_master_edma_handle_t *handle, + i3c_ibi_type_t ibiType, + i3c_ibi_state_t ibiState); /*!< IBI event callback */ + void (*transferComplete)(I3C_Type *base, + i3c_master_edma_handle_t *handle, + status_t status, + void *userData); /*!< Transfer complete callback */ +} i3c_master_edma_callback_t; +/*! + * @brief Driver handle for master EDMA APIs. + * @note The contents of this structure are private and subject to change. + */ +struct _i3c_master_edma_handle +{ + I3C_Type *base; /*!< I3C base pointer. */ + uint8_t state; /*!< Transfer state machine current state. */ + uint32_t transferCount; /*!< Indicates progress of the transfer */ + uint8_t subaddressBuffer[4]; /*!< Saving subaddress command. */ + uint8_t subaddressCount; /*!< Saving command count. */ + i3c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ + i3c_master_edma_callback_t callback; /*!< Callback function pointer. */ + void *userData; /*!< Application data passed to callback. */ + edma_handle_t *rxDmaHandle; /*!< Handle for receive DMA channel. */ + edma_handle_t *txDmaHandle; /*!< Handle for transmit DMA channel. */ + uint8_t ibiAddress; /*!< Slave address which request IBI. */ + uint8_t *ibiBuff; /*!< Pointer to IBI buffer to keep ibi bytes. */ + size_t ibiPayloadSize; /*!< IBI payload size. */ + i3c_ibi_type_t ibiType; /*!< IBI type. */ +}; + +/*! @} */ + +/*! + * @addtogroup i3c_slave_edma_driver + * @{ + */ +/* Forward declaration of the transfer descriptor and handle typedefs. */ +typedef struct _i3c_slave_edma_handle i3c_slave_edma_handle_t; + +/*! @brief I3C slave transfer structure */ +typedef struct _i3c_slave_edma_transfer +{ + uint32_t event; /*!< Reason the callback is being invoked. */ + uint8_t *txData; /*!< Transfer buffer */ + size_t txDataSize; /*!< Transfer size */ + uint8_t *rxData; /*!< Transfer buffer */ + size_t rxDataSize; /*!< Transfer size */ + status_t completionStatus; /*!< Success or error code describing how the transfer completed. Only applies for + #kI3C_SlaveCompletionEvent. */ +} i3c_slave_edma_transfer_t; + +/*! + * @brief Slave event callback function pointer type. + * + * This callback is used only for the slave DMA transfer API. + * + * @param base Base address for the I3C instance on which the event occurred. + * @param handle Pointer to slave DMA transfer handle. + * @param transfer Pointer to transfer descriptor containing values passed to and/or from the callback. + * @param userData Arbitrary pointer-sized value passed from the application. + */ +typedef void (*i3c_slave_edma_callback_t)(I3C_Type *base, i3c_slave_edma_transfer_t *transfer, void *userData); +/*! + * @brief I3C slave edma handle structure. + * @note The contents of this structure are private and subject to change. + */ +struct _i3c_slave_edma_handle +{ + I3C_Type *base; /*!< I3C base pointer. */ + i3c_slave_edma_transfer_t transfer; /*!< I3C slave transfer copy. */ + bool isBusy; /*!< Whether transfer is busy. */ + bool wasTransmit; /*!< Whether the last transfer was a transmit. */ + uint32_t eventMask; /*!< Mask of enabled events. */ + i3c_slave_edma_callback_t callback; /*!< Callback function called at transfer event. */ + edma_handle_t *rxDmaHandle; /*!< Handle for receive DMA channel. */ + edma_handle_t *txDmaHandle; /*!< Handle for transmit DMA channel. */ + void *userData; /*!< Callback parameter passed to callback. */ +}; +/*! @} */ +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @addtogroup i3c_master_edma_driver + * @{ + */ + +/*! @name Master DMA */ +/*! @{ */ + +/*! + * @brief Create a new handle for the I3C master DMA APIs. + * + * The creation of a handle is for use with the DMA APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the I3C_MasterTransferAbortDMA() API shall be called. + * + * For devices where the I3C send and receive DMA requests are OR'd together, the @a txDmaHandle + * parameter is ignored and may be set to NULL. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C master driver handle. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + * @param rxDmaHandle Handle for the DMA receive channel. Created by the user prior to calling this function. + * @param txDmaHandle Handle for the DMA transmit channel. Created by the user prior to calling this function. + */ +void I3C_MasterTransferCreateHandleEDMA(I3C_Type *base, + i3c_master_edma_handle_t *handle, + const i3c_master_edma_callback_t *callback, + void *userData, + edma_handle_t *rxDmaHandle, + edma_handle_t *txDmaHandle); + +/*! + * @brief Performs a non-blocking DMA-based transaction on the I3C bus. + * + * The callback specified when the @a handle was created is invoked when the transaction has + * completed. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C master driver handle. + * @param transfer The pointer to the transfer descriptor. + * @retval kStatus_Success The transaction was started successfully. + * @retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or another DMA + * transaction is already in progress. + */ +status_t I3C_MasterTransferEDMA(I3C_Type *base, i3c_master_edma_handle_t *handle, i3c_master_transfer_t *transfer); + +/*! + * @brief Returns number of bytes transferred so far. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C master driver handle. + * @param[out] count Number of bytes transferred so far by the non-blocking transaction. + * @retval kStatus_Success + * @retval kStatus_NoTransferInProgress There is not a DMA transaction currently in progress. + */ +status_t I3C_MasterTransferGetCountEDMA(I3C_Type *base, i3c_master_edma_handle_t *handle, size_t *count); + +/*! + * @brief Terminates a non-blocking I3C master transmission early. + * + * @note It is not safe to call this function from an IRQ handler that has a higher priority than the + * DMA peripheral's IRQ priority. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C master driver handle. + */ +void I3C_MasterTransferAbortEDMA(I3C_Type *base, i3c_master_edma_handle_t *handle); + +/*! + * @brief Reusable routine to handle master interrupts. + * @note This function does not need to be called unless you are reimplementing the + * nonblocking API's interrupt handler routines to add special functionality. + * @param base The I3C peripheral base address. + * @param i3cHandle Pointer to the I3C master DMA driver handle. + */ +void I3C_MasterTransferEDMAHandleIRQ(I3C_Type *base, void *i3cHandle); +/*! @} */ + +/*! @} */ + +/*! + * @addtogroup i3c_slave_edma_driver + * @{ + */ + +/*! @name Slave DMA */ +/*! @{ */ +/*! + * @brief Create a new handle for the I3C slave DMA APIs. + * + * The creation of a handle is for use with the DMA APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the I3C_SlaveTransferAbortDMA() API shall be called. + * + * For devices where the I3C send and receive DMA requests are OR'd together, the @a txDmaHandle + * parameter is ignored and may be set to NULL. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C slave driver handle. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + * @param rxDmaHandle Handle for the DMA receive channel. Created by the user prior to calling this function. + * @param txDmaHandle Handle for the DMA transmit channel. Created by the user prior to calling this function. + */ +void I3C_SlaveTransferCreateHandleEDMA(I3C_Type *base, + i3c_slave_edma_handle_t *handle, + i3c_slave_edma_callback_t callback, + void *userData, + edma_handle_t *rxDmaHandle, + edma_handle_t *txDmaHandle); + +/*! + * @brief Prepares for a non-blocking DMA-based transaction on the I3C bus. + * + * The API will do DMA configuration according to the input transfer descriptor, and the data will be transferred when + * there's bus master requesting transfer from/to this slave. So the timing of call to this API need be aligned + * with master application to ensure the transfer is executed as expected. + * Callback specified when the @a handle was created is invoked when the transaction has completed. + * + * @param base The I3C peripheral base address. + * @param handle Pointer to the I3C slave driver handle. + * @param transfer The pointer to the transfer descriptor. + * @param eventMask Bit mask formed by OR'ing together #i3c_slave_transfer_event_t enumerators to specify + * which events to send to the callback. The transmit and receive events is not allowed to be enabled. + * @retval kStatus_Success The transaction was started successfully. + * @retval #kStatus_I3C_Busy Either another master is currently utilizing the bus, or another DMA + * transaction is already in progress. + * @retval #kStatus_Fail The transaction can't be set. + */ +status_t I3C_SlaveTransferEDMA(I3C_Type *base, + i3c_slave_edma_handle_t *handle, + i3c_slave_edma_transfer_t *transfer, + uint32_t eventMask); +/*! + * @brief Abort a slave edma non-blocking transfer in a early time + * + * @param base I3C peripheral base address + * @param handle pointer to i3c_slave_edma_handle_t structure + */ +void I3C_SlaveTransferAbortEDMA(I3C_Type *base, i3c_slave_edma_handle_t *handle); + +/*! + * @brief Reusable routine to handle slave interrupts. + * @note This function does not need to be called unless you are reimplementing the + * nonblocking API's interrupt handler routines to add special functionality. + * @param base The I3C peripheral base address. + * @param i3cHandle Pointer to the I3C slave DMA driver handle. + */ +void I3C_SlaveTransferEDMAHandleIRQ(I3C_Type *base, void *i3cHandle); +/*! @} */ + +/*! @} */ +#if defined(__cplusplus) +} +#endif + +#endif /* FSL_I3C_EDMA_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux.c new file mode 100644 index 00000000000..1f2ce0bcd26 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux.c @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021, 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_inputmux.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.inputmux" +#endif + +#if defined(INPUTMUX_RSTS) +#define INPUTMUX_RESETS_ARRAY INPUTMUX_RSTS +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +#if defined(INPUTMUX_RESETS_ARRAY) +/*! + * @brief Get instance number for INPUTMUX module. + * + * @param base INPUTMUX peripheral base address + */ +static uint32_t INPUTMUX_GetInstance(INPUTMUX_Type *base); +#endif +/******************************************************************************* + * Variables + ******************************************************************************/ +#if defined(INPUTMUX_RESETS_ARRAY) +/*! @brief Pointers to INPUTMUX bases for each instance. */ +static INPUTMUX_Type *const s_inputmuxBases[] = INPUTMUX_BASE_PTRS; + +/* Reset array */ +static const reset_ip_name_t s_inputmuxResets[] = INPUTMUX_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ +#if defined(INPUTMUX_RESETS_ARRAY) +static uint32_t INPUTMUX_GetInstance(INPUTMUX_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_inputmuxBases); instance++) + { + if (s_inputmuxBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_inputmuxBases)); + + return instance; +} +#endif + +/*! + * brief Initialize INPUTMUX peripheral. + + * This function enables the INPUTMUX clock. + * + * param base Base address of the INPUTMUX peripheral. + * + * retval None. + */ +void INPUTMUX_Init(INPUTMUX_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +#if defined(FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE) && FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE +#if (defined(FSL_FEATURE_SOC_SCT_COUNT) && (FSL_FEATURE_SOC_SCT_COUNT > 0)) + CLOCK_EnableClock(kCLOCK_Sct); +#endif /* FSL_FEATURE_SOC_SCT_COUNT */ + CLOCK_EnableClock(kCLOCK_Dma); +#else + CLOCK_EnableClock(kCLOCK_InputMux); +#endif /* FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE */ +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(INPUTMUX_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_inputmuxResets[INPUTMUX_GetInstance(base)]); +#endif +} + +/*! + * brief Attaches a signal + * + * This function attaches multiplexed signals from INPUTMUX to target signals. + * For example, to attach GPIO PORT0 Pin 5 to PINT peripheral, do the following: + * code + * INPUTMUX_AttachSignal(INPUTMUX, 2, kINPUTMUX_GpioPort0Pin5ToPintsel); + * endcode + * In this example, INTMUX has 8 registers for PINT, PINT_SEL0~PINT_SEL7. + * With parameter p index specified as 2, this function configures register PINT_SEL2. + * + * param base Base address of the INPUTMUX peripheral. + * param index The serial number of destination register in the group of INPUTMUX registers with same name. + * param connection Applies signal from source signals collection to target signal. + * + * retval None. + */ +void INPUTMUX_AttachSignal(INPUTMUX_Type *base, uint32_t index, inputmux_connection_t connection) +{ + uint32_t pmux_id; + uint32_t output_id; + + /* extract pmux to be used */ + pmux_id = ((uint32_t)(connection)) >> PMUX_SHIFT; + /* extract function number */ + output_id = ((uint32_t)(connection)) & ((1UL << PMUX_SHIFT) - 1U); + /* programm signal */ + *(volatile uint32_t *)(((uint32_t)base) + pmux_id + (index * 4U)) = output_id; +} + +#if defined(FSL_FEATURE_INPUTMUX_HAS_SIGNAL_ENA) +/*! + * brief Enable/disable a signal + * + * This function gates the INPUTPMUX clock. + * + * param base Base address of the INPUTMUX peripheral. + * param signal Enable signal register id and bit offset. + * param enable Selects enable or disable. + * + * retval None. + */ +void INPUTMUX_EnableSignal(INPUTMUX_Type *base, inputmux_signal_t signal, bool enable) +{ + uint32_t ena_id; + uint32_t ena_id_mask = (1UL << (32U - ENA_SHIFT)) - 1U; + uint32_t bit_offset; + +#if defined(FSL_FEATURE_INPUTMUX_HAS_CHANNEL_MUX) && FSL_FEATURE_INPUTMUX_HAS_CHANNEL_MUX + uint32_t chmux_offset; + uint32_t chmux_value; + + /* Only enable need to update channel mux */ + if (enable && ((((uint32_t)signal) & (1UL << CHMUX_AVL_SHIFT)) != 0U)) + { + chmux_offset = (((uint32_t)signal) >> CHMUX_OFF_SHIFT) & ((1UL << (CHMUX_AVL_SHIFT - CHMUX_OFF_SHIFT)) - 1UL); + chmux_value = (((uint32_t)signal) >> CHMUX_VAL_SHIFT) & ((1UL << (CHMUX_OFF_SHIFT - CHMUX_VAL_SHIFT)) - 1UL); + *(volatile uint32_t *)(((uint32_t)base) + chmux_offset) = chmux_value; + } + ena_id_mask = (1UL << (CHMUX_VAL_SHIFT - ENA_SHIFT)) - 1U; +#endif + /* extract enable register to be used */ + ena_id = (((uint32_t)signal) >> ENA_SHIFT) & ena_id_mask; + /* extract enable bit offset */ + bit_offset = ((uint32_t)signal) & ((1UL << ENA_SHIFT) - 1U); + /* set signal */ + if (enable) + { + *(volatile uint32_t *)(((uint32_t)base) + ena_id) |= (1UL << bit_offset); + } + else + { + *(volatile uint32_t *)(((uint32_t)base) + ena_id) &= ~(1UL << bit_offset); + } +} +#endif + +/*! + * brief Deinitialize INPUTMUX peripheral. + + * This function disables the INPUTMUX clock. + * + * param base Base address of the INPUTMUX peripheral. + * + * retval None. + */ +void INPUTMUX_Deinit(INPUTMUX_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +#if defined(FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE) && FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE +#if (defined(FSL_FEATURE_SOC_SCT_COUNT) && (FSL_FEATURE_SOC_SCT_COUNT > 0)) + CLOCK_DisableClock(kCLOCK_Sct); +#endif /* FSL_FEATURE_SOC_SCT_COUNT */ + CLOCK_DisableClock(kCLOCK_Dma); +#else + CLOCK_DisableClock(kCLOCK_InputMux); +#endif /* FSL_FEATURE_INPUTMUX_HAS_NO_INPUTMUX_CLOCK_SOURCE */ +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux.h new file mode 100644 index 00000000000..a8d5db82ec7 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021, 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_INPUTMUX_H_ +#define FSL_INPUTMUX_H_ + +#include "fsl_inputmux_connections.h" +#include "fsl_common.h" + +/*! + * @addtogroup inputmux_driver + * @{ + */ + +/*! @file */ +/*! @file fsl_inputmux_connections.h */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief Group interrupt driver version for SDK */ +#define FSL_INPUTMUX_DRIVER_VERSION (MAKE_VERSION(2, 0, 7)) +/*! @} */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + * @brief Initialize INPUTMUX peripheral. + + * This function enables the INPUTMUX clock. + * + * @param base Base address of the INPUTMUX peripheral. + * + * @retval None. + */ +void INPUTMUX_Init(INPUTMUX_Type *base); + +/*! + * @brief Attaches a signal + * + * This function attaches multiplexed signals from INPUTMUX to target signals. + * For example, to attach GPIO PORT0 Pin 5 to PINT peripheral, do the following: + * @code + * INPUTMUX_AttachSignal(INPUTMUX, 2, kINPUTMUX_GpioPort0Pin5ToPintsel); + * @endcode + * In this example, INTMUX has 8 registers for PINT, PINT_SEL0~PINT_SEL7. + * With parameter @p index specified as 2, this function configures register PINT_SEL2. + * + * @param base Base address of the INPUTMUX peripheral. + * @param index The serial number of destination register in the group of INPUTMUX registers with same name. + * @param connection Applies signal from source signals collection to target signal. + * + * @retval None. + */ +void INPUTMUX_AttachSignal(INPUTMUX_Type *base, uint32_t index, inputmux_connection_t connection); + +#if defined(FSL_FEATURE_INPUTMUX_HAS_SIGNAL_ENA) +/*! + * @brief Enable/disable a signal + * + * This function gates the INPUTPMUX clock. + * + * @param base Base address of the INPUTMUX peripheral. + * @param signal Enable signal register id and bit offset. + * @param enable Selects enable or disable. + * + * @retval None. + */ +void INPUTMUX_EnableSignal(INPUTMUX_Type *base, inputmux_signal_t signal, bool enable); +#endif + +/*! + * @brief Deinitialize INPUTMUX peripheral. + + * This function disables the INPUTMUX clock. + * + * @param base Base address of the INPUTMUX peripheral. + * + * @retval None. + */ +void INPUTMUX_Deinit(INPUTMUX_Type *base); + +#ifdef __cplusplus +} +#endif + +/*! @} */ + +#endif /* FSL_INPUTMUX_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux_connections.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux_connections.h new file mode 100644 index 00000000000..8086197ffff --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_inputmux_connections.h @@ -0,0 +1,3635 @@ +/* + * Copyright 2023 , NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FSL_INPUTMUX_CONNECTIONS_ +#define _FSL_INPUTMUX_CONNECTIONS_ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.inputmux_connections" +#endif + +#define INPUTMUX_GpioPortPinToPintsel(port, pin) ((pin) + (PINTSEL_PMUX_ID << PMUX_SHIFT)) + +/*! + * @addtogroup inputmux_driver + * @{ + */ + +/*! + * @name Input multiplexing connections + * @{ + */ + +/*! @brief Periphinmux IDs */ +#define TIMER0CAPTSEL0 0x20U +#define TIMER0TRIGIN 0x30U +#define TIMER1CAPTSEL0 0x40U +#define TIMER1TRIGIN 0x50U +#define TIMER2CAPTSEL0 0x60U +#define TIMER2TRIGIN 0x70U +#define FREQMEAS_REF_REG 0x180U +#define FREQMEAS_TAR_REG 0x184U +#define TIMER3CAPTSEL0 0x1A0U +#define TIMER3TRIGIN 0x1B0U +#define TIMER4CAPTSEL0 0x1C0U +#define TIMER4TRIGIN 0x1D0U +#define AOI1_MUX_REG 0x200U +#define CMP0_TRIG_REG 0x260U +#define ADC0_TRIG0_REG 0x280U +#define ADC1_TRIG0_REG 0x2C0U +#define DAC0_TRIG0_REG 0x300U +#define QDC0_TRIG_REG 0x360U +#define QDC0_HOME_REG 0x364U +#define QDC0_INDEX_REG 0x368U +#define QDC0_PHASEB_REG 0x36CU +#define QDC0_PHASEA_REG 0x370U +#define QDC0_ICAP1_REG 0x374U +#define QDC1_TRIG_REG 0x380U +#define QDC1_HOME_REG 0x384U +#define QDC1_INDEX_REG 0x388U +#define QDC1_PHASEB_REG 0x38CU +#define QDC1_PHASEA_REG 0x390U +#define QDC1_ICAP1_REG 0x394U +#define FlexPWM0_SM0_EXTA0_REG 0x3A0U +#define FlexPWM0_SM0_EXTSYNC0_REG 0x3A4U +#define FlexPWM0_SM1_EXTA1_REG 0x3A8U +#define FlexPWM0_SM1_EXTSYNC1_REG 0x3ACU +#define FlexPWM0_SM2_EXTA2_REG 0x3B0U +#define FlexPWM0_SM2_EXTSYNC2_REG 0x3B4U +#define FlexPWM0_FAULT_REG 0x3C0U +#define FlexPWM0_FORCE_REG 0x3D0U +#define FlexPWM1_SM0_EXTA0_REG 0x3E0U +#define FlexPWM1_SM0_EXTSYNC0_REG 0x3E4U +#define FlexPWM1_SM1_EXTA1_REG 0x3E8U +#define FlexPWM1_SM1_EXTSYNC1_REG 0x3ECU +#define FlexPWM1_SM2_EXTA2_REG 0x3F0U +#define FlexPWM1_SM2_EXTSYNC2_REG 0x3F4U +#define FlexPWM1_FAULT_REG 0x400U +#define FlexPWM1_FORCE_REG 0x410U +#define PWM0_EXT_CLK_REG 0x420U +#define PWM1_EXT_CLK_REG 0x424U +#define AOI0_MUX_REG 0x440U +#define USBFS_TRIG_REG 0x480U +#define EXT_TRIG0_REG 0x4C0U +#define CMP1_TRIG_REG 0x4E0U +#define LPI2C2_TRIG_REG 0x540U +#define OPAMP0_TRIG_REG 0x580U +#define LPI2C0_TRIG_REG 0x5A0U +#define LPI2C1_TRIG_REG 0x5C0U +#define LPSPI0_TRIG_REG 0x5E0U +#define LPSPI1_TRIG_REG 0x600U +#define LPUART0_TRIG_REG 0x620U +#define LPUART1_TRIG_REG 0x640U +#define LPUART2_TRIG_REG 0x660U +#define LPUART3_TRIG_REG 0x680U +#define LPUART4_TRIG_REG 0x6A0U +#define FLEXIO_TRIG0_REG 0x6E0U +#define PMUX_SHIFT 20U + +typedef enum _inputmux_index_t +{ + kINPUTMUX_INDEX_CTIMER0CAPTSEL0 = 0U, + kINPUTMUX_INDEX_CTIMER0CAPTSEL1 = 1U, + kINPUTMUX_INDEX_CTIMER0CAPTSEL2 = 2U, + kINPUTMUX_INDEX_CTIMER0CAPTSEL3 = 3U, + kINPUTMUX_INDEX_CTIMER1CAPTSEL0 = 0U, + kINPUTMUX_INDEX_CTIMER1CAPTSEL1 = 1U, + kINPUTMUX_INDEX_CTIMER1CAPTSEL2 = 2U, + kINPUTMUX_INDEX_CTIMER1CAPTSEL3 = 3U, + kINPUTMUX_INDEX_CTIMER2CAPTSEL0 = 0U, + kINPUTMUX_INDEX_CTIMER2CAPTSEL1 = 1U, + kINPUTMUX_INDEX_CTIMER2CAPTSEL2 = 2U, + kINPUTMUX_INDEX_CTIMER2CAPTSEL3 = 3U, + kINPUTMUX_INDEX_ADC0_TRIGSEL0 = 0U, + kINPUTMUX_INDEX_ADC0_TRIGSEL1 = 1U, + kINPUTMUX_INDEX_ADC0_TRIGSEL2 = 2U, + kINPUTMUX_INDEX_ADC0_TRIGSEL3 = 3U, + kINPUTMUX_INDEX_QDC0_ICAPSEL0 = 0U, + kINPUTMUX_INDEX_QDC0_ICAPSEL1 = 1U, + kINPUTMUX_INDEX_QDC0_ICAPSEL2 = 2U, + kINPUTMUX_INDEX_FLEXPWM0_FAULTSEL0 = 0U, + kINPUTMUX_INDEX_FLEXPWM0_FAULTSEL1 = 1U, + kINPUTMUX_INDEX_FLEXPWM0_FAULTSEL2 = 2U, + kINPUTMUX_INDEX_FLEXPWM0_FAULTSEL3 = 3U, + kINPUTMUX_INDEX_AOI0_TRIGSEL0 = 0U, + kINPUTMUX_INDEX_AOI0_TRIGSEL1 = 1U, + kINPUTMUX_INDEX_AOI0_TRIGSEL2 = 2U, + kINPUTMUX_INDEX_AOI0_TRIGSEL3 = 3U, + kINPUTMUX_INDEX_AOI0_TRIGSEL4 = 4U, + kINPUTMUX_INDEX_AOI0_TRIGSEL5 = 5U, + kINPUTMUX_INDEX_AOI0_TRIGSEL6 = 6U, + kINPUTMUX_INDEX_AOI0_TRIGSEL7 = 7U, + kINPUTMUX_INDEX_AOI0_TRIGSEL8 = 8U, + kINPUTMUX_INDEX_AOI0_TRIGSEL9 = 9U, + kINPUTMUX_INDEX_AOI0_TRIGSEL10 = 10U, + kINPUTMUX_INDEX_AOI0_TRIGSEL11 = 11U, + kINPUTMUX_INDEX_AOI0_TRIGSEL12 = 12U, + kINPUTMUX_INDEX_AOI0_TRIGSEL13 = 13U, + kINPUTMUX_INDEX_AOI0_TRIGSEL14 = 14U, + kINPUTMUX_INDEX_AOI0_TRIGSEL15 = 15U, + kINPUTMUX_INDEX_EXT_TRIGSEL0 = 0U, + kINPUTMUX_INDEX_EXT_TRIGSEL1 = 1U, + kINPUTMUX_INDEX_EXT_TRIGSEL2 = 2U, + kINPUTMUX_INDEX_EXT_TRIGSEL3 = 3U, + kINPUTMUX_INDEX_EXT_TRIGSEL4 = 4U, + kINPUTMUX_INDEX_EXT_TRIGSEL6 = 6U, + kINPUTMUX_INDEX_EXT_TRIGSEL7 = 7U +} inputmux_index_t; + +/*! @brief INPUTMUX connections type */ +typedef enum _inputmux_connection_t +{ + /*!< TIMER0 CAPTSEL. */ + kINPUTMUX_CtimerInp0ToTimer0Captsel = 1U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer0Captsel = 2U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer0Captsel = 3U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer0Captsel = 4U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer0Captsel = 5U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer0Captsel = 6U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer0Captsel = 7U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer0Captsel = 8U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer0Captsel = 9U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer0Captsel = 10U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer0Captsel = 11U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer0Captsel = 12U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer0Captsel = 13U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer0Captsel = 14U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer0Captsel = 15U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer0Captsel = 16U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer0Captsel = 17U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer0Captsel = 18U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer0Captsel = 19U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer0Captsel = 20U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer0Captsel = 21U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer0Captsel = 22U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer0Captsel = 23U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer0Captsel = 24U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer0Captsel = 25U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer0Captsel = 26U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer0Captsel = 27U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer0Captsel = 28U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer0Captsel = 29U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer0Captsel = 30U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer0Captsel = 31U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToTimer0Captsel = 33U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToTimer0Captsel = 34U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToTimer0Captsel = 35U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToTimer0Captsel = 36U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToTimer0Captsel = 37U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToTimer0Captsel = 38U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer0Captsel = 39U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer0Captsel = 40U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer0Captsel = 41U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer0Captsel = 42U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer0Captsel = 43U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer0Captsel = 44U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer0Captsel = 45U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer0Captsel = 46U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer0Captsel = 48U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer0Captsel = 49U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer0Captsel = 52U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer0Captsel = 53U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer0Captsel = 54U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer0Captsel = 55U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer0Captsel = 56U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer0Captsel = 57U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer0Captsel = 58U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer0Captsel = 59U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer0Captsel = 60U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer0Captsel = 61U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer0Captsel = 62U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer0Captsel = 63U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer0Captsel = 64U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer0Captsel = 65U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer0Captsel = 66U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer0Captsel = 67U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer0Captsel = 68U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer0Captsel = 69U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer0Captsel = 70U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer0Captsel = 71U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer0Captsel = 72U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer0Captsel = 73U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer0Captsel = 74U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer0Captsel = 75U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer0Captsel = 76U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer0Captsel = 77U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer0Captsel = 78U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToTimer0Captsel = 79U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToTimer0Captsel = 80U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToTimer0Captsel = 81U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToTimer0Captsel = 82U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToTimer0Captsel = 83U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToTimer0Captsel = 84U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer0Captsel = 85U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer0Captsel = 86U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer0Captsel = 87U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer0Captsel = 88U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer0Captsel = 89U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer0Captsel = 90U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer0Captsel = 91U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer0Captsel = 92U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer0Captsel = 94U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer0Captsel = 95U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer0Captsel = 96U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer0Captsel = 97U + (TIMER0CAPTSEL0 << PMUX_SHIFT), + + /*!< Timer1 CAPTSEL. */ + kINPUTMUX_CtimerInp0ToTimer1Captsel = 1U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer1Captsel = 2U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer1Captsel = 3U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer1Captsel = 4U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer1Captsel = 5U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer1Captsel = 6U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer1Captsel = 7U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer1Captsel = 8U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer1Captsel = 9U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer1Captsel = 10U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer1Captsel = 11U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer1Captsel = 12U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer1Captsel = 13U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer1Captsel = 14U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer1Captsel = 15U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer1Captsel = 16U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer1Captsel = 17U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer1Captsel = 18U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer1Captsel = 19U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer1Captsel = 20U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer1Captsel = 21U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer1Captsel = 22U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer1Captsel = 23U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer1Captsel = 24U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer1Captsel = 25U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer1Captsel = 26U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer1Captsel = 27U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer1Captsel = 28U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer1Captsel = 29U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer1Captsel = 30U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer1Captsel = 31U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToTimer1Captsel = 33U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToTimer1Captsel = 34U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToTimer1Captsel = 35U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToTimer1Captsel = 36U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToTimer1Captsel = 37U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToTimer1Captsel = 38U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer1Captsel = 39U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer1Captsel = 40U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer1Captsel = 41U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer1Captsel = 42U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer1Captsel = 43U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer1Captsel = 44U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer1Captsel = 45U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer1Captsel = 46U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer1Captsel = 48U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer1Captsel = 49U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer1Captsel = 52U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer1Captsel = 53U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer1Captsel = 54U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer1Captsel = 55U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer1Captsel = 56U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer1Captsel = 57U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer1Captsel = 58U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer1Captsel = 59U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer1Captsel = 60U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer1Captsel = 61U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer1Captsel = 62U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer1Captsel = 63U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer1Captsel = 64U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer1Captsel = 65U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer1Captsel = 66U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer1Captsel = 67U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer1Captsel = 68U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer1Captsel = 69U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer1Captsel = 70U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer1Captsel = 71U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer1Captsel = 72U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer1Captsel = 73U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer1Captsel = 74U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer1Captsel = 75U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer1Captsel = 76U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer1Captsel = 77U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer1Captsel = 78U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToTimer1Captsel = 79U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToTimer1Captsel = 80U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToTimer1Captsel = 81U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToTimer1Captsel = 82U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToTimer1Captsel = 83U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToTimer1Captsel = 84U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer1Captsel = 85U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer1Captsel = 86U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer1Captsel = 87U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer1Captsel = 88U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer1Captsel = 89U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer1Captsel = 90U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer1Captsel = 91U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer1Captsel = 92U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer1Captsel = 94U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer1Captsel = 95U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer1Captsel = 96U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer1Captsel = 97U + (TIMER1CAPTSEL0 << PMUX_SHIFT), + + /*!< Timer2 CAPTSEL. */ + kINPUTMUX_CtimerInp0ToTimer2Captsel = 1U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer2Captsel = 2U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer2Captsel = 3U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer2Captsel = 4U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer2Captsel = 5U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer2Captsel = 6U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer2Captsel = 7U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer2Captsel = 8U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer2Captsel = 9U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer2Captsel = 10U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer2Captsel = 11U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer2Captsel = 12U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer2Captsel = 13U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer2Captsel = 14U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer2Captsel = 15U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer2Captsel = 16U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer2Captsel = 17U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer2Captsel = 18U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer2Captsel = 19U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer2Captsel = 20U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer2Captsel = 21U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer2Captsel = 22U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer2Captsel = 23U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer2Captsel = 24U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer2Captsel = 25U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer2Captsel = 26U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer2Captsel = 27U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer2Captsel = 28U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer2Captsel = 29U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer2Captsel = 30U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer2Captsel = 31U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToTimer2Captsel = 33U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToTimer2Captsel = 34U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToTimer2Captsel = 35U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToTimer2Captsel = 36U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToTimer2Captsel = 37U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToTimer2Captsel = 38U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer2Captsel = 39U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer2Captsel = 40U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer2Captsel = 41U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer2Captsel = 42U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer2Captsel = 43U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer2Captsel = 44U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer2Captsel = 45U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer2Captsel = 46U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer2Captsel = 48U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer2Captsel = 49U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer2Captsel = 52U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer2Captsel = 53U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer2Captsel = 54U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer2Captsel = 55U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer2Captsel = 56U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer2Captsel = 57U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer2Captsel = 58U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer2Captsel = 59U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer2Captsel = 60U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer2Captsel = 61U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer2Captsel = 62U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer2Captsel = 63U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer2Captsel = 64U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer2Captsel = 65U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer2Captsel = 66U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer2Captsel = 67U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer2Captsel = 68U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer2Captsel = 69U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer2Captsel = 70U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer2Captsel = 71U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer2Captsel = 72U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer2Captsel = 73U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer2Captsel = 74U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer2Captsel = 75U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer2Captsel = 76U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer2Captsel = 77U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer2Captsel = 78U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToTimer2Captsel = 79U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToTimer2Captsel = 80U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToTimer2Captsel = 81U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToTimer2Captsel = 82U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToTimer2Captsel = 83U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToTimer2Captsel = 84U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer2Captsel = 85U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer2Captsel = 86U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer2Captsel = 87U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer2Captsel = 88U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer2Captsel = 89U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer2Captsel = 90U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer2Captsel = 91U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer2Captsel = 92U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer2Captsel = 94U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer2Captsel = 95U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer2Captsel = 96U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer2Captsel = 97U + (TIMER2CAPTSEL0 << PMUX_SHIFT), + + /*!< Timer3 CAPTSEL. */ + kINPUTMUX_CtimerInp0ToTimer3Captsel = 1U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer3Captsel = 2U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer3Captsel = 3U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer3Captsel = 4U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer3Captsel = 5U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer3Captsel = 6U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer3Captsel = 7U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer3Captsel = 8U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer3Captsel = 9U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer3Captsel = 10U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer3Captsel = 11U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer3Captsel = 12U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer3Captsel = 13U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer3Captsel = 14U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer3Captsel = 15U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer3Captsel = 16U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer3Captsel = 17U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer3Captsel = 18U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer3Captsel = 19U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer3Captsel = 20U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer3Captsel = 21U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer3Captsel = 22U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer3Captsel = 23U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer3Captsel = 24U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer3Captsel = 25U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer3Captsel = 26U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer3Captsel = 27U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer3Captsel = 28U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer3Captsel = 29U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer3Captsel = 30U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer3Captsel = 31U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToTimer3Captsel = 33U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToTimer3Captsel = 34U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToTimer3Captsel = 35U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToTimer3Captsel = 36U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToTimer3Captsel = 37U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToTimer3Captsel = 38U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer3Captsel = 39U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer3Captsel = 40U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer3Captsel = 41U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer3Captsel = 42U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer3Captsel = 43U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer3Captsel = 44U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer3Captsel = 45U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer3Captsel = 46U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer3Captsel = 48U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer3Captsel = 49U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer3Captsel = 52U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer3Captsel = 53U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer3Captsel = 54U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer3Captsel = 55U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer3Captsel = 56U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer3Captsel = 57U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer3Captsel = 58U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer3Captsel = 59U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer3Captsel = 60U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer3Captsel = 61U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer3Captsel = 62U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer3Captsel = 63U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer3Captsel = 64U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer3Captsel = 65U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer3Captsel = 66U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer3Captsel = 67U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer3Captsel = 68U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer3Captsel = 69U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer3Captsel = 70U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer3Captsel = 71U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer3Captsel = 72U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer3Captsel = 73U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer3Captsel = 74U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer3Captsel = 75U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer3Captsel = 76U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer3Captsel = 77U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer3Captsel = 78U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToTimer3Captsel = 79U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToTimer3Captsel = 80U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToTimer3Captsel = 81U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToTimer3Captsel = 82U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToTimer3Captsel = 83U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToTimer3Captsel = 84U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer3Captsel = 85U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer3Captsel = 86U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer3Captsel = 87U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer3Captsel = 88U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer3Captsel = 89U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer3Captsel = 90U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer3Captsel = 91U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer3Captsel = 92U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer3Captsel = 94U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer3Captsel = 95U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer3Captsel = 96U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer3Captsel = 97U + (TIMER3CAPTSEL0 << PMUX_SHIFT), + + /*!< Timer4 CAPTSEL. */ + kINPUTMUX_CtimerInp0ToTimer4Captsel = 1U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer4Captsel = 2U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer4Captsel = 3U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer4Captsel = 4U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer4Captsel = 5U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer4Captsel = 6U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer4Captsel = 7U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer4Captsel = 8U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer4Captsel = 9U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer4Captsel = 10U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer4Captsel = 11U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer4Captsel = 12U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer4Captsel = 13U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer4Captsel = 14U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer4Captsel = 15U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer4Captsel = 16U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer4Captsel = 17U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer4Captsel = 18U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer4Captsel = 19U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer4Captsel = 20U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer4Captsel = 21U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer4Captsel = 22U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer4Captsel = 23U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer4Captsel = 24U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer4Captsel = 25U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer4Captsel = 26U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer4Captsel = 27U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer4Captsel = 28U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer4Captsel = 29U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer4Captsel = 30U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer4Captsel = 31U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToTimer4Captsel = 33U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToTimer4Captsel = 34U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToTimer4Captsel = 35U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToTimer4Captsel = 36U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToTimer4Captsel = 37U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToTimer4Captsel = 38U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer4Captsel = 39U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer4Captsel = 40U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer4Captsel = 41U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer4Captsel = 42U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer4Captsel = 43U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer4Captsel = 44U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer4Captsel = 45U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer4Captsel = 46U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer4Captsel = 48U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer4Captsel = 49U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer4Captsel = 52U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer4Captsel = 53U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer4Captsel = 54U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer4Captsel = 55U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer4Captsel = 56U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer4Captsel = 57U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer4Captsel = 58U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer4Captsel = 59U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer4Captsel = 60U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer4Captsel = 61U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer4Captsel = 62U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer4Captsel = 63U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer4Captsel = 64U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer4Captsel = 65U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer4Captsel = 66U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer4Captsel = 67U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer4Captsel = 68U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer4Captsel = 69U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer4Captsel = 70U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer4Captsel = 71U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer4Captsel = 72U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer4Captsel = 73U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer4Captsel = 74U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer4Captsel = 75U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer4Captsel = 76U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer4Captsel = 77U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer4Captsel = 78U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToTimer4Captsel = 79U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToTimer4Captsel = 80U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToTimer4Captsel = 81U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToTimer4Captsel = 82U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToTimer4Captsel = 83U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToTimer4Captsel = 84U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer4Captsel = 85U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer4Captsel = 86U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer4Captsel = 87U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer4Captsel = 88U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer4Captsel = 89U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer4Captsel = 90U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer4Captsel = 91U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer4Captsel = 92U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer4Captsel = 94U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer4Captsel = 95U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer4Captsel = 96U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer4Captsel = 97U + (TIMER4CAPTSEL0 << PMUX_SHIFT), + + /*!< TIMER0 Trigger. */ + kINPUTMUX_CtimerInp0ToTimer0Trigger = 1U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer0Trigger = 2U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer0Trigger = 3U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer0Trigger = 4U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer0Trigger = 5U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer0Trigger = 6U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer0Trigger = 7U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer0Trigger = 8U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer0Trigger = 9U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer0Trigger = 10U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer0Trigger = 11U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer0Trigger = 12U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer0Trigger = 13U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer0Trigger = 14U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer0Trigger = 15U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer0Trigger = 16U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer0Trigger = 17U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer0Trigger = 18U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer0Trigger = 19U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer0Trigger = 20U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer0Trigger = 21U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer0Trigger = 22U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer0Trigger = 23U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer0Trigger = 24U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer0Trigger = 25U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer0Trigger = 26U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer0Trigger = 27U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer0Trigger = 28U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer0Trigger = 29U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer0Trigger = 30U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer0Trigger = 31U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToTimer0Trigger = 33U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToTimer0Trigger = 34U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToTimer0Trigger = 35U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToTimer0Trigger = 36U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToTimer0Trigger = 37U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToTimer0Trigger = 38U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer0Trigger = 39U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer0Trigger = 40U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer0Trigger = 41U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer0Trigger = 42U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer0Trigger = 43U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer0Trigger = 44U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer0Trigger = 45U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer0Trigger = 46U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer0Trigger = 48U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer0Trigger = 49U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer0Trigger = 52U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer0Trigger = 53U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer0Trigger = 54U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer0Trigger = 55U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer0Trigger = 56U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer0Trigger = 57U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer0Trigger = 58U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer0Trigger = 59U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer0Trigger = 60U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer0Trigger = 61U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer0Trigger = 62U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer0Trigger = 63U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer0Trigger = 64U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer0Trigger = 65U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer0Trigger = 66U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer0Trigger = 67U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer0Trigger = 68U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer0Trigger = 69U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer0Trigger = 70U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer0Trigger = 71U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer0Trigger = 72U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer0Trigger = 73U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer0Trigger = 74U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer0Trigger = 75U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer0Trigger = 76U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer0Trigger = 77U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer0Trigger = 78U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToTimer0Trigger = 79U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToTimer0Trigger = 80U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToTimer0Trigger = 81U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToTimer0Trigger = 82U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToTimer0Trigger = 83U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToTimer0Trigger = 84U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer0Trigger = 85U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer0Trigger = 86U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer0Trigger = 87U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer0Trigger = 88U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer0Trigger = 89U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer0Trigger = 90U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer0Trigger = 91U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer0Trigger = 92U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer0Trigger = 94U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer0Trigger = 95U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer0Trigger = 96U + (TIMER0TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer0Trigger = 97U + (TIMER0TRIGIN << PMUX_SHIFT), + + /*!< Timer1 Trigger. */ + kINPUTMUX_CtimerInp0ToTimer1Trigger = 1U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer1Trigger = 2U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer1Trigger = 3U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer1Trigger = 4U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer1Trigger = 5U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer1Trigger = 6U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer1Trigger = 7U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer1Trigger = 8U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer1Trigger = 9U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer1Trigger = 10U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer1Trigger = 11U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer1Trigger = 12U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer1Trigger = 13U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer1Trigger = 14U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer1Trigger = 15U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer1Trigger = 16U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer1Trigger = 17U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer1Trigger = 18U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer1Trigger = 19U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer1Trigger = 20U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer1Trigger = 21U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer1Trigger = 22U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer1Trigger = 23U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer1Trigger = 24U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer1Trigger = 25U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer1Trigger = 26U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer1Trigger = 27U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer1Trigger = 28U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer1Trigger = 29U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer1Trigger = 30U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer1Trigger = 31U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToTimer1Trigger = 33U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToTimer1Trigger = 34U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToTimer1Trigger = 35U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToTimer1Trigger = 36U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToTimer1Trigger = 37U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToTimer1Trigger = 38U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer1Trigger = 39U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer1Trigger = 40U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer1Trigger = 41U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer1Trigger = 42U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer1Trigger = 43U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer1Trigger = 44U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer1Trigger = 45U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer1Trigger = 46U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer1Trigger = 48U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer1Trigger = 49U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer1Trigger = 52U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer1Trigger = 53U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer1Trigger = 54U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer1Trigger = 55U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer1Trigger = 56U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer1Trigger = 57U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer1Trigger = 58U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer1Trigger = 59U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer1Trigger = 60U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer1Trigger = 61U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer1Trigger = 62U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer1Trigger = 63U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer1Trigger = 64U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer1Trigger = 65U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer1Trigger = 66U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer1Trigger = 67U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer1Trigger = 68U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer1Trigger = 69U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer1Trigger = 70U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer1Trigger = 71U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer1Trigger = 72U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer1Trigger = 73U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer1Trigger = 74U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer1Trigger = 75U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer1Trigger = 76U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer1Trigger = 77U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer1Trigger = 78U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToTimer1Trigger = 79U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToTimer1Trigger = 80U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToTimer1Trigger = 81U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToTimer1Trigger = 82U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToTimer1Trigger = 83U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToTimer1Trigger = 84U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer1Trigger = 85U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer1Trigger = 86U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer1Trigger = 87U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer1Trigger = 88U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer1Trigger = 89U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer1Trigger = 90U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer1Trigger = 91U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer1Trigger = 92U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer1Trigger = 94U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer1Trigger = 95U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer1Trigger = 96U + (TIMER1TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer1Trigger = 97U + (TIMER1TRIGIN << PMUX_SHIFT), + + /*!< Timer2 Trigger. */ + kINPUTMUX_CtimerInp0ToTimer2Trigger = 1U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer2Trigger = 2U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer2Trigger = 3U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer2Trigger = 4U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer2Trigger = 5U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer2Trigger = 6U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer2Trigger = 7U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer2Trigger = 8U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer2Trigger = 9U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer2Trigger = 10U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer2Trigger = 11U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer2Trigger = 12U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer2Trigger = 13U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer2Trigger = 14U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer2Trigger = 15U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer2Trigger = 16U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer2Trigger = 17U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer2Trigger = 18U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer2Trigger = 19U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer2Trigger = 20U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer2Trigger = 21U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer2Trigger = 22U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer2Trigger = 23U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer2Trigger = 24U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer2Trigger = 25U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer2Trigger = 26U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer2Trigger = 27U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer2Trigger = 28U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer2Trigger = 29U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer2Trigger = 30U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer2Trigger = 31U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToTimer2Trigger = 33U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToTimer2Trigger = 34U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToTimer2Trigger = 35U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToTimer2Trigger = 36U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToTimer2Trigger = 37U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToTimer2Trigger = 38U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer2Trigger = 39U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer2Trigger = 40U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer2Trigger = 41U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer2Trigger = 42U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer2Trigger = 43U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer2Trigger = 44U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer2Trigger = 45U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer2Trigger = 46U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer2Trigger = 48U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer2Trigger = 49U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer2Trigger = 52U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer2Trigger = 53U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer2Trigger = 54U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer2Trigger = 55U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer2Trigger = 56U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer2Trigger = 57U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer2Trigger = 58U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer2Trigger = 59U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer2Trigger = 60U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer2Trigger = 61U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer2Trigger = 62U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer2Trigger = 63U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer2Trigger = 64U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer2Trigger = 65U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer2Trigger = 66U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer2Trigger = 67U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer2Trigger = 68U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer2Trigger = 69U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer2Trigger = 70U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer2Trigger = 71U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer2Trigger = 72U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer2Trigger = 73U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer2Trigger = 74U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer2Trigger = 75U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer2Trigger = 76U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer2Trigger = 77U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer2Trigger = 78U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToTimer2Trigger = 79U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToTimer2Trigger = 80U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToTimer2Trigger = 81U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToTimer2Trigger = 82U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToTimer2Trigger = 83U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToTimer2Trigger = 84U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer2Trigger = 85U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer2Trigger = 86U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer2Trigger = 87U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer2Trigger = 88U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer2Trigger = 89U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer2Trigger = 90U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer2Trigger = 91U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer2Trigger = 92U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer2Trigger = 94U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer2Trigger = 95U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer2Trigger = 96U + (TIMER2TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer2Trigger = 97U + (TIMER2TRIGIN << PMUX_SHIFT), + + /*!< Timer3 Trigger. */ + kINPUTMUX_CtimerInp0ToTimer3Trigger = 1U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer3Trigger = 2U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer3Trigger = 3U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer3Trigger = 4U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer3Trigger = 5U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer3Trigger = 6U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer3Trigger = 7U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer3Trigger = 8U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer3Trigger = 9U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer3Trigger = 10U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer3Trigger = 11U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer3Trigger = 12U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer3Trigger = 13U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer3Trigger = 14U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer3Trigger = 15U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer3Trigger = 16U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer3Trigger = 17U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer3Trigger = 18U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer3Trigger = 19U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer3Trigger = 20U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer3Trigger = 21U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer3Trigger = 22U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer3Trigger = 23U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer3Trigger = 24U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer3Trigger = 25U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer3Trigger = 26U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer3Trigger = 27U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer3Trigger = 28U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer3Trigger = 29U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer3Trigger = 30U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer3Trigger = 31U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToTimer3Trigger = 33U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToTimer3Trigger = 34U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToTimer3Trigger = 35U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToTimer3Trigger = 36U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToTimer3Trigger = 37U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToTimer3Trigger = 38U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer3Trigger = 39U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer3Trigger = 40U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer3Trigger = 41U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer3Trigger = 42U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer3Trigger = 43U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer3Trigger = 44U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer3Trigger = 45U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer3Trigger = 46U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer3Trigger = 48U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer3Trigger = 49U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer3Trigger = 52U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer3Trigger = 53U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer3Trigger = 54U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer3Trigger = 55U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer3Trigger = 56U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer3Trigger = 57U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer3Trigger = 58U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer3Trigger = 59U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer3Trigger = 60U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer3Trigger = 61U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer3Trigger = 62U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer3Trigger = 63U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer3Trigger = 64U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer3Trigger = 65U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer3Trigger = 66U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer3Trigger = 67U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer3Trigger = 68U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer3Trigger = 69U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer3Trigger = 70U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer3Trigger = 71U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer3Trigger = 72U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer3Trigger = 73U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer3Trigger = 74U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer3Trigger = 75U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer3Trigger = 76U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer3Trigger = 77U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer3Trigger = 78U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToTimer3Trigger = 79U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToTimer3Trigger = 80U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToTimer3Trigger = 81U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToTimer3Trigger = 82U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToTimer3Trigger = 83U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToTimer3Trigger = 84U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer3Trigger = 85U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer3Trigger = 86U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer3Trigger = 87U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer3Trigger = 88U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer3Trigger = 89U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer3Trigger = 90U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer3Trigger = 91U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer3Trigger = 92U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer3Trigger = 94U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer3Trigger = 95U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer3Trigger = 96U + (TIMER3TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer3Trigger = 97U + (TIMER3TRIGIN << PMUX_SHIFT), + + /*!< Timer4 Trigger. */ + kINPUTMUX_CtimerInp0ToTimer4Trigger = 1U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp1ToTimer4Trigger = 2U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp2ToTimer4Trigger = 3U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp3ToTimer4Trigger = 4U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp4ToTimer4Trigger = 5U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp5ToTimer4Trigger = 6U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp6ToTimer4Trigger = 7U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp7ToTimer4Trigger = 8U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp8ToTimer4Trigger = 9U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp9ToTimer4Trigger = 10U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp10ToTimer4Trigger = 11U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp11ToTimer4Trigger = 12U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp12ToTimer4Trigger = 13U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp13ToTimer4Trigger = 14U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp14ToTimer4Trigger = 15U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp15ToTimer4Trigger = 16U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp16ToTimer4Trigger = 17U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp17ToTimer4Trigger = 18U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp18ToTimer4Trigger = 19U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_CtimerInp19ToTimer4Trigger = 20U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Usb0StartOfFrameToTimer4Trigger = 21U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToTimer4Trigger = 22U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToTimer4Trigger = 23U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToTimer4Trigger = 24U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToTimer4Trigger = 25U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToTimer4Trigger = 26U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToTimer4Trigger = 27U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToTimer4Trigger = 28U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToTimer4Trigger = 29U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToTimer4Trigger = 30U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToTimer4Trigger = 31U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToTimer4Trigger = 33U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToTimer4Trigger = 34U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToTimer4Trigger = 35U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToTimer4Trigger = 36U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToTimer4Trigger = 37U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToTimer4Trigger = 38U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToTimer4Trigger = 39U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToTimer4Trigger = 40U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToTimer4Trigger = 41U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToTimer4Trigger = 42U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToTimer4Trigger = 43U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToTimer4Trigger = 44U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToTimer4Trigger = 45U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToTimer4Trigger = 46U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToTimer4Trigger = 48U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToTimer4Trigger = 49U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToTimer4Trigger = 52U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToTimer4Trigger = 53U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToTimer4Trigger = 54U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToTimer4Trigger = 55U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToTimer4Trigger = 56U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToTimer4Trigger = 57U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToTimer4Trigger = 58U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToTimer4Trigger = 59U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToTimer4Trigger = 60U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToTimer4Trigger = 61U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToTimer4Trigger = 62U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToTimer4Trigger = 63U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToTimer4Trigger = 64U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToTimer4Trigger = 65U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToTimer4Trigger = 66U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToTimer4Trigger = 67U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToTimer4Trigger = 68U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToTimer4Trigger = 69U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToTimer4Trigger = 70U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToTimer4Trigger = 71U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToTimer4Trigger = 72U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToTimer4Trigger = 73U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToTimer4Trigger = 74U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToTimer4Trigger = 75U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToTimer4Trigger = 76U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToTimer4Trigger = 77U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToTimer4Trigger = 78U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToTimer4Trigger = 79U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToTimer4Trigger = 80U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToTimer4Trigger = 81U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToTimer4Trigger = 82U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToTimer4Trigger = 83U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToTimer4Trigger = 84U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToTimer4Trigger = 85U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToTimer4Trigger = 86U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToTimer4Trigger = 87U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToTimer4Trigger = 88U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToTimer4Trigger = 89U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToTimer4Trigger = 90U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToTimer4Trigger = 91U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToTimer4Trigger = 92U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToTimer4Trigger = 94U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToTimer4Trigger = 95U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToTimer4Trigger = 96U + (TIMER4TRIGIN << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToTimer4Trigger = 97U + (TIMER4TRIGIN << PMUX_SHIFT), + + /*!< Selection for frequency measurement reference clock. */ + kINPUTMUX_ClkInToFreqmeasRef = 1U + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_FroOsc12MToFreqmeasRef = 2u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_FroHfDivToFreqmeasRef = 3u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Clk16K1ToFreqmeasRef = 5u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_SlowClkToFreqmeasRef = 6u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_FreqmeClkIn0ToFreqmeasRef = 7u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_FreqmeClkIn1ToFreqmeasRef = 8u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFreqmeasRef = 9u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFreqmeasRef = 10u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFreqmeasRef = 11u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFreqmeasRef = 12u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFreqmeasRef = 13u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFreqmeasRef = 14u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFreqmeasRef = 15u + (FREQMEAS_REF_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFreqmeasRef = 16u + (FREQMEAS_REF_REG << PMUX_SHIFT), + + /*!< Selection for frequency measurement target clock. */ + kINPUTMUX_ClkInToFreqmeasTar = 1U + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_FroOsc12MToFreqmeasTar = 2u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_FroHfDivToFreqmeasTar = 3u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Clk16K1ToFreqmeasTar = 5u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_SlowClkToFreqmeasTar = 6u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_FreqmeClkIn0ToFreqmeasTar = 7u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_FreqmeClkIn1ToFreqmeasTar = 8u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFreqmeasTar = 9u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFreqmeasTar = 10u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFreqmeasTar = 11u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFreqmeasTar = 12u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFreqmeasTar = 13u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFreqmeasTar = 14u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFreqmeasTar = 15u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFreqmeasTar = 16u + (FREQMEAS_TAR_REG << PMUX_SHIFT), + + /*!< Cmp0 Trigger. */ + kINPUTMUX_Aoi0Out0ToCmp0Trigger = 2U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToCmp0Trigger = 3U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToCmp0Trigger = 4U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToCmp0Trigger = 5U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToCmp0Trigger = 6U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToCmp0Trigger = 8U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToCmp0Trigger = 9U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToCmp0Trigger = 10U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToCmp0Trigger = 11U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToCmp0Trigger = 12U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToCmp0Trigger = 13U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToCmp0Trigger = 14U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToCmp0Trigger = 16U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToCmp0Trigger = 17U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToCmp0Trigger = 18U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToCmp0Trigger = 19U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToCmp0Trigger = 20U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToCmp0Trigger = 21U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToCmp0Trigger = 22U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToCmp0Trigger = 25U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToCmp0Trigger = 26U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToCmp0Trigger = 27U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToCmp0Trigger = 28U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToCmp0Trigger = 29U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToCmp0Trigger = 30U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToCmp0Trigger = 31U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToCmp0Trigger = 32U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToCmp0Trigger = 33U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToCmp0Trigger = 34U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M0ToCmp0Trigger = 39U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToCmp0Trigger = 40U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M0ToCmp0Trigger = 41U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToCmp0Trigger = 42U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToCmp0Trigger = 47U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToCmp0Trigger = 48U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToCmp0Trigger = 49U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToCmp0Trigger = 50U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToCmp0Trigger = 51U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToCmp0Trigger = 52U + (CMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToCmp0Trigger = 53U + (CMP0_TRIG_REG << PMUX_SHIFT), + + /*!< Cmp1 Trigger. */ + kINPUTMUX_Aoi0Out0ToCmp1Trigger = 2U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToCmp1Trigger = 3U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToCmp1Trigger = 4U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToCmp1Trigger = 5U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToCmp1Trigger = 6U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToCmp1Trigger = 8U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToCmp1Trigger = 9U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToCmp1Trigger = 10U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToCmp1Trigger = 11U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToCmp1Trigger = 12U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToCmp1Trigger = 13U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToCmp1Trigger = 14U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToCmp1Trigger = 16U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToCmp1Trigger = 17U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToCmp1Trigger = 18U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToCmp1Trigger = 19U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToCmp1Trigger = 20U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToCmp1Trigger = 21U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToCmp1Trigger = 22U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToCmp1Trigger = 25U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToCmp1Trigger = 26U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToCmp1Trigger = 27U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToCmp1Trigger = 28U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToCmp1Trigger = 29U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToCmp1Trigger = 30U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToCmp1Trigger = 31U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToCmp1Trigger = 32U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToCmp1Trigger = 33U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToCmp1Trigger = 34U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M0ToCmp1Trigger = 39U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToCmp1Trigger = 40U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M0ToCmp1Trigger = 41U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToCmp1Trigger = 42U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToCmp1Trigger = 47U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToCmp1Trigger = 48U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToCmp1Trigger = 49U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToCmp1Trigger = 50U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToCmp1Trigger = 51U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToCmp1Trigger = 52U + (CMP1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToCmp1Trigger = 53U + (CMP1_TRIG_REG << PMUX_SHIFT), + + /*!< Adc0 Trigger. */ + kINPUTMUX_ArmTxevToAdc0Trigger = 1U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToAdc0Trigger = 2U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToAdc0Trigger = 3U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToAdc0Trigger = 4U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToAdc0Trigger = 5U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToAdc0Trigger = 6U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToAdc0Trigger = 7U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToAdc0Trigger = 9U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToAdc0Trigger = 10U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToAdc0Trigger = 11U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToAdc0Trigger = 12U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToAdc0Trigger = 13U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToAdc0Trigger = 14U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToAdc0Trigger = 15U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToAdc0Trigger = 17U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToAdc0Trigger = 18U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToAdc0Trigger = 19U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToAdc0Trigger = 20U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToAdc0Trigger = 21U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToAdc0Trigger = 22U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToAdc0Trigger = 23U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToAdc0Trigger = 26U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToAdc0Trigger = 27U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToAdc0Trigger = 28U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToAdc0Trigger = 29U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToAdc0Trigger = 30U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_WuuToAdc0Trigger = 31U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToAdc0Trigger = 33U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToAdc0Trigger = 34U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToAdc0Trigger = 35U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToAdc0Trigger = 36U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToAdc0Trigger = 37U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToAdc0Trigger = 38U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToAdc0Trigger = 39U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToAdc0Trigger = 40U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M0ToAdc0Trigger = 41U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToAdc0Trigger = 42U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M0ToAdc0Trigger = 43U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToAdc0Trigger = 44U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToAdc0Trigger = 45U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToAdc0Trigger = 46U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToAdc0Trigger = 47U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToAdc0Trigger = 48U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToAdc0Trigger = 49U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToAdc0Trigger = 50U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToAdc0Trigger = 51U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToAdc0Trigger = 52U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToAdc0Trigger = 53U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToAdc0Trigger = 54U + (ADC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToAdc0Trigger = 55U + (ADC0_TRIG0_REG << PMUX_SHIFT), + + /*!< Adc1 Trigger. */ + kINPUTMUX_ArmTxevToAdc1Trigger = 1U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToAdc1Trigger = 2U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToAdc1Trigger = 3U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToAdc1Trigger = 4U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToAdc1Trigger = 5U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToAdc1Trigger = 6U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToAdc1Trigger = 7U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToAdc1Trigger = 9U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToAdc1Trigger = 10U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToAdc1Trigger = 11U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToAdc1Trigger = 12U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToAdc1Trigger = 13U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToAdc1Trigger = 14U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToAdc1Trigger = 15U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToAdc1Trigger = 17U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToAdc1Trigger = 18U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToAdc1Trigger = 19U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToAdc1Trigger = 20U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToAdc1Trigger = 21U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToAdc1Trigger = 22U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToAdc1Trigger = 23U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToAdc1Trigger = 26U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToAdc1Trigger = 27U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToAdc1Trigger = 28U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToAdc1Trigger = 29U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToAdc1Trigger = 30U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_WuuToAdc1Trigger = 31U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToAdc1Trigger = 33U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToAdc1Trigger = 34U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToAdc1Trigger = 35U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToAdc1Trigger = 36U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToAdc1Trigger = 37U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToAdc1Trigger = 38U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToAdc1Trigger = 39U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToAdc1Trigger = 40U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M0ToAdc1Trigger = 41U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToAdc1Trigger = 42U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M0ToAdc1Trigger = 43U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToAdc1Trigger = 44U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToAdc1Trigger = 45U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToAdc1Trigger = 46U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToAdc1Trigger = 47U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToAdc1Trigger = 48U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToAdc1Trigger = 49U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToAdc1Trigger = 50U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToAdc1Trigger = 51U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToAdc1Trigger = 52U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToAdc1Trigger = 53U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToAdc1Trigger = 54U + (ADC1_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToAdc1Trigger = 55U + (ADC1_TRIG0_REG << PMUX_SHIFT), + + /*!< Dac0 Trigger. */ + kINPUTMUX_ArmTxevToDac0Trigger = 1U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToDac0Trigger = 2U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToDac0Trigger = 3U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToDac0Trigger = 4U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToDac0Trigger = 5U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToDac0Trigger = 6U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToDac0Trigger = 7U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToDac0Trigger = 9U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToDac0Trigger = 10U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToDac0Trigger = 11U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToDac0Trigger = 12U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToDac0Trigger = 13U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToDac0Trigger = 14U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToDac0Trigger = 15U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToDac0Trigger = 18U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToDac0Trigger = 19U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToDac0Trigger = 20U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToDac0Trigger = 21U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToDac0Trigger = 22U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToDac0Trigger = 23U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToDac0Trigger = 26U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToDac0Trigger = 27U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToDac0Trigger = 28U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToDac0Trigger = 29U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToDac0Trigger = 30U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_WuuToDac0Trigger = 31U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToDac0Trigger = 33U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToDac0Trigger = 34U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToDac0Trigger = 35U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToDac0Trigger = 36U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToDac0Trigger = 37U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToDac0Trigger = 38U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToDac0Trigger = 39U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToDac0Trigger = 40U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M0ToDac0Trigger = 41U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToDac0Trigger = 42U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M0ToDac0Trigger = 43U + (DAC0_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToDac0Trigger = 44U + (DAC0_TRIG0_REG << PMUX_SHIFT), + + /*!< Qdc0 Trigger. */ + kINPUTMUX_ArmTxevToQdc0Trigger = 1U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc0Trigger = 2U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc0Trigger = 3U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc0Trigger = 4U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc0Trigger = 5U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc0Trigger = 6U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc0Trigger = 7U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc0Trigger = 9U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc0Trigger = 10U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc0Trigger = 11U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc0Trigger = 12U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc0Trigger = 13U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc0Trigger = 14U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc0Trigger = 16U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc0Trigger = 17U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc0Trigger = 18U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc0Trigger = 19U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc0Trigger = 20U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc0Trigger = 21U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc0Trigger = 24U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc0Trigger = 25U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc0Trigger = 26U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc0Trigger = 27U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc0Trigger = 28U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc0Trigger = 29U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc0Trigger = 30U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc0Trigger = 31U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc0Trigger = 32U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc0Trigger = 33U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc0Trigger = 34U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc0Trigger = 35U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc0Trigger = 36U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc0Trigger = 37U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc0Trigger = 38U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc0Trigger = 39U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc0Trigger = 40U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc0Trigger = 41U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc0Trigger = 42U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc0Trigger = 43U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc0Trigger = 44U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc0Trigger = 49U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc0Trigger = 50U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc0Trigger = 51U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc0Trigger = 52U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc0Trigger = 62U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc0Trigger = 63U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc0Trigger = 64U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc0Trigger = 65U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc0Trigger = 66U + (QDC0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc0Trigger = 67U + (QDC0_TRIG_REG << PMUX_SHIFT), + + /*!< Qdc0 Home. */ + kINPUTMUX_ArmTxevToQdc0Home = 1U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc0Home = 2U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc0Home = 3U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc0Home = 4U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc0Home = 5U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc0Home = 6U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc0Home = 7U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc0Home = 9U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc0Home = 10U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc0Home = 11U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc0Home = 12U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc0Home = 13U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc0Home = 14U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc0Home = 16U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc0Home = 17U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc0Home = 18U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc0Home = 19U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc0Home = 20U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc0Home = 21U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc0Home = 24U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc0Home = 25U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc0Home = 26U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc0Home = 27U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc0Home = 28U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc0Home = 29U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc0Home = 30U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc0Home = 31U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc0Home = 32U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc0Home = 33U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc0Home = 34U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc0Home = 35U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc0Home = 36U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc0Home = 37U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc0Home = 38U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc0Home = 39U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc0Home = 40U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc0Home = 41U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc0Home = 42U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc0Home = 43U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc0Home = 44U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc0Home = 49U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc0Home = 50U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc0Home = 51U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc0Home = 52U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc0Home = 62U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc0Home = 63U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc0Home = 64U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc0Home = 65U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc0Home = 66U + (QDC0_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc0Home = 67U + (QDC0_HOME_REG << PMUX_SHIFT), + + /*!< Qdc0 Index. */ + kINPUTMUX_ArmTxevToQdc0Index = 1U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc0Index = 2U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc0Index = 3U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc0Index = 4U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc0Index = 5U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc0Index = 6U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc0Index = 7U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc0Index = 9U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc0Index = 10U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc0Index = 11U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc0Index = 12U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc0Index = 13U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc0Index = 14U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc0Index = 16U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc0Index = 17U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc0Index = 18U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc0Index = 19U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc0Index = 20U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc0Index = 21U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc0Index = 24U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc0Index = 25U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc0Index = 26U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc0Index = 27U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc0Index = 28U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc0Index = 29U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc0Index = 30U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc0Index = 31U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc0Index = 32U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc0Index = 33U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc0Index = 34U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc0Index = 35U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc0Index = 36U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc0Index = 37U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc0Index = 38U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc0Index = 39U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc0Index = 40U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc0Index = 41U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc0Index = 42U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc0Index = 43U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc0Index = 44U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc0Index = 49U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc0Index = 50U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc0Index = 51U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc0Index = 52U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc0Index = 62U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc0Index = 63U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc0Index = 64U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc0Index = 65U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc0Index = 66U + (QDC0_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc0Index = 67U + (QDC0_INDEX_REG << PMUX_SHIFT), + + /*!< Qdc0 Phaseb. */ + kINPUTMUX_ArmTxevToQdc0Phaseb = 1U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc0Phaseb = 2U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc0Phaseb = 3U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc0Phaseb = 4U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc0Phaseb = 5U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc0Phaseb = 6U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc0Phaseb = 7U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc0Phaseb = 9U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc0Phaseb = 10U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc0Phaseb = 11U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc0Phaseb = 12U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc0Phaseb = 13U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc0Phaseb = 14U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc0Phaseb = 16U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc0Phaseb = 17U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc0Phaseb = 18U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc0Phaseb = 19U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc0Phaseb = 20U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc0Phaseb = 21U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc0Phaseb = 24U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc0Phaseb = 25U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc0Phaseb = 26U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc0Phaseb = 27U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc0Phaseb = 28U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc0Phaseb = 29U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc0Phaseb = 30U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc0Phaseb = 31U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc0Phaseb = 32U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc0Phaseb = 33U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc0Phaseb = 34U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc0Phaseb = 35U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc0Phaseb = 36U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc0Phaseb = 37U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc0Phaseb = 38U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc0Phaseb = 39U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc0Phaseb = 40U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc0Phaseb = 41U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc0Phaseb = 42U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc0Phaseb = 43U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc0Phaseb = 44U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc0Phaseb = 49U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc0Phaseb = 50U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc0Phaseb = 51U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc0Phaseb = 52U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc0Phaseb = 62U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc0Phaseb = 63U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc0Phaseb = 64U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc0Phaseb = 65U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc0Phaseb = 66U + (QDC0_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc0Phaseb = 67U + (QDC0_PHASEB_REG << PMUX_SHIFT), + + /*!< Qdc0 Phasea. */ + kINPUTMUX_ArmTxevToQdc0Phasea = 1U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc0Phasea = 2U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc0Phasea = 3U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc0Phasea = 4U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc0Phasea = 5U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc0Phasea = 6U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc0Phasea = 7U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc0Phasea = 9U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc0Phasea = 10U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc0Phasea = 11U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc0Phasea = 12U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc0Phasea = 13U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc0Phasea = 14U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc0Phasea = 16U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc0Phasea = 17U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc0Phasea = 18U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc0Phasea = 19U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc0Phasea = 20U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc0Phasea = 21U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc0Phasea = 24U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc0Phasea = 25U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc0Phasea = 26U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc0Phasea = 27U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc0Phasea = 28U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc0Phasea = 29U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc0Phasea = 30U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc0Phasea = 31U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc0Phasea = 32U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc0Phasea = 33U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc0Phasea = 34U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc0Phasea = 35U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc0Phasea = 36U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc0Phasea = 37U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc0Phasea = 38U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc0Phasea = 39U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc0Phasea = 40U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc0Phasea = 41U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc0Phasea = 42U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc0Phasea = 43U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc0Phasea = 44U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc0Phasea = 49U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc0Phasea = 50U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc0Phasea = 51U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc0Phasea = 52U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc0Phasea = 62U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc0Phasea = 63U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc0Phasea = 64U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc0Phasea = 65U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc0Phasea = 66U + (QDC0_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc0Phasea = 67U + (QDC0_PHASEA_REG << PMUX_SHIFT), + + /*!< Qdc0 Icap1. */ + kINPUTMUX_ArmTxevToQdc0Icap1 = 1U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc0Icap1 = 2U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc0Icap1 = 3U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc0Icap1 = 4U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc0Icap1 = 5U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc0Icap1 = 6U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc0Icap1 = 7U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc0Icap1 = 9U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc0Icap1 = 10U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc0Icap1 = 11U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc0Icap1 = 12U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc0Icap1 = 13U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc0Icap1 = 14U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc0Icap1 = 16U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc0Icap1 = 17U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc0Icap1 = 18U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc0Icap1 = 19U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc0Icap1 = 20U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc0Icap1 = 21U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc0Icap1 = 24U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc0Icap1 = 25U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc0Icap1 = 26U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc0Icap1 = 27U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc0Icap1 = 28U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc0Icap1 = 29U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc0Icap1 = 30U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc0Icap1 = 31U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc0Icap1 = 32U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc0Icap1 = 33U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc0Icap1 = 34U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc0Icap1 = 35U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc0Icap1 = 36U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc0Icap1 = 37U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc0Icap1 = 38U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc0Icap1 = 39U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc0Icap1 = 40U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc0Icap1 = 41U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc0Icap1 = 42U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc0Icap1 = 43U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc0Icap1 = 44U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc0Icap1 = 49U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc0Icap1 = 50U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc0Icap1 = 51U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc0Icap1 = 52U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc0Icap1 = 62U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc0Icap1 = 63U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc0Icap1 = 64U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc0Icap1 = 65U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc0Icap1 = 66U + (QDC0_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc0Icap1 = 67U + (QDC0_ICAP1_REG << PMUX_SHIFT), + + /*!< Qdc1 Trigger. */ + kINPUTMUX_ArmTxevToQdc1Trigger = 1U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc1Trigger = 2U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc1Trigger = 3U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc1Trigger = 4U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc1Trigger = 5U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc1Trigger = 6U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc1Trigger = 7U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc1Trigger = 9U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc1Trigger = 10U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc1Trigger = 11U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc1Trigger = 12U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc1Trigger = 13U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc1Trigger = 14U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc1Trigger = 16U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc1Trigger = 17U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc1Trigger = 18U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc1Trigger = 19U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc1Trigger = 20U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc1Trigger = 21U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc1Trigger = 24U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc1Trigger = 25U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc1Trigger = 26U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc1Trigger = 27U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc1Trigger = 28U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc1Trigger = 29U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc1Trigger = 30U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc1Trigger = 31U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc1Trigger = 32U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc1Trigger = 33U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc1Trigger = 34U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc1Trigger = 35U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc1Trigger = 36U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc1Trigger = 37U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc1Trigger = 38U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc1Trigger = 39U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc1Trigger = 40U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc1Trigger = 41U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc1Trigger = 42U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc1Trigger = 43U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc1Trigger = 44U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc1Trigger = 49U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc1Trigger = 50U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc1Trigger = 51U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc1Trigger = 52U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc1Trigger = 62U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc1Trigger = 63U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc1Trigger = 64U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc1Trigger = 65U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc1Trigger = 66U + (QDC1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc1Trigger = 67U + (QDC1_TRIG_REG << PMUX_SHIFT), + + /*!< Qdc1 Home. */ + kINPUTMUX_ArmTxevToQdc1Home = 1U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc1Home = 2U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc1Home = 3U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc1Home = 4U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc1Home = 5U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc1Home = 6U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc1Home = 7U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc1Home = 9U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc1Home = 10U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc1Home = 11U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc1Home = 12U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc1Home = 13U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc1Home = 14U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc1Home = 16U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc1Home = 17U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc1Home = 18U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc1Home = 19U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc1Home = 20U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc1Home = 21U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc1Home = 24U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc1Home = 25U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc1Home = 26U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc1Home = 27U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc1Home = 28U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc1Home = 29U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc1Home = 30U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc1Home = 31U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc1Home = 32U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc1Home = 33U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc1Home = 34U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc1Home = 35U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc1Home = 36U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc1Home = 37U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc1Home = 38U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc1Home = 39U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc1Home = 40U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc1Home = 41U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc1Home = 42U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc1Home = 43U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc1Home = 44U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc1Home = 49U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc1Home = 50U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc1Home = 51U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc1Home = 52U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc1Home = 62U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc1Home = 63U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc1Home = 64U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc1Home = 65U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc1Home = 66U + (QDC1_HOME_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc1Home = 67U + (QDC1_HOME_REG << PMUX_SHIFT), + + /*!< Qdc1 Index. */ + kINPUTMUX_ArmTxevToQdc1Index = 1U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc1Index = 2U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc1Index = 3U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc1Index = 4U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc1Index = 5U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc1Index = 6U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc1Index = 7U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc1Index = 9U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc1Index = 10U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc1Index = 11U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc1Index = 12U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc1Index = 13U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc1Index = 14U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc1Index = 16U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc1Index = 17U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc1Index = 18U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc1Index = 19U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc1Index = 20U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc1Index = 21U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc1Index = 24U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc1Index = 25U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc1Index = 26U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc1Index = 27U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc1Index = 28U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc1Index = 29U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc1Index = 30U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc1Index = 31U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc1Index = 32U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc1Index = 33U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc1Index = 34U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc1Index = 35U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc1Index = 36U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc1Index = 37U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc1Index = 38U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc1Index = 39U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc1Index = 40U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc1Index = 41U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc1Index = 42U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc1Index = 43U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc1Index = 44U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc1Index = 49U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc1Index = 50U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc1Index = 51U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc1Index = 52U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc1Index = 62U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc1Index = 63U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc1Index = 64U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc1Index = 65U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc1Index = 66U + (QDC1_INDEX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc1Index = 67U + (QDC1_INDEX_REG << PMUX_SHIFT), + + /*!< Qdc1 Phaseb. */ + kINPUTMUX_ArmTxevToQdc1Phaseb = 1U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc1Phaseb = 2U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc1Phaseb = 3U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc1Phaseb = 4U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc1Phaseb = 5U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc1Phaseb = 6U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc1Phaseb = 7U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc1Phaseb = 9U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc1Phaseb = 10U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc1Phaseb = 11U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc1Phaseb = 12U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc1Phaseb = 13U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc1Phaseb = 14U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc1Phaseb = 16U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc1Phaseb = 17U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc1Phaseb = 18U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc1Phaseb = 19U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc1Phaseb = 20U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc1Phaseb = 21U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc1Phaseb = 24U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc1Phaseb = 25U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc1Phaseb = 26U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc1Phaseb = 27U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc1Phaseb = 28U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc1Phaseb = 29U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc1Phaseb = 30U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc1Phaseb = 31U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc1Phaseb = 32U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc1Phaseb = 33U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc1Phaseb = 34U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc1Phaseb = 35U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc1Phaseb = 36U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc1Phaseb = 37U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc1Phaseb = 38U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc1Phaseb = 39U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc1Phaseb = 40U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc1Phaseb = 41U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc1Phaseb = 42U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc1Phaseb = 43U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc1Phaseb = 44U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc1Phaseb = 49U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc1Phaseb = 50U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc1Phaseb = 51U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc1Phaseb = 52U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc1Phaseb = 62U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc1Phaseb = 63U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc1Phaseb = 64U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc1Phaseb = 65U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc1Phaseb = 66U + (QDC1_PHASEB_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc1Phaseb = 67U + (QDC1_PHASEB_REG << PMUX_SHIFT), + + /*!< Qdc1 Phasea. */ + kINPUTMUX_ArmTxevToQdc1Phasea = 1U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc1Phasea = 2U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc1Phasea = 3U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc1Phasea = 4U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc1Phasea = 5U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc1Phasea = 6U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc1Phasea = 7U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc1Phasea = 9U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc1Phasea = 10U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc1Phasea = 11U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc1Phasea = 12U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc1Phasea = 13U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc1Phasea = 14U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc1Phasea = 16U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc1Phasea = 17U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc1Phasea = 18U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc1Phasea = 19U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc1Phasea = 20U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc1Phasea = 21U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc1Phasea = 24U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc1Phasea = 25U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc1Phasea = 26U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc1Phasea = 27U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc1Phasea = 28U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc1Phasea = 29U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc1Phasea = 30U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc1Phasea = 31U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc1Phasea = 32U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc1Phasea = 33U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc1Phasea = 34U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc1Phasea = 35U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc1Phasea = 36U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc1Phasea = 37U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc1Phasea = 38U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc1Phasea = 39U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc1Phasea = 40U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc1Phasea = 41U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc1Phasea = 42U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc1Phasea = 43U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc1Phasea = 44U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc1Phasea = 49U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc1Phasea = 50U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc1Phasea = 51U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc1Phasea = 52U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc1Phasea = 62U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc1Phasea = 63U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc1Phasea = 64U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc1Phasea = 65U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc1Phasea = 66U + (QDC1_PHASEA_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc1Phasea = 67U + (QDC1_PHASEA_REG << PMUX_SHIFT), + + /*!< Qdc1 Icap1. */ + kINPUTMUX_ArmTxevToQdc1Icap1 = 1U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToQdc1Icap1 = 2U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToQdc1Icap1 = 3U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToQdc1Icap1 = 4U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToQdc1Icap1 = 5U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToQdc1Icap1 = 6U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToQdc1Icap1 = 7U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToQdc1Icap1 = 9U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToQdc1Icap1 = 10U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToQdc1Icap1 = 11U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToQdc1Icap1 = 12U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToQdc1Icap1 = 13U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToQdc1Icap1 = 14U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToQdc1Icap1 = 16U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToQdc1Icap1 = 17U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToQdc1Icap1 = 18U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToQdc1Icap1 = 19U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToQdc1Icap1 = 20U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToQdc1Icap1 = 21U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToQdc1Icap1 = 24U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToQdc1Icap1 = 25U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToQdc1Icap1 = 26U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToQdc1Icap1 = 27U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToQdc1Icap1 = 28U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToQdc1Icap1 = 29U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToQdc1Icap1 = 30U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToQdc1Icap1 = 31U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToQdc1Icap1 = 32U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToQdc1Icap1 = 33U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToQdc1Icap1 = 34U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToQdc1Icap1 = 35U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToQdc1Icap1 = 36U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToQdc1Icap1 = 37U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToQdc1Icap1 = 38U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToQdc1Icap1 = 39U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToQdc1Icap1 = 40U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToQdc1Icap1 = 41U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToQdc1Icap1 = 42U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToQdc1Icap1 = 43U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToQdc1Icap1 = 44U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToQdc1Icap1 = 49U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToQdc1Icap1 = 50U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToQdc1Icap1 = 51U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToQdc1Icap1 = 52U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToQdc1Icap1 = 62U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToQdc1Icap1 = 63U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToQdc1Icap1 = 64U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToQdc1Icap1 = 65U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToQdc1Icap1 = 66U + (QDC1_ICAP1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToQdc1Icap1 = 67U + (QDC1_ICAP1_REG << PMUX_SHIFT), + + /*!< FlexPWM0_SM0_EXTA0 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm0Sm0Exta0 = 1U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm0Sm0Exta0 = 2U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm0Sm0Exta0 = 3U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm0Sm0Exta0 = 4U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm0Sm0Exta0 = 5U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm0Sm0Exta0 = 6U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm0Sm0Exta0 = 7U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm0Sm0Exta0 = 9U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm0Sm0Exta0 = 10U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm0Sm0Exta0 = 11U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm0Sm0Exta0 = 12U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm0Sm0Exta0 = 13U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm0Sm0Exta0 = 14U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm0Sm0Exta0 = 15U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm0Sm0Exta0 = 16U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm0Sm0Exta0 = 17U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm0Sm0Exta0 = 18U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm0Sm0Exta0 = 19U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm0Sm0Exta0 = 20U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm0Sm0Exta0 = 21U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm0Sm0Exta0 = 22U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm0Sm0Exta0 = 23U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm0Sm0Exta0 = 24U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm0Sm0Exta0 = 25U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm0Sm0Exta0 = 26U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm0Sm0Exta0 = 27U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm0Sm0Exta0 = 28U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm0Sm0Exta0 = 29U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm0Sm0Exta0 = 30U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm0Sm0Exta0 = 31U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm0Sm0Exta0 = 32U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm0Sm0Exta0 = 33U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm0Sm0Exta0 = 34U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm0Sm0Exta0 = 35U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm0Sm0Exta0 = 36U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm0Sm0Exta0 = 37U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm0Sm0Exta0 = 38U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm0Sm0Exta0 = 39U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm0Sm0Exta0 = 40U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm0Sm0Exta0 = 45U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm0Sm0Exta0 = 46U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm0Sm0Exta0 = 47U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm0Sm0Exta0 = 48U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm0Sm0Exta0 = 49U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm0Sm0Exta0 = 50U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm0Sm0Exta0 = 51U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm0Sm0Exta0 = 52U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm0Sm0Exta0 = 53U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexPwm0Sm0Exta0 = 54U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToFlexPwm0Sm0Exta0 = 55U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexPwm0Sm0Exta0 = 56U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToFlexPwm0Sm0Exta0 = 57U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexPwm0Sm0Exta0 = 58U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToFlexPwm0Sm0Exta0 = 59U + (FlexPWM0_SM0_EXTA0_REG << PMUX_SHIFT), + + /*!< FlexPWM0_SM1_EXTA1 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm0Sm1Exta1 = 1U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm0Sm1Exta1 = 2U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm0Sm1Exta1 = 3U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm0Sm1Exta1 = 4U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm0Sm1Exta1 = 5U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm0Sm1Exta1 = 6U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm0Sm1Exta1 = 7U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm0Sm1Exta1 = 9U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm0Sm1Exta1 = 10U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm0Sm1Exta1 = 11U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm0Sm1Exta1 = 12U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm0Sm1Exta1 = 13U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm0Sm1Exta1 = 14U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm0Sm1Exta1 = 15U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm0Sm1Exta1 = 16U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm0Sm1Exta1 = 17U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm0Sm1Exta1 = 18U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm0Sm1Exta1 = 19U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm0Sm1Exta1 = 20U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm0Sm1Exta1 = 21U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm0Sm1Exta1 = 22U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm0Sm1Exta1 = 23U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm0Sm1Exta1 = 24U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm0Sm1Exta1 = 25U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm0Sm1Exta1 = 26U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm0Sm1Exta1 = 27U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm0Sm1Exta1 = 28U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm0Sm1Exta1 = 29U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm0Sm1Exta1 = 30U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm0Sm1Exta1 = 31U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm0Sm1Exta1 = 32U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm0Sm1Exta1 = 33U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm0Sm1Exta1 = 34U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm0Sm1Exta1 = 35U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm0Sm1Exta1 = 36U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm0Sm1Exta1 = 37U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm0Sm1Exta1 = 38U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm0Sm1Exta1 = 39U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm0Sm1Exta1 = 40U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm0Sm1Exta1 = 45U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm0Sm1Exta1 = 46U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm0Sm1Exta1 = 47U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm0Sm1Exta1 = 48U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm0Sm1Exta1 = 49U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm0Sm1Exta1 = 50U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm0Sm1Exta1 = 51U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm0Sm1Exta1 = 52U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm0Sm1Exta1 = 53U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexPwm0Sm1Exta1 = 54U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToFlexPwm0Sm1Exta1 = 55U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexPwm0Sm1Exta1 = 56U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToFlexPwm0Sm1Exta1 = 57U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexPwm0Sm1Exta1 = 58U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToFlexPwm0Sm1Exta1 = 59U + (FlexPWM0_SM1_EXTA1_REG << PMUX_SHIFT), + + /*!< FlexPWM0_SM2_EXTA2 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm0Sm2Exta2 = 1U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm0Sm2Exta2 = 2U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm0Sm2Exta2 = 3U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm0Sm2Exta2 = 4U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm0Sm2Exta2 = 5U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm0Sm2Exta2 = 6U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm0Sm2Exta2 = 7U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm0Sm2Exta2 = 9U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm0Sm2Exta2 = 10U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm0Sm2Exta2 = 11U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm0Sm2Exta2 = 12U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm0Sm2Exta2 = 13U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm0Sm2Exta2 = 14U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm0Sm2Exta2 = 15U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm0Sm2Exta2 = 16U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm0Sm2Exta2 = 17U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm0Sm2Exta2 = 18U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm0Sm2Exta2 = 19U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm0Sm2Exta2 = 20U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm0Sm2Exta2 = 21U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm0Sm2Exta2 = 22U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm0Sm2Exta2 = 23U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm0Sm2Exta2 = 24U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm0Sm2Exta2 = 25U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm0Sm2Exta2 = 26U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm0Sm2Exta2 = 27U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm0Sm2Exta2 = 28U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm0Sm2Exta2 = 29U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm0Sm2Exta2 = 30U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm0Sm2Exta2 = 31U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm0Sm2Exta2 = 32U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm0Sm2Exta2 = 33U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm0Sm2Exta2 = 34U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm0Sm2Exta2 = 35U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm0Sm2Exta2 = 36U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm0Sm2Exta2 = 37U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm0Sm2Exta2 = 38U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm0Sm2Exta2 = 39U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm0Sm2Exta2 = 40U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm0Sm2Exta2 = 45U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm0Sm2Exta2 = 46U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm0Sm2Exta2 = 47U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm0Sm2Exta2 = 48U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm0Sm2Exta2 = 49U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm0Sm2Exta2 = 50U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm0Sm2Exta2 = 51U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm0Sm2Exta2 = 52U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm0Sm2Exta2 = 53U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexPwm0Sm2Exta2 = 54U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToFlexPwm0Sm2Exta2 = 55U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexPwm0Sm2Exta2 = 56U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToFlexPwm0Sm2Exta2 = 57U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexPwm0Sm2Exta2 = 58U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToFlexPwm0Sm2Exta2 = 59U + (FlexPWM0_SM2_EXTA2_REG << PMUX_SHIFT), + + /*!< FlexPWM0_SM0_EXTSYNC0 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm0Sm0Extsync0 = 1U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm0Sm0Extsync0 = 2U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm0Sm0Extsync0 = 3U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm0Sm0Extsync0 = 4U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm0Sm0Extsync0 = 5U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm0Sm0Extsync0 = 6U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm0Sm0Extsync0 = 7U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm0Sm0Extsync0 = 9U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm0Sm0Extsync0 = 10U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm0Sm0Extsync0 = 11U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm0Sm0Extsync0 = 12U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm0Sm0Extsync0 = 13U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm0Sm0Extsync0 = 14U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm0Sm0Extsync0 = 15U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm0Sm0Extsync0 = 16U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm0Sm0Extsync0 = 17U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm0Sm0Extsync0 = 18U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm0Sm0Extsync0 = 19U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm0Sm0Extsync0 = 20U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm0Sm0Extsync0 = 21U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm0Sm0Extsync0 = 22U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm0Sm0Extsync0 = 23U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm0Sm0Extsync0 = 24U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm0Sm0Extsync0 = 25U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm0Sm0Extsync0 = 26U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm0Sm0Extsync0 = 27U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm0Sm0Extsync0 = 28U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm0Sm0Extsync0 = 29U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm0Sm0Extsync0 = 30U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm0Sm0Extsync0 = 31U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm0Sm0Extsync0 = 32U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm0Sm0Extsync0 = 33U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm0Sm0Extsync0 = 34U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm0Sm0Extsync0 = 35U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm0Sm0Extsync0 = 36U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm0Sm0Extsync0 = 37U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm0Sm0Extsync0 = 38U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm0Sm0Extsync0 = 39U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm0Sm0Extsync0 = 40U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm0Sm0Extsync0 = 45U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm0Sm0Extsync0 = 46U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm0Sm0Extsync0 = 47U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm0Sm0Extsync0 = 48U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm0Sm0Extsync0 = 49U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm0Sm0Extsync0 = 50U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm0Sm0Extsync0 = 51U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm0Sm0Extsync0 = 52U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm0Sm0Extsync0 = 53U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexPwm0Sm0Extsync0 = 54U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToFlexPwm0Sm0Extsync0 = 55U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexPwm0Sm0Extsync0 = 56U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToFlexPwm0Sm0Extsync0 = 57U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexPwm0Sm0Extsync0 = 58U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToFlexPwm0Sm0Extsync0 = 59U + (FlexPWM0_SM0_EXTSYNC0_REG << PMUX_SHIFT), + + /*!< FlexPWM0_SM1_EXTSYNC1 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm0Sm1Extsync1 = 1U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm0Sm1Extsync1 = 2U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm0Sm1Extsync1 = 3U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm0Sm1Extsync1 = 4U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm0Sm1Extsync1 = 5U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm0Sm1Extsync1 = 6U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm0Sm1Extsync1 = 7U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm0Sm1Extsync1 = 9U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm0Sm1Extsync1 = 10U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm0Sm1Extsync1 = 11U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm0Sm1Extsync1 = 12U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm0Sm1Extsync1 = 13U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm0Sm1Extsync1 = 14U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm0Sm1Extsync1 = 15U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm0Sm1Extsync1 = 16U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm0Sm1Extsync1 = 17U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm0Sm1Extsync1 = 18U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm0Sm1Extsync1 = 19U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm0Sm1Extsync1 = 20U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm0Sm1Extsync1 = 21U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm0Sm1Extsync1 = 22U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm0Sm1Extsync1 = 23U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm0Sm1Extsync1 = 24U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm0Sm1Extsync1 = 25U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm0Sm1Extsync1 = 26U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm0Sm1Extsync1 = 27U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm0Sm1Extsync1 = 28U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm0Sm1Extsync1 = 29U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm0Sm1Extsync1 = 30U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm0Sm1Extsync1 = 31U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm0Sm1Extsync1 = 32U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm0Sm1Extsync1 = 33U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm0Sm1Extsync1 = 34U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm0Sm1Extsync1 = 35U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm0Sm1Extsync1 = 36U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm0Sm1Extsync1 = 37U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm0Sm1Extsync1 = 38U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm0Sm1Extsync1 = 39U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm0Sm1Extsync1 = 40U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm0Sm1Extsync1 = 45U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm0Sm1Extsync1 = 46U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm0Sm1Extsync1 = 47U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm0Sm1Extsync1 = 48U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm0Sm1Extsync1 = 49U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm0Sm1Extsync1 = 50U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm0Sm1Extsync1 = 51U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm0Sm1Extsync1 = 52U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm0Sm1Extsync1 = 53U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexPwm0Sm1Extsync1 = 54U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToFlexPwm0Sm1Extsync1 = 55U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexPwm0Sm1Extsync1 = 56U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToFlexPwm0Sm1Extsync1 = 57U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexPwm0Sm1Extsync1 = 58U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToFlexPwm0Sm1Extsync1 = 59U + (FlexPWM0_SM1_EXTSYNC1_REG << PMUX_SHIFT), + + /*!< FlexPWM0_SM2_EXTSYNC2 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm0Sm2Extsync2 = 1U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm0Sm2Extsync2 = 2U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm0Sm2Extsync2 = 3U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm0Sm2Extsync2 = 4U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm0Sm2Extsync2 = 5U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm0Sm2Extsync2 = 6U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm0Sm2Extsync2 = 7U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm0Sm2Extsync2 = 9U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm0Sm2Extsync2 = 10U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm0Sm2Extsync2 = 11U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm0Sm2Extsync2 = 12U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm0Sm2Extsync2 = 13U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm0Sm2Extsync2 = 14U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm0Sm2Extsync2 = 15U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm0Sm2Extsync2 = 16U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm0Sm2Extsync2 = 17U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm0Sm2Extsync2 = 18U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm0Sm2Extsync2 = 19U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm0Sm2Extsync2 = 20U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm0Sm2Extsync2 = 21U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm0Sm2Extsync2 = 22U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm0Sm2Extsync2 = 23U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm0Sm2Extsync2 = 24U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm0Sm2Extsync2 = 25U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm0Sm2Extsync2 = 26U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm0Sm2Extsync2 = 27U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm0Sm2Extsync2 = 28U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm0Sm2Extsync2 = 29U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm0Sm2Extsync2 = 30U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm0Sm2Extsync2 = 31U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm0Sm2Extsync2 = 32U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm0Sm2Extsync2 = 33U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm0Sm2Extsync2 = 34U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm0Sm2Extsync2 = 35U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm0Sm2Extsync2 = 36U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm0Sm2Extsync2 = 37U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm0Sm2Extsync2 = 38U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm0Sm2Extsync2 = 39U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm0Sm2Extsync2 = 40U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm0Sm2Extsync2 = 45U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm0Sm2Extsync2 = 46U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm0Sm2Extsync2 = 47U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm0Sm2Extsync2 = 48U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm0Sm2Extsync2 = 49U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm0Sm2Extsync2 = 50U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm0Sm2Extsync2 = 51U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm0Sm2Extsync2 = 52U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm0Sm2Extsync2 = 53U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexPwm0Sm2Extsync2 = 54U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToFlexPwm0Sm2Extsync2 = 55U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexPwm0Sm2Extsync2 = 56U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToFlexPwm0Sm2Extsync2 = 57U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexPwm0Sm2Extsync2 = 58U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToFlexPwm0Sm2Extsync2 = 59U + (FlexPWM0_SM2_EXTSYNC2_REG << PMUX_SHIFT), + + /*!< FlexPWM0_FAULT input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm0Fault = 1U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm0Fault = 2U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm0Fault = 3U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm0Fault = 4U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm0Fault = 5U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm0Fault = 6U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm0Fault = 7U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm0Fault = 9U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm0Fault = 10U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm0Fault = 11U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm0Fault = 12U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm0Fault = 13U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm0Fault = 14U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm0Fault = 15U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm0Fault = 16U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm0Fault = 17U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm0Fault = 18U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm0Fault = 19U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm0Fault = 20U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm0Fault = 21U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm0Fault = 22U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm0Fault = 23U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm0Fault = 24U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm0Fault = 25U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm0Fault = 26U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm0Fault = 27U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm0Fault = 28U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm0Fault = 29U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm0Fault = 30U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm0Fault = 31U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm0Fault = 32U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm0Fault = 33U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm0Fault = 34U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm0Fault = 35U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm0Fault = 36U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm0Fault = 37U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm0Fault = 38U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm0Fault = 39U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm0Fault = 40U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm0Fault = 45U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm0Fault = 46U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm0Fault = 47U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm0Fault = 48U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm0Fault = 49U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm0Fault = 50U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm0Fault = 51U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm0Fault = 52U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm0Fault = 53U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexPwm0Fault = 54U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToFlexPwm0Fault = 55U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexPwm0Fault = 56U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToFlexPwm0Fault = 57U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexPwm0Fault = 58U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToFlexPwm0Fault = 59U + (FlexPWM0_FAULT_REG << PMUX_SHIFT), + + /*!< FlexPWM0_FORCE input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm0Force = 1U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm0Force = 2U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm0Force = 3U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm0Force = 4U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm0Force = 5U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm0Force = 6U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm0Force = 7U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm0Force = 9U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm0Force = 10U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm0Force = 11U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm0Force = 12U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm0Force = 13U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm0Force = 14U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm0Force = 15U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm0Force = 16U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm0Force = 17U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm0Force = 18U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm0Force = 19U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm0Force = 20U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm0Force = 21U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm0Force = 22U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm0Force = 23U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm0Force = 24U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm0Force = 25U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm0Force = 26U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm0Force = 27U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm0Force = 28U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm0Force = 29U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm0Force = 30U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm0Force = 31U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm0Force = 32U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm0Force = 33U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm0Force = 34U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm0Force = 35U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm0Force = 36U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm0Force = 37U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm0Force = 38U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm0Force = 39U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm0Force = 40U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm0Force = 45U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm0Force = 46U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm0Force = 47U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm0Force = 48U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm0Force = 49U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm0Force = 50U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm0Force = 51U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm0Force = 52U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm0Force = 53U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexPwm0Force = 54U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToFlexPwm0Force = 55U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexPwm0Force = 56U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToFlexPwm0Force = 57U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexPwm0Force = 58U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToFlexPwm0Force = 59U + (FlexPWM0_FORCE_REG << PMUX_SHIFT), + + /*!< FlexPWM1_SM0_EXTA0 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm1Sm0Exta0 = 1U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm1Sm0Exta0 = 2U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm1Sm0Exta0 = 3U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm1Sm0Exta0 = 4U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm1Sm0Exta0 = 5U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm1Sm0Exta0 = 6U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm1Sm0Exta0 = 7U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm1Sm0Exta0 = 9U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm1Sm0Exta0 = 10U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm1Sm0Exta0 = 11U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm1Sm0Exta0 = 12U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm1Sm0Exta0 = 13U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm1Sm0Exta0 = 14U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm1Sm0Exta0 = 15U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm1Sm0Exta0 = 16U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm1Sm0Exta0 = 17U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm1Sm0Exta0 = 18U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm1Sm0Exta0 = 19U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm1Sm0Exta0 = 20U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm1Sm0Exta0 = 21U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm1Sm0Exta0 = 22U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm1Sm0Exta0 = 23U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm1Sm0Exta0 = 24U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm1Sm0Exta0 = 25U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm1Sm0Exta0 = 26U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm1Sm0Exta0 = 27U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm1Sm0Exta0 = 28U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm1Sm0Exta0 = 29U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm1Sm0Exta0 = 30U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm1Sm0Exta0 = 31U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm1Sm0Exta0 = 32U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm1Sm0Exta0 = 33U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm1Sm0Exta0 = 34U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm1Sm0Exta0 = 35U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm1Sm0Exta0 = 36U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm1Sm0Exta0 = 37U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm1Sm0Exta0 = 38U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm1Sm0Exta0 = 39U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm1Sm0Exta0 = 40U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm1Sm0Exta0 = 45U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm1Sm0Exta0 = 46U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm1Sm0Exta0 = 47U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm1Sm0Exta0 = 48U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm1Sm0Exta0 = 49U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm1Sm0Exta0 = 50U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm1Sm0Exta0 = 51U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm1Sm0Exta0 = 52U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm1Sm0Exta0 = 53U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexPwm1Sm0Exta0 = 54U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFlexPwm1Sm0Exta0 = 55U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexPwm1Sm0Exta0 = 56U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFlexPwm1Sm0Exta0 = 57U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexPwm1Sm0Exta0 = 58U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFlexPwm1Sm0Exta0 = 59U + (FlexPWM1_SM0_EXTA0_REG << PMUX_SHIFT), + + /*!< FlexPWM1_SM1_EXTA1 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm1Sm1Exta1 = 1U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm1Sm1Exta1 = 2U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm1Sm1Exta1 = 3U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm1Sm1Exta1 = 4U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm1Sm1Exta1 = 5U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm1Sm1Exta1 = 6U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm1Sm1Exta1 = 7U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm1Sm1Exta1 = 9U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm1Sm1Exta1 = 10U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm1Sm1Exta1 = 11U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm1Sm1Exta1 = 12U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm1Sm1Exta1 = 13U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm1Sm1Exta1 = 14U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm1Sm1Exta1 = 15U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm1Sm1Exta1 = 16U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm1Sm1Exta1 = 17U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm1Sm1Exta1 = 18U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm1Sm1Exta1 = 19U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm1Sm1Exta1 = 20U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm1Sm1Exta1 = 21U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm1Sm1Exta1 = 22U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm1Sm1Exta1 = 23U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm1Sm1Exta1 = 24U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm1Sm1Exta1 = 25U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm1Sm1Exta1 = 26U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm1Sm1Exta1 = 27U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm1Sm1Exta1 = 28U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm1Sm1Exta1 = 29U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm1Sm1Exta1 = 30U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm1Sm1Exta1 = 31U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm1Sm1Exta1 = 32U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm1Sm1Exta1 = 33U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm1Sm1Exta1 = 34U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm1Sm1Exta1 = 35U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm1Sm1Exta1 = 36U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm1Sm1Exta1 = 37U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm1Sm1Exta1 = 38U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm1Sm1Exta1 = 39U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm1Sm1Exta1 = 40U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm1Sm1Exta1 = 45U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm1Sm1Exta1 = 46U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm1Sm1Exta1 = 47U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm1Sm1Exta1 = 48U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm1Sm1Exta1 = 49U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm1Sm1Exta1 = 50U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm1Sm1Exta1 = 51U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm1Sm1Exta1 = 52U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm1Sm1Exta1 = 53U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexPwm1Sm1Exta1 = 54U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFlexPwm1Sm1Exta1 = 55U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexPwm1Sm1Exta1 = 56U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFlexPwm1Sm1Exta1 = 57U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexPwm1Sm1Exta1 = 58U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFlexPwm1Sm1Exta1 = 59U + (FlexPWM1_SM1_EXTA1_REG << PMUX_SHIFT), + + /*!< FlexPWM1_SM2_EXTA2 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm1Sm2Exta2 = 1U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm1Sm2Exta2 = 2U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm1Sm2Exta2 = 3U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm1Sm2Exta2 = 4U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm1Sm2Exta2 = 5U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm1Sm2Exta2 = 6U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm1Sm2Exta2 = 7U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm1Sm2Exta2 = 9U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm1Sm2Exta2 = 10U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm1Sm2Exta2 = 11U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm1Sm2Exta2 = 12U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm1Sm2Exta2 = 13U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm1Sm2Exta2 = 14U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm1Sm2Exta2 = 15U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm1Sm2Exta2 = 16U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm1Sm2Exta2 = 17U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm1Sm2Exta2 = 18U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm1Sm2Exta2 = 19U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm1Sm2Exta2 = 20U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm1Sm2Exta2 = 21U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm1Sm2Exta2 = 22U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm1Sm2Exta2 = 23U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm1Sm2Exta2 = 24U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm1Sm2Exta2 = 25U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm1Sm2Exta2 = 26U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm1Sm2Exta2 = 27U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm1Sm2Exta2 = 28U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm1Sm2Exta2 = 29U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm1Sm2Exta2 = 30U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm1Sm2Exta2 = 31U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm1Sm2Exta2 = 32U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm1Sm2Exta2 = 33U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm1Sm2Exta2 = 34U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm1Sm2Exta2 = 35U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm1Sm2Exta2 = 36U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm1Sm2Exta2 = 37U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm1Sm2Exta2 = 38U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm1Sm2Exta2 = 39U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm1Sm2Exta2 = 40U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm1Sm2Exta2 = 45U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm1Sm2Exta2 = 46U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm1Sm2Exta2 = 47U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm1Sm2Exta2 = 48U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm1Sm2Exta2 = 49U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm1Sm2Exta2 = 50U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm1Sm2Exta2 = 51U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm1Sm2Exta2 = 52U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm1Sm2Exta2 = 53U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexPwm1Sm2Exta2 = 54U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFlexPwm1Sm2Exta2 = 55U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexPwm1Sm2Exta2 = 56U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFlexPwm1Sm2Exta2 = 57U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexPwm1Sm2Exta2 = 58U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFlexPwm1Sm2Exta2 = 59U + (FlexPWM1_SM2_EXTA2_REG << PMUX_SHIFT), + + /*!< FlexPWM1_SM0_EXTSYNC0 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm1Sm0Extsync0 = 1U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm1Sm0Extsync0 = 2U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm1Sm0Extsync0 = 3U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm1Sm0Extsync0 = 4U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm1Sm0Extsync0 = 5U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm1Sm0Extsync0 = 6U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm1Sm0Extsync0 = 7U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm1Sm0Extsync0 = 9U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm1Sm0Extsync0 = 10U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm1Sm0Extsync0 = 11U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm1Sm0Extsync0 = 12U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm1Sm0Extsync0 = 13U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm1Sm0Extsync0 = 14U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm1Sm0Extsync0 = 15U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm1Sm0Extsync0 = 16U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm1Sm0Extsync0 = 17U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm1Sm0Extsync0 = 18U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm1Sm0Extsync0 = 19U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm1Sm0Extsync0 = 20U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm1Sm0Extsync0 = 21U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm1Sm0Extsync0 = 22U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm1Sm0Extsync0 = 23U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm1Sm0Extsync0 = 24U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm1Sm0Extsync0 = 25U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm1Sm0Extsync0 = 26U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm1Sm0Extsync0 = 27U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm1Sm0Extsync0 = 28U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm1Sm0Extsync0 = 29U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm1Sm0Extsync0 = 30U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm1Sm0Extsync0 = 31U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm1Sm0Extsync0 = 32U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm1Sm0Extsync0 = 33U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm1Sm0Extsync0 = 34U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm1Sm0Extsync0 = 35U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm1Sm0Extsync0 = 36U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm1Sm0Extsync0 = 37U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm1Sm0Extsync0 = 38U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm1Sm0Extsync0 = 39U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm1Sm0Extsync0 = 40U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm1Sm0Extsync0 = 45U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm1Sm0Extsync0 = 46U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm1Sm0Extsync0 = 47U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm1Sm0Extsync0 = 48U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm1Sm0Extsync0 = 49U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm1Sm0Extsync0 = 50U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm1Sm0Extsync0 = 51U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm1Sm0Extsync0 = 52U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm1Sm0Extsync0 = 53U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexPwm1Sm0Extsync0 = 54U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFlexPwm1Sm0Extsync0 = 55U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexPwm1Sm0Extsync0 = 56U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFlexPwm1Sm0Extsync0 = 57U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexPwm1Sm0Extsync0 = 58U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFlexPwm1Sm0Extsync0 = 59U + (FlexPWM1_SM0_EXTSYNC0_REG << PMUX_SHIFT), + + /*!< FlexPWM1_SM1_EXTSYNC1 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm1Sm1Extsync1 = 1U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm1Sm1Extsync1 = 2U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm1Sm1Extsync1 = 3U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm1Sm1Extsync1 = 4U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm1Sm1Extsync1 = 5U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm1Sm1Extsync1 = 6U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm1Sm1Extsync1 = 7U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm1Sm1Extsync1 = 9U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm1Sm1Extsync1 = 10U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm1Sm1Extsync1 = 11U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm1Sm1Extsync1 = 12U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm1Sm1Extsync1 = 13U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm1Sm1Extsync1 = 14U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm1Sm1Extsync1 = 15U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm1Sm1Extsync1 = 16U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm1Sm1Extsync1 = 17U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm1Sm1Extsync1 = 18U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm1Sm1Extsync1 = 19U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm1Sm1Extsync1 = 20U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm1Sm1Extsync1 = 21U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm1Sm1Extsync1 = 22U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm1Sm1Extsync1 = 23U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm1Sm1Extsync1 = 24U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm1Sm1Extsync1 = 25U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm1Sm1Extsync1 = 26U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm1Sm1Extsync1 = 27U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm1Sm1Extsync1 = 28U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm1Sm1Extsync1 = 29U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm1Sm1Extsync1 = 30U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm1Sm1Extsync1 = 31U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm1Sm1Extsync1 = 32U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm1Sm1Extsync1 = 33U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm1Sm1Extsync1 = 34U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm1Sm1Extsync1 = 35U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm1Sm1Extsync1 = 36U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm1Sm1Extsync1 = 37U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm1Sm1Extsync1 = 38U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm1Sm1Extsync1 = 39U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm1Sm1Extsync1 = 40U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm1Sm1Extsync1 = 45U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm1Sm1Extsync1 = 46U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm1Sm1Extsync1 = 47U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm1Sm1Extsync1 = 48U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm1Sm1Extsync1 = 49U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm1Sm1Extsync1 = 50U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm1Sm1Extsync1 = 51U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm1Sm1Extsync1 = 52U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm1Sm1Extsync1 = 53U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexPwm1Sm1Extsync1 = 54U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFlexPwm1Sm1Extsync1 = 55U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexPwm1Sm1Extsync1 = 56U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFlexPwm1Sm1Extsync1 = 57U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexPwm1Sm1Extsync1 = 58U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFlexPwm1Sm1Extsync1 = 59U + (FlexPWM1_SM1_EXTSYNC1_REG << PMUX_SHIFT), + + /*!< FlexPWM1_SM2_EXTSYNC2 input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm1Sm2Extsync2 = 1U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm1Sm2Extsync2 = 2U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm1Sm2Extsync2 = 3U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm1Sm2Extsync2 = 4U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm1Sm2Extsync2 = 5U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm1Sm2Extsync2 = 6U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm1Sm2Extsync2 = 7U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm1Sm2Extsync2 = 9U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm1Sm2Extsync2 = 10U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm1Sm2Extsync2 = 11U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm1Sm2Extsync2 = 12U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm1Sm2Extsync2 = 13U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm1Sm2Extsync2 = 14U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm1Sm2Extsync2 = 15U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm1Sm2Extsync2 = 16U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm1Sm2Extsync2 = 17U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm1Sm2Extsync2 = 18U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm1Sm2Extsync2 = 19U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm1Sm2Extsync2 = 20U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm1Sm2Extsync2 = 21U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm1Sm2Extsync2 = 22U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm1Sm2Extsync2 = 23U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm1Sm2Extsync2 = 24U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm1Sm2Extsync2 = 25U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm1Sm2Extsync2 = 26U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm1Sm2Extsync2 = 27U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm1Sm2Extsync2 = 28U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm1Sm2Extsync2 = 29U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm1Sm2Extsync2 = 30U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm1Sm2Extsync2 = 31U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm1Sm2Extsync2 = 32U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm1Sm2Extsync2 = 33U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm1Sm2Extsync2 = 34U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm1Sm2Extsync2 = 35U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm1Sm2Extsync2 = 36U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm1Sm2Extsync2 = 37U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm1Sm2Extsync2 = 38U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm1Sm2Extsync2 = 39U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm1Sm2Extsync2 = 40U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm1Sm2Extsync2 = 45U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm1Sm2Extsync2 = 46U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm1Sm2Extsync2 = 47U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm1Sm2Extsync2 = 48U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm1Sm2Extsync2 = 49U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm1Sm2Extsync2 = 50U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm1Sm2Extsync2 = 51U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm1Sm2Extsync2 = 52U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm1Sm2Extsync2 = 53U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexPwm1Sm2Extsync2 = 54U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFlexPwm1Sm2Extsync2 = 55U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexPwm1Sm2Extsync2 = 56U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFlexPwm1Sm2Extsync2 = 57U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexPwm1Sm2Extsync2 = 58U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFlexPwm1Sm2Extsync2 = 59U + (FlexPWM1_SM2_EXTSYNC2_REG << PMUX_SHIFT), + + /*!< FlexPWM1_FAULT input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm1Fault = 1U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm1Fault = 2U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm1Fault = 3U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm1Fault = 4U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm1Fault = 5U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm1Fault = 6U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm1Fault = 7U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm1Fault = 9U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm1Fault = 10U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm1Fault = 11U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm1Fault = 12U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm1Fault = 13U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm1Fault = 14U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm1Fault = 15U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm1Fault = 16U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm1Fault = 17U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm1Fault = 18U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm1Fault = 19U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm1Fault = 20U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm1Fault = 21U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm1Fault = 22U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm1Fault = 23U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm1Fault = 24U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm1Fault = 25U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm1Fault = 26U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm1Fault = 27U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm1Fault = 28U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm1Fault = 29U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm1Fault = 30U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm1Fault = 31U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm1Fault = 32U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm1Fault = 33U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm1Fault = 34U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm1Fault = 35U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm1Fault = 36U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm1Fault = 37U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm1Fault = 38U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm1Fault = 39U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm1Fault = 40U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm1Fault = 45U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm1Fault = 46U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm1Fault = 47U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm1Fault = 48U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm1Fault = 49U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm1Fault = 50U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm1Fault = 51U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm1Fault = 52U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm1Fault = 53U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexPwm1Fault = 54U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFlexPwm1Fault = 55U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexPwm1Fault = 56U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFlexPwm1Fault = 57U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexPwm1Fault = 58U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFlexPwm1Fault = 59U + (FlexPWM1_FAULT_REG << PMUX_SHIFT), + + /*!< FlexPWM1_FORCE input trigger connections. */ + kINPUTMUX_ArmTxevToFlexPwm1Force = 1U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToFlexPwm1Force = 2U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexPwm1Force = 3U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexPwm1Force = 4U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexPwm1Force = 5U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexPwm1Force = 6U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexPwm1Force = 7U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexPwm1Force = 9U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToFlexPwm1Force = 10U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexPwm1Force = 11U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToFlexPwm1Force = 12U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexPwm1Force = 13U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToFlexPwm1Force = 14U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToFlexPwm1Force = 15U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToFlexPwm1Force = 16U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToFlexPwm1Force = 17U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToFlexPwm1Force = 18U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatch0ToFlexPwm1Force = 19U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexPwm1Force = 20U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexPwm1Force = 21U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexPwm1Force = 22U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexPwm1Force = 23U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexPwm1Force = 24U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexPwm1Force = 25U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexPwm1Force = 26U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexPwm1Force = 27U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToFlexPwm1Force = 28U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToFlexPwm1Force = 29U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToFlexPwm1Force = 30U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToFlexPwm1Force = 31U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexPwm1Force = 32U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToFlexPwm1Force = 33U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexPwm1Force = 34U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexPwm1Force = 35U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexPwm1Force = 36U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexPwm1Force = 37U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexPwm1Force = 38U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexPwm1Force = 39U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexPwm1Force = 40U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexPwm1Force = 45U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexPwm1Force = 46U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexPwm1Force = 47U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexPwm1Force = 48U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToFlexPwm1Force = 49U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToFlexPwm1Force = 50U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToFlexPwm1Force = 51U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToFlexPwm1Force = 52U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatch0ToFlexPwm1Force = 53U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexPwm1Force = 54U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToFlexPwm1Force = 55U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexPwm1Force = 56U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToFlexPwm1Force = 57U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexPwm1Force = 58U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToFlexPwm1Force = 59U + (FlexPWM1_FORCE_REG << PMUX_SHIFT), + + /*!< PWM0 external clock trigger. */ + kINPUTMUX_Clk16K1ToPwm0ExtClk = 1U + (PWM0_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_ClkInToPwm0ExtClk = 2U + (PWM0_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToPwm0ExtClk = 3U + (PWM0_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToPwm0ExtClk = 4U + (PWM0_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_ExttrigIn0ToPwm0ExtClk = 5U + (PWM0_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_ExttrigIn7ToPwm0ExtClk = 6U + (PWM0_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToPwm0ExtClk = 7U + (PWM0_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToPwm0ExtClk = 8U + (PWM0_EXT_CLK_REG << PMUX_SHIFT), + + /*!< PWM1 external clock trigger. */ + kINPUTMUX_Clk16K1ToPwm1ExtClk = 1U + (PWM1_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_ClkInToPwm1ExtClk = 2U + (PWM1_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out0ToPwm1ExtClk = 3U + (PWM1_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToPwm1ExtClk = 4U + (PWM1_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_ExttrigIn0ToPwm1ExtClk = 5U + (PWM1_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_ExttrigIn7ToPwm1ExtClk = 6U + (PWM1_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToPwm1ExtClk = 7U + (PWM1_EXT_CLK_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToPwm1ExtClk = 8U + (PWM1_EXT_CLK_REG << PMUX_SHIFT), + + /*!< AOI0 trigger input connections. */ + kINPUTMUX_Adc0Tcomp0ToAoi0Mux = 1U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToAoi0Mux = 2U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToAoi0Mux = 3U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToAoi0Mux = 4U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToAoi0Mux = 5U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToAoi0Mux = 6U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToAoi0Mux = 8U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToAoi0Mux = 9U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToAoi0Mux = 10U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToAoi0Mux = 11U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToAoi0Mux = 12U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToAoi0Mux = 13U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToAoi0Mux = 14U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToAoi0Mux = 15U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToAoi0Mux = 16U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToAoi0Mux = 17U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToAoi0Mux = 18U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToAoi0Mux = 19U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToAoi0Mux = 20U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToAoi0Mux = 22U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToAoi0Mux = 23U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToAoi0Mux = 24U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToAoi0Mux = 25U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatchToAoi0Mux = 26U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToAoi0Mux = 27U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToAoi0Mux = 28U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToAoi0Mux = 29U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToAoi0Mux = 30U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToAoi0Mux = 31U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToAoi0Mux = 32U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToAoi0Mux = 35U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToAoi0Mux = 36U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToAoi0Mux = 37U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToAoi0Mux = 38U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToAoi0Mux = 39U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToAoi0Mux = 40U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToAoi0Mux = 41U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToAoi0Mux = 42U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToAoi0Mux = 43U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToAoi0Mux = 44U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToAoi0Mux = 45U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToAoi0Mux = 46U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToAoi0Mux = 47U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToAoi0Mux = 48U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToAoi0Mux = 49U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToAoi0Mux = 50U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToAoi0Mux = 51U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToAoi0Mux = 52U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToAoi0Mux = 53U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToAoi0Mux = 54U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToAoi0Mux = 55U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M0ToAoi0Mux = 56U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToAoi0Mux = 57U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToAoi0Mux = 58U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToAoi0Mux = 59U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M0ToAoi0Mux = 60U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToAoi0Mux = 61U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToAoi0Mux = 62U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToAoi0Mux = 63U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToAoi0Mux = 64U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToAoi0Mux = 65U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToAoi0Mux = 66U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToAoi0Mux = 67U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToAoi0Mux = 68U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToAoi0Mux = 69U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToAoi0Mux = 70U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToAoi0Mux = 71U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatchToAoi0Mux = 72U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToAoi0Mux = 73U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToAoi0Mux = 74U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToAoi0Mux = 75U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToAoi0Mux = 76U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToAoi0Mux = 77U + (AOI0_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToAoi0Mux = 78U + (AOI0_MUX_REG << PMUX_SHIFT), + + /*!< AOI1 trigger input connections. */ + kINPUTMUX_Adc0Tcomp0ToAoi1Mux = 1U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToAoi1Mux = 2U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToAoi1Mux = 3U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToAoi1Mux = 4U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToAoi1Mux = 5U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToAoi1Mux = 6U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToAoi1Mux = 8U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToAoi1Mux = 9U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToAoi1Mux = 10U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToAoi1Mux = 11U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToAoi1Mux = 12U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToAoi1Mux = 13U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToAoi1Mux = 14U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToAoi1Mux = 15U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToAoi1Mux = 16U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToAoi1Mux = 17U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToAoi1Mux = 18U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToAoi1Mux = 19U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToAoi1Mux = 20U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag0ToAoi1Mux = 22U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag1ToAoi1Mux = 23U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag2ToAoi1Mux = 24U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0CmpFlag3ToAoi1Mux = 25U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc0PosMatchToAoi1Mux = 26U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToAoi1Mux = 27U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToAoi1Mux = 28U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToAoi1Mux = 29U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToAoi1Mux = 30U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToAoi1Mux = 31U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToAoi1Mux = 32U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToAoi1Mux = 35U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToAoi1Mux = 36U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToAoi1Mux = 37U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToAoi1Mux = 38U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToAoi1Mux = 39U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToAoi1Mux = 40U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToAoi1Mux = 41U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToAoi1Mux = 42U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToAoi1Mux = 43U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToAoi1Mux = 44U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToAoi1Mux = 45U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToAoi1Mux = 46U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToAoi1Mux = 47U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToAoi1Mux = 48U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToAoi1Mux = 49U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToAoi1Mux = 50U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToAoi1Mux = 51U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToAoi1Mux = 52U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToAoi1Mux = 53U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToAoi1Mux = 54U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToAoi1Mux = 55U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M0ToAoi1Mux = 56U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToAoi1Mux = 57U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToAoi1Mux = 58U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToAoi1Mux = 59U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M0ToAoi1Mux = 60U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToAoi1Mux = 61U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToAoi1Mux = 62U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToAoi1Mux = 63U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToAoi1Mux = 64U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToAoi1Mux = 65U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToAoi1Mux = 66U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToAoi1Mux = 67U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag0ToAoi1Mux = 68U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag1ToAoi1Mux = 69U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag2ToAoi1Mux = 70U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1CmpFlag3ToAoi1Mux = 71U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Qdc1PosMatchToAoi1Mux = 72U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToAoi1Mux = 73U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToAoi1Mux = 74U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToAoi1Mux = 75U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToAoi1Mux = 76U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToAoi1Mux = 77U + (AOI1_MUX_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToAoi1Mux = 78U + (AOI1_MUX_REG << PMUX_SHIFT), + + /*!< USB-FS trigger input connections. */ + kINPUTMUX_Lpuart0TrgTxdataToUsbfsTrigger = 1U + (USBFS_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart1TrgTxdataToUsbfsTrigger = 2U + (USBFS_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart2TrgTxdataToUsbfsTrigger = 3U + (USBFS_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart3TrgTxdataToUsbfsTrigger = 4U + (USBFS_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart4TrgTxdataToUsbfsTrigger = 5U + (USBFS_TRIG_REG << PMUX_SHIFT), + + /*!< EXT trigger connections. */ + kINPUTMUX_Aoi0Out0ToExtTrigger = 2U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToExtTrigger = 3U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToExtTrigger = 4U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToExtTrigger = 5U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToExtTrigger = 6U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToExtTrigger = 7U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart0ToExtTrigger = 9U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart1ToExtTrigger = 10U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart2ToExtTrigger = 11U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart3ToExtTrigger = 12U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart4ToExtTrigger = 13U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToExtTrigger = 14U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToExtTrigger = 15U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToExtTrigger = 16U + (EXT_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToExtTrigger = 17U + (EXT_TRIG0_REG << PMUX_SHIFT), + + /*!< LPI2C0 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpi2c0Trigger = 2U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpi2c0Trigger = 3U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpi2c0Trigger = 4U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpi2c0Trigger = 5U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpi2c0Trigger = 6U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpi2c0Trigger = 7U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToLpi2c0Trigger = 9U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToLpi2c0Trigger = 10U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToLpi2c0Trigger = 11U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToLpi2c0Trigger = 12U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToLpi2c0Trigger = 13U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToLpi2c0Trigger = 14U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpi2c0Trigger = 15U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpi2c0Trigger = 17U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpi2c0Trigger = 18U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpi2c0Trigger = 19U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpi2c0Trigger = 20U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpi2c0Trigger = 21U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpi2c0Trigger = 22U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpi2c0Trigger = 23U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpi2c0Trigger = 24U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpi2c0Trigger = 25U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpi2c0Trigger = 26U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpi2c0Trigger = 27U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpi2c0Trigger = 28U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpi2c0Trigger = 29U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpi2c0Trigger = 30U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpi2c0Trigger = 31U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpi2c0Trigger = 32U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpi2c0Trigger = 33U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpi2c0Trigger = 34U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpi2c0Trigger = 35U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpi2c0Trigger = 36U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpi2c0Trigger = 37U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpi2c0Trigger = 38U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpi2c0Trigger = 39U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpi2c0Trigger = 40U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpi2c0Trigger = 41U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpi2c0Trigger = 42U + (LPI2C0_TRIG_REG << PMUX_SHIFT), + + /*!< LPI2C1 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpi2c1Trigger = 2U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpi2c1Trigger = 3U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpi2c1Trigger = 4U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpi2c1Trigger = 5U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpi2c1Trigger = 6U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpi2c1Trigger = 7U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToLpi2c1Trigger = 9U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToLpi2c1Trigger = 10U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToLpi2c1Trigger = 11U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToLpi2c1Trigger = 12U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToLpi2c1Trigger = 13U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToLpi2c1Trigger = 14U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpi2c1Trigger = 15U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpi2c1Trigger = 17U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpi2c1Trigger = 18U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpi2c1Trigger = 19U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpi2c1Trigger = 20U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpi2c1Trigger = 21U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpi2c1Trigger = 22U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpi2c1Trigger = 23U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpi2c1Trigger = 24U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpi2c1Trigger = 25U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpi2c1Trigger = 26U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpi2c1Trigger = 27U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpi2c1Trigger = 28U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpi2c1Trigger = 29U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpi2c1Trigger = 30U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpi2c1Trigger = 31U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpi2c1Trigger = 32U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpi2c1Trigger = 33U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpi2c1Trigger = 34U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpi2c1Trigger = 35U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpi2c1Trigger = 36U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpi2c1Trigger = 37U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpi2c1Trigger = 38U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpi2c1Trigger = 39U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpi2c1Trigger = 40U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpi2c1Trigger = 41U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpi2c1Trigger = 42U + (LPI2C1_TRIG_REG << PMUX_SHIFT), + + /*!< LPI2C2 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpi2c2Trigger = 2U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpi2c2Trigger = 3U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpi2c2Trigger = 4U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpi2c2Trigger = 5U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpi2c2Trigger = 6U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpi2c2Trigger = 7U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToLpi2c2Trigger = 9U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToLpi2c2Trigger = 10U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToLpi2c2Trigger = 11U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToLpi2c2Trigger = 12U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToLpi2c2Trigger = 13U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToLpi2c2Trigger = 14U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpi2c2Trigger = 15U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpi2c2Trigger = 17U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpi2c2Trigger = 18U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpi2c2Trigger = 19U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpi2c2Trigger = 20U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpi2c2Trigger = 21U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpi2c2Trigger = 22U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpi2c2Trigger = 23U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpi2c2Trigger = 24U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpi2c2Trigger = 25U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpi2c2Trigger = 26U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpi2c2Trigger = 27U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpi2c2Trigger = 28U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpi2c2Trigger = 29U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpi2c2Trigger = 30U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpi2c2Trigger = 31U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpi2c2Trigger = 32U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpi2c2Trigger = 33U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpi2c2Trigger = 34U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpi2c2Trigger = 35U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpi2c2Trigger = 36U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpi2c2Trigger = 37U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpi2c2Trigger = 38U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpi2c2Trigger = 39U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpi2c2Trigger = 40U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpi2c2Trigger = 41U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpi2c2Trigger = 42U + (LPI2C2_TRIG_REG << PMUX_SHIFT), + + /*!< LPSPI0 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpspi0Trigger = 2U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpspi0Trigger = 3U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpspi0Trigger = 4U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpspi0Trigger = 5U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpspi0Trigger = 6U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpspi0Trigger = 7U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToLpspi0Trigger = 9U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToLpspi0Trigger = 10U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToLpspi0Trigger = 11U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToLpspi0Trigger = 12U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToLpspi0Trigger = 13U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToLpspi0Trigger = 14U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpspi0Trigger = 15U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpspi0Trigger = 17U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpspi0Trigger = 18U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpspi0Trigger = 19U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpspi0Trigger = 20U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpspi0Trigger = 21U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpspi0Trigger = 22U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpspi0Trigger = 23U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpspi0Trigger = 24U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpspi0Trigger = 25U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpspi0Trigger = 26U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpspi0Trigger = 27U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpspi0Trigger = 28U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpspi0Trigger = 29U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpspi0Trigger = 30U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpspi0Trigger = 31U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpspi0Trigger = 32U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpspi0Trigger = 33U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpspi0Trigger = 34U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpspi0Trigger = 35U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpspi0Trigger = 36U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpspi0Trigger = 37U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpspi0Trigger = 38U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpspi0Trigger = 39U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpspi0Trigger = 40U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpspi0Trigger = 41U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpspi0Trigger = 42U + (LPSPI0_TRIG_REG << PMUX_SHIFT), + + /*!< LPSPI1 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpspi1Trigger = 2U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpspi1Trigger = 3U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpspi1Trigger = 4U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpspi1Trigger = 5U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpspi1Trigger = 6U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpspi1Trigger = 7U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToLpspi1Trigger = 9U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToLpspi1Trigger = 10U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToLpspi1Trigger = 11U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToLpspi1Trigger = 12U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToLpspi1Trigger = 13U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToLpspi1Trigger = 14U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpspi1Trigger = 15U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpspi1Trigger = 17U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpspi1Trigger = 18U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpspi1Trigger = 19U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpspi1Trigger = 20U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpspi1Trigger = 21U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpspi1Trigger = 22U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpspi1Trigger = 23U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpspi1Trigger = 24U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpspi1Trigger = 25U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpspi1Trigger = 26U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpspi1Trigger = 27U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpspi1Trigger = 28U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpspi1Trigger = 29U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpspi1Trigger = 30U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpspi1Trigger = 31U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpspi1Trigger = 32U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpspi1Trigger = 33U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpspi1Trigger = 34U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpspi1Trigger = 35U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpspi1Trigger = 36U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpspi1Trigger = 37U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpspi1Trigger = 38U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpspi1Trigger = 39U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpspi1Trigger = 40U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpspi1Trigger = 41U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpspi1Trigger = 42U + (LPSPI1_TRIG_REG << PMUX_SHIFT), + + /*!< LPUART0 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpuart0Trigger = 2U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpuart0Trigger = 3U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpuart0Trigger = 4U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpuart0Trigger = 5U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpuart0Trigger = 6U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpuart0Trigger = 7U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToLpuart0Trigger = 9U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToLpuart0Trigger = 10U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToLpuart0Trigger = 11U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToLpuart0Trigger = 12U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToLpuart0Trigger = 13U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToLpuart0Trigger = 14U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpuart0Trigger = 15U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpuart0Trigger = 17U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpuart0Trigger = 18U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpuart0Trigger = 19U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpuart0Trigger = 20U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpuart0Trigger = 21U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpuart0Trigger = 22U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpuart0Trigger = 23U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpuart0Trigger = 24U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToLpuart0Trigger = 25U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToLpuart0Trigger = 26U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToLpuart0Trigger = 27U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToLpuart0Trigger = 28U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpuart0Trigger = 29U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpuart0Trigger = 30U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpuart0Trigger = 31U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpuart0Trigger = 32U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpuart0Trigger = 33U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpuart0Trigger = 34U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Usb0IppIndUartRxdUsbmuxToLpuart0Trigger = 35U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpuart0Trigger = 36U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpuart0Trigger = 37U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpuart0Trigger = 38U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpuart0Trigger = 39U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpuart0Trigger = 40U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpuart0Trigger = 41U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpuart0Trigger = 42U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpuart0Trigger = 43U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpuart0Trigger = 44U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpuart0Trigger = 45U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpuart0Trigger = 46U + (LPUART0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpuart0Trigger = 47U + (LPUART0_TRIG_REG << PMUX_SHIFT), + + /*!< LPUART1 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpuart1Trigger = 2U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpuart1Trigger = 3U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpuart1Trigger = 4U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpuart1Trigger = 5U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpuart1Trigger = 6U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpuart1Trigger = 7U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToLpuart1Trigger = 9U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToLpuart1Trigger = 10U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToLpuart1Trigger = 11U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToLpuart1Trigger = 12U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToLpuart1Trigger = 13U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToLpuart1Trigger = 14U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpuart1Trigger = 15U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpuart1Trigger = 17U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpuart1Trigger = 18U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpuart1Trigger = 19U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpuart1Trigger = 20U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpuart1Trigger = 21U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpuart1Trigger = 22U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpuart1Trigger = 23U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpuart1Trigger = 24U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToLpuart1Trigger = 25U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToLpuart1Trigger = 26U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToLpuart1Trigger = 27U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToLpuart1Trigger = 28U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpuart1Trigger = 29U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpuart1Trigger = 30U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpuart1Trigger = 31U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpuart1Trigger = 32U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpuart1Trigger = 33U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpuart1Trigger = 34U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Usb0IppIndUartRxdUsbmuxToLpuart1Trigger = 35U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpuart1Trigger = 36U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpuart1Trigger = 37U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpuart1Trigger = 38U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpuart1Trigger = 39U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpuart1Trigger = 40U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpuart1Trigger = 41U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpuart1Trigger = 42U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpuart1Trigger = 43U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpuart1Trigger = 44U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpuart1Trigger = 45U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpuart1Trigger = 46U + (LPUART1_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpuart1Trigger = 47U + (LPUART1_TRIG_REG << PMUX_SHIFT), + + /*!< LPUART2 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpuart2Trigger = 2U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpuart2Trigger = 3U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpuart2Trigger = 4U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpuart2Trigger = 5U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpuart2Trigger = 6U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpuart2Trigger = 7U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToLpuart2Trigger = 9U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToLpuart2Trigger = 10U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToLpuart2Trigger = 11U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToLpuart2Trigger = 12U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToLpuart2Trigger = 13U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToLpuart2Trigger = 14U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpuart2Trigger = 15U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpuart2Trigger = 17U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpuart2Trigger = 18U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpuart2Trigger = 19U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpuart2Trigger = 20U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpuart2Trigger = 21U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpuart2Trigger = 22U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpuart2Trigger = 23U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpuart2Trigger = 24U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToLpuart2Trigger = 25U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToLpuart2Trigger = 26U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToLpuart2Trigger = 27U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToLpuart2Trigger = 28U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpuart2Trigger = 29U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpuart2Trigger = 30U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpuart2Trigger = 31U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpuart2Trigger = 32U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpuart2Trigger = 33U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpuart2Trigger = 34U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Usb0IppIndUartRxdUsbmuxToLpuart2Trigger = 35U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpuart2Trigger = 36U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpuart2Trigger = 37U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpuart2Trigger = 38U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpuart2Trigger = 39U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpuart2Trigger = 40U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpuart2Trigger = 41U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpuart2Trigger = 42U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpuart2Trigger = 43U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpuart2Trigger = 44U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpuart2Trigger = 45U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpuart2Trigger = 46U + (LPUART2_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpuart2Trigger = 47U + (LPUART2_TRIG_REG << PMUX_SHIFT), + + /*!< LPUART3 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpuart3Trigger = 2U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpuart3Trigger = 3U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpuart3Trigger = 4U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpuart3Trigger = 5U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpuart3Trigger = 6U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpuart3Trigger = 7U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToLpuart3Trigger = 9U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToLpuart3Trigger = 10U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToLpuart3Trigger = 11U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToLpuart3Trigger = 12U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToLpuart3Trigger = 13U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToLpuart3Trigger = 14U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpuart3Trigger = 15U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpuart3Trigger = 17U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpuart3Trigger = 18U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpuart3Trigger = 19U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpuart3Trigger = 20U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpuart3Trigger = 21U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpuart3Trigger = 22U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpuart3Trigger = 23U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpuart3Trigger = 24U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToLpuart3Trigger = 25U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToLpuart3Trigger = 26U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToLpuart3Trigger = 27U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToLpuart3Trigger = 28U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpuart3Trigger = 29U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpuart3Trigger = 30U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpuart3Trigger = 31U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpuart3Trigger = 32U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpuart3Trigger = 33U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpuart3Trigger = 34U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Usb0IppIndUartRxdUsbmuxToLpuart3Trigger = 35U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpuart3Trigger = 36U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpuart3Trigger = 37U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpuart3Trigger = 38U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpuart3Trigger = 39U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpuart3Trigger = 40U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpuart3Trigger = 41U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpuart3Trigger = 42U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpuart3Trigger = 43U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpuart3Trigger = 44U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpuart3Trigger = 45U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpuart3Trigger = 46U + (LPUART3_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpuart3Trigger = 47U + (LPUART3_TRIG_REG << PMUX_SHIFT), + + /*!< LPUART4 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToLpuart4Trigger = 2U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToLpuart4Trigger = 3U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToLpuart4Trigger = 4U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToLpuart4Trigger = 5U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToLpuart4Trigger = 6U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToLpuart4Trigger = 7U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToLpuart4Trigger = 9U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M3ToLpuart4Trigger = 10U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToLpuart4Trigger = 11U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M3ToLpuart4Trigger = 12U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToLpuart4Trigger = 13U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M3ToLpuart4Trigger = 14U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToLpuart4Trigger = 15U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToLpuart4Trigger = 17U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToLpuart4Trigger = 18U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToLpuart4Trigger = 19U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToLpuart4Trigger = 20U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToLpuart4Trigger = 21U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToLpuart4Trigger = 22U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToLpuart4Trigger = 23U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToLpuart4Trigger = 24U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn8ToLpuart4Trigger = 25U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn9ToLpuart4Trigger = 26U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn10ToLpuart4Trigger = 27U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn11ToLpuart4Trigger = 28U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToLpuart4Trigger = 29U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToLpuart4Trigger = 30U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToLpuart4Trigger = 31U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToLpuart4Trigger = 32U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToLpuart4Trigger = 33U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToLpuart4Trigger = 34U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Usb0IppIndUartRxdUsbmuxToLpuart4Trigger = 35U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToLpuart4Trigger = 36U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToLpuart4Trigger = 37U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToLpuart4Trigger = 38U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToLpuart4Trigger = 39U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToLpuart4Trigger = 40U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToLpuart4Trigger = 41U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToLpuart4Trigger = 42U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToLpuart4Trigger = 43U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToLpuart4Trigger = 44U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToLpuart4Trigger = 45U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToLpuart4Trigger = 46U + (LPUART4_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToLpuart4Trigger = 47U + (LPUART4_TRIG_REG << PMUX_SHIFT), + +/*!< Flexio trigger0 input connections. */ + kINPUTMUX_Aoi0Out0ToFlexioTrigger = 1U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToFlexioTrigger = 2U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToFlexioTrigger = 3U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToFlexioTrigger = 4U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp0ToFlexioTrigger = 5U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp1ToFlexioTrigger = 6U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp2ToFlexioTrigger = 7U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc0Tcomp3ToFlexioTrigger = 8U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToFlexioTrigger = 9U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToFlexioTrigger = 10U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToFlexioTrigger = 12U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M2ToFlexioTrigger = 13U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToFlexioTrigger = 14U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M2ToFlexioTrigger = 15U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToFlexioTrigger = 16U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M2ToFlexioTrigger = 17U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToFlexioTrigger = 18U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToFlexioTrigger = 20U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToFlexioTrigger = 21U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToFlexioTrigger = 22U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn0ToFlexioTrigger = 24U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn1ToFlexioTrigger = 25U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn2ToFlexioTrigger = 26U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn3ToFlexioTrigger = 27U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn4ToFlexioTrigger = 28U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn5ToFlexioTrigger = 29U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn6ToFlexioTrigger = 30U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_TrigIn7ToFlexioTrigger = 31U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToFlexioTrigger = 32U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToFlexioTrigger = 33U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToFlexioTrigger = 34U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToFlexioTrigger = 35U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_WuuToFlexioTrigger = 36U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1A0Trig0ToFlexioTrigger = 37U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpi2c0MasterEndOfPacketToFlexioTrigger = 38U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpi2c0SlaveEndOfPacketToFlexioTrigger = 39U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpi2c1MasterEndOfPacketToFlexioTrigger = 40U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpi2c1SlaveEndOfPacketToFlexioTrigger = 41U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpspi0EndOfFrameToFlexioTrigger = 42U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpspi0ReceivedDataWordToFlexioTrigger = 43U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpspi1EndOfFrameToFlexioTrigger = 44U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpspi1ReceivedDataWordToFlexioTrigger = 45U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceivedDataWordToFlexioTrigger = 46U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart0TransmittedDataWordToFlexioTrigger = 47U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart0ReceiveLineIdleToFlexioTrigger = 48U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceivedDataWordToFlexioTrigger = 49U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart1TransmittedDataWordToFlexioTrigger = 50U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart1ReceiveLineIdleToFlexioTrigger = 51U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceivedDataWordToFlexioTrigger = 52U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart2TransmittedDataWordToFlexioTrigger = 53U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart2ReceiveLineIdleToFlexioTrigger = 54U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceivedDataWordToFlexioTrigger = 55U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart3TransmittedDataWordToFlexioTrigger = 56U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart3ReceiveLineIdleToFlexioTrigger = 57U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceivedDataWordToFlexioTrigger = 58U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart4TransmittedDataWordToFlexioTrigger = 59U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpuart4ReceiveLineIdleToFlexioTrigger = 60U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToFlexioTrigger = 61U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToFlexioTrigger = 62U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToFlexioTrigger = 63U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToFlexioTrigger = 64U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToFlexioTrigger = 65U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToFlexioTrigger = 66U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToFlexioTrigger = 67U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToFlexioTrigger = 68U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M2ToFlexioTrigger = 69U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M3ToFlexioTrigger = 70U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M2ToFlexioTrigger = 71U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M3ToFlexioTrigger = 72U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToFlexioTrigger = 73U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToFlexioTrigger = 74U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToFlexioTrigger = 75U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpi2c2MasterEndOfPacketToFlexioTrigger = 77U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpi2c2SlaveEndOfPacketToFlexioTrigger = 78U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpi2c3MasterEndOfPacketToFlexioTrigger = 79U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + kINPUTMUX_Lpi2c3SlaveEndOfPacketToFlexioTrigger = 80U + (FLEXIO_TRIG0_REG << PMUX_SHIFT), + +/*!< Opamp0 trigger input connections. */ + kINPUTMUX_Aoi0Out0ToOpamp0Trigger = 2U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out1ToOpamp0Trigger = 3U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out2ToOpamp0Trigger = 4U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi0Out3ToOpamp0Trigger = 5U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp0OutToOpamp0Trigger = 6U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Cmp1OutToOpamp0Trigger = 7U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M0ToOpamp0Trigger = 9U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer0M1ToOpamp0Trigger = 10U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M0ToOpamp0Trigger = 11U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer1M1ToOpamp0Trigger = 12U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M0ToOpamp0Trigger = 13U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer2M1ToOpamp0Trigger = 14U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Lptmr0ToOpamp0Trigger = 15U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig0ToOpamp0Trigger = 18U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm0OutTrig1ToOpamp0Trigger = 19U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig0ToOpamp0Trigger = 20U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm1OutTrig1ToOpamp0Trigger = 21U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig0ToOpamp0Trigger = 22U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm0Sm2OutTrig1ToOpamp0Trigger = 23U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio0PinEventTrig0ToOpamp0Trigger = 26U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio1PinEventTrig0ToOpamp0Trigger = 27U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio2PinEventTrig0ToOpamp0Trigger = 28U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio3PinEventTrig0ToOpamp0Trigger = 29U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Gpio4PinEventTrig0ToOpamp0Trigger = 30U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_WuuToOpamp0Trigger = 31U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out0ToOpamp0Trigger = 33U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out1ToOpamp0Trigger = 34U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out2ToOpamp0Trigger = 35U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Aoi1Out3ToOpamp0Trigger = 36U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp0ToOpamp0Trigger = 37U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp1ToOpamp0Trigger = 38U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp2ToOpamp0Trigger = 39U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Adc1Tcomp3ToOpamp0Trigger = 40U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M0ToOpamp0Trigger = 41U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer3M1ToOpamp0Trigger = 42U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M0ToOpamp0Trigger = 43U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Ctimer4M1ToOpamp0Trigger = 44U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh0ToOpamp0Trigger = 45U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh1ToOpamp0Trigger = 46U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh2ToOpamp0Trigger = 47U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_FlexioCh3ToOpamp0Trigger = 48U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig0ToOpamp0Trigger = 50U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm0OutTrig1ToOpamp0Trigger = 51U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig0ToOpamp0Trigger = 52U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm1OutTrig1ToOpamp0Trigger = 53U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig0ToOpamp0Trigger = 54U + (OPAMP0_TRIG_REG << PMUX_SHIFT), + kINPUTMUX_Pwm1Sm2OutTrig1ToOpamp0Trigger = 55U + (OPAMP0_TRIG_REG << PMUX_SHIFT), +} inputmux_connection_t; + +/*@}*/ + +/*@}*/ + +#endif /* _FSL_INPUTMUX_CONNECTIONS_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpadc.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpadc.c new file mode 100644 index 00000000000..c22741c4f58 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpadc.c @@ -0,0 +1,977 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_lpadc.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpadc" +#endif + +#ifndef ADC_VERID_DIFFEN_MASK +#define ADC_VERID_DIFFEN_MASK (0x2U) +#endif /* ADC_VERID_DIFFEN_MASK */ + +#ifndef ADC_VERID_NUM_SEC_MASK +#define ADC_VERID_NUM_SEC_MASK (0x800U) +#endif /* ADC_VERID_NUM_SEC_MASK */ + +#define ADC_CMDL_CHANNEL_MODE_MASK (0x60U) +#define ADC_CMDL_CHANNEL_MODE_SHIFT (5U) +#define ADC_CMDL_CHANNEL_MODE(x) \ + (((uint32_t)(((uint32_t)(x)) << ADC_CMDL_CHANNEL_MODE_SHIFT)) & ADC_CMDL_CHANNEL_MODE_MASK) + +#define GET_ADC_CFG_TPRICTRL_VALUE(val) (((uint32_t)val) & 0x3U) + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_TRES) && FSL_FEATURE_LPADC_HAS_CFG_TRES +#define GET_ADC_CFG_TRES_VALUE(val) ((((uint32_t)val) & 0x4U) >> 2U) +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_TRES) && FSL_FEATURE_LPADC_HAS_CFG_TRES */ + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) && FSL_FEATURE_LPADC_HAS_CFG_TCMDRES +#define GET_ADC_CFG_TCMDRES_VALUE(val) ((((uint32_t)val) & 0x8U) >> 3U) +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) && FSL_FEATURE_LPADC_HAS_CFG_TCMDRES */ + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI) && FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI +#define GET_ADC_CFG_HPT_EXDI_VALUE(val) ((((uint32_t)val) & 0x10U) >> 4U) +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI) && FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI */ + +#if defined(LPADC_RSTS) +#define LPADC_RESETS_ARRAY LPADC_RSTS +#elif defined(ADC_RSTS) +#define LPADC_RESETS_ARRAY ADC_RSTS +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Get instance number for LPADC module. + * + * @param base LPADC peripheral base address + */ +static uint32_t LPADC_GetInstance(ADC_Type *base); + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ +/*! + * @brief Get gain conversion result . + * + * @param gainAdjustment gain adjustment value. + */ +static uint32_t LPADC_GetGainConvResult(float gainAdjustment); +#endif /* defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ */ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to LPADC bases for each instance. */ +static ADC_Type *const s_lpadcBases[] = ADC_BASE_PTRS; +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to LPADC clocks for each instance. */ +static const clock_ip_name_t s_lpadcClocks[] = LPADC_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +#if defined(LPADC_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_lpadcResets[] = LPADC_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t LPADC_GetInstance(ADC_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + /* + * $Branch Coverage Justification$ + * (instance >= ARRAY_SIZE(s_lpadcBases)) not covered. The peripheral base + * address is always valid and checked by assert. + */ + for (instance = 0; instance < ARRAY_SIZE(s_lpadcBases); instance++) + { + /* + * $Branch Coverage Justification$ + * (s_lpadcBases[instance] != base) not covered. The peripheral base + * address is always valid and checked by assert. + */ + if (s_lpadcBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_lpadcBases)); + + return instance; +} + +#if (defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) +/*! + * brief Get gain conversion Result . + * + * param gainAdjustment gain adjustment value. + */ +static uint32_t LPADC_GetGainConvResult(float gainAdjustment) +{ + uint16_t i = 0U; + uint32_t tmp32 = 0U; + uint32_t GCRa[17] = {0}; + uint32_t GCALR = 0U; + + for (i = 0x11U; i > 0U; i--) + { + tmp32 = (uint32_t)((gainAdjustment) / ((float)(1.0 / (double)(1U << (0x10U - (i - 1U)))))); + GCRa[i - 1U] = tmp32; + gainAdjustment = gainAdjustment - ((float)tmp32) * ((float)(1.0 / (double)(1U << (0x10U - (i - 1U))))); + } + /* Get GCALR value calculated */ + for (i = 0x11U; i > 0U; i--) + { + GCALR += GCRa[i - 1U] * ((uint32_t)(1UL << (uint32_t)(i - 1UL))); + } + + /* to return GCALR value calculated */ + return GCALR; +} +#endif /* defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ */ + +/*! + * brief Initializes the LPADC module. + * + * param base LPADC peripheral base address. + * param config Pointer to configuration structure. See "lpadc_config_t". + */ +void LPADC_Init(ADC_Type *base, const lpadc_config_t *config) +{ + /* Check if the pointer is available. */ + assert(config != NULL); + + uint32_t tmp32 = 0U; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable the clock for LPADC instance. */ + (void)CLOCK_EnableClock(s_lpadcClocks[LPADC_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(LPADC_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_lpadcResets[LPADC_GetInstance(base)]); +#endif + + /* Reset the module. */ + LPADC_DoResetConfig(base); +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) + LPADC_DoResetFIFO0(base); + LPADC_DoResetFIFO1(base); +#else + LPADC_DoResetFIFO(base); +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ + + /* Disable the module before setting configuration. */ + LPADC_Enable(base, false); + + /* Configure the module generally. */ + if (config->enableInDozeMode) + { + base->CTRL &= ~ADC_CTRL_DOZEN_MASK; + } + else + { + base->CTRL |= ADC_CTRL_DOZEN_MASK; + } + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS + /* Set calibration average mode. */ + base->CTRL |= ADC_CTRL_CAL_AVGS(config->conversionAverageMode); +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS */ + +/* ADCx_CFG. */ +#if defined(FSL_FEATURE_LPADC_HAS_CFG_ADCKEN) && FSL_FEATURE_LPADC_HAS_CFG_ADCKEN + if (config->enableInternalClock) + { + tmp32 |= ADC_CFG_ADCKEN_MASK; + } +#endif /* FSL_FEATURE_LPADC_HAS_CFG_ADCKEN */ +#if defined(FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG) && FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG + if (config->enableVref1LowVoltage) + { + tmp32 |= ADC_CFG_VREF1RNG_MASK; + } +#endif /* FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG */ + if (config->enableAnalogPreliminary) + { + tmp32 |= ADC_CFG_PWREN_MASK; + } + tmp32 |= (ADC_CFG_PUDLY(config->powerUpDelay) /* Power up delay. */ + | ADC_CFG_REFSEL(config->referenceVoltageSource) /* Reference voltage. */ +#if defined(FSL_FEATURE_LPADC_HAS_CFG_PWRSEL) && (FSL_FEATURE_LPADC_HAS_CFG_PWRSEL == 1U) + | ADC_CFG_PWRSEL(config->powerLevelMode) /* Power configuration. */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_PWRSEL) && (FSL_FEATURE_LPADC_HAS_CFG_PWRSEL == 1U) */ + ); + + tmp32 |= ADC_CFG_TPRICTRL(GET_ADC_CFG_TPRICTRL_VALUE(config->triggerPriorityPolicy)); + +#if (defined(FSL_FEATURE_LPADC_HAS_CFG_TRES) && FSL_FEATURE_LPADC_HAS_CFG_TRES) + tmp32 |= ADC_CFG_TRES(GET_ADC_CFG_TRES_VALUE(config->triggerPriorityPolicy)); +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_TRES) && FSL_FEATURE_LPADC_HAS_CFG_TRES */ + +#if (defined(FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) && FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) + tmp32 |= ADC_CFG_TCMDRES(GET_ADC_CFG_TCMDRES_VALUE(config->triggerPriorityPolicy)); +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) && FSL_FEATURE_LPADC_HAS_CFG_TCMDRES */ + +#if (defined(FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI) && FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI) + tmp32 |= ADC_CFG_HPT_EXDI(GET_ADC_CFG_HPT_EXDI_VALUE(config->triggerPriorityPolicy)); +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI) && FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI */ + + base->CFG = tmp32; + + /* ADCx_PAUSE. */ + if (config->enableConvPause) + { + base->PAUSE = ADC_PAUSE_PAUSEEN_MASK | ADC_PAUSE_PAUSEDLY(config->convPauseDelay); + } + else + { + base->PAUSE = 0U; + } + +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) + /* ADCx_FCTRL0. */ + base->FCTRL[0] = ADC_FCTRL_FWMARK(config->FIFO0Watermark); + /* ADCx_FCTRL1. */ + base->FCTRL[1] = ADC_FCTRL_FWMARK(config->FIFO1Watermark); +#else + /* ADCx_FCTRL. */ + base->FCTRL = ADC_FCTRL_FWMARK(config->FIFOWatermark); +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ + + /* Enable the module after setting configuration. */ + LPADC_Enable(base, true); +} + +/*! + * brief Gets an available pre-defined settings for initial configuration. + * + * This function initializes the converter configuration structure with an available settings. The default values are: + * code + * config->enableInDozeMode = true; + * config->conversionAverageMode = kLPADC_ConversionAverage1; + * config->enableAnalogPreliminary = false; + * config->powerUpDelay = 0x80; + * config->referenceVoltageSource = kLPADC_ReferenceVoltageAlt1; + * config->powerLevelMode = kLPADC_PowerLevelAlt1; + * config->triggerPriorityPolicy = kLPADC_TriggerPriorityPreemptImmediately; + * config->enableConvPause = false; + * config->convPauseDelay = 0U; + * config->FIFO0Watermark = 0U; + * config->FIFO1Watermark = 0U; + * config->FIFOWatermark = 0U; + * endcode + * param config Pointer to configuration structure. + */ +void LPADC_GetDefaultConfig(lpadc_config_t *config) +{ + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_ADCKEN) && FSL_FEATURE_LPADC_HAS_CFG_ADCKEN + config->enableInternalClock = false; +#endif /* FSL_FEATURE_LPADC_HAS_CFG_ADCKEN */ +#if defined(FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG) && FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG + config->enableVref1LowVoltage = false; +#endif /* FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG */ + config->enableInDozeMode = true; +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS + /* Set calibration average mode. */ + config->conversionAverageMode = kLPADC_ConversionAverage1; +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS */ + config->enableAnalogPreliminary = false; + config->powerUpDelay = 0x80; + config->referenceVoltageSource = kLPADC_ReferenceVoltageAlt1; +#if defined(FSL_FEATURE_LPADC_HAS_CFG_PWRSEL) && (FSL_FEATURE_LPADC_HAS_CFG_PWRSEL == 1U) + config->powerLevelMode = kLPADC_PowerLevelAlt1; +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_PWRSEL) && (FSL_FEATURE_LPADC_HAS_CFG_PWRSEL == 1U) */ + config->triggerPriorityPolicy = kLPADC_TriggerPriorityPreemptImmediately; + config->enableConvPause = false; + config->convPauseDelay = 0U; +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) + config->FIFO0Watermark = 0U; + config->FIFO1Watermark = 0U; +#else + config->FIFOWatermark = 0U; +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ +} + +/*! + * brief De-initializes the LPADC module. + * + * param base LPADC peripheral base address. + */ +void LPADC_Deinit(ADC_Type *base) +{ + /* Disable the module. */ + LPADC_Enable(base, false); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Gate the clock. */ + (void)CLOCK_DisableClock(s_lpadcClocks[LPADC_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) +/*! + * brief Get the result in conversion FIFOn. + * + * param base LPADC peripheral base address. + * param result Pointer to structure variable that keeps the conversion result in conversion FIFOn. + * param index Result FIFO index. + * + * return Status whether FIFOn entry is valid. + */ +bool LPADC_GetConvResult(ADC_Type *base, lpadc_conv_result_t *result, uint8_t index) +{ + assert(result != NULL); /* Check if the input pointer is available. */ + + uint32_t tmp32 = 0U; + + tmp32 = base->RESFIFO[index]; + + if (ADC_RESFIFO_VALID_MASK != (tmp32 & ADC_RESFIFO_VALID_MASK)) + { + return false; /* FIFO is empty. Discard any read from RESFIFO. */ + } + + result->commandIdSource = (tmp32 & ADC_RESFIFO_CMDSRC_MASK) >> ADC_RESFIFO_CMDSRC_SHIFT; + result->loopCountIndex = (tmp32 & ADC_RESFIFO_LOOPCNT_MASK) >> ADC_RESFIFO_LOOPCNT_SHIFT; + result->triggerIdSource = (tmp32 & ADC_RESFIFO_TSRC_MASK) >> ADC_RESFIFO_TSRC_SHIFT; + result->convValue = (uint16_t)(tmp32 & ADC_RESFIFO_D_MASK); + + return true; +} +/*! + * brief Get the result in conversion FIFOn using blocking method. + * + * param base LPADC peripheral base address. + * param result Pointer to structure variable that keeps the conversion result in conversion FIFOn. + * param index Result FIFO index. + */ +void LPADC_GetConvResultBlocking(ADC_Type *base, lpadc_conv_result_t *result, uint8_t index) +{ + assert(result != NULL); /* Check if the input pointer is available. */ + + uint32_t tmp32 = 0U; + + tmp32 = base->RESFIFO[index]; + + while (ADC_RESFIFO_VALID_MASK != (tmp32 & ADC_RESFIFO_VALID_MASK)) + { + tmp32 = base->RESFIFO[index]; + } + + result->commandIdSource = (tmp32 & ADC_RESFIFO_CMDSRC_MASK) >> ADC_RESFIFO_CMDSRC_SHIFT; + result->loopCountIndex = (tmp32 & ADC_RESFIFO_LOOPCNT_MASK) >> ADC_RESFIFO_LOOPCNT_SHIFT; + result->triggerIdSource = (tmp32 & ADC_RESFIFO_TSRC_MASK) >> ADC_RESFIFO_TSRC_SHIFT; + result->convValue = (uint16_t)(tmp32 & ADC_RESFIFO_D_MASK); +} +#else +/*! + * brief Get the result in conversion FIFO. + * + * param base LPADC peripheral base address. + * param result Pointer to structure variable that keeps the conversion result in conversion FIFO. + * + * return Status whether FIFO entry is valid. + */ +bool LPADC_GetConvResult(ADC_Type *base, lpadc_conv_result_t *result) +{ + assert(result != NULL); /* Check if the input pointer is available. */ + + uint32_t tmp32 = 0U; + + tmp32 = base->RESFIFO; + + if (ADC_RESFIFO_VALID_MASK != (tmp32 & ADC_RESFIFO_VALID_MASK)) + { + return false; /* FIFO is empty. Discard any read from RESFIFO. */ + } + + result->commandIdSource = (tmp32 & ADC_RESFIFO_CMDSRC_MASK) >> ADC_RESFIFO_CMDSRC_SHIFT; + result->loopCountIndex = (tmp32 & ADC_RESFIFO_LOOPCNT_MASK) >> ADC_RESFIFO_LOOPCNT_SHIFT; + result->triggerIdSource = (tmp32 & ADC_RESFIFO_TSRC_MASK) >> ADC_RESFIFO_TSRC_SHIFT; + result->convValue = (uint16_t)(tmp32 & ADC_RESFIFO_D_MASK); + + return true; +} +/*! + * @brief Get the result in conversion FIFO using blocking method. + * + * @param base LPADC peripheral base address. + * @param result Pointer to structure variable that keeps the conversion result in conversion FIFO. + */ +void LPADC_GetConvResultBlocking(ADC_Type *base, lpadc_conv_result_t *result) +{ + assert(result != NULL); /* Check if the input pointer is available. */ + + uint32_t tmp32 = 0U; + + tmp32 = base->RESFIFO; + + while (ADC_RESFIFO_VALID_MASK != (tmp32 & ADC_RESFIFO_VALID_MASK)) + { + tmp32 = base->RESFIFO; + } + + result->commandIdSource = (tmp32 & ADC_RESFIFO_CMDSRC_MASK) >> ADC_RESFIFO_CMDSRC_SHIFT; + result->loopCountIndex = (tmp32 & ADC_RESFIFO_LOOPCNT_MASK) >> ADC_RESFIFO_LOOPCNT_SHIFT; + result->triggerIdSource = (tmp32 & ADC_RESFIFO_TSRC_MASK) >> ADC_RESFIFO_TSRC_SHIFT; + result->convValue = (uint16_t)(tmp32 & ADC_RESFIFO_D_MASK); +} +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ + +/*! + * brief Configure the conversion trigger source. + * + * Each programmable trigger can launch the conversion command in command buffer. + * + * param base LPADC peripheral base address. + * param triggerId ID for each trigger. Typically, the available value range is from 0 to 3. + * param config Pointer to configuration structure. See to #lpadc_conv_trigger_config_t. + */ +void LPADC_SetConvTriggerConfig(ADC_Type *base, uint32_t triggerId, const lpadc_conv_trigger_config_t *config) +{ + assert(triggerId < ADC_TCTRL_COUNT); /* Check if the triggerId is available in this device. */ + assert(config != NULL); /* Check if the input pointer is available. */ + + uint32_t tmp32; + + tmp32 = ADC_TCTRL_TCMD(config->targetCommandId) /* Trigger command select. */ + | ADC_TCTRL_TDLY(config->delayPower) /* Trigger delay select. */ + | ADC_TCTRL_TPRI(config->priority) /* Trigger priority setting. */ +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) + | ADC_TCTRL_FIFO_SEL_A(config->channelAFIFOSelect) +#if !(defined(FSL_FEATURE_LPADC_HAS_NO_TCTRL_FIFO_SEL_B) && FSL_FEATURE_LPADC_HAS_NO_TCTRL_FIFO_SEL_B) + | ADC_TCTRL_FIFO_SEL_B(config->channelBFIFOSelect) +#endif /* FSL_FEATURE_LPADC_HAS_NO_TCTRL_FIFO_SEL_B */ +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ + ; + if (config->enableHardwareTrigger) + { + tmp32 |= ADC_TCTRL_HTEN_MASK; + } + + base->TCTRL[triggerId] = tmp32; +} + +/*! + * brief Gets an available pre-defined settings for trigger's configuration. + * + * This function initializes the trigger's configuration structure with an available settings. The default values are: + * code + * config->targetCommandId = 0U; + * config->delayPower = 0U; + * config->priority = 0U; + * config->channelAFIFOSelect = 0U; + * config->channelBFIFOSelect = 0U; + * config->enableHardwareTrigger = false; + * endcode + * param config Pointer to configuration structure. + */ +void LPADC_GetDefaultConvTriggerConfig(lpadc_conv_trigger_config_t *config) +{ + assert(config != NULL); /* Check if the input pointer is available. */ + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + config->targetCommandId = 0U; + config->delayPower = 0U; + config->priority = 0U; +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) + config->channelAFIFOSelect = 0U; + config->channelBFIFOSelect = 0U; +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ + config->enableHardwareTrigger = false; +} + +/*! + * brief Configure conversion command. + * + * note The number of compare value register on different chips is different, that is mean in some chips, some + * command buffers do not have the compare functionality. + * + * param base LPADC peripheral base address. + * param commandId ID for command in command buffer. Typically, the available value range is 1 - 15. + * param config Pointer to configuration structure. See to #lpadc_conv_command_config_t. + */ +void LPADC_SetConvCommandConfig(ADC_Type *base, uint32_t commandId, const lpadc_conv_command_config_t *config) +{ + assert(commandId < (ADC_CMDL_COUNT + 1U)); /* Check if the commandId is available on this device. */ + assert(config != NULL); /* Check if the input pointer is available. */ + + uint32_t tmp32 = 0; + + commandId--; /* The available command number are 1-15, while the index of register group are 0-14. */ + + /* ADCx_CMDL. */ + tmp32 = ADC_CMDL_ADCH(config->channelNumber); /* Channel number. */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTB_ADCH) && FSL_FEATURE_LPADC_HAS_CMDL_ALTB_ADCH + tmp32 |= ADC_CMDL_ALTB_ADCH(config->channelBNumber); /* Alternate channel B number. */ +#endif +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_CSCALE) && FSL_FEATURE_LPADC_HAS_CMDL_CSCALE + tmp32 |= ADC_CMDL_CSCALE(config->sampleScaleMode); /* Full/Part scale input voltage. */ +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_CSCALE */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE) && FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE + tmp32 |= ADC_CMDL_ALTB_CSCALE(config->channelBScaleMode); /* Alternate channel B full/Part scale input voltage. */ +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE */ + +#if !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_DIFF) && FSL_FEATURE_LPADC_HAS_CMDL_DIFF + assert(((config->sampleChannelMode >= kLPADC_SampleChannelDiffBothSideAB) && + (((base->VERID) & ADC_VERID_DIFFEN_MASK) != 0U)) || + (config->sampleChannelMode < kLPADC_SampleChannelDiffBothSideAB)); +#endif /* defined(FSL_FEATURE_LPADC_HAS_CMDL_DIFF) && FSL_FEATURE_LPADC_HAS_CMDL_DIFF */ + +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_CTYPE) && FSL_FEATURE_LPADC_HAS_CMDL_CTYPE + assert(((config->sampleChannelMode == kLPADC_SampleChannelDiffBothSide) && + (((base->VERID) & ADC_VERID_DIFFEN_MASK) != 0U)) || + ((config->sampleChannelMode == kLPADC_SampleChannelDualSingleEndBothSide) && + (((base->VERID) & ADC_VERID_NUM_SEC_MASK) != 0U)) || + (config->sampleChannelMode < kLPADC_SampleChannelDualSingleEndBothSide)); +#endif /* defined(FSL_FEATURE_LPADC_HAS_CMDL_CTYPE) && FSL_FEATURE_LPADC_HAS_CMDL_CTYPE */ +#endif /* !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) */ + + tmp32 |= ADC_CMDL_CHANNEL_MODE(config->sampleChannelMode); + +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_MODE) && FSL_FEATURE_LPADC_HAS_CMDL_MODE + tmp32 |= ADC_CMDL_MODE(config->conversionResolutionMode); +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_MODE */ + +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN) && FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN + /* Enable alternate channel B.*/ + if (config->enableChannelB) + { + tmp32 |= ADC_CMDL_ALTBEN_MASK; + } +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN */ + + base->CMD[commandId].CMDL = tmp32; + + /* ADCx_CMDH. */ + tmp32 = ADC_CMDH_NEXT(config->chainedNextCommandNumber) /* Next Command Select. */ + | ADC_CMDH_LOOP(config->loopCount) /* Loop Count Select. */ + | ADC_CMDH_AVGS(config->hardwareAverageMode) /* Hardware Average Select. */ + | ADC_CMDH_STS(config->sampleTimeMode) /* Sample Time Select. */ + | ADC_CMDH_CMPEN(config->hardwareCompareMode); /* Hardware compare enable. */ +#if (defined(FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG) && FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG) + if (config->enableWaitTrigger) + { + tmp32 |= ADC_CMDH_WAIT_TRIG_MASK; /* Wait trigger enable. */ + } +#endif /* FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG */ + + if (config->enableAutoChannelIncrement) + { + tmp32 |= ADC_CMDH_LWI_MASK; + } + base->CMD[commandId].CMDH = tmp32; + + /* Hardware compare settings. + * Not all Command Buffers have an associated Compare Value register. The compare function is only available on + * Command Buffers that have a corresponding Compare Value register. Therefore, assertion judgment needs to be + * made before setting the CV register. + */ + + if ((kLPADC_HardwareCompareDisabled != config->hardwareCompareMode) && (commandId < ADC_CV_COUNT)) + { + /* Set CV register. */ + base->CV[commandId] = (ADC_CV_CVH(config->hardwareCompareValueHigh) /* Compare value high. */ + | ADC_CV_CVL(config->hardwareCompareValueLow)); /* Compare value low. */ + } +} + +/*! + * brief Gets an available pre-defined settings for conversion command's configuration. + * + * This function initializes the conversion command's configuration structure with an available settings. The default + * values are: + * code + * config->sampleScaleMode = kLPADC_SampleFullScale; + * config->channelBScaleMode = kLPADC_SampleFullScale; + * config->sampleChannelMode = kLPADC_SampleChannelSingleEndSideA; + * config->channelNumber = 0U; + * config->channelBNumber = 0U; + * config->chainedNextCommandNumber = 0U; + * config->enableAutoChannelIncrement = false; + * config->loopCount = 0U; + * config->hardwareAverageMode = kLPADC_HardwareAverageCount1; + * config->sampleTimeMode = kLPADC_SampleTimeADCK3; + * config->hardwareCompareMode = kLPADC_HardwareCompareDisabled; + * config->hardwareCompareValueHigh = 0U; + * config->hardwareCompareValueLow = 0U; + * config->conversionResolutionMode = kLPADC_ConversionResolutionStandard; + * config->enableWaitTrigger = false; + * config->enableChannelB = false; + * endcode + * param config Pointer to configuration structure. + */ +void LPADC_GetDefaultConvCommandConfig(lpadc_conv_command_config_t *config) +{ + assert(config != NULL); /* Check if the input pointer is available. */ + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_CSCALE) && FSL_FEATURE_LPADC_HAS_CMDL_CSCALE + config->sampleScaleMode = kLPADC_SampleFullScale; +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_CSCALE */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE) && FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE + config->channelBScaleMode = kLPADC_SampleFullScale; +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE */ + config->sampleChannelMode = kLPADC_SampleChannelSingleEndSideA; + config->channelNumber = 0U; +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTB_ADCH) && FSL_FEATURE_LPADC_HAS_CMDL_ALTB_ADCH + config->channelBNumber = 0U; +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE */ + config->chainedNextCommandNumber = 0U; /* No next command defined. */ + config->enableAutoChannelIncrement = false; + config->loopCount = 0U; + config->hardwareAverageMode = kLPADC_HardwareAverageCount1; + config->sampleTimeMode = kLPADC_SampleTimeADCK3; + config->hardwareCompareMode = kLPADC_HardwareCompareDisabled; + config->hardwareCompareValueHigh = 0U; /* No used. */ + config->hardwareCompareValueLow = 0U; /* No used. */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_MODE) && FSL_FEATURE_LPADC_HAS_CMDL_MODE + config->conversionResolutionMode = kLPADC_ConversionResolutionStandard; +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_MODE */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG) && FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG + config->enableWaitTrigger = false; +#endif /* FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN) && FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN + config->enableChannelB = false; /* Enable alternate channel B.*/ +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN */ +} + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_CALOFS) && FSL_FEATURE_LPADC_HAS_CFG_CALOFS +/*! + * brief Enable the calibration function. + * + * When CALOFS is set, the ADC is configured to perform a calibration function anytime the ADC executes + * a conversion. Any channel selected is ignored and the value returned in the RESFIFO is a signed value + * between -31 and 31. -32 is not a valid and is never a returned value. Software should copy the lower 6- + * bits of the conversion result stored in the RESFIFO after a completed calibration conversion to the + * OFSTRIM field. The OFSTRIM field is used in normal operation for offset correction. + * + * param base LPADC peripheral base address. + * param enable switcher to the calibration function. + */ +void LPADC_EnableCalibration(ADC_Type *base, bool enable) +{ + LPADC_Enable(base, false); + if (enable) + { + base->CFG |= ADC_CFG_CALOFS_MASK; + } + else + { + base->CFG &= ~ADC_CFG_CALOFS_MASK; + } + LPADC_Enable(base, true); +} + +#if defined(FSL_FEATURE_LPADC_HAS_OFSTRIM) && FSL_FEATURE_LPADC_HAS_OFSTRIM +/*! + * brief Do auto calibration. + * + * Calibration function should be executed before using converter in application. It used the software trigger and a + * dummy conversion, get the offset and write them into the OFSTRIM register. It called some of functional API + * including: -LPADC_EnableCalibration(...) -LPADC_LPADC_SetOffsetValue(...) -LPADC_SetConvCommandConfig(...) + * -LPADC_SetConvTriggerConfig(...) + * + * param base LPADC peripheral base address. + */ +void LPADC_DoAutoCalibration(ADC_Type *base) +{ + assert(0u == LPADC_GetConvResultCount(base)); + + uint32_t mLpadcCMDL; + uint32_t mLpadcCMDH; + uint32_t mLpadcTrigger; + lpadc_conv_trigger_config_t mLpadcTriggerConfigStruct; + lpadc_conv_command_config_t mLpadcCommandConfigStruct; + lpadc_conv_result_t mLpadcResultConfigStruct; + + /* Enable the calibration function. */ + LPADC_EnableCalibration(base, true); + + /* Keep the CMD and TRG state here and restore it later if the calibration completes.*/ + mLpadcCMDL = base->CMD[0].CMDL; /* CMD1L. */ + mLpadcCMDH = base->CMD[0].CMDH; /* CMD1H. */ + mLpadcTrigger = base->TCTRL[0]; /* Trigger0. */ + + /* Set trigger0 configuration - for software trigger. */ + LPADC_GetDefaultConvTriggerConfig(&mLpadcTriggerConfigStruct); + mLpadcTriggerConfigStruct.targetCommandId = 1U; /* CMD1 is executed. */ + LPADC_SetConvTriggerConfig(base, 0U, &mLpadcTriggerConfigStruct); /* Configurate the trigger0. */ + + /* Set conversion CMD configuration. */ + LPADC_GetDefaultConvCommandConfig(&mLpadcCommandConfigStruct); + mLpadcCommandConfigStruct.hardwareAverageMode = kLPADC_HardwareAverageCount128; + LPADC_SetConvCommandConfig(base, 1U, &mLpadcCommandConfigStruct); /* Set CMD1 configuration. */ + + /* Do calibration. */ + LPADC_DoSoftwareTrigger(base, 1U); /* 1U is trigger0 mask. */ + while (!LPADC_GetConvResult(base, &mLpadcResultConfigStruct)) + { + } + /* The valid bits of data are bits 14:3 in the RESFIFO register. */ + LPADC_SetOffsetValue(base, (uint32_t)(mLpadcResultConfigStruct.convValue) >> 3UL); + /* Disable the calibration function. */ + LPADC_EnableCalibration(base, false); + + /* restore CMD and TRG registers. */ + base->CMD[0].CMDL = mLpadcCMDL; /* CMD1L. */ + base->CMD[0].CMDH = mLpadcCMDH; /* CMD1H. */ + base->TCTRL[0] = mLpadcTrigger; /* Trigger0. */ +} +#endif /* FSL_FEATURE_LPADC_HAS_OFSTRIM */ +#endif /* FSL_FEATURE_LPADC_HAS_CFG_CALOFS */ + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFS) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFS +/*! + * brief Do offset calibration. + * + * param base LPADC peripheral base address. + */ +void LPADC_DoOffsetCalibration(ADC_Type *base) +{ + LPADC_EnableOffsetCalibration(base, true); + while (ADC_STAT_CAL_RDY_MASK != (base->STAT & ADC_STAT_CAL_RDY_MASK)) + { + } +} + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ +/*! + * brief Do auto calibration. + * + * param base LPADC peripheral base address. + */ +void LPADC_DoAutoCalibration(ADC_Type *base) +{ + LPADC_PrepareAutoCalibration(base); + LPADC_FinishAutoCalibration(base); +} + +/*! + * brief Prepare auto calibration, LPADC_FinishAutoCalibration has to be called before using the LPADC. + * LPADC_DoAutoCalibration has been split in two API to avoid to be stuck too long in the function. + * + * param base LPADC peripheral base address. + */ +void LPADC_PrepareAutoCalibration(ADC_Type *base) +{ +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) + assert((0U == LPADC_GetConvResultCount(base, 0)) && (0U == LPADC_GetConvResultCount(base, 1))); +#else /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 1)) */ + assert(LPADC_GetConvResultCount(base) == 0U); +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) */ + + /* Request gain calibration. */ + base->CTRL |= ADC_CTRL_CAL_REQ_MASK; +} + +/*! + * brief Finish auto calibration start with LPADC_PrepareAutoCalibration. + * + * param base LPADC peripheral base address. + */ +void LPADC_FinishAutoCalibration(ADC_Type *base) +{ +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE + int32_t GCCa; + int32_t GCCb; + float GCRa; + float GCRb; +#else + uint32_t GCCa; + float GCRa; +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + uint32_t GCCb; + float GCRb; +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE */ + + while ((ADC_GCC_RDY_MASK != (base->GCC[0] & ADC_GCC_RDY_MASK)) +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + || (ADC_GCC_RDY_MASK != (base->GCC[1] & ADC_GCC_RDY_MASK)) +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ + ) + { + } + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE + GCCa = (int32_t)(base->GCC[0] & ADC_GCC_GAIN_CAL_MASK); + GCCb = (int32_t)(base->GCC[1] & ADC_GCC_GAIN_CAL_MASK); + if (0U != ((base->GCC[0]) & 0x8000U)) + { + GCCa = GCCa - 0x10000; + GCRa = (float)((131072.0) / + (131072.0 - (double)GCCa)); /* Gain_CalA = (131072.0 / (131072-(ADC_GCC_GAIN_CAL(ADC->GCC[0]))*/ + base->GCR[0] = LPADC_GetGainConvResult(GCRa); /* write A side GCALR. */ + } + + if (0U != ((base->GCC[1]) & 0x8000U)) + { + GCCb = GCCb - 0x10000; + GCRb = (float)((131072.0) / + (131072.0 - (double)GCCb)); /* Gain_CalB = (131072.0 / (131072-(ADC_GCC_GAIN_CAL(ADC->GCC[1]))*/ + base->GCR[1] = LPADC_GetGainConvResult(GCRb); /* write B side GCALR. */ + } +#else + /* Calculate gain offset. */ + GCCa = (base->GCC[0] & ADC_GCC_GAIN_CAL_MASK); + GCRa = (float)((131072.0) / + (131072.0 - (double)GCCa)); /* Gain_CalA = (131072.0 / (131072-(ADC_GCC_GAIN_CAL(ADC->GCC[0]))*/ + base->GCR[0] = LPADC_GetGainConvResult(GCRa); /* write A side GCALR. */ + +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + GCCb = (base->GCC[1] & ADC_GCC_GAIN_CAL_MASK); + GCRb = (float)((131072.0) / + (131072.0 - (double)GCCb)); /* Gain_CalB = (131072.0 / (131072-(ADC_GCC_GAIN_CAL(ADC->GCC[1]))*/ + base->GCR[1] = LPADC_GetGainConvResult(GCRb); /* write B side GCALR. */ +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE */ + /* Indicate the values are valid. */ + base->GCR[0] |= ADC_GCR_RDY_MASK; +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + base->GCR[1] |= ADC_GCR_RDY_MASK; +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ + + while (ADC_STAT_CAL_RDY_MASK != (base->STAT & ADC_STAT_CAL_RDY_MASK)) + { + } +} +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ */ + +/*! + * brief Get calibration value into the memory which is defined by invoker. + * + * note Please note the ADC will be disabled temporary. + * note This function should be used after finish calibration. + * + * param base LPADC peripheral base address. + * param ptrCalibrationValue Pointer to lpadc_calibration_value_t structure, this memory block should be always powered + * on even in low power modes. + */ +void LPADC_GetCalibrationValue(ADC_Type *base, lpadc_calibration_value_t *ptrCalibrationValue) +{ + assert(ptrCalibrationValue != NULL); + + bool adcEnabled = false; + + /* Check if ADC is enabled. */ + if ((base->CTRL & ADC_CTRL_ADCEN_MASK) != 0UL) + { + LPADC_Enable(base, false); + adcEnabled = true; + } + +#if (defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) + uint32_t i; + for (i = 0UL; i < 33UL; i++) + { +#if defined(ADC_CAL_GAR0_CAL_GAR_VAL_MASK) + ptrCalibrationValue->generalCalibrationValueA[i] = + (uint16_t)((*(((volatile uint32_t *)(&(base->CAL_GAR0))) + i)) & 0xFFFFU); +#if !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) + ptrCalibrationValue->generalCalibrationValueB[i] = + (uint16_t)((*(((volatile uint32_t *)(&(base->CAL_GBR0))) + i)) & 0xFFFFU); +#endif /* (defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) */ +#else + ptrCalibrationValue->generalCalibrationValueA[i] = + (uint16_t)((*(((volatile uint32_t *)(&(base->CAL_GAR[0]))) + i)) & 0xFFFFU); +#if !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) + ptrCalibrationValue->generalCalibrationValueB[i] = + (uint16_t)((*(((volatile uint32_t *)(&(base->CAL_GBR[0]))) + i)) & 0xFFFFU); +#endif /* (defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) */ + +#endif /* defined(ADC_CAL_GAR0_CAL_GAR_VAL_MASK) */ + } +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ */ + + ptrCalibrationValue->gainCalibrationResultA = (uint16_t)(base->GCR[0] & ADC_GCR_GCALR_MASK); +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + ptrCalibrationValue->gainCalibrationResultB = (uint16_t)(base->GCR[1] & ADC_GCR_GCALR_MASK); +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ + + if (adcEnabled) + { + LPADC_Enable(base, true); + } +} + +/*! + * brief Set calibration value into ADC calibration registers. + * + * note Please note the ADC will be disabled temporary. + * + * param base LPADC peripheral base address. + * param ptrCalibrationValue Pointer to lpadc_calibration_value_t structure which contains ADC's calibration value. + */ +void LPADC_SetCalibrationValue(ADC_Type *base, const lpadc_calibration_value_t *ptrCalibrationValue) +{ + assert(ptrCalibrationValue != NULL); + + bool adcEnabled = false; + + /* Check if ADC is enabled. */ + if ((base->CTRL & ADC_CTRL_ADCEN_MASK) != 0UL) + { + LPADC_Enable(base, false); + adcEnabled = true; + } + +#if (defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) + for (uint32_t i = 0UL; i < 33UL; i++) + { +#if defined(ADC_CAL_GAR0_CAL_GAR_VAL_MASK) + *(((volatile uint32_t *)(&(base->CAL_GAR0))) + i) = ptrCalibrationValue->generalCalibrationValueA[i]; +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + *(((volatile uint32_t *)(&(base->CAL_GBR0))) + i) = ptrCalibrationValue->generalCalibrationValueB[i]; +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ +#else + *(((volatile uint32_t *)(&(base->CAL_GAR[0]))) + i) = ptrCalibrationValue->generalCalibrationValueA[i]; +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + *(((volatile uint32_t *)(&(base->CAL_GBR[0]))) + i) = ptrCalibrationValue->generalCalibrationValueB[i]; +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ +#endif /* defined(ADC_CAL_GAR0_CAL_GAR_VAL_MASK) */ + } +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ */ + + base->GCR[0] = ADC_GCR_GCALR(ptrCalibrationValue->gainCalibrationResultA) | ADC_GCR_RDY_MASK; +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + base->GCR[1] = ADC_GCR_GCALR(ptrCalibrationValue->gainCalibrationResultB) | ADC_GCR_RDY_MASK; +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ + /* + * $Branch Coverage Justification$ + * while ((base->STAT & ADC_STAT_CAL_RDY_MASK) == ADC_STAT_CAL_RDY_MASK) not covered. Test unfeasible, + * the calibration ready state is too short not to catch. + */ + while (ADC_STAT_CAL_RDY_MASK != (base->STAT & ADC_STAT_CAL_RDY_MASK)) + { + } + + if (adcEnabled) + { + LPADC_Enable(base, true); + } +} + +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CALOFS */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpadc.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpadc.h new file mode 100644 index 00000000000..e0d2f4b6ee4 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpadc.h @@ -0,0 +1,1529 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_LPADC_H_ +#define FSL_LPADC_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lpadc + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief LPADC driver version 2.8.4. */ +#define FSL_LPADC_DRIVER_VERSION (MAKE_VERSION(2, 8, 4)) +/*! @} */ + +#if (defined(FSL_FEATURE_LPADC_OFSTRIM_COUNT) && (FSL_FEATURE_LPADC_OFSTRIM_COUNT == 1)) +#define ADC_OFSTRIM_OFSTRIM_MAX (ADC_OFSTRIM_OFSTRIM_MASK >> ADC_OFSTRIM_OFSTRIM_SHIFT) +#define ADC_OFSTRIM_OFSTRIM_SIGN ((ADC_OFSTRIM_OFSTRIM_MAX + 1U) >> 1U) + +#elif (defined(FSL_FEATURE_LPADC_OFSTRIM_COUNT) && (FSL_FEATURE_LPADC_OFSTRIM_COUNT == 2)) +#define ADC_OFSTRIM_OFSTRIM_A_MAX (ADC_OFSTRIM_OFSTRIM_A_MASK >> ADC_OFSTRIM_OFSTRIM_A_SHIFT) +#define ADC_OFSTRIM_OFSTRIM_B_MAX (ADC_OFSTRIM_OFSTRIM_B_MASK >> ADC_OFSTRIM_OFSTRIM_B_SHIFT) +#define ADC_OFSTRIM_OFSTRIM_A_SIGN ((ADC_OFSTRIM_OFSTRIM_A_MAX + 1U) >> 1U) +#define ADC_OFSTRIM_OFSTRIM_B_SIGN ((ADC_OFSTRIM_OFSTRIM_B_MAX + 1U) >> 1U) +#endif /* defined(FSL_FEATURE_LPADC_OFSTRIM_COUNT) */ + +/*! + * @brief Define the MACRO function to get command status from status value. + * + * The statusVal is the return value from LPADC_GetStatusFlags(). + */ +#define LPADC_GET_ACTIVE_COMMAND_STATUS(statusVal) ((statusVal & ADC_STAT_CMDACT_MASK) >> ADC_STAT_CMDACT_SHIFT) + +/*! + * @brief Define the MACRO function to get trigger status from status value. + * + * The statusVal is the return value from LPADC_GetStatusFlags(). + */ +#define LPADC_GET_ACTIVE_TRIGGER_STATUE(statusVal) ((statusVal & ADC_STAT_TRGACT_MASK) >> ADC_STAT_TRGACT_SHIFT) + +/* Map macros to the unified name. */ +#if !defined(ADC_STAT_FOF0_MASK) +#ifdef ADC_STAT_FOF_MASK +#define ADC_STAT_FOF0_MASK ADC_STAT_FOF_MASK +#else +#error "ADC_STAT_FOF0_MASK not defined" +#endif /* ifdef(ADC_STAT_FOF_MASK) */ +#endif /* !defined(ADC_STAT_FOF0_MASK) */ + +#if !defined(ADC_STAT_RDY0_MASK) +#ifdef ADC_STAT_RDY_MASK +#define ADC_STAT_RDY0_MASK ADC_STAT_RDY_MASK +#else +#error "ADC_STAT_RDY0_MASK not defined" +#endif /* ifdef ADC_STAT_RDY_MASK */ +#endif /* !defined(ADC_STAT_RDY0_MASK) */ + +#if !defined(ADC_IE_FOFIE0_MASK) +#ifdef ADC_IE_FOFIE_MASK +#define ADC_IE_FOFIE0_MASK ADC_IE_FOFIE_MASK +#else +#error "ADC_IE_FOFIE0_MASK not defined" +#endif /* ifdef ADC_IE_FOFIE_MASK */ +#endif /* !defined(ADC_IE_FOFIE0_MASK) */ + +#if !defined(ADC_IE_FWMIE0_MASK) +#ifdef ADC_IE_FWMIE_MASK +#define ADC_IE_FWMIE0_MASK ADC_IE_FWMIE_MASK +#else +#error "ADC_IE_FWMIE0_MASK not defined" +#endif /* ifdef ADC_IE_FWMIE_MASK */ +#endif /* !defined(ADC_IE_FWMIE0_MASK) */ + +/*! + * @brief Define hardware flags of the module. + */ +enum _lpadc_status_flags +{ + kLPADC_ResultFIFO0OverflowFlag = ADC_STAT_FOF0_MASK, /*!< Indicates that more data has been written to the Result + FIFO 0 than it can hold. */ + kLPADC_ResultFIFO0ReadyFlag = ADC_STAT_RDY0_MASK, /*!< Indicates when the number of valid datawords in the result + FIFO 0 is greater than the setting watermark level. */ + +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + kLPADC_ResultFIFO1OverflowFlag = ADC_STAT_FOF1_MASK, /*!< Indicates that more data has been written to the Result + FIFO 1 than it can hold. */ + kLPADC_ResultFIFO1ReadyFlag = ADC_STAT_RDY1_MASK, /*!< Indicates when the number of valid datawords in the result + FIFO 1 is greater than the setting watermark level. */ +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ + +#if (defined(FSL_FEATURE_LPADC_HAS_STAT_TEXC_INT) && (FSL_FEATURE_LPADC_HAS_STAT_TEXC_INT == 1U)) + kLPADC_TriggerExceptionFlag = ADC_STAT_TEXC_INT_MASK, /*!< Indicates that a trigger exception event has occurred. */ +#endif /* (defined(FSL_FEATURE_LPADC_HAS_STAT_TEXC_INT) && (FSL_FEATURE_LPADC_HAS_STAT_TEXC_INT == 1U)) */ + +#if (defined(FSL_FEATURE_LPADC_HAS_STAT_TCOMP_INT) && (FSL_FEATURE_LPADC_HAS_STAT_TCOMP_INT == 1U)) + kLPADC_TriggerCompletionFlag = ADC_STAT_TCOMP_INT_MASK, /*!< Indicates that a trigger completion event has occurred. + */ +#endif /* (defined(FSL_FEATURE_LPADC_HAS_STAT_TCOMP_INT) && (FSL_FEATURE_LPADC_HAS_STAT_TCOMP_INT == 1U)) */ + +#if (defined(FSL_FEATURE_LPADC_HAS_STAT_CAL_RDY) && (FSL_FEATURE_LPADC_HAS_STAT_CAL_RDY == 1U)) + kLPADC_CalibrationReadyFlag = ADC_STAT_CAL_RDY_MASK, /*!< Indicates that the calibration process is done. */ +#endif /* (defined(FSL_FEATURE_LPADC_HAS_STAT_CAL_RDY) && (FSL_FEATURE_LPADC_HAS_STAT_CAL_RDY == 1U)) */ + +#if (defined(FSL_FEATURE_LPADC_HAS_STAT_ADC_ACTIVE) && (FSL_FEATURE_LPADC_HAS_STAT_ADC_ACTIVE == 1U)) + kLPADC_ActiveFlag = ADC_STAT_ADC_ACTIVE_MASK, /*!< Indicates that the ADC is in active state. */ +#endif /* (defined(FSL_FEATURE_LPADC_HAS_STAT_ADC_ACTIVE) && (FSL_FEATURE_LPADC_HAS_STAT_ADC_ACTIVE == 1U)) */ + + kLPADC_ResultFIFOOverflowFlag = kLPADC_ResultFIFO0OverflowFlag, /*!< To compilitable with old version, do not + recommend using this, please use @ref + kLPADC_ResultFIFO0OverflowFlag as instead. */ + + kLPADC_ResultFIFOReadyFlag = kLPADC_ResultFIFO0ReadyFlag, /*!< To compilitable with old version, do not + recommend using this, please use @ref + kLPADC_ResultFIFO0ReadyFlag as instead. */ +}; + +/*! + * @brief Define interrupt switchers of the module. + * + * Note: LPADC of different chips supports different number of trigger sources, + * please check the Reference Manual for details. + */ +enum _lpadc_interrupt_enable +{ + kLPADC_ResultFIFO0OverflowInterruptEnable = ADC_IE_FOFIE0_MASK, /*!< Configures ADC to generate overflow interrupt + requests when FOF0 flag is asserted. */ + kLPADC_FIFO0WatermarkInterruptEnable = ADC_IE_FWMIE0_MASK, /*!< Configures ADC to generate watermark interrupt + requests when RDY0 flag is asserted. */ + kLPADC_ResultFIFOOverflowInterruptEnable = kLPADC_ResultFIFO0OverflowInterruptEnable, /*!< To compilitable with old + version, do not recommend using this, + please use + #kLPADC_ResultFIFO0OverflowInterruptEnable + as instead. */ + kLPADC_FIFOWatermarkInterruptEnable = kLPADC_FIFO0WatermarkInterruptEnable, /*!< To compilitable with old version, + do not recommend using this, please + use + #kLPADC_FIFO0WatermarkInterruptEnable + as instead. */ + +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) + kLPADC_ResultFIFO1OverflowInterruptEnable = ADC_IE_FOFIE1_MASK, /*!< Configures ADC to generate overflow interrupt + requests when FOF1 flag is asserted. */ + kLPADC_FIFO1WatermarkInterruptEnable = ADC_IE_FWMIE1_MASK, /*!< Configures ADC to generate watermark interrupt + requests when RDY1 flag is asserted. */ +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U)) */ + +#if (defined(FSL_FEATURE_LPADC_HAS_IE_TEXC_IE) && (FSL_FEATURE_LPADC_HAS_IE_TEXC_IE == 1U)) + kLPADC_TriggerExceptionInterruptEnable = ADC_IE_TEXC_IE_MASK, /*!< Configures ADC to generate trigger exception + interrupt. */ +#endif /* (defined(FSL_FEATURE_LPADC_HAS_IE_TEXC_IE) && (FSL_FEATURE_LPADC_HAS_IE_TEXC_IE == 1U)) */ + +#if (defined(FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE) && (FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE == 1U)) + kLPADC_Trigger0CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 0UL), /*!< Configures ADC to generate interrupt + when trigger 0 completion. */ + kLPADC_Trigger1CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 1UL), /*!< Configures ADC to generate interrupt + when trigger 1 completion. */ + kLPADC_Trigger2CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 2UL), /*!< Configures ADC to generate interrupt + when trigger 2 completion. */ + kLPADC_Trigger3CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 3UL), /*!< Configures ADC to generate interrupt + when trigger 3 completion. */ + kLPADC_Trigger4CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 4UL), /*!< Configures ADC to generate interrupt + when trigger 4 completion. */ + kLPADC_Trigger5CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 5UL), /*!< Configures ADC to generate interrupt + when trigger 5 completion. */ + kLPADC_Trigger6CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 6UL), /*!< Configures ADC to generate interrupt + when trigger 6 completion. */ + kLPADC_Trigger7CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 7UL), /*!< Configures ADC to generate interrupt + when trigger 7 completion. */ + kLPADC_Trigger8CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 8UL), /*!< Configures ADC to generate interrupt + when trigger 8 completion. */ + kLPADC_Trigger9CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 9UL), /*!< Configures ADC to generate interrupt + when trigger 9 completion. */ + kLPADC_Trigger10CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 10UL), /*!< Configures ADC to generate interrupt + when trigger 10 completion. */ + kLPADC_Trigger11CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 11UL), /*!< Configures ADC to generate interrupt + when trigger 11 completion. */ + kLPADC_Trigger12CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 12UL), /*!< Configures ADC to generate interrupt + when trigger 12 completion. */ + kLPADC_Trigger13CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 13UL), /*!< Configures ADC to generate interrupt + when trigger 13 completion. */ + kLPADC_Trigger14CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 14UL), /*!< Configures ADC to generate interrupt + when trigger 14 completion. */ + kLPADC_Trigger15CompletionInterruptEnable = ADC_IE_TCOMP_IE(1UL << 15UL), /*!< Configures ADC to generate interrupt + when trigger 15 completion. */ +#endif /* #if (defined(FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE) && (FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE == 1U)) */ +}; + +#if (defined(FSL_FEATURE_LPADC_HAS_TSTAT) && (FSL_FEATURE_LPADC_HAS_TSTAT)) +/*! + * @brief The enumerator of lpadc trigger status flags, including interrupted flags and completed flags. + * + * Note: LPADC of different chips supports different number of trigger sources, + * please check the Reference Manual for details. + */ +enum _lpadc_trigger_status_flags +{ + kLPADC_Trigger0InterruptedFlag = 1UL << 0UL, /*!< Trigger 0 is interrupted by a high priority exception. */ + kLPADC_Trigger1InterruptedFlag = 1UL << 1UL, /*!< Trigger 1 is interrupted by a high priority exception. */ + kLPADC_Trigger2InterruptedFlag = 1UL << 2UL, /*!< Trigger 2 is interrupted by a high priority exception. */ + kLPADC_Trigger3InterruptedFlag = 1UL << 3UL, /*!< Trigger 3 is interrupted by a high priority exception. */ + kLPADC_Trigger4InterruptedFlag = 1UL << 4UL, /*!< Trigger 4 is interrupted by a high priority exception. */ + kLPADC_Trigger5InterruptedFlag = 1UL << 5UL, /*!< Trigger 5 is interrupted by a high priority exception. */ + kLPADC_Trigger6InterruptedFlag = 1UL << 6UL, /*!< Trigger 6 is interrupted by a high priority exception. */ + kLPADC_Trigger7InterruptedFlag = 1UL << 7UL, /*!< Trigger 7 is interrupted by a high priority exception. */ + kLPADC_Trigger8InterruptedFlag = 1UL << 8UL, /*!< Trigger 8 is interrupted by a high priority exception. */ + kLPADC_Trigger9InterruptedFlag = 1UL << 9UL, /*!< Trigger 9 is interrupted by a high priority exception. */ + kLPADC_Trigger10InterruptedFlag = 1UL << 10UL, /*!< Trigger 10 is interrupted by a high priority exception. */ + kLPADC_Trigger11InterruptedFlag = 1UL << 11UL, /*!< Trigger 11 is interrupted by a high priority exception. */ + kLPADC_Trigger12InterruptedFlag = 1UL << 12UL, /*!< Trigger 12 is interrupted by a high priority exception. */ + kLPADC_Trigger13InterruptedFlag = 1UL << 13UL, /*!< Trigger 13 is interrupted by a high priority exception. */ + kLPADC_Trigger14InterruptedFlag = 1UL << 14UL, /*!< Trigger 14 is interrupted by a high priority exception. */ + kLPADC_Trigger15InterruptedFlag = 1UL << 15UL, /*!< Trigger 15 is interrupted by a high priority exception. */ + + kLPADC_Trigger0CompletedFlag = 1UL << 16UL, /*!< Trigger 0 is completed and + trigger 0 has enabled completion interrupts. */ + kLPADC_Trigger1CompletedFlag = 1UL << 17UL, /*!< Trigger 1 is completed and + trigger 1 has enabled completion interrupts. */ + kLPADC_Trigger2CompletedFlag = 1UL << 18UL, /*!< Trigger 2 is completed and + trigger 2 has enabled completion interrupts. */ + kLPADC_Trigger3CompletedFlag = 1UL << 19UL, /*!< Trigger 3 is completed and + trigger 3 has enabled completion interrupts. */ + kLPADC_Trigger4CompletedFlag = 1UL << 20UL, /*!< Trigger 4 is completed and + trigger 4 has enabled completion interrupts. */ + kLPADC_Trigger5CompletedFlag = 1UL << 21UL, /*!< Trigger 5 is completed and + trigger 5 has enabled completion interrupts. */ + kLPADC_Trigger6CompletedFlag = 1UL << 22UL, /*!< Trigger 6 is completed and + trigger 6 has enabled completion interrupts. */ + kLPADC_Trigger7CompletedFlag = 1UL << 23UL, /*!< Trigger 7 is completed and + trigger 7 has enabled completion interrupts. */ + kLPADC_Trigger8CompletedFlag = 1UL << 24UL, /*!< Trigger 8 is completed and + trigger 8 has enabled completion interrupts. */ + kLPADC_Trigger9CompletedFlag = 1UL << 25UL, /*!< Trigger 9 is completed and + trigger 9 has enabled completion interrupts. */ + kLPADC_Trigger10CompletedFlag = 1UL << 26UL, /*!< Trigger 10 is completed and + trigger 10 has enabled completion interrupts. */ + kLPADC_Trigger11CompletedFlag = 1UL << 27UL, /*!< Trigger 11 is completed and + trigger 11 has enabled completion interrupts. */ + kLPADC_Trigger12CompletedFlag = 1UL << 28UL, /*!< Trigger 12 is completed and + trigger 12 has enabled completion interrupts. */ + kLPADC_Trigger13CompletedFlag = 1UL << 29UL, /*!< Trigger 13 is completed and + trigger 13 has enabled completion interrupts. */ + kLPADC_Trigger14CompletedFlag = 1UL << 30UL, /*!< Trigger 14 is completed and + trigger 14 has enabled completion interrupts. */ + kLPADC_Trigger15CompletedFlag = 1UL << 31UL, /*!< Trigger 15 is completed and + trigger 15 has enabled completion interrupts. */ +}; +#endif /* (defined(FSL_FEATURE_LPADC_HAS_TSTAT) && (FSL_FEATURE_LPADC_HAS_TSTAT)) */ + +/*! + * @brief Define enumeration of sample scale mode. + * + * The sample scale mode is used to reduce the selected ADC analog channel input voltage level by a factor. The maximum + * possible voltage on the ADC channel input should be considered when selecting a scale mode to ensure that the + * reducing factor always results voltage level at or below the VREFH reference. This reducing capability allows + * conversion of analog inputs higher than VREFH. A-side and B-side channel inputs are both scaled using the scale mode. + */ +typedef enum _lpadc_sample_scale_mode +{ + kLPADC_SamplePartScale = 0U, /*!< Use divided input voltage signal. + (For scale select,please refer to the reference manual). */ + kLPADC_SampleFullScale = 1U, /*!< Full scale (Factor of 1). */ +} lpadc_sample_scale_mode_t; + +/*! + * @brief Define enumeration of channel sample mode. + * + * The channel sample mode configures the channel with single-end/differential/dual-single-end, side A/B. + */ +typedef enum _lpadc_sample_channel_mode +{ + kLPADC_SampleChannelSingleEndSideA = 0x0U, /*!< Single-end mode, only A-side channel is converted. */ +#if !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) + kLPADC_SampleChannelSingleEndSideB = 0x1U, /*!< Single-end mode, only B-side channel is converted. */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_DIFF) && FSL_FEATURE_LPADC_HAS_CMDL_DIFF + kLPADC_SampleChannelDiffBothSideAB = 0x2U, /*!< Differential mode, the ADC result is (CHnA-CHnB). */ + kLPADC_SampleChannelDiffBothSideBA = 0x3U, /*!< Differential mode, the ADC result is (CHnB-CHnA). */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CMDL_DIFF) && FSL_FEATURE_LPADC_HAS_CMDL_DIFF */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_CTYPE) && FSL_FEATURE_LPADC_HAS_CMDL_CTYPE + kLPADC_SampleChannelDiffBothSide = 0x02U, /*!< Differential mode, the ADC result is (CHnA-CHnB). */ + kLPADC_SampleChannelDualSingleEndBothSide = 0x03U, /*!< Dual-Single-Ended Mode. Both A side and B side + channels are converted independently. */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CMDL_CTYPE) && FSL_FEATURE_LPADC_HAS_CMDL_CTYPE */ +#endif /* !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) */ +} lpadc_sample_channel_mode_t; + +/*! + * @brief Define enumeration of hardware average selection. + * + * It Selects how many ADC conversions are averaged to create the ADC result. An internal storage buffer is used to + * capture temporary results while the averaging iterations are executed. + * + * @note Some enumerator values are not available on some devices, mainly depends on the size of AVGS field in CMDH + * register. + */ +typedef enum _lpadc_hardware_average_mode +{ + kLPADC_HardwareAverageCount1 = 0U, /*!< Single conversion. */ + kLPADC_HardwareAverageCount2 = 1U, /*!< 2 conversions averaged. */ + kLPADC_HardwareAverageCount4 = 2U, /*!< 4 conversions averaged. */ + kLPADC_HardwareAverageCount8 = 3U, /*!< 8 conversions averaged. */ + kLPADC_HardwareAverageCount16 = 4U, /*!< 16 conversions averaged. */ + kLPADC_HardwareAverageCount32 = 5U, /*!< 32 conversions averaged. */ + kLPADC_HardwareAverageCount64 = 6U, /*!< 64 conversions averaged. */ + kLPADC_HardwareAverageCount128 = 7U, /*!< 128 conversions averaged. */ +#if (defined(FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH) && \ + (FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH == 4U)) + kLPADC_HardwareAverageCount256 = 8U, /*!< 256 conversions averaged. */ + kLPADC_HardwareAverageCount512 = 9U, /*!< 512 conversions averaged. */ + kLPADC_HardwareAverageCount1024 = 10U, /*!< 1024 conversions averaged. */ +#endif /* (defined(FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH) && \ + (FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH == 4U))*/ +} lpadc_hardware_average_mode_t; + +/*! + * @brief Define enumeration of sample time selection. + * + * The shortest sample time maximizes conversion speed for lower impedance inputs. Extending sample time allows higher + * impedance inputs to be accurately sampled. Longer sample times can also be used to lower overall power consumption + * when command looping and sequencing is configured and high conversion rates are not required. + */ +typedef enum _lpadc_sample_time_mode +{ + kLPADC_SampleTimeADCK3 = 0U, /*!< 3 ADCK cycles total sample time. */ + kLPADC_SampleTimeADCK5 = 1U, /*!< 5 ADCK cycles total sample time. */ + kLPADC_SampleTimeADCK7 = 2U, /*!< 7 ADCK cycles total sample time. */ + kLPADC_SampleTimeADCK11 = 3U, /*!< 11 ADCK cycles total sample time. */ + kLPADC_SampleTimeADCK19 = 4U, /*!< 19 ADCK cycles total sample time. */ + kLPADC_SampleTimeADCK35 = 5U, /*!< 35 ADCK cycles total sample time. */ + kLPADC_SampleTimeADCK67 = 6U, /*!< 69 ADCK cycles total sample time. */ + kLPADC_SampleTimeADCK131 = 7U, /*!< 131 ADCK cycles total sample time. */ +} lpadc_sample_time_mode_t; + +/*! + * @brief Define enumeration of hardware compare mode. + * + * After an ADC channel input is sampled and converted and any averaging iterations are performed, this mode setting + * guides operation of the automatic compare function to optionally only store when the compare operation is true. + * When compare is enabled, the conversion result is compared to the compare values. + */ +typedef enum _lpadc_hardware_compare_mode +{ + kLPADC_HardwareCompareDisabled = 0U, /*!< Compare disabled. */ + kLPADC_HardwareCompareStoreOnTrue = 2U, /*!< Compare enabled. Store on true. */ + kLPADC_HardwareCompareRepeatUntilTrue = 3U, /*!< Compare enabled. Repeat channel acquisition until true. */ +} lpadc_hardware_compare_mode_t; + +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_MODE) && FSL_FEATURE_LPADC_HAS_CMDL_MODE +/*! + * @brief Define enumeration of conversion resolution mode. + * + * Configure the resolution bit in specific conversion type. For detailed resolution accuracy, see to + * #lpadc_sample_channel_mode_t + */ +typedef enum _lpadc_conversion_resolution_mode +{ + kLPADC_ConversionResolutionStandard = 0U, /*!< Standard resolution. Single-ended 12-bit conversion, Differential + 13-bit conversion with 2's complement output. */ + kLPADC_ConversionResolutionHigh = 1U, /*!< High resolution. Single-ended 16-bit conversion; Differential 16-bit + conversion with 2's complement output. */ +} lpadc_conversion_resolution_mode_t; +#endif /* defined(FSL_FEATURE_LPADC_HAS_CMDL_MODE) && FSL_FEATURE_LPADC_HAS_CMDL_MODE */ + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS +/*! + * @brief Define enumeration of conversion averages mode. + * + * Configure the converion average number for auto-calibration. + * @note Some enumerator values are not available on some devices, mainly depends on the size of CAL_AVGS field in CTRL + * register. + */ +typedef enum _lpadc_conversion_average_mode +{ + kLPADC_ConversionAverage1 = 0U, /*!< Single conversion. */ + kLPADC_ConversionAverage2 = 1U, /*!< 2 conversions averaged. */ + kLPADC_ConversionAverage4 = 2U, /*!< 4 conversions averaged. */ + kLPADC_ConversionAverage8 = 3U, /*!< 8 conversions averaged. */ + kLPADC_ConversionAverage16 = 4U, /*!< 16 conversions averaged. */ + kLPADC_ConversionAverage32 = 5U, /*!< 32 conversions averaged. */ + kLPADC_ConversionAverage64 = 6U, /*!< 64 conversions averaged. */ + kLPADC_ConversionAverage128 = 7U, /*!< 128 conversions averaged. */ +#if (defined(FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH) && \ + (FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH == 4U)) + kLPADC_ConversionAverage256 = 8U, /*!< 256 conversions averaged. */ + kLPADC_ConversionAverage512 = 9U, /*!< 512 conversions averaged. */ + kLPADC_ConversionAverage1024 = 10U, /*!< 1024 conversions averaged. */ +#endif /* (defined(FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH) && \ + (FSL_FEATURE_LPADC_CONVERSIONS_AVERAGED_BITFIELD_WIDTH == 4U))*/ +} lpadc_conversion_average_mode_t; +#endif /* defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS */ + +/*! + * @brief Define enumeration of reference voltage source. + * + * For detail information, need to check the SoC's specification. + */ +typedef enum _lpadc_reference_voltage_mode +{ + kLPADC_ReferenceVoltageAlt1 = 0U, /*!< Option 1 setting. */ + kLPADC_ReferenceVoltageAlt2 = 1U, /*!< Option 2 setting. */ + kLPADC_ReferenceVoltageAlt3 = 2U, /*!< Option 3 setting. */ +} lpadc_reference_voltage_source_t; + +/*! + * @brief Define enumeration of power configuration. + * + * Configures the ADC for power and performance. In the highest power setting the highest conversion rates will be + * possible. Refer to the device data sheet for power and performance capabilities for each setting. + */ +typedef enum _lpadc_power_level_mode +{ + kLPADC_PowerLevelAlt1 = 0U, /*!< Lowest power setting. */ + kLPADC_PowerLevelAlt2 = 1U, /*!< Next lowest power setting. */ + kLPADC_PowerLevelAlt3 = 2U, /*!< ... */ + kLPADC_PowerLevelAlt4 = 3U, /*!< Highest power setting. */ +} lpadc_power_level_mode_t; + +#if (defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE) +/*! + * @brief Define enumeration of offset calibration mode. + * + */ +typedef enum _lpadc_offset_calibration_mode +{ + kLPADC_OffsetCalibration12bitMode = 0U, /*!< 12 bit offset calibration mode. */ + kLPADC_OffsetCalibration16bitMode = 1U, /*!< 16 bit offset calibration mode. */ +} lpadc_offset_calibration_mode_t; +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE */ + +/*! + * @brief Define enumeration of trigger priority policy. + * + * This selection controls how higher priority triggers are handled. + * @note \b kLPADC_TriggerPriorityPreemptSubsequently is not available on some devices, mainly depends on the size of + * TPRICTRL field in CFG register. + */ +typedef enum _lpadc_trigger_priority_policy +{ + kLPADC_ConvPreemptImmediatelyNotAutoResumed = 0x0U, /*!< If a higher priority trigger is detected during command + processing, the current conversion is aborted and the new + command specified by the trigger is started, when higher + priority conversion finishes, the preempted conversion is not + automatically resumed or restarted. */ + kLPADC_ConvPreemptSoftlyNotAutoResumed = 0x1U, /*!< If a higher priority trigger is received during command + processing, the current conversion is completed (including averaging + iterations and compare function if enabled) and stored to the result + FIFO before the higher priority trigger/command is initiated, when + higher priority conversion finishes, the preempted conversion is not + resumed or restarted. */ + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_TRES) && FSL_FEATURE_LPADC_HAS_CFG_TRES + kLPADC_ConvPreemptImmediatelyAutoRestarted = 0x4U, /*!< If a higher priority trigger is detected during command + processing, the current conversion is aborted and the new + command specified by the trigger is started, when higher + priority conversion finishes, the preempted conversion will + automatically be restarted. */ + kLPADC_ConvPreemptSoftlyAutoRestarted = 0x5U, /*!< If a higher priority trigger is received during command + processing, the current conversion is completed (including averaging + iterations and compare function if enabled) and stored to the result + FIFO before the higher priority trigger/command is initiated, when + higher priority conversion finishes, the preempted conversion will + automatically be restarted. */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_TRES) && FSL_FEATURE_LPADC_HAS_CFG_TRES */ + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) && FSL_FEATURE_LPADC_HAS_CFG_TCMDRES + kLPADC_ConvPreemptImmediatelyAutoResumed = 0xCU, /*!< If a higher priority trigger is detected during command + processing, the current conversion is aborted and the new + command specified by the trigger is started, when higher + priority conversion finishes, the preempted conversion will + automatically be resumed. */ + kLPADC_ConvPreemptSoftlyAutoResumed = 0xDU, /*!< If a higher priority trigger is received during command + processing, the current conversion is completed (including averaging + iterations and compare function if enabled) and stored to the result + FIFO before the higher priority trigger/command is initiated, when + higher priority conversion finishes, the preempted conversion will + be automatically be resumed. */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) && FSL_FEATURE_LPADC_HAS_CFG_TCMDRES */ + + kLPADC_TriggerPriorityPreemptImmediately = + kLPADC_ConvPreemptImmediatelyNotAutoResumed, /*!< Legacy support is not recommended as it only ensures + compatibility with older versions. */ + kLPADC_TriggerPriorityPreemptSoftly = + kLPADC_ConvPreemptSoftlyNotAutoResumed, /*!< Legacy support is not recommended as it only ensures compatibility + with older versions. */ + +#if (defined(FSL_FEATURE_LPADC_CFG_TPRICTRL_BITFIELD_WIDTH) && (FSL_FEATURE_LPADC_CFG_TPRICTRL_BITFIELD_WIDTH == 2U)) + kLPADC_ConvPreemptSubsequentlyNotAutoResumed = 0x2U, /*!< If a higher priority trigger is received during command + processing, the current command will be completed (averaging, + looping, compare) before servicing the higher priority trigger, when + higher priority conversion finishes, the preempted conversion will + not automatically be restarted or resumed. */ + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_TRES) && FSL_FEATURE_LPADC_HAS_CFG_TRES + kLPADC_ConvPreemptSubsequentlyAutoRestarted = 0x6U, /*!< If a higher priority trigger is received during command + processing, the current command will be completed (averaging, + looping, compare) before servicing the higher priority trigger, when + higher priority conversion finishes, the preempted conversion will + be automatically restarted. */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_TRES) && FSL_FEATURE_LPADC_HAS_CFG_TRES */ + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) && FSL_FEATURE_LPADC_HAS_CFG_TCMDRES + kLPADC_ConvPreemptSubsequentlyAutoResumed = 0xEU, /*!< If a higher priority trigger is received during command + processing, the current command will be completed (averaging, + looping, compare) before servicing the higher priority trigger, when + higher priority conversion finishes, the preempted conversion will + be automatically resumed. */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_TCMDRES) && FSL_FEATURE_LPADC_HAS_CFG_TCMDRES */ + + kLPADC_TriggerPriorityPreemptSubsequently = + kLPADC_ConvPreemptSubsequentlyNotAutoResumed, /*!< Legacy support is not recommended as it only ensures + compatibility with older versions. */ +#endif /* #if (defined(FSL_FEATURE_LPADC_CFG_TPRICTRL_BITFIELD_WIDTH) && \ + (FSL_FEATURE_LPADC_CFG_TPRICTRL_BITFIELD_WIDTH == 2U)) */ + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI) && FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI + kLPADC_TriggerPriorityExceptionDisabled = 0x10U, /*!< High priority trigger exception disabled. */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI) && FSL_FEATURE_LPADC_HAS_CFG_HPT_EXDI */ +} lpadc_trigger_priority_policy_t; + +#if ((defined(FSL_FEATURE_LPADC_HAS_CTRL_CALHS)) && FSL_FEATURE_LPADC_HAS_CTRL_CALHS) +/*! + * @brief Define enumeration of tune value. + */ +typedef enum _lpadc_tune_value +{ + kLPADC_TuneValue0 = 0U, /*!< Tune value 0. */ + kLPADC_TuneValue1 = 1U, /*!< Tune value 1. */ + kLPADC_TuneValue2 = 2U, /*!< Tune value 2. */ + kLPADC_TuneValue3 = 3U, /*!< Tune value 3. */ +} lpadc_tune_value_t; +#endif /* ((defined(FSL_FEATURE_LPADC_HAS_CTRL_CALHS)) && FSL_FEATURE_LPADC_HAS_CTRL_CALHS) */ + +/*! + * @brief LPADC global configuration. + * + * This structure would used to keep the settings for initialization. + */ +typedef struct +{ +#if defined(FSL_FEATURE_LPADC_HAS_CFG_ADCKEN) && FSL_FEATURE_LPADC_HAS_CFG_ADCKEN + bool enableInternalClock; /*!< Enables the internally generated clock source. The clock source is used in clock + selection logic at the chip level and is optionally used for the ADC clock source. */ +#endif /* FSL_FEATURE_LPADC_HAS_CFG_ADCKEN */ +#if defined(FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG) && FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG + bool enableVref1LowVoltage; /*!< If voltage reference option1 input is below 1.8V, it should be "true". + If voltage reference option1 input is above 1.8V, it should be "false". */ +#endif /* FSL_FEATURE_LPADC_HAS_CFG_VREF1RNG */ + bool enableInDozeMode; /*!< Control system transition to Stop and Wait power modes while ADC is converting. When + enabled in Doze mode, immediate entries to Wait or Stop are allowed. When disabled, the + ADC will wait for the current averaging iteration/FIFO storage to complete before + acknowledging stop or wait mode entry. */ +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS + lpadc_conversion_average_mode_t conversionAverageMode; /*!< Auto-Calibration Averages. */ +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS */ + bool enableAnalogPreliminary; /*!< ADC analog circuits are pre-enabled and ready to execute conversions without + startup delays(at the cost of higher DC current consumption). */ + uint32_t powerUpDelay; /*!< When the analog circuits are not pre-enabled, the ADC analog circuits are only powered + while the ADC is active and there is a counted delay defined by this field after an + initial trigger transitions the ADC from its Idle state to allow time for the analog + circuits to stabilize. The startup delay count of (powerUpDelay * 4) ADCK cycles must + result in a longer delay than the analog startup time. */ + lpadc_reference_voltage_source_t referenceVoltageSource; /*!< Selects the voltage reference high used for + conversions.*/ + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_PWRSEL) && (FSL_FEATURE_LPADC_HAS_CFG_PWRSEL == 1U) + lpadc_power_level_mode_t powerLevelMode; /*!< Power Configuration Selection. */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_PWRSEL) && (FSL_FEATURE_LPADC_HAS_CFG_PWRSEL == 1U) */ + lpadc_trigger_priority_policy_t triggerPriorityPolicy; /*!< Control how higher priority triggers are handled, see to + lpadc_trigger_priority_policy_t. */ + bool enableConvPause; /*!< Enables the ADC pausing function. When enabled, a programmable delay is inserted during + command execution sequencing between LOOP iterations, between commands in a sequence, and + between conversions when command is executing in "Compare Until True" configuration. */ + uint32_t convPauseDelay; /*!< Controls the duration of pausing during command execution sequencing. The pause delay + is a count of (convPauseDelay*4) ADCK cycles. Only available when ADC pausing + function is enabled. The available value range is in 9-bit. */ +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) + /* for FIFO0. */ + uint32_t FIFO0Watermark; /*!< FIFO0Watermark is a programmable threshold setting. When the number of datawords + stored in the ADC Result FIFO0 is greater than the value in this field, the ready flag + would be asserted to indicate stored data has reached the programmable threshold. */ + /* for FIFO1. */ + uint32_t FIFO1Watermark; /*!< FIFO1Watermark is a programmable threshold setting. When the number of datawords + stored in the ADC Result FIFO1 is greater than the value in this field, the ready flag + would be asserted to indicate stored data has reached the programmable threshold. */ +#else + /* for FIFO. */ + uint32_t FIFOWatermark; /*!< FIFOWatermark is a programmable threshold setting. When the number of datawords stored + in the ADC Result FIFO is greater than the value in this field, the ready flag would be + asserted to indicate stored data has reached the programmable threshold. */ +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ +#if (defined(FSL_FEATURE_LPADC_HAS_TSTAT) && (FSL_FEATURE_LPADC_HAS_TSTAT)) + +#endif /* FSL_FEATURE_LPADC_HAS_TSTAT */ +} lpadc_config_t; + +/*! + * @brief Define structure to keep the configuration for conversion command. + */ +typedef struct +{ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_CSCALE) && FSL_FEATURE_LPADC_HAS_CMDL_CSCALE + lpadc_sample_scale_mode_t sampleScaleMode; /*!< Sample scale mode. */ +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_CSCALE */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE) && FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE + lpadc_sample_scale_mode_t channelBScaleMode; /*!< Alternate channe B Scale mode. */ +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_ALTB_CSCALE */ + lpadc_sample_channel_mode_t sampleChannelMode; /*!< Channel sample mode. */ + uint32_t channelNumber; /*!< Channel number, select the channel or channel pair. */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTB_ADCH) && FSL_FEATURE_LPADC_HAS_CMDL_ALTB_ADCH + uint32_t channelBNumber; /*!< Alternate Channel B number, select the channel. */ +#endif + uint32_t chainedNextCommandNumber; /*!< Selects the next command to be executed after this command completes. + 1-15 is available, 0 is to terminate the chain after this command. */ + bool enableAutoChannelIncrement; /*!< Loop with increment: when disabled, the "loopCount" field selects the number + of times the selected channel is converted consecutively; when enabled, the + "loopCount" field defines how many consecutive channels are converted as part + of the command execution. */ + uint32_t loopCount; /*!< Selects how many times this command executes before finish and transition to the next + command or Idle state. Command executes LOOP+1 times. 0-15 is available. */ + lpadc_hardware_average_mode_t hardwareAverageMode; /*!< Hardware average selection. */ + lpadc_sample_time_mode_t sampleTimeMode; /*!< Sample time selection. */ + + lpadc_hardware_compare_mode_t hardwareCompareMode; /*!< Hardware compare selection. */ + uint32_t hardwareCompareValueHigh; /*!< Compare Value High. The available value range is in 16-bit. */ + uint32_t hardwareCompareValueLow; /*!< Compare Value Low. The available value range is in 16-bit. */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_MODE) && FSL_FEATURE_LPADC_HAS_CMDL_MODE + lpadc_conversion_resolution_mode_t conversionResolutionMode; /*!< Conversion resolution mode. */ +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_MODE */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG) && FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG + bool enableWaitTrigger; /*!< Wait for trigger assertion before execution: when disabled, this command will be + automatically executed; when enabled, the active trigger must be asserted again before + executing this command. */ +#endif /* FSL_FEATURE_LPADC_HAS_CMDH_WAIT_TRIG */ +#if defined(FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN) && FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN + bool enableChannelB; /*! Enable alternate Channel B */ +#endif /* FSL_FEATURE_LPADC_HAS_CMDL_ALTBEN */ +} lpadc_conv_command_config_t; + +/*! + * @brief Define structure to keep the configuration for conversion trigger. + */ +typedef struct +{ + uint32_t targetCommandId; /*!< Select the command from command buffer to execute upon detect of the associated + trigger event. */ + uint32_t delayPower; /*!< Select the trigger delay duration to wait at the start of servicing a trigger event. + When this field is clear, then no delay is incurred. When this field is set to a non-zero + value, the duration for the delay is 2^delayPower ADCK cycles. The available value range + is 4-bit. */ + uint32_t priority; /*!< Sets the priority of the associated trigger source. If two or more triggers have the same + priority level setting, the lower order trigger event has the higher priority. The lower + value for this field is for the higher priority, the available value range is 1-bit. */ +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) + uint8_t channelAFIFOSelect; /* SAR Result Destination For Channel A. */ + uint8_t channelBFIFOSelect; /* SAR Result Destination For Channel B. */ +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ + bool enableHardwareTrigger; /*!< Enable hardware trigger source to initiate conversion on the rising edge of the + input trigger source or not. THe software trigger is always available. */ +} lpadc_conv_trigger_config_t; + +/*! + * @brief Define the structure to keep the conversion result. + */ +typedef struct +{ + uint32_t commandIdSource; /*!< Indicate the command buffer being executed that generated this result. */ + uint32_t loopCountIndex; /*!< Indicate the loop count value during command execution that generated this result. */ + uint32_t triggerIdSource; /*!< Indicate the trigger source that initiated a conversion and generated this result. */ + uint16_t convValue; /*!< Data result. */ +} lpadc_conv_result_t; + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFS) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFS +/*! + * @brief A structure of calibration value. + */ +typedef struct _lpadc_calibration_value +{ + /* gain calibration result. */ + uint16_t gainCalibrationResultA; +#if !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) + uint16_t gainCalibrationResultB; +#endif /* !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) */ +#if (defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) + /* general calibration value. */ + uint16_t generalCalibrationValueA[33U]; +#if !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) + uint16_t generalCalibrationValueB[33U]; +#endif /* !(defined(FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS) && (FSL_FEATURE_LPADC_HAS_B_SIDE_CHANNELS == 0U)) */ +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ */ +} lpadc_calibration_value_t; +#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CALOFS */ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* + * API + ******************************************************************************/ +/*! + * @name Initialization & de-initialization. + * @{ + */ + +/*! + * @brief Initializes the LPADC module. + * + * @param base LPADC peripheral base address. + * @param config Pointer to configuration structure. See "lpadc_config_t". + */ +void LPADC_Init(ADC_Type *base, const lpadc_config_t *config); + +/*! + * @brief Gets an available pre-defined settings for initial configuration. + * + * This function initializes the converter configuration structure with an available settings. The default values are: + * @code + * config->enableInDozeMode = true; + * config->enableAnalogPreliminary = false; + * config->powerUpDelay = 0x80; + * config->referenceVoltageSource = kLPADC_ReferenceVoltageAlt1; + * config->powerLevelMode = kLPADC_PowerLevelAlt1; + * config->triggerPriorityPolicy = kLPADC_TriggerPriorityPreemptImmediately; + * config->enableConvPause = false; + * config->convPauseDelay = 0U; + * config->FIFOWatermark = 0U; + * @endcode + * @param config Pointer to configuration structure. + */ +void LPADC_GetDefaultConfig(lpadc_config_t *config); + +/*! + * @brief De-initializes the LPADC module. + * + * @param base LPADC peripheral base address. + */ +void LPADC_Deinit(ADC_Type *base); + +/*! + * @brief Switch on/off the LPADC module. + * + * @param base LPADC peripheral base address. + * @param enable switcher to the module. + */ +static inline void LPADC_Enable(ADC_Type *base, bool enable) +{ + if (enable) + { + base->CTRL |= ADC_CTRL_ADCEN_MASK; + } + else + { + base->CTRL &= ~ADC_CTRL_ADCEN_MASK; + } +} + +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) +/*! + * @brief Do reset the conversion FIFO0. + * + * @param base LPADC peripheral base address. + */ +static inline void LPADC_DoResetFIFO0(ADC_Type *base) +{ + base->CTRL |= ADC_CTRL_RSTFIFO0_MASK; +} + +/*! + * @brief Do reset the conversion FIFO1. + * + * @param base LPADC peripheral base address. + */ +static inline void LPADC_DoResetFIFO1(ADC_Type *base) +{ + base->CTRL |= ADC_CTRL_RSTFIFO1_MASK; +} +#else + +#if defined(ADC_CTRL_RSTFIFO0_MASK) +#define ADC_CTRL_RSTFIFO_MASK ADC_CTRL_RSTFIFO0_MASK +#endif /* defined(ADC_CTRL_RSTFIFO0_MASK) */ +/*! + * @brief Do reset the conversion FIFO. + * + * @param base LPADC peripheral base address. + */ +static inline void LPADC_DoResetFIFO(ADC_Type *base) +{ + base->CTRL |= ADC_CTRL_RSTFIFO_MASK; +} +#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */ + +/*! + * @brief Do reset the module's configuration. + * + * Reset all ADC internal logic and registers, except the Control Register (ADCx_CTRL). + * + * @param base LPADC peripheral base address. + */ +static inline void LPADC_DoResetConfig(ADC_Type *base) +{ + base->CTRL |= ADC_CTRL_RST_MASK; + base->CTRL &= ~ADC_CTRL_RST_MASK; +} + +/*! @} */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Get status flags. + * + * @param base LPADC peripheral base address. + * @return status flags' mask. See to #_lpadc_status_flags. + */ +static inline uint32_t LPADC_GetStatusFlags(ADC_Type *base) +{ + return base->STAT; +} + +/*! + * @brief Clear status flags. + * + * Only the flags can be cleared by writing ADCx_STATUS register would be cleared by this API. + * + * @param base LPADC peripheral base address. + * @param mask Mask value for flags to be cleared. See to #_lpadc_status_flags. + */ +static inline void LPADC_ClearStatusFlags(ADC_Type *base, uint32_t mask) +{ + base->STAT = mask; +} + +#if (defined(FSL_FEATURE_LPADC_HAS_TSTAT) && FSL_FEATURE_LPADC_HAS_TSTAT) +/*! + * @brief Get trigger status flags to indicate which trigger sequences have been completed or interrupted by a high + * priority trigger exception. + * + * @param base LPADC peripheral base address. + * @return The OR'ed value of @ref _lpadc_trigger_status_flags. + */ +static inline uint32_t LPADC_GetTriggerStatusFlags(ADC_Type *base) +{ + return base->TSTAT; +} + +/*! + * @brief Clear trigger status flags. + * + * @param base LPADC peripheral base address. + * @param mask The mask of trigger status flags to be cleared, should be the + * OR'ed value of @ref _lpadc_trigger_status_flags. + */ +static inline void LPADC_ClearTriggerStatusFlags(ADC_Type *base, uint32_t mask) +{ + /* This assert used to avoid user use doesn't supported trigger sources. */ + assert(((mask & 0xFFFFU) == (mask & ADC_TSTAT_TEXC_NUM_MASK)) && + ((mask & 0xFFFF0000U) == (mask & ADC_TSTAT_TCOMP_FLAG_MASK))); + base->TSTAT = mask; +} +#endif /* (defined(FSL_FEATURE_LPADC_HAS_TSTAT) && FSL_FEATURE_LPADC_HAS_TSTAT) */ + +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enable interrupts. + * + * @param base LPADC peripheral base address. + * @param mask Mask value for interrupt events. See to #_lpadc_interrupt_enable. + */ +static inline void LPADC_EnableInterrupts(ADC_Type *base, uint32_t mask) +{ +#if (defined(FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE) && (FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE == 1U)) + /* This assert used to avoid user use doesn't supported trigger sources. */ + assert((mask <= 0xFFFFU) || ((mask & 0xFFFF0000U) == (mask & ADC_IE_TCOMP_IE_MASK))); +#endif /* #if (defined(FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE) && (FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE == 1U)) */ + base->IE |= mask; +} + +/*! + * @brief Disable interrupts. + * + * @param base LPADC peripheral base address. + * @param mask Mask value for interrupt events. See to #_lpadc_interrupt_enable. + */ +static inline void LPADC_DisableInterrupts(ADC_Type *base, uint32_t mask) +{ +#if (defined(FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE) && (FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE == 1U)) + /* This assert used to avoid user use doesn't supported trigger sources. */ + assert((mask <= 0xFFFFU) || ((mask & 0xFFFF0000U) == (mask & ADC_IE_TCOMP_IE_MASK))); +#endif /* #if (defined(FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE) && (FSL_FEATURE_LPADC_HAS_IE_TCOMP_IE == 1U)) */ + base->IE &= ~mask; +} + +/*! + * @name DMA Control + * @{ + */ + +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) +/*! + * @brief Switch on/off the DMA trigger for FIFO0 watermark event. + * + * @param base LPADC peripheral base address. + * @param enable Switcher to the event. + */ +static inline void LPADC_EnableFIFO0WatermarkDMA(ADC_Type *base, bool enable) +{ + if (enable) + { + base->DE |= ADC_DE_FWMDE0_MASK; + } + else + { + base->DE &= ~ADC_DE_FWMDE0_MASK; + } +} + +/*! + * @brief Switch on/off the DMA trigger for FIFO1 watermark event. + * + * @param base LPADC peripheral base address. + * @param enable Switcher to the event. + */ +static inline void LPADC_EnableFIFO1WatermarkDMA(ADC_Type *base, bool enable) +{ + if (enable) + { + base->DE |= ADC_DE_FWMDE1_MASK; + } + else + { + base->DE &= ~ADC_DE_FWMDE1_MASK; + } +} +#else +#if defined(ADC_DE_FWMDE0_MASK) +#define ADC_DE_FWMDE_MASK ADC_DE_FWMDE0_MASK +#endif /* defined(ADC_DE_FWMDE0_MASK) */ +/*! + * @brief Switch on/off the DMA trigger for FIFO watermark event. + * + * @param base LPADC peripheral base address. + * @param enable Switcher to the event. + */ +static inline void LPADC_EnableFIFOWatermarkDMA(ADC_Type *base, bool enable) +{ + if (enable) + { + base->DE |= ADC_DE_FWMDE_MASK; + } + else + { + base->DE &= ~ADC_DE_FWMDE_MASK; + } +} +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) */ +/*! @} */ + +/*! + * @name Trigger and conversion with FIFO. + * @{ + */ + +#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) +/*! + * @brief Get the count of result kept in conversion FIFOn. + * + * @param base LPADC peripheral base address. + * @param index Result FIFO index. + * @return The count of result kept in conversion FIFOn. + */ +static inline uint32_t LPADC_GetConvResultCount(ADC_Type *base, uint8_t index) +{ + return (ADC_FCTRL_FCOUNT_MASK & base->FCTRL[index]) >> ADC_FCTRL_FCOUNT_SHIFT; +} + +/*! + * @brief Get the result in conversion FIFOn. + * + * @param base LPADC peripheral base address. + * @param result Pointer to structure variable that keeps the conversion result in conversion FIFOn. + * @param index Result FIFO index. + * + * @return Status whether FIFOn entry is valid. + */ +bool LPADC_GetConvResult(ADC_Type *base, lpadc_conv_result_t *result, uint8_t index); + +/*! + * @brief Get the result in conversion FIFOn using blocking method. + * + * @param base LPADC peripheral base address. + * @param result Pointer to structure variable that keeps the conversion result in conversion FIFOn. + * @param index Result FIFO index. + */ +void LPADC_GetConvResultBlocking(ADC_Type *base, lpadc_conv_result_t *result, uint8_t index); +#else /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 1)) */ +/*! + * @brief Get the count of result kept in conversion FIFO. + * + * @param base LPADC peripheral base address. + * @return The count of result kept in conversion FIFO. + */ +static inline uint32_t LPADC_GetConvResultCount(ADC_Type *base) +{ + return (ADC_FCTRL_FCOUNT_MASK & base->FCTRL) >> ADC_FCTRL_FCOUNT_SHIFT; +} + +/*! + * @brief Get the result in conversion FIFO. + * + * @param base LPADC peripheral base address. + * @param result Pointer to structure variable that keeps the conversion result in conversion FIFO. + * + * @return Status whether FIFO entry is valid. + */ +bool LPADC_GetConvResult(ADC_Type *base, lpadc_conv_result_t *result); + +/*! + * @brief Get the result in conversion FIFO using blocking method. + * + * @param base LPADC peripheral base address. + * @param result Pointer to structure variable that keeps the conversion result in conversion FIFO. + */ +void LPADC_GetConvResultBlocking(ADC_Type *base, lpadc_conv_result_t *result); +#endif /* (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2)) */ + +/*! + * @brief Configure the conversion trigger source. + * + * Each programmable trigger can launch the conversion command in command buffer. + * + * @param base LPADC peripheral base address. + * @param triggerId ID for each trigger. Typically, the available value range is from 0. + * @param config Pointer to configuration structure. See to #lpadc_conv_trigger_config_t. + */ +void LPADC_SetConvTriggerConfig(ADC_Type *base, uint32_t triggerId, const lpadc_conv_trigger_config_t *config); + +/*! + * @brief Gets an available pre-defined settings for trigger's configuration. + * + * This function initializes the trigger's configuration structure with an available settings. The default values are: + * @code + * config->targetCommandId = 0U; + * config->delayPower = 0U; + * config->priority = 0U; + * config->channelAFIFOSelect = 0U; + * config->channelBFIFOSelect = 0U; + * config->enableHardwareTrigger = false; + * @endcode + * @param config Pointer to configuration structure. + */ +void LPADC_GetDefaultConvTriggerConfig(lpadc_conv_trigger_config_t *config); + +/*! + * @brief Do software trigger to conversion command. + * + * @param base LPADC peripheral base address. + * @param triggerIdMask Mask value for software trigger indexes, which count from zero. + */ +static inline void LPADC_DoSoftwareTrigger(ADC_Type *base, uint32_t triggerIdMask) +{ + /* Writes to ADCx_SWTRIG register are ignored while ADCx_CTRL[ADCEN] is clear. */ + base->SWTRIG = triggerIdMask; +} + +#if defined(FSL_FEATURE_LPADC_HAS_TCTRL_CMD_SEL) && FSL_FEATURE_LPADC_HAS_TCTRL_CMD_SEL +/*! + * @brief Enable hardware trigger command selection. + * + * This function will use the hardware trigger command from ADC_ETC.The trigger command is then defined + * by ADC hardware trigger command selection field in ADC_ETC- >TRIGx_CHAINy_z_n[CSEL]. + * + * @param base LPADC peripheral base address. + * @param triggerId ID for each trigger. Typically, the available value range is from 0. + * @param enable True to enable or flase to disable. + */ +static inline void LPADC_EnableHardwareTriggerCommandSelection(ADC_Type *base, uint32_t triggerId, bool enable) +{ + if (enable) + { + base->TCTRL[triggerId] |= ADC_TCTRL_CMD_SEL_MASK; + } + else + { + base->TCTRL[triggerId] &= ~ADC_TCTRL_CMD_SEL_MASK; + } +} +#endif /* defined(FSL_FEATURE_LPADC_HAS_TCTRL_CMD_SEL) && FSL_FEATURE_LPADC_HAS_TCTRL_CMD_SEL*/ + +/*! + * @brief Configure conversion command. + + * @note The number of compare value register on different chips is different, that is mean in some chips, some + * command buffers do not have the compare functionality. + * + * @param base LPADC peripheral base address. + * @param commandId ID for command in command buffer. Typically, the available value range is 1 - 15. + * @param config Pointer to configuration structure. See to #lpadc_conv_command_config_t. + */ +void LPADC_SetConvCommandConfig(ADC_Type *base, uint32_t commandId, const lpadc_conv_command_config_t *config); + +/*! + * @brief Gets an available pre-defined settings for conversion command's configuration. + * + * This function initializes the conversion command's configuration structure with an available settings. The default + * values are: + * @code + * config->sampleScaleMode = kLPADC_SampleFullScale; + * config->channelBScaleMode = kLPADC_SampleFullScale; + * config->sampleChannelMode = kLPADC_SampleChannelSingleEndSideA; + * config->channelNumber = 0U; + * config->channelBNumber = 0U; + * config->chainedNextCommandNumber = 0U; + * config->enableAutoChannelIncrement = false; + * config->loopCount = 0U; + * config->hardwareAverageMode = kLPADC_HardwareAverageCount1; + * config->sampleTimeMode = kLPADC_SampleTimeADCK3; + * config->hardwareCompareMode = kLPADC_HardwareCompareDisabled; + * config->hardwareCompareValueHigh = 0U; + * config->hardwareCompareValueLow = 0U; + * config->conversionResolutionMode = kLPADC_ConversionResolutionStandard; + * config->enableWaitTrigger = false; + * config->enableChannelB = false; + * @endcode + * @param config Pointer to configuration structure. + */ +void LPADC_GetDefaultConvCommandConfig(lpadc_conv_command_config_t *config); + +#if defined(FSL_FEATURE_LPADC_HAS_CFG_CALOFS) && FSL_FEATURE_LPADC_HAS_CFG_CALOFS +/*! + * @brief Enable the calibration function. + * + * When CALOFS is set, the ADC is configured to perform a calibration function anytime the ADC executes + * a conversion. Any channel selected is ignored and the value returned in the RESFIFO is a signed value + * between -31 and 31. -32 is not a valid and is never a returned value. Software should copy the lower 6- + * bits of the conversion result stored in the RESFIFO after a completed calibration conversion to the + * OFSTRIM field. The OFSTRIM field is used in normal operation for offset correction. + * + * @param base LPADC peripheral base address. + * @param enable switcher to the calibration function. + */ +void LPADC_EnableCalibration(ADC_Type *base, bool enable); +#if defined(FSL_FEATURE_LPADC_HAS_OFSTRIM) && FSL_FEATURE_LPADC_HAS_OFSTRIM +/*! + * @brief Set proper offset value to trim ADC. + * + * To minimize the offset during normal operation, software should read the conversion result from + * the RESFIFO calibration operation and write the lower 6 bits to the OFSTRIM register. + * + * @param base LPADC peripheral base address. + * @param value Setting offset value. + */ +static inline void LPADC_SetOffsetValue(ADC_Type *base, uint32_t value) +{ + base->OFSTRIM = (value & ADC_OFSTRIM_OFSTRIM_MASK) >> ADC_OFSTRIM_OFSTRIM_SHIFT; +} + +/*! + * @brief Do auto calibration. + * + * Calibration function should be executed before using converter in application. It used the software trigger and a + * dummy conversion, get the offset and write them into the OFSTRIM register. It called some of functional API + * including: -LPADC_EnableCalibration(...) -LPADC_LPADC_SetOffsetValue(...) -LPADC_SetConvCommandConfig(...) + * -LPADC_SetConvTriggerConfig(...) + * + * @param base LPADC peripheral base address. + */ +void LPADC_DoAutoCalibration(ADC_Type *base); +#endif /* defined(FSL_FEATURE_LPADC_HAS_OFSTRIM) && FSL_FEATURE_LPADC_HAS_OFSTRIM */ +#endif /* defined(FSL_FEATURE_LPADC_HAS_CFG_CALOFS) && FSL_FEATURE_LPADC_HAS_CFG_CALOFS */ + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFS) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFS +#if defined(FSL_FEATURE_LPADC_HAS_OFSTRIM) && FSL_FEATURE_LPADC_HAS_OFSTRIM +#if defined(FSL_FEATURE_LPADC_OFSTRIM_COUNT) && (FSL_FEATURE_LPADC_OFSTRIM_COUNT == 1U) +/*! + * @brief Set trim value for offset. + * + * @note For 16-bit conversions, each increment is 1/2 LSB resulting in a programmable offset range of -256 LSB to 255.5 + * LSB; For 12-bit conversions, each increment is 1/32 LSB resulting in a programmable offset range of -16 LSB to + * 15.96875 LSB. + * + * @param base LPADC peripheral base address. + * @param value Offset trim value, is a 10-bit signed value between -512 and 511. + */ +static inline void LPADC_SetOffsetValue(ADC_Type *base, int16_t value) +{ + base->OFSTRIM = ADC_OFSTRIM_OFSTRIM(value); +} + +/*! + * @brief Get trim value of offset. + * + * @param base LPADC peripheral base address. + * @param pValue Pointer to the variable in type of int16_t to store offset value. + */ +static inline void LPADC_GetOffsetValue(ADC_Type *base, int16_t *pValue) +{ + assert(pValue != NULL); + + uint16_t ofstrim = (uint16_t)((base->OFSTRIM & (ADC_OFSTRIM_OFSTRIM_MASK)) >> ADC_OFSTRIM_OFSTRIM_SHIFT); + + if ((ofstrim & ADC_OFSTRIM_OFSTRIM_SIGN) != 0U) + { + /* If the sign bit is set, then set the other MSB. */ + ofstrim |= (uint16_t)(~ADC_OFSTRIM_OFSTRIM_MAX); + } + + *pValue = (int16_t)ofstrim; +} +#elif (defined(FSL_FEATURE_LPADC_OFSTRIM_COUNT) && (FSL_FEATURE_LPADC_OFSTRIM_COUNT == 2U)) +/*! + * @brief Set proper offset value to trim ADC. + * + * Set the offset trim value for offset calibration manually. + * + * @param base LPADC peripheral base address. + * @param valueA Setting offset value A. + * @param valueB Setting offset value B. + * @note In normal adc sequence, the values are automatically calculated by LPADC_EnableOffsetCalibration. + */ +static inline void LPADC_SetOffsetValue(ADC_Type *base, int32_t valueA, int32_t valueB) +{ + base->OFSTRIM = ADC_OFSTRIM_OFSTRIM_A(valueA) | ADC_OFSTRIM_OFSTRIM_B(valueB); +} + +/*! + * @brief Get trim value of offset. + * + * @param base LPADC peripheral base address. + * @param pValueA Pointer to the variable in type of int32_t to store offset A value. + * @param pValueB Pointer to the variable in type of int32_t to store offset B value. + */ +static inline void LPADC_GetOffsetValue(ADC_Type *base, int32_t *pValueA, int32_t *pValueB) +{ + assert(pValueA != NULL); + assert(pValueB != NULL); + + uint32_t ofstrimA = (base->OFSTRIM & (ADC_OFSTRIM_OFSTRIM_A_MASK)) >> ADC_OFSTRIM_OFSTRIM_A_SHIFT; + uint32_t ofstrimB = (base->OFSTRIM & (ADC_OFSTRIM_OFSTRIM_B_MASK)) >> ADC_OFSTRIM_OFSTRIM_B_SHIFT; + + if ((ofstrimA & ADC_OFSTRIM_OFSTRIM_A_SIGN) != 0U) + { + /* If the sign bit is set, then set the other MSB. */ + ofstrimA |= (~ADC_OFSTRIM_OFSTRIM_A_MAX); + } + if ((ofstrimB & ADC_OFSTRIM_OFSTRIM_B_SIGN) != 0U) + { + /* If the sign bit is set, then set the other MSB. */ + ofstrimB |= (~ADC_OFSTRIM_OFSTRIM_B_MAX); + } + + *pValueA = (int32_t)ofstrimA; + *pValueB = (int32_t)ofstrimB; +} +#endif /* defined(FSL_FEATURE_LPADC_OFSTRIM_COUNT) */ +#else /* !(defined(FSL_FEATURE_LPADC_HAS_OFSTRIM) && FSL_FEATURE_LPADC_HAS_OFSTRIM) */ +/*! + * @brief Set proper offset value to trim 12 bit ADC conversion. + * + * Set the offset trim value for offset calibration manually. + * + * @param base LPADC peripheral base address. + * @param valueA Setting offset value A. + * @param valueB Setting offset value B. + * @note In normal adc sequence, the values are automatically calculated by LPADC_EnableOffsetCalibration. + */ +static inline void LPADC_SetOffset12BitValue(ADC_Type *base, uint32_t valueA, uint32_t valueB) +{ + base->OFSTRIM12 = ADC_OFSTRIM12_OFSTRIM_A(valueA) | ADC_OFSTRIM12_OFSTRIM_A(valueB); +} + +/*! + * @brief Set proper offset value to trim 16 bit ADC conversion. + * + * Set the offset trim value for offset calibration manually. + * + * @param base LPADC peripheral base address. + * @param valueA Setting offset value A. + * @param valueB Setting offset value B. + * @note In normal adc sequence, the values are automatically calculated by LPADC_EnableOffsetCalibration. + */ +static inline void LPADC_SetOffset16BitValue(ADC_Type *base, uint32_t valueA, uint32_t valueB) +{ + base->OFSTRIM16 = ADC_OFSTRIM16_OFSTRIM_A(valueA) | ADC_OFSTRIM16_OFSTRIM_B(valueB); +} +#endif /* FSL_FEATURE_LPADC_HAS_OFSTRIM */ + +/*! + * @brief Enable the offset calibration function. + * + * @param base LPADC peripheral base address. + * @param enable switcher to the calibration function. + */ +static inline void LPADC_EnableOffsetCalibration(ADC_Type *base, bool enable) +{ + if (enable) + { + base->CTRL |= ADC_CTRL_CALOFS_MASK; + } + else + { + base->CTRL &= ~ADC_CTRL_CALOFS_MASK; + } +} +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE +/*! + * @brief Set offset calibration mode. + * + * @param base LPADC peripheral base address. + * @param mode set offset calibration mode.see to #lpadc_offset_calibration_mode_t . + */ +static inline void LPADC_SetOffsetCalibrationMode(ADC_Type *base, lpadc_offset_calibration_mode_t mode) +{ + base->CTRL = (base->CTRL & ~ADC_CTRL_CALOFSMODE_MASK) | ADC_CTRL_CALOFSMODE(mode); +} + +#endif /* defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE */ + +/*! + * @brief Do offset calibration. + * + * @param base LPADC peripheral base address. + */ +void LPADC_DoOffsetCalibration(ADC_Type *base); + +#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ +/*! + * @brief Do auto calibration. + * + * @param base LPADC peripheral base address. + */ +void LPADC_DoAutoCalibration(ADC_Type *base); + +/*! + * @brief Prepare auto calibration, LPADC_FinishAutoCalibration has to be called before using the LPADC. + * LPADC_DoAutoCalibration has been split in two API to avoid to be stuck too long in the function. + * + * @param base LPADC peripheral base address. + */ +void LPADC_PrepareAutoCalibration(ADC_Type *base); + +/*! + * @brief Finish auto calibration start with LPADC_PrepareAutoCalibration. + * + * @param base LPADC peripheral base address. + */ +void LPADC_FinishAutoCalibration(ADC_Type *base); + +#endif /* defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ */ + +/*! + * @brief Get calibration value into the memory which is defined by invoker. + * + * @note Please note the ADC will be disabled temporary. + * @note This function should be used after finish calibration. + * + * @param base LPADC peripheral base address. + * @param ptrCalibrationValue Pointer to @ref lpadc_calibration_value_t structure, this memory block should be always + * powered on even in low power modes. + */ +void LPADC_GetCalibrationValue(ADC_Type *base, lpadc_calibration_value_t *ptrCalibrationValue); + +/*! + * @brief Set calibration value into ADC calibration registers. + * + * @note Please note the ADC will be disabled temporary. + * + * @param base LPADC peripheral base address. + * @param ptrCalibrationValue Pointer to @ref lpadc_calibration_value_t structure which contains ADC's calibration + * value. + */ +void LPADC_SetCalibrationValue(ADC_Type *base, const lpadc_calibration_value_t *ptrCalibrationValue); + +#endif /* defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFS) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFS */ + +#if ((defined(FSL_FEATURE_LPADC_HAS_CTRL_CALHS)) && FSL_FEATURE_LPADC_HAS_CTRL_CALHS) +/*! + * @brief Request high speed mode trim calculation. + * + * @param base LPADC peripheral base address. + */ +static inline void LPADC_RequestHighSpeedModeTrim(ADC_Type *base) +{ + base->CTRL |= ADC_CTRL_CALHS_MASK; +} + +/*! + * @brief Get high speed mode trim value, the result is a 5-bit signed value between -16 and 15. + * + * @note The high speed mode trim value is used to minimize offset for high speed conversion. + * + * @param base LPADC peripheral base address. + * @return The calculated high speed mode trim value. + */ +static inline int8_t LPADC_GetHighSpeedTrimValue(ADC_Type *base) +{ + return (int8_t)(base->HSTRIM); +} + +/*! + * @brief Set high speed mode trim value. + * + * @note If is possible to set the trim value manually, but it is recommended to use the LPADC_RequestHighSpeedModeTrim. + * + * @param base LPADC peripheral base address. + * @param trimValue The trim value to be set. + */ +static inline void LPADC_SetHighSpeedTrimValue(ADC_Type *base, int8_t trimValue) +{ + base->HSTRIM = ADC_HSTRIM_HSTRIM(trimValue); +} + +/*! + * @brief Enable/disable high speed conversion mode, if enabled conversions complete 2 or 3 ADCK cycles sooner compared + * to conversion cycle counts when high speed mode is disabled. + * + * @param base LPADC peripheral base address. + * @param enable Used to enable/disable high speed conversion mode: + * - \b true Enable high speed conversion mode; + * - \b false Disable high speed conversion mode. + */ +static inline void LPADC_EnableHighSpeedConversionMode(ADC_Type *base, bool enable) +{ + if (enable) + { + base->CFG2 |= ADC_CFG2_HS_MASK; + } + else + { + base->CFG2 &= ~ADC_CFG2_HS_MASK; + } +} + +/*! + * @brief Enable/disable an additional ADCK cycle to conversion. + * + * @param base LPADC peripheral base address. + * @param enable Used to enable/disable an additional ADCK cycle to conversion: + * - \b true Enable an additional ADCK cycle to conversion; + * - \b false Disable an additional ADCK cycle to conversion. + */ +static inline void LPADC_EnableExtraCycle(ADC_Type *base, bool enable) +{ + if (enable) + { + base->CFG2 |= ADC_CFG2_HSEXTRA_MASK; + } + else + { + base->CFG2 &= ~ADC_CFG2_HSEXTRA_MASK; + } +} + +/*! + * @brief Set tune value which provides some variability in how many cycles are needed to complete a conversion. + * + * @param base LPADC peripheral base address. + * @param tuneValue The tune value to be set, please refer to @ref lpadc_tune_value_t. + */ +static inline void LPADC_SetTuneValue(ADC_Type *base, lpadc_tune_value_t tuneValue) +{ + base->CFG2 = (base->CFG2 & ~ADC_CFG2_TUNE_MASK) | ADC_CFG2_TUNE(tuneValue); +} + +/*! + * @brief Get tune value which provides some variability in how many cycles are needed to complete a conversion. + * + * @param base LPADC peripheral base address. + * @return The tune value, please refer to @ref lpadc_tune_value_t. + */ +static inline lpadc_tune_value_t LPADC_GetTuneValue(ADC_Type *base) +{ + return (lpadc_tune_value_t)((base->CFG2 & ADC_CFG2_TUNE_MASK) >> ADC_CFG2_TUNE_SHIFT); +} +#endif /* ((defined(FSL_FEATURE_LPADC_HAS_CTRL_CALHS)) && FSL_FEATURE_LPADC_HAS_CTRL_CALHS) */ + +#if (defined(FSL_FEATURE_LPADC_HAS_CFG2_JLEFT) && FSL_FEATURE_LPADC_HAS_CFG2_JLEFT) +/*! + * @brief Enable/disable left-justify format in 12-bit single-end mode. + * + * @param base LPADC peripheral base address. + * @param enable Used to enable/disable left-justify format in 12-bit single-end mode: + * - \b true Enable left-justify format in 12-bit single-end mode; + * - \b false Disable left-justify format in 12-bit single-end mode. + */ +static inline void LPADC_EnableJustifiedLeft(ADC_Type *base, bool enable) +{ + if (enable) + { + base->CFG2 |= ADC_CFG2_JLEFT_MASK; + } + else + { + base->CFG2 &= ~ADC_CFG2_JLEFT_MASK; + } +} +#endif /* (defined(FSL_FEATURE_LPADC_HAS_CFG2_JLEFT) && FSL_FEATURE_LPADC_HAS_CFG2_JLEFT) */ + +/*! @} */ + +#if defined(__cplusplus) +} +#endif +/*! + * @} + */ +#endif /* FSL_LPADC_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpcmp.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpcmp.c new file mode 100644 index 00000000000..4ed2d921db9 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpcmp.c @@ -0,0 +1,372 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2019, 2023 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_lpcmp.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpcmp" +#endif + +#if defined(LPCMP_RSTS) +#define LPCMP_RESETS_ARRAY LPCMP_RSTS +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +#if defined(LPCMP_CLOCKS) +/*! + * @brief Get instance number for LPCMP module. + * + * @param base LPCMP peripheral base address + */ +static uint32_t LPCMP_GetInstance(LPCMP_Type *base); +#endif /* LPCMP_CLOCKS */ + +/******************************************************************************* + * Variables + ******************************************************************************/ +#if defined(LPCMP_CLOCKS) +/*! @brief Pointers to LPCMP bases for each instance. */ +static LPCMP_Type *const s_lpcmpBases[] = LPCMP_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to LPCMP clocks for each instance. */ +static const clock_ip_name_t s_lpcmpClocks[] = LPCMP_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +#endif /* LPCMP_CLOCKS */ + +#if defined(LPCMP_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_lpcmpResets[] = LPCMP_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Codes + ******************************************************************************/ +#if defined(LPCMP_CLOCKS) +static uint32_t LPCMP_GetInstance(LPCMP_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + /* + * $Branch Coverage Justification$ + * (instance >= ARRAY_SIZE(s_lpcmpBases)) not covered. The peripheral base + * address is always valid and checked by assert. + */ + for (instance = 0; instance < ARRAY_SIZE(s_lpcmpBases); instance++) + { + /* + * $Branch Coverage Justification$ + * (s_lpcmpBases[instance] != base) not covered. The peripheral base + * address is always valid and checked by assert. + */ + if (s_lpcmpBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_lpcmpBases)); + + return instance; +} +#endif /* LPCMP_CLOCKS */ + +/*! + * brief Initialize the LPCMP + * + * This function initializes the LPCMP module. The operations included are: + * - Enabling the clock for LPCMP module. + * - Configuring the comparator. + * - Enabling the LPCMP module. + * Note: For some devices, multiple LPCMP instance share the same clock gate. In this case, to enable the clock for + * any instance enables all the LPCMPs. Check the chip reference manual for the clock assignment of the LPCMP. + * + * param base LPCMP peripheral base address. + * param config Pointer to "lpcmp_config_t" structure. + */ +void LPCMP_Init(LPCMP_Type *base, const lpcmp_config_t *config) +{ + assert(config != NULL); + + uint32_t tmp32; + +#if defined(LPCMP_CLOCKS) +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable the clock. */ + CLOCK_EnableClock(s_lpcmpClocks[LPCMP_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +#endif /* LPCMP_CLOCKS */ + +#if defined(LPCMP_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_lpcmpResets[LPCMP_GetInstance(base)]); +#endif + + /* Configure. */ + LPCMP_Enable(base, false); + +#if !(defined(FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) && FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) + /* CCR0 register. */ +#if defined(FSL_FEATURE_LPCMP_INSTANCE_SUPPORT_CCR0_CMP_STOP_ENn) + if (1U == FSL_FEATURE_LPCMP_INSTANCE_SUPPORT_CCR0_CMP_STOP_ENn(base)) +#endif /* FSL_FEATURE_LPCMP_INSTANCE_SUPPORT_CCR0_CMP_STOP_ENn */ + { + if (config->enableStopMode) + { + base->CCR0 |= LPCMP_CCR0_CMP_STOP_EN_MASK; + } + else + { + base->CCR0 &= ~LPCMP_CCR0_CMP_STOP_EN_MASK; + } + } +#endif /* !(defined(FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) && FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) */ + + /* CCR1 register. */ + tmp32 = (base->CCR1 & (~(LPCMP_CCR1_COUT_PEN_MASK | LPCMP_CCR1_COUT_SEL_MASK | LPCMP_CCR1_COUT_INV_MASK +#if defined(FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL) && FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL + | LPCMP_CCR1_FUNC_CLK_SEL_MASK +#endif /* FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL */ + ))); + + if (config->enableOutputPin) + { + tmp32 |= LPCMP_CCR1_COUT_PEN_MASK; + } + if (config->useUnfilteredOutput) + { + tmp32 |= LPCMP_CCR1_COUT_SEL_MASK; + } + if (config->enableInvertOutput) + { + tmp32 |= LPCMP_CCR1_COUT_INV_MASK; + } +#if defined(FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL) && FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL + tmp32 |= LPCMP_CCR1_FUNC_CLK_SEL(config->functionalSourceClock); +#endif /* FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL */ + base->CCR1 = tmp32; + /* CCR2 register. */ + tmp32 = base->CCR2 & ~(LPCMP_CCR2_HYSTCTR_MASK | LPCMP_CCR2_CMP_NPMD_MASK | LPCMP_CCR2_CMP_HPMD_MASK); + tmp32 |= LPCMP_CCR2_HYSTCTR(config->hysteresisMode); + tmp32 |= ((uint32_t)(config->powerMode) << LPCMP_CCR2_CMP_HPMD_SHIFT); + base->CCR2 = tmp32; + + LPCMP_Enable(base, true); /* Enable the LPCMP module. */ +} + +/*! + * brief De-initializes the LPCMP module. + * + * This function de-initializes the LPCMP module. The operations included are: + * - Disabling the LPCMP module. + * - Disabling the clock for LPCMP module. + * + * This function disables the clock for the LPCMP. + * Note: For some devices, multiple LPCMP instance shares the same clock gate. In this case, before disabling the + * clock for the LPCMP, ensure that all the LPCMP instances are not used. + * + * param base LPCMP peripheral base address. + */ +void LPCMP_Deinit(LPCMP_Type *base) +{ + /* Disable the LPCMP module. */ + LPCMP_Enable(base, false); +#if defined(LPCMP_CLOCKS) +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Disable the clock. */ + CLOCK_DisableClock(s_lpcmpClocks[LPCMP_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +#endif /* LPCMP_CLOCKS */ +} + +/*! + * brief Gets an available pre-defined settings for the comparator's configuration. + * + * This function initializes the comparator configuration structure to these default values: + * code + * config->enableStopMode = false; + * config->enableOutputPin = false; + * config->useUnfilteredOutput = false; + * config->enableInvertOutput = false; + * config->hysteresisMode = kLPCMP_HysteresisLevel0; + * config->powerMode = kLPCMP_LowSpeedPowerMode; + * config->functionalSourceClock = kLPCMP_FunctionalClockSource0; + * endcode + * param config Pointer to "lpcmp_config_t" structure. + */ +void LPCMP_GetDefaultConfig(lpcmp_config_t *config) +{ + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); +#if !(defined(FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) && FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) + config->enableStopMode = false; +#endif /* !(defined(FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) && FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) */ + config->enableOutputPin = false; + config->useUnfilteredOutput = false; + config->enableInvertOutput = false; + config->hysteresisMode = kLPCMP_HysteresisLevel0; + config->powerMode = kLPCMP_LowSpeedPowerMode; +#if defined(FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL) && FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL + config->functionalSourceClock = kLPCMP_FunctionalClockSource0; +#endif /* FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL */ +} + +/*! + * brief Select the input channels for LPCMP. This function determines which input + * is selected for the negative and positive mux. + * + * param base LPCMP peripheral base address. + * param positiveChannel Positive side input channel number. + * param negativeChannel Negative side input channel number. + */ +void LPCMP_SetInputChannels(LPCMP_Type *base, uint32_t positiveChannel, uint32_t negativeChannel) +{ + uint32_t tmp32; + + tmp32 = base->CCR2 & ~(LPCMP_CCR2_PSEL_MASK | LPCMP_CCR2_MSEL_MASK); + tmp32 |= LPCMP_CCR2_PSEL(positiveChannel) | LPCMP_CCR2_MSEL(negativeChannel); + base->CCR2 = tmp32; +} + +/*! + * brief Configures the filter. + * + * param base LPCMP peripheral base address. + * param config Pointer to "lpcmp_filter_config_t" structure. + */ +void LPCMP_SetFilterConfig(LPCMP_Type *base, const lpcmp_filter_config_t *config) +{ + assert(config != NULL); + + uint32_t tmp32; + + tmp32 = base->CCR1 & ~(LPCMP_CCR1_FILT_PER_MASK | LPCMP_CCR1_FILT_CNT_MASK | LPCMP_CCR1_SAMPLE_EN_MASK); + if (config->enableSample) + { + tmp32 |= LPCMP_CCR1_SAMPLE_EN_MASK; + } + tmp32 |= LPCMP_CCR1_FILT_PER(config->filterSamplePeriod) | LPCMP_CCR1_FILT_CNT(config->filterSampleCount); + base->CCR1 = tmp32; +} + +/*! + * brief Configure the internal DAC module. + * + * param base LPCMP peripheral base address. + * param config Pointer to "lpcmp_dac_config_t" structure. If config is "NULL", disable internal DAC. + */ +void LPCMP_SetDACConfig(LPCMP_Type *base, const lpcmp_dac_config_t *config) +{ + uint32_t tmp32; + if (config == NULL) + { + tmp32 = 0U; /* Disable internal DAC. */ + } + else + { + tmp32 = LPCMP_DCR_VRSEL(config->referenceVoltageSource) | LPCMP_DCR_DAC_DATA(config->DACValue); + if (config->enableLowPowerMode) + { + tmp32 |= LPCMP_DCR_DAC_HPMD_MASK; + } + tmp32 |= LPCMP_DCR_DAC_EN_MASK; + } + base->DCR = tmp32; +} + +#if defined(FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL) && FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL +/*! + * @brief Configure the window control, users can use this API to implement operations on the window, + * such as inverting the window signal, setting the window closing event(only valid in windowing mode), + * and setting the COUTA signal after the window is closed(only valid in windowing mode). + * + * @param base LPCMP peripheral base address. + * @param config Pointer "lpcmp_window_control_config_t" structure. + */ +void LPCMP_SetWindowControl(LPCMP_Type *base, const lpcmp_window_control_config_t *config) +{ + assert(config != NULL); + + uint32_t tmp32 = 0UL; + + tmp32 = (base->CCR1 & (~(LPCMP_CCR1_COUTA_CFG_MASK | LPCMP_CCR1_EVT_SEL_CFG_MASK | LPCMP_CCR1_WINDOW_INV_MASK))); + + if (config->enableInvertWindowSignal) + { + tmp32 |= LPCMP_CCR1_WINDOW_INV_MASK; + } + + /* Set COUT event, which can close the active window in window mode. */ + tmp32 |= LPCMP_CCR1_EVT_SEL_CFG(config->closeWindowEvent); + + /* Set the COUTA signal value when the window is closed. */ + tmp32 |= LPCMP_CCR1_COUTA_CFG(config->COUTASignal); + + base->CCR1 = tmp32; +} +#endif /* FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL */ + +#if defined(FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE) && FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE +/*! + * @brief Configure the roundrobin mode. + * + * @param base LPCMP peripheral base address. + * @param config Pointer "lpcmp_roundrobin_config_t" structure. + */ +void LPCMP_SetRoundRobinConfig(LPCMP_Type *base, const lpcmp_roundrobin_config_t *config) +{ + assert(config != NULL); + + uint32_t tmp32 = 0UL; + + /* LPCMPx_RRCR0 register, Configuration options for the round-robin operation. */ + tmp32 = (base->RRCR0 & + (~(LPCMP_RRCR0_RR_TRG_SEL_MASK | LPCMP_RRCR0_RR_NSAM_MASK | LPCMP_RRCR0_RR_CLK_SEL_MASK | + LPCMP_RRCR0_RR_INITMOD_MASK | LPCMP_RRCR0_RR_SAMPLE_CNT_MASK | LPCMP_RRCR0_RR_SAMPLE_THRESHOLD_MASK))); + + tmp32 |= + (LPCMP_RRCR0_RR_TRG_SEL(config->roundrobinTriggerSource) | LPCMP_RRCR0_RR_NSAM(config->sampleClockNumbers) | + LPCMP_RRCR0_RR_CLK_SEL(config->roundrobinClockSource) | LPCMP_RRCR0_RR_INITMOD(config->initDelayModules) | + LPCMP_RRCR0_RR_SAMPLE_CNT(config->channelSampleNumbers) | + LPCMP_RRCR0_RR_SAMPLE_THRESHOLD(config->sampleTimeThreshhold)); + + base->RRCR0 = tmp32; + + /* LPCMPx_RRCR1 register, Configure the fix port, fix channel and checker channel. */ + tmp32 = + (base->RRCR1 & (~(LPCMP_RRCR1_FIXP_MASK | LPCMP_RRCR1_FIXCH_MASK | (0xFFUL << LPCMP_RRCR1_RR_CH0EN_SHIFT)))); + tmp32 |= (LPCMP_RRCR1_FIXP(config->fixedMuxPort) | LPCMP_RRCR1_FIXCH(config->fixedChannel) | + ((uint32_t)(config->checkerChannelMask) << LPCMP_RRCR1_RR_CH0EN_SHIFT)); + + base->RRCR1 = tmp32; +} + +/*! + * brief Configure the roundrobin internal timer reload value. + * + * param base LPCMP peripheral base address. + * param value RoundRobin internal timer reload value, allowed range:0x0UL-0xFFFFFFFUL. + */ +void LPCMP_SetRoundRobinInternalTimer(LPCMP_Type *base, uint32_t value) +{ + uint32_t tmp32 = 0UL; + + tmp32 = (base->RRCR2 & (~LPCMP_RRCR2_RR_TIMER_RELOAD_MASK)); + tmp32 |= LPCMP_RRCR2_RR_TIMER_RELOAD(value); + + base->RRCR2 = tmp32; +} + +#endif /* FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpcmp.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpcmp.h new file mode 100644 index 00000000000..5105c98fcc1 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpcmp.h @@ -0,0 +1,585 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020, 2023-2024 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_LPCMP_H_ +#define FSL_LPCMP_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lpcmp + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @name Driver version */ +/*! @{ */ +/*! @brief LPCMP driver version 2.1.3. */ +#define FSL_LPCMP_DRIVER_VERSION (MAKE_VERSION(2, 1, 3)) +/*! @} */ + +#define LPCMP_CCR1_COUTA_CFG_MASK (LPCMP_CCR1_COUTA_OWEN_MASK | LPCMP_CCR1_COUTA_OW_MASK) +#define LPCMP_CCR1_COUTA_CFG_SHIFT LPCMP_CCR1_COUTA_OWEN_SHIFT +#define LPCMP_CCR1_COUTA_CFG(x) \ + (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_COUTA_CFG_SHIFT)) & LPCMP_CCR1_COUTA_CFG_MASK) + +#define LPCMP_CCR1_EVT_SEL_CFG_MASK (LPCMP_CCR1_EVT_SEL_MASK | LPCMP_CCR1_WINDOW_CLS_MASK) +#define LPCMP_CCR1_EVT_SEL_CFG_SHIFT LPCMP_CCR1_WINDOW_CLS_SHIFT +#define LPCMP_CCR1_EVT_SEL_CFG(x) \ + (((uint32_t)(((uint32_t)(x)) << LPCMP_CCR1_EVT_SEL_CFG_SHIFT)) & LPCMP_CCR1_EVT_SEL_CFG_MASK) + +/*! + * @brief LPCMP status falgs mask. + */ +enum _lpcmp_status_flags +{ + kLPCMP_OutputRisingEventFlag = LPCMP_CSR_CFR_MASK, /*!< Rising-edge on the comparison output has occurred. */ + kLPCMP_OutputFallingEventFlag = LPCMP_CSR_CFF_MASK, /*!< Falling-edge on the comparison output has occurred. */ +#if defined(FSL_FEATURE_LPCMP_HAS_CSR_RRF) && FSL_FEATURE_LPCMP_HAS_CSR_RRF + kLPCMP_OutputRoundRobinEventFlag = LPCMP_CSR_RRF_MASK, /*!< Detects when any channel's last comparison result is + different from the pre-set value in trigger mode. */ +#endif /* FSL_FEATURE_LPCMP_HAS_CSR_RRF */ + kLPCMP_OutputAssertEventFlag = LPCMP_CSR_COUT_MASK, /*!< Return the current value of the analog comparator output. + The flag does not support W1C. */ +}; + +/*! + * @brief LPCMP interrupt enable/disable mask. + */ +enum _lpcmp_interrupt_enable +{ + kLPCMP_OutputRisingInterruptEnable = LPCMP_IER_CFR_IE_MASK, /*!< Comparator interrupt enable rising. */ + kLPCMP_OutputFallingInterruptEnable = LPCMP_IER_CFF_IE_MASK, /*!< Comparator interrupt enable falling. */ +#if defined(FSL_FEATURE_LPCMP_HAS_IER_RRF_IE) && FSL_FEATURE_LPCMP_HAS_IER_RRF_IE + kLPCMP_RoundRobinInterruptEnable = LPCMP_IER_RRF_IE_MASK, /*!< Comparator round robin mode interrupt + occurred when the comparison result changes for a given channel. */ +#endif /* FSL_FEATURE_LPCMP_HAS_IER_RRF_IE */ +}; + +/*! + * @brief LPCMP hysteresis mode. See chip data sheet to get the actual hystersis + * value with each level + */ +typedef enum _lpcmp_hysteresis_mode +{ + kLPCMP_HysteresisLevel0 = 0U, /*!< The hard block output has level 0 hysteresis internally. */ + kLPCMP_HysteresisLevel1 = 1U, /*!< The hard block output has level 1 hysteresis internally. */ + kLPCMP_HysteresisLevel2 = 2U, /*!< The hard block output has level 2 hysteresis internally. */ + kLPCMP_HysteresisLevel3 = 3U, /*!< The hard block output has level 3 hysteresis internally. */ +} lpcmp_hysteresis_mode_t; + +/*! + * @brief LPCMP nano mode. + */ +typedef enum _lpcmp_power_mode +{ + kLPCMP_LowSpeedPowerMode = 0U, /*!< Low speed comparison mode is selected. */ + kLPCMP_HighSpeedPowerMode = 1U, /*!< High speed comparison mode is selected. */ + kLPCMP_NanoPowerMode = 2U, /*!< Nano power comparator is enabled. */ +} lpcmp_power_mode_t; + +/*! + * @brief Internal DAC reference voltage source. + */ +typedef enum _lpcmp_dac_reference_voltage_source +{ + kLPCMP_VrefSourceVin1 = 0U, /*!< vrefh_int is selected as resistor ladder network supply reference Vin. */ + kLPCMP_VrefSourceVin2 = 1U, /*!< vrefh_ext is selected as resistor ladder network supply reference Vin. */ +} lpcmp_dac_reference_voltage_source_t; + +#if defined(FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL) && FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL +/*! + * @brief LPCMP functional mode clock source selection. + * + * Note: In different devices, the functional mode clock source selection is different, + * please refer to specific device Reference Manual for details. + */ +typedef enum _lpcmp_functional_source_clock +{ + kLPCMP_FunctionalClockSource0 = 0U, /*!< Select functional mode clock source0. */ + kLPCMP_FunctionalClockSource1 = 1U, /*!< Select functional mode clock source1. */ + kLPCMP_FunctionalClockSource2 = 2U, /*!< Select functional mode clock source2. */ + kLPCMP_FunctionalClockSource3 = 3U, /*!< Select functional mode clock source3. */ +} lpcmp_functional_source_clock_t; +#endif /* FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL */ + +#if defined(FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL) && FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL +/*! + * @brief Set the COUTA signal value when the window is closed. + */ +typedef enum _lpcmp_couta_signal +{ + kLPCMP_COUTASignalNoSet = 0U, /*!< NO set the COUTA signal value when the window is closed. */ + kLPCMP_COUTASignalLow = 1U, /*!< Set COUTA signal low(0) when the window is closed. */ + kLPCMP_COUTASignalHigh = 3U, /*!< Set COUTA signal high(1) when the window is closed. */ +} lpcmp_couta_signal_t; + +/*! + * @brief Set COUT event, which can close the active window in window mode. + */ +typedef enum _lpcmp_close_window_event +{ + kLPCMP_CLoseWindowEventNoSet = 0U, /*!< No Set COUT event, which can close the active window in window mode. */ + kLPCMP_CloseWindowEventRisingEdge = 1U, /*!< Set rising edge COUT signal as COUT event. */ + kLPCMP_CloseWindowEventFallingEdge = 3U, /*!< Set falling edge COUT signal as COUT event. */ + kLPCMP_CLoseWindowEventBothEdge = 5U, /*!< Set both rising and falling edge COUT signal as COUT event. */ +} lpcmp_close_window_event_t; +#endif /* FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL */ + +#if defined(FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE) && FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE +/*! + * @brief LPCMP round robin mode fixed mux port. + */ +typedef enum _lpcmp_roundrobin_fixedmuxport +{ + kLPCMP_FixedPlusMuxPort = 0U, /*!< Fixed plus mux port. */ + kLPCMP_FixedMinusMuxPort = 1U, /*!< Fixed minus mux port. */ +} lpcmp_roundrobin_fixedmuxport_t; + +/*! + * @brief LPCMP round robin mode clock source selection. + * + * Note: In different devices,the round robin mode clock source selection is different, + * please refer to the specific device Reference Manual for details. + */ +typedef enum _lpcmp_roundrobin_clock_source +{ + kLPCMP_RoundRobinClockSource0 = 0U, /*!< Select roundrobin mode clock source0. */ + kLPCMP_RoundRobinClockSource1 = 1U, /*!< Select roundrobin mode clock source1. */ + kLPCMP_RoundRobinClockSource2 = 2U, /*!< Select roundrobin mode clock source2. */ + kLPCMP_RoundRobinClockSource3 = 3U, /*!< Select roundrobin mode clock source3. */ +} lpcmp_roundrobin_clock_source_t; + +/*! + * @brief LPCMP round robin mode trigger source. + */ +typedef enum _lpcmp_roundrobin_trigger_source +{ + kLPCMP_TriggerSourceExternally = 0U, /*!< Select external trigger source. */ + kLPCMP_TriggerSourceInternally = 1U, /*!< Select internal trigger source. */ +} lpcmp_roundrobin_trigger_source_t; +#endif /* FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE */ + +/*! + * @brief Configure the filter. + */ +typedef struct _lpcmp_filter_config +{ + bool enableSample; /*!< Decide whether to use the external SAMPLE as a sampling clock input. */ + uint8_t filterSampleCount; /*!< Filter Sample Count. Available range is 1-7; 0 disables the filter. */ + uint8_t filterSamplePeriod; /*!< Filter Sample Period. The divider to the bus clock. Available range is 0-255. The + sampling clock must be at least 4 times slower than the system clock to the comparator. + So if enableSample is "false", filterSamplePeriod should be set greater than 4.*/ +} lpcmp_filter_config_t; + +/*! + * @brief configure the internal DAC. + */ +typedef struct _lpcmp_dac_config +{ + bool enableLowPowerMode; /*!< Decide whether to enable DAC low power mode. */ + lpcmp_dac_reference_voltage_source_t referenceVoltageSource; /*!< Internal DAC supply voltage reference source. */ + uint8_t DACValue; /*!< Value for the DAC Output Voltage. Different devices has different available range, + for specific values, please refer to the reference manual.*/ +} lpcmp_dac_config_t; + +/*! + * @brief Configures the comparator. + */ +typedef struct _lpcmp_config +{ +#if !(defined(FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) && FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) + bool enableStopMode; /*!< Decide whether to enable the comparator when in STOP modes. */ +#endif /* !(defined(FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) && FSL_FEATURE_LPCMP_HAS_NO_CCR0_CMP_STOP_EN) */ + + bool enableOutputPin; /*!< Decide whether to enable the comparator is available in selected pin. */ + bool useUnfilteredOutput; /*!< Decide whether to use unfiltered output. */ + bool enableInvertOutput; /*!< Decide whether to inverts the comparator output. */ + lpcmp_hysteresis_mode_t hysteresisMode; /*!< LPCMP hysteresis mode. */ + lpcmp_power_mode_t powerMode; /*!< LPCMP power mode. */ +#if defined(FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL) && FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL + lpcmp_functional_source_clock_t functionalSourceClock; /*!< Select LPCMP functional mode clock source. */ +#endif /* FSL_FEATURE_LPCMP_HAS_CCR1_FUNC_CLK_SEL */ +} lpcmp_config_t; + +#if defined(FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL) && FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL +/*! + * @brief Configure the window mode control. + */ +typedef struct _lpcmp_window_control_config +{ + bool enableInvertWindowSignal; /*!< True: enable invert window signal, False: disable invert window signal. */ + lpcmp_couta_signal_t COUTASignal; /*!< Decide whether to define the COUTA signal value when the window is closed. */ + lpcmp_close_window_event_t closeWindowEvent; /*!< Decide whether to select COUT event signal edge defines + a COUT event to close window. */ +} lpcmp_window_control_config_t; +#endif /* FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL */ + +#if defined(FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE) && FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE +/*! + * @brief Configure the round robin mode. + */ +typedef struct _lpcmp_roundrobin_config +{ + uint8_t initDelayModules; /*!< Comparator and DAC initialization delay modulus, See Reference Manual and DataSheet + for specific value. */ + uint8_t sampleClockNumbers; /*!< Specify the number of the round robin clock cycles(0~3) to wait after scanning the + active channel before sampling the channel's comparison result. */ + uint8_t channelSampleNumbers; /*!< Specify the number of samples for one channel, note that channelSampleNumbers + must not smaller than sampleTimeThreshhold. */ + uint8_t sampleTimeThreshhold; /*!< Specify that for one channel, when (sampleTimeThreshhold + 1) sample results are + "1",the final result is "1", otherwise the final result is "0", note that the + sampleTimeThreshhold must not be larger than channelSampleNumbers. */ + lpcmp_roundrobin_clock_source_t roundrobinClockSource; /*!< Decide which clock source to + choose in round robin mode. */ + lpcmp_roundrobin_trigger_source_t roundrobinTriggerSource; /*!< Decide which trigger source to + choose in round robin mode. */ + lpcmp_roundrobin_fixedmuxport_t fixedMuxPort; /*!< Decide which mux port to choose as + fixed channel in round robin mode. */ + uint8_t fixedChannel; /*!< Indicate which channel of the fixed mux port is used in round robin mode. */ + uint8_t checkerChannelMask; /*!< Indicate which channel of the non-fixed mux port to check its voltage value in + round robin mode, for example, if checkerChannelMask set to 0x11U means select + channel 0 and channel 4 as checker channel.*/ +} lpcmp_roundrobin_config_t; +#endif /* FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and configuration + * @{ + */ + +/*! + * @brief Initialize the LPCMP + * + * This function initializes the LPCMP module. The operations included are: + * - Enabling the clock for LPCMP module. + * - Configuring the comparator. + * - Enabling the LPCMP module. + * Note: For some devices, multiple LPCMP instance share the same clock gate. In this case, to enable the clock for + * any instance enables all the LPCMPs. Check the chip reference manual for the clock assignment of the LPCMP. + * + * @param base LPCMP peripheral base address. + * @param config Pointer to "lpcmp_config_t" structure. + */ +void LPCMP_Init(LPCMP_Type *base, const lpcmp_config_t *config); + +/*! + * @brief De-initializes the LPCMP module. + * + * This function de-initializes the LPCMP module. The operations included are: + * - Disabling the LPCMP module. + * - Disabling the clock for LPCMP module. + * + * This function disables the clock for the LPCMP. + * Note: For some devices, multiple LPCMP instance shares the same clock gate. In this case, before disabling the + * clock for the LPCMP, ensure that all the LPCMP instances are not used. + * + * @param base LPCMP peripheral base address. + */ +void LPCMP_Deinit(LPCMP_Type *base); + +/*! + * @brief Gets an available pre-defined settings for the comparator's configuration. + * + * This function initializes the comparator configuration structure to these default values: + * @code + * config->enableStopMode = false; + * config->enableOutputPin = false; + * config->useUnfilteredOutput = false; + * config->enableInvertOutput = false; + * config->hysteresisMode = kLPCMP_HysteresisLevel0; + * config->powerMode = kLPCMP_LowSpeedPowerMode; + * config->functionalSourceClock = kLPCMP_FunctionalClockSource0; + * @endcode + * @param config Pointer to "lpcmp_config_t" structure. + */ +void LPCMP_GetDefaultConfig(lpcmp_config_t *config); + +/*! + * @brief Enable/Disable LPCMP module. + * + * @param base LPCMP peripheral base address. + * @param enable "true" means enable the module, and "false" means disable the module. + */ +static inline void LPCMP_Enable(LPCMP_Type *base, bool enable) +{ + if (enable) + { + base->CCR0 |= LPCMP_CCR0_CMP_EN_MASK; + } + else + { + base->CCR0 &= ~LPCMP_CCR0_CMP_EN_MASK; + } +} + +/*! + * @brief Select the input channels for LPCMP. This function determines which input + * is selected for the negative and positive mux. + * + * @param base LPCMP peripheral base address. + * @param positiveChannel Positive side input channel number. Available range is 0-7. + * @param negativeChannel Negative side input channel number. Available range is 0-7. + */ +void LPCMP_SetInputChannels(LPCMP_Type *base, uint32_t positiveChannel, uint32_t negativeChannel); + +/*! + * @brief Enables/disables the DMA request for rising/falling events. + * Normally, the LPCMP generates a CPU interrupt if there is a rising/falling event. When + * DMA support is enabled and the rising/falling interrupt is enabled , the rising/falling + * event forces a DMA transfer request rather than a CPU interrupt instead. + * + * @param base LPCMP peripheral base address. + * @param enable "true" means enable DMA support, and "false" means disable DMA support. + */ +static inline void LPCMP_EnableDMA(LPCMP_Type *base, bool enable) +{ + if (enable) + { + base->CCR1 |= LPCMP_CCR1_DMA_EN_MASK; + } + else + { + base->CCR1 &= ~LPCMP_CCR1_DMA_EN_MASK; + } +} + +/*! + * @brief Configures the filter. + * + * @param base LPCMP peripheral base address. + * @param config Pointer to "lpcmp_filter_config_t" structure. + */ +void LPCMP_SetFilterConfig(LPCMP_Type *base, const lpcmp_filter_config_t *config); + +/*! + * @brief Configure the internal DAC module. + * + * @param base LPCMP peripheral base address. + * @param config Pointer to "lpcmp_dac_config_t" structure. If config is "NULL", disable internal DAC. + */ +void LPCMP_SetDACConfig(LPCMP_Type *base, const lpcmp_dac_config_t *config); + +/*! + * @brief Enable the interrupts. + * + * @param base LPCMP peripheral base address. + * @param mask Mask value for interrupts. See "_lpcmp_interrupt_enable". + */ +static inline void LPCMP_EnableInterrupts(LPCMP_Type *base, uint32_t mask) +{ + base->IER |= mask; +} + +/*! + * @brief Disable the interrupts. + * + * @param base LPCMP peripheral base address. + * @param mask Mask value for interrupts. See "_lpcmp_interrupt_enable". + */ +static inline void LPCMP_DisableInterrupts(LPCMP_Type *base, uint32_t mask) +{ + base->IER &= ~mask; +} + +/*! + * @brief Get the LPCMP status flags. + * + * @param base LPCMP peripheral base address. + * + * @return Mask value for the asserted flags. See "_lpcmp_status_flags". + */ +static inline uint32_t LPCMP_GetStatusFlags(LPCMP_Type *base) +{ + return base->CSR; +} + +/*! + * @brief Clear the LPCMP status flags + * + * @param base LPCMP peripheral base address. + * @param mask Mask value for the flags. See "_lpcmp_status_flags". + */ +static inline void LPCMP_ClearStatusFlags(LPCMP_Type *base, uint32_t mask) +{ + base->CSR = mask; +} + +/*! @} */ + +/*! + * @name Window mode + * @{ + */ + +/*! + * @brief Enable/Disable window mode.When any windowed mode is active, COUTA is clocked by + * the bus clock whenever WINDOW = 1. The last latched value is held when WINDOW = 0. + * The optionally inverted comparator output COUT_RAW is sampled on every bus clock + * when WINDOW=1 to generate COUTA. + * + * @param base LPCMP peripheral base address. + * @param enable "true" means enable window mode, and "false" means disable window mode. + */ +static inline void LPCMP_EnableWindowMode(LPCMP_Type *base, bool enable) +{ + if (enable) + { + base->CCR1 |= LPCMP_CCR1_WINDOW_EN_MASK; + } + else + { + base->CCR1 &= ~LPCMP_CCR1_WINDOW_EN_MASK; + } +} + +#if defined(FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL) && FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL +/*! + * @brief Configure the window control, users can use this API to implement operations on the window, + * such as inverting the window signal, setting the window closing event(only valid in windowing mode), + * and setting the COUTA signal after the window is closed(only valid in windowing mode). + * + * @param base LPCMP peripheral base address. + * @param config Pointer "lpcmp_window_control_config_t" structure. + */ +void LPCMP_SetWindowControl(LPCMP_Type *base, const lpcmp_window_control_config_t *config); +#endif /* FSL_FEATURE_LPCMP_HAS_WINDOW_CONTROL */ + +/*! @} */ + +#if defined(FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE) && FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE +/*! + * @name RoundRobin mode + * @{ + */ + +/*! + * @brief Configure the roundrobin mode. + * + * @param base LPCMP peripheral base address. + * @param config Pointer "lpcmp_roundrobin_config_t" structure. + */ +void LPCMP_SetRoundRobinConfig(LPCMP_Type *base, const lpcmp_roundrobin_config_t *config); + +/*! + * brief Configure the roundrobin internal timer reload value. + * + * param base LPCMP peripheral base address. + * param value RoundRobin internal timer reload value, allowed range:0x0UL-0xFFFFFFFUL. + */ +void LPCMP_SetRoundRobinInternalTimer(LPCMP_Type *base, uint32_t value); + +/*! + * @brief Enable/Disable roundrobin mode. + * + * @param base LPCMP peripheral base address. + * @param enable "true" means enable roundrobin mode, and "false" means disable roundrobin mode. + */ +static inline void LPCMP_EnableRoundRobinMode(LPCMP_Type *base, bool enable) +{ + if (enable) + { + base->RRCR0 |= LPCMP_RRCR0_RR_EN_MASK; + } + else + { + base->RRCR0 &= ~LPCMP_RRCR0_RR_EN_MASK; + } +} + +/*! + * @brief Enable/Disable roundrobin internal timer, note that this function is only valid + * when using the internal trigger source. + * + * @param base LPCMP peripheral base address. + * @param enable "true" means enable roundrobin internal timer, and "false" means disable roundrobin internal timer. + */ +static inline void LPCMP_EnableRoundRobinInternalTimer(LPCMP_Type *base, bool enable) +{ + if (enable) + { + base->RRCR2 |= LPCMP_RRCR2_RR_TIMER_EN_MASK; + } + else + { + base->RRCR2 &= ~LPCMP_RRCR2_RR_TIMER_EN_MASK; + } +} + +/*! + * @brief Set preset value for all channels, users can set all channels' preset vaule through this API, + * for example, if the mask set to 0x03U means channel0 and channel2's preset value set to 1U and other + * channels' preset value set to 0U. + * + * @param base LPCMP peripheral base address. + * @param mask Mask of channel index. + */ +static inline void LPCMP_SetPreSetValue(LPCMP_Type *base, uint8_t mask) +{ + base->RRCSR = (uint32_t)mask; +} + +/*! + * @brief Get comparison results for all channels, users can get all channels' comparison + * results through this API. + * + * @param base LPCMP peripheral base address. + * @return return All channels' comparison result. + */ +static inline uint8_t LPCMP_GetComparisonResult(LPCMP_Type *base) +{ + return (uint8_t)base->RRCSR; +} + +/*! + * @brief Clear input changed flags for single channel or multiple channels, users can clear + * input changed flag of a single channel or multiple channels through this API, for example, + * if the mask set to 0x03U means clear channel0 and channel2's input changed flags. + * + * @param base LPCMP peripheral base address. + * @param mask Mask of channel index. + */ +static inline void LPCMP_ClearInputChangedFlags(LPCMP_Type *base, uint8_t mask) +{ + base->RRSR = (uint32_t)mask; +} + +/*! + * @brief Get input changed flags for all channels, Users can get all channels' input changed + * flags through this API. + * + * @param base LPCMP peripheral base address. + * @return return All channels' changed flag. + */ +static inline uint8_t LPCMP_GetInputChangedFlags(LPCMP_Type *base) +{ + return (uint8_t)base->RRSR; +} + +/*! @} */ + +#endif /* FSL_FEATURE_LPCMP_HAS_ROUNDROBIN_MODE */ + +#if defined(__cplusplus) +} +#endif + +/*! @} */ + +#endif /* FSL_LPCMP_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c.c new file mode 100644 index 00000000000..1c49f2e4a2d --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c.c @@ -0,0 +1,2715 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_lpi2c.h" +#include +#include + +/* + * $Coverage Justification Reference$ + * + * $Justification fsl_lpi2c_c_ref_1$ + * The default branch cannot be executed in any circumstances, it is only added to avoid MISRA violation. + * + * $Justification fsl_lpi2c_c_ref_2$ + * Two instances failed to simulate #kStatus_LPI2C_Busy. + * + * $Justification fsl_lpi2c_c_ref_3$ + * When the transmission is completed (remaining == 0), the SDF and RSF will be set, and the flags are get before + * that(get before set), it will be over when the next cycle occurs, the first condition cannot be verified, and the + * remaining will not be verified.(will improve) + * + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpi2c" +#endif + +#if defined(LPI2C_RSTS) +#define LPI2C_RESETS_ARRAY LPI2C_RSTS +#endif + +/*! @brief LPI2C master fifo commands. */ +enum +{ + kTxDataCmd = LPI2C_MTDR_CMD(0x0U), /*!< Transmit DATA[7:0] */ + kRxDataCmd = LPI2C_MTDR_CMD(0X1U), /*!< Receive (DATA[7:0] + 1) bytes */ + kStopCmd = LPI2C_MTDR_CMD(0x2U), /*!< Generate STOP condition */ + kStartCmd = LPI2C_MTDR_CMD(0x4U), /*!< Generate(repeated) START and transmit address in DATA[[7:0] */ +}; + +/*! + * @brief Default watermark values. + * + * The default watermarks are set to zero. + */ +enum +{ + kDefaultTxWatermark = 0, + kDefaultRxWatermark = 0, +}; + +/*! @brief States for the state machine used by transactional APIs. */ +enum +{ + kIdleState = 0, + kSendCommandState, + kIssueReadCommandState, + kTransferDataState, + kStopState, + kWaitForCompletionState, +}; + +/*! + * @brief Structure definition for variables that passed as parameters in LPI2C_RunTransferStateMachine. + * The structure is private. + */ +typedef struct _lpi2c_state_machine_param +{ + bool state_complete; /*!< status of complete */ + size_t rxCount; /*!< rx count */ + size_t txCount; /*!< tx count */ + uint32_t status; /*!< machine status */ +} lpi2c_state_machine_param_t; + +/*! @brief Typedef for slave interrupt handler. */ +typedef void (*lpi2c_slave_isr_t)(LPI2C_Type *base, lpi2c_slave_handle_t *handle); + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static uint32_t LPI2C_GetCyclesForWidth( + uint32_t sourceClock_Hz, uint32_t width_ns, uint32_t minCycles, uint32_t maxCycles, uint32_t prescaler); + +static status_t LPI2C_MasterWaitForTxReady(LPI2C_Type *base); + +static status_t LPI2C_RunTransferStateMachine(LPI2C_Type *base, lpi2c_master_handle_t *handle, bool *isDone); + +static void LPI2C_InitTransferStateMachine(lpi2c_master_handle_t *handle); + +static status_t LPI2C_SlaveCheckAndClearError(LPI2C_Type *base, uint32_t flags); + +static void LPI2C_CommonIRQHandler(LPI2C_Type *base, uint32_t instance); + +/*! + * @brief introduce function LPI2C_TransferStateMachineSendCommandState. + * This function was deal with Send Command State. + * + * @param base The I2C peripheral base address. + * @param handle Master nonblocking driver handle. + * @param variable_set Pass the address of the parent function variable. + */ +static void LPI2C_TransferStateMachineSendCommand(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams); + +/*! + * @brief introduce function LPI2C_TransferStateMachineIssueReadCommandState. + * This function was deal with Issue Read Command State. + * + * @param base The I2C peripheral base address. + * @param handle Master nonblocking driver handle. + * @param stateParams Pass the address of the parent function variable. + */ +static void LPI2C_TransferStateMachineReadCommand(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams); + +/*! + * @brief introduce function LPI2C_TransferStateMachineTransferDataState. + * This function was deal with init Transfer Data State. + * + * @param base The I2C peripheral base address. + * @param handle Master nonblocking driver handle. + * @param stateParams Pass the address of the parent function variable. + */ +static void LPI2C_TransferStateMachineTransferData(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams); + +/*! + * @brief introduce function LPI2C_TransferStateMachineStopState. + * This function was deal with Stop State. + * + * @param base The I2C peripheral base address. + * @param handle Master nonblocking driver handle. + * @param stateParams Pass the address of the parent function variable. + * @param[out] isDone Set to true if the transfer has completed. + */ +static void LPI2C_TransferStateMachineStopState(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams, + bool *isDone); + +/*! + * @brief introduce function LPI2C_TransferStateMachineWaitState. + * This function was deal with Wait For Completion State. + * + * @param base The I2C peripheral base address. + * @param handle Master nonblocking driver handle. + * @param stateParams Pass the address of the parent function variable. + * @param[out] isDone Set to true if the transfer has completed. + */ +static void LPI2C_TransferStateMachineWaitState(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams, + bool *isDone); + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/*! @brief Array to map LPI2C instance number to base pointer. */ +static LPI2C_Type *const kLpi2cBases[] = LPI2C_BASE_PTRS; + +/*! @brief Array to map LPI2C instance number to IRQ number, used internally for LPI2C master interrupt and EDMA +transactional APIs. */ +IRQn_Type const kLpi2cIrqs[] = LPI2C_IRQS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Array to map LPI2C instance number to clock gate enum. */ +static clock_ip_name_t const kLpi2cClocks[] = LPI2C_CLOCKS; + +#if defined(LPI2C_PERIPH_CLOCKS) +/*! @brief Array to map LPI2C instance number to pheripheral clock gate enum. */ +static const clock_ip_name_t kLpi2cPeriphClocks[] = LPI2C_PERIPH_CLOCKS; +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +/*! @brief Pointer to master IRQ handler for each instance, used internally for LPI2C master interrupt and EDMA +transactional APIs. */ +lpi2c_master_isr_t s_lpi2cMasterIsr; + +/*! @brief Pointers to master handles for each instance, used internally for LPI2C master interrupt and EDMA +transactional APIs. */ +void *s_lpi2cMasterHandle[ARRAY_SIZE(kLpi2cBases)]; + +/*! @brief Pointer to slave IRQ handler for each instance. */ +static lpi2c_slave_isr_t s_lpi2cSlaveIsr; + +/*! @brief Pointers to slave handles for each instance. */ +static lpi2c_slave_handle_t *s_lpi2cSlaveHandle[ARRAY_SIZE(kLpi2cBases)]; + +#if defined(LPI2C_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_lpi2cResets[] = LPI2C_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Returns an instance number given a base address. + * + * If an invalid base address is passed, debug builds will assert. Release builds will just return + * instance number 0. + * + * param base The LPI2C peripheral base address. + * return LPI2C instance number starting from 0. + */ +uint32_t LPI2C_GetInstance(LPI2C_Type *base) +{ + uint32_t instance; + for (instance = 0U; instance < ARRAY_SIZE(kLpi2cBases); ++instance) + { + if (kLpi2cBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(kLpi2cBases)); + return instance; +} + +/*! + * @brief Computes a cycle count for a given time in nanoseconds. + * @param sourceClock_Hz LPI2C functional clock frequency in Hertz. + * @param width_ns Desired with in nanoseconds. + * @param minCycles Minimum cycle count. + * @param maxCycles Maximum cycle count. + * @param prescaler LPI2C prescaler setting. If the cycle period is not affected by the prescaler value, set it to 0. + */ +static uint32_t LPI2C_GetCyclesForWidth( + uint32_t sourceClock_Hz, uint32_t width_ns, uint32_t minCycles, uint32_t maxCycles, uint32_t prescaler) +{ + assert(sourceClock_Hz > 0U); + + uint32_t divider = 1U; + + while (prescaler != 0U) + { + divider *= 2U; + prescaler--; + } + + uint32_t busCycle_ns = 1000000U / (sourceClock_Hz / divider / 1000U); + /* Calculate the cycle count, round up the calculated value. */ + uint32_t cycles = (width_ns * 10U / busCycle_ns + 5U) / 10U; + + /* If the calculated value is smaller than the minimum value, use the minimum value */ + if (cycles < minCycles) + { + cycles = minCycles; + } + /* If the calculated value is larger than the maximum value, use the maxmum value */ + if (cycles > maxCycles) + { + cycles = maxCycles; + } + + return cycles; +} + +/*! + * brief Convert provided flags to status code, and clear any errors if present. + * param base The LPI2C peripheral base address. + * param status Current status flags value that will be checked. + * retval #kStatus_Success + * retval #kStatus_LPI2C_PinLowTimeout + * retval #kStatus_LPI2C_ArbitrationLost + * retval #kStatus_LPI2C_Nak + * retval #kStatus_LPI2C_FifoError + */ +status_t LPI2C_MasterCheckAndClearError(LPI2C_Type *base, uint32_t status) +{ + status_t result = kStatus_Success; + + /* Check for error. These errors cause a stop to automatically be sent. We must */ + /* clear the errors before a new transfer can start. */ + status &= (uint32_t)kLPI2C_MasterErrorFlags; + if (0U != status) + { + /* Select the correct error code. Ordered by severity, with bus issues first. */ + if (0U != (status & (uint32_t)kLPI2C_MasterPinLowTimeoutFlag)) + { + result = kStatus_LPI2C_PinLowTimeout; + } + else if (0U != (status & (uint32_t)kLPI2C_MasterArbitrationLostFlag)) + { + result = kStatus_LPI2C_ArbitrationLost; + } + else if (0U != (status & (uint32_t)kLPI2C_MasterNackDetectFlag)) + { + result = kStatus_LPI2C_Nak; + } + /* + * $Branch Coverage Justification$ + * Before that, the state was stripped of other attributes, and it only contained the four brother flags.(will + * improve) + */ + else if (0U != (status & (uint32_t)kLPI2C_MasterFifoErrFlag)) + { + result = kStatus_LPI2C_FifoError; + } + else + { + ; /* Intentional empty */ + } + + /* Clear the flags. */ + LPI2C_MasterClearStatusFlags(base, status); + + if (((base->MCFGR1 & LPI2C_MCFGR1_IGNACK_MASK) != 0x00U) && (result == kStatus_LPI2C_Nak)) + { + /* ERR051119: If IGNACK was set and nak detect , we will ignore the Nak status */ + result = kStatus_Success; + } + else + { + /* Reset fifos. These flags clear automatically.*/ + base->MCR |= LPI2C_MCR_RRF_MASK | LPI2C_MCR_RTF_MASK; + } + } + else + { + ; /* Intentional empty */ + } + + return result; +} + +/*! + * @brief Wait until there is room in the tx fifo. + * @param base The LPI2C peripheral base address. + * @retval #kStatus_Success + * @retval #kStatus_LPI2C_PinLowTimeout + * @retval #kStatus_LPI2C_ArbitrationLost + * @retval #kStatus_LPI2C_Nak + * @retval #kStatus_LPI2C_FifoError + */ +static status_t LPI2C_MasterWaitForTxReady(LPI2C_Type *base) +{ + status_t result = kStatus_Success; + uint32_t status; + size_t txCount; + size_t txFifoSize = (size_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base); + +#if I2C_RETRY_TIMES != 0U + uint32_t waitTimes = I2C_RETRY_TIMES; +#endif + do + { + /* Get the number of words in the tx fifo and compute empty slots. */ + LPI2C_MasterGetFifoCounts(base, NULL, &txCount); + txCount = txFifoSize - txCount; + + /* Check for error flags. */ + status = LPI2C_MasterGetStatusFlags(base); + result = LPI2C_MasterCheckAndClearError(base, status); + if (kStatus_Success != result) + { + break; + } +#if I2C_RETRY_TIMES != 0U + waitTimes--; + } while ((0U == txCount) && (0U != waitTimes)); + + if (0U == waitTimes) + { + result = kStatus_LPI2C_Timeout; + } +#else + } while (0U == txCount); +#endif + + return result; +} + +/*! + * brief Make sure the bus isn't already busy. + * + * A busy bus is allowed if we are the one driving it. + * + * param base The LPI2C peripheral base address. + * retval #kStatus_Success + * retval #kStatus_LPI2C_Busy + */ +/* Not static so it can be used from fsl_lpi2c_edma.c. */ +status_t LPI2C_CheckForBusyBus(LPI2C_Type *base) +{ + status_t ret = kStatus_Success; + + uint32_t status = LPI2C_MasterGetStatusFlags(base); + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_c_ref_2$ + */ + if ((0U != (status & (uint32_t)kLPI2C_MasterBusBusyFlag)) && (0U == (status & (uint32_t)kLPI2C_MasterBusyFlag))) + { + ret = kStatus_LPI2C_Busy; + } + + return ret; +} + +/*! + * brief Provides a default configuration for the LPI2C master peripheral. + * + * This function provides the following default configuration for the LPI2C master peripheral: + * code + * masterConfig->enableMaster = true; + * masterConfig->debugEnable = false; + * masterConfig->ignoreAck = false; + * masterConfig->pinConfig = kLPI2C_2PinOpenDrain; + * masterConfig->baudRate_Hz = 100000U; + * masterConfig->busIdleTimeout_ns = 0U; + * masterConfig->pinLowTimeout_ns = 0U; + * masterConfig->sdaGlitchFilterWidth_ns = 0U; + * masterConfig->sclGlitchFilterWidth_ns = 0U; + * masterConfig->hostRequest.enable = false; + * masterConfig->hostRequest.source = kLPI2C_HostRequestExternalPin; + * masterConfig->hostRequest.polarity = kLPI2C_HostRequestPinActiveHigh; + * endcode + * + * After calling this function, you can override any settings in order to customize the configuration, + * prior to initializing the master driver with LPI2C_MasterInit(). + * + * param[out] masterConfig User provided configuration structure for default values. Refer to #lpi2c_master_config_t. + */ +void LPI2C_MasterGetDefaultConfig(lpi2c_master_config_t *masterConfig) +{ + /* Initializes the configure structure to zero. */ + (void)memset(masterConfig, 0, sizeof(*masterConfig)); + + masterConfig->enableMaster = true; + masterConfig->debugEnable = false; + masterConfig->enableDoze = true; + masterConfig->ignoreAck = false; + masterConfig->pinConfig = kLPI2C_2PinOpenDrain; + masterConfig->baudRate_Hz = 100000U; + masterConfig->busIdleTimeout_ns = 0U; /* Set to 0 to disable the function */ + masterConfig->pinLowTimeout_ns = 0U; /* Set to 0 to disable the function */ + masterConfig->sdaGlitchFilterWidth_ns = 0U; /* Set to 0 to disable the function */ + masterConfig->sclGlitchFilterWidth_ns = 0U; /* Set to 0 to disable the function */ + masterConfig->hostRequest.enable = false; + masterConfig->hostRequest.source = kLPI2C_HostRequestExternalPin; + masterConfig->hostRequest.polarity = kLPI2C_HostRequestPinActiveHigh; +} + +/*! + * brief Initializes the LPI2C master peripheral. + * + * This function enables the peripheral clock and initializes the LPI2C master peripheral as described by the user + * provided configuration. A software reset is performed prior to configuration. + * + * param base The LPI2C peripheral base address. + * param masterConfig User provided peripheral configuration. Use LPI2C_MasterGetDefaultConfig() to get a set of + * defaults + * that you can override. + * param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the baud rate divisors, + * filter widths, and timeout periods. + */ +void LPI2C_MasterInit(LPI2C_Type *base, const lpi2c_master_config_t *masterConfig, uint32_t sourceClock_Hz) +{ + uint32_t prescaler; + uint32_t cycles; + uint32_t cfgr2; + uint32_t value; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + + uint32_t instance = LPI2C_GetInstance(base); + + /* Ungate the clock. */ + (void)CLOCK_EnableClock(kLpi2cClocks[instance]); +#if defined(LPI2C_PERIPH_CLOCKS) + /* Ungate the functional clock in initialize function. */ + CLOCK_EnableClock(kLpi2cPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(LPI2C_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_lpi2cResets[LPI2C_GetInstance(base)]); +#endif + + /* Reset peripheral before configuring it. */ + LPI2C_MasterReset(base); + + /* Doze bit: 0 is enable, 1 is disable */ + base->MCR = LPI2C_MCR_DBGEN(masterConfig->debugEnable) | LPI2C_MCR_DOZEN(!(masterConfig->enableDoze)); + + /* host request */ + value = base->MCFGR0; + value &= (~(LPI2C_MCFGR0_HREN_MASK | LPI2C_MCFGR0_HRPOL_MASK | LPI2C_MCFGR0_HRSEL_MASK)); + value |= LPI2C_MCFGR0_HREN(masterConfig->hostRequest.enable) | + LPI2C_MCFGR0_HRPOL(masterConfig->hostRequest.polarity) | + LPI2C_MCFGR0_HRSEL(masterConfig->hostRequest.source); + base->MCFGR0 = value; + + /* pin config and ignore ack */ + value = base->MCFGR1; + value &= ~(LPI2C_MCFGR1_PINCFG_MASK | LPI2C_MCFGR1_IGNACK_MASK); + value |= LPI2C_MCFGR1_PINCFG(masterConfig->pinConfig); + value |= LPI2C_MCFGR1_IGNACK(masterConfig->ignoreAck); + base->MCFGR1 = value; + + LPI2C_MasterSetWatermarks(base, (size_t)kDefaultTxWatermark, (size_t)kDefaultRxWatermark); + + /* Configure glitch filters. */ + cfgr2 = base->MCFGR2; + if (0U != (masterConfig->sdaGlitchFilterWidth_ns)) + { + /* Calculate SDA filter width. The width is equal to FILTSDA cycles of functional clock. + And set FILTSDA to 0 disables the fileter, so the min value is 1. */ + cycles = LPI2C_GetCyclesForWidth(sourceClock_Hz, masterConfig->sdaGlitchFilterWidth_ns, 1U, + (LPI2C_MCFGR2_FILTSDA_MASK >> LPI2C_MCFGR2_FILTSDA_SHIFT), 0U); + cfgr2 &= ~LPI2C_MCFGR2_FILTSDA_MASK; + cfgr2 |= LPI2C_MCFGR2_FILTSDA(cycles); + } + if (0U != masterConfig->sclGlitchFilterWidth_ns) + { + /* Calculate SDL filter width. The width is equal to FILTSCL cycles of functional clock. + And set FILTSCL to 0 disables the fileter, so the min value is 1. */ + cycles = LPI2C_GetCyclesForWidth(sourceClock_Hz, masterConfig->sclGlitchFilterWidth_ns, 1U, + (LPI2C_MCFGR2_FILTSCL_MASK >> LPI2C_MCFGR2_FILTSCL_SHIFT), 0U); + cfgr2 &= ~LPI2C_MCFGR2_FILTSCL_MASK; + cfgr2 |= LPI2C_MCFGR2_FILTSCL(cycles); + } + base->MCFGR2 = cfgr2; + + /* Configure baudrate after the SDA/SCL glitch filter setting, + since the baudrate calculation needs them as parameter. */ + LPI2C_MasterSetBaudRate(base, sourceClock_Hz, masterConfig->baudRate_Hz); + + /* Configure bus idle and pin low timeouts after baudrate setting, + since the timeout calculation needs prescaler as parameter. */ + prescaler = (base->MCFGR1 & LPI2C_MCFGR1_PRESCALE_MASK) >> LPI2C_MCFGR1_PRESCALE_SHIFT; + + if (0U != (masterConfig->busIdleTimeout_ns)) + { + /* Calculate bus idle timeout value. The value is equal to BUSIDLE cycles of functional clock divided by + prescaler. And set BUSIDLE to 0 disables the fileter, so the min value is 1. */ + cycles = LPI2C_GetCyclesForWidth(sourceClock_Hz, masterConfig->busIdleTimeout_ns, 1U, + (LPI2C_MCFGR2_BUSIDLE_MASK >> LPI2C_MCFGR2_BUSIDLE_SHIFT), prescaler); + base->MCFGR2 = (base->MCFGR2 & (~LPI2C_MCFGR2_BUSIDLE_MASK)) | LPI2C_MCFGR2_BUSIDLE(cycles); + } + if (0U != masterConfig->pinLowTimeout_ns) + { + /* Calculate bus pin low timeout value. The value is equal to PINLOW cycles of functional clock divided by + prescaler. And set PINLOW to 0 disables the fileter, so the min value is 1. */ + cycles = LPI2C_GetCyclesForWidth(sourceClock_Hz, masterConfig->pinLowTimeout_ns / 256U, 1U, + (LPI2C_MCFGR2_BUSIDLE_MASK >> LPI2C_MCFGR2_BUSIDLE_SHIFT), prescaler); + base->MCFGR3 = (base->MCFGR3 & ~LPI2C_MCFGR3_PINLOW_MASK) | LPI2C_MCFGR3_PINLOW(cycles); + } + + LPI2C_MasterEnable(base, masterConfig->enableMaster); +} + +/*! + * brief Deinitializes the LPI2C master peripheral. + * + * This function disables the LPI2C master peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * param base The LPI2C peripheral base address. + */ +void LPI2C_MasterDeinit(LPI2C_Type *base) +{ + /* Restore to reset state. */ + LPI2C_MasterReset(base); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + + uint32_t instance = LPI2C_GetInstance(base); + + /* Gate clock. */ + (void)CLOCK_DisableClock(kLpi2cClocks[instance]); +#if defined(LPI2C_PERIPH_CLOCKS) + /* Gate the functional clock. */ + CLOCK_DisableClock(kLpi2cPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * brief Configures LPI2C master data match feature. + * + * param base The LPI2C peripheral base address. + * param matchConfig Settings for the data match feature. + */ +void LPI2C_MasterConfigureDataMatch(LPI2C_Type *base, const lpi2c_data_match_config_t *matchConfig) +{ + /* Disable master mode. */ + bool wasEnabled = (0U != ((base->MCR & LPI2C_MCR_MEN_MASK) >> LPI2C_MCR_MEN_SHIFT)); + LPI2C_MasterEnable(base, false); + + base->MCFGR1 = (base->MCFGR1 & ~LPI2C_MCFGR1_MATCFG_MASK) | LPI2C_MCFGR1_MATCFG(matchConfig->matchMode); + base->MCFGR0 = (base->MCFGR0 & ~LPI2C_MCFGR0_RDMO_MASK) | LPI2C_MCFGR0_RDMO(matchConfig->rxDataMatchOnly); + base->MDMR = LPI2C_MDMR_MATCH0(matchConfig->match0) | LPI2C_MDMR_MATCH1(matchConfig->match1); + + /* Restore master mode. */ + if (wasEnabled) + { + LPI2C_MasterEnable(base, true); + } +} + +/*! + * brief Sets the I2C bus frequency for master transactions. + * + * The LPI2C master is automatically disabled and re-enabled as necessary to configure the baud + * rate. Do not call this function during a transfer, or the transfer is aborted. + * + * note Please note that the second parameter is the clock frequency of LPI2C module, the third + * parameter means user configured bus baudrate, this implementation is different from other I2C drivers + * which use baudrate configuration as second parameter and source clock frequency as third parameter. + * + * param base The LPI2C peripheral base address. + * param sourceClock_Hz LPI2C functional clock frequency in Hertz. + * param baudRate_Hz Requested bus frequency in Hertz. + */ +void LPI2C_MasterSetBaudRate(LPI2C_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Hz) +{ + bool wasEnabled; + uint8_t filtScl = (uint8_t)((base->MCFGR2 & LPI2C_MCFGR2_FILTSCL_MASK) >> LPI2C_MCFGR2_FILTSCL_SHIFT); + + uint8_t divider = 1U; + uint8_t bestDivider = 1U; + uint8_t prescale = 0U; + uint8_t bestPre = 0U; + + uint8_t clkCycle; + uint8_t bestclkCycle = 0U; + + uint32_t absError = 0U; + uint32_t bestError = 0xffffffffu; + uint32_t computedRate; + + uint32_t tmpReg = 0U; + + /* Disable master mode. */ + wasEnabled = (0U != ((base->MCR & LPI2C_MCR_MEN_MASK) >> LPI2C_MCR_MEN_SHIFT)); + LPI2C_MasterEnable(base, false); + + /* Baud rate = (sourceClock_Hz / 2 ^ prescale) / (CLKLO + 1 + CLKHI + 1 + SCL_LATENCY) + * SCL_LATENCY = ROUNDDOWN((2 + FILTSCL) / (2 ^ prescale)) + */ + for (prescale = 0U; prescale <= 7U; prescale++) + { + /* Calculate the clkCycle, clkCycle = CLKLO + CLKHI, divider = 2 ^ prescale */ + clkCycle = (uint8_t)((10U * sourceClock_Hz / divider / baudRate_Hz + 5U) / 10U - (2U + filtScl) / divider - 2U); + /* According to register description, The max value for CLKLO and CLKHI is 63. + however to meet the I2C specification of tBUF, CLKHI should be less than + clkCycle - 0.52 x sourceClock_Hz / baudRate_Hz / divider + 1U. Refer to the comment of the tmpHigh's + calculation for details. So we have: + CLKHI < clkCycle - 0.52 x sourceClock_Hz / baudRate_Hz / divider + 1U, + clkCycle = CLKHI + CLKLO and + sourceClock_Hz / baudRate_Hz / divider = clkCycle + 2 + ROUNDDOWN((2 + FILTSCL) / divider), + we can come up with: CLKHI < 0.92 x CLKLO - ROUNDDOWN(2 + FILTSCL) / divider + so the max boundary of CLKHI should be 0.92 x 63 - ROUNDDOWN(2 + FILTSCL) / divider, + and the max boundary of clkCycle is 1.92 x 63 - ROUNDDOWN(2 + FILTSCL) / divider. */ + if (clkCycle > (120U - (2U + filtScl) / divider)) + { + divider *= 2U; + continue; + } + /* Calculate the computed baudrate and compare it with the desired baudrate */ + computedRate = (sourceClock_Hz / (uint32_t)divider) / + ((uint32_t)clkCycle + 2U + (2U + (uint32_t)filtScl) / (uint32_t)divider); + absError = baudRate_Hz > computedRate ? baudRate_Hz - computedRate : computedRate - baudRate_Hz; + if (absError < bestError) + { + bestPre = prescale; + bestDivider = divider; + bestclkCycle = clkCycle; + bestError = absError; + + /* If the error is 0, then we can stop searching because we won't find a better match. */ + if (absError == 0U) + { + break; + } + } + divider *= 2U; + } + + /* SCL low time tLO should be larger than or equal to SCL high time tHI: + tLO = ((CLKLO + 1) x (2 ^ PRESCALE)) >= tHI = ((CLKHI + 1 + SCL_LATENCY) x (2 ^ PRESCALE)), + which is CLKLO >= CLKHI + (2U + filtScl) / bestDivider. + Also since bestclkCycle = CLKLO + CLKHI, bestDivider = 2 ^ PRESCALE + which makes CLKHI <= (bestclkCycle - (2U + filtScl) / bestDivider) / 2U. + + The max tBUF should be at least 0.52 times of the SCL clock cycle: + tBUF = ((CLKLO + 1) x (2 ^ PRESCALE) / sourceClock_Hz) > (0.52 / baudRate_Hz), + plus bestDivider = 2 ^ PRESCALE, bestclkCycle = CLKLO + CLKHI we can come up with + CLKHI <= (bestclkCycle - 0.52 x sourceClock_Hz / baudRate_Hz / bestDivider + 1U). + In this case to get a safe CLKHI calculation, we can assume: + */ + uint8_t tmpHigh = (bestclkCycle - (2U + filtScl) / bestDivider) / 2U; + while (tmpHigh > (bestclkCycle - 52U * sourceClock_Hz / baudRate_Hz / bestDivider / 100U + 1U)) + { + tmpHigh = tmpHigh - 1U; + } + + /* Calculate DATAVD and SETHOLD. + To meet the timing requirement of I2C spec for standard mode, fast mode and fast mode plus: */ + /* The min tHD:STA/tSU:STA/tSU:STO should be at least 0.4 times of the SCL clock cycle, use 0.5 to be safe: + tHD:STA = ((SETHOLD + 1) x (2 ^ PRESCALE) / sourceClock_Hz) > (0.5 / baudRate_Hz), bestDivider = 2 ^ PRESCALE */ + uint8_t tmpHold = (uint8_t)(sourceClock_Hz / baudRate_Hz / bestDivider / 2U) - 1U; + + /* The max tVD:DAT/tVD:ACK/tHD:DAT should be at most 0.345 times of the SCL clock cycle, use 0.25 to be safe: + tVD:DAT = ((DATAVD + 1) x (2 ^ PRESCALE) / sourceClock_Hz) < (0.25 / baudRate_Hz), bestDivider = 2 ^ PRESCALE */ + uint8_t tmpDataVd = (uint8_t)(sourceClock_Hz / baudRate_Hz / bestDivider / 4U) - 1U; + + /* The min tSU:DAT should be at least 0.05 times of the SCL clock cycle: + tSU:DAT = ((2 + FILTSDA + 2 ^ PRESCALE) / sourceClock_Hz) >= (0.05 / baud), + plus bestDivider = 2 ^ PRESCALE, we can come up with: + FILTSDA >= (0.05 x sourceClock_Hz / baudRate_Hz - bestDivider - 2) */ + if ((sourceClock_Hz / baudRate_Hz / 20U) > (bestDivider + 2U)) + { + /* Read out the FILTSDA configuration, if it is smaller than expected, change the setting. */ + uint8_t filtSda = (uint8_t)((base->MCFGR2 & LPI2C_MCFGR2_FILTSDA_MASK) >> LPI2C_MCFGR2_FILTSDA_SHIFT); + if (filtSda < (sourceClock_Hz / baudRate_Hz / 20U - bestDivider - 2U)) + { + filtSda = (uint8_t)(sourceClock_Hz / baudRate_Hz / 20U) - bestDivider - 2U; + } + base->MCFGR2 = (base->MCFGR2 & ~LPI2C_MCFGR2_FILTSDA_MASK) | LPI2C_MCFGR2_FILTSDA(filtSda); + } + + /* Set CLKHI, CLKLO, SETHOLD, DATAVD value. */ + tmpReg = LPI2C_MCCR0_CLKHI((uint32_t)tmpHigh) | + LPI2C_MCCR0_CLKLO((uint32_t)((uint32_t)bestclkCycle - (uint32_t)tmpHigh)) | + LPI2C_MCCR0_SETHOLD((uint32_t)tmpHold) | LPI2C_MCCR0_DATAVD((uint32_t)tmpDataVd); + base->MCCR0 = tmpReg; + + /* Set PRESCALE value. */ + base->MCFGR1 = (base->MCFGR1 & ~LPI2C_MCFGR1_PRESCALE_MASK) | LPI2C_MCFGR1_PRESCALE(bestPre); + + /* Restore master mode. */ + if (wasEnabled) + { + LPI2C_MasterEnable(base, true); + } +} + +/*! + * brief Sends a START signal and slave address on the I2C bus. + * + * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure + * that another master is not occupying the bus. Then a START signal is transmitted, followed by the + * 7-bit address specified in the a address parameter. Note that this function does not actually wait + * until the START and address are successfully sent on the bus before returning. + * + * param base The LPI2C peripheral base address. + * param address 7-bit slave device address, in bits [6:0]. + * param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * retval #kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. + * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + */ +status_t LPI2C_MasterStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir) +{ + /* Return an error if the bus is already in use not by us. */ + status_t result = LPI2C_CheckForBusyBus(base); + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_c_ref_2$ + */ + if (kStatus_Success == result) + { + /* Clear all flags. */ + LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterClearFlags); + + /* Turn off auto-stop option. */ + base->MCFGR1 &= ~LPI2C_MCFGR1_AUTOSTOP_MASK; + + /* Wait until there is room in the fifo. */ + result = LPI2C_MasterWaitForTxReady(base); + if (kStatus_Success == result) + { + /* Issue start command. */ + base->MTDR = (uint32_t)kStartCmd | (((uint32_t)address << 1U) | (uint32_t)dir); + } + } + + return result; +} + +/*! + * brief Sends a STOP signal on the I2C bus. + * + * This function does not return until the STOP signal is seen on the bus, or an error occurs. + * + * param base The LPI2C peripheral base address. + * retval #kStatus_Success The STOP signal was successfully sent on the bus and the transaction terminated. + * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterStop(LPI2C_Type *base) +{ + /* Wait until there is room in the fifo. */ + status_t result = LPI2C_MasterWaitForTxReady(base); + if (kStatus_Success == result) + { + /* Send the STOP signal */ + base->MTDR = (uint32_t)kStopCmd; + + /* Wait for the stop detected flag to set, indicating the transfer has completed on the bus. */ + /* Also check for errors while waiting. */ +#if I2C_RETRY_TIMES != 0U + uint32_t waitTimes = I2C_RETRY_TIMES; +#endif + +#if I2C_RETRY_TIMES != 0U + while ((result == kStatus_Success) && (0U != waitTimes)) + { + waitTimes--; +#else + while (result == kStatus_Success) + { +#endif + uint32_t status = LPI2C_MasterGetStatusFlags(base); + + /* Check for error flags. */ + result = LPI2C_MasterCheckAndClearError(base, status); + + /* Check if the stop was sent successfully. */ + if ((0U != (status & (uint32_t)kLPI2C_MasterStopDetectFlag)) && + (0U != (status & (uint32_t)kLPI2C_MasterTxReadyFlag))) + { + LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterStopDetectFlag); + break; + } + } + +#if I2C_RETRY_TIMES != 0U + if (0U == waitTimes) + { + result = kStatus_LPI2C_Timeout; + } +#endif + } + + return result; +} + +/*! + * brief Performs a polling receive transfer on the I2C bus. + * + * param base The LPI2C peripheral base address. + * param rxBuff The pointer to the data to be transferred. + * param rxSize The length in bytes of the data to be transferred. + * retval #kStatus_Success Data was received successfully. + * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize) +{ + assert(NULL != rxBuff); + + status_t result = kStatus_Success; + uint8_t *buf; + size_t tmpRxSize = rxSize; +#if I2C_RETRY_TIMES != 0U + uint32_t waitTimes; +#endif + + /* Check transfer data size. */ + if (rxSize > ((size_t)256 * (size_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base))) + { + return kStatus_InvalidArgument; + } + + /* Handle empty read. */ + if (rxSize != 0U) + { + /* Wait until there is room in the command fifo. */ + result = LPI2C_MasterWaitForTxReady(base); + if (kStatus_Success == result) + { + /* Issue command to receive data. A single write to MTDR can issue read operation of 0xFFU + 1 byte of data + at most, so when the rxSize is larger than 0x100U, push multiple read commands to MTDR until rxSize is + reached. */ + while (tmpRxSize != 0U) + { + if (tmpRxSize > 256U) + { + base->MTDR = (uint32_t)(kRxDataCmd) | (uint32_t)LPI2C_MTDR_DATA(0xFFU); + tmpRxSize -= 256U; + } + else + { + base->MTDR = (uint32_t)(kRxDataCmd) | (uint32_t)LPI2C_MTDR_DATA(tmpRxSize - 1U); + tmpRxSize = 0U; + } + } + + /* Receive data */ + buf = (uint8_t *)rxBuff; + while (0U != (rxSize--)) + { +#if I2C_RETRY_TIMES != 0U + waitTimes = I2C_RETRY_TIMES; +#endif + /* Read LPI2C receive fifo register. The register includes a flag to indicate whether */ + /* the FIFO is empty, so we can both get the data and check if we need to keep reading */ + /* using a single register read. */ + uint32_t value = 0U; + do + { + /* Check for errors. */ + result = LPI2C_MasterCheckAndClearError(base, LPI2C_MasterGetStatusFlags(base)); + if (kStatus_Success != result) + { + break; + } + + value = base->MRDR; +#if I2C_RETRY_TIMES != 0U + waitTimes--; + } while ((0U != (value & LPI2C_MRDR_RXEMPTY_MASK)) && (0U != waitTimes)); + if (0U == waitTimes) + { + result = kStatus_LPI2C_Timeout; + } +#else + } while (0U != (value & LPI2C_MRDR_RXEMPTY_MASK)); +#endif + if ((status_t)kStatus_Success != result) + { + break; + } + + *buf++ = (uint8_t)(value & LPI2C_MRDR_DATA_MASK); + } + } + } + + return result; +} + +/*! + * brief Performs a polling send transfer on the I2C bus. + * + * Sends up to a txSize number of bytes to the previously addressed slave device. The slave may + * reply with a NAK to any byte in order to terminate the transfer early. If this happens, this + * function returns #kStatus_LPI2C_Nak. + * + * param base The LPI2C peripheral base address. + * param txBuff The pointer to the data to be transferred. + * param txSize The length in bytes of the data to be transferred. + * retval #kStatus_Success Data was sent successfully. + * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * retval #kStatus_LPI2C_FifoError FIFO under run or over run. + * retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterSend(LPI2C_Type *base, void *txBuff, size_t txSize) +{ + status_t result = kStatus_Success; + uint8_t *buf = (uint8_t *)txBuff; + + assert(NULL != txBuff); + + /* Send data buffer */ + while (0U != (txSize--)) + { + /* Wait until there is room in the fifo. This also checks for errors. */ + result = LPI2C_MasterWaitForTxReady(base); + if (kStatus_Success != result) + { + break; + } + + /* Write byte into LPI2C master data register. */ + base->MTDR = *buf++; + } + + return result; +} + +/*! + * brief Performs a master polling transfer on the I2C bus. + * + * note The API does not return until the transfer succeeds or fails due + * to error happens during transfer. + * + * param base The LPI2C peripheral base address. + * param transfer Pointer to the transfer structure. + * retval #kStatus_Success Data was received successfully. + * retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterTransferBlocking(LPI2C_Type *base, lpi2c_master_transfer_t *transfer) +{ + assert(NULL != transfer); + assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); + + status_t result = kStatus_Success; + uint16_t commandBuffer[7]; + uint32_t cmdCount = 0U; + + /* Check transfer data size in read operation. */ + if ((transfer->direction == kLPI2C_Read) && + (transfer->dataSize > ((size_t)256 * (size_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base)))) + { + return kStatus_InvalidArgument; + } + + /* Enable the master function and disable the slave function. */ + LPI2C_MasterEnable(base, true); + LPI2C_SlaveEnable(base, false); + + /* Return an error if the bus is already in use not by us. */ + result = LPI2C_CheckForBusyBus(base); + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_c_ref_2$ + */ + if (kStatus_Success == result) + { + /* Clear all flags. */ + LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterClearFlags); + + /* Turn off auto-stop option. */ + base->MCFGR1 &= ~LPI2C_MCFGR1_AUTOSTOP_MASK; + + lpi2c_direction_t direction = (0U != transfer->subaddressSize) ? kLPI2C_Write : transfer->direction; + if (0U == (transfer->flags & (uint32_t)kLPI2C_TransferNoStartFlag)) + { + commandBuffer[cmdCount++] = + (uint16_t)kStartCmd | + (uint16_t)((uint16_t)((uint16_t)transfer->slaveAddress << 1U) | (uint16_t)direction); + } + + /* Subaddress, MSB first. */ + if (0U != transfer->subaddressSize) + { + uint32_t subaddressRemaining = transfer->subaddressSize; + while (0U != subaddressRemaining--) + { + uint8_t subaddressByte = (uint8_t)((transfer->subaddress >> (8U * subaddressRemaining)) & 0xffU); + commandBuffer[cmdCount++] = subaddressByte; + } + } + + /* Reads need special handling. */ + if ((0U != transfer->dataSize) && (transfer->direction == kLPI2C_Read)) + { + /* Need to send repeated start if switching directions to read. */ + if (direction == kLPI2C_Write) + { + commandBuffer[cmdCount++] = + (uint16_t)kStartCmd | + (uint16_t)((uint16_t)((uint16_t)transfer->slaveAddress << 1U) | (uint16_t)kLPI2C_Read); + } + } + + /* Send command buffer */ + uint32_t index = 0U; + while (0U != cmdCount--) + { + /* Wait until there is room in the fifo. This also checks for errors. */ + result = LPI2C_MasterWaitForTxReady(base); + if (kStatus_Success != result) + { + break; + } + + /* Write byte into LPI2C master data register. */ + base->MTDR = commandBuffer[index]; + index++; + } + + if (kStatus_Success == result) + { + /* Transmit data. */ + if ((transfer->direction == kLPI2C_Write) && (transfer->dataSize > 0U)) + { + /* Send Data. */ + result = LPI2C_MasterSend(base, transfer->data, transfer->dataSize); + } + + /* Receive Data. */ + if ((transfer->direction == kLPI2C_Read) && (transfer->dataSize > 0U)) + { + result = LPI2C_MasterReceive(base, transfer->data, transfer->dataSize); + } + /* + * $Branch Coverage Justification$ + * Errors cannot be simulated by software during transmission.(will improve) + */ + if (kStatus_Success == result) + { + if ((transfer->flags & (uint32_t)kLPI2C_TransferNoStopFlag) == 0U) + { + result = LPI2C_MasterStop(base); + } + } + } + + /* Transmit fail */ + if (kStatus_Success != result) + { + if ((transfer->flags & (uint32_t)kLPI2C_TransferNoStopFlag) == 0U) + { + (void)LPI2C_MasterStop(base); + } + } + } + + return result; +} + +/*! + * brief Creates a new handle for the LPI2C master non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the LPI2C_MasterTransferAbort() API shall be called. + * + * + * note The function also enables the NVIC IRQ for the input LPI2C. Need to notice + * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + * + * param base The LPI2C peripheral base address. + * param[out] handle Pointer to the LPI2C master driver handle. + * param callback User provided pointer to the asynchronous callback function. + * param userData User provided pointer to the application callback data. + */ +void LPI2C_MasterTransferCreateHandle(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_master_transfer_callback_t callback, + void *userData) +{ + uint32_t instance; + + assert(NULL != handle); + + /* Clear out the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Look up instance number */ + instance = LPI2C_GetInstance(base); + + /* Save base and instance. */ + handle->completionCallback = callback; + handle->userData = userData; + + /* Save this handle for IRQ use. */ + s_lpi2cMasterHandle[instance] = handle; + + /* Set irq handler. */ + s_lpi2cMasterIsr = LPI2C_MasterTransferHandleIRQ; + + /* Clear internal IRQ enables and enable NVIC IRQ. */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); + + /* Enable NVIC IRQ, this only enables the IRQ directly connected to the NVIC. + In some cases the LPI2C IRQ is configured through INTMUX, user needs to enable + INTMUX IRQ in application code. */ + (void)EnableIRQ(kLpi2cIrqs[instance]); +} + +static void LPI2C_TransferStateMachineSendCommand(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams) +{ + assert(stateParams != NULL); + uint16_t sendval; + + /* Make sure there is room in the tx fifo for the next command. */ + if (0U == (stateParams->txCount)--) + { + stateParams->state_complete = true; + return; + } + + /* Issue command. buf is a uint8_t* pointing at the uint16 command array. */ + sendval = ((uint16_t)handle->buf[0]) | (((uint16_t)handle->buf[1]) << 8U); + base->MTDR = sendval; + handle->buf++; + handle->buf++; + + /* Count down until all commands are sent. */ + if (--handle->remainingBytes == 0U) + { + /* Choose next state and set up buffer pointer and count. */ + if (0U != handle->transfer.dataSize) + { + /* Either a send or receive transfer is next. */ + handle->state = (uint8_t)kTransferDataState; + handle->buf = (uint8_t *)handle->transfer.data; + handle->remainingBytes = (uint16_t)handle->transfer.dataSize; + if (handle->transfer.direction == kLPI2C_Read) + { + /* Disable TX interrupt */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterTxReadyFlag); + /* Issue command to receive data. A single write to MTDR can issue read operation of + 0xFFU + 1 byte of data at most, so when the dataSize is larger than 0x100U, push + multiple read commands to MTDR until dataSize is reached. */ + size_t tmpRxSize = handle->transfer.dataSize; + while (tmpRxSize != 0U) + { + LPI2C_MasterGetFifoCounts(base, NULL, &stateParams->txCount); + /* + * $Branch Coverage Justification$ + * The transmission commands will not exceed FIFO SIZE.(will improve) + */ + while ((size_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base) == stateParams->txCount) + { + LPI2C_MasterGetFifoCounts(base, NULL, &stateParams->txCount); + } + + if (tmpRxSize > 256U) + { + base->MTDR = (uint32_t)(kRxDataCmd) | (uint32_t)LPI2C_MTDR_DATA(0xFFU); + tmpRxSize -= 256U; + } + else + { + base->MTDR = (uint32_t)(kRxDataCmd) | (uint32_t)LPI2C_MTDR_DATA(tmpRxSize - 1U); + tmpRxSize = 0U; + } + } + } + } + else + { + /* No transfer, so move to stop state. */ + handle->state = (uint8_t)kStopState; + } + } +} + +static void LPI2C_TransferStateMachineReadCommand(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams) +{ + assert(stateParams != NULL); + + /* Make sure there is room in the tx fifo for the read command. */ + if (0U == (stateParams->txCount)--) + { + stateParams->state_complete = true; + return; + } + + base->MTDR = (uint32_t)kRxDataCmd | LPI2C_MTDR_DATA(handle->transfer.dataSize - 1U); + + /* Move to transfer state. */ + handle->state = (uint8_t)kTransferDataState; + if (handle->transfer.direction == kLPI2C_Read) + { + /* Disable TX interrupt */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterTxReadyFlag); + } +} + +static void LPI2C_TransferStateMachineTransferData(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams) +{ + assert(stateParams != NULL); + + if (handle->transfer.direction == kLPI2C_Write) + { + /* Make sure there is room in the tx fifo. */ + if (0U == stateParams->txCount--) + { + stateParams->state_complete = true; + return; + } + + /* Put byte to send in fifo. */ + base->MTDR = *(handle->buf)++; + } + else + { + /* XXX handle receive sizes > 256, use kIssueReadCommandState */ + /* Make sure there is data in the rx fifo. */ + if (0U == stateParams->rxCount--) + { + stateParams->state_complete = true; + return; + } + + /* Read byte from fifo. */ + *(handle->buf)++ = (uint8_t)(base->MRDR & LPI2C_MRDR_DATA_MASK); + } + + /* Move to stop when the transfer is done. */ + if (--handle->remainingBytes == 0U) + { + if (handle->transfer.direction == kLPI2C_Write) + { + stateParams->state_complete = true; + } + handle->state = (uint8_t)kStopState; + } +} + +static void LPI2C_TransferStateMachineStopState(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams, + bool *isDone) +{ + assert(stateParams != NULL); + + /* Only issue a stop transition if the caller requested it. */ + if ((handle->transfer.flags & (uint32_t)kLPI2C_TransferNoStopFlag) == 0U) + { + /* Make sure there is room in the tx fifo for the stop command. */ + if (0U == (stateParams->txCount)--) + { + stateParams->state_complete = true; + return; + } + + base->MTDR = (uint32_t)kStopCmd; + } + else + { + /* If all data is read and no stop flag is required to send, we are done. */ + if (handle->transfer.direction == kLPI2C_Read) + { + *isDone = true; + } + stateParams->state_complete = true; + } + handle->state = (uint8_t)kWaitForCompletionState; +} + +static void LPI2C_TransferStateMachineWaitState(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_state_machine_param_t *stateParams, + bool *isDone) +{ + assert(stateParams != NULL); + + if ((handle->transfer.flags & (uint32_t)kLPI2C_TransferNoStopFlag) == 0U) + { + /* We stay in this state until the stop state is detected. */ + if (0U != ((stateParams->status) & (uint32_t)kLPI2C_MasterStopDetectFlag)) + { + *isDone = true; + } + } + else + { + /* If all data is pushed to FIFO and no stop flag is required to send, we need to make sure they + are all send out to bus. */ + if ((handle->transfer.direction == kLPI2C_Write) && ((base->MFSR & LPI2C_MFSR_TXCOUNT_MASK) == 0U)) + { + /* We stay in this state until the data is sent out to bus. */ + *isDone = true; + } + } + stateParams->state_complete = true; +} + +/*! + * @brief Execute states until FIFOs are exhausted. + * @param handle Master nonblocking driver handle. + * @param[out] isDone Set to true if the transfer has completed. + * @retval #kStatus_Success + * @retval #kStatus_LPI2C_PinLowTimeout + * @retval #kStatus_LPI2C_ArbitrationLost + * @retval #kStatus_LPI2C_Nak + * @retval #kStatus_LPI2C_FifoError + */ +static status_t LPI2C_RunTransferStateMachine(LPI2C_Type *base, lpi2c_master_handle_t *handle, bool *isDone) +{ + assert(NULL != base && NULL != handle && NULL != isDone); + + status_t result = kStatus_Success; + lpi2c_state_machine_param_t stateParams; + (void)memset(&stateParams, 0, sizeof(stateParams)); + + stateParams.state_complete = false; + + /* Set default isDone return value. */ + *isDone = false; + + /* Check for errors. */ + stateParams.status = LPI2C_MasterGetStatusFlags(base); + + /* Get fifo counts. */ + LPI2C_MasterGetFifoCounts(base, &stateParams.rxCount, &stateParams.txCount); + + /* For the last byte, nack flag is expected. + Do not check and clear kLPI2C_MasterNackDetectFlag for the last byte, + in case FIFO is emptied when stop command has not been sent. */ + if (handle->remainingBytes == 0U) + { + /* When data size is not zero which means it is not only one byte of address is sent, and */ + /* when the txfifo is empty, or have one byte which is the stop command, then the nack status can be ignored. */ + if (((handle->transfer).dataSize != 0U) && + ((stateParams.txCount == 0U) || + (((stateParams.txCount) == 1U) && (handle->state == (uint8_t)kWaitForCompletionState) && + (((handle->transfer).flags & (uint32_t)kLPI2C_TransferNoStopFlag) == 0U)))) + { + (stateParams.status) &= ~(uint32_t)kLPI2C_MasterNackDetectFlag; + } + } + + result = LPI2C_MasterCheckAndClearError(base, stateParams.status); + + if (kStatus_Success == result) + { + /* Compute room in tx fifo */ + stateParams.txCount = (size_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base) - stateParams.txCount; + + while (!stateParams.state_complete) + { + /* Execute the state. */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_c_ref_1$ + */ + switch (handle->state) + { + case (uint8_t)kSendCommandState: + LPI2C_TransferStateMachineSendCommand(base, handle, &stateParams); + break; + + case (uint8_t)kIssueReadCommandState: + LPI2C_TransferStateMachineReadCommand(base, handle, &stateParams); + break; + + case (uint8_t)kTransferDataState: + LPI2C_TransferStateMachineTransferData(base, handle, &stateParams); + break; + + case (uint8_t)kStopState: + LPI2C_TransferStateMachineStopState(base, handle, &stateParams, isDone); + break; + + case (uint8_t)kWaitForCompletionState: + LPI2C_TransferStateMachineWaitState(base, handle, &stateParams, isDone); + break; + default: + assert(false); + break; + } + } + } + return result; +} + +/*! + * @brief Prepares the transfer state machine and fills in the command buffer. + * @param handle Master nonblocking driver handle. + */ +static void LPI2C_InitTransferStateMachine(lpi2c_master_handle_t *handle) +{ + lpi2c_master_transfer_t *xfer = &handle->transfer; + + /* Handle no start option. */ + if (0U != (xfer->flags & (uint32_t)kLPI2C_TransferNoStartFlag)) + { + if (xfer->direction == kLPI2C_Read) + { + /* Need to issue read command first. */ + handle->state = (uint8_t)kIssueReadCommandState; + } + else + { + /* Start immediately in the data transfer state. */ + handle->state = (uint8_t)kTransferDataState; + } + + handle->buf = (uint8_t *)xfer->data; + handle->remainingBytes = (uint16_t)xfer->dataSize; + } + else + { + uint16_t *cmd = (uint16_t *)&handle->commandBuffer; + uint32_t cmdCount = 0U; + + /* Initial direction depends on whether a subaddress was provided, and of course the actual */ + /* data transfer direction. */ + lpi2c_direction_t direction = (0U != xfer->subaddressSize) ? kLPI2C_Write : xfer->direction; + + /* Start command. */ + cmd[cmdCount++] = + (uint16_t)kStartCmd | (uint16_t)((uint16_t)((uint16_t)xfer->slaveAddress << 1U) | (uint16_t)direction); + + /* Subaddress, MSB first. */ + if (0U != xfer->subaddressSize) + { + uint32_t subaddressRemaining = xfer->subaddressSize; + while (0U != (subaddressRemaining--)) + { + uint8_t subaddressByte = (uint8_t)((xfer->subaddress >> (8U * subaddressRemaining)) & 0xffU); + cmd[cmdCount++] = subaddressByte; + } + } + + /* Reads need special handling. */ + if ((0U != xfer->dataSize) && (xfer->direction == kLPI2C_Read)) + { + /* Need to send repeated start if switching directions to read. */ + if (direction == kLPI2C_Write) + { + cmd[cmdCount++] = (uint16_t)kStartCmd | + (uint16_t)((uint16_t)((uint16_t)xfer->slaveAddress << 1U) | (uint16_t)kLPI2C_Read); + } + } + + /* Set up state machine for transferring the commands. */ + handle->state = (uint8_t)kSendCommandState; + handle->remainingBytes = (uint16_t)cmdCount; + handle->buf = (uint8_t *)&handle->commandBuffer; + } +} + +/*! + * brief Performs a non-blocking transaction on the I2C bus. + * + * param base The LPI2C peripheral base address. + * param handle Pointer to the LPI2C master driver handle. + * param transfer The pointer to the transfer descriptor. + * retval #kStatus_Success The transaction was started successfully. + * retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + */ +status_t LPI2C_MasterTransferNonBlocking(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_master_transfer_t *transfer) +{ + assert(NULL != handle); + assert(NULL != transfer); + assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); + + status_t result; + + /* Check transfer data size in read operation. */ + if ((transfer->direction == kLPI2C_Read) && + (transfer->dataSize > (256U * (uint32_t)FSL_FEATURE_LPI2C_FIFO_SIZEn(base)))) + { + return kStatus_InvalidArgument; + } + + /* Return busy if another transaction is in progress. */ + if (handle->state != (uint8_t)kIdleState) + { + result = kStatus_LPI2C_Busy; + } + else + { + result = LPI2C_CheckForBusyBus(base); + } + + if ((status_t)kStatus_Success == result) + { + /* Enable the master function and disable the slave function. */ + LPI2C_MasterEnable(base, true); + LPI2C_SlaveEnable(base, false); + + /* Disable LPI2C IRQ sources while we configure stuff. */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); + + /* Reset FIFO in case there are data. */ + base->MCR |= LPI2C_MCR_RRF_MASK | LPI2C_MCR_RTF_MASK; + + /* Save transfer into handle. */ + handle->transfer = *transfer; + + /* Generate commands to send. */ + LPI2C_InitTransferStateMachine(handle); + + /* Clear all flags. */ + LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterClearFlags); + + /* Turn off auto-stop option. */ + base->MCFGR1 &= ~LPI2C_MCFGR1_AUTOSTOP_MASK; + + /* Enable LPI2C internal IRQ sources. NVIC IRQ was enabled in CreateHandle() */ + LPI2C_MasterEnableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); + } + + return result; +} + +/*! + * brief Returns number of bytes transferred so far. + * param base The LPI2C peripheral base address. + * param handle Pointer to the LPI2C master driver handle. + * param[out] count Number of bytes transferred so far by the non-blocking transaction. + * retval #kStatus_Success + * retval #kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. + */ +status_t LPI2C_MasterTransferGetCount(LPI2C_Type *base, lpi2c_master_handle_t *handle, size_t *count) +{ + status_t result = kStatus_Success; + + assert(NULL != handle); + + if (NULL == count) + { + result = kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + else if (handle->state == (uint8_t)kIdleState) + { + *count = 0; + result = kStatus_NoTransferInProgress; + } + else + { + uint8_t state; + uint16_t remainingBytes; + uint32_t dataSize; + + /* Cache some fields with IRQs disabled. This ensures all field values */ + /* are synchronized with each other during an ongoing transfer. */ + uint32_t irqs = LPI2C_MasterGetEnabledInterrupts(base); + LPI2C_MasterDisableInterrupts(base, irqs); + state = handle->state; + remainingBytes = handle->remainingBytes; + dataSize = handle->transfer.dataSize; + LPI2C_MasterEnableInterrupts(base, irqs); + + /* Get transfer count based on current transfer state. */ + switch (state) + { + case (uint8_t)kIdleState: + case (uint8_t)kSendCommandState: + case (uint8_t) + kIssueReadCommandState: /* XXX return correct value for this state when >256 reads are supported */ + *count = 0; + break; + + case (uint8_t)kTransferDataState: + *count = dataSize - remainingBytes; + break; + + case (uint8_t)kStopState: + case (uint8_t)kWaitForCompletionState: + default: + *count = dataSize; + break; + } + } + + return result; +} + +/*! + * brief Terminates a non-blocking LPI2C master transmission early. + * + * note It is not safe to call this function from an IRQ handler that has a higher priority than the + * LPI2C peripheral's IRQ priority. + * + * param base The LPI2C peripheral base address. + * param handle Pointer to the LPI2C master driver handle. + */ +void LPI2C_MasterTransferAbort(LPI2C_Type *base, lpi2c_master_handle_t *handle) +{ + if (handle->state != (uint8_t)kIdleState) + { + /* Disable internal IRQ enables. */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); + + /* Reset fifos. */ + base->MCR |= LPI2C_MCR_RRF_MASK | LPI2C_MCR_RTF_MASK; + + /* If master is still busy and has not send out stop signal yet. */ + if ((LPI2C_MasterGetStatusFlags(base) & ((uint32_t)kLPI2C_MasterStopDetectFlag | + (uint32_t)kLPI2C_MasterBusyFlag)) == (uint32_t)kLPI2C_MasterBusyFlag) + { + /* Send a stop command to finalize the transfer. */ + base->MTDR = (uint32_t)kStopCmd; + } + + /* Reset handle. */ + handle->state = (uint8_t)kIdleState; + } +} + +/*! + * brief Reusable routine to handle master interrupts. + * note This function does not need to be called unless you are reimplementing the + * nonblocking API's interrupt handler routines to add special functionality. + * param base The LPI2C peripheral base address. + * param lpi2cMasterHandle Pointer to the LPI2C master driver handle. + */ +void LPI2C_MasterTransferHandleIRQ(LPI2C_Type *base, void *lpi2cMasterHandle) +{ + assert(lpi2cMasterHandle != NULL); + + lpi2c_master_handle_t *handle = (lpi2c_master_handle_t *)lpi2cMasterHandle; + bool isDone = false; + status_t result; + + /* Don't do anything if we don't have a valid handle. */ + if (NULL != handle) + { + if (handle->state != (uint8_t)kIdleState) + { + result = LPI2C_RunTransferStateMachine(base, handle, &isDone); + + if ((result != kStatus_Success) || isDone) + { + /* Handle error, terminate xfer */ + if (result != kStatus_Success) + { + LPI2C_MasterTransferAbort(base, handle); + } + + /* Disable internal IRQ enables. */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); + + /* Set handle to idle state. */ + handle->state = (uint8_t)kIdleState; + + /* Invoke callback. */ + if (NULL != handle->completionCallback) + { + handle->completionCallback(base, handle, result, handle->userData); + } + } + } + } +} + +/*! + * brief Provides a default configuration for the LPI2C slave peripheral. + * + * This function provides the following default configuration for the LPI2C slave peripheral: + * code + * slaveConfig->enableSlave = true; + * slaveConfig->address0 = 0U; + * slaveConfig->address1 = 0U; + * slaveConfig->addressMatchMode = kLPI2C_MatchAddress0; + * slaveConfig->filterDozeEnable = true; + * slaveConfig->filterEnable = true; + * slaveConfig->enableGeneralCall = false; + * slaveConfig->sclStall.enableAck = false; + * slaveConfig->sclStall.enableTx = true; + * slaveConfig->sclStall.enableRx = true; + * slaveConfig->sclStall.enableAddress = true; + * slaveConfig->ignoreAck = false; + * slaveConfig->enableReceivedAddressRead = false; + * slaveConfig->sdaGlitchFilterWidth_ns = 0; + * slaveConfig->sclGlitchFilterWidth_ns = 0; + * slaveConfig->dataValidDelay_ns = 0; + * slaveConfig->clockHoldTime_ns = 0; + * endcode + * + * After calling this function, override any settings to customize the configuration, + * prior to initializing the master driver with LPI2C_SlaveInit(). Be sure to override at least the a + * address0 member of the configuration structure with the desired slave address. + * + * param[out] slaveConfig User provided configuration structure that is set to default values. Refer to + * #lpi2c_slave_config_t. + */ +void LPI2C_SlaveGetDefaultConfig(lpi2c_slave_config_t *slaveConfig) +{ + /* Initializes the configure structure to zero. */ + (void)memset(slaveConfig, 0, sizeof(*slaveConfig)); + + slaveConfig->enableSlave = true; + slaveConfig->address0 = 0U; + slaveConfig->address1 = 0U; + slaveConfig->addressMatchMode = kLPI2C_MatchAddress0; + slaveConfig->filterDozeEnable = true; + slaveConfig->filterEnable = true; + slaveConfig->enableGeneralCall = false; + slaveConfig->sclStall.enableAck = false; + slaveConfig->sclStall.enableTx = true; + slaveConfig->sclStall.enableRx = true; + slaveConfig->sclStall.enableAddress = false; + slaveConfig->ignoreAck = false; + slaveConfig->enableReceivedAddressRead = false; + slaveConfig->sdaGlitchFilterWidth_ns = 0U; /* Set to 0 to disable the function */ + slaveConfig->sclGlitchFilterWidth_ns = 0U; /* Set to 0 to disable the function */ + slaveConfig->dataValidDelay_ns = 0U; + /* When enabling the slave tx SCL stall, set the default clock hold time to 250ns according + to I2C spec for standard mode baudrate(100k). User can manually change it to 100ns or 50ns + for fast-mode(400k) or fast-mode+(1m). */ + slaveConfig->clockHoldTime_ns = 250U; +} + +/*! + * brief Initializes the LPI2C slave peripheral. + * + * This function enables the peripheral clock and initializes the LPI2C slave peripheral as described by the user + * provided configuration. + * + * param base The LPI2C peripheral base address. + * param slaveConfig User provided peripheral configuration. Use LPI2C_SlaveGetDefaultConfig() to get a set of defaults + * that you can override. + * param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the filter widths, + * data valid delay, and clock hold time. + */ +void LPI2C_SlaveInit(LPI2C_Type *base, const lpi2c_slave_config_t *slaveConfig, uint32_t sourceClock_Hz) +{ + uint32_t tmpReg; + uint32_t tmpCycle; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + + uint32_t instance = LPI2C_GetInstance(base); + + /* Ungate the clock. */ + (void)CLOCK_EnableClock(kLpi2cClocks[instance]); +#if defined(LPI2C_PERIPH_CLOCKS) + /* Ungate the functional clock in initialize function. */ + CLOCK_EnableClock(kLpi2cPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(LPI2C_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_lpi2cResets[LPI2C_GetInstance(base)]); +#endif + + /* Restore to reset conditions. */ + LPI2C_SlaveReset(base); + + /* Configure peripheral. */ + base->SAMR = LPI2C_SAMR_ADDR0(slaveConfig->address0) | LPI2C_SAMR_ADDR1(slaveConfig->address1); + + base->SCFGR1 = + LPI2C_SCFGR1_ADDRCFG(slaveConfig->addressMatchMode) | LPI2C_SCFGR1_IGNACK(slaveConfig->ignoreAck) | + LPI2C_SCFGR1_RXCFG(slaveConfig->enableReceivedAddressRead) | LPI2C_SCFGR1_GCEN(slaveConfig->enableGeneralCall) | + LPI2C_SCFGR1_ACKSTALL(slaveConfig->sclStall.enableAck) | LPI2C_SCFGR1_TXDSTALL(slaveConfig->sclStall.enableTx) | + LPI2C_SCFGR1_RXSTALL(slaveConfig->sclStall.enableRx) | + LPI2C_SCFGR1_ADRSTALL(slaveConfig->sclStall.enableAddress); + + /* Calculate SDA filter width. The width is equal to FILTSDA+3 cycles of functional clock. + And set FILTSDA to 0 disables the fileter, so the min value is 4. */ + tmpReg = LPI2C_SCFGR2_FILTSDA( + LPI2C_GetCyclesForWidth(sourceClock_Hz, slaveConfig->sdaGlitchFilterWidth_ns, 4U, + (LPI2C_SCFGR2_FILTSDA_MASK >> LPI2C_SCFGR2_FILTSDA_SHIFT) + 3U, 0U) - + 3U); + + /* Calculate SDL filter width. The width is equal to FILTSCL+3 cycles of functional clock. + And set FILTSCL to 0 disables the fileter, so the min value is 4. */ + tmpCycle = LPI2C_GetCyclesForWidth(sourceClock_Hz, slaveConfig->sclGlitchFilterWidth_ns, 4U, + (LPI2C_SCFGR2_FILTSCL_MASK >> LPI2C_SCFGR2_FILTSCL_SHIFT) + 3U, 0U); + tmpReg |= LPI2C_SCFGR2_FILTSCL(tmpCycle - 3U); + + /* Calculate data valid time. The time is equal to FILTSCL+DATAVD+3 cycles of functional clock. + So the min value is FILTSCL+3. */ + tmpReg |= LPI2C_SCFGR2_DATAVD( + LPI2C_GetCyclesForWidth(sourceClock_Hz, slaveConfig->dataValidDelay_ns, tmpCycle, + tmpCycle + (LPI2C_SCFGR2_DATAVD_MASK >> LPI2C_SCFGR2_DATAVD_SHIFT), 0U) - + tmpCycle); + + /* Calculate clock hold time. The time is equal to CLKHOLD+3 cycles of functional clock. + So the min value is 3. */ + base->SCFGR2 = + tmpReg | LPI2C_SCFGR2_CLKHOLD( + LPI2C_GetCyclesForWidth(sourceClock_Hz, slaveConfig->clockHoldTime_ns, 3U, + (LPI2C_SCFGR2_CLKHOLD_MASK >> LPI2C_SCFGR2_CLKHOLD_SHIFT) + 3U, 0U) - + 3U); + + /* Save SCR to last so we don't enable slave until it is configured */ + base->SCR = LPI2C_SCR_FILTDZ(!slaveConfig->filterDozeEnable) | LPI2C_SCR_FILTEN(slaveConfig->filterEnable) | + LPI2C_SCR_SEN(slaveConfig->enableSlave); +} + +/*! + * brief Deinitializes the LPI2C slave peripheral. + * + * This function disables the LPI2C slave peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * param base The LPI2C peripheral base address. + */ +void LPI2C_SlaveDeinit(LPI2C_Type *base) +{ + LPI2C_SlaveReset(base); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + + uint32_t instance = LPI2C_GetInstance(base); + + /* Gate the clock. */ + (void)CLOCK_DisableClock(kLpi2cClocks[instance]); + +#if defined(LPI2C_PERIPH_CLOCKS) + /* Gate the functional clock. */ + CLOCK_DisableClock(kLpi2cPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * @brief Convert provided flags to status code, and clear any errors if present. + * @param base The LPI2C peripheral base address. + * @param status Current status flags value that will be checked. + * @retval #kStatus_Success + * @retval #kStatus_LPI2C_BitError + * @retval #kStatus_LPI2C_FifoError + */ +static status_t LPI2C_SlaveCheckAndClearError(LPI2C_Type *base, uint32_t flags) +{ + status_t result = kStatus_Success; + + flags &= (uint32_t)kLPI2C_SlaveErrorFlags; + if (0U != flags) + { + /* + * $Branch Coverage Justification$ + * It is hard to simulate bitError in automation test environment, need interference on bus.(will improve) + */ + if (0U != (flags & (uint32_t)kLPI2C_SlaveBitErrFlag)) + { + result = kStatus_LPI2C_BitError; + } + else if (0U != (flags & (uint32_t)kLPI2C_SlaveFifoErrFlag)) + { + result = kStatus_LPI2C_FifoError; + } + else + { + ; /* Intentional empty */ + } + + /* Clear the errors. */ + LPI2C_SlaveClearStatusFlags(base, flags); + } + else + { + ; /* Intentional empty */ + } + + return result; +} + +/*! + * brief Performs a polling send transfer on the I2C bus. + * + * param base The LPI2C peripheral base address. + * param txBuff The pointer to the data to be transferred. + * param txSize The length in bytes of the data to be transferred. + * param[out] actualTxSize + * return Error or success status returned by API. + */ +status_t LPI2C_SlaveSend(LPI2C_Type *base, void *txBuff, size_t txSize, size_t *actualTxSize) +{ + status_t result = kStatus_Success; + uint8_t *buf = (uint8_t *)txBuff; + size_t remaining = txSize; + + assert(NULL != txBuff); + +#if I2C_RETRY_TIMES != 0U + uint32_t waitTimes = I2C_RETRY_TIMES; +#endif + + /* Clear stop flag. */ + LPI2C_SlaveClearStatusFlags(base, + (uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag); + + while (0U != remaining) + { + uint32_t flags; + + /* Wait until we can transmit. */ + do + { + /* Check for errors */ + flags = LPI2C_SlaveGetStatusFlags(base); + result = LPI2C_SlaveCheckAndClearError(base, flags); + if (kStatus_Success != result) + { + if (NULL != actualTxSize) + { + *actualTxSize = txSize - remaining; + } + break; + } +#if I2C_RETRY_TIMES != 0U + waitTimes--; + } while ((0U == (flags & ((uint32_t)kLPI2C_SlaveTxReadyFlag | (uint32_t)kLPI2C_SlaveStopDetectFlag | + (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))) && + (0U != waitTimes)); + if (0U == waitTimes) + { + result = kStatus_LPI2C_Timeout; + } +#else + } while (0U == (flags & ((uint32_t)kLPI2C_SlaveTxReadyFlag | (uint32_t)kLPI2C_SlaveStopDetectFlag | + (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))); +#endif + + if (kStatus_Success != result) + { + break; + } + + /* Send a byte. */ + if (0U != (flags & (uint32_t)kLPI2C_SlaveTxReadyFlag)) + { + base->STDR = *buf++; + --remaining; + } + + /* Exit loop if we see a stop or restart in transfer*/ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_c_ref_3$ + */ + if ((0U != (flags & ((uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))) && + (remaining != 0U)) + { + LPI2C_SlaveClearStatusFlags( + base, (uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag); + break; + } + } + + if (NULL != actualTxSize) + { + *actualTxSize = txSize - remaining; + } + + return result; +} + +/*! + * brief Performs a polling receive transfer on the I2C bus. + * + * param base The LPI2C peripheral base address. + * param rxBuff The pointer to the data to be transferred. + * param rxSize The length in bytes of the data to be transferred. + * param[out] actualRxSize + * return Error or success status returned by API. + */ +status_t LPI2C_SlaveReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize, size_t *actualRxSize) +{ + status_t result = kStatus_Success; + uint8_t *buf = (uint8_t *)rxBuff; + size_t remaining = rxSize; + + assert(NULL != rxBuff); + +#if I2C_RETRY_TIMES != 0U + uint32_t waitTimes = I2C_RETRY_TIMES; +#endif + + /* Clear stop flag. */ + LPI2C_SlaveClearStatusFlags(base, + (uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag); + + while (0U != remaining) + { + uint32_t flags; + + /* Wait until we can receive. */ + do + { + /* Check for errors */ + flags = LPI2C_SlaveGetStatusFlags(base); + result = LPI2C_SlaveCheckAndClearError(base, flags); + if (kStatus_Success != result) + { + if (NULL != actualRxSize) + { + *actualRxSize = rxSize - remaining; + } + break; + } +#if I2C_RETRY_TIMES != 0U + waitTimes--; + } while ((0U == (flags & ((uint32_t)kLPI2C_SlaveRxReadyFlag | (uint32_t)kLPI2C_SlaveStopDetectFlag | + (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))) && + (0U != waitTimes)); + if (0U == waitTimes) + { + result = kStatus_LPI2C_Timeout; + } +#else + } while (0U == (flags & ((uint32_t)kLPI2C_SlaveRxReadyFlag | (uint32_t)kLPI2C_SlaveStopDetectFlag | + (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))); +#endif + + if ((status_t)kStatus_Success != result) + { + break; + } + + /* Receive a byte. */ + if (0U != (flags & (uint32_t)kLPI2C_SlaveRxReadyFlag)) + { + *buf++ = (uint8_t)(base->SRDR & LPI2C_SRDR_DATA_MASK); + --remaining; + } + + /* Exit loop if we see a stop or restart */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_c_ref_3$ + */ + if ((0U != (flags & ((uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag))) && + (remaining != 0U)) + { + LPI2C_SlaveClearStatusFlags( + base, (uint32_t)kLPI2C_SlaveStopDetectFlag | (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag); + break; + } + } + + if (NULL != actualRxSize) + { + *actualRxSize = rxSize - remaining; + } + + return result; +} + +/*! + * brief Creates a new handle for the LPI2C slave non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the LPI2C_SlaveTransferAbort() API shall be called. + * + * note The function also enables the NVIC IRQ for the input LPI2C. Need to notice + * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + + * param base The LPI2C peripheral base address. + * param[out] handle Pointer to the LPI2C slave driver handle. + * param callback User provided pointer to the asynchronous callback function. + * param userData User provided pointer to the application callback data. + */ +void LPI2C_SlaveTransferCreateHandle(LPI2C_Type *base, + lpi2c_slave_handle_t *handle, + lpi2c_slave_transfer_callback_t callback, + void *userData) +{ + uint32_t instance; + + assert(NULL != handle); + + /* Clear out the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Look up instance number */ + instance = LPI2C_GetInstance(base); + + /* Save base and instance. */ + handle->callback = callback; + handle->userData = userData; + + /* Save this handle for IRQ use. */ + s_lpi2cSlaveHandle[instance] = handle; + + /* Set irq handler. */ + s_lpi2cSlaveIsr = LPI2C_SlaveTransferHandleIRQ; + + /* Clear internal IRQ enables and enable NVIC IRQ. */ + LPI2C_SlaveDisableInterrupts(base, (uint32_t)kLPI2C_SlaveIrqFlags); + (void)EnableIRQ(kLpi2cIrqs[instance]); + + /* Nack by default. */ + base->STAR = LPI2C_STAR_TXNACK_MASK; +} + +/*! + * brief Starts accepting slave transfers. + * + * Call this API after calling I2C_SlaveInit() and LPI2C_SlaveTransferCreateHandle() to start processing + * transactions driven by an I2C master. The slave monitors the I2C bus and pass events to the + * callback that was passed into the call to LPI2C_SlaveTransferCreateHandle(). The callback is always invoked + * from the interrupt context. + * + * The set of events received by the callback is customizable. To do so, set the a eventMask parameter to + * the OR'd combination of #lpi2c_slave_transfer_event_t enumerators for the events you wish to receive. + * The #kLPI2C_SlaveTransmitEvent and #kLPI2C_SlaveReceiveEvent events are always enabled and do not need + * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and + * receive events that are always enabled. In addition, the #kLPI2C_SlaveAllEvents constant is provided as + * a convenient way to enable all events. + * + * param base The LPI2C peripheral base address. + * param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. + * param eventMask Bit mask formed by OR'ing together #lpi2c_slave_transfer_event_t enumerators to specify + * which events to send to the callback. Other accepted values are 0 to get a default set of + * only the transmit and receive events, and #kLPI2C_SlaveAllEvents to enable all events. + * + * retval #kStatus_Success Slave transfers were successfully started. + * retval #kStatus_LPI2C_Busy Slave transfers have already been started on this handle. + */ +status_t LPI2C_SlaveTransferNonBlocking(LPI2C_Type *base, lpi2c_slave_handle_t *handle, uint32_t eventMask) +{ + status_t result = kStatus_Success; + + assert(NULL != handle); + + /* Return busy if another transaction is in progress. */ + if (handle->isBusy) + { + result = kStatus_LPI2C_Busy; + } + else + { + /* Enable the slave function and disable the master function. */ + LPI2C_MasterEnable(base, false); + LPI2C_SlaveEnable(base, true); + /* Return an error if the bus is already in use not by us. */ + uint32_t status = LPI2C_SlaveGetStatusFlags(base); + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_c_ref_2$ + */ + if ((0U != (status & (uint32_t)kLPI2C_SlaveBusBusyFlag)) && (0U == (status & (uint32_t)kLPI2C_SlaveBusyFlag))) + { + result = kStatus_LPI2C_Busy; + } + } + + if ((status_t)kStatus_Success == result) + { + /* Disable LPI2C IRQ sources while we configure stuff. */ + LPI2C_SlaveDisableInterrupts(base, (uint32_t)kLPI2C_SlaveIrqFlags); + + /* Clear transfer in handle. */ + (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); + + /* Record that we're busy. */ + handle->isBusy = true; + + /* Set up event mask. tx and rx are always enabled. */ + handle->eventMask = eventMask | (uint32_t)kLPI2C_SlaveTransmitEvent | (uint32_t)kLPI2C_SlaveReceiveEvent; + + /* Ack by default. */ + base->STAR = 0U; + + /* Clear all flags. */ + LPI2C_SlaveClearStatusFlags(base, (uint32_t)kLPI2C_SlaveClearFlags); + + /* Enable LPI2C internal IRQ sources. NVIC IRQ was enabled in CreateHandle() */ + LPI2C_SlaveEnableInterrupts(base, (uint32_t)kLPI2C_SlaveIrqFlags); + } + + return result; +} + +/*! + * brief Gets the slave transfer status during a non-blocking transfer. + * param base The LPI2C peripheral base address. + * param handle Pointer to i2c_slave_handle_t structure. + * param[out] count Pointer to a value to hold the number of bytes transferred. May be NULL if the count is not + * required. + * retval #kStatus_Success + * retval #kStatus_NoTransferInProgress + */ +status_t LPI2C_SlaveTransferGetCount(LPI2C_Type *base, lpi2c_slave_handle_t *handle, size_t *count) +{ + status_t status = kStatus_Success; + + assert(NULL != handle); + + if (count == NULL) + { + status = kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + else if (!handle->isBusy) + { + *count = 0; + status = kStatus_NoTransferInProgress; + } + + /* For an active transfer, just return the count from the handle. */ + else + { + *count = handle->transferredCount; + } + + return status; +} + +/*! + * brief Aborts the slave non-blocking transfers. + * note This API could be called at any time to stop slave for handling the bus events. + * param base The LPI2C peripheral base address. + * param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. + */ +void LPI2C_SlaveTransferAbort(LPI2C_Type *base, lpi2c_slave_handle_t *handle) +{ + assert(NULL != handle); + + /* Return idle if no transaction is in progress. */ + if (handle->isBusy) + { + /* Disable LPI2C IRQ sources. */ + LPI2C_SlaveDisableInterrupts(base, (uint32_t)kLPI2C_SlaveIrqFlags); + + /* Nack by default. */ + base->STAR = LPI2C_STAR_TXNACK_MASK; + + /* Reset transfer info. */ + (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); + + /* We're no longer busy. */ + handle->isBusy = false; + } +} + +/*! + * brief Reusable routine to handle slave interrupts. + * note This function does not need to be called unless you are reimplementing the + * non blocking API's interrupt handler routines to add special functionality. + * param base The LPI2C peripheral base address. + * param handle Pointer to #lpi2c_slave_handle_t structure which stores the transfer state. + */ +void LPI2C_SlaveTransferHandleIRQ(LPI2C_Type *base, lpi2c_slave_handle_t *handle) +{ + uint32_t flags; + lpi2c_slave_transfer_t *xfer; + + /* Check for a valid handle in case of a spurious interrupt. */ + if (NULL != handle) + { + xfer = &handle->transfer; + + /* Get status flags. */ + flags = LPI2C_SlaveGetStatusFlags(base); + + if (0U != (flags & ((uint32_t)kLPI2C_SlaveBitErrFlag | (uint32_t)kLPI2C_SlaveFifoErrFlag))) + { + xfer->event = kLPI2C_SlaveCompletionEvent; + xfer->completionStatus = LPI2C_SlaveCheckAndClearError(base, flags); + + if ((0U != (handle->eventMask & (uint32_t)kLPI2C_SlaveCompletionEvent)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + } + else + { + if (0U != + (flags & (((uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag) | ((uint32_t)kLPI2C_SlaveStopDetectFlag)))) + { + xfer->event = (0U != (flags & (uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag)) ? + kLPI2C_SlaveRepeatedStartEvent : + kLPI2C_SlaveCompletionEvent; + xfer->receivedAddress = 0U; + xfer->completionStatus = kStatus_Success; + xfer->transferredCount = handle->transferredCount; + + if (xfer->event == kLPI2C_SlaveCompletionEvent) + { + handle->isBusy = false; + } + + if (handle->wasTransmit) + { + /* Subtract one from the transmit count to offset the fact that LPI2C asserts the */ + /* tx flag before it sees the nack from the master-receiver, thus causing one more */ + /* count that the master actually receives. */ + --xfer->transferredCount; + handle->wasTransmit = false; + } + + /* Clear the flag. */ + LPI2C_SlaveClearStatusFlags(base, flags & ((uint32_t)kLPI2C_SlaveRepeatedStartDetectFlag | + (uint32_t)kLPI2C_SlaveStopDetectFlag)); + + /* Revert to sending an Ack by default, in case we sent a Nack for receive. */ + base->STAR = 0U; + + if ((0U != (handle->eventMask & (uint32_t)xfer->event)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + + if (0U != (flags & (uint32_t)kLPI2C_SlaveStopDetectFlag)) + { + /* Clean up transfer info on completion, after the callback has been invoked. */ + (void)memset(&handle->transfer, 0, sizeof(handle->transfer)); + } + } + if (0U != (flags & (uint32_t)kLPI2C_SlaveAddressValidFlag)) + { + xfer->event = kLPI2C_SlaveAddressMatchEvent; + xfer->receivedAddress = (uint8_t)(base->SASR & LPI2C_SASR_RADDR_MASK); + + /* Update handle status to busy because slave is addressed. */ + handle->isBusy = true; + if ((0U != (handle->eventMask & (uint32_t)kLPI2C_SlaveAddressMatchEvent)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + } + if (0U != (flags & (uint32_t)kLPI2C_SlaveTransmitAckFlag)) + { + xfer->event = kLPI2C_SlaveTransmitAckEvent; + + if ((0U != (handle->eventMask & (uint32_t)kLPI2C_SlaveTransmitAckEvent)) && (NULL != handle->callback)) + { + handle->callback(base, xfer, handle->userData); + } + } + + /* Handle transmit and receive. */ + if (0U != (flags & (uint32_t)kLPI2C_SlaveTxReadyFlag)) + { + handle->wasTransmit = true; + + /* If we're out of data, invoke callback to get more. */ + if ((NULL == xfer->data) || (0U == xfer->dataSize)) + { + xfer->event = kLPI2C_SlaveTransmitEvent; + if (NULL != handle->callback) + { + handle->callback(base, xfer, handle->userData); + } + + /* Clear the transferred count now that we have a new buffer. */ + handle->transferredCount = 0U; + } + + /* Transmit a byte. */ + if ((NULL != xfer->data) && (0U != xfer->dataSize)) + { + base->STDR = *xfer->data++; + --xfer->dataSize; + ++handle->transferredCount; + } + } + if (0U != (flags & (uint32_t)kLPI2C_SlaveRxReadyFlag)) + { + /* If we're out of room in the buffer, invoke callback to get another. */ + if ((NULL == xfer->data) || (0U == xfer->dataSize)) + { + xfer->event = kLPI2C_SlaveReceiveEvent; + if (NULL != handle->callback) + { + handle->callback(base, xfer, handle->userData); + } + + /* Clear the transferred count now that we have a new buffer. */ + handle->transferredCount = 0U; + } + + /* Receive a byte. */ + if ((NULL != xfer->data) && (0U != xfer->dataSize)) + { + *xfer->data++ = (uint8_t)base->SRDR; + --xfer->dataSize; + ++handle->transferredCount; + } + else + { + /* We don't have any room to receive more data, so send a nack. */ + base->STAR = LPI2C_STAR_TXNACK_MASK; + } + } + } + } +} + +#if !(defined(FSL_FEATURE_I2C_HAS_NO_IRQ) && FSL_FEATURE_I2C_HAS_NO_IRQ) +/*! + * @brief Shared IRQ handler that can call both master and slave ISRs. + * + * The master and slave ISRs are called through function pointers in order to decouple + * this code from the ISR functions. Without this, the linker would always pull in both + * ISRs and every function they call, even if only the functional API was used. + * + * @param base The LPI2C peripheral base address. + * @param instance The LPI2C peripheral instance number. + */ +static void LPI2C_CommonIRQHandler(LPI2C_Type *base, uint32_t instance) +{ + /* Check for master IRQ. */ + if ((0U != (base->MCR & LPI2C_MCR_MEN_MASK)) && (NULL != s_lpi2cMasterIsr)) + { + /* Master mode. */ + s_lpi2cMasterIsr(base, s_lpi2cMasterHandle[instance]); + } + + /* Check for slave IRQ. */ + if ((0U != (base->SCR & LPI2C_SCR_SEN_MASK)) && (NULL != s_lpi2cSlaveIsr)) + { + /* Slave mode. */ + s_lpi2cSlaveIsr(base, s_lpi2cSlaveHandle[instance]); + } + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(LPI2C0) +/* Implementation of LPI2C0 handler named in startup code. */ +void LPI2C0_DriverIRQHandler(void); +void LPI2C0_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C0, 0U); +} +#endif + +#if defined(LPI2C1) +/* Implementation of LPI2C1 handler named in startup code. */ +void LPI2C1_DriverIRQHandler(void); +void LPI2C1_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C1, 1U); +} +#endif + +#if defined(LPI2C2) +/* Implementation of LPI2C2 handler named in startup code. */ +void LPI2C2_DriverIRQHandler(void); +void LPI2C2_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C2, 2U); +} +#endif + +#if defined(LPI2C3) +/* Implementation of LPI2C3 handler named in startup code. */ +void LPI2C3_DriverIRQHandler(void); +void LPI2C3_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C3, 3U); +} +#endif + +#if defined(LPI2C4) +/* Implementation of LPI2C4 handler named in startup code. */ +void LPI2C4_DriverIRQHandler(void); +void LPI2C4_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C4, 4U); +} +#endif + +#if defined(LPI2C5) +/* Implementation of LPI2C5 handler named in startup code. */ +void LPI2C5_DriverIRQHandler(void); +void LPI2C5_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C5, 5U); +} +#endif + +#if defined(LPI2C6) +/* Implementation of LPI2C6 handler named in startup code. */ +void LPI2C6_DriverIRQHandler(void); +void LPI2C6_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C6, 6U); +} +#endif + +#if defined(LPI2C7) +/* Implementation of LPI2C7 handler named in startup code. */ +void LPI2C7_DriverIRQHandler(void); +void LPI2C7_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C7, 7U); +} +#endif + +#if defined(LPI2C8) +/* Implementation of LPI2C8 handler named in startup code. */ +void LPI2C8_DriverIRQHandler(void); +void LPI2C8_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(LPI2C8, 8U); +} +#endif + +#if defined(CM4_0__LPI2C) +/* Implementation of CM4_0__LPI2C handler named in startup code. */ +void M4_0_LPI2C_DriverIRQHandler(void); +void M4_0_LPI2C_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(CM4_0__LPI2C, LPI2C_GetInstance(CM4_0__LPI2C)); +} +#endif + +#if defined(CM4__LPI2C) +/* Implementation of CM4__LPI2C handler named in startup code. */ +void M4_LPI2C_DriverIRQHandler(void); +void M4_LPI2C_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(CM4__LPI2C, LPI2C_GetInstance(CM4__LPI2C)); +} +#endif + +#if defined(CM4_1__LPI2C) +/* Implementation of CM4_1__LPI2C handler named in startup code. */ +void M4_1_LPI2C_DriverIRQHandler(void); +void M4_1_LPI2C_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(CM4_1__LPI2C, LPI2C_GetInstance(CM4_1__LPI2C)); +} +#endif + +#if defined(DMA__LPI2C0) +/* Implementation of DMA__LPI2C0 handler named in startup code. */ +void DMA_I2C0_INT_DriverIRQHandler(void); +void DMA_I2C0_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(DMA__LPI2C0, LPI2C_GetInstance(DMA__LPI2C0)); +} +#endif + +#if defined(DMA__LPI2C1) +/* Implementation of DMA__LPI2C1 handler named in startup code. */ +void DMA_I2C1_INT_DriverIRQHandler(void); +void DMA_I2C1_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(DMA__LPI2C1, LPI2C_GetInstance(DMA__LPI2C1)); +} +#endif + +#if defined(DMA__LPI2C2) +/* Implementation of DMA__LPI2C2 handler named in startup code. */ +void DMA_I2C2_INT_DriverIRQHandler(void); +void DMA_I2C2_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(DMA__LPI2C2, LPI2C_GetInstance(DMA__LPI2C2)); +} +#endif + +#if defined(DMA__LPI2C3) +/* Implementation of DMA__LPI2C3 handler named in startup code. */ +void DMA_I2C3_INT_DriverIRQHandler(void); +void DMA_I2C3_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(DMA__LPI2C3, LPI2C_GetInstance(DMA__LPI2C3)); +} +#endif + +#if defined(DMA__LPI2C4) +/* Implementation of DMA__LPI2C3 handler named in startup code. */ +void DMA_I2C4_INT_DriverIRQHandler(void); +void DMA_I2C4_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(DMA__LPI2C4, LPI2C_GetInstance(DMA__LPI2C4)); +} +#endif + +#if defined(ADMA__LPI2C0) +/* Implementation of DMA__LPI2C0 handler named in startup code. */ +void ADMA_I2C0_INT_DriverIRQHandler(void); +void ADMA_I2C0_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(ADMA__LPI2C0, LPI2C_GetInstance(ADMA__LPI2C0)); +} +#endif + +#if defined(ADMA__LPI2C1) +/* Implementation of DMA__LPI2C1 handler named in startup code. */ +void ADMA_I2C1_INT_DriverIRQHandler(void); +void ADMA_I2C1_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(ADMA__LPI2C1, LPI2C_GetInstance(ADMA__LPI2C1)); +} +#endif + +#if defined(ADMA__LPI2C2) +/* Implementation of DMA__LPI2C2 handler named in startup code. */ +void ADMA_I2C2_INT_DriverIRQHandler(void); +void ADMA_I2C2_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(ADMA__LPI2C2, LPI2C_GetInstance(ADMA__LPI2C2)); +} +#endif + +#if defined(ADMA__LPI2C3) +/* Implementation of DMA__LPI2C3 handler named in startup code. */ +void ADMA_I2C3_INT_DriverIRQHandler(void); +void ADMA_I2C3_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(ADMA__LPI2C3, LPI2C_GetInstance(ADMA__LPI2C3)); +} +#endif + +#if defined(ADMA__LPI2C4) +/* Implementation of DMA__LPI2C3 handler named in startup code. */ +void ADMA_I2C4_INT_DriverIRQHandler(void); +void ADMA_I2C4_INT_DriverIRQHandler(void) +{ + LPI2C_CommonIRQHandler(ADMA__LPI2C4, LPI2C_GetInstance(ADMA__LPI2C4)); +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c.h new file mode 100644 index 00000000000..390bcc5a743 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c.h @@ -0,0 +1,1389 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_LPI2C_H_ +#define FSL_LPI2C_H_ + +#include +#include "fsl_device_registers.h" +#include "fsl_common.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @addtogroup lpi2c + * @{ + */ + +/*! + * @name Driver version + * @{ + */ +/*! @brief LPI2C driver version. */ +#define FSL_LPI2C_DRIVER_VERSION (MAKE_VERSION(2, 5, 4)) +/*! @} */ + +/*! @brief Retry times for waiting flag. */ +#ifndef I2C_RETRY_TIMES +#define I2C_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ +#endif + +/*! @brief LPI2C status return codes. */ +enum +{ + kStatus_LPI2C_Busy = MAKE_STATUS(kStatusGroup_LPI2C, 0), /*!< The master is already performing a transfer. */ + kStatus_LPI2C_Idle = MAKE_STATUS(kStatusGroup_LPI2C, 1), /*!< The slave driver is idle. */ + kStatus_LPI2C_Nak = MAKE_STATUS(kStatusGroup_LPI2C, 2), /*!< The slave device sent a NAK in response to a byte. */ + kStatus_LPI2C_FifoError = MAKE_STATUS(kStatusGroup_LPI2C, 3), /*!< FIFO under run or overrun. */ + kStatus_LPI2C_BitError = MAKE_STATUS(kStatusGroup_LPI2C, 4), /*!< Transferred bit was not seen on the bus. */ + kStatus_LPI2C_ArbitrationLost = MAKE_STATUS(kStatusGroup_LPI2C, 5), /*!< Arbitration lost error. */ + kStatus_LPI2C_PinLowTimeout = + MAKE_STATUS(kStatusGroup_LPI2C, 6), /*!< SCL or SDA were held low longer than the timeout. */ + kStatus_LPI2C_NoTransferInProgress = + MAKE_STATUS(kStatusGroup_LPI2C, 7), /*!< Attempt to abort a transfer when one is not in progress. */ + kStatus_LPI2C_DmaRequestFail = MAKE_STATUS(kStatusGroup_LPI2C, 8), /*!< DMA request failed. */ + kStatus_LPI2C_Timeout = MAKE_STATUS(kStatusGroup_LPI2C, 9), /*!< Timeout polling status flags. */ +}; + +/*! + * @addtogroup lpi2c_master_driver + * @{ + */ + +/*! + * @brief LPI2C master peripheral flags. + * + * The following status register flags can be cleared: + * - #kLPI2C_MasterEndOfPacketFlag + * - #kLPI2C_MasterStopDetectFlag + * - #kLPI2C_MasterNackDetectFlag + * - #kLPI2C_MasterArbitrationLostFlag + * - #kLPI2C_MasterFifoErrFlag + * - #kLPI2C_MasterPinLowTimeoutFlag + * - #kLPI2C_MasterDataMatchFlag + * + * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as + * interrupts. + * + * @note These enums are meant to be OR'd together to form a bit mask. + */ +enum _lpi2c_master_flags +{ + kLPI2C_MasterTxReadyFlag = LPI2C_MSR_TDF_MASK, /*!< Transmit data flag */ + kLPI2C_MasterRxReadyFlag = LPI2C_MSR_RDF_MASK, /*!< Receive data flag */ + kLPI2C_MasterEndOfPacketFlag = LPI2C_MSR_EPF_MASK, /*!< End Packet flag */ + kLPI2C_MasterStopDetectFlag = LPI2C_MSR_SDF_MASK, /*!< Stop detect flag */ + kLPI2C_MasterNackDetectFlag = LPI2C_MSR_NDF_MASK, /*!< NACK detect flag */ + kLPI2C_MasterArbitrationLostFlag = LPI2C_MSR_ALF_MASK, /*!< Arbitration lost flag */ + kLPI2C_MasterFifoErrFlag = LPI2C_MSR_FEF_MASK, /*!< FIFO error flag */ + kLPI2C_MasterPinLowTimeoutFlag = LPI2C_MSR_PLTF_MASK, /*!< Pin low timeout flag */ + kLPI2C_MasterDataMatchFlag = LPI2C_MSR_DMF_MASK, /*!< Data match flag */ + kLPI2C_MasterBusyFlag = LPI2C_MSR_MBF_MASK, /*!< Master busy flag */ + kLPI2C_MasterBusBusyFlag = LPI2C_MSR_BBF_MASK, /*!< Bus busy flag */ + + /*! All flags which are cleared by the driver upon starting a transfer. */ + kLPI2C_MasterClearFlags = kLPI2C_MasterEndOfPacketFlag | kLPI2C_MasterStopDetectFlag | kLPI2C_MasterNackDetectFlag | + kLPI2C_MasterArbitrationLostFlag | kLPI2C_MasterFifoErrFlag | + kLPI2C_MasterPinLowTimeoutFlag | kLPI2C_MasterDataMatchFlag, + /*! IRQ sources enabled by the non-blocking transactional API. */ + kLPI2C_MasterIrqFlags = kLPI2C_MasterArbitrationLostFlag | kLPI2C_MasterTxReadyFlag | kLPI2C_MasterRxReadyFlag | + kLPI2C_MasterStopDetectFlag | kLPI2C_MasterNackDetectFlag | kLPI2C_MasterPinLowTimeoutFlag | + kLPI2C_MasterFifoErrFlag, + /*! Errors to check for. */ + kLPI2C_MasterErrorFlags = kLPI2C_MasterNackDetectFlag | kLPI2C_MasterArbitrationLostFlag | + kLPI2C_MasterFifoErrFlag | kLPI2C_MasterPinLowTimeoutFlag +}; + +/*! @brief Direction of master and slave transfers. */ +typedef enum _lpi2c_direction +{ + kLPI2C_Write = 0U, /*!< Master transmit. */ + kLPI2C_Read = 1U /*!< Master receive. */ +} lpi2c_direction_t; + +/*! @brief LPI2C pin configuration. */ +typedef enum _lpi2c_master_pin_config +{ + kLPI2C_2PinOpenDrain = 0x0U, /*!< LPI2C Configured for 2-pin open drain mode */ + kLPI2C_2PinOutputOnly = 0x1U, /*!< LPI2C Configured for 2-pin output only mode (ultra-fast mode) */ + kLPI2C_2PinPushPull = 0x2U, /*!< LPI2C Configured for 2-pin push-pull mode */ + kLPI2C_4PinPushPull = 0x3U, /*!< LPI2C Configured for 4-pin push-pull mode */ + kLPI2C_2PinOpenDrainWithSeparateSlave = + 0x4U, /*!< LPI2C Configured for 2-pin open drain mode with separate LPI2C slave */ + kLPI2C_2PinOutputOnlyWithSeparateSlave = + 0x5U, /*!< LPI2C Configured for 2-pin output only mode(ultra-fast mode) with separate LPI2C slave */ + kLPI2C_2PinPushPullWithSeparateSlave = + 0x6U, /*!< LPI2C Configured for 2-pin push-pull mode with separate LPI2C slave */ + kLPI2C_4PinPushPullWithInvertedOutput = 0x7U /*!< LPI2C Configured for 4-pin push-pull mode(inverted outputs) */ +} lpi2c_master_pin_config_t; + +/*! @brief LPI2C master host request selection. */ +typedef enum _lpi2c_host_request_source +{ + kLPI2C_HostRequestExternalPin = 0x0U, /*!< Select the LPI2C_HREQ pin as the host request input */ + kLPI2C_HostRequestInputTrigger = 0x1U, /*!< Select the input trigger as the host request input */ +} lpi2c_host_request_source_t; + +/*! @brief LPI2C master host request pin polarity configuration. */ +typedef enum _lpi2c_host_request_polarity +{ + kLPI2C_HostRequestPinActiveLow = 0x0U, /*!< Configure the LPI2C_HREQ pin active low */ + kLPI2C_HostRequestPinActiveHigh = 0x1U /*!< Configure the LPI2C_HREQ pin active high */ +} lpi2c_host_request_polarity_t; + +/*! + * @brief Structure with settings to initialize the LPI2C master module. + * + * This structure holds configuration settings for the LPI2C peripheral. To initialize this + * structure to reasonable defaults, call the LPI2C_MasterGetDefaultConfig() function and + * pass a pointer to your configuration structure instance. + * + * The configuration structure can be made constant so it resides in flash. + */ +typedef struct _lpi2c_master_config +{ + bool enableMaster; /*!< Whether to enable master mode. */ + bool enableDoze; /*!< Whether master is enabled in doze mode. */ + bool debugEnable; /*!< Enable transfers to continue when halted in debug mode. */ + bool ignoreAck; /*!< Whether to ignore ACK/NACK. */ + lpi2c_master_pin_config_t pinConfig; /*!< The pin configuration option. */ + uint32_t baudRate_Hz; /*!< Desired baud rate in Hertz. */ + uint32_t busIdleTimeout_ns; /*!< Bus idle timeout in nanoseconds. Set to 0 to disable. */ + uint32_t pinLowTimeout_ns; /*!< Pin low timeout in nanoseconds. Set to 0 to disable. */ + uint8_t sdaGlitchFilterWidth_ns; /*!< Width in nanoseconds of glitch filter on SDA pin. Set to 0 to disable. */ + uint8_t sclGlitchFilterWidth_ns; /*!< Width in nanoseconds of glitch filter on SCL pin. Set to 0 to disable. */ + struct + { + bool enable; /*!< Enable host request. */ + lpi2c_host_request_source_t source; /*!< Host request source. */ + lpi2c_host_request_polarity_t polarity; /*!< Host request pin polarity. */ + } hostRequest; /*!< Host request options. */ +} lpi2c_master_config_t; + +/*! @brief LPI2C master data match configuration modes. */ +typedef enum _lpi2c_data_match_config_mode +{ + kLPI2C_MatchDisabled = 0x0U, /*!< LPI2C Match Disabled */ + kLPI2C_1stWordEqualsM0OrM1 = 0x2U, /*!< LPI2C Match Enabled and 1st data word equals MATCH0 OR MATCH1 */ + kLPI2C_AnyWordEqualsM0OrM1 = 0x3U, /*!< LPI2C Match Enabled and any data word equals MATCH0 OR MATCH1 */ + kLPI2C_1stWordEqualsM0And2ndWordEqualsM1 = + 0x4U, /*!< LPI2C Match Enabled and 1st data word equals MATCH0, 2nd data equals MATCH1 */ + kLPI2C_AnyWordEqualsM0AndNextWordEqualsM1 = + 0x5U, /*!< LPI2C Match Enabled and any data word equals MATCH0, next data equals MATCH1 */ + kLPI2C_1stWordAndM1EqualsM0AndM1 = + 0x6U, /*!< LPI2C Match Enabled and 1st data word and MATCH0 equals MATCH0 and MATCH1 */ + kLPI2C_AnyWordAndM1EqualsM0AndM1 = + 0x7U /*!< LPI2C Match Enabled and any data word and MATCH0 equals MATCH0 and MATCH1 */ +} lpi2c_data_match_config_mode_t; + +/*! @brief LPI2C master data match configuration structure. */ +typedef struct _lpi2c_match_config +{ + lpi2c_data_match_config_mode_t matchMode; /*!< Data match configuration setting. */ + bool rxDataMatchOnly; /*!< When set to true, received data is ignored until a successful match. */ + uint32_t match0; /*!< Match value 0. */ + uint32_t match1; /*!< Match value 1. */ +} lpi2c_data_match_config_t; + +/* Forward declaration of the transfer descriptor and handle typedefs. */ +/*! @brief LPI2C master descriptor of the transfer. */ +typedef struct _lpi2c_master_transfer lpi2c_master_transfer_t; +/*! @brief LPI2C master handle of the transfer. */ +typedef struct _lpi2c_master_handle lpi2c_master_handle_t; + +/*! + * @brief Master completion callback function pointer type. + * + * This callback is used only for the non-blocking master transfer API. Specify the callback you wish to use + * in the call to LPI2C_MasterTransferCreateHandle(). + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @param completionStatus Either kStatus_Success or an error code describing how the transfer completed. + * @param userData Arbitrary pointer-sized value passed from the application. + */ +typedef void (*lpi2c_master_transfer_callback_t)(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + status_t completionStatus, + void *userData); + +/*! + * @brief Transfer option flags. + * + * @note These enumerations are intended to be OR'd together to form a bit mask of options for + * the #_lpi2c_master_transfer::flags field. + */ +enum _lpi2c_master_transfer_flags +{ + kLPI2C_TransferDefaultFlag = 0x00U, /*!< Transfer starts with a start signal, stops with a stop signal. */ + kLPI2C_TransferNoStartFlag = 0x01U, /*!< Don't send a start condition, address, and sub address */ + kLPI2C_TransferRepeatedStartFlag = 0x02U, /*!< Send a repeated start condition */ + kLPI2C_TransferNoStopFlag = 0x04U, /*!< Don't send a stop condition. */ +}; + +/*! + * @brief Non-blocking transfer descriptor structure. + * + * This structure is used to pass transaction parameters to the LPI2C_MasterTransferNonBlocking() API. + */ +struct _lpi2c_master_transfer +{ + uint32_t flags; /*!< Bit mask of options for the transfer. See enumeration #_lpi2c_master_transfer_flags for + available options. Set to 0 or #kLPI2C_TransferDefaultFlag for normal transfers. */ + uint16_t slaveAddress; /*!< The 7-bit slave address. */ + lpi2c_direction_t direction; /*!< Either #kLPI2C_Read or #kLPI2C_Write. */ + uint32_t subaddress; /*!< Sub address. Transferred MSB first. */ + size_t subaddressSize; /*!< Length of sub address to send in bytes. Maximum size is 4 bytes. */ + void *data; /*!< Pointer to data to transfer. */ + size_t dataSize; /*!< Number of bytes to transfer. */ +}; + +/*! + * @brief Driver handle for master non-blocking APIs. + * @note The contents of this structure are private and subject to change. + */ +struct _lpi2c_master_handle +{ + uint8_t state; /*!< Transfer state machine current state. */ + uint16_t remainingBytes; /*!< Remaining byte count in current state. */ + uint8_t *buf; /*!< Buffer pointer for current state. */ + uint16_t commandBuffer[6]; /*!< LPI2C command sequence. When all 6 command words are used: + Start&addr&write[1 word] + subaddr[4 words] + restart&addr&read[1 word] */ + lpi2c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ + lpi2c_master_transfer_callback_t completionCallback; /*!< Callback function pointer. */ + void *userData; /*!< Application data passed to callback. */ +}; + +/*! @brief Typedef for master interrupt handler, used internally for LPI2C master interrupt and EDMA transactional APIs. + */ +typedef void (*lpi2c_master_isr_t)(LPI2C_Type *base, void *handle); + +/*! @} */ + +/*! + * @addtogroup lpi2c_slave_driver + * @{ + */ + +/*! + * @brief LPI2C slave peripheral flags. + * + * The following status register flags can be cleared: + * - #kLPI2C_SlaveRepeatedStartDetectFlag + * - #kLPI2C_SlaveStopDetectFlag + * - #kLPI2C_SlaveBitErrFlag + * - #kLPI2C_SlaveFifoErrFlag + * + * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as + * interrupts. + * + * @note These enumerations are meant to be OR'd together to form a bit mask. + */ +enum _lpi2c_slave_flags +{ + kLPI2C_SlaveTxReadyFlag = LPI2C_SSR_TDF_MASK, /*!< Transmit data flag */ + kLPI2C_SlaveRxReadyFlag = LPI2C_SSR_RDF_MASK, /*!< Receive data flag */ + kLPI2C_SlaveAddressValidFlag = LPI2C_SSR_AVF_MASK, /*!< Address valid flag */ + kLPI2C_SlaveTransmitAckFlag = LPI2C_SSR_TAF_MASK, /*!< Transmit ACK flag */ + kLPI2C_SlaveRepeatedStartDetectFlag = LPI2C_SSR_RSF_MASK, /*!< Repeated start detect flag */ + kLPI2C_SlaveStopDetectFlag = LPI2C_SSR_SDF_MASK, /*!< Stop detect flag */ + kLPI2C_SlaveBitErrFlag = LPI2C_SSR_BEF_MASK, /*!< Bit error flag */ + kLPI2C_SlaveFifoErrFlag = LPI2C_SSR_FEF_MASK, /*!< FIFO error flag */ + kLPI2C_SlaveAddressMatch0Flag = LPI2C_SSR_AM0F_MASK, /*!< Address match 0 flag */ + kLPI2C_SlaveAddressMatch1Flag = LPI2C_SSR_AM1F_MASK, /*!< Address match 1 flag */ + kLPI2C_SlaveGeneralCallFlag = LPI2C_SSR_GCF_MASK, /*!< General call flag */ + kLPI2C_SlaveBusyFlag = LPI2C_SSR_SBF_MASK, /*!< Master busy flag */ + kLPI2C_SlaveBusBusyFlag = LPI2C_SSR_BBF_MASK, /*!< Bus busy flag */ + /*! All flags which are cleared by the driver upon starting a transfer. */ + kLPI2C_SlaveClearFlags = kLPI2C_SlaveRepeatedStartDetectFlag | kLPI2C_SlaveStopDetectFlag | kLPI2C_SlaveBitErrFlag | + kLPI2C_SlaveFifoErrFlag, + /*! IRQ sources enabled by the non-blocking transactional API. */ + kLPI2C_SlaveIrqFlags = kLPI2C_SlaveTxReadyFlag | kLPI2C_SlaveRxReadyFlag | kLPI2C_SlaveStopDetectFlag | + kLPI2C_SlaveRepeatedStartDetectFlag | kLPI2C_SlaveFifoErrFlag | kLPI2C_SlaveBitErrFlag | + kLPI2C_SlaveTransmitAckFlag | kLPI2C_SlaveAddressValidFlag, + /*! Errors to check for. */ + kLPI2C_SlaveErrorFlags = kLPI2C_SlaveFifoErrFlag | kLPI2C_SlaveBitErrFlag +}; + +/*! @brief LPI2C slave address match options. */ +typedef enum _lpi2c_slave_address_match +{ + kLPI2C_MatchAddress0 = 0U, /*!< Match only address 0. */ + kLPI2C_MatchAddress0OrAddress1 = 2U, /*!< Match either address 0 or address 1. */ + kLPI2C_MatchAddress0ThroughAddress1 = 6U, /*!< Match a range of slave addresses from address 0 through address 1. */ +} lpi2c_slave_address_match_t; + +/*! + * @brief Structure with settings to initialize the LPI2C slave module. + * + * This structure holds configuration settings for the LPI2C slave peripheral. To initialize this + * structure to reasonable defaults, call the LPI2C_SlaveGetDefaultConfig() function and + * pass a pointer to your configuration structure instance. + * + * The configuration structure can be made constant so it resides in flash. + */ +typedef struct _lpi2c_slave_config +{ + bool enableSlave; /*!< Enable slave mode. */ + uint8_t address0; /*!< Slave's 7-bit address. */ + uint8_t address1; /*!< Alternate slave 7-bit address. */ + lpi2c_slave_address_match_t addressMatchMode; /*!< Address matching options. */ + bool filterDozeEnable; /*!< Enable digital glitch filter in doze mode. */ + bool filterEnable; /*!< Enable digital glitch filter. */ + bool enableGeneralCall; /*!< Enable general call address matching. */ + struct + { + bool enableAck; /*!< Enables SCL clock stretching during slave-transmit address byte(s) + and slave-receiver address and data byte(s) to allow software to + write the Transmit ACK Register before the ACK or NACK is transmitted. + Clock stretching occurs when transmitting the 9th bit. When + enableAckSCLStall is enabled, there is no need to set either + enableRxDataSCLStall or enableAddressSCLStall. */ + bool enableTx; /*!< Enables SCL clock stretching when the transmit data flag is set + during a slave-transmit transfer. */ + bool enableRx; /*!< Enables SCL clock stretching when receive data flag is set during + a slave-receive transfer. */ + bool enableAddress; /*!< Enables SCL clock stretching when the address valid flag is asserted. */ + } sclStall; /*!< SCL stall enable options. */ + bool ignoreAck; /*!< Continue transfers after a NACK is detected. */ + bool enableReceivedAddressRead; /*!< Enable reading the address received address as the first byte of data. */ + uint32_t sdaGlitchFilterWidth_ns; /*!< Width in nanoseconds of the digital filter on the SDA signal. Set to 0 to + disable. */ + uint32_t sclGlitchFilterWidth_ns; /*!< Width in nanoseconds of the digital filter on the SCL signal. Set to 0 to + disable. */ + uint32_t dataValidDelay_ns; /*!< Width in nanoseconds of the data valid delay. */ + uint32_t clockHoldTime_ns; /*!< Width in nanoseconds of the clock hold time. */ +} lpi2c_slave_config_t; + +/*! + * @brief Set of events sent to the callback for non blocking slave transfers. + * + * These event enumerations are used for two related purposes. First, a bit mask created by OR'ing together + * events is passed to LPI2C_SlaveTransferNonBlocking() in order to specify which events to enable. + * Then, when the slave callback is invoked, it is passed the current event through its @a transfer + * parameter. + * + * @note These enumerations are meant to be OR'd together to form a bit mask of events. + */ +typedef enum _lpi2c_slave_transfer_event +{ + kLPI2C_SlaveAddressMatchEvent = 0x01U, /*!< Received the slave address after a start or repeated start. */ + kLPI2C_SlaveTransmitEvent = 0x02U, /*!< Callback is requested to provide data to transmit + (slave-transmitter role). */ + kLPI2C_SlaveReceiveEvent = 0x04U, /*!< Callback is requested to provide a buffer in which to place received + data (slave-receiver role). */ + kLPI2C_SlaveTransmitAckEvent = 0x08U, /*!< Callback needs to either transmit an ACK or NACK. */ + kLPI2C_SlaveRepeatedStartEvent = 0x10U, /*!< A repeated start was detected. */ + kLPI2C_SlaveCompletionEvent = 0x20U, /*!< A stop was detected, completing the transfer. */ + + /*! Bit mask of all available events. */ + kLPI2C_SlaveAllEvents = kLPI2C_SlaveAddressMatchEvent | kLPI2C_SlaveTransmitEvent | kLPI2C_SlaveReceiveEvent | + kLPI2C_SlaveTransmitAckEvent | kLPI2C_SlaveRepeatedStartEvent | kLPI2C_SlaveCompletionEvent, +} lpi2c_slave_transfer_event_t; + +/*! @brief LPI2C slave transfer structure */ +typedef struct _lpi2c_slave_transfer +{ + lpi2c_slave_transfer_event_t event; /*!< Reason the callback is being invoked. */ + uint8_t receivedAddress; /*!< Matching address send by master. */ + uint8_t *data; /*!< Transfer buffer */ + size_t dataSize; /*!< Transfer size */ + status_t completionStatus; /*!< Success or error code describing how the transfer completed. Only applies for + #kLPI2C_SlaveCompletionEvent. */ + size_t transferredCount; /*!< Number of bytes actually transferred since start or last repeated start. */ +} lpi2c_slave_transfer_t; + +/* Forward declaration. */ +/*! @brief LPI2C slave handle structure. */ +typedef struct _lpi2c_slave_handle lpi2c_slave_handle_t; + +/*! + * @brief Slave event callback function pointer type. + * + * This callback is used only for the slave non-blocking transfer API. To install a callback, + * use the LPI2C_SlaveSetCallback() function after you have created a handle. + * + * @param base Base address for the LPI2C instance on which the event occurred. + * @param transfer Pointer to transfer descriptor containing values passed to and/or from the callback. + * @param userData Arbitrary pointer-sized value passed from the application. + */ +typedef void (*lpi2c_slave_transfer_callback_t)(LPI2C_Type *base, lpi2c_slave_transfer_t *transfer, void *userData); + +/*! + * @brief LPI2C slave handle structure. + * @note The contents of this structure are private and subject to change. + */ +struct _lpi2c_slave_handle +{ + lpi2c_slave_transfer_t transfer; /*!< LPI2C slave transfer copy. */ + bool isBusy; /*!< Whether transfer is busy. */ + bool wasTransmit; /*!< Whether the last transfer was a transmit. */ + uint32_t eventMask; /*!< Mask of enabled events. */ + uint32_t transferredCount; /*!< Count of bytes transferred. */ + lpi2c_slave_transfer_callback_t callback; /*!< Callback function called at transfer event. */ + void *userData; /*!< Callback parameter passed to callback. */ +}; + +/*! @} */ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! Array to map LPI2C instance number to IRQ number, used internally for LPI2C master interrupt and EDMA transactional +APIs. */ +extern IRQn_Type const kLpi2cIrqs[]; + +/*! Pointer to master IRQ handler for each instance, used internally for LPI2C master interrupt and EDMA transactional +APIs. */ +extern lpi2c_master_isr_t s_lpi2cMasterIsr; + +/*! Pointers to master handles for each instance, used internally for LPI2C master interrupt and EDMA transactional +APIs. */ +extern void *s_lpi2cMasterHandle[]; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Returns an instance number given a base address. + * + * If an invalid base address is passed, debug builds will assert. Release builds will just return + * instance number 0. + * + * @param base The LPI2C peripheral base address. + * @return LPI2C instance number starting from 0. + */ +uint32_t LPI2C_GetInstance(LPI2C_Type *base); + +/*! + * @addtogroup lpi2c_master_driver + * @{ + */ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Provides a default configuration for the LPI2C master peripheral. + * + * This function provides the following default configuration for the LPI2C master peripheral: + * @code + * masterConfig->enableMaster = true; + * masterConfig->debugEnable = false; + * masterConfig->ignoreAck = false; + * masterConfig->pinConfig = kLPI2C_2PinOpenDrain; + * masterConfig->baudRate_Hz = 100000U; + * masterConfig->busIdleTimeout_ns = 0; + * masterConfig->pinLowTimeout_ns = 0; + * masterConfig->sdaGlitchFilterWidth_ns = 0; + * masterConfig->sclGlitchFilterWidth_ns = 0; + * masterConfig->hostRequest.enable = false; + * masterConfig->hostRequest.source = kLPI2C_HostRequestExternalPin; + * masterConfig->hostRequest.polarity = kLPI2C_HostRequestPinActiveHigh; + * @endcode + * + * After calling this function, you can override any settings in order to customize the configuration, + * prior to initializing the master driver with LPI2C_MasterInit(). + * + * @param[out] masterConfig User provided configuration structure for default values. Refer to #lpi2c_master_config_t. + */ +void LPI2C_MasterGetDefaultConfig(lpi2c_master_config_t *masterConfig); + +/*! + * @brief Initializes the LPI2C master peripheral. + * + * This function enables the peripheral clock and initializes the LPI2C master peripheral as described by the user + * provided configuration. A software reset is performed prior to configuration. + * + * @param base The LPI2C peripheral base address. + * @param masterConfig User provided peripheral configuration. Use LPI2C_MasterGetDefaultConfig() to get a set of + * defaults + * that you can override. + * @param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the baud rate divisors, + * filter widths, and timeout periods. + */ +void LPI2C_MasterInit(LPI2C_Type *base, const lpi2c_master_config_t *masterConfig, uint32_t sourceClock_Hz); + +/*! + * @brief Deinitializes the LPI2C master peripheral. + * + * This function disables the LPI2C master peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * @param base The LPI2C peripheral base address. + */ +void LPI2C_MasterDeinit(LPI2C_Type *base); + +/*! + * @brief Configures LPI2C master data match feature. + * + * @param base The LPI2C peripheral base address. + * @param matchConfig Settings for the data match feature. + */ +void LPI2C_MasterConfigureDataMatch(LPI2C_Type *base, const lpi2c_data_match_config_t *matchConfig); + +/*! + * @brief Convert provided flags to status code, and clear any errors if present. + * @param base The LPI2C peripheral base address. + * @param status Current status flags value that will be checked. + * @retval #kStatus_Success + * @retval #kStatus_LPI2C_PinLowTimeout + * @retval #kStatus_LPI2C_ArbitrationLost + * @retval #kStatus_LPI2C_Nak + * @retval #kStatus_LPI2C_FifoError + */ +/* Not static so it can be used from fsl_lpi2c_edma.c. */ +status_t LPI2C_MasterCheckAndClearError(LPI2C_Type *base, uint32_t status); + +/*! + * @brief Make sure the bus isn't already busy. + * + * A busy bus is allowed if we are the one driving it. + * + * @param base The LPI2C peripheral base address. + * @retval #kStatus_Success + * @retval #kStatus_LPI2C_Busy + */ +/* Not static so it can be used from fsl_lpi2c_edma.c. */ +status_t LPI2C_CheckForBusyBus(LPI2C_Type *base); + +/*! + * @brief Performs a software reset. + * + * Restores the LPI2C master peripheral to reset conditions. + * + * @param base The LPI2C peripheral base address. + */ +static inline void LPI2C_MasterReset(LPI2C_Type *base) +{ + base->MCR = LPI2C_MCR_RST_MASK; + base->MCR = 0; +} + +/*! + * @brief Enables or disables the LPI2C module as master. + * + * @param base The LPI2C peripheral base address. + * @param enable Pass true to enable or false to disable the specified LPI2C as master. + */ +static inline void LPI2C_MasterEnable(LPI2C_Type *base, bool enable) +{ + base->MCR = (base->MCR & ~LPI2C_MCR_MEN_MASK) | LPI2C_MCR_MEN(enable); +} + +/*! @}*/ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets the LPI2C master status flags. + * + * A bit mask with the state of all LPI2C master status flags is returned. For each flag, the corresponding bit + * in the return value is set if the flag is asserted. + * + * @param base The LPI2C peripheral base address. + * @return State of the status flags: + * - 1: related status flag is set. + * - 0: related status flag is not set. + * @see _lpi2c_master_flags + */ +static inline uint32_t LPI2C_MasterGetStatusFlags(LPI2C_Type *base) +{ + return base->MSR; +} + +/*! + * @brief Clears the LPI2C master status flag state. + * + * The following status register flags can be cleared: + * - #kLPI2C_MasterEndOfPacketFlag + * - #kLPI2C_MasterStopDetectFlag + * - #kLPI2C_MasterNackDetectFlag + * - #kLPI2C_MasterArbitrationLostFlag + * - #kLPI2C_MasterFifoErrFlag + * - #kLPI2C_MasterPinLowTimeoutFlag + * - #kLPI2C_MasterDataMatchFlag + * + * Attempts to clear other flags has no effect. + * + * @param base The LPI2C peripheral base address. + * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of + * _lpi2c_master_flags enumerators OR'd together. You may pass the result of a previous call to + * LPI2C_MasterGetStatusFlags(). + * @see _lpi2c_master_flags. + */ +static inline void LPI2C_MasterClearStatusFlags(LPI2C_Type *base, uint32_t statusMask) +{ + base->MSR = statusMask; +} + +/*! @}*/ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables the LPI2C master interrupt requests. + * + * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as + * interrupts. + * + * @param base The LPI2C peripheral base address. + * @param interruptMask Bit mask of interrupts to enable. See _lpi2c_master_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void LPI2C_MasterEnableInterrupts(LPI2C_Type *base, uint32_t interruptMask) +{ + base->MIER |= interruptMask; +} + +/*! + * @brief Disables the LPI2C master interrupt requests. + * + * All flags except #kLPI2C_MasterBusyFlag and #kLPI2C_MasterBusBusyFlag can be enabled as + * interrupts. + * + * @param base The LPI2C peripheral base address. + * @param interruptMask Bit mask of interrupts to disable. See _lpi2c_master_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void LPI2C_MasterDisableInterrupts(LPI2C_Type *base, uint32_t interruptMask) +{ + base->MIER &= ~interruptMask; +} + +/*! + * @brief Returns the set of currently enabled LPI2C master interrupt requests. + * + * @param base The LPI2C peripheral base address. + * @return A bitmask composed of _lpi2c_master_flags enumerators OR'd together to indicate the + * set of enabled interrupts. + */ +static inline uint32_t LPI2C_MasterGetEnabledInterrupts(LPI2C_Type *base) +{ + return base->MIER; +} + +/*! @}*/ + +/*! + * @name DMA control + * @{ + */ + +/*! + * @brief Enables or disables LPI2C master DMA requests. + * + * @param base The LPI2C peripheral base address. + * @param enableTx Enable flag for transmit DMA request. Pass true for enable, false for disable. + * @param enableRx Enable flag for receive DMA request. Pass true for enable, false for disable. + */ +static inline void LPI2C_MasterEnableDMA(LPI2C_Type *base, bool enableTx, bool enableRx) +{ + base->MDER = LPI2C_MDER_TDDE(enableTx) | LPI2C_MDER_RDDE(enableRx); +} + +/*! + * @brief Gets LPI2C master transmit data register address for DMA transfer. + * + * @param base The LPI2C peripheral base address. + * @return The LPI2C Master Transmit Data Register address. + */ +static inline uint32_t LPI2C_MasterGetTxFifoAddress(LPI2C_Type *base) +{ + return (uint32_t)(uintptr_t)&base->MTDR; +} + +/*! + * @brief Gets LPI2C master receive data register address for DMA transfer. + * + * @param base The LPI2C peripheral base address. + * @return The LPI2C Master Receive Data Register address. + */ +static inline uint32_t LPI2C_MasterGetRxFifoAddress(LPI2C_Type *base) +{ + return (uint32_t)(uintptr_t)&base->MRDR; +} + +/*! @}*/ + +/*! + * @name FIFO control + * @{ + */ + +/*! + * @brief Sets the watermarks for LPI2C master FIFOs. + * + * @param base The LPI2C peripheral base address. + * @param txWords Transmit FIFO watermark value in words. The #kLPI2C_MasterTxReadyFlag flag is set whenever + * the number of words in the transmit FIFO is equal or less than @a txWords. Writing a value equal or + * greater than the FIFO size is truncated. + * @param rxWords Receive FIFO watermark value in words. The #kLPI2C_MasterRxReadyFlag flag is set whenever + * the number of words in the receive FIFO is greater than @a rxWords. Writing a value equal or greater + * than the FIFO size is truncated. + */ +static inline void LPI2C_MasterSetWatermarks(LPI2C_Type *base, size_t txWords, size_t rxWords) +{ + base->MFCR = LPI2C_MFCR_TXWATER(txWords) | LPI2C_MFCR_RXWATER(rxWords); +} + +/*! + * @brief Gets the current number of words in the LPI2C master FIFOs. + * + * @param base The LPI2C peripheral base address. + * @param[out] txCount Pointer through which the current number of words in the transmit FIFO is returned. + * Pass NULL if this value is not required. + * @param[out] rxCount Pointer through which the current number of words in the receive FIFO is returned. + * Pass NULL if this value is not required. + */ +static inline void LPI2C_MasterGetFifoCounts(LPI2C_Type *base, size_t *rxCount, size_t *txCount) +{ + if (NULL != txCount) + { + *txCount = (base->MFSR & LPI2C_MFSR_TXCOUNT_MASK) >> LPI2C_MFSR_TXCOUNT_SHIFT; + } + if (NULL != rxCount) + { + *rxCount = (base->MFSR & LPI2C_MFSR_RXCOUNT_MASK) >> LPI2C_MFSR_RXCOUNT_SHIFT; + } +} + +/*! @}*/ + +/*! + * @name Bus operations + * @{ + */ + +/*! + * @brief Sets the I2C bus frequency for master transactions. + * + * The LPI2C master is automatically disabled and re-enabled as necessary to configure the baud + * rate. Do not call this function during a transfer, or the transfer is aborted. + * + * @note Please note that the second parameter is the clock frequency of LPI2C module, the third + * parameter means user configured bus baudrate, this implementation is different from other I2C drivers + * which use baudrate configuration as second parameter and source clock frequency as third parameter. + * + * @param base The LPI2C peripheral base address. + * @param sourceClock_Hz LPI2C functional clock frequency in Hertz. + * @param baudRate_Hz Requested bus frequency in Hertz. + */ +void LPI2C_MasterSetBaudRate(LPI2C_Type *base, uint32_t sourceClock_Hz, uint32_t baudRate_Hz); + +/*! + * @brief Returns whether the bus is idle. + * + * Requires the master mode to be enabled. + * + * @param base The LPI2C peripheral base address. + * @retval true Bus is busy. + * @retval false Bus is idle. + */ +static inline bool LPI2C_MasterGetBusIdleState(LPI2C_Type *base) +{ + return ((base->MSR & LPI2C_MSR_BBF_MASK) >> LPI2C_MSR_BBF_SHIFT) == 1U ? true : false; +} + +/*! + * @brief Sends a START signal and slave address on the I2C bus. + * + * This function is used to initiate a new master mode transfer. First, the bus state is checked to ensure + * that another master is not occupying the bus. Then a START signal is transmitted, followed by the + * 7-bit address specified in the @a address parameter. Note that this function does not actually wait + * until the START and address are successfully sent on the bus before returning. + * + * @param base The LPI2C peripheral base address. + * @param address 7-bit slave device address, in bits [6:0]. + * @param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * @retval kStatus_Success START signal and address were successfully enqueued in the transmit FIFO. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + */ +status_t LPI2C_MasterStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir); + +/*! + * @brief Sends a repeated START signal and slave address on the I2C bus. + * + * This function is used to send a Repeated START signal when a transfer is already in progress. Like + * LPI2C_MasterStart(), it also sends the specified 7-bit address. + * + * @note This function exists primarily to maintain compatible APIs between LPI2C and I2C drivers, + * as well as to better document the intent of code that uses these APIs. + * + * @param base The LPI2C peripheral base address. + * @param address 7-bit slave device address, in bits [6:0]. + * @param dir Master transfer direction, either #kLPI2C_Read or #kLPI2C_Write. This parameter is used to set + * the R/w bit (bit 0) in the transmitted slave address. + * @retval kStatus_Success Repeated START signal and address were successfully enqueued in the transmit FIFO. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + */ +static inline status_t LPI2C_MasterRepeatedStart(LPI2C_Type *base, uint8_t address, lpi2c_direction_t dir) +{ + return LPI2C_MasterStart(base, address, dir); +} + +/*! + * @brief Performs a polling send transfer on the I2C bus. + * + * Sends up to @a txSize number of bytes to the previously addressed slave device. The slave may + * reply with a NAK to any byte in order to terminate the transfer early. If this happens, this + * function returns #kStatus_LPI2C_Nak. + * + * @param base The LPI2C peripheral base address. + * @param txBuff The pointer to the data to be transferred. + * @param txSize The length in bytes of the data to be transferred. + * @retval kStatus_Success Data was sent successfully. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * @retval #kStatus_LPI2C_FifoError FIFO under run or over run. + * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterSend(LPI2C_Type *base, void *txBuff, size_t txSize); + +/*! + * @brief Performs a polling receive transfer on the I2C bus. + * + * @param base The LPI2C peripheral base address. + * @param rxBuff The pointer to the data to be transferred. + * @param rxSize The length in bytes of the data to be transferred. + * @retval kStatus_Success Data was received successfully. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize); + +/*! + * @brief Sends a STOP signal on the I2C bus. + * + * This function does not return until the STOP signal is seen on the bus, or an error occurs. + * + * @param base The LPI2C peripheral base address. + * @retval kStatus_Success The STOP signal was successfully sent on the bus and the transaction terminated. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterStop(LPI2C_Type *base); + +/*! + * @brief Performs a master polling transfer on the I2C bus. + * + * @note The API does not return until the transfer succeeds or fails due + * to error happens during transfer. + * + * @param base The LPI2C peripheral base address. + * @param transfer Pointer to the transfer structure. + * @retval kStatus_Success Data was received successfully. + * @retval #kStatus_LPI2C_Busy Another master is currently utilizing the bus. + * @retval #kStatus_LPI2C_Nak The slave device sent a NAK in response to a byte. + * @retval #kStatus_LPI2C_FifoError FIFO under run or overrun. + * @retval #kStatus_LPI2C_ArbitrationLost Arbitration lost error. + * @retval #kStatus_LPI2C_PinLowTimeout SCL or SDA were held low longer than the timeout. + */ +status_t LPI2C_MasterTransferBlocking(LPI2C_Type *base, lpi2c_master_transfer_t *transfer); + +/*! @}*/ + +/*! + * @name Non-blocking + * @{ + */ + +/*! + * @brief Creates a new handle for the LPI2C master non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the LPI2C_MasterTransferAbort() API shall be called. + * + * + * @note The function also enables the NVIC IRQ for the input LPI2C. Need to notice + * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + * + * @param base The LPI2C peripheral base address. + * @param[out] handle Pointer to the LPI2C master driver handle. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + */ +void LPI2C_MasterTransferCreateHandle(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_master_transfer_callback_t callback, + void *userData); + +/*! + * @brief Performs a non-blocking transaction on the I2C bus. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @param transfer The pointer to the transfer descriptor. + * @retval kStatus_Success The transaction was started successfully. + * @retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or a non-blocking + * transaction is already in progress. + */ +status_t LPI2C_MasterTransferNonBlocking(LPI2C_Type *base, + lpi2c_master_handle_t *handle, + lpi2c_master_transfer_t *transfer); + +/*! + * @brief Returns number of bytes transferred so far. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @param[out] count Number of bytes transferred so far by the non-blocking transaction. + * @retval kStatus_Success + * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. + */ +status_t LPI2C_MasterTransferGetCount(LPI2C_Type *base, lpi2c_master_handle_t *handle, size_t *count); + +/*! + * @brief Terminates a non-blocking LPI2C master transmission early. + * + * @note It is not safe to call this function from an IRQ handler that has a higher priority than the + * LPI2C peripheral's IRQ priority. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + */ +void LPI2C_MasterTransferAbort(LPI2C_Type *base, lpi2c_master_handle_t *handle); + +/*! @}*/ + +/*! + * @name IRQ handler + * @{ + */ + +/*! + * @brief Reusable routine to handle master interrupts. + * @note This function does not need to be called unless you are reimplementing the + * nonblocking API's interrupt handler routines to add special functionality. + * @param base The LPI2C peripheral base address. + * @param lpi2cMasterHandle Pointer to the LPI2C master driver handle. + */ +void LPI2C_MasterTransferHandleIRQ(LPI2C_Type *base, void *lpi2cMasterHandle); + +/*! @}*/ + +/*! @} */ + +/*! + * @addtogroup lpi2c_slave_driver + * @{ + */ + +/*! + * @name Slave initialization and deinitialization + * @{ + */ + +/*! + * @brief Provides a default configuration for the LPI2C slave peripheral. + * + * This function provides the following default configuration for the LPI2C slave peripheral: + * @code + * slaveConfig->enableSlave = true; + * slaveConfig->address0 = 0U; + * slaveConfig->address1 = 0U; + * slaveConfig->addressMatchMode = kLPI2C_MatchAddress0; + * slaveConfig->filterDozeEnable = true; + * slaveConfig->filterEnable = true; + * slaveConfig->enableGeneralCall = false; + * slaveConfig->sclStall.enableAck = false; + * slaveConfig->sclStall.enableTx = true; + * slaveConfig->sclStall.enableRx = true; + * slaveConfig->sclStall.enableAddress = true; + * slaveConfig->ignoreAck = false; + * slaveConfig->enableReceivedAddressRead = false; + * slaveConfig->sdaGlitchFilterWidth_ns = 0; + * slaveConfig->sclGlitchFilterWidth_ns = 0; + * slaveConfig->dataValidDelay_ns = 0; + * slaveConfig->clockHoldTime_ns = 0; + * @endcode + * + * After calling this function, override any settings to customize the configuration, + * prior to initializing the master driver with LPI2C_SlaveInit(). Be sure to override at least the @a + * address0 member of the configuration structure with the desired slave address. + * + * @param[out] slaveConfig User provided configuration structure that is set to default values. Refer to + * #lpi2c_slave_config_t. + */ +void LPI2C_SlaveGetDefaultConfig(lpi2c_slave_config_t *slaveConfig); + +/*! + * @brief Initializes the LPI2C slave peripheral. + * + * This function enables the peripheral clock and initializes the LPI2C slave peripheral as described by the user + * provided configuration. + * + * @param base The LPI2C peripheral base address. + * @param slaveConfig User provided peripheral configuration. Use LPI2C_SlaveGetDefaultConfig() to get a set of defaults + * that you can override. + * @param sourceClock_Hz Frequency in Hertz of the LPI2C functional clock. Used to calculate the filter widths, + * data valid delay, and clock hold time. + */ +void LPI2C_SlaveInit(LPI2C_Type *base, const lpi2c_slave_config_t *slaveConfig, uint32_t sourceClock_Hz); + +/*! + * @brief Deinitializes the LPI2C slave peripheral. + * + * This function disables the LPI2C slave peripheral and gates the clock. It also performs a software + * reset to restore the peripheral to reset conditions. + * + * @param base The LPI2C peripheral base address. + */ +void LPI2C_SlaveDeinit(LPI2C_Type *base); + +/*! + * @brief Performs a software reset of the LPI2C slave peripheral. + * + * @param base The LPI2C peripheral base address. + */ +static inline void LPI2C_SlaveReset(LPI2C_Type *base) +{ + base->SCR = LPI2C_SCR_RST_MASK; + base->SCR = 0; +} + +/*! + * @brief Enables or disables the LPI2C module as slave. + * + * @param base The LPI2C peripheral base address. + * @param enable Pass true to enable or false to disable the specified LPI2C as slave. + */ +static inline void LPI2C_SlaveEnable(LPI2C_Type *base, bool enable) +{ + base->SCR = (base->SCR & ~LPI2C_SCR_SEN_MASK) | LPI2C_SCR_SEN(enable); +} + +/*! @}*/ + +/*! + * @name Slave status + * @{ + */ + +/*! + * @brief Gets the LPI2C slave status flags. + * + * A bit mask with the state of all LPI2C slave status flags is returned. For each flag, the corresponding bit + * in the return value is set if the flag is asserted. + * + * @param base The LPI2C peripheral base address. + * @return State of the status flags: + * - 1: related status flag is set. + * - 0: related status flag is not set. + * @see _lpi2c_slave_flags + */ +static inline uint32_t LPI2C_SlaveGetStatusFlags(LPI2C_Type *base) +{ + return base->SSR; +} + +/*! + * @brief Clears the LPI2C status flag state. + * + * The following status register flags can be cleared: + * - #kLPI2C_SlaveRepeatedStartDetectFlag + * - #kLPI2C_SlaveStopDetectFlag + * - #kLPI2C_SlaveBitErrFlag + * - #kLPI2C_SlaveFifoErrFlag + * + * Attempts to clear other flags has no effect. + * + * @param base The LPI2C peripheral base address. + * @param statusMask A bitmask of status flags that are to be cleared. The mask is composed of + * #_lpi2c_slave_flags enumerators OR'd together. You may pass the result of a previous call to + * LPI2C_SlaveGetStatusFlags(). + * @see _lpi2c_slave_flags. + */ +static inline void LPI2C_SlaveClearStatusFlags(LPI2C_Type *base, uint32_t statusMask) +{ + base->SSR = statusMask; +} +/*! @}*/ + +/*! + * @name Slave interrupts + * @{ + */ + +/*! + * @brief Enables the LPI2C slave interrupt requests. + * + * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as + * interrupts. + * + * @param base The LPI2C peripheral base address. + * @param interruptMask Bit mask of interrupts to enable. See #_lpi2c_slave_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void LPI2C_SlaveEnableInterrupts(LPI2C_Type *base, uint32_t interruptMask) +{ + base->SIER |= interruptMask; +} + +/*! + * @brief Disables the LPI2C slave interrupt requests. + * + * All flags except #kLPI2C_SlaveBusyFlag and #kLPI2C_SlaveBusBusyFlag can be enabled as + * interrupts. + * + * @param base The LPI2C peripheral base address. + * @param interruptMask Bit mask of interrupts to disable. See #_lpi2c_slave_flags for the set + * of constants that should be OR'd together to form the bit mask. + */ +static inline void LPI2C_SlaveDisableInterrupts(LPI2C_Type *base, uint32_t interruptMask) +{ + base->SIER &= ~interruptMask; +} + +/*! + * @brief Returns the set of currently enabled LPI2C slave interrupt requests. + * @param base The LPI2C peripheral base address. + * @return A bitmask composed of #_lpi2c_slave_flags enumerators OR'd together to indicate the + * set of enabled interrupts. + */ +static inline uint32_t LPI2C_SlaveGetEnabledInterrupts(LPI2C_Type *base) +{ + return base->SIER; +} + +/*! @}*/ + +/*! + * @name Slave DMA control + * @{ + */ + +/*! + * @brief Enables or disables the LPI2C slave peripheral DMA requests. + * + * @param base The LPI2C peripheral base address. + * @param enableAddressValid Enable flag for the address valid DMA request. Pass true for enable, false for disable. + * The address valid DMA request is shared with the receive data DMA request. + * @param enableRx Enable flag for the receive data DMA request. Pass true for enable, false for disable. + * @param enableTx Enable flag for the transmit data DMA request. Pass true for enable, false for disable. + */ +static inline void LPI2C_SlaveEnableDMA(LPI2C_Type *base, bool enableAddressValid, bool enableRx, bool enableTx) +{ + base->SDER = (base->SDER & ~(LPI2C_SDER_AVDE_MASK | LPI2C_SDER_RDDE_MASK | LPI2C_SDER_TDDE_MASK)) | + LPI2C_SDER_AVDE(enableAddressValid) | LPI2C_SDER_RDDE(enableRx) | LPI2C_SDER_TDDE(enableTx); +} + +/*! @}*/ + +/*! + * @name Slave bus operations + * @{ + */ + +/*! + * @brief Returns whether the bus is idle. + * + * Requires the slave mode to be enabled. + * + * @param base The LPI2C peripheral base address. + * @retval true Bus is busy. + * @retval false Bus is idle. + */ +static inline bool LPI2C_SlaveGetBusIdleState(LPI2C_Type *base) +{ + return ((base->SSR & LPI2C_SSR_BBF_MASK) >> LPI2C_SSR_BBF_SHIFT) == 1U ? true : false; +} + +/*! + * @brief Transmits either an ACK or NAK on the I2C bus in response to a byte from the master. + * + * Use this function to send an ACK or NAK when the #kLPI2C_SlaveTransmitAckFlag is asserted. This + * only happens if you enable the sclStall.enableAck field of the ::lpi2c_slave_config_t configuration + * structure used to initialize the slave peripheral. + * + * @param base The LPI2C peripheral base address. + * @param ackOrNack Pass true for an ACK or false for a NAK. + */ +static inline void LPI2C_SlaveTransmitAck(LPI2C_Type *base, bool ackOrNack) +{ + base->STAR = LPI2C_STAR_TXNACK(!ackOrNack); +} + +/*! + * @brief Enables or disables ACKSTALL. + * + * When enables ACKSTALL, software can transmit either an ACK or NAK on the I2C bus in response to + * a byte from the master. + * + * @param base The LPI2C peripheral base address. + * @param enable True will enable ACKSTALL,false will disable ACKSTALL. + */ +static inline void LPI2C_SlaveEnableAckStall(LPI2C_Type *base, bool enable) +{ + if (enable) + { + base->SCFGR1 |= LPI2C_SCFGR1_ACKSTALL_MASK; + } + else + { + base->SCFGR1 &= ~LPI2C_SCFGR1_ACKSTALL_MASK; + } +} + +/*! + * @brief Returns the slave address sent by the I2C master. + * + * This function should only be called if the #kLPI2C_SlaveAddressValidFlag is asserted. + * + * @param base The LPI2C peripheral base address. + * @return The 8-bit address matched by the LPI2C slave. Bit 0 contains the R/w direction bit, and + * the 7-bit slave address is in the upper 7 bits. + */ +static inline uint32_t LPI2C_SlaveGetReceivedAddress(LPI2C_Type *base) +{ + return base->SASR & LPI2C_SASR_RADDR_MASK; +} + +/*! + * @brief Performs a polling send transfer on the I2C bus. + * + * @param base The LPI2C peripheral base address. + * @param txBuff The pointer to the data to be transferred. + * @param txSize The length in bytes of the data to be transferred. + * @param[out] actualTxSize + * @return Error or success status returned by API. + */ +status_t LPI2C_SlaveSend(LPI2C_Type *base, void *txBuff, size_t txSize, size_t *actualTxSize); + +/*! + * @brief Performs a polling receive transfer on the I2C bus. + * + * @param base The LPI2C peripheral base address. + * @param rxBuff The pointer to the data to be transferred. + * @param rxSize The length in bytes of the data to be transferred. + * @param[out] actualRxSize + * @return Error or success status returned by API. + */ +status_t LPI2C_SlaveReceive(LPI2C_Type *base, void *rxBuff, size_t rxSize, size_t *actualRxSize); + +/*! @}*/ + +/*! + * @name Slave non-blocking + * @{ + */ + +/*! + * @brief Creates a new handle for the LPI2C slave non-blocking APIs. + * + * The creation of a handle is for use with the non-blocking APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the LPI2C_SlaveTransferAbort() API shall be called. + * + * @note The function also enables the NVIC IRQ for the input LPI2C. Need to notice + * that on some SoCs the LPI2C IRQ is connected to INTMUX, in this case user needs to + * enable the associated INTMUX IRQ in application. + + * @param base The LPI2C peripheral base address. + * @param[out] handle Pointer to the LPI2C slave driver handle. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + */ +void LPI2C_SlaveTransferCreateHandle(LPI2C_Type *base, + lpi2c_slave_handle_t *handle, + lpi2c_slave_transfer_callback_t callback, + void *userData); + +/*! + * @brief Starts accepting slave transfers. + * + * Call this API after calling I2C_SlaveInit() and LPI2C_SlaveTransferCreateHandle() to start processing + * transactions driven by an I2C master. The slave monitors the I2C bus and pass events to the + * callback that was passed into the call to LPI2C_SlaveTransferCreateHandle(). The callback is always invoked + * from the interrupt context. + * + * The set of events received by the callback is customizable. To do so, set the @a eventMask parameter to + * the OR'd combination of #lpi2c_slave_transfer_event_t enumerators for the events you wish to receive. + * The #kLPI2C_SlaveTransmitEvent and #kLPI2C_SlaveReceiveEvent events are always enabled and do not need + * to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and + * receive events that are always enabled. In addition, the #kLPI2C_SlaveAllEvents constant is provided as + * a convenient way to enable all events. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. + * @param eventMask Bit mask formed by OR'ing together #lpi2c_slave_transfer_event_t enumerators to specify + * which events to send to the callback. Other accepted values are 0 to get a default set of + * only the transmit and receive events, and #kLPI2C_SlaveAllEvents to enable all events. + * + * @retval kStatus_Success Slave transfers were successfully started. + * @retval #kStatus_LPI2C_Busy Slave transfers have already been started on this handle. + */ +status_t LPI2C_SlaveTransferNonBlocking(LPI2C_Type *base, lpi2c_slave_handle_t *handle, uint32_t eventMask); + +/*! + * @brief Gets the slave transfer status during a non-blocking transfer. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to i2c_slave_handle_t structure. + * @param[out] count Pointer to a value to hold the number of bytes transferred. May be NULL if the count is not + * required. + * @retval kStatus_Success + * @retval kStatus_NoTransferInProgress + */ +status_t LPI2C_SlaveTransferGetCount(LPI2C_Type *base, lpi2c_slave_handle_t *handle, size_t *count); + +/*! + * @brief Aborts the slave non-blocking transfers. + * @note This API could be called at any time to stop slave for handling the bus events. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. + */ +void LPI2C_SlaveTransferAbort(LPI2C_Type *base, lpi2c_slave_handle_t *handle); + +/*! @}*/ + +/*! + * @name Slave IRQ handler + * @{ + */ + +/*! + * @brief Reusable routine to handle slave interrupts. + * @note This function does not need to be called unless you are reimplementing the + * non blocking API's interrupt handler routines to add special functionality. + * @param base The LPI2C peripheral base address. + * @param handle Pointer to lpi2c_slave_handle_t structure which stores the transfer state. + */ +void LPI2C_SlaveTransferHandleIRQ(LPI2C_Type *base, lpi2c_slave_handle_t *handle); + +/*! @}*/ + +/*! @} */ + +#if defined(__cplusplus) +} +#endif +/*! @} */ +#endif /* FSL_LPI2C_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c_edma.c new file mode 100644 index 00000000000..9c57f55006b --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c_edma.c @@ -0,0 +1,659 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_lpi2c_edma.h" +#include +#include + +/* + * $Coverage Justification Reference$ + * + * $Justification fsl_lpi2c_edma_c_ref_1$ + * Need multiple master and slave modules on bus to simulate the true branch + * + * $Justification fsl_lpi2c_edma_c_ref_2$ + * FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(X) is a constant. + * + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpi2c_edma" +#endif + +/* @brief Mask to align an address to edma_tcd_t size. */ +#define ALIGN_TCD_SIZE_MASK (sizeof(edma_tcd_t) - 1U) + +/* ! @brief LPI2C master fifo commands. */ +enum _lpi2c_master_fifo_cmd +{ + kTxDataCmd = LPI2C_MTDR_CMD(0x0U), /*!< Transmit DATA[7:0] */ + kRxDataCmd = LPI2C_MTDR_CMD(0X1U), /*!< Receive (DATA[7:0] + 1) bytes */ + kStopCmd = LPI2C_MTDR_CMD(0x2U), /*!< Generate STOP condition */ + kStartCmd = LPI2C_MTDR_CMD(0x4U), /*!< Generate(repeated) START and transmit address in DATA[[7:0] */ +}; + +/*! @brief States for the state machine used by transactional APIs. */ +enum _lpi2c_transfer_states +{ + kIdleState = 0, + kSendCommandState, + kIssueReadCommandState, + kTransferDataState, + kStopState, + kWaitForCompletionState, +}; + +/*! @brief Typedef for interrupt handler. */ +typedef void (*lpi2c_isr_t)(LPI2C_Type *base, void *handle); + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/*! + * @brief Prepares the command buffer with the sequence of commands needed to send the requested transaction. + * @param handle Master DMA driver handle. + * @return Number of command words. + */ +static uint32_t LPI2C_GenerateCommands(lpi2c_master_edma_handle_t *handle); + +/*! + * @brief DMA completion callback. + * @param dmaHandle DMA channel handle for the channel that completed. + * @param userData User data associated with the channel handle. For this callback, the user data is the + * LPI2C DMA driver handle. + * @param isTransferDone Whether the DMA transfer has completed. + * @param tcds Number of TCDs that completed. + */ +static void LPI2C_MasterEDMACallback(edma_handle_t *dmaHandle, void *userData, bool isTransferDone, uint32_t tcds); + +/*! + * @brief LPI2C master edma transfer IRQ handle routine. + * + * This API handles the LPI2C bus error status and invoke callback if needed. + * + * @param base The LPI2C peripheral base address. + * @param lpi2cMasterEdmaHandle Pointer to the LPI2C master edma handle. + */ +static void LPI2C_MasterTransferEdmaHandleIRQ(LPI2C_Type *base, void *lpi2cMasterEdmaHandle); +/******************************************************************************* + * Variables + ******************************************************************************/ + +static uint32_t lpi2c_edma_RecSetting = 0x02; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Create a new handle for the LPI2C master DMA APIs. + * + * The creation of a handle is for use with the DMA APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the LPI2C_MasterTransferAbortEDMA() API shall be called. + * + * For devices where the LPI2C send and receive DMA requests are OR'd together, the a txDmaHandle + * parameter is ignored and may be set to NULL. + * + * param base The LPI2C peripheral base address. + * param[out] handle Pointer to the LPI2C master driver handle. + * param rxDmaHandle Handle for the eDMA receive channel. Created by the user prior to calling this function. + * param txDmaHandle Handle for the eDMA transmit channel. Created by the user prior to calling this function. + * param callback User provided pointer to the asynchronous callback function. + * param userData User provided pointer to the application callback data. + */ +void LPI2C_MasterCreateEDMAHandle(LPI2C_Type *base, + lpi2c_master_edma_handle_t *handle, + edma_handle_t *rxDmaHandle, + edma_handle_t *txDmaHandle, + lpi2c_master_edma_transfer_callback_t callback, + void *userData) +{ + assert(handle != NULL); + assert(rxDmaHandle != NULL); + assert(txDmaHandle != NULL); + + /* Look up instance number */ + uint32_t instance = LPI2C_GetInstance(base); + + /* Clear out the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + /* Set up the handle. For combined rx/tx DMA requests, the tx channel handle is set to the rx handle */ + /* in order to make the transfer API code simpler. */ + handle->base = base; + handle->completionCallback = callback; + handle->userData = userData; + handle->rx = rxDmaHandle; + handle->tx = (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) > 0) ? txDmaHandle : rxDmaHandle; + + /* Save the handle in global variables to support the double weak mechanism. */ + s_lpi2cMasterHandle[instance] = handle; + + /* Set LPI2C_MasterTransferEdmaHandleIRQ as LPI2C DMA IRQ handler */ + s_lpi2cMasterIsr = LPI2C_MasterTransferEdmaHandleIRQ; + + /* Enable interrupt in NVIC. */ + (void)EnableIRQ(kLpi2cIrqs[instance]); + + /* Set DMA channel completion callbacks. */ + EDMA_SetCallback(handle->rx, LPI2C_MasterEDMACallback, handle); + if (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) + { + EDMA_SetCallback(handle->tx, LPI2C_MasterEDMACallback, handle); + } +} + +static uint32_t LPI2C_GenerateCommands(lpi2c_master_edma_handle_t *handle) +{ + lpi2c_master_transfer_t *xfer = &handle->transfer; + uint16_t *cmd = (uint16_t *)&handle->commandBuffer; + uint32_t cmdCount = 0; + + /* Handle no start option. */ + if ((xfer->flags & (uint32_t)kLPI2C_TransferNoStartFlag) != 0U) + { + if (xfer->direction == kLPI2C_Read) + { + /* Need to issue read command first. */ + cmd[cmdCount++] = (uint16_t)kRxDataCmd | (uint16_t)LPI2C_MTDR_DATA(xfer->dataSize - 1U); + } + } + else + { + /* + * Initial direction depends on whether a subaddress was provided, and of course the actual + * data transfer direction. + */ + lpi2c_direction_t direction = (xfer->subaddressSize != 0U) ? kLPI2C_Write : xfer->direction; + + /* Start command. */ + cmd[cmdCount++] = + (uint16_t)kStartCmd | (uint16_t)((uint16_t)((uint16_t)xfer->slaveAddress << 1U) | (uint16_t)direction); + + /* Subaddress, MSB first. */ + if (xfer->subaddressSize != 0U) + { + uint32_t subaddressRemaining = xfer->subaddressSize; + while (0U != subaddressRemaining--) + { + uint8_t subaddressByte = (uint8_t)(xfer->subaddress >> (8U * subaddressRemaining)) & 0xffU; + cmd[cmdCount++] = subaddressByte; + } + } + + /* Reads need special handling because we have to issue a read command and maybe a repeated start. */ + if ((xfer->dataSize != 0U) && (xfer->direction == kLPI2C_Read)) + { + /* Need to send repeated start if switching directions to read. */ + if (direction == kLPI2C_Write) + { + cmd[cmdCount++] = (uint16_t)kStartCmd | + (uint16_t)((uint16_t)((uint16_t)xfer->slaveAddress << 1U) | (uint16_t)kLPI2C_Read); + } + + /* Read command. A single write to MTDR can issue read operation of 0xFFU + 1 byte of data at most, so when + the dataSize is larger than 0x100U, push multiple read commands to MTDR until dataSize is reached. */ + size_t tmpRxSize = xfer->dataSize; + while (tmpRxSize != 0U) + { + if (tmpRxSize > 256U) + { + cmd[cmdCount++] = (uint16_t)kRxDataCmd | (uint16_t)LPI2C_MTDR_DATA(0xFFU); + tmpRxSize -= 256U; + } + else + { + cmd[cmdCount++] = (uint16_t)kRxDataCmd | (uint16_t)LPI2C_MTDR_DATA(tmpRxSize - 1U); + tmpRxSize = 0U; + } + } + } + } + + return cmdCount; +} + +/*! + * brief Performs a non-blocking DMA-based transaction on the I2C bus. + * + * The callback specified when the a handle was created is invoked when the transaction has + * completed. + * + * param base The LPI2C peripheral base address. + * param handle Pointer to the LPI2C master driver handle. + * param transfer The pointer to the transfer descriptor. + * retval #kStatus_Success The transaction was started successfully. + * retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or another DMA + * transaction is already in progress. + */ +status_t LPI2C_MasterTransferEDMA(LPI2C_Type *base, + lpi2c_master_edma_handle_t *handle, + lpi2c_master_transfer_t *transfer) +{ + status_t result; + + assert(handle != NULL); + assert(transfer != NULL); + assert(transfer->subaddressSize <= sizeof(transfer->subaddress)); + + /* Check transfer data size in read operation. */ + /* A single write to MTDR can issue read operation of 0xFFU + 1 byte of data at most, so when the dataSize is larger + than 0x100U, push multiple read commands to MTDR until dataSize is reached. LPI2C edma transfer uses linked + descriptor to transfer command and data, the command buffer is stored in handle. Allocate 4 command words to + carry read command which can cover nearly all use cases. */ + if ((transfer->direction == kLPI2C_Read) && (transfer->dataSize > (256U * 4U))) + { + return kStatus_InvalidArgument; + } + + /* Return busy if another transaction is in progress. */ + if (handle->isBusy) + { + return kStatus_LPI2C_Busy; + } + + /* Enable the master function and disable the slave function. */ + LPI2C_MasterEnable(base, true); + LPI2C_SlaveEnable(base, false); + + /* Return an error if the bus is already in use not by us. */ + result = LPI2C_CheckForBusyBus(base); + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_edma_c_ref_1$ + */ + if (result != kStatus_Success) + { + return result; + } + + /* We're now busy. */ + handle->isBusy = true; + + /* Disable LPI2C IRQ and DMA sources while we configure stuff. */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); + LPI2C_MasterEnableDMA(base, false, false); + + /* Clear all flags. */ + LPI2C_MasterClearStatusFlags(base, (uint32_t)kLPI2C_MasterClearFlags); + + /* Save transfer into handle. */ + handle->transfer = *transfer; + + /* Generate commands to send. */ + uint32_t commandCount = LPI2C_GenerateCommands(handle); + + /* If the user is transmitting no data with no start or stop, then just go ahead and invoke the callback. */ + if ((0U == commandCount) && (transfer->dataSize == 0U)) + { + if (handle->completionCallback != NULL) + { + handle->completionCallback(base, handle, kStatus_Success, handle->userData); + } + return kStatus_Success; + } + + /* Reset DMA channels. */ + EDMA_ResetChannel(handle->rx->base, handle->rx->channel); + if (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) + { + EDMA_ResetChannel(handle->tx->base, handle->tx->channel); + } + + /* Get a 32-byte aligned TCD pointer. */ + edma_tcd_t *tcd = (edma_tcd_t *)((uint32_t)(&handle->tcds[1]) & (~ALIGN_TCD_SIZE_MASK)); + + bool hasSendData = (transfer->direction == kLPI2C_Write) && (transfer->dataSize != 0U); + bool hasReceiveData = (transfer->direction == kLPI2C_Read) && (transfer->dataSize != 0U); + + edma_transfer_config_t transferConfig = {0}; + edma_tcd_t *linkTcd = NULL; + + /* Set up data transmit. */ + if (hasSendData) + { + uint32_t *srcAddr = (uint32_t *)transfer->data; + transferConfig.srcAddr = (uint32_t)srcAddr; + transferConfig.destAddr = (uint32_t)LPI2C_MasterGetTxFifoAddress(base); + transferConfig.srcTransferSize = kEDMA_TransferSize1Bytes; + transferConfig.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfig.srcOffset = (int16_t)sizeof(uint8_t); + transferConfig.destOffset = 0; + transferConfig.minorLoopBytes = sizeof(uint8_t); /* TODO optimize to fill fifo */ + transferConfig.majorLoopCounts = transfer->dataSize; + + /* Store the initially configured eDMA minor byte transfer count into the LPI2C handle */ + handle->nbytes = (uint8_t)transferConfig.minorLoopBytes; + + if (commandCount != 0U) + { +#if defined FSL_EDMA_DRIVER_EDMA4 && FSL_EDMA_DRIVER_EDMA4 + /* Create a software TCD, which will be chained after the commands. */ + EDMA_TcdResetExt(handle->tx->base, tcd); + EDMA_TcdSetTransferConfigExt(handle->tx->base, tcd, &transferConfig, NULL); + EDMA_TcdEnableInterruptsExt(handle->tx->base, tcd, (uint32_t)kEDMA_MajorInterruptEnable); +#else + /* Create a software TCD, which will be chained after the commands. */ + EDMA_TcdReset(tcd); + EDMA_TcdSetTransferConfig(tcd, &transferConfig, NULL); + EDMA_TcdEnableInterrupts(tcd, (uint32_t)kEDMA_MajorInterruptEnable); +#endif + linkTcd = tcd; + } + else + { + /* User is only transmitting data with no required commands, so this transfer can stand alone. */ + EDMA_SetTransferConfig(handle->tx->base, handle->tx->channel, &transferConfig, NULL); + EDMA_EnableChannelInterrupts(handle->tx->base, handle->tx->channel, (uint32_t)kEDMA_MajorInterruptEnable); + } + } + else if (hasReceiveData) + { + uint32_t *srcAddr = (uint32_t *)transfer->data; + /* Set up data receive. */ + transferConfig.srcAddr = (uint32_t)LPI2C_MasterGetRxFifoAddress(base); + transferConfig.destAddr = (uint32_t)srcAddr; + transferConfig.srcTransferSize = kEDMA_TransferSize1Bytes; + transferConfig.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfig.srcOffset = 0; + transferConfig.destOffset = (int16_t)sizeof(uint8_t); + transferConfig.minorLoopBytes = sizeof(uint8_t); /* TODO optimize to empty fifo */ + transferConfig.majorLoopCounts = transfer->dataSize; + + /* Store the initially configured eDMA minor byte transfer count into the LPI2C handle */ + handle->nbytes = (uint8_t)transferConfig.minorLoopBytes; + + if ((FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) || (0U == commandCount)) + { + /* We can put this receive transfer on its own DMA channel. */ + EDMA_SetTransferConfig(handle->rx->base, handle->rx->channel, &transferConfig, NULL); + EDMA_EnableChannelInterrupts(handle->rx->base, handle->rx->channel, (uint32_t)kEDMA_MajorInterruptEnable); + } + else + { + /* For shared rx/tx DMA requests, when there are commands, create a software TCD of + enabling rx dma and disabling tx dma, which will be chained onto the commands transfer, + and create another software TCD of transfering data and chain it onto the last TCD. + Notice that in this situation assume tx/rx uses same channel */ +#if defined FSL_EDMA_DRIVER_EDMA4 && FSL_EDMA_DRIVER_EDMA4 + EDMA_TcdResetExt(handle->rx->base, tcd); + EDMA_TcdSetTransferConfigExt(handle->rx->base, tcd, &transferConfig, NULL); + EDMA_TcdEnableInterruptsExt(handle->rx->base, tcd, (uint32_t)kEDMA_MajorInterruptEnable); +#else + EDMA_TcdReset(tcd); + EDMA_TcdSetTransferConfig(tcd, &transferConfig, NULL); + EDMA_TcdEnableInterrupts(tcd, (uint32_t)kEDMA_MajorInterruptEnable); +#endif + + transferConfig.srcAddr = (uint32_t)&lpi2c_edma_RecSetting; + transferConfig.destAddr = (uint32_t) & (base->MDER); + transferConfig.srcTransferSize = kEDMA_TransferSize1Bytes; + transferConfig.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfig.srcOffset = 0; + transferConfig.destOffset = (int16_t)sizeof(uint8_t); + transferConfig.minorLoopBytes = sizeof(uint8_t); + transferConfig.majorLoopCounts = 1; + + edma_tcd_t *tcdSetRxClearTxDMA = (edma_tcd_t *)((uint32_t)(&handle->tcds[2]) & (~ALIGN_TCD_SIZE_MASK)); +#if defined FSL_EDMA_DRIVER_EDMA4 && FSL_EDMA_DRIVER_EDMA4 + EDMA_TcdResetExt(handle->rx->base, tcdSetRxClearTxDMA); + EDMA_TcdSetTransferConfigExt(handle->rx->base, tcdSetRxClearTxDMA, &transferConfig, tcd); +#else + EDMA_TcdReset(tcdSetRxClearTxDMA); + EDMA_TcdSetTransferConfig(tcdSetRxClearTxDMA, &transferConfig, tcd); +#endif + linkTcd = tcdSetRxClearTxDMA; + } + } + else + { + /* No data to send */ + } + + /* Set up commands transfer. */ + if (commandCount != 0U) + { + transferConfig.srcAddr = (uint32_t)handle->commandBuffer; + transferConfig.destAddr = (uint32_t)LPI2C_MasterGetTxFifoAddress(base); + transferConfig.srcTransferSize = kEDMA_TransferSize2Bytes; + transferConfig.destTransferSize = kEDMA_TransferSize2Bytes; + transferConfig.srcOffset = (int16_t)sizeof(uint16_t); + transferConfig.destOffset = 0; + transferConfig.minorLoopBytes = sizeof(uint16_t); /* TODO optimize to fill fifo */ + transferConfig.majorLoopCounts = commandCount; + + EDMA_SetTransferConfig(handle->tx->base, handle->tx->channel, &transferConfig, linkTcd); + } + + /* Start DMA transfer. */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_edma_c_ref_2$ + */ + if (hasReceiveData || (0 == FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base))) + { + EDMA_StartTransfer(handle->rx); + } + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_edma_c_ref_2$ + */ + if ((hasSendData || (commandCount != 0U)) && (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0)) + { + EDMA_StartTransfer(handle->tx); + } + + /* Enable DMA in both directions. This actually kicks of the transfer. */ + LPI2C_MasterEnableDMA(base, true, true); + + /* Enable all LPI2C master interrupts */ + LPI2C_MasterEnableInterrupts(base, + (uint32_t)kLPI2C_MasterArbitrationLostFlag | (uint32_t)kLPI2C_MasterNackDetectFlag | + (uint32_t)kLPI2C_MasterPinLowTimeoutFlag | (uint32_t)kLPI2C_MasterFifoErrFlag); + + return result; +} + +/*! + * brief Returns number of bytes transferred so far. + * + * param base The LPI2C peripheral base address. + * param handle Pointer to the LPI2C master driver handle. + * param[out] count Number of bytes transferred so far by the non-blocking transaction. + * retval #kStatus_Success + * retval #kStatus_NoTransferInProgress There is not a DMA transaction currently in progress. + */ +status_t LPI2C_MasterTransferGetCountEDMA(LPI2C_Type *base, lpi2c_master_edma_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (!handle->isBusy) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + uint32_t remaining = handle->transfer.dataSize; + + /* If the DMA is still on a commands transfer that chains to the actual data transfer, */ + /* we do nothing and return the number of transferred bytes as zero. */ + if (EDMA_GetNextTCDAddress(handle->tx) == 0U) + { + if (handle->transfer.direction == kLPI2C_Write) + { + remaining = + (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount(handle->tx->base, handle->tx->channel); + } + else + { + remaining = + (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount(handle->rx->base, handle->rx->channel); + } + } + + *count = handle->transfer.dataSize - remaining; + + return kStatus_Success; +} + +/*! + * brief Terminates a non-blocking LPI2C master transmission early. + * + * note It is not safe to call this function from an IRQ handler that has a higher priority than the + * eDMA peripheral's IRQ priority. + * + * param base The LPI2C peripheral base address. + * param handle Pointer to the LPI2C master driver handle. + * retval #kStatus_Success A transaction was successfully aborted. + * retval #kStatus_LPI2C_Idle There is not a DMA transaction currently in progress. + */ +status_t LPI2C_MasterTransferAbortEDMA(LPI2C_Type *base, lpi2c_master_edma_handle_t *handle) +{ + /* Catch when there is not an active transfer. */ + if (!handle->isBusy) + { + return kStatus_LPI2C_Idle; + } + + /* Terminate DMA transfers. */ + EDMA_AbortTransfer(handle->rx); + if (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) + { + EDMA_AbortTransfer(handle->tx); + } + + /* Reset fifos. */ + base->MCR |= LPI2C_MCR_RRF_MASK | LPI2C_MCR_RTF_MASK; + + /* Disable LPI2C interrupts. */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); + + /* If master is still busy and has not send out stop signal yet. */ + if ((LPI2C_MasterGetStatusFlags(base) & + ((uint32_t)kLPI2C_MasterStopDetectFlag | (uint32_t)kLPI2C_MasterBusyFlag)) == (uint32_t)kLPI2C_MasterBusyFlag) + { + /* Send a stop command to finalize the transfer. */ + base->MTDR = (uint32_t)kStopCmd; + } + + /* Reset handle. */ + handle->isBusy = false; + + return kStatus_Success; +} + +static void LPI2C_MasterEDMACallback(edma_handle_t *dmaHandle, void *userData, bool isTransferDone, uint32_t tcds) +{ + lpi2c_master_edma_handle_t *handle = (lpi2c_master_edma_handle_t *)userData; + + if (NULL == handle) + { + return; + } + + /* Check for errors. */ + status_t result = LPI2C_MasterCheckAndClearError(handle->base, LPI2C_MasterGetStatusFlags(handle->base)); + + /* Done with this transaction. */ + handle->isBusy = false; + + if (0U == (handle->transfer.flags & (uint32_t)kLPI2C_TransferNoStopFlag)) + { + /* Send a stop command to finalize the transfer. */ + handle->base->MTDR = (uint32_t)kStopCmd; + } + + /* Invoke callback. */ + if (handle->completionCallback != NULL) + { + handle->completionCallback(handle->base, handle, result, handle->userData); + } +} + +static void LPI2C_MasterTransferEdmaHandleIRQ(LPI2C_Type *base, void *lpi2cMasterEdmaHandle) +{ + assert(lpi2cMasterEdmaHandle != NULL); + + lpi2c_master_edma_handle_t *handle = (lpi2c_master_edma_handle_t *)lpi2cMasterEdmaHandle; + uint32_t status = LPI2C_MasterGetStatusFlags(base); + status_t result = kStatus_Success; + + /* Terminate DMA transfers. */ + EDMA_AbortTransfer(handle->rx); + if (FSL_FEATURE_LPI2C_HAS_SEPARATE_DMA_RX_TX_REQn(base) != 0) + { + EDMA_AbortTransfer(handle->tx); + } + + /* Done with this transaction. */ + handle->isBusy = false; + + /* Disable LPI2C interrupts. */ + LPI2C_MasterDisableInterrupts(base, (uint32_t)kLPI2C_MasterIrqFlags); + + /* Check error status */ + if (0U != (status & (uint32_t)kLPI2C_MasterPinLowTimeoutFlag)) + { + result = kStatus_LPI2C_PinLowTimeout; + } + /* + * $Branch Coverage Justification$ + * $ref fsl_lpi2c_edma_c_ref_1$ + */ + else if (0U != (status & (uint32_t)kLPI2C_MasterArbitrationLostFlag)) + { + result = kStatus_LPI2C_ArbitrationLost; + } + else if (0U != (status & (uint32_t)kLPI2C_MasterNackDetectFlag)) + { + result = kStatus_LPI2C_Nak; + } + else if (0U != (status & (uint32_t)kLPI2C_MasterFifoErrFlag)) + { + result = kStatus_LPI2C_FifoError; + } + else + { + ; /* Intentional empty */ + } + + /* Clear error status. */ + (void)LPI2C_MasterCheckAndClearError(base, status); + + /* Send stop flag if needed */ + if (0U == (handle->transfer.flags & (uint32_t)kLPI2C_TransferNoStopFlag)) + { + status = LPI2C_MasterGetStatusFlags(base); + /* If bus is still busy and the master has not generate stop flag */ + if ((status & ((uint32_t)kLPI2C_MasterBusBusyFlag | (uint32_t)kLPI2C_MasterStopDetectFlag)) == + (uint32_t)kLPI2C_MasterBusBusyFlag) + { + /* Send a stop command to finalize the transfer. */ + handle->base->MTDR = (uint32_t)kStopCmd; + } + } + + /* Invoke callback. */ + if (handle->completionCallback != NULL) + { + handle->completionCallback(base, handle, result, handle->userData); + } +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c_edma.h new file mode 100644 index 00000000000..66da36b866d --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpi2c_edma.h @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_LPI2C_EDMA_H_ +#define FSL_LPI2C_EDMA_H_ + +#include "fsl_lpi2c.h" +#include "fsl_edma.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @name Driver version + * @{ + */ +/*! @brief LPI2C EDMA driver version. */ +#define FSL_LPI2C_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 4, 2)) +/*! @} */ + +/*! + * @addtogroup lpi2c_master_edma_driver + * @{ + */ + +/* Forward declaration of the transfer descriptor and handle typedefs. */ +/*! @brief LPI2C master EDMA handle of the transfer. */ +typedef struct _lpi2c_master_edma_handle lpi2c_master_edma_handle_t; + +/*! + * @brief Master DMA completion callback function pointer type. + * + * This callback is used only for the non-blocking master transfer API. Specify the callback you wish to use + * in the call to LPI2C_MasterCreateEDMAHandle(). + * + * @param base The LPI2C peripheral base address. + * @param handle Handle associated with the completed transfer. + * @param completionStatus Either kStatus_Success or an error code describing how the transfer completed. + * @param userData Arbitrary pointer-sized value passed from the application. + */ +typedef void (*lpi2c_master_edma_transfer_callback_t)(LPI2C_Type *base, + lpi2c_master_edma_handle_t *handle, + status_t completionStatus, + void *userData); + +/*! + * @brief Driver handle for master DMA APIs. + * @note The contents of this structure are private and subject to change. + */ +struct _lpi2c_master_edma_handle +{ + LPI2C_Type *base; /*!< LPI2C base pointer. */ + bool isBusy; /*!< Transfer state machine current state. */ + uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ + uint16_t commandBuffer[10]; /*!< LPI2C command sequence. When all 10 command words are used: + Start&addr&write[1 word] + subaddr[4 words] + restart&addr&read[1 word] + receive&Size[4 words] */ + lpi2c_master_transfer_t transfer; /*!< Copy of the current transfer info. */ + lpi2c_master_edma_transfer_callback_t completionCallback; /*!< Callback function pointer. */ + void *userData; /*!< Application data passed to callback. */ + edma_handle_t *rx; /*!< Handle for receive DMA channel. */ + edma_handle_t *tx; /*!< Handle for transmit DMA channel. */ + edma_tcd_t tcds[3]; /*!< Software TCD. Three are allocated to provide enough room to align to 32-bytes. */ +}; + +/*! @} */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @addtogroup lpi2c_master_edma_driver + * @{ + */ + +/*! + * @name Master DMA + * @{ + */ + +/*! + * @brief Create a new handle for the LPI2C master DMA APIs. + * + * The creation of a handle is for use with the DMA APIs. Once a handle + * is created, there is not a corresponding destroy handle. If the user wants to + * terminate a transfer, the LPI2C_MasterTransferAbortEDMA() API shall be called. + * + * For devices where the LPI2C send and receive DMA requests are OR'd together, the @a txDmaHandle + * parameter is ignored and may be set to NULL. + * + * @param base The LPI2C peripheral base address. + * @param[out] handle Pointer to the LPI2C master driver handle. + * @param rxDmaHandle Handle for the eDMA receive channel. Created by the user prior to calling this function. + * @param txDmaHandle Handle for the eDMA transmit channel. Created by the user prior to calling this function. + * @param callback User provided pointer to the asynchronous callback function. + * @param userData User provided pointer to the application callback data. + */ +void LPI2C_MasterCreateEDMAHandle(LPI2C_Type *base, + lpi2c_master_edma_handle_t *handle, + edma_handle_t *rxDmaHandle, + edma_handle_t *txDmaHandle, + lpi2c_master_edma_transfer_callback_t callback, + void *userData); + +/*! + * @brief Performs a non-blocking DMA-based transaction on the I2C bus. + * + * The callback specified when the @a handle was created is invoked when the transaction has + * completed. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @param transfer The pointer to the transfer descriptor. + * @retval kStatus_Success The transaction was started successfully. + * @retval #kStatus_LPI2C_Busy Either another master is currently utilizing the bus, or another DMA + * transaction is already in progress. + */ +status_t LPI2C_MasterTransferEDMA(LPI2C_Type *base, + lpi2c_master_edma_handle_t *handle, + lpi2c_master_transfer_t *transfer); + +/*! + * @brief Returns number of bytes transferred so far. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @param[out] count Number of bytes transferred so far by the non-blocking transaction. + * @retval kStatus_Success + * @retval kStatus_NoTransferInProgress There is not a DMA transaction currently in progress. + */ +status_t LPI2C_MasterTransferGetCountEDMA(LPI2C_Type *base, lpi2c_master_edma_handle_t *handle, size_t *count); + +/*! + * @brief Terminates a non-blocking LPI2C master transmission early. + * + * @note It is not safe to call this function from an IRQ handler that has a higher priority than the + * eDMA peripheral's IRQ priority. + * + * @param base The LPI2C peripheral base address. + * @param handle Pointer to the LPI2C master driver handle. + * @retval kStatus_Success A transaction was successfully aborted. + * @retval #kStatus_LPI2C_Idle There is not a DMA transaction currently in progress. + */ +status_t LPI2C_MasterTransferAbortEDMA(LPI2C_Type *base, lpi2c_master_edma_handle_t *handle); + +/*! @} */ + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +#endif /* FSL_LPI2C_EDMA_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi.c new file mode 100644 index 00000000000..edf955ea255 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi.c @@ -0,0 +1,2604 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022, 2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_lpspi.h" +/* + * $Coverage Justification Reference$ + * + * $Justification fsl_lpspi_c_ref_1$ + * The default branch cannot be executed in any circumstances, it is only added to avoid MISRA violation. + * + * $Justification fsl_lpspi_c_ref_2$ + * The FIFO was emptied before the check and there was no writing after the FIFO was emptied, so the obtained FIFO count + * is 0, and the #kStatus_LPSPI_Timeout cannot be obtained.(will improve) + * + * $Justification fsl_lpspi_c_ref_3$ + * The fifosize is determined by the hardware. + * + * $Justification fsl_lpspi_c_ref_4$ + * If an interrupt is generated by this error, the corresponding interrupt bit must be set.(will improve) + * + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpspi" +#endif + +#if defined(LPSPI_RSTS) +#define LPSPI_RESETS_ARRAY LPSPI_RSTS +#endif + +/*! + * @brief Default watermark values. + * + * The default watermarks are set to zero. + */ +enum _lpspi_default_watermarks +{ + kLpspiDefaultTxWatermark = 0, + kLpspiDefaultRxWatermark = 0, +}; + +/* + * CR |= LPSPI_CR_RRF_MASK | LPSPI_CR_RTF_MASK; + base->IER = 0U; + base->CR = 0U; + + /* Disable LPSPI first */ + LPSPI_Enable(base, false); + + /* Set LPSPI to master */ + LPSPI_SetMasterSlaveMode(base, kLPSPI_Master); + + /* Set specific PCS to active high or low */ + LPSPI_SetOnePcsPolarity(base, masterConfig->whichPcs, masterConfig->pcsActiveHighOrLow); + + /* Set Configuration Register 1 related setting.*/ + base->CFGR1 = (base->CFGR1 & ~(LPSPI_CFGR1_OUTCFG_MASK | LPSPI_CFGR1_PINCFG_MASK | LPSPI_CFGR1_NOSTALL_MASK | + LPSPI_CFGR1_SAMPLE_MASK)) | + LPSPI_CFGR1_OUTCFG(masterConfig->dataOutConfig) | LPSPI_CFGR1_PINCFG(masterConfig->pinCfg) | +#if !(defined(FSL_FEATURE_LPSPI_HAS_NO_PCSCFG) && FSL_FEATURE_LPSPI_HAS_NO_PCSCFG) + LPSPI_CFGR1_PCSCFG(masterConfig->pcsFunc) | +#endif + LPSPI_CFGR1_NOSTALL(0) | LPSPI_CFGR1_SAMPLE((uint32_t)masterConfig->enableInputDelay); + + if ((masterConfig->pinCfg == kLPSPI_SdiInSdiOut) || (masterConfig->pinCfg == kLPSPI_SdoInSdoOut)) + { + base->CFGR1 |= LPSPI_CFGR1_OUTCFG_MASK; + } + /* Set baudrate and delay times*/ + (void)LPSPI_MasterSetBaudRate(base, masterConfig->baudRate, srcClock_Hz, &tcrPrescaleValue); + + /* Set default watermarks */ + LPSPI_SetFifoWatermarks(base, (uint32_t)kLpspiDefaultTxWatermark, (uint32_t)kLpspiDefaultRxWatermark); + + /* Set Transmit Command Register*/ + base->TCR = LPSPI_TCR_CPOL(masterConfig->cpol) | LPSPI_TCR_CPHA(masterConfig->cpha) | + LPSPI_TCR_LSBF(masterConfig->direction) | LPSPI_TCR_FRAMESZ(masterConfig->bitsPerFrame - 1U) | + LPSPI_TCR_PRESCALE(tcrPrescaleValue) | LPSPI_TCR_PCS(masterConfig->whichPcs); + + LPSPI_Enable(base, true); + + (void)LPSPI_MasterSetDelayTimes(base, masterConfig->pcsToSckDelayInNanoSec, kLPSPI_PcsToSck, srcClock_Hz); + (void)LPSPI_MasterSetDelayTimes(base, masterConfig->lastSckToPcsDelayInNanoSec, kLPSPI_LastSckToPcs, srcClock_Hz); + (void)LPSPI_MasterSetDelayTimes(base, masterConfig->betweenTransferDelayInNanoSec, kLPSPI_BetweenTransfer, + srcClock_Hz); + + LPSPI_SetDummyData(base, LPSPI_DUMMY_DATA); +} + +/*! + * brief Sets the lpspi_master_config_t structure to default values. + * + * This API initializes the configuration structure for LPSPI_MasterInit(). + * The initialized structure can remain unchanged in LPSPI_MasterInit(), or can be modified + * before calling the LPSPI_MasterInit(). + * Example: + * code + * lpspi_master_config_t masterConfig; + * LPSPI_MasterGetDefaultConfig(&masterConfig); + * endcode + * param masterConfig pointer to lpspi_master_config_t structure + */ +void LPSPI_MasterGetDefaultConfig(lpspi_master_config_t *masterConfig) +{ + assert(masterConfig != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(masterConfig, 0, sizeof(*masterConfig)); + + masterConfig->baudRate = 500000; + masterConfig->bitsPerFrame = 8; + masterConfig->cpol = kLPSPI_ClockPolarityActiveHigh; + masterConfig->cpha = kLPSPI_ClockPhaseFirstEdge; + masterConfig->direction = kLPSPI_MsbFirst; +#if !(defined(FSL_FEATURE_LPSPI_HAS_NO_PCSCFG) && FSL_FEATURE_LPSPI_HAS_NO_PCSCFG) + masterConfig->pcsFunc = kLPSPI_PcsAsCs; +#endif + + masterConfig->pcsToSckDelayInNanoSec = (1000000000U / masterConfig->baudRate) / 2U; + masterConfig->lastSckToPcsDelayInNanoSec = (1000000000U / masterConfig->baudRate) / 2U; + masterConfig->betweenTransferDelayInNanoSec = (1000000000U / masterConfig->baudRate) / 2U; + + masterConfig->whichPcs = kLPSPI_Pcs0; + masterConfig->pcsActiveHighOrLow = kLPSPI_PcsActiveLow; + + masterConfig->pinCfg = kLPSPI_SdiInSdoOut; + masterConfig->dataOutConfig = kLpspiDataOutRetained; + + masterConfig->enableInputDelay = false; +} + +/*! + * brief LPSPI slave configuration. + * + * param base LPSPI peripheral address. + * param slaveConfig Pointer to a structure lpspi_slave_config_t. + */ +void LPSPI_SlaveInit(LPSPI_Type *base, const lpspi_slave_config_t *slaveConfig) +{ + assert(slaveConfig != NULL); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + + uint32_t instance = LPSPI_GetInstance(base); + /* Enable LPSPI clock */ + (void)CLOCK_EnableClock(s_lpspiClocks[instance]); + +#if defined(LPSPI_PERIPH_CLOCKS) + (void)CLOCK_EnableClock(s_LpspiPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(LPSPI_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_lpspiResets[LPSPI_GetInstance(base)]); +#endif + + LPSPI_SetMasterSlaveMode(base, kLPSPI_Slave); + + LPSPI_SetOnePcsPolarity(base, slaveConfig->whichPcs, slaveConfig->pcsActiveHighOrLow); + + base->CFGR1 = (base->CFGR1 & ~(LPSPI_CFGR1_OUTCFG_MASK | LPSPI_CFGR1_PINCFG_MASK)) | + LPSPI_CFGR1_OUTCFG(slaveConfig->dataOutConfig) | LPSPI_CFGR1_PINCFG(slaveConfig->pinCfg); + + if ((slaveConfig->pinCfg == kLPSPI_SdiInSdiOut) || (slaveConfig->pinCfg == kLPSPI_SdoInSdoOut)) + { + base->CFGR1 |= LPSPI_CFGR1_OUTCFG_MASK; + } + + LPSPI_SetFifoWatermarks(base, (uint32_t)kLpspiDefaultTxWatermark, (uint32_t)kLpspiDefaultRxWatermark); + + base->TCR = LPSPI_TCR_CPOL(slaveConfig->cpol) | LPSPI_TCR_CPHA(slaveConfig->cpha) | + LPSPI_TCR_LSBF(slaveConfig->direction) | LPSPI_TCR_FRAMESZ(slaveConfig->bitsPerFrame - 1U); + + /* This operation will set the dummy data for edma transfer, no effect in interrupt way. */ + LPSPI_SetDummyData(base, LPSPI_DUMMY_DATA); + + LPSPI_Enable(base, true); +} + +/*! + * brief Sets the lpspi_slave_config_t structure to default values. + * + * This API initializes the configuration structure for LPSPI_SlaveInit(). + * The initialized structure can remain unchanged in LPSPI_SlaveInit() or can be modified + * before calling the LPSPI_SlaveInit(). + * Example: + * code + * lpspi_slave_config_t slaveConfig; + * LPSPI_SlaveGetDefaultConfig(&slaveConfig); + * endcode + * param slaveConfig pointer to lpspi_slave_config_t structure. + */ +void LPSPI_SlaveGetDefaultConfig(lpspi_slave_config_t *slaveConfig) +{ + assert(slaveConfig != NULL); + + /* Initializes the configure structure to zero. */ + (void)memset(slaveConfig, 0, sizeof(*slaveConfig)); + + slaveConfig->bitsPerFrame = 8; /*!< Bits per frame, minimum 8, maximum 4096.*/ + slaveConfig->cpol = kLPSPI_ClockPolarityActiveHigh; /*!< Clock polarity. */ + slaveConfig->cpha = kLPSPI_ClockPhaseFirstEdge; /*!< Clock phase. */ + slaveConfig->direction = kLPSPI_MsbFirst; /*!< MSB or LSB data shift direction. */ + + slaveConfig->whichPcs = kLPSPI_Pcs0; /*!< Desired Peripheral Chip Select (pcs) */ + slaveConfig->pcsActiveHighOrLow = kLPSPI_PcsActiveLow; /*!< Desired PCS active high or low */ + + slaveConfig->pinCfg = kLPSPI_SdiInSdoOut; + slaveConfig->dataOutConfig = kLpspiDataOutRetained; +} + +/*! + * brief Restores the LPSPI peripheral to reset state. Note that this function + * sets all registers to reset state. As a result, the LPSPI module can't work after calling + * this API. + * param base LPSPI peripheral address. + */ +void LPSPI_Reset(LPSPI_Type *base) +{ + /* Reset all internal logic and registers, except the Control Register. Remains set until cleared by software.*/ + base->CR |= LPSPI_CR_RST_MASK; + + /* Software reset doesn't reset the CR, so manual reset the FIFOs */ + base->CR |= LPSPI_CR_RRF_MASK | LPSPI_CR_RTF_MASK; + + /* Master logic is not reset and module is disabled.*/ + base->CR = 0x00U; +} + +/*! + * brief De-initializes the LPSPI peripheral. Call this API to disable the LPSPI clock. + * param base LPSPI peripheral address. + */ +void LPSPI_Deinit(LPSPI_Type *base) +{ + /* Reset to default value */ + LPSPI_Reset(base); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + + uint32_t instance = LPSPI_GetInstance(base); + /* Enable LPSPI clock */ + (void)CLOCK_DisableClock(s_lpspiClocks[instance]); + +#if defined(LPSPI_PERIPH_CLOCKS) + (void)CLOCK_DisableClock(s_LpspiPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +static void LPSPI_SetOnePcsPolarity(LPSPI_Type *base, + lpspi_which_pcs_t pcs, + lpspi_pcs_polarity_config_t activeLowOrHigh) +{ + uint32_t cfgr1Value = 0; + /* Clear the PCS polarity bit */ + cfgr1Value = base->CFGR1 & ~(1UL << (LPSPI_CFGR1_PCSPOL_SHIFT + (uint32_t)pcs)); + + /* Configure the PCS polarity bit according to the activeLowOrHigh setting */ + base->CFGR1 = cfgr1Value | ((uint32_t)activeLowOrHigh << (LPSPI_CFGR1_PCSPOL_SHIFT + (uint32_t)pcs)); +} + +/*! + * brief Sets the LPSPI baud rate in bits per second. + * + * This function takes in the desired bitsPerSec (baud rate) and calculates the nearest + * possible baud rate without exceeding the desired baud rate and returns the + * calculated baud rate in bits-per-second. It requires the caller to provide + * the frequency of the module source clock (in Hertz). Note that the baud rate + * does not go into effect until the Transmit Control Register (TCR) is programmed + * with the prescale value. Hence, this function returns the prescale tcrPrescaleValue + * parameter for later programming in the TCR. The higher level + * peripheral driver should alert the user of an out of range baud rate input. + * + * Note that the LPSPI module must first be disabled before configuring this. + * Note that the LPSPI module must be configured for master mode before configuring this. + * + * param base LPSPI peripheral address. + * param baudRate_Bps The desired baud rate in bits per second. + * param srcClock_Hz Module source input clock in Hertz. + * param tcrPrescaleValue The TCR prescale value needed to program the TCR. + * return The actual calculated baud rate. This function may also return a "0" if the + * LPSPI is not configured for master mode or if the LPSPI module is not disabled. + */ + +uint32_t LPSPI_MasterSetBaudRate(LPSPI_Type *base, + uint32_t baudRate_Bps, + uint32_t srcClock_Hz, + uint32_t *tcrPrescaleValue) +{ + assert(tcrPrescaleValue != NULL); + + /* For master mode configuration only, if slave mode detected, return 0. + * Also, the LPSPI module needs to be disabled first, if enabled, return 0 + */ + if ((!LPSPI_IsMaster(base)) || ((base->CR & LPSPI_CR_MEN_MASK) != 0U)) + { + return 0U; + } + + uint32_t prescaler, bestPrescaler; + uint32_t scaler, bestScaler; + uint32_t realBaudrate, bestBaudrate; + uint32_t diff, min_diff; + uint32_t desiredBaudrate = baudRate_Bps; + + /* find combination of prescaler and scaler resulting in baudrate closest to the + * requested value + */ + min_diff = 0xFFFFFFFFU; + + /* Set to maximum divisor value bit settings so that if baud rate passed in is less + * than the minimum possible baud rate, then the SPI will be configured to the lowest + * possible baud rate + */ + bestPrescaler = 7; + bestScaler = 255; + + bestBaudrate = 0; /* required to avoid compilation warning */ + + /* In all for loops, if min_diff = 0, the exit for loop*/ + for (prescaler = 0U; prescaler < 8U; prescaler++) + { + if (min_diff == 0U) + { + break; + } + for (scaler = 0U; scaler < 256U; scaler++) + { + if (min_diff == 0U) + { + break; + } + realBaudrate = (srcClock_Hz / (s_baudratePrescaler[prescaler] * (scaler + 2U))); + + /* calculate the baud rate difference based on the conditional statement + * that states that the calculated baud rate must not exceed the desired baud rate + */ + if (desiredBaudrate >= realBaudrate) + { + diff = desiredBaudrate - realBaudrate; + if (min_diff > diff) + { + /* a better match found */ + min_diff = diff; + bestPrescaler = prescaler; + bestScaler = scaler; + bestBaudrate = realBaudrate; + } + } + } + } + + /* Write the best baud rate scalar to the CCR. + * Note, no need to check for error since we've already checked to make sure the module is + * disabled and in master mode. Also, there is a limit on the maximum divider so we will not + * exceed this. + */ +#if defined(FSL_FEATURE_LPSPI_HAS_CCR1) && FSL_FEATURE_LPSPI_HAS_CCR1 + /* When CCR1 is present, the CCR[DBT] and CCR[SCKDIV] is write only, all read will return 0 + The real DBT and SCKDIV can be obtained in CCR1, CCR[DBT]=CCR1[SCKSCK] and CCR[SCKDIV]=CCR1[SCKHLD]+CCR1[SCKSET] + So when changing either CCR[DBT] or CCR[SCKDIV] make sure the other value is not overwritten by 0 */ + base->CCR = base->CCR | LPSPI_CCR_DBT((base->CCR1 & LPSPI_CCR1_SCKSCK_MASK) >> LPSPI_CCR1_SCKSCK_SHIFT) | + LPSPI_CCR_SCKDIV(bestScaler); +#else + base->CCR = (base->CCR & ~LPSPI_CCR_SCKDIV_MASK) | LPSPI_CCR_SCKDIV(bestScaler); +#endif /* FSL_FEATURE_LPSPI_HAS_CCR1 */ + + /* return the best prescaler value for user to use later */ + *tcrPrescaleValue = bestPrescaler; + + /* return the actual calculated baud rate */ + return bestBaudrate; +} + +/*! + * brief Manually configures a specific LPSPI delay parameter (module must be disabled to + * change the delay values). + * + * This function configures the following: + * SCK to PCS delay, or + * PCS to SCK delay, or + * The configurations must occur between the transfer delay. + * + * The delay names are available in type lpspi_delay_type_t. + * + * The user passes the desired delay along with the delay value. + * This allows the user to directly set the delay values if they have + * pre-calculated them or if they simply wish to manually increment the value. + * + * Note that the LPSPI module must first be disabled before configuring this. + * Note that the LPSPI module must be configured for master mode before configuring this. + * + * param base LPSPI peripheral address. + * param scaler The 8-bit delay value 0x00 to 0xFF (255). + * param whichDelay The desired delay to configure, must be of type lpspi_delay_type_t. + */ +void LPSPI_MasterSetDelayScaler(LPSPI_Type *base, uint32_t scaler, lpspi_delay_type_t whichDelay) +{ + /*These settings are only relevant in master mode */ +#if defined(FSL_FEATURE_LPSPI_HAS_CCR1) && FSL_FEATURE_LPSPI_HAS_CCR1 + /* When CCR1 is present, the CCR[DBT] and CCR[SCKDIV] is write only, all read will return 0 + The real DBT and SCKDIV can be obtained in CCR1, CCR[DBT]=CCR1[SCKSCK] and CCR[SCKDIV]=CCR1[SCKHLD]+CCR1[SCKSET] + So when changing either CCR[DBT] or CCR[SCKDIV] make sure the other value is not overwritten by 0 */ + uint32_t dbt = (base->CCR1 & LPSPI_CCR1_SCKSCK_MASK) >> LPSPI_CCR1_SCKSCK_SHIFT; + uint32_t sckdiv = (base->CCR1 & LPSPI_CCR1_SCKHLD_MASK) >> LPSPI_CCR1_SCKHLD_SHIFT; + sckdiv += (base->CCR1 & LPSPI_CCR1_SCKSET_MASK) >> LPSPI_CCR1_SCKSET_SHIFT; + switch (whichDelay) + { + case kLPSPI_PcsToSck: + base->CCR = (base->CCR & (~LPSPI_CCR_PCSSCK_MASK)) | LPSPI_CCR_PCSSCK(scaler) | LPSPI_CCR_DBT(dbt) | + LPSPI_CCR_SCKDIV(sckdiv); + + break; + case kLPSPI_LastSckToPcs: + base->CCR = (base->CCR & (~LPSPI_CCR_SCKPCS_MASK)) | LPSPI_CCR_SCKPCS(scaler) | LPSPI_CCR_DBT(dbt) | + LPSPI_CCR_SCKDIV(sckdiv); + + break; + case kLPSPI_BetweenTransfer: + base->CCR = base->CCR | LPSPI_CCR_DBT(scaler) | LPSPI_CCR_SCKDIV(sckdiv); +#else + switch (whichDelay) + { + case kLPSPI_PcsToSck: + base->CCR = (base->CCR & (~LPSPI_CCR_PCSSCK_MASK)) | LPSPI_CCR_PCSSCK(scaler); + + break; + case kLPSPI_LastSckToPcs: + base->CCR = (base->CCR & (~LPSPI_CCR_SCKPCS_MASK)) | LPSPI_CCR_SCKPCS(scaler); + + break; + case kLPSPI_BetweenTransfer: + base->CCR = (base->CCR & (~LPSPI_CCR_DBT_MASK)) | LPSPI_CCR_DBT(scaler); +#endif /* FSL_FEATURE_LPSPI_HAS_CCR1 */ + break; + default: + assert(false); + break; + } +} + +/*! + * brief Calculates the delay based on the desired delay input in nanoseconds (module must be + * disabled to change the delay values). + * + * This function calculates the values for the following: + * SCK to PCS delay, or + * PCS to SCK delay, or + * The configurations must occur between the transfer delay. + * + * The delay names are available in type lpspi_delay_type_t. + * + * The user passes the desired delay and the desired delay value in + * nano-seconds. The function calculates the value needed for the desired delay parameter + * and returns the actual calculated delay because an exact delay match may not be possible. In this + * case, the closest match is calculated without going below the desired delay value input. + * It is possible to input a very large delay value that exceeds the capability of the part, in + * which case the maximum supported delay is returned. It is up to the higher level + * peripheral driver to alert the user of an out of range delay input. + * + * Note that the LPSPI module must be configured for master mode before configuring this. And note that + * the delayTime = LPSPI_clockSource / (PRESCALE * Delay_scaler). + * + * param base LPSPI peripheral address. + * param delayTimeInNanoSec The desired delay value in nano-seconds. + * param whichDelay The desired delay to configuration, which must be of type lpspi_delay_type_t. + * param srcClock_Hz Module source input clock in Hertz. + * return actual Calculated delay value in nano-seconds. + */ +uint32_t LPSPI_MasterSetDelayTimes(LPSPI_Type *base, + uint32_t delayTimeInNanoSec, + lpspi_delay_type_t whichDelay, + uint32_t srcClock_Hz) +{ + uint64_t realDelay, bestDelay; + uint32_t scaler, bestScaler; + uint32_t diff, min_diff; + uint64_t initialDelayNanoSec; + uint32_t clockDividedPrescaler; + + /* For delay between transfer, an additional scaler value is needed */ + uint32_t additionalScaler = 0; + + /*As the RM note, the LPSPI baud rate clock is itself divided by the PRESCALE setting, which can vary between + * transfers.*/ + clockDividedPrescaler = + srcClock_Hz / s_baudratePrescaler[(base->TCR & LPSPI_TCR_PRESCALE_MASK) >> LPSPI_TCR_PRESCALE_SHIFT]; + + /* Find combination of prescaler and scaler resulting in the delay closest to the requested value.*/ + min_diff = 0xFFFFFFFFU; + + /* Initialize scaler to max value to generate the max delay */ + bestScaler = 0xFFU; + + /* Calculate the initial (min) delay and maximum possible delay based on the specific delay as + * the delay divisors are slightly different based on which delay we are configuring. + */ + if (whichDelay == kLPSPI_BetweenTransfer) + { + /* First calculate the initial, default delay, note min delay is 2 clock cycles. Due to large size of + calculated values (uint64_t), we need to break up the calculation into several steps to ensure + accurate calculated results + */ + initialDelayNanoSec = 1000000000U; + initialDelayNanoSec *= 2U; + initialDelayNanoSec /= clockDividedPrescaler; + + /* Calculate the maximum delay */ + bestDelay = 1000000000U; + bestDelay *= 257U; /* based on DBT+2, or 255 + 2 */ + bestDelay /= clockDividedPrescaler; + + additionalScaler = 1U; + } + else + { + /* First calculate the initial, default delay, min delay is 1 clock cycle. Due to large size of calculated + values (uint64_t), we need to break up the calculation into several steps to ensure accurate calculated + results. + */ + initialDelayNanoSec = 1000000000U; + initialDelayNanoSec /= clockDividedPrescaler; + + /* Calculate the maximum delay */ + bestDelay = 1000000000U; + bestDelay *= 256U; /* based on SCKPCS+1 or PCSSCK+1, or 255 + 1 */ + bestDelay /= clockDividedPrescaler; + + additionalScaler = 0U; + } + + /* If the initial, default delay is already greater than the desired delay, then + * set the delay to their initial value (0) and return the delay. In other words, + * there is no way to decrease the delay value further. + */ + if (initialDelayNanoSec >= delayTimeInNanoSec) + { + LPSPI_MasterSetDelayScaler(base, 0, whichDelay); + return (uint32_t)initialDelayNanoSec; + } + + /* If min_diff = 0, the exit for loop */ + for (scaler = 0U; scaler < 256U; scaler++) + { + if (min_diff == 0U) + { + break; + } + /* Calculate the real delay value as we cycle through the scaler values. + Due to large size of calculated values (uint64_t), we need to break up the + calculation into several steps to ensure accurate calculated results + */ + realDelay = 1000000000U; + realDelay *= ((uint64_t)scaler + 1UL + (uint64_t)additionalScaler); + realDelay /= clockDividedPrescaler; + + /* calculate the delay difference based on the conditional statement + * that states that the calculated delay must not be less then the desired delay + */ + if (realDelay >= delayTimeInNanoSec) + { + diff = (uint32_t)(realDelay - (uint64_t)delayTimeInNanoSec); + if (min_diff > diff) + { + /* a better match found */ + min_diff = diff; + bestScaler = scaler; + bestDelay = realDelay; + } + } + } + + /* write the best scaler value for the delay */ + LPSPI_MasterSetDelayScaler(base, bestScaler, whichDelay); + + /* return the actual calculated delay value (in ns) */ + return (uint32_t)bestDelay; +} + +/*Transactional APIs -- Master*/ + +/*! + * brief Initializes the LPSPI master handle. + * + * This function initializes the LPSPI handle, which can be used for other LPSPI transactional APIs. Usually, for a + * specified LPSPI instance, call this API once to get the initialized handle. + + * param base LPSPI peripheral address. + * param handle LPSPI handle pointer to lpspi_master_handle_t. + * param callback DSPI callback. + * param userData callback function parameter. + */ +void LPSPI_MasterTransferCreateHandle(LPSPI_Type *base, + lpspi_master_handle_t *handle, + lpspi_master_transfer_callback_t callback, + void *userData) +{ + assert(handle != NULL); + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + s_lpspiHandle[LPSPI_GetInstance(base)] = handle; + + /* Set irq handler. */ + s_lpspiMasterIsr = LPSPI_MasterTransferHandleIRQ; + + handle->callback = callback; + handle->userData = userData; +} + +/*! + * brief Check the argument for transfer . + * + * param base LPSPI peripheral address. + * param transfer the transfer struct to be used. + * param isEdma True to check for EDMA transfer, false to check interrupt non-blocking transfer + * return Return true for right and false for wrong. + */ +bool LPSPI_CheckTransferArgument(LPSPI_Type *base, lpspi_transfer_t *transfer, bool isEdma) +{ + assert(transfer != NULL); + uint32_t bitsPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) + 1U; + uint32_t bytesPerFrame = (bitsPerFrame + 7U) / 8U; + uint32_t temp = (base->CFGR1 & LPSPI_CFGR1_PINCFG_MASK); + /* If the transfer count is zero, then return immediately.*/ + if (transfer->dataSize == 0U) + { + return false; + } + + /* If both send buffer and receive buffer is null */ + if ((NULL == (transfer->txData)) && (NULL == (transfer->rxData))) + { + return false; + } + + /*The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4 . + *For bytesPerFrame greater than 4 situation: + *the transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4 , + *otherwise , the transfer data size can be integer multiples of bytesPerFrame. + */ + if (bytesPerFrame <= 4U) + { + if ((transfer->dataSize % bytesPerFrame) != 0U) + { + return false; + } + } + else + { + if ((bytesPerFrame % 4U) != 0U) + { + if (transfer->dataSize != bytesPerFrame) + { + return false; + } + } + else + { + if ((transfer->dataSize % bytesPerFrame) != 0U) + { + return false; + } + } + } + + /* Check if using 3-wire mode and the txData is NULL, set the output pin to tristated. */ + if ((temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdiInSdiOut)) || (temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdoInSdoOut))) + { + /* The 3-wire mode can't send and receive data at the same time. */ + if ((transfer->txData != NULL) && (transfer->rxData != NULL)) + { + return false; + } + } + + if (isEdma && ((bytesPerFrame % 4U) == 3U)) + { + return false; + } + + return true; +} + +static bool LPSPI_MasterTransferWriteAllTxData(LPSPI_Type *base, + lpspi_transfer_t *transfer, + lpspi_transfer_blocking_param_t *stateParams) +{ + uint8_t dummyData = g_lpspiDummyData[LPSPI_GetInstance(base)]; + uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; + uint32_t txRemainingByteCount = transfer->dataSize; + bool isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); + uint32_t wordToSend = + ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24); + uint32_t rxFifoMaxBytes = MIN(bytesPerFrame, 4U) * LPSPI_GetRxFifoSize(base); + uint32_t readData; + uint8_t fifo_size = LPSPI_GetRxFifoSize(base); + /*Write the TX data until txRemainingByteCount is equal to 0 */ + while (txRemainingByteCount > 0U) + { + if (txRemainingByteCount < (stateParams->bytesEachWrite)) + { + (stateParams->bytesEachWrite) = (uint8_t)txRemainingByteCount; + } + + /*Wait until TX FIFO is not full*/ +#if SPI_RETRY_TIMES + uint32_t waitTimes = SPI_RETRY_TIMES; + while ((LPSPI_GetTxFifoCount(base) == fifo_size) && ((--waitTimes) != 0U)) +#else + while (LPSPI_GetTxFifoCount(base) == fifo_size) +#endif + { + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return false; + } +#endif + + /* To prevent rxfifo overflow, ensure transmitting and receiving are executed in parallel */ + if (((NULL == (stateParams->rxData)) || + ((stateParams->rxRemainingByteCount) - txRemainingByteCount) < rxFifoMaxBytes)) + { + if (stateParams->isTxMask) + { + /* When TCR[TXMSK]=1, transfer is initiate by writting a new command word to TCR. TCR[TXMSK] is cleared + by hardware every time when TCR[FRAMESZ] bit of data is transfered. + In this case TCR[TXMSK] should be set to initiate each transfer. */ + base->TCR |= LPSPI_TCR_TXMSK_MASK; + if (stateParams->isPcsContinuous && (txRemainingByteCount == bytesPerFrame)) + { + /* For the last piece of frame size of data, if is PCS continous mode(TCR[CONT]), TCR[CONTC] should + * be cleared to de-assert the PCS. Be sure to clear the TXMSK as well otherwise another FRAMESZ + * of data will be received. */ + base->TCR &= ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK | LPSPI_TCR_TXMSK_MASK); + } + else + { + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return false; + } + } + txRemainingByteCount -= bytesPerFrame; + } + else + { + if ((stateParams->txData) != NULL) + { + if (stateParams->bytesEachWrite != 1U) + { + wordToSend = + LPSPI_CombineWriteData((stateParams->txData), (stateParams->bytesEachWrite), isByteSwap); + (stateParams->txData) += (stateParams->bytesEachWrite); + } + else + { + wordToSend = *(stateParams->txData); + (stateParams->txData) += 1U; + } + } + /* Otherwise push data to tx FIFO to initiate transfer */ + LPSPI_WriteData(base, wordToSend); + txRemainingByteCount -= (stateParams->bytesEachWrite); + } + } + + /* Check whether there is RX data in RX FIFO . Read out the RX data so that the RX FIFO would not overrun. */ + /* + * $Branch Coverage Justification$ + * Data will be transferred in the inner loop until complete, after which the interrupt will end.(will improve) + */ + if (((stateParams->rxData) != NULL) && ((stateParams->rxRemainingByteCount) != 0U)) + { + /* To ensure parallel execution in 3-wire mode, after writting 1 to TXMSK to generate clock of + bytesPerFrame's data wait until bytesPerFrame's data is received. */ + while ((stateParams->isTxMask) && (LPSPI_GetRxFifoCount(base) == 0U)) + { + } +#if SPI_RETRY_TIMES + uint32_t waitTimes = SPI_RETRY_TIMES; + while ((LPSPI_GetRxFifoCount(base) != 0U) && (--waitTimes != 0U)) +#else + while (LPSPI_GetRxFifoCount(base) != 0U) +#endif + { + readData = LPSPI_ReadData(base); + /* + * $Branch Coverage Justification$ + * rxRemainingByteCount must be an integer multiple of bytesEachRead, otherwise it cannot pass the check + * of #LPSPI_CheckTransferArgument,so it doesn't happen here.(will improve) + */ + if ((stateParams->rxRemainingByteCount) < (stateParams->bytesEachRead)) + { + (stateParams->bytesEachRead) = (uint8_t)(stateParams->rxRemainingByteCount); + } + + LPSPI_SeparateReadData((stateParams->rxData), readData, (stateParams->bytesEachRead), isByteSwap); + (stateParams->rxData) += (stateParams->bytesEachRead); + + (stateParams->rxRemainingByteCount) -= (stateParams->bytesEachRead); + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return false; + } +#endif + } + } + return true; +} + +static bool LPSPI_MasterTransferClearTCR(LPSPI_Type *base, lpspi_transfer_blocking_param_t *stateParams) +{ +#if SPI_RETRY_TIMES + uint32_t waitTimes = SPI_RETRY_TIMES; + while ((LPSPI_GetTxFifoCount(base) == LPSPI_GetRxFifoSize(base)) && (--waitTimes != 0U)) +#else + while (LPSPI_GetTxFifoCount(base) == LPSPI_GetRxFifoSize(base)) +#endif + { + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return false; + } +#endif + base->TCR = (base->TCR & ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK)); + + return true; +} + +static bool LPSPI_MasterTransferReadDataInFifo(LPSPI_Type *base, + lpspi_transfer_t *transfer, + lpspi_transfer_blocking_param_t *stateParams) +{ + uint32_t readData; + bool isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); + while ((stateParams->rxRemainingByteCount) > 0U) + { +#if SPI_RETRY_TIMES + uint32_t waitTimes = SPI_RETRY_TIMES; + while ((LPSPI_GetRxFifoCount(base) != 0U) && (--waitTimes != 0U)) +#else + while (LPSPI_GetRxFifoCount(base) != 0U) +#endif + { + readData = LPSPI_ReadData(base); + + if ((stateParams->rxRemainingByteCount) < (stateParams->bytesEachRead)) + { + (stateParams->bytesEachRead) = (uint8_t)(stateParams->rxRemainingByteCount); + } + + LPSPI_SeparateReadData((stateParams->rxData), readData, (stateParams->bytesEachRead), isByteSwap); + (stateParams->rxData) += (stateParams->bytesEachRead); + + (stateParams->rxRemainingByteCount) -= (stateParams->bytesEachRead); + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return false; + } +#endif + } + + return true; +} + +static bool LPSPI_MasterTransferReadDataInFifoNoBuf(LPSPI_Type *base, lpspi_transfer_blocking_param_t *stateParams) +{ +#if SPI_RETRY_TIMES + uint32_t waitTimes = SPI_RETRY_TIMES; + while (((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_TransferCompleteFlag) == 0U) && (--waitTimes != 0U)) +#else + while ((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_TransferCompleteFlag) == 0U) +#endif + { + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return false; + } +#endif + return true; +} + +/*! + * brief LPSPI master transfer data using a polling method. + * + * This function transfers data using a polling method. This is a blocking function, which does not return until all + * transfers have been completed. + * + * Note: + * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * param base LPSPI peripheral address. + * param transfer pointer to lpspi_transfer_t structure. + * return status of status_t. + */ +status_t LPSPI_MasterTransferBlocking(LPSPI_Type *base, lpspi_transfer_t *transfer) +{ + assert(transfer != NULL); + + /* Check that LPSPI is not busy.*/ + /* + * $Branch Coverage Justification$ + * MBF state setting and clearing is done by hardware, the state is too fast to be overwritten.(will improve) + */ + if ((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_ModuleBusyFlag) != 0U) + { + return kStatus_LPSPI_Busy; + } + LPSPI_Enable(base, false); + /* Check arguements */ + if (!LPSPI_CheckTransferArgument(base, transfer, false)) + { + return kStatus_InvalidArgument; + } + + LPSPI_FlushFifo(base, true, true); + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_AllStatusFlag); + + /* Variables */ + uint32_t whichPcs = (transfer->configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT; +#if !(defined(FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH) && FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH) + uint32_t width = (transfer->configFlags & LPSPI_MASTER_WIDTH_MASK) >> LPSPI_MASTER_WIDTH_SHIFT; +#endif + uint32_t temp = (base->CFGR1 & LPSPI_CFGR1_PINCFG_MASK); + lpspi_transfer_blocking_param_t stateParams; + (void)memset(&stateParams, 0, sizeof(stateParams)); + + stateParams.txData = transfer->txData; + stateParams.rxData = transfer->rxData; + stateParams.isTxMask = false; + stateParams.rxRemainingByteCount = transfer->dataSize; + /*The TX and RX FIFO sizes are always the same*/ + uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; + /* No need to configure PCS continous if the transfer byte count is smaller than frame size */ + stateParams.isPcsContinuous = (((transfer->configFlags & (uint32_t)kLPSPI_MasterPcsContinuous) != 0U) && + (bytesPerFrame < transfer->dataSize)); + + /* Mask tx data in half duplex mode */ + if (((temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdiInSdiOut)) || (temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdoInSdoOut))) && + (stateParams.txData == NULL)) + { + stateParams.isTxMask = true; + } + + base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); + LPSPI_Enable(base, true); + + /* Configure transfer control register. */ + base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_RXMSK_MASK | + LPSPI_TCR_TXMSK_MASK | LPSPI_TCR_PCS_MASK)) | +#if !(defined(FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH) && FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH) + LPSPI_TCR_WIDTH(width) | +#endif + LPSPI_TCR_PCS(whichPcs); + /*TCR is also shared the FIFO, so wait for TCR written.*/ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_2$ + */ + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return kStatus_LPSPI_Timeout; + } + + /* PCS should be configured separately from the other bits, otherwise it will not take effect. */ + base->TCR |= LPSPI_TCR_CONT(stateParams.isPcsContinuous) | LPSPI_TCR_CONTC(stateParams.isPcsContinuous) | + LPSPI_TCR_RXMSK(NULL == stateParams.rxData); + + /*TCR is also shared the FIFO, so wait for TCR written.*/ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_2$ + */ + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return kStatus_LPSPI_Timeout; + } + + if (bytesPerFrame <= 4U) + { + stateParams.bytesEachWrite = (uint8_t)bytesPerFrame; + stateParams.bytesEachRead = (uint8_t)bytesPerFrame; + } + else + { + stateParams.bytesEachWrite = 4U; + stateParams.bytesEachRead = 4U; + } + + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_2$ + */ + if (false == LPSPI_MasterTransferWriteAllTxData(base, transfer, &stateParams)) + { + return kStatus_LPSPI_Timeout; + } + + if (stateParams.isPcsContinuous && !stateParams.isTxMask) + { + /* In PCS continous mode(TCR[CONT]), after write all the data in TX FIFO, TCR[CONTC] and TCR[CONT] should be + cleared to de-assert the PCS. Note that TCR register also use the TX FIFO. Also CONTC should be cleared when + tx is not masked, otherwise written to TCR register with TXMSK bit set will initiate a new transfer. */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_2$ + */ + if (false == LPSPI_MasterTransferClearTCR(base, &stateParams)) + { + return kStatus_LPSPI_Timeout; + } + } + + /*Read out the RX data in FIFO*/ + if (stateParams.rxData != NULL) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_2$ + */ + if (false == LPSPI_MasterTransferReadDataInFifo(base, transfer, &stateParams)) + { + return kStatus_LPSPI_Timeout; + } + } + else + { + /* If no RX buffer, then transfer is not complete until transfer complete flag sets */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_2$ + */ + if (false == LPSPI_MasterTransferReadDataInFifoNoBuf(base, &stateParams)) + { + return kStatus_LPSPI_Timeout; + } + } + + return kStatus_Success; +} + +/*! + * brief LPSPI master transfer data using an interrupt method. + * + * This function transfers data using an interrupt method. This is a non-blocking function, which returns right away. + * When all data is transferred, the callback function is called. + * + * Note: + * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * param base LPSPI peripheral address. + * param handle pointer to lpspi_master_handle_t structure which stores the transfer state. + * param transfer pointer to lpspi_transfer_t structure. + * return status of status_t. + */ +status_t LPSPI_MasterTransferNonBlocking(LPSPI_Type *base, lpspi_master_handle_t *handle, lpspi_transfer_t *transfer) +{ + assert(handle != NULL); + assert(transfer != NULL); + + /* Check that we're not busy.*/ + if (handle->state == (uint8_t)kLPSPI_Busy) + { + return kStatus_LPSPI_Busy; + } + + LPSPI_Enable(base, false); + /* Check arguements */ + if (!LPSPI_CheckTransferArgument(base, transfer, false)) + { + return kStatus_InvalidArgument; + } + + /* Flush FIFO, clear status, disable all the interrupts. */ + LPSPI_FlushFifo(base, true, true); + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_AllStatusFlag); + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); + + /* Variables */ + bool isRxMask = false; + handle->isTxMask = false; + uint8_t txWatermark; + uint8_t dummyData = g_lpspiDummyData[LPSPI_GetInstance(base)]; + uint32_t tmpTimes; + uint32_t whichPcs = (transfer->configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT; + uint32_t temp = (base->CFGR1 & LPSPI_CFGR1_PINCFG_MASK); + + /* Assign the original value for members of transfer handle. */ + handle->state = (uint8_t)kLPSPI_Busy; + handle->txData = transfer->txData; + handle->rxData = transfer->rxData; + handle->txRemainingByteCount = transfer->dataSize; + handle->rxRemainingByteCount = transfer->dataSize; + handle->totalByteCount = transfer->dataSize; + handle->writeTcrInIsr = false; + handle->bytesPerFrame = (uint16_t)((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; + /* No need to configure PCS continous if the transfer byte count is smaller than frame size */ + bool isPcsContinuous = (((transfer->configFlags & (uint32_t)kLPSPI_MasterPcsContinuous) != 0U) && + (transfer->dataSize > handle->bytesPerFrame)); + handle->writeRegRemainingTimes = + (transfer->dataSize / (uint32_t)handle->bytesPerFrame) * (((uint32_t)handle->bytesPerFrame + 3U) / 4U); + handle->readRegRemainingTimes = handle->writeRegRemainingTimes; + handle->txBuffIfNull = + ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24); + /*The TX and RX FIFO sizes are always the same*/ + handle->fifoSize = LPSPI_GetRxFifoSize(base); + handle->isPcsContinuous = isPcsContinuous; + handle->isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); + /*Calculate the bytes for write/read the TX/RX register each time*/ + if (handle->bytesPerFrame <= 4U) + { + handle->bytesEachWrite = (uint8_t)handle->bytesPerFrame; + handle->bytesEachRead = (uint8_t)handle->bytesPerFrame; + } + else + { + handle->bytesEachWrite = 4U; + handle->bytesEachRead = 4U; + } + + /*Set the RX and TX watermarks to reduce the ISR times.*/ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_3$ + */ + if (handle->fifoSize > 1U) + { + txWatermark = 1U; + handle->rxWatermark = handle->fifoSize - 2U; + } + else + { + txWatermark = 0U; + handle->rxWatermark = 0U; + } + LPSPI_SetFifoWatermarks(base, txWatermark, handle->rxWatermark); + + /* If there is no rxData, mask the receive data so that receive data is not stored in receive FIFO. */ + if (handle->rxData == NULL) + { + isRxMask = true; + handle->rxRemainingByteCount = 0; + } + + /* Mask tx data in half duplex mode since the tx/rx share the same pin, so that the data received from slave is not + * interfered. */ + if (((temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdiInSdiOut)) || (temp == LPSPI_CFGR1_PINCFG(kLPSPI_SdoInSdoOut))) && + (handle->txData == NULL)) + { + handle->isTxMask = true; + } + + /*Transfers will stall when transmit FIFO is empty or receive FIFO is full. */ + base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); + + /* Enable module for following configuration of TCR to take effect. */ + LPSPI_Enable(base, true); + + /* Configure transfer control register. */ + base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_RXMSK_MASK | + LPSPI_TCR_TXMSK_MASK | LPSPI_TCR_PCS_MASK)) | + LPSPI_TCR_PCS(whichPcs); + + /*TCR is also shared the FIFO , so wait for TCR written.*/ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_2$ + */ + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return kStatus_LPSPI_Timeout; + } + + /* PCS should be configured separately from the other bits, otherwise it will not take effect. */ + base->TCR |= LPSPI_TCR_CONT(isPcsContinuous) | LPSPI_TCR_CONTC(isPcsContinuous) | LPSPI_TCR_RXMSK(isRxMask); + + /* Enable the NVIC for LPSPI peripheral. Note that below code is useless if the LPSPI interrupt is in INTMUX , + * and you should also enable the INTMUX interupt in your application. + */ + (void)EnableIRQ(s_lpspiIRQ[LPSPI_GetInstance(base)]); + + /*TCR is also shared the FIFO , so wait for TCR written.*/ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_2$ + */ + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return kStatus_LPSPI_Timeout; + } + + if (handle->isTxMask) + { + /* When TCR[TXMSK]=1, transfer is initiate by writting a new command word to TCR. TCR[TXMSK] is cleared by + hardware every time when TCR[FRAMESZ] bit of data is transfered. In this case TCR[TXMSK] should be set to + initiate each transfer. */ + + base->TCR |= LPSPI_TCR_TXMSK_MASK; + handle->txRemainingByteCount -= (uint32_t)handle->bytesPerFrame; + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return kStatus_LPSPI_Timeout; + } + } + else + { + /* Fill up the TX data in FIFO to initiate transfer */ + LPSPI_MasterTransferFillUpTxFifo(base, handle); + } + + /* Since SPI is a synchronous interface, we only need to enable the RX interrupt if there is RX data. + * The IRQ handler will get the status of RX and TX interrupt flags. + */ + if (handle->rxData != NULL) + { + if (handle->isTxMask) + { + /* if tx data is masked, transfer is initiated by writing 1 to TCR[TXMSK] and TCR[FRMESZ] bits of data is + read. If rx water mark is set larger than TCR[FRMESZ], rx interrupt will not be generated. Lower the rx + water mark setting */ + if ((handle->bytesPerFrame / 4U) < (uint16_t)handle->rxWatermark) + { + handle->rxWatermark = + (uint8_t)(handle->bytesPerFrame / 4U) > 0U ? (uint8_t)(handle->bytesPerFrame / 4U - 1U) : 0U; + base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | LPSPI_FCR_RXWATER(handle->rxWatermark); + } + } + else + { + /*Set rxWatermark to (readRegRemainingTimes-1) if readRegRemainingTimes less than rxWatermark. Otherwise + *there is not RX interrupt for the last datas because the RX count is not greater than rxWatermark. + */ + tmpTimes = handle->readRegRemainingTimes; + if (tmpTimes <= handle->rxWatermark) + { + base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | LPSPI_FCR_RXWATER(tmpTimes - 1U); + } + } + + LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_RxInterruptEnable); + } + else + { + LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable); + } + + return kStatus_Success; +} + +static void LPSPI_MasterTransferFillUpTxFifo(LPSPI_Type *base, lpspi_master_handle_t *handle) +{ + assert(handle != NULL); + + uint32_t wordToSend = 0; + uint8_t fifoSize = handle->fifoSize; + uint32_t writeRegRemainingTimes = handle->writeRegRemainingTimes; + uint32_t readRegRemainingTimes = handle->readRegRemainingTimes; + size_t txRemainingByteCount = handle->txRemainingByteCount; + uint8_t bytesEachWrite = handle->bytesEachWrite; + bool isByteSwap = handle->isByteSwap; + + /* Make sure the difference in remaining TX and RX byte counts does not exceed FIFO depth + * and that the number of TX FIFO entries does not exceed the FIFO depth. + * But no need to make the protection if there is no rxData. + */ + while ((LPSPI_GetTxFifoCount(base) < fifoSize) && + (((readRegRemainingTimes - writeRegRemainingTimes) < (uint32_t)fifoSize) || (handle->rxData == NULL))) + { + if (txRemainingByteCount < (size_t)bytesEachWrite) + { + handle->bytesEachWrite = (uint8_t)txRemainingByteCount; + bytesEachWrite = handle->bytesEachWrite; + } + + if (handle->txData != NULL) + { + wordToSend = LPSPI_CombineWriteData(handle->txData, bytesEachWrite, isByteSwap); + handle->txData += bytesEachWrite; + } + else + { + wordToSend = handle->txBuffIfNull; + } + + /*Write the word to TX register*/ + LPSPI_WriteData(base, wordToSend); + + /*Decrease the write TX register times.*/ + --handle->writeRegRemainingTimes; + writeRegRemainingTimes = handle->writeRegRemainingTimes; + + /*Decrease the remaining TX byte count.*/ + handle->txRemainingByteCount -= (size_t)bytesEachWrite; + txRemainingByteCount = handle->txRemainingByteCount; + + if (handle->txRemainingByteCount == 0U) + { + /* If PCS is continuous, update TCR to de-assert PCS */ + if (handle->isPcsContinuous) + { + /* Only write to the TCR if the FIFO has room */ + if (LPSPI_GetTxFifoCount(base) < fifoSize) + { + base->TCR = (base->TCR & ~(LPSPI_TCR_CONTC_MASK)); + handle->writeTcrInIsr = false; + } + /* Else, set a global flag to tell the ISR to do write to the TCR */ + else + { + handle->writeTcrInIsr = true; + } + } + break; + } + } +} + +static void LPSPI_MasterTransferComplete(LPSPI_Type *base, lpspi_master_handle_t *handle) +{ + assert(handle != NULL); + + /* Disable interrupt requests*/ + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); + + handle->state = (uint8_t)kLPSPI_Idle; + + if (handle->callback != NULL) + { + handle->callback(base, handle, kStatus_Success, handle->userData); + } +} + +/*! + * brief Gets the master transfer remaining bytes. + * + * This function gets the master transfer remaining bytes. + * + * param base LPSPI peripheral address. + * param handle pointer to lpspi_master_handle_t structure which stores the transfer state. + * param count Number of bytes transferred so far by the non-blocking transaction. + * return status of status_t. + */ +status_t LPSPI_MasterTransferGetCount(LPSPI_Type *base, lpspi_master_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (handle->state != (uint8_t)kLPSPI_Busy) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + size_t remainingByte; + + if (handle->rxData != NULL) + { + remainingByte = handle->rxRemainingByteCount; + } + else + { + remainingByte = handle->txRemainingByteCount; + } + + *count = handle->totalByteCount - remainingByte; + + return kStatus_Success; +} + +/*! + * brief LPSPI master abort transfer which uses an interrupt method. + * + * This function aborts a transfer which uses an interrupt method. + * + * param base LPSPI peripheral address. + * param handle pointer to lpspi_master_handle_t structure which stores the transfer state. + */ +void LPSPI_MasterTransferAbort(LPSPI_Type *base, lpspi_master_handle_t *handle) +{ + assert(handle != NULL); + + /* Disable interrupt requests*/ + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); + + LPSPI_Reset(base); + + handle->state = (uint8_t)kLPSPI_Idle; + handle->txRemainingByteCount = 0; + handle->rxRemainingByteCount = 0; +} + +/*! + * brief LPSPI Master IRQ handler function. + * + * This function processes the LPSPI transmit and receive IRQ. + * + * param base LPSPI peripheral address. + * param handle pointer to lpspi_master_handle_t structure which stores the transfer state. + */ +void LPSPI_MasterTransferHandleIRQ(LPSPI_Type *base, lpspi_master_handle_t *handle) +{ + assert(handle != NULL); + + uint32_t readData; + uint8_t bytesEachRead = handle->bytesEachRead; + bool isByteSwap = handle->isByteSwap; + uint32_t readRegRemainingTimes = handle->readRegRemainingTimes; + + if (handle->rxData != NULL) + { + if (handle->rxRemainingByteCount != 0U) + { + /* First, disable the interrupts to avoid potentially triggering another interrupt + * while reading out the RX FIFO as more data may be coming into the RX FIFO. We'll + * re-enable the interrupts based on the LPSPI state after reading out the FIFO. + */ + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_RxInterruptEnable); + + /* + * $Branch Coverage Justification$ + * If the remaining number is 0, the FIFO must be 0, and the condition after will not be judged.(will + * improve) + */ + while ((LPSPI_GetRxFifoCount(base) != 0U) && (handle->rxRemainingByteCount != 0U)) + { + /*Read out the data*/ + readData = LPSPI_ReadData(base); + + /*Decrease the read RX register times.*/ + --handle->readRegRemainingTimes; + readRegRemainingTimes = handle->readRegRemainingTimes; + + if (handle->rxRemainingByteCount < (size_t)bytesEachRead) + { + handle->bytesEachRead = (uint8_t)(handle->rxRemainingByteCount); + bytesEachRead = handle->bytesEachRead; + } + + LPSPI_SeparateReadData(handle->rxData, readData, bytesEachRead, isByteSwap); + handle->rxData += bytesEachRead; + + /*Decrease the remaining RX byte count.*/ + handle->rxRemainingByteCount -= (size_t)bytesEachRead; + } + + /* Re-enable the interrupts only if rxCount indicates there is more data to receive, + * else we may get a spurious interrupt. + * */ + if (handle->rxRemainingByteCount != 0U) + { + /* Set the TDF and RDF interrupt enables simultaneously to avoid race conditions */ + LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_RxInterruptEnable); + } + } + + /*Set rxWatermark to (readRegRemainingTimes-1) if readRegRemainingTimes less than rxWatermark. Otherwise there + *is not RX interrupt for the last datas because the RX count is not greater than rxWatermark. + */ + if (readRegRemainingTimes <= (uint32_t)handle->rxWatermark) + { + base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | + LPSPI_FCR_RXWATER((readRegRemainingTimes > 1U) ? (readRegRemainingTimes - 1U) : (0U)); + } + } + + if (handle->txRemainingByteCount != 0U) + { + if (handle->isTxMask) + { + /* When TCR[TXMSK]=1, transfer is initiate by writting a new command word to TCR. TCR[TXMSK] is cleared by + hardware every time when TCR[FRAMESZ] bit of data is transfered. + In this case TCR[TXMSK] should be set to initiate each transfer. */ + base->TCR |= LPSPI_TCR_TXMSK_MASK; + if ((handle->txRemainingByteCount == (uint32_t)handle->bytesPerFrame) && (handle->isPcsContinuous)) + { + /* For the last piece of frame size of data, if is PCS continous mode(TCR[CONT]), TCR[CONTC] should + * be cleared to de-assert the PCS. Be sure to clear the TXMSK as well otherwise another FRAMESZ + * of data will be received. */ + base->TCR &= ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK | LPSPI_TCR_TXMSK_MASK); + } + else + { + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return; + } + } + handle->txRemainingByteCount -= (uint32_t)handle->bytesPerFrame; + } + else + { + LPSPI_MasterTransferFillUpTxFifo(base, handle); + } + } + else + { + if ((LPSPI_GetTxFifoCount(base) < (handle->fifoSize))) + { + if ((handle->isPcsContinuous) && (handle->writeTcrInIsr) && (!handle->isTxMask)) + { + base->TCR = (base->TCR & ~(LPSPI_TCR_CONTC_MASK)); + handle->writeTcrInIsr = false; + } + } + } + + if ((handle->txRemainingByteCount == 0U) && (handle->rxRemainingByteCount == 0U) && (!handle->writeTcrInIsr)) + { + /* If no RX buffer, then transfer is not complete until transfer complete flag sets */ + if (handle->rxData == NULL) + { + if ((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_TransferCompleteFlag) != 0U) + { + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_TransferCompleteFlag); + /* Complete the transfer and disable the interrupts */ + LPSPI_MasterTransferComplete(base, handle); + } + else + { + LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_TransferCompleteInterruptEnable); + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable | (uint32_t)kLPSPI_RxInterruptEnable); + } + } + else + { + /* Complete the transfer and disable the interrupts */ + LPSPI_MasterTransferComplete(base, handle); + } + } +} + +/*Transactional APIs -- Slave*/ +/*! + * brief Initializes the LPSPI slave handle. + * + * This function initializes the LPSPI handle, which can be used for other LPSPI transactional APIs. Usually, for a + * specified LPSPI instance, call this API once to get the initialized handle. + * + * param base LPSPI peripheral address. + * param handle LPSPI handle pointer to lpspi_slave_handle_t. + * param callback DSPI callback. + * param userData callback function parameter. + */ +void LPSPI_SlaveTransferCreateHandle(LPSPI_Type *base, + lpspi_slave_handle_t *handle, + lpspi_slave_transfer_callback_t callback, + void *userData) +{ + assert(handle != NULL); + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + s_lpspiHandle[LPSPI_GetInstance(base)] = handle; + + /* Set irq handler. */ + s_lpspiSlaveIsr = LPSPI_SlaveTransferHandleIRQ; + + handle->callback = callback; + handle->userData = userData; +} + +/*! + * brief LPSPI slave transfer data using an interrupt method. + * + * This function transfer data using an interrupt method. This is a non-blocking function, which returns right away. + * When all data is transferred, the callback function is called. + * + * Note: + * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * param base LPSPI peripheral address. + * param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. + * param transfer pointer to lpspi_transfer_t structure. + * return status of status_t. + */ +status_t LPSPI_SlaveTransferNonBlocking(LPSPI_Type *base, lpspi_slave_handle_t *handle, lpspi_transfer_t *transfer) +{ + assert(handle != NULL); + assert(transfer != NULL); + + /* Check that we're not busy.*/ + if (handle->state == (uint8_t)kLPSPI_Busy) + { + return kStatus_LPSPI_Busy; + } + LPSPI_Enable(base, false); + /* Check arguements */ + if (!LPSPI_CheckTransferArgument(base, transfer, false)) + { + return kStatus_InvalidArgument; + } + + /* Flush FIFO, clear status, disable all the inerrupts. */ + LPSPI_FlushFifo(base, true, true); + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_AllStatusFlag); + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); + + /* Variables */ + bool isRxMask = false; + bool isTxMask = false; + uint8_t txWatermark; + uint32_t readRegRemainingTimes; + uint32_t whichPcs = (transfer->configFlags & LPSPI_SLAVE_PCS_MASK) >> LPSPI_SLAVE_PCS_SHIFT; + uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; + + /* Assign the original value for members of transfer handle. */ + handle->state = (uint8_t)kLPSPI_Busy; + handle->txData = transfer->txData; + handle->rxData = transfer->rxData; + handle->txRemainingByteCount = transfer->dataSize; + handle->rxRemainingByteCount = transfer->dataSize; + handle->totalByteCount = transfer->dataSize; + handle->writeRegRemainingTimes = (transfer->dataSize / bytesPerFrame) * ((bytesPerFrame + 3U) / 4U); + handle->readRegRemainingTimes = handle->writeRegRemainingTimes; + /*The TX and RX FIFO sizes are always the same*/ + handle->fifoSize = LPSPI_GetRxFifoSize(base); + handle->isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_SlaveByteSwap) != 0U); + /*Calculate the bytes for write/read the TX/RX register each time*/ + if (bytesPerFrame <= 4U) + { + handle->bytesEachWrite = (uint8_t)bytesPerFrame; + handle->bytesEachRead = (uint8_t)bytesPerFrame; + } + else + { + handle->bytesEachWrite = 4U; + handle->bytesEachRead = 4U; + } + /* Set proper RX and TX watermarks to reduce the ISR response times. */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_3$ + */ + if (handle->fifoSize > 1U) + { + txWatermark = 1U; + handle->rxWatermark = handle->fifoSize / 2U; + } + else + { + txWatermark = 0U; + handle->rxWatermark = 0U; + } + LPSPI_SetFifoWatermarks(base, txWatermark, handle->rxWatermark); + + /* If there is no rxData, mask the receive data so that receive data is not stored in receive FIFO. */ + if (handle->rxData == NULL) + { + isRxMask = true; + handle->rxRemainingByteCount = 0U; + } + /* If there is no txData, mask the transmit data so that no data is loaded from transmit FIFO and output pin + * is tristated. */ + if (handle->txData == NULL) + { + isTxMask = true; + handle->txRemainingByteCount = 0U; + } + + /* Enable module for following configuration of TCR to take effect. */ + LPSPI_Enable(base, true); + + base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_RXMSK_MASK | + LPSPI_TCR_TXMSK_MASK | LPSPI_TCR_PCS_MASK)) | + LPSPI_TCR_RXMSK(isRxMask) | LPSPI_TCR_TXMSK(isTxMask) | LPSPI_TCR_PCS(whichPcs); + + /* Enable the NVIC for LPSPI peripheral. Note that below code is useless if the LPSPI interrupt is in INTMUX , + * and you should also enable the INTMUX interupt in your application. + */ + (void)EnableIRQ(s_lpspiIRQ[LPSPI_GetInstance(base)]); + + /*TCR is also shared the FIFO, so wait for TCR written.*/ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_3$ + */ + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return kStatus_LPSPI_Timeout; + } + + /* Fill up the TX data in FIFO */ + if (handle->txData != NULL) + { + LPSPI_SlaveTransferFillUpTxFifo(base, handle); + } + + /* Since SPI is a synchronous interface, we only need to enable the RX interrupt if there is RX data. + * The IRQ handler will get the status of RX and TX interrupt flags. + */ + if (handle->rxData != NULL) + { + /*Set rxWatermark to (readRegRemainingTimes-1) if readRegRemainingTimes less than rxWatermark. Otherwise there + *is not RX interrupt for the last datas because the RX count is not greater than rxWatermark. + */ + readRegRemainingTimes = handle->readRegRemainingTimes; + if (readRegRemainingTimes <= (uint32_t)handle->rxWatermark) + { + base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | LPSPI_FCR_RXWATER(readRegRemainingTimes - 1U); + } + + /* RX request and FIFO overflow request enable */ + LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_RxInterruptEnable | (uint32_t)kLPSPI_ReceiveErrorInterruptEnable); + } + else + { + LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable); + } + + if (handle->txData != NULL) + { + /* TX FIFO underflow request enable */ + LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_TransmitErrorInterruptEnable); + } + + return kStatus_Success; +} + +static void LPSPI_SlaveTransferFillUpTxFifo(LPSPI_Type *base, lpspi_slave_handle_t *handle) +{ + assert(handle != NULL); + + uint32_t wordToSend = 0U; + uint8_t bytesEachWrite = handle->bytesEachWrite; + bool isByteSwap = handle->isByteSwap; + + while (LPSPI_GetTxFifoCount(base) < (handle->fifoSize)) + { + if (handle->txRemainingByteCount < (size_t)bytesEachWrite) + { + handle->bytesEachWrite = (uint8_t)handle->txRemainingByteCount; + bytesEachWrite = handle->bytesEachWrite; + } + + wordToSend = LPSPI_CombineWriteData(handle->txData, bytesEachWrite, isByteSwap); + handle->txData += bytesEachWrite; + + /*Decrease the remaining TX byte count.*/ + handle->txRemainingByteCount -= (size_t)bytesEachWrite; + + /*Write the word to TX register*/ + LPSPI_WriteData(base, wordToSend); + + if (handle->txRemainingByteCount == 0U) + { + break; + } + } +} + +static void LPSPI_SlaveTransferComplete(LPSPI_Type *base, lpspi_slave_handle_t *handle) +{ + assert(handle != NULL); + + status_t status = kStatus_Success; + + /* Disable interrupt requests*/ + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); + + if (handle->state == (uint8_t)kLPSPI_Error) + { + status = kStatus_LPSPI_Error; + } + else + { + status = kStatus_Success; + } + + handle->state = (uint8_t)kLPSPI_Idle; + + if (handle->callback != NULL) + { + handle->callback(base, handle, status, handle->userData); + } +} + +/*! + * brief Gets the slave transfer remaining bytes. + * + * This function gets the slave transfer remaining bytes. + * + * param base LPSPI peripheral address. + * param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. + * param count Number of bytes transferred so far by the non-blocking transaction. + * return status of status_t. + */ +status_t LPSPI_SlaveTransferGetCount(LPSPI_Type *base, lpspi_slave_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (handle->state != (uint8_t)kLPSPI_Busy) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + size_t remainingByte; + + if (handle->rxData != NULL) + { + remainingByte = handle->rxRemainingByteCount; + } + else + { + remainingByte = handle->txRemainingByteCount; + } + + *count = handle->totalByteCount - remainingByte; + + return kStatus_Success; +} + +/*! + * brief LPSPI slave aborts a transfer which uses an interrupt method. + * + * This function aborts a transfer which uses an interrupt method. + * + * param base LPSPI peripheral address. + * param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. + */ +void LPSPI_SlaveTransferAbort(LPSPI_Type *base, lpspi_slave_handle_t *handle) +{ + assert(handle != NULL); + + /* Disable interrupt requests*/ + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable | (uint32_t)kLPSPI_RxInterruptEnable); + + LPSPI_Reset(base); + + handle->state = (uint8_t)kLPSPI_Idle; + handle->txRemainingByteCount = 0U; + handle->rxRemainingByteCount = 0U; +} + +/*! + * brief LPSPI Slave IRQ handler function. + * + * This function processes the LPSPI transmit and receives an IRQ. + * + * param base LPSPI peripheral address. + * param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. + */ +void LPSPI_SlaveTransferHandleIRQ(LPSPI_Type *base, lpspi_slave_handle_t *handle) +{ + assert(handle != NULL); + + uint32_t readData; /* variable to store word read from RX FIFO */ + uint8_t bytesEachRead = handle->bytesEachRead; + bool isByteSwap = handle->isByteSwap; + uint32_t readRegRemainingTimes; + + if (handle->rxData != NULL) + { + if (handle->rxRemainingByteCount > 0U) + { + while (LPSPI_GetRxFifoCount(base) != 0U) + { + /*Read out the data*/ + readData = LPSPI_ReadData(base); + + /*Decrease the read RX register times.*/ + --handle->readRegRemainingTimes; + + if (handle->rxRemainingByteCount < (size_t)bytesEachRead) + { + handle->bytesEachRead = (uint8_t)handle->rxRemainingByteCount; + bytesEachRead = handle->bytesEachRead; + } + + LPSPI_SeparateReadData(handle->rxData, readData, bytesEachRead, isByteSwap); + handle->rxData += bytesEachRead; + + /*Decrease the remaining RX byte count.*/ + handle->rxRemainingByteCount -= (size_t)bytesEachRead; + + if ((handle->txRemainingByteCount > 0U) && (handle->txData != NULL)) + { + LPSPI_SlaveTransferFillUpTxFifo(base, handle); + } + + if (handle->rxRemainingByteCount == 0U) + { + break; + } + } + } + + /*Set rxWatermark to (readRegRemainingTimes-1) if readRegRemainingTimes less than rxWatermark. Otherwise there + *is not RX interrupt for the last datas because the RX count is not greater than rxWatermark. + */ + readRegRemainingTimes = handle->readRegRemainingTimes; + if (readRegRemainingTimes <= (uint32_t)handle->rxWatermark) + { + base->FCR = (base->FCR & (~LPSPI_FCR_RXWATER_MASK)) | + LPSPI_FCR_RXWATER((readRegRemainingTimes > 1U) ? (readRegRemainingTimes - 1U) : (0U)); + } + } + if ((handle->rxData == NULL) && (handle->txRemainingByteCount != 0U) && (handle->txData != NULL)) + { + LPSPI_SlaveTransferFillUpTxFifo(base, handle); + } + + if ((handle->txRemainingByteCount == 0U) && (handle->rxRemainingByteCount == 0U)) + { + /* If no RX buffer, then transfer is not complete until transfer complete flag sets and the TX FIFO empty*/ + if (handle->rxData == NULL) + { + if (((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_FrameCompleteFlag) != 0U) && + (LPSPI_GetTxFifoCount(base) == 0U)) + { + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_FrameCompleteFlag); + /* Complete the transfer and disable the interrupts */ + LPSPI_SlaveTransferComplete(base, handle); + } + else + { + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_FrameCompleteFlag); + LPSPI_EnableInterrupts(base, (uint32_t)kLPSPI_FrameCompleteInterruptEnable); + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_TxInterruptEnable | (uint32_t)kLPSPI_RxInterruptEnable); + } + } + else + { + /* Complete the transfer and disable the interrupts */ + LPSPI_SlaveTransferComplete(base, handle); + } + } + + /* Catch tx fifo underflow conditions, service only if tx under flow interrupt enabled */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_4$ + */ + if (((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_TransmitErrorFlag) != 0U) && + ((base->IER & LPSPI_IER_TEIE_MASK) != 0U)) + { + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_TransmitErrorFlag); + /* Change state to error and clear flag */ + if (handle->txData != NULL) + { + handle->state = (uint8_t)kLPSPI_Error; + } + handle->errorCount++; + /* ERR051588: Clear FIFO after underrun occurs */ + LPSPI_FlushFifo(base, true, false); + } + /* Catch rx fifo overflow conditions, service only if rx over flow interrupt enabled */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_4$ + */ + if (((LPSPI_GetStatusFlags(base) & (uint32_t)kLPSPI_ReceiveErrorFlag) != 0U) && + ((base->IER & LPSPI_IER_REIE_MASK) != 0U)) + { + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_ReceiveErrorFlag); + /* Change state to error and clear flag */ + /* + * $Branch Coverage Justification$ + * This error happens on receive, so rxData won't be empty.(will improve) + */ + if (handle->rxData != NULL) + { + handle->state = (uint8_t)kLPSPI_Error; + } + handle->errorCount++; + } +} + +static uint32_t LPSPI_CombineWriteData(const uint8_t *txData, uint8_t bytesEachWrite, bool isByteSwap) +{ + assert(txData != NULL); + + uint32_t wordToSend = 0U; + + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_1$ + */ + switch (bytesEachWrite) + { + case 1: + wordToSend = *txData; + ++txData; + break; + + case 2: + if (!isByteSwap) + { + wordToSend = *txData; + ++txData; + wordToSend |= (unsigned)(*txData) << 8U; + ++txData; + } + else + { + wordToSend = (unsigned)(*txData) << 8U; + ++txData; + wordToSend |= *txData; + ++txData; + } + + break; + + case 3: + if (!isByteSwap) + { + wordToSend = *txData; + ++txData; + wordToSend |= (unsigned)(*txData) << 8U; + ++txData; + wordToSend |= (unsigned)(*txData) << 16U; + ++txData; + } + else + { + wordToSend = (unsigned)(*txData) << 16U; + ++txData; + wordToSend |= (unsigned)(*txData) << 8U; + ++txData; + wordToSend |= *txData; + ++txData; + } + break; + + case 4: + if (!isByteSwap) + { + wordToSend = *txData; + ++txData; + wordToSend |= (unsigned)(*txData) << 8U; + ++txData; + wordToSend |= (unsigned)(*txData) << 16U; + ++txData; + wordToSend |= (unsigned)(*txData) << 24U; + ++txData; + } + else + { + wordToSend = (unsigned)(*txData) << 24U; + ++txData; + wordToSend |= (unsigned)(*txData) << 16U; + ++txData; + wordToSend |= (unsigned)(*txData) << 8U; + ++txData; + wordToSend |= *txData; + ++txData; + } + break; + + default: + assert(false); + break; + } + return wordToSend; +} + +static void LPSPI_SeparateReadData(uint8_t *rxData, uint32_t readData, uint8_t bytesEachRead, bool isByteSwap) +{ + assert(rxData != NULL); + + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_c_ref_1$ + */ + switch (bytesEachRead) + { + case 1: + *rxData = (uint8_t)readData; + ++rxData; + break; + + case 2: + if (!isByteSwap) + { + *rxData = (uint8_t)readData; + ++rxData; + *rxData = (uint8_t)(readData >> 8); + ++rxData; + } + else + { + *rxData = (uint8_t)(readData >> 8); + ++rxData; + *rxData = (uint8_t)readData; + ++rxData; + } + break; + + case 3: + if (!isByteSwap) + { + *rxData = (uint8_t)readData; + ++rxData; + *rxData = (uint8_t)(readData >> 8); + ++rxData; + *rxData = (uint8_t)(readData >> 16); + ++rxData; + } + else + { + *rxData = (uint8_t)(readData >> 16); + ++rxData; + *rxData = (uint8_t)(readData >> 8); + ++rxData; + *rxData = (uint8_t)readData; + ++rxData; + } + break; + + case 4: + if (!isByteSwap) + { + *rxData = (uint8_t)readData; + ++rxData; + *rxData = (uint8_t)(readData >> 8); + ++rxData; + *rxData = (uint8_t)(readData >> 16); + ++rxData; + *rxData = (uint8_t)(readData >> 24); + ++rxData; + } + else + { + *rxData = (uint8_t)(readData >> 24); + ++rxData; + *rxData = (uint8_t)(readData >> 16); + ++rxData; + *rxData = (uint8_t)(readData >> 8); + ++rxData; + *rxData = (uint8_t)readData; + ++rxData; + } + break; + + default: + assert(false); + break; + } +} + +/*! + * brief Wait for tx FIFO to be empty. + * Wait the tx fifo empty when set TCR register + * param base LPSPI peripheral address. + * return true for the tx FIFO is ready, false is not. + */ +bool LPSPI_WaitTxFifoEmpty(LPSPI_Type *base) +{ +#if SPI_RETRY_TIMES + uint32_t waitTimes = SPI_RETRY_TIMES; + while (((uint8_t)LPSPI_GetTxFifoCount(base) != 0U) && (--waitTimes != 0U)) +#else + while ((uint8_t)LPSPI_GetTxFifoCount(base) != 0U) +#endif + { + } +#if SPI_RETRY_TIMES + if (waitTimes == 0U) + { + return false; + } +#endif + return true; +} + +static void LPSPI_CommonIRQHandler(LPSPI_Type *base, void *param) +{ + if (LPSPI_IsMaster(base)) + { + s_lpspiMasterIsr(base, (lpspi_master_handle_t *)param); + } + else + { + s_lpspiSlaveIsr(base, (lpspi_slave_handle_t *)param); + } + SDK_ISR_EXIT_BARRIER; +} + +#if defined(LPSPI0) +void LPSPI0_DriverIRQHandler(void); +void LPSPI0_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[0] != NULL); + LPSPI_CommonIRQHandler(LPSPI0, s_lpspiHandle[0]); +} +#endif + +#if defined(LPSPI1) +void LPSPI1_DriverIRQHandler(void); +void LPSPI1_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[1] != NULL); + LPSPI_CommonIRQHandler(LPSPI1, s_lpspiHandle[1]); +} +#endif + +#if defined(LPSPI2) +void LPSPI2_DriverIRQHandler(void); +void LPSPI2_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[2] != NULL); + LPSPI_CommonIRQHandler(LPSPI2, s_lpspiHandle[2]); +} +#endif + +#if defined(LPSPI3) +void LPSPI3_DriverIRQHandler(void); +void LPSPI3_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[3] != NULL); + LPSPI_CommonIRQHandler(LPSPI3, s_lpspiHandle[3]); +} +#endif + +#if defined(LPSPI4) +void LPSPI4_DriverIRQHandler(void); +void LPSPI4_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[4] != NULL); + LPSPI_CommonIRQHandler(LPSPI4, s_lpspiHandle[4]); +} +#endif + +#if defined(LPSPI5) +void LPSPI5_DriverIRQHandler(void); +void LPSPI5_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[5] != NULL); + LPSPI_CommonIRQHandler(LPSPI5, s_lpspiHandle[5]); +} +#endif + +#if defined(LPSPI6) +void LPSPI6_DriverIRQHandler(void); +void LPSPI6_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[6] != NULL); + LPSPI_CommonIRQHandler(LPSPI6, s_lpspiHandle[6]); +} +#endif + +#if defined(DMA__LPSPI0) +void DMA_SPI0_INT_DriverIRQHandler(void); +void DMA_SPI0_INT_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI0)] != NULL); + LPSPI_CommonIRQHandler(DMA__LPSPI0, s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI0)]); +} +#endif + +#if defined(DMA__LPSPI1) +void DMA_SPI1_INT_DriverIRQHandler(void); +void DMA_SPI1_INT_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI1)] != NULL); + LPSPI_CommonIRQHandler(DMA__LPSPI1, s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI1)]); +} +#endif +#if defined(DMA__LPSPI2) +void DMA_SPI2_INT_DriverIRQHandler(void); +void DMA_SPI2_INT_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI2)] != NULL); + LPSPI_CommonIRQHandler(DMA__LPSPI2, s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI2)]); +} +#endif + +#if defined(DMA__LPSPI3) +void DMA_SPI3_INT_DriverIRQHandler(void); +void DMA_SPI3_INT_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI3)] != NULL); + LPSPI_CommonIRQHandler(DMA__LPSPI3, s_lpspiHandle[LPSPI_GetInstance(DMA__LPSPI3)]); +} +#endif + +#if defined(ADMA__LPSPI0) +void ADMA_SPI0_INT_DriverIRQHandler(void); +void ADMA_SPI0_INT_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI0)] != NULL); + LPSPI_CommonIRQHandler(ADMA__LPSPI0, s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI0)]); +} +#endif + +#if defined(ADMA__LPSPI1) +void ADMA_SPI1_INT_DriverIRQHandler(void); +void ADMA_SPI1_INT_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI1)] != NULL); + LPSPI_CommonIRQHandler(ADMA__LPSPI1, s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI1)]); +} +#endif +#if defined(ADMA__LPSPI2) +void ADMA_SPI2_INT_DriverIRQHandler(void); +void ADMA_SPI2_INT_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI2)] != NULL); + LPSPI_CommonIRQHandler(ADMA__LPSPI2, s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI2)]); +} +#endif + +#if defined(ADMA__LPSPI3) +void ADMA_SPI3_INT_DriverIRQHandler(void); +void ADMA_SPI3_INT_DriverIRQHandler(void) +{ + assert(s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI3)] != NULL); + LPSPI_CommonIRQHandler(ADMA__LPSPI3, s_lpspiHandle[LPSPI_GetInstance(ADMA__LPSPI3)]); +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi.h new file mode 100644 index 00000000000..517179054aa --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi.h @@ -0,0 +1,1231 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2023, 2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_LPSPI_H_ +#define FSL_LPSPI_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lpspi_driver + * @{ + */ + +/********************************************************************************************************************** + * Definitions + *********************************************************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief LPSPI driver version. */ +#define FSL_LPSPI_DRIVER_VERSION (MAKE_VERSION(2, 6, 8)) +/*! @} */ + +#ifndef LPSPI_DUMMY_DATA +/*! @brief LPSPI dummy data if no Tx data.*/ +#define LPSPI_DUMMY_DATA (0x00U) /*!< Dummy data used for tx if there is not txData. */ +#endif + +/*! @brief Retry times for waiting flag. */ +#ifndef SPI_RETRY_TIMES +#define SPI_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ +#endif + +/*! @brief Global variable for dummy data value setting. */ +extern volatile uint8_t g_lpspiDummyData[]; + +/*! @brief Status for the LPSPI driver.*/ +enum +{ + kStatus_LPSPI_Busy = MAKE_STATUS(kStatusGroup_LPSPI, 0), /*!< LPSPI transfer is busy.*/ + kStatus_LPSPI_Error = MAKE_STATUS(kStatusGroup_LPSPI, 1), /*!< LPSPI driver error. */ + kStatus_LPSPI_Idle = MAKE_STATUS(kStatusGroup_LPSPI, 2), /*!< LPSPI is idle.*/ + kStatus_LPSPI_OutOfRange = MAKE_STATUS(kStatusGroup_LPSPI, 3), /*!< LPSPI transfer out Of range. */ + kStatus_LPSPI_Timeout = MAKE_STATUS(kStatusGroup_LPSPI, 4) /*!< LPSPI timeout polling status flags. */ +}; + +/*! @brief LPSPI status flags in SPIx_SR register.*/ +enum _lpspi_flags +{ + kLPSPI_TxDataRequestFlag = LPSPI_SR_TDF_MASK, /*!< Transmit data flag */ + kLPSPI_RxDataReadyFlag = LPSPI_SR_RDF_MASK, /*!< Receive data flag */ + kLPSPI_WordCompleteFlag = LPSPI_SR_WCF_MASK, /*!< Word Complete flag */ + kLPSPI_FrameCompleteFlag = LPSPI_SR_FCF_MASK, /*!< Frame Complete flag */ + kLPSPI_TransferCompleteFlag = LPSPI_SR_TCF_MASK, /*!< Transfer Complete flag */ + kLPSPI_TransmitErrorFlag = LPSPI_SR_TEF_MASK, /*!< Transmit Error flag (FIFO underrun) */ + kLPSPI_ReceiveErrorFlag = LPSPI_SR_REF_MASK, /*!< Receive Error flag (FIFO overrun) */ + kLPSPI_DataMatchFlag = LPSPI_SR_DMF_MASK, /*!< Data Match flag */ + kLPSPI_ModuleBusyFlag = LPSPI_SR_MBF_MASK, /*!< Module Busy flag */ + kLPSPI_AllStatusFlag = (LPSPI_SR_TDF_MASK | LPSPI_SR_RDF_MASK | LPSPI_SR_WCF_MASK | LPSPI_SR_FCF_MASK | + LPSPI_SR_TCF_MASK | LPSPI_SR_TEF_MASK | LPSPI_SR_REF_MASK | LPSPI_SR_DMF_MASK | + LPSPI_SR_MBF_MASK) /*!< Used for clearing all w1c status flags */ +}; + +/*! @brief LPSPI interrupt source.*/ +enum _lpspi_interrupt_enable +{ + kLPSPI_TxInterruptEnable = LPSPI_IER_TDIE_MASK, /*!< Transmit data interrupt enable */ + kLPSPI_RxInterruptEnable = LPSPI_IER_RDIE_MASK, /*!< Receive data interrupt enable */ + kLPSPI_WordCompleteInterruptEnable = LPSPI_IER_WCIE_MASK, /*!< Word complete interrupt enable */ + kLPSPI_FrameCompleteInterruptEnable = LPSPI_IER_FCIE_MASK, /*!< Frame complete interrupt enable */ + kLPSPI_TransferCompleteInterruptEnable = LPSPI_IER_TCIE_MASK, /*!< Transfer complete interrupt enable */ + kLPSPI_TransmitErrorInterruptEnable = LPSPI_IER_TEIE_MASK, /*!< Transmit error interrupt enable(FIFO underrun)*/ + kLPSPI_ReceiveErrorInterruptEnable = LPSPI_IER_REIE_MASK, /*!< Receive Error interrupt enable (FIFO overrun) */ + kLPSPI_DataMatchInterruptEnable = LPSPI_IER_DMIE_MASK, /*!< Data Match interrupt enable */ + kLPSPI_AllInterruptEnable = + (LPSPI_IER_TDIE_MASK | LPSPI_IER_RDIE_MASK | LPSPI_IER_WCIE_MASK | LPSPI_IER_FCIE_MASK | LPSPI_IER_TCIE_MASK | + LPSPI_IER_TEIE_MASK | LPSPI_IER_REIE_MASK | LPSPI_IER_DMIE_MASK) /*!< All above interrupts enable.*/ +}; + +/*! @brief LPSPI DMA source.*/ +enum _lpspi_dma_enable +{ + kLPSPI_TxDmaEnable = LPSPI_DER_TDDE_MASK, /*!< Transmit data DMA enable */ + kLPSPI_RxDmaEnable = LPSPI_DER_RDDE_MASK /*!< Receive data DMA enable */ +}; + +/*! @brief LPSPI master or slave mode configuration.*/ +typedef enum _lpspi_master_slave_mode +{ + kLPSPI_Master = 1U, /*!< LPSPI peripheral operates in master mode.*/ + kLPSPI_Slave = 0U /*!< LPSPI peripheral operates in slave mode.*/ +} lpspi_master_slave_mode_t; + +/*! @brief LPSPI Peripheral Chip Select (PCS) configuration (which PCS to configure).*/ +typedef enum _lpspi_which_pcs_config +{ + kLPSPI_Pcs0 = 0U, /*!< PCS[0] */ + kLPSPI_Pcs1 = 1U, /*!< PCS[1] */ + kLPSPI_Pcs2 = 2U, /*!< PCS[2] */ + kLPSPI_Pcs3 = 3U /*!< PCS[3] */ +} lpspi_which_pcs_t; + +/*! @brief LPSPI Peripheral Chip Select (PCS) Polarity configuration.*/ +typedef enum _lpspi_pcs_polarity_config +{ + kLPSPI_PcsActiveHigh = 1U, /*!< PCS Active High (idles low) */ + kLPSPI_PcsActiveLow = 0U /*!< PCS Active Low (idles high) */ +} lpspi_pcs_polarity_config_t; + +/*! @brief LPSPI Peripheral Chip Select (PCS) Polarity.*/ +enum _lpspi_pcs_polarity +{ + kLPSPI_Pcs0ActiveLow = 1U << 0, /*!< Pcs0 Active Low (idles high). */ + kLPSPI_Pcs1ActiveLow = 1U << 1, /*!< Pcs1 Active Low (idles high). */ + kLPSPI_Pcs2ActiveLow = 1U << 2, /*!< Pcs2 Active Low (idles high). */ + kLPSPI_Pcs3ActiveLow = 1U << 3, /*!< Pcs3 Active Low (idles high). */ + kLPSPI_PcsAllActiveLow = 0xFU /*!< Pcs0 to Pcs5 Active Low (idles high). */ +}; + +/*! @brief LPSPI clock polarity configuration.*/ +typedef enum _lpspi_clock_polarity +{ + kLPSPI_ClockPolarityActiveHigh = 0U, /*!< CPOL=0. Active-high LPSPI clock (idles low)*/ + kLPSPI_ClockPolarityActiveLow = 1U /*!< CPOL=1. Active-low LPSPI clock (idles high)*/ +} lpspi_clock_polarity_t; + +/*! @brief LPSPI clock phase configuration.*/ +typedef enum _lpspi_clock_phase +{ + kLPSPI_ClockPhaseFirstEdge = 0U, /*!< CPHA=0. Data is captured on the leading edge of the SCK and changed on the + following edge.*/ + kLPSPI_ClockPhaseSecondEdge = 1U /*!< CPHA=1. Data is changed on the leading edge of the SCK and captured on the + following edge.*/ +} lpspi_clock_phase_t; + +/*! @brief LPSPI data shifter direction options.*/ +typedef enum _lpspi_shift_direction +{ + kLPSPI_MsbFirst = 0U, /*!< Data transfers start with most significant bit.*/ + kLPSPI_LsbFirst = 1U /*!< Data transfers start with least significant bit.*/ +} lpspi_shift_direction_t; + +/*! @brief LPSPI Host Request select configuration. */ +typedef enum _lpspi_host_request_select +{ + kLPSPI_HostReqExtPin = 0U, /*!< Host Request is an ext pin. */ + kLPSPI_HostReqInternalTrigger = 1U /*!< Host Request is an internal trigger. */ +} lpspi_host_request_select_t; + +/*! @brief LPSPI Match configuration options. */ +typedef enum _lpspi_match_config +{ + kLPSI_MatchDisabled = 0x0U, /*!< LPSPI Match Disabled. */ + kLPSI_1stWordEqualsM0orM1 = 0x2U, /*!< LPSPI Match Enabled. */ + kLPSI_AnyWordEqualsM0orM1 = 0x3U, /*!< LPSPI Match Enabled. */ + kLPSI_1stWordEqualsM0and2ndWordEqualsM1 = 0x4U, /*!< LPSPI Match Enabled. */ + kLPSI_AnyWordEqualsM0andNxtWordEqualsM1 = 0x5U, /*!< LPSPI Match Enabled. */ + kLPSI_1stWordAndM1EqualsM0andM1 = 0x6U, /*!< LPSPI Match Enabled. */ + kLPSI_AnyWordAndM1EqualsM0andM1 = 0x7U, /*!< LPSPI Match Enabled. */ +} lpspi_match_config_t; + +/*! @brief LPSPI pin (SDO and SDI) configuration. */ +typedef enum _lpspi_pin_config +{ + kLPSPI_SdiInSdoOut = 0U, /*!< LPSPI SDI input, SDO output. */ + kLPSPI_SdiInSdiOut = 1U, /*!< LPSPI SDI input, SDI output. */ + kLPSPI_SdoInSdoOut = 2U, /*!< LPSPI SDO input, SDO output. */ + kLPSPI_SdoInSdiOut = 3U /*!< LPSPI SDO input, SDI output. */ +} lpspi_pin_config_t; + +/*! @brief LPSPI data output configuration. */ +typedef enum _lpspi_data_out_config +{ + kLpspiDataOutRetained = 0U, /*!< Data out retains last value when chip select is de-asserted */ + kLpspiDataOutTristate = 1U /*!< Data out is tristated when chip select is de-asserted */ +} lpspi_data_out_config_t; + +#if !(defined(FSL_FEATURE_LPSPI_HAS_NO_PCSCFG) && FSL_FEATURE_LPSPI_HAS_NO_PCSCFG) +/*! @brief LPSPI cs function configuration. */ +typedef enum _lpspi_pcs_function_config +{ + kLPSPI_PcsAsCs = 0U, /*!< PCS pin select as cs function */ + kLPSPI_PcsAsData = 1U, /*!< PCS pin select as date function */ +} lpspi_pcs_function_config_t; +#endif + +/*! @brief LPSPI transfer width configuration. */ +typedef enum _lpspi_transfer_width +{ + kLPSPI_SingleBitXfer = 0U, /*!< 1-bit shift at a time, data out on SDO, in on SDI (normal mode) */ + kLPSPI_TwoBitXfer = 1U, /*!< 2-bits shift out on SDO/SDI and in on SDO/SDI */ + kLPSPI_FourBitXfer = 2U /*!< 4-bits shift out on SDO/SDI/PCS[3:2] and in on SDO/SDI/PCS[3:2] */ +} lpspi_transfer_width_t; + +/*! @brief LPSPI delay type selection.*/ +typedef enum _lpspi_delay_type +{ + kLPSPI_PcsToSck = 1U, /*!< PCS-to-SCK delay. */ + kLPSPI_LastSckToPcs, /*!< Last SCK edge to PCS delay. */ + kLPSPI_BetweenTransfer /*!< Delay between transfers. */ +} lpspi_delay_type_t; + +#define LPSPI_MASTER_PCS_SHIFT (4U) /*!< LPSPI master PCS shift macro , internal used. */ +#define LPSPI_MASTER_PCS_MASK (0xF0U) /*!< LPSPI master PCS shift macro , internal used. */ +#if !(defined(FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH) && FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH) +#define LPSPI_MASTER_WIDTH_SHIFT (16U) /*!< LPSPI master width shift macro, internal used */ +#define LPSPI_MASTER_WIDTH_MASK (0x30000U) /*!< LPSPI master width shift mask, internal used */ +#endif + +/*! @brief Use this enumeration for LPSPI master transfer configFlags. */ +enum _lpspi_transfer_config_flag_for_master +{ + kLPSPI_MasterPcs0 = 0U << LPSPI_MASTER_PCS_SHIFT, /*!< LPSPI master transfer use PCS0 signal */ + kLPSPI_MasterPcs1 = 1U << LPSPI_MASTER_PCS_SHIFT, /*!< LPSPI master transfer use PCS1 signal */ + kLPSPI_MasterPcs2 = 2U << LPSPI_MASTER_PCS_SHIFT, /*!< LPSPI master transfer use PCS2 signal */ + kLPSPI_MasterPcs3 = 3U << LPSPI_MASTER_PCS_SHIFT, /*!< LPSPI master transfer use PCS3 signal */ +#if !(defined(FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH) && FSL_FEATURE_LPSPI_HAS_NO_MULTI_WIDTH) + kLPSPI_MasterWidth1 = 0U << LPSPI_MASTER_WIDTH_SHIFT, /*!< LPSPI master transfer 1bit */ + kLPSPI_MasterWidth2 = 1U << LPSPI_MASTER_WIDTH_SHIFT, /*!< LPSPI master transfer 2bit */ + kLPSPI_MasterWidth4 = 2U << LPSPI_MASTER_WIDTH_SHIFT, /*!< LPSPI master transfer 4bit */ +#endif + + kLPSPI_MasterPcsContinuous = 1U << 20, /*!< Is PCS signal continuous */ + + kLPSPI_MasterByteSwap = + 1U << 22 /*!< Is master swap the byte. + * For example, when want to send data 1 2 3 4 5 6 7 8 (suppose you set + * lpspi_shift_direction_t to MSB). + * 1. If you set bitPerFrame = 8 , no matter the kLPSPI_MasterByteSwapyou flag is used + * or not, the waveform is 1 2 3 4 5 6 7 8. + * 2. If you set bitPerFrame = 16 : + * (1) the waveform is 2 1 4 3 6 5 8 7 if you do not use the kLPSPI_MasterByteSwap flag. + * (2) the waveform is 1 2 3 4 5 6 7 8 if you use the kLPSPI_MasterByteSwap flag. + * 3. If you set bitPerFrame = 32 : + * (1) the waveform is 4 3 2 1 8 7 6 5 if you do not use the kLPSPI_MasterByteSwap flag. + * (2) the waveform is 1 2 3 4 5 6 7 8 if you use the kLPSPI_MasterByteSwap flag. + */ +}; + +#define LPSPI_SLAVE_PCS_SHIFT (4U) /*!< LPSPI slave PCS shift macro , internal used. */ +#define LPSPI_SLAVE_PCS_MASK (0xF0U) /*!< LPSPI slave PCS shift macro , internal used. */ + +/*! @brief Use this enumeration for LPSPI slave transfer configFlags. */ +enum _lpspi_transfer_config_flag_for_slave +{ + kLPSPI_SlavePcs0 = 0U << LPSPI_SLAVE_PCS_SHIFT, /*!< LPSPI slave transfer use PCS0 signal */ + kLPSPI_SlavePcs1 = 1U << LPSPI_SLAVE_PCS_SHIFT, /*!< LPSPI slave transfer use PCS1 signal */ + kLPSPI_SlavePcs2 = 2U << LPSPI_SLAVE_PCS_SHIFT, /*!< LPSPI slave transfer use PCS2 signal */ + kLPSPI_SlavePcs3 = 3U << LPSPI_SLAVE_PCS_SHIFT, /*!< LPSPI slave transfer use PCS3 signal */ + + kLPSPI_SlaveByteSwap = + 1U << 22 /*!< Is slave swap the byte. + * For example, when want to send data 1 2 3 4 5 6 7 8 (suppose you set + * lpspi_shift_direction_t to MSB). + * 1. If you set bitPerFrame = 8 , no matter the kLPSPI_SlaveByteSwap flag is used + * or not, the waveform is 1 2 3 4 5 6 7 8. + * 2. If you set bitPerFrame = 16 : + * (1) the waveform is 2 1 4 3 6 5 8 7 if you do not use the kLPSPI_SlaveByteSwap flag. + * (2) the waveform is 1 2 3 4 5 6 7 8 if you use the kLPSPI_SlaveByteSwap flag. + * 3. If you set bitPerFrame = 32 : + * (1) the waveform is 4 3 2 1 8 7 6 5 if you do not use the kLPSPI_SlaveByteSwap flag. + * (2) the waveform is 1 2 3 4 5 6 7 8 if you use the kLPSPI_SlaveByteSwap flag. + */ +}; + +/*! @brief LPSPI transfer state, which is used for LPSPI transactional API state machine. */ +enum _lpspi_transfer_state +{ + kLPSPI_Idle = 0x0U, /*!< Nothing in the transmitter/receiver. */ + kLPSPI_Busy, /*!< Transfer queue is not finished. */ + kLPSPI_Error /*!< Transfer error. */ +}; + +/*! @brief LPSPI master configuration structure.*/ +typedef struct _lpspi_master_config +{ + uint32_t baudRate; /*!< Baud Rate for LPSPI. */ + uint32_t bitsPerFrame; /*!< Bits per frame, minimum 8, maximum 4096.*/ + lpspi_clock_polarity_t cpol; /*!< Clock polarity. */ + lpspi_clock_phase_t cpha; /*!< Clock phase. */ + lpspi_shift_direction_t direction; /*!< MSB or LSB data shift direction. */ + + uint32_t pcsToSckDelayInNanoSec; /*!< PCS to SCK delay time in nanoseconds, setting to 0 sets the minimum delay. + It sets the boundary value if out of range.*/ + uint32_t lastSckToPcsDelayInNanoSec; /*!< Last SCK to PCS delay time in nanoseconds, setting to 0 sets the minimum + delay. It sets the boundary value if out of range.*/ + uint32_t betweenTransferDelayInNanoSec; /*!< After the SCK delay time with nanoseconds, setting to 0 sets the + minimum delay. It sets the boundary value if out of range.*/ + + lpspi_which_pcs_t whichPcs; /*!< Desired Peripheral Chip Select (PCS). */ + lpspi_pcs_polarity_config_t pcsActiveHighOrLow; /*!< Desired PCS active high or low */ + + lpspi_pin_config_t pinCfg; /*!< Configures which pins are used for input and output data + *during single bit transfers.*/ + +#if !(defined(FSL_FEATURE_LPSPI_HAS_NO_PCSCFG) && FSL_FEATURE_LPSPI_HAS_NO_PCSCFG) + lpspi_pcs_function_config_t pcsFunc; /*!< Configures cs pins function.*/ +#endif + lpspi_data_out_config_t dataOutConfig; /*!< Configures if the output data is tristated + * between accesses (LPSPI_PCS is negated). */ + bool enableInputDelay; /*!< Enable master to sample the input data on a delayed SCK. This can help improve slave + setup time. Refer to device data sheet for specific time length. */ +} lpspi_master_config_t; + +/*! @brief LPSPI slave configuration structure.*/ +typedef struct _lpspi_slave_config +{ + uint32_t bitsPerFrame; /*!< Bits per frame, minimum 8, maximum 4096.*/ + lpspi_clock_polarity_t cpol; /*!< Clock polarity. */ + lpspi_clock_phase_t cpha; /*!< Clock phase. */ + lpspi_shift_direction_t direction; /*!< MSB or LSB data shift direction. */ + + lpspi_which_pcs_t whichPcs; /*!< Desired Peripheral Chip Select (pcs) */ + lpspi_pcs_polarity_config_t pcsActiveHighOrLow; /*!< Desired PCS active high or low */ + + lpspi_pin_config_t pinCfg; /*!< Configures which pins are used for input and output data + *during single bit transfers.*/ + + lpspi_data_out_config_t dataOutConfig; /*!< Configures if the output data is tristated + * between accesses (LPSPI_PCS is negated). */ +} lpspi_slave_config_t; + +/*! + * @brief Forward declaration of the _lpspi_master_handle typedefs. + */ +typedef struct _lpspi_master_handle lpspi_master_handle_t; + +/*! + * @brief Forward declaration of the _lpspi_slave_handle typedefs. + */ +typedef struct _lpspi_slave_handle lpspi_slave_handle_t; + +/*! + * @brief Master completion callback function pointer type. + * + * @param base LPSPI peripheral address. + * @param handle Pointer to the handle for the LPSPI master. + * @param status Success or error code describing whether the transfer is completed. + * @param userData Arbitrary pointer-dataSized value passed from the application. + */ +typedef void (*lpspi_master_transfer_callback_t)(LPSPI_Type *base, + lpspi_master_handle_t *handle, + status_t status, + void *userData); + +/*! + * @brief Slave completion callback function pointer type. + * + * @param base LPSPI peripheral address. + * @param handle Pointer to the handle for the LPSPI slave. + * @param status Success or error code describing whether the transfer is completed. + * @param userData Arbitrary pointer-dataSized value passed from the application. + */ +typedef void (*lpspi_slave_transfer_callback_t)(LPSPI_Type *base, + lpspi_slave_handle_t *handle, + status_t status, + void *userData); + +/*! @brief LPSPI master/slave transfer structure.*/ +typedef struct _lpspi_transfer +{ + const uint8_t *txData; /*!< Send buffer. */ + uint8_t *rxData; /*!< Receive buffer. */ + volatile size_t dataSize; /*!< Transfer bytes. */ + + uint32_t configFlags; /*!< Transfer transfer configuration flags. Set from _lpspi_transfer_config_flag_for_master if + the transfer is used for master or _lpspi_transfer_config_flag_for_slave enumeration if the + transfer is used for slave.*/ +} lpspi_transfer_t; + +/*! @brief LPSPI master transfer handle structure used for transactional API. */ +struct _lpspi_master_handle +{ + volatile bool isPcsContinuous; /*!< Is PCS continuous in transfer. */ + volatile bool writeTcrInIsr; /*!< A flag that whether should write TCR in ISR. */ + + volatile bool isByteSwap; /*!< A flag that whether should byte swap. */ + volatile bool isTxMask; /*!< A flag that whether TCR[TXMSK] is set. */ + volatile uint16_t bytesPerFrame; /*!< Number of bytes in each frame */ + + volatile uint8_t fifoSize; /*!< FIFO dataSize. */ + + volatile uint8_t rxWatermark; /*!< Rx watermark. */ + + volatile uint8_t bytesEachWrite; /*!< Bytes for each write TDR. */ + volatile uint8_t bytesEachRead; /*!< Bytes for each read RDR. */ + + const uint8_t *volatile txData; /*!< Send buffer. */ + uint8_t *volatile rxData; /*!< Receive buffer. */ + volatile size_t txRemainingByteCount; /*!< Number of bytes remaining to send.*/ + volatile size_t rxRemainingByteCount; /*!< Number of bytes remaining to receive.*/ + + volatile uint32_t writeRegRemainingTimes; /*!< Write TDR register remaining times. */ + volatile uint32_t readRegRemainingTimes; /*!< Read RDR register remaining times. */ + + uint32_t totalByteCount; /*!< Number of transfer bytes*/ + + uint32_t txBuffIfNull; /*!< Used if the txData is NULL. */ + + volatile uint8_t state; /*!< LPSPI transfer state , _lpspi_transfer_state.*/ + + lpspi_master_transfer_callback_t callback; /*!< Completion callback. */ + void *userData; /*!< Callback user data. */ +}; + +/*! @brief LPSPI slave transfer handle structure used for transactional API. */ +struct _lpspi_slave_handle +{ + volatile bool isByteSwap; /*!< A flag that whether should byte swap. */ + + volatile uint8_t fifoSize; /*!< FIFO dataSize. */ + + volatile uint8_t rxWatermark; /*!< Rx watermark. */ + + volatile uint8_t bytesEachWrite; /*!< Bytes for each write TDR. */ + volatile uint8_t bytesEachRead; /*!< Bytes for each read RDR. */ + + const uint8_t *volatile txData; /*!< Send buffer. */ + uint8_t *volatile rxData; /*!< Receive buffer. */ + + volatile size_t txRemainingByteCount; /*!< Number of bytes remaining to send.*/ + volatile size_t rxRemainingByteCount; /*!< Number of bytes remaining to receive.*/ + + volatile uint32_t writeRegRemainingTimes; /*!< Write TDR register remaining times. */ + volatile uint32_t readRegRemainingTimes; /*!< Read RDR register remaining times. */ + + uint32_t totalByteCount; /*!< Number of transfer bytes*/ + + volatile uint8_t state; /*!< LPSPI transfer state , _lpspi_transfer_state.*/ + + volatile uint32_t errorCount; /*!< Error count for slave transfer.*/ + + lpspi_slave_transfer_callback_t callback; /*!< Completion callback. */ + void *userData; /*!< Callback user data. */ +}; + +/********************************************************************************************************************** + * API + *********************************************************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /*_cplusplus*/ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Initializes the LPSPI master. + * + * @param base LPSPI peripheral address. + * @param masterConfig Pointer to structure lpspi_master_config_t. + * @param srcClock_Hz Module source input clock in Hertz + */ +void LPSPI_MasterInit(LPSPI_Type *base, const lpspi_master_config_t *masterConfig, uint32_t srcClock_Hz); + +/*! + * @brief Sets the lpspi_master_config_t structure to default values. + * + * This API initializes the configuration structure for LPSPI_MasterInit(). + * The initialized structure can remain unchanged in LPSPI_MasterInit(), or can be modified + * before calling the LPSPI_MasterInit(). + * Example: + * @code + * lpspi_master_config_t masterConfig; + * LPSPI_MasterGetDefaultConfig(&masterConfig); + * @endcode + * @param masterConfig pointer to lpspi_master_config_t structure + */ +void LPSPI_MasterGetDefaultConfig(lpspi_master_config_t *masterConfig); + +/*! + * @brief LPSPI slave configuration. + * + * @param base LPSPI peripheral address. + * @param slaveConfig Pointer to a structure lpspi_slave_config_t. + */ +void LPSPI_SlaveInit(LPSPI_Type *base, const lpspi_slave_config_t *slaveConfig); + +/*! + * @brief Sets the lpspi_slave_config_t structure to default values. + * + * This API initializes the configuration structure for LPSPI_SlaveInit(). + * The initialized structure can remain unchanged in LPSPI_SlaveInit() or can be modified + * before calling the LPSPI_SlaveInit(). + * Example: + * @code + * lpspi_slave_config_t slaveConfig; + * LPSPI_SlaveGetDefaultConfig(&slaveConfig); + * @endcode + * @param slaveConfig pointer to lpspi_slave_config_t structure. + */ +void LPSPI_SlaveGetDefaultConfig(lpspi_slave_config_t *slaveConfig); + +/*! + * @brief De-initializes the LPSPI peripheral. Call this API to disable the LPSPI clock. + * @param base LPSPI peripheral address. + */ +void LPSPI_Deinit(LPSPI_Type *base); + +/*! + * @brief Restores the LPSPI peripheral to reset state. Note that this function + * sets all registers to reset state. As a result, the LPSPI module can't work after calling + * this API. + * @param base LPSPI peripheral address. + */ +void LPSPI_Reset(LPSPI_Type *base); + +/*! + * @brief Get the LPSPI instance from peripheral base address. + * + * @param base LPSPI peripheral base address. + * @return LPSPI instance. + */ +uint32_t LPSPI_GetInstance(LPSPI_Type *base); + +/*! + * @brief Enables the LPSPI peripheral and sets the MCR MDIS to 0. + * + * @param base LPSPI peripheral address. + * @param enable Pass true to enable module, false to disable module. + */ +static inline void LPSPI_Enable(LPSPI_Type *base, bool enable) +{ + if (enable) + { + base->CR |= LPSPI_CR_MEN_MASK; + } + else + { + base->CR &= ~LPSPI_CR_MEN_MASK; + } +#if defined(FSL_FEATURE_LPSPI_HAS_ERRATA_051472) && FSL_FEATURE_LPSPI_HAS_ERRATA_051472 + /* ERRATA051472: The SR[REF] would assert if software disables the LPSPI module + after receiving some data and then enabled the LPSPI again without performing a software reset. + Clear SR[REF] flag after LPSPI module enabled*/ + if ((base->SR & (uint32_t)kLPSPI_ReceiveErrorFlag) != 0U) + { + base->SR = (uint32_t)kLPSPI_ReceiveErrorFlag; + } +#endif +} + +/*! + *@} + */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets the LPSPI status flag state. + * @param base LPSPI peripheral address. + * @return The LPSPI status(in SR register). + */ +static inline uint32_t LPSPI_GetStatusFlags(LPSPI_Type *base) +{ + return (base->SR); +} + +/*! + * @brief Gets the LPSPI Tx FIFO size. + * @param base LPSPI peripheral address. + * @return The LPSPI Tx FIFO size. + */ +static inline uint8_t LPSPI_GetTxFifoSize(LPSPI_Type *base) +{ + return (1U << ((base->PARAM & LPSPI_PARAM_TXFIFO_MASK) >> LPSPI_PARAM_TXFIFO_SHIFT)); +} + +/*! + * @brief Gets the LPSPI Rx FIFO size. + * @param base LPSPI peripheral address. + * @return The LPSPI Rx FIFO size. + */ +static inline uint8_t LPSPI_GetRxFifoSize(LPSPI_Type *base) +{ + return (1U << ((base->PARAM & LPSPI_PARAM_RXFIFO_MASK) >> LPSPI_PARAM_RXFIFO_SHIFT)); +} + +/*! + * @brief Gets the LPSPI Tx FIFO count. + * @param base LPSPI peripheral address. + * @return The number of words in the transmit FIFO. + */ +static inline uint32_t LPSPI_GetTxFifoCount(LPSPI_Type *base) +{ + return ((base->FSR & LPSPI_FSR_TXCOUNT_MASK) >> LPSPI_FSR_TXCOUNT_SHIFT); +} + +/*! + * @brief Gets the LPSPI Rx FIFO count. + * @param base LPSPI peripheral address. + * @return The number of words in the receive FIFO. + */ +static inline uint32_t LPSPI_GetRxFifoCount(LPSPI_Type *base) +{ + return ((base->FSR & LPSPI_FSR_RXCOUNT_MASK) >> LPSPI_FSR_RXCOUNT_SHIFT); +} + +/*! + * @brief Clears the LPSPI status flag. + * + * This function clears the desired status bit by using a write-1-to-clear. The user passes in the base and the + * desired status flag bit to clear. The list of status flags is defined in the _lpspi_flags. + * Example usage: + * @code + * LPSPI_ClearStatusFlags(base, kLPSPI_TxDataRequestFlag|kLPSPI_RxDataReadyFlag); + * @endcode + * + * @param base LPSPI peripheral address. + * @param statusFlags The status flag used from type _lpspi_flags. + */ +static inline void LPSPI_ClearStatusFlags(LPSPI_Type *base, uint32_t statusFlags) +{ + base->SR = statusFlags; /*!< The status flags are cleared by writing 1 (w1c).*/ +} + +/*! + *@} + */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables the LPSPI interrupts. + * + * This function configures the various interrupt masks of the LPSPI. The parameters are base and an interrupt mask. + * Note that, for Tx fill and Rx FIFO drain requests, enabling the interrupt request disables the DMA request. + * + * @code + * LPSPI_EnableInterrupts(base, kLPSPI_TxInterruptEnable | kLPSPI_RxInterruptEnable ); + * @endcode + * + * @param base LPSPI peripheral address. + * @param mask The interrupt mask; Use the enum _lpspi_interrupt_enable. + */ +static inline void LPSPI_EnableInterrupts(LPSPI_Type *base, uint32_t mask) +{ + base->IER |= mask; +} + +/*! + * @brief Disables the LPSPI interrupts. + * + * @code + * LPSPI_DisableInterrupts(base, kLPSPI_TxInterruptEnable | kLPSPI_RxInterruptEnable ); + * @endcode + * + * @param base LPSPI peripheral address. + * @param mask The interrupt mask; Use the enum _lpspi_interrupt_enable. + */ +static inline void LPSPI_DisableInterrupts(LPSPI_Type *base, uint32_t mask) +{ + base->IER &= ~mask; +} + +/*! + *@} + */ + +/*! + * @name DMA Control + * @{ + */ + +/*! + * @brief Enables the LPSPI DMA request. + * + * This function configures the Rx and Tx DMA mask of the LPSPI. The parameters are base and a DMA mask. + * @code + * LPSPI_EnableDMA(base, kLPSPI_TxDmaEnable | kLPSPI_RxDmaEnable); + * @endcode + * + * @param base LPSPI peripheral address. + * @param mask The interrupt mask; Use the enum _lpspi_dma_enable. + */ +static inline void LPSPI_EnableDMA(LPSPI_Type *base, uint32_t mask) +{ + base->DER |= mask; +} + +/*! + * @brief Disables the LPSPI DMA request. + * + * This function configures the Rx and Tx DMA mask of the LPSPI. The parameters are base and a DMA mask. + * @code + * SPI_DisableDMA(base, kLPSPI_TxDmaEnable | kLPSPI_RxDmaEnable); + * @endcode + * + * @param base LPSPI peripheral address. + * @param mask The interrupt mask; Use the enum _lpspi_dma_enable. + */ +static inline void LPSPI_DisableDMA(LPSPI_Type *base, uint32_t mask) +{ + base->DER &= ~mask; +} + +/*! + * @brief Gets the LPSPI Transmit Data Register address for a DMA operation. + * + * This function gets the LPSPI Transmit Data Register address because this value is needed + * for the DMA operation. + * This function can be used for either master or slave mode. + * + * @param base LPSPI peripheral address. + * @return The LPSPI Transmit Data Register address. + */ +static inline uint32_t LPSPI_GetTxRegisterAddress(LPSPI_Type *base) +{ + return (uint32_t) & (base->TDR); +} + +/*! + * @brief Gets the LPSPI Receive Data Register address for a DMA operation. + * + * This function gets the LPSPI Receive Data Register address because this value is needed + * for the DMA operation. + * This function can be used for either master or slave mode. + * + * @param base LPSPI peripheral address. + * @return The LPSPI Receive Data Register address. + */ +static inline uint32_t LPSPI_GetRxRegisterAddress(LPSPI_Type *base) +{ + return (uint32_t) & (base->RDR); +} + +/*! + *@} + */ + +/*! + * @name Bus Operations + * @{ + */ + +/*! + * @brief Check the argument for transfer . + * + * @param base LPSPI peripheral address. + * @param transfer the transfer struct to be used. + * @param isEdma True to check for EDMA transfer, false to check interrupt non-blocking transfer + * @return Return true for right and false for wrong. + */ +bool LPSPI_CheckTransferArgument(LPSPI_Type *base, lpspi_transfer_t *transfer, bool isEdma); + +/*! + * @brief Configures the LPSPI for either master or slave. + * + * Note that the CFGR1 should only be written when the LPSPI is disabled (LPSPIx_CR_MEN = 0). + * + * @param base LPSPI peripheral address. + * @param mode Mode setting (master or slave) of type lpspi_master_slave_mode_t. + */ +static inline void LPSPI_SetMasterSlaveMode(LPSPI_Type *base, lpspi_master_slave_mode_t mode) +{ + base->CFGR1 = (base->CFGR1 & (~LPSPI_CFGR1_MASTER_MASK)) | LPSPI_CFGR1_MASTER(mode); +} + +/*! + * @brief Configures the peripheral chip select used for the transfer. + * + * @param base LPSPI peripheral address. + * @param select LPSPI Peripheral Chip Select (PCS) configuration. + */ +static inline void LPSPI_SelectTransferPCS(LPSPI_Type *base, lpspi_which_pcs_t select) +{ + base->TCR = (base->TCR & (~LPSPI_TCR_PCS_MASK)) | LPSPI_TCR_PCS((uint8_t)select); +} + +/*! + * @brief Set the PCS signal to continuous or uncontinuous mode. + * + * @note In master mode, continuous transfer will keep the PCS asserted at the end of the frame size, until a command + * word is received that starts a new frame. So PCS must be set back to uncontinuous when transfer finishes. + * In slave mode, when continuous transfer is enabled, the LPSPI will only transmit the first frame size bits, after + * that the LPSPI will transmit received data back (assuming a 32-bit shift register). + * + * @param base LPSPI peripheral address. + * @param IsContinous True to set the transfer PCS to continuous mode, false to set to uncontinuous mode. + */ +static inline void LPSPI_SetPCSContinous(LPSPI_Type *base, bool IsContinous) +{ + if (IsContinous) + { + base->TCR |= LPSPI_TCR_CONT_MASK; + } + else + { + base->TCR &= ~LPSPI_TCR_CONT_MASK; + } +} + +/*! + * @brief Returns whether the LPSPI module is in master mode. + * + * @param base LPSPI peripheral address. + * @return Returns true if the module is in master mode or false if the module is in slave mode. + */ +static inline bool LPSPI_IsMaster(LPSPI_Type *base) +{ + return (bool)((base->CFGR1) & LPSPI_CFGR1_MASTER_MASK); +} + +/*! + * @brief Flushes the LPSPI FIFOs. + * + * @param base LPSPI peripheral address. + * @param flushTxFifo Flushes (true) the Tx FIFO, else do not flush (false) the Tx FIFO. + * @param flushRxFifo Flushes (true) the Rx FIFO, else do not flush (false) the Rx FIFO. + */ +static inline void LPSPI_FlushFifo(LPSPI_Type *base, bool flushTxFifo, bool flushRxFifo) +{ +#if defined(FSL_FEATURE_LPSPI_HAS_ERRATA_050456) && FSL_FEATURE_LPSPI_HAS_ERRATA_050456 + /* + * Resetting the FIFO using CR[RTF] and CR[RRF] does not clear the FIFO pointers completely. + * Workaround by reseting the entire module using CR[RST] bit. + */ + + (void)flushTxFifo; + (void)flushRxFifo; + + /* Save current state before resetting */ + bool enabled = base->CR & LPSPI_CR_MEN_MASK; + uint32_t cfgr1 = base->CFGR1; + uint32_t ccr = base->CCR; + uint32_t ccr1 = base->CCR1; + + /* To read the current state of the existing command word, LPSPI must be enabled */ + LPSPI_Enable(base, true); + uint32_t tcr = base->TCR; + + /* Reset all internal logic and registers. Bit remains set until cleared by software */ + LPSPI_Enable(base, false); + base->CR |= LPSPI_CR_RST_MASK; + base->CR &= ~LPSPI_CR_RST_MASK; + + /* Restore saved registers */ + base->CFGR1 = cfgr1; + base->CCR = ccr; + base->CCR1 = ccr1; + base->TCR = tcr; + + LPSPI_Enable(base, enabled); +#else + base->CR |= ((uint32_t)flushTxFifo << LPSPI_CR_RTF_SHIFT) | ((uint32_t)flushRxFifo << LPSPI_CR_RRF_SHIFT); +#endif +} + +/*! + * @brief Sets the transmit and receive FIFO watermark values. + * + * This function allows the user to set the receive and transmit FIFO watermarks. The function + * does not compare the watermark settings to the FIFO size. The FIFO watermark should not be + * equal to or greater than the FIFO size. It is up to the higher level driver to make this check. + * + * @param base LPSPI peripheral address. + * @param txWater The TX FIFO watermark value. Writing a value equal or greater than the FIFO size is truncated. + * @param rxWater The RX FIFO watermark value. Writing a value equal or greater than the FIFO size is truncated. + */ +static inline void LPSPI_SetFifoWatermarks(LPSPI_Type *base, uint32_t txWater, uint32_t rxWater) +{ + base->FCR = LPSPI_FCR_TXWATER(txWater) | LPSPI_FCR_RXWATER(rxWater); +} + +/*! + * @brief Configures all LPSPI peripheral chip select polarities simultaneously. + * + * Note that the CFGR1 should only be written when the LPSPI is disabled (LPSPIx_CR_MEN = 0). + * + * This is an example: PCS0 and PCS1 set to active low and other PCSs set to active high. Note that the number of + * PCS is device-specific. + * @code + * LPSPI_SetAllPcsPolarity(base, kLPSPI_Pcs0ActiveLow | kLPSPI_Pcs1ActiveLow); + * @endcode + * + * @param base LPSPI peripheral address. + * @param mask The PCS polarity mask; Use the enum _lpspi_pcs_polarity. + */ +static inline void LPSPI_SetAllPcsPolarity(LPSPI_Type *base, uint32_t mask) +{ + base->CFGR1 = (base->CFGR1 & ~LPSPI_CFGR1_PCSPOL_MASK) | LPSPI_CFGR1_PCSPOL(~mask); +} + +/*! + * @brief Configures the frame size. + * + * The minimum frame size is 8-bits and the maximum frame size is 4096-bits. If the frame size is less than or equal + * to 32-bits, the word size and frame size are identical. If the frame size is greater than 32-bits, the word + * size is 32-bits for each word except the last (the last word contains the remainder bits if the frame size is not + * divisible by 32). The minimum word size is 2-bits. A frame size of 33-bits (or similar) is not supported. + * + * Note 1: The transmit command register should be initialized before enabling the LPSPI in slave mode, although + * the command register does not update until after the LPSPI is enabled. After it is enabled, the transmit command + * register + * should only be changed if the LPSPI is idle. + * + * Note 2: The transmit and command FIFO is a combined FIFO that includes both transmit data and command words. That + * means the TCR register should be written to when the Tx FIFO is not full. + * + * @param base LPSPI peripheral address. + * @param frameSize The frame size in number of bits. + */ +static inline void LPSPI_SetFrameSize(LPSPI_Type *base, uint32_t frameSize) +{ + base->TCR = (base->TCR & ~LPSPI_TCR_FRAMESZ_MASK) | LPSPI_TCR_FRAMESZ(frameSize - 1U); +} + +/*! + * @brief Sets the LPSPI baud rate in bits per second. + * + * This function takes in the desired bitsPerSec (baud rate) and calculates the nearest + * possible baud rate without exceeding the desired baud rate and returns the + * calculated baud rate in bits-per-second. It requires the caller to provide + * the frequency of the module source clock (in Hertz). Note that the baud rate + * does not go into effect until the Transmit Control Register (TCR) is programmed + * with the prescale value. Hence, this function returns the prescale tcrPrescaleValue + * parameter for later programming in the TCR. The higher level + * peripheral driver should alert the user of an out of range baud rate input. + * + * Note that the LPSPI module must first be disabled before configuring this. + * Note that the LPSPI module must be configured for master mode before configuring this. + * + * @param base LPSPI peripheral address. + * @param baudRate_Bps The desired baud rate in bits per second. + * @param srcClock_Hz Module source input clock in Hertz. + * @param tcrPrescaleValue The TCR prescale value needed to program the TCR. + * @return The actual calculated baud rate. This function may also return a "0" if the + * LPSPI is not configured for master mode or if the LPSPI module is not disabled. + */ + +uint32_t LPSPI_MasterSetBaudRate(LPSPI_Type *base, + uint32_t baudRate_Bps, + uint32_t srcClock_Hz, + uint32_t *tcrPrescaleValue); + +/*! + * @brief Manually configures a specific LPSPI delay parameter (module must be disabled to + * change the delay values). + * + * This function configures the following: + * SCK to PCS delay, or + * PCS to SCK delay, or + * The configurations must occur between the transfer delay. + * + * The delay names are available in type lpspi_delay_type_t. + * + * The user passes the desired delay along with the delay value. + * This allows the user to directly set the delay values if they have + * pre-calculated them or if they simply wish to manually increment the value. + * + * Note that the LPSPI module must first be disabled before configuring this. + * Note that the LPSPI module must be configured for master mode before configuring this. + * + * @param base LPSPI peripheral address. + * @param scaler The 8-bit delay value 0x00 to 0xFF (255). + * @param whichDelay The desired delay to configure, must be of type lpspi_delay_type_t. + */ +void LPSPI_MasterSetDelayScaler(LPSPI_Type *base, uint32_t scaler, lpspi_delay_type_t whichDelay); + +/*! + * @brief Calculates the delay based on the desired delay input in nanoseconds (module must be + * disabled to change the delay values). + * + * This function calculates the values for the following: + * SCK to PCS delay, or + * PCS to SCK delay, or + * The configurations must occur between the transfer delay. + * + * The delay names are available in type lpspi_delay_type_t. + * + * The user passes the desired delay and the desired delay value in + * nano-seconds. The function calculates the value needed for the desired delay parameter + * and returns the actual calculated delay because an exact delay match may not be possible. In this + * case, the closest match is calculated without going below the desired delay value input. + * It is possible to input a very large delay value that exceeds the capability of the part, in + * which case the maximum supported delay is returned. It is up to the higher level + * peripheral driver to alert the user of an out of range delay input. + * + * Note that the LPSPI module must be configured for master mode before configuring this. And note that + * the delayTime = LPSPI_clockSource / (PRESCALE * Delay_scaler). + * + * @param base LPSPI peripheral address. + * @param delayTimeInNanoSec The desired delay value in nano-seconds. + * @param whichDelay The desired delay to configuration, which must be of type lpspi_delay_type_t. + * @param srcClock_Hz Module source input clock in Hertz. + * @return actual Calculated delay value in nano-seconds. + */ +uint32_t LPSPI_MasterSetDelayTimes(LPSPI_Type *base, + uint32_t delayTimeInNanoSec, + lpspi_delay_type_t whichDelay, + uint32_t srcClock_Hz); + +/*! + * @brief Writes data into the transmit data buffer. + * + * This function writes data passed in by the user to the Transmit Data Register (TDR). + * The user can pass up to 32-bits of data to load into the TDR. If the frame size exceeds 32-bits, + * the user has to manage sending the data one 32-bit word at a time. + * Any writes to the TDR result in an immediate push to the transmit FIFO. + * This function can be used for either master or slave modes. + * + * @param base LPSPI peripheral address. + * @param data The data word to be sent. + */ +static inline void LPSPI_WriteData(LPSPI_Type *base, uint32_t data) +{ + base->TDR = data; +} + +/*! + * @brief Reads data from the data buffer. + * + * This function reads the data from the Receive Data Register (RDR). + * This function can be used for either master or slave mode. + * + * @param base LPSPI peripheral address. + * @return The data read from the data buffer. + */ +static inline uint32_t LPSPI_ReadData(LPSPI_Type *base) +{ + return (base->RDR); +} + +/*! + * @brief Set up the dummy data. + * + * @param base LPSPI peripheral address. + * @param dummyData Data to be transferred when tx buffer is NULL. + * Note: + * This API has no effect when LPSPI in slave interrupt mode, because driver + * will set the TXMSK bit to 1 if txData is NULL, no data is loaded from transmit + * FIFO and output pin is tristated. + */ +void LPSPI_SetDummyData(LPSPI_Type *base, uint8_t dummyData); + +/*! + *@} + */ + +/*! + * @name Transactional + * @{ + */ +/*Transactional APIs*/ + +/*! + * @brief Initializes the LPSPI master handle. + * + * This function initializes the LPSPI handle, which can be used for other LPSPI transactional APIs. Usually, for a + * specified LPSPI instance, call this API once to get the initialized handle. + + * @param base LPSPI peripheral address. + * @param handle LPSPI handle pointer to lpspi_master_handle_t. + * @param callback DSPI callback. + * @param userData callback function parameter. + */ +void LPSPI_MasterTransferCreateHandle(LPSPI_Type *base, + lpspi_master_handle_t *handle, + lpspi_master_transfer_callback_t callback, + void *userData); + +/*! + * @brief LPSPI master transfer data using a polling method. + * + * This function transfers data using a polling method. This is a blocking function, which does not return until all + * transfers have been + * completed. + * + * Note: + * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * @param base LPSPI peripheral address. + * @param transfer pointer to lpspi_transfer_t structure. + * @return status of status_t. + */ +status_t LPSPI_MasterTransferBlocking(LPSPI_Type *base, lpspi_transfer_t *transfer); + +/*! + * @brief LPSPI master transfer data using an interrupt method. + * + * This function transfers data using an interrupt method. This is a non-blocking function, which returns right away. + * When all data is transferred, the callback function is called. + * + * Note: + * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not integer multiples of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * @param base LPSPI peripheral address. + * @param handle pointer to lpspi_master_handle_t structure which stores the transfer state. + * @param transfer pointer to lpspi_transfer_t structure. + * @return status of status_t. + */ +status_t LPSPI_MasterTransferNonBlocking(LPSPI_Type *base, lpspi_master_handle_t *handle, lpspi_transfer_t *transfer); + +/*! + * @brief Gets the master transfer remaining bytes. + * + * This function gets the master transfer remaining bytes. + * + * @param base LPSPI peripheral address. + * @param handle pointer to lpspi_master_handle_t structure which stores the transfer state. + * @param count Number of bytes transferred so far by the non-blocking transaction. + * @return status of status_t. + */ +status_t LPSPI_MasterTransferGetCount(LPSPI_Type *base, lpspi_master_handle_t *handle, size_t *count); + +/*! + * @brief LPSPI master abort transfer which uses an interrupt method. + * + * This function aborts a transfer which uses an interrupt method. + * + * @param base LPSPI peripheral address. + * @param handle pointer to lpspi_master_handle_t structure which stores the transfer state. + */ +void LPSPI_MasterTransferAbort(LPSPI_Type *base, lpspi_master_handle_t *handle); + +/*! + * @brief LPSPI Master IRQ handler function. + * + * This function processes the LPSPI transmit and receive IRQ. + * + * @param base LPSPI peripheral address. + * @param handle pointer to lpspi_master_handle_t structure which stores the transfer state. + */ +void LPSPI_MasterTransferHandleIRQ(LPSPI_Type *base, lpspi_master_handle_t *handle); + +/*! + * @brief Initializes the LPSPI slave handle. + * + * This function initializes the LPSPI handle, which can be used for other LPSPI transactional APIs. Usually, for a + * specified LPSPI instance, call this API once to get the initialized handle. + * + * @param base LPSPI peripheral address. + * @param handle LPSPI handle pointer to lpspi_slave_handle_t. + * @param callback DSPI callback. + * @param userData callback function parameter. + */ +void LPSPI_SlaveTransferCreateHandle(LPSPI_Type *base, + lpspi_slave_handle_t *handle, + lpspi_slave_transfer_callback_t callback, + void *userData); + +/*! + * @brief LPSPI slave transfer data using an interrupt method. + * + * This function transfer data using an interrupt method. This is a non-blocking function, which returns right away. + * When all data is transferred, the callback function is called. + * + * Note: + * The transfer data size should be integer multiples of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * @param base LPSPI peripheral address. + * @param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. + * @param transfer pointer to lpspi_transfer_t structure. + * @return status of status_t. + */ +status_t LPSPI_SlaveTransferNonBlocking(LPSPI_Type *base, lpspi_slave_handle_t *handle, lpspi_transfer_t *transfer); + +/*! + * @brief Gets the slave transfer remaining bytes. + * + * This function gets the slave transfer remaining bytes. + * + * @param base LPSPI peripheral address. + * @param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. + * @param count Number of bytes transferred so far by the non-blocking transaction. + * @return status of status_t. + */ +status_t LPSPI_SlaveTransferGetCount(LPSPI_Type *base, lpspi_slave_handle_t *handle, size_t *count); + +/*! + * @brief LPSPI slave aborts a transfer which uses an interrupt method. + * + * This function aborts a transfer which uses an interrupt method. + * + * @param base LPSPI peripheral address. + * @param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. + */ +void LPSPI_SlaveTransferAbort(LPSPI_Type *base, lpspi_slave_handle_t *handle); + +/*! + * @brief LPSPI Slave IRQ handler function. + * + * This function processes the LPSPI transmit and receives an IRQ. + * + * @param base LPSPI peripheral address. + * @param handle pointer to lpspi_slave_handle_t structure which stores the transfer state. + */ +void LPSPI_SlaveTransferHandleIRQ(LPSPI_Type *base, lpspi_slave_handle_t *handle); + +/*! + * @brief Wait for tx FIFO to be empty. + * + * This function wait the tx fifo empty + * + * @param base LPSPI peripheral address. + * @return true for the tx FIFO is ready, false is not. + */ +bool LPSPI_WaitTxFifoEmpty(LPSPI_Type *base); + +/*! + *@} + */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /*FSL_LPSPI_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi_edma.c new file mode 100644 index 00000000000..1b2af7d90f8 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi_edma.c @@ -0,0 +1,1324 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_lpspi_edma.h" + +/* + * $Coverage Justification Reference$ + * + * $Justification fsl_lpspi_edma_c_ref_1$ + * The default branch cannot be executed in any circumstances, it is only added to avoid MISRA violation. + * + */ +/*********************************************************************************************************************** + * Definitions + ***********************************************************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpspi_edma" +#endif + +/*! + * @brief Structure definition for dspi_master_edma_private_handle_t. The structure is private. + */ +typedef struct _lpspi_master_edma_private_handle +{ + LPSPI_Type *base; /*!< LPSPI peripheral base address. */ + lpspi_master_edma_handle_t *handle; /*!< lpspi_master_edma_handle_t handle */ +} lpspi_master_edma_private_handle_t; + +/*! + * @brief Structure definition for dspi_slave_edma_private_handle_t. The structure is private. + */ +typedef struct _lpspi_slave_edma_private_handle +{ + LPSPI_Type *base; /*!< LPSPI peripheral base address. */ + lpspi_slave_edma_handle_t *handle; /*!< lpspi_slave_edma_handle_t handle */ +} lpspi_slave_edma_private_handle_t; + +/*********************************************************************************************************************** + * Prototypes + ***********************************************************************************************************************/ + +/*! + * @brief EDMA_LpspiMasterCallback after the LPSPI master transfer completed by using EDMA. + * This is not a public API. + */ +static void EDMA_LpspiMasterCallback(edma_handle_t *edmaHandle, + void *g_lpspiEdmaPrivateHandle, + bool transferDone, + uint32_t tcds); + +/*! + * @brief EDMA_LpspiSlaveCallback after the LPSPI slave transfer completed by using EDMA. + * This is not a public API. + */ +static void EDMA_LpspiSlaveCallback(edma_handle_t *edmaHandle, + void *g_lpspiEdmaPrivateHandle, + bool transferDone, + uint32_t tcds); + +static void LPSPI_SeparateEdmaReadData(uint8_t *rxData, uint32_t readData, uint32_t bytesEachRead, bool isByteSwap); + +/*********************************************************************************************************************** + * Variables + ***********************************************************************************************************************/ +/*! @brief Pointers to lpspi bases for each instance. */ +static LPSPI_Type *const s_lpspiBases[] = LPSPI_BASE_PTRS; + +/*! @brief Pointers to lpspi edma handles for each instance. */ +static lpspi_master_edma_private_handle_t s_lpspiMasterEdmaPrivateHandle[ARRAY_SIZE(s_lpspiBases)]; +static lpspi_slave_edma_private_handle_t s_lpspiSlaveEdmaPrivateHandle[ARRAY_SIZE(s_lpspiBases)]; + +/*********************************************************************************************************************** + * Code + ***********************************************************************************************************************/ +static void LPSPI_SeparateEdmaReadData(uint8_t *rxData, uint32_t readData, uint32_t bytesEachRead, bool isByteSwap) +{ + assert(rxData != NULL); + + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_edma_c_ref_1$ + */ + switch (bytesEachRead) + { + case 1: + if (!isByteSwap) + { + *rxData = (uint8_t)readData; + ++rxData; + } + else + { + *rxData = (uint8_t)(readData >> 24); + ++rxData; + } + break; + + case 2: + if (!isByteSwap) + { + *rxData = (uint8_t)readData; + ++rxData; + *rxData = (uint8_t)(readData >> 8); + ++rxData; + } + else + { + *rxData = (uint8_t)(readData >> 16); + ++rxData; + *rxData = (uint8_t)(readData >> 24); + ++rxData; + } + break; + + case 4: + + *rxData = (uint8_t)readData; + ++rxData; + *rxData = (uint8_t)(readData >> 8); + ++rxData; + *rxData = (uint8_t)(readData >> 16); + ++rxData; + *rxData = (uint8_t)(readData >> 24); + ++rxData; + + break; + + default: + assert(false); + break; + } +} + +/*! + * brief Initializes the LPSPI master eDMA handle. + * + * This function initializes the LPSPI eDMA handle which can be used for other LPSPI transactional APIs. Usually, for a + * specified LPSPI instance, call this API once to get the initialized handle. + * + * Note that the LPSPI eDMA has a separated (Rx and Rx as two sources) or shared (Rx and Tx are the same source) DMA + * request source. + * (1) For a separated DMA request source, enable and set the Rx DMAMUX source for edmaRxRegToRxDataHandle and + * Tx DMAMUX source for edmaIntermediaryToTxRegHandle. + * (2) For a shared DMA request source, enable and set the Rx/Rx DMAMUX source for edmaRxRegToRxDataHandle. + * + * param base LPSPI peripheral base address. + * param handle LPSPI handle pointer to lpspi_master_edma_handle_t. + * param callback LPSPI callback. + * param userData callback function parameter. + * param edmaRxRegToRxDataHandle edmaRxRegToRxDataHandle pointer to edma_handle_t. + * param edmaTxDataToTxRegHandle edmaTxDataToTxRegHandle pointer to edma_handle_t. + */ +void LPSPI_MasterTransferCreateHandleEDMA(LPSPI_Type *base, + lpspi_master_edma_handle_t *handle, + lpspi_master_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *edmaRxRegToRxDataHandle, + edma_handle_t *edmaTxDataToTxRegHandle) +{ + assert(handle != NULL); + assert(edmaRxRegToRxDataHandle != NULL); + assert(edmaTxDataToTxRegHandle != NULL); + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + uint32_t instance = LPSPI_GetInstance(base); + + s_lpspiMasterEdmaPrivateHandle[instance].base = base; + s_lpspiMasterEdmaPrivateHandle[instance].handle = handle; + + handle->callback = callback; + handle->userData = userData; + handle->dataBytesEveryTime = DMA_MAX_TRANSFER_COUNT; + + handle->edmaRxRegToRxDataHandle = edmaRxRegToRxDataHandle; + handle->edmaTxDataToTxRegHandle = edmaTxDataToTxRegHandle; +} + +static void LPSPI_PrepareTransferEDMA(LPSPI_Type *base) +{ + /* Flush FIFO, clear status, disable all the inerrupts and DMA requests. */ + LPSPI_FlushFifo(base, true, true); + LPSPI_ClearStatusFlags(base, (uint32_t)kLPSPI_AllStatusFlag); + LPSPI_DisableInterrupts(base, (uint32_t)kLPSPI_AllInterruptEnable); + LPSPI_DisableDMA(base, (uint32_t)kLPSPI_RxDmaEnable | (uint32_t)kLPSPI_TxDmaEnable); +} + +/*! + * brief LPSPI master config transfer parameter using eDMA. + * + * This function is preparing to transfer data using eDMA. + * + * param base LPSPI peripheral base address. + * param handle pointer to lpspi_master_edma_handle_t structure which stores the transfer state. + * param configFlags transfer configuration flags. ref _lpspi_transfer_config_flag_for_master. + * return Indicates whether LPSPI master transfer was successful or not. + * retval kStatus_Success Execution successfully. + * retval kStatus_LPSPI_Busy The LPSPI device is busy. + */ +status_t LPSPI_MasterTransferPrepareEDMALite(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, uint32_t configFlags) +{ + assert(handle != NULL); + + /* Check that we're not busy.*/ + if (handle->state == (uint8_t)kLPSPI_Busy) + { + return kStatus_LPSPI_Busy; + } + + /* Disable module before configuration */ + LPSPI_Enable(base, false); + + LPSPI_PrepareTransferEDMA(base); + + bool isByteSwap = ((configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); + bool isPcsContinuous = ((configFlags & (uint32_t)kLPSPI_MasterPcsContinuous) != 0U); + uint32_t instance = LPSPI_GetInstance(base); + uint8_t dummyData = g_lpspiDummyData[instance]; + /*Used for byte swap*/ + uint32_t whichPcs = (configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT; + uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; + + handle->txBuffIfNull = + ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24); + /*The TX and RX FIFO sizes are always the same*/ + handle->fifoSize = LPSPI_GetRxFifoSize(base); + handle->isPcsContinuous = isPcsContinuous; + handle->isByteSwap = isByteSwap; + handle->isThereExtraRxBytes = false; + + /*Because DMA is fast enough , so set the RX and TX watermarks to 0 .*/ + LPSPI_SetFifoWatermarks(base, 0U, 0U); + + /* Transfers will stall when transmit FIFO is empty or receive FIFO is full. */ + base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); + + /* Enable module for following configuration of TCR to take effect. */ + LPSPI_Enable(base, true); + + /* For DMA transfer , we'd better not masked the transmit data and receive data in TCR since the transfer flow is + * hard to controlled by software. */ + base->TCR = (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_BYSW_MASK | LPSPI_TCR_PCS_MASK)) | + LPSPI_TCR_CONT(isPcsContinuous) | LPSPI_TCR_BYSW(isByteSwap) | LPSPI_TCR_PCS(whichPcs); + /*Calculate the bytes for write/read the TX/RX register each time*/ + if (bytesPerFrame <= 4U) + { + handle->bytesEachWrite = (uint8_t)bytesPerFrame; + handle->bytesEachRead = (uint8_t)bytesPerFrame; + handle->bytesLastRead = (uint8_t)bytesPerFrame; + } + else + { + handle->bytesEachWrite = 4U; + handle->bytesEachRead = 4U; + + handle->bytesLastRead = 4U; + } + return kStatus_Success; +} + +/*! + * brief LPSPI master transfer data using eDMA without configs. + * + * This function transfers data using eDMA. This is a non-blocking function, which returns right away. When all data + * is transferred, the callback function is called. + * + * Note: + * This API is only for transfer through DMA without configuration. + * Before calling this API, you must call LPSPI_MasterTransferPrepareEDMALite to configure it once. + * The transfer data size should be an integer multiple of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * param base LPSPI peripheral base address. + * param handle pointer to lpspi_master_edma_handle_t structure which stores the transfer state. + * param transfer pointer to lpspi_transfer_t structure, config field is not working. + * return Indicates whether LPSPI master transfer was successful or not. + * retval kStatus_Success Execution successfully. + * retval kStatus_LPSPI_Busy The LPSPI device is busy. + * retval kStatus_InvalidArgument The transfer structure is invalid. + */ +status_t LPSPI_MasterTransferEDMALite(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, lpspi_transfer_t *transfer) +{ + assert(handle != NULL); + assert(transfer != NULL); + + /* Check that we're not busy.*/ + if (handle->state == (uint8_t)kLPSPI_Busy) + { + return kStatus_LPSPI_Busy; + } + + /* Check arguements */ + if (!LPSPI_CheckTransferArgument(base, transfer, true)) + { + return kStatus_InvalidArgument; + } + + /* Variables */ + uint32_t firstTimeDataSize = 0; + bool isThereExtraTxBytes = false; + uint8_t bytesLastWrite = 0; + uint32_t instance = LPSPI_GetInstance(base); + /*Used for byte swap*/ + uint32_t addrOffset = 0; + uint32_t rxAddr = LPSPI_GetRxRegisterAddress(base); + uint32_t txAddr = LPSPI_GetTxRegisterAddress(base); + uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; + edma_transfer_config_t transferConfigRx = {0}; + edma_transfer_config_t transferConfigTx = {0}; + edma_tcd_t *softwareTCD_pcsContinuous = (edma_tcd_t *)((uint32_t)(&handle->lpspiSoftwareTCD[2]) & (~0x1FU)); + edma_tcd_t *softwareTCD_extraBytes = (edma_tcd_t *)((uint32_t)(&handle->lpspiSoftwareTCD[1]) & (~0x1FU)); + + if (transfer->dataSize <= bytesPerFrame) + { + /* Once dma transfer*/ + firstTimeDataSize = transfer->dataSize; + handle->isMultiDMATransmit = false; + } + else if (transfer->dataSize > handle->dataBytesEveryTime) + { + /* More dma transfer*/ + firstTimeDataSize = handle->dataBytesEveryTime; + handle->isMultiDMATransmit = true; + if (transfer->dataSize % handle->dataBytesEveryTime != 0U) + { + handle->lastTimeDataBytes = transfer->dataSize % handle->dataBytesEveryTime; + } + else + { + handle->lastTimeDataBytes = handle->dataBytesEveryTime; + } + + handle->dmaTransmitTime = + (uint8_t)((transfer->dataSize + handle->dataBytesEveryTime - 1U) / handle->dataBytesEveryTime); + } + else + { + /* Once dma transfer*/ + firstTimeDataSize = transfer->dataSize; + handle->isMultiDMATransmit = false; + } + handle->state = (uint8_t)kLPSPI_Busy; + handle->txData = transfer->txData; + handle->rxData = transfer->rxData; + handle->txRemainingByteCount = firstTimeDataSize; + handle->rxRemainingByteCount = firstTimeDataSize; + handle->totalByteCount = firstTimeDataSize; + handle->writeRegRemainingTimes = (firstTimeDataSize / bytesPerFrame) * ((bytesPerFrame + 3U) / 4U); + handle->readRegRemainingTimes = handle->writeRegRemainingTimes; + + handle->isThereExtraRxBytes = false; + + /*Calculate the bytes for write/read the TX/RX register each time*/ + if (bytesPerFrame > 4U) + { + if ((transfer->dataSize % 4U) != 0U) + { + bytesLastWrite = (uint8_t)(transfer->dataSize % 4U); + handle->bytesLastRead = bytesLastWrite; + + isThereExtraTxBytes = true; + + --handle->writeRegRemainingTimes; + + --handle->readRegRemainingTimes; + handle->isThereExtraRxBytes = true; + } + } + + EDMA_SetCallback(handle->edmaRxRegToRxDataHandle, EDMA_LpspiMasterCallback, + &s_lpspiMasterEdmaPrivateHandle[instance]); + + /* Configure rx EDMA transfer */ + EDMA_ResetChannel(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel); + + if (handle->rxData != NULL) + { + transferConfigRx.destAddr = (uint32_t) & (handle->rxData[0]); + transferConfigRx.destOffset = 1; + } + else + { + transferConfigRx.destAddr = (uint32_t) & (handle->rxBuffIfNull); + transferConfigRx.destOffset = 0; + } + transferConfigRx.destTransferSize = kEDMA_TransferSize1Bytes; + + addrOffset = 0; + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_edma_c_ref_1$ + */ + switch (handle->bytesEachRead) + { + case (1U): + transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes; + transferConfigRx.minorLoopBytes = 1; + if (handle->isByteSwap) + { + addrOffset = 3; + } + break; + + case (2U): + transferConfigRx.srcTransferSize = kEDMA_TransferSize2Bytes; + transferConfigRx.minorLoopBytes = 2; + if (handle->isByteSwap) + { + addrOffset = 2; + } + break; + + case (4U): + transferConfigRx.srcTransferSize = kEDMA_TransferSize4Bytes; + transferConfigRx.minorLoopBytes = 4; + break; + + default: + transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes; + transferConfigRx.minorLoopBytes = 1; + assert(false); + break; + } + + transferConfigRx.srcAddr = (uint32_t)rxAddr + addrOffset; + transferConfigRx.srcOffset = 0; + + transferConfigRx.majorLoopCounts = handle->readRegRemainingTimes; + + /* Store the initially configured eDMA minor byte transfer count into the LPSPI handle */ + handle->nbytes = (uint8_t)transferConfigRx.minorLoopBytes; + + EDMA_SetTransferConfig(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel, + &transferConfigRx, NULL); + EDMA_EnableChannelInterrupts(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel, + (uint32_t)kEDMA_MajorInterruptEnable); + + /* Configure tx EDMA transfer */ + EDMA_ResetChannel(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel); + + if (isThereExtraTxBytes) + { + if (handle->txData != NULL) + { + transferConfigTx.srcAddr = (uint32_t) & (transfer->txData[transfer->dataSize - bytesLastWrite]); + transferConfigTx.srcOffset = 1; + } + else + { + transferConfigTx.srcAddr = (uint32_t)(&handle->txBuffIfNull); + transferConfigTx.srcOffset = 0; + } + + transferConfigTx.destOffset = 0; + + transferConfigTx.srcTransferSize = kEDMA_TransferSize1Bytes; + + addrOffset = 0; + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_edma_c_ref_1$ + */ + switch (bytesLastWrite) + { + case (1U): + transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfigTx.minorLoopBytes = 1; + if (handle->isByteSwap) + { + addrOffset = 3; + } + break; + + case (2U): + transferConfigTx.destTransferSize = kEDMA_TransferSize2Bytes; + transferConfigTx.minorLoopBytes = 2; + if (handle->isByteSwap) + { + addrOffset = 2; + } + break; + + default: + transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfigTx.minorLoopBytes = 1; + assert(false); + break; + } + + transferConfigTx.destAddr = (uint32_t)txAddr + addrOffset; + transferConfigTx.majorLoopCounts = 1; + +#if defined FSL_EDMA_DRIVER_EDMA4 && FSL_EDMA_DRIVER_EDMA4 + EDMA_TcdResetExt(handle->edmaRxRegToRxDataHandle->base, softwareTCD_extraBytes); + if (handle->isPcsContinuous) + { + EDMA_TcdSetTransferConfigExt(handle->edmaRxRegToRxDataHandle->base, softwareTCD_extraBytes, + &transferConfigTx, softwareTCD_pcsContinuous); + } + else + { + EDMA_TcdSetTransferConfigExt(handle->edmaRxRegToRxDataHandle->base, softwareTCD_extraBytes, + &transferConfigTx, NULL); + } +#else + EDMA_TcdReset(softwareTCD_extraBytes); + if (handle->isPcsContinuous) + { + EDMA_TcdSetTransferConfig(softwareTCD_extraBytes, &transferConfigTx, softwareTCD_pcsContinuous); + } + else + { + EDMA_TcdSetTransferConfig(softwareTCD_extraBytes, &transferConfigTx, NULL); + } +#endif + } + + if (handle->isPcsContinuous) + { + /* Set continue incase of twice call transfer. */ + LPSPI_SetPCSContinous(base, true); + handle->transmitCommand = base->TCR & ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK); + transferConfigTx.srcAddr = (uint32_t) & (handle->transmitCommand); + transferConfigTx.srcOffset = 0; + + transferConfigTx.destAddr = (uint32_t) & (base->TCR); + transferConfigTx.destOffset = 0; + + transferConfigTx.srcTransferSize = kEDMA_TransferSize4Bytes; + transferConfigTx.destTransferSize = kEDMA_TransferSize4Bytes; + transferConfigTx.minorLoopBytes = 4; + transferConfigTx.majorLoopCounts = 1; + +#if defined FSL_EDMA_DRIVER_EDMA4 && FSL_EDMA_DRIVER_EDMA4 + EDMA_TcdResetExt(handle->edmaRxRegToRxDataHandle->base, softwareTCD_pcsContinuous); + EDMA_TcdSetTransferConfigExt(handle->edmaRxRegToRxDataHandle->base, softwareTCD_pcsContinuous, + &transferConfigTx, NULL); +#else + EDMA_TcdReset(softwareTCD_pcsContinuous); + EDMA_TcdSetTransferConfig(softwareTCD_pcsContinuous, &transferConfigTx, NULL); +#endif + } + + if (handle->txData != NULL) + { + transferConfigTx.srcAddr = (uint32_t)(handle->txData); + transferConfigTx.srcOffset = 1; + } + else + { + transferConfigTx.srcAddr = (uint32_t)(&handle->txBuffIfNull); + transferConfigTx.srcOffset = 0; + } + + transferConfigTx.destOffset = 0; + + transferConfigTx.srcTransferSize = kEDMA_TransferSize1Bytes; + + addrOffset = 0U; + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_edma_c_ref_1$ + */ + switch (handle->bytesEachRead) + { + case (1U): + transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfigTx.minorLoopBytes = 1; + if (handle->isByteSwap) + { + addrOffset = 3; + } + break; + + case (2U): + transferConfigTx.destTransferSize = kEDMA_TransferSize2Bytes; + transferConfigTx.minorLoopBytes = 2; + + if (handle->isByteSwap) + { + addrOffset = 2; + } + break; + + case (4U): + transferConfigTx.destTransferSize = kEDMA_TransferSize4Bytes; + transferConfigTx.minorLoopBytes = 4; + break; + + default: + transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfigTx.minorLoopBytes = 1; + assert(false); + break; + } + + transferConfigTx.destAddr = (uint32_t)txAddr + addrOffset; + + transferConfigTx.majorLoopCounts = handle->writeRegRemainingTimes; + + if (isThereExtraTxBytes) + { + handle->lastTimeTCD = softwareTCD_extraBytes; + } + else if (handle->isPcsContinuous) + { + handle->lastTimeTCD = softwareTCD_pcsContinuous; + } + else + { + handle->lastTimeTCD = NULL; + } + + if (handle->isMultiDMATransmit) + { + transferConfigTx.majorLoopCounts = handle->dataBytesEveryTime; + if (handle->isPcsContinuous) + { + /* Pcs-continue mode is not supported in Multi DMA. + Please use no-continue mode and use GPIO control CS pin*/ + LPSPI_SetPCSContinous(base, false); + assert(false); + } + + EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, + &transferConfigTx, NULL); + (void)memcpy(&handle->transferConfigTx, &transferConfigTx, sizeof(edma_transfer_config_t)); + (void)memcpy(&handle->transferConfigRx, &transferConfigRx, sizeof(edma_transfer_config_t)); + } + else + { + transferConfigTx.majorLoopCounts = handle->writeRegRemainingTimes; + EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, + &transferConfigTx, handle->lastTimeTCD); + } + EDMA_StartTransfer(handle->edmaTxDataToTxRegHandle); + EDMA_StartTransfer(handle->edmaRxRegToRxDataHandle); + LPSPI_EnableDMA(base, (uint32_t)kLPSPI_RxDmaEnable | (uint32_t)kLPSPI_TxDmaEnable); + + return kStatus_Success; +} + +/*! + * brief LPSPI master transfer data using eDMA. + * + * This function transfers data using eDMA. This is a non-blocking function, which returns right away. When all data + * is transferred, the callback function is called. + * + * Note: + * The transfer data size should be an integer multiple of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * param base LPSPI peripheral base address. + * param handle pointer to lpspi_master_edma_handle_t structure which stores the transfer state. + * param transfer pointer to lpspi_transfer_t structure. + * return status of status_t. + */ +status_t LPSPI_MasterTransferEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, lpspi_transfer_t *transfer) +{ + status_t status = kStatus_Fail; + status = LPSPI_MasterTransferPrepareEDMALite(base, handle, transfer->configFlags); + if (kStatus_Success != status) + { + return status; + } + return LPSPI_MasterTransferEDMALite(base, handle, transfer); +} + +static void EDMA_LpspiMasterCallback(edma_handle_t *edmaHandle, + void *g_lpspiEdmaPrivateHandle, + bool transferDone, + uint32_t tcds) +{ + assert(edmaHandle != NULL); + assert(g_lpspiEdmaPrivateHandle != NULL); + + uint32_t readData; + status_t callbackStatus = kStatus_Success; + lpspi_master_edma_private_handle_t *lpspiEdmaPrivateHandle; + lpspi_master_edma_handle_t *lpspiEdmaHandle; + lpspiEdmaPrivateHandle = (lpspi_master_edma_private_handle_t *)g_lpspiEdmaPrivateHandle; + + lpspiEdmaHandle = lpspiEdmaPrivateHandle->handle; + size_t rxRemainingByteCount = lpspiEdmaHandle->rxRemainingByteCount; + uint8_t bytesLastRead = lpspiEdmaHandle->bytesLastRead; + bool isByteSwap = lpspiEdmaHandle->isByteSwap; + + bool lpspitxDmaUpdate = false; + bool lpspirxDmaUpdate = false; + + LPSPI_DisableDMA(lpspiEdmaPrivateHandle->base, (uint32_t)kLPSPI_TxDmaEnable | (uint32_t)kLPSPI_RxDmaEnable); + + if (!transferDone) + { + callbackStatus = kStatus_LPSPI_Error; + } + else + { + if (lpspiEdmaHandle->isMultiDMATransmit) + { + /* multi DMA transmit */ + lpspiEdmaHandle->dmaTransmitTime--; + if (lpspiEdmaHandle->dmaTransmitTime >= 1U) + { + if (lpspiEdmaHandle->txData != NULL) + { + lpspitxDmaUpdate = true; + lpspiEdmaHandle->transferConfigTx.srcAddr += lpspiEdmaHandle->dataBytesEveryTime; + } + if (lpspiEdmaHandle->rxData != NULL) + { + lpspirxDmaUpdate = true; + lpspiEdmaHandle->transferConfigRx.destAddr += lpspiEdmaHandle->dataBytesEveryTime; + } + /* The last time - 1 time, need check the lastTime data bytes */ + if (lpspiEdmaHandle->dmaTransmitTime == 1U) + { + if (lpspiEdmaHandle->lastTimeDataBytes != lpspiEdmaHandle->dataBytesEveryTime) + { + /* Need update count if last time count is not dataBytesEveryTime*/ + lpspiEdmaHandle->transferConfigTx.majorLoopCounts = lpspiEdmaHandle->lastTimeDataBytes; + lpspiEdmaHandle->transferConfigRx.majorLoopCounts = lpspiEdmaHandle->lastTimeDataBytes; + lpspitxDmaUpdate = true; + lpspirxDmaUpdate = true; + } + } + /* Update RX channel first */ + if (lpspirxDmaUpdate) + { + EDMA_SetTransferConfig(lpspiEdmaHandle->edmaRxRegToRxDataHandle->base, + lpspiEdmaHandle->edmaRxRegToRxDataHandle->channel, + &lpspiEdmaHandle->transferConfigRx, NULL); + } + EDMA_StartTransfer(lpspiEdmaHandle->edmaRxRegToRxDataHandle); + /* Update TX channel */ + if (lpspitxDmaUpdate) + { + EDMA_SetTransferConfig(lpspiEdmaHandle->edmaTxDataToTxRegHandle->base, + lpspiEdmaHandle->edmaTxDataToTxRegHandle->channel, + &lpspiEdmaHandle->transferConfigTx, NULL); + } + EDMA_StartTransfer(lpspiEdmaHandle->edmaTxDataToTxRegHandle); + + LPSPI_EnableDMA(lpspiEdmaPrivateHandle->base, + (uint32_t)kLPSPI_TxDmaEnable | (uint32_t)kLPSPI_RxDmaEnable); + /* Continue DMA transmit*/ + return; + } + else + { + /* Transmit complete */ + } + } + else + { + /* Once DMA transfer */ + if (lpspiEdmaPrivateHandle->handle->isThereExtraRxBytes) + { + while (LPSPI_GetRxFifoCount(lpspiEdmaPrivateHandle->base) == 0U) + { + } + readData = LPSPI_ReadData(lpspiEdmaPrivateHandle->base); + if (lpspiEdmaPrivateHandle->handle->rxData != NULL) + { + LPSPI_SeparateEdmaReadData( + &(lpspiEdmaPrivateHandle->handle->rxData[rxRemainingByteCount - bytesLastRead]), readData, + bytesLastRead, isByteSwap); + } + } + /* Transmit complete */ + } + } + + lpspiEdmaPrivateHandle->handle->state = (uint8_t)kLPSPI_Idle; + + if (lpspiEdmaPrivateHandle->handle->callback != NULL) + { + lpspiEdmaPrivateHandle->handle->callback(lpspiEdmaPrivateHandle->base, lpspiEdmaPrivateHandle->handle, + callbackStatus, lpspiEdmaPrivateHandle->handle->userData); + } +} + +/*! + * brief LPSPI master aborts a transfer which is using eDMA. + * + * This function aborts a transfer which is using eDMA. + * + * param base LPSPI peripheral base address. + * param handle pointer to lpspi_master_edma_handle_t structure which stores the transfer state. + */ +void LPSPI_MasterTransferAbortEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle) +{ + assert(handle != NULL); + + LPSPI_DisableDMA(base, (uint32_t)kLPSPI_RxDmaEnable | (uint32_t)kLPSPI_TxDmaEnable); + + EDMA_AbortTransfer(handle->edmaRxRegToRxDataHandle); + EDMA_AbortTransfer(handle->edmaTxDataToTxRegHandle); + + handle->state = (uint8_t)kLPSPI_Idle; +} + +/*! + * brief Gets the master eDMA transfer remaining bytes. + * + * This function gets the master eDMA transfer remaining bytes. + * + * param base LPSPI peripheral base address. + * param handle pointer to lpspi_master_edma_handle_t structure which stores the transfer state. + * param count Number of bytes transferred so far by the EDMA transaction. + * return status of status_t. + */ +status_t LPSPI_MasterTransferGetCountEDMA(LPSPI_Type *base, lpspi_master_edma_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (handle->state != (uint8_t)kLPSPI_Busy) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + size_t remainingByte; + + remainingByte = + (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount(handle->edmaRxRegToRxDataHandle->base, + handle->edmaRxRegToRxDataHandle->channel); + + *count = handle->totalByteCount - remainingByte; + + return kStatus_Success; +} + +/*! + * brief Initializes the LPSPI slave eDMA handle. + * + * This function initializes the LPSPI eDMA handle which can be used for other LPSPI transactional APIs. Usually, for a + * specified LPSPI instance, call this API once to get the initialized handle. + * + * Note that LPSPI eDMA has a separated (Rx and Tx as two sources) or shared (Rx and Tx as the same source) DMA request + * source. + * + * (1) For a separated DMA request source, enable and set the Rx DMAMUX source for edmaRxRegToRxDataHandle and + * Tx DMAMUX source for edmaTxDataToTxRegHandle. + * (2) For a shared DMA request source, enable and set the Rx/Rx DMAMUX source for edmaRxRegToRxDataHandle . + * + * param base LPSPI peripheral base address. + * param handle LPSPI handle pointer to lpspi_slave_edma_handle_t. + * param callback LPSPI callback. + * param userData callback function parameter. + * param edmaRxRegToRxDataHandle edmaRxRegToRxDataHandle pointer to edma_handle_t. + * param edmaTxDataToTxRegHandle edmaTxDataToTxRegHandle pointer to edma_handle_t. + */ +void LPSPI_SlaveTransferCreateHandleEDMA(LPSPI_Type *base, + lpspi_slave_edma_handle_t *handle, + lpspi_slave_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *edmaRxRegToRxDataHandle, + edma_handle_t *edmaTxDataToTxRegHandle) +{ + assert(handle != NULL); + assert(edmaRxRegToRxDataHandle != NULL); + assert(edmaTxDataToTxRegHandle != NULL); + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(*handle)); + + uint32_t instance = LPSPI_GetInstance(base); + + s_lpspiSlaveEdmaPrivateHandle[instance].base = base; + s_lpspiSlaveEdmaPrivateHandle[instance].handle = handle; + + handle->callback = callback; + handle->userData = userData; + + handle->edmaRxRegToRxDataHandle = edmaRxRegToRxDataHandle; + handle->edmaTxDataToTxRegHandle = edmaTxDataToTxRegHandle; +} + +/*! + * brief LPSPI slave transfers data using eDMA. + * + * This function transfers data using eDMA. This is a non-blocking function, which return right away. When all data + * is transferred, the callback function is called. + * + * Note: + * The transfer data size should be an integer multiple of bytesPerFrame if bytesPerFrame is less than or equal to 4. + * For bytesPerFrame greater than 4: + * The transfer data size should be equal to bytesPerFrame if the bytesPerFrame is not an integer multiple of 4. + * Otherwise, the transfer data size can be an integer multiple of bytesPerFrame. + * + * param base LPSPI peripheral base address. + * param handle pointer to lpspi_slave_edma_handle_t structure which stores the transfer state. + * param transfer pointer to lpspi_transfer_t structure. + * return status of status_t. + */ +status_t LPSPI_SlaveTransferEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle, lpspi_transfer_t *transfer) +{ + assert(handle != NULL); + assert(transfer != NULL); + + /* Check that we're not busy.*/ + if (handle->state == (uint8_t)kLPSPI_Busy) + { + return kStatus_LPSPI_Busy; + } + /* Disable module before configuration. */ + LPSPI_Enable(base, false); + /* Check arguements, also dma transfer can not support 3 bytes */ + if (!LPSPI_CheckTransferArgument(base, transfer, true)) + { + return kStatus_InvalidArgument; + } + + LPSPI_PrepareTransferEDMA(base); + + /* Variables */ + bool isThereExtraTxBytes = false; + bool isByteSwap = ((transfer->configFlags & (uint32_t)kLPSPI_MasterByteSwap) != 0U); + uint8_t bytesLastWrite = 0; + uint8_t dummyData = g_lpspiDummyData[LPSPI_GetInstance(base)]; + uint32_t mask = (uint32_t)kLPSPI_RxDmaEnable; + + /* Used for byte swap */ + uint32_t addrOffset = 0; + uint32_t instance = LPSPI_GetInstance(base); + uint32_t rxAddr = LPSPI_GetRxRegisterAddress(base); + uint32_t txAddr = LPSPI_GetTxRegisterAddress(base); + uint32_t whichPcs = (transfer->configFlags & LPSPI_MASTER_PCS_MASK) >> LPSPI_MASTER_PCS_SHIFT; + uint32_t bytesPerFrame = ((base->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) / 8U + 1U; + edma_transfer_config_t transferConfigRx = {0}; + edma_transfer_config_t transferConfigTx = {0}; + edma_tcd_t *softwareTCD_extraBytes = (edma_tcd_t *)((uint32_t)(&handle->lpspiSoftwareTCD[1]) & (~0x1FU)); + + /* Assign the original value for members of transfer handle. */ + handle->state = (uint8_t)kLPSPI_Busy; + handle->txData = transfer->txData; + handle->rxData = transfer->rxData; + handle->txRemainingByteCount = transfer->dataSize; + handle->rxRemainingByteCount = transfer->dataSize; + handle->totalByteCount = transfer->dataSize; + handle->writeRegRemainingTimes = (transfer->dataSize / bytesPerFrame) * ((bytesPerFrame + 3U) / 4U); + handle->readRegRemainingTimes = handle->writeRegRemainingTimes; + handle->txBuffIfNull = + ((uint32_t)dummyData) | ((uint32_t)dummyData << 8) | ((uint32_t)dummyData << 16) | ((uint32_t)dummyData << 24); + /*The TX and RX FIFO sizes are always the same*/ + handle->fifoSize = LPSPI_GetRxFifoSize(base); + handle->isByteSwap = isByteSwap; + handle->isThereExtraRxBytes = false; + + /* Because DMA is fast enough, set the RX and TX watermarks to 0. */ + LPSPI_SetFifoWatermarks(base, 0U, 0U); + + /* Transfers will stall when transmit FIFO is empty or receive FIFO is full. */ + base->CFGR1 &= (~LPSPI_CFGR1_NOSTALL_MASK); + + /* Enable module for following configuration of TCR to take effect. */ + LPSPI_Enable(base, true); + + /* For DMA transfer, mask the transmit data if the tx data is null, for rx the receive data should not be masked at + any time since we use rx dma transfer finish cllback to indicate transfer finish. */ + base->TCR = + (base->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_BYSW_MASK | LPSPI_TCR_TXMSK_MASK)) | + LPSPI_TCR_TXMSK(transfer->txData == NULL) | LPSPI_TCR_BYSW(isByteSwap) | LPSPI_TCR_PCS(whichPcs); + + if (transfer->txData == NULL) + { + if (!LPSPI_WaitTxFifoEmpty(base)) + { + return kStatus_LPSPI_Error; + } + } + + /*Calculate the bytes for write/read the TX/RX register each time*/ + if (bytesPerFrame <= 4U) + { + handle->bytesEachWrite = (uint8_t)bytesPerFrame; + handle->bytesEachRead = (uint8_t)bytesPerFrame; + + handle->bytesLastRead = (uint8_t)bytesPerFrame; + } + else + { + handle->bytesEachWrite = 4U; + handle->bytesEachRead = 4U; + + handle->bytesLastRead = 4U; + + if ((transfer->dataSize % 4U) != 0U) + { + bytesLastWrite = (uint8_t)(transfer->dataSize % 4U); + handle->bytesLastRead = bytesLastWrite; + + isThereExtraTxBytes = true; + --handle->writeRegRemainingTimes; + + handle->isThereExtraRxBytes = true; + --handle->readRegRemainingTimes; + } + } + + EDMA_SetCallback(handle->edmaRxRegToRxDataHandle, EDMA_LpspiSlaveCallback, + &s_lpspiSlaveEdmaPrivateHandle[instance]); + + /*Rx*/ + /* + * $Branch Coverage Justification$ + * LPSPI_CheckTransferArgument will check parameters, here readRegRemainingTimes cannot be 0. + */ + if (handle->readRegRemainingTimes > 0U) + { + EDMA_ResetChannel(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel); + + if (handle->rxData != NULL) + { + transferConfigRx.destAddr = (uint32_t) & (handle->rxData[0]); + transferConfigRx.destOffset = 1; + } + else + { + transferConfigRx.destAddr = (uint32_t) & (handle->rxBuffIfNull); + transferConfigRx.destOffset = 0; + } + transferConfigRx.destTransferSize = kEDMA_TransferSize1Bytes; + + addrOffset = 0; + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_edma_c_ref_1$ + */ + switch (handle->bytesEachRead) + { + case (1U): + transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes; + transferConfigRx.minorLoopBytes = 1; + if (handle->isByteSwap) + { + addrOffset = 3; + } + break; + + case (2U): + transferConfigRx.srcTransferSize = kEDMA_TransferSize2Bytes; + transferConfigRx.minorLoopBytes = 2; + if (handle->isByteSwap) + { + addrOffset = 2; + } + break; + + case (4U): + transferConfigRx.srcTransferSize = kEDMA_TransferSize4Bytes; + transferConfigRx.minorLoopBytes = 4; + break; + + default: + transferConfigRx.srcTransferSize = kEDMA_TransferSize1Bytes; + transferConfigRx.minorLoopBytes = 1; + assert(false); + break; + } + + transferConfigRx.srcAddr = (uint32_t)rxAddr + addrOffset; + transferConfigRx.srcOffset = 0; + + transferConfigRx.majorLoopCounts = handle->readRegRemainingTimes; + + /* Store the initially configured eDMA minor byte transfer count into the DSPI handle */ + handle->nbytes = (uint8_t)transferConfigRx.minorLoopBytes; + + EDMA_SetTransferConfig(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel, + &transferConfigRx, NULL); + EDMA_EnableChannelInterrupts(handle->edmaRxRegToRxDataHandle->base, handle->edmaRxRegToRxDataHandle->channel, + (uint32_t)kEDMA_MajorInterruptEnable); + EDMA_StartTransfer(handle->edmaRxRegToRxDataHandle); + } + + /*Tx*/ + if (handle->txData != NULL) + { + EDMA_ResetChannel(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel); + if (isThereExtraTxBytes) + { + transferConfigTx.srcAddr = (uint32_t) & (transfer->txData[transfer->dataSize - bytesLastWrite]); + transferConfigTx.srcOffset = 1; + transferConfigTx.destOffset = 0; + transferConfigTx.srcTransferSize = kEDMA_TransferSize1Bytes; + addrOffset = 0; + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_edma_c_ref_1$ + */ + switch (bytesLastWrite) + { + case (1U): + transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfigTx.minorLoopBytes = 1; + if (handle->isByteSwap) + { + addrOffset = 3; + } + break; + + case (2U): + transferConfigTx.destTransferSize = kEDMA_TransferSize2Bytes; + transferConfigTx.minorLoopBytes = 2; + if (handle->isByteSwap) + { + addrOffset = 2; + } + break; + + default: + transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfigTx.minorLoopBytes = 1; + assert(false); + break; + } + + transferConfigTx.destAddr = (uint32_t)txAddr + addrOffset; + transferConfigTx.majorLoopCounts = 1; + +#if defined FSL_EDMA_DRIVER_EDMA4 && FSL_EDMA_DRIVER_EDMA4 + EDMA_TcdResetExt(handle->edmaRxRegToRxDataHandle->base, softwareTCD_extraBytes); + EDMA_TcdSetTransferConfigExt(handle->edmaRxRegToRxDataHandle->base, softwareTCD_extraBytes, + &transferConfigTx, NULL); +#else + EDMA_TcdReset(softwareTCD_extraBytes); + EDMA_TcdSetTransferConfig(softwareTCD_extraBytes, &transferConfigTx, NULL); +#endif + } + + transferConfigTx.srcAddr = (uint32_t)(handle->txData); + transferConfigTx.srcOffset = 1; + transferConfigTx.destOffset = 0; + transferConfigTx.srcTransferSize = kEDMA_TransferSize1Bytes; + addrOffset = 0; + /* + * $Branch Coverage Justification$ + * $ref fsl_lpspi_edma_c_ref_1$ + */ + switch (handle->bytesEachRead) + { + case (1U): + transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfigTx.minorLoopBytes = 1; + if (handle->isByteSwap) + { + addrOffset = 3; + } + break; + + case (2U): + transferConfigTx.destTransferSize = kEDMA_TransferSize2Bytes; + transferConfigTx.minorLoopBytes = 2; + + if (handle->isByteSwap) + { + addrOffset = 2; + } + break; + + case (4U): + transferConfigTx.destTransferSize = kEDMA_TransferSize4Bytes; + transferConfigTx.minorLoopBytes = 4; + break; + + default: + transferConfigTx.destTransferSize = kEDMA_TransferSize1Bytes; + transferConfigTx.minorLoopBytes = 1; + assert(false); + break; + } + + transferConfigTx.destAddr = (uint32_t)txAddr + addrOffset; + transferConfigTx.majorLoopCounts = handle->writeRegRemainingTimes; + + if (isThereExtraTxBytes) + { + EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, + &transferConfigTx, softwareTCD_extraBytes); + } + else + { + EDMA_SetTransferConfig(handle->edmaTxDataToTxRegHandle->base, handle->edmaTxDataToTxRegHandle->channel, + &transferConfigTx, NULL); + } + EDMA_StartTransfer(handle->edmaTxDataToTxRegHandle); + mask |= (uint32_t)kLPSPI_TxDmaEnable; + } + + LPSPI_EnableDMA(base, mask); + + return kStatus_Success; +} + +static void EDMA_LpspiSlaveCallback(edma_handle_t *edmaHandle, + void *g_lpspiEdmaPrivateHandle, + bool transferDone, + uint32_t tcds) +{ + assert(edmaHandle != NULL); + assert(g_lpspiEdmaPrivateHandle != NULL); + + uint32_t readData; + status_t callbackStatus = kStatus_Success; + + lpspi_slave_edma_private_handle_t *lpspiEdmaPrivateHandle; + + lpspiEdmaPrivateHandle = (lpspi_slave_edma_private_handle_t *)g_lpspiEdmaPrivateHandle; + + size_t rxRemainingByteCount = lpspiEdmaPrivateHandle->handle->rxRemainingByteCount; + uint8_t bytesLastRead = lpspiEdmaPrivateHandle->handle->bytesLastRead; + bool isByteSwap = lpspiEdmaPrivateHandle->handle->isByteSwap; + + LPSPI_DisableDMA(lpspiEdmaPrivateHandle->base, (uint32_t)kLPSPI_TxDmaEnable | (uint32_t)kLPSPI_RxDmaEnable); + + if (!transferDone) + { + callbackStatus = kStatus_LPSPI_Error; + } + + /* + * $Branch Coverage Justification$ + * When there are extra bytes, the slave will not receive the extra bytes,The while here will not stop.(will + * improve) + */ + if (lpspiEdmaPrivateHandle->handle->isThereExtraRxBytes) + { + while (LPSPI_GetRxFifoCount(lpspiEdmaPrivateHandle->base) == 0U) + { + } + readData = LPSPI_ReadData(lpspiEdmaPrivateHandle->base); + + if (lpspiEdmaPrivateHandle->handle->rxData != NULL) + { + LPSPI_SeparateEdmaReadData(&(lpspiEdmaPrivateHandle->handle->rxData[rxRemainingByteCount - bytesLastRead]), + readData, bytesLastRead, isByteSwap); + } + } + + lpspiEdmaPrivateHandle->handle->state = (uint8_t)kLPSPI_Idle; + + if (lpspiEdmaPrivateHandle->handle->callback != NULL) + { + lpspiEdmaPrivateHandle->handle->callback(lpspiEdmaPrivateHandle->base, lpspiEdmaPrivateHandle->handle, + callbackStatus, lpspiEdmaPrivateHandle->handle->userData); + } +} + +/*! + * brief LPSPI slave aborts a transfer which is using eDMA. + * + * This function aborts a transfer which is using eDMA. + * + * param base LPSPI peripheral base address. + * param handle pointer to lpspi_slave_edma_handle_t structure which stores the transfer state. + */ +void LPSPI_SlaveTransferAbortEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle) +{ + assert(handle != NULL); + + LPSPI_DisableDMA(base, (uint32_t)kLPSPI_RxDmaEnable | (uint32_t)kLPSPI_TxDmaEnable); + + EDMA_AbortTransfer(handle->edmaRxRegToRxDataHandle); + EDMA_AbortTransfer(handle->edmaTxDataToTxRegHandle); + + handle->state = (uint8_t)kLPSPI_Idle; +} + +/*! + * brief Gets the slave eDMA transfer remaining bytes. + * + * This function gets the slave eDMA transfer remaining bytes. + * + * param base LPSPI peripheral base address. + * param handle pointer to lpspi_slave_edma_handle_t structure which stores the transfer state. + * param count Number of bytes transferred so far by the eDMA transaction. + * return status of status_t. + */ +status_t LPSPI_SlaveTransferGetCountEDMA(LPSPI_Type *base, lpspi_slave_edma_handle_t *handle, size_t *count) +{ + assert(handle != NULL); + + if (NULL == count) + { + return kStatus_InvalidArgument; + } + + /* Catch when there is not an active transfer. */ + if (handle->state != (uint8_t)kLPSPI_Busy) + { + *count = 0; + return kStatus_NoTransferInProgress; + } + + size_t remainingByte; + + remainingByte = + (uint32_t)handle->nbytes * EDMA_GetRemainingMajorLoopCount(handle->edmaRxRegToRxDataHandle->base, + handle->edmaRxRegToRxDataHandle->channel); + + *count = handle->totalByteCount - remainingByte; + + return kStatus_Success; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi_edma.h new file mode 100644 index 00000000000..9e193393d67 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpspi_edma.h @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_LPSPI_EDMA_H_ +#define FSL_LPSPI_EDMA_H_ + +#include "fsl_lpspi.h" +#include "fsl_edma.h" + +/*! + * @addtogroup lpspi_edma_driver + * @{ + */ + +/*********************************************************************************************************************** + * Definitions + **********************************************************************************************************************/ +/*! @name Driver version */ +/*! @{ */ +/*! @brief LPSPI EDMA driver version. */ +#define FSL_LPSPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 4, 4)) + +/*! @brief DMA max transfer size */ +#define DMA_MAX_TRANSFER_COUNT 0x7FFFU +/*! @} */ + +/*! + * @brief Forward declaration of the _lpspi_master_edma_handle typedefs. + */ +typedef struct _lpspi_master_edma_handle lpspi_master_edma_handle_t; + +/*! + * @brief Forward declaration of the _lpspi_slave_edma_handle typedefs. + */ +typedef struct _lpspi_slave_edma_handle lpspi_slave_edma_handle_t; + +/*! + * @brief Completion callback function pointer type. + * + * @param base LPSPI peripheral base address. + * @param handle Pointer to the handle for the LPSPI master. + * @param status Success or error code describing whether the transfer completed. + * @param userData Arbitrary pointer-dataSized value passed from the application. + */ +typedef void (*lpspi_master_edma_transfer_callback_t)(LPSPI_Type *base, + lpspi_master_edma_handle_t *handle, + status_t status, + void *userData); +/*! + * @brief Completion callback function pointer type. + * + * @param base LPSPI peripheral base address. + * @param handle Pointer to the handle for the LPSPI slave. + * @param status Success or error code describing whether the transfer completed. + * @param userData Arbitrary pointer-dataSized value passed from the application. + */ +typedef void (*lpspi_slave_edma_transfer_callback_t)(LPSPI_Type *base, + lpspi_slave_edma_handle_t *handle, + status_t status, + void *userData); + +/*! @brief LPSPI master eDMA transfer handle structure used for transactional API. */ +struct _lpspi_master_edma_handle +{ + volatile bool isPcsContinuous; /*!< Is PCS continuous in transfer. */ + + volatile bool isByteSwap; /*!< A flag that whether should byte swap. */ + + volatile uint8_t fifoSize; /*!< FIFO dataSize. */ + + volatile uint8_t rxWatermark; /*!< Rx watermark. */ + + volatile uint8_t bytesEachWrite; /*!< Bytes for each write TDR. */ + volatile uint8_t bytesEachRead; /*!< Bytes for each read RDR. */ + + volatile uint8_t bytesLastRead; /*!< Bytes for last read RDR. */ + volatile bool isThereExtraRxBytes; /*!< Is there extra RX byte. */ + + const uint8_t *volatile txData; /*!< Send buffer. */ + uint8_t *volatile rxData; /*!< Receive buffer. */ + volatile size_t txRemainingByteCount; /*!< Number of bytes remaining to send.*/ + volatile size_t rxRemainingByteCount; /*!< Number of bytes remaining to receive.*/ + + volatile uint32_t writeRegRemainingTimes; /*!< Write TDR register remaining times. */ + volatile uint32_t readRegRemainingTimes; /*!< Read RDR register remaining times. */ + + uint32_t totalByteCount; /*!< Number of transfer bytes*/ + + edma_tcd_t *lastTimeTCD; /*!< Pointer to the lastTime TCD*/ + bool isMultiDMATransmit; /*!< Is there multi DMA transmit*/ + volatile uint8_t dmaTransmitTime; /*!< DMA Transfer times. */ + uint32_t lastTimeDataBytes; /*!< DMA transmit last Time data Bytes */ + + uint32_t dataBytesEveryTime; /*!< Bytes in a time for DMA transfer, default is DMA_MAX_TRANSFER_COUNT */ + + edma_transfer_config_t transferConfigRx; /*!< Config of DMA rx channel.*/ + edma_transfer_config_t transferConfigTx; /*!< Config of DMA tx channel.*/ + uint32_t txBuffIfNull; /*!< Used if there is not txData for DMA purpose.*/ + uint32_t rxBuffIfNull; /*!< Used if there is not rxData for DMA purpose.*/ + + uint32_t transmitCommand; /*!< Used to write TCR for DMA purpose.*/ + + volatile uint8_t state; /*!< LPSPI transfer state , _lpspi_transfer_state.*/ + + uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ + + lpspi_master_edma_transfer_callback_t callback; /*!< Completion callback. */ + void *userData; /*!< Callback user data. */ + + edma_handle_t *edmaRxRegToRxDataHandle; /*!CSR = (LPTMR_CSR_TMS(config->timerMode) | LPTMR_CSR_TFC(config->enableFreeRunning) | + LPTMR_CSR_TPP(config->pinPolarity) | LPTMR_CSR_TPS(config->pinSelect)); + + /* Configure the prescale value and clock source */ + base->PSR = (LPTMR_PSR_PRESCALE(config->value) | LPTMR_PSR_PBYP(config->bypassPrescaler) | + LPTMR_PSR_PCS(config->prescalerClockSource)); +} + +/*! + * brief Gates the LPTMR clock. + * + * param base LPTMR peripheral base address + */ +void LPTMR_Deinit(LPTMR_Type *base) +{ + /* Disable the LPTMR and reset the internal logic */ + base->CSR &= ~LPTMR_CSR_TEN_MASK; + +#if defined(LPTMR_CLOCKS) +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + + uint32_t instance = LPTMR_GetInstance(base); + + /* Gate the LPTMR clock*/ + CLOCK_DisableClock(s_lptmrClocks[instance]); +#if defined(LPTMR_PERIPH_CLOCKS) + CLOCK_DisableClock(s_lptmrPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +#endif /* LPTMR_CLOCKS */ +} + +/*! + * brief Fills in the LPTMR configuration structure with default settings. + * + * The default values are as follows. + * code + * config->timerMode = kLPTMR_TimerModeTimeCounter; + * config->pinSelect = kLPTMR_PinSelectInput_0; + * config->pinPolarity = kLPTMR_PinPolarityActiveHigh; + * config->enableFreeRunning = false; + * config->bypassPrescaler = true; + * config->prescalerClockSource = kLPTMR_PrescalerClock_1; + * config->value = kLPTMR_Prescale_Glitch_0; + * endcode + * param config A pointer to the LPTMR configuration structure. + */ +void LPTMR_GetDefaultConfig(lptmr_config_t *config) +{ + assert(NULL != config); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + /* Use time counter mode */ + config->timerMode = kLPTMR_TimerModeTimeCounter; + /* Use input 0 as source in pulse counter mode */ + config->pinSelect = kLPTMR_PinSelectInput_0; + /* Pulse input pin polarity is active-high */ + config->pinPolarity = kLPTMR_PinPolarityActiveHigh; + /* Counter resets whenever TCF flag is set */ + config->enableFreeRunning = false; + /* Bypass the prescaler */ + config->bypassPrescaler = true; + /* LPTMR clock source */ +#if !(defined(FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_1_SUPPORT) && \ + FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_1_SUPPORT) + config->prescalerClockSource = kLPTMR_PrescalerClock_1; +#elif !(defined(FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_0_SUPPORT) && \ + FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_0_SUPPORT) + config->prescalerClockSource = kLPTMR_PrescalerClock_0; +#elif !(defined(FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_2_SUPPORT) && \ + FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_2_SUPPORT) + config->prescalerClockSource = kLPTMR_PrescalerClock_2; +#elif !(defined(FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_3_SUPPORT) && \ + FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_3_SUPPORT) + config->prescalerClockSource = kLPTMR_PrescalerClock_3; +#else +#error No valid source +#endif + + /* Divide the prescaler clock by 2 */ + config->value = kLPTMR_Prescale_Glitch_0; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lptmr.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lptmr.h new file mode 100644 index 00000000000..b8e473120c5 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lptmr.h @@ -0,0 +1,384 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2017, 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_LPTMR_H_ +#define FSL_LPTMR_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lptmr + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! Driver Version */ +#define FSL_LPTMR_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) +/*! @} */ + +/*! @brief LPTMR pin selection used in pulse counter mode.*/ +typedef enum _lptmr_pin_select +{ + kLPTMR_PinSelectInput_0 = 0x0U, /*!< Pulse counter input 0 is selected */ + kLPTMR_PinSelectInput_1 = 0x1U, /*!< Pulse counter input 1 is selected */ + kLPTMR_PinSelectInput_2 = 0x2U, /*!< Pulse counter input 2 is selected */ + kLPTMR_PinSelectInput_3 = 0x3U /*!< Pulse counter input 3 is selected */ +} lptmr_pin_select_t; + +/*! @brief LPTMR pin polarity used in pulse counter mode.*/ +typedef enum _lptmr_pin_polarity +{ + kLPTMR_PinPolarityActiveHigh = 0x0U, /*!< Pulse Counter input source is active-high */ + kLPTMR_PinPolarityActiveLow = 0x1U /*!< Pulse Counter input source is active-low */ +} lptmr_pin_polarity_t; + +/*! @brief LPTMR timer mode selection.*/ +typedef enum _lptmr_timer_mode +{ + kLPTMR_TimerModeTimeCounter = 0x0U, /*!< Time Counter mode */ + kLPTMR_TimerModePulseCounter = 0x1U /*!< Pulse Counter mode */ +} lptmr_timer_mode_t; + +/*! @brief LPTMR prescaler/glitch filter values*/ +typedef enum _lptmr_prescaler_glitch_value +{ + kLPTMR_Prescale_Glitch_0 = 0x0U, /*!< Prescaler divide 2, glitch filter does not support this setting */ + kLPTMR_Prescale_Glitch_1 = 0x1U, /*!< Prescaler divide 4, glitch filter 2 */ + kLPTMR_Prescale_Glitch_2 = 0x2U, /*!< Prescaler divide 8, glitch filter 4 */ + kLPTMR_Prescale_Glitch_3 = 0x3U, /*!< Prescaler divide 16, glitch filter 8 */ + kLPTMR_Prescale_Glitch_4 = 0x4U, /*!< Prescaler divide 32, glitch filter 16 */ + kLPTMR_Prescale_Glitch_5 = 0x5U, /*!< Prescaler divide 64, glitch filter 32 */ + kLPTMR_Prescale_Glitch_6 = 0x6U, /*!< Prescaler divide 128, glitch filter 64 */ + kLPTMR_Prescale_Glitch_7 = 0x7U, /*!< Prescaler divide 256, glitch filter 128 */ + kLPTMR_Prescale_Glitch_8 = 0x8U, /*!< Prescaler divide 512, glitch filter 256 */ + kLPTMR_Prescale_Glitch_9 = 0x9U, /*!< Prescaler divide 1024, glitch filter 512*/ + kLPTMR_Prescale_Glitch_10 = 0xAU, /*!< Prescaler divide 2048 glitch filter 1024 */ + kLPTMR_Prescale_Glitch_11 = 0xBU, /*!< Prescaler divide 4096, glitch filter 2048 */ + kLPTMR_Prescale_Glitch_12 = 0xCU, /*!< Prescaler divide 8192, glitch filter 4096 */ + kLPTMR_Prescale_Glitch_13 = 0xDU, /*!< Prescaler divide 16384, glitch filter 8192 */ + kLPTMR_Prescale_Glitch_14 = 0xEU, /*!< Prescaler divide 32768, glitch filter 16384 */ + kLPTMR_Prescale_Glitch_15 = 0xFU /*!< Prescaler divide 65536, glitch filter 32768 */ +} lptmr_prescaler_glitch_value_t; + +/*! + * @brief LPTMR prescaler/glitch filter clock select. + * @note Clock connections are SoC-specific + */ +typedef enum _lptmr_prescaler_clock_select +{ +#if !(defined(FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_0_SUPPORT) && \ + FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_0_SUPPORT) + kLPTMR_PrescalerClock_0 = 0x0U, /*!< Prescaler/glitch filter clock 0 selected. */ +#endif + +#if !(defined(FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_1_SUPPORT) && \ + FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_1_SUPPORT) + kLPTMR_PrescalerClock_1 = 0x1U, /*!< Prescaler/glitch filter clock 1 selected. */ +#endif /* FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_1_SUPPORT */ + +#if !(defined(FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_2_SUPPORT) && \ + FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_2_SUPPORT) + kLPTMR_PrescalerClock_2 = 0x2U, /*!< Prescaler/glitch filter clock 2 selected. */ +#endif + +#if !(defined(FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_3_SUPPORT) && \ + FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_3_SUPPORT) + kLPTMR_PrescalerClock_3 = 0x3U, /*!< Prescaler/glitch filter clock 3 selected. */ +#endif /* FSL_FEATURE_LPTMR_HAS_NO_PRESCALER_CLOCK_SOURCE_3_SUPPORT */ +} lptmr_prescaler_clock_select_t; + +/*! @brief List of the LPTMR interrupts */ +typedef enum _lptmr_interrupt_enable +{ + kLPTMR_TimerInterruptEnable = LPTMR_CSR_TIE_MASK, /*!< Timer interrupt enable */ +} lptmr_interrupt_enable_t; + +/*! @brief List of the LPTMR status flags */ +typedef enum _lptmr_status_flags +{ + kLPTMR_TimerCompareFlag = LPTMR_CSR_TCF_MASK, /*!< Timer compare flag */ +} lptmr_status_flags_t; + +/*! + * @brief LPTMR config structure + * + * This structure holds the configuration settings for the LPTMR peripheral. To initialize this + * structure to reasonable defaults, call the LPTMR_GetDefaultConfig() function and pass a + * pointer to your configuration structure instance. + * + * The configuration struct can be made constant so it resides in flash. + */ +typedef struct _lptmr_config +{ + lptmr_timer_mode_t timerMode; /*!< Time counter mode or pulse counter mode */ + lptmr_pin_select_t pinSelect; /*!< LPTMR pulse input pin select; used only in pulse counter mode */ + lptmr_pin_polarity_t pinPolarity; /*!< LPTMR pulse input pin polarity; used only in pulse counter mode */ + bool enableFreeRunning; /*!< True: enable free running, counter is reset on overflow + False: counter is reset when the compare flag is set */ + bool bypassPrescaler; /*!< True: bypass prescaler; false: use clock from prescaler */ + lptmr_prescaler_clock_select_t prescalerClockSource; /*!< LPTMR clock source */ + lptmr_prescaler_glitch_value_t value; /*!< Prescaler or glitch filter value */ +} lptmr_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Ungates the LPTMR clock and configures the peripheral for a basic operation. + * + * @note This API should be called at the beginning of the application using the LPTMR driver. + * + * @param base LPTMR peripheral base address + * @param config A pointer to the LPTMR configuration structure. + */ +void LPTMR_Init(LPTMR_Type *base, const lptmr_config_t *config); + +/*! + * @brief Gates the LPTMR clock. + * + * @param base LPTMR peripheral base address + */ +void LPTMR_Deinit(LPTMR_Type *base); + +/*! + * @brief Fills in the LPTMR configuration structure with default settings. + * + * The default values are as follows. + * @code + * config->timerMode = kLPTMR_TimerModeTimeCounter; + * config->pinSelect = kLPTMR_PinSelectInput_0; + * config->pinPolarity = kLPTMR_PinPolarityActiveHigh; + * config->enableFreeRunning = false; + * config->bypassPrescaler = true; + * config->prescalerClockSource = kLPTMR_PrescalerClock_1; + * config->value = kLPTMR_Prescale_Glitch_0; + * @endcode + * @param config A pointer to the LPTMR configuration structure. + */ +void LPTMR_GetDefaultConfig(lptmr_config_t *config); + +/*! @}*/ + +/*! + * @name Interrupt Interface + * @{ + */ + +/*! + * @brief Enables the selected LPTMR interrupts. + * + * @param base LPTMR peripheral base address + * @param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::lptmr_interrupt_enable_t + */ +static inline void LPTMR_EnableInterrupts(LPTMR_Type *base, uint32_t mask) +{ + uint32_t reg = base->CSR; + + /* Clear the TCF bit so that we don't clear this w1c bit when writing back */ + reg &= ~(LPTMR_CSR_TCF_MASK); + reg |= mask; + base->CSR = reg; +} + +/*! + * @brief Disables the selected LPTMR interrupts. + * + * @param base LPTMR peripheral base address + * @param mask The interrupts to disable. This is a logical OR of members of the + * enumeration ::lptmr_interrupt_enable_t. + */ +static inline void LPTMR_DisableInterrupts(LPTMR_Type *base, uint32_t mask) +{ + uint32_t reg = base->CSR; + + /* Clear the TCF bit so that we don't clear this w1c bit when writing back */ + reg &= ~(LPTMR_CSR_TCF_MASK); + reg &= ~mask; + base->CSR = reg; +} + +/*! + * @brief Gets the enabled LPTMR interrupts. + * + * @param base LPTMR peripheral base address + * + * @return The enabled interrupts. This is the logical OR of members of the + * enumeration ::lptmr_interrupt_enable_t + */ +static inline uint32_t LPTMR_GetEnabledInterrupts(LPTMR_Type *base) +{ + return (base->CSR & LPTMR_CSR_TIE_MASK); +} + +/*! @}*/ + +#if defined(FSL_FEATURE_LPTMR_HAS_CSR_TDRE) && (FSL_FEATURE_LPTMR_HAS_CSR_TDRE) +/*! + * @brief Enable or disable timer DMA request + * + * @param base base LPTMR peripheral base address + * @param enable Switcher of timer DMA feature. "true" means to enable, "false" means to disable. + */ +static inline void LPTMR_EnableTimerDMA(LPTMR_Type *base, bool enable) +{ + if (enable) + { + base->CSR |= LPTMR_CSR_TDRE_MASK; + } + else + { + base->CSR &= ~(LPTMR_CSR_TDRE_MASK); + } +} +#endif /* FSL_FEATURE_LPTMR_HAS_CSR_TDRE */ + +/*! + * @name Status Interface + * @{ + */ + +/*! + * @brief Gets the LPTMR status flags. + * + * @param base LPTMR peripheral base address + * + * @return The status flags. This is the logical OR of members of the + * enumeration ::lptmr_status_flags_t + */ +static inline uint32_t LPTMR_GetStatusFlags(LPTMR_Type *base) +{ + return (base->CSR & LPTMR_CSR_TCF_MASK); +} + +/*! + * @brief Clears the LPTMR status flags. + * + * @param base LPTMR peripheral base address + * @param mask The status flags to clear. This is a logical OR of members of the + * enumeration ::lptmr_status_flags_t. + */ +static inline void LPTMR_ClearStatusFlags(LPTMR_Type *base, uint32_t mask) +{ + base->CSR |= mask; +} + +/*! @}*/ + +/*! + * @name Read and write the timer period + * @{ + */ + +/*! + * @brief Sets the timer period in units of count. + * + * Timers counts from 0 until it equals the count value set here. The count value is written to + * the CMR register. + * + * @note + * 1. The TCF flag is set with the CNR equals the count provided here and then increments. + * 2. Call the utility macros provided in the fsl_common.h to convert to ticks. + * + * @param base LPTMR peripheral base address + * @param ticks A timer period in units of ticks, which should be equal or greater than 1. + */ +static inline void LPTMR_SetTimerPeriod(LPTMR_Type *base, uint32_t ticks) +{ + assert(ticks > 0U); + base->CMR = LPTMR_CMR_COMPARE(ticks - 1U); +} + +/*! + * @brief Reads the current timer counting value. + * + * This function returns the real-time timer counting value in a range from 0 to a + * timer period. + * + * @note Call the utility macros provided in the fsl_common.h to convert ticks to usec or msec. + * + * @param base LPTMR peripheral base address + * + * @return The current counter value in ticks + */ +static inline uint32_t LPTMR_GetCurrentTimerCount(LPTMR_Type *base) +{ + /* Must first write any value to the CNR. This synchronizes and registers the current value + * of the CNR into a temporary register which can then be read + */ + base->CNR = 0U; + return (uint32_t)((base->CNR & LPTMR_CNR_COUNTER_MASK) >> LPTMR_CNR_COUNTER_SHIFT); +} + +/*! @}*/ + +/*! + * @name Timer Start and Stop + * @{ + */ + +/*! + * @brief Starts the timer. + * + * After calling this function, the timer counts up to the CMR register value. + * Each time the timer reaches the CMR value and then increments, it generates a + * trigger pulse and sets the timeout interrupt flag. An interrupt is also + * triggered if the timer interrupt is enabled. + * + * @param base LPTMR peripheral base address + */ +static inline void LPTMR_StartTimer(LPTMR_Type *base) +{ + uint32_t reg = base->CSR; + + /* Clear the TCF bit to avoid clearing the w1c bit when writing back. */ + reg &= ~(LPTMR_CSR_TCF_MASK); + reg |= LPTMR_CSR_TEN_MASK; + base->CSR = reg; +} + +/*! + * @brief Stops the timer. + * + * This function stops the timer and resets the timer's counter register. + * + * @param base LPTMR peripheral base address + */ +static inline void LPTMR_StopTimer(LPTMR_Type *base) +{ + uint32_t reg = base->CSR; + + /* Clear the TCF bit to avoid clearing the w1c bit when writing back. */ + reg &= ~(LPTMR_CSR_TCF_MASK); + reg &= ~LPTMR_CSR_TEN_MASK; + base->CSR = reg; +} + +/*! @}*/ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_LPTMR_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart.c new file mode 100644 index 00000000000..5e8de5a894b --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart.c @@ -0,0 +1,2742 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_lpuart.h" + +/* + * $Coverage Justification Reference$ + * + * $Justification fsl_lpuart_c_ref_1$ + * (osr > 3) (false) can't be not covered, because osr(osrTemp) is increased from 4U. + * + * $Justification fsl_lpuart_c_ref_2$ + * The flag is cleared successfully during test. + */ +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpuart" +#endif + +/* LPUART transfer state. */ +enum +{ + kLPUART_TxIdle, /*!< TX idle. */ + kLPUART_TxBusy, /*!< TX busy. */ + kLPUART_RxIdle, /*!< RX idle. */ + kLPUART_RxBusy /*!< RX busy. */ +}; + +#if defined(LPUART_RSTS) +#define LPUART_RESETS_ARRAY LPUART_RSTS +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Check whether the RX ring buffer is full. + * + * @userData handle LPUART handle pointer. + * @retval true RX ring buffer is full. + * @retval false RX ring buffer is not full. + */ +static bool LPUART_TransferIsRxRingBufferFull(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Write to TX register using non-blocking method. + * + * This function writes data to the TX register directly, upper layer must make + * sure the TX register is empty or TX FIFO has empty room before calling this function. + * + * @note This function does not check whether all the data has been sent out to bus, + * so before disable TX, check kLPUART_TransmissionCompleteFlag to ensure the TX is + * finished. + * + * @param base LPUART peripheral base address. + * @param data Start address of the data to write. + * @param length Size of the buffer to be sent. + */ +static void LPUART_WriteNonBlocking(LPUART_Type *base, const uint8_t *data, size_t length); +/*! + * @brief Write to TX register using non-blocking method in 9bit or 10bit mode. + * + * The 10bit of data will be writen to TX register DATA. + * Please make sure data 10bit is valid and other bit is 0. + * + * @note This function only support 9bit or 10bit transfer. + * + * @param base LPUART peripheral base address. + * @param data Start address of the data to write. + * @param length Size of the buffer to be sent. + */ +static void LPUART_WriteNonBlocking16bit(LPUART_Type *base, const uint16_t *data, size_t length); + +/*! + * @brief Read RX register using non-blocking method. + * + * This function reads data from the TX register directly, upper layer must make + * sure the RX register is full or TX FIFO has data before calling this function. + * + * @param base LPUART peripheral base address. + * @param data Start address of the buffer to store the received data. + * @param length Size of the buffer. + */ +static void LPUART_ReadNonBlocking(LPUART_Type *base, uint8_t *data, size_t length); +/*! + * @brief Read RX register using non-blocking method in 9bit or 10bit mode. + * + * This function reads 10bit data from the RX register directly and stores to 16bit data. + * + * @note This function only support 9bit or 10bit transfer. + * + * @param base LPUART peripheral base address. + * @param data Start address of the buffer to store the received data. + * @param length Size of the buffer. + */ +static void LPUART_ReadNonBlocking16bit(LPUART_Type *base, uint16_t *data, size_t length); +/*! + * @brief LPUART_TransferHandleIDLEIsReady handle function. + * This function handles when IDLE is ready. + * + * @param base LPUART peripheral base address. + * @param irqHandle LPUART handle pointer. + */ +static void LPUART_TransferHandleIDLEReady(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief LPUART_TransferHandleReceiveDataIsFull handle function. + * This function handles when receive data is full. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +static void LPUART_TransferHandleReceiveDataFull(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief LPUART_TransferHandleSendDataIsEmpty handle function. + * This function handles when send data is empty. + * + * @param base LPUART peripheral base address. + * @param irqHandle LPUART handle pointer. + */ +static void LPUART_TransferHandleSendDataEmpty(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief LPUART_TransferHandleTransmissionIsComplete handle function. + * This function handles Transmission complete and the interrupt is enabled. + * + * @param base LPUART peripheral base address. + * @param irqHandle LPUART handle pointer. + */ +static void LPUART_TransferHandleTransmissionComplete(LPUART_Type *base, lpuart_handle_t *handle); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#if defined(LPUART_BASE_PTRS_NS) +static LPUART_Type *const s_lpuartBases_ns[] = LPUART_BASE_PTRS_NS; +#endif +/* Array of LPUART peripheral base address. */ +static LPUART_Type *const s_lpuartBases[] = LPUART_BASE_PTRS; +/* Array of LPUART handle. */ +void *s_lpuartHandle[ARRAY_SIZE(s_lpuartBases)]; +/* Array of LPUART IRQ number. */ +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +static const IRQn_Type s_lpuartRxIRQ[] = LPUART_RX_IRQS; +const IRQn_Type s_lpuartTxIRQ[] = LPUART_TX_IRQS; +#else +const IRQn_Type s_lpuartIRQ[] = LPUART_RX_TX_IRQS; +#endif +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/* Array of LPUART clock name. */ +static const clock_ip_name_t s_lpuartClock[] = LPUART_CLOCKS; + +#if defined(LPUART_PERIPH_CLOCKS) +/* Array of LPUART functional clock name. */ +static const clock_ip_name_t s_lpuartPeriphClocks[] = LPUART_PERIPH_CLOCKS; +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +/* LPUART ISR for transactional APIs. */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +lpuart_isr_t s_lpuartIsr[ARRAY_SIZE(s_lpuartBases)] = {[0 ...(ARRAY_SIZE(s_lpuartBases) - 1)] = + (lpuart_isr_t)DefaultISR}; +#else +lpuart_isr_t s_lpuartIsr[ARRAY_SIZE(s_lpuartBases)]; +#endif + +#if defined(LPUART_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_lpuartResets[] = LPUART_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * brief Get the LPUART instance from peripheral base address. + * + * param base LPUART peripheral base address. + * return LPUART instance. + */ +uint32_t LPUART_GetInstance(LPUART_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0U; instance < ARRAY_SIZE(s_lpuartBases); instance++) + { + if (s_lpuartBases[instance] == base) + { + return instance; + } + } +#if defined(LPUART_BASE_PTRS_NS) + /* Find the instance index from base address mappings. */ + for (instance = 0U; instance < ARRAY_SIZE(s_lpuartBases_ns); instance++) + { + if (s_lpuartBases_ns[instance] == base) + { + return instance; + } + } + assert(instance < ARRAY_SIZE(s_lpuartBases_ns)); +#else + assert(instance < ARRAY_SIZE(s_lpuartBases)); +#endif + + return instance; +} + +/*! + * brief Get the length of received data in RX ring buffer. + * + * userData handle LPUART handle pointer. + * return Length of received data in RX ring buffer. + */ +size_t LPUART_TransferGetRxRingBufferLength(LPUART_Type *base, lpuart_handle_t *handle) +{ + assert(NULL != handle); + + size_t size; + size_t tmpRxRingBufferSize = handle->rxRingBufferSize; + uint16_t tmpRxRingBufferTail = handle->rxRingBufferTail; + uint16_t tmpRxRingBufferHead = handle->rxRingBufferHead; + + if (tmpRxRingBufferTail > tmpRxRingBufferHead) + { + size = ((size_t)tmpRxRingBufferHead + tmpRxRingBufferSize - (size_t)tmpRxRingBufferTail); + } + else + { + size = ((size_t)tmpRxRingBufferHead - (size_t)tmpRxRingBufferTail); + } + + return size; +} + +static bool LPUART_TransferIsRxRingBufferFull(LPUART_Type *base, lpuart_handle_t *handle) +{ + assert(NULL != handle); + + bool full; + + if (LPUART_TransferGetRxRingBufferLength(base, handle) == (handle->rxRingBufferSize - 1U)) + { + full = true; + } + else + { + full = false; + } + return full; +} + +static void LPUART_WriteNonBlocking(LPUART_Type *base, const uint8_t *data, size_t length) +{ + assert(NULL != data); + + size_t i; + + /* The Non Blocking write data API assume user have ensured there is enough space in + peripheral to write. */ + for (i = 0; i < length; i++) + { + base->DATA = data[i]; + } +} +static void LPUART_WriteNonBlocking16bit(LPUART_Type *base, const uint16_t *data, size_t length) +{ + assert(NULL != data); + + size_t i; + + /* The Non Blocking write data API assume user have ensured there is enough space in + peripheral to write. */ + for (i = 0; i < length; i++) + { + base->DATA = data[i]; + } +} + +static void LPUART_ReadNonBlocking(LPUART_Type *base, uint8_t *data, size_t length) +{ + assert(NULL != data); + + size_t i; +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + uint32_t ctrl = base->CTRL; + bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || + (((ctrl & LPUART_CTRL_M_MASK) == 0U) && ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); +#endif + + /* The Non Blocking read data API assume user have ensured there is enough space in + peripheral to write. */ + for (i = 0; i < length; i++) + { +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + if (isSevenDataBits) + { + data[i] = (uint8_t)(base->DATA & 0x7FU); + } + else + { + data[i] = (uint8_t)base->DATA; + } +#else + data[i] = (uint8_t)(base->DATA); +#endif + } +} + +static void LPUART_ReadNonBlocking16bit(LPUART_Type *base, uint16_t *data, size_t length) +{ + assert(NULL != data); + + size_t i; + /* The Non Blocking read data API assume user have ensured there is enough space in + peripheral to write. */ + for (i = 0; i < length; i++) + { + data[i] = (uint16_t)(base->DATA & 0x03FFU); + } +} + +/*! + * brief Initializes an LPUART instance with the user configuration structure and the peripheral clock. + * + * This function configures the LPUART module with user-defined settings. Call the LPUART_GetDefaultConfig() function + * to configure the configuration structure and get the default configuration. + * The example below shows how to use this API to configure the LPUART. + * code + * lpuart_config_t lpuartConfig; + * lpuartConfig.baudRate_Bps = 115200U; + * lpuartConfig.parityMode = kLPUART_ParityDisabled; + * lpuartConfig.dataBitsCount = kLPUART_EightDataBits; + * lpuartConfig.isMsb = false; + * lpuartConfig.stopBitCount = kLPUART_OneStopBit; + * lpuartConfig.txFifoWatermark = 0; + * lpuartConfig.rxFifoWatermark = 1; + * LPUART_Init(LPUART1, &lpuartConfig, 20000000U); + * endcode + * + * param base LPUART peripheral base address. + * param config Pointer to a user-defined configuration structure. + * param srcClock_Hz LPUART clock source frequency in HZ. + * retval kStatus_LPUART_BaudrateNotSupport Baudrate is not support in current clock source. + * retval kStatus_Success LPUART initialize succeed + */ +status_t LPUART_Init(LPUART_Type *base, const lpuart_config_t *config, uint32_t srcClock_Hz) +{ + assert(NULL != config); + assert(0U < config->baudRate_Bps); +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + assert((uint8_t)FSL_FEATURE_LPUART_FIFO_SIZEn(base) > config->txFifoWatermark); + assert((uint8_t)FSL_FEATURE_LPUART_FIFO_SIZEn(base) > config->rxFifoWatermark); +#endif + + status_t status = kStatus_Success; + uint32_t temp; + uint16_t sbr, sbrTemp; + uint8_t osr, osrTemp; + uint32_t tempDiff, calculatedBaud, baudDiff; + + /* This LPUART instantiation uses a slightly different baud rate calculation + * The idea is to use the best OSR (over-sampling rate) possible + * Note, OSR is typically hard-set to 16 in other LPUART instantiations + * loop to find the best OSR value possible, one that generates minimum baudDiff + * iterate through the rest of the supported values of OSR */ + + baudDiff = config->baudRate_Bps; + osr = 0U; + sbr = 0U; + for (osrTemp = 4U; osrTemp <= 32U; osrTemp++) + { + /* calculate the temporary sbr value */ + sbrTemp = (uint16_t)((srcClock_Hz * 2U / (config->baudRate_Bps * (uint32_t)osrTemp) + 1U) / 2U); + /*set sbrTemp to 1 if the sourceClockInHz can not satisfy the desired baud rate*/ + if (sbrTemp == 0U) + { + sbrTemp = 1U; + } + else if (sbrTemp > LPUART_BAUD_SBR_MASK) + { + sbrTemp = LPUART_BAUD_SBR_MASK; + } + else + { + /* Avoid MISRA 15.7 */ + } + /* Calculate the baud rate based on the temporary OSR and SBR values */ + calculatedBaud = (srcClock_Hz / ((uint32_t)osrTemp * (uint32_t)sbrTemp)); + tempDiff = calculatedBaud > config->baudRate_Bps ? (calculatedBaud - config->baudRate_Bps) : + (config->baudRate_Bps - calculatedBaud); + + if (tempDiff <= baudDiff) + { + baudDiff = tempDiff; + osr = osrTemp; /* update and store the best OSR value calculated */ + sbr = sbrTemp; /* update store the best SBR value calculated */ + } + } + + /* Check to see if actual baud rate is within 3% of desired baud rate + * based on the best calculate OSR value */ + if (baudDiff > ((config->baudRate_Bps / 100U) * 3U)) + { + /* Unacceptable baud rate difference of more than 3%*/ + status = kStatus_LPUART_BaudrateNotSupport; + } + else + { +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + + uint32_t instance = LPUART_GetInstance(base); + + /* Enable lpuart clock */ + (void)CLOCK_EnableClock(s_lpuartClock[instance]); +#if defined(LPUART_PERIPH_CLOCKS) + (void)CLOCK_EnableClock(s_lpuartPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(LPUART_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_lpuartResets[LPUART_GetInstance(base)]); +#endif + +#if defined(FSL_FEATURE_LPUART_HAS_GLOBAL) && FSL_FEATURE_LPUART_HAS_GLOBAL + /*Reset all internal logic and registers, except the Global Register */ + LPUART_SoftwareReset(base); +#else + /* Disable LPUART TX RX before setting. */ + base->CTRL &= ~(LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); +#endif + + temp = base->BAUD; + + /* Acceptable baud rate, check if OSR is between 4x and 7x oversampling. + * If so, then "BOTHEDGE" sampling must be turned on */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_1$ + */ + if ((osr > 3U) && (osr < 8U)) + { + temp |= LPUART_BAUD_BOTHEDGE_MASK; + } + + /* program the osr value (bit value is one less than actual value) */ + temp &= ~LPUART_BAUD_OSR_MASK; + temp |= LPUART_BAUD_OSR((uint32_t)osr - 1UL); + + /* write the sbr value to the BAUD registers */ + temp &= ~LPUART_BAUD_SBR_MASK; + base->BAUD = temp | LPUART_BAUD_SBR(sbr); + + /* Set bit count and parity mode. */ + base->BAUD &= ~LPUART_BAUD_M10_MASK; + + temp = base->CTRL & ~(LPUART_CTRL_PE_MASK | LPUART_CTRL_PT_MASK | LPUART_CTRL_M_MASK | LPUART_CTRL_ILT_MASK | + LPUART_CTRL_IDLECFG_MASK); + + temp |= (uint8_t)config->parityMode | LPUART_CTRL_IDLECFG(config->rxIdleConfig) | + LPUART_CTRL_ILT(config->rxIdleType); + +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + if (kLPUART_SevenDataBits == config->dataBitsCount) + { + if (kLPUART_ParityDisabled != config->parityMode) + { + temp &= ~LPUART_CTRL_M7_MASK; /* Seven data bits and one parity bit */ + } + else + { + temp |= LPUART_CTRL_M7_MASK; + } + } + else +#endif + { + if (kLPUART_ParityDisabled != config->parityMode) + { + temp |= LPUART_CTRL_M_MASK; /* Eight data bits and one parity bit */ + } + } + + base->CTRL = temp; + +#if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT + /* set stop bit per char */ + temp = base->BAUD & ~LPUART_BAUD_SBNS_MASK; + base->BAUD = temp | LPUART_BAUD_SBNS((uint8_t)config->stopBitCount); +#endif + +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + /* Set tx/rx WATER watermark + Note: + Take care of the RX FIFO, RX interrupt request only assert when received bytes + equal or more than RX water mark, there is potential issue if RX water + mark larger than 1. + For example, if RX FIFO water mark is 2, upper layer needs 5 bytes and + 5 bytes are received. the last byte will be saved in FIFO but not trigger + RX interrupt because the water mark is 2. + */ + base->WATER = (((uint32_t)(config->rxFifoWatermark) << 16U) | config->txFifoWatermark); + + /* Enable tx/rx FIFO */ + base->FIFO |= (LPUART_FIFO_TXFE_MASK | LPUART_FIFO_RXFE_MASK); + + /* Flush FIFO */ + base->FIFO |= (LPUART_FIFO_TXFLUSH_MASK | LPUART_FIFO_RXFLUSH_MASK); +#endif + + /* Clear all status flags */ + temp = (LPUART_STAT_RXEDGIF_MASK | LPUART_STAT_IDLE_MASK | LPUART_STAT_OR_MASK | LPUART_STAT_NF_MASK | + LPUART_STAT_FE_MASK | LPUART_STAT_PF_MASK); + +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + temp |= LPUART_STAT_LBKDIF_MASK; +#endif + +#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING + temp |= (LPUART_STAT_MA1F_MASK | LPUART_STAT_MA2F_MASK); +#endif + +#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT + /* Set the CTS configuration/TX CTS source. */ + base->MODIR |= LPUART_MODIR_TXCTSC(config->txCtsConfig) | LPUART_MODIR_TXCTSSRC(config->txCtsSource); + if (true == config->enableRxRTS) + { + /* Enable the receiver RTS(request-to-send) function. */ + base->MODIR |= LPUART_MODIR_RXRTSE_MASK; + } + if (true == config->enableTxCTS) + { + /* Enable the CTS(clear-to-send) function. */ + base->MODIR |= LPUART_MODIR_TXCTSE_MASK; + } +#endif + + /* Set data bits order. */ + if (true == config->isMsb) + { + temp |= LPUART_STAT_MSBF_MASK; + } + else + { + temp &= ~LPUART_STAT_MSBF_MASK; + } + + base->STAT |= temp; + + /* Enable TX/RX base on configure structure. */ + temp = base->CTRL; + if (true == config->enableTx) + { + temp |= LPUART_CTRL_TE_MASK; + } + + if (true == config->enableRx) + { + temp |= LPUART_CTRL_RE_MASK; + } + + base->CTRL = temp; + } + + return status; +} +/*! + * brief Deinitializes a LPUART instance. + * + * This function waits for transmit to complete, disables TX and RX, and disables the LPUART clock. + * + * param base LPUART peripheral base address. + */ +void LPUART_Deinit(LPUART_Type *base) +{ + uint32_t temp; + +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + /* Wait tx FIFO send out*/ + while (0U != ((base->WATER & LPUART_WATER_TXCOUNT_MASK) >> LPUART_WATER_TXWATER_SHIFT)) + { + } +#endif + /* Wait last char shift out */ + while (0U == (base->STAT & LPUART_STAT_TC_MASK)) + { + } + + /* Clear all status flags */ + temp = (LPUART_STAT_RXEDGIF_MASK | LPUART_STAT_IDLE_MASK | LPUART_STAT_OR_MASK | LPUART_STAT_NF_MASK | + LPUART_STAT_FE_MASK | LPUART_STAT_PF_MASK); + +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + temp |= LPUART_STAT_LBKDIF_MASK; +#endif + +#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING + temp |= (LPUART_STAT_MA1F_MASK | LPUART_STAT_MA2F_MASK); +#endif + + base->STAT |= temp; + + /* Disable the module. */ + base->CTRL = 0U; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + uint32_t instance = LPUART_GetInstance(base); + + /* Disable lpuart clock */ + (void)CLOCK_DisableClock(s_lpuartClock[instance]); + +#if defined(LPUART_PERIPH_CLOCKS) + (void)CLOCK_DisableClock(s_lpuartPeriphClocks[instance]); +#endif + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * brief Gets the default configuration structure. + * + * This function initializes the LPUART configuration structure to a default value. The default + * values are: + * lpuartConfig->baudRate_Bps = 115200U; + * lpuartConfig->parityMode = kLPUART_ParityDisabled; + * lpuartConfig->dataBitsCount = kLPUART_EightDataBits; + * lpuartConfig->isMsb = false; + * lpuartConfig->stopBitCount = kLPUART_OneStopBit; + * lpuartConfig->txFifoWatermark = 0; + * lpuartConfig->rxFifoWatermark = 1; + * lpuartConfig->rxIdleType = kLPUART_IdleTypeStartBit; + * lpuartConfig->rxIdleConfig = kLPUART_IdleCharacter1; + * lpuartConfig->enableTx = false; + * lpuartConfig->enableRx = false; + * + * param config Pointer to a configuration structure. + */ +void LPUART_GetDefaultConfig(lpuart_config_t *config) +{ + assert(NULL != config); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + config->baudRate_Bps = 115200U; + config->parityMode = kLPUART_ParityDisabled; + config->dataBitsCount = kLPUART_EightDataBits; + config->isMsb = false; +#if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT + config->stopBitCount = kLPUART_OneStopBit; +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + config->txFifoWatermark = 0U; + config->rxFifoWatermark = 0U; +#endif +#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT + config->enableRxRTS = false; + config->enableTxCTS = false; + config->txCtsConfig = kLPUART_CtsSampleAtStart; + config->txCtsSource = kLPUART_CtsSourcePin; +#endif + config->rxIdleType = kLPUART_IdleTypeStartBit; + config->rxIdleConfig = kLPUART_IdleCharacter1; + config->enableTx = false; + config->enableRx = false; +} + +/*! + * brief Sets the LPUART instance baudrate. + * + * This function configures the LPUART module baudrate. This function is used to update + * the LPUART module baudrate after the LPUART module is initialized by the LPUART_Init. + * code + * LPUART_SetBaudRate(LPUART1, 115200U, 20000000U); + * endcode + * + * param base LPUART peripheral base address. + * param baudRate_Bps LPUART baudrate to be set. + * param srcClock_Hz LPUART clock source frequency in HZ. + * retval kStatus_LPUART_BaudrateNotSupport Baudrate is not supported in the current clock source. + * retval kStatus_Success Set baudrate succeeded. + */ +status_t LPUART_SetBaudRate(LPUART_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz) +{ + assert(0U < baudRate_Bps); + + status_t status = kStatus_Success; + uint32_t temp, oldCtrl; + uint16_t sbr, sbrTemp; + uint8_t osr, osrTemp; + uint32_t tempDiff, calculatedBaud, baudDiff; + + /* This LPUART instantiation uses a slightly different baud rate calculation + * The idea is to use the best OSR (over-sampling rate) possible + * Note, OSR is typically hard-set to 16 in other LPUART instantiations + * loop to find the best OSR value possible, one that generates minimum baudDiff + * iterate through the rest of the supported values of OSR */ + + baudDiff = baudRate_Bps; + osr = 0U; + sbr = 0U; + for (osrTemp = 4U; osrTemp <= 32U; osrTemp++) + { + /* calculate the temporary sbr value */ + sbrTemp = (uint16_t)((srcClock_Hz * 2U / (baudRate_Bps * (uint32_t)osrTemp) + 1U) / 2U); + /*set sbrTemp to 1 if the sourceClockInHz can not satisfy the desired baud rate*/ + if (sbrTemp == 0U) + { + sbrTemp = 1U; + } + else if (sbrTemp > LPUART_BAUD_SBR_MASK) + { + sbrTemp = LPUART_BAUD_SBR_MASK; + } + else + { + /* Avoid MISRA 15.7 */ + } + /* Calculate the baud rate based on the temporary OSR and SBR values */ + calculatedBaud = srcClock_Hz / ((uint32_t)osrTemp * (uint32_t)sbrTemp); + + tempDiff = calculatedBaud > baudRate_Bps ? (calculatedBaud - baudRate_Bps) : (baudRate_Bps - calculatedBaud); + + if (tempDiff <= baudDiff) + { + baudDiff = tempDiff; + osr = osrTemp; /* update and store the best OSR value calculated */ + sbr = sbrTemp; /* update store the best SBR value calculated */ + } + } + + /* Check to see if actual baud rate is within 3% of desired baud rate + * based on the best calculate OSR value */ + if (baudDiff < (uint32_t)((baudRate_Bps / 100U) * 3U)) + { + /* Store CTRL before disable Tx and Rx */ + oldCtrl = base->CTRL; + + /* Disable LPUART TX RX before setting. */ + base->CTRL &= ~(LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); + + temp = base->BAUD; + + /* Acceptable baud rate, check if OSR is between 4x and 7x oversampling. + * If so, then "BOTHEDGE" sampling must be turned on */ + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_1$ + */ + if ((osr > 3U) && (osr < 8U)) + { + temp |= LPUART_BAUD_BOTHEDGE_MASK; + } + + /* program the osr value (bit value is one less than actual value) */ + temp &= ~LPUART_BAUD_OSR_MASK; + temp |= LPUART_BAUD_OSR((uint32_t)osr - 1UL); + + /* write the sbr value to the BAUD registers */ + temp &= ~LPUART_BAUD_SBR_MASK; + base->BAUD = temp | LPUART_BAUD_SBR(sbr); + + /* Restore CTRL. */ + base->CTRL = oldCtrl; + } + else + { + /* Unacceptable baud rate difference of more than 3%*/ + status = kStatus_LPUART_BaudrateNotSupport; + } + + return status; +} + +/*! + * brief Enable 9-bit data mode for LPUART. + * + * This function set the 9-bit mode for LPUART module. The 9th bit is not used for parity thus can be modified by user. + * + * param base LPUART peripheral base address. + * param enable true to enable, flase to disable. + */ +void LPUART_Enable9bitMode(LPUART_Type *base, bool enable) +{ + assert(base != NULL); + + uint32_t temp = 0U; + + if (enable) + { + /* Set LPUART_CTRL_M for 9-bit mode, clear LPUART_CTRL_PE to disable parity. */ + temp = base->CTRL & ~((uint32_t)LPUART_CTRL_PE_MASK | (uint32_t)LPUART_CTRL_M_MASK); + temp |= (uint32_t)LPUART_CTRL_M_MASK; + base->CTRL = temp; + } + else + { + /* Clear LPUART_CTRL_M. */ + base->CTRL &= ~(uint32_t)LPUART_CTRL_M_MASK; + } +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + /* Clear LPUART_CTRL_M7 to disable 7-bit mode. */ + base->CTRL &= ~(uint32_t)LPUART_CTRL_M7_MASK; +#endif +#if defined(FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_10BIT_DATA_SUPPORT + /* Clear LPUART_BAUD_M10 to disable 10-bit mode. */ + base->BAUD &= ~(uint32_t)LPUART_BAUD_M10_MASK; +#endif +} + +/*! + * brief Transmit an address frame in 9-bit data mode. + * + * param base LPUART peripheral base address. + * param address LPUART slave address. + */ +void LPUART_SendAddress(LPUART_Type *base, uint8_t address) +{ + assert(base != NULL); + + uint32_t temp = base->DATA & 0xFFFFFC00UL; + temp |= ((uint32_t)address | (1UL << LPUART_DATA_R8T8_SHIFT)); + base->DATA = temp; +} + +/*! + * brief Enables LPUART interrupts according to a provided mask. + * + * This function enables the LPUART interrupts according to a provided mask. The mask + * is a logical OR of enumeration members. See the ref _lpuart_interrupt_enable. + * This examples shows how to enable TX empty interrupt and RX full interrupt: + * code + * LPUART_EnableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); + * endcode + * + * param base LPUART peripheral base address. + * param mask The interrupts to enable. Logical OR of ref _lpuart_interrupt_enable. + */ +void LPUART_EnableInterrupts(LPUART_Type *base, uint32_t mask) +{ + uint32_t s_atomicOldInt; + /* Only consider the real interrupt enable bits. */ + mask &= (uint32_t)kLPUART_AllInterruptEnable; + + /* Check int enable bits in base->BAUD */ + uint32_t baudRegMask = 0UL; +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + baudRegMask |= ((mask << 8U) & LPUART_BAUD_LBKDIE_MASK); + /* Clear bit 7 from mask */ + mask &= ~(uint32_t)kLPUART_LinBreakInterruptEnable; +#endif + baudRegMask |= ((mask << 8U) & LPUART_BAUD_RXEDGIE_MASK); + /* Clear bit 6 from mask */ + mask &= ~(uint32_t)kLPUART_RxActiveEdgeInterruptEnable; + + s_atomicOldInt = DisableGlobalIRQ(); + base->BAUD |= baudRegMask; + EnableGlobalIRQ(s_atomicOldInt); + +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + /* Check int enable bits in base->FIFO */ + + s_atomicOldInt = DisableGlobalIRQ(); + base->FIFO = (base->FIFO & ~(LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK)) | + (mask & (LPUART_FIFO_TXOFE_MASK | LPUART_FIFO_RXUFE_MASK)); + EnableGlobalIRQ(s_atomicOldInt); + + /* Clear bit 9 and bit 8 from mask */ + mask &= ~((uint32_t)kLPUART_TxFifoOverflowInterruptEnable | (uint32_t)kLPUART_RxFifoUnderflowInterruptEnable); +#endif + + /* Set int enable bits in base->CTRL */ + s_atomicOldInt = DisableGlobalIRQ(); + base->CTRL |= mask; + EnableGlobalIRQ(s_atomicOldInt); +} + +/*! + * brief Disables LPUART interrupts according to a provided mask. + * + * This function disables the LPUART interrupts according to a provided mask. The mask + * is a logical OR of enumeration members. See ref _lpuart_interrupt_enable. + * This example shows how to disable the TX empty interrupt and RX full interrupt: + * code + * LPUART_DisableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); + * endcode + * + * param base LPUART peripheral base address. + * param mask The interrupts to disable. Logical OR of ref _lpuart_interrupt_enable. + */ +void LPUART_DisableInterrupts(LPUART_Type *base, uint32_t mask) +{ + uint32_t s_atomicOldInt; + /* Only consider the real interrupt enable bits. */ + mask &= (uint32_t)kLPUART_AllInterruptEnable; + + /* Clear int enable bits in base->BAUD */ + uint32_t baudRegMask = 0UL; +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + baudRegMask |= ((mask << 8U) & LPUART_BAUD_LBKDIE_MASK); + /* Clear bit 7 from mask */ + mask &= ~(uint32_t)kLPUART_LinBreakInterruptEnable; +#endif + baudRegMask |= ((mask << 8U) & LPUART_BAUD_RXEDGIE_MASK); + /* Clear bit 6 from mask */ + mask &= ~(uint32_t)kLPUART_RxActiveEdgeInterruptEnable; + + s_atomicOldInt = DisableGlobalIRQ(); + base->BAUD &= ~baudRegMask; + EnableGlobalIRQ(s_atomicOldInt); + +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + /* Clear int enable bits in base->FIFO */ + + s_atomicOldInt = DisableGlobalIRQ(); + base->FIFO = (base->FIFO & ~(LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK)) & + ~(mask & (LPUART_FIFO_TXOFE_MASK | LPUART_FIFO_RXUFE_MASK)); + EnableGlobalIRQ(s_atomicOldInt); + /* Clear bit 9 and bit 8 from mask */ + mask &= ~((uint32_t)kLPUART_TxFifoOverflowInterruptEnable | (uint32_t)kLPUART_RxFifoUnderflowInterruptEnable); +#endif + + /* Clear int enable bits in base->CTRL */ + s_atomicOldInt = DisableGlobalIRQ(); + base->CTRL &= ~mask; + EnableGlobalIRQ(s_atomicOldInt); +} + +/*! + * brief Gets enabled LPUART interrupts. + * + * This function gets the enabled LPUART interrupts. The enabled interrupts are returned + * as the logical OR value of the enumerators ref _lpuart_interrupt_enable. To check + * a specific interrupt enable status, compare the return value with enumerators + * in ref _lpuart_interrupt_enable. + * For example, to check whether the TX empty interrupt is enabled: + * code + * uint32_t enabledInterrupts = LPUART_GetEnabledInterrupts(LPUART1); + * + * if (kLPUART_TxDataRegEmptyInterruptEnable & enabledInterrupts) + * { + * ... + * } + * endcode + * + * param base LPUART peripheral base address. + * return LPUART interrupt flags which are logical OR of the enumerators in ref _lpuart_interrupt_enable. + */ +uint32_t LPUART_GetEnabledInterrupts(LPUART_Type *base) +{ + /* Check int enable bits in base->CTRL */ + uint32_t temp = (uint32_t)(base->CTRL & (uint32_t)kLPUART_AllInterruptEnable); + + /* Check int enable bits in base->BAUD */ + temp = (temp & ~(uint32_t)kLPUART_RxActiveEdgeInterruptEnable) | ((base->BAUD & LPUART_BAUD_RXEDGIE_MASK) >> 8U); +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + temp = (temp & ~(uint32_t)kLPUART_LinBreakInterruptEnable) | ((base->BAUD & LPUART_BAUD_LBKDIE_MASK) >> 8U); +#endif + +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + /* Check int enable bits in base->FIFO */ + temp = + (temp & ~((uint32_t)kLPUART_TxFifoOverflowInterruptEnable | (uint32_t)kLPUART_RxFifoUnderflowInterruptEnable)) | + (base->FIFO & (LPUART_FIFO_TXOFE_MASK | LPUART_FIFO_RXUFE_MASK)); +#endif + + return temp; +} + +/*! + * brief Gets LPUART status flags. + * + * This function gets all LPUART status flags. The flags are returned as the logical + * OR value of the enumerators ref _lpuart_flags. To check for a specific status, + * compare the return value with enumerators in the ref _lpuart_flags. + * For example, to check whether the TX is empty: + * code + * if (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(LPUART1)) + * { + * ... + * } + * endcode + * + * param base LPUART peripheral base address. + * return LPUART status flags which are ORed by the enumerators in the _lpuart_flags. + */ +uint32_t LPUART_GetStatusFlags(LPUART_Type *base) +{ + uint32_t temp; + temp = base->STAT; +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + temp |= (base->FIFO & + (LPUART_FIFO_TXEMPT_MASK | LPUART_FIFO_RXEMPT_MASK | LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK)) >> + 16U; +#endif + /* Only keeps the status bits */ + temp &= (uint32_t)kLPUART_AllFlags; + return temp; +} + +/*! + * brief Clears status flags with a provided mask. + * + * This function clears LPUART status flags with a provided mask. Automatically cleared flags + * can't be cleared by this function. + * Flags that can only cleared or set by hardware are: + * kLPUART_TxDataRegEmptyFlag, kLPUART_TransmissionCompleteFlag, kLPUART_RxDataRegFullFlag, + * kLPUART_RxActiveFlag, kLPUART_NoiseErrorFlag, kLPUART_ParityErrorFlag, + * kLPUART_TxFifoEmptyFlag,kLPUART_RxFifoEmptyFlag + * Note: This API should be called when the Tx/Rx is idle, otherwise it takes no effects. + * + * param base LPUART peripheral base address. + * param mask the status flags to be cleared. The user can use the enumerators in the + * _lpuart_status_flag_t to do the OR operation and get the mask. + * return 0 succeed, others failed. + * retval kStatus_LPUART_FlagCannotClearManually The flag can't be cleared by this function but + * it is cleared automatically by hardware. + * retval kStatus_Success Status in the mask are cleared. + */ +status_t LPUART_ClearStatusFlags(LPUART_Type *base, uint32_t mask) +{ + uint32_t temp; + status_t status; + + /* Only deal with the clearable flags */ + mask &= (uint32_t)kLPUART_AllClearFlags; +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + /* Status bits in FIFO register */ + if ((mask & ((uint32_t)kLPUART_TxFifoOverflowFlag | (uint32_t)kLPUART_RxFifoUnderflowFlag)) != 0U) + { + /* Get the FIFO register value and mask the rx/tx FIFO flush bits and the status bits that can be W1C in case + they are written 1 accidentally. */ + temp = (uint32_t)base->FIFO; + temp &= (uint32_t)(~(LPUART_FIFO_TXFLUSH_MASK | LPUART_FIFO_RXFLUSH_MASK | LPUART_FIFO_TXOF_MASK | + LPUART_FIFO_RXUF_MASK)); + temp |= (mask << 16U) & (LPUART_FIFO_TXOF_MASK | LPUART_FIFO_RXUF_MASK); + base->FIFO = temp; + } +#endif + /* Status bits in STAT register */ + /* First get the STAT register value and mask all the bits that not represent status, then OR with the status bit + * that is to be W1C */ + temp = (base->STAT & 0x3E000000UL) | mask; + base->STAT = temp; + /* If some flags still pending. */ + if (0U != (mask & LPUART_GetStatusFlags(base))) + { + status = kStatus_LPUART_FlagCannotClearManually; + } + else + { + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Writes to the transmitter register using a blocking method. + * + * This function polls the transmitter register, first waits for the register to be empty or TX FIFO to have room, + * and writes data to the transmitter buffer, then waits for the data to be sent out to bus. + * + * param base LPUART peripheral base address. + * param data Start address of the data to write. + * param length Size of the data to write. + * retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * retval kStatus_Success Successfully wrote all data. + */ +status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length) +{ + assert(NULL != data); + + const uint8_t *dataAddress = data; + size_t transferSize = length; + +#if UART_RETRY_TIMES + uint32_t waitTimes; +#endif + + while (0U != transferSize) + { +#if UART_RETRY_TIMES + waitTimes = UART_RETRY_TIMES; + while ((0U == (base->STAT & LPUART_STAT_TDRE_MASK)) && (0U != --waitTimes)) +#else + while (0U == (base->STAT & LPUART_STAT_TDRE_MASK)) +#endif + { + } +#if UART_RETRY_TIMES + if (0U == waitTimes) + { + return kStatus_LPUART_Timeout; + } +#endif + base->DATA = *(dataAddress); + dataAddress++; + transferSize--; + } + /* Ensure all the data in the transmit buffer are sent out to bus. */ +#if UART_RETRY_TIMES + waitTimes = UART_RETRY_TIMES; + while ((0U == (base->STAT & LPUART_STAT_TC_MASK)) && (0U != --waitTimes)) +#else + while (0U == (base->STAT & LPUART_STAT_TC_MASK)) +#endif + { + } +#if UART_RETRY_TIMES + if (0U == waitTimes) + { + return kStatus_LPUART_Timeout; + } +#endif + return kStatus_Success; +} +/*! + * brief Writes to the transmitter register using a blocking method in 9bit or 10bit mode. + * + * note This function only support 9bit or 10bit transfer. + * Please make sure only 10bit of data is valid and other bits are 0. + * + * param base LPUART peripheral base address. + * param data Start address of the data to write. + * param length Size of the data to write. + * retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * retval kStatus_Success Successfully wrote all data. + */ +status_t LPUART_WriteBlocking16bit(LPUART_Type *base, const uint16_t *data, size_t length) +{ + assert(NULL != data); + + const uint16_t *dataAddress = data; + size_t transferSize = length; + +#if UART_RETRY_TIMES + uint32_t waitTimes; +#endif + + while (0U != transferSize) + { +#if UART_RETRY_TIMES + waitTimes = UART_RETRY_TIMES; + while ((0U == (base->STAT & LPUART_STAT_TDRE_MASK)) && (0U != --waitTimes)) +#else + while (0U == (base->STAT & LPUART_STAT_TDRE_MASK)) +#endif + { + } +#if UART_RETRY_TIMES + if (0U == waitTimes) + { + return kStatus_LPUART_Timeout; + } +#endif + base->DATA = *(dataAddress); + dataAddress++; + transferSize--; + } + /* Ensure all the data in the transmit buffer are sent out to bus. */ +#if UART_RETRY_TIMES + waitTimes = UART_RETRY_TIMES; + while ((0U == (base->STAT & LPUART_STAT_TC_MASK)) && (0U != --waitTimes)) +#else + while (0U == (base->STAT & LPUART_STAT_TC_MASK)) +#endif + { + } +#if UART_RETRY_TIMES + if (0U == waitTimes) + { + return kStatus_LPUART_Timeout; + } +#endif + return kStatus_Success; +} + +/*! + * brief Reads the receiver data register using a blocking method. + * + * This function polls the receiver register, waits for the receiver register full or receiver FIFO + * has data, and reads data from the TX register. + * + * param base LPUART peripheral base address. + * param data Start address of the buffer to store the received data. + * param length Size of the buffer. + * retval kStatus_LPUART_RxHardwareOverrun Receiver overrun happened while receiving data. + * retval kStatus_LPUART_NoiseError Noise error happened while receiving data. + * retval kStatus_LPUART_FramingError Framing error happened while receiving data. + * retval kStatus_LPUART_ParityError Parity error happened while receiving data. + * retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * retval kStatus_Success Successfully received all data. + */ +status_t LPUART_ReadBlocking(LPUART_Type *base, uint8_t *data, size_t length) +{ + assert(NULL != data); + + status_t status = kStatus_Success; + uint32_t statusFlag; + uint8_t *dataAddress = data; + +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + uint32_t ctrl = base->CTRL; + bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || + (((ctrl & LPUART_CTRL_M_MASK) == 0U) && ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); +#endif + +#if UART_RETRY_TIMES + uint32_t waitTimes; +#endif + + while (0U != (length--)) + { +#if UART_RETRY_TIMES + waitTimes = UART_RETRY_TIMES; +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + while (0U == ((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT)) +#else + while (0U == (base->STAT & LPUART_STAT_RDRF_MASK)) +#endif + { +#if UART_RETRY_TIMES + if (0U == --waitTimes) + { + status = kStatus_LPUART_Timeout; + break; + } +#endif + statusFlag = LPUART_GetStatusFlags(base); + + if (0U != (statusFlag & (uint32_t)kLPUART_RxOverrunFlag)) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_2$. + */ + status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_RxOverrunFlag)) ? + (kStatus_LPUART_RxHardwareOverrun) : + (kStatus_LPUART_FlagCannotClearManually)); + /* Other error flags(FE, NF, and PF) are prevented from setting once OR is set, no need to check other + * error flags*/ + break; + } + + if (0U != (statusFlag & (uint32_t)kLPUART_ParityErrorFlag)) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_2$. + */ + status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_ParityErrorFlag)) ? + (kStatus_LPUART_ParityError) : + (kStatus_LPUART_FlagCannotClearManually)); + } + + if (0U != (statusFlag & (uint32_t)kLPUART_FramingErrorFlag)) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_2$. + */ + status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_FramingErrorFlag)) ? + (kStatus_LPUART_FramingError) : + (kStatus_LPUART_FlagCannotClearManually)); + } + + if (0U != (statusFlag & (uint32_t)kLPUART_NoiseErrorFlag)) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_2$. + */ + status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_NoiseErrorFlag)) ? + (kStatus_LPUART_NoiseError) : + (kStatus_LPUART_FlagCannotClearManually)); + } + if (kStatus_Success != status) + { + break; + } + } + + if (kStatus_Success == status) + { +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + if (isSevenDataBits) + { + *(dataAddress) = (uint8_t)(base->DATA & 0x7FU); + dataAddress++; + } + else + { + *(dataAddress) = (uint8_t)base->DATA; + dataAddress++; + } +#else + *(dataAddress) = (uint8_t)base->DATA; + dataAddress++; +#endif + } + else + { + break; + } + } + + return status; +} +/*! + * brief Reads the receiver data register in 9bit or 10bit mode. + * + * note This function only support 9bit or 10bit transfer. + * + * param base LPUART peripheral base address. + * param data Start address of the buffer to store the received data by 16bit, only 10bit is valid. + * param length Size of the buffer. + * retval kStatus_LPUART_RxHardwareOverrun Receiver overrun happened while receiving data. + * retval kStatus_LPUART_NoiseError Noise error happened while receiving data. + * retval kStatus_LPUART_FramingError Framing error happened while receiving data. + * retval kStatus_LPUART_ParityError Parity error happened while receiving data. + * retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * retval kStatus_Success Successfully received all data. + */ +status_t LPUART_ReadBlocking16bit(LPUART_Type *base, uint16_t *data, size_t length) +{ + assert(NULL != data); + + status_t status = kStatus_Success; + uint32_t statusFlag; + uint16_t *dataAddress = data; + +#if UART_RETRY_TIMES + uint32_t waitTimes; +#endif + + while (0U != (length--)) + { +#if UART_RETRY_TIMES + waitTimes = UART_RETRY_TIMES; +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + while (0U == ((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT)) +#else + while (0U == (base->STAT & LPUART_STAT_RDRF_MASK)) +#endif + { +#if UART_RETRY_TIMES + if (0U == --waitTimes) + { + status = kStatus_LPUART_Timeout; + break; + } +#endif + statusFlag = LPUART_GetStatusFlags(base); + + if (0U != (statusFlag & (uint32_t)kLPUART_RxOverrunFlag)) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_2$. + */ + status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_RxOverrunFlag)) ? + (kStatus_LPUART_RxHardwareOverrun) : + (kStatus_LPUART_FlagCannotClearManually)); + /* Other error flags(FE, NF, and PF) are prevented from setting once OR is set, no need to check other + * error flags*/ + break; + } + + if (0U != (statusFlag & (uint32_t)kLPUART_ParityErrorFlag)) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_2$. + */ + status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_ParityErrorFlag)) ? + (kStatus_LPUART_ParityError) : + (kStatus_LPUART_FlagCannotClearManually)); + } + + if (0U != (statusFlag & (uint32_t)kLPUART_FramingErrorFlag)) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_2$. + */ + status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_FramingErrorFlag)) ? + (kStatus_LPUART_FramingError) : + (kStatus_LPUART_FlagCannotClearManually)); + } + + if (0U != (statusFlag & (uint32_t)kLPUART_NoiseErrorFlag)) + { + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_c_ref_2$. + */ + status = ((kStatus_Success == LPUART_ClearStatusFlags(base, (uint32_t)kLPUART_NoiseErrorFlag)) ? + (kStatus_LPUART_NoiseError) : + (kStatus_LPUART_FlagCannotClearManually)); + } + if (kStatus_Success != status) + { + break; + } + } + if (kStatus_Success == status) + { + *(dataAddress) = (uint16_t)(base->DATA & 0x03FFU); + dataAddress++; + } + else + { + break; + } + } + + return status; +} + +/*! + * brief Initializes the LPUART handle. + * + * This function initializes the LPUART handle, which can be used for other LPUART + * transactional APIs. Usually, for a specified LPUART instance, + * call this API once to get the initialized handle. + * + * The LPUART driver supports the "background" receiving, which means that user can set up + * an RX ring buffer optionally. Data received is stored into the ring buffer even when the + * user doesn't call the LPUART_TransferReceiveNonBlocking() API. If there is already data received + * in the ring buffer, the user can get the received data from the ring buffer directly. + * The ring buffer is disabled if passing NULL as p ringBuffer. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param callback Callback function. + * param userData User data. + */ +void LPUART_TransferCreateHandle(LPUART_Type *base, + lpuart_handle_t *handle, + lpuart_transfer_callback_t callback, + void *userData) +{ + assert(NULL != handle); + + uint32_t instance; + +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + uint32_t ctrl = base->CTRL; + bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || + (((ctrl & LPUART_CTRL_M_MASK) == 0U) && ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); +#endif + + /* Zero the handle. */ + (void)memset(handle, 0, sizeof(lpuart_handle_t)); + + /* Set the TX/RX state. */ + handle->rxState = (uint8_t)kLPUART_RxIdle; + handle->txState = (uint8_t)kLPUART_TxIdle; + + /* Set the callback and user data. */ + handle->callback = callback; + handle->userData = userData; + +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + /* Initial seven data bits flag */ + handle->isSevenDataBits = isSevenDataBits; +#endif + handle->is16bitData = false; + + /* Get instance from peripheral base address. */ + instance = LPUART_GetInstance(base); + + /* Save the handle in global variables to support the double weak mechanism. */ + s_lpuartHandle[instance] = handle; + + s_lpuartIsr[instance] = LPUART_TransferHandleIRQ; + +/* Enable interrupt in NVIC. */ +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ + (void)EnableIRQ(s_lpuartRxIRQ[instance]); + (void)EnableIRQ(s_lpuartTxIRQ[instance]); +#else + (void)EnableIRQ(s_lpuartIRQ[instance]); +#endif +} + +/*! + * brief Sets up the RX ring buffer. + * + * This function sets up the RX ring buffer to a specific UART handle. + * + * When the RX ring buffer is used, data received is stored into the ring buffer even when + * the user doesn't call the UART_TransferReceiveNonBlocking() API. If there is already data received + * in the ring buffer, the user can get the received data from the ring buffer directly. + * + * note When using RX ring buffer, one byte is reserved for internal use. In other + * words, if p ringBufferSize is 32, then only 31 bytes are used for saving data. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. + * param ringBufferSize size of the ring buffer. + */ +void LPUART_TransferStartRingBuffer(LPUART_Type *base, + lpuart_handle_t *handle, + uint8_t *ringBuffer, + size_t ringBufferSize) +{ + assert(NULL != handle); + assert(NULL != ringBuffer); + + /* Setup the ring buffer address */ + handle->rxRingBuffer = ringBuffer; + if (!handle->is16bitData) + { + handle->rxRingBufferSize = ringBufferSize; + } + else + { + handle->rxRingBufferSize = ringBufferSize / 2U; + } + handle->rxRingBufferHead = 0U; + handle->rxRingBufferTail = 0U; + + /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. */ + uint32_t irqMask = DisableGlobalIRQ(); + /* Enable the interrupt to accept the data when user need the ring buffer. */ + base->CTRL |= (uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK); + EnableGlobalIRQ(irqMask); +} + +/*! + * brief Aborts the background transfer and uninstalls the ring buffer. + * + * This function aborts the background transfer and uninstalls the ring buffer. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + */ +void LPUART_TransferStopRingBuffer(LPUART_Type *base, lpuart_handle_t *handle) +{ + assert(NULL != handle); + + if (handle->rxState == (uint8_t)kLPUART_RxIdle) + { + /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. + */ + uint32_t irqMask = DisableGlobalIRQ(); + base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK); + EnableGlobalIRQ(irqMask); + } + + handle->rxRingBuffer = NULL; + handle->rxRingBufferSize = 0U; + handle->rxRingBufferHead = 0U; + handle->rxRingBufferTail = 0U; +} + +/*! + * brief Transmits a buffer of data using the interrupt method. + * + * This function send data using an interrupt method. This is a non-blocking function, which + * returns directly without waiting for all data written to the transmitter register. When + * all data is written to the TX register in the ISR, the LPUART driver calls the callback + * function and passes the ref kStatus_LPUART_TxIdle as status parameter. + * + * note The kStatus_LPUART_TxIdle is passed to the upper layer when all data are written + * to the TX register. However, there is no check to ensure that all the data sent out. Before disabling the TX, + * check the kLPUART_TransmissionCompleteFlag to ensure that the transmit is finished. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param xfer LPUART transfer structure, see #lpuart_transfer_t. + * retval kStatus_Success Successfully start the data transmission. + * retval kStatus_LPUART_TxBusy Previous transmission still not finished, data not all written to the TX register. + * retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_TransferSendNonBlocking(LPUART_Type *base, lpuart_handle_t *handle, lpuart_transfer_t *xfer) +{ + assert(NULL != handle); + assert(NULL != xfer); + assert(NULL != xfer->txData); + assert(0U != xfer->dataSize); + + status_t status; + + /* Return error if current TX busy. */ + if ((uint8_t)kLPUART_TxBusy == handle->txState) + { + status = kStatus_LPUART_TxBusy; + } + else + { + if (!handle->is16bitData) + { + handle->txData = xfer->txData; + } + else + { + handle->txData16 = xfer->txData16; + } + handle->txDataSize = xfer->dataSize; + handle->txDataSizeAll = xfer->dataSize; + handle->txState = (uint8_t)kLPUART_TxBusy; + + /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. + */ + uint32_t irqMask = DisableGlobalIRQ(); + /* Enable transmitter interrupt. */ + base->CTRL |= (uint32_t)LPUART_CTRL_TIE_MASK; + EnableGlobalIRQ(irqMask); + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Aborts the interrupt-driven data transmit. + * + * This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out + * how many bytes are not sent out. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + */ +void LPUART_TransferAbortSend(LPUART_Type *base, lpuart_handle_t *handle) +{ + assert(NULL != handle); + + /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. */ + uint32_t irqMask = DisableGlobalIRQ(); + base->CTRL &= ~(uint32_t)(LPUART_CTRL_TIE_MASK | LPUART_CTRL_TCIE_MASK); + EnableGlobalIRQ(irqMask); + + handle->txDataSize = 0; + handle->txState = (uint8_t)kLPUART_TxIdle; +} + +/*! + * brief Gets the number of bytes that have been sent out to bus. + * + * This function gets the number of bytes that have been sent out to bus by an interrupt method. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param count Send bytes count. + * retval kStatus_NoTransferInProgress No send in progress. + * retval kStatus_InvalidArgument Parameter is invalid. + * retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetSendCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count) +{ + assert(NULL != handle); + assert(NULL != count); + + status_t status = kStatus_Success; + size_t tmptxDataSize = handle->txDataSize; + + if ((uint8_t)kLPUART_TxIdle == handle->txState) + { + status = kStatus_NoTransferInProgress; + } + else + { +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + *count = handle->txDataSizeAll - tmptxDataSize - + ((base->WATER & LPUART_WATER_TXCOUNT_MASK) >> LPUART_WATER_TXCOUNT_SHIFT); +#else + if ((base->STAT & (uint32_t)kLPUART_TxDataRegEmptyFlag) != 0U) + { + *count = handle->txDataSizeAll - tmptxDataSize; + } + else + { + *count = handle->txDataSizeAll - tmptxDataSize - 1U; + } +#endif + } + + return status; +} + +/*! + * brief Receives a buffer of data using the interrupt method. + * + * This function receives data using an interrupt method. This is a non-blocking function + * which returns without waiting to ensure that all data are received. + * If the RX ring buffer is used and not empty, the data in the ring buffer is copied and + * the parameter p receivedBytes shows how many bytes are copied from the ring buffer. + * After copying, if the data in the ring buffer is not enough for read, the receive + * request is saved by the LPUART driver. When the new data arrives, the receive request + * is serviced first. When all data is received, the LPUART driver notifies the upper layer + * through a callback function and passes a status parameter ref kStatus_UART_RxIdle. + * For example, the upper layer needs 10 bytes but there are only 5 bytes in ring buffer. + * The 5 bytes are copied to xfer->data, which returns with the + * parameter p receivedBytes set to 5. For the remaining 5 bytes, the newly arrived data is + * saved from xfer->data[5]. When 5 bytes are received, the LPUART driver notifies the upper layer. + * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt + * to receive data to xfer->data. When all data is received, the upper layer is notified. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param xfer LPUART transfer structure, see #uart_transfer_t. + * param receivedBytes Bytes received from the ring buffer directly. + * retval kStatus_Success Successfully queue the transfer into the transmit queue. + * retval kStatus_LPUART_RxBusy Previous receive request is not finished. + * retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_TransferReceiveNonBlocking(LPUART_Type *base, + lpuart_handle_t *handle, + lpuart_transfer_t *xfer, + size_t *receivedBytes) +{ + assert(NULL != handle); + assert(NULL != xfer); + assert(NULL != xfer->rxData); + assert(0U != xfer->dataSize); + + uint32_t i; + status_t status; + uint32_t irqMask; + /* How many bytes to copy from ring buffer to user memory. */ + size_t bytesToCopy = 0U; + /* How many bytes to receive. */ + size_t bytesToReceive; + /* How many bytes currently have received. */ + size_t bytesCurrentReceived; + + /* How to get data: + 1. If RX ring buffer is not enabled, then save xfer->data and xfer->dataSize + to lpuart handle, enable interrupt to store received data to xfer->data. When + all data received, trigger callback. + 2. If RX ring buffer is enabled and not empty, get data from ring buffer first. + If there are enough data in ring buffer, copy them to xfer->data and return. + If there are not enough data in ring buffer, copy all of them to xfer->data, + save the xfer->data remained empty space to lpuart handle, receive data + to this empty space and trigger callback when finished. */ + + if ((uint8_t)kLPUART_RxBusy == handle->rxState) + { + status = kStatus_LPUART_RxBusy; + } + else + { + bytesToReceive = xfer->dataSize; + bytesCurrentReceived = 0; + + /* If RX ring buffer is used. */ + if (NULL != handle->rxRingBuffer) + { + /* Disable and re-enable the global interrupt to protect the interrupt enable register during + * read-modify-wrte. */ + irqMask = DisableGlobalIRQ(); + /* Disable LPUART RX IRQ, protect ring buffer. */ + base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK); + EnableGlobalIRQ(irqMask); + + /* How many bytes in RX ring buffer currently. */ + bytesToCopy = LPUART_TransferGetRxRingBufferLength(base, handle); + + if (0U != bytesToCopy) + { + bytesToCopy = MIN(bytesToReceive, bytesToCopy); + + bytesToReceive -= bytesToCopy; + + /* Copy data from ring buffer to user memory. */ + for (i = 0U; i < bytesToCopy; i++) + { + if (!handle->is16bitData) + { + xfer->rxData[bytesCurrentReceived] = handle->rxRingBuffer[handle->rxRingBufferTail]; + } + else + { + xfer->rxData16[bytesCurrentReceived] = handle->rxRingBuffer16[handle->rxRingBufferTail]; + } + bytesCurrentReceived++; + + /* Wrap to 0. Not use modulo (%) because it might be large and slow. */ + if (((uint32_t)handle->rxRingBufferTail + 1U) == handle->rxRingBufferSize) + { + handle->rxRingBufferTail = 0U; + } + else + { + handle->rxRingBufferTail++; + } + } + } + + /* If ring buffer does not have enough data, still need to read more data. */ + if (0U != bytesToReceive) + { + /* No data in ring buffer, save the request to LPUART handle. */ + + if (!handle->is16bitData) + { + handle->rxData = &xfer->rxData[bytesCurrentReceived]; + } + else + { + handle->rxData16 = &xfer->rxData16[bytesCurrentReceived]; + } + handle->rxDataSize = bytesToReceive; + handle->rxDataSizeAll = xfer->dataSize; + handle->rxState = (uint8_t)kLPUART_RxBusy; + } + + /* Disable and re-enable the global interrupt to protect the interrupt enable register during + * read-modify-wrte. */ + irqMask = DisableGlobalIRQ(); + /* Re-enable LPUART RX IRQ. */ + base->CTRL |= (uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK); + EnableGlobalIRQ(irqMask); + + /* Call user callback since all data are received. */ + if (0U == bytesToReceive) + { + if (NULL != handle->callback) + { + handle->callback(base, handle, kStatus_LPUART_RxIdle, handle->userData); + } + } + } + /* Ring buffer not used. */ + else + { + if (!handle->is16bitData) + { + handle->rxData = &xfer->rxData[bytesCurrentReceived]; + } + else + { + handle->rxData16 = &xfer->rxData16[bytesCurrentReceived]; + } + handle->rxDataSize = bytesToReceive; + handle->rxDataSizeAll = bytesToReceive; + handle->rxState = (uint8_t)kLPUART_RxBusy; + + /* Disable and re-enable the global interrupt to protect the interrupt enable register during + * read-modify-wrte. */ + irqMask = DisableGlobalIRQ(); + /* Enable RX interrupt. */ + base->CTRL |= (uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ILIE_MASK | LPUART_CTRL_ORIE_MASK); + EnableGlobalIRQ(irqMask); + } + + /* Return the how many bytes have read. */ + if (NULL != receivedBytes) + { + *receivedBytes = bytesCurrentReceived; + } + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Aborts the interrupt-driven data receiving. + * + * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out + * how many bytes not received yet. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + */ +void LPUART_TransferAbortReceive(LPUART_Type *base, lpuart_handle_t *handle) +{ + assert(NULL != handle); + + /* Only abort the receive to handle->rxData, the RX ring buffer is still working. */ + if (NULL == handle->rxRingBuffer) + { + /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. + */ + uint32_t irqMask = DisableGlobalIRQ(); + /* Disable RX interrupt. */ + base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ILIE_MASK | LPUART_CTRL_ORIE_MASK); + EnableGlobalIRQ(irqMask); + } + + handle->rxDataSize = 0U; + handle->rxState = (uint8_t)kLPUART_RxIdle; +} + +/*! + * brief Gets the number of bytes that have been received. + * + * This function gets the number of bytes that have been received. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param count Receive bytes count. + * retval kStatus_NoTransferInProgress No receive in progress. + * retval kStatus_InvalidArgument Parameter is invalid. + * retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetReceiveCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count) +{ + assert(NULL != handle); + assert(NULL != count); + + status_t status = kStatus_Success; + size_t tmprxDataSize = handle->rxDataSize; + + if ((uint8_t)kLPUART_RxIdle == handle->rxState) + { + status = kStatus_NoTransferInProgress; + } + else + { + *count = handle->rxDataSizeAll - tmprxDataSize; + } + + return status; +} + +static void LPUART_TransferHandleIDLEReady(LPUART_Type *base, lpuart_handle_t *handle) +{ + uint32_t irqMask; +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + uint8_t count; + uint8_t tempCount; + count = ((uint8_t)((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT)); + + while ((0U != handle->rxDataSize) && (0U != count)) + { + tempCount = (uint8_t)MIN(handle->rxDataSize, count); + /* Using non block API to read the data from the registers. */ + if (!handle->is16bitData) + { + LPUART_ReadNonBlocking(base, handle->rxData, tempCount); + handle->rxData = &handle->rxData[tempCount]; + } + else + { + LPUART_ReadNonBlocking16bit(base, handle->rxData16, tempCount); + handle->rxData16 = &handle->rxData16[tempCount]; + } + handle->rxDataSize -= tempCount; + count -= tempCount; + + /* If rxDataSize is 0, invoke rx idle callback.*/ + if (0U == (handle->rxDataSize)) + { + handle->rxState = (uint8_t)kLPUART_RxIdle; + + if (NULL != handle->callback) + { + handle->callback(base, handle, kStatus_LPUART_RxIdle, handle->userData); + } + } + } +#endif + /* Clear IDLE flag.*/ + base->STAT = ((base->STAT & 0x3FE00000U) | LPUART_STAT_IDLE_MASK); + + /* If rxDataSize is 0, disable rx ready, overrun and idle line interrupt.*/ + if (0U == handle->rxDataSize) + { + /* Disable and re-enable the global interrupt to protect the interrupt enable register during + * read-modify-wrte. */ + irqMask = DisableGlobalIRQ(); + base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ILIE_MASK | LPUART_CTRL_ORIE_MASK); + EnableGlobalIRQ(irqMask); + } + /* Invoke callback if callback is not NULL and rxDataSize is not 0. */ + else if (NULL != handle->callback) + { + handle->callback(base, handle, kStatus_LPUART_IdleLineDetected, handle->userData); + } + else + { + /* Avoid MISRA 15.7 */ + } +} + +static void LPUART_TransferHandleReceiveDataFull(LPUART_Type *base, lpuart_handle_t *handle) +{ + uint8_t count; + uint8_t tempCount; + uint16_t tpmRxRingBufferHead; + uint32_t tpmData; + uint32_t irqMask; + + /* Get the size that can be stored into buffer for this interrupt. */ +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + count = ((uint8_t)((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT)); +#else + count = 1; +#endif + + /* If handle->rxDataSize is not 0, first save data to handle->rxData. */ + while ((0U != handle->rxDataSize) && (0U != count)) + { +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + tempCount = (uint8_t)MIN(handle->rxDataSize, count); +#else + tempCount = 1; +#endif + + /* Using non block API to read the data from the registers. */ + if (!handle->is16bitData) + { + LPUART_ReadNonBlocking(base, handle->rxData, tempCount); + handle->rxData = &handle->rxData[tempCount]; + } + else + { + LPUART_ReadNonBlocking16bit(base, handle->rxData16, tempCount); + handle->rxData16 = &handle->rxData16[tempCount]; + } + handle->rxDataSize -= tempCount; + count -= tempCount; + + /* If all the data required for upper layer is ready, trigger callback. */ + if (0U == handle->rxDataSize) + { + handle->rxState = (uint8_t)kLPUART_RxIdle; + + if (NULL != handle->callback) + { + handle->callback(base, handle, kStatus_LPUART_RxIdle, handle->userData); + } + } + } + + /* If use RX ring buffer, receive data to ring buffer. */ + if (NULL != handle->rxRingBuffer) + { + while (0U != count--) + { + /* If RX ring buffer is full, trigger callback to notify over run. */ + if (LPUART_TransferIsRxRingBufferFull(base, handle)) + { + if (NULL != handle->callback) + { + handle->callback(base, handle, kStatus_LPUART_RxRingBufferOverrun, handle->userData); + } + } + + /* If ring buffer is still full after callback function, the oldest data is overridden. */ + if (LPUART_TransferIsRxRingBufferFull(base, handle)) + { + /* Increase handle->rxRingBufferTail to make room for new data. */ + if (((uint32_t)handle->rxRingBufferTail + 1U) == handle->rxRingBufferSize) + { + handle->rxRingBufferTail = 0U; + } + else + { + handle->rxRingBufferTail++; + } + } + + /* Read data. */ + tpmRxRingBufferHead = handle->rxRingBufferHead; + tpmData = base->DATA; +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + if (handle->isSevenDataBits) + { + handle->rxRingBuffer[tpmRxRingBufferHead] = (uint8_t)(tpmData & 0x7FU); + } + else + { + if (!handle->is16bitData) + { + handle->rxRingBuffer[tpmRxRingBufferHead] = (uint8_t)tpmData; + } + else + { + handle->rxRingBuffer16[tpmRxRingBufferHead] = (uint16_t)(tpmData & 0x3FFU); + } + } +#else + if (!handle->is16bitData) + { + handle->rxRingBuffer[tpmRxRingBufferHead] = (uint8_t)tpmData; + } + else + { + handle->rxRingBuffer16[tpmRxRingBufferHead] = (uint16_t)(tpmData & 0x3FFU); + } +#endif + + /* Increase handle->rxRingBufferHead. */ + if (((uint32_t)handle->rxRingBufferHead + 1U) == handle->rxRingBufferSize) + { + handle->rxRingBufferHead = 0U; + } + else + { + handle->rxRingBufferHead++; + } + } + } + /* If no receive requst pending, stop RX interrupt. */ + else if (0U == handle->rxDataSize) + { + /* Disable and re-enable the global interrupt to protect the interrupt enable register during + * read-modify-wrte. */ + irqMask = DisableGlobalIRQ(); + base->CTRL &= ~(uint32_t)(LPUART_CTRL_RIE_MASK | LPUART_CTRL_ORIE_MASK | LPUART_CTRL_ILIE_MASK); + EnableGlobalIRQ(irqMask); + } + else + { + /* Avoid MISRA C-2012 15.7 voiation */ + return; + } +} + +static void LPUART_TransferHandleSendDataEmpty(LPUART_Type *base, lpuart_handle_t *handle) +{ + uint8_t count; + uint8_t tempCount; + uint32_t irqMask; +/* Get the bytes that available at this moment. */ +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + count = (uint8_t)FSL_FEATURE_LPUART_FIFO_SIZEn(base) - + (uint8_t)((base->WATER & LPUART_WATER_TXCOUNT_MASK) >> LPUART_WATER_TXCOUNT_SHIFT); +#else + count = 1; +#endif + + while ((0U != handle->txDataSize) && (0U != count)) + { +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + tempCount = (uint8_t)MIN(handle->txDataSize, count); +#else + tempCount = 1; +#endif + + /* Using non block API to write the data to the registers. */ + if (!handle->is16bitData) + { + LPUART_WriteNonBlocking(base, handle->txData, tempCount); + handle->txData = &handle->txData[tempCount]; + } + else + { + LPUART_WriteNonBlocking16bit(base, handle->txData16, tempCount); + handle->txData16 = &handle->txData16[tempCount]; + } + handle->txDataSize -= tempCount; + count -= tempCount; + + /* If all the data are written to data register, notify user with the callback, then TX finished. */ + if (0U == handle->txDataSize) + { + /* Disable and re-enable the global interrupt to protect the interrupt enable register during + * read-modify-wrte. */ + irqMask = DisableGlobalIRQ(); + /* Disable TX register empty interrupt and enable transmission completion interrupt. */ + base->CTRL = (base->CTRL & ~LPUART_CTRL_TIE_MASK) | LPUART_CTRL_TCIE_MASK; + EnableGlobalIRQ(irqMask); + } + } +} + +static void LPUART_TransferHandleTransmissionComplete(LPUART_Type *base, lpuart_handle_t *handle) +{ + uint32_t irqMask; + /* Set txState to idle only when all data has been sent out to bus. */ + handle->txState = (uint8_t)kLPUART_TxIdle; + + /* Disable and re-enable the global interrupt to protect the interrupt enable register during read-modify-wrte. + */ + irqMask = DisableGlobalIRQ(); + /* Disable transmission complete interrupt. */ + base->CTRL &= ~(uint32_t)LPUART_CTRL_TCIE_MASK; + EnableGlobalIRQ(irqMask); + + /* Trigger callback. */ + if (NULL != handle->callback) + { + handle->callback(base, handle, kStatus_LPUART_TxIdle, handle->userData); + } +} + +/*! + * brief LPUART IRQ handle function. + * + * This function handles the LPUART transmit and receive IRQ request. + * + * param base LPUART peripheral base address. + * param irqHandle LPUART handle pointer. + */ +void LPUART_TransferHandleIRQ(LPUART_Type *base, void *irqHandle) +{ + assert(NULL != irqHandle); + + uint32_t status = LPUART_GetStatusFlags(base); + uint32_t enabledInterrupts = LPUART_GetEnabledInterrupts(base); + + lpuart_handle_t *handle = (lpuart_handle_t *)irqHandle; + + /* If RX overrun. */ + if ((uint32_t)kLPUART_RxOverrunFlag == ((uint32_t)kLPUART_RxOverrunFlag & status)) + { + /* Clear overrun flag, otherwise the RX does not work. */ + base->STAT = ((base->STAT & 0x3FE00000U) | LPUART_STAT_OR_MASK); + + /* Trigger callback. */ + if (NULL != (handle->callback)) + { + handle->callback(base, handle, kStatus_LPUART_RxHardwareOverrun, handle->userData); + } + } + + /* If IDLE flag is set and the IDLE interrupt is enabled. */ + if ((0U != ((uint32_t)kLPUART_IdleLineFlag & status)) && + (0U != ((uint32_t)kLPUART_IdleLineInterruptEnable & enabledInterrupts))) + { + LPUART_TransferHandleIDLEReady(base, handle); + } + /* Receive data register full */ + if ((0U != ((uint32_t)kLPUART_RxDataRegFullFlag & status)) && + (0U != ((uint32_t)kLPUART_RxDataRegFullInterruptEnable & enabledInterrupts))) + { + LPUART_TransferHandleReceiveDataFull(base, handle); + } + + /* Send data register empty and the interrupt is enabled. */ + if ((0U != ((uint32_t)kLPUART_TxDataRegEmptyFlag & status)) && + (0U != ((uint32_t)kLPUART_TxDataRegEmptyInterruptEnable & enabledInterrupts))) + { + LPUART_TransferHandleSendDataEmpty(base, handle); + } + + /* Transmission complete and the interrupt is enabled. */ + if ((0U != ((uint32_t)kLPUART_TransmissionCompleteFlag & status)) && + (0U != ((uint32_t)kLPUART_TransmissionCompleteInterruptEnable & enabledInterrupts))) + { + LPUART_TransferHandleTransmissionComplete(base, handle); + } +} + +/*! + * brief LPUART Error IRQ handle function. + * + * This function handles the LPUART error IRQ request. + * + * param base LPUART peripheral base address. + * param irqHandle LPUART handle pointer. + */ +void LPUART_TransferHandleErrorIRQ(LPUART_Type *base, void *irqHandle) +{ + /* To be implemented by User. */ +} +#if defined(FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) && FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1 +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART0_LPUART1_RX_DriverIRQHandler(void); +void LPUART0_LPUART1_RX_DriverIRQHandler(void) +{ + /* If handle is registered, treat the transfer function is enabled. */ + if (NULL != s_lpuartHandle[0]) + { + s_lpuartIsr[0](LPUART0, s_lpuartHandle[0]); + } + if (NULL != s_lpuartHandle[1]) + { + s_lpuartIsr[1](LPUART1, s_lpuartHandle[1]); + } + SDK_ISR_EXIT_BARRIER; +} +void LPUART0_LPUART1_TX_DriverIRQHandler(void); +void LPUART0_LPUART1_TX_DriverIRQHandler(void) +{ + /* If handle is registered, treat the transfer function is enabled. */ + if (NULL != s_lpuartHandle[0]) + { + s_lpuartIsr[0](LPUART0, s_lpuartHandle[0]); + } + if (NULL != s_lpuartHandle[1]) + { + s_lpuartIsr[1](LPUART1, s_lpuartHandle[1]); + } + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART0_LPUART1_DriverIRQHandler(void); +void LPUART0_LPUART1_DriverIRQHandler(void) +{ + /* If handle is registered, treat the transfer function is enabled. */ + if (NULL != s_lpuartHandle[0]) + { + s_lpuartIsr[0](LPUART0, s_lpuartHandle[0]); + } + if (NULL != s_lpuartHandle[1]) + { + s_lpuartIsr[1](LPUART1, s_lpuartHandle[1]); + } + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART0) +#if !(defined(FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) && FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART0_TX_DriverIRQHandler(void); +void LPUART0_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[0](LPUART0, s_lpuartHandle[0]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART0_RX_DriverIRQHandler(void); +void LPUART0_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[0](LPUART0, s_lpuartHandle[0]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART0_DriverIRQHandler(void); +void LPUART0_DriverIRQHandler(void) +{ + s_lpuartIsr[0](LPUART0, s_lpuartHandle[0]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif +#endif + +#if defined(LPUART1) +#if !(defined(FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) && FSL_FEATURE_LPUART_HAS_SHARED_IRQ0_IRQ1) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART1_TX_DriverIRQHandler(void); +void LPUART1_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[1](LPUART1, s_lpuartHandle[1]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART1_RX_DriverIRQHandler(void); +void LPUART1_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[1](LPUART1, s_lpuartHandle[1]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART1_DriverIRQHandler(void); +void LPUART1_DriverIRQHandler(void) +{ + s_lpuartIsr[1](LPUART1, s_lpuartHandle[1]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif +#endif + +#if defined(LPUART2) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART2_TX_DriverIRQHandler(void); +void LPUART2_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[2](LPUART2, s_lpuartHandle[2]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART2_RX_DriverIRQHandler(void); +void LPUART2_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[2](LPUART2, s_lpuartHandle[2]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART2_DriverIRQHandler(void); +void LPUART2_DriverIRQHandler(void) +{ + s_lpuartIsr[2](LPUART2, s_lpuartHandle[2]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART3) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART3_TX_DriverIRQHandler(void); +void LPUART3_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[3](LPUART3, s_lpuartHandle[3]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART3_RX_DriverIRQHandler(void); +void LPUART3_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[3](LPUART3, s_lpuartHandle[3]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART3_DriverIRQHandler(void); +void LPUART3_DriverIRQHandler(void) +{ + s_lpuartIsr[3](LPUART3, s_lpuartHandle[3]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART4) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART4_TX_DriverIRQHandler(void); +void LPUART4_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[4](LPUART4, s_lpuartHandle[4]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART4_RX_DriverIRQHandler(void); +void LPUART4_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[4](LPUART4, s_lpuartHandle[4]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART4_DriverIRQHandler(void); +void LPUART4_DriverIRQHandler(void) +{ + s_lpuartIsr[4](LPUART4, s_lpuartHandle[4]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART5) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART5_TX_DriverIRQHandler(void); +void LPUART5_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[5](LPUART5, s_lpuartHandle[5]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART5_RX_DriverIRQHandler(void); +void LPUART5_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[5](LPUART5, s_lpuartHandle[5]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART5_DriverIRQHandler(void); +void LPUART5_DriverIRQHandler(void) +{ + s_lpuartIsr[5](LPUART5, s_lpuartHandle[5]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART6) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART6_TX_DriverIRQHandler(void); +void LPUART6_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[6](LPUART6, s_lpuartHandle[6]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART6_RX_DriverIRQHandler(void); +void LPUART6_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[6](LPUART6, s_lpuartHandle[6]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART6_DriverIRQHandler(void); +void LPUART6_DriverIRQHandler(void) +{ + s_lpuartIsr[6](LPUART6, s_lpuartHandle[6]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART7) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART7_TX_DriverIRQHandler(void); +void LPUART7_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[7](LPUART7, s_lpuartHandle[7]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART7_RX_DriverIRQHandler(void); +void LPUART7_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[7](LPUART7, s_lpuartHandle[7]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART7_DriverIRQHandler(void); +void LPUART7_DriverIRQHandler(void) +{ + s_lpuartIsr[7](LPUART7, s_lpuartHandle[7]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART8) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART8_TX_DriverIRQHandler(void); +void LPUART8_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[8](LPUART8, s_lpuartHandle[8]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART8_RX_DriverIRQHandler(void); +void LPUART8_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[8](LPUART8, s_lpuartHandle[8]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART8_DriverIRQHandler(void); +void LPUART8_DriverIRQHandler(void) +{ + s_lpuartIsr[8](LPUART8, s_lpuartHandle[8]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART9) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART9_TX_DriverIRQHandler(void); +void LPUART9_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[9](LPUART9, s_lpuartHandle[9]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART9_RX_DriverIRQHandler(void); +void LPUART9_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[9](LPUART9, s_lpuartHandle[9]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART9_DriverIRQHandler(void); +void LPUART9_DriverIRQHandler(void) +{ + s_lpuartIsr[9](LPUART9, s_lpuartHandle[9]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART10) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART10_TX_DriverIRQHandler(void); +void LPUART10_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[10](LPUART10, s_lpuartHandle[10]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART10_RX_DriverIRQHandler(void); +void LPUART10_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[10](LPUART10, s_lpuartHandle[10]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART10_DriverIRQHandler(void); +void LPUART10_DriverIRQHandler(void) +{ + s_lpuartIsr[10](LPUART10, s_lpuartHandle[10]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART11) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART11_TX_DriverIRQHandler(void); +void LPUART11_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[11](LPUART11, s_lpuartHandle[11]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART11_RX_DriverIRQHandler(void); +void LPUART11_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[11](LPUART11, s_lpuartHandle[11]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART11_DriverIRQHandler(void); +void LPUART11_DriverIRQHandler(void) +{ + s_lpuartIsr[11](LPUART11, s_lpuartHandle[11]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(LPUART12) +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +void LPUART12_TX_DriverIRQHandler(void); +void LPUART12_TX_DriverIRQHandler(void) +{ + s_lpuartIsr[12](LPUART12, s_lpuartHandle[12]); + SDK_ISR_EXIT_BARRIER; +} +void LPUART12_RX_DriverIRQHandler(void); +void LPUART12_RX_DriverIRQHandler(void) +{ + s_lpuartIsr[12](LPUART12, s_lpuartHandle[12]); + SDK_ISR_EXIT_BARRIER; +} +#else +void LPUART12_DriverIRQHandler(void); +void LPUART12_DriverIRQHandler(void) +{ + s_lpuartIsr[12](LPUART12, s_lpuartHandle[12]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#endif + +#if defined(CM4_0__LPUART) +void M4_0_LPUART_DriverIRQHandler(void); +void M4_0_LPUART_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(CM4_0__LPUART)](CM4_0__LPUART, s_lpuartHandle[LPUART_GetInstance(CM4_0__LPUART)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CM4_1__LPUART) +void M4_1_LPUART_DriverIRQHandler(void); +void M4_1_LPUART_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(CM4_1__LPUART)](CM4_1__LPUART, s_lpuartHandle[LPUART_GetInstance(CM4_1__LPUART)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(CM4__LPUART) +void M4_LPUART_DriverIRQHandler(void); +void M4_LPUART_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(CM4__LPUART)](CM4__LPUART, s_lpuartHandle[LPUART_GetInstance(CM4__LPUART)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(DMA__LPUART0) +void DMA_UART0_INT_DriverIRQHandler(void); +void DMA_UART0_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(DMA__LPUART0)](DMA__LPUART0, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART0)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(DMA__LPUART1) +void DMA_UART1_INT_DriverIRQHandler(void); +void DMA_UART1_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(DMA__LPUART1)](DMA__LPUART1, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART1)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(DMA__LPUART2) +void DMA_UART2_INT_DriverIRQHandler(void); +void DMA_UART2_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(DMA__LPUART2)](DMA__LPUART2, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART2)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(DMA__LPUART3) +void DMA_UART3_INT_DriverIRQHandler(void); +void DMA_UART3_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(DMA__LPUART3)](DMA__LPUART3, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART3)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(DMA__LPUART4) +void DMA_UART4_INT_DriverIRQHandler(void); +void DMA_UART4_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(DMA__LPUART4)](DMA__LPUART4, s_lpuartHandle[LPUART_GetInstance(DMA__LPUART4)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(ADMA__LPUART0) +void ADMA_UART0_INT_DriverIRQHandler(void); +void ADMA_UART0_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(ADMA__LPUART0)](ADMA__LPUART0, s_lpuartHandle[LPUART_GetInstance(ADMA__LPUART0)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(ADMA__LPUART1) +void ADMA_UART1_INT_DriverIRQHandler(void); +void ADMA_UART1_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(ADMA__LPUART1)](ADMA__LPUART1, s_lpuartHandle[LPUART_GetInstance(ADMA__LPUART1)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(ADMA__LPUART2) +void ADMA_UART2_INT_DriverIRQHandler(void); +void ADMA_UART2_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(ADMA__LPUART2)](ADMA__LPUART2, s_lpuartHandle[LPUART_GetInstance(ADMA__LPUART2)]); + SDK_ISR_EXIT_BARRIER; +} +#endif + +#if defined(ADMA__LPUART3) +void ADMA_UART3_INT_DriverIRQHandler(void); +void ADMA_UART3_INT_DriverIRQHandler(void) +{ + s_lpuartIsr[LPUART_GetInstance(ADMA__LPUART3)](ADMA__LPUART3, s_lpuartHandle[LPUART_GetInstance(ADMA__LPUART3)]); + SDK_ISR_EXIT_BARRIER; +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart.h new file mode 100644 index 00000000000..13ea2365f63 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart.h @@ -0,0 +1,1128 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_LPUART_H_ +#define FSL_LPUART_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup lpuart_driver + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief LPUART driver version. */ +#define FSL_LPUART_DRIVER_VERSION (MAKE_VERSION(2, 8, 2)) +/*! @} */ + +/*! @brief Retry times for waiting flag. */ +#ifndef UART_RETRY_TIMES +#define UART_RETRY_TIMES 0U /* Defining to zero means to keep waiting for the flag until it is assert/deassert. */ +#endif + +/*! @brief Error codes for the LPUART driver. */ +enum +{ + kStatus_LPUART_TxBusy = MAKE_STATUS(kStatusGroup_LPUART, 0), /*!< TX busy */ + kStatus_LPUART_RxBusy = MAKE_STATUS(kStatusGroup_LPUART, 1), /*!< RX busy */ + kStatus_LPUART_TxIdle = MAKE_STATUS(kStatusGroup_LPUART, 2), /*!< LPUART transmitter is idle. */ + kStatus_LPUART_RxIdle = MAKE_STATUS(kStatusGroup_LPUART, 3), /*!< LPUART receiver is idle. */ + kStatus_LPUART_TxWatermarkTooLarge = MAKE_STATUS(kStatusGroup_LPUART, 4), /*!< TX FIFO watermark too large */ + kStatus_LPUART_RxWatermarkTooLarge = MAKE_STATUS(kStatusGroup_LPUART, 5), /*!< RX FIFO watermark too large */ + kStatus_LPUART_FlagCannotClearManually = MAKE_STATUS(kStatusGroup_LPUART, 6), /*!< Some flag can't manually clear */ + kStatus_LPUART_Error = MAKE_STATUS(kStatusGroup_LPUART, 7), /*!< Error happens on LPUART. */ + kStatus_LPUART_RxRingBufferOverrun = + MAKE_STATUS(kStatusGroup_LPUART, 8), /*!< LPUART RX software ring buffer overrun. */ + kStatus_LPUART_RxHardwareOverrun = MAKE_STATUS(kStatusGroup_LPUART, 9), /*!< LPUART RX receiver overrun. */ + kStatus_LPUART_NoiseError = MAKE_STATUS(kStatusGroup_LPUART, 10), /*!< LPUART noise error. */ + kStatus_LPUART_FramingError = MAKE_STATUS(kStatusGroup_LPUART, 11), /*!< LPUART framing error. */ + kStatus_LPUART_ParityError = MAKE_STATUS(kStatusGroup_LPUART, 12), /*!< LPUART parity error. */ + kStatus_LPUART_BaudrateNotSupport = + MAKE_STATUS(kStatusGroup_LPUART, 13), /*!< Baudrate is not support in current clock source */ + kStatus_LPUART_IdleLineDetected = MAKE_STATUS(kStatusGroup_LPUART, 14), /*!< IDLE flag. */ + kStatus_LPUART_Timeout = MAKE_STATUS(kStatusGroup_LPUART, 15), /*!< LPUART times out. */ +}; + +/*! @brief LPUART parity mode. */ +typedef enum _lpuart_parity_mode +{ + kLPUART_ParityDisabled = 0x0U, /*!< Parity disabled */ + kLPUART_ParityEven = 0x2U, /*!< Parity enabled, type even, bit setting: PE|PT = 10 */ + kLPUART_ParityOdd = 0x3U, /*!< Parity enabled, type odd, bit setting: PE|PT = 11 */ +} lpuart_parity_mode_t; + +/*! @brief LPUART data bits count. */ +typedef enum _lpuart_data_bits +{ + kLPUART_EightDataBits = 0x0U, /*!< Eight data bit */ +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + kLPUART_SevenDataBits = 0x1U, /*!< Seven data bit */ +#endif +} lpuart_data_bits_t; + +/*! @brief LPUART stop bit count. */ +typedef enum _lpuart_stop_bit_count +{ + kLPUART_OneStopBit = 0U, /*!< One stop bit */ + kLPUART_TwoStopBit = 1U, /*!< Two stop bits */ +} lpuart_stop_bit_count_t; + +#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT +/*! @brief LPUART transmit CTS source. */ +typedef enum _lpuart_transmit_cts_source +{ + kLPUART_CtsSourcePin = 0U, /*!< CTS resource is the LPUART_CTS pin. */ + kLPUART_CtsSourceMatchResult = 1U, /*!< CTS resource is the match result. */ +} lpuart_transmit_cts_source_t; + +/*! @brief LPUART transmit CTS configure. */ +typedef enum _lpuart_transmit_cts_config +{ + kLPUART_CtsSampleAtStart = 0U, /*!< CTS input is sampled at the start of each character. */ + kLPUART_CtsSampleAtIdle = 1U, /*!< CTS input is sampled when the transmitter is idle */ +} lpuart_transmit_cts_config_t; +#endif + +/*! @brief LPUART idle flag type defines when the receiver starts counting. */ +typedef enum _lpuart_idle_type_select +{ + kLPUART_IdleTypeStartBit = 0U, /*!< Start counting after a valid start bit. */ + kLPUART_IdleTypeStopBit = 1U, /*!< Start counting after a stop bit. */ +} lpuart_idle_type_select_t; + +/*! @brief LPUART idle detected configuration. + * This structure defines the number of idle characters that must be received before + * the IDLE flag is set. + */ +typedef enum _lpuart_idle_config +{ + kLPUART_IdleCharacter1 = 0U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter2 = 1U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter4 = 2U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter8 = 3U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter16 = 4U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter32 = 5U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter64 = 6U, /*!< the number of idle characters. */ + kLPUART_IdleCharacter128 = 7U, /*!< the number of idle characters. */ +} lpuart_idle_config_t; + +/*! + * @brief LPUART interrupt configuration structure, default settings all disabled. + * + * This structure contains the settings for all LPUART interrupt configurations. + */ +enum _lpuart_interrupt_enable +{ +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + kLPUART_LinBreakInterruptEnable = (LPUART_BAUD_LBKDIE_MASK >> 8U), /*!< LIN break detect. bit 7 */ +#endif + kLPUART_RxActiveEdgeInterruptEnable = (LPUART_BAUD_RXEDGIE_MASK >> 8U), /*!< Receive Active Edge. bit 6 */ + kLPUART_TxDataRegEmptyInterruptEnable = (LPUART_CTRL_TIE_MASK), /*!< Transmit data register empty. bit 23 */ + kLPUART_TransmissionCompleteInterruptEnable = (LPUART_CTRL_TCIE_MASK), /*!< Transmission complete. bit 22 */ + kLPUART_RxDataRegFullInterruptEnable = (LPUART_CTRL_RIE_MASK), /*!< Receiver data register full. bit 21 */ + kLPUART_IdleLineInterruptEnable = (LPUART_CTRL_ILIE_MASK), /*!< Idle line. bit 20 */ + kLPUART_RxOverrunInterruptEnable = (LPUART_CTRL_ORIE_MASK), /*!< Receiver Overrun. bit 27 */ + kLPUART_NoiseErrorInterruptEnable = (LPUART_CTRL_NEIE_MASK), /*!< Noise error flag. bit 26 */ + kLPUART_FramingErrorInterruptEnable = (LPUART_CTRL_FEIE_MASK), /*!< Framing error flag. bit 25 */ + kLPUART_ParityErrorInterruptEnable = (LPUART_CTRL_PEIE_MASK), /*!< Parity error flag. bit 24 */ +#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING + kLPUART_Match1InterruptEnable = (LPUART_CTRL_MA1IE_MASK), /*!< Parity error flag. bit 15 */ + kLPUART_Match2InterruptEnable = (LPUART_CTRL_MA2IE_MASK), /*!< Parity error flag. bit 14 */ +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + kLPUART_TxFifoOverflowInterruptEnable = (LPUART_FIFO_TXOFE_MASK), /*!< Transmit FIFO Overflow. bit 9 */ + kLPUART_RxFifoUnderflowInterruptEnable = (LPUART_FIFO_RXUFE_MASK), /*!< Receive FIFO Underflow. bit 8 */ +#endif + + kLPUART_AllInterruptEnable = kLPUART_RxActiveEdgeInterruptEnable | kLPUART_TxDataRegEmptyInterruptEnable | + kLPUART_TransmissionCompleteInterruptEnable | kLPUART_RxDataRegFullInterruptEnable | + kLPUART_IdleLineInterruptEnable | kLPUART_RxOverrunInterruptEnable | + kLPUART_NoiseErrorInterruptEnable | kLPUART_FramingErrorInterruptEnable | + kLPUART_ParityErrorInterruptEnable +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + | kLPUART_LinBreakInterruptEnable +#endif +#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING + | kLPUART_Match1InterruptEnable | kLPUART_Match2InterruptEnable +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + | kLPUART_TxFifoOverflowInterruptEnable | kLPUART_RxFifoUnderflowInterruptEnable +#endif + , +}; + +/*! + * @brief LPUART status flags. + * + * This provides constants for the LPUART status flags for use in the LPUART functions. + */ +enum _lpuart_flags +{ + kLPUART_TxDataRegEmptyFlag = + (LPUART_STAT_TDRE_MASK), /*!< Transmit data register empty flag, sets when transmit buffer is empty. bit 23 */ + kLPUART_TransmissionCompleteFlag = + (LPUART_STAT_TC_MASK), /*!< Transmission complete flag, sets when transmission activity complete. bit 22 */ + kLPUART_RxDataRegFullFlag = (LPUART_STAT_RDRF_MASK), /*!< Receive data register full flag, sets when the receive + data buffer is full. bit 21 */ + kLPUART_IdleLineFlag = (LPUART_STAT_IDLE_MASK), /*!< Idle line detect flag, sets when idle line detected. bit 20 */ + kLPUART_RxOverrunFlag = (LPUART_STAT_OR_MASK), /*!< Receive Overrun, sets when new data is received before data is + read from receive register. bit 19 */ + kLPUART_NoiseErrorFlag = (LPUART_STAT_NF_MASK), /*!< Receive takes 3 samples of each received bit. If any of these + samples differ, noise flag sets. bit 18 */ + kLPUART_FramingErrorFlag = + (LPUART_STAT_FE_MASK), /*!< Frame error flag, sets if logic 0 was detected where stop bit expected. bit 17 */ + kLPUART_ParityErrorFlag = (LPUART_STAT_PF_MASK), /*!< If parity enabled, sets upon parity error detection. bit 16 */ +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + kLPUART_LinBreakFlag = (LPUART_STAT_LBKDIF_MASK), /*!< LIN break detect interrupt flag, sets when LIN break + char detected and LIN circuit enabled. bit 31 */ +#endif + kLPUART_RxActiveEdgeFlag = (LPUART_STAT_RXEDGIF_MASK), /*!< Receive pin active edge interrupt flag, sets when active + edge detected. bit 30 */ + kLPUART_RxActiveFlag = + (LPUART_STAT_RAF_MASK), /*!< Receiver Active Flag (RAF), sets at beginning of valid start. bit 24 */ +#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING + kLPUART_DataMatch1Flag = + LPUART_STAT_MA1F_MASK, /*!< The next character to be read from LPUART_DATA matches MA1. bit 15 */ + kLPUART_DataMatch2Flag = + LPUART_STAT_MA2F_MASK, /*!< The next character to be read from LPUART_DATA matches MA2. bit 14 */ +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + kLPUART_TxFifoEmptyFlag = + (LPUART_FIFO_TXEMPT_MASK >> 16), /*!< TXEMPT bit, sets if transmit buffer is empty. bit 7 */ + kLPUART_RxFifoEmptyFlag = + (LPUART_FIFO_RXEMPT_MASK >> 16), /*!< RXEMPT bit, sets if receive buffer is empty. bit 6 */ + kLPUART_TxFifoOverflowFlag = + (LPUART_FIFO_TXOF_MASK >> 16), /*!< TXOF bit, sets if transmit buffer overflow occurred. bit 1 */ + kLPUART_RxFifoUnderflowFlag = + (LPUART_FIFO_RXUF_MASK >> 16), /*!< RXUF bit, sets if receive buffer underflow occurred. bit 0 */ +#endif + + kLPUART_AllClearFlags = kLPUART_RxActiveEdgeFlag | kLPUART_IdleLineFlag | kLPUART_RxOverrunFlag | + kLPUART_NoiseErrorFlag | kLPUART_FramingErrorFlag | kLPUART_ParityErrorFlag +#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING + | kLPUART_DataMatch1Flag | kLPUART_DataMatch2Flag +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + | kLPUART_TxFifoOverflowFlag | kLPUART_RxFifoUnderflowFlag +#endif +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + | kLPUART_LinBreakFlag +#endif + , + + kLPUART_AllFlags = + kLPUART_RxActiveEdgeFlag | kLPUART_IdleLineFlag | kLPUART_RxOverrunFlag | kLPUART_TxDataRegEmptyFlag | + kLPUART_TransmissionCompleteFlag | kLPUART_RxDataRegFullFlag | kLPUART_RxActiveFlag | kLPUART_NoiseErrorFlag | + kLPUART_FramingErrorFlag | kLPUART_ParityErrorFlag +#if defined(FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING) && FSL_FEATURE_LPUART_HAS_ADDRESS_MATCHING + | kLPUART_DataMatch1Flag | kLPUART_DataMatch2Flag +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + | kLPUART_TxFifoOverflowFlag | kLPUART_RxFifoUnderflowFlag | kLPUART_TxFifoEmptyFlag | kLPUART_RxFifoEmptyFlag +#endif +#if defined(FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT) && FSL_FEATURE_LPUART_HAS_LIN_BREAK_DETECT + | kLPUART_LinBreakFlag +#endif + , +}; + +/*! @brief LPUART configuration structure. */ +typedef struct _lpuart_config +{ + uint32_t baudRate_Bps; /*!< LPUART baud rate */ + lpuart_parity_mode_t parityMode; /*!< Parity mode, disabled (default), even, odd */ + lpuart_data_bits_t dataBitsCount; /*!< Data bits count, eight (default), seven */ + bool isMsb; /*!< Data bits order, LSB (default), MSB */ +#if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT + lpuart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits */ +#endif +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + uint8_t txFifoWatermark; /*!< TX FIFO watermark */ + uint8_t rxFifoWatermark; /*!< RX FIFO watermark */ +#endif +#if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT + bool enableRxRTS; /*!< RX RTS enable */ + bool enableTxCTS; /*!< TX CTS enable */ + lpuart_transmit_cts_source_t txCtsSource; /*!< TX CTS source */ + lpuart_transmit_cts_config_t txCtsConfig; /*!< TX CTS configure */ +#endif + lpuart_idle_type_select_t rxIdleType; /*!< RX IDLE type. */ + lpuart_idle_config_t rxIdleConfig; /*!< RX IDLE configuration. */ + bool enableTx; /*!< Enable TX */ + bool enableRx; /*!< Enable RX */ +} lpuart_config_t; + +/*! @brief LPUART transfer structure. */ +typedef struct _lpuart_transfer +{ + /* + * Use separate TX and RX data pointer, because TX data is const data. + * The member data is kept for backward compatibility. + */ + union + { + uint8_t *data; /*!< The buffer of data to be transfer.*/ + uint8_t *rxData; /*!< The buffer to receive data. */ + uint16_t *rxData16; /*!< The buffer to receive data. */ + const uint8_t *txData; /*!< The buffer of data to be sent. */ + const uint16_t *txData16; /*!< The buffer of data to be sent. */ + }; + size_t dataSize; /*!< The byte count to be transfer. */ +} lpuart_transfer_t; + +/* Forward declaration of the handle typedef. */ +typedef struct _lpuart_handle lpuart_handle_t; + +/*! @brief LPUART transfer callback function. */ +typedef void (*lpuart_transfer_callback_t)(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData); + +/*! @brief LPUART handle structure. */ +struct _lpuart_handle +{ + union + { + const uint8_t *volatile txData; /*!< Address of remaining data to send. */ + const uint16_t *volatile txData16; /*!< Address of remaining data to send. */ + }; + volatile size_t txDataSize; /*!< Size of the remaining data to send. */ + size_t txDataSizeAll; /*!< Size of the data to send out. */ + union + { + uint8_t *volatile rxData; /*!< Address of remaining data to receive. */ + uint16_t *volatile rxData16; /*!< Address of remaining data to receive. */ + }; + volatile size_t rxDataSize; /*!< Size of the remaining data to receive. */ + size_t rxDataSizeAll; /*!< Size of the data to receive. */ + + union + { + uint8_t *rxRingBuffer; /*!< Start address of the receiver ring buffer. */ + uint16_t *rxRingBuffer16; /*!< Start address of the receiver ring buffer. */ + }; + size_t rxRingBufferSize; /*!< Size of the ring buffer. */ + volatile uint16_t rxRingBufferHead; /*!< Index for the driver to store received data into ring buffer. */ + volatile uint16_t rxRingBufferTail; /*!< Index for the user to get data from the ring buffer. */ + + lpuart_transfer_callback_t callback; /*!< Callback function. */ + void *userData; /*!< LPUART callback function parameter.*/ + + volatile uint8_t txState; /*!< TX transfer state. */ + volatile uint8_t rxState; /*!< RX transfer state. */ + +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + bool isSevenDataBits; /*!< Seven data bits flag. */ +#endif + bool is16bitData; /*!< 16bit data bits flag, only used for 9bit or 10bit data */ +}; + +/* Typedef for interrupt handler. */ +typedef void (*lpuart_isr_t)(LPUART_Type *base, void *handle); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* Array of LPUART handle. */ +extern void *s_lpuartHandle[]; + +/* Array of LPUART IRQ number. */ +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ +extern const IRQn_Type s_lpuartTxIRQ[]; +#else +extern const IRQn_Type s_lpuartIRQ[]; +#endif + +/* LPUART ISR for transactional APIs. */ +extern lpuart_isr_t s_lpuartIsr[]; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* _cplusplus */ + +#if defined(FSL_FEATURE_LPUART_HAS_GLOBAL) && FSL_FEATURE_LPUART_HAS_GLOBAL + +/*! + * @name Software Reset + * @{ + */ + +/*! + * @brief Resets the LPUART using software. + * + * This function resets all internal logic and registers except the Global Register. + * Remains set until cleared by software. + * + * @param base LPUART peripheral base address. + */ +static inline void LPUART_SoftwareReset(LPUART_Type *base) +{ + base->GLOBAL |= LPUART_GLOBAL_RST_MASK; + base->GLOBAL &= ~LPUART_GLOBAL_RST_MASK; +} +/*! @} */ +#endif /*FSL_FEATURE_LPUART_HAS_GLOBAL*/ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Initializes an LPUART instance with the user configuration structure and the peripheral clock. + * + * This function configures the LPUART module with user-defined settings. Call the LPUART_GetDefaultConfig() function + * to configure the configuration structure and get the default configuration. + * The example below shows how to use this API to configure the LPUART. + * @code + * lpuart_config_t lpuartConfig; + * lpuartConfig.baudRate_Bps = 115200U; + * lpuartConfig.parityMode = kLPUART_ParityDisabled; + * lpuartConfig.dataBitsCount = kLPUART_EightDataBits; + * lpuartConfig.isMsb = false; + * lpuartConfig.stopBitCount = kLPUART_OneStopBit; + * lpuartConfig.txFifoWatermark = 0; + * lpuartConfig.rxFifoWatermark = 1; + * LPUART_Init(LPUART1, &lpuartConfig, 20000000U); + * @endcode + * + * @param base LPUART peripheral base address. + * @param config Pointer to a user-defined configuration structure. + * @param srcClock_Hz LPUART clock source frequency in HZ. + * @retval kStatus_LPUART_BaudrateNotSupport Baudrate is not support in current clock source. + * @retval kStatus_Success LPUART initialize succeed + */ +status_t LPUART_Init(LPUART_Type *base, const lpuart_config_t *config, uint32_t srcClock_Hz); + +/*! + * @brief Deinitializes a LPUART instance. + * + * This function waits for transmit to complete, disables TX and RX, and disables the LPUART clock. + * + * @param base LPUART peripheral base address. + */ +void LPUART_Deinit(LPUART_Type *base); + +/*! + * @brief Gets the default configuration structure. + * + * This function initializes the LPUART configuration structure to a default value. The default + * values are: + * lpuartConfig->baudRate_Bps = 115200U; + * lpuartConfig->parityMode = kLPUART_ParityDisabled; + * lpuartConfig->dataBitsCount = kLPUART_EightDataBits; + * lpuartConfig->isMsb = false; + * lpuartConfig->stopBitCount = kLPUART_OneStopBit; + * lpuartConfig->txFifoWatermark = 0; + * lpuartConfig->rxFifoWatermark = 1; + * lpuartConfig->rxIdleType = kLPUART_IdleTypeStartBit; + * lpuartConfig->rxIdleConfig = kLPUART_IdleCharacter1; + * lpuartConfig->enableTx = false; + * lpuartConfig->enableRx = false; + * + * @param config Pointer to a configuration structure. + */ +void LPUART_GetDefaultConfig(lpuart_config_t *config); +/*! @} */ + +/*! + * @name Module configuration + * @{ + */ +/*! + * @brief Sets the LPUART instance baudrate. + * + * This function configures the LPUART module baudrate. This function is used to update + * the LPUART module baudrate after the LPUART module is initialized by the LPUART_Init. + * @code + * LPUART_SetBaudRate(LPUART1, 115200U, 20000000U); + * @endcode + * + * @param base LPUART peripheral base address. + * @param baudRate_Bps LPUART baudrate to be set. + * @param srcClock_Hz LPUART clock source frequency in HZ. + * @retval kStatus_LPUART_BaudrateNotSupport Baudrate is not supported in the current clock source. + * @retval kStatus_Success Set baudrate succeeded. + */ +status_t LPUART_SetBaudRate(LPUART_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); + +/*! + * @brief Enable 9-bit data mode for LPUART. + * + * This function set the 9-bit mode for LPUART module. The 9th bit is not used for parity thus can be modified by user. + * + * @param base LPUART peripheral base address. + * @param enable true to enable, flase to disable. + */ +void LPUART_Enable9bitMode(LPUART_Type *base, bool enable); + +/*! + * @brief Set the LPUART address. + * + * This function configures the address for LPUART module that works as slave in 9-bit data mode. One or two address + * fields can be configured. When the address field's match enable bit is set, the frame it receices with MSB being + * 1 is considered as an address frame, otherwise it is considered as data frame. Once the address frame matches one + * of slave's own addresses, this slave is addressed. This address frame and its following data frames are stored in + * the receive buffer, otherwise the frames will be discarded. To un-address a slave, just send an address frame with + * unmatched address. + * + * @note Any LPUART instance joined in the multi-slave system can work as slave. The position of the address mark is the + * same as the parity bit when parity is enabled for 8 bit and 9 bit data formats. + * + * @param base LPUART peripheral base address. + * @param address1 LPUART slave address1. + * @param address2 LPUART slave address2. + */ +static inline void LPUART_SetMatchAddress(LPUART_Type *base, uint16_t address1, uint16_t address2) +{ + /* Configure match address. */ + uint32_t address = ((uint32_t)address2 << 16U) | (uint32_t)address1 | 0x1000100UL; + base->MATCH = address; +} + +/*! + * @brief Enable the LPUART match address feature. + * + * @param base LPUART peripheral base address. + * @param match1 true to enable match address1, false to disable. + * @param match2 true to enable match address2, false to disable. + */ +static inline void LPUART_EnableMatchAddress(LPUART_Type *base, bool match1, bool match2) +{ + /* Configure match address1 enable bit. */ + if (match1) + { + base->BAUD |= (uint32_t)LPUART_BAUD_MAEN1_MASK; + } + else + { + base->BAUD &= ~(uint32_t)LPUART_BAUD_MAEN1_MASK; + } + /* Configure match address2 enable bit. */ + if (match2) + { + base->BAUD |= (uint32_t)LPUART_BAUD_MAEN2_MASK; + } + else + { + base->BAUD &= ~(uint32_t)LPUART_BAUD_MAEN2_MASK; + } +} + +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO +/*! + * @brief Sets the rx FIFO watermark. + * + * @param base LPUART peripheral base address. + * @param water Rx FIFO watermark. + */ +static inline void LPUART_SetRxFifoWatermark(LPUART_Type *base, uint8_t water) +{ + assert((uint8_t)FSL_FEATURE_LPUART_FIFO_SIZEn(base) > water); + base->WATER = (base->WATER & ~LPUART_WATER_RXWATER_MASK) | LPUART_WATER_RXWATER(water); +} + +/*! + * @brief Sets the tx FIFO watermark. + * + * @param base LPUART peripheral base address. + * @param water Tx FIFO watermark. + */ +static inline void LPUART_SetTxFifoWatermark(LPUART_Type *base, uint8_t water) +{ + assert((uint8_t)FSL_FEATURE_LPUART_FIFO_SIZEn(base) > water); + base->WATER = (base->WATER & ~LPUART_WATER_TXWATER_MASK) | LPUART_WATER_TXWATER(water); +} +#endif + +/*! + * @brief Sets the LPUART using 16bit transmit, only for 9bit or 10bit mode. + * + * This function Enable 16bit Data transmit in lpuart_handle_t. + * + * @param handle LPUART handle pointer. + * @param enable true to enable, false to disable. + */ +static inline void LPUART_TransferEnable16Bit(lpuart_handle_t *handle, bool enable) +{ + handle->is16bitData = enable; +} +/*! @} */ + +/*! + * @name Status + * @{ + */ + +/*! + * @brief Gets LPUART status flags. + * + * This function gets all LPUART status flags. The flags are returned as the logical + * OR value of the enumerators @ref _lpuart_flags. To check for a specific status, + * compare the return value with enumerators in the @ref _lpuart_flags. + * For example, to check whether the TX is empty: + * @code + * if (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(LPUART1)) + * { + * ... + * } + * @endcode + * + * @param base LPUART peripheral base address. + * @return LPUART status flags which are ORed by the enumerators in the _lpuart_flags. + */ +uint32_t LPUART_GetStatusFlags(LPUART_Type *base); + +/*! + * @brief Clears status flags with a provided mask. + * + * This function clears LPUART status flags with a provided mask. Automatically cleared flags + * can't be cleared by this function. + * Flags that can only cleared or set by hardware are: + * kLPUART_TxDataRegEmptyFlag, kLPUART_TransmissionCompleteFlag, kLPUART_RxDataRegFullFlag, + * kLPUART_RxActiveFlag, kLPUART_NoiseErrorFlag, kLPUART_ParityErrorFlag, + * kLPUART_TxFifoEmptyFlag,kLPUART_RxFifoEmptyFlag + * Note: This API should be called when the Tx/Rx is idle, otherwise it takes no effects. + * + * @param base LPUART peripheral base address. + * @param mask the status flags to be cleared. The user can use the enumerators in the + * _lpuart_status_flag_t to do the OR operation and get the mask. + * @return 0 succeed, others failed. + * @retval kStatus_LPUART_FlagCannotClearManually The flag can't be cleared by this function but + * it is cleared automatically by hardware. + * @retval kStatus_Success Status in the mask are cleared. + */ +status_t LPUART_ClearStatusFlags(LPUART_Type *base, uint32_t mask); +/*! @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Enables LPUART interrupts according to a provided mask. + * + * This function enables the LPUART interrupts according to a provided mask. The mask + * is a logical OR of enumeration members. See the @ref _lpuart_interrupt_enable. + * This examples shows how to enable TX empty interrupt and RX full interrupt: + * @code + * LPUART_EnableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); + * @endcode + * + * @param base LPUART peripheral base address. + * @param mask The interrupts to enable. Logical OR of @ref _lpuart_interrupt_enable. + */ +void LPUART_EnableInterrupts(LPUART_Type *base, uint32_t mask); + +/*! + * @brief Disables LPUART interrupts according to a provided mask. + * + * This function disables the LPUART interrupts according to a provided mask. The mask + * is a logical OR of enumeration members. See @ref _lpuart_interrupt_enable. + * This example shows how to disable the TX empty interrupt and RX full interrupt: + * @code + * LPUART_DisableInterrupts(LPUART1,kLPUART_TxDataRegEmptyInterruptEnable | kLPUART_RxDataRegFullInterruptEnable); + * @endcode + * + * @param base LPUART peripheral base address. + * @param mask The interrupts to disable. Logical OR of @ref _lpuart_interrupt_enable. + */ +void LPUART_DisableInterrupts(LPUART_Type *base, uint32_t mask); + +/*! + * @brief Gets enabled LPUART interrupts. + * + * This function gets the enabled LPUART interrupts. The enabled interrupts are returned + * as the logical OR value of the enumerators @ref _lpuart_interrupt_enable. To check + * a specific interrupt enable status, compare the return value with enumerators + * in @ref _lpuart_interrupt_enable. + * For example, to check whether the TX empty interrupt is enabled: + * @code + * uint32_t enabledInterrupts = LPUART_GetEnabledInterrupts(LPUART1); + * + * if (kLPUART_TxDataRegEmptyInterruptEnable & enabledInterrupts) + * { + * ... + * } + * @endcode + * + * @param base LPUART peripheral base address. + * @return LPUART interrupt flags which are logical OR of the enumerators in @ref _lpuart_interrupt_enable. + */ +uint32_t LPUART_GetEnabledInterrupts(LPUART_Type *base); +/*! @} */ + +#if defined(FSL_FEATURE_LPUART_HAS_DMA_ENABLE) && FSL_FEATURE_LPUART_HAS_DMA_ENABLE +/*! + * @name DMA Configuration + * @{ + */ +/*! + * @brief Gets the LPUART data register address. + * + * This function returns the LPUART data register address, which is mainly used by the DMA/eDMA. + * + * @param base LPUART peripheral base address. + * @return LPUART data register addresses which are used both by the transmitter and receiver. + */ +static inline uintptr_t LPUART_GetDataRegisterAddress(LPUART_Type *base) +{ + return (uintptr_t) & (base->DATA); +} + +/*! + * @brief Enables or disables the LPUART transmitter DMA request. + * + * This function enables or disables the transmit data register empty flag, STAT[TDRE], to generate DMA requests. + * + * @param base LPUART peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LPUART_EnableTxDMA(LPUART_Type *base, bool enable) +{ + if (enable) + { + base->BAUD |= LPUART_BAUD_TDMAE_MASK; + } + else + { + base->BAUD &= ~LPUART_BAUD_TDMAE_MASK; + } +} + +/*! + * @brief Enables or disables the LPUART receiver DMA. + * + * This function enables or disables the receiver data register full flag, STAT[RDRF], to generate DMA requests. + * + * @param base LPUART peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LPUART_EnableRxDMA(LPUART_Type *base, bool enable) +{ + if (enable) + { + base->BAUD |= LPUART_BAUD_RDMAE_MASK; + } + else + { + base->BAUD &= ~LPUART_BAUD_RDMAE_MASK; + } +} +/*! @} */ +#endif /* FSL_FEATURE_LPUART_HAS_DMA_ENABLE */ + +/*! + * @name Bus Operations + * @{ + */ + +/*! + * @brief Get the LPUART instance from peripheral base address. + * + * @param base LPUART peripheral base address. + * @return LPUART instance. + */ +uint32_t LPUART_GetInstance(LPUART_Type *base); + +/*! + * @brief Enables or disables the LPUART transmitter. + * + * This function enables or disables the LPUART transmitter. + * + * @param base LPUART peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LPUART_EnableTx(LPUART_Type *base, bool enable) +{ + if (enable) + { + base->CTRL |= LPUART_CTRL_TE_MASK; + } + else + { + base->CTRL &= ~LPUART_CTRL_TE_MASK; + } +} + +/*! + * @brief Enables or disables the LPUART receiver. + * + * This function enables or disables the LPUART receiver. + * + * @param base LPUART peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LPUART_EnableRx(LPUART_Type *base, bool enable) +{ + if (enable) + { + base->CTRL |= LPUART_CTRL_RE_MASK; + } + else + { + base->CTRL &= ~LPUART_CTRL_RE_MASK; + } +} + +/*! + * @brief Writes to the transmitter register. + * + * This function writes data to the transmitter register directly. The upper layer must + * ensure that the TX register is empty or that the TX FIFO has room before calling this function. + * + * @param base LPUART peripheral base address. + * @param data Data write to the TX register. + */ +static inline void LPUART_WriteByte(LPUART_Type *base, uint8_t data) +{ + base->DATA = data; +} + +/*! + * @brief Reads the receiver register. + * + * This function reads data from the receiver register directly. The upper layer must + * ensure that the receiver register is full or that the RX FIFO has data before calling this function. + * + * @param base LPUART peripheral base address. + * @return Data read from data register. + */ +static inline uint8_t LPUART_ReadByte(LPUART_Type *base) +{ +#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT + uint32_t ctrl = base->CTRL; + uint8_t result; + /* + * $Branch Coverage Justification$ + * (ctrl & LPUART_CTRL_M7_MASK) == 0U) false is not covered. + * If ctrl & LPUART_CTRL_M7_MASK is 0, it can't be !0 in next judge. + */ + bool isSevenDataBits = (((ctrl & LPUART_CTRL_M7_MASK) != 0U) || + (((ctrl & LPUART_CTRL_M7_MASK) == 0U) && ((ctrl & LPUART_CTRL_M_MASK) == 0U) && + ((ctrl & LPUART_CTRL_PE_MASK) != 0U))); + + if (isSevenDataBits) + { + result = (uint8_t)(base->DATA & 0x7FU); + } + else + { + result = (uint8_t)base->DATA; + } + + return result; +#else + return (uint8_t)(base->DATA); +#endif +} + +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO +/*! + * @brief Gets the rx FIFO data count. + * + * @param base LPUART peripheral base address. + * @return rx FIFO data count. + */ +static inline uint8_t LPUART_GetRxFifoCount(LPUART_Type *base) +{ + return (uint8_t)((base->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT); +} + +/*! + * @brief Gets the tx FIFO data count. + * + * @param base LPUART peripheral base address. + * @return tx FIFO data count. + */ +static inline uint8_t LPUART_GetTxFifoCount(LPUART_Type *base) +{ + return (uint8_t)((base->WATER & LPUART_WATER_TXCOUNT_MASK) >> LPUART_WATER_TXCOUNT_SHIFT); +} +#endif + +/*! + * @brief Transmit an address frame in 9-bit data mode. + * + * @param base LPUART peripheral base address. + * @param address LPUART slave address. + */ +void LPUART_SendAddress(LPUART_Type *base, uint8_t address); + +/*! + * @brief Writes to the transmitter register using a blocking method. + * + * This function polls the transmitter register, first waits for the register to be empty or TX FIFO to have room, + * and writes data to the transmitter buffer, then waits for the dat to be sent out to the bus. + * + * @param base LPUART peripheral base address. + * @param data Start address of the data to write. + * @param length Size of the data to write. + * @retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * @retval kStatus_Success Successfully wrote all data. + */ +status_t LPUART_WriteBlocking(LPUART_Type *base, const uint8_t *data, size_t length); + +/*! + * @brief Writes to the transmitter register using a blocking method in 9bit or 10bit mode. + * + * @note This function only support 9bit or 10bit transfer. + * Please make sure only 10bit of data is valid and other bits are 0. + * + * @param base LPUART peripheral base address. + * @param data Start address of the data to write. + * @param length Size of the data to write. + * @retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * @retval kStatus_Success Successfully wrote all data. + */ +status_t LPUART_WriteBlocking16bit(LPUART_Type *base, const uint16_t *data, size_t length); + +/*! + * @brief Reads the receiver data register using a blocking method. + * + * This function polls the receiver register, waits for the receiver register full or receiver FIFO + * has data, and reads data from the TX register. + * + * @param base LPUART peripheral base address. + * @param data Start address of the buffer to store the received data. + * @param length Size of the buffer. + * @retval kStatus_LPUART_RxHardwareOverrun Receiver overrun happened while receiving data. + * @retval kStatus_LPUART_NoiseError Noise error happened while receiving data. + * @retval kStatus_LPUART_FramingError Framing error happened while receiving data. + * @retval kStatus_LPUART_ParityError Parity error happened while receiving data. + * @retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * @retval kStatus_Success Successfully received all data. + */ +status_t LPUART_ReadBlocking(LPUART_Type *base, uint8_t *data, size_t length); + +/*! + * @brief Reads the receiver data register in 9bit or 10bit mode. + * + * @note This function only support 9bit or 10bit transfer. + * + * @param base LPUART peripheral base address. + * @param data Start address of the buffer to store the received data by 16bit, only 10bit is valid. + * @param length Size of the buffer. + * @retval kStatus_LPUART_RxHardwareOverrun Receiver overrun happened while receiving data. + * @retval kStatus_LPUART_NoiseError Noise error happened while receiving data. + * @retval kStatus_LPUART_FramingError Framing error happened while receiving data. + * @retval kStatus_LPUART_ParityError Parity error happened while receiving data. + * @retval kStatus_LPUART_Timeout Transmission timed out and was aborted. + * @retval kStatus_Success Successfully received all data. + */ +status_t LPUART_ReadBlocking16bit(LPUART_Type *base, uint16_t *data, size_t length); + +/*! @} */ + +/*! + * @name Transactional + * @{ + */ + +/*! + * @brief Initializes the LPUART handle. + * + * This function initializes the LPUART handle, which can be used for other LPUART + * transactional APIs. Usually, for a specified LPUART instance, + * call this API once to get the initialized handle. + * + * The LPUART driver supports the "background" receiving, which means that user can set up + * an RX ring buffer optionally. Data received is stored into the ring buffer even when the + * user doesn't call the LPUART_TransferReceiveNonBlocking() API. If there is already data received + * in the ring buffer, the user can get the received data from the ring buffer directly. + * The ring buffer is disabled if passing NULL as @p ringBuffer. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param callback Callback function. + * @param userData User data. + */ +void LPUART_TransferCreateHandle(LPUART_Type *base, + lpuart_handle_t *handle, + lpuart_transfer_callback_t callback, + void *userData); +/*! + * @brief Transmits a buffer of data using the interrupt method. + * + * This function send data using an interrupt method. This is a non-blocking function, which + * returns directly without waiting for all data written to the transmitter register. When + * all data is written to the TX register in the ISR, the LPUART driver calls the callback + * function and passes the @ref kStatus_LPUART_TxIdle as status parameter. + * + * @note The kStatus_LPUART_TxIdle is passed to the upper layer when all data are written + * to the TX register. However, there is no check to ensure that all the data sent out. Before disabling the TX, + * check the kLPUART_TransmissionCompleteFlag to ensure that the transmit is finished. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param xfer LPUART transfer structure, see #lpuart_transfer_t. + * @retval kStatus_Success Successfully start the data transmission. + * @retval kStatus_LPUART_TxBusy Previous transmission still not finished, data not all written to the TX register. + * @retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_TransferSendNonBlocking(LPUART_Type *base, lpuart_handle_t *handle, lpuart_transfer_t *xfer); + +/*! + * @brief Sets up the RX ring buffer. + * + * This function sets up the RX ring buffer to a specific UART handle. + * + * When the RX ring buffer is used, data received is stored into the ring buffer even when + * the user doesn't call the UART_TransferReceiveNonBlocking() API. If there is already data received + * in the ring buffer, the user can get the received data from the ring buffer directly. + * + * @note When using RX ring buffer, one byte is reserved for internal use. In other + * words, if @p ringBufferSize is 32, then only 31 bytes are used for saving data. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param ringBuffer Start address of ring buffer for background receiving. Pass NULL to disable the ring buffer. + * @param ringBufferSize size of the ring buffer. + */ +void LPUART_TransferStartRingBuffer(LPUART_Type *base, + lpuart_handle_t *handle, + uint8_t *ringBuffer, + size_t ringBufferSize); + +/*! + * @brief Aborts the background transfer and uninstalls the ring buffer. + * + * This function aborts the background transfer and uninstalls the ring buffer. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +void LPUART_TransferStopRingBuffer(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Get the length of received data in RX ring buffer. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @return Length of received data in RX ring buffer. + */ +size_t LPUART_TransferGetRxRingBufferLength(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Aborts the interrupt-driven data transmit. + * + * This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out + * how many bytes are not sent out. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +void LPUART_TransferAbortSend(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Gets the number of bytes that have been sent out to bus. + * + * This function gets the number of bytes that have been sent out to bus by an interrupt method. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param count Send bytes count. + * @retval kStatus_NoTransferInProgress No send in progress. + * @retval kStatus_InvalidArgument Parameter is invalid. + * @retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetSendCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count); + +/*! + * @brief Receives a buffer of data using the interrupt method. + * + * This function receives data using an interrupt method. This is a non-blocking function + * which returns without waiting to ensure that all data are received. + * If the RX ring buffer is used and not empty, the data in the ring buffer is copied and + * the parameter @p receivedBytes shows how many bytes are copied from the ring buffer. + * After copying, if the data in the ring buffer is not enough for read, the receive + * request is saved by the LPUART driver. When the new data arrives, the receive request + * is serviced first. When all data is received, the LPUART driver notifies the upper layer + * through a callback function and passes a status parameter kStatus_UART_RxIdle. + * For example, the upper layer needs 10 bytes but there are only 5 bytes in ring buffer. + * The 5 bytes are copied to xfer->data, which returns with the + * parameter @p receivedBytes set to 5. For the remaining 5 bytes, the newly arrived data is + * saved from xfer->data[5]. When 5 bytes are received, the LPUART driver notifies the upper layer. + * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt + * to receive data to xfer->data. When all data is received, the upper layer is notified. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param xfer LPUART transfer structure, see uart_transfer_t. + * @param receivedBytes Bytes received from the ring buffer directly. + * @retval kStatus_Success Successfully queue the transfer into the transmit queue. + * @retval kStatus_LPUART_RxBusy Previous receive request is not finished. + * @retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_TransferReceiveNonBlocking(LPUART_Type *base, + lpuart_handle_t *handle, + lpuart_transfer_t *xfer, + size_t *receivedBytes); + +/*! + * @brief Aborts the interrupt-driven data receiving. + * + * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out + * how many bytes not received yet. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + */ +void LPUART_TransferAbortReceive(LPUART_Type *base, lpuart_handle_t *handle); + +/*! + * @brief Gets the number of bytes that have been received. + * + * This function gets the number of bytes that have been received. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param count Receive bytes count. + * @retval kStatus_NoTransferInProgress No receive in progress. + * @retval kStatus_InvalidArgument Parameter is invalid. + * @retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetReceiveCount(LPUART_Type *base, lpuart_handle_t *handle, uint32_t *count); + +/*! + * @brief LPUART IRQ handle function. + * + * This function handles the LPUART transmit and receive IRQ request. + * + * @param base LPUART peripheral base address. + * @param irqHandle LPUART handle pointer. + */ +void LPUART_TransferHandleIRQ(LPUART_Type *base, void *irqHandle); + +/*! + * @brief LPUART Error IRQ handle function. + * + * This function handles the LPUART error IRQ request. + * + * @param base LPUART peripheral base address. + * @param irqHandle LPUART handle pointer. + */ +void LPUART_TransferHandleErrorIRQ(LPUART_Type *base, void *irqHandle); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_LPUART_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart_edma.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart_edma.c new file mode 100644 index 00000000000..79196d9c653 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart_edma.c @@ -0,0 +1,522 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_lpuart_edma.h" +/* + * $Coverage Justification Reference$ + * + * $Justification fsl_lpuart_edma_c_ref_1$ + * The EDMA handle is only used by the LPUART EDMA driver, with the LPUART EDMA driver workflow, + * the callback is only called when EDMA transfer done. + * + * $Justification fsl_lpuart_edma_c_ref_2$ + * This function only handles the kLPUART_TransmissionCompleteFlag event. + * + */ +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.lpuart_edma" +#endif + +/*base, false); + + /* Stop transfer. */ + EDMA_AbortTransfer(handle); + + /* Enable tx complete interrupt */ + LPUART_EnableInterrupts(lpuartPrivateHandle->base, (uint32_t)kLPUART_TransmissionCompleteInterruptEnable); + } +} + +static void LPUART_ReceiveEDMACallback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + assert(NULL != param); + + lpuart_edma_private_handle_t *lpuartPrivateHandle = (lpuart_edma_private_handle_t *)param; + + /* Avoid warning for unused parameters. */ + handle = handle; + tcds = tcds; + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_edma_c_ref_1$ + */ + if (transferDone) + { + /* Disable transfer. */ + LPUART_TransferAbortReceiveEDMA(lpuartPrivateHandle->base, lpuartPrivateHandle->handle); + + if (NULL != lpuartPrivateHandle->handle->callback) + { + lpuartPrivateHandle->handle->callback(lpuartPrivateHandle->base, lpuartPrivateHandle->handle, + kStatus_LPUART_RxIdle, lpuartPrivateHandle->handle->userData); + } + } +} + +/*! + * brief Initializes the LPUART handle which is used in transactional functions. + * + * note This function disables all LPUART interrupts. + * + * param base LPUART peripheral base address. + * param handle Pointer to lpuart_edma_handle_t structure. + * param callback Callback function. + * param userData User data. + * param txEdmaHandle User requested DMA handle for TX DMA transfer. + * param rxEdmaHandle User requested DMA handle for RX DMA transfer. + */ +void LPUART_TransferCreateHandleEDMA(LPUART_Type *base, + lpuart_edma_handle_t *handle, + lpuart_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txEdmaHandle, + edma_handle_t *rxEdmaHandle) +{ + assert(NULL != handle); + + uint32_t instance = LPUART_GetInstance(base); + + s_lpuartEdmaPrivateHandle[instance].base = base; + s_lpuartEdmaPrivateHandle[instance].handle = handle; + + (void)memset(handle, 0, sizeof(*handle)); + + handle->rxState = (uint8_t)kLPUART_RxIdle; + handle->txState = (uint8_t)kLPUART_TxIdle; + + handle->rxEdmaHandle = rxEdmaHandle; + handle->txEdmaHandle = txEdmaHandle; + + handle->callback = callback; + handle->userData = userData; + +#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO + /* Note: + Take care of the RX FIFO, EDMA request only assert when received bytes + equal or more than RX water mark, there is potential issue if RX water + mark larger than 1. + For example, if RX FIFO water mark is 2, upper layer needs 5 bytes and + 5 bytes are received. the last byte will be saved in FIFO but not trigger + EDMA transfer because the water mark is 2. + */ + if (NULL != rxEdmaHandle) + { + base->WATER &= (~LPUART_WATER_RXWATER_MASK); + } +#endif + + /* Save the handle in global variables to support the double weak mechanism. */ + s_lpuartHandle[instance] = handle; + /* Set LPUART_TransferEdmaHandleIRQ as DMA IRQ handler */ + s_lpuartIsr[instance] = LPUART_TransferEdmaHandleIRQ; + /* Disable all LPUART internal interrupts */ + LPUART_DisableInterrupts(base, (uint32_t)kLPUART_AllInterruptEnable); + /* Enable interrupt in NVIC. */ +#if defined(FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ) && FSL_FEATURE_LPUART_HAS_SEPARATE_RX_TX_IRQ + (void)EnableIRQ(s_lpuartTxIRQ[instance]); +#else + (void)EnableIRQ(s_lpuartIRQ[instance]); +#endif + + /* Configure TX. */ + if (NULL != txEdmaHandle) + { + EDMA_SetCallback(handle->txEdmaHandle, LPUART_SendEDMACallback, &s_lpuartEdmaPrivateHandle[instance]); + } + + /* Configure RX. */ + if (NULL != rxEdmaHandle) + { + EDMA_SetCallback(handle->rxEdmaHandle, LPUART_ReceiveEDMACallback, &s_lpuartEdmaPrivateHandle[instance]); + } +} + +/*! + * brief Sends data using eDMA. + * + * This function sends data using eDMA. This is a non-blocking function, which returns + * right away. When all data is sent, the send callback function is called. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param xfer LPUART eDMA transfer structure. See #lpuart_transfer_t. + * retval kStatus_Success if succeed, others failed. + * retval kStatus_LPUART_TxBusy Previous transfer on going. + * retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_SendEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, lpuart_transfer_t *xfer) +{ + assert(NULL != handle); + assert(NULL != handle->txEdmaHandle); + assert(NULL != xfer); + assert(NULL != xfer->data); + assert(0U != xfer->dataSize); + + edma_transfer_config_t xferConfig; + status_t status; + + /* If previous TX not finished. */ + if ((uint8_t)kLPUART_TxBusy == handle->txState) + { + status = kStatus_LPUART_TxBusy; + } + else + { + handle->txState = (uint8_t)kLPUART_TxBusy; + handle->txDataSizeAll = xfer->dataSize; + + /* Prepare transfer. */ + EDMA_PrepareTransfer(&xferConfig, xfer->data, sizeof(uint8_t), + (void *)(uint32_t *)LPUART_GetDataRegisterAddress(base), sizeof(uint8_t), sizeof(uint8_t), + xfer->dataSize, kEDMA_MemoryToPeripheral); + + /* Store the initially configured eDMA minor byte transfer count into the LPUART handle */ + handle->nbytes = (uint8_t)sizeof(uint8_t); + + /* Submit transfer. */ + if (kStatus_Success != + EDMA_SubmitTransfer(handle->txEdmaHandle, (const edma_transfer_config_t *)(uint32_t)&xferConfig)) + { + return kStatus_Fail; + } + EDMA_StartTransfer(handle->txEdmaHandle); + + /* Enable LPUART TX EDMA. */ + LPUART_EnableTxDMA(base, true); + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Receives data using eDMA. + * + * This function receives data using eDMA. This is non-blocking function, which returns + * right away. When all data is received, the receive callback function is called. + * + * param base LPUART peripheral base address. + * param handle Pointer to lpuart_edma_handle_t structure. + * param xfer LPUART eDMA transfer structure, see #lpuart_transfer_t. + * retval kStatus_Success if succeed, others fail. + * retval kStatus_LPUART_RxBusy Previous transfer ongoing. + * retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_ReceiveEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, lpuart_transfer_t *xfer) +{ + assert(NULL != handle); + assert(NULL != handle->rxEdmaHandle); + assert(NULL != xfer); + assert(NULL != xfer->data); + assert(0U != xfer->dataSize); + + edma_transfer_config_t xferConfig; + status_t status; + + /* If previous RX not finished. */ + if ((uint8_t)kLPUART_RxBusy == handle->rxState) + { + status = kStatus_LPUART_RxBusy; + } + else + { + handle->rxState = (uint8_t)kLPUART_RxBusy; + handle->rxDataSizeAll = xfer->dataSize; + + /* Prepare transfer. */ + EDMA_PrepareTransfer(&xferConfig, (void *)(uint32_t *)LPUART_GetDataRegisterAddress(base), sizeof(uint8_t), + xfer->data, sizeof(uint8_t), sizeof(uint8_t), xfer->dataSize, kEDMA_PeripheralToMemory); + + /* Store the initially configured eDMA minor byte transfer count into the LPUART handle */ + handle->nbytes = (uint8_t)sizeof(uint8_t); + + /* Submit transfer. */ + if (kStatus_Success != + EDMA_SubmitTransfer(handle->rxEdmaHandle, (const edma_transfer_config_t *)(uint32_t)&xferConfig)) + { + return kStatus_Fail; + } + EDMA_StartTransfer(handle->rxEdmaHandle); + + /* Enable LPUART RX EDMA. */ + LPUART_EnableRxDMA(base, true); + + status = kStatus_Success; + } + + return status; +} + +/*! + * brief Aborts the sent data using eDMA. + * + * This function aborts the sent data using eDMA. + * + * param base LPUART peripheral base address. + * param handle Pointer to lpuart_edma_handle_t structure. + */ +void LPUART_TransferAbortSendEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle) +{ + assert(NULL != handle); + assert(NULL != handle->txEdmaHandle); + + /* Disable LPUART TX EDMA. */ + LPUART_EnableTxDMA(base, false); + + /* Stop transfer. */ + EDMA_AbortTransfer(handle->txEdmaHandle); + + handle->txState = (uint8_t)kLPUART_TxIdle; +} + +/*! + * brief Aborts the received data using eDMA. + * + * This function aborts the received data using eDMA. + * + * param base LPUART peripheral base address. + * param handle Pointer to lpuart_edma_handle_t structure. + */ +void LPUART_TransferAbortReceiveEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle) +{ + assert(NULL != handle); + assert(NULL != handle->rxEdmaHandle); + + /* Disable LPUART RX EDMA. */ + LPUART_EnableRxDMA(base, false); + + /* Stop transfer. */ + EDMA_AbortTransfer(handle->rxEdmaHandle); + + handle->rxState = (uint8_t)kLPUART_RxIdle; +} + +/*! + * brief Gets the number of received bytes. + * + * This function gets the number of received bytes. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param count Receive bytes count. + * retval kStatus_NoTransferInProgress No receive in progress. + * retval kStatus_InvalidArgument Parameter is invalid. + * retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetReceiveCountEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, uint32_t *count) +{ + assert(NULL != handle); + assert(NULL != handle->rxEdmaHandle); + assert(NULL != count); + + if ((uint8_t)kLPUART_RxIdle == handle->rxState) + { + return kStatus_NoTransferInProgress; + } + + *count = handle->rxDataSizeAll - + ((uint32_t)handle->nbytes * + EDMA_GetRemainingMajorLoopCount(handle->rxEdmaHandle->base, handle->rxEdmaHandle->channel)); + + return kStatus_Success; +} + +/*! + * brief Gets the number of bytes written to the LPUART TX register. + * + * This function gets the number of bytes written to the LPUART TX + * register by DMA. + * + * param base LPUART peripheral base address. + * param handle LPUART handle pointer. + * param count Send bytes count. + * retval kStatus_NoTransferInProgress No send in progress. + * retval kStatus_InvalidArgument Parameter is invalid. + * retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetSendCountEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, uint32_t *count) +{ + assert(NULL != handle); + assert(NULL != handle->txEdmaHandle); + assert(NULL != count); + + if ((uint8_t)kLPUART_TxIdle == handle->txState) + { + return kStatus_NoTransferInProgress; + } + + *count = handle->txDataSizeAll - + ((uint32_t)handle->nbytes * + EDMA_GetRemainingMajorLoopCount(handle->txEdmaHandle->base, handle->txEdmaHandle->channel)); + + return kStatus_Success; +} + +/*! + * brief LPUART eDMA IRQ handle function. + * + * This function handles the LPUART tx complete IRQ request and invoke user callback. + * It is not set to static so that it can be used in user application. + * note This function is used as default IRQ handler by double weak mechanism. + * If user's specific IRQ handler is implemented, make sure this function is invoked in the handler. + * + * param base LPUART peripheral base address. + * param lpuartEdmaHandle LPUART handle pointer. + */ +void LPUART_TransferEdmaHandleIRQ(LPUART_Type *base, void *lpuartEdmaHandle) +{ + assert(lpuartEdmaHandle != NULL); + /* + * $Branch Coverage Justification$ + * $ref fsl_lpuart_edma_c_ref_2$ + */ + if (((uint32_t)kLPUART_TransmissionCompleteFlag & LPUART_GetStatusFlags(base)) != 0U) + { + lpuart_edma_handle_t *handle = (lpuart_edma_handle_t *)lpuartEdmaHandle; + + /* Disable tx complete interrupt */ + LPUART_DisableInterrupts(base, (uint32_t)kLPUART_TransmissionCompleteInterruptEnable); + + handle->txState = (uint8_t)kLPUART_TxIdle; + + if (handle->callback != NULL) + { + handle->callback(base, handle, kStatus_LPUART_TxIdle, handle->userData); + } + } +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart_edma.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart_edma.h new file mode 100644 index 00000000000..1190ed36e86 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_lpuart_edma.h @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_LPUART_EDMA_H_ +#define FSL_LPUART_EDMA_H_ + +#include "fsl_lpuart.h" +#include "fsl_edma.h" + +/*! + * @addtogroup lpuart_edma_driver + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief LPUART EDMA driver version. */ +#define FSL_LPUART_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 6, 0)) +/*! @} */ + +/* Forward declaration of the handle typedef. */ +typedef struct _lpuart_edma_handle lpuart_edma_handle_t; + +/*! @brief LPUART transfer callback function. */ +typedef void (*lpuart_edma_transfer_callback_t)(LPUART_Type *base, + lpuart_edma_handle_t *handle, + status_t status, + void *userData); + +/*! + * @brief LPUART eDMA handle + */ +struct _lpuart_edma_handle +{ + lpuart_edma_transfer_callback_t callback; /*!< Callback function. */ + void *userData; /*!< LPUART callback function parameter.*/ + size_t rxDataSizeAll; /*!< Size of the data to receive. */ + size_t txDataSizeAll; /*!< Size of the data to send out. */ + + edma_handle_t *txEdmaHandle; /*!< The eDMA TX channel used. */ + edma_handle_t *rxEdmaHandle; /*!< The eDMA RX channel used. */ + + uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ + + volatile uint8_t txState; /*!< TX transfer state. */ + volatile uint8_t rxState; /*!< RX transfer state */ +}; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name eDMA transactional + * @{ + */ + +/*! + * @brief Initializes the LPUART handle which is used in transactional functions. + * + * @note This function disables all LPUART interrupts. + * + * @param base LPUART peripheral base address. + * @param handle Pointer to lpuart_edma_handle_t structure. + * @param callback Callback function. + * @param userData User data. + * @param txEdmaHandle User requested DMA handle for TX DMA transfer. + * @param rxEdmaHandle User requested DMA handle for RX DMA transfer. + */ +void LPUART_TransferCreateHandleEDMA(LPUART_Type *base, + lpuart_edma_handle_t *handle, + lpuart_edma_transfer_callback_t callback, + void *userData, + edma_handle_t *txEdmaHandle, + edma_handle_t *rxEdmaHandle); + +/*! + * @brief Sends data using eDMA. + * + * This function sends data using eDMA. This is a non-blocking function, which returns + * right away. When all data is sent, the send callback function is called. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param xfer LPUART eDMA transfer structure. See #lpuart_transfer_t. + * @retval kStatus_Success if succeed, others failed. + * @retval kStatus_LPUART_TxBusy Previous transfer on going. + * @retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_SendEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, lpuart_transfer_t *xfer); + +/*! + * @brief Receives data using eDMA. + * + * This function receives data using eDMA. This is non-blocking function, which returns + * right away. When all data is received, the receive callback function is called. + * + * @param base LPUART peripheral base address. + * @param handle Pointer to lpuart_edma_handle_t structure. + * @param xfer LPUART eDMA transfer structure, see #lpuart_transfer_t. + * @retval kStatus_Success if succeed, others fail. + * @retval kStatus_LPUART_RxBusy Previous transfer ongoing. + * @retval kStatus_InvalidArgument Invalid argument. + */ +status_t LPUART_ReceiveEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, lpuart_transfer_t *xfer); + +/*! + * @brief Aborts the sent data using eDMA. + * + * This function aborts the sent data using eDMA. + * + * @param base LPUART peripheral base address. + * @param handle Pointer to lpuart_edma_handle_t structure. + */ +void LPUART_TransferAbortSendEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle); + +/*! + * @brief Aborts the received data using eDMA. + * + * This function aborts the received data using eDMA. + * + * @param base LPUART peripheral base address. + * @param handle Pointer to lpuart_edma_handle_t structure. + */ +void LPUART_TransferAbortReceiveEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle); + +/*! + * @brief Gets the number of bytes written to the LPUART TX register. + * + * This function gets the number of bytes written to the LPUART TX + * register by DMA. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param count Send bytes count. + * @retval kStatus_NoTransferInProgress No send in progress. + * @retval kStatus_InvalidArgument Parameter is invalid. + * @retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetSendCountEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, uint32_t *count); + +/*! + * @brief Gets the number of received bytes. + * + * This function gets the number of received bytes. + * + * @param base LPUART peripheral base address. + * @param handle LPUART handle pointer. + * @param count Receive bytes count. + * @retval kStatus_NoTransferInProgress No receive in progress. + * @retval kStatus_InvalidArgument Parameter is invalid. + * @retval kStatus_Success Get successfully through the parameter \p count; + */ +status_t LPUART_TransferGetReceiveCountEDMA(LPUART_Type *base, lpuart_edma_handle_t *handle, uint32_t *count); + +/*! + * @brief LPUART eDMA IRQ handle function. + * + * This function handles the LPUART tx complete IRQ request and invoke user callback. + * It is not set to static so that it can be used in user application. + * @note This function is used as default IRQ handler by double weak mechanism. + * If user's specific IRQ handler is implemented, make sure this function is invoked in the handler. + * + * @param base LPUART peripheral base address. + * @param lpuartEdmaHandle LPUART handle pointer. + */ +void LPUART_TransferEdmaHandleIRQ(LPUART_Type *base, void *lpuartEdmaHandle); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_LPUART_EDMA_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_opamp.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_opamp.c new file mode 100644 index 00000000000..f75075d3ec4 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_opamp.c @@ -0,0 +1,193 @@ +/* + * Copyright 2021-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_opamp.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.opamp" +#endif + +#if defined(OPAMP_RSTS) +#define OPAMP_RESETS_ARRAY OPAMP_RSTS +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static uint32_t OPAMP_GetInstance(OPAMP_Type *base); + +/******************************************************************************* + * Variables + ******************************************************************************/ +static OPAMP_Type *const s_opampBases[] = OPAMP_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to OPAMP clocks for each instance. */ +static const clock_ip_name_t s_opampClocks[] = OPAMP_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(OPAMP_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_opampResets[] = OPAMP_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ + +static uint32_t OPAMP_GetInstance(OPAMP_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0UL; instance < ARRAY_SIZE(s_opampBases); instance++) + { + if (s_opampBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_opampBases)); + + return instance; +} + +/*! + * brief Initialize OPAMP instance. + * + * param base OPAMP peripheral base address. + * param config The pointer to opamp_config_t. + */ +void OPAMP_Init(OPAMP_Type *base, const opamp_config_t *config) +{ + assert(config != NULL); + + uint32_t tmp32 = 0U; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable the clock. */ + CLOCK_EnableClock(s_opampClocks[OPAMP_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(OPAMP_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_opampResets[OPAMP_GetInstance(base)]); +#endif + + tmp32 = OPAMP_OPAMP_CTR_EN(config->enable) | OPAMP_OPAMP_CTR_MODE(config->mode) | + OPAMP_OPAMP_CTR_BIASC(config->trimOption) | OPAMP_OPAMP_CTR_INTREF(config->intRefVoltage) | + OPAMP_OPAMP_CTR_PREF(config->posRefVoltage) | +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW + OPAMP_OPAMP_CTR_OUTSW(config->enableOutputSwitch) | +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1 + OPAMP_OPAMP_CTR_ADCSW1(config->enablePosADCSw1) | +#else + OPAMP_OPAMP_CTR_ADCSW(config->enablePosADCSw) | +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1 */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2 + OPAMP_OPAMP_CTR_ADCSW2(config->enablePosADCSw2) | +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2 */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL + OPAMP_OPAMP_CTR_INPSEL(config->PosInputChannelSelection) | +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD + OPAMP_OPAMP_CTR_TRIGMD(config->enableTriggerMode) | +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD */ + OPAMP_OPAMP_CTR_NGAIN(config->negGain); + base->OPAMP_CTR = tmp32; +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN + if (config->enableRefBuffer) + { + assert((uint32_t)(config->posGain) <= 7UL); + base->OPAMP_CTR |= OPAMP_OPAMP_CTR_PGAIN(config->posGain) | OPAMP_OPAMP_CTR_BUFEN_MASK; + } + else + { + if ((uint32_t)(config->posGain) > 7UL) + { + base->OPAMP_CTR |= OPAMP_OPAMP_CTR_PGAIN((uint32_t)(config->posGain) - 7UL); + } + else + { + assert((uint32_t)(config->posGain) == 0UL); + base->OPAMP_CTR |= OPAMP_OPAMP_CTR_PGAIN(config->posGain); + } + } +#else + base->OPAMP_CTR |= OPAMP_OPAMP_CTR_PGAIN(config->posGain); +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD */ +} + +/*! + * brief De-initialize OPAMP instance. + * + * param base OPAMP peripheral base address. + */ +void OPAMP_Deinit(OPAMP_Type *base) +{ + /* Disable OPAMP instance. */ + base->OPAMP_CTR &= ~OPAMP_OPAMP_CTR_EN_MASK; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Disable the clock. */ + CLOCK_DisableClock(s_opampClocks[OPAMP_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * brief Get default configuration of OPAMP. + * + * code + * config->enable = false; + * config->mode = kOPAMP_LowNoiseMode; + * config->trimOption = kOPAMP_TrimOptionDefault; + * config->intRefVoltage = kOPAMP_IntRefVoltVddaDiv2; + * config->enablePosADCSw = false; + * config->posRefVoltage = kOPAMP_PosRefVoltVrefh3; + * config->posGain = kOPAMP_PosGainReserved; + * config->negGain = kOPAMP_NegGainBufferMode; + * endcode + * + * param config The pointer to opamp_config_t. + */ +void OPAMP_GetDefaultConfig(opamp_config_t *config) +{ + assert(config != NULL); + + config->enable = false; + config->mode = kOPAMP_LowNoiseMode; + config->trimOption = kOPAMP_TrimOptionDefault; + config->intRefVoltage = kOPAMP_IntRefVoltVddaDiv2; + config->posRefVoltage = kOPAMP_PosRefVoltVrefh3; + config->posGain = kOPAMP_PosGainReserved; + config->negGain = kOPAMP_NegGainBufferMode; +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW + config->enableOutputSwitch = true; +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1 + config->enablePosADCSw1 = false; +#else + config->enablePosADCSw = false; +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1 */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2 + config->enablePosADCSw2 = false; +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2 */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN + config->enableRefBuffer = false; +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL + config->PosInputChannelSelection = kOPAMP_PosInputChannel0; +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD + config->enableTriggerMode = false; +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD */ +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_opamp.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_opamp.h new file mode 100644 index 00000000000..c9767193d0b --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_opamp.h @@ -0,0 +1,301 @@ +/* + * Copyright 2021-2022, 2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_OPAMP_H_ +#define FSL_OPAMP_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup opamp + * @{ + */ + +/******************************************************************************* + * Definitions + *******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief OPAMP driver version. */ +#define FSL_OPAMP_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) +/*! @} */ + +/*! + * @brief The enumeration of OPAMP mode, including low noise mode and high speed mode. + */ +typedef enum _opamp_mode +{ + kOPAMP_LowNoiseMode = 0U, /*!< Set opamp mode as low noise mode. */ + kOPAMP_HighSpeedMode, /*!< Set opamp mode as high speed mode. */ +} opamp_mode_t; + +/*! + * @brief The enumeration of bias current trim option. + */ +typedef enum _opamp_bias_current_trim_option +{ + kOPAMP_TrimOptionDefault = 0U, /*!< Default Bias current trim option. */ + kOPAMP_TrimOptionIncreaseCurrent, /*!< Trim option selected as increase current. */ + kOPAMP_TrimOptionDecreaseCurrent, /*!< Trim option selected as decrease current. */ + kOPAMP_TrimOptionFurtherDecreaseCurrent, /*!< Trim option selected as further decrease current. */ +} opamp_bias_current_trim_option_t; + +/*! + * @brief The enumeration of internal reference voltage. + */ +typedef enum _opamp_internal_ref_voltage +{ + kOPAMP_IntRefVoltVddaDiv2 = 0U, /*!< Internal reference voltage selected as Vdda/2. */ + kOPAMP_IntRefVoltVdda3V, /*!< Internal reference voltage selected as Vdda_3V. */ + kOPAMP_IntRefVoltVssa3V, /*!< Internal reference voltage selected as Vssa_3V. */ + kOPAMP_IntRefVoltNotAllowed, /*!< Internal reference voltage not allowed. */ +} opamp_internal_ref_voltage_t; + +/*! + * @brief The enumeration of positive reference voltage(please refer to manual use). + */ +typedef enum _opamp_positive_ref_voltage +{ + kOPAMP_PosRefVoltVrefh3 = 0U, /*!< Positive part reference voltage select Vrefh3, connected from DAC output. */ + kOPAMP_PosRefVoltVrefh0 = 1U, /*!< Positive part reference voltage select Vrefh0, connected from VDDA supply. */ + kOPAMP_PosRefVoltVrefh1 = 2U, /*!< Positive part reference voltage select Vrefh1, + connected from Voltage reference output. */ + kOPAMP_PosRefVoltVrefh4 = 3U, /*!< Positive part reference voltage select 520mv or reserved.*/ +} opamp_positive_ref_voltage_t; + +/*! + * @brief The enumeration of positive programmable gain (please refer to manual use). + */ +typedef enum _opamp_positive_gain +{ + kOPAMP_PosGainReserved = 0U, /*!< Positive Gain reserved. */ + kOPAMP_PosGainNonInvert1X = 1U, /*!< Positive non-inverting gain application 1X. */ + kOPAMP_PosGainNonInvert2X = 2U, /*!< Positive non-inverting gain application 2X. */ + kOPAMP_PosGainNonInvert4X = 3U, /*!< Positive non-inverting gain application 4X. */ + kOPAMP_PosGainNonInvert8X = 4U, /*!< Positive non-inverting gain application 8X. */ + kOPAMP_PosGainNonInvert16X = 5U, /*!< Positive non-inverting gain application 16X. */ + kOPAMP_PosGainNonInvert33X = 6U, /*!< Positive non-inverting gain application 33X. */ + kOPAMP_PosGainNonInvert64X = 7U, /*!< Positive non-inverting gain application 64X. */ +#if defined(FSL_FEATURE_OPAMP_HAS_SUPPORT_REFERENCE_BUFFER) && FSL_FEATURE_OPAMP_HAS_SUPPORT_REFERENCE_BUFFER + /* The following gain selections are for basic OPAMP only, and signal inputs are + supported on the non-inverting and inverting terminals.*/ + kOPAMP_PosGainNonInvertDisableBuffer2X = 8U, /*!< Positive non-inverting gain application 2X. */ + kOPAMP_PosGainNonInvertDisableBuffer3X = 9U, /*!< Positive non-inverting gain application 3X. */ + kOPAMP_PosGainNonInvertDisableBuffer5X = 10U, /*!< Positive non-inverting gain application 5X. */ + kOPAMP_PosGainNonInvertDisableBuffer9X = 11U, /*!< Positive non-inverting gain application 9X. */ + kOPAMP_PosGainNonInvertDisableBuffer17X = 12U, /*!< Positive non-inverting gain application 17X. */ + kOPAMP_PosGainNonInvertDisableBuffer34X = 13U, /*!< Positive non-inverting gain application 34X. */ + kOPAMP_PosGainNonInvertDisableBuffer65X = 14U, /*!< Positive non-inverting gain application 65X. */ +#endif /* FSL_FEATURE_OPAMP_HAS_SUPPORT_REFERENCE_BUFFER */ +} opamp_positive_gain_t; + +/*! + * @brief The enumeration of negative programmable gain. + */ +typedef enum _opamp_negative_gain +{ + kOPAMP_NegGainBufferMode = 0U, /*!< Negative Buffer Mode. */ + kOPAMP_NegGainInvert1X, /*!< Negative inverting gain application -1X. */ + kOPAMP_NegGainInvert2X, /*!< Negative inverting gain application -2X. */ + kOPAMP_NegGainInvert4X, /*!< Negative inverting gain application -4X. */ + kOPAMP_NegGainInvert8X, /*!< Negative inverting gain application -8X. */ + kOPAMP_NegGainInvert16X, /*!< Negative inverting gain application -16X. */ + kOPAMP_NegGainInvert33X, /*!< Negative inverting gain application -33X. */ + kOPAMP_NegGainInvert64X, /*!< Negative inverting gain application -64X. */ +} opamp_negative_gain_t; + +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL +/*! + * @brief The enumeration of positive input channel selection. + */ +typedef enum _opamp_positive_input_channel_selection +{ + kOPAMP_PosInputChannel0 = 0U, /*!< When OPAMP not in trigger mode, select positive input 0 (INP0).*/ + kOPAMP_PosInputChannel1 = 1U, /*!< When OPAMP not in trigger mode, select positive input 1 (INP1).*/ +} opamp_positive_input_channel_selection_t; +#endif +/*! + * @brief OPAMP configuraion, including mode, internal reference voltage, positive gain, negative gain and so on. + */ +typedef struct _opamp_config +{ + bool enable; /*!< Enable/disable OPAMP. */ + opamp_mode_t mode; /*!< Opamp mode, available values are @ref kOPAMP_LowNoiseMode and @ref kOPAMP_HighSpeedMode. */ + opamp_bias_current_trim_option_t trimOption; /*!< Bias current trim option, please refer to + @ref opamp_bias_current_trim_option_t. */ + opamp_internal_ref_voltage_t intRefVoltage; /*!< Internal reference voltage, please refer to + @ref opamp_internal_ref_voltage_t. */ + opamp_positive_ref_voltage_t posRefVoltage; /*!< Positive part reference voltage, please refer + to @ref opamp_positive_ref_voltage_t. */ + /* Positive part configuration. */ + opamp_positive_gain_t posGain; /*!< Positive part programmable gain, please refer + to @ref opamp_positive_gain_t. */ + /* Negative part configuration. */ + opamp_negative_gain_t negGain; /*!< Negative part programmable gain, please refer + to @ref opamp_negative_gain_t. */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW + bool enableOutputSwitch; /*!< OPAMP out to negative gain resistor ladder switch.*/ +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_OUTSW */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1 + bool enablePosADCSw1; /*!< Positive part reference voltage switch to ADC channel or not. + - \b true Positive part reference voltage switch to ADC channel. + - \b false Positive part reference voltage do not switch to ADC channel. */ +#else + bool enablePosADCSw; /*!< Positive part reference voltage switch to ADC channel or not. + - \b true Positive part reference voltage switch to ADC channel. + - \b false Positive part reference voltage do not switch to ADC channel. */ +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW1 */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2 + bool enablePosADCSw2; /*!< Positive part reference voltage switch to ADC channel or not. + - \b true Positive part reference voltage switch to ADC channel. + - \b false Positive part reference voltage do not switch to ADC channel. */ +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_ADCSW2 */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN + bool enableRefBuffer; /*!< Reference buffer enable.*/ +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL + opamp_positive_input_channel_selection_t PosInputChannelSelection; /*!< Positive Input Channel Selection*/ +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_INPSEL */ +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD + bool enableTriggerMode; /*!< Trigger Mode Enable.*/ +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD */ +} opamp_config_t; + +/******************************************************************************* + * API + *******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Initialize OPAMP instance. + * + * @param base OPAMP peripheral base address. + * @param config The pointer to @ref opamp_config_t. + */ +void OPAMP_Init(OPAMP_Type *base, const opamp_config_t *config); + +/*! + * @brief De-initialize OPAMP instance. + * + * @param base OPAMP peripheral base address. + */ +void OPAMP_Deinit(OPAMP_Type *base); + +/*! + * @brief Get default configuration of OPAMP. + * + * @code + * config->enable = false; + * config->mode = kOPAMP_LowNoiseMode; + * config->trimOption = kOPAMP_TrimOptionDefault; + * config->intRefVoltage = kOPAMP_IntRefVoltVddaDiv2; + * config->enablePosADCSw = false; + * config->posRefVoltage = kOPAMP_PosRefVoltVrefh3; + * config->posGain = kOPAMP_PosGainReserved; + * config->negGain = kOPAMP_NegGainBufferMode; + * @endcode + * + * @param config The pointer to @ref opamp_config_t. + */ +void OPAMP_GetDefaultConfig(opamp_config_t *config); + +/*! @} */ + +/*! + * @name Positive port gain and negative gain configuration. + * @{ + */ +/*! + * @brief Configure OPAMP positive port gain. + * + * @param base OPAMP peripheral base address. + * @param option OPAMP positive port gain. + */ +static inline void OPAMP_DoPosGainConfig(OPAMP_Type *base, opamp_positive_gain_t option) +{ + base->OPAMP_CTR = (((base->OPAMP_CTR) & (~OPAMP_OPAMP_CTR_PGAIN_MASK)) | OPAMP_OPAMP_CTR_PGAIN(option)); +} + +/*! + * @brief Configure OPAMP negative port gain. + * + * @param base OPAMP peripheral base address. + * @param option OPAMP negative port gain. + */ +static inline void OPAMP_DoNegGainConfig(OPAMP_Type *base, opamp_negative_gain_t option) +{ + base->OPAMP_CTR = (((base->OPAMP_CTR) & (~OPAMP_OPAMP_CTR_NGAIN_MASK)) | OPAMP_OPAMP_CTR_NGAIN(option)); +} +/*! @} */ + +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN +/*! + * @name Reference Buffer Control Interface + * @{ + */ + +/*! + * @brief Enable reference buffer. + * + * @param base OPAMP peripheral base address. + * @param enable true to enable and false to disable. + */ +static inline void OPAMP_EnableRefBuffer(OPAMP_Type *base, bool enable) +{ + if (enable) + { + base->OPAMP_CTR |= OPAMP_OPAMP_CTR_BUFEN_MASK; + } + else + { + base->OPAMP_CTR &= ~(uint32_t)OPAMP_OPAMP_CTR_BUFEN_MASK; + } +} +/*! @} */ +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_BUFEN */ + +#if defined(FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD) && FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD +/*! + * @name Trigger Mode Control Interface + * @{ + */ + +/*! + * @brief Enable OPAMP trigger mode. + * + * @param base OPAMP peripheral base address. + * @param enable true to enable and false to disable. + */ +static inline void OPAMP_EnableTriggerMode(OPAMP_Type *base, bool enable) +{ + if (enable) + { + base->OPAMP_CTR |= OPAMP_OPAMP_CTR_TRIGMD_MASK; + } + else + { + base->OPAMP_CTR &= ~(uint32_t)OPAMP_OPAMP_CTR_TRIGMD_MASK; + } +} +/*! @} */ +#endif /* FSL_FEATURE_OPAMP_HAS_OPAMP_CTR_TRIGMD */ + +#if defined(__cplusplus) +} +#endif + +/*! @} */ + +#endif /* FSL_OPAMP_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ostimer.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ostimer.c new file mode 100644 index 00000000000..d978556afbc --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ostimer.c @@ -0,0 +1,384 @@ +/* + * Copyright 2018-2021, 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_ostimer.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.ostimer" +#endif + +#if defined(OSTIMER_RSTS) +#define OSTIMER_RESETS_ARRAY OSTIMER_RSTS +#endif + +/* Typedef for interrupt handler. */ +typedef void (*ostimer_isr_t)(OSTIMER_Type *base, ostimer_callback_t cb); + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Gets the instance from the base address + * + * @param base OSTIMER peripheral base address + * + * @return The OSTIMER instance + */ +static uint32_t OSTIMER_GetInstance(OSTIMER_Type *base); + +#if (defined(FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) && FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) +/* @brief Translate the value from gray-code to decimal by the Code Gray in SYSCTL. + * + * @param gray The gray value input. + * + * @return the decimal value. + */ +static uint64_t OSTIMER_GrayToDecimalbyCodeGray(uint64_t gray); +#endif /* FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY. */ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* Array of OSTIMER handle. */ +static ostimer_callback_t s_ostimerHandle[FSL_FEATURE_SOC_OSTIMER_COUNT]; +/* Array of OSTIMER peripheral base address. */ +static OSTIMER_Type *const s_ostimerBases[] = OSTIMER_BASE_PTRS; +/* Array of OSTIMER IRQ number. */ +static const IRQn_Type s_ostimerIRQ[] = OSTIMER_IRQS; +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/* Array of OSTIMER clock name. */ +static const clock_ip_name_t s_ostimerClock[] = OSTIMER_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +/* OSTIMER ISR for transactional APIs. */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +static ostimer_isr_t s_ostimerIsr = (ostimer_isr_t)DefaultISR; +#else +static ostimer_isr_t s_ostimerIsr; +#endif + +#if defined(OSTIMER_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_ostimerResets[] = OSTIMER_RESETS_ARRAY; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ + +/* @brief Function for getting the instance number of OS timer. */ +static uint32_t OSTIMER_GetInstance(OSTIMER_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_ostimerBases); instance++) + { + if (s_ostimerBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_ostimerBases)); + + return instance; +} + +#if (defined(FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) && FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) +/* @brief Translate the value from gray-code to decimal by the Code Gray in SYSCTL. + * + * @param gray The gray value input. + * + * @return the decimal value. + */ +static uint64_t OSTIMER_GrayToDecimalbyCodeGray(uint64_t gray) +{ + uint64_t decOut; + + SYSCTL->CODE_GRAY_LSB = (uint32_t)(gray & 0xFFFFFFFFU); + SYSCTL->CODE_GRAY_MSB = (uint32_t)((gray >> 32U) & 0x3FFU); // limit to 42bits as OSevent timer + __NOP(); + decOut = ((uint64_t)(SYSCTL->CODE_BIN_MSB) & 0x3FFU) << 32U; + decOut |= (uint64_t)(SYSCTL->CODE_BIN_LSB); + + return decOut; +} +#endif /* FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY. */ + +/* @brief Translate the value from gray-code to decimal. */ +/* + * @param gray The gray value input. + * + * @return the decimal value. + */ +uint64_t OSTIMER_GrayToDecimal(uint64_t gray) +{ +#if (defined(FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) && FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) + return OSTIMER_GrayToDecimalbyCodeGray(gray); +#else + uint64_t temp = gray; + while (temp != 0U) + { + temp >>= 1U; + gray ^= temp; + } + + return gray; +#endif /* FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY. */ +} + +/* @brief Enable the OSTIMER interrupt. + * + * After calling this function, the OSTIMER driver will enable/disable the IRQ and module interrupt enablement. + * + * @param base OSTIMER peripheral base address. + * @param enable enable/disable the IRQ and module interrupt enablement. + * - true: Disable the IRQ and module interrupt enablement. + * - false: Disable the IRQ and module interrupt enablement. + * @return none + */ +static void OSTIMER_EnableInterrupt(OSTIMER_Type *base, bool enable) +{ + assert(NULL != base); + + if (enable) + { + /* Enable the IRQ and module interrupt enablement. */ + (void)EnableIRQ(s_ostimerIRQ[OSTIMER_GetInstance(base)]); + base->OSEVENT_CTRL |= OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK; + } + else + { + /* Clear interrupt flag, disable the IRQ and module interrupt enablement. */ + (void)DisableIRQ(s_ostimerIRQ[OSTIMER_GetInstance(base)]); + base->OSEVENT_CTRL &= ~OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK; /* Clear interrupt flag by writing 1. */ + } +} + +/*! + * @brief Initializes an OSTIMER by turning it's clock on. + * + */ +void OSTIMER_Init(OSTIMER_Type *base) +{ + assert(NULL != base); + + uint32_t instance = OSTIMER_GetInstance(base); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +#if !(defined(FSL_FEATURE_PMC_HAS_NO_OSTIMER_REG) && FSL_FEATURE_PMC_HAS_NO_OSTIMER_REG) + /* Enable the OSTIMER 32k clock in PMC module. */ + CLOCK_EnableOstimer32kClock(); +#endif + /* Enable clock for OSTIMER. */ + CLOCK_EnableClock(s_ostimerClock[instance]); +#if (defined(FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) && FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) + CLOCK_EnableClock(kCLOCK_Sysctl); +#endif /* FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY. */ +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(OSTIMER_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_ostimerResets[OSTIMER_GetInstance(base)]); +#endif +} + +/*! + * @brief Deinitializes a OSTIMER instance. + * + * This function shuts down OSTIMER clock + * + * @param base OSTIMER peripheral base address. + */ +void OSTIMER_Deinit(OSTIMER_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable clock for OSTIMER. */ + CLOCK_DisableClock(s_ostimerClock[OSTIMER_GetInstance(base)]); +#if (defined(FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) && FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY) + CLOCK_DisableClock(kCLOCK_Sysctl); +#endif /* FSL_FEATURE_SYSCTRL_HAS_CODE_GRAY. */ +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * @brief Get OSTIMER status Flags. + * + * This returns the status flag. + * Currently, only match interrupt flag can be got. + * + * @param base OSTIMER peripheral base address. + * @return status register value + */ +uint32_t OSTIMER_GetStatusFlags(OSTIMER_Type *base) +{ + return base->OSEVENT_CTRL & OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_MASK; +} + +/*! + * @brief Clear Status Interrupt Flags. + * + * This clears intr status flag. + * Currently, only match interrupt flag can be cleared. + * + * @param base OSTIMER peripheral base address. + * @param mask Clear bit mask. + * @return none + */ +void OSTIMER_ClearStatusFlags(OSTIMER_Type *base, uint32_t mask) +{ + base->OSEVENT_CTRL |= mask; +} + +/*! + * @brief Set the match raw value for OSTIMER. + * + * This function will set a match value for OSTIMER with an optional callback. And this callback + * will be called while the data in dedicated pair match register is equals to the value of central EVTIMER. + * Please note that, the data format is gray-code, if decimal data was desired, please using OSTIMER_SetMatchValue(). + * + * @param base OSTIMER peripheral base address. + * @param count OSTIMER timer match value.(Value is gray-code format) + * + * @param cb OSTIMER callback (can be left as NULL if none, otherwise should be a void func(void)). + * @retval kStatus_Success - Set match raw value and enable interrupt Successfully. + * @retval kStatus_Fail - Set match raw value fail. + */ +status_t OSTIMER_SetMatchRawValue(OSTIMER_Type *base, uint64_t count, ostimer_callback_t cb) +{ +#ifdef OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK + uint64_t decValueTimer; +#endif + status_t status; + uint64_t tmp = count; + uint32_t instance = OSTIMER_GetInstance(base); + + /* Clear interrupt flag, disable the IRQ and module interrupt enablement. */ + OSTIMER_EnableInterrupt(base, false); + + s_ostimerIsr = OSTIMER_HandleIRQ; + s_ostimerHandle[instance] = cb; + + /* Set the match value. */ + base->MATCH_L = (uint32_t)tmp; + base->MATCH_H = (uint32_t)(tmp >> 32U); + +#ifdef OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK + /* Workaround-2019-12-30: + * Since OSTimer's counter register is Gray-encoded, it would cost more time to write register. When EVTimer Match + * Write Ready bit is low, which means the previous match value has been updated successfully by that time, it is + * safe to reload (write) the Match Registers. Even if there is the RM comment that "In typical applications, it + * should not be necessary to test this bit", but we found the interruption would not be reported when the delta + * timer user added is smaller(IE: RT595 11us in 1MHz typical application) in release version." To prevent such + * issue from happening, we'd better wait for the match value to update successfully before enabling IRQ. + */ + while (0U != (base->OSEVENT_CTRL & OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK)) + { + } + + /* After the WR_RDY bit became low, we need to check whether current time goes ahead of the match value we set. + * (1) If current timer value has gone ahead of the match value, the interrupt will not be reported before 64-bit + * timer value over flow. We need to check whether the interrupt flag has been set or not: if yes, we will enable + * interrupt and return success; if not, we will return fail directly. + * (2) If current timer value has not gone ahead of match value, we will enable interrupt and return success. + */ + decValueTimer = OSTIMER_GetCurrentTimerValue(base); + if ((decValueTimer >= OSTIMER_GrayToDecimal(tmp)) && + (0U == (base->OSEVENT_CTRL & (uint32_t)kOSTIMER_MatchInterruptFlag))) + { + status = kStatus_Fail; + } + else +#endif /* #ifdef OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK */ + { + /* Enable the module interrupt enablement. */ + OSTIMER_EnableInterrupt(base, true); + status = kStatus_Success; + } + + return status; +} + +/*! + * @brief Set the match value for OSTIMER. + * + * This function will set a match value for OSTIMER with an optional callback. And this callback + * will be called while the data in dedicated pair match register is equals to the value of central EVTIMER. + * + * @param base OSTIMER peripheral base address. + * @param count OSTIMER timer match value.(Value is decimal format, and this value will be translate to Gray code in + * API. ) + * @param cb OSTIMER callback (can be left as NULL if none, otherwise should be a void func(void)). + * @retval kStatus_Success - Set match value and enable interrupt Successfully. + * @retval kStatus_Fail - Set match value fail. + */ +status_t OSTIMER_SetMatchValue(OSTIMER_Type *base, uint64_t count, ostimer_callback_t cb) +{ + uint64_t tmp = OSTIMER_DecimalToGray(count); + + return OSTIMER_SetMatchRawValue(base, tmp, cb); +} + +/*! + * @brief Get current timer count value from OSTIMER. + * + * This function will get a decimal timer count value. + * The RAW value of timer count is gray code format, will be translated to decimal data internally. + * + * @param base OSTIMER peripheral base address. + * @return Value of OSTIMER which will formated to decimal value. + */ +uint64_t OSTIMER_GetCurrentTimerValue(OSTIMER_Type *base) +{ + uint64_t tmp = 0U; + + tmp = OSTIMER_GetCurrentTimerRawValue(base); + + return OSTIMER_GrayToDecimal(tmp); +} + +/*! + * @brief Get the capture value from OSTIMER. + * + * This function will get a capture decimal-value from OSTIMER. + * The RAW value of timer capture is gray code format, will be translated to decimal data internally. + * + * @param base OSTIMER peripheral base address. + * @return Value of capture register, data format is decimal. + */ +uint64_t OSTIMER_GetCaptureValue(OSTIMER_Type *base) +{ + uint64_t tmp = 0U; + + tmp = OSTIMER_GetCaptureRawValue(base); + + return OSTIMER_GrayToDecimal(tmp); +} + +void OSTIMER_HandleIRQ(OSTIMER_Type *base, ostimer_callback_t cb) +{ + /* Clear interrupt flag, disable the IRQ and module interrupt enablement. */ + OSTIMER_EnableInterrupt(base, false); + + if (cb != NULL) + { + cb(); + } +} + +void OS_EVENT_DriverIRQHandler(void); +void OS_EVENT_DriverIRQHandler(void) +{ + s_ostimerIsr(s_ostimerBases[0], s_ostimerHandle[0]); + SDK_ISR_EXIT_BARRIER; +} + diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ostimer.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ostimer.h new file mode 100644 index 00000000000..51b1f45503f --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_ostimer.h @@ -0,0 +1,273 @@ +/* + * Copyright 2018-2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_OSTIMER_H_ +#define FSL_OSTIMER_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup ostimer + * @{ + */ + +/*! @file*/ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief OSTIMER driver version. */ +#define FSL_OSTIMER_DRIVER_VERSION (MAKE_VERSION(2, 2, 2)) +/*! @} */ + +/*! + * @brief OSTIMER status flags. + */ +enum _ostimer_flags +{ + kOSTIMER_MatchInterruptFlag = (OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_MASK), /*!< Match interrupt flag bit, sets if + the match value was reached. */ +}; + +/*! @brief ostimer callback function. */ +typedef void (*ostimer_callback_t)(void); + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* _cplusplus */ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Initializes an OSTIMER by turning its bus clock on + * + */ +void OSTIMER_Init(OSTIMER_Type *base); + +/*! + * @brief Deinitializes a OSTIMER instance. + * + * This function shuts down OSTIMER bus clock + * + * @param base OSTIMER peripheral base address. + */ +void OSTIMER_Deinit(OSTIMER_Type *base); + +/*! + * @brief Translate the value from gray-code to decimal. + * + * @param gray The gray value input. + * @return The decimal value. + */ +uint64_t OSTIMER_GrayToDecimal(uint64_t gray); + +/*! + * @brief Translate the value from decimal to gray-code. + * + * @param dec The decimal value. + * @return The gray code of the input value. + */ +static inline uint64_t OSTIMER_DecimalToGray(uint64_t dec) +{ + return (dec ^ (dec >> 1U)); +} + +/*! + * @brief Get OSTIMER status Flags. + * + * This returns the status flag. + * Currently, only match interrupt flag can be got. + * + * @param base OSTIMER peripheral base address. + * @return status register value + */ +uint32_t OSTIMER_GetStatusFlags(OSTIMER_Type *base); + +/*! + * @brief Clear Status Interrupt Flags. + * + * This clears intrrupt status flag. + * Currently, only match interrupt flag can be cleared. + * + * @param base OSTIMER peripheral base address. + * @param mask Clear bit mask. + * @return none + */ +void OSTIMER_ClearStatusFlags(OSTIMER_Type *base, uint32_t mask); + +/*! + * @brief Set the match raw value for OSTIMER. + * + * This function will set a match value for OSTIMER with an optional callback. And this callback + * will be called while the data in dedicated pair match register is equals to the value of central EVTIMER. + * Please note that, the data format is gray-code, if decimal data was desired, please using OSTIMER_SetMatchValue(). + * + * @param base OSTIMER peripheral base address. + * @param count OSTIMER timer match value.(Value is gray-code format) + * + * @param cb OSTIMER callback (can be left as NULL if none, otherwise should be a void func(void)). + * @retval kStatus_Success - Set match raw value and enable interrupt Successfully. + * @retval kStatus_Fail - Set match raw value fail. + */ +status_t OSTIMER_SetMatchRawValue(OSTIMER_Type *base, uint64_t count, ostimer_callback_t cb); + +/*! + * @brief Set the match value for OSTIMER. + * + * This function will set a match value for OSTIMER with an optional callback. And this callback + * will be called while the data in dedicated pair match register is equals to the value of central OS TIMER. + * + * @param base OSTIMER peripheral base address. + * @param count OSTIMER timer match value.(Value is decimal format, and this value will be translate to Gray code + * internally.) + * + * @param cb OSTIMER callback (can be left as NULL if none, otherwise should be a void func(void)). + * @retval kStatus_Success - Set match value and enable interrupt Successfully. + * @retval kStatus_Fail - Set match value fail. + */ +status_t OSTIMER_SetMatchValue(OSTIMER_Type *base, uint64_t count, ostimer_callback_t cb); + +/*! + * @brief Set value to OSTIMER MATCH register directly. + * + * This function writes the input value to OSTIMER MATCH register directly, + * it does not touch any other registers. Note that, the data format is + * gray-code. The function @ref OSTIMER_DecimalToGray could convert decimal + * value to gray code. + * + * @param base OSTIMER peripheral base address. + * @param value OSTIMER timer match value (Value is gray-code format). + */ +static inline void OSTIMER_SetMatchRegister(OSTIMER_Type *base, uint64_t value) +{ +#ifdef OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK + /* Wait for MATCH register ready for write. */ + while (0U != (base->OSEVENT_CTRL & OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK)) + { + } +#endif + + base->MATCH_L = (uint32_t)value; + base->MATCH_H = (uint32_t)(value >> 32U); +} + +/*! + * @brief Enable the OSTIMER counter match interrupt. + * + * Enable the timer counter match interrupt. The interrupt happens when OSTIMER + * counter matches the value in MATCH registers. + * + * @param base OSTIMER peripheral base address. + */ +static inline void OSTIMER_EnableMatchInterrupt(OSTIMER_Type *base) +{ + base->OSEVENT_CTRL |= OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK; +} + +/*! + * @brief Disable the OSTIMER counter match interrupt. + * + * Disable the timer counter match interrupt. The interrupt happens when OSTIMER + * counter matches the value in MATCH registers. + * + * @param base OSTIMER peripheral base address. + */ +static inline void OSTIMER_DisableMatchInterrupt(OSTIMER_Type *base) +{ + base->OSEVENT_CTRL &= ~OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK; +} + +/*! + * @brief Get current timer raw count value from OSTIMER. + * + * This function will get a gray code type timer count value from OS timer register. + * The raw value of timer count is gray code format. + * + * @param base OSTIMER peripheral base address. + * @return Raw value of OSTIMER, gray code format. + */ +static inline uint64_t OSTIMER_GetCurrentTimerRawValue(OSTIMER_Type *base) +{ + uint64_t tmp = 0U; + + tmp = base->EVTIMERL; + tmp |= (uint64_t)(base->EVTIMERH) << 32U; + + return tmp; +} + +/*! + * @brief Get current timer count value from OSTIMER. + * + * This function will get a decimal timer count value. + * The RAW value of timer count is gray code format, will be translated to decimal data internally. + * + * @param base OSTIMER peripheral base address. + * @return Value of OSTIMER which will be formated to decimal value. + */ +uint64_t OSTIMER_GetCurrentTimerValue(OSTIMER_Type *base); + +/*! + * @brief Get the capture value from OSTIMER. + * + * This function will get a captured gray-code value from OSTIMER. + * The Raw value of timer capture is gray code format. + * + * @param base OSTIMER peripheral base address. + * @return Raw value of capture register, data format is gray code. + */ +static inline uint64_t OSTIMER_GetCaptureRawValue(OSTIMER_Type *base) +{ + uint64_t tmp = 0U; + + tmp = base->CAPTURE_L; + tmp |= (uint64_t)(base->CAPTURE_H) << 32U; + + return tmp; +} + +/*! + * @brief Get the capture value from OSTIMER. + * + * This function will get a capture decimal-value from OSTIMER. + * The RAW value of timer capture is gray code format, will be translated to decimal data internally. + * + * @param base OSTIMER peripheral base address. + * @return Value of capture register, data format is decimal. + */ +uint64_t OSTIMER_GetCaptureValue(OSTIMER_Type *base); + +/*! + * @brief OS timer interrupt Service Handler. + * + * This function handles the interrupt and refers to the callback array in the driver to callback user (as per request + * in OSTIMER_SetMatchValue()). + * if no user callback is scheduled, the interrupt will simply be cleared. + * + * @param base OS timer peripheral base address. + * @param cb callback scheduled for this instance of OS timer + * @return none + */ +void OSTIMER_HandleIRQ(OSTIMER_Type *base, ostimer_callback_t cb); +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_OSTIMER_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_port.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_port.h new file mode 100644 index 00000000000..8eb512969d8 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_port.h @@ -0,0 +1,684 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022, 2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_PORT_H_ +#define FSL_PORT_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup port + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.port" +#endif + +/*! @name Driver version */ +/*! @{ */ +/*! @brief PORT driver version. */ +#define FSL_PORT_DRIVER_VERSION (MAKE_VERSION(2, 5, 0)) +/*! @} */ + +#if defined(FSL_FEATURE_PORT_HAS_PULL_ENABLE) && FSL_FEATURE_PORT_HAS_PULL_ENABLE +/*! @brief Internal resistor pull feature selection */ +enum _port_pull +{ + kPORT_PullDisable = 0U, /*!< Internal pull-up/down resistor is disabled. */ + kPORT_PullDown = 2U, /*!< Internal pull-down resistor is enabled. */ + kPORT_PullUp = 3U, /*!< Internal pull-up resistor is enabled. */ +}; +#endif /* FSL_FEATURE_PORT_HAS_PULL_ENABLE */ + +#if defined(FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) && FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE +/*! @brief Internal resistor pull value selection */ +enum _port_pull_value +{ + kPORT_LowPullResistor = 0U, /*!< Low internal pull resistor value is selected. */ + kPORT_HighPullResistor = 1U, /*!< High internal pull resistor value is selected. */ +}; +#endif /* FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE */ + +#if defined(FSL_FEATURE_PORT_HAS_SLEW_RATE) && FSL_FEATURE_PORT_HAS_SLEW_RATE +/*! @brief Slew rate selection */ +enum _port_slew_rate +{ + kPORT_FastSlewRate = 0U, /*!< Fast slew rate is configured. */ + kPORT_SlowSlewRate = 1U, /*!< Slow slew rate is configured. */ +}; +#endif /* FSL_FEATURE_PORT_HAS_SLEW_RATE */ + +#if defined(FSL_FEATURE_PORT_HAS_OPEN_DRAIN) && FSL_FEATURE_PORT_HAS_OPEN_DRAIN +/*! @brief Open Drain feature enable/disable */ +enum _port_open_drain_enable +{ + kPORT_OpenDrainDisable = 0U, /*!< Open drain output is disabled. */ + kPORT_OpenDrainEnable = 1U, /*!< Open drain output is enabled. */ +}; +#endif /* FSL_FEATURE_PORT_HAS_OPEN_DRAIN */ + +#if defined(FSL_FEATURE_PORT_HAS_PASSIVE_FILTER) && FSL_FEATURE_PORT_HAS_PASSIVE_FILTER +/*! @brief Passive filter feature enable/disable */ +enum _port_passive_filter_enable +{ + kPORT_PassiveFilterDisable = 0U, /*!< Passive input filter is disabled. */ + kPORT_PassiveFilterEnable = 1U, /*!< Passive input filter is enabled. */ +}; +#endif + +#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH +/*! @brief Configures the drive strength. */ +enum _port_drive_strength +{ + kPORT_LowDriveStrength = 0U, /*!< Low-drive strength is configured. */ + kPORT_HighDriveStrength = 1U, /*!< High-drive strength is configured. */ +}; +#endif /* FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH */ + +#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1 +/*! @brief Configures the drive strength1. */ +enum _port_drive_strength1 +{ + kPORT_NormalDriveStrength = 0U, /*!< Normal drive strength */ + kPORT_DoubleDriveStrength = 1U, /*!< Double drive strength */ +}; +#endif /* FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1 */ + +#if defined(FSL_FEATURE_PORT_HAS_INPUT_BUFFER) && FSL_FEATURE_PORT_HAS_INPUT_BUFFER +/*! @brief input buffer disable/enable. */ +enum _port_input_buffer +{ + kPORT_InputBufferDisable = 0U, /*!< Digital input is disabled */ + kPORT_InputBufferEnable = 1U, /*!< Digital input is enabled */ +}; +#endif /* FSL_FEATURE_PORT_HAS_INPUT_BUFFER */ + +#if defined(FSL_FEATURE_PORT_HAS_INVERT_INPUT) && FSL_FEATURE_PORT_HAS_INVERT_INPUT +/*! @brief Digital input is not inverted or it is inverted. */ +enum _port_invet_input +{ + kPORT_InputNormal = 0U, /*!< Digital input is not inverted */ + kPORT_InputInvert = 1U, /*!< Digital input is inverted */ +}; +#endif /* FSL_FEATURE_PORT_HAS_INVERT_INPUT */ + +#if defined(FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK) && FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK +/*! @brief Unlock/lock the pin control register field[15:0] */ +enum _port_lock_register +{ + kPORT_UnlockRegister = 0U, /*!< Pin Control Register fields [15:0] are not locked. */ + kPORT_LockRegister = 1U, /*!< Pin Control Register fields [15:0] are locked. */ +}; +#endif /* FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK */ + +#if defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && FSL_FEATURE_PORT_PCR_MUX_WIDTH +/*! @brief Pin mux selection */ +typedef enum _port_mux +{ +#if defined(FSL_FEATURE_PORT_PCR_MUX_GPIO) && (FSL_FEATURE_PORT_PCR_MUX_GPIO == 0) + kPORT_MuxAsGpio = 0U, /*!< Corresponding pin is configured as GPIO. */ +#else + kPORT_PinDisabledOrAnalog = 0U, /*!< Corresponding pin is disabled, but is used as an analog pin. */ + kPORT_MuxAsGpio = 1U, /*!< Corresponding pin is configured as GPIO. */ +#endif + kPORT_MuxAlt0 = 0U, /*!< Chip-specific */ + kPORT_MuxAlt1 = 1U, /*!< Chip-specific */ + kPORT_MuxAlt2 = 2U, /*!< Chip-specific */ + kPORT_MuxAlt3 = 3U, /*!< Chip-specific */ + kPORT_MuxAlt4 = 4U, /*!< Chip-specific */ + kPORT_MuxAlt5 = 5U, /*!< Chip-specific */ + kPORT_MuxAlt6 = 6U, /*!< Chip-specific */ + kPORT_MuxAlt7 = 7U, /*!< Chip-specific */ + kPORT_MuxAlt8 = 8U, /*!< Chip-specific */ + kPORT_MuxAlt9 = 9U, /*!< Chip-specific */ + kPORT_MuxAlt10 = 10U, /*!< Chip-specific */ + kPORT_MuxAlt11 = 11U, /*!< Chip-specific */ + kPORT_MuxAlt12 = 12U, /*!< Chip-specific */ + kPORT_MuxAlt13 = 13U, /*!< Chip-specific */ + kPORT_MuxAlt14 = 14U, /*!< Chip-specific */ + kPORT_MuxAlt15 = 15U, /*!< Chip-specific */ +} port_mux_t; +#endif /* FSL_FEATURE_PORT_PCR_MUX_WIDTH */ + +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) +/*! @brief Configures the interrupt generation condition. */ +typedef enum _port_interrupt +{ + kPORT_InterruptOrDMADisabled = 0x0U, /*!< Interrupt/DMA request is disabled. */ +#if defined(FSL_FEATURE_PORT_HAS_DMA_REQUEST) && FSL_FEATURE_PORT_HAS_DMA_REQUEST || defined(DOXYGEN_OUTPUT) + kPORT_DMARisingEdge = 0x1U, /*!< DMA request on rising edge. */ + kPORT_DMAFallingEdge = 0x2U, /*!< DMA request on falling edge. */ + kPORT_DMAEitherEdge = 0x3U, /*!< DMA request on either edge. */ +#endif +#if defined(FSL_FEATURE_PORT_HAS_IRQC_FLAG) && FSL_FEATURE_PORT_HAS_IRQC_FLAG || defined(DOXYGEN_OUTPUT) + kPORT_FlagRisingEdge = 0x05U, /*!< Flag sets on rising edge. */ + kPORT_FlagFallingEdge = 0x06U, /*!< Flag sets on falling edge. */ + kPORT_FlagEitherEdge = 0x07U, /*!< Flag sets on either edge. */ +#endif + kPORT_InterruptLogicZero = 0x8U, /*!< Interrupt when logic zero. */ + kPORT_InterruptRisingEdge = 0x9U, /*!< Interrupt on rising edge. */ + kPORT_InterruptFallingEdge = 0xAU, /*!< Interrupt on falling edge. */ + kPORT_InterruptEitherEdge = 0xBU, /*!< Interrupt on either edge. */ + kPORT_InterruptLogicOne = 0xCU, /*!< Interrupt when logic one. */ +#if defined(FSL_FEATURE_PORT_HAS_IRQC_TRIGGER) && FSL_FEATURE_PORT_HAS_IRQC_TRIGGER || defined(DOXYGEN_OUTPUT) + kPORT_ActiveHighTriggerOutputEnable = 0xDU, /*!< Enable active high-trigger output. */ + kPORT_ActiveLowTriggerOutputEnable = 0xEU, /*!< Enable active low-trigger output. */ +#endif +} port_interrupt_t; +#endif + +#if defined(FSL_FEATURE_PORT_HAS_DIGITAL_FILTER) && FSL_FEATURE_PORT_HAS_DIGITAL_FILTER +/*! @brief Digital filter clock source selection */ +typedef enum _port_digital_filter_clock_source +{ + kPORT_BusClock = 0U, /*!< Digital filters are clocked by the bus clock. */ + kPORT_LpoClock = 1U, /*!< Digital filters are clocked by the 1 kHz LPO clock. */ +} port_digital_filter_clock_source_t; + +/*! @brief PORT digital filter feature configuration definition */ +typedef struct _port_digital_filter_config +{ + uint32_t digitalFilterWidth; /*!< Set digital filter width */ + port_digital_filter_clock_source_t clockSource; /*!< Set digital filter clockSource */ +} port_digital_filter_config_t; +#endif /* FSL_FEATURE_PORT_HAS_DIGITAL_FILTER */ + +#if defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && FSL_FEATURE_PORT_PCR_MUX_WIDTH +/*! @brief PORT pin configuration structure */ +typedef struct _port_pin_config +{ +#if defined(FSL_FEATURE_PORT_HAS_PULL_ENABLE) && FSL_FEATURE_PORT_HAS_PULL_ENABLE + uint16_t pullSelect : 2; /*!< No-pull/pull-down/pull-up select */ +#else + uint16_t : 2; +#endif /* FSL_FEATURE_PORT_HAS_PULL_ENABLE */ + +#if defined(FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) && FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE + uint16_t pullValueSelect : 1; /*!< Pull value select */ +#endif /* FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE */ + +#if defined(FSL_FEATURE_PORT_HAS_SLEW_RATE) && FSL_FEATURE_PORT_HAS_SLEW_RATE + uint16_t slewRate : 1; /*!< Fast/slow slew rate Configure */ +#else + uint16_t : 1; +#endif /* FSL_FEATURE_PORT_HAS_SLEW_RATE */ + +#if !(defined(FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) && FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) + uint16_t : 1; +#endif /* FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE */ + +#if defined(FSL_FEATURE_PORT_HAS_PASSIVE_FILTER) && FSL_FEATURE_PORT_HAS_PASSIVE_FILTER + uint16_t passiveFilterEnable : 1; /*!< Passive filter enable/disable */ +#else + uint16_t : 1; +#endif /* FSL_FEATURE_PORT_HAS_PASSIVE_FILTER */ + +#if defined(FSL_FEATURE_PORT_HAS_OPEN_DRAIN) && FSL_FEATURE_PORT_HAS_OPEN_DRAIN + uint16_t openDrainEnable : 1; /*!< Open drain enable/disable */ +#else + uint16_t : 1; +#endif /* FSL_FEATURE_PORT_HAS_OPEN_DRAIN */ + +#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH + uint16_t driveStrength : 1; /*!< Fast/slow drive strength configure */ +#else + uint16_t : 1; +#endif + +#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1 + uint16_t driveStrength1 : 1; /*!< Normal/Double drive strength enable/disable */ +#else + uint16_t : 1; +#endif /* FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1 */ + +#if defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && (FSL_FEATURE_PORT_PCR_MUX_WIDTH == 3) + uint16_t mux : 3; /*!< Pin mux Configure */ + uint16_t : 1; +#elif defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && (FSL_FEATURE_PORT_PCR_MUX_WIDTH == 4) + uint16_t mux : 4; /*!< Pin mux Configure */ +#else + uint16_t : 4; +#endif + +#if defined(FSL_FEATURE_PORT_HAS_INPUT_BUFFER) && FSL_FEATURE_PORT_HAS_INPUT_BUFFER + uint16_t inputBuffer : 1; /*!< Input Buffer Configure */ +#else + uint16_t : 1; +#endif /* FSL_FEATURE_PORT_HAS_INPUT_BUFFER */ + +#if defined(FSL_FEATURE_PORT_HAS_INVERT_INPUT) && FSL_FEATURE_PORT_HAS_INVERT_INPUT + uint16_t invertInput : 1; /*!< Invert Input Configure */ +#else + uint16_t : 1; +#endif /* FSL_FEATURE_PORT_HAS_INVERT_INPUT */ + + uint16_t : 1; + +#if defined(FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK) && FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK + uint16_t lockRegister : 1; /*!< Lock/unlock the PCR field[15:0] */ +#else + uint16_t : 1; +#endif /* FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK */ +} port_pin_config_t; +#endif /* FSL_FEATURE_PORT_PCR_MUX_WIDTH */ + +#if defined(FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER) && FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER +/*! @brief PORT version information. */ +typedef struct _port_version_info +{ + uint16_t feature; /*!< Feature Specification Number. */ + uint8_t minor; /*!< Minor Version Number. */ + uint8_t major; /*!< Major Version Number. */ +} port_version_info_t; +#endif /* FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER */ + +#if defined(FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE) && FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE +/*! @brief PORT voltage range. */ +typedef enum _port_voltage_range +{ + kPORT_VoltageRange1Dot71V_3Dot6V = 0x0U, /*!< Port voltage range is 1.71 V - 3.6 V. */ + kPORT_VoltageRange2Dot70V_3Dot6V = 0x1U, /*!< Port voltage range is 2.70 V - 3.6 V. */ +} port_voltage_range_t; +#endif /* FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! @name Configuration */ +/*! @{ */ + +#if defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && FSL_FEATURE_PORT_PCR_MUX_WIDTH + +#if defined(FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER) && FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER +/*! + * @brief Get PORT version information. + * + * @param base PORT peripheral base pointer + * @param info PORT version information + */ +static inline void PORT_GetVersionInfo(PORT_Type *base, port_version_info_t *info) +{ + uint32_t verid = base->VERID; + info->feature = (uint16_t)verid; + info->minor = (uint8_t)(verid >> PORT_VERID_MINOR_SHIFT); + info->major = (uint8_t)(verid >> PORT_VERID_MAJOR_SHIFT); +} +#endif /* FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER */ + +#if defined(FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE) && FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE +/*! + * @brief Get PORT version information. + * + * @note : PORTA_CONFIG[RANGE] controls the voltage ranges of Port A, B, and C. Read or write PORTB_CONFIG[RANGE] and + * PORTC_CONFIG[RANGE] does not take effect. + * + * @param base PORT peripheral base pointer + * @param range port voltage range + */ +static inline void PORT_SecletPortVoltageRange(PORT_Type *base, port_voltage_range_t range) +{ + base->CONFIG = (uint32_t)range; +} +#endif /* FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE */ + +/*! + * @brief Sets the port PCR register. + * + * This is an example to define an input pin or output pin PCR configuration. + * @code + * // Define a digital input pin PCR configuration + * port_pin_config_t config = { + * kPORT_PullUp, + * kPORT_FastSlewRate, + * kPORT_PassiveFilterDisable, + * kPORT_OpenDrainDisable, + * kPORT_LowDriveStrength, + * kPORT_MuxAsGpio, + * kPORT_UnLockRegister, + * }; + * @endcode + * + * @param base PORT peripheral base pointer. + * @param pin PORT pin number. + * @param config PORT PCR register configuration structure. + */ +static inline void PORT_SetPinConfig(PORT_Type *base, uint32_t pin, const port_pin_config_t *config) +{ + assert(config); + uint32_t addr = (uint32_t)&base->PCR[pin]; + *(volatile uint16_t *)(addr) = *((const uint16_t *)(const void *)config); +} + +/*! + * @brief Sets the port PCR register for multiple pins. + * + * This is an example to define input pins or output pins PCR configuration. + * @code + * Define a digital input pin PCR configuration + * port_pin_config_t config = { + * kPORT_PullUp , + * kPORT_PullEnable, + * kPORT_FastSlewRate, + * kPORT_PassiveFilterDisable, + * kPORT_OpenDrainDisable, + * kPORT_LowDriveStrength, + * kPORT_MuxAsGpio, + * kPORT_UnlockRegister, + * }; + * @endcode + * + * @param base PORT peripheral base pointer. + * @param mask PORT pin number macro. + * @param config PORT PCR register configuration structure. + */ +static inline void PORT_SetMultiplePinsConfig(PORT_Type *base, uint32_t mask, const port_pin_config_t *config) +{ + assert(config); + + uint16_t pcrl = *((const uint16_t *)(const void *)config); + + if (0U != (mask & 0xffffU)) + { + base->GPCLR = ((mask & 0xffffU) << 16) | pcrl; + } + if (0U != (mask >> 16)) + { + base->GPCHR = (mask & 0xffff0000U) | pcrl; + } +} + +#if defined(FSL_FEATURE_PORT_HAS_MULTIPLE_IRQ_CONFIG) && FSL_FEATURE_PORT_HAS_MULTIPLE_IRQ_CONFIG +/*! + * @brief Sets the port interrupt configuration in PCR register for multiple pins. + * + * @param base PORT peripheral base pointer. + * @param mask PORT pin number macro. + * @param config PORT pin interrupt configuration. + * - #kPORT_InterruptOrDMADisabled: Interrupt/DMA request disabled. + * - #kPORT_DMARisingEdge : DMA request on rising edge(if the DMA requests exit). + * - #kPORT_DMAFallingEdge: DMA request on falling edge(if the DMA requests exit). + * - #kPORT_DMAEitherEdge : DMA request on either edge(if the DMA requests exit). + * - #kPORT_FlagRisingEdge : Flag sets on rising edge(if the Flag states exit). + * - #kPORT_FlagFallingEdge : Flag sets on falling edge(if the Flag states exit). + * - #kPORT_FlagEitherEdge : Flag sets on either edge(if the Flag states exit). + * - #kPORT_InterruptLogicZero : Interrupt when logic zero. + * - #kPORT_InterruptRisingEdge : Interrupt on rising edge. + * - #kPORT_InterruptFallingEdge: Interrupt on falling edge. + * - #kPORT_InterruptEitherEdge : Interrupt on either edge. + * - #kPORT_InterruptLogicOne : Interrupt when logic one. + * - #kPORT_ActiveHighTriggerOutputEnable : Enable active high-trigger output (if the trigger states exit). + * - #kPORT_ActiveLowTriggerOutputEnable : Enable active low-trigger output (if the trigger states exit).. + */ +static inline void PORT_SetMultipleInterruptPinsConfig(PORT_Type *base, uint32_t mask, port_interrupt_t config) +{ + assert(config); + + if (0U != ((uint32_t)mask & 0xffffU)) + { + base->GICLR = ((uint32_t)config << 16U) | ((uint32_t)mask & 0xffffU); + } + mask = mask >> 16; + if (0U != mask) + { + base->GICHR = ((uint32_t)config << 16U) | ((uint32_t)mask & 0xffffU); + } +} +#endif + +/*! + * @brief Configures the pin muxing. + * + * @param base PORT peripheral base pointer. + * @param pin PORT pin number. + * @param mux pin muxing slot selection. + * - #kPORT_PinDisabledOrAnalog: Pin disabled or work in analog function. + * - #kPORT_MuxAsGpio : Set as GPIO. + * - #kPORT_MuxAlt2 : chip-specific. + * - #kPORT_MuxAlt3 : chip-specific. + * - #kPORT_MuxAlt4 : chip-specific. + * - #kPORT_MuxAlt5 : chip-specific. + * - #kPORT_MuxAlt6 : chip-specific. + * - #kPORT_MuxAlt7 : chip-specific. + * @note : This function is NOT recommended to use together with the PORT_SetPinsConfig, because + * the PORT_SetPinsConfig need to configure the pin mux anyway (Otherwise the pin mux is + * reset to zero : kPORT_PinDisabledOrAnalog). + * This function is recommended to use to reset the pin mux + * + */ +static inline void PORT_SetPinMux(PORT_Type *base, uint32_t pin, port_mux_t mux) +{ + base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_MUX_MASK) | PORT_PCR_MUX(mux); +} +#endif /* FSL_FEATURE_PORT_PCR_MUX_WIDTH */ + +#if defined(FSL_FEATURE_PORT_HAS_DIGITAL_FILTER) && FSL_FEATURE_PORT_HAS_DIGITAL_FILTER + +/*! + * @brief Enables the digital filter in one port, each bit of the 32-bit register represents one pin. + * + * @param base PORT peripheral base pointer. + * @param mask PORT pin number macro. + * @param enable PORT digital filter configuration. + */ +static inline void PORT_EnablePinsDigitalFilter(PORT_Type *base, uint32_t mask, bool enable) +{ + if (enable == true) + { + base->DFER |= mask; + } + else + { + base->DFER &= ~mask; + } +} + +/*! + * @brief Sets the digital filter in one port, each bit of the 32-bit register represents one pin. + * + * @param base PORT peripheral base pointer. + * @param config PORT digital filter configuration structure. + */ +static inline void PORT_SetDigitalFilterConfig(PORT_Type *base, const port_digital_filter_config_t *config) +{ + assert(config); + + base->DFCR = PORT_DFCR_CS(config->clockSource); + base->DFWR = PORT_DFWR_FILT(config->digitalFilterWidth); +} + +#endif /* FSL_FEATURE_PORT_HAS_DIGITAL_FILTER */ +/*! @} */ + +/*! @name Interrupt */ +/*! @{ */ + +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) +/*! + * @brief Configures the port pin interrupt/DMA request. + * + * @param base PORT peripheral base pointer. + * @param pin PORT pin number. + * @param config PORT pin interrupt configuration. + * - #kPORT_InterruptOrDMADisabled: Interrupt/DMA request disabled. + * - #kPORT_DMARisingEdge : DMA request on rising edge(if the DMA requests exit). + * - #kPORT_DMAFallingEdge: DMA request on falling edge(if the DMA requests exit). + * - #kPORT_DMAEitherEdge : DMA request on either edge(if the DMA requests exit). + * - #kPORT_FlagRisingEdge : Flag sets on rising edge(if the Flag states exit). + * - #kPORT_FlagFallingEdge : Flag sets on falling edge(if the Flag states exit). + * - #kPORT_FlagEitherEdge : Flag sets on either edge(if the Flag states exit). + * - #kPORT_InterruptLogicZero : Interrupt when logic zero. + * - #kPORT_InterruptRisingEdge : Interrupt on rising edge. + * - #kPORT_InterruptFallingEdge: Interrupt on falling edge. + * - #kPORT_InterruptEitherEdge : Interrupt on either edge. + * - #kPORT_InterruptLogicOne : Interrupt when logic one. + * - #kPORT_ActiveHighTriggerOutputEnable : Enable active high-trigger output (if the trigger states exit). + * - #kPORT_ActiveLowTriggerOutputEnable : Enable active low-trigger output (if the trigger states exit). + */ +static inline void PORT_SetPinInterruptConfig(PORT_Type *base, uint32_t pin, port_interrupt_t config) +{ + base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_IRQC_MASK) | PORT_PCR_IRQC(config); +} +#endif + +#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH +/*! + * @brief Configures the port pin drive strength. + * + * @param base PORT peripheral base pointer. + * @param pin PORT pin number. + * @param strength PORT pin drive strength + * - #kPORT_LowDriveStrength = 0U - Low-drive strength is configured. + * - #kPORT_HighDriveStrength = 1U - High-drive strength is configured. + */ +static inline void PORT_SetPinDriveStrength(PORT_Type *base, uint32_t pin, uint8_t strength) +{ + base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_DSE_MASK) | PORT_PCR_DSE(strength); +} +#endif + +#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1 +/*! + * @brief Enables the port pin double drive strength. + * + * @param base PORT peripheral base pointer. + * @param pin PORT pin number. + * @param enable PORT pin drive strength configuration. + */ +static inline void PORT_EnablePinDoubleDriveStrength(PORT_Type *base, uint32_t pin, bool enable) +{ + base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_DSE1_MASK) | PORT_PCR_DSE1(enable); +} +#endif + +#if defined(FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) && FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE +/*! + * @brief Configures the port pin pull value. + * + * @param base PORT peripheral base pointer. + * @param pin PORT pin number. + * @param value PORT pin pull value + * - #kPORT_LowPullResistor = 0U - Low internal pull resistor value is selected. + * - #kPORT_HighPullResistor = 1U - High internal pull resistor value is selected. + */ +static inline void PORT_SetPinPullValue(PORT_Type *base, uint32_t pin, uint8_t value) +{ + base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_PV_MASK) | PORT_PCR_PV(value); +} +#endif /* FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE */ + +#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) +/*! + * @brief Reads the whole port status flag. + * + * If a pin is configured to generate the DMA request, the corresponding flag + * is cleared automatically at the completion of the requested DMA transfer. + * Otherwise, the flag remains set until a logic one is written to that flag. + * If configured for a level sensitive interrupt that remains asserted, the flag + * is set again immediately. + * + * @param base PORT peripheral base pointer. + * @return Current port interrupt status flags, for example, 0x00010001 means the + * pin 0 and 16 have the interrupt. + */ +static inline uint32_t PORT_GetPinsInterruptFlags(PORT_Type *base) +{ + return base->ISFR; +} + +/*! + * @brief Clears the multiple pin interrupt status flag. + * + * @param base PORT peripheral base pointer. + * @param mask PORT pin number macro. + */ +static inline void PORT_ClearPinsInterruptFlags(PORT_Type *base, uint32_t mask) +{ + base->ISFR = mask; +} +#endif + +#if defined(FSL_FEATURE_PORT_SUPPORT_EFT) && FSL_FEATURE_PORT_SUPPORT_EFT +/*! + * @brief Get EFT detect flags. + * + * @param base PORT peripheral base pointer + * @return EFT detect flags + */ +static inline uint32_t PORT_GetEFTDetectFlags(PORT_Type *base) +{ + return base->EDFR; +} + +/*! + * @brief Enable EFT detect interrupts. + * + * @param base PORT peripheral base pointer + * @param interrupt EFT detect interrupt + */ +static inline void PORT_EnableEFTDetectInterrupts(PORT_Type *base, uint32_t interrupt) +{ + base->EDIER |= interrupt; +} + +/*! + * @brief Disable EFT detect interrupts. + * + * @param base PORT peripheral base pointer + * @param interrupt EFT detect interrupt + */ +static inline void PORT_DisableEFTDetectInterrupts(PORT_Type *base, uint32_t interrupt) +{ + base->EDIER &= ~interrupt; +} + +/*! + * @brief Clear all low EFT detector. + * + * @note : Port B and Port C pins share the same EFT detector clear control from PORTC_EDCR register. Any write to the + * PORTB_EDCR does not take effect. + * @param base PORT peripheral base pointer + * @param interrupt EFT detect interrupt + */ +static inline void PORT_ClearAllLowEFTDetectors(PORT_Type *base) +{ + base->EDCR |= PORT_EDCR_EDLC_MASK; + base->EDCR &= ~PORT_EDCR_EDLC_MASK; +} + +/*! + * @brief Clear all high EFT detector. + * + * @param base PORT peripheral base pointer + * @param interrupt EFT detect interrupt + */ +static inline void PORT_ClearAllHighEFTDetectors(PORT_Type *base) +{ + base->EDCR |= PORT_EDCR_EDHC_MASK; + base->EDCR &= ~PORT_EDCR_EDHC_MASK; +} +#endif /* FSL_FEATURE_PORT_SUPPORT_EFT */ + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_PORT_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_pwm.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_pwm.c new file mode 100644 index 00000000000..7fe51bcc779 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_pwm.c @@ -0,0 +1,1491 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_pwm.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.pwm" +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Get the instance from the base address + * + * @param base PWM peripheral base address + * + * @return The PWM module instance + */ +static uint32_t PWM_GetInstance(PWM_Type *base); + +#if defined(PWM_RSTS) +#define PWM_RESETS_ARRAY PWM_RSTS +#elif defined(FLEXPWM_RSTS) +#define PWM_RESETS_ARRAY FLEXPWM_RSTS +#elif defined(FLEXPWM_RSTS_N) +#define PWM_RESETS_ARRAY FLEXPWM_RSTS_N +#endif + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to PWM bases for each instance. */ +static PWM_Type *const s_pwmBases[] = PWM_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to PWM clocks for each PWM submodule. */ +static const clock_ip_name_t s_pwmClocks[][FSL_FEATURE_PWM_SUBMODULE_COUNT] = PWM_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(PWM_RESETS_ARRAY) +/* Reset array */ +static const reset_ip_name_t s_pwmResets[] = PWM_RESETS_ARRAY; +#endif + +/*! @brief Temporary PWM duty cycle. */ +static uint8_t s_pwmGetPwmDutyCycle[FSL_FEATURE_PWM_SUBMODULE_COUNT][PWM_SUBMODULE_CHANNEL] = {{0}}; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Complement the variable of type uint16_t as needed + * + * This function can complement the variable of type uint16_t as needed.For example, + * need to ask for the opposite of a positive integer. + * + * param value Parameters of type uint16_t + */ +static inline uint16_t PWM_GetComplementU16(uint16_t value) +{ + return (~value + 1U); +} + +static inline uint16_t dutyCycleToReloadValue(uint8_t dutyCyclePercent) +{ + /* Rounding calculations to improve the accuracy of reloadValue */ + return ((65535U * dutyCyclePercent) + 50U) / 100U; +} + +static uint32_t PWM_GetInstance(PWM_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_pwmBases); instance++) + { + if (s_pwmBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_pwmBases)); + + return instance; +} + +/*! + * brief Set register about period on one PWM submodule. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param mode PWM operation mode, options available in enumeration ::pwm_mode_t + * param pulseCnt PWM period, value should be between 0 to 65535 + */ +static void PWM_SetPeriodRegister(PWM_Type *base, pwm_submodule_t subModule, pwm_mode_t mode, uint16_t pulseCnt) +{ + uint16_t modulo = 0; + + switch (mode) + { + case kPWM_SignedCenterAligned: + /* Setup the PWM period for a signed center aligned signal */ + modulo = (pulseCnt >> 1U); + /* Indicates the start of the PWM period */ + base->SM[subModule].INIT = PWM_GetComplementU16(modulo); + /* Indicates the center value */ + base->SM[subModule].VAL0 = 0; + /* Indicates the end of the PWM period */ + /* The change during the end to start of the PWM period requires a count time */ + base->SM[subModule].VAL1 = modulo - 1U; + break; + case kPWM_CenterAligned: + /* Setup the PWM period for an unsigned center aligned signal */ + /* Indicates the start of the PWM period */ + base->SM[subModule].INIT = 0; + /* Indicates the center value */ + base->SM[subModule].VAL0 = (pulseCnt / 2U); + /* Indicates the end of the PWM period */ + /* The change during the end to start of the PWM period requires a count time */ + base->SM[subModule].VAL1 = pulseCnt - 1U; + break; + case kPWM_SignedEdgeAligned: + /* Setup the PWM period for a signed edge aligned signal */ + modulo = (pulseCnt >> 1U); + /* Indicates the start of the PWM period */ + base->SM[subModule].INIT = PWM_GetComplementU16(modulo); + /* Indicates the center value */ + base->SM[subModule].VAL0 = 0; + /* Indicates the end of the PWM period */ + /* The change during the end to start of the PWM period requires a count time */ + base->SM[subModule].VAL1 = modulo - 1U; + break; + case kPWM_EdgeAligned: + /* Setup the PWM period for a unsigned edge aligned signal */ + /* Indicates the start of the PWM period */ + base->SM[subModule].INIT = 0; + /* Indicates the center value */ + base->SM[subModule].VAL0 = (pulseCnt / 2U); + /* Indicates the end of the PWM period */ + /* The change during the end to start of the PWM period requires a count time */ + base->SM[subModule].VAL1 = pulseCnt - 1U; + break; + default: + assert(false); + break; + } +} + +/*! + * brief Set register about dutycycle on one PWM submodule. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmSignal Signal (PWM A or PWM B) to update + * param mode PWM operation mode, options available in enumeration ::pwm_mode_t + * param pulseCnt PWM period, value should be between 0 to 65535 + * param dutyCycle New PWM pulse width, value should be between 0 to 65535 + */ +static void PWM_SetDutycycleRegister(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmSignal, + pwm_mode_t mode, + uint16_t pulseCnt, + uint16_t pwmHighPulse) +{ + uint16_t modulo = 0; + + switch (mode) + { + case kPWM_SignedCenterAligned: + /* Setup the PWM dutycycle for a signed center aligned signal */ + if (pwmSignal == kPWM_PwmA) + { + base->SM[subModule].VAL2 = PWM_GetComplementU16(pwmHighPulse / 2U); + base->SM[subModule].VAL3 = (pwmHighPulse / 2U); + } + else if (pwmSignal == kPWM_PwmB) + { + base->SM[subModule].VAL4 = PWM_GetComplementU16(pwmHighPulse / 2U); + base->SM[subModule].VAL5 = (pwmHighPulse / 2U); + } + else + { + ; /* Intentional empty */ + } + break; + case kPWM_CenterAligned: + /* Setup the PWM dutycycle for an unsigned center aligned signal */ + if (pwmSignal == kPWM_PwmA) + { + base->SM[subModule].VAL2 = ((pulseCnt - pwmHighPulse) / 2U); + base->SM[subModule].VAL3 = ((pulseCnt + pwmHighPulse) / 2U); + } + else if (pwmSignal == kPWM_PwmB) + { + base->SM[subModule].VAL4 = ((pulseCnt - pwmHighPulse) / 2U); + base->SM[subModule].VAL5 = ((pulseCnt + pwmHighPulse) / 2U); + } + else + { + ; /* Intentional empty */ + } + break; + case kPWM_SignedEdgeAligned: + modulo = (pulseCnt >> 1U); + + /* Setup the PWM dutycycle for a signed edge aligned signal */ + if (pwmSignal == kPWM_PwmA) + { + base->SM[subModule].VAL2 = PWM_GetComplementU16(modulo); + base->SM[subModule].VAL3 = PWM_GetComplementU16(modulo) + pwmHighPulse; + } + else if (pwmSignal == kPWM_PwmB) + { + base->SM[subModule].VAL4 = PWM_GetComplementU16(modulo); + base->SM[subModule].VAL5 = PWM_GetComplementU16(modulo) + pwmHighPulse; + } + else + { + ; /* Intentional empty */ + } + break; + case kPWM_EdgeAligned: + /* Setup the PWM dutycycle for a unsigned edge aligned signal */ + if (pwmSignal == kPWM_PwmA) + { + base->SM[subModule].VAL2 = 0; + base->SM[subModule].VAL3 = pwmHighPulse; + } + else if (pwmSignal == kPWM_PwmB) + { + base->SM[subModule].VAL4 = 0; + base->SM[subModule].VAL5 = pwmHighPulse; + } + else + { + ; /* Intentional empty */ + } + break; + default: + assert(false); + break; + } +} + +/*! + * brief Ungates the PWM submodule clock and configures the peripheral for basic operation. + * + * note This API should be called at the beginning of the application using the PWM driver. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param config Pointer to user's PWM config structure. + * + * return kStatus_Success means success; else failed. + */ +status_t PWM_Init(PWM_Type *base, pwm_submodule_t subModule, const pwm_config_t *config) +{ + assert(config); + + uint16_t reg; + + /* Source clock for submodule 0 cannot be itself */ + if ((config->clockSource == kPWM_Submodule0Clock) && (subModule == kPWM_Module_0)) + { + return kStatus_Fail; + } + + /* Reload source select clock for submodule 0 cannot be master reload */ + if ((config->reloadSelect == kPWM_MasterReload) && (subModule == kPWM_Module_0)) + { + return kStatus_Fail; + } + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Ungate the PWM submodule clock*/ + CLOCK_EnableClock(s_pwmClocks[PWM_GetInstance(base)][subModule]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if defined(PWM_RESETS_ARRAY) + RESET_ReleasePeripheralReset(s_pwmResets[PWM_GetInstance(base)]); +#endif + + /* Clear the fault status flags */ + base->FSTS |= PWM_FSTS_FFLAG_MASK; + + reg = base->SM[subModule].CTRL2; + + /* Setup the submodule clock-source, control source of the INIT signal, + * source of the force output signal, operation in debug & wait modes and reload source select + */ + reg &= + ~(uint16_t)(PWM_CTRL2_CLK_SEL_MASK | PWM_CTRL2_FORCE_SEL_MASK | PWM_CTRL2_INIT_SEL_MASK | PWM_CTRL2_INDEP_MASK | +#if !defined(FSL_FEATURE_PWM_HAS_NO_WAITEN) || (!FSL_FEATURE_PWM_HAS_NO_WAITEN) + PWM_CTRL2_WAITEN_MASK | +#endif /* FSL_FEATURE_PWM_HAS_NO_WAITEN */ + PWM_CTRL2_DBGEN_MASK | PWM_CTRL2_RELOAD_SEL_MASK); + reg |= (PWM_CTRL2_CLK_SEL(config->clockSource) | PWM_CTRL2_FORCE_SEL(config->forceTrigger) | + PWM_CTRL2_INIT_SEL(config->initializationControl) | PWM_CTRL2_DBGEN(config->enableDebugMode) | +#if !defined(FSL_FEATURE_PWM_HAS_NO_WAITEN) || (!FSL_FEATURE_PWM_HAS_NO_WAITEN) + PWM_CTRL2_WAITEN(config->enableWait) | +#endif /* FSL_FEATURE_PWM_HAS_NO_WAITEN */ + PWM_CTRL2_RELOAD_SEL(config->reloadSelect)); + + /* Setup PWM A & B to be independent or a complementary-pair */ + switch (config->pairOperation) + { + case kPWM_Independent: + reg |= PWM_CTRL2_INDEP_MASK; + break; + case kPWM_ComplementaryPwmA: + base->MCTRL &= ~((uint16_t)1U << (PWM_MCTRL_IPOL_SHIFT + (uint16_t)subModule)); + break; + case kPWM_ComplementaryPwmB: + base->MCTRL |= ((uint16_t)1U << (PWM_MCTRL_IPOL_SHIFT + (uint16_t)subModule)); + break; + default: + assert(false); + break; + } + base->SM[subModule].CTRL2 = reg; + + reg = base->SM[subModule].CTRL; + + /* Setup the clock prescale, load mode and frequency */ + reg &= ~(uint16_t)(PWM_CTRL_PRSC_MASK | PWM_CTRL_LDFQ_MASK | PWM_CTRL_LDMOD_MASK); + reg |= (PWM_CTRL_PRSC(config->prescale) | PWM_CTRL_LDFQ(config->reloadFrequency)); + + /* Setup register reload logic */ + switch (config->reloadLogic) + { + case kPWM_ReloadImmediate: + reg |= PWM_CTRL_LDMOD_MASK; + break; + case kPWM_ReloadPwmHalfCycle: + reg |= PWM_CTRL_HALF_MASK; + reg &= (uint16_t)(~PWM_CTRL_FULL_MASK); + break; + case kPWM_ReloadPwmFullCycle: + reg &= (uint16_t)(~PWM_CTRL_HALF_MASK); + reg |= PWM_CTRL_FULL_MASK; + break; + case kPWM_ReloadPwmHalfAndFullCycle: + reg |= PWM_CTRL_HALF_MASK; + reg |= PWM_CTRL_FULL_MASK; + break; + default: + assert(false); + break; + } + base->SM[subModule].CTRL = reg; + + /* Set PWM output normal */ +#if defined(PWM_MASK_UPDATE_MASK) + base->MASK &= (uint16_t)(~(uint16_t)(PWM_MASK_MASKX_MASK | PWM_MASK_MASKA_MASK | PWM_MASK_MASKB_MASK | + PWM_MASK_UPDATE_MASK_MASK)); +#else + base->MASK &= ~(uint16_t)(PWM_MASK_MASKX_MASK | PWM_MASK_MASKA_MASK | PWM_MASK_MASKB_MASK); +#endif + + base->DTSRCSEL = 0U; + + /* Issue a Force trigger event when configured to trigger locally */ + if (config->forceTrigger == kPWM_Force_Local) + { + base->SM[subModule].CTRL2 |= PWM_CTRL2_FORCE(1U); + } + + return kStatus_Success; +} + +/*! + * brief Gate the PWM submodule clock + * + * param base PWM peripheral base address + * param subModule PWM submodule to deinitialize + */ +void PWM_Deinit(PWM_Type *base, pwm_submodule_t subModule) +{ + /* Stop the submodule */ + base->MCTRL &= ~((uint16_t)1U << (PWM_MCTRL_RUN_SHIFT + (uint16_t)subModule)); + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Gate the PWM submodule clock*/ + CLOCK_DisableClock(s_pwmClocks[PWM_GetInstance(base)][subModule]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * brief Fill in the PWM config struct with the default settings + * + * The default values are: + * code + * config->enableDebugMode = false; + * config->enableWait = false; + * config->reloadSelect = kPWM_LocalReload; + * config->clockSource = kPWM_BusClock; + * config->prescale = kPWM_Prescale_Divide_1; + * config->initializationControl = kPWM_Initialize_LocalSync; + * config->forceTrigger = kPWM_Force_Local; + * config->reloadFrequency = kPWM_LoadEveryOportunity; + * config->reloadLogic = kPWM_ReloadImmediate; + * config->pairOperation = kPWM_Independent; + * endcode + * param config Pointer to user's PWM config structure. + */ +void PWM_GetDefaultConfig(pwm_config_t *config) +{ + assert(config); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + /* PWM is paused in debug mode */ + config->enableDebugMode = false; + /* PWM is paused in wait mode */ +#if !defined(FSL_FEATURE_PWM_HAS_NO_WAITEN) || (!FSL_FEATURE_PWM_HAS_NO_WAITEN) + config->enableWait = false; +#endif /* FSL_FEATURE_PWM_HAS_NO_WAITEN */ + /* PWM module uses the local reload signal to reload registers */ + config->reloadSelect = kPWM_LocalReload; + /* Use the IP Bus clock as source clock for the PWM submodule */ + config->clockSource = kPWM_BusClock; + /* Clock source prescale is set to divide by 1*/ + config->prescale = kPWM_Prescale_Divide_1; + /* Local sync causes initialization */ + config->initializationControl = kPWM_Initialize_LocalSync; + /* The local force signal, CTRL2[FORCE], from the submodule is used to force updates */ + config->forceTrigger = kPWM_Force_Local; + /* PWM reload frequency, reload opportunity is PWM half cycle or full cycle. + * This field is not used in Immediate reload mode + */ + config->reloadFrequency = kPWM_LoadEveryOportunity; + /* Buffered-registers get loaded with new values as soon as LDOK bit is set */ + config->reloadLogic = kPWM_ReloadImmediate; + /* PWM A & PWM B operate as 2 independent channels */ + config->pairOperation = kPWM_Independent; +} + +/*! + * brief Sets up the PWM signals for a PWM submodule. + * + * The function initializes the submodule according to the parameters passed in by the user. The function + * also sets up the value compare registers to match the PWM signal requirements. + * If the dead time insertion logic is enabled, the pulse period is reduced by the + * dead time period specified by the user. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param chnlParams Array of PWM channel parameters to configure the channel(s), PWMX submodule is not supported. + * param numOfChnls Number of channels to configure, this should be the size of the array passed in. + * Array size should not be more than 2 as each submodule has 2 pins to output PWM + * param mode PWM operation mode, options available in enumeration ::pwm_mode_t + * param pwmFreq_Hz PWM signal frequency in Hz + * param srcClock_Hz PWM source clock of correspond submodule in Hz. If source clock of submodule1,2,3 is from + * submodule0 AUX_CLK, its source clock is submodule0 source clock divided with submodule0 + * prescaler value instead of submodule0 source clock. + * + * return Returns kStatusFail if there was error setting up the signal; kStatusSuccess otherwise + */ +status_t PWM_SetupPwm(PWM_Type *base, + pwm_submodule_t subModule, + const pwm_signal_param_t *chnlParams, + uint8_t numOfChnls, + pwm_mode_t mode, + uint32_t pwmFreq_Hz, + uint32_t srcClock_Hz) +{ + assert(chnlParams); + assert(pwmFreq_Hz); + assert(numOfChnls); + assert(srcClock_Hz); + + uint32_t pwmClock; + uint16_t pulseCnt = 0, pwmHighPulse = 0; + uint8_t i, polarityShift = 0, outputEnableShift = 0; + + for (i = 0; i < numOfChnls; i++) + { + if (chnlParams[i].pwmChannel == kPWM_PwmX) + { + /* PWMX configuration is not supported yet */ + return kStatus_Fail; + } + } + + /* Divide the clock by the prescale value */ + pwmClock = (srcClock_Hz / (1UL << ((base->SM[subModule].CTRL & PWM_CTRL_PRSC_MASK) >> PWM_CTRL_PRSC_SHIFT))); + pulseCnt = (uint16_t)(pwmClock / pwmFreq_Hz); + + /* Setup each PWM channel */ + for (i = 0; i < numOfChnls; i++) + { + /* Calculate pulse width */ + pwmHighPulse = (pulseCnt * chnlParams->dutyCyclePercent) / 100U; + + /* Setup the different match registers to generate the PWM signal */ + if (i == 0U) + { + /* Update register about period */ + PWM_SetPeriodRegister(base, subModule, mode, pulseCnt); + } + + /* Update register about dutycycle */ + PWM_SetDutycycleRegister(base, subModule, chnlParams->pwmChannel, mode, pulseCnt, pwmHighPulse); + + /* Setup register shift values based on the channel being configured. + * Also setup the deadtime value + */ + if (chnlParams->pwmChannel == kPWM_PwmA) + { + polarityShift = PWM_OCTRL_POLA_SHIFT; + outputEnableShift = PWM_OUTEN_PWMA_EN_SHIFT; + base->SM[subModule].DTCNT0 = PWM_DTCNT0_DTCNT0(chnlParams->deadtimeValue); + } + else + { + polarityShift = PWM_OCTRL_POLB_SHIFT; + outputEnableShift = PWM_OUTEN_PWMB_EN_SHIFT; + base->SM[subModule].DTCNT1 = PWM_DTCNT1_DTCNT1(chnlParams->deadtimeValue); + } + + /* Set PWM output fault status */ + switch (chnlParams->pwmChannel) + { + case kPWM_PwmA: + base->SM[subModule].OCTRL &= ~((uint16_t)PWM_OCTRL_PWMAFS_MASK); + base->SM[subModule].OCTRL |= (((uint16_t)(chnlParams->faultState) << (uint16_t)PWM_OCTRL_PWMAFS_SHIFT) & + (uint16_t)PWM_OCTRL_PWMAFS_MASK); + break; + case kPWM_PwmB: + base->SM[subModule].OCTRL &= ~((uint16_t)PWM_OCTRL_PWMBFS_MASK); + base->SM[subModule].OCTRL |= (((uint16_t)(chnlParams->faultState) << (uint16_t)PWM_OCTRL_PWMBFS_SHIFT) & + (uint16_t)PWM_OCTRL_PWMBFS_MASK); + break; + default: + assert(false); + break; + } + + /* Setup signal active level */ + if ((bool)chnlParams->level == kPWM_HighTrue) + { + base->SM[subModule].OCTRL &= ~((uint16_t)1U << (uint16_t)polarityShift); + } + else + { + base->SM[subModule].OCTRL |= ((uint16_t)1U << (uint16_t)polarityShift); + } + if (chnlParams->pwmchannelenable) + { + /* Enable PWM output */ + base->OUTEN |= ((uint16_t)1U << ((uint16_t)outputEnableShift + (uint16_t)subModule)); + } + + /* Get the pwm duty cycle */ + s_pwmGetPwmDutyCycle[subModule][chnlParams->pwmChannel] = chnlParams->dutyCyclePercent; + + /* Get the next channel parameters */ + chnlParams++; + } + + return kStatus_Success; +} + +/*! + * brief Set PWM phase shift for PWM channel running on channel PWM_A, PWM_B which with 50% duty cycle. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmChannel PWM channel to configure + * param pwmFreq_Hz PWM signal frequency in Hz + * param srcClock_Hz PWM main counter clock in Hz. + * param shiftvalue Phase shift value, range in 0 ~ 50 + * param doSync true: Set LDOK bit for the submodule list; + * false: LDOK bit don't set, need to call PWM_SetPwmLdok to sync update. + * + * return Returns kStatus_Fail if there was error setting up the signal; kStatus_Success otherwise + */ +status_t PWM_SetupPwmPhaseShift(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + uint32_t pwmFreq_Hz, + uint32_t srcClock_Hz, + uint8_t shiftvalue, + bool doSync) +{ + assert(pwmFreq_Hz != 0U); + assert(srcClock_Hz != 0U); + assert(shiftvalue <= 50U); + + uint32_t pwmClock; + uint16_t pulseCnt = 0, pwmHighPulse = 0; + uint16_t modulo = 0; + uint16_t shift = 0; + + if (pwmChannel != kPWM_PwmX) + { + /* Divide the clock by the prescale value */ + pwmClock = (srcClock_Hz / (1UL << ((base->SM[subModule].CTRL & PWM_CTRL_PRSC_MASK) >> PWM_CTRL_PRSC_SHIFT))); + pulseCnt = (uint16_t)(pwmClock / pwmFreq_Hz); + + /* Clear LDOK bit if it is set */ + if (0U != (base->MCTRL & PWM_MCTRL_LDOK(1UL << (uint8_t)subModule))) + { + base->MCTRL |= PWM_MCTRL_CLDOK(1UL << (uint8_t)subModule); + } + + modulo = (pulseCnt >> 1U); + /* Indicates the start of the PWM period */ + base->SM[subModule].INIT = PWM_GetComplementU16(modulo); + /* Indicates the center value */ + base->SM[subModule].VAL0 = 0; + /* Indicates the end of the PWM period */ + /* The change during the end to start of the PWM period requires a count time */ + base->SM[subModule].VAL1 = modulo - 1U; + + /* Immediately upon when MCTRL[LDOK] being set */ + base->SM[subModule].CTRL |= PWM_CTRL_LDMOD_MASK; + + /* phase shift value */ + shift = (pulseCnt * shiftvalue) / 100U; + + /* duty cycle 50% */ + pwmHighPulse = pulseCnt / 2U; + + if (pwmChannel == kPWM_PwmA) + { + base->SM[subModule].VAL2 = PWM_GetComplementU16(modulo) + shift; + base->SM[subModule].VAL3 = PWM_GetComplementU16(modulo) + pwmHighPulse + shift - 1U; + } + else if (pwmChannel == kPWM_PwmB) + { + base->SM[subModule].VAL4 = PWM_GetComplementU16(modulo) + shift; + base->SM[subModule].VAL5 = PWM_GetComplementU16(modulo) + pwmHighPulse + shift - 1U; + } + else + { + return kStatus_Fail; + } + + if (doSync) + { + /* Set LDOK bit to load VALx bit */ + base->MCTRL |= PWM_MCTRL_LDOK(1UL << (uint8_t)subModule); + } + } + else + { + return kStatus_Fail; + } + + return kStatus_Success; +} + +/*! + * brief Updates the PWM signal's dutycycle. + * + * The function updates the PWM dutycyle to the new value that is passed in. + * If the dead time insertion logic is enabled then the pulse period is reduced by the + * dead time period specified by the user. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmSignal Signal (PWM A or PWM B) to update + * param currPwmMode The current PWM mode set during PWM setup + * param dutyCyclePercent New PWM pulse width, value should be between 0 to 100 + * 0=inactive signal(0% duty cycle)... + * 100=active signal (100% duty cycle) + */ +void PWM_UpdatePwmDutycycle(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmSignal, + pwm_mode_t currPwmMode, + uint8_t dutyCyclePercent) +{ + assert(dutyCyclePercent <= 100U); + assert(pwmSignal != kPWM_PwmX); + uint16_t reloadValue = dutyCycleToReloadValue(dutyCyclePercent); + + PWM_UpdatePwmDutycycleHighAccuracy(base, subModule, pwmSignal, currPwmMode, reloadValue); +} + +/*! + * brief Updates the PWM signal's dutycycle with 16-bit accuracy. + * + * The function updates the PWM dutycyle to the new value that is passed in. + * If the dead time insertion logic is enabled then the pulse period is reduced by the + * dead time period specified by the user. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmSignal Signal (PWM A or PWM B) to update + * param currPwmMode The current PWM mode set during PWM setup + * param dutyCycle New PWM pulse width, value should be between 0 to 65535 + * 0=inactive signal(0% duty cycle)... + * 65535=active signal (100% duty cycle) + */ +void PWM_UpdatePwmDutycycleHighAccuracy( + PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmSignal, pwm_mode_t currPwmMode, uint16_t dutyCycle) +{ + assert(pwmSignal != kPWM_PwmX); + uint16_t pulseCnt = 0, pwmHighPulse = 0; + uint16_t modulo = 0; + + switch (currPwmMode) + { + case kPWM_SignedCenterAligned: + modulo = base->SM[subModule].VAL1 + 1U; + pulseCnt = modulo * 2U; + /* Calculate pulse width */ + pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; + break; + case kPWM_CenterAligned: + pulseCnt = base->SM[subModule].VAL1 + 1U; + /* Calculate pulse width */ + pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; + break; + case kPWM_SignedEdgeAligned: + modulo = base->SM[subModule].VAL1 + 1U; + pulseCnt = modulo * 2U; + /* Calculate pulse width */ + pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; + break; + case kPWM_EdgeAligned: + pulseCnt = base->SM[subModule].VAL1 + 1U; + /* Calculate pulse width */ + pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; + break; + default: + assert(false); + break; + } + + /* Update register about dutycycle */ + if (kPWM_PwmA == pwmSignal) + { + PWM_SetDutycycleRegister(base, subModule, kPWM_PwmA, currPwmMode, pulseCnt, pwmHighPulse); + } + else if (kPWM_PwmB == pwmSignal) + { + PWM_SetDutycycleRegister(base, subModule, kPWM_PwmB, currPwmMode, pulseCnt, pwmHighPulse); + } + else + { + ; /* Intentional empty */ + } + + if (kPWM_PwmX != pwmSignal) + { + /* Get the pwm duty cycle */ + s_pwmGetPwmDutyCycle[subModule][pwmSignal] = (uint8_t)(dutyCycle * 100U / 65535U); + } +} + +/*! + * brief Update the PWM signal's period and dutycycle for a PWM submodule. + * + * The function updates PWM signal period generated by a specific submodule according to the parameters + * passed in by the user. This function can also set dutycycle weather you want to keep original dutycycle + * or update new dutycycle. Call this function in local sync control mode because PWM period is depended by + * INIT and VAL1 register of each submodule. In master sync initialization control mode, call this function + * to update INIT and VAL1 register of all submodule because PWM period is depended by INIT and VAL1 register + * in submodule0. If the dead time insertion logic is enabled, the pulse period is reduced by the dead time + * period specified by the user. PWM signal will not be generated if its period is less than dead time duration. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmSignal Signal (PWM A or PWM B) to update + * param currPwmMode The current PWM mode set during PWM setup, options available in enumeration ::pwm_mode_t + * param pulseCnt New PWM period, value should be between 0 to 65535 + * 0=minimum PWM period... + * 65535=maximum PWM period + * param dutyCycle New PWM pulse width of channel, value should be between 0 to 65535 + * 0=inactive signal(0% duty cycle)... + * 65535=active signal (100% duty cycle) + * You can keep original dutycycle or update new dutycycle + */ +void PWM_UpdatePwmPeriodAndDutycycle(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmSignal, + pwm_mode_t currPwmMode, + uint16_t pulseCnt, + uint16_t dutyCycle) +{ + uint16_t pwmHighPulse = 0; + + assert(pwmSignal != kPWM_PwmX); + + /* Calculate pulse width */ + pwmHighPulse = (pulseCnt * dutyCycle) / 65535U; + + /* Update register about period */ + PWM_SetPeriodRegister(base, subModule, currPwmMode, pulseCnt); + + /* Update register about dutycycle */ + PWM_SetDutycycleRegister(base, subModule, pwmSignal, currPwmMode, pulseCnt, pwmHighPulse); + + /* Get the pwm duty cycle */ + s_pwmGetPwmDutyCycle[subModule][pwmSignal] = (uint8_t)((dutyCycle * 100U) / 65535U); +} + +/*! + * brief Sets up the PWM input capture + * + * Each PWM submodule has 3 pins that can be configured for use as input capture pins. This function + * sets up the capture parameters for each pin and enables the pin for input capture operation. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmChannel Channel in the submodule to setup + * param inputCaptureParams Parameters passed in to set up the input pin + */ +void PWM_SetupInputCapture(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + const pwm_input_capture_param_t *inputCaptureParams) +{ + uint16_t reg = 0; + switch (pwmChannel) + { +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA + case kPWM_PwmA: + /* Setup the capture paramters for PWM A pin */ + reg = (PWM_CAPTCTRLA_INP_SELA(inputCaptureParams->captureInputSel) | + PWM_CAPTCTRLA_EDGA0(inputCaptureParams->edge0) | PWM_CAPTCTRLA_EDGA1(inputCaptureParams->edge1) | + PWM_CAPTCTRLA_ONESHOTA(inputCaptureParams->enableOneShotCapture) | + PWM_CAPTCTRLA_CFAWM(inputCaptureParams->fifoWatermark)); + /* Enable the edge counter if using the output edge counter */ + if (inputCaptureParams->captureInputSel) + { + reg |= PWM_CAPTCTRLA_EDGCNTA_EN_MASK; + } + /* Enable input capture operation */ + reg |= PWM_CAPTCTRLA_ARMA_MASK; + + base->SM[subModule].CAPTCTRLA = reg; + + /* Setup the compare value when using the edge counter as source */ + base->SM[subModule].CAPTCOMPA = PWM_CAPTCOMPA_EDGCMPA(inputCaptureParams->edgeCompareValue); + /* Setup PWM A pin for input capture */ + base->OUTEN &= ~((uint16_t)1U << (PWM_OUTEN_PWMA_EN_SHIFT + (uint16_t)subModule)); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB + case kPWM_PwmB: + /* Setup the capture paramters for PWM B pin */ + reg = (PWM_CAPTCTRLB_INP_SELB(inputCaptureParams->captureInputSel) | + PWM_CAPTCTRLB_EDGB0(inputCaptureParams->edge0) | PWM_CAPTCTRLB_EDGB1(inputCaptureParams->edge1) | + PWM_CAPTCTRLB_ONESHOTB(inputCaptureParams->enableOneShotCapture) | + PWM_CAPTCTRLB_CFBWM(inputCaptureParams->fifoWatermark)); + /* Enable the edge counter if using the output edge counter */ + if (inputCaptureParams->captureInputSel) + { + reg |= PWM_CAPTCTRLB_EDGCNTB_EN_MASK; + } + /* Enable input capture operation */ + reg |= PWM_CAPTCTRLB_ARMB_MASK; + + base->SM[subModule].CAPTCTRLB = reg; + + /* Setup the compare value when using the edge counter as source */ + base->SM[subModule].CAPTCOMPB = PWM_CAPTCOMPB_EDGCMPB(inputCaptureParams->edgeCompareValue); + /* Setup PWM B pin for input capture */ + base->OUTEN &= ~((uint16_t)1U << (PWM_OUTEN_PWMB_EN_SHIFT + (uint16_t)subModule)); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX + case kPWM_PwmX: + reg = (PWM_CAPTCTRLX_INP_SELX(inputCaptureParams->captureInputSel) | + PWM_CAPTCTRLX_EDGX0(inputCaptureParams->edge0) | PWM_CAPTCTRLX_EDGX1(inputCaptureParams->edge1) | + PWM_CAPTCTRLX_ONESHOTX(inputCaptureParams->enableOneShotCapture) | + PWM_CAPTCTRLX_CFXWM(inputCaptureParams->fifoWatermark)); + /* Enable the edge counter if using the output edge counter */ + if (inputCaptureParams->captureInputSel) + { + reg |= PWM_CAPTCTRLX_EDGCNTX_EN_MASK; + } + /* Enable input capture operation */ + reg |= PWM_CAPTCTRLX_ARMX_MASK; + + base->SM[subModule].CAPTCTRLX = reg; + + /* Setup the compare value when using the edge counter as source */ + base->SM[subModule].CAPTCOMPX = PWM_CAPTCOMPX_EDGCMPX(inputCaptureParams->edgeCompareValue); + /* Setup PWM X pin for input capture */ + base->OUTEN &= ~((uint16_t)1U << (PWM_OUTEN_PWMX_EN_SHIFT + (uint16_t)subModule)); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX */ + default: + assert(false); + break; + } +} + +/*! + * @brief Sets up the PWM fault input filter. + * + * @param base PWM peripheral base address + * @param faultInputFilterParams Parameters passed in to set up the fault input filter. + */ +void PWM_SetupFaultInputFilter(PWM_Type *base, const pwm_fault_input_filter_param_t *faultInputFilterParams) +{ + assert(NULL != faultInputFilterParams); + + /* When changing values for fault period from a non-zero value, first write a value of 0 to clear the filter. */ + if (0U != (base->FFILT & PWM_FFILT_FILT_PER_MASK)) + { + base->FFILT &= ~(uint16_t)(PWM_FFILT_FILT_PER_MASK); + } + + base->FFILT = (uint16_t)(PWM_FFILT_FILT_PER(faultInputFilterParams->faultFilterPeriod) | + PWM_FFILT_FILT_CNT(faultInputFilterParams->faultFilterCount) | + PWM_FFILT_GSTR(faultInputFilterParams->faultGlitchStretch ? 1U : 0U)); +} + +/*! + * brief Sets up the PWM fault protection. + * + * PWM has 4 fault inputs. + * + * param base PWM peripheral base address + * param faultNum PWM fault to configure. + * param faultParams Pointer to the PWM fault config structure + */ +void PWM_SetupFaults(PWM_Type *base, pwm_fault_input_t faultNum, const pwm_fault_param_t *faultParams) +{ + assert(faultParams); + uint16_t reg; + + reg = base->FCTRL; + /* Set the faults level-settting */ + if (faultParams->faultLevel) + { + reg |= ((uint16_t)1U << (PWM_FCTRL_FLVL_SHIFT + (uint16_t)faultNum)); + } + else + { + reg &= ~((uint16_t)1U << (PWM_FCTRL_FLVL_SHIFT + (uint16_t)faultNum)); + } + /* Set the fault clearing mode */ + if ((uint16_t)faultParams->faultClearingMode != 0U) + { + /* Use manual fault clearing */ + reg &= ~((uint16_t)1U << (PWM_FCTRL_FAUTO_SHIFT + (uint16_t)faultNum)); + if (faultParams->faultClearingMode == kPWM_ManualSafety) + { + /* Use manual fault clearing with safety mode enabled */ + reg |= ((uint16_t)1U << (PWM_FCTRL_FSAFE_SHIFT + (uint16_t)faultNum)); + } + else + { + /* Use manual fault clearing with safety mode disabled */ + reg &= ~((uint16_t)1U << (PWM_FCTRL_FSAFE_SHIFT + (uint16_t)faultNum)); + } + } + else + { + /* Use automatic fault clearing */ + reg |= ((uint16_t)1U << (PWM_FCTRL_FAUTO_SHIFT + (uint16_t)faultNum)); + } + base->FCTRL = reg; + + /* Set the combinational path option */ + if (faultParams->enableCombinationalPath) + { + /* Combinational path from the fault input to the PWM output is available */ + base->FCTRL2 &= ~((uint16_t)1U << (uint16_t)faultNum); + } + else + { + /* No combinational path available, only fault filter & latch signal can disable PWM output */ + base->FCTRL2 |= ((uint16_t)1U << (uint16_t)faultNum); + } + + /* Initially clear both recovery modes */ + reg = base->FSTS; + reg &= ~(((uint16_t)1U << (PWM_FSTS_FFULL_SHIFT + (uint16_t)faultNum)) | + ((uint16_t)1U << (PWM_FSTS_FHALF_SHIFT + (uint16_t)faultNum))); + /* Setup fault recovery */ + switch (faultParams->recoverMode) + { + case kPWM_NoRecovery: + break; + case kPWM_RecoverHalfCycle: + reg |= ((uint16_t)1U << (PWM_FSTS_FHALF_SHIFT + (uint16_t)faultNum)); + break; + case kPWM_RecoverFullCycle: + reg |= ((uint16_t)1U << (PWM_FSTS_FFULL_SHIFT + (uint16_t)faultNum)); + break; + case kPWM_RecoverHalfAndFullCycle: + reg |= ((uint16_t)1U << (PWM_FSTS_FHALF_SHIFT + (uint16_t)faultNum)); + reg |= ((uint16_t)1U << (PWM_FSTS_FFULL_SHIFT + (uint16_t)faultNum)); + break; + default: + assert(false); + break; + } + base->FSTS = reg; +} + +/*! + * brief Fill in the PWM fault config struct with the default settings + * + * The default values are: + * code + * config->faultClearingMode = kPWM_Automatic; + * config->faultLevel = false; + * config->enableCombinationalPath = true; + * config->recoverMode = kPWM_NoRecovery; + * endcode + * param config Pointer to user's PWM fault config structure. + */ +void PWM_FaultDefaultConfig(pwm_fault_param_t *config) +{ + assert(config); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + /* PWM uses automatic fault clear mode */ + config->faultClearingMode = kPWM_Automatic; + /* PWM fault level is set to logic 0 */ + config->faultLevel = false; + /* Combinational Path from fault input is enabled */ + config->enableCombinationalPath = true; + /* PWM output will stay inactive when recovering from a fault */ + config->recoverMode = kPWM_NoRecovery; +} + +/*! + * brief Selects the signal to output on a PWM pin when a FORCE_OUT signal is asserted. + * + * The user specifies which channel to configure by supplying the submodule number and whether + * to modify PWM A or PWM B within that submodule. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmChannel Channel to configure + * param mode Signal to output when a FORCE_OUT is triggered + */ +void PWM_SetupForceSignal(PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmChannel, pwm_force_signal_t mode) + +{ + uint16_t shift; + uint16_t reg; + + /* DTSRCSEL register has 4 bits per submodule; 2 bits for PWM A and 2 bits for PWM B */ + shift = ((uint16_t)subModule * 4U) + ((uint16_t)pwmChannel * 2U); + + /* Setup the signal to be passed upon occurrence of a FORCE_OUT signal */ + reg = base->DTSRCSEL; + reg &= ~((uint16_t)0x3U << shift); + reg |= (uint16_t)((uint16_t)mode << shift); + base->DTSRCSEL = reg; +} + +/*! + * brief Enables the selected PWM interrupts + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::pwm_interrupt_enable_t + */ +void PWM_EnableInterrupts(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask) +{ + /* Upper 16 bits are for related to the submodule */ + base->SM[subModule].INTEN |= ((uint16_t)mask & 0xFFFFU); + /* Fault related interrupts */ + base->FCTRL |= ((uint16_t)(mask >> 16U) & PWM_FCTRL_FIE_MASK); +} + +/*! + * brief Disables the selected PWM interrupts + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::pwm_interrupt_enable_t + */ +void PWM_DisableInterrupts(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask) +{ + base->SM[subModule].INTEN &= ~((uint16_t)mask & 0xFFFFU); + base->FCTRL &= ~((uint16_t)(mask >> 16U) & PWM_FCTRL_FIE_MASK); +} + +/*! + * brief Gets the enabled PWM interrupts + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * + * return The enabled interrupts. This is the logical OR of members of the + * enumeration ::pwm_interrupt_enable_t + */ +uint32_t PWM_GetEnabledInterrupts(PWM_Type *base, pwm_submodule_t subModule) +{ + uint32_t enabledInterrupts; + + enabledInterrupts = base->SM[subModule].INTEN; + enabledInterrupts |= (((uint32_t)base->FCTRL & PWM_FCTRL_FIE_MASK) << 16UL); + return enabledInterrupts; +} + +/*! + * brief Gets the PWM status flags + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * + * return The status flags. This is the logical OR of members of the + * enumeration ::pwm_status_flags_t + */ +uint32_t PWM_GetStatusFlags(PWM_Type *base, pwm_submodule_t subModule) +{ + uint32_t statusFlags; + + statusFlags = base->SM[subModule].STS; + statusFlags |= (((uint32_t)base->FSTS & PWM_FSTS_FFLAG_MASK) << 16UL); + + return statusFlags; +} + +/*! + * brief Clears the PWM status flags + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param mask The status flags to clear. This is a logical OR of members of the + * enumeration ::pwm_status_flags_t + */ +void PWM_ClearStatusFlags(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask) +{ + uint16_t reg; + + base->SM[subModule].STS = ((uint16_t)mask & 0xFFFFU); + reg = base->FSTS; + /* Clear the fault flags and set only the ones we wish to clear as the fault flags are cleared + * by writing a login one + */ + reg &= ~(uint16_t)(PWM_FSTS_FFLAG_MASK); + reg |= (uint16_t)((mask >> 16U) & PWM_FSTS_FFLAG_MASK); + base->FSTS = reg; +} + +/*! + * brief Set PWM output in idle status (high or low). + * + * note This API should call after PWM_SetupPwm() APIs, and PWMX submodule is not supported. + * + * param base PWM peripheral base address + * param pwmChannel PWM channel to configure + * param subModule PWM submodule to configure + * param idleStatus True: PWM output is high in idle status; false: PWM output is low in idle status. + * + * return kStatus_Fail if there was error setting up the signal; kStatus_Success if set output idle success + */ +status_t PWM_SetOutputToIdle(PWM_Type *base, pwm_channels_t pwmChannel, pwm_submodule_t subModule, bool idleStatus) +{ + uint16_t valOn = 0, valOff = 0; + uint16_t ldmod; + + /* Clear LDOK bit if it is set */ + if (0U != (base->MCTRL & PWM_MCTRL_LDOK(1UL << (uint8_t)subModule))) + { + base->MCTRL |= PWM_MCTRL_CLDOK(1UL << (uint8_t)subModule); + } + + valOff = base->SM[subModule].INIT; + valOn = base->SM[subModule].VAL1 + 0x1U; + + if ((valOff + 1U) == valOn) + { + return kStatus_Fail; + } + + /* Should not PWM_X channel */ + if (kPWM_PwmA == pwmChannel) + { + if (0U != (base->SM[subModule].OCTRL & PWM_OCTRL_POLA_MASK)) + { + if (!idleStatus) + { + valOn = base->SM[subModule].INIT; + valOff = base->SM[subModule].VAL1 + 0x1U; + } + } + else + { + if (idleStatus) + { + valOn = base->SM[subModule].INIT; + valOff = base->SM[subModule].VAL1 + 0x1U; + } + } + base->SM[subModule].VAL2 = valOn; + base->SM[subModule].VAL3 = valOff; + } + else if (kPWM_PwmB == pwmChannel) + { + if (0U != (base->SM[subModule].OCTRL & PWM_OCTRL_POLB_MASK)) + { + if (!idleStatus) + { + valOn = base->SM[subModule].INIT; + valOff = base->SM[subModule].VAL1 + 0x1U; + } + } + else + { + if (idleStatus) + { + valOn = base->SM[subModule].INIT; + valOff = base->SM[subModule].VAL1 + 0x1U; + } + } + base->SM[subModule].VAL4 = valOn; + base->SM[subModule].VAL5 = valOff; + } + else + { + return kStatus_Fail; + } + + /* Record Load mode */ + ldmod = base->SM[subModule].CTRL; + /* Set Load mode to make Buffered registers take effect immediately when LDOK bit set */ + base->SM[subModule].CTRL |= PWM_CTRL_LDMOD_MASK; + /* Set LDOK bit to load buffer registers */ + base->MCTRL |= PWM_MCTRL_LDOK(1UL << (uint8_t)subModule); + /* Restore Load mode */ + base->SM[subModule].CTRL = ldmod; + + /* Get pwm duty cycle */ + s_pwmGetPwmDutyCycle[subModule][pwmChannel] = 0x0U; + + return kStatus_Success; +} + +/*! + * brief Get the dutycycle value. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmChannel PWM channel to configure + * + * return Current channel dutycycle value. + */ +uint8_t PWM_GetPwmChannelState(PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmChannel) +{ + return s_pwmGetPwmDutyCycle[subModule][pwmChannel]; +} + +/*! + * brief Set the pwm submodule prescaler. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param prescaler Set prescaler value + */ +void PWM_SetClockMode(PWM_Type *base, pwm_submodule_t subModule, pwm_clock_prescale_t prescaler) +{ + uint16_t reg = base->SM[subModule].CTRL; + + /* Clear LDOK bit if it is set */ + if (0U != (base->MCTRL & PWM_MCTRL_LDOK(1UL << (uint8_t)subModule))) + { + base->MCTRL |= PWM_MCTRL_CLDOK(1UL << (uint8_t)subModule); + } + /* Set submodule prescaler. */ + reg &= ~(uint16_t)PWM_CTRL_PRSC_MASK; + reg |= PWM_CTRL_PRSC(prescaler); + base->SM[subModule].CTRL = reg; + /* Set Load mode to make Buffered registers take effect immediately when LDOK bit set */ + base->SM[subModule].CTRL |= PWM_CTRL_LDMOD_MASK; + /* Set LDOK bit to load buffer registers */ + base->MCTRL |= PWM_MCTRL_LDOK(1UL << (uint8_t)subModule); + /* Restore Load mode */ + base->SM[subModule].CTRL = reg; +} + +/*! + * brief This function enables-disables the forcing of the output of a given eFlexPwm channel to logic 0. + * + * param base PWM peripheral base address + * param pwmChannel PWM channel to configure + * param subModule PWM submodule to configure + * param forcetozero True: Enable the pwm force output to zero; False: Disable the pwm output resumes normal + * function. + */ +void PWM_SetPwmForceOutputToZero(PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmChannel, bool forcetozero) +{ +#if !defined(PWM_MASK_UPDATE_MASK) + uint16_t reg = base->SM[subModule].CTRL2; +#endif + uint16_t mask; + + if (kPWM_PwmA == pwmChannel) + { + mask = PWM_MASK_MASKA(0x01UL << (uint8_t)subModule); + } + else if (kPWM_PwmB == pwmChannel) + { + mask = PWM_MASK_MASKB(0x01UL << (uint8_t)subModule); + } + else + { + mask = PWM_MASK_MASKX(0x01UL << (uint8_t)subModule); + } + + if (forcetozero) + { + /* Disables the channel output, forcing output level to 0 */ + base->MASK |= mask; + } + else + { + /* Enables the channel output */ + base->MASK &= ~mask; + } + +#if defined(PWM_MASK_UPDATE_MASK) + /* Update output mask bits immediately with UPDATE_MASK bit */ + base->MASK |= PWM_MASK_UPDATE_MASK(0x01UL << (uint8_t)subModule); +#else + /* Select local force signal */ + base->SM[subModule].CTRL2 &= ~(uint16_t)PWM_CTRL2_FORCE_SEL_MASK; + /* Issue a local Force trigger event */ + base->SM[subModule].CTRL2 |= PWM_CTRL2_FORCE_MASK; + /* Restore the source of FORCE OUTPUT signal */ + base->SM[subModule].CTRL2 = reg; +#endif +} + +/*! + * brief This function set the output state of the PWM pin as requested for the current cycle. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmChannel PWM channel to configure + * param outputstate Set pwm output state, see @ref pwm_output_state_t. + */ +void PWM_SetChannelOutput(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + pwm_output_state_t outputstate) +{ + uint16_t mask, swcout, sourceShift; + uint16_t reg = base->SM[subModule].CTRL2; + + if (kPWM_PwmA == pwmChannel) + { + mask = PWM_MASK_MASKA(0x01UL << (uint8_t)subModule); + swcout = (uint16_t)PWM_SWCOUT_SM0OUT23_MASK << ((uint8_t)subModule * 2U); + sourceShift = PWM_DTSRCSEL_SM0SEL23_SHIFT + ((uint16_t)subModule * 4U); + } + else if (kPWM_PwmB == pwmChannel) + { + mask = PWM_MASK_MASKB(0x01UL << (uint8_t)subModule); + swcout = (uint16_t)PWM_SWCOUT_SM0OUT45_MASK << ((uint8_t)subModule * 2U); + sourceShift = PWM_DTSRCSEL_SM0SEL45_SHIFT + ((uint16_t)subModule * 4U); + } + else + { + mask = PWM_MASK_MASKX(0x01UL << (uint8_t)subModule); + swcout = 0U; + sourceShift = 0U; + } + + if (kPWM_MaskState == outputstate) + { + /* Disables the channel output, forcing output level to 0 */ + base->MASK |= mask; + } + else + { + /* Enables the channel output first */ + base->MASK &= ~mask; + /* PwmX only support MASK mode */ + if (kPWM_PwmX != pwmChannel) + { + if (kPWM_HighState == outputstate) + { + base->SWCOUT |= swcout; + base->DTSRCSEL = + (base->DTSRCSEL & ~(uint16_t)(0x3UL << sourceShift)) | (uint16_t)(0x2UL << sourceShift); + } + else if (kPWM_LowState == outputstate) + { + base->SWCOUT &= ~swcout; + base->DTSRCSEL = + (base->DTSRCSEL & ~(uint16_t)(0x3UL << sourceShift)) | (uint16_t)(0x2UL << sourceShift); + } + else if (kPWM_NormalState == outputstate) + { + base->DTSRCSEL &= ~(uint16_t)(0x3UL << sourceShift); + } + else + { + base->DTSRCSEL = + (base->DTSRCSEL & ~(uint16_t)(0x3UL << sourceShift)) | (uint16_t)(0x1UL << sourceShift); + } + } + } + + /* Select local force signal */ + base->SM[subModule].CTRL2 &= ~(uint16_t)PWM_CTRL2_FORCE_SEL_MASK; + /* Issue a local Force trigger event */ + base->SM[subModule].CTRL2 |= PWM_CTRL2_FORCE_MASK; + /* Restore the source of FORCE OUTPUT signal */ + base->SM[subModule].CTRL2 = reg; +} + +#if defined(FSL_FEATURE_PWM_HAS_PHASE_DELAY) && FSL_FEATURE_PWM_HAS_PHASE_DELAY +/*! + * brief This function set the phase delay from the master sync signal of submodule 0. + * + * param base PWM peripheral base address + * param subModule PWM submodule to configure + * param pwmChannel PWM channel to configure + * param delayCycles Number of cycles delayed from submodule 0. + * + * return kStatus_Fail if the number of delay cycles is set larger than the period defined in submodule 0; + * kStatus_Success if set phase delay success + */ +status_t PWM_SetPhaseDelay(PWM_Type *base, pwm_channels_t pwmChannel, pwm_submodule_t subModule, uint16_t delayCycles) +{ + assert(subModule != kPWM_Module_0); + uint16_t reg = base->SM[subModule].CTRL2; + + /* Clear LDOK bit if it is set */ + if (0U != (base->MCTRL & PWM_MCTRL_LDOK(1UL << (uint8_t)subModule))) + { + base->MCTRL |= PWM_MCTRL_CLDOK(1UL << (uint8_t)subModule); + } + + if (base->SM[kPWM_Module_0].VAL1 < delayCycles) + { + return kStatus_Fail; + } + else + { + /* + * ERR051989: When the value of the phase delay register SMxPHASEDLY is reduced from a + * non-zero value to 0 and submodule x reload source is from submodule0, the submodule + * x may output an unexpected wide PWM pulse. The workaround is set SMxPHASEDLY=1, + * SMxINIT=SM0INIT-1, SMxVALy=SM0VALy-1 (x=1,2,3, y=0,1,2,3,4,5). + */ +#if defined(FSL_FEATURE_PWM_HAS_ERRATA_51989) && FSL_FEATURE_PWM_HAS_ERRATA_51989 + if (delayCycles == 0 && + ((base->SM[subModule].CTRL2 & PWM_CTRL2_RELOAD_SEL_MASK) >> PWM_CTRL2_RELOAD_SEL_SHIFT) == 1U) + { + base->SM[subModule].PHASEDLY = 1U; + base->SM[subModule].INIT = base->SM[0].INIT - 1U; + base->SM[subModule].VAL0 = base->SM[0].VAL0 - 1U; + base->SM[subModule].VAL1 = base->SM[0].VAL1 - 1U; + base->SM[subModule].VAL2 = base->SM[0].VAL2 - 1U; + base->SM[subModule].VAL3 = base->SM[0].VAL3 - 1U; + base->SM[subModule].VAL4 = base->SM[0].VAL4 - 1U; + base->SM[subModule].VAL5 = base->SM[0].VAL5 - 1U; + } + else + { + base->SM[subModule].PHASEDLY = delayCycles; + } +#else + base->SM[subModule].PHASEDLY = delayCycles; +#endif + } + + /* Select the master sync signal as the source for initialization */ + reg = (reg & ~(uint16_t)PWM_CTRL2_INIT_SEL_MASK) | PWM_CTRL2_INIT_SEL(2); + /* Set Load mode to make Buffered registers take effect immediately when LDOK bit set */ + base->SM[subModule].CTRL |= PWM_CTRL_LDMOD_MASK; + /* Set LDOK bit to load buffer registers */ + base->MCTRL |= PWM_MCTRL_LDOK(1UL << (uint8_t)subModule); + /* Restore the source of phase delay register intialization */ + base->SM[subModule].CTRL2 = reg; + return kStatus_Success; +} +#endif /* FSL_FEATURE_PWM_HAS_PHASE_DELAY */ \ No newline at end of file diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_pwm.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_pwm.h new file mode 100644 index 00000000000..9e0b12ba654 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_pwm.h @@ -0,0 +1,1372 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_PWM_H_ +#define FSL_PWM_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup pwm_driver + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @name Driver version */ +/*! @{ */ +#define FSL_PWM_DRIVER_VERSION (MAKE_VERSION(2, 8, 4)) /*!< Version 2.8.4 */ +/*! @} */ + +/*! Number of bits per submodule for software output control */ +#define PWM_SUBMODULE_SWCONTROL_WIDTH 2 +/*! Because setting the pwm duty cycle doesn't support PWMX, getting the pwm duty cycle also doesn't support PWMX. */ +#define PWM_SUBMODULE_CHANNEL 2 + +/*! @brief List of PWM submodules */ +typedef enum _pwm_submodule +{ + kPWM_Module_0 = 0U, /*!< Submodule 0 */ + kPWM_Module_1, /*!< Submodule 1 */ + kPWM_Module_2, /*!< Submodule 2 */ +#if defined(FSL_FEATURE_PWM_SUBMODULE_COUNT) && (FSL_FEATURE_PWM_SUBMODULE_COUNT > 3U) + kPWM_Module_3 /*!< Submodule 3 */ +#endif /* FSL_FEATURE_PWM_SUBMODULE_COUNT */ +} pwm_submodule_t; + +/*! @brief List of PWM channels in each module */ +typedef enum _pwm_channels +{ + kPWM_PwmB = 0U, + kPWM_PwmA, + kPWM_PwmX +} pwm_channels_t; + +/*! @brief List of PWM value registers */ +typedef enum _pwm_value_register +{ + kPWM_ValueRegister_0 = 0U, /*!< PWM Value0 register */ + kPWM_ValueRegister_1, /*!< PWM Value1 register */ + kPWM_ValueRegister_2, /*!< PWM Value2 register */ + kPWM_ValueRegister_3, /*!< PWM Value3 register */ + kPWM_ValueRegister_4, /*!< PWM Value4 register */ + kPWM_ValueRegister_5 /*!< PWM Value5 register */ +} pwm_value_register_t; + +/*! @brief List of PWM value registers mask */ +enum _pwm_value_register_mask +{ + kPWM_ValueRegisterMask_0 = (1U << 0), /*!< PWM Value0 register mask */ + kPWM_ValueRegisterMask_1 = (1U << 1), /*!< PWM Value1 register mask */ + kPWM_ValueRegisterMask_2 = (1U << 2), /*!< PWM Value2 register mask */ + kPWM_ValueRegisterMask_3 = (1U << 3), /*!< PWM Value3 register mask */ + kPWM_ValueRegisterMask_4 = (1U << 4), /*!< PWM Value4 register mask */ + kPWM_ValueRegisterMask_5 = (1U << 5) /*!< PWM Value5 register mask */ +}; + +/*! @brief PWM clock source selection.*/ +typedef enum _pwm_clock_source +{ + kPWM_BusClock = 0U, /*!< The IPBus clock is used as the clock */ + kPWM_ExternalClock, /*!< EXT_CLK is used as the clock */ + kPWM_Submodule0Clock /*!< Clock of the submodule 0 (AUX_CLK) is used as the source clock */ +} pwm_clock_source_t; + +/*! @brief PWM prescaler factor selection for clock source*/ +typedef enum _pwm_clock_prescale +{ + kPWM_Prescale_Divide_1 = 0U, /*!< PWM clock frequency = fclk/1 */ + kPWM_Prescale_Divide_2, /*!< PWM clock frequency = fclk/2 */ + kPWM_Prescale_Divide_4, /*!< PWM clock frequency = fclk/4 */ + kPWM_Prescale_Divide_8, /*!< PWM clock frequency = fclk/8 */ + kPWM_Prescale_Divide_16, /*!< PWM clock frequency = fclk/16 */ + kPWM_Prescale_Divide_32, /*!< PWM clock frequency = fclk/32 */ + kPWM_Prescale_Divide_64, /*!< PWM clock frequency = fclk/64 */ + kPWM_Prescale_Divide_128 /*!< PWM clock frequency = fclk/128 */ +} pwm_clock_prescale_t; + +/*! @brief Options that can trigger a PWM FORCE_OUT */ +typedef enum _pwm_force_output_trigger +{ + kPWM_Force_Local = 0U, /*!< The local force signal, CTRL2[FORCE], from the submodule is used to force updates */ + kPWM_Force_Master, /*!< The master force signal from submodule 0 is used to force updates */ + kPWM_Force_LocalReload, /*!< The local reload signal from this submodule is used to force updates without regard to + the state of LDOK */ + kPWM_Force_MasterReload, /*!< The master reload signal from submodule 0 is used to force updates if LDOK is set */ + kPWM_Force_LocalSync, /*!< The local sync signal from this submodule is used to force updates */ + kPWM_Force_MasterSync, /*!< The master sync signal from submodule0 is used to force updates */ + kPWM_Force_External, /*!< The external force signal, EXT_FORCE, from outside the PWM module causes updates */ + kPWM_Force_ExternalSync /*!< The external sync signal, EXT_SYNC, from outside the PWM module causes updates */ +} pwm_force_output_trigger_t; + +/*! @brief PWM channel output status */ +typedef enum _pwm_output_state +{ + kPWM_HighState = 0, /*!< The output state of PWM channel is high */ + kPWM_LowState, /*!< The output state of PWM channel is low */ + kPWM_NormalState, /*!< The output state of PWM channel is normal */ + kPWM_InvertState, /*!< The output state of PWM channel is invert */ + kPWM_MaskState /*!< The output state of PWM channel is mask */ +} pwm_output_state_t; + +/*! @brief PWM counter initialization options */ +typedef enum _pwm_init_source +{ + kPWM_Initialize_LocalSync = 0U, /*!< Local sync causes initialization */ + kPWM_Initialize_MasterReload, /*!< Master reload from submodule 0 causes initialization */ + kPWM_Initialize_MasterSync, /*!< Master sync from submodule 0 causes initialization */ + kPWM_Initialize_ExtSync /*!< EXT_SYNC causes initialization */ +} pwm_init_source_t; + +/*! @brief PWM load frequency selection */ +typedef enum _pwm_load_frequency +{ + kPWM_LoadEveryOportunity = 0U, /*!< Every PWM opportunity */ + kPWM_LoadEvery2Oportunity, /*!< Every 2 PWM opportunities */ + kPWM_LoadEvery3Oportunity, /*!< Every 3 PWM opportunities */ + kPWM_LoadEvery4Oportunity, /*!< Every 4 PWM opportunities */ + kPWM_LoadEvery5Oportunity, /*!< Every 5 PWM opportunities */ + kPWM_LoadEvery6Oportunity, /*!< Every 6 PWM opportunities */ + kPWM_LoadEvery7Oportunity, /*!< Every 7 PWM opportunities */ + kPWM_LoadEvery8Oportunity, /*!< Every 8 PWM opportunities */ + kPWM_LoadEvery9Oportunity, /*!< Every 9 PWM opportunities */ + kPWM_LoadEvery10Oportunity, /*!< Every 10 PWM opportunities */ + kPWM_LoadEvery11Oportunity, /*!< Every 11 PWM opportunities */ + kPWM_LoadEvery12Oportunity, /*!< Every 12 PWM opportunities */ + kPWM_LoadEvery13Oportunity, /*!< Every 13 PWM opportunities */ + kPWM_LoadEvery14Oportunity, /*!< Every 14 PWM opportunities */ + kPWM_LoadEvery15Oportunity, /*!< Every 15 PWM opportunities */ + kPWM_LoadEvery16Oportunity /*!< Every 16 PWM opportunities */ +} pwm_load_frequency_t; + +/*! @brief List of PWM fault selections */ +typedef enum _pwm_fault_input +{ + kPWM_Fault_0 = 0U, /*!< Fault 0 input pin */ + kPWM_Fault_1, /*!< Fault 1 input pin */ + kPWM_Fault_2, /*!< Fault 2 input pin */ + kPWM_Fault_3 /*!< Fault 3 input pin */ +} pwm_fault_input_t; + +/*! @brief List of PWM fault disable mapping selections */ +typedef enum _pwm_fault_disable +{ + kPWM_FaultDisable_0 = (1U << 0), /*!< Fault 0 disable mapping */ + kPWM_FaultDisable_1 = (1U << 1), /*!< Fault 1 disable mapping */ + kPWM_FaultDisable_2 = (1U << 2), /*!< Fault 2 disable mapping */ + kPWM_FaultDisable_3 = (1U << 3) /*!< Fault 3 disable mapping */ +} pwm_fault_disable_t; + +/*! @brief List of PWM fault channels */ +typedef enum _pwm_fault_channels +{ + kPWM_faultchannel_0 = 0U, + kPWM_faultchannel_1 +} pwm_fault_channels_t; + +/*! @brief PWM capture edge select */ +typedef enum _pwm_input_capture_edge +{ + kPWM_Disable = 0U, /*!< Disabled */ + kPWM_FallingEdge, /*!< Capture on falling edge only */ + kPWM_RisingEdge, /*!< Capture on rising edge only */ + kPWM_RiseAndFallEdge /*!< Capture on rising or falling edge */ +} pwm_input_capture_edge_t; + +/*! @brief PWM output options when a FORCE_OUT signal is asserted */ +typedef enum _pwm_force_signal +{ + kPWM_UsePwm = 0U, /*!< Generated PWM signal is used by the deadtime logic.*/ + kPWM_InvertedPwm, /*!< Inverted PWM signal is used by the deadtime logic.*/ + kPWM_SoftwareControl, /*!< Software controlled value is used by the deadtime logic. */ + kPWM_UseExternal /*!< PWM_EXTA signal is used by the deadtime logic. */ +} pwm_force_signal_t; + +/*! @brief Options available for the PWM A & B pair operation */ +typedef enum _pwm_chnl_pair_operation +{ + kPWM_Independent = 0U, /*!< PWM A & PWM B operate as 2 independent channels */ + kPWM_ComplementaryPwmA, /*!< PWM A & PWM B are complementary channels, PWM A generates the signal */ + kPWM_ComplementaryPwmB /*!< PWM A & PWM B are complementary channels, PWM B generates the signal */ +} pwm_chnl_pair_operation_t; + +/*! @brief Options available on how to load the buffered-registers with new values */ +typedef enum _pwm_register_reload +{ + kPWM_ReloadImmediate = 0U, /*!< Buffered-registers get loaded with new values as soon as LDOK bit is set */ + kPWM_ReloadPwmHalfCycle, /*!< Registers loaded on a PWM half cycle */ + kPWM_ReloadPwmFullCycle, /*!< Registers loaded on a PWM full cycle */ + kPWM_ReloadPwmHalfAndFullCycle /*!< Registers loaded on a PWM half & full cycle */ +} pwm_register_reload_t; + +/*! @brief Options available on how to re-enable the PWM output when recovering from a fault */ +typedef enum _pwm_fault_recovery_mode +{ + kPWM_NoRecovery = 0U, /*!< PWM output will stay inactive */ + kPWM_RecoverHalfCycle, /*!< PWM output re-enabled at the first half cycle */ + kPWM_RecoverFullCycle, /*!< PWM output re-enabled at the first full cycle */ + kPWM_RecoverHalfAndFullCycle /*!< PWM output re-enabled at the first half or full cycle */ +} pwm_fault_recovery_mode_t; + +/*! @brief List of PWM interrupt options */ +typedef enum _pwm_interrupt_enable +{ + kPWM_CompareVal0InterruptEnable = (1U << 0), /*!< PWM VAL0 compare interrupt */ + kPWM_CompareVal1InterruptEnable = (1U << 1), /*!< PWM VAL1 compare interrupt */ + kPWM_CompareVal2InterruptEnable = (1U << 2), /*!< PWM VAL2 compare interrupt */ + kPWM_CompareVal3InterruptEnable = (1U << 3), /*!< PWM VAL3 compare interrupt */ + kPWM_CompareVal4InterruptEnable = (1U << 4), /*!< PWM VAL4 compare interrupt */ + kPWM_CompareVal5InterruptEnable = (1U << 5), /*!< PWM VAL5 compare interrupt */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX + kPWM_CaptureX0InterruptEnable = (1U << 6), /*!< PWM capture X0 interrupt */ + kPWM_CaptureX1InterruptEnable = (1U << 7), /*!< PWM capture X1 interrupt */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB + kPWM_CaptureB0InterruptEnable = (1U << 8), /*!< PWM capture B0 interrupt */ + kPWM_CaptureB1InterruptEnable = (1U << 9), /*!< PWM capture B1 interrupt */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA + kPWM_CaptureA0InterruptEnable = (1U << 10), /*!< PWM capture A0 interrupt */ + kPWM_CaptureA1InterruptEnable = (1U << 11), /*!< PWM capture A1 interrupt */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA */ + kPWM_ReloadInterruptEnable = (1U << 12), /*!< PWM reload interrupt */ + kPWM_ReloadErrorInterruptEnable = (1U << 13), /*!< PWM reload error interrupt */ + kPWM_Fault0InterruptEnable = (1U << 16), /*!< PWM fault 0 interrupt */ + kPWM_Fault1InterruptEnable = (1U << 17), /*!< PWM fault 1 interrupt */ + kPWM_Fault2InterruptEnable = (1U << 18), /*!< PWM fault 2 interrupt */ + kPWM_Fault3InterruptEnable = (1U << 19) /*!< PWM fault 3 interrupt */ +} pwm_interrupt_enable_t; + +/*! @brief List of PWM status flags */ +typedef enum _pwm_status_flags +{ + kPWM_CompareVal0Flag = (1U << 0), /*!< PWM VAL0 compare flag */ + kPWM_CompareVal1Flag = (1U << 1), /*!< PWM VAL1 compare flag */ + kPWM_CompareVal2Flag = (1U << 2), /*!< PWM VAL2 compare flag */ + kPWM_CompareVal3Flag = (1U << 3), /*!< PWM VAL3 compare flag */ + kPWM_CompareVal4Flag = (1U << 4), /*!< PWM VAL4 compare flag */ + kPWM_CompareVal5Flag = (1U << 5), /*!< PWM VAL5 compare flag */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX + kPWM_CaptureX0Flag = (1U << 6), /*!< PWM capture X0 flag */ + kPWM_CaptureX1Flag = (1U << 7), /*!< PWM capture X1 flag */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB + kPWM_CaptureB0Flag = (1U << 8), /*!< PWM capture B0 flag */ + kPWM_CaptureB1Flag = (1U << 9), /*!< PWM capture B1 flag */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA + kPWM_CaptureA0Flag = (1U << 10), /*!< PWM capture A0 flag */ + kPWM_CaptureA1Flag = (1U << 11), /*!< PWM capture A1 flag */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA */ + kPWM_ReloadFlag = (1U << 12), /*!< PWM reload flag */ + kPWM_ReloadErrorFlag = (1U << 13), /*!< PWM reload error flag */ + kPWM_RegUpdatedFlag = (1U << 14), /*!< PWM registers updated flag */ + kPWM_Fault0Flag = (1U << 16), /*!< PWM fault 0 flag */ + kPWM_Fault1Flag = (1U << 17), /*!< PWM fault 1 flag */ + kPWM_Fault2Flag = (1U << 18), /*!< PWM fault 2 flag */ + kPWM_Fault3Flag = (1U << 19) /*!< PWM fault 3 flag */ +} pwm_status_flags_t; + +/*! @brief List of PWM DMA options */ +typedef enum _pwm_dma_enable +{ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX + kPWM_CaptureX0DMAEnable = (1U << 0), /*!< PWM capture X0 DMA */ + kPWM_CaptureX1DMAEnable = (1U << 1), /*!< PWM capture X1 DMA */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB + kPWM_CaptureB0DMAEnable = (1U << 2), /*!< PWM capture B0 DMA */ + kPWM_CaptureB1DMAEnable = (1U << 3), /*!< PWM capture B1 DMA */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA + kPWM_CaptureA0DMAEnable = (1U << 4), /*!< PWM capture A0 DMA */ + kPWM_CaptureA1DMAEnable = (1U << 5) /*!< PWM capture A1 DMA */ +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA */ +} pwm_dma_enable_t; + +/*! @brief List of PWM capture DMA enable source select */ +typedef enum _pwm_dma_source_select +{ + kPWM_DMARequestDisable = 0U, /*!< Read DMA requests disabled */ + kPWM_DMAWatermarksEnable, /*!< Exceeding a FIFO watermark sets the DMA read request */ + kPWM_DMALocalSync, /*!< A local sync (VAL1 matches counter) sets the read DMA request */ + kPWM_DMALocalReload /*!< A local reload (STS[RF] being set) sets the read DMA request */ +} pwm_dma_source_select_t; + +/*! @brief PWM FIFO Watermark AND Control */ +typedef enum _pwm_watermark_control +{ + kPWM_FIFOWatermarksOR = 0U, /*!< Selected FIFO watermarks are OR'ed together */ + kPWM_FIFOWatermarksAND /*!< Selected FIFO watermarks are AND'ed together */ +} pwm_watermark_control_t; + +/*! @brief PWM operation mode */ +typedef enum _pwm_mode +{ + kPWM_SignedCenterAligned = 0U, /*!< Signed center-aligned */ + kPWM_CenterAligned, /*!< Unsigned cente-aligned */ + kPWM_SignedEdgeAligned, /*!< Signed edge-aligned */ + kPWM_EdgeAligned /*!< Unsigned edge-aligned */ +} pwm_mode_t; + +/*! @brief PWM output pulse mode, high-true or low-true */ +typedef enum _pwm_level_select +{ + kPWM_HighTrue = 0U, /*!< High level represents "on" or "active" state */ + kPWM_LowTrue /*!< Low level represents "on" or "active" state */ +} pwm_level_select_t; + +/*! @brief PWM output fault status */ +typedef enum _pwm_fault_state +{ + kPWM_PwmFaultState0 = + 0U, /*!< Output is forced to logic 0 state prior to consideration of output polarity control. */ + kPWM_PwmFaultState1, /*!< Output is forced to logic 1 state prior to consideration of output polarity control. */ + kPWM_PwmFaultState2, /*!< Output is tristated. */ + kPWM_PwmFaultState3 /*!< Output is tristated. */ +} pwm_fault_state_t; + +/*! @brief PWM reload source select */ +typedef enum _pwm_reload_source_select +{ + kPWM_LocalReload = 0U, /*!< The local reload signal is used to reload registers */ + kPWM_MasterReload /*!< The master reload signal (from submodule 0) is used to reload */ +} pwm_reload_source_select_t; + +/*! @brief PWM fault clearing options */ +typedef enum _pwm_fault_clear +{ + kPWM_Automatic = 0U, /*!< Automatic fault clearing */ + kPWM_ManualNormal, /*!< Manual fault clearing with no fault safety mode */ + kPWM_ManualSafety /*!< Manual fault clearing with fault safety mode */ +} pwm_fault_clear_t; + +/*! @brief Options for submodule master control operation */ +typedef enum _pwm_module_control +{ + kPWM_Control_Module_0 = (1U << 0), /*!< Control submodule 0's start/stop,buffer reload operation */ + kPWM_Control_Module_1 = (1U << 1), /*!< Control submodule 1's start/stop,buffer reload operation */ + kPWM_Control_Module_2 = (1U << 2), /*!< Control submodule 2's start/stop,buffer reload operation */ + kPWM_Control_Module_3 = (1U << 3) /*!< Control submodule 3's start/stop,buffer reload operation */ +} pwm_module_control_t; + +/*! @brief Structure for the user to define the PWM signal characteristics */ +typedef struct _pwm_signal_param +{ + pwm_channels_t pwmChannel; /*!< PWM channel being configured; PWM A or PWM B */ + uint8_t dutyCyclePercent; /*!< PWM pulse width, value should be between 0 to 100 + 0=inactive signal(0% duty cycle)... + 100=always active signal (100% duty cycle)*/ + pwm_level_select_t level; /*!< PWM output active level select */ + uint16_t deadtimeValue; /*!< The deadtime value; only used if channel pair is operating in complementary mode */ + pwm_fault_state_t faultState; /*!< PWM output fault status */ + bool pwmchannelenable; /*!< Enable PWM output */ +} pwm_signal_param_t; + +/*! + * @brief PWM config structure + * + * This structure holds the configuration settings for the PWM peripheral. To initialize this + * structure to reasonable defaults, call the PWM_GetDefaultConfig() function and pass a + * pointer to your config structure instance. + * + * The config struct can be made const so it resides in flash + */ +typedef struct _pwm_config +{ + bool enableDebugMode; /*!< true: PWM continues to run in debug mode; + false: PWM is paused in debug mode */ +#if !defined(FSL_FEATURE_PWM_HAS_NO_WAITEN) || (!FSL_FEATURE_PWM_HAS_NO_WAITEN) + bool enableWait; /*!< true: PWM continues to run in WAIT mode; + false: PWM is paused in WAIT mode */ +#endif /* FSL_FEATURE_PWM_HAS_NO_WAITEN */ + pwm_init_source_t initializationControl; /*!< Option to initialize the counter */ + pwm_clock_source_t clockSource; /*!< Clock source for the counter */ + pwm_clock_prescale_t prescale; /*!< Pre-scaler to divide down the clock */ + pwm_chnl_pair_operation_t pairOperation; /*!< Channel pair in indepedent or complementary mode */ + pwm_register_reload_t reloadLogic; /*!< PWM Reload logic setup */ + pwm_reload_source_select_t reloadSelect; /*!< Reload source select */ + pwm_load_frequency_t reloadFrequency; /*!< Specifies when to reload, used when user's choice + is not immediate reload */ + pwm_force_output_trigger_t forceTrigger; /*!< Specify which signal will trigger a FORCE_OUT */ +} pwm_config_t; + +/*! @brief Structure for the user to configure the fault input filter. */ +typedef struct _pwm_fault_input_filter_param +{ + uint8_t faultFilterCount; /*!< Fault filter count */ + uint8_t faultFilterPeriod; /*!< Fault filter period;value of 0 will bypass the filter */ + bool faultGlitchStretch; /*!< Fault Glitch Stretch Enable: A logic 1 means that input + fault signals will be stretched to at least 2 IPBus clock cycles */ +} pwm_fault_input_filter_param_t; + +/*! @brief Structure is used to hold the parameters to configure a PWM fault */ +typedef struct _pwm_fault_param +{ + pwm_fault_clear_t faultClearingMode; /*!< Fault clearing mode to use */ + bool faultLevel; /*!< true: Logic 1 indicates fault; + false: Logic 0 indicates fault */ + bool enableCombinationalPath; /*!< true: Combinational Path from fault input is enabled; + false: No combination path is available */ + pwm_fault_recovery_mode_t recoverMode; /*!< Specify when to re-enable the PWM output */ +} pwm_fault_param_t; + +/*! + * @brief Structure is used to hold parameters to configure the capture capability of a signal pin + */ +typedef struct _pwm_input_capture_param +{ + bool captureInputSel; /*!< true: Use the edge counter signal as source + false: Use the raw input signal from the pin as source */ + uint8_t edgeCompareValue; /*!< Compare value, used only if edge counter is used as source */ + pwm_input_capture_edge_t edge0; /*!< Specify which edge causes a capture for input circuitry 0 */ + pwm_input_capture_edge_t edge1; /*!< Specify which edge causes a capture for input circuitry 1 */ + bool enableOneShotCapture; /*!< true: Use one-shot capture mode; + false: Use free-running capture mode */ + uint8_t fifoWatermark; /*!< Watermark level for capture FIFO. The capture flags in + the status register will set if the word count in the FIFO + is greater than this watermark level */ +} pwm_input_capture_param_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Ungates the PWM submodule clock and configures the peripheral for basic operation. + * + * @note This API should be called at the beginning of the application using the PWM driver. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param config Pointer to user's PWM config structure. + * + * @return kStatus_Success means success; else failed. + */ +status_t PWM_Init(PWM_Type *base, pwm_submodule_t subModule, const pwm_config_t *config); + +/*! + * @brief Gate the PWM submodule clock + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to deinitialize + */ +void PWM_Deinit(PWM_Type *base, pwm_submodule_t subModule); + +/*! + * @brief Fill in the PWM config struct with the default settings + * + * The default values are: + * @code + * config->enableDebugMode = false; + * config->enableWait = false; + * config->reloadSelect = kPWM_LocalReload; + * config->clockSource = kPWM_BusClock; + * config->prescale = kPWM_Prescale_Divide_1; + * config->initializationControl = kPWM_Initialize_LocalSync; + * config->forceTrigger = kPWM_Force_Local; + * config->reloadFrequency = kPWM_LoadEveryOportunity; + * config->reloadLogic = kPWM_ReloadImmediate; + * config->pairOperation = kPWM_Independent; + * @endcode + * @param config Pointer to user's PWM config structure. + */ +void PWM_GetDefaultConfig(pwm_config_t *config); + +/*! @}*/ + +/*! + * @name Module PWM output + * @{ + */ +/*! + * @brief Sets up the PWM signals for a PWM submodule. + * + * The function initializes the submodule according to the parameters passed in by the user. The function + * also sets up the value compare registers to match the PWM signal requirements. + * If the dead time insertion logic is enabled, the pulse period is reduced by the + * dead time period specified by the user. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param chnlParams Array of PWM channel parameters to configure the channel(s), PWMX submodule is not supported. + * @param numOfChnls Number of channels to configure, this should be the size of the array passed in. + * Array size should not be more than 2 as each submodule has 2 pins to output PWM + * @param mode PWM operation mode, options available in enumeration ::pwm_mode_t + * @param pwmFreq_Hz PWM signal frequency in Hz + * @param srcClock_Hz PWM source clock of correspond submodule in Hz. If source clock of submodule1,2,3 is from + * submodule0 AUX_CLK, its source clock is submodule0 source clock divided with submodule0 + * prescaler value instead of submodule0 source clock. + * + * @return Returns kStatus_Fail if there was error setting up the signal; kStatus_Success otherwise + */ +status_t PWM_SetupPwm(PWM_Type *base, + pwm_submodule_t subModule, + const pwm_signal_param_t *chnlParams, + uint8_t numOfChnls, + pwm_mode_t mode, + uint32_t pwmFreq_Hz, + uint32_t srcClock_Hz); + +/*! + * @brief Set PWM phase shift for PWM channel running on channel PWM_A, PWM_B which with 50% duty cycle. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel PWM channel to configure + * @param pwmFreq_Hz PWM signal frequency in Hz + * @param srcClock_Hz PWM main counter clock in Hz. + * @param shiftvalue Phase shift value, range in 0 ~ 50 + * @param doSync true: Set LDOK bit for the submodule list; + * false: LDOK bit don't set, need to call PWM_SetPwmLdok to sync update. + * + * @return Returns kStatus_Fail if there was error setting up the signal; kStatus_Success otherwise + */ +status_t PWM_SetupPwmPhaseShift(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + uint32_t pwmFreq_Hz, + uint32_t srcClock_Hz, + uint8_t shiftvalue, + bool doSync); + +/*! + * @brief Updates the PWM signal's dutycycle. + * + * The function updates the PWM dutycyle to the new value that is passed in. + * If the dead time insertion logic is enabled then the pulse period is reduced by the + * dead time period specified by the user. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmSignal Signal (PWM A or PWM B) to update + * @param currPwmMode The current PWM mode set during PWM setup + * @param dutyCyclePercent New PWM pulse width, value should be between 0 to 100 + * 0=inactive signal(0% duty cycle)... + * 100=active signal (100% duty cycle) + */ +void PWM_UpdatePwmDutycycle(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmSignal, + pwm_mode_t currPwmMode, + uint8_t dutyCyclePercent); + +/*! + * @brief Updates the PWM signal's dutycycle with 16-bit accuracy. + * + * The function updates the PWM dutycyle to the new value that is passed in. + * If the dead time insertion logic is enabled then the pulse period is reduced by the + * dead time period specified by the user. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmSignal Signal (PWM A or PWM B) to update + * @param currPwmMode The current PWM mode set during PWM setup + * @param dutyCycle New PWM pulse width, value should be between 0 to 65535 + * 0=inactive signal(0% duty cycle)... + * 65535=active signal (100% duty cycle) + */ +void PWM_UpdatePwmDutycycleHighAccuracy( + PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmSignal, pwm_mode_t currPwmMode, uint16_t dutyCycle); + +/*! + * @brief Update the PWM signal's period and dutycycle for a PWM submodule. + * + * The function updates PWM signal period generated by a specific submodule according to the parameters + * passed in by the user. This function can also set dutycycle weather you want to keep original dutycycle + * or update new dutycycle. Call this function in local sync control mode because PWM period is depended by + * INIT and VAL1 register of each submodule. In master sync initialization control mode, call this function + * to update INIT and VAL1 register of all submodule because PWM period is depended by INIT and VAL1 register + * in submodule0. If the dead time insertion logic is enabled, the pulse period is reduced by the dead time + * period specified by the user. PWM signal will not be generated if its period is less than dead time duration. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmSignal Signal (PWM A or PWM B) to update + * @param currPwmMode The current PWM mode set during PWM setup, options available in enumeration ::pwm_mode_t + * @param pulseCnt New PWM period, value should be between 0 to 65535 + * 0=minimum PWM period... + * 65535=maximum PWM period + * @param dutyCycle New PWM pulse width of channel, value should be between 0 to 65535 + * 0=inactive signal(0% duty cycle)... + * 65535=active signal (100% duty cycle) + * You can keep original duty cycle or update new duty cycle + */ +void PWM_UpdatePwmPeriodAndDutycycle(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmSignal, + pwm_mode_t currPwmMode, + uint16_t pulseCnt, + uint16_t dutyCycle); + +/*! @}*/ + +/*! + * @brief Sets up the PWM input capture + * + * Each PWM submodule has 3 pins that can be configured for use as input capture pins. This function + * sets up the capture parameters for each pin and enables the pin for input capture operation. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel Channel in the submodule to setup + * @param inputCaptureParams Parameters passed in to set up the input pin + */ +void PWM_SetupInputCapture(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + const pwm_input_capture_param_t *inputCaptureParams); + +/*! + * @brief Sets up the PWM fault input filter. + * + * @param base PWM peripheral base address + * @param faultInputFilterParams Parameters passed in to set up the fault input filter. + */ +void PWM_SetupFaultInputFilter(PWM_Type *base, const pwm_fault_input_filter_param_t *faultInputFilterParams); + +/*! + * @brief Sets up the PWM fault protection. + * + * PWM has 4 fault inputs. + * + * @param base PWM peripheral base address + * @param faultNum PWM fault to configure. + * @param faultParams Pointer to the PWM fault config structure + */ +void PWM_SetupFaults(PWM_Type *base, pwm_fault_input_t faultNum, const pwm_fault_param_t *faultParams); + +/*! + * @brief Fill in the PWM fault config struct with the default settings + * + * The default values are: + * @code + * config->faultClearingMode = kPWM_Automatic; + * config->faultLevel = false; + * config->enableCombinationalPath = true; + * config->recoverMode = kPWM_NoRecovery; + * @endcode + * @param config Pointer to user's PWM fault config structure. + */ +void PWM_FaultDefaultConfig(pwm_fault_param_t *config); + +/*! + * @brief Selects the signal to output on a PWM pin when a FORCE_OUT signal is asserted. + * + * The user specifies which channel to configure by supplying the submodule number and whether + * to modify PWM A or PWM B within that submodule. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel Channel to configure + * @param mode Signal to output when a FORCE_OUT is triggered + */ +void PWM_SetupForceSignal(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + pwm_force_signal_t mode); + +/*! + * @name Interrupts Interface + * @{ + */ + +/*! + * @brief Enables the selected PWM interrupts + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::pwm_interrupt_enable_t + */ +void PWM_EnableInterrupts(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask); + +/*! + * @brief Disables the selected PWM interrupts + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param mask The interrupts to enable. This is a logical OR of members of the + * enumeration ::pwm_interrupt_enable_t + */ +void PWM_DisableInterrupts(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask); + +/*! + * @brief Gets the enabled PWM interrupts + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * + * @return The enabled interrupts. This is the logical OR of members of the + * enumeration ::pwm_interrupt_enable_t + */ +uint32_t PWM_GetEnabledInterrupts(PWM_Type *base, pwm_submodule_t subModule); + +/*! @}*/ + +/*! + * @name DMA Interface + * @{ + */ + +/*! + * @brief Capture DMA Enable Source Select. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwm_watermark_control PWM FIFO watermark and control + */ +static inline void PWM_DMAFIFOWatermarkControl(PWM_Type *base, + pwm_submodule_t subModule, + pwm_watermark_control_t pwm_watermark_control) +{ + uint16_t reg = base->SM[subModule].DMAEN; + if (pwm_watermark_control == kPWM_FIFOWatermarksOR) + { + reg &= ~((uint16_t)PWM_DMAEN_FAND_MASK); + } + else + { + reg |= ((uint16_t)PWM_DMAEN_FAND_MASK); + } + base->SM[subModule].DMAEN = reg; +} + +/*! + * @brief Capture DMA Enable Source Select. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwm_dma_source_select PWM capture DMA enable source select + */ +static inline void PWM_DMACaptureSourceSelect(PWM_Type *base, + pwm_submodule_t subModule, + pwm_dma_source_select_t pwm_dma_source_select) +{ + uint16_t reg = base->SM[subModule].DMAEN; + + reg &= ~((uint16_t)PWM_DMAEN_CAPTDE_MASK); + reg |= (((uint16_t)pwm_dma_source_select << (uint16_t)PWM_DMAEN_CAPTDE_SHIFT) & (uint16_t)PWM_DMAEN_CAPTDE_MASK); + + base->SM[subModule].DMAEN = reg; +} + +/*! + * @brief Enables or disables the selected PWM DMA Capture read request. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param mask The DMA to enable or disable. This is a logical OR of members of the + * enumeration ::pwm_dma_enable_t + * @param activate true: Enable DMA read request; false: Disable DMA read request + */ +static inline void PWM_EnableDMACapture(PWM_Type *base, pwm_submodule_t subModule, uint16_t mask, bool activate) +{ + uint16_t reg = base->SM[subModule].DMAEN; + if (activate) + { + reg |= (uint16_t)(mask); + } + else + { + reg &= ~((uint16_t)(mask)); + } + base->SM[subModule].DMAEN = reg; +} + +/*! + * @brief Enables or disables the PWM DMA write request. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param activate true: Enable DMA write request; false: Disable DMA write request + */ +static inline void PWM_EnableDMAWrite(PWM_Type *base, pwm_submodule_t subModule, bool activate) +{ + uint16_t reg = base->SM[subModule].DMAEN; + if (activate) + { + reg |= ((uint16_t)PWM_DMAEN_VALDE_MASK); + } + else + { + reg &= ~((uint16_t)PWM_DMAEN_VALDE_MASK); + } + base->SM[subModule].DMAEN = reg; +} + +/*! @}*/ + +/*! + * @name Status Interface + * @{ + */ + +/*! + * @brief Gets the PWM status flags + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * + * @return The status flags. This is the logical OR of members of the + * enumeration ::pwm_status_flags_t + */ +uint32_t PWM_GetStatusFlags(PWM_Type *base, pwm_submodule_t subModule); + +/*! + * @brief Clears the PWM status flags + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param mask The status flags to clear. This is a logical OR of members of the + * enumeration ::pwm_status_flags_t + */ +void PWM_ClearStatusFlags(PWM_Type *base, pwm_submodule_t subModule, uint32_t mask); + +/*! @}*/ + +/*! + * @name Timer Start and Stop + * @{ + */ + +/*! + * @brief Starts the PWM counter for a single or multiple submodules. + * + * Sets the Run bit which enables the clocks to the PWM submodule. This function can start multiple + * submodules at the same time. + * + * @param base PWM peripheral base address + * @param subModulesToStart PWM submodules to start. This is a logical OR of members of the + * enumeration ::pwm_module_control_t + */ +static inline void PWM_StartTimer(PWM_Type *base, uint8_t subModulesToStart) +{ + base->MCTRL |= PWM_MCTRL_RUN(subModulesToStart); +} + +/*! + * @brief Stops the PWM counter for a single or multiple submodules. + * + * Clears the Run bit which resets the submodule's counter. This function can stop multiple + * submodules at the same time. + * + * @param base PWM peripheral base address + * @param subModulesToStop PWM submodules to stop. This is a logical OR of members of the + * enumeration ::pwm_module_control_t + */ +static inline void PWM_StopTimer(PWM_Type *base, uint8_t subModulesToStop) +{ + base->MCTRL &= ~(PWM_MCTRL_RUN(subModulesToStop)); +} + +/*! @}*/ + +/*! + * @brief Set the PWM VALx registers. + * + * This function allows the user to write value into VAL registers directly. And it will destroying the PWM clock period + * set by the PWM_SetupPwm()/PWM_SetupPwmPhaseShift() functions. + * Due to VALx registers are bufferd, the new value will not active uless call PWM_SetPwmLdok() and the reload point is + * reached. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param valueRegister VALx register that will be writen new value + * @param value Value that will been write into VALx register + */ +static inline void PWM_SetVALxValue(PWM_Type *base, + pwm_submodule_t subModule, + pwm_value_register_t valueRegister, + uint16_t value) +{ + switch (valueRegister) + { + case kPWM_ValueRegister_0: + base->SM[subModule].VAL0 = value; + break; + case kPWM_ValueRegister_1: + base->SM[subModule].VAL1 = value; + break; + case kPWM_ValueRegister_2: + base->SM[subModule].VAL2 = value; + break; + case kPWM_ValueRegister_3: + base->SM[subModule].VAL3 = value; + break; + case kPWM_ValueRegister_4: + base->SM[subModule].VAL4 = value; + break; + case kPWM_ValueRegister_5: + base->SM[subModule].VAL5 = value; + break; + default: + assert(false); + break; + } +} + +/*! + * @brief Get the PWM VALx registers. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param valueRegister VALx register that will be read value + * @return The VALx register value + */ +static inline uint16_t PWM_GetVALxValue(PWM_Type *base, pwm_submodule_t subModule, pwm_value_register_t valueRegister) +{ + uint16_t temp = 0U; + + switch (valueRegister) + { + case kPWM_ValueRegister_0: + temp = base->SM[subModule].VAL0; + break; + case kPWM_ValueRegister_1: + temp = base->SM[subModule].VAL1; + break; + case kPWM_ValueRegister_2: + temp = base->SM[subModule].VAL2; + break; + case kPWM_ValueRegister_3: + temp = base->SM[subModule].VAL3; + break; + case kPWM_ValueRegister_4: + temp = base->SM[subModule].VAL4; + break; + case kPWM_ValueRegister_5: + temp = base->SM[subModule].VAL5; + break; + default: + assert(false); + break; + } + + return temp; +} + +/*! + * @brief Enables or disables the PWM output trigger. + * + * This function allows the user to enable or disable the PWM trigger. The PWM has 2 triggers. Trigger 0 + * is activated when the counter matches VAL 0, VAL 2, or VAL 4 register. Trigger 1 is activated + * when the counter matches VAL 1, VAL 3, or VAL 5 register. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param valueRegister Value register that will activate the trigger + * @param activate true: Enable the trigger; false: Disable the trigger + */ +static inline void PWM_OutputTriggerEnable(PWM_Type *base, + pwm_submodule_t subModule, + pwm_value_register_t valueRegister, + bool activate) +{ + if (activate) + { + base->SM[subModule].TCTRL |= ((uint16_t)1U << (uint16_t)valueRegister); + } + else + { + base->SM[subModule].TCTRL &= ~((uint16_t)1U << (uint16_t)valueRegister); + } +} + +/*! + * @brief Enables the PWM output trigger. + * + * This function allows the user to enable one or more (VAL0-5) PWM trigger. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param valueRegisterMask Value register mask that will activate one or more (VAL0-5) trigger + * enumeration ::_pwm_value_register_mask + */ +static inline void PWM_ActivateOutputTrigger(PWM_Type *base, pwm_submodule_t subModule, uint16_t valueRegisterMask) +{ + base->SM[subModule].TCTRL |= (PWM_TCTRL_OUT_TRIG_EN_MASK & (valueRegisterMask)); +} + +/*! + * @brief Disables the PWM output trigger. + * + * This function allows the user to disables one or more (VAL0-5) PWM trigger. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param valueRegisterMask Value register mask that will Deactivate one or more (VAL0-5) trigger + * enumeration ::_pwm_value_register_mask + */ +static inline void PWM_DeactivateOutputTrigger(PWM_Type *base, pwm_submodule_t subModule, uint16_t valueRegisterMask) +{ + base->SM[subModule].TCTRL &= ~(PWM_TCTRL_OUT_TRIG_EN_MASK & (valueRegisterMask)); +} + +/*! + * @brief Sets the software control output for a pin to high or low. + * + * The user specifies which channel to modify by supplying the submodule number and whether + * to modify PWM A or PWM B within that submodule. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel Channel to configure + * @param value true: Supply a logic 1, false: Supply a logic 0. + */ +static inline void PWM_SetupSwCtrlOut(PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmChannel, bool value) +{ + if (value) + { + base->SWCOUT |= + ((uint16_t)1U << (((uint16_t)subModule * (uint16_t)PWM_SUBMODULE_SWCONTROL_WIDTH) + (uint16_t)pwmChannel)); + } + else + { + base->SWCOUT &= + ~((uint16_t)1U << (((uint16_t)subModule * (uint16_t)PWM_SUBMODULE_SWCONTROL_WIDTH) + (uint16_t)pwmChannel)); + } +} + +/*! + * @brief Sets or clears the PWM LDOK bit on a single or multiple submodules + * + * Set LDOK bit to load buffered values into CTRL[PRSC] and the INIT, FRACVAL and VAL registers. The + * values are loaded immediately if kPWM_ReloadImmediate option was choosen during config. Else the + * values are loaded at the next PWM reload point. + * This function can issue the load command to multiple submodules at the same time. + * + * @param base PWM peripheral base address + * @param subModulesToUpdate PWM submodules to update with buffered values. This is a logical OR of + * members of the enumeration ::pwm_module_control_t + * @param value true: Set LDOK bit for the submodule list; false: Clear LDOK bit + */ +static inline void PWM_SetPwmLdok(PWM_Type *base, uint8_t subModulesToUpdate, bool value) +{ + if (value) + { + base->MCTRL |= PWM_MCTRL_LDOK(subModulesToUpdate); + } + else + { + base->MCTRL |= PWM_MCTRL_CLDOK(subModulesToUpdate); + } +} + +/*! + * @brief Set PWM output fault status + * + * These bits determine the fault state for the PWM_A output in fault conditions + * and STOP mode. It may also define the output state in WAIT and DEBUG modes + * depending on the settings of CTRL2[WAITEN] and CTRL2[DBGEN]. + * This function can update PWM output fault status. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel Channel to configure + * @param faultState PWM output fault status + */ +static inline void PWM_SetPwmFaultState(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + pwm_fault_state_t faultState) +{ + uint16_t reg = base->SM[subModule].OCTRL; + switch (pwmChannel) + { + case kPWM_PwmA: + reg &= ~((uint16_t)PWM_OCTRL_PWMAFS_MASK); + reg |= (((uint16_t)faultState << (uint16_t)PWM_OCTRL_PWMAFS_SHIFT) & (uint16_t)PWM_OCTRL_PWMAFS_MASK); + break; + case kPWM_PwmB: + reg &= ~((uint16_t)PWM_OCTRL_PWMBFS_MASK); + reg |= (((uint16_t)faultState << (uint16_t)PWM_OCTRL_PWMBFS_SHIFT) & (uint16_t)PWM_OCTRL_PWMBFS_MASK); + break; + case kPWM_PwmX: + reg &= ~((uint16_t)PWM_OCTRL_PWMXFS_MASK); + reg |= (((uint16_t)faultState << (uint16_t)PWM_OCTRL_PWMXFS_SHIFT) & (uint16_t)PWM_OCTRL_PWMXFS_MASK); + break; + default: + assert(false); + break; + } + base->SM[subModule].OCTRL = reg; +} + +/*! + * @brief Set PWM fault disable mapping + * + * Each of the four bits of this read/write field is one-to-one associated + * with the four FAULTx inputs of fault channel 0/1. The PWM output will be turned + * off if there is a logic 1 on an FAULTx input and a 1 in the corresponding + * bit of this field. A reset sets all bits in this field. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel PWM channel to configure + * @param pwm_fault_channels PWM fault channel to configure + * @param value Fault disable mapping mask value + * enumeration ::pwm_fault_disable_t + */ +static inline void PWM_SetupFaultDisableMap(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + pwm_fault_channels_t pwm_fault_channels, + uint16_t value) +{ + uint16_t reg = base->SM[subModule].DISMAP[pwm_fault_channels]; + switch (pwmChannel) + { + case kPWM_PwmA: + reg &= ~((uint16_t)PWM_DISMAP_DIS0A_MASK); + reg |= (((uint16_t)(value) << (uint16_t)PWM_DISMAP_DIS0A_SHIFT) & (uint16_t)PWM_DISMAP_DIS0A_MASK); + break; + case kPWM_PwmB: + reg &= ~((uint16_t)PWM_DISMAP_DIS0B_MASK); + reg |= (((uint16_t)(value) << (uint16_t)PWM_DISMAP_DIS0B_SHIFT) & (uint16_t)PWM_DISMAP_DIS0B_MASK); + break; + case kPWM_PwmX: + reg &= ~((uint16_t)PWM_DISMAP_DIS0X_MASK); + reg |= (((uint16_t)(value) << (uint16_t)PWM_DISMAP_DIS0X_SHIFT) & (uint16_t)PWM_DISMAP_DIS0X_MASK); + break; + default: + assert(false); + break; + } + base->SM[subModule].DISMAP[pwm_fault_channels] = reg; +} + +/*! + * @brief Set PWM output enable + * + * This feature allows the user to enable the PWM Output. + * + * @param base PWM peripheral base address + * @param pwmChannel PWM channel to configure + * @param subModule PWM submodule to configure + */ +static inline void PWM_OutputEnable(PWM_Type *base, pwm_channels_t pwmChannel, pwm_submodule_t subModule) +{ + /* Set PWM output */ + switch (pwmChannel) + { + case kPWM_PwmA: + base->OUTEN |= ((uint16_t)1U << ((uint16_t)PWM_OUTEN_PWMA_EN_SHIFT + (uint16_t)subModule)); + break; + case kPWM_PwmB: + base->OUTEN |= ((uint16_t)1U << ((uint16_t)PWM_OUTEN_PWMB_EN_SHIFT + (uint16_t)subModule)); + break; + case kPWM_PwmX: + base->OUTEN |= ((uint16_t)1U << ((uint16_t)PWM_OUTEN_PWMX_EN_SHIFT + (uint16_t)subModule)); + break; + default: + assert(false); + break; + } +} + +/*! + * @brief Set PWM output disable + * + *This feature allows the user to disable the PWM output. + * + * @param base PWM peripheral base address + * @param pwmChannel PWM channel to configure + * @param subModule PWM submodule to configure + */ +static inline void PWM_OutputDisable(PWM_Type *base, pwm_channels_t pwmChannel, pwm_submodule_t subModule) +{ + switch (pwmChannel) + { + case kPWM_PwmA: + base->OUTEN &= ~((uint16_t)1U << ((uint16_t)PWM_OUTEN_PWMA_EN_SHIFT + (uint16_t)subModule)); + break; + case kPWM_PwmB: + base->OUTEN &= ~((uint16_t)1U << ((uint16_t)PWM_OUTEN_PWMB_EN_SHIFT + (uint16_t)subModule)); + break; + case kPWM_PwmX: + base->OUTEN &= ~((uint16_t)1U << ((uint16_t)PWM_OUTEN_PWMX_EN_SHIFT + (uint16_t)subModule)); + break; + default: + assert(false); + break; + } +} + +/*! + * @brief Get the dutycycle value. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel PWM channel to configure + * + * @return Current channel dutycycle value. + */ +uint8_t PWM_GetPwmChannelState(PWM_Type *base, pwm_submodule_t subModule, pwm_channels_t pwmChannel); + +/*! + * @brief Set PWM output in idle status (high or low). + * + * @note This API should call after PWM_SetupPwm() APIs, and PWMX submodule is not supported. + * + * @param base PWM peripheral base address + * @param pwmChannel PWM channel to configure + * @param subModule PWM submodule to configure + * @param idleStatus True: PWM output is high in idle status; false: PWM output is low in idle status. + * + * @return kStatus_Fail if there was error setting up the signal; kStatus_Success if set output idle success + */ +status_t PWM_SetOutputToIdle(PWM_Type *base, pwm_channels_t pwmChannel, pwm_submodule_t subModule, bool idleStatus); + +/*! + * @brief Set the pwm submodule prescaler. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param prescaler Set prescaler value + */ +void PWM_SetClockMode(PWM_Type *base, pwm_submodule_t subModule, pwm_clock_prescale_t prescaler); + +/*! + * @brief This function enables-disables the forcing of the output of a given eFlexPwm channel to logic 0. + * + * @param base PWM peripheral base address + * @param pwmChannel PWM channel to configure + * @param subModule PWM submodule to configure + * @param forcetozero True: Enable the pwm force output to zero; False: Disable the pwm output resumes normal + * function. + */ +void PWM_SetPwmForceOutputToZero(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + bool forcetozero); + +/*! + * @brief This function set the output state of the PWM pin as requested for the current cycle. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel PWM channel to configure + * @param outputstate Set pwm output state, see @ref pwm_output_state_t. + */ +void PWM_SetChannelOutput(PWM_Type *base, + pwm_submodule_t subModule, + pwm_channels_t pwmChannel, + pwm_output_state_t outputstate); + +#if defined(FSL_FEATURE_PWM_HAS_PHASE_DELAY) && FSL_FEATURE_PWM_HAS_PHASE_DELAY +/*! + * @brief This function set the phase delay from the master sync signal of submodule 0. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel PWM channel to configure + * @param delayCycles Number of cycles delayed from submodule 0. + * + * @return kStatus_Fail if the number of delay cycles is set larger than the period defined in submodule 0; + * kStatus_Success if set phase delay success + */ +status_t PWM_SetPhaseDelay(PWM_Type *base, pwm_channels_t pwmChannel, pwm_submodule_t subModule, uint16_t delayCycles); +#endif + +#if defined(FSL_FEATURE_PWM_HAS_INPUT_FILTER_CAPTURE) && FSL_FEATURE_PWM_HAS_INPUT_FILTER_CAPTURE +/*! + * @brief This function set the number of consecutive samples that must agree prior to the input filter. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel PWM channel to configure + * @param filterSampleCount Number of consecutive samples. + */ +static inline void PWM_SetFilterSampleCount(PWM_Type *base, + pwm_channels_t pwmChannel, + pwm_submodule_t subModule, + uint8_t filterSampleCount) +{ + switch(pwmChannel) + { +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA + case kPWM_PwmA: + base->SM[subModule].CAPTFILTA &= ~((uint16_t)PWM_CAPTFILTA_CAPTA_FILT_CNT_MASK); + base->SM[subModule].CAPTFILTA |= PWM_CAPTFILTA_CAPTA_FILT_CNT(filterSampleCount); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB + case kPWM_PwmB: + base->SM[subModule].CAPTFILTB &= ~((uint16_t)PWM_CAPTFILTB_CAPTB_FILT_CNT_MASK); + base->SM[subModule].CAPTFILTB |= PWM_CAPTFILTB_CAPTB_FILT_CNT(filterSampleCount); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX + case kPWM_PwmX: + base->SM[subModule].CAPTFILTX &= ~((uint16_t)PWM_CAPTFILTX_CAPTX_FILT_CNT_MASK); + base->SM[subModule].CAPTFILTX |= PWM_CAPTFILTX_CAPTX_FILT_CNT(filterSampleCount); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX */ + default: + assert(false); + break; + } +} + +/*! + * @brief This function set the sampling period of the fault pin input filter. + * + * @param base PWM peripheral base address + * @param subModule PWM submodule to configure + * @param pwmChannel PWM channel to configure + * @param filterSamplePeriod Sampling period of input filter. + */ +static inline void PWM_SetFilterSamplePeriod(PWM_Type *base, + pwm_channels_t pwmChannel, + pwm_submodule_t subModule, + uint8_t filterSamplePeriod) +{ + switch(pwmChannel) + { +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA + case kPWM_PwmA: + base->SM[subModule].CAPTFILTA &= ~((uint16_t)PWM_CAPTFILTA_CAPTA_FILT_PER_MASK); + base->SM[subModule].CAPTFILTA |= PWM_CAPTFILTA_CAPTA_FILT_PER(filterSamplePeriod); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELA */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB + case kPWM_PwmB: + base->SM[subModule].CAPTFILTB &= ~((uint16_t)PWM_CAPTFILTB_CAPTB_FILT_PER_MASK); + base->SM[subModule].CAPTFILTB |= PWM_CAPTFILTB_CAPTB_FILT_PER(filterSamplePeriod); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELB */ +#if defined(FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX) && FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX + case kPWM_PwmX: + base->SM[subModule].CAPTFILTX &= ~((uint16_t)PWM_CAPTFILTX_CAPTX_FILT_PER_MASK); + base->SM[subModule].CAPTFILTX |= PWM_CAPTFILTX_CAPTX_FILT_PER(filterSamplePeriod); + break; +#endif /* FSL_FEATURE_PWM_HAS_CAPTURE_ON_CHANNELX */ + default: + assert(false); + break; + } +} +#endif + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_PWM_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_reset.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_reset.c new file mode 100644 index 00000000000..1b49d0edab8 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_reset.c @@ -0,0 +1,141 @@ +/* + * Copyright 2023, NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_common.h" +#include "fsl_reset.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.reset" +#endif + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +#define GET_REG_INDEX(x) ((uint32_t)(((uint32_t)(x) & 0xFF00U) >> 8)) +#define GET_BIT_INDEX(x) ((uint32_t)((uint32_t)(x) & 0x00FFU)) + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Assert reset to peripheral. + * + * Asserts reset signal to specified peripheral module. + * + * param peripheral Assert reset to this peripheral. The enum argument contains encoding of reset register + * and reset bit position in the reset register. + */ +void RESET_SetPeripheralReset(reset_ip_name_t peripheral) +{ + uint32_t regIndex = GET_REG_INDEX(peripheral); + uint32_t bitPos = GET_BIT_INDEX(peripheral); + uint32_t bitMask = 1UL << bitPos; + volatile uint32_t *pResetCtrl = &(MRCC0->MRCC_GLB_RST0); + + if (peripheral == NotAvail_RSTn) + { + return; + } + + assert(bitPos < 32u); + assert(regIndex < 2u); + + /* Unlock clock configuration */ + SYSCON->CLKUNLOCK &= ~SYSCON_CLKUNLOCK_UNLOCK_MASK; + + /* reset register is in MRCC */ + /* set bit */ + if (regIndex == 0U) + { + MRCC0->MRCC_GLB_RST0_SET = bitMask; + pResetCtrl = &(MRCC0->MRCC_GLB_RST0); + } + else if (regIndex == 1U) + { + MRCC0->MRCC_GLB_RST1_SET = bitMask; + pResetCtrl = &(MRCC0->MRCC_GLB_RST1); + } + else + { + /* Added comments to prevent the violation of MISRA C-2012 rule 15.7 */ + } + /* wait until it reads 0b1 */ + while (0u == ((*pResetCtrl) & bitMask)) + { + } + + /* Freeze clock configuration */ + SYSCON->CLKUNLOCK |= SYSCON_CLKUNLOCK_UNLOCK_MASK; +} + +/*! + * brief Clear reset to peripheral. + * + * Clears reset signal to specified peripheral module, allows it to operate. + * + * param peripheral Clear reset to this peripheral. The enum argument contains encoding of reset register + * and reset bit position in the reset register. + */ +void RESET_ClearPeripheralReset(reset_ip_name_t peripheral) +{ + uint32_t regIndex = GET_REG_INDEX(peripheral); + uint32_t bitPos = GET_BIT_INDEX(peripheral); + uint32_t bitMask = 1UL << bitPos; + volatile uint32_t *pResetCtrl = &(MRCC0->MRCC_GLB_RST0); + + assert(bitPos < 32u); + + /* Unlock clock configuration */ + SYSCON->CLKUNLOCK &= ~SYSCON_CLKUNLOCK_UNLOCK_MASK; + + /* reset register is in MRCC */ + /* clear bit */ + if (regIndex == 0U) + { + MRCC0->MRCC_GLB_RST0_CLR = bitMask; + pResetCtrl = &(MRCC0->MRCC_GLB_RST0); + } + else if (regIndex == 1U) + { + MRCC0->MRCC_GLB_RST1_CLR = bitMask; + pResetCtrl = &(MRCC0->MRCC_GLB_RST1); + } + else + { + /* Added comments to prevent the violation of MISRA C-2012 rule 15.7 */ + } + /* wait until it reads 0b0 */ + while (bitMask == ((*pResetCtrl) & bitMask)) + { + } + + /* Freeze clock configuration */ + SYSCON->CLKUNLOCK |= SYSCON_CLKUNLOCK_UNLOCK_MASK; +} + +/*! + * brief Reset peripheral module. + * + * Reset peripheral module. + * + * param peripheral Peripheral to reset. The enum argument contains encoding of reset register + * and reset bit position in the reset register. + */ +void RESET_PeripheralReset(reset_ip_name_t peripheral) +{ + RESET_ClearPeripheralReset(peripheral); + RESET_SetPeripheralReset(peripheral); +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_reset.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_reset.h new file mode 100644 index 00000000000..29a31915036 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_reset.h @@ -0,0 +1,251 @@ +/* + * Copyright 2023, NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _FSL_RESET_H_ +#define _FSL_RESET_H_ + +#include +#include +#include +#include +#include "fsl_device_registers.h" + +/*! + * @addtogroup reset + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*@{*/ +/*! @brief reset driver version 2.4.0 */ +#define FSL_RESET_DRIVER_VERSION (MAKE_VERSION(2, 4, 0)) +/*@}*/ + +/*! + * @brief Enumeration for peripheral reset control bits + * + * Defines the enumeration for peripheral reset control bits in PRESETCTRL/ASYNCPRESETCTRL registers + */ +typedef enum _SYSCON_RSTn +{ + kINPUTMUX0_RST_SHIFT_RSTn = (0U | (0U)), /*!< INPUTMUX0 reset control */ + kI3C0_RST_SHIFT_RSTn = (0U | (1U)), /*!< I3C0 reset control */ + kCTIMER0_RST_SHIFT_RSTn = (0U | (2U)), /*!< CTIMER0 reset control */ + kCTIMER1_RST_SHIFT_RSTn = (0U | (3U)), /*!< CTIMER1 reset control */ + kCTIMER2_RST_SHIFT_RSTn = (0U | (4U)), /*!< CTIMER2 reset control */ + kCTIMER3_RST_SHIFT_RSTn = (0U | (5U)), /*!< CTIMER3 reset control */ + kCTIMER4_RST_SHIFT_RSTn = (0U | (6U)), /*!< CTIMER4 reset control */ + kFREQME_RST_SHIFT_RSTn = (0U | (7U)), /*!< FREQME reset control */ + kUTICK0_RST_SHIFT_RSTn = (0U | (8U)), /*!< UTICK0 reset control */ + kDMA_RST_SHIFT_RSTn = (0U | (10U)), /*!< DMA reset control */ + kAOI0_RST_SHIFT_RSTn = (0U | (11U)), /*!< AOI0 reset control */ + kCRC0_RST_SHIFT_RSTn = (0U | (12U)), /*!< CRC0 reset control */ + kEIM0_RST_SHIFT_RSTn = (0U | (13U)), /*!< EIM0 reset control */ + kERM0_RST_SHIFT_RSTn = (0U | (14U)), /*!< ERM0 reset control */ + kAOI1_RST_SHIFT_RSTn = (0U | (16U)), /*!< AOI1 reset control */ + kFLEXIO0_RST_SHIFT_RSTn = (0U | (17U)), /*!< FLEXIO0 reset control */ + kLPI2C0_RST_SHIFT_RSTn = (0U | (18U)), /*!< LPI2C0 reset control */ + kLPI2C1_RST_SHIFT_RSTn = (0U | (19U)), /*!< LPI2C1 reset control */ + kLPSPI0_RST_SHIFT_RSTn = (0U | (20U)), /*!< LPSPI0 reset control */ + kLPSPI1_RST_SHIFT_RSTn = (0U | (21U)), /*!< LPSPI1 reset control */ + kLPUART0_RST_SHIFT_RSTn = (0U | (22U)), /*!< LPUART0 reset control */ + kLPUART1_RST_SHIFT_RSTn = (0U | (23U)), /*!< LPUART1 reset control */ + kLPUART2_RST_SHIFT_RSTn = (0U | (24U)), /*!< LPUART2 reset control */ + kLPUART3_RST_SHIFT_RSTn = (0U | (25U)), /*!< LPUART3 reset control */ + kLPUART4_RST_SHIFT_RSTn = (0U | (26U)), /*!< LPUART4 reset control */ + kUSB0_RST_SHIFT_RSTn = (0U | (27U)), /*!< USB0 reset control */ + kQDC0_RST_SHIFT_RSTn = (0U | (28U)), /*!< QDC0 reset control */ + kQDC1_RST_SHIFT_RSTn = (0U | (29U)), /*!< QDC1 reset control */ + kFLEXPWM0_RST_SHIFT_RSTn = (0U | (30U)), /*!< FLEXPWM0 reset control */ + kFLEXPWM1_RST_SHIFT_RSTn = (0U | (31U)), /*!< FLEXPWM1 reset control */ + kOSTIMER0_RST_SHIFT_RSTn = ((1U << 8U) | (0U)), /*!< OSTIMER0 reset control */ + kADC0_RST_SHIFT_RSTn = ((1U << 8U) | (1U)), /*!< ADC0 reset control */ + kADC1_RST_SHIFT_RSTn = ((1U << 8U) | (2U)), /*!< ADC1 reset control */ + kCMP1_RST_SHIFT_RSTn = ((1U << 8U) | (4U)), /*!< CMP1 reset control */ + kDAC0_RST_SHIFT_RSTn = ((1U << 8U) | (5U)), /*!< DAC0 reset control */ + kOPAMP0_RST_SHIFT_RSTn = ((1U << 8U) | (6U)), /*!< OPAMP0 reset control */ + kPORT0_RST_SHIFT_RSTn = ((1U << 8U) | (7U)), /*!< PORT0 reset control */ + kPORT1_RST_SHIFT_RSTn = ((1U << 8U) | (8U)), /*!< PORT1 reset control */ + kPORT2_RST_SHIFT_RSTn = ((1U << 8U) | (9U)), /*!< PORT2 reset control */ + kPORT3_RST_SHIFT_RSTn = ((1U << 8U) | (10U)), /*!< PORT3 reset control */ + kPORT4_RST_SHIFT_RSTn = ((1U << 8U) | (11U)), /*!< PORT4 reset control */ + kFLEXCAN0_RST_SHIFT_RSTn = ((1U << 8U) | (12U)), /*!< FLEXCAN0 reset control */ + kLPI2C2_RST_SHIFT_RSTn = ((1U << 8U) | (13U)), /*!< LPI2C2 reset control */ + kLPI2C3_RST_SHIFT_RSTn = ((1U << 8U) | (14U)), /*!< LPI2C3 reset control */ + kGPIO0_RST_SHIFT_RSTn = ((1U << 8U) | (20U)), /*!< GPIO0 reset control */ + kGPIO1_RST_SHIFT_RSTn = ((1U << 8U) | (21U)), /*!< GPIO1 reset control */ + kGPIO2_RST_SHIFT_RSTn = ((1U << 8U) | (22U)), /*!< GPIO2 reset control */ + kGPIO3_RST_SHIFT_RSTn = ((1U << 8U) | (23U)), /*!< GPIO3 reset control */ + kGPIO4_RST_SHIFT_RSTn = ((1U << 8U) | (24U)), /*!< GPIO4 reset control */ + NotAvail_RSTn = (0xFFFFU), /*!< No reset control */ +} SYSCON_RSTn_t; + +/** Array initializers with peripheral reset bits **/ +#define AOI_RSTS \ + { \ + kAOI0_RST_SHIFT_RSTn, kAOI1_RST_SHIFT_RSTn \ + } /* Reset bits for ADC peripheral */ +#define ADC_RSTS \ + { \ + kADC0_RST_SHIFT_RSTn, kADC1_RST_SHIFT_RSTn \ + } /* Reset bits for ADC peripheral */ +#define CRC_RSTS \ + { \ + kCRC0_RST_SHIFT_RSTn \ + } /* Reset bits for CRC peripheral */ +#define CTIMER_RSTS \ + { \ + kCTIMER0_RST_SHIFT_RSTn, kCTIMER1_RST_SHIFT_RSTn, kCTIMER2_RST_SHIFT_RSTn, kCTIMER3_RST_SHIFT_RSTn, \ + kCTIMER4_RST_SHIFT_RSTn \ + } /* Reset bits for CTIMER peripheral */ +#define DAC_RSTS_N \ + { \ + kDAC0_RST_SHIFT_RSTn \ + } /* Reset bits for DAC peripheral */ +#define DMA_RSTS_N \ + { \ + kDMA_RST_SHIFT_RSTn \ + } /* Reset bits for DMA peripheral */ +#define EIM_RSTS_N \ + { \ + kEIM0_RST_SHIFT_RSTn \ + } /* Reset bits for EIM peripheral */ +#define ERM_RSTS_N \ + { \ + kERM0_RST_SHIFT_RSTn \ + } /* Reset bits for ERM peripheral */ +#define FLEXCAN_RSTS_N \ + { \ + kFLEXCAN0_RST_SHIFT_RSTn \ + } /* Reset bits for FLEXCAN peripheral */ +#define FLEXIO_RSTS_N \ + { \ + kFLEXIO0_RST_SHIFT_RSTn \ + } /* Reset bits for FLEXIO peripheral */ +#define FLEXPWM_RSTS_N \ + { \ + kFLEXPWM0_RST_SHIFT_RSTn, kFLEXPWM1_RST_SHIFT_RSTn \ + } /* Reset bits for FLEXPWM peripheral */ +#define FREQME_RSTS_N \ + { \ + kFREQME_RST_SHIFT_RSTn \ + } /* Reset bits for FREQME peripheral */ +#define GPIO_RSTS_N \ + { \ + kGPIO0_RST_SHIFT_RSTn, kGPIO1_RST_SHIFT_RSTn, kGPIO2_RST_SHIFT_RSTn, kGPIO3_RST_SHIFT_RSTn, \ + kGPIO4_RST_SHIFT_RSTn \ + } /* Reset bits for GPIO peripheral */ +#define I3C_RSTS \ + { \ + kI3C0_RST_SHIFT_RSTn \ + } /* Reset bits for I3C peripheral */ +#define INPUTMUX_RSTS \ + { \ + kINPUTMUX0_RST_SHIFT_RSTn \ + } /* Reset bits for INPUTMUX peripheral */ +#define LPUART_RSTS \ + { \ + kLPUART0_RST_SHIFT_RSTn, kLPUART1_RST_SHIFT_RSTn, kLPUART2_RST_SHIFT_RSTn, kLPUART3_RST_SHIFT_RSTn, \ + kLPUART4_RST_SHIFT_RSTn \ + } /* Reset bits for LPUART peripheral */ +#define LPSPI_RSTS \ + { \ + kLPSPI0_RST_SHIFT_RSTn, kLPSPI1_RST_SHIFT_RSTn \ + } /* Reset bits for LPSPI peripheral */ +#define LPI2C_RSTS \ + { \ + kLPI2C0_RST_SHIFT_RSTn, kLPI2C1_RST_SHIFT_RSTn, kLPI2C2_RST_SHIFT_RSTn, kLPI2C3_RST_SHIFT_RSTn \ + } /* Reset bits for LPI2C peripheral */ +#define LPCMP_RSTS \ + { \ + NotAvail_RSTn, kCMP1_RST_SHIFT_RSTn \ + } /* Reset bits for LPCMP peripheral */ +#define OPAMP_RSTS \ + { \ + kOPAMP0_RST_SHIFT_RSTn \ + } /* Reset bits for OPAMP peripheral */ +#define OSTIMER_RSTS \ + { \ + kOSTIMER0_RST_SHIFT_RSTn \ + } /* Reset bits for OSTIMER peripheral */ +#define PORT_RSTS_N \ + { \ + kPORT0_RST_SHIFT_RSTn, kPORT1_RST_SHIFT_RSTn, kPORT2_RST_SHIFT_RSTn, kPORT3_RST_SHIFT_RSTn, \ + kPORT4_RST_SHIFT_RSTn \ + } /* Reset bits for PORT peripheral */ +#define EQDC_RSTS \ + { \ + kQDC0_RST_SHIFT_RSTn, kQDC1_RST_SHIFT_RSTn \ + } /* Reset bits for EQDC peripheral */ +#define UTICK_RSTS \ + { \ + kUTICK0_RST_SHIFT_RSTn \ + } /* Reset bits for UTICK peripheral */ + +typedef SYSCON_RSTn_t reset_ip_name_t; + +/******************************************************************************* + * API + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Assert reset to peripheral. + * + * Asserts reset signal to specified peripheral module. + * + * @param peripheral Assert reset to this peripheral. The enum argument contains encoding of reset register + * and reset bit position in the reset register. + */ +void RESET_SetPeripheralReset(reset_ip_name_t peripheral); + +/*! + * @brief Clear reset to peripheral. + * + * Clears reset signal to specified peripheral module, allows it to operate. + * + * @param peripheral Clear reset to this peripheral. The enum argument contains encoding of reset register + * and reset bit position in the reset register. + */ +void RESET_ClearPeripheralReset(reset_ip_name_t peripheral); + +/*! + * @brief Reset peripheral module. + * + * Reset peripheral module. + * + * @param peripheral Peripheral to reset. The enum argument contains encoding of reset register + * and reset bit position in the reset register. + */ +void RESET_PeripheralReset(reset_ip_name_t peripheral); + +/*! + * @brief Release peripheral module. + * + * Release peripheral module. + * + * @param peripheral Peripheral to release. The enum argument contains encoding of reset register + * and reset bit position in the reset register. + */ +static inline void RESET_ReleasePeripheralReset(reset_ip_name_t peripheral) +{ + RESET_SetPeripheralReset(peripheral); +} + +#if defined(__cplusplus) +} +#endif + +/*! @} */ + +#endif /* _FSL_RESET_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_romapi.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_romapi.h new file mode 100644 index 00000000000..1f2f64f424f --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_romapi.h @@ -0,0 +1,507 @@ +/* + * Copyright 2023, NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_ROMAPI_H_ +#define FSL_ROMAPI_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup romapi + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.romapi" +#endif + +/*! @name Driver version */ +/*@{*/ + +/*! @brief romapi driver version 2.0.0. */ +#define FSL_ROMAPI_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) +/*@}*/ + +/*! + * @name Flash status + * @{ + */ +/*! @brief Flash driver status group. */ +#if defined(kStatusGroup_FlashDriver) +#define kStatusGroupGeneric kStatusGroup_Generic +#define kStatusGroupFlashDriver kStatusGroup_FlashDriver +#elif defined(kStatusGroup_FLASHIAP) +#define kStatusGroupGeneric kStatusGroup_Generic +#define kStatusGroupFlashDriver kStatusGroup_FLASH +#else +#define kStatusGroupGeneric 0 +#define kStatusGroupFlashDriver 1 +#endif + +/*! @brief Constructs a status code value from a group and a code number. */ +#if !defined(MAKE_STATUS) +#define MAKE_STATUS(group, code) ((((group) * 100) + (code))) +#endif + +/*! + * @brief Flash driver status codes. + */ +enum +{ + kStatus_FLASH_Success = MAKE_STATUS(kStatusGroupGeneric, 0), /*!< API is executed successfully*/ + kStatus_FLASH_InvalidArgument = MAKE_STATUS(kStatusGroupGeneric, 4), /*!< Invalid argument*/ + kStatus_FLASH_SizeError = MAKE_STATUS(kStatusGroupFlashDriver, 0), /*!< Error size*/ + kStatus_FLASH_AlignmentError = + MAKE_STATUS(kStatusGroupFlashDriver, 1), /*!< Parameter is not aligned with the specified baseline*/ + kStatus_FLASH_AddressError = MAKE_STATUS(kStatusGroupFlashDriver, 2), /*!< Address is out of range */ + kStatus_FLASH_AccessError = + MAKE_STATUS(kStatusGroupFlashDriver, 3), /*!< Invalid instruction codes and out-of bound addresses */ + kStatus_FLASH_ProtectionViolation = MAKE_STATUS( + kStatusGroupFlashDriver, 4), /*!< The program/erase operation is requested to execute on protected areas */ + kStatus_FLASH_CommandFailure = + MAKE_STATUS(kStatusGroupFlashDriver, 5), /*!< Run-time error during command execution. */ + kStatus_FLASH_UnknownProperty = MAKE_STATUS(kStatusGroupFlashDriver, 6), /*!< Unknown property.*/ + kStatus_FLASH_EraseKeyError = MAKE_STATUS(kStatusGroupFlashDriver, 7) /*!< API erase key is invalid.*/ +}; +/*@}*/ + +/*! + * @brief Enumeration for various flash properties. + */ +typedef enum _flash_property_tag +{ + kFLASH_PropertyPflashSectorSize = 0x00U, /*!< Pflash sector size property.*/ + kFLASH_PropertyPflashTotalSize = 0x01U, /*!< Pflash total size property.*/ + kFLASH_PropertyPflashBlockSize = 0x02U, /*!< Pflash block size property.*/ + kFLASH_PropertyPflashBlockCount = 0x03U, /*!< Pflash block count property.*/ + kFLASH_PropertyPflashBlockBaseAddr = 0x04U, /*!< Pflash block base address property.*/ + kFLASH_PropertyPflashPageSize = 0x30U, /*!< Pflash page size property.*/ + kFLASH_PropertyPflashSystemFreq = 0x31U, /*!< System Frequency property.*/ + kFLASH_PropertyFfrSectorSize = 0x40U, /*!< FFR sector size property.*/ + kFLASH_PropertyFfrTotalSize = 0x41U, /*!< FFR total size property.*/ + kFLASH_PropertyFfrBlockBaseAddr = 0x42U, /*!< FFR block base address property.*/ + kFLASH_PropertyFfrPageSize = 0x43U, /*!< FFR page size property.*/ +} flash_property_tag_t; + +/*! @brief Flash controller paramter config. */ +typedef struct _flash_ffr_config +{ + uint32_t ffrBlockBase; + uint32_t ffrTotalSize; + uint32_t ffrPageSize; + uint32_t sectorSize; + uint32_t cfpaPageVersion; + uint32_t cfpaPageOffset; +} flash_ffr_config_t; + +/*! @brief Flash driver state information. + * + * An instance of this structure is allocated by the user of the flash driver and + * passed into each of the driver APIs. + */ +typedef struct _flash_config +{ + uint32_t PFlashBlockBase; /*!< A base address of the first PFlash block */ + uint32_t PFlashTotalSize; /*!< The size of the combined PFlash block. */ + uint32_t PFlashBlockCount; /*!< A number of PFlash blocks. */ + uint32_t PFlashPageSize; /*!< The size in bytes of a page of PFlash. */ + uint32_t PFlashSectorSize; /*!< The size in bytes of a sector of PFlash. */ + flash_ffr_config_t ffrConfig; +} flash_config_t; + +/*! @brief Interface for the flash driver. */ +typedef struct _flash_driver_interface +{ + /* Flash driver */ + status_t (*flash_init)(flash_config_t *config); + status_t (*flash_erase_sector)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key); + status_t (*flash_program_phrase)(flash_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes); + status_t (*flash_program_page)(flash_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes); + status_t (*flash_verify_program)(flash_config_t *config, + uint32_t start, + uint32_t lengthInBytes, + const uint8_t *expectedData, + uint32_t *failedAddress, + uint32_t *failedData); + status_t (*flash_verify_erase_phrase)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes); + status_t (*flash_verify_erase_page)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes); + status_t (*flash_verify_erase_sector)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes); + status_t (*flash_get_property)(flash_config_t *config, flash_property_tag_t whichProperty, uint32_t *value); + /* IFR driver */ + status_t (*ifr_verify_erase_phrase)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes); + status_t (*ifr_verify_erase_page)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes); + status_t (*ifr_verify_erase_sector)(flash_config_t *config, uint32_t start, uint32_t lengthInBytes); + status_t (*flash_read)(flash_config_t *config, uint32_t start, uint8_t *dest, uint32_t lengthInBytes); + /* version */ + uint32_t version; +} flash_driver_interface_t; + +/*! @brief Constructs the four character code for the Flash driver API key. */ +#if !defined(FOUR_CHAR_CODE) +#define FOUR_CHAR_CODE(a, b, c, d) (((d) << 24) | ((c) << 16) | ((b) << 8) | ((a))) +#endif + +/*! + * @brief Enumeration for Flash driver API keys. + * + * @note The resulting value is built with a byte order such that the string + * being readable in expected order when viewed in a hex editor, if the value + * is treated as a 32-bit little endian value. + */ +enum _flash_driver_api_keys +{ + kFLASH_ApiEraseKey = FOUR_CHAR_CODE('l', 'f', 'e', 'k') /*!< Key value used to validate all flash erase APIs.*/ +}; + +/* API prototype fields definition. +| 31 : 24 | 23 : 20 | 19 : 16 | 15 : 12 | 11 : 8 | 7 : 0 | +| Tag | Boot mode | bootloader periphal| Instance | Image Index| Reserved | +| | | | Used For Boot mode 0| | | +| | 0: Passive mode | 0 - Auto detection | | | | +| | 1: ISP mode | 1 - USB-HID | | | | +| | | 2 - UART | | | | +| | | 3 - SPI | | | | +| | | 4 - I2C | | | | +| | | 5 - CAN | | | | +*/ +typedef struct +{ + union + { + struct + { + uint32_t reserved : 8; + uint32_t boot_image_index : 4; + uint32_t instance : 4; + uint32_t boot_interface : 4; + uint32_t mode : 4; + uint32_t tag : 8; + } B; + uint32_t U; + } option; +} user_app_boot_invoke_option_t; + +/*! @brief Root of the bootloader API tree. + * + * An instance of this struct resides in read-only memory in the bootloader. It + * provides a user application access to APIs exported by the bootloader. + * + */ +typedef struct _bootloader_tree +{ + void (*run_bootloader)(void *arg); /*!< Function to start the bootloader executing. */ + const flash_driver_interface_t *flash_driver; /*!< Internal Flash driver API. */ + void (*jump)(void *arg); +} bootloader_tree_t; + +/** ROM API base address */ +#define ROM_API_BASE (0x03003fe0u) +/** ROM API base pointer */ +#define ROM_API ((bootloader_tree_t *)ROM_API_BASE) +/** FLASH API base pointer */ +#define FLASH_API (ROM_API->flash_driver) + +/*! + * @name Flash API + * @{ + */ + +/*! + * @brief Initializes the global flash properties structure members + * + * This function checks and initializes the Flash module for the other Flash APIs. + * + * @param config Pointer to the storage for the driver runtime state. + * + */ +static inline status_t FLASH_Init(flash_config_t *config) +{ + return FLASH_API->flash_init(config); +} + +/*! + * @brief Erases the flash sectors encompassed by parameters passed into function + * + * This function erases the appropriate number of flash sectors based on the + * desired start address and length. + * + * @param config The pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be erased. + * NOTE: The start address need to be 4 Bytes-aligned. + * + * @param lengthInBytes The length, given in bytes need be 4 Bytes-aligned. + * + * @param key The value used to validate all flash erase APIs. + * + */ +static inline status_t FLASH_EraseSector(flash_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key) +{ + return FLASH_API->flash_erase_sector(config, start, lengthInBytes, key); +} + +/*! + * @brief Programs flash phrases with data at locations passed in through parameters + * + * This function programs the flash memory with the desired data for a given + * flash area as determined by the start address and the length. + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be programmed. Must be + * word-aligned. + * @param src A pointer to the source buffer of data that is to be programmed + * into the flash. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be programmed. Must be word-aligned. + * + */ +static inline status_t FLASH_ProgramPhrase(flash_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes) +{ + return FLASH_API->flash_program_phrase(config, start, src, lengthInBytes); +} + +/*! + * @brief Programs flash page with data at locations passed in through parameters + * + * This function programs the flash memory with the desired data for a given + * flash area as determined by the start address and the length. + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be programmed. Must be + * word-aligned. + * @param src A pointer to the source buffer of data that is to be programmed + * into the flash. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be programmed. Must be word-aligned. + * + */ +static inline status_t FLASH_ProgramPage(flash_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes) +{ + return FLASH_API->flash_program_page(config, start, src, lengthInBytes); +} + +/*! + * @brief Verifies programming of the desired flash area + * + * This function verifies the data programed in the flash memory using the + * Flash Program Check Command and compares it to the expected data for a given + * flash area as determined by the start address and length. + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be verified. Must be word-aligned. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be verified. Must be word-aligned. + * @param expectedData A pointer to the expected data that is to be + * verified against. + * @param failedAddress A pointer to the returned failing address. + * @param failedData A pointer to the returned failing data. Some derivatives do + * not include failed data as part of the FCCOBx registers. In this + * case, zeros are returned upon failure. + * + */ +static inline status_t FLASH_VerifyProgram(flash_config_t *config, + uint32_t start, + uint32_t lengthInBytes, + const uint8_t *expectedData, + uint32_t *failedAddress, + uint32_t *failedData) +{ + return FLASH_API->flash_verify_program(config, start, lengthInBytes, expectedData, failedAddress, failedData); +} + +/*! + * @brief Verify that the flash phrases are erased + * + * This function checks the appropriate number of flash sectors based on + * the desired start address and length to check whether the flash is erased + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be verified. + * The start address does not need to be sector-aligned but must be word-aligned. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be verified. Must be word-aligned. + * + */ +static inline status_t FLASH_VerifyErasePhrase(flash_config_t *config, uint32_t start, uint32_t lengthInBytes) +{ + return FLASH_API->flash_verify_erase_phrase(config, start, lengthInBytes); +} + +/*! + * @brief Verify that the flash pages are erased + * + * This function checks the appropriate number of flash sectors based on + * the desired start address and length to check whether the flash is erased + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be verified. + * The start address does not need to be sector-aligned but must be word-aligned. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be verified. Must be word-aligned. + * + */ +static inline status_t FLASH_VerifyErasePage(flash_config_t *config, uint32_t start, uint32_t lengthInBytes) +{ + return FLASH_API->flash_verify_erase_page(config, start, lengthInBytes); +} + +/*! + * @brief Verify that the flash sectors are erased + * + * This function checks the appropriate number of flash sectors based on + * the desired start address and length to check whether the flash is erased + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be verified. + * The start address does not need to be sector-aligned but must be word-aligned. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be verified. Must be word-aligned. + * + */ +static inline status_t FLASH_VerifyEraseSector(flash_config_t *config, uint32_t start, uint32_t lengthInBytes) +{ + return FLASH_API->flash_verify_erase_sector(config, start, lengthInBytes); +} + +/*! + * @brief Returns the desired flash property + * + * @param config A pointer to the storage for the driver runtime state. + * @param whichProperty The desired property from the list of properties in + * enum flash_property_tag_t + * @param value A pointer to the value returned for the desired flash property. + * + */ +static inline status_t FLASH_GetProperty(flash_config_t *config, flash_property_tag_t whichProperty, uint32_t *value) +{ + return FLASH_API->flash_get_property(config, whichProperty, value); +} + +/*! + * @brief Verify that the IFR0 phrases are erased + * + * This function checks the appropriate number of flash sectors based on + * the desired start address and length to check whether the flash is erased + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be verified. + * The start address does not need to be sector-aligned but must be word-aligned. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be verified. Must be word-aligned. + * + */ +static inline status_t IFR_VerifyErasePhrase(flash_config_t *config, uint32_t start, uint32_t lengthInBytes) +{ + return FLASH_API->ifr_verify_erase_phrase(config, start, lengthInBytes); +} + +/*! + * @brief Verify that the IFR0 pages are erased + * + * This function checks the appropriate number of flash sectors based on + * the desired start address and length to check whether the flash is erased + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be verified. + * The start address does not need to be sector-aligned but must be word-aligned. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be verified. Must be word-aligned. + * + */ +static inline status_t IFR_VerifyErasePage(flash_config_t *config, uint32_t start, uint32_t lengthInBytes) +{ + return FLASH_API->ifr_verify_erase_page(config, start, lengthInBytes); +} + +/*! + * @brief Verify that the IFR0 sectors are erased + * + * This function checks the appropriate number of flash sectors based on + * the desired start address and length to check whether the flash is erased + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be verified. + * The start address does not need to be sector-aligned but must be word-aligned. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be verified. Must be word-aligned. + * + */ +static inline status_t IFR_VerifyEraseSector(flash_config_t *config, uint32_t start, uint32_t lengthInBytes) +{ + return FLASH_API->ifr_verify_erase_sector(config, start, lengthInBytes); +} + +/*! + * @brief Reads flash at locations passed in through parameters + * + * This function read the flash memory from a given flash area as determined + * by the start address and the length. + * + * @param config A pointer to the storage for the driver runtime state. + * @param start The start address of the desired flash memory to be read. + * @param dest A pointer to the dest buffer of data that is to be read + * from the flash. + * @param lengthInBytes The length, given in bytes (not words or long-words), + * to be read. + * + */ +static inline status_t FLASH_Read(flash_config_t *config, uint32_t start, uint8_t *dest, uint32_t lengthInBytes) +{ + return FLASH_API->flash_read(config, start, dest, lengthInBytes); +} + +/*! + * @brief Get ROM API version. + * + * This function read the ROM API version. + * + */ +static inline uint32_t ROMAPI_GetVersion(void) +{ + return FLASH_API->version; +} + +/*! + * @brief Run the Bootloader API to force into the ISP mode base on the user arg + * + * @param arg Indicates API prototype fields definition. + * Refer to the above #user_app_boot_invoke_option_t structure + */ +static inline void ROMAPI_RunBootloader(void *arg) +{ + ROM_API->run_bootloader(arg); +} + +/*! + * @brief Get the UUID + * + * @param uuid UUID data array + * + */ +static inline void ROMAPI_GetUUID(uint8_t *uuid) +{ +#define MCXA_UUID_ADDR (0x01100800U) +#define MCXA_UUID_SIZE (16U) + + uint8_t *p = (uint8_t *)MCXA_UUID_ADDR; + for (uint8_t i = 0; i < MCXA_UUID_SIZE; i++) + { + *uuid = *p; + uuid++; + p++; + } +} + +/* @} */ + +/*! @} */ + +#endif /* FSL_ROMAPI_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_spc.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_spc.c new file mode 100644 index 00000000000..c6a9b293262 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_spc.c @@ -0,0 +1,1680 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_spc.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.mcx_spc" +#endif + +/* + * $Coverage Justification Reference$ + * + * $Justification spc_c_ref_1$ + * The SPC busy status flag is too short to get coverage data. + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Gets selected power domain's requested low power mode. + * + * param base SPC peripheral base address. + * param powerDomainId Power Domain Id, please refer to spc_power_domain_id_t. + * + * return The selected power domain's requested low power mode, please refer to spc_power_domain_low_power_mode_t. + */ +spc_power_domain_low_power_mode_t SPC_GetPowerDomainLowPowerMode(SPC_Type *base, spc_power_domain_id_t powerDomainId) +{ + assert((uint8_t)powerDomainId < SPC_PD_STATUS_COUNT); + + uint32_t val; + + val = ((base->PD_STATUS[(uint8_t)powerDomainId] & SPC_PD_STATUS_LP_MODE_MASK) >> SPC_PD_STATUS_LP_MODE_SHIFT); + return (spc_power_domain_low_power_mode_t)val; +} + +/*! + * brief Gets Isolation status for each power domains. + * + * This function gets the status which indicates whether certain + * peripheral and the IO pads are in a latched state as a result + * of having been in POWERDOWN mode. + * + * param base SPC peripheral base address. + * return Current isolation status for each power domains. + */ +uint8_t SPC_GetPeriphIOIsolationStatus(SPC_Type *base) +{ + uint32_t reg; + + reg = base->SC; + return (uint8_t)((reg & SPC_SC_ISO_CLR_MASK) >> SPC_SC_ISO_CLR_SHIFT); +} + +/*! + * brief Configs Low power request output pin. + * + * This function configs the low power request output pin + * + * param base SPC peripheral base address. + * param config Pointer the spc_LowPower_Request_config_t structure. + */ +void SPC_SetLowPowerRequestConfig(SPC_Type *base, const spc_lowpower_request_config_t *config) +{ + assert(config != NULL); + + uint32_t reg; + + reg = base->LPREQ_CFG; + reg &= ~(SPC_LPREQ_CFG_LPREQOE_MASK | SPC_LPREQ_CFG_LPREQPOL_MASK | SPC_LPREQ_CFG_LPREQOV_MASK); + + if (config->enable) + { + reg |= SPC_LPREQ_CFG_LPREQOE_MASK | SPC_LPREQ_CFG_LPREQPOL((uint8_t)(config->polarity)) | + SPC_LPREQ_CFG_LPREQOV((uint8_t)(config->override)); + } + else + { + reg &= ~SPC_LPREQ_CFG_LPREQOE_MASK; + } + + base->LPREQ_CFG = reg; +} + +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) +/*! + * brief Configures VDD Core Glitch detector, including ripple counter selection, timeout value and so on. + * + * param base SPC peripheral base address. + * param config Pointer to the structure in type of spc_vdd_core_glitch_detector_config_t. + */ +void SPC_ConfigVddCoreGlitchDetector(SPC_Type *base, const spc_vdd_core_glitch_detector_config_t *config) +{ + assert(config != NULL); + + uint32_t reg; + + reg = (base->VDD_CORE_GLITCH_DETECT_SC) & + ~(SPC_VDD_CORE_GLITCH_DETECT_SC_CNT_SELECT_MASK | SPC_VDD_CORE_GLITCH_DETECT_SC_TIMEOUT_MASK | + SPC_VDD_CORE_GLITCH_DETECT_SC_RE_MASK | SPC_VDD_CORE_GLITCH_DETECT_SC_IE_MASK); + + reg |= SPC_VDD_CORE_GLITCH_DETECT_SC_CNT_SELECT(config->rippleCounterSelect) | + SPC_VDD_CORE_GLITCH_DETECT_SC_TIMEOUT(config->resetTimeoutValue) | + SPC_VDD_CORE_GLITCH_DETECT_SC_RE(config->enableReset) | + SPC_VDD_CORE_GLITCH_DETECT_SC_IE(config->enableInterrupt); + + base->VDD_CORE_GLITCH_DETECT_SC = reg; +} +#endif + +/*! + * brief Set SRAM operate voltage. + * + * param base SPC peripheral base address. + * param config The pointer to spc_sram_voltage_config_t, specifies the configuration of sram voltage. + */ +void SPC_SetSRAMOperateVoltage(SPC_Type *base, const spc_sram_voltage_config_t *config) +{ + assert(config != NULL); + + uint32_t reg = 0UL; + + reg |= SPC_SRAMCTL_VSM(config->operateVoltage); + + base->SRAMCTL = reg; + + if (config->requestVoltageUpdate) + { + base->SRAMCTL |= SPC_SRAMCTL_REQ_MASK; + while ((base->SRAMCTL & SPC_SRAMCTL_ACK_MASK) == 0UL) + { + /* Wait until acknowledged */ + ; + } + base->SRAMCTL &= ~SPC_SRAMCTL_REQ_MASK; + } +} + +/*! + * brief Configs Bandgap mode in Active mode. + * + * @note To disable bandgap in Active mode: + * 1. Disable all LVD's and HVD's in active mode; + * 2. Disable Glitch detect; + * 3. Configrue LDO's and DCDC to low drive strength in active mode; + * 4. Invoke this function to disable bandgap in active mode; + * otherwise the error status will be reported. + * + * @note Some other system resources(such as PLL, CMP) require bandgap to be enabled, to disable bandgap please + * take care of other system resources. + * + * param base SPC peripheral base address. + * param mode The Bandgap mode be selected. + * + * retval kStatus_SPC_BandgapModeWrong The Bandgap can not be disabled in active mode. + * retval kStatus_Success Config Bandgap mode in Active power mode successful. + */ +status_t SPC_SetActiveModeBandgapModeConfig(SPC_Type *base, spc_bandgap_mode_t mode) +{ + uint32_t reg; + uint32_t state; + + reg = base->ACTIVE_CFG; + + if (mode == kSPC_BandgapDisabled) + { + state = SPC_GetActiveModeVoltageDetectStatus(base); + + /* If any of the LVD/HVDs are kept enabled, bandgap mode must be enabled with buffer disabled. */ + if (state != 0UL) + { + return kStatus_SPC_BandgapModeWrong; + } + + /* The bandgap mode must be enabled if any regulators' drive strength set as Normal. */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK) == + SPC_ACTIVE_CFG_SYSLDO_VDD_DS(kSPC_SysLDO_NormalDriveStrength)) + { + return kStatus_SPC_BandgapModeWrong; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_DCDC_VDD_DS_MASK) == SPC_ACTIVE_CFG_DCDC_VDD_DS(kSPC_DCDC_NormalVoltage)) + { + return kStatus_SPC_BandgapModeWrong; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) + /* state of GLITCH_DETECT_DISABLE will be ignored if bandgap is disabled. */ + if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK) == 0UL) + { + return kStatus_SPC_BandgapModeWrong; + } +#endif +#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS + if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK) == + SPC_ACTIVE_CFG_CORELDO_VDD_DS(kSPC_CoreLDO_NormalDriveStrength)) + { + return kStatus_SPC_BandgapModeWrong; + } +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + } + + reg &= ~SPC_ACTIVE_CFG_BGMODE_MASK; + reg |= SPC_ACTIVE_CFG_BGMODE(mode); + + base->ACTIVE_CFG = reg; + + return kStatus_Success; +} + +/*! + * brief Configs Bandgap mode in Low Power mode. + * + * @note To disable Bandgap in Low-power mode: + * 1. Disable all LVD's ad HVD's in low power mode; + * 2. Disable Glitch detect in low power mode; + * 3. Configure LDO's and DCDC to low drive strength in low power mode; + * 4. Disable bandgap in low power mode; + * Otherwise, the error status will be reported. + * + * @note Some other system resources(such as PLL, CMP) require bandgap to be enabled, to disable bandgap please + * take care of other system resources. + * + * param base SPC peripheral base address. + * param mode The Bandgap mode be selected. + * + * retval kStatus_SPC_BandgapModeWrong The bandgap mode setting in Low Power mode is wrong. + * retval kStatus_Success Config Bandgap mode in Low Power power mode successful. + */ +status_t SPC_SetLowPowerModeBandgapmodeConfig(SPC_Type *base, spc_bandgap_mode_t mode) +{ + uint32_t reg; + uint32_t state; + + reg = base->LP_CFG; + + if (mode == kSPC_BandgapDisabled) + { + state = (uint32_t)SPC_GetLowPowerModeVoltageDetectStatus(base); + + /* If any of the LVD/HVDs are kept enabled, bandgap mode must be enabled with buffer disabled. */ + if (state != 0UL) + { + return kStatus_SPC_BandgapModeWrong; + } + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + if ((base->LP_CFG & SPC_LP_CFG_DCDC_VDD_DS_MASK) == SPC_LP_CFG_DCDC_VDD_DS(kSPC_DCDC_NormalDriveStrength)) + { + return kStatus_SPC_BandgapModeWrong; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + if ((base->LP_CFG & SPC_LP_CFG_SYSLDO_VDD_DS_MASK) == SPC_LP_CFG_SYSLDO_VDD_DS(kSPC_SysLDO_NormalDriveStrength)) + { + return kStatus_SPC_BandgapModeWrong; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + + if ((base->LP_CFG & SPC_LP_CFG_CORELDO_VDD_DS_MASK) == + SPC_LP_CFG_CORELDO_VDD_DS(kSPC_CoreLDO_NormalDriveStrength)) + { + return kStatus_SPC_BandgapModeWrong; + } + +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) + /* state of GLITCH_DETECT_DISABLE will be ignored if bandgap is disabled. */ + if ((base->LP_CFG & SPC_LP_CFG_GLITCH_DETECT_DISABLE_MASK) == 0UL) + { + return kStatus_SPC_BandgapModeWrong; + } +#endif + } + + reg &= ~SPC_LP_CFG_BGMODE_MASK; + reg |= SPC_LP_CFG_BGMODE(mode); + base->LP_CFG = reg; + + return kStatus_Success; +} + +/*! + * brief Configs CORE voltage detect options. + * + * This function configs CORE voltage detect options. + * Note: Setting both the voltage detect interrupt and reset + * enable will cause interrupt to be generated on exit from reset. + * If those conditioned is not desired, interrupt/reset only one is enabled. + * + * param base SPC peripheral base address. + * param config Pointer to spc_core_voltage_detect_config_t structure. + */ +void SPC_SetCoreVoltageDetectConfig(SPC_Type *base, const spc_core_voltage_detect_config_t *config) +{ + assert(config != NULL); + + uint32_t reg = 0UL; + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) + reg |= (config->option.HVDInterruptEnable) ? SPC_VD_CORE_CFG_HVDIE(1U) : SPC_VD_CORE_CFG_HVDIE(0U); + reg |= (config->option.HVDResetEnable) ? SPC_VD_CORE_CFG_HVDRE(1U) : SPC_VD_CORE_CFG_HVDRE(0U); +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */ + reg |= (config->option.LVDInterruptEnable) ? SPC_VD_CORE_CFG_LVDIE(1U) : SPC_VD_CORE_CFG_LVDIE(0U); + reg |= (config->option.LVDResetEnable) ? SPC_VD_CORE_CFG_LVDRE(1U) : SPC_VD_CORE_CFG_LVDRE(0U); + + base->VD_CORE_CFG = reg; +} + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) +/*! + * brief Enables the Core High Voltage Detector in Active mode. + * + * note If the CORE_LDO high voltage detect is enabled in Active mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low. + * + * param base SPC peripheral base address. + * param enable Enable/Disable Core HVD. + * true - Enable Core High voltage detector in active mode. + * false - Disable Core High voltage detector in active mode. + * + * retval kStatus_Success Enable Core High Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeCoreHighVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->ACTIVE_CFG |= SPC_ACTIVE_CFG_CORE_HVDE_MASK; + } + else + { + base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORE_HVDE_MASK; + } + + return status; +} + +/*! + * brief Enables the Core High Voltage Detector in Low Power mode. + * + * note If the CORE_LDO high voltage detect is enabled in Low Power mode, + * please note that the bandgap must be enabled and the drive strength of each regulator + * must not set to low in low power mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable Core HVD. + * true - Enable Core High voltage detector in low power mode. + * false - Disable Core High voltage detector in low power mode. + * + * retval kStatus_Success Enable Core High Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeCoreHighVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_CORE_HVDE_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_CORE_HVDE_MASK; + } + + return status; +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */ + +/*! + * brief Enables the Core VDD Low Voltage Detector in Active mode. + * + * note If the Core VDD high voltage detect is enabled in Active mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low. + * + * param base SPC peripheral base address. + * param enable Enable/Disable Core LVD. + * true - Enable Core Low voltage detector in active mode. + * false - Disable Core Low voltage detector in active mode. + * + * retval kStatus_Success Enable Core Low Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeCoreLowVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->ACTIVE_CFG |= SPC_ACTIVE_CFG_CORE_LVDE_MASK; + } + else + { + base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORE_LVDE_MASK; + } + + return status; +} + +/*! + * brief Enables the Core Low Voltage Detector in Low Power mode. + * + * note If the Core VDD low voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Low Power mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable Core HVD. + * true - Enable Core Low voltage detector in low power mode. + * false - Disable Core Low voltage detector in low power mode. + * + * retval kStatus_Success Enable Core Low Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeCoreLowVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_CORE_LVDE_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_CORE_LVDE_MASK; + } + + return status; +} + +/*! + * brief Set system VDD Low-voltage level selection. + * + * This function selects the system VDD low-voltage level. Changing system VDD low-voltage level + * must be done after disabling the System VDD low voltage reset and interrupt. + * + * @deprecated In latest RM, reserved for all devices, will removed in next release. + * + * param base SPC peripheral base address. + * param level System VDD Low-Voltage level selection. See @ref spc_low_voltage_level_select_t for details. + */ +void SPC_SetSystemVDDLowVoltageLevel(SPC_Type *base, spc_low_voltage_level_select_t level) +{ + (void)level; + (void)base; + + /* + uint32_t reg; + + reg = base->VD_SYS_CFG; + + base->VD_SYS_CFG &= ~(SPC_VD_SYS_CFG_LVDRE_MASK | SPC_VD_SYS_CFG_LVDIE_MASK); + reg |= SPC_VD_SYS_CFG_LVSEL(level); + + base->VD_SYS_CFG = reg; */ +} + +/*! + * brief Configs SYS VDD voltage detect options. + * + * This function config SYS voltage detect options. + * Note: Setting both the voltage detect interrupt and reset + * enable will cause interrupt to be generated on exit from reset. + * If those conditioned is not desired, interrupt/reset only one is enabled. + * + * param base SPC peripheral base address. + * param config Pointer to spc_system_voltage_detect_config_t structure. + */ +void SPC_SetSystemVoltageDetectConfig(SPC_Type *base, const spc_system_voltage_detect_config_t *config) +{ + assert(config != NULL); + + uint32_t reg = 0UL; + + reg |= (config->option.HVDInterruptEnable) ? SPC_VD_SYS_CFG_HVDIE(1U) : SPC_VD_SYS_CFG_HVDIE(0U); + reg |= (config->option.LVDInterruptEnable) ? SPC_VD_SYS_CFG_LVDIE(1U) : SPC_VD_SYS_CFG_LVDIE(0U); + reg |= (config->option.HVDResetEnable) ? SPC_VD_SYS_CFG_HVDRE(1U) : SPC_VD_SYS_CFG_HVDRE(0U); + reg |= (config->option.LVDResetEnable) ? SPC_VD_SYS_CFG_LVDRE(1U) : SPC_VD_SYS_CFG_LVDRE(0U); + + base->VD_SYS_CFG = reg; + + (void)(config->level); + /* SPC_SetSystemVDDLowVoltageLevel(base, config->level); */ +} + +/*! + * brief Enables the System VDD High Voltage Detector in Active mode. + * + * note If the System_LDO high voltage detect is enabled in Active mode, + * please note that the bandgap must be enabled and the drive strength of + * each regulator must not set to low in Active mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable System HVD. + * true - Enable System High voltage detector in active mode. + * false - Disable System High voltage detector in active mode. + * + * retval kStatus_Success Enable System High Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeSystemHighVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->ACTIVE_CFG |= SPC_ACTIVE_CFG_SYS_HVDE_MASK; + } + else + { + base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_SYS_HVDE_MASK; + } + + return status; +} + +/*! + * brief Enables the System VDD Low Voltage Detector in Active mode. + * + * note If the System_LDO low voltage detect is enabled in Active mode, + * please note that the bandgap must be enabled and the drive strength of each + * regulator must not set to low in Active mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable System LVD. + * true - Enable System Low voltage detector in active mode. + * false - Disable System Low voltage detector in active mode. + * + * retval kStatus_Success Enable the System Low Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeSystemLowVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->ACTIVE_CFG |= SPC_ACTIVE_CFG_SYS_LVDE_MASK; + } + else + { + base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_SYS_LVDE_MASK; + } + + return status; +} + +/*! + * brief Enables the System VDD High Voltage Detector in Low Power mode. + * + * note If the System_LDO high voltage detect is enabled in low power mode, + * please note that the bandgap must be enabled and the drive strength of each + * regulator must not set to low in low power mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable System HVD. + * true - Enable System High voltage detector in low power mode. + * false - Disable System High voltage detector in low power mode. + * + * retval kStatus_Success Enable System High Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeSystemHighVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_SYS_HVDE_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_SYS_HVDE_MASK; + } + + return status; +} + +/*! + * brief Enables the System VDD Low Voltage Detector in Low Power mode. + * + * note If the System_LDO low voltage detect is enabled in Low Power mode, + * please note that the bandgap must be enabled and the drive strength of each + * regulator must not set to low in Low Power mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable System HVD. + * true - Enable System Low voltage detector in low power mode. + * false - Disable System Low voltage detector in low power mode. + * + * retval kStatus_Success Enable System Low Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeSystemLowVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_SYS_LVDE_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_SYS_LVDE_MASK; + } + + return status; +} + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) +/*! + * brief Set IO VDD Low-Voltage level selection. + * + * This function selects the IO VDD Low-voltage level. Changing IO VDD low-voltage level + * must be done after disabling the IO VDD low voltage reset and interrupt. + * + * param base SPC peripheral base address. + * param level IO VDD Low-voltage level selection. + */ +void SPC_SetIOVDDLowVoltageLevel(SPC_Type *base, spc_low_voltage_level_select_t level) +{ + uint32_t reg; + + reg = base->VD_IO_CFG; + + base->VD_IO_CFG &= ~(SPC_VD_IO_CFG_LVDRE_MASK | SPC_VD_IO_CFG_LVDIE_MASK | SPC_VD_IO_CFG_LVSEL_MASK); + reg |= SPC_VD_IO_CFG_LVSEL(level); + + base->VD_IO_CFG = reg; +} + +/*! + * brief Configs IO VDD voltage detect options. + * + * This function config IO voltage detect options. + * Note: Setting both the voltage detect interrupt and reset + * enable will cause interrupt to be generated on exit from reset. + * If those conditioned is not desired, interrupt/reset so only one is enabled. + * + * param base SPC peripheral base address. + * param config Pointer to spc_IO_voltage_detect_config_t structure. + */ +void SPC_SetIOVoltageDetectConfig(SPC_Type *base, const spc_io_voltage_detect_config_t *config) +{ + assert(config != NULL); + + uint32_t reg = 0UL; + + /* Set trip voltage level. */ + SPC_SetIOVDDLowVoltageLevel(base, config->level); + + reg = base->VD_IO_CFG; + reg &= ~(SPC_VD_IO_CFG_LVDRE_MASK | SPC_VD_IO_CFG_LVDIE_MASK | SPC_VD_IO_CFG_HVDRE_MASK | SPC_VD_IO_CFG_HVDIE_MASK); + + reg |= (config->option.HVDInterruptEnable) ? SPC_VD_IO_CFG_HVDIE(1U) : SPC_VD_IO_CFG_HVDIE(0U); + reg |= (config->option.LVDInterruptEnable) ? SPC_VD_IO_CFG_LVDIE(1U) : SPC_VD_IO_CFG_LVDIE(0U); + reg |= (config->option.HVDResetEnable) ? SPC_VD_IO_CFG_HVDRE(1U) : SPC_VD_IO_CFG_HVDRE(0U); + reg |= (config->option.LVDResetEnable) ? SPC_VD_IO_CFG_LVDRE(1U) : SPC_VD_IO_CFG_LVDRE(0U); + + base->VD_IO_CFG = reg; +} + +/*! + * brief Enables the IO VDD High Voltage Detector in Active mode. + * + * note If the IO high voltage detect is enabled in Active mode, + * please note that the bandgap must be enabled and the drive strength + * of each regulator must not set to low in Active mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable IO HVD. + * true - Enable IO High voltage detector in active mode. + * false - Disable IO High voltage detector in active mode. + * + * retval kStatus_Success Enable IO High Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeIOHighVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->ACTIVE_CFG |= SPC_ACTIVE_CFG_IO_HVDE_MASK; + } + else + { + base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_IO_HVDE_MASK; + } + + return status; +} + +/*! + * brief Enables the IO VDD Low Voltage Detector in Active mode. + * + * note If the IO low voltage detect is enabled in Active mode, + * please note that the bandgap must be enabled and the drive strength + * of each regulator must not set to low in Active mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable IO LVD. + * true - Enable IO Low voltage detector in active mode. + * false - Disable IO Low voltage detector in active mode. + * + * retval kStatus_Success Enable IO Low Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeIOLowVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->ACTIVE_CFG |= SPC_ACTIVE_CFG_IO_LVDE_MASK; + } + else + { + base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_IO_LVDE_MASK; + } + + return status; +} + +/*! + * brief Enables the IO VDD High Voltage Detector in Low Power mode. + * + * note If the IO high voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Low Power mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable IO HVD. + * true - Enable IO High voltage detector in low power mode. + * false - Disable IO High voltage detector in low power mode. + * + * retval kStatus_Success Enable IO High Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeIOHighVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_IO_HVDE_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_IO_HVDE_MASK; + } + + return status; +} + +/*! + * brief Enables the IO VDD Low Voltage Detector in Low Power mode. + * + * note If the IO low voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Low Power mode. + * + * param base SPC peripheral base address. + * param enable Enable/Disable IO HVD. + * true - Enable IO Low voltage detector in low power mode. + * false - Disable IO Low voltage detector in low power mode. + * + * retval kStatus_Success Enable IO Low Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeIOLowVoltageDetect(SPC_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_IO_LVDE_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_IO_LVDE_MASK; + } + + return status; +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */ + +/*! + * brief Configs external voltage domains + * + * This function configs external voltage domains isolation. + * + * param base SPC peripheral base address. + * param lowPowerIsoMask The mask of external domains isolate enable during low power mode. + * param IsoMask The mask of external domains isolate. + */ +void SPC_SetExternalVoltageDomainsConfig(SPC_Type *base, uint8_t lowPowerIsoMask, uint8_t IsoMask) +{ + uint32_t reg = 0UL; + + reg |= SPC_EVD_CFG_REG_EVDISO(IsoMask) | SPC_EVD_CFG_REG_EVDLPISO(lowPowerIsoMask); + base->EVD_CFG = reg; +} + +/*! + * brief Configs Core LDO Regulator in Active mode. + * + * @note The bandgap must be enabled before invoking this function. + * @note To set Core LDO as low drive strength, all HVDs/LVDs must be disabled previously. + * + * param base SPC peripheral base address. + * param option Pointer to the spc_active_mode_Core_LDO_option_t structure. + * + * retval kStatus_Success Config Core LDO regulator in Active power mode successful. + * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * retval kStatus_SPC_BandgapModeWrong Bandgap should be enabled before invoking this function. + * retval kStatus_SPC_CORELDOLowDriveStrengthIgnore To set Core LDO as low drive strength, + * all LVDs/HVDs must be disabled before invoking this function. + */ +status_t SPC_SetActiveModeCoreLDORegulatorConfig(SPC_Type *base, const spc_active_mode_core_ldo_option_t *option) +{ + assert(option != NULL); + + if ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + return kStatus_SPC_Busy; + } + + /* Check input parameters. */ + /* 1. Bandgap must not be disabled. */ + if (SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled) + { + return kStatus_SPC_BandgapModeWrong; + } + + /* 2. To set to low drive strength, all LVDs/HVDs must be disabled previously. */ + if ((SPC_GetActiveModeVoltageDetectStatus(base) != 0UL) && + (option->CoreLDODriveStrength == kSPC_CoreLDO_LowDriveStrength)) + { + return kStatus_SPC_CORELDOLowDriveStrengthIgnore; + } + + if ((uint8_t)SPC_GetActiveModeCoreLDOVDDVoltageLevel(base) != (uint8_t)(option->CoreLDOVoltage)) + { +#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS + (void)SPC_SetActiveModeCoreLDORegulatorDriveStrength(base, kSPC_CoreLDO_NormalDriveStrength); +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + (void)SPC_SetActiveModeCoreLDORegulatorVoltageLevel(base, option->CoreLDOVoltage); + } + +#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS + (void)SPC_SetActiveModeCoreLDORegulatorDriveStrength(base, option->CoreLDODriveStrength); +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + + return kStatus_Success; +} + +/*! + * brief Set Core LDO VDD Regulator Voltage level in Active mode. + * + * @note In active mode, the Core LDO voltage level should only be changed when the + * Core LDO is in normal drive strength. + * + * @note Update Core LDO voltage level will set Busy flag, + * this function return only when busy flag is cleared by hardware + * + * param base SPC peripheral base address. + * param voltageLevel Specify the voltage level of CORE LDO Regulator in Active mode, please + refer to @ref spc_core_ldo_voltage_level_t. + * + * retval kStatus_SPC_CORELDOVoltageSetFail Core LDO voltage level should only be + * changed when the CORE_LDO is in normal drive strength. + * retval kStatus_Success Set Core LDO regulator voltage level in Active power mode successful. + */ +status_t SPC_SetActiveModeCoreLDORegulatorVoltageLevel(SPC_Type *base, spc_core_ldo_voltage_level_t voltageLevel) +{ + if ((uint8_t)voltageLevel != (uint8_t)SPC_GetActiveModeCoreLDOVDDVoltageLevel(base)) + { +#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) + if (SPC_GetActiveModeCoreLDODriveStrength(base) != kSPC_CoreLDO_NormalDriveStrength) + { + return kStatus_SPC_CORELDOVoltageSetFail; + } +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + + base->ACTIVE_CFG = + ((base->ACTIVE_CFG & ~SPC_ACTIVE_CFG_CORELDO_VDD_LVL_MASK) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(voltageLevel)); + + /* + * $Branch Coverage Justification$ + * $ref spc_c_ref_1$. + */ + while ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + } + } + return kStatus_Success; +} + +#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS +/*! + * brief Set Core LDO VDD Regulator Drive Strength in Active mode. + * + * param base SPC peripheral base address. + * param driveStrength Specify the drive strength of CORE LDO Regulator in Active mode, please + refer to @ref spc_core_ldo_drive_strength_t. + * + * retval #kStatus_Success Set Core LDO regulator drive strength in Active power mode successful. + * retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore If any voltage detect enabled, + core_ldo's drive strength can not set to low. + * retval #kStatus_SPC_BandgapModeWrong The selected bandgap mode is not allowed. + */ +status_t SPC_SetActiveModeCoreLDORegulatorDriveStrength(SPC_Type *base, spc_core_ldo_drive_strength_t driveStrength) +{ + if (driveStrength == kSPC_CoreLDO_LowDriveStrength) + { + /* If any voltage detect feature is enabled in Active mode, then CORE_LDO's drive strength must not set to low. + */ + if (SPC_GetActiveModeVoltageDetectStatus(base) != 0UL) + { + return kStatus_SPC_CORELDOLowDriveStrengthIgnore; + } + } + + if (driveStrength == kSPC_CoreLDO_NormalDriveStrength) + { + /* If specify normal drive strength, bandgap must not be disabled. */ + if (SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled) + { + return kStatus_SPC_BandgapModeWrong; + } + } + + base->ACTIVE_CFG = + ((base->ACTIVE_CFG & ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK) | SPC_ACTIVE_CFG_CORELDO_VDD_DS(driveStrength)); + + return kStatus_Success; +} +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + +/*! + * brief Configs CORE LDO Regulator in low power mode + * + * This function configs CORE LDO Regulator in Low Power mode. + * If CORE LDO VDD Drive Strength is set to Normal, the CORE LDO VDD regulator voltage + * level in Active mode must be equal to the voltage level in Low power mode. And the Bandgap + * must be programmed to select bandgap enabled. + * Core VDD voltage levels for the Core LDO low power regulator can only be changed when the CORE + * LDO Drive Strength is set as Normal. + * + * param base SPC peripheral base address. + * param option Pointer to the spc_lowpower_mode_Core_LDO_option_t structure. + * retval kStatus_Success Config Core LDO regulator in power mode successfully. + * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * retval kStatus_SPC_CORELDOLowDriveStrengthIgnore HVDs/LVDs are not disabled before invoking this function. + * retval kStatus_SPC_BandgapModeWrong The bandgap is not enabled before invoking this function. + */ +status_t SPC_SetLowPowerModeCoreLDORegulatorConfig(SPC_Type *base, const spc_lowpower_mode_core_ldo_option_t *option) +{ + status_t status = kStatus_Success; + + if ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + /* + * $Line Coverage Justification$ + * $ref spc_c_ref_1$. + */ + return kStatus_SPC_Busy; + } + + status = SPC_SetLowPowerModeCoreLDORegulatorDriveStrength(base, option->CoreLDODriveStrength); + if (status == kStatus_Success) + { + (void)SPC_SetLowPowerModeCoreLDORegulatorVoltageLevel(base, option->CoreLDOVoltage); + } + + return status; +} + +/*! + * brief Set Core LDO VDD Regulator Voltage level in Low power mode. + * + * @note If Core LDO's drive strengths are same in active and low power mode, the Core LDO's voltage must be set to the + * same value in active and low power mode. Application should take care of this limitation. + * + * @note Some devices require Core LDO and DCDC have the same voltage level even if Core LDO is off. Application should + * take care of this limitation. + * + * param base SPC peripheral base address. + * param voltageLevel Voltage level of CORE LDO Regulator in Low power mode, please + refer to @ref spc_core_ldo_voltage_level_t. + * + * retval #kStatus_SPC_Busy The SPC instance is busy to execute other operation. + * retval #kStatus_Success Set Core LDO regulator voltage level in Low power mode successful. + */ +status_t SPC_SetLowPowerModeCoreLDORegulatorVoltageLevel(SPC_Type *base, spc_core_ldo_voltage_level_t voltageLevel) +{ + if ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + /* + * $Line Coverage Justification$ + * $ref spc_c_ref_1$. + */ + return kStatus_SPC_Busy; + } + + base->LP_CFG = ((base->LP_CFG & ~SPC_LP_CFG_CORELDO_VDD_LVL_MASK) | SPC_LP_CFG_CORELDO_VDD_LVL(voltageLevel)); + + /* + * $Branch Coverage Justification$ + * $ref spc_c_ref_1$. + */ + while ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + } + + return kStatus_Success; +} + +/*! + * brief Set Core LDO VDD Regulator Drive Strength in Low power mode. + * + * param base SPC peripheral base address. + * param driveStrength Specify drive strength of CORE LDO in low power mode. + * + * retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Some voltage detect enabled, CORE LDO's drive strength can not set + * as low. + * retval #kStatus_Success Set Core LDO regulator drive strength in Low power mode successful. + * retval #kStatus_SPC_BandgapModeWrong Bandgap is disabled when attempt to set CORE LDO work as normal drive strength. + */ +status_t SPC_SetLowPowerModeCoreLDORegulatorDriveStrength(SPC_Type *base, spc_core_ldo_drive_strength_t driveStrength) +{ + if (driveStrength == kSPC_CoreLDO_LowDriveStrength) + { + /* If any voltage detect feature is enabled in Low Power mode, then CORE_LDO's drive strength must not set to + * low. + */ + if (SPC_GetLowPowerModeVoltageDetectStatus(base) != 0UL) + { + return kStatus_SPC_CORELDOLowDriveStrengthIgnore; + } + } + else + { + /* To specify normal drive strength, the bandgap must be enabled in low power mode. */ + if (SPC_GetLowPowerModeBandgapMode(base) == kSPC_BandgapDisabled) + { + return kStatus_SPC_BandgapModeWrong; + } + } + + base->LP_CFG = ((base->LP_CFG & ~SPC_LP_CFG_CORELDO_VDD_DS_MASK) | SPC_LP_CFG_CORELDO_VDD_DS(driveStrength)); + + return kStatus_Success; +} + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) +/*! + * brief Configs System LDO VDD Regulator in Active mode. + * + * This function configs System LDO VDD Regulator in Active mode. + * If System LDO VDD Drive Strength is set to Normal, the Bandgap mode in Active mode must be programmed + * to a value that enable the bandgap. + * If any voltage detects are kept enabled, configuration to set System LDO VDD drive strength to low will + * be ignored. + * If select System LDO VDD Regulator voltage level to Over Drive Voltage, the Drive Strength of System LDO VDD + * Regulator must be set to Normal otherwise the regulator Drive Strength will be forced to Normal. + * If select System LDO VDD Regulator voltage level to Over Drive Voltage, the High voltage detect must be disabled. + * Otherwise it will be fail to regulator to Over Drive Voltage. + * + * param base SPC peripheral base address. + * param option Pointer to the spc_active_mode_Sys_LDO_option_t structure. + * retval kStatus_Success Config System LDO regulator in Active power mode successful. + * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * retval kStatus_SPC_BandgapModeWrong The bandgap is not enabled before invoking this function. + * retval kStatus_SPC_SYSLDOOverDriveVoltageFail HVD of System VDD is not disable before setting to Over Drive voltage. + * retval kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set System LDO VDD regulator's driver strength to Low will be + * ignored. + */ +status_t SPC_SetActiveModeSystemLDORegulatorConfig(SPC_Type *base, const spc_active_mode_sys_ldo_option_t *option) +{ + assert(option != NULL); + + if ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + /* + * $Line Coverage Justification$ + * $ref spc_c_ref_1$. + */ + return kStatus_SPC_Busy; + } + + /* Check input parameters before setting registers. */ + /* 1. To set to low DS, all LVDs/HVDs must be disabled previously. */ + if ((SPC_GetActiveModeVoltageDetectStatus(base) != 0UL) && + (option->SysLDODriveStrength == kSPC_SysLDO_LowDriveStrength)) + { + return kStatus_SPC_SYSLDOLowDriveStrengthIgnore; + } + /* 2. If specify normal drive strength, bandgap must not be disabled. */ + if ((SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled) && + (option->SysLDODriveStrength == kSPC_SysLDO_NormalDriveStrength)) + { + return kStatus_SPC_BandgapModeWrong; + } + + /* 3. Must disable system LDO high voltage detector before specifing overdrive voltage. */ + if ((option->SysLDOVoltage == kSPC_SysLDO_OverDriveVoltage) && + ((SPC_GetActiveModeVoltageDetectStatus(base) & SPC_ACTIVE_CFG_SYS_HVDE_MASK) != 0UL)) + { + return kStatus_SPC_SYSLDOOverDriveVoltageFail; + } + + (void)SPC_SetActiveModeSystemLDORegulatorDriveStrength(base, option->SysLDODriveStrength); + (void)SPC_SetActiveModeSystemLDORegulatorVoltageLevel(base, option->SysLDOVoltage); + + return kStatus_Success; +} + +/*! + * brief Set System LDO Regulator voltage level in Active mode. + * + * @note The system LDO regulator can only operate at the overdrive voltage level for a limited amount of time for the + * life of chip. + * + * param base SPC peripheral base address. + * param voltageLevel Specify the voltage level of System LDO Regulator in Active mode. + * + * retval #kStatus_Success Set System LDO Regulator voltage level in Active mode successfully. + * retval #kStatus_SPC_SYSLDOOverDriveVoltageFail Must disable system LDO high voltage detector before specifing + * overdrive voltage. + */ +status_t SPC_SetActiveModeSystemLDORegulatorVoltageLevel(SPC_Type *base, spc_sys_ldo_voltage_level_t voltageLevel) +{ + if (voltageLevel == kSPC_SysLDO_OverDriveVoltage) + { + /* Must disable system LDO high voltage detector before specifing overdrive voltage. */ + if ((SPC_GetActiveModeVoltageDetectStatus(base) & SPC_ACTIVE_CFG_SYS_HVDE_MASK) != 0UL) + { + return kStatus_SPC_SYSLDOOverDriveVoltageFail; + } + } + + base->ACTIVE_CFG = + (base->ACTIVE_CFG & ~SPC_ACTIVE_CFG_SYSLDO_VDD_LVL_MASK) | SPC_ACTIVE_CFG_SYSLDO_VDD_LVL(voltageLevel); + + return kStatus_Success; +} + +/*! + * brief Set System LDO Regulator Drive Strength in Active mode. + * + * param base SPC peripheral base address. + * param driveStrength Specify the drive strength of System LDO Regulator in Active mode. + * + * retval #kStatus_Success Set System LDO Regulator drive strength in Active mode successfully. + * retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Attempt to specify low drive strength is ignored due to any + voltage detect feature is enabled in active mode. + * retval #kStatus_SPC_BandgapModeWrong Bandgap mode in Active mode must be programmed to a value that enables + the bandgap if attempt to specify normal drive strength. + */ +status_t SPC_SetActiveModeSystemLDORegulatorDriveStrength(SPC_Type *base, spc_sys_ldo_drive_strength_t driveStrength) +{ + if (driveStrength == kSPC_SysLDO_LowDriveStrength) + { + /* If enabled any LVDs or HVDs, SPC will ignore the attempt to specify low drive strength. */ + if (SPC_GetActiveModeVoltageDetectStatus(base) != 0UL) + { + return kStatus_SPC_SYSLDOLowDriveStrengthIgnore; + } + } + + if (driveStrength == kSPC_SysLDO_NormalDriveStrength) + { + /* If specify normal drive strength, bandgap must not be disabled. */ + if (SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled) + { + return kStatus_SPC_BandgapModeWrong; + } + } + + base->ACTIVE_CFG = + (base->ACTIVE_CFG & ~SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK) | SPC_ACTIVE_CFG_SYSLDO_VDD_DS(driveStrength); + + return kStatus_Success; +} + +/*! + * brief Configs System LDO regulator in low power modes. + * + * This function configs System LDO regulator in low power modes. + * If System LDO VDD Regulator Drive strength is set to normal, bandgap mode in low power + * mode must be programmed to a value that enables the Bandgap. + * If any High voltage detectors or Low Voltage detectors are kept enabled, configuration + * to set System LDO Regulator drive strength as Low will be ignored. + * + * param base SPC peripheral base address. + * param option Pointer to spc_lowpower_mode_Sys_LDO_option_t structure. + * + * retval kStatus_Success Config System LDO regulator in Low Power Mode successfully. + * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * retval kStatus_SPC_BandgapModeWrong The bandgap mode setting in Low Power Mode is wrong. + * retval kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to low will be ignored. + */ +status_t SPC_SetLowPowerModeSystemLDORegulatorConfig(SPC_Type *base, const spc_lowpower_mode_sys_ldo_option_t *option) +{ + status_t status; + + if ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + /* + * $Line Coverage Justification$ + * $ref spc_c_ref_1$. + */ + return kStatus_SPC_Busy; + } + + status = SPC_SetLowPowerModeSystemLDORegulatorDriveStrength(base, option->SysLDODriveStrength); + + return status; +} + +/*! + * brief Set System LDO Regulator drive strength in Low Power Mode. + * + * param base SPC peripheral base address. + * param driveStrength Specify the drive strength of System LDO Regulator in Low Power Mode. + * + * retval #kStatus_Success Set System LDO Regulator drive strength in Low Power Mode successfully. + * retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Attempt to specify low drive strength is ignored due to any + voltage detect feature is enabled in low power mode. + * retval #kStatus_SPC_BandgapModeWrong Bandgap mode in low power mode must be programmed to a value that enables + the bandgap if attempt to specify normal drive strength. + */ +status_t SPC_SetLowPowerModeSystemLDORegulatorDriveStrength(SPC_Type *base, spc_sys_ldo_drive_strength_t driveStrength) +{ + if (driveStrength == kSPC_SysLDO_LowDriveStrength) + { + /* If enabled any LVDs or HVDs, SPC will ignore the attempt to specify low drive strength. */ + if (SPC_GetLowPowerModeVoltageDetectStatus(base) != 0UL) + { + return kStatus_SPC_SYSLDOLowDriveStrengthIgnore; + } + } + else + { + /* If specify normal drive strength, bandgap must not be disabled. */ + if (SPC_GetLowPowerModeBandgapMode(base) == kSPC_BandgapDisabled) + { + return kStatus_SPC_BandgapModeWrong; + } + } + + base->LP_CFG = (base->LP_CFG & ~SPC_LP_CFG_SYSLDO_VDD_DS_MASK) | SPC_LP_CFG_SYSLDO_VDD_DS(driveStrength); + + return kStatus_Success; +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) +/*! + * brief Configs DCDC VDD Regulator in Active mode. + * + * note When changing the DCDC output voltage level, take care to change the CORE LDO voltage level. + * + * param base SPC peripheral base address. + * param option Pointer to the spc_active_mode_DCDC_option_t structure. + * + * retval kStatus_Success Config DCDC regulator in Active power mode successful. + * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * retval kStatus_SPC_BandgapModeWrong The bandgap mode setting in Active mode is wrong. + */ +status_t SPC_SetActiveModeDCDCRegulatorConfig(SPC_Type *base, const spc_active_mode_dcdc_option_t *option) +{ + assert(option != NULL); + status_t status = kStatus_Success; + + if ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + /* + * $Line Coverage Justification$ + * $ref spc_c_ref_1$. + */ + return kStatus_SPC_Busy; + } + + status = SPC_SetActiveModeDCDCRegulatorDriveStrength(base, option->DCDCDriveStrength); + + if (status == kStatus_Success) + { + SPC_SetActiveModeDCDCRegulatorVoltageLevel(base, option->DCDCVoltage); + } + + /* + * $Branch Coverage Justification$ + * $ref spc_c_ref_1$. + */ + while ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + } + + return status; +} + +/*! + * brief Set DCDC VDD Regulator drive strength in Active mode. + * + * note To set DCDC drive strength as Normal, the bandgap must be enabled. + * + * param base SPC peripheral base address. + * param driveStrength Specify the DCDC VDD regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t. + * + * retval #kStatus_Success Set DCDC VDD Regulator drive strength in Active mode successfully. + * retval #kStatus_SPC_BandgapModeWrong Set DCDC VDD Regulator drive strength to Normal, the Bandgap must be enabled. + */ +status_t SPC_SetActiveModeDCDCRegulatorDriveStrength(SPC_Type *base, spc_dcdc_drive_strength_t driveStrength) +{ + if (driveStrength == kSPC_DCDC_NormalDriveStrength) + { + /* If specify normal drive strength, bandgap must not be disabled. */ + if (SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled) + { + return kStatus_SPC_BandgapModeWrong; + } + } + + base->ACTIVE_CFG = + ((base->ACTIVE_CFG) & (~SPC_ACTIVE_CFG_DCDC_VDD_DS_MASK)) | SPC_ACTIVE_CFG_DCDC_VDD_DS(driveStrength); + + return kStatus_Success; +} + +/*! + * brief Configs DCDC VDD Regulator in Low power modes. + * + * If DCDC VDD Drive Strength is set to Normal, the Bandgap mode in Low Power mode must be programmed + * to a value that enables the Bandgap. + * In Deep Power Down mode, DCDC regulator is always turned off. + * + * param base SPC peripheral base address. + * param option Pointer to the spc_lowpower_mode_DCDC_option_t structure. + * + * retval kStatus_Success Config DCDC regulator in low power mode successfully. + * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * retval kStatus_SPC_BandgapModeWrong The bandgap should be enabled before invoking this function. + */ +status_t SPC_SetLowPowerModeDCDCRegulatorConfig(SPC_Type *base, const spc_lowpower_mode_dcdc_option_t *option) +{ + if ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + /* + * $Line Coverage Justification$ + * $ref spc_c_ref_1$. + */ + return kStatus_SPC_Busy; + } + + /* Check input parameter before setting registers. */ + if ((option->DCDCDriveStrength == kSPC_DCDC_NormalDriveStrength) && + (SPC_GetLowPowerModeBandgapMode(base) == kSPC_BandgapDisabled)) + { + return kStatus_SPC_BandgapModeWrong; + } + + /* + 1. Configure to desired voltage level. + 2. Change to low drive strength. + 3. Configure same voltage level in active mode. + */ + SPC_SetLowPowerModeDCDCRegulatorVoltageLevel(base, option->DCDCVoltage); + + /* Change to desired drive strength. */ + if (option->DCDCDriveStrength != kSPC_DCDC_LowDriveStrength) + { + (void)SPC_SetLowPowerModeDCDCRegulatorDriveStrength(base, option->DCDCDriveStrength); + } + + /* + * $Branch Coverage Justification$ + * $ref spc_c_ref_1$. + */ + while ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + } + + return kStatus_Success; +} + +/*! + * brief Set DCDC VDD Regulator drive strength in Low power mode. + * + * param base SPC peripheral base address. + * param driveStrength Specify the DCDC VDD Regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t. + * + * retval #kStatus_Success Set DCDC VDD Regulator drive strength in Low power mode successfully. + * retval #kStatus_SPC_BandgapModeWrong Set DCDC VDD Regulator drive strength to Normal, the Bandgap must be enabled. + */ +status_t SPC_SetLowPowerModeDCDCRegulatorDriveStrength(SPC_Type *base, spc_dcdc_drive_strength_t driveStrength) +{ + if (driveStrength == kSPC_DCDC_NormalDriveStrength) + { + /* If specify normal drive strength, bandgap must not be disabled. */ + if (SPC_GetLowPowerModeBandgapMode(base) == kSPC_BandgapDisabled) + { + return kStatus_SPC_BandgapModeWrong; + } + } + + base->LP_CFG = ((base->LP_CFG) & (~SPC_LP_CFG_DCDC_VDD_DS_MASK)) | SPC_LP_CFG_DCDC_VDD_DS(driveStrength); + + return kStatus_Success; +} + +/*! + * brief Config DCDC Burst options + * + * param base SPC peripheral base address. + * param config Pointer to spc_DCDC_burst_config_t structure. + */ +void SPC_SetDCDCBurstConfig(SPC_Type *base, spc_dcdc_burst_config_t *config) +{ + assert(config != NULL); + uint32_t reg; + reg = base->DCDC_CFG; + reg &= ~(SPC_DCDC_CFG_FREQ_CNTRL_MASK | SPC_DCDC_CFG_FREQ_CNTRL_ON_MASK); + reg |= SPC_DCDC_CFG_FREQ_CNTRL(config->freq); + reg |= config->stabilizeBurstFreq ? SPC_DCDC_CFG_FREQ_CNTRL_ON(1U) : SPC_DCDC_CFG_FREQ_CNTRL_ON(0U); + base->DCDC_CFG = reg; + + /* Blocking until previous DCDC burst completed. */ + while ((base->DCDC_BURST_CFG & SPC_DCDC_BURST_CFG_BURST_ACK_MASK) == 0UL) + { + } + + if ((config->sofwareBurstRequest) || (config->externalBurstRequest)) + { + /* Clear DCDC burst acknowledge flag. */ + base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_BURST_ACK_MASK; + } + base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_EXT_BURST_EN(config->externalBurstRequest); + + if (config->sofwareBurstRequest) + { + base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_BURST_REQ_MASK; + } +} + +/*! + * brief Set the count value of the reference clock. + * + * This function set the count value of the reference clock to control the frequency + * of dcdc refresh when dcdc is configured in Pulse Refresh mode. + * + * param base SPC peripheral base address. + * param count The count value, 16 bit width. + */ +void SPC_SetDCDCRefreshCount(SPC_Type *base, uint16_t count) +{ + uint32_t reg; + + reg = base->DCDC_BURST_CFG; + reg &= ~SPC_DCDC_BURST_CFG_PULSE_REFRESH_CNT_MASK; + reg |= SPC_DCDC_BURST_CFG_PULSE_REFRESH_CNT(count); + + base->DCDC_BURST_CFG = reg; +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +/*! + * brief Configs all settings of regulators in Active mode at a time. + * + * @note This function is used to overwrite all settings of regulators(including bandgap mode, regulators' + * drive strength and voltage level) in active mode at a time. + * + * @note Enable/disable LVDs/HVDs before invoking this function. + * + * @note This function will check input parameters based on hardware restrictions before setting registers, if input + * parameters do not satisfy hardware restrictions the specific error will be reported. + * + * + * @note Some hardware restrictions not covered, application should be aware of this and follow this hardware + * restrictions otherwise some unkown issue may occur: + * 1. If Core LDO's drive strength are set to same value in both Active mode and low power mode, + * the voltage level should also set to same value. + * 2. When switching Core LDO's drive strength from low to normal, ensure the LDO_CORE high voltage level is set + * to same level that was set prior to switching to the LDO_CORE drive strength. Otherwise, if the LVDs are + * enabled, an unexpected LVD can occur. + * + * @note If this function can not satisfy some tricky settings, please invoke other low-level functions. + * + * param base SPC peripheral base address. + * param config Pointer to spc_active_mode_regulators_config_t structure. + * retval kStatus_Success Config regulators in Active power mode successful. + * retval kStatus_SPC_BandgapModeWrong The bandgap mode setting in Active mode is wrong. + * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * retval kStatus_SPC_CORELDOVoltageWrong The selected voltage level in active mode is not allowed. + * retval kStatus_SPC_SYSLDOOverDriveVoltageFail Fail to regulator to Over Drive Voltage. + * retval kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to Low will be ignored. + * retval kStatus_SPC_DCDCLowDriveStrengthIgnore Set driver strength to Low will be ignored. + */ +status_t SPC_SetActiveModeRegulatorsConfig(SPC_Type *base, const spc_active_mode_regulators_config_t *config) +{ + assert(config != NULL); + + uint32_t activeModeVDValue = SPC_GetActiveModeVoltageDetectStatus(base); + + /* Check input parameters */ + /* 1. Bandgap should not be disabled if any of regulator in normal drive strength or + if any of LVDs/HVDs are enabled or if VDD CORE glitch detect are enabled. */ + if ((config->bandgapMode == kSPC_BandgapDisabled) && + ((activeModeVDValue != 0UL) +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) + || (SPC_CheckActiveModeVddCoreGlitchDetectEnabled(base) == true) +#endif /* FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + || (config->DCDCOption.DCDCDriveStrength == kSPC_DCDC_NormalDriveStrength) +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + || (config->SysLDOOption.SysLDODriveStrength == kSPC_SysLDO_NormalDriveStrength) +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ +#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) + || (config->CoreLDOOption.CoreLDODriveStrength == kSPC_CoreLDO_NormalDriveStrength) +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + )) + { + return kStatus_SPC_BandgapModeWrong; + } + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + /* 2. Must disable system LDO high voltage detector before specifing SysLDO to overdrive voltage */ + if (((activeModeVDValue & SPC_ACTIVE_CFG_SYS_HVDE_MASK) != 0UL) && + (config->SysLDOOption.SysLDOVoltage == kSPC_SysLDO_OverDriveVoltage)) + { + return kStatus_SPC_SYSLDOOverDriveVoltageFail; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + /* 3. To set System LDO's drive strength to low, all LVDs and HVDs must be disabled. */ + if ((activeModeVDValue != 0UL) && (config->SysLDOOption.SysLDODriveStrength == kSPC_SysLDO_LowDriveStrength)) + { + return kStatus_SPC_SYSLDOLowDriveStrengthIgnore; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) + /* 4. To set Core LDO's drive strength to low, all LVDs and HVDs must be disabled. */ + if ((activeModeVDValue != 0UL) && (config->CoreLDOOption.CoreLDODriveStrength == kSPC_CoreLDO_LowDriveStrength)) + { + return kStatus_SPC_CORELDOLowDriveStrengthIgnore; + } +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + /* 5. Core LDO and DCDC should have same voltage level. */ + if ((uint8_t)config->DCDCOption.DCDCVoltage != (uint8_t)config->CoreLDOOption.CoreLDOVoltage) + { + return kStatus_SPC_CORELDOVoltageWrong; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + + if ((base->SC & SPC_SC_BUSY_MASK) != 0UL) + { + return kStatus_SPC_Busy; + } + + base->ACTIVE_CFG = + ((base->ACTIVE_CFG) & ~(SPC_ACTIVE_CFG_BGMODE_MASK)) | SPC_ACTIVE_CFG_BGMODE(config->bandgapMode); +#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) + SPC_EnableActiveModeCMPBandgapBuffer(base, config->lpBuff); +#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + (void)SPC_SetActiveModeSystemLDORegulatorConfig(base, &config->SysLDOOption); +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + (void)SPC_SetActiveModeDCDCRegulatorConfig(base, &config->DCDCOption); +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + + (void)SPC_SetActiveModeCoreLDORegulatorConfig(base, &config->CoreLDOOption); + + return kStatus_Success; +} + +/*! + * brief Configs regulators in Low Power mode. + * + * This function provides the method to config all on-chip regulators in Low Power mode. + * + * param base SPC peripheral base address. + * param config Pointer to spc_lowpower_mode_regulators_config_t structure. + * retval #kStatus_Success Config regulators in Low power mode successful. + * retval #kStatus_SPC_BandgapModeWrong The bandgap should not be disabled based on input settings. + * retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Set driver strength to low will be ignored. + * retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to low will be ignored. + * retval #kStatus_SPC_CORELDOVoltageWrong Core LDO and System LDO do not have same voltage level. + */ +status_t SPC_SetLowPowerModeRegulatorsConfig(SPC_Type *base, const spc_lowpower_mode_regulators_config_t *config) +{ + assert(config != NULL); + uint32_t lpModeVDValue = SPC_GetLowPowerModeVoltageDetectStatus(base); + + /* Check input parameters */ + /* 1. Bandgap should not be disabled if any of regulator in normal drive strength or + if any of LVDs/HVDs are enabled or if VDD CORE glitch detect are enabled. */ + if ((config->bandgapMode == kSPC_BandgapDisabled) && + ((lpModeVDValue != 0UL) +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) + || (SPC_CheckLowPowerModeVddCoreGlitchDetectEnabled(base) == true) +#endif /* FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + || (config->DCDCOption.DCDCDriveStrength == kSPC_DCDC_NormalDriveStrength) +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + || (config->SysLDOOption.SysLDODriveStrength == kSPC_SysLDO_NormalDriveStrength) +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ +#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) + || (config->CoreLDOOption.CoreLDODriveStrength == kSPC_CoreLDO_NormalDriveStrength) +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + )) + { + return kStatus_SPC_BandgapModeWrong; + } + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + /* 2. To set System LDO's drive strength to low, all LVDs and HVDs must be disabled. */ + if ((lpModeVDValue != 0UL) && (config->SysLDOOption.SysLDODriveStrength == kSPC_SysLDO_LowDriveStrength)) + { + return kStatus_SPC_SYSLDOLowDriveStrengthIgnore; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) + /* 3. To set Core LDO's drive strength to low, all LVDs and HVDs must be disabled. */ + if ((lpModeVDValue != 0UL) && (config->CoreLDOOption.CoreLDODriveStrength == kSPC_CoreLDO_LowDriveStrength)) + { + return kStatus_SPC_CORELDOLowDriveStrengthIgnore; + } +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + /* 5. Core LDO and DCDC should have same voltage level. */ + if ((uint8_t)config->DCDCOption.DCDCVoltage != (uint8_t)config->CoreLDOOption.CoreLDOVoltage) + { + return kStatus_SPC_CORELDOVoltageWrong; + } +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + base->LP_CFG = ((base->LP_CFG) & ~(SPC_LP_CFG_BGMODE_MASK)) | SPC_LP_CFG_BGMODE(config->bandgapMode); +#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) + SPC_EnableLowPowerModeCMPBandgapBuffer(base, config->lpBuff); +#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) + SPC_EnableLowPowerModeCoreVDDInternalVoltageScaling(base, config->CoreIVS); +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT */ + SPC_EnableLowPowerModeLowPowerIREF(base, config->lpIREF); + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + (void)SPC_SetLowPowerModeSystemLDORegulatorConfig(base, &config->SysLDOOption); +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + (void)SPC_SetLowPowerModeDCDCRegulatorConfig(base, &config->DCDCOption); +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + + (void)SPC_SetLowPowerModeCoreLDORegulatorConfig(base, &config->CoreLDOOption); + + return kStatus_Success; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_spc.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_spc.h new file mode 100644 index 00000000000..52cb71c24db --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_spc.h @@ -0,0 +1,2433 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_SPC_H_ +#define FSL_SPC_H_ +#include "fsl_common.h" + +/*! + * @addtogroup mcx_spc + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief SPC driver version 2.4.2. */ +#define FSL_SPC_DRIVER_VERSION (MAKE_VERSION(2, 4, 2)) +/*! @} */ + +#define SPC_EVD_CFG_REG_EVDISO_SHIFT 0UL +#define SPC_EVD_CFG_REG_EVDLPISO_SHIFT 8UL +#define SPC_EVD_CFG_REG_EVDSTAT_SHIFT 16UL + +#define SPC_EVD_CFG_REG_EVDISO(x) ((uint32_t)(x) << SPC_EVD_CFG_REG_EVDISO_SHIFT) +#define SPC_EVD_CFG_REG_EVDLPISO(x) ((uint32_t)(x) << SPC_EVD_CFG_REG_EVDLPISO_SHIFT) +#define SPC_EVD_CFG_REG_EVDSTAT(x) ((uint32_t)(x) << SPC_EVD_CFG_REG_EVDSTAT_SHIFT) + +#if (defined(SPC_GLITCH_DETECT_SC_CNT_SELECT_MASK)) +#define VDD_CORE_GLITCH_DETECT_SC GLITCH_DETECT_SC +#define SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG_MASK SPC_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG_MASK +#define SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG SPC_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG +#define SPC_VDD_CORE_GLITCH_DETECT_SC_LOCK_MASK SPC_GLITCH_DETECT_SC_LOCK_MASK +#define SPC_VDD_CORE_GLITCH_DETECT_SC_CNT_SELECT_MASK SPC_GLITCH_DETECT_SC_CNT_SELECT_MASK +#define SPC_VDD_CORE_GLITCH_DETECT_SC_CNT_SELECT SPC_GLITCH_DETECT_SC_CNT_SELECT +#define SPC_VDD_CORE_GLITCH_DETECT_SC_RE_MASK SPC_GLITCH_DETECT_SC_RE_MASK +#define SPC_VDD_CORE_GLITCH_DETECT_SC_RE SPC_GLITCH_DETECT_SC_RE +#define SPC_VDD_CORE_GLITCH_DETECT_SC_TIMEOUT_MASK SPC_GLITCH_DETECT_SC_TIMEOUT_MASK +#define SPC_VDD_CORE_GLITCH_DETECT_SC_TIMEOUT SPC_GLITCH_DETECT_SC_TIMEOUT +#define SPC_VDD_CORE_GLITCH_DETECT_SC_IE_MASK SPC_GLITCH_DETECT_SC_IE_MASK +#define SPC_VDD_CORE_GLITCH_DETECT_SC_IE SPC_GLITCH_DETECT_SC_IE +#endif + +/*! + * @brief SPC status enumeration. + * + * @note Some device(such as MCXA family) do not equip DCDC or System LDO, please refer to the reference manual + * to check. + */ +enum +{ + kStatus_SPC_Busy = MAKE_STATUS(kStatusGroup_SPC, 0U), /*!< The SPC instance is busy executing any + type of power mode transition. */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + kStatus_SPC_DCDCLowDriveStrengthIgnore = MAKE_STATUS(kStatusGroup_SPC, 1U), /*!< DCDC Low drive strength setting be + ignored for LVD/HVD enabled. */ + kStatus_SPC_DCDCPulseRefreshModeIgnore = MAKE_STATUS(kStatusGroup_SPC, 2U), /*!< DCDC Pulse Refresh Mode drive + strength setting be ignored for LVD/HVD enabled. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + kStatus_SPC_SYSLDOOverDriveVoltageFail = MAKE_STATUS(kStatusGroup_SPC, 3U), /*!< SYS LDO regulate to Over drive + voltage failed for SYS LDO HVD must be disabled. */ + kStatus_SPC_SYSLDOLowDriveStrengthIgnore = MAKE_STATUS(kStatusGroup_SPC, 4U), /*!< SYS LDO Low driver strength + setting be ignored for LDO LVD/HVD enabled. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + kStatus_SPC_CORELDOLowDriveStrengthIgnore = MAKE_STATUS(kStatusGroup_SPC, 5U), /*!< CORE LDO Low driver strength + setting be ignored for LDO LVD/HVD enabled. */ + kStatus_SPC_CORELDOVoltageWrong = MAKE_STATUS(kStatusGroup_SPC, 7U), /*!< Core LDO voltage is wrong. */ + kStatus_SPC_CORELDOVoltageSetFail = MAKE_STATUS(kStatusGroup_SPC, 8U), /*!< Core LDO voltage set fail. */ + kStatus_SPC_BandgapModeWrong = MAKE_STATUS(kStatusGroup_SPC, 6U), /*!< Selected Bandgap Mode wrong. */ +}; + +/*! + * @brief Voltage Detect Status Flags. + */ +enum _spc_voltage_detect_flags +{ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) + kSPC_IOVDDHighVoltageDetectFlag = SPC_VD_STAT_IOVDD_HVDF_MASK, /*!< IO VDD High-Voltage detect flag. */ + kSPC_IOVDDLowVoltageDetectFlag = SPC_VD_STAT_IOVDD_LVDF_MASK, /*!< IO VDD Low-Voltage detect flag. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */ + kSPC_SystemVDDHighVoltageDetectFlag = SPC_VD_STAT_SYSVDD_HVDF_MASK, /*!< System VDD High-Voltage detect flag. */ + kSPC_SystemVDDLowVoltageDetectFlag = SPC_VD_STAT_SYSVDD_LVDF_MASK, /*!< System VDD Low-Voltage detect flag. */ +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) + kSPC_CoreVDDHighVoltageDetectFlag = SPC_VD_STAT_COREVDD_HVDF_MASK, /*!< Core VDD High-Voltage detect flag. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */ + kSPC_CoreVDDLowVoltageDetectFlag = SPC_VD_STAT_COREVDD_LVDF_MASK, /*!< Core VDD Low-Voltage detect flag. */ +}; + +/*! + * @brief SPC power domain isolation status. + * @note Some devices(such as MCXA family) do not contain WAKE Power Domain, please refer to the reference manual to + * check. + */ +enum _spc_power_domains +{ + kSPC_MAINPowerDomainRetain = 1UL << 16U, /*!< Peripherals and IO pads retain in MAIN Power Domain. */ + kSPC_WAKEPowerDomainRetain = 1UL << 17U, /*!< Peripherals and IO pads retain in WAKE Power Domain. */ +}; + +/*! + * @brief The enumeration of all analog module that can be controlled by SPC in active or low-power modes. + * @anchor spc_analog_module_control + */ +enum _spc_analog_module_control +{ + kSPC_controlVref = 1UL << 0UL, /*!< Enable/disable VREF in active or low-power modes. */ + kSPC_controlUsb3vDet = 1UL << 1UL, /*!< Enable/disable USB3V_Det in active or low-power modes. */ + kSPC_controlDac0 = 1UL << 4UL, /*!< Enable/disable DAC0 in active or low-power modes. */ + kSPC_controlDac1 = 1UL << 5UL, /*!< Enable/disable DAC1 in active or low-power modes. */ + kSPC_controlDac2 = 1UL << 6UL, /*!< Enable/disable DAC2 in active or low-power modes. */ + kSPC_controlOpamp0 = 1UL << 8UL, /*!< Enable/disable OPAMP0 in active or low-power modes. */ + kSPC_controlOpamp1 = 1UL << 9UL, /*!< Enable/disable OPAMP1 in active or low-power modes. */ + kSPC_controlOpamp2 = 1UL << 10UL, /*!< Enable/disable OPAMP2 in active or low-power modes. */ + kSPC_controlCmp0 = 1UL << 16UL, /*!< Enable/disable CMP0 in active or low-power modes. */ + kSPC_controlCmp1 = 1UL << 17UL, /*!< Enable/disable CMP1 in active or low-power modes. */ + kSPC_controlCmp2 = 1UL << 18UL, /*!< Enable/disable CMP2 in active or low-power modes. */ + kSPC_controlCmp0Dac = 1UL << 20UL, /*!< Enable/disable CMP0_DAC in active or low-power modes. */ + kSPC_controlCmp1Dac = 1UL << 21UL, /*!< Enable/disable CMP1_DAC in active or low-power modes. */ + kSPC_controlCmp2Dac = 1UL << 22UL, /*!< Enable/disable CMP2_DAC in active or low-power modes. */ + kSPC_controlAllModules = 0x770773UL, /*!< Enable/disable all modules in active or low-power modes. */ +}; + +/*! + * @brief The enumeration of spc power domain, the connected power domain is chip specfic, please refer to chip's RM + * for details. + */ +typedef enum _spc_power_domain_id +{ + kSPC_PowerDomain0 = 0U, /*!< Power domain0, the connected power domain is chip specific. */ + kSPC_PowerDomain1 = 1U, /*!< Power domain1, the connected power domain is chip specific. */ +} spc_power_domain_id_t; + +/*! + * @brief The enumeration of Power domain's low power mode. + */ +typedef enum _spc_power_domain_low_power_mode +{ + kSPC_SleepWithSYSClockRunning = 0U, /*!< Power domain request SLEEP mode with SYS clock running. */ + kSPC_DeepSleepWithSysClockOff = 1U, /*!< Power domain request deep sleep mode with system clock off. */ + kSPC_PowerDownWithSysClockOff = 2U, /*!< Power domain request power down mode with system clock off. */ + kSPC_DeepPowerDownWithSysClockOff = 4U, /*!< Power domain request deep power down mode with system clock off. */ +} spc_power_domain_low_power_mode_t; + +/*! + * @brief SPC low power request output pin polarity. + */ +typedef enum _spc_lowPower_request_pin_polarity +{ + kSPC_HighTruePolarity = 0x0U, /*!< Control the High Polarity of the Low Power Reqest Pin. */ + kSPC_LowTruePolarity = 0x1U, /*!< Control the Low Polarity of the Low Power Reqest Pin. */ +} spc_lowpower_request_pin_polarity_t; + +/*! + * @brief SPC low power request output override. + */ +typedef enum _spc_lowPower_request_output_override +{ + kSPC_LowPowerRequestNotForced = 0x0U, /*!< Not Forced. */ + kSPC_LowPowerRequestReserved = 0x1U, /*!< Reserved. */ + kSPC_LowPowerRequestForcedLow = 0x2U, /*!< Forced Low (Ignore LowPower request output polarity setting.) */ + kSPC_LowPowerRequestForcedHigh = 0x3U, /*!< Forced High (Ignore LowPower request output polarity setting.) */ +} spc_lowpower_request_output_override_t; + +/*! + * @brief SPC Bandgap mode enumeration in Active mode or Low Power mode. + */ +typedef enum _spc_bandgap_mode +{ + kSPC_BandgapDisabled = 0x0U, /*!< Bandgap disabled. */ + kSPC_BandgapEnabledBufferDisabled = 0x1U, /*!< Bandgap enabled with Buffer disabled. */ + kSPC_BandgapEnabledBufferEnabled = 0x2U, /*!< Bandgap enabled with Buffer enabled. */ + kSPC_BandgapReserved = 0x3U, /*!< Reserved. */ +} spc_bandgap_mode_t; + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) +/*! + * @brief DCDC regulator voltage level enumeration in Active mode or Low Power Mode. + * + * @note #kSPC_DCDC_RetentionVoltage not supported for all power modes. + */ +typedef enum _spc_dcdc_voltage_level +{ + kSPC_DCDC_RetentionVoltage = 0x0U, /*!< DCDC_CORE Regulator regulate to retention + Voltage(Only supportedin low power modes) */ + kSPC_DCDC_MidVoltage = 0x1U, /*!< DCDC_CORE Regulator regulate to Mid Voltage(1.0V). */ + kSPC_DCDC_NormalVoltage = 0x2U, /*!< DCDC_CORE Regulator regulate to Normal Voltage(1.1V). */ + kSPC_DCDC_OverdriveVoltage = 0x3U, /*!< DCDC_CORE Regulator regulate to Safe-Mode Voltage(1.2V). */ +} spc_dcdc_voltage_level_t; + +/*! + * @brief DCDC regulator Drive Strength enumeration in Active mode or Low Power Mode. + * + * @note Different drive strength differ in these DCDC characterstics: + * Maximum load current + * Quiescent current + * Transient response. + */ +typedef enum _spc_dcdc_drive_strength +{ + kSPC_DCDC_PulseRefreshMode = 0x0U, /*!< DCDC_CORE Regulator Drive Strength set to Pulse Refresh Mode, + * This enum member is only useful for Low Power Mode config, please + * note that pluse refresh mode is invalid in SLEEP mode. + */ + kSPC_DCDC_LowDriveStrength = 0x1U, /*!< DCDC_CORE regulator Drive Strength set to low. */ + kSPC_DCDC_NormalDriveStrength = 0x2U, /*!< DCDC_CORE regulator Drive Strength set to Normal. */ +} spc_dcdc_drive_strength_t; +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) +/*! + * @brief SYS LDO regulator voltage level enumeration in Active mode. + */ +typedef enum _spc_sys_ldo_voltage_level +{ + kSPC_SysLDO_NormalVoltage = 0x0U, /*!< SYS LDO VDD Regulator regulate to Normal Voltage(1.8V). */ + kSPC_SysLDO_OverDriveVoltage = 0x1U, /*!< SYS LDO VDD Regulator regulate to Over Drive Voltage(2.5V). */ +} spc_sys_ldo_voltage_level_t; + +/*! + * @brief SYS LDO regulator Drive Strength enumeration in Active mode or Low Power mode. + */ +typedef enum _spc_sys_ldo_drive_strength +{ + kSPC_SysLDO_LowDriveStrength = 0x0U, /*!< SYS LDO VDD regulator Drive Strength set to low. */ + kSPC_SysLDO_NormalDriveStrength = 0x1U, /*!< SYS LDO VDD regulator Drive Strength set to Normal. */ +} spc_sys_ldo_drive_strength_t; +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +/*! + * @brief Core LDO regulator voltage level enumeration in Active mode or Low Power mode. + */ +typedef enum _spc_core_ldo_voltage_level +{ + kSPC_CoreLDO_UnderDriveVoltage = 0x0U, /*!< @deprecated, to align with description of latest RM, please use + #kSPC_Core_LDO_RetentionVoltage as instead. */ + kSPC_Core_LDO_RetentionVoltage = 0x0U, /*!< Core LDO VDD regulator regulate to retention voltage, please note that + only useful in low power modes and not all devices support this options + please refer to devices' RM for details. */ + kSPC_CoreLDO_MidDriveVoltage = 0x1U, /*!< Core LDO VDD regulator regulate to Mid Drive Voltage. */ + kSPC_CoreLDO_NormalVoltage = 0x2U, /*!< Core LDO VDD regulator regulate to Normal Voltage. */ + kSPC_CoreLDO_OverDriveVoltage = 0x3U, /*!< Core LDO VDD regulator regulate to overdrive Voltage. */ +} spc_core_ldo_voltage_level_t; + +/*! + * @brief CORE LDO VDD regulator Drive Strength enumeration in Low Power mode. + */ +typedef enum _spc_core_ldo_drive_strength +{ + kSPC_CoreLDO_LowDriveStrength = 0x0U, /*!< Core LDO VDD regulator Drive Strength set to low. */ + kSPC_CoreLDO_NormalDriveStrength = 0x1U, /*!< Core LDO VDD regulator Drive Strength set to Normal. */ +} spc_core_ldo_drive_strength_t; + +/*! + * @brief IO VDD Low-Voltage Level Select. + */ +typedef enum _spc_low_voltage_level_select +{ + kSPC_LowVoltageNormalLevel = 0x0U, /*!< @deprecated, please use kSPC_LowVoltageHighRange as instead. */ + kSPC_LowVoltageSafeLevel = 0x1U, /*!< @deprecated, please use kSPC_LowVoltageLowRange as instead. */ + + kSPC_LowVoltageHighRange = 0x0U, /*!< High range LVD threshold. */ + kSPC_LowVoltageLowRange = 0x1U, /*!< Low range LVD threshold. */ +} spc_low_voltage_level_select_t; + +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) +/*! + * @brief Used to select output of 4-bit ripple counter is used to monitor a glitch on VDD core. + */ +typedef enum _spc_vdd_core_glitch_ripple_counter_select +{ + kSPC_selectBit0Of4bitRippleCounter = 0x0U, /*!< Select bit-0 of 4-bit Ripple Counter + to detect glitch on VDD Core. */ + kSPC_selectBit1Of4bitRippleCounter = 0x1U, /*!< Select bit-1 of 4-bit Ripple Counter + to detect glitch on VDD Core. */ + kSPC_selectBit2Of4bitRippleCounter = 0x2U, /*!< Select bit-2 of 4-bit Ripple Counter + to detect glitch on VDD Core. */ + kSPC_selectBit3Of4bitRippleCounter = 0x3U, /*!< Select bit-3 of 4-bit Ripple Counter + to detect glitch on VDD Core. */ +} spc_vdd_core_glitch_ripple_counter_select_t; +#endif + +/*! + * @brief The list of the operating voltage for the SRAM's read/write timing margin. + */ +typedef enum _spc_sram_operate_voltage +{ + kSPC_sramOperateAt1P0V = 0x1U, /*!< SRAM configured for 1.0V operation. */ + kSPC_sramOperateAt1P1V = 0x2U, /*!< SRAM configured for 1.1V operation. */ + kSPC_sramOperateAt1P2V = 0x3U, /*!< SRAM configured for 1.2V operation. */ +} spc_sram_operate_voltage_t; + +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) +/*! + * @brief The configuration of VDD Core glitch detector. + */ +typedef struct _spc_vdd_core_glitch_detector_config +{ + spc_vdd_core_glitch_ripple_counter_select_t rippleCounterSelect; /*!< Used to set ripple counter. */ + uint8_t resetTimeoutValue; /*!< The timeout value used to reset glitch detect/compare logic after an initial + glitch is detected. */ + bool enableReset; /*!< Used to enable/disable POR/LVD reset that caused by CORE VDD glitch detect error. */ + bool enableInterrupt; /*!< Used to enable/disable hardware interrupt if CORE VDD glitch detect error. */ +} spc_vdd_core_glitch_detector_config_t; +#endif + +typedef struct _spc_sram_voltage_config +{ + spc_sram_operate_voltage_t operateVoltage; /*!< Specifies the operating voltage for the SRAM's + read/write timing margin. */ + bool requestVoltageUpdate; /*!< Used to control whether request an SRAM trim value change. */ +} spc_sram_voltage_config_t; + +/*! + * @brief Low Power Request output pin configuration. + */ +typedef struct _spc_lowpower_request_config +{ + bool enable; /*!< Low Power Request Output enable. */ + spc_lowpower_request_pin_polarity_t polarity; /*!< Low Power Request Output pin polarity select. */ + spc_lowpower_request_output_override_t override; /*!< Low Power Request Output Override. */ +} spc_lowpower_request_config_t; + +/*! + * @brief Core LDO regulator options in Active mode. + */ +typedef struct _spc_active_mode_core_ldo_option +{ + spc_core_ldo_voltage_level_t CoreLDOVoltage; /*!< Core LDO Regulator Voltage Level selection in Active mode. */ +#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS + spc_core_ldo_drive_strength_t CoreLDODriveStrength; /*!< Core LDO Regulator Drive Strength + selection in Active mode */ +#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ +} spc_active_mode_core_ldo_option_t; + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) +/*! + * @brief System LDO regulator options in Active mode. + */ +typedef struct _spc_active_mode_sys_ldo_option +{ + spc_sys_ldo_voltage_level_t SysLDOVoltage; /*!< System LDO Regulator Voltage Level selection in Active mode. */ + spc_sys_ldo_drive_strength_t SysLDODriveStrength; /*!< System LDO Regulator Drive Strength + selection in Active mode. */ +} spc_active_mode_sys_ldo_option_t; +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) +/*! + * @brief DCDC regulator options in Active mode. + */ +typedef struct _spc_active_mode_dcdc_option +{ + spc_dcdc_voltage_level_t DCDCVoltage; /*!< DCDC Regulator Voltage Level selection in Active mode. */ + spc_dcdc_drive_strength_t DCDCDriveStrength; /*!< DCDC_CORE Regulator Drive Strength selection in Active mode. */ +} spc_active_mode_dcdc_option_t; +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +/*! + * @brief Core LDO regulator options in Low Power mode. + */ +typedef struct _spc_lowpower_mode_core_ldo_option +{ + spc_core_ldo_voltage_level_t CoreLDOVoltage; /*!< Core LDO Regulator Voltage Level selection in Low Power mode. */ + spc_core_ldo_drive_strength_t CoreLDODriveStrength; /*!< Core LDO Regulator Drive Strength + selection in Low Power mode */ +} spc_lowpower_mode_core_ldo_option_t; + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) +/*! + * @brief System LDO regulator options in Low Power mode. + */ +typedef struct _spc_lowpower_mode_sys_ldo_option +{ + spc_sys_ldo_drive_strength_t SysLDODriveStrength; /*!< System LDO Regulator Drive Strength + selection in Low Power mode. */ +} spc_lowpower_mode_sys_ldo_option_t; +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) +/*! + * @brief DCDC regulator options in Low Power mode. + */ +typedef struct _spc_lowpower_mode_dcdc_option +{ + spc_dcdc_voltage_level_t DCDCVoltage; /*!< DCDC Regulator Voltage Level selection in Low Power mode. */ + spc_dcdc_drive_strength_t DCDCDriveStrength; /*!< DCDC_CORE Regulator Drive Strength selection in Low Power mode. */ +} spc_lowpower_mode_dcdc_option_t; + +/*! + * @brief DCDC Burst configuration. + * @deprecated Do not recommend to use this structure. + */ +typedef struct _spc_dcdc_burst_config +{ + bool sofwareBurstRequest; /*!< Enable/Disable DCDC Software Burst Request. */ + bool externalBurstRequest; /*!< Enable/Disable DCDC External Burst Request. */ + bool stabilizeBurstFreq; /*!< Enable/Disable DCDC frequency stabilization. */ + uint8_t freq; /*!< The frequency of the current burst. */ +} spc_dcdc_burst_config_t; +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +/*! + * @brief CORE/SYS/IO VDD Voltage Detect options. + */ +typedef struct _spc_voltage_detect_option +{ + bool HVDInterruptEnable; /*!< CORE/SYS/IO VDD High Voltage Detect interrupt enable. */ + bool HVDResetEnable; /*!< CORE/SYS/IO VDD High Voltage Detect reset enable. */ + bool LVDInterruptEnable; /*!< CORE/SYS/IO VDD Low Voltage Detect interrupt enable. */ + bool LVDResetEnable; /*!< CORE/SYS/IO VDD Low Voltage Detect reset enable. */ +} spc_voltage_detect_option_t; + +/*! + * @brief Core Voltage Detect configuration. + */ +typedef struct _spc_core_voltage_detect_config +{ + spc_voltage_detect_option_t option; /*!< Core VDD Voltage Detect option. */ +} spc_core_voltage_detect_config_t; + +/*! + * @brief System Voltage Detect Configuration. + */ +typedef struct _spc_system_voltage_detect_config +{ + spc_voltage_detect_option_t option; /*!< System VDD Voltage Detect option. */ + spc_low_voltage_level_select_t level; /*!< @deprecated, reserved for all devices, will removed in next release. */ +} spc_system_voltage_detect_config_t; + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) +/*! + * @brief IO Voltage Detect Configuration. + */ +typedef struct _spc_io_voltage_detect_config +{ + spc_voltage_detect_option_t option; /*!< IO VDD Voltage Detect option. */ + spc_low_voltage_level_select_t level; /*!< IO VDD Low-voltage level selection. */ +} spc_io_voltage_detect_config_t; +#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */ + +/*! + * @brief Active mode configuration. + */ +typedef struct _spc_active_mode_regulators_config +{ + spc_bandgap_mode_t bandgapMode; /*!< Specify bandgap mode in active mode. */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) + bool lpBuff; /*!< Enable/disable CMP bandgap buffer. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + spc_active_mode_dcdc_option_t DCDCOption; /*!< Specify DCDC configurations in active mode. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + spc_active_mode_sys_ldo_option_t SysLDOOption; /*!< Specify System LDO configurations in active mode. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + + spc_active_mode_core_ldo_option_t CoreLDOOption; /*!< Specify Core LDO configurations in active mode. */ +} spc_active_mode_regulators_config_t; + +/*! + * @brief Low Power Mode configuration. + */ +typedef struct _spc_lowpower_mode_regulators_config +{ + bool lpIREF; /*!< Enable/disable low power IREF in low power modes. */ + spc_bandgap_mode_t bandgapMode; /*!< Specify bandgap mode in low power modes. */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) + bool lpBuff; /*!< Enable/disable CMP bandgap buffer in low power modes. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) + bool CoreIVS; /*!< Enable/disable CORE VDD internal voltage scaling. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) + spc_lowpower_mode_dcdc_option_t DCDCOption; /*!< Specify DCDC configurations in low power modes. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) + spc_lowpower_mode_sys_ldo_option_t SysLDOOption; /*!< Specify system LDO configurations in low power modes. */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + + spc_lowpower_mode_core_ldo_option_t CoreLDOOption; /*!< Specify core LDO configurations in low power modes. */ +} spc_lowpower_mode_regulators_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*! + * @name SPC Status + * @{ + */ +/*! + * @brief Gets Isolation status for each power domains. + * + * This function gets the status which indicates whether certain + * peripheral and the IO pads are in a latched state as a result + * of having been in POWERDOWN mode. + * + * @param base SPC peripheral base address. + * @return Current isolation status for each power domains. See @ref _spc_power_domains for details. + */ +uint8_t SPC_GetPeriphIOIsolationStatus(SPC_Type *base); + +/*! + * @brief Clears peripherals and I/O pads isolation flags for each power domains. + * + * This function clears peripherals and I/O pads isolation flags for each power domains. + * After recovering from the POWERDOWN mode, user must invoke this function to release the + * I/O pads and certain peripherals to their normal run mode state. Before invoking this + * function, user must restore chip configuration in particular pin configuration for enabled + * WUU wakeup pins. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_ClearPeriphIOIsolationFlag(SPC_Type *base) +{ + base->SC |= SPC_SC_ISO_CLR_MASK; +} + +/*! + * @brief Gets SPC busy status flag. + * + * This function gets SPC busy status flag. When SPC executing any type of power mode + * transition in ACTIVE mode or any of the SOC low power mode, the SPC busy status flag is set + * and this function returns true. When changing CORE LDO voltage level and DCDC voltage level + * in ACTIVE mode, the SPC busy status flag is set and this function return true. + * + * @param base SPC peripheral base address. + * @return Ack busy flag. + * true - SPC is busy. + * false - SPC is not busy. + */ +static inline bool SPC_GetBusyStatusFlag(SPC_Type *base) +{ + return ((base->SC & SPC_SC_BUSY_MASK) != 0UL); +} + +/*! + * @brief Checks system low power request. + * + * @note Only when all power domains request low power mode entry, the result of this function is true. That means when + * all power domains request low power mode entry, the SPC regulators will be controlled by LP_CFG register. + * + * @param base SPC peripheral base address. + * @return The system low power request check result. + * - \b true All power domains have requested low power mode and SPC has entered a low power state and power mode + * configuration are based on the LP_CFG configuration register. + * - \b false SPC in active mode and ACTIVE_CFG register control system power supply. + */ +static inline bool SPC_CheckLowPowerReqest(SPC_Type *base) +{ + return ((base->SC & SPC_SC_SPC_LP_REQ_MASK) == SPC_SC_SPC_LP_REQ_MASK); +} + +/*! + * @brief Clears system low power request, set SPC in active mode. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_ClearLowPowerRequest(SPC_Type *base) +{ + base->SC |= SPC_SC_SPC_LP_REQ_MASK; +} + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SWITCH_STATE_BIT) && FSL_FEATURE_MCX_SPC_HAS_SWITCH_STATE_BIT) +/*! + * @brief Checks whether the power switch is on. + * + * @param base SPC peripheral base address. + * + * @retval true The power switch is on. + * @retval false The power switch is off. + */ +static inline bool SPC_CheckSwitchState(SPC_Type *base) +{ + return ((base->SC & SPC_SC_SWITCH_STATE_MASK) != 0UL); +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_SWITCH_STATE_BIT */ + +/*! + * @brief Gets selected power domain's requested low power mode. + * + * @param base SPC peripheral base address. + * @param powerDomainId Power Domain Id, please refer to @ref spc_power_domain_id_t. + * + * @return The selected power domain's requested low power mode, please refer to @ref spc_power_domain_low_power_mode_t. + */ +spc_power_domain_low_power_mode_t SPC_GetPowerDomainLowPowerMode(SPC_Type *base, spc_power_domain_id_t powerDomainId); + +/*! + * @brief Checks power domain's low power request. + * + * @param base SPC peripheral base address. + * @param powerDomainId Power Domain Id, please refer to @ref spc_power_domain_id_t. + * @return The result of power domain's low power request. + * - \b true The selected power domain requests low power mode entry. + * - \b false The selected power domain does not request low power mode entry. + */ +static inline bool SPC_CheckPowerDomainLowPowerRequest(SPC_Type *base, spc_power_domain_id_t powerDomainId) +{ + assert((uint8_t)powerDomainId < SPC_PD_STATUS_COUNT); + return ((base->PD_STATUS[(uint8_t)powerDomainId] & SPC_PD_STATUS_PWR_REQ_STATUS_MASK) == + SPC_PD_STATUS_PWR_REQ_STATUS_MASK); +} + +/*! + * @brief Clears selected power domain's low power request flag. + * + * @param base SPC peripheral base address. + * @param powerDomainId Power Domain Id, please refer to @ref spc_power_domain_id_t. + */ +static inline void SPC_ClearPowerDomainLowPowerRequestFlag(SPC_Type *base, spc_power_domain_id_t powerDomainId) +{ + assert((uint8_t)powerDomainId < SPC_PD_STATUS_COUNT); + base->PD_STATUS[(uint8_t)powerDomainId] |= SPC_PD_STATUS_PD_LP_REQ_MASK; +} + +/*! @} */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SRAMRETLDO_REG) && FSL_FEATURE_MCX_SPC_HAS_SRAMRETLDO_REG) +/*! + * @name SRAM Retention LDO Control APIs + * @{ + */ + +/*! + * @brief Trims SRAM retention regulator reference voltage, trim step is 12 mV, range is around 0.48V to 0.85V. + * + * @param base SPC peripheral base address. + * @param trimValue Reference voltage trim value. + */ +static inline void SPC_TrimSRAMLdoRefVoltage(SPC_Type *base, uint8_t trimValue) +{ + base->SRAMRETLDO_REFTRIM = + ((base->SRAMRETLDO_REFTRIM & ~SPC_SRAMRETLDO_REFTRIM_REFTRIM_MASK) | SPC_SRAMRETLDO_REFTRIM_REFTRIM(trimValue)); +} + +/*! + * @brief Enables/disables SRAM retention LDO. + * + * @param base SPC peripheral base address. + * @param enable Used to enable/disable SRAM LDO : + * - \b true Enable SRAM LDO; + * - \b false Disable SRAM LDO. + */ +static inline void SPC_EnableSRAMLdo(SPC_Type *base, bool enable) +{ + if (enable) + { + base->SRAMRETLDO_CNTRL |= SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON_MASK; + } + else + { + base->SRAMRETLDO_CNTRL &= ~SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON_MASK; + } +} + +/*! + * @brief + * + * @todo Need to check. + * + * @param base SPC peripheral base address. + * @param mask The OR'ed value of SRAM Array. + */ +static inline void SPC_RetainSRAMArray(SPC_Type *base, uint8_t mask) +{ + base->SRAMRETLDO_CNTRL |= SPC_SRAMRETLDO_CNTRL_SRAM_RET_EN(mask); +} + +/*! @} */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_SRAMRETLDO_REG */ + +/*! + * @name Low Power Request configuration + * @{ + */ +/*! + * @brief Configs Low power request output pin. + * + * This function config the low power request output pin + * + * @param base SPC peripheral base address. + * @param config Pointer the @ref spc_lowpower_request_config_t structure. + */ +void SPC_SetLowPowerRequestConfig(SPC_Type *base, const spc_lowpower_request_config_t *config); + +/*! @} */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_CFG_REG) && FSL_FEATURE_MCX_SPC_HAS_CFG_REG) +/*! + * @name Integrated Power Switch Control APIs + * @{ + */ + +/*! + * @brief Enables/disables the integrated power switch manually. + * + * @param base SPC peripheral base address. + * @param enable Used to enable/disable the integrated power switch: + * - \b true Enable the integrated power switch; + * - \b false Disable the integrated power switch. + */ +static inline void SPC_EnableIntegratedPowerSwitchManually(SPC_Type *base, bool enable) +{ + if (enable) + { + base->CFG |= (SPC_CFG_INTG_PWSWTCH_SLEEP_ACTIVE_EN_MASK | SPC_CFG_INTG_PWSWTCH_WKUP_ACTIVE_EN_MASK); + } + else + { + base->CFG &= ~(SPC_CFG_INTG_PWSWTCH_SLEEP_ACTIVE_EN_MASK | SPC_CFG_INTG_PWSWTCH_WKUP_ACTIVE_EN_MASK); + } +} + +/*! + * @brief Enables/disables the integrated power switch automatically. + * + * To gate the integrated power switch when chip enter low power modes, and ungate the switch after wake-up from low + * power modes: + * @code + * SPC_EnableIntegratedPowerSwitchAutomatically(SPC, true, true); + * @endcode + * + * @param base SPC peripheral base address. + * @param sleepGate Enable the integrated power switch when chip enter low power modes: + * - \b true SPC asserts an output pin at low-power entry to power-gate the switch; + * - \b false SPC does not assert an output pin at low-power entry to power-gate the switch. + * @param wakeupUngate Enables the switch after wake-up from low power modes: + * - \b true SPC asserts an output pin at low-power exit to power-ungate the switch; + * - \b false SPC does not assert an output pin at low-power exit to power-ungate the switch. + */ +static inline void SPC_EnableIntegratedPowerSwitchAutomatically(SPC_Type *base, bool sleepGate, bool wakeupUngate) +{ + uint32_t tmp32 = ((base->CFG) & ~(SPC_CFG_INTG_PWSWTCH_SLEEP_EN_MASK | SPC_CFG_INTG_PWSWTCH_WKUP_EN_MASK)); + + tmp32 |= SPC_CFG_INTG_PWSWTCH_SLEEP_EN(sleepGate) | SPC_CFG_INTG_PWSWTCH_WKUP_EN(wakeupUngate); + + base->CFG = tmp32; +} + +/*! @} */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_CFG_REG */ + +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) +/*! + * @name VDD Core Glitch Detector Control APIs + * @{ + */ + +/*! + * @brief Configures VDD Core Glitch detector, including ripple counter selection, timeout value and so on. + * + * @param base SPC peripheral base address. + * @param config Pointer to the structure in type of @ref spc_vdd_core_glitch_detector_config_t. + */ +void SPC_ConfigVddCoreGlitchDetector(SPC_Type *base, const spc_vdd_core_glitch_detector_config_t *config); + +/*! + * @brief Checks selected 4-bit glitch ripple counter's output. + * + * @param base SPC peripheral base address. + * @param rippleCounter The ripple counter to check, please refer to @ref spc_vdd_core_glitch_ripple_counter_select_t. + * + * @retval true The selected ripple counter output is 1, will generate interrupt or reset based on settings. + * @retval false The selected ripple counter output is 0. + */ + +static inline bool SPC_CheckGlitchRippleCounterOutput(SPC_Type *base, + spc_vdd_core_glitch_ripple_counter_select_t rippleCounter) +{ + return ((base->VDD_CORE_GLITCH_DETECT_SC & SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG_MASK) == + SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG(1UL << (uint32_t)(rippleCounter))); +} + +/*! + * @brief Clears output of selected glitch ripple counter. + * + * @param base SPC peripheral base address. + * @param rippleCounter The ripple counter to check, please refer to @ref spc_vdd_core_glitch_ripple_counter_select_t. + */ +static inline void SPC_ClearGlitchRippleCounterOutput(SPC_Type *base, + spc_vdd_core_glitch_ripple_counter_select_t rippleCounter) +{ + base->VDD_CORE_GLITCH_DETECT_SC |= + SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG(1UL << (uint32_t)(rippleCounter)); +} + +/*! + * @brief After invoking this function, writes to SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register are ignored. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_LockVddCoreVoltageGlitchDetectResetControl(SPC_Type *base) +{ + base->VDD_CORE_GLITCH_DETECT_SC |= SPC_VDD_CORE_GLITCH_DETECT_SC_LOCK_MASK; +} + +/*! + * @brief After invoking this function, writes to SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register are allowed. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_UnlockVddCoreVoltageGlitchDetectResetControl(SPC_Type *base) +{ + base->VDD_CORE_GLITCH_DETECT_SC &= ~SPC_VDD_CORE_GLITCH_DETECT_SC_LOCK_MASK; +} + +/*! + * @brief Checks if SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register is writable. + * + * @param base SPC peripheral base address. + * + * @retval true SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register is writable. + * @retval false SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register is not writable. + */ +static inline bool SPC_CheckVddCoreVoltageGlitchResetControlState(SPC_Type *base) +{ + return ((base->VDD_CORE_GLITCH_DETECT_SC & SPC_VDD_CORE_GLITCH_DETECT_SC_LOCK_MASK) != 0UL); +} + +/*! @} */ +#endif + +/*! + * @name SRAM Control APIs + * @{ + */ + +/*! + * @brief Set SRAM operate voltage. + * + * @param base SPC peripheral base address. + * @param config The pointer to @ref spc_sram_voltage_config_t, specifies the configuration of sram voltage. + */ +void SPC_SetSRAMOperateVoltage(SPC_Type *base, const spc_sram_voltage_config_t *config); + +/*! @} */ + +/*! + * @name Active Mode configuration + * @{ + */ + +/*! + * @brief Gets the Bandgap mode in Active mode. + * + * @param base SPC peripheral base address. + * @return Bandgap mode in the type of @ref spc_bandgap_mode_t enumeration. + */ +static inline spc_bandgap_mode_t SPC_GetActiveModeBandgapMode(SPC_Type *base) +{ + return (spc_bandgap_mode_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_BGMODE_MASK) >> + SPC_ACTIVE_CFG_BGMODE_SHIFT); +} + +/*! + * @brief Gets all voltage detectors status in Active mode. + * + * @param base SPC peripheral base address. + * @return All voltage detectors status in Active mode. + */ +static inline uint32_t SPC_GetActiveModeVoltageDetectStatus(SPC_Type *base) +{ + uint32_t state; + state = base->ACTIVE_CFG & + ( +#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) + SPC_ACTIVE_CFG_IO_HVDE_MASK | SPC_ACTIVE_CFG_IO_LVDE_MASK | + +#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */ + SPC_ACTIVE_CFG_SYS_HVDE_MASK | SPC_ACTIVE_CFG_SYS_LVDE_MASK | SPC_ACTIVE_CFG_CORE_LVDE_MASK + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) + | SPC_ACTIVE_CFG_CORE_HVDE_MASK + +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */ + ); + return state; +} + +/*! + * @brief Configs Bandgap mode in Active mode. + * + * @note To disable bandgap in Active mode: + * 1. Disable all LVD's and HVD's in active mode; + * 2. Disable Glitch detect; + * 3. Configrue LDO's and DCDC to low drive strength in active mode; + * 4. Invoke this function to disable bandgap in active mode; + * otherwise the error status will be reported. + * + * @note Some other system resources(such as PLL, CMP) require bandgap to be enabled, to disable bandgap please + * take care of other system resources. + * + * @param base SPC peripheral base address. + * @param mode The Bandgap mode be selected. + * + * @retval #kStatus_SPC_BandgapModeWrong The Bandgap can not be disabled in active mode. + * @retval #kStatus_Success Config Bandgap mode in Active power mode successful. + */ +status_t SPC_SetActiveModeBandgapModeConfig(SPC_Type *base, spc_bandgap_mode_t mode); + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) +/*! + * @brief Enables/Disable the CMP Bandgap Buffer in Active mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable CMP Bandgap buffer. + * true - Enable Buffer Stored Reference voltage to CMP. + * false - Disable Buffer Stored Reference voltage to CMP. + */ +static inline void SPC_EnableActiveModeCMPBandgapBuffer(SPC_Type *base, bool enable) +{ + if (enable) + { + base->ACTIVE_CFG |= SPC_ACTIVE_CFG_LPBUFF_EN_MASK; + } + else + { + base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_LPBUFF_EN_MASK; + } +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */ + +/*! + * @brief Sets the delay when the regulators change voltage level in Active mode. + * + * @param base SPC peripheral base address. + * @param delay The number of SPC timer clock cycles. + */ +static inline void SPC_SetActiveModeVoltageTrimDelay(SPC_Type *base, uint16_t delay) +{ + base->ACTIVE_VDELAY = SPC_ACTIVE_VDELAY_ACTIVE_VDELAY(delay); +} + +/*! + * @brief Configs all settings of regulators in Active mode at a time. + * + * @note This function is used to overwrite all settings of regulators(including bandgap mode, regulators' + * drive strength and voltage level) in active mode at a time. + * + * @note Enable/disable LVDs/HVDs before invoking this function. + * + * @note This function will check input parameters based on hardware restrictions before setting registers, if input + * parameters do not satisfy hardware restrictions the specific error will be reported. + * + * + * @note Some hardware restrictions not covered, application should be aware of this and follow this hardware + * restrictions otherwise some unkown issue may occur: + * 1. If Core LDO's drive strength are set to same value in both Active mode and low power mode, + * the voltage level should also set to same value. + * 2. When switching Core LDO's drive strength from low to normal, ensure the LDO_CORE high voltage level is set + * to same level that was set prior to switching to the LDO_CORE drive strength. Otherwise, if the LVDs are + * enabled, an unexpected LVD can occur. + * + * @note If this function can not satisfy some tricky settings, please invoke other APIs in low-level function group. + * + * @param base SPC peripheral base address. + * @param config Pointer to spc_active_mode_regulators_config_t structure. + * + * @retval #kStatus_Success Config regulators in Active power mode successful. + * @retval #kStatus_SPC_BandgapModeWrong Based on input setting, bandgap can not be disabled. + * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Any of LVDs/HVDs kept enabled before invoking this function. + * @retval #kStatus_SPC_SYSLDOOverDriveVoltageFail Fail to regulator to Over Drive Voltage due to + * System VDD HVD is not disabled. + * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Any of LVDs/HVDs kept enabled before invoking this function. + * @retval #kStatus_SPC_CORELDOVoltageWrong Core LDO and System LDO do not have same voltage level. + */ +status_t SPC_SetActiveModeRegulatorsConfig(SPC_Type *base, const spc_active_mode_regulators_config_t *config); + +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) +/*! + * @brief Disables/Enables VDD Core Glitch Detect in Active mode. + * + * @note State of glitch detect disable feature will be ignored if bandgap is disabled and + * glitch detect hardware will be forced to OFF state. + * + * @param base SPC peripheral base address. + * @param disable Used to disable/enable VDD Core Glitch detect feature. + * - \b true Disable VDD Core Low Voltage detect; + * - \b false Enable VDD Core Low Voltage detect. + */ +static inline void SPC_DisableActiveModeVddCoreGlitchDetect(SPC_Type *base, bool disable) +{ + if (disable) + { + base->ACTIVE_CFG |= SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK; + } + else + { + base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK; + } +} + +/*! + * @brief Check if Glitch detect hardware is enabled in active mode. + * + * @param base SPC peripheral base address. + * @return Indicate if Glitch detector is enabled. + */ +static inline bool SPC_CheckActiveModeVddCoreGlitchDetectEnabled(SPC_Type *base) +{ + if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK) == 0UL) + { + return true; + } + else + { + return false; + } +} + +#endif /* FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT */ + +/*! + * @brief Enables analog modules in active mode. + * + * @param base SPC peripheral base address. + * @param maskValue The mask of analog modules to enable in active mode, should be the OR'ed value + * of @ref spc_analog_module_control. + */ +static inline void SPC_EnableActiveModeAnalogModules(SPC_Type *base, uint32_t maskValue) +{ + base->ACTIVE_CFG1 |= SPC_ACTIVE_CFG1_SOC_CNTRL(maskValue); +} + +/*! + * @brief Disables analog modules in active mode. + * + * @param base SPC peripheral base address. + * @param maskValue The mask of analog modules to disable in active mode, should be the OR'ed value + * of @ref spc_analog_module_control. + */ +static inline void SPC_DisableActiveModeAnalogModules(SPC_Type *base, uint32_t maskValue) +{ + base->ACTIVE_CFG1 &= ~SPC_ACTIVE_CFG1_SOC_CNTRL(maskValue); +} + +/*! + * @brief Gets enabled analog modules that enabled in active mode. + * + * @param base SPC peripheral base address. + * + * @return The mask of enabled analog modules that enabled in active mode. + */ +static inline uint32_t SPC_GetActiveModeEnabledAnalogModules(SPC_Type *base) +{ + return base->ACTIVE_CFG1; +} + +/*! @} */ + +/*! + * @name Low Power mode configuration + * @{ + */ + +/*! + * @brief Gets the Bandgap mode in Low Power mode. + * + * @param base SPC peripheral base address. + * @return Bandgap mode in the type of @ref spc_bandgap_mode_t enumeration. + */ +static inline spc_bandgap_mode_t SPC_GetLowPowerModeBandgapMode(SPC_Type *base) +{ + return (spc_bandgap_mode_t)(uint32_t)((base->LP_CFG & SPC_LP_CFG_BGMODE_MASK) >> SPC_LP_CFG_BGMODE_SHIFT); +} + +/*! + * @brief Gets the status of all voltage detectors in Low Power mode. + * + * @param base SPC peripheral base address. + * @return The status of all voltage detectors in low power mode. + */ +static inline uint32_t SPC_GetLowPowerModeVoltageDetectStatus(SPC_Type *base) +{ + uint32_t state; + state = base->LP_CFG & ( +#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) + SPC_LP_CFG_IO_HVDE_MASK | SPC_LP_CFG_IO_LVDE_MASK | + +#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */ + SPC_LP_CFG_SYS_HVDE_MASK | SPC_LP_CFG_SYS_LVDE_MASK | SPC_LP_CFG_CORE_LVDE_MASK + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) + | SPC_LP_CFG_CORE_HVDE_MASK + +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */ + ); + return state; +} + +/*! + * @brief Enables/Disables Low Power IREF in low power modes. + * + * This function enables/disables Low Power IREF. Low Power IREF can only get + * disabled in Deep power down mode. In other low power modes, the Low Power IREF + * is always enabled. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable Low Power IREF. + * true - Enable Low Power IREF for Low Power modes. + * false - Disable Low Power IREF for Deep Power Down mode. + */ +static inline void SPC_EnableLowPowerModeLowPowerIREF(SPC_Type *base, bool enable) +{ + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_LP_IREFEN_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_LP_IREFEN_MASK; + } +} + +/*! + * @brief Configs Bandgap mode in Low Power mode. + * + * @note To disable Bandgap in Low-power mode: + * 1. Disable all LVD's ad HVD's in low power mode; + * 2. Disable Glitch detect in low power mode; + * 3. Configure LDO's and DCDC to low drive strength in low power mode; + * 4. Disable bandgap in low power mode; + * Otherwise, the error status will be reported. + * + * @note Some other system resources(such as PLL, CMP) require bandgap to be enabled, to disable bandgap please + * take care of other system resources. + * + * @param base SPC peripheral base address. + * @param mode The Bandgap mode be selected. + * + * @retval #kStatus_SPC_BandgapModeWrong The bandgap mode setting in Low Power mode is wrong. + * @retval #kStatus_Success Config Bandgap mode in Low Power power mode successful. + */ +status_t SPC_SetLowPowerModeBandgapmodeConfig(SPC_Type *base, spc_bandgap_mode_t mode); + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SRAMLDO_DPD_ON_BIT) && FSL_FEATURE_MCX_SPC_HAS_SRAMLDO_DPD_ON_BIT) +/*! + * @brief Enables/disables SRAM_LDO deep power low power IREF. + * + * @param base SPC peripheral base address. + * @param enable Used to enable/disable low power IREF : + * - \b true: Low Power IREF is enabled ; + * - \b false: Low Power IREF is disabled for power saving. + */ +static inline void SPC_EnableSRAMLdOLowPowerModeIREF(SPC_Type *base, bool enable) +{ + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_SRAMLDO_DPD_ON_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_SRAMLDO_DPD_ON_MASK; + } +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_SRAMLDO_DPD_ON_BIT */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) +/*! + * @brief Enables/Disables CMP Bandgap Buffer. + * + * This function gates CMP bandgap buffer. CMP bandgap buffer is automatically disabled and turned off + * in Deep Power Down mode. + * + * @deprecated No longer used, please use SPC_EnableLowPowerModeCMPBandgapBuffer as instead. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable CMP Bandgap buffer. + * true - Enable Buffer Stored Reference Voltage to CMP. + * false - Disable Buffer Stored Reference Voltage to CMP. + */ +static inline void SPC_EnableLowPowerModeCMPBandgapBufferMode(SPC_Type *base, bool enable) +{ + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_LPBUFF_EN_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_LPBUFF_EN_MASK; + } +} + +/*! + * @brief Enables/Disables CMP Bandgap Buffer. + * + * This function gates CMP bandgap buffer. CMP bandgap buffer is automatically disabled and turned off + * in Deep Power Down mode. + * + * @deprecated No longer used. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable CMP Bandgap buffer. + * true - Enable Buffer Stored Reference Voltage to CMP. + * false - Disable Buffer Stored Reference Voltage to CMP. + */ +static inline void SPC_EnableLowPowerModeCMPBandgapBuffer(SPC_Type *base, bool enable) +{ + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_LPBUFF_EN_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_LPBUFF_EN_MASK; + } +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) +/*! + * @brief Enables/Disables CORE VDD IVS(Internal Voltage Scaling) in power down modes. + * + * This function gates CORE VDD IVS. When enabled, the IVS regulator will scale the + * external input CORE VDD to a lower voltage level to reduce internal leakage. + * IVS is invalid in Sleep or Deep power down mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable IVS. + * true - enable CORE VDD IVS in Power Down mode. + * false - disable CORE VDD IVS in Power Down mode. + */ +static inline void SPC_EnableLowPowerModeCoreVDDInternalVoltageScaling(SPC_Type *base, bool enable) +{ + if (enable) + { + base->LP_CFG |= SPC_LP_CFG_COREVDD_IVS_EN_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_COREVDD_IVS_EN_MASK; + } +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT */ + +/*! + * @brief Sets the delay when exit the low power modes. + * + * @param base SPC peripheral base address. + * @param delay The number of SPC timer clock cycles that the SPC waits on exit from low power modes. + */ +static inline void SPC_SetLowPowerWakeUpDelay(SPC_Type *base, uint16_t delay) +{ + base->LPWKUP_DELAY = SPC_LPWKUP_DELAY_LPWKUP_DELAY(delay); +} + +/*! + * @brief Configs all settings of regulators in Low power mode at a time. + * + * @note This function is used to overwrite all settings of regulators(including bandgap mode, regulators' + * drive strength and voltage level) in low power mode at a time. + * + * @note Enable/disable LVDs/HVDs before invoking this function. + * + * @note This function will check input parameters based on hardware restrictions before setting registers, if input + * parameters do not satisfy hardware restrictions the specific error will be reported. + * + * @note Some hardware restrictions not covered, application should be aware of this and follow this hardware + * restrictions otherwise some unkown issue may occur: + * 1. If Core LDO's drive strength are set to same value in both Active mode and low power mode, + * the voltage level should also set to same value. + * 2. When switching Core LDO's drive strength from low to normal, ensure the LDO_CORE high voltage level is set + * to same level that was set prior to switching to the LDO_CORE drive strength. Otherwise, if the LVDs are + * enabled, an unexpected LVD can occur. + * + * @note If this function can not satisfy some tricky settings, please invoke other APIs in low-level function group. + * + * @param base SPC peripheral base address. + * @param config Pointer to spc_lowpower_mode_regulators_config_t structure. + * @retval #kStatus_Success Config regulators in Low power mode successful. + * @retval #kStatus_SPC_BandgapModeWrong The bandgap should not be disabled based on input settings. + * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Set driver strength to low will be ignored. + * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to low will be ignored. + * @retval #kStatus_SPC_CORELDOVoltageWrong Core LDO and System LDO do not have same voltage level. + */ +status_t SPC_SetLowPowerModeRegulatorsConfig(SPC_Type *base, const spc_lowpower_mode_regulators_config_t *config); + +#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) +/*! + * @brief Disable/Enable VDD Core Glitch Detect in low power mode. + * + * @note State of glitch detect disable feature will be ignored if bandgap is disabled and + * glitch detect hardware will be forced to OFF state. + * + * @param base SPC peripheral base address. + * @param disable Used to disable/enable VDD Core Glitch detect feature. + * - \b true Disable VDD Core Low Voltage detect; + * - \b false Enable VDD Core Low Voltage detect. + */ +static inline void SPC_DisableLowPowerModeVddCoreGlitchDetect(SPC_Type *base, bool disable) +{ + if (disable) + { + base->LP_CFG |= SPC_LP_CFG_GLITCH_DETECT_DISABLE_MASK; + } + else + { + base->LP_CFG &= ~SPC_LP_CFG_GLITCH_DETECT_DISABLE_MASK; + } +} + +/*! + * @brief Check if Glitch detect hardware is enabled in low power mode. + * + * @param base SPC peripheral base address. + * @return Indicate if Glitch detector is enabled. + */ +static inline bool SPC_CheckLowPowerModeVddCoreGlitchDetectEnabled(SPC_Type *base) +{ + if ((base->LP_CFG & SPC_LP_CFG_GLITCH_DETECT_DISABLE_MASK) == 0UL) + { + return true; + } + else + { + return false; + } +} +#endif + +/*! + * @brief Enables analog modules in low power modes. + * + * @param base SPC peripheral base address. + * @param maskValue The mask of analog modules to enable in low power modes, should be OR'ed value + of @ref spc_analog_module_control. + */ +static inline void SPC_EnableLowPowerModeAnalogModules(SPC_Type *base, uint32_t maskValue) +{ + base->LP_CFG1 |= SPC_LP_CFG1_SOC_CNTRL(maskValue); +} + +/*! + * @brief Disables analog modules in low power modes. + * + * @param base SPC peripheral base address. + * @param maskValue The mask of analog modules to disable in low power modes, should be OR'ed value + of @ref spc_analog_module_control. + */ +static inline void SPC_DisableLowPowerModeAnalogModules(SPC_Type *base, uint32_t maskValue) +{ + base->LP_CFG1 &= ~SPC_LP_CFG1_SOC_CNTRL(maskValue); +} + +/*! + * @brief Gets enabled analog modules that enabled in low power modes. + * + * @param base SPC peripheral base address. + * + * @return The mask of enabled analog modules that enabled in low power modes. + */ +static inline uint32_t SPC_GetLowPowerModeEnabledAnalogModules(SPC_Type *base) +{ + return base->LP_CFG1; +} + +/*! @} */ + +/*! + * @name Voltage Detect Status + * @{ + */ +/*! + * @brief Get Voltage Detect Status Flags. + * + * @param base SPC peripheral base address. + * @return Voltage Detect Status Flags. See @ref _spc_voltage_detect_flags for details. + */ +static inline uint8_t SPC_GetVoltageDetectStatusFlag(SPC_Type *base) +{ + return (uint8_t)(base->VD_STAT); +} + +/*! + * @brief Clear Voltage Detect Status Flags. + * + * @param base SPC peripheral base address. + * @param mask The mask of the voltage detect status flags. See @ref _spc_voltage_detect_flags for details. + */ +static inline void SPC_ClearVoltageDetectStatusFlag(SPC_Type *base, uint8_t mask) +{ + base->VD_STAT |= mask; +} + +/*! @} */ + +/*! + * @name Voltage Detect configuration for Core voltage domain. + * @{ + */ + +/*! + * @brief Configs CORE voltage detect options. + * + * @note: Setting both the voltage detect interrupt and reset + * enable will cause interrupt to be generated on exit from reset. + * If those conditioned is not desired, interrupt/reset so only one is enabled. + * + * @param base SPC peripheral base address. + * @param config Pointer to spc_core_voltage_detect_config_t structure. + */ +void SPC_SetCoreVoltageDetectConfig(SPC_Type *base, const spc_core_voltage_detect_config_t *config); + +/*! + * @brief Locks Core voltage detect reset setting. + * + * This function locks core voltage detect reset setting. After invoking this function + * any configuration of Core voltage detect reset will be ignored. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_LockCoreVoltageDetectResetSetting(SPC_Type *base) +{ + base->VD_CORE_CFG |= SPC_VD_CORE_CFG_LOCK_MASK; +} + +/*! + * @brief Unlocks Core voltage detect reset setting. + * + * This function unlocks core voltage detect reset setting. If locks the Core + * voltage detect reset setting, invoking this function to unlock. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_UnlockCoreVoltageDetectResetSetting(SPC_Type *base) +{ + base->VD_CORE_CFG &= ~SPC_VD_CORE_CFG_LOCK_MASK; +} + +/*! + * @brief Enables/Disables the Core Low Voltage Detector in Active mode. + * + * @note If the CORE_LDO low voltage detect is enabled in Active mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable Core LVD. + * true - Enable Core Low voltage detector in active mode. + * false - Disable Core Low voltage detector in active mode. + * + * @retval #kStatus_Success Enable/Disable Core Low Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeCoreLowVoltageDetect(SPC_Type *base, bool enable); + +/*! + * @brief Enables/Disables the Core Low Voltage Detector in Low Power mode. + * + * This function enables/disables the Core Low Voltage Detector. + * If enabled the Core Low Voltage detector. The Bandgap mode in + * low power mode must be programmed so that Bandgap is enabled. + * + * @note If the CORE_LDO low voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Low Power mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable Core HVD. + * true - Enable Core Low voltage detector in low power mode. + * false - Disable Core Low voltage detector in low power mode. + * + * @retval #kStatus_Success Enable/Disable Core Low Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeCoreLowVoltageDetect(SPC_Type *base, bool enable); + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) +/*! + * @brief Enables/Disables the Core High Voltage Detector in Active mode. + * + * @note If the CORE_LDO high voltage detect is enabled in Active mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable Core HVD. + * true - Enable Core High voltage detector in active mode. + * false - Disable Core High voltage detector in active mode. + * + * @retval #kStatus_Success Enable/Disable Core High Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeCoreHighVoltageDetect(SPC_Type *base, bool enable); + +/*! + * @brief Enables/Disables the Core High Voltage Detector in Low Power mode. + * + * This function enables/disables the Core High Voltage Detector. + * If enabled the Core High Voltage detector. The Bandgap mode in + * low power mode must be programmed so that Bandgap is enabled. + * + * @note If the CORE_LDO high voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in low power mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable Core HVD. + * true - Enable Core High voltage detector in low power mode. + * false - Disable Core High voltage detector in low power mode. + * + * @retval #kStatus_Success Enable/Disable Core High Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeCoreHighVoltageDetect(SPC_Type *base, bool enable); +#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */ + +/*! @} */ + +/*! + * @name Voltage detect configuration for System Voltage domain + * @{ + */ +/*! + * @brief Set system VDD Low-voltage level selection. + * + * This function selects the system VDD low-voltage level. Changing system VDD low-voltage level + * must be done after disabling the System VDD low voltage reset and interrupt. + * + * @deprecated In latest RM, reserved for all devices, will removed in next release. + * + * @param base SPC peripheral base address. + * @param level System VDD Low-Voltage level selection. + */ +void SPC_SetSystemVDDLowVoltageLevel(SPC_Type *base, spc_low_voltage_level_select_t level); + +/*! + * @brief Configs SYS voltage detect options. + * + * This function config SYS voltage detect options. + * @note: Setting both the voltage detect interrupt and reset + * enable will cause interrupt to be generated on exit from reset. + * If those conditioned is not desired, interrupt/reset so only one is enabled. + * + * @param base SPC peripheral base address. + * @param config Pointer to spc_system_voltage_detect_config_t structure. + */ +void SPC_SetSystemVoltageDetectConfig(SPC_Type *base, const spc_system_voltage_detect_config_t *config); + +/*! + * @brief Lock System voltage detect reset setting. + * + * This function locks system voltage detect reset setting. After invoking this function + * any configuration of System Voltage detect reset will be ignored. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_LockSystemVoltageDetectResetSetting(SPC_Type *base) +{ + base->VD_SYS_CFG |= SPC_VD_SYS_CFG_LOCK_MASK; +} + +/*! + * @brief Unlock System voltage detect reset setting. + * + * This function unlocks system voltage detect reset setting. If locks the System + * voltage detect reset setting, invoking this function to unlock. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_UnlockSystemVoltageDetectResetSetting(SPC_Type *base) +{ + base->VD_SYS_CFG &= ~SPC_VD_SYS_CFG_LOCK_MASK; +} + +/*! + * @brief Enables/Disables the System High Voltage Detector in Active mode. + * + * @note If the System_LDO high voltage detect is enabled in Active mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Active mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable System HVD. + * true - Enable System High voltage detector in active mode. + * false - Disable System High voltage detector in active mode. + * + * @retval #kStatus_Success Enable/Disable System High Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeSystemHighVoltageDetect(SPC_Type *base, bool enable); + +/*! + * @brief Enables/Disable the System Low Voltage Detector in Active mode. + * + * @note If the System_LDO low voltage detect is enabled in Active mode, + * please note that the bandgap must be enabled and the drive strength of each + * regulator must not set to low in Active mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable System LVD. + * true - Enable System Low voltage detector in active mode. + * false - Disable System Low voltage detector in active mode. + * + * @retval #kStatus_Success Enable/Disable the System Low Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeSystemLowVoltageDetect(SPC_Type *base, bool enable); + +/*! + * @brief Enables/Disables the System High Voltage Detector in Low Power mode. + * + * @note If the System_LDO high voltage detect is enabled in Low Power mode, please note + * that the bandgap must be enabled and the drive strength of each regulator must + * not set to low in Low Power mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable System HVD. + * true - Enable System High voltage detector in low power mode. + * false - Disable System High voltage detector in low power mode. + * + * @retval #kStatus_Success Enable/Disable System High Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeSystemHighVoltageDetect(SPC_Type *base, bool enable); + +/*! + * @brief Enables/Disables the System Low Voltage Detector in Low Power mode. + * + * @note If the System_LDO low voltage detect is enabled in Low Power mode, + * please note that the bandgap must be enabled and the drive strength of each + * regulator must not set to low in Low Power mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable System HVD. + * true - Enable System Low voltage detector in low power mode. + * false - Disable System Low voltage detector in low power mode. + * + * @retval #kStatus_Success Enables System Low Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeSystemLowVoltageDetect(SPC_Type *base, bool enable); + +/*! @} */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) +/*! + * @name Voltage detect configuration for IO voltage domain + * @{ + */ +/*! + * @brief Set IO VDD Low-Voltage level selection. + * + * This function selects the IO VDD Low-voltage level. Changing IO VDD low-voltage level + * must be done after disabling the IO VDD low voltage reset and interrupt. + * + * @param base SPC peripheral base address. + * @param level IO VDD Low-voltage level selection. + */ +void SPC_SetIOVDDLowVoltageLevel(SPC_Type *base, spc_low_voltage_level_select_t level); + +/*! + * @brief Configs IO voltage detect options. + * + * This function config IO voltage detect options. + * @note: Setting both the voltage detect interrupt and reset + * enable will cause interrupt to be generated on exit from reset. + * If those conditioned is not desired, interrupt/reset so only one is enabled. + * + * @param base SPC peripheral base address. + * @param config Pointer to spc_voltage_detect_config_t structure. + */ +void SPC_SetIOVoltageDetectConfig(SPC_Type *base, const spc_io_voltage_detect_config_t *config); + +/*! + * @brief Lock IO Voltage detect reset setting. + * + * This function locks IO voltage detect reset setting. After invoking this function + * any configuration of system voltage detect reset will be ignored. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_LockIOVoltageDetectResetSetting(SPC_Type *base) +{ + base->VD_IO_CFG |= SPC_VD_IO_CFG_LOCK_MASK; +} + +/*! + * @brief Unlock IO voltage detect reset setting. + * + * This function unlocks IO voltage detect reset setting. If locks the IO + * voltage detect reset setting, invoking this function to unlock. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_UnlockIOVoltageDetectResetSetting(SPC_Type *base) +{ + base->VD_IO_CFG &= ~SPC_VD_IO_CFG_LOCK_MASK; +} + +/*! + * @brief Enables/Disables the IO High Voltage Detector in Active mode. + * + * @note If the IO high voltage detect is enabled in Active mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Active mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable IO HVD. + * true - Enable IO High voltage detector in active mode. + * false - Disable IO High voltage detector in active mode. + * + * @retval #kStatus_Success Enable/Disable IO High Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeIOHighVoltageDetect(SPC_Type *base, bool enable); + +/*! + * @brief Enables/Disables the IO Low Voltage Detector in Active mode. + * + * @note If the IO low voltage detect is enabled in Active mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Active mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable IO LVD. + * true - Enable IO Low voltage detector in active mode. + * false - Disable IO Low voltage detector in active mode. + * + * @retval #kStatus_Success Enable IO Low Voltage Detect successfully. + */ +status_t SPC_EnableActiveModeIOLowVoltageDetect(SPC_Type *base, bool enable); + +/*! + * @brief Enables/Disables the IO High Voltage Detector in Low Power mode. + * + * @note If the IO high voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Low Power mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable IO HVD. + * true - Enable IO High voltage detector in low power mode. + * false - Disable IO High voltage detector in low power mode. + * + * @retval #kStatus_Success Enable IO High Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeIOHighVoltageDetect(SPC_Type *base, bool enable); + +/*! + * @brief Enables/Disables the IO Low Voltage Detector in Low Power mode. + * + * @note If the IO low voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled + * and the drive strength of each regulator must not set to low in Low Power mode. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable IO LVD. + * true - Enable IO Low voltage detector in low power mode. + * false - Disable IO Low voltage detector in low power mode. + * + * @retval #kStatus_Success Enable/Disable IO Low Voltage Detect in low power mode successfully. + */ +status_t SPC_EnableLowPowerModeIOLowVoltageDetect(SPC_Type *base, bool enable); + +/*! @} */ + +#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */ + +/*! + * @name External Voltage domains configuration + * @{ + */ +/*! + * @brief Configs external voltage domains + * + * This function configs external voltage domains isolation. + * + * @param base SPC peripheral base address. + * @param lowPowerIsoMask The mask of external domains isolate enable during low power mode. Please read the Reference + * Manual for the Bitmap. + * @param IsoMask The mask of external domains isolate. Please read the Reference Manual for the Bitmap. + */ +void SPC_SetExternalVoltageDomainsConfig(SPC_Type *base, uint8_t lowPowerIsoMask, uint8_t IsoMask); + +/*! + * @brief Gets External Domains status. + * + * @param base SPC peripheral base address. + * @return The status of each external domain. + */ +static inline uint8_t SPC_GetExternalDomainsStatus(SPC_Type *base) +{ + return (uint8_t)(base->EVD_CFG >> SPC_EVD_CFG_REG_EVDSTAT_SHIFT); +} + +/*! @} */ + +/*! + * @name Low Level APIs To Set CORE LDO Regulator + * @{ + */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_CNTRL_REG) && FSL_FEATURE_MCX_SPC_HAS_CNTRL_REG) +/*! + * @brief Enable/Disable Core LDO regulator. + * + * @note The CORE LDO enable bit is write-once. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable CORE LDO Regulator. + * true - Enable CORE LDO Regulator. + * false - Disable CORE LDO Regulator. + */ +static inline void SPC_EnableCoreLDORegulator(SPC_Type *base, bool enable) +{ + if (enable) + { + base->CNTRL |= SPC_CNTRL_CORELDO_EN_MASK; + } + else + { + /* + * $Branch Coverage Justification$ + * If CORE_LDO is disabled, all RAMs data will powered off. + */ + base->CNTRL &= ~SPC_CNTRL_CORELDO_EN_MASK; + } +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_CNTRL_REG */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DPDOWN_PULLDOWN_DISABLE_BIT) && \ + FSL_FEATURE_MCX_SPC_HAS_DPDOWN_PULLDOWN_DISABLE_BIT) +/*! + * @brief Enable/Disable the CORE LDO Regulator pull down in Deep Power Down. + * + * @note This function only useful when enabled the CORE LDO Regulator. + * + * @param base SPC peripheral base address. + * @param pulldown Enable/Disable CORE LDO pulldown in Deep Power Down mode. + * true - CORE LDO Regulator will discharge in Deep Power Down mode. + * false - CORE LDO Regulator will not discharge in Deep Power Down mode. + */ +static inline void SPC_PullDownCoreLDORegulator(SPC_Type *base, bool pulldown) +{ + if (pulldown) + { + base->CORELDO_CFG &= ~SPC_CORELDO_CFG_DPDOWN_PULLDOWN_DISABLE_MASK; + } + else + { + base->CORELDO_CFG |= SPC_CORELDO_CFG_DPDOWN_PULLDOWN_DISABLE_MASK; + } +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_DPDOWN_PULLDOWN_DISABLE_BIT */ + +/*! + * @brief Configs Core LDO Regulator in Active mode. + * + * @note The bandgap must be enabled before invoking this function. + * @note To set Core LDO as low drive strength, all HVDs/LVDs must be disabled previously. + * + * @param base SPC peripheral base address. + * @param option Pointer to the spc_active_mode_core_ldo_option_t structure. + * + * @retval kStatus_Success Config Core LDO regulator in Active power mode successful. + * @retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * @retval kStatus_SPC_BandgapModeWrong Bandgap should be enabled before invoking this function. + * @retval kStatus_SPC_CORELDOLowDriveStrengthIgnore To set Core LDO as low drive strength, + * all LVDs/HVDs must be disabled before invoking this function. + */ +status_t SPC_SetActiveModeCoreLDORegulatorConfig(SPC_Type *base, const spc_active_mode_core_ldo_option_t *option); + +/*! + * @brief Set Core LDO Regulator Voltage level in Active mode. + * + * @param base SPC peripheral base address. + * @param voltageLevel Specify the voltage level of CORE LDO Regulator in Active mode, please + refer to @ref spc_core_ldo_voltage_level_t. + * + * @note In active mode, the Core LDO voltage level should only be changed when the + * Core LDO is in normal drive strength. + * + * @note Update Core LDO voltage level will set Busy flag, + * this function return only when busy flag is cleared by hardware + * + * @retval kStatus_SPC_CORELDOVoltageSetFail The drive strength of Core LDO is not normal. + * @retval kStatus_Success Set Core LDO regulator voltage level in Active power mode successful. + */ +status_t SPC_SetActiveModeCoreLDORegulatorVoltageLevel(SPC_Type *base, spc_core_ldo_voltage_level_t voltageLevel); + +/*! + * @brief Gets CORE LDO Regulator Voltage level. + * + * This function returns the voltage level of CORE LDO Regulator in Active mode. + * + * @param base SPC peripheral base address. + * @return Voltage level of CORE LDO in type of @ref spc_core_ldo_voltage_level_t enumeration. + */ +static inline spc_core_ldo_voltage_level_t SPC_GetActiveModeCoreLDOVDDVoltageLevel(SPC_Type *base) +{ + return (spc_core_ldo_voltage_level_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_CORELDO_VDD_LVL_MASK) >> + SPC_ACTIVE_CFG_CORELDO_VDD_LVL_SHIFT); +} + +#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) +/*! + * @brief Set Core LDO VDD Regulator Drive Strength in Active mode. + * + * @param base SPC peripheral base address. + * @param driveStrength Specify the drive strength of CORE LDO Regulator in Active mode, please + refer to @ref spc_core_ldo_drive_strength_t. + * + * @retval #kStatus_Success Set Core LDO regulator drive strength in Active power mode successful. + * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore If any voltage detect enabled, + core_ldo's drive strength can not set to low. + * @retval #kStatus_SPC_BandgapModeWrong The selected bandgap mode is not allowed. + */ +status_t SPC_SetActiveModeCoreLDORegulatorDriveStrength(SPC_Type *base, spc_core_ldo_drive_strength_t driveStrength); + +/*! + * @brief Gets CORE LDO VDD Regulator Drive Strength in Active mode. + * + * @param base SPC peripheral base address. + * @return Drive Strength of CORE LDO regulator in Active mode, please refer to @ref spc_core_ldo_drive_strength_t. + */ +static inline spc_core_ldo_drive_strength_t SPC_GetActiveModeCoreLDODriveStrength(SPC_Type *base) +{ + return (spc_core_ldo_drive_strength_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK) >> + SPC_ACTIVE_CFG_CORELDO_VDD_DS_SHIFT); +} +#endif /* defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */ + +/*! + * @brief Configs CORE LDO Regulator in low power mode + * + * This function configs CORE LDO Regulator in Low Power mode. + * If CORE LDO VDD Drive Strength is set to Normal, the CORE LDO VDD regulator voltage + * level in Active mode must be equal to the voltage level in Low power mode. And the Bandgap + * must be programmed to select bandgap enabled. + * Core VDD voltage levels for the Core LDO low power regulator can only be changed when the CORE + * LDO Drive Strength set as Normal. + * + * @param base SPC peripheral base address. + * @param option Pointer to the spc_lowpower_mode_core_ldo_option_t structure. + * + * @retval #kStatus_Success Config Core LDO regulator in power mode successfully. + * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Set driver strength to low will be ignored. + * @retval #kStatus_SPC_CORELDOVoltageSetFail. Fail to change Core LDO voltage level. + */ +status_t SPC_SetLowPowerModeCoreLDORegulatorConfig(SPC_Type *base, const spc_lowpower_mode_core_ldo_option_t *option); + +/*! + * @brief Set Core LDO VDD Regulator Voltage level in Low power mode. + * + * @note If CORE LDO's drive strength is set to Normal, the CORE LDO VDD regulator voltage in active mode and low power + * mode must be same. + * @note Voltage level for the CORE LDO in low power mode can only be changed when the CORE LDO Drive Strength set as + * Normal. + * + * @param base SPC peripheral base address. + * @param voltageLevel Voltage level of CORE LDO Regulator in Low power mode, please + refer to @ref spc_core_ldo_voltage_level_t. + * + * @retval #kStatus_SPC_CORELDOVoltageWrong Voltage level in active mode and low power mode is not same. + * @retval #kStatus_Success Set Core LDO regulator voltage level in Low power mode successful. + * @retval #kStatus_SPC_CORELDOVoltageSetFail Fail to update voltage level because drive strength is incorrect. + */ +status_t SPC_SetLowPowerModeCoreLDORegulatorVoltageLevel(SPC_Type *base, spc_core_ldo_voltage_level_t voltageLevel); + +/*! + * @brief Gets the CORE LDO VDD Regulator Voltage Level for Low Power modes. + * + * @param base SPC peripheral base address. + * @return The CORE LDO VDD Regulator's voltage level. + */ +static inline spc_core_ldo_voltage_level_t SPC_GetLowPowerCoreLDOVDDVoltageLevel(SPC_Type *base) +{ + return ((spc_core_ldo_voltage_level_t)(uint32_t)((base->LP_CFG & SPC_LP_CFG_CORELDO_VDD_LVL_MASK) >> + SPC_LP_CFG_CORELDO_VDD_LVL_SHIFT)); +} + +/*! + * @brief Set Core LDO VDD Regulator Drive Strength in Low power mode. + * + * @param base SPC peripheral base address. + * @param driveStrength Specify drive strength of CORE LDO in low power mode. + * + * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Some voltage detect enabled, CORE LDO's drive strength can not set + * as low. + * @retval #kStatus_Success Set Core LDO regulator drive strength in Low power mode successful. + * @retval #kStatus_SPC_BandgapModeWrong Bandgap is disabled when attempt to set CORE LDO work as normal drive strength. + */ +status_t SPC_SetLowPowerModeCoreLDORegulatorDriveStrength(SPC_Type *base, spc_core_ldo_drive_strength_t driveStrength); + +/*! + * @brief Gets CORE LDO VDD Drive Strength for Low Power modes. + * + * @param base SPC peripheral base address. + * @return The CORE LDO's VDD Drive Strength. + */ +static inline spc_core_ldo_drive_strength_t SPC_GetLowPowerCoreLDOVDDDriveStrength(SPC_Type *base) +{ + return (spc_core_ldo_drive_strength_t)(uint32_t)((base->LP_CFG & SPC_LP_CFG_CORELDO_VDD_DS_MASK) >> + SPC_LP_CFG_CORELDO_VDD_DS_SHIFT); +} + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) +/*! + * @name Low Level APIs To Set System LDO Regulator + * @{ + */ + +/*! + * @brief Enable/Disable System LDO regulator. + * + * @note The SYSTEM LDO enable bit is write-once. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable System LDO Regulator. + * true - Enable System LDO Regulator. + * false - Disable System LDO Regulator. + */ +static inline void SPC_EnableSystemLDORegulator(SPC_Type *base, bool enable) +{ + if (enable) + { + base->CNTRL |= SPC_CNTRL_SYSLDO_EN_MASK; + } + else + { + /* + * $Branch Coverage Justification$ + * If SYSTEM_LDO is disabled, may cause some unexpected issues. + */ + base->CNTRL &= ~SPC_CNTRL_SYSLDO_EN_MASK; + } +} + +/*! + * @brief Enable/Disable current sink feature of System LDO Regulator. + * + * @param base SPC peripheral base address. + * @param sink Enable/Disable current sink feature. + * true - Enable current sink feature of System LDO Regulator. + * false - Disable current sink feature of System LDO Regulator. + */ +static inline void SPC_EnableSystemLDOSinkFeature(SPC_Type *base, bool sink) +{ + if (sink) + { + base->SYSLDO_CFG |= SPC_SYSLDO_CFG_ISINKEN_MASK; + } + else + { + base->SYSLDO_CFG &= ~SPC_SYSLDO_CFG_ISINKEN_MASK; + } +} + +/*! + * @brief Configs System LDO VDD Regulator in Active mode. + * + * @note If System LDO VDD Drive Strength is set to Normal, the Bandgap mode in Active mode must be programmed + * to a value that enables the bandgap. + * @note If any voltage detects are kept enabled, configuration to set System LDO VDD drive strength to low will + * be ignored. + * @note If select System LDO VDD Regulator voltage level to Over Drive Voltage, the Drive Strength of System LDO VDD + * Regulator must be set to Normal otherwise the regulator Drive Strength will be forced to Normal. + * @note If select System LDO VDD Regulator voltage level to Over Drive Voltage, the High voltage detect must be + * disabled. Otherwise it will be fail to regulator to Over Drive Voltage. + * + * @param base SPC peripheral base address. + * @param option Pointer to the spc_active_mode_sys_ldo_option_t structure. + * + * @retval #kStatus_Success Config System LDO regulator in Active power mode successful. + * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * @retval #kStatus_SPC_BandgapModeWrong The bandgap is not enabled before invoking this function. + * @retval #kStatus_SPC_SYSLDOOverDriveVoltageFail HVD of System VDD is not disable before setting to Over Drive + * voltage. + * @retval kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set System LDO VDD regulator's driver strength to Low will be + * ignored. + */ +status_t SPC_SetActiveModeSystemLDORegulatorConfig(SPC_Type *base, const spc_active_mode_sys_ldo_option_t *option); + +/*! + * @brief Set System LDO Regulator voltage level in Active mode. + * + * @note The system LDO regulator can only operate at the overdrive voltage level for a limited amount of time for the + * life of chip. + * + * @param base SPC peripheral base address. + * @param voltageLevel Specify the voltage level of System LDO Regulator in Active mode. + * + * @retval #kStatus_Success Set System LDO Regulator voltage level in Active mode successfully. + * @retval #kStatus_SPC_SYSLDOOverDriveVoltageFail Must disable system LDO high voltage detector before specifing + * overdrive voltage. + */ +status_t SPC_SetActiveModeSystemLDORegulatorVoltageLevel(SPC_Type *base, spc_sys_ldo_voltage_level_t voltageLevel); + +/*! + * @brief Get System LDO Regulator voltage level in Active mode. + * + * @param base SPC peripheral base address. + * @return System LDO Regulator voltage level in Active mode, please refer to @ref spc_sys_ldo_voltage_level_t. + */ +static inline spc_sys_ldo_voltage_level_t SPC_GetActiveModeSystemLDORegulatorVoltageLevel(SPC_Type *base) +{ + return (spc_sys_ldo_voltage_level_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_SYSLDO_VDD_LVL_MASK) >> + SPC_ACTIVE_CFG_SYSLDO_VDD_LVL_SHIFT); +} + +/*! + * @brief Set System LDO Regulator Drive Strength in Active mode. + * + * @param base SPC peripheral base address. + * @param driveStrength Specify the drive strength of System LDO Regulator in Active mode. + * + * @retval #kStatus_Success Set System LDO Regulator drive strength in Active mode successfully. + * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Attempt to specify low drive strength is ignored due to any + voltage detect feature is enabled in active mode. + * @retval #kStatus_SPC_BandgapModeWrong Bandgap mode in Active mode must be programmed to a value that enables + the bandgap if attempt to specify normal drive strength. + */ +status_t SPC_SetActiveModeSystemLDORegulatorDriveStrength(SPC_Type *base, spc_sys_ldo_drive_strength_t driveStrength); + +/*! + * @brief Get System LDO Regulator Drive Strength in Active mode. + * + * @param base SPC peripheral base address. + * @return System LDO regulator drive strength in Active mode, please refer to @ref spc_sys_ldo_drive_strength_t. + */ +static inline spc_sys_ldo_drive_strength_t SPC_GetActiveModeSystemLDORegulatorDriveStrength(SPC_Type *base) +{ + return (spc_sys_ldo_drive_strength_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK) >> + SPC_ACTIVE_CFG_SYSLDO_VDD_DS_SHIFT); +} + +/*! + * @brief Configs System LDO regulator in low power modes. + * + * This function configs System LDO regulator in low power modes. + * If System LDO VDD Regulator Drive strength is set to normal, bandgap mode in low power + * mode must be programmed to a value that enables the Bandgap. + * If any High voltage detectors or Low Voltage detectors are kept enabled, configuration + * to set System LDO Regulator drive strength as Low will be ignored. + * + * @param base SPC peripheral base address. + * @param option Pointer to spc_lowpower_mode_sys_ldo_option_t structure. + * + * @retval #kStatus_Success Config System LDO regulator in Low Power Mode successfully. + * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to low will be ignored. + */ +status_t SPC_SetLowPowerModeSystemLDORegulatorConfig(SPC_Type *base, const spc_lowpower_mode_sys_ldo_option_t *option); + +/*! + * @brief Set System LDO Regulator drive strength in Low Power Mode. + * + * @param base SPC peripheral base address. + * @param driveStrength Specify the drive strength of System LDO Regulator in Low Power Mode. + * + * @retval #kStatus_Success Set System LDO Regulator drive strength in Low Power Mode successfully. + * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Attempt to specify low drive strength is ignored due to any + voltage detect feature is enabled in low power mode. + * @retval #kStatus_SPC_BandgapModeWrong Bandgap mode in low power mode must be programmed to a value that enables + the bandgap if attempt to specify normal drive strength. + */ +status_t SPC_SetLowPowerModeSystemLDORegulatorDriveStrength(SPC_Type *base, spc_sys_ldo_drive_strength_t driveStrength); + +/*! + * @brief Get System LDO Regulator drive strength in Low Power Mode. + * + * @param base SPC peripheral base address. + * @return System LDO regulator drive strength in Low Power Mode, please refer to @ref spc_sys_ldo_drive_strength_t. + */ +static inline spc_sys_ldo_drive_strength_t SPC_GetLowPowerModeSystemLDORegulatorDriveStrength(SPC_Type *base) +{ + return (spc_sys_ldo_drive_strength_t)(uint32_t)((base->LP_CFG & SPC_LP_CFG_SYSLDO_VDD_DS_MASK) >> + SPC_LP_CFG_SYSLDO_VDD_DS_SHIFT); +} +/*! @} */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */ + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC) +/*! + * @name Low Level APIs To Set DCDC Regulator + * @{ + */ + +/*! + * @brief Enable/Disable DCDC Regulator. + * + * @note The DCDC enable bit is write-once, settings only reset after a POR, LVD, or HVD event. + * + * @param base SPC peripheral base address. + * @param enable Enable/Disable DCDC Regulator. + * true - Enable DCDC Regulator. + * false - Disable DCDC Regulator. + */ +static inline void SPC_EnableDCDCRegulator(SPC_Type *base, bool enable) +{ + if (enable) + { + base->CNTRL |= SPC_CNTRL_DCDC_EN_MASK; + } + else + { + /* + * $Branch Coverage Justification$ + * If DCDC is disabled, all RAMs data will powered off. + */ + base->CNTRL &= ~SPC_CNTRL_DCDC_EN_MASK; + } +} + +/*! + * @brief Config DCDC Burst options + * + * @param base SPC peripheral base address. + * @param config Pointer to spc_dcdc_burst_config_t structure. + */ +void SPC_SetDCDCBurstConfig(SPC_Type *base, spc_dcdc_burst_config_t *config); + +/*! + * @brief Trigger a software burst request to DCDC. + * + * @param base SPC peripheral base address. + */ +static inline void SPC_TriggerDCDCBurstRequest(SPC_Type *base) +{ + /* Blocking until previous DCDC burst completed. */ + while ((base->DCDC_BURST_CFG & SPC_DCDC_BURST_CFG_BURST_ACK_MASK) == 0UL) + { + } + + base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_BURST_REQ_MASK; +} + +/*! + * @brief Check if burst acknowlege flag is asserted. + * + * @param base SPC peripheral base address. + * + * @retval false DCDC burst not complete. + * @retval true DCDC burst complete. + */ +static inline bool SPC_CheckDCDCBurstAck(SPC_Type *base) +{ + return ((base->DCDC_BURST_CFG & SPC_DCDC_BURST_CFG_BURST_ACK_MASK) != 0UL); +} + +/*! + * @brief Clear DCDC busrt acknowledge flag. + * + * @param base SPC periphral base address. + */ +static inline void SPC_ClearDCDCBurstAckFlag(SPC_Type *base) +{ + base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_BURST_ACK_MASK; +} + +/*! + * @brief Set the count value of the reference clock to configure the period of DCDC not active. + * + * @note This function is only useful when DCDC's drive strength is set as pulse refresh. + * @note The pulse duration(time between on and off) is: reference clock period * (count + 2). + * + * @param base SPC peripheral base address. + * @param count The count value, 16 bit width. + */ +void SPC_SetDCDCRefreshCount(SPC_Type *base, uint16_t count); + +#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC_CFG_BLEED_EN) && FSL_FEATURE_MCX_SPC_HAS_DCDC_CFG_BLEED_EN) +/*! + * @brief Enable a bleed resistor to discharge DCDC output when DCDC is disabled. + * + * @param base SPC peripheral base address. + * @param enable Used to enable/disable bleed resistor. + */ +static inline void SPC_EnableDCDCBleedResistor(SPC_Type *base, bool enable) +{ + if (enable) + { + base->DCDC_CFG |= SPC_DCDC_CFG_BLEED_EN_MASK; + } + else + { + base->DCDC_CFG &= ~SPC_DCDC_CFG_BLEED_EN_MASK; + } +} +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC_CFG_BLEED_EN */ + +/*! + * @brief Configs DCDC_CORE Regulator in Active mode. + * + * @note When changing the DCDC output voltage level, take care to change the CORE LDO voltage level. + * + * @param base SPC peripheral base address. + * @param option Pointer to the spc_active_mode_dcdc_option_t structure. + * + * @retval #kStatus_Success Config DCDC regulator in Active power mode successful. + * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * @retval #kStatus_SPC_BandgapModeWrong Set DCDC_CORE Regulator drive strength to Normal, the Bandgap must be enabled. + */ +status_t SPC_SetActiveModeDCDCRegulatorConfig(SPC_Type *base, const spc_active_mode_dcdc_option_t *option); + +/*! + * @brief Set DCDC_CORE Regulator voltage level in Active mode. + * + * @note When changing the DCDC output voltage level, take care to change the CORE LDO voltage level. + * + * @param base SPC peripheral base address. + * @param voltageLevel Specify the DCDC_CORE Regulator voltage level, please refer to @ref spc_dcdc_voltage_level_t. + */ +static inline void SPC_SetActiveModeDCDCRegulatorVoltageLevel(SPC_Type *base, spc_dcdc_voltage_level_t voltageLevel) +{ + base->ACTIVE_CFG = + (base->ACTIVE_CFG & (~SPC_ACTIVE_CFG_DCDC_VDD_LVL_MASK)) | SPC_ACTIVE_CFG_DCDC_VDD_LVL(voltageLevel); +} + +/*! + * @brief Get DCDC_CORE Regulator voltage level in Active mode. + * + * @param base SPC peripheral base address. + * @return DCDC_CORE Regulator voltage level, please refer to @ref spc_dcdc_voltage_level_t. + */ +static inline spc_dcdc_voltage_level_t SPC_GetActiveModeDCDCRegulatorVoltageLevel(SPC_Type *base) +{ + return (spc_dcdc_voltage_level_t)((uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_DCDC_VDD_LVL_MASK) >> + SPC_ACTIVE_CFG_DCDC_VDD_LVL_SHIFT)); +} + +/*! + * @brief Set DCDC_CORE Regulator drive strength in Active mode. + * + * @note To set DCDC drive strength as Normal, the bandgap must be enabled. + * + * @param base SPC peripheral base address. + * @param driveStrength Specify the DCDC_CORE regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t. + * + * @retval #kStatus_Success Set DCDC_CORE Regulator drive strength in Active mode successfully. + * @retval #kStatus_SPC_BandgapModeWrong Set DCDC_CORE Regulator drive strength to Normal, the Bandgap must be enabled. + */ +status_t SPC_SetActiveModeDCDCRegulatorDriveStrength(SPC_Type *base, spc_dcdc_drive_strength_t driveStrength); + +/*! + * @brief Get DCDC_CORE Regulator drive strength in Active mode. + * + * @param base SPC peripheral base address. + * @return DCDC_CORE Regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t. + */ +static inline spc_dcdc_drive_strength_t SPC_GetActiveModeDCDCRegulatorDriveStrength(SPC_Type *base) +{ + return (spc_dcdc_drive_strength_t)((uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_DCDC_VDD_DS_MASK) >> + SPC_ACTIVE_CFG_DCDC_VDD_DS_SHIFT)); +} + +/*! + * @brief Configs DCDC_CORE Regulator in Low power modes. + * + * @note If DCDC_CORE Drive Strength is set to Normal, the Bandgap mode in Low Power mode must be programmed + * to a value that enables the Bandgap. + * @note In Deep Power Down mode, DCDC regulator is always turned off. + * + * @param base SPC peripheral base address. + * @param option Pointer to the spc_lowpower_mode_dcdc_option_t structure. + * + * @retval #kStatus_Success Config DCDC regulator in low power mode successfully. + * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition. + * @retval #kStatus_SPC_BandgapModeWrong The bandgap mode setting in Low Power mode is wrong. + */ +status_t SPC_SetLowPowerModeDCDCRegulatorConfig(SPC_Type *base, const spc_lowpower_mode_dcdc_option_t *option); + +/*! + * @brief Set DCDC_CORE Regulator drive strength in Low power mode. + * + * @note To set drive strength as normal, the bandgap must be enabled. + * + * @param base SPC peripheral base address. + * @param driveStrength Specify the DCDC_CORE Regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t. + * + * @retval #kStatus_Success Set DCDC_CORE Regulator drive strength in Low power mode successfully. + * @retval #kStatus_SPC_BandgapModeWrong Set DCDC_CORE Regulator drive strength to Normal, the Bandgap must be enabled. + */ +status_t SPC_SetLowPowerModeDCDCRegulatorDriveStrength(SPC_Type *base, spc_dcdc_drive_strength_t driveStrength); + +/*! + * @brief Get DCDC_CORE Regulator drive strength in Low power mode. + * + * @param base SPC peripheral base address. + * @return DCDC_CORE Regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t. + */ +static inline spc_dcdc_drive_strength_t SPC_GetLowPowerModeDCDCRegulatorDriveStrength(SPC_Type *base) +{ + return (spc_dcdc_drive_strength_t)((uint32_t)((base->LP_CFG & SPC_LP_CFG_DCDC_VDD_DS_MASK) >> + SPC_LP_CFG_DCDC_VDD_DS_SHIFT)); +} + +/*! + * @brief Set DCDC_CORE Regulator voltage level in Low power mode. + * + * @note To change DCDC level in Low-Power mode: + * 1. Configure LP_CFG[DCDC_VDD_LVL] to desired level; + * 2. Configure LP_CFG[DCDC_VDD_DS] to low driver strength; + * 3. Configure ACTIVE_CFG[DCDC_VDD_LVL] to same level programmed in #1. + * + * @note After invoking this function, the voltage level in active mode(wakeup from low power modes) also changed, + * if it is necessary, please invoke SPC_SetActiveModeDCDCRegulatorVoltageLevel() to change to desried voltage level. + * + * @param base SPC peripheral base address. + * @param voltageLevel Specify the DCDC_CORE Regulator voltage level, please refer to @ref spc_dcdc_voltage_level_t. + */ +static inline void SPC_SetLowPowerModeDCDCRegulatorVoltageLevel(SPC_Type *base, spc_dcdc_voltage_level_t voltageLevel) +{ + base->LP_CFG = (base->LP_CFG & (~SPC_LP_CFG_DCDC_VDD_LVL_MASK)) | SPC_LP_CFG_DCDC_VDD_LVL(voltageLevel); + (void)SPC_SetLowPowerModeDCDCRegulatorDriveStrength(base, kSPC_DCDC_LowDriveStrength); + SPC_SetActiveModeDCDCRegulatorVoltageLevel(base, voltageLevel); +} + +/*! + * @brief Get DCDC_CORE Regulator voltage level in Low power mode. + * + * @param base SPC peripheral base address. + * @return DCDC_CORE Regulator voltage level, please refer to @ref spc_dcdc_voltage_level_t. + */ +static inline spc_dcdc_voltage_level_t SPC_GetLowPowerModeDCDCRegulatorVoltageLevel(SPC_Type *base) +{ + return (spc_dcdc_voltage_level_t)((uint32_t)((base->LP_CFG & SPC_LP_CFG_DCDC_VDD_LVL_MASK) >> + SPC_LP_CFG_DCDC_VDD_LVL_SHIFT)); +} + +/*! @} */ +#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @} */ + +#endif /* FSL_SPC_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc.c new file mode 100644 index 00000000000..b94abe1afbc --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc.c @@ -0,0 +1,854 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_trdc.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.trdc1" +#endif + +/* The memory increment definition in byte of MBC and MRC configuration registers */ +#define TRDC_MRC_DOMAIN_INCREMENT 0x100UL +#define TRDC_MBC_DOMAIN_INCREMENT 0x200UL +/* In latest TRDC register definition this macro has been removed from device header file. Add this for backward + * compatability. */ +#ifndef TRDC_MBC_NSE_BLK_CLR_ALL_DID_SEL +#define TRDC_MBC_NSE_BLK_CLR_ALL_DID_SEL(x) ((uint32_t)(((uint32_t)(x)) << TRDC_MBC_NSE_BLK_CLR_ALL_DID_SEL0_SHIFT)) +#endif +/* Get the memory increment in for each slave inside MBC */ +#define TRDC_MBC_SLAVE_INCREMENT(x) \ + (((x) == 0U) ? (0U) : (((x) == 1U) ? (0x140UL) : (((x) == 2U) ? (0x168UL) : (0x190UL)))) + +typedef union +{ +#if defined(FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT) && FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT + trdc_processor_domain_assignment_t _processor_domain_assignment; + trdc_non_processor_domain_assignment_t _non_processor_domain_assignment; + trdc_pid_config_t _pid_config; +#endif +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG + trdc_idau_config_t _idau_config; +#endif +#if (defined(FSL_FEATURE_TRDC_HAS_MBC) && FSL_FEATURE_TRDC_HAS_MBC) || \ + (defined(FSL_FEATURE_TRDC_HAS_MRC) && FSL_FEATURE_TRDC_HAS_MRC) + trdc_memory_access_control_config_t _memory_access_control; +#endif +#if defined(FSL_FEATURE_TRDC_HAS_MBC) && FSL_FEATURE_TRDC_HAS_MBC + trdc_mbc_memory_block_config_t _mbc_memory_blk; + trdc_mbc_nse_update_config_t _mbc_nse_update; +#endif + uint32_t _u32; +} trdc_reg32_convert_t; + +/******************************************************************************* + * Variables + ******************************************************************************/ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +/******************************************************************************* + * Code + ******************************************************************************/ +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG +/*! + * brief Gets the TRDC hardware configuration. + * + * This function gets the TRDC hardware configurations, including number of bus + * masters, number of domains, number of MRCs and number of PACs. + * + * param base TRDC peripheral base address. + * param config Pointer to the structure to get the configuration. + */ +void TRDC_GetHardwareConfig(TRDC_Type *base, trdc_hardware_config_t *config) +{ + assert(NULL != config); + + config->masterNumber = + (uint8_t)((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMSTR_MASK) >> TRDC_TRDC_HWCFG0_NMSTR_SHIFT); + config->domainNumber = + (uint8_t)((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK) >> TRDC_TRDC_HWCFG0_NDID_SHIFT); + config->mbcNumber = + (uint8_t)((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMBC_MASK) >> TRDC_TRDC_HWCFG0_NMBC_SHIFT); + config->mrcNumber = + (uint8_t)((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMRC_MASK) >> TRDC_TRDC_HWCFG0_NMRC_SHIFT); +} +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_MBC) && FSL_FEATURE_TRDC_HAS_MBC +/*! + * brief Gets the hardware configuration of the one of two slave memories within each MBC(memory block checker). + * + * param base TRDC peripheral base address. + * param config Pointer to the structure to get the configuration. + * param mbcIdx MBC number. + * param slvIdx Slave number. + */ +void TRDC_GetMbcHardwareConfig(TRDC_Type *base, + trdc_slave_memory_hardware_config_t *config, + uint8_t mbcIdx, + uint8_t slvIdx) +{ + assert(NULL != config); +#if defined(TRDC_MBC_COUNT) && TRDC_MBC_COUNT + assert(mbcIdx < (uint8_t)TRDC_MBC_COUNT); +#else + assert(mbcIdx < (uint8_t)((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMBC_MASK) >> + TRDC_TRDC_HWCFG0_NMBC_SHIFT)); +#endif + assert(slvIdx < 4U); + + config->blockNum = TRDC_MBC_BASE(base, mbcIdx)->MBC_MEM_GLBCFG[slvIdx] & TRDC_MBC_MEM_GLBCFG_NBLKS_MASK; + config->blockSize = (TRDC_MBC_BASE(base, mbcIdx)->MBC_MEM_GLBCFG[slvIdx] & TRDC_MBC_MEM_GLBCFG_SIZE_LOG2_MASK) >> + TRDC_MBC_MEM_GLBCFG_SIZE_LOG2_SHIFT; +} +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT) && FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT +/*! + * brief Gets the default master domain assignment for the processor bus master. + * + * This function gets the default master domain assignment for the processor bus master. + * It should only be used for the processor bus masters, such as CORE0. This function + * sets the assignment as follows: + * + * code + * assignment->domainId = 0U; + * assignment->domainIdSelect = kTRDC_DidMda; + * assignment->lock = 0U; + * endcode + * + * param domainAssignment Pointer to the assignment structure. + */ +void TRDC_GetDefaultProcessorDomainAssignment(trdc_processor_domain_assignment_t *domainAssignment) +{ + assert(NULL != domainAssignment); + + /* Initializes the configure structure to zero. */ + (void)memset(domainAssignment, 0, sizeof(*domainAssignment)); +} + +/*! + * brief Gets the default master domain assignment for non-processor bus master. + * + * This function gets the default master domain assignment for non-processor bus master. + * It should only be used for the non-processor bus masters, such as DMA. This function + * sets the assignment as follows: + * + * code + * assignment->domainId = 0U; + * assignment->privilegeAttr = kTRDC_ForceUser; + * assignment->secureAttr = kTRDC_ForceSecure; + * assignment->bypassDomainId = 0U; + * assignment->lock = 0U; + * endcode + * + * param domainAssignment Pointer to the assignment structure. + */ +void TRDC_GetDefaultNonProcessorDomainAssignment(trdc_non_processor_domain_assignment_t *domainAssignment) +{ + assert(NULL != domainAssignment); + + /* Initializes the configure structure to zero. */ + (void)memset(domainAssignment, 0, sizeof(*domainAssignment)); +} + +/*! + * brief Sets the processor bus master domain assignment. + * + * This function sets the processor master domain assignment as valid. + * One bus master might have multiple domain assignment registers. The parameter + * \p assignIndex specifies which assignment register to set. + * + * Example: Set domain assignment for core 0. + * + * code + * trdc_processor_domain_assignment_t processorAssignment; + * + * TRDC_GetDefaultProcessorDomainAssignment(&processorAssignment); + * + * processorAssignment.domainId = 0; + * processorAssignment.xxx = xxx; + * TRDC_SetMasterDomainAssignment(TRDC, 1, &processorAssignment); + * endcode + * + * param base TRDC peripheral base address. + * param master Which master to configure, refer to trdcx_master_t in processor header file, x is trdc instance. + * param regNum Which register to configure, processor master can have more than one register for the MDAC + * configuration. param domainAssignment Pointer to the assignment structure. + */ +void TRDC_SetProcessorDomainAssignment(TRDC_Type *base, + uint8_t master, + uint8_t regNum, + const trdc_processor_domain_assignment_t *domainAssignment) +{ + /* Make sure the master number does not exceed the max master count. */ + assert(master < + ((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMSTR_MASK) >> TRDC_TRDC_HWCFG0_NMSTR_SHIFT)); + /* Make sure the master is a processor master. */ + assert(0U == (TRDC_GENERAL_BASE(base)->DACFG[master] & TRDC_DACFG_NCM_MASK)); + assert(NULL != domainAssignment); + assert(domainAssignment->domainId < + ((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK) >> TRDC_TRDC_HWCFG0_NDID_SHIFT)); + + trdc_reg32_convert_t pid; + pid._processor_domain_assignment = *domainAssignment; + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->MDA_DFMT0[master].MDA_W_DFMT0[regNum] = pid._u32 | TRDC_MDA_W_DFMT0_VLD_MASK; +} + +/*! + * brief Sets the non-processor bus master domain assignment. + * + * This function sets the non-processor master domain assignment as valid. + * One bus master might have multiple domain assignment registers. The parameter + * \p assignIndex specifies which assignment register to set. + * + * Example: Set domain assignment for DMA0. + * code + * trdc_non_processor_domain_assignment_t nonProcessorAssignment; + * + * TRDC_GetDefaultNonProcessorDomainAssignment(&nonProcessorAssignment); + * nonProcessorAssignment.domainId = 1; + * nonProcessorAssignment.xxx = xxx; + * + * TRDC_SetMasterDomainAssignment(TRDC, kTrdcMasterDma0, 0U, &nonProcessorAssignment); + * endcode + * + * param base TRDC peripheral base address. + * param master Which master to configure, refer to trdc_master_t in processor header file. + * param domainAssignment Pointer to the assignment structure. + */ +void TRDC_SetNonProcessorDomainAssignment(TRDC_Type *base, + uint8_t master, + const trdc_non_processor_domain_assignment_t *domainAssignment) +{ + /* The master number should be less than the master count. */ + assert(master < + ((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMSTR_MASK) >> TRDC_TRDC_HWCFG0_NMSTR_SHIFT)); + /* Make sure the master is a non-CPU/non-processor master */ + assert(0U != (TRDC_GENERAL_BASE(base)->DACFG[master] & TRDC_DACFG_NCM_MASK)); + assert(NULL != domainAssignment); + assert(domainAssignment->domainId < + ((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK) >> TRDC_TRDC_HWCFG0_NDID_SHIFT)); + + trdc_reg32_convert_t pid; + pid._non_processor_domain_assignment = *domainAssignment; + + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->MDA_DFMT1[master].MDA_W_DFMT1[0] = pid._u32 | TRDC_MDA_W_DFMT1_VLD_MASK; +} + +/*! + * brief Sets the current Process identifier(PID) for processor core. + * + * Each processor has a corresponding process identifier (PID) which can be used to group tasks into different domains. + * Secure privileged software saves and restores the PID as part of any context switch. + * This data structure defines an array of 32-bit values, one per MDA module, that define the PID. Since this register + * resource is only applicable to processor cores, the data structure is typically sparsely populated. The HWCFG[2-3] + * registers provide a bitmap of the implemented PIDn registers. This data structure is indexed using the corresponding + * MDA instance number. Depending on the operating clock domain of each DAC instance, there may be optional information + * stored in the corresponding PIDm register to properly implement the LK2 = 2 functionality. + * + * param base TRDC peripheral base address. + * param master Which processor master to configure, refer to trdc_master_t in processor header file. + * param pidConfig Pointer to the configuration structure. + */ +void TRDC_SetPid(TRDC_Type *base, uint8_t master, const trdc_pid_config_t *pidConfig) +{ + assert(pidConfig != NULL); + /* The master number should be less than the master count. */ + assert(master < + ((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMSTR_MASK) >> TRDC_TRDC_HWCFG0_NMSTR_SHIFT)); + /* This master has to be a processor master. */ + assert((TRDC_GENERAL_BASE(base)->DACFG[master] & TRDC_DACFG_NCM_MASK) == 0U); + + trdc_reg32_convert_t pid; + pid._pid_config = *pidConfig; + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->PID[master] = pid._u32; +} +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG +/*! + * brief Gets the default IDAU(Implementation-Defined Attribution Unit) configuration. + * + * code + * config->lockSecureVTOR = false; + * config->lockNonsecureVTOR = false; + * config->lockSecureMPU = false; + * config->lockNonsecureMPU = false; + * config->lockSAU = false; + * endcode + * + * param domainAssignment Pointer to the configuration structure. + */ +void TRDC_GetDefaultIDAUConfig(trdc_idau_config_t *idauConfiguration) +{ + assert(NULL != idauConfiguration); + + /* Initializes the configure structure to zero. */ + (void)memset(idauConfiguration, 0, sizeof(*idauConfiguration)); +} + +/*! + * brief Sets the IDAU(Implementation-Defined Attribution Unit) control configuration. + * + * Example: Lock the secure and non-secure MPU registers. + * + * code + * trdc_idau_config_t idauConfiguration; + * + * TRDC_GetDefaultIDAUConfig(&idauConfiguration); + * + * idauConfiguration.lockSecureMPU = true; + * idauConfiguration.lockNonsecureMPU = true; + * TRDC_SetIDAU(TRDC, &idauConfiguration); + * endcode + * + * param base TRDC peripheral base address. + * param domainAssignment Pointer to the configuration structure. + */ +void TRDC_SetIDAU(TRDC_Type *base, const trdc_idau_config_t *idauConfiguration) +{ + assert(NULL != idauConfiguration); + + trdc_reg32_convert_t pid; + pid._idau_config = *idauConfiguration; + + TRDC_GENERAL_BASE(base)->TRDC_IDAU_CR = pid._u32 | TRDC_TRDC_IDAU_CR_VLD_MASK; +} +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_FLW) && FSL_FEATURE_TRDC_HAS_FLW +/*! + * brief Gets the default FLW(Flsh Logical Window) configuration. + * + * code + * config->blockCount = false; + * config->arrayBaseAddr = false; + * config->lock = false; + * config->enable = false; + * endcode + * + * param flwConfiguration Pointer to the configuration structure. + */ +void TRDC_GetDefaultFlashLogicalWindowConfig(trdc_flw_config_t *flwConfiguration) +{ + assert(NULL != flwConfiguration); + + /* Initializes the configure structure to zero. */ + (void)memset(flwConfiguration, 0, sizeof(*flwConfiguration)); + + flwConfiguration->enable = 0x1UL; +} + +/*! + * brief Sets the FLW function's configuration. + * + * code + * trdc_flw_config_t flwConfiguration; + * + * TRDC_GetDefaultIDAUConfig(&flwConfiguration); + * + * flwConfiguration.blockCount = 32U; + * flwConfiguration.arrayBaseAddr = 0xXXXXXXXX; + * TRDC_SetIDAU(TRDC, &flwConfiguration); + * endcode + * + * param base TRDC peripheral base address. + * param flwConfiguration Pointer to the configuration structure. + */ +void TRDC_SetFlashLogicalWindow(TRDC_Type *base, const trdc_flw_config_t *flwConfiguration) +{ + assert(NULL != flwConfiguration); + + TRDC_FLW_BASE(base)->TRDC_FLW_ABASE = flwConfiguration->arrayBaseAddr; + TRDC_FLW_BASE(base)->TRDC_FLW_BCNT = flwConfiguration->blockCount; + TRDC_FLW_BASE(base)->TRDC_FLW_CTL = + TRDC_TRDC_FLW_CTL_V(flwConfiguration->enable) | TRDC_TRDC_FLW_CTL_LK(flwConfiguration->lock); +} +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR) && FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR +#if (((__CORTEX_M == 0U) && (defined(__ICCARM__))) || (defined(__XTENSA__))) +/*! + * @brief Count the leading zeros. + * + * Count the leading zeros of an 32-bit data. This function is only defined + * for CM0 and CM0+ for IAR, because other cortex series have the clz instruction, + * KEIL and ARMGCC have toolchain build in function for this purpose. + * + * @param data The data to process. + * @return Count of the leading zeros. + */ +static uint8_t TRDC_CountLeadingZeros(uint32_t data) +{ + uint8_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count++; + mask >>= 1U; + } + + return count; +} +#endif +#endif + +/*! + * brief Initializes the TRDC module. + * + * This function enables the TRDC clock. + * + * param base TRDC peripheral base address. + */ +void TRDC_Init(TRDC_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * brief De-initializes the TRDC module. + * + * This function disables the TRDC clock. + * + * param base TRDC peripheral base address. + */ +void TRDC_Deinit(TRDC_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +#if defined(FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR) && FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR +/*! + * brief Gets and clears the first domain error of the current domain. + * + * This function gets the first access violation information for the current domain + * and clears the pending flag. There might be multiple access violations pending + * for the current domain. This function only processes the first error. + * + * param base TRDC peripheral base address. + * param error Pointer to the error information. + * return If the access violation is captured, this function returns the kStatus_Success. + * The error information can be obtained from the parameter error. If no + * access violation is captured, this function returns the kStatus_NoData. + */ +status_t TRDC_GetAndClearFirstDomainError(TRDC_Type *base, trdc_domain_error_t *error) +{ + return TRDC_GetAndClearFirstSpecificDomainError(base, error, TRDC_GetCurrentMasterDomainId(base)); +} + +/*! + * brief Gets and clears the first domain error of the specific domain. + * + * This function gets the first access violation information for the specific domain + * and clears the pending flag. There might be multiple access violations pending + * for the current domain. This function only processes the first error. + * + * param base TRDC peripheral base address. + * param error Pointer to the error information. + * param domainId The error of which domain to get and clear. + * return If the access violation is captured, this function returns the kStatus_Success. + * The error information can be obtained from the parameter error. If no + * access violation is captured, this function returns the kStatus_NoData. + */ +status_t TRDC_GetAndClearFirstSpecificDomainError(TRDC_Type *base, trdc_domain_error_t *error, uint8_t domainId) +{ + assert(NULL != error); + + status_t status; + uint8_t errorIndex; /* The index of first domain error. */ + uint32_t errorBitMap; /* Domain error location bit map. */ + uint32_t regW1; /* To save TRDC_DERR_W1. */ + + /* Get the error bitmap. */ + errorBitMap = TRDC_DOMAIN_ERROR_BASE(base)->TRDC_DERRLOC[domainId]; + + if (0U == errorBitMap) /* No error captured. */ + { + status = kStatus_NoData; + } + else + { + /* Get the first error controller index. */ +#if (((__CORTEX_M == 0U) && (defined(__ICCARM__))) || (defined(__XTENSA__))) + errorIndex = 31U - TRDC_CountLeadingZeros(errorBitMap); +#else + errorIndex = 31U - __CLZ(errorBitMap); +#endif + + /* Must write TRDC_FDID[TRDC_FDID] with the domain ID before reading the Domain Error registers. */ + TRDC_DOMAIN_ERROR_BASE(base)->TRDC_FDID = TRDC_TRDC_FDID_FDID(domainId); + + /* Initializes the error structure to zero. */ + (void)memset(error, 0, sizeof(*error)); + + if (errorIndex > 15U) + { + /* Error in Memory Region Checker (MRC) */ + errorIndex -= 12U; + error->controller = (trdc_controller_t)errorIndex; + errorIndex -= 4U; + + /* Get the error information. */ + regW1 = TRDC_DOMAIN_ERROR_BASE(base)->MRC_DERR[errorIndex].W1; + error->address = TRDC_DOMAIN_ERROR_BASE(base)->MRC_DERR[errorIndex].W0; + /* Clear error pending. */ + TRDC_DOMAIN_ERROR_BASE(base)->MRC_DERR[errorIndex].W3 = TRDC_W3_RECR(0x01U); + } + else + { + /* Error in Memory Block Controller (MBC) */ + error->slaveMemoryIdx = errorIndex % 4U; + errorIndex /= 4U; + error->controller = (trdc_controller_t)errorIndex; + + /* Check if the MBC error index exceeds the module's max MBC index to avoid overrun access. */ + if (errorIndex >= + ((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMBC_MASK) >> TRDC_TRDC_HWCFG0_NMBC_SHIFT)) + { + return kStatus_Fail; + } + + error->controller = (trdc_controller_t)errorIndex; + + /* Get the error information. */ + regW1 = TRDC_DOMAIN_ERROR_BASE(base)->MBC_DERR[errorIndex].W1; + error->address = TRDC_DOMAIN_ERROR_BASE(base)->MBC_DERR[errorIndex].W0; + /* Clear error pending. */ + TRDC_DOMAIN_ERROR_BASE(base)->MBC_DERR[errorIndex].W3 = TRDC_W3_RECR(0x01U); + } + + uint8_t tempVal = 0U; + error->domainId = (uint8_t)((regW1 & TRDC_W1_EDID_MASK) >> TRDC_W1_EDID_MASK); + tempVal = (uint8_t)((regW1 & TRDC_W1_EATR_MASK) >> TRDC_W1_EATR_SHIFT); + error->errorAttr = (trdc_error_attr_t)tempVal; + tempVal = (uint8_t)((regW1 & TRDC_W1_ERW_MASK) >> TRDC_W1_ERW_SHIFT); + error->errorType = (trdc_error_type_t)tempVal; + error->errorPort = (uint8_t)((regW1 & TRDC_W1_EPORT_MASK) >> TRDC_W1_EPORT_SHIFT); + tempVal = (uint8_t)((regW1 & TRDC_W1_EST_MASK) >> TRDC_W1_EST_SHIFT); + error->errorState = (trdc_error_state_t)tempVal; + + status = kStatus_Success; + } + + return status; +} +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_MRC) && FSL_FEATURE_TRDC_HAS_MRC +/*! + * brief Sets the memory access configuration for one of the access control register of one MRC. + * + * Example: Enable the secure operations and lock the configuration for MRC0 region 1. + * + * code + * trdc_memory_access_control_config_t config; + * + * config.securePrivX = true; + * config.securePrivW = true; + * config.securePrivR = true; + * config.lock = true; + * TRDC_SetMrcMemoryAccess(TRDC, &config, 0, 1); + * endcode + * + * param base TRDC peripheral base address. + * param config Pointer to the configuration structure. + * param mrcIdx MRC index. + * param regIdx Register number. + */ +void TRDC_MrcSetMemoryAccessConfig(TRDC_Type *base, + const trdc_memory_access_control_config_t *config, + uint8_t mrcIdx, + uint8_t regIdx) +{ + assert(NULL != base); + assert(NULL != config); + + trdc_reg32_convert_t pid; + + pid._memory_access_control = *config; + TRDC_MRC_BASE(base, mrcIdx)->MRC_GLBAC[regIdx] = pid._u32; +} + +/*! + * brief Enables the update of the selected domians. + * + * After the domians' update are enabled, their regions' NSE bits can be set or clear. + * + * param base TRDC peripheral base address. + * param mrcIdx MRC index. + * param domianMask Bit mask of the domains to be enabled. + * param enable True to enable, false to disable. + */ +void TRDC_MrcEnableDomainNseUpdate(TRDC_Type *base, uint8_t mrcIdx, uint16_t domianMask, bool enable) +{ + assert(NULL != base); + + if (enable) + { + TRDC_MRC_BASE(base, mrcIdx)->MRC_NSE_RGN_INDIRECT |= ((uint32_t)domianMask << 16U); + } + else + { + TRDC_MRC_BASE(base, mrcIdx)->MRC_NSE_RGN_INDIRECT &= ~((uint32_t)domianMask << 16U); + } +} + +/*! + * brief Sets the NSE bits of the selected regions for domains. + * + * This function sets the NSE bits for the selected regions for the domains whose update are enabled. + * + * param base TRDC peripheral base address. + * param mrcIdx MRC index. + * param regionMask Bit mask of the regions whose NSE bits to set. + */ +void TRDC_MrcRegionNseSet(TRDC_Type *base, uint8_t mrcIdx, uint16_t regionMask) +{ + assert(NULL != base); + + TRDC_MRC_BASE(base, mrcIdx)->MRC_NSE_RGN_SET = ((uint32_t)regionMask); +} + +/*! + * brief Clears the NSE bits of the selected regions for domains. + * + * This function clears the NSE bits for the selected regions for the domains whose update are enabled. + * + * param base TRDC peripheral base address. + * param mrcIdx MRC index. + * param regionMask Bit mask of the regions whose NSE bits to clear. + */ +void TRDC_MrcRegionNseClear(TRDC_Type *base, uint8_t mrcIdx, uint16_t regionMask) +{ + assert(NULL != base); + + TRDC_MRC_BASE(base, mrcIdx)->MRC_NSE_RGN_CLR = ((uint32_t)regionMask); +} + +/*! + * brief Clears the NSE bits for all the regions of the selected domains. + * + * This function clears the NSE bits for all regions of selected domains whose update are enabled. + * + * param base TRDC peripheral base address. + * param mrcIdx MRC index. + * param domainMask Bit mask of the domians whose NSE bits to clear. + */ +void TRDC_MrcDomainNseClear(TRDC_Type *base, uint8_t mrcIdx, uint16_t domainMask) +{ + assert(NULL != base); + + uint8_t domainCount = + (uint8_t)((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK) >> TRDC_TRDC_HWCFG0_NDID_SHIFT); + uint8_t maxDomainId = 0U; + uint16_t tmpDomainMask = domainMask; + + while (tmpDomainMask != 0U) + { + tmpDomainMask >>= 1U; + maxDomainId++; + } + + /* Check whether the domain mask contains invalid domain. */ + if (maxDomainId > domainCount) + { + assert(false); + } + + TRDC_MRC_BASE(base, mrcIdx)->MRC_NSE_RGN_CLR_ALL = ((uint32_t)domainMask << 16U); +} + +/*! + * brief Sets the configuration for one of the region descriptor per domain per MRC instnce. + * + * This function sets the configuration for one of the region descriptor, including the start + * and end address of the region, memory access control policy and valid. + * + * param base TRDC peripheral base address. + * param config Pointer to region descriptor configuration structure. + */ +void TRDC_MrcSetRegionDescriptorConfig(TRDC_Type *base, const trdc_mrc_region_descriptor_config_t *config) +{ + assert(NULL != base); + + uint32_t regAddr = (uint32_t) & (TRDC_MRC_BASE(base, config->mrcIdx)->MRC_DOM0_RGD_W[config->regionIdx][0]); + + regAddr += TRDC_MRC_DOMAIN_INCREMENT * config->domainIdx; + + /* Set configuration for word 0 */ + uint32_t data = TRDC_MRC_DOM0_RGD_W_MRACSEL(config->memoryAccessControlSelect) | + ((config->startAddr) & ~(TRDC_MRC_DOM0_RGD_W_MRACSEL_MASK)); + *(uint32_t *)regAddr = data; + + /* Set configuration for word 1 */ + regAddr += 4U; + data = TRDC_MRC_DOM0_RGD_W_VLD(config->valid) | TRDC_MRC_DOM0_RGD_W_NSE(config->nseEnable) | + ((config->endAddr) & ~(TRDC_MRC_DOM0_RGD_W_VLD_MASK | TRDC_MRC_DOM0_RGD_W_NSE_MASK)); + *(uint32_t *)regAddr = data; +} +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_MBC) && FSL_FEATURE_TRDC_HAS_MBC +/*! + * brief Sets the NSR update configuration for one of the MBC instance. + * + * After set the NSE configuration, the configured memory area can be updateby NSE set/clear. + * + * param base TRDC peripheral base address. + * param config Pointer to NSE update configuration structure. + * param mbcIdx MBC index. + */ +void TRDC_MbcSetNseUpdateConfig(TRDC_Type *base, const trdc_mbc_nse_update_config_t *config, uint8_t mbcIdx) +{ + assert(base != NULL); + + trdc_reg32_convert_t pid; + + pid._mbc_nse_update = *config; + TRDC_MBC_BASE(base, mbcIdx)->MBC_NSE_BLK_INDEX = pid._u32; +} + +/*! + * brief Sets the NSE bits of the selected configuration words according to NSE update configuration. + * + * This function sets the NSE bits of the word for the configured regio, memory. + * + * param base TRDC peripheral base address. + * param mbcIdx MBC index. + * param bitMask Mask of the bits whose NSE bits to set. + */ +void TRDC_MbcWordNseSet(TRDC_Type *base, uint8_t mbcIdx, uint32_t bitMask) +{ + assert(NULL != base); + + TRDC_MBC_BASE(base, mbcIdx)->MBC_NSE_BLK_SET = ((uint32_t)bitMask); +} + +/*! + * brief Clears the NSE bits of the selected configuration words according to NSE update configuration. + * + * This function sets the NSE bits of the word for the configured regio, memory. + * + * param base TRDC peripheral base address. + * param mbcIdx MBC index. + * param bitMask Mask of the bits whose NSE bits to clear. + */ +void TRDC_MbcWordNseClear(TRDC_Type *base, uint8_t mbcIdx, uint32_t bitMask) +{ + assert(NULL != base); + + TRDC_MBC_BASE(base, mbcIdx)->MBC_NSE_BLK_CLR = ((uint32_t)bitMask); +} + +/*! + * brief Clears all configuration words' NSE bits of the selected domain and memory. + * + * param base TRDC peripheral base address. + * param mbcIdx MBC index. + * param domainMask Mask of the domains whose NSE bits to clear, 0b110 means clear domain 1&2. + * param slaveMask Mask of the slaves whose NSE bits to clear, 0x11 means clear all slave 0&1's NSE bits. + */ +void TRDC_MbcNseClearAll(TRDC_Type *base, uint8_t mbcIdx, uint16_t domainMask, uint8_t slave) +{ + assert(NULL != base); + +#if defined(FSL_FEATURE_TRDC_DOMAIN_COUNT) && FSL_FEATURE_TRDC_DOMAIN_COUNT + uint8_t dmainCount = FSL_FEATURE_TRDC_DOMAIN_COUNT; +#else + uint8_t dmainCount = + (uint8_t)((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK) >> TRDC_TRDC_HWCFG0_NDID_SHIFT); +#endif + uint8_t maxDomainId = 0U; + uint16_t tmpDomainMask = domainMask; + + while (tmpDomainMask != 0U) + { + tmpDomainMask >>= 1U; + maxDomainId++; + } + + if (maxDomainId > dmainCount) + { + assert(false); + } + + TRDC_MBC_BASE(base, mbcIdx)->MBC_NSE_BLK_CLR_ALL = + TRDC_MBC_NSE_BLK_CLR_ALL_DID_SEL(domainMask) | TRDC_MBC_NSE_BLK_CLR_ALL_MEMSEL(slave); +} + +/*! + * brief Sets the memory access configuration for one of the region descriptor of one MBC. + * + * Example: Enable the secure operations and lock the configuration for MRC0 region 1. + * + * code + * trdc_memory_access_control_config_t config; + * + * config.securePrivX = true; + * config.securePrivW = true; + * config.securePrivR = true; + * config.lock = true; + * TRDC_SetMbcMemoryAccess(TRDC, &config, 0, 1); + * endcode + * + * param base TRDC peripheral base address. + * param config Pointer to the configuration structure. + * param mbcIdx MBC index. + * param rgdIdx Region descriptor number. + */ +void TRDC_MbcSetMemoryAccessConfig(TRDC_Type *base, + const trdc_memory_access_control_config_t *config, + uint8_t mbcIdx, + uint8_t rgdIdx) +{ + assert(NULL != base); + assert(NULL != config); + + trdc_reg32_convert_t pid; + + pid._memory_access_control = *config; + TRDC_MBC_BASE(base, mbcIdx)->MBC_MEMN_GLBAC[rgdIdx] = pid._u32; +} + +/*! + * brief Sets the configuration for one of the memory block per domain per MBC instnce. + * + * This function sets the configuration for one of the memory block, including the memory access + * control policy and nse enable. + * + * param base TRDC peripheral base address. + * param config Pointer to memory block configuration structure. + */ +void TRDC_MbcSetMemoryBlockConfig(TRDC_Type *base, const trdc_mbc_memory_block_config_t *config) +{ + assert(NULL != base); + + uint32_t shift = 4UL * (config->memoryBlockIdx % 8UL); + uint32_t regAddr = (uint32_t) & (TRDC_MBC_BASE(base, config->mbcIdx)->MBC_DOM0_MEM0_BLK_CFG_W[0]); + uint32_t configWord = 0U; + trdc_reg32_convert_t pid; + + pid._mbc_memory_blk = *config; + configWord = (pid._u32 & 0xFU) << shift; + + regAddr += (TRDC_MBC_DOMAIN_INCREMENT * config->domainIdx + TRDC_MBC_SLAVE_INCREMENT(config->slaveMemoryIdx)) + + ((uint32_t)config->memoryBlockIdx / 8U) * sizeof(uint32_t); + configWord = configWord | (*(uint32_t *)regAddr & ~(0xFUL << shift)); + *(uint32_t *)regAddr = configWord; +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc.h new file mode 100644 index 00000000000..68d29530882 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc.h @@ -0,0 +1,1131 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_TRDC_H_ +#define FSL_TRDC_H_ + +#include "fsl_common.h" +#include "fsl_trdc_core.h" + +/*! + * @addtogroup trdc + * @{ + */ + +/****************************************************************************** + * Definitions + *****************************************************************************/ +#define FSL_TRDC_DRIVER_VERSION (MAKE_VERSION(2, 2, 1)) + +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG +/* Hardware configuration definitions */ +/*! + * @brief TRDC hardware configuration. + */ +typedef struct _trdc_hardware_config +{ + uint8_t masterNumber; /*!< Number of bus masters. */ + uint8_t domainNumber; /*!< Number of domains. */ + uint8_t mbcNumber; /*!< Number of MBCs. */ + uint8_t mrcNumber; /*!< Number of MRCs. */ +} trdc_hardware_config_t; +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_MBC) && FSL_FEATURE_TRDC_HAS_MBC +/*! + * @brief Hardware configuration of the two slave memories within each MBC(memory block checker). + */ +typedef struct _trdc_slave_memory_hardware_config +{ + uint32_t blockNum; /*!< Number of blocks. */ + uint32_t blockSize; /*!< Block size. */ +} trdc_slave_memory_hardware_config_t; +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT) && FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT +/* Master domain assignment definitions */ +/*! + * @brief TRDC domain ID select method, the register bit TRDC_MDA_W0_0_DFMT0[DIDS], used for + * domain hit evaluation. + */ +typedef enum _trdc_did_sel +{ + kTRDC_DidMda, /*!< Use MDAn[2:0] as DID. */ + kTRDC_DidInput, /*!< Use the input DID (DID_in) as DID. */ + kTRDC_DidMdaAndInput, /*!< Use MDAn[2] concatenated with DID_in[1:0] as DID. */ + kTRDC_DidReserved /*!< Reserved. */ +} trdc_did_sel_t; + +/*! + * @brief TRDC secure attribute, the register bit TRDC_MDA_W0_0_DFMT0[SA], used for + * bus master domain assignment. + */ +typedef enum _trdc_secure_attr +{ + kTRDC_ForceSecure, /*!< Force the bus attribute for this master to secure. */ + kTRDC_ForceNonSecure, /*!< Force the bus attribute for this master to non-secure. */ + kTRDC_MasterSecure, /*!< Use the bus master's secure/nonsecure attribute directly. */ + kTRDC_MasterSecure1, /*!< Use the bus master's secure/nonsecure attribute directly. */ +} trdc_secure_attr_t; + +/*! + * @brief The configuration of domain hit evaluation of PID. + */ +typedef enum _trdc_pid_domain_hit_config +{ + kTRDC_pidDomainHitNone0, /*!< No PID is included in the domain hit evaluation. */ + kTRDC_pidDomainHitNone1, /*!< No PID is included in the domain hit evaluation. */ + kTRDC_pidDomainHitInclusive, /*!< The PID is included in the domain hit evaluation when (PID & ~PIDM). */ + kTRDC_pidDomainHitExclusive, /*!< The PID is included in the domain hit evaluation when ~(PID & ~PIDM). */ +} trdc_pid_domain_hit_config_t; + +/*! + * @brief Domain assignment for the processor bus master. + */ +typedef struct _trdc_processor_domain_assignment +{ + uint32_t domainId : 4U; /*!< Domain ID. */ + uint32_t domainIdSelect : 2U; /*!< Domain ID select method, see @ref trdc_did_sel_t. */ + uint32_t pidDomainHitConfig : 2U; /*!< The configuration of the domain hit evaluation for PID, see @ref + trdc_pid_domain_hit_config_t. */ + uint32_t pidMask : 6U; /*!< The mask combined with PID, so multiple PID can be included as part of the domain hit + determination. Set to 0 to disable. */ + uint32_t secureAttr : 2U; /*!< Secure attribute, see @ref trdc_secure_attr_t. */ + uint32_t pid : 6U; /*!< The process identifier, combined with pidMask to form the domain hit determination. */ + uint32_t : 8U; /*!< Reserved. */ + uint32_t lock : 1U; /*!< Lock the register. */ + uint32_t : 1U; /*!< Reserved. */ +} trdc_processor_domain_assignment_t; + +/*! + * @brief TRDC privileged attribute, the register bit TRDC_MDA_W0_x_DFMT1[PA], used for non-processor + * bus master domain assignment. + */ +typedef enum _trdc_privilege_attr +{ + kTRDC_ForceUser, /*!< Force the bus attribute for this master to user. */ + kTRDC_ForcePrivilege, /*!< Force the bus attribute for this master to privileged. */ + kTRDC_MasterPrivilege, /*!< Use the bus master's attribute directly. */ + kTRDC_MasterPrivilege1, /*!< Use the bus master's attribute directly. */ +} trdc_privilege_attr_t; + +/*! + * @brief Domain assignment for the non-processor bus master. + */ +typedef struct _trdc_non_processor_domain_assignment +{ + uint32_t domainId : 4U; /*!< Domain ID. */ + uint32_t privilegeAttr : 2U; /*!< Privileged attribute, see @ref trdc_privilege_attr_t. */ + uint32_t secureAttr : 2U; /*!< Secure attribute, see @ref trdc_secure_attr_t. */ + uint32_t bypassDomainId : 1U; /*!< Bypass domain ID. */ + uint32_t : 21U; /*!< Reserved. */ + uint32_t lock : 1U; /*!< Lock the register. */ + uint32_t : 1U; /*!< Reserved. */ +} trdc_non_processor_domain_assignment_t; + +/*! + * @brief PID lock configuration. + */ +typedef enum _trdc_pid_lock +{ + kTRDC_PidUnlocked0, /*!< The PID value can be updated by any secure priviledged write. */ + kTRDC_PidUnlocked1, /*!< The PID value can be updated by any secure priviledged write. */ + kTRDC_PidUnlocked2, /*!< The PID value can be updated by any secure priviledged write from the bus master that first + configured this register. */ + kTRDC_PidLocked, /*!< The PID value is locked until next reset. */ +} trdc_pid_lock_t; + +/*! + * @brief Process identifier(PID) configuration for processor cores. + */ +typedef struct _trdc_pid_config +{ + uint32_t pid : 6U; /*!< The process identifier of the executing task. The highest bit can be used to define + secure/nonsecure attribute of the task. */ + uint32_t : 23U; /*!< Reserved. */ + uint32_t lock : 2U; /*!< How to lock the register, see @ref trdc_pid_lock_t. */ + uint32_t : 1U; /*!< Reserved. */ +} trdc_pid_config_t; +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG +/* TZ-M congiguration definitions */ +/*! + * @brief IDAU(Implementation-Defined Attribution Unit) configuration for TZ-M function control. + */ +typedef struct _trdc_idau_config +{ + uint32_t : 8U; /*!< Reserved. */ + uint32_t lockSecureVTOR : 1U; /*!< Disable writes to secure VTOR(Vector Table Offset Register). */ + uint32_t lockNonsecureVTOR : 1U; /*!< Disable writes to non-secure VTOR, Application interrupt and Reset Control + Registers. */ + uint32_t lockSecureMPU : 1U; /*!< Disable writes to secure MPU(Memory Protection Unit) from software or from a debug + agent connected to the processor in Secure state. */ + uint32_t lockNonsecureMPU : 1U; /*!< Disable writes to non-secure MPU(Memory Protection Unit) from software or from + a debug agent connected to the processor. */ + uint32_t lockSAU : 1U; /*!< Disable writes to SAU(Security Attribution Unit) registers. */ + uint32_t : 19U; /*!< Reserved. */ +} trdc_idau_config_t; + +/* FLW(Flash Logical Window) configuration definitions */ +/*! + * @brief FLW(Flash Logical Window) configuration. + */ +typedef struct _trdc_flw_config +{ + uint16_t blockCount; /*!< Block count of the Flash Logic Window in 32KByte blocks. */ + uint32_t arrayBaseAddr; /*!< Flash array base address of the Flash Logical Window. */ + bool lock; /*!< Disable writes to FLW registers. */ + bool enable; /*!< Enable FLW function. */ +} trdc_flw_config_t; +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR) && FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR +/* Domain error check and clear definitions */ +/*! + * @brief TRDC controller definition for domain error check. Each TRDC instance may have different + * MRC or MBC count, call TRDC_GetHardwareConfig to get the actual count. + */ +typedef enum _trdc_controller +{ + kTRDC_MemBlockController0 = 0U, /*!< Memory block checker 0. */ + kTRDC_MemBlockController1 = 1U, /*!< Memory block checker 1. */ + kTRDC_MemBlockController2 = 2U, /*!< Memory block checker 2. */ + kTRDC_MemBlockController3 = 3U, /*!< Memory block checker 3. */ + kTRDC_MemRegionChecker0 = 4U, /*!< Memory region checker 0. */ + kTRDC_MemRegionChecker1 = 5U, /*!< Memory region checker 1. */ + kTRDC_MemRegionChecker2 = 6U, /*!< Memory region checker 2. */ + kTRDC_MemRegionChecker3 = 7U, /*!< Memory region checker 3. */ + kTRDC_MemRegionChecker4 = 8U, /*!< Memory region checker 4. */ + kTRDC_MemRegionChecker5 = 9U, /*!< Memory region checker 5. */ + kTRDC_MemRegionChecker6 = 10U, /*!< Memory region checker 6. */ +} trdc_controller_t; + +/*! + * @brief TRDC domain error state definition TRDC_MBCn_DERR_W1[EST] or TRDC_MRCn_DERR_W1[EST]. + */ +typedef enum _trdc_error_state +{ + kTRDC_ErrorStateNone = 0x00U, /*!< No access violation detected. */ + kTRDC_ErrorStateNone1 = 0x01U, /*!< No access violation detected. */ + kTRDC_ErrorStateSingle = 0x02U, /*!< Single access violation detected. */ + kTRDC_ErrorStateMulti = 0x03U /*!< Multiple access violation detected. */ +} trdc_error_state_t; + +/*! + * @brief TRDC domain error attribute definition TRDC_MBCn_DERR_W1[EATR] or TRDC_MRCn_DERR_W1[EATR]. + */ +typedef enum _trdc_error_attr +{ + kTRDC_ErrorSecureUserInst = 0x00U, /*!< Secure user mode, instruction fetch access. */ + kTRDC_ErrorSecureUserData = 0x01U, /*!< Secure user mode, data access. */ + kTRDC_ErrorSecurePrivilegeInst = 0x02U, /*!< Secure privileged mode, instruction fetch access. */ + kTRDC_ErrorSecurePrivilegeData = 0x03U, /*!< Secure privileged mode, data access. */ + kTRDC_ErrorNonSecureUserInst = 0x04U, /*!< NonSecure user mode, instruction fetch access. */ + kTRDC_ErrorNonSecureUserData = 0x05U, /*!< NonSecure user mode, data access. */ + kTRDC_ErrorNonSecurePrivilegeInst = 0x06U, /*!< NonSecure privileged mode, instruction fetch access. */ + kTRDC_ErrorNonSecurePrivilegeData = 0x07U /*!< NonSecure privileged mode, data access. */ +} trdc_error_attr_t; + +/*! + * @brief TRDC domain error access type definition TRDC_DERR_W1_n[ERW]. + */ +typedef enum _trdc_error_type +{ + kTRDC_ErrorTypeRead = 0x00U, /*!< Error occurs on read reference. */ + kTRDC_ErrorTypeWrite = 0x01U /*!< Error occurs on write reference. */ +} trdc_error_type_t; + +/*! + * @brief TRDC domain error definition. + */ +typedef struct _trdc_domain_error +{ + trdc_controller_t controller; /*!< Which controller captured access violation. */ + uint32_t address; /*!< Access address that generated access violation. */ + trdc_error_state_t errorState; /*!< Error state. */ + trdc_error_attr_t errorAttr; /*!< Error attribute. */ + trdc_error_type_t errorType; /*!< Error type. */ + uint8_t errorPort; /*!< Error port. */ + uint8_t domainId; /*!< Domain ID. */ + uint8_t slaveMemoryIdx; /*!< The slave memory index. Only apply when violation in MBC. */ +} trdc_domain_error_t; +#endif + +#if (defined(FSL_FEATURE_TRDC_HAS_MBC) && FSL_FEATURE_TRDC_HAS_MBC) || \ + (defined(FSL_FEATURE_TRDC_HAS_MRC) && FSL_FEATURE_TRDC_HAS_MRC) +/* Common definitions for MBC/MRC configuration */ +/*! + * @brief Memory access control configuration for MBC/MRC. + */ +typedef struct _trdc_memory_access_control_config +{ + uint32_t nonsecureUsrX : 1U; /*!< Allow nonsecure user execute access. */ + uint32_t nonsecureUsrW : 1U; /*!< Allow nonsecure user write access. */ + uint32_t nonsecureUsrR : 1U; /*!< Allow nonsecure user read access. */ + uint32_t : 1U; /*!< Reserved. */ + uint32_t nonsecurePrivX : 1U; /*!< Allow nonsecure privilege execute access. */ + uint32_t nonsecurePrivW : 1U; /*!< Allow nonsecure privilege write access. */ + uint32_t nonsecurePrivR : 1U; /*!< Allow nonsecure privilege read access. */ + uint32_t : 1U; /*!< Reserved. */ + uint32_t secureUsrX : 1U; /*!< Allow secure user execute access. */ + uint32_t secureUsrW : 1U; /*!< Allow secure user write access. */ + uint32_t secureUsrR : 1U; /*!< Allow secure user read access. */ + uint32_t : 1U; /*!< Reserved. */ + uint32_t securePrivX : 1U; /*!< Allownsecure privilege execute access. */ + uint32_t securePrivW : 1U; /*!< Allownsecure privilege write access. */ + uint32_t securePrivR : 1U; /*!< Allownsecure privilege read access. */ + uint32_t : 16U; /*!< Reserved. */ + uint32_t lock : 1U; /*!< Lock the configuration until next reset, only apply to access control register 0. */ +} trdc_memory_access_control_config_t; +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_MRC) && FSL_FEATURE_TRDC_HAS_MRC +/*! @brief The region descriptor enumeration, used to form a mask to set/clear the NSE bits for one or several regions. + */ +enum _trdc_region_descriptor +{ + kTRDC_RegionDescriptor0 = (1U << 0U), /*!< Region descriptor 0. */ + kTRDC_RegionDescriptor1 = (1U << 1U), /*!< Region descriptor 1. */ + kTRDC_RegionDescriptor2 = (1U << 2U), /*!< Region descriptor 2. */ + kTRDC_RegionDescriptor3 = (1U << 3U), /*!< Region descriptor 3. */ + kTRDC_RegionDescriptor4 = (1U << 4U), /*!< Region descriptor 4. */ + kTRDC_RegionDescriptor5 = (1U << 5U), /*!< Region descriptor 5. */ + kTRDC_RegionDescriptor6 = (1U << 6U), /*!< Region descriptor 6. */ + kTRDC_RegionDescriptor7 = (1U << 7U), /*!< Region descriptor 7. */ + kTRDC_RegionDescriptor8 = (1U << 8U), /*!< Region descriptor 8. */ + kTRDC_RegionDescriptor9 = (1U << 9U), /*!< Region descriptor 9. */ + kTRDC_RegionDescriptor10 = (1U << 10U), /*!< Region descriptor 10. */ + kTRDC_RegionDescriptor11 = (1U << 11U), /*!< Region descriptor 11. */ + kTRDC_RegionDescriptor12 = (1U << 12U), /*!< Region descriptor 12. */ + kTRDC_RegionDescriptor13 = (1U << 13U), /*!< Region descriptor 13. */ + kTRDC_RegionDescriptor14 = (1U << 14U), /*!< Region descriptor 14. */ + kTRDC_RegionDescriptor15 = (1U << 15U), /*!< Region descriptor 15. */ +}; + +/* MRC configuration definitions */ +/*! @brief The MRC domain enumeration, used to form a mask to enable/disable the update or clear all NSE bits of one or + * several domains. */ +enum _trdc_MRC_domain +{ + kTRDC_MrcDomain0 = (1U << 0U), /*!< Domain 0. */ + kTRDC_MrcDomain1 = (1U << 1U), /*!< Domain 1. */ + kTRDC_MrcDomain2 = (1U << 2U), /*!< Domain 2. */ + kTRDC_MrcDomain3 = (1U << 3U), /*!< Domain 3. */ + kTRDC_MrcDomain4 = (1U << 4U), /*!< Domain 4. */ + kTRDC_MrcDomain5 = (1U << 5U), /*!< Domain 5. */ + kTRDC_MrcDomain6 = (1U << 6U), /*!< Domain 6. */ + kTRDC_MrcDomain7 = (1U << 7U), /*!< Domain 7. */ + kTRDC_MrcDomain8 = (1U << 8U), /*!< Domain 8. */ + kTRDC_MrcDomain9 = (1U << 9U), /*!< Domain 9. */ + kTRDC_MrcDomain10 = (1U << 10U), /*!< Domain 10. */ + kTRDC_MrcDomain11 = (1U << 11U), /*!< Domain 11. */ + kTRDC_MrcDomain12 = (1U << 12U), /*!< Domain 12. */ + kTRDC_MrcDomain13 = (1U << 13U), /*!< Domain 13. */ + kTRDC_MrcDomain14 = (1U << 14U), /*!< Domain 14. */ + kTRDC_MrcDomain15 = (1U << 15U), /*!< Domain 15. */ +}; + +/*! + * @brief The configuration of each region descriptor per domain per MRC instance. + */ +typedef struct _trdc_mrc_region_descriptor_config +{ + uint8_t memoryAccessControlSelect; /*!< Select one of the 8 access control policies for this region, for + access cotrol policies see @ref trdc_memory_access_control_config_t. */ + uint32_t startAddr; /*!< Physical start address. */ + bool valid; /*!< Lock the register. */ + bool nseEnable; /*!< Enable non-secure accesses and disable secure accesses. */ + uint32_t endAddr; /*!< Physical start address. */ + uint8_t mrcIdx; /*!< The index of the MRC for this configuration to take effect. */ + uint8_t domainIdx; /*!< The index of the domain for this configuration to take effect. */ + uint8_t regionIdx; /*!< The index of the region for this configuration to take effect. */ +} trdc_mrc_region_descriptor_config_t; +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_MBC) && FSL_FEATURE_TRDC_HAS_MBC +/* MBC configuration definitions */ +/*! + * @brief The configuration of MBC NSE update. + */ +#if defined(FSL_FEATURE_TRDC_DOMAIN_COUNT) && (FSL_FEATURE_TRDC_DOMAIN_COUNT > 0x8U) +typedef struct _trdc_mbc_nse_update_config +{ + uint32_t autoIncrement : 1U; /*!< Whether to increment the word index after current word is updated using this + configuration. */ + uint32_t : 1U; /*!< Reserved. */ + uint32_t wordIdx : 4U; /*!< MBC configuration word index to be updated. */ + uint32_t : 2U; /*!< Reserved. */ + uint32_t memorySelect : 4U; /*!< Bit mask of the selected memory to be updated. @ref _trdc_MBC_memory. */ + uint32_t : 4U; /*!< Reserved. */ + uint32_t domianSelect : 16U; /*!< Bit mask of the selected domain to be updated. @ref _trdc_MBC_domain. */ +} trdc_mbc_nse_update_config_t; +#else +typedef struct _trdc_mbc_nse_update_config +{ + uint32_t : 2U; /*!< Reserved. */ + uint32_t wordIdx : 4U; /*!< MBC configuration word index to be updated. */ + uint32_t : 2U; /*!< Reserved. */ + uint32_t memorySelect : 4U; /*!< Bit mask of the selected memory to be updated. @ref _trdc_MBC_memory. */ + uint32_t : 4U; /*!< Reserved. */ + uint32_t domianSelect : 8U; /*!< Bit mask of the selected domain to be updated. @ref _trdc_MBC_domain. */ + uint32_t : 7U; /*!< Reserved. */ + uint32_t autoIncrement : 1U; /*!< Whether to increment the word index after current word is updated using this + configuration. */ +} trdc_mbc_nse_update_config_t; +#endif + +/*! @brief The MBC domain enumeration, used to form a mask to enable/disable the update or clear NSE bits of one or + * several domains. */ +enum _trdc_MBC_domain +{ + kTRDC_MbcDomain0 = (1U << 0U), /*!< Domain 0. */ + kTRDC_MbcDomain1 = (1U << 1U), /*!< Domain 1. */ + kTRDC_MbcDomain2 = (1U << 2U), /*!< Domain 2. */ + kTRDC_MbcDomain3 = (1U << 3U), /*!< Domain 3. */ + kTRDC_MbcDomain4 = (1U << 4U), /*!< Domain 4. */ + kTRDC_MbcDomain5 = (1U << 5U), /*!< Domain 5. */ + kTRDC_MbcDomain6 = (1U << 6U), /*!< Domain 6. */ + kTRDC_MbcDomain7 = (1U << 7U), /*!< Domain 7. */ +}; + +/*! @brief The MBC slave memory enumeration, used to form a mask to enable/disable the update or clear NSE bits of one + * or several memory block. */ +enum _trdc_MBC_memory +{ + kTRDC_MbcSlaveMemory0 = (1U << 0U), /*!< Memory 0. */ + kTRDC_MbcSlaveMemory1 = (1U << 1U), /*!< Memory 1. */ + kTRDC_MbcSlaveMemory2 = (1U << 2U), /*!< Memory 2. */ + kTRDC_MbcSlaveMemory3 = (1U << 3U), /*!< Memory 3. */ +}; + +/*! @brief The MBC bit enumeration, used to form a mask to set/clear configured words' NSE. */ +enum _trdc_MBC_bit +{ + kTRDC_MbcBit0 = (1U << 0U), /*!< Bit 0. */ + kTRDC_MbcBit1 = (1U << 1U), /*!< Bit 1. */ + kTRDC_MbcBit2 = (1U << 2U), /*!< Bit 2. */ + kTRDC_MbcBit3 = (1U << 3U), /*!< Bit 3. */ + kTRDC_MbcBit4 = (1U << 4U), /*!< Bit 4. */ + kTRDC_MbcBit5 = (1U << 5U), /*!< Bit 5. */ + kTRDC_MbcBit6 = (1U << 6U), /*!< Bit 6. */ + kTRDC_MbcBit7 = (1U << 7U), /*!< Bit 7. */ + kTRDC_MbcBit8 = (1U << 8U), /*!< Bit 8. */ + kTRDC_MbcBit9 = (1U << 9U), /*!< Bit 9. */ + kTRDC_MbcBit10 = (1U << 10U), /*!< Bit 10. */ + kTRDC_MbcBit11 = (1U << 11U), /*!< Bit 11. */ + kTRDC_MbcBit12 = (1U << 12U), /*!< Bit 12. */ + kTRDC_MbcBit13 = (1U << 13U), /*!< Bit 13. */ + kTRDC_MbcBit14 = (1U << 14U), /*!< Bit 14. */ + kTRDC_MbcBit15 = (1U << 15U), /*!< Bit 15. */ + kTRDC_MbcBit16 = (1U << 16U), /*!< Bit 16. */ + kTRDC_MbcBit17 = (1U << 17U), /*!< Bit 17. */ + kTRDC_MbcBit18 = (1U << 18U), /*!< Bit 18. */ + kTRDC_MbcBit19 = (1U << 19U), /*!< Bit 19. */ + kTRDC_MbcBit20 = (1U << 20U), /*!< Bit 20. */ + kTRDC_MbcBit21 = (1U << 21U), /*!< Bit 21. */ + kTRDC_MbcBit22 = (1U << 22U), /*!< Bit 22. */ + kTRDC_MbcBit23 = (1U << 23U), /*!< Bit 23. */ + kTRDC_MbcBit24 = (1U << 24U), /*!< Bit 24. */ + kTRDC_MbcBit25 = (1U << 25U), /*!< Bit 25. */ + kTRDC_MbcBit26 = (1U << 26U), /*!< Bit 26. */ + kTRDC_MbcBit27 = (1U << 27U), /*!< Bit 27. */ + kTRDC_MbcBit28 = (1U << 28U), /*!< Bit 28. */ + kTRDC_MbcBit29 = (1U << 29U), /*!< Bit 29. */ + kTRDC_MbcBit30 = (1U << 30U), /*!< Bit 30. */ + kTRDC_MbcBit31 = (1U << 31U), /*!< Bit 31. */ +}; + +/*! + * @brief The configuration of each memory block per domain per MBC instance. + */ +typedef struct _trdc_mbc_memory_block_config +{ + uint32_t memoryAccessControlSelect : 3U; /*!< Select one of the 8 access control policies for this memory block, for + access cotrol policies see @ref trdc_memory_access_control_config_t. */ + uint32_t nseEnable : 1U; /*!< Enable non-secure accesses and disable secure accesses. */ + uint32_t mbcIdx : 4U; /*!< The index of the MBC for this configuration to take effect. */ + uint32_t domainIdx : 8U; /*!< The index of the domain for this configuration to take effect. */ + uint32_t slaveMemoryIdx : 8U; /*!< The index of the slave memory for this configuration to take effect. */ + uint32_t memoryBlockIdx : 8U; /*!< The index of the memory block for this configuration to take effect. */ +} trdc_mbc_memory_block_config_t; +#endif + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name Initialization and deinitialization + * @{ + */ +/*! + * @brief Initializes the TRDC module. + * + * This function enables the TRDC clock. + * + * @param base TRDC peripheral base address. + */ +void TRDC_Init(TRDC_Type *base); + +/*! + * @brief De-initializes the TRDC module. + * + * This function disables the TRDC clock. + * + * @param base TRDC peripheral base address. + */ +void TRDC_Deinit(TRDC_Type *base); +/*! @} */ + +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG +/*! + * @name Hardware configuration + * @{ + */ +/*! + * @brief Gets the domain ID of the current bus master. + * + * @param base TRDC peripheral base address. + * @return Domain ID of current bus master. + */ +static inline uint8_t TRDC_GetCurrentMasterDomainId(TRDC_Type *base) +{ + return (uint8_t)((TRDC_GENERAL_BASE(base)->TRDC_HWCFG1 & TRDC_TRDC_HWCFG1_DID_MASK) >> TRDC_TRDC_HWCFG1_DID_SHIFT); +} + +/*! + * @brief Gets the TRDC hardware configuration. + * + * This function gets the TRDC hardware configurations, including number of bus + * masters, number of domains, number of MRCs and number of PACs. + * + * @param base TRDC peripheral base address. + * @param config Pointer to the structure to get the configuration. + */ +void TRDC_GetHardwareConfig(TRDC_Type *base, trdc_hardware_config_t *config); +/*! @} */ +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT) && FSL_FEATURE_TRDC_HAS_DOMAIN_ASSIGNMENT +/*! + * @name Master domain assignment + * @{ + */ +/*! + * @brief Sets the TRDC DAC(Domain Assignment Controllers) global valid. + * + * Once enabled, it will remain enabled until next reset. + * + * @param base TRDC peripheral base address. + */ +static inline void TRDC_SetDacGlobalValid(TRDC_Type *base) +{ + TRDC_GENERAL_BASE(base)->TRDC_CR |= TRDC_TRDC_CR_GVLDM_MASK; +} + +/*! + * @brief Locks the bus master domain assignment register. + * + * This function locks the master domain assignment. After it is locked, the register can't be changed + * until next reset. + * + * @param base TRDC peripheral base address. + * @param master Which master to configure, refer to trdcx_master_t in processor header file, x is trdc instance. + * @param regNum Which register to configure, processor master can have more than one register for the MDAC + configuration. + * @param assignIndex Which assignment register to lock. + */ +static inline void TRDC_LockMasterDomainAssignment(TRDC_Type *base, uint8_t master, uint8_t regNum) +{ + /* Make sure in the master range. */ + assert((uint32_t)master < + ((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMSTR_MASK) >> TRDC_TRDC_HWCFG0_NMSTR_SHIFT)); + if (0U == (TRDC_GENERAL_BASE(base)->DACFG[master] & TRDC_DACFG_NCM_MASK)) + { + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->MDA_DFMT0[master].MDA_W_DFMT0[regNum] |= TRDC_MDA_W_DFMT0_LK1_MASK; + } + else + { + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->MDA_DFMT1[master].MDA_W_DFMT1[0] |= TRDC_MDA_W_DFMT1_LK1_MASK; + } +} + +/*! + * @brief Sets the master domain assignment as valid or invalid. + * + * This function sets the master domain assignment as valid or invalid. + * + * @param base TRDC peripheral base address. + * @param master Which master to configure. + * @param regNum Which register to configure, processor master can have more than one register for the MDAC + * configuration. + * @param assignIndex Index for the domain assignment register. + * @param valid True to set valid, false to set invalid. + */ +static inline void TRDC_SetMasterDomainAssignmentValid(TRDC_Type *base, uint8_t master, uint8_t regNum, bool valid) +{ + /* Make sure in the master range. */ + assert((uint32_t)master < + ((TRDC_GENERAL_BASE(base)->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMSTR_MASK) >> TRDC_TRDC_HWCFG0_NMSTR_SHIFT)); + if (valid) + { + if (0U == (TRDC_GENERAL_BASE(base)->DACFG[master] & TRDC_DACFG_NCM_MASK)) + { + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->MDA_DFMT0[master].MDA_W_DFMT0[regNum] |= TRDC_MDA_W_DFMT0_VLD_MASK; + } + else + { + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->MDA_DFMT1[master].MDA_W_DFMT1[0] |= TRDC_MDA_W_DFMT1_VLD_MASK; + } + } + else + { + if (0U == (TRDC_GENERAL_BASE(base)->DACFG[master] & TRDC_DACFG_NCM_MASK)) + { + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->MDA_DFMT0[master].MDA_W_DFMT0[regNum] &= ~TRDC_MDA_W_DFMT0_VLD_MASK; + } + else + { + TRDC_DOMAIN_ASSIGNMENT_BASE(base)->MDA_DFMT1[master].MDA_W_DFMT1[0] &= ~TRDC_MDA_W_DFMT1_VLD_MASK; + } + } +} + +/*! + * @brief Gets the default master domain assignment for the processor bus master. + * + * This function gets the default master domain assignment for the processor bus master. + * It should only be used for the processor bus masters, such as CORE0. This function + * sets the assignment as follows: + * + * @code + * assignment->domainId = 0U; + * assignment->domainIdSelect = kTRDC_DidMda; + * assignment->lock = 0U; + * @endcode + * + * @param domainAssignment Pointer to the assignment structure. + */ +void TRDC_GetDefaultProcessorDomainAssignment(trdc_processor_domain_assignment_t *domainAssignment); + +/*! + * @brief Gets the default master domain assignment for non-processor bus master. + * + * This function gets the default master domain assignment for non-processor bus master. + * It should only be used for the non-processor bus masters, such as DMA. This function + * sets the assignment as follows: + * + * @code + * assignment->domainId = 0U; + * assignment->privilegeAttr = kTRDC_ForceUser; + * assignment->secureAttr = kTRDC_ForceSecure; + * assignment->bypassDomainId = 0U; + * assignment->lock = 0U; + * @endcode + * + * @param domainAssignment Pointer to the assignment structure. + */ +void TRDC_GetDefaultNonProcessorDomainAssignment(trdc_non_processor_domain_assignment_t *domainAssignment); + +/*! + * @brief Sets the processor bus master domain assignment. + * + * This function sets the processor master domain assignment as valid. + * One bus master might have multiple domain assignment registers. The parameter + * \p assignIndex specifies which assignment register to set. + * + * Example: Set domain assignment for core 0. + * + * @code + * trdc_processor_domain_assignment_t processorAssignment; + * + * TRDC_GetDefaultProcessorDomainAssignment(&processorAssignment); + * + * processorAssignment.domainId = 0; + * processorAssignment.xxx = xxx; + * TRDC_SetMasterDomainAssignment(TRDC, &processorAssignment); + * @endcode + * + * @param base TRDC peripheral base address. + * @param master Which master to configure, refer to trdc_master_t in processor header file. + * @param regNum Which register to configure, processor master can have more than one register for the MDAC + * configuration. + * @param domainAssignment Pointer to the assignment structure. + */ +void TRDC_SetProcessorDomainAssignment(TRDC_Type *base, + uint8_t master, + uint8_t regNum, + const trdc_processor_domain_assignment_t *domainAssignment); + +/*! + * @brief Sets the non-processor bus master domain assignment. + * + * This function sets the non-processor master domain assignment as valid. + * One bus master might have multiple domain assignment registers. The parameter + * \p assignIndex specifies which assignment register to set. + * + * Example: Set domain assignment for DMA0. + * @code + * trdc_non_processor_domain_assignment_t nonProcessorAssignment; + * + * TRDC_GetDefaultNonProcessorDomainAssignment(&nonProcessorAssignment); + * nonProcessorAssignment.domainId = 1; + * nonProcessorAssignment.xxx = xxx; + * + * TRDC_SetMasterDomainAssignment(TRDC, kTrdcMasterDma0, 0U, &nonProcessorAssignment); + * @endcode + * + * @param base TRDC peripheral base address. + * @param master Which master to configure, refer to trdc_master_t in processor header file. + * @param domainAssignment Pointer to the assignment structure. + */ +void TRDC_SetNonProcessorDomainAssignment(TRDC_Type *base, + uint8_t master, + const trdc_non_processor_domain_assignment_t *domainAssignment); + +/*! + * @brief Gets the bit map of the bus master(s) that is(are) sourcing a PID register. + * + * This function sets the non-processor master domain assignment as valid. + * + * @param base TRDC peripheral base address. + * @return the bit map of the master(s). Bit 1 sets indicates bus master 1. + */ +static inline uint64_t TRDC_GetActiveMasterPidMap(TRDC_Type *base) +{ + return ((uint64_t)TRDC_GENERAL_BASE(base)->TRDC_HWCFG3 << 32U) | (uint64_t)TRDC_GENERAL_BASE(base)->TRDC_HWCFG2; +} + +/*! + * @brief Sets the current Process identifier(PID) for processor core. + * + * Each processor has a corresponding process identifier (PID) which can be used to group tasks into different domains. + * Secure privileged software saves and restores the PID as part of any context switch. + * This data structure defines an array of 32-bit values, one per MDA module, that define the PID. Since this register + * resource is only applicable to processor cores, the data structure is typically sparsely populated. The HWCFG[2-3] + * registers provide a bitmap of the implemented PIDn registers. This data structure is indexed using the corresponding + * MDA instance number. Depending on the operating clock domain of each DAC instance, there may be optional information + * stored in the corresponding PIDm register to properly implement the LK2 = 2 functionality. + * + * @param base TRDC peripheral base address. + * @param master Which processor master to configure, refer to trdc_master_t in processor header file. + * @param pidConfig Pointer to the configuration structure. + */ +void TRDC_SetPid(TRDC_Type *base, uint8_t master, const trdc_pid_config_t *pidConfig); +/*! @} */ +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG +/*! + * @name TZ-M congiguration + * @{ + */ +/*! + * @brief Gets the default IDAU(Implementation-Defined Attribution Unit) configuration. + * + * @code + * config->lockSecureVTOR = false; + * config->lockNonsecureVTOR = false; + * config->lockSecureMPU = false; + * config->lockNonsecureMPU = false; + * config->lockSAU = false; + * @endcode + * + * @param domainAssignment Pointer to the configuration structure. + */ +void TRDC_GetDefaultIDAUConfig(trdc_idau_config_t *idauConfiguration); + +/*! + * @brief Sets the IDAU(Implementation-Defined Attribution Unit) control configuration. + * + * Example: Lock the secure and non-secure MPU registers. + * + * @code + * trdc_idau_config_t idauConfiguration; + * + * TRDC_GetDefaultIDAUConfig(&idauConfiguration); + * + * idauConfiguration.lockSecureMPU = true; + * idauConfiguration.lockNonsecureMPU = true; + * TRDC_SetIDAU(TRDC, &idauConfiguration); + * @endcode + * + * @param base TRDC peripheral base address. + * @param domainAssignment Pointer to the configuration structure. + */ +void TRDC_SetIDAU(TRDC_Type *base, const trdc_idau_config_t *idauConfiguration); +/*! @} */ +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_FLW) && FSL_FEATURE_TRDC_HAS_FLW +/*! + * @name FLW(Flash Logical Window) configuration + * @{ + */ +/*! + * @brief Enables/disables the FLW(flash logical window) function. + * + * @param base TRDC peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void TRDC_EnableFlashLogicalWindow(TRDC_Type *base, bool enable) +{ + if (enable) + { + TRDC_FLW_BASE(base)->TRDC_FLW_CTL |= TRDC_TRDC_FLW_CTL_V_MASK; + } + else + { + TRDC_FLW_BASE(base)->TRDC_FLW_CTL &= ~TRDC_TRDC_FLW_CTL_V_MASK; + } +} + +/*! + * @brief Locks FLW registers. Once locked the registers can noy be updated until next reset. + * + * @param base TRDC peripheral base address. + */ +static inline void TRDC_LockFlashLogicalWindow(TRDC_Type *base) +{ + TRDC_FLW_BASE(base)->TRDC_FLW_CTL |= TRDC_TRDC_FLW_CTL_LK_MASK; +} + +/*! + * @brief Gets the FLW physical base address. + * + * @param base TRDC peripheral base address. + * @return Physical address of the FLW function. + */ +static inline uint32_t TRDC_GetFlashLogicalWindowPbase(TRDC_Type *base) +{ + return TRDC_FLW_BASE(base)->TRDC_FLW_PBASE; +} + +/*! + * @brief Sets the FLW size. + * + * @param base TRDC peripheral base address. + * @param size Size of the FLW in unit of 32k bytes. + */ +static inline void TRDC_GetSetFlashLogicalWindowSize(TRDC_Type *base, uint16_t size) +{ + TRDC_FLW_BASE(base)->TRDC_FLW_BCNT = size; +} + +/*! + * @brief Gets the default FLW(Flsh Logical Window) configuration. + * + * @code + * config->blockCount = false; + * config->arrayBaseAddr = false; + * config->lock = false; + * config->enable = false; + * @endcode + * + * @param flwConfiguration Pointer to the configuration structure. + */ +void TRDC_GetDefaultFlashLogicalWindowConfig(trdc_flw_config_t *flwConfiguration); + +/*! + * @brief Sets the FLW function's configuration. + * + * @code + * trdc_flw_config_t flwConfiguration; + * + * TRDC_GetDefaultIDAUConfig(&flwConfiguration); + * + * flwConfiguration.blockCount = 32U; + * flwConfiguration.arrayBaseAddr = 0xXXXXXXXX; + * TRDC_SetIDAU(TRDC, &flwConfiguration); + * @endcode + * + * @param base TRDC peripheral base address. + * @param flwConfiguration Pointer to the configuration structure. + */ +void TRDC_SetFlashLogicalWindow(TRDC_Type *base, const trdc_flw_config_t *flwConfiguration); +/*! @} */ +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR) && FSL_FEATURE_TRDC_HAS_DOMAIN_ERROR +/*! + * @name Domain error check and clear + * @{ + */ +/*! + * @brief Gets and clears the first domain error of the current domain. + * + * This function gets the first access violation information for the current domain + * and clears the pending flag. There might be multiple access violations pending + * for the current domain. This function only processes the first error. + * + * @param base TRDC peripheral base address. + * @param error Pointer to the error information. + * @return If the access violation is captured, this function returns the kStatus_Success. + * The error information can be obtained from the parameter error. If no + * access violation is captured, this function returns the kStatus_NoData. + */ +status_t TRDC_GetAndClearFirstDomainError(TRDC_Type *base, trdc_domain_error_t *error); + +/*! + * @brief Gets and clears the first domain error of the specific domain. + * + * This function gets the first access violation information for the specific domain + * and clears the pending flag. There might be multiple access violations pending + * for the current domain. This function only processes the first error. + * + * @param base TRDC peripheral base address. + * @param error Pointer to the error information. + * @param domainId The error of which domain to get and clear. + * @return If the access violation is captured, this function returns the kStatus_Success. + * The error information can be obtained from the parameter error. If no + * access violation is captured, this function returns the kStatus_NoData. + */ +status_t TRDC_GetAndClearFirstSpecificDomainError(TRDC_Type *base, trdc_domain_error_t *error, uint8_t domainId); +/*! @} */ +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_MRC) && FSL_FEATURE_TRDC_HAS_MRC +/*! + * @name MRC configuration + * @{ + */ +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG +/*! + * @brief Sets the TRDC MRC(Memory Region Checkers) global valid. + * + * Once enabled, it will remain enabled until next reset. + * + * @param base TRDC peripheral base address. + */ +static inline void TRDC_SetMrcGlobalValid(TRDC_Type *base) +{ + TRDC_GENERAL_BASE(base)->TRDC_CR |= TRDC_TRDC_CR_GVLDR_MASK; +} +#endif + +/*! + * @brief Gets the TRDC MRC(Memory Region Checkers) region number valid. + * + * @param base TRDC peripheral base address. + * @return the region number of the given MRC instance + */ +static inline uint8_t TRDC_GetMrcRegionNumber(TRDC_Type *base, uint8_t mrcIdx) +{ + return (uint8_t)((TRDC_MRC_BASE(base, mrcIdx)->MRC_GLBCFG & TRDC_MRC_GLBCFG_NRGNS_MASK) >> + TRDC_MRC_GLBCFG_NRGNS_SHIFT); +} + +/*! + * @brief Sets the memory access configuration for one of the access control register of one MRC. + * + * Example: Enable the secure operations and lock the configuration for MRC0 region 1. + * + * @code + * trdc_memory_access_control_config_t config; + * + * config.securePrivX = true; + * config.securePrivW = true; + * config.securePrivR = true; + * config.lock = true; + * TRDC_SetMrcMemoryAccess(TRDC, &config, 0, 1); + * @endcode + * + * @param base TRDC peripheral base address. + * @param config Pointer to the configuration structure. + * @param mrcIdx MRC index. + * @param regIdx Register number. + */ +void TRDC_MrcSetMemoryAccessConfig(TRDC_Type *base, + const trdc_memory_access_control_config_t *config, + uint8_t mrcIdx, + uint8_t regIdx); + +/*! + * @brief Enables the update of the selected domians. + * + * After the domians' update are enabled, their regions' NSE bits can be set or clear. + * + * @param base TRDC peripheral base address. + * @param mrcIdx MRC index. + * @param domianMask Bit mask of the domains to be enabled. + * @param enable True to enable, false to disable. + */ +void TRDC_MrcEnableDomainNseUpdate(TRDC_Type *base, uint8_t mrcIdx, uint16_t domianMask, bool enable); + +/*! + * @brief Sets the NSE bits of the selected regions for domains. + * + * This function sets the NSE bits for the selected regions for the domains whose update are enabled. + * + * @param base TRDC peripheral base address. + * @param mrcIdx MRC index. + * @param regionMask Bit mask of the regions whose NSE bits to set. + */ +void TRDC_MrcRegionNseSet(TRDC_Type *base, uint8_t mrcIdx, uint16_t regionMask); + +/*! + * @brief Clears the NSE bits of the selected regions for domains. + * + * This function clears the NSE bits for the selected regions for the domains whose update are enabled. + * + * @param base TRDC peripheral base address. + * @param mrcIdx MRC index. + * @param regionMask Bit mask of the regions whose NSE bits to clear. + */ +void TRDC_MrcRegionNseClear(TRDC_Type *base, uint8_t mrcIdx, uint16_t regionMask); + +/*! + * @brief Clears the NSE bits for all the regions of the selected domains. + * + * This function clears the NSE bits for all regions of selected domains whose update are enabled. + * + * @param base TRDC peripheral base address. + * @param mrcIdx MRC index. + * @param domainMask Bit mask of the domians whose NSE bits to clear. + */ +void TRDC_MrcDomainNseClear(TRDC_Type *base, uint8_t mrcIdx, uint16_t domainMask); + +/*! + * @brief Sets the configuration for one of the region descriptor per domain per MRC instnce. + * + * This function sets the configuration for one of the region descriptor, including the start + * and end address of the region, memory access control policy and valid. + * + * @param base TRDC peripheral base address. + * @param config Pointer to region descriptor configuration structure. + */ +void TRDC_MrcSetRegionDescriptorConfig(TRDC_Type *base, const trdc_mrc_region_descriptor_config_t *config); +/*! @} */ +#endif + +#if defined(FSL_FEATURE_TRDC_HAS_MBC) && FSL_FEATURE_TRDC_HAS_MBC +/*! + * @name MBC configuration + * @{ + */ +#if defined(FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG) && FSL_FEATURE_TRDC_HAS_GENERAL_CONFIG +/*! + * @brief Sets the TRDC MBC(Memory Block Checkers) global valid. + * + * Once enabled, it will remain enabled until next reset. + * + * @param base TRDC peripheral base address. + */ +static inline void TRDC_SetMbcGlobalValid(TRDC_Type *base) +{ + TRDC_GENERAL_BASE(base)->TRDC_CR |= TRDC_TRDC_CR_GVLDB_MASK; +} +#endif + +/*! + * @brief Gets the hardware configuration of the one of two slave memories within each MBC(memory block checker). + * + * @param base TRDC peripheral base address. + * @param config Pointer to the structure to get the configuration. + * @param mbcIdx MBC number. + * @param slvIdx Slave number. + */ +void TRDC_GetMbcHardwareConfig(TRDC_Type *base, + trdc_slave_memory_hardware_config_t *config, + uint8_t mbcIdx, + uint8_t slvIdx); + +/*! + * @brief Sets the NSR update configuration for one of the MBC instance. + * + * After set the NSE configuration, the configured memory area can be updateby NSE set/clear. + * + * @param base TRDC peripheral base address. + * @param config Pointer to NSE update configuration structure. + * @param mbcIdx MBC index. + */ +void TRDC_MbcSetNseUpdateConfig(TRDC_Type *base, const trdc_mbc_nse_update_config_t *config, uint8_t mbcIdx); + +/*! + * @brief Sets the NSE bits of the selected configuration words according to NSE update configuration. + * + * This function sets the NSE bits of the word for the configured regio, memory. + * + * @param base TRDC peripheral base address. + * @param mbcIdx MBC index. + * @param bitMask Mask of the bits whose NSE bits to set. + */ +void TRDC_MbcWordNseSet(TRDC_Type *base, uint8_t mbcIdx, uint32_t bitMask); + +/*! + * @brief Clears the NSE bits of the selected configuration words according to NSE update configuration. + * + * This function sets the NSE bits of the word for the configured regio, memory. + * + * @param base TRDC peripheral base address. + * @param mbcIdx MBC index. + * @param bitMask Mask of the bits whose NSE bits to clear. + */ +void TRDC_MbcWordNseClear(TRDC_Type *base, uint8_t mbcIdx, uint32_t bitMask); + +/*! + * @brief Clears all configuration words' NSE bits of the selected domain and memory. + * + * @param base TRDC peripheral base address. + * @param mbcIdx MBC index. + * @param domainMask Mask of the domains whose NSE bits to clear, 0b110 means clear domain 1&2. + * @param slaveMask Mask of the slaves whose NSE bits to clear, 0x11 means clear all slave 0&1's NSE bits. + */ +void TRDC_MbcNseClearAll(TRDC_Type *base, uint8_t mbcIdx, uint16_t domainMask, uint8_t slave); + +/*! + * @brief Sets the memory access configuration for one of the region descriptor of one MBC. + * + * Example: Enable the secure operations and lock the configuration for MRC0 region 1. + * + * @code + * trdc_memory_access_control_config_t config; + * + * config.securePrivX = true; + * config.securePrivW = true; + * config.securePrivR = true; + * config.lock = true; + * TRDC_SetMbcMemoryAccess(TRDC, &config, 0, 1); + * @endcode + * + * @param base TRDC peripheral base address. + * @param config Pointer to the configuration structure. + * @param mbcIdx MBC index. + * @param rgdIdx Region descriptor number. + */ +void TRDC_MbcSetMemoryAccessConfig(TRDC_Type *base, + const trdc_memory_access_control_config_t *config, + uint8_t mbcIdx, + uint8_t rgdIdx); + +/*! + * @brief Sets the configuration for one of the memory block per domain per MBC instnce. + * + * This function sets the configuration for one of the memory block, including the memory access + * control policy and nse enable. + * + * @param base TRDC peripheral base address. + * @param config Pointer to memory block configuration structure. + */ +void TRDC_MbcSetMemoryBlockConfig(TRDC_Type *base, const trdc_mbc_memory_block_config_t *config); +/*! @} */ +#endif + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ + +#endif /* FSL_TRDC_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc_core.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc_core.h new file mode 100644 index 00000000000..8c3e2a9b508 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc_core.h @@ -0,0 +1,489 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_TRDC_CORE_H_ +#define FSL_TRDC_CORE_H_ + +#include "fsl_trdc_soc.h" + +/*! + * @addtogroup trdc_core + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*!@brief TRDC general configuration register definition. */ +typedef struct _TRDC_General_Type +{ + __IO uint32_t TRDC_CR; /**< TRDC Register, offset: 0x0 */ + uint8_t RESERVED_0[236]; + __I uint32_t TRDC_HWCFG0; /**< TRDC Hardware Configuration Register 0, offset: 0xF0 */ + __I uint32_t TRDC_HWCFG1; /**< TRDC Hardware Configuration Register 1, offset: 0xF4 */ + __I uint32_t TRDC_HWCFG2; /**< TRDC Hardware Configuration Register 2, offset: 0xF8 */ + __I uint32_t TRDC_HWCFG3; /**< TRDC Hardware Configuration Register 3, offset: 0xFC */ + __I uint8_t DACFG[8]; /**< Domain Assignment Configuration Register, array offset: 0x100, array step: 0x1 */ + uint8_t RESERVED_1[184]; + __IO uint32_t TRDC_IDAU_CR; /**< TRDC IDAU Control Register, offset: 0x1C0 */ +} TRDC_General_Type; + +/*!@brief TRDC flash logical control register definition. */ +typedef struct _TRDC_FLW_Type +{ + __IO uint32_t TRDC_FLW_CTL; /**< TRDC FLW Control, offset: 0x1E0 */ + __I uint32_t TRDC_FLW_PBASE; /**< TRDC FLW Physical Base, offset: 0x1E4 */ + __IO uint32_t TRDC_FLW_ABASE; /**< TRDC FLW Array Base, offset: 0x1E8 */ + __IO uint32_t TRDC_FLW_BCNT; /**< TRDC FLW Block Count, offset: 0x1EC */ +} TRDC_FLW_Type; + +/*!@brief TRDC domain error register definition. */ +typedef struct _TRDC_DomainError_Type +{ + __IO uint32_t TRDC_FDID; /**< TRDC Fault Domain ID, offset: 0x1FC */ + __I uint32_t TRDC_DERRLOC[16]; /**< TRDC Domain Error Location Register, array offset: 0x200, array step: 0x4 */ + uint8_t RESERVED_4[448]; + struct + { /* offset: 0x400, array step: 0x10 */ + __I uint32_t W0; /**< MBC Domain Error Word0 Register, array offset: 0x400, array step: 0x10 */ + __I uint32_t W1; /**< MBC Domain Error Word1 Register, array offset: 0x404, array step: 0x10 */ + uint8_t RESERVED_0[4]; + __O uint32_t W3; /**< MBC Domain Error Word3 Register, array offset: 0x40C, array step: 0x10 */ + } MBC_DERR[8]; + struct + { /* offset: 0x480, array step: 0x10 */ + __I uint32_t W0; /**< MRC Domain Error Word0 Register, array offset: 0x480, array step: 0x10 */ + __I uint32_t W1; /**< MRC Domain Error Word1 Register, array offset: 0x484, array step: 0x10 */ + uint8_t RESERVED_0[4]; + __O uint32_t W3; /**< MRC Domain Error Word3 Register, array offset: 0x48C, array step: 0x10 */ + } MRC_DERR[8]; +} TRDC_DomainError_Type; + +/*!@brief TRDC master domain assignment register definition. */ +typedef struct _TRDC_DomainAssignment_Type +{ + __IO uint32_t PID[8]; /**< Process Identifier, array offset: 0x700, array step: 0x4 */ + uint8_t RESERVED_7[224]; + union + { + struct + { /* offset: 0x800, array step: 0x20 */ + __IO uint32_t MDA_W_DFMT0[8]; /**< DAC Master Domain Assignment Register, array offset: 0x800, array step: + index*0x20, index2*0x4 */ + } MDA_DFMT0[8]; + struct + { /* offset: 0x800, array step: 0x20 */ + __IO uint32_t MDA_W_DFMT1[1]; /**< DAC Master Domain Assignment Register, array offset: 0x800, array step: + index*0x20, index2*0x4 */ + uint8_t RESERVED_0[28]; + } MDA_DFMT1[8]; + }; +} TRDC_DomainAssignment_Type; + +/*!@brief TRDC MBC control register definition. */ +typedef struct _TRDC_MBC_Type +{ + __I uint32_t MBC_MEM_GLBCFG[4]; /**< MBC Global Configuration Register, array offset: 0x10000, array step: + index*0x2000, index2*0x4 */ + __IO uint32_t MBC_NSE_BLK_INDEX; /**< MBC NonSecure Enable Block Index, array offset: 0x10010, array step: 0x2000 */ + __O uint32_t MBC_NSE_BLK_SET; /**< MBC NonSecure Enable Block Set, array offset: 0x10014, array step: 0x2000 */ + __O uint32_t MBC_NSE_BLK_CLR; /**< MBC NonSecure Enable Block Clear, array offset: 0x10018, array step: 0x2000 */ + __O uint32_t + MBC_NSE_BLK_CLR_ALL; /**< MBC NonSecure Enable Block Clear All, array offset: 0x1001C, array step: 0x2000 */ + __IO uint32_t MBC_MEMN_GLBAC[8]; /**< MBC Global Access Control, array offset: 0x10020, array step: index*0x2000, + index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x10040, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10140, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10180, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x101A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x101A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x101C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x101D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM0_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x101F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_0[72]; + __IO uint32_t MBC_DOM1_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x10240, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM1_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10340, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM1_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10380, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM1_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x103A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM1_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x103A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM1_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x103C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM1_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x103D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM1_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x103F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_1[72]; + __IO uint32_t MBC_DOM2_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x10440, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM2_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10540, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM2_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10580, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM2_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x105A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM2_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x105A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM2_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x105C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM2_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x105D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM2_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x105F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_2[72]; + __IO uint32_t MBC_DOM3_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x10640, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM3_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10740, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM3_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10780, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM3_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x107A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM3_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x107A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM3_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x107C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM3_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x107D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM3_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x107F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_3[72]; + __IO uint32_t MBC_DOM4_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x10840, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM4_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10940, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM4_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10980, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM4_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x109A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM4_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x109A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM4_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x109C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM4_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x109D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM4_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x109F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_4[72]; + __IO uint32_t MBC_DOM5_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x10A40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM5_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10B40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM5_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10B80, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM5_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10BA0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM5_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10BA8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM5_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10BC8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM5_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10BD0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM5_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10BF0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_5[72]; + __IO uint32_t MBC_DOM6_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x10C40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM6_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10D40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM6_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10D80, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM6_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10DA0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM6_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10DA8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM6_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10DC8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM6_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10DD0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM6_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10DF0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_7[72]; + __IO uint32_t MBC_DOM7_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x10E40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM7_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10F40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM7_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10F80, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM7_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10FA0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM7_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10FA8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM7_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10FC8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM7_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x10FD0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM7_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x10FF0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_8[72]; + __IO uint32_t MBC_DOM8_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x11040, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM8_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11140, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM8_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11180, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM8_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x111A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM8_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x111A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM8_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x111C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM8_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x111D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM8_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x111F0, array + step: index*0x2000, index2*0x4 */ + + __IO uint32_t MBC_DOM9_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x11240, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM9_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11340, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM9_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11380, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM9_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x113A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM9_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x113A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM9_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x113C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM9_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x113D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM9_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x113F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_9[72]; + __IO uint32_t MBC_DOM10_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x11440, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM10_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11540, + array step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM10_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11580, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM10_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x115A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM10_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x115A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM10_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x115C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM10_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x115D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM10_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x115F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_10[72]; + __IO uint32_t MBC_DOM11_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x11640, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM11_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11740, + array step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM11_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11780, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM11_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x117A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM11_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x117A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM11_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x117C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM11_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x117D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM11_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x117F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_11[72]; + __IO uint32_t MBC_DOM12_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x11840, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM12_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11940, + array step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM12_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11980, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM12_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x119A0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM12_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x119A8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM12_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x119C8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM12_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x119D0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM12_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x119F0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_12[72]; + __IO uint32_t MBC_DOM13_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x11A40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM13_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11B40, + array step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM13_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11B80, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM13_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11BA0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM13_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11BA8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM13_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11BC8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM13_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11BD0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM13_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11BF0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_13[72]; + __IO uint32_t MBC_DOM14_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x11C40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM14_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11D40, + array step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM14_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11D80, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM14_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11DA0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM14_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11DA8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM14_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11DC8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM14_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11DD0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM14_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11DF0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_14[72]; + __IO uint32_t MBC_DOM15_MEM0_BLK_CFG_W[64]; /**< MBC Memory Block Configuration Word, array offset: 0x11E40, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM15_MEM0_BLK_NSE_W[16]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11F40, + array step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM15_MEM1_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11F80, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM15_MEM1_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11FA0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM15_MEM2_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11FA8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM15_MEM2_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11FC8, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM15_MEM3_BLK_CFG_W[8]; /**< MBC Memory Block Configuration Word, array offset: 0x11FD0, array + step: index*0x2000, index2*0x4 */ + __IO uint32_t MBC_DOM15_MEM3_BLK_NSE_W[2]; /**< MBC Memory Block NonSecure Enable Word, array offset: 0x11FF0, array + step: index*0x2000, index2*0x4 */ + uint8_t RESERVED_15[8]; +} TRDC_MBC_Type; + +/*!@brief TRDC MRC control register definition. MRC_DOM0_RGD_W[region][word] */ +typedef struct _TRDC_MRC_Type +{ + __I uint32_t MRC_GLBCFG; /**< MRC Global Configuration Register, array offset: 0x14000, array step: 0x1000 */ + uint8_t RESERVED_0[12]; + __IO uint32_t + MRC_NSE_RGN_INDIRECT; /**< MRC NonSecure Enable Region Indirect, array offset: 0x14010, array step: 0x1000 */ + __O uint32_t MRC_NSE_RGN_SET; /**< MRC NonSecure Enable Region Set, array offset: 0x14014, array step: 0x1000 */ + __O uint32_t MRC_NSE_RGN_CLR; /**< MRC NonSecure Enable Region Clear, array offset: 0x14018, array step: 0x1000 */ + __O uint32_t + MRC_NSE_RGN_CLR_ALL; /**< MRC NonSecure Enable Region Clear All, array offset: 0x1401C, array step: 0x1000 */ + __IO uint32_t + MRC_GLBAC[8]; /**< MRC Global Access Control, array offset: 0x14020, array step: index*0x1000, index2*0x4 */ + __IO uint32_t MRC_DOM0_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14040, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM0_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x140C0, array step: 0x1000 */ + uint8_t RESERVED_1[124]; + __IO uint32_t MRC_DOM1_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14140, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM1_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x141C0, array step: 0x1000 */ + uint8_t RESERVED_2[124]; + __IO uint32_t MRC_DOM2_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14240, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM2_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x142C0, array step: 0x1000 */ + uint8_t RESERVED_3[124]; + __IO uint32_t MRC_DOM3_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14340, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM3_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x143C0, array step: 0x1000 */ + uint8_t RESERVED_4[124]; + __IO uint32_t MRC_DOM4_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14440, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM4_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x144C0, array step: 0x1000 */ + uint8_t RESERVED_5[124]; + __IO uint32_t MRC_DOM5_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14540, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM5_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x145C0, array step: 0x1000 */ + uint8_t RESERVED_6[124]; + __IO uint32_t MRC_DOM6_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14640, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM6_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x146C0, array step: 0x1000 */ + uint8_t RESERVED_7[124]; + __IO uint32_t MRC_DOM7_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14740, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM7_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x147C0, array step: 0x1000 */ + uint8_t RESERVED_8[124]; + __IO uint32_t MRC_DOM8_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14840, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM8_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x148C0, array step: 0x1000 */ + uint8_t RESERVED_9[124]; + __IO uint32_t MRC_DOM9_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14940, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM9_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x149C0, array step: 0x1000 */ + uint8_t RESERVED_10[124]; + __IO uint32_t MRC_DOM10_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14A40, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM10_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x14AC0, array step: 0x1000 */ + uint8_t RESERVED_11[124]; + __IO uint32_t MRC_DOM11_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14B40, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM11_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x14BC0, array step: 0x1000 */ + uint8_t RESERVED_12[124]; + __IO uint32_t MRC_DOM12_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14C40, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM12_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x14CC0, array step: 0x1000 */ + uint8_t RESERVED_13[124]; + __IO uint32_t MRC_DOM13_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14D40, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM13_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x14DC0, array step: 0x1000 */ + uint8_t RESERVED_14[124]; + __IO uint32_t MRC_DOM14_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14E40, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM14_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x14EC0, array step: 0x1000 */ + uint8_t RESERVED_15[124]; + __IO uint32_t MRC_DOM15_RGD_W[16][2]; /**< MRC Region Descriptor Word 0..MRC Region Descriptor Word 1, array offset: + 0x14F40, array step: index*0x1000, index2*0x8, index3*0x4 */ + __IO uint32_t + MRC_DOM15_RGD_NSE; /**< MRC Region Descriptor NonSecure Enable, array offset: 0x14FC0, array step: 0x1000 */ +} TRDC_MRC_Type; + +/*!@brief TRDC base address convert macro */ +#define TRDC_GENERAL_BASE(base) ((TRDC_General_Type *)((base))) +#define TRDC_FLW_BASE(base) ((TRDC_FLW_Type *)(((uint32_t)(uintptr_t)(base) + (uint32_t)TRDC_FLW_OFFSET))) +#define TRDC_DOMAIN_ERROR_BASE(base) ((TRDC_DomainError_Type *)(((uint32_t)(uintptr_t)(base) + (uint32_t)TRDC_DOMAIN_ERROR_OFFSET))) +#define TRDC_DOMAIN_ASSIGNMENT_BASE(base) \ + ((TRDC_DomainAssignment_Type *)(((uint32_t)(uintptr_t)(base) + (uint32_t)TRDC_DOMAIN_ASSIGNMENT_OFFSET))) +#define TRDC_MBC_BASE(base, instance) \ + ((TRDC_MBC_Type *)((uint32_t)(uintptr_t)(base) + (uint32_t)TRDC_MBC_OFFSET(base) + (instance) * (uint32_t)TRDC_MBC_ARRAY_STEP)) +#define TRDC_MRC_BASE(base, instance) \ + ((TRDC_MRC_Type *)((uint32_t)(uintptr_t)(base) + (uint32_t)TRDC_MRC_OFFSET(base) + (instance) * (uint32_t)TRDC_MRC_ARRAY_STEP)) + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +/*! + * @} + */ + +#endif /* FSL_TRDC_CORE_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc_soc.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc_soc.h new file mode 100644 index 00000000000..978a2ef2200 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_trdc_soc.h @@ -0,0 +1,60 @@ +/* + * Copyright 2024 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_TRDC_SOC_H_ +#define _FSL_TRDC_SOC_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup trdc_soc + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + /* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.trdc_soc" +#endif + +/*! @name Driver version */ +/*@{*/ +/*! @brief Driver version 2.0.0. */ +#define FSL_TRDC_SOC_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) +/*@}*/ + +#define TRDC_MBC_MEM_GLBCFG_NBLKS_MASK 0x000003FFUL +#define TRDC_MBC_MEM_GLBCFG_SIZE_LOG2_MASK 0x001F0000UL +#define TRDC_MBC_MEM_GLBCFG_SIZE_LOG2_SHIFT 16U +#define TRDC_MBC_NSE_BLK_CLR_ALL_MEMSEL(x) (((uint32_t)(x) & 0xFUL) << 8U) +#define TRDC_MBC_NSE_BLK_CLR_ALL_DID_SEL(x) (((uint32_t)(x) & 0x1UL) << 16U) + +/*!@brief TRDC feature */ +#define FSL_FEATURE_TRDC_DOMAIN_COUNT 1 + +/*!@brief TRDC base address convert macro */ +#define TRDC_MBC_COUNT 1 +#define TRDC_MBC_OFFSET(x) 0x0000 /* MBC register offset in TRDC_Type structure. */ +#define TRDC_MBC_ARRAY_STEP 0U /* Offset between two MBC control block, useless if there is only one. */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +/*! + * @} + */ + +#endif /* _FSL_TRDC_SOC_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_utick.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_utick.c new file mode 100644 index 00000000000..0eea419cd34 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_utick.c @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2019, 2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_utick.h" +#if !(defined(FSL_FEATURE_UTICK_HAS_NO_PDCFG) && FSL_FEATURE_UTICK_HAS_NO_PDCFG) +#include "fsl_power.h" +#endif +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.utick" +#endif + +/* Typedef for interrupt handler. */ +typedef void (*utick_isr_t)(UTICK_Type *base, utick_callback_t cb); + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief Gets the instance from the base address + * + * @param base UTICK peripheral base address + * + * @return The UTICK instance + */ +static uint32_t UTICK_GetInstance(UTICK_Type *base); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* Array of UTICK handle. */ +static utick_callback_t s_utickHandle[FSL_FEATURE_SOC_UTICK_COUNT]; +/* Array of UTICK peripheral base address. */ +static UTICK_Type *const s_utickBases[] = UTICK_BASE_PTRS; +/* Array of UTICK IRQ number. */ +static const IRQn_Type s_utickIRQ[] = UTICK_IRQS; +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/* Array of UTICK clock name. */ +static const clock_ip_name_t s_utickClock[] = UTICK_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_FEATURE_UTICK_HAS_NO_RESET) && FSL_FEATURE_UTICK_HAS_NO_RESET) +/*! @brief Pointers to UTICK resets for each instance. */ +static const reset_ip_name_t s_utickResets[] = UTICK_RSTS; +#endif + +/* UTICK ISR for transactional APIs. */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +static utick_isr_t s_utickIsr = (utick_isr_t)DefaultISR; +#else +static utick_isr_t s_utickIsr; +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t UTICK_GetInstance(UTICK_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_utickBases); instance++) + { + if (s_utickBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_utickBases)); + + return instance; +} + +/*! + * brief Starts UTICK. + * + * This function starts a repeat/onetime countdown with an optional callback + * + * param base UTICK peripheral base address. + * param mode UTICK timer mode (ie kUTICK_onetime or kUTICK_repeat) + * param count UTICK timer mode (ie kUTICK_onetime or kUTICK_repeat) + * param cb UTICK callback (can be left as NULL if none, otherwise should be a void func(void)) + * return none + */ +void UTICK_SetTick(UTICK_Type *base, utick_mode_t mode, uint32_t count, utick_callback_t cb) +{ + uint32_t instance; + + /* Get instance from peripheral base address. */ + instance = UTICK_GetInstance(base); + + /* Save the handle in global variables to support the double weak mechanism. */ + s_utickHandle[instance] = cb; +#if ((defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) && \ + !(defined(FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS) && FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS)) + EnableDeepSleepIRQ(s_utickIRQ[instance]); +#else + (void)EnableIRQ(s_utickIRQ[instance]); +#endif /* FSL_FEATURE_SOC_SYSCON_COUNT && !FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS */ + base->CTRL = count | UTICK_CTRL_REPEAT(mode); +} + +/*! + * brief Initializes an UTICK by turning its bus clock on + * + */ +void UTICK_Init(UTICK_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable utick clock */ + CLOCK_EnableClock(s_utickClock[UTICK_GetInstance(base)]); +#endif + +#if !(defined(FSL_FEATURE_UTICK_HAS_NO_RESET) && FSL_FEATURE_UTICK_HAS_NO_RESET) + RESET_PeripheralReset(s_utickResets[UTICK_GetInstance(base)]); +#endif + +#if !(defined(FSL_FEATURE_UTICK_HAS_NO_PDCFG) && FSL_FEATURE_UTICK_HAS_NO_PDCFG) + /* Power up Watchdog oscillator*/ + POWER_DisablePD(kPDRUNCFG_PD_WDT_OSC); +#endif + + s_utickIsr = UTICK_HandleIRQ; +} + +/*! + * brief Deinitializes a UTICK instance. + * + * This function shuts down Utick bus clock + * + * param base UTICK peripheral base address. + */ +void UTICK_Deinit(UTICK_Type *base) +{ + /* Turn off utick */ + base->CTRL = 0; +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Disable utick clock */ + CLOCK_DisableClock(s_utickClock[UTICK_GetInstance(base)]); +#endif +} + +/*! + * brief Get Status Flags. + * + * This returns the status flag + * + * param base UTICK peripheral base address. + * return status register value + */ +uint32_t UTICK_GetStatusFlags(UTICK_Type *base) +{ + return (base->STAT); +} + +/*! + * brief Clear Status Interrupt Flags. + * + * This clears intr status flag + * + * param base UTICK peripheral base address. + * return none + */ +void UTICK_ClearStatusFlags(UTICK_Type *base) +{ + base->STAT = UTICK_STAT_INTR_MASK; +} + +/*! + * brief UTICK Interrupt Service Handler. + * + * This function handles the interrupt and refers to the callback array in the driver to callback user (as per request + * in UTICK_SetTick()). + * if no user callback is scheduled, the interrupt will simply be cleared. + * + * param base UTICK peripheral base address. + * param cb callback scheduled for this instance of UTICK + * return none + */ +void UTICK_HandleIRQ(UTICK_Type *base, utick_callback_t cb) +{ + UTICK_ClearStatusFlags(base); + if (cb != NULL) + { + cb(); + } +} + +#if defined(UTICK0) +void UTICK0_DriverIRQHandler(void); +void UTICK0_DriverIRQHandler(void) +{ + s_utickIsr(UTICK0, s_utickHandle[0]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#if defined(UTICK1) +void UTICK1_DriverIRQHandler(void); +void UTICK1_DriverIRQHandler(void) +{ + s_utickIsr(UTICK1, s_utickHandle[1]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#if defined(UTICK2) +void UTICK2_DriverIRQHandler(void); +void UTICK2_DriverIRQHandler(void) +{ + s_utickIsr(UTICK2, s_utickHandle[2]); + SDK_ISR_EXIT_BARRIER; +} +#endif +#if defined(UTICK) +void UTICK_DriverIRQHandler(void); +void UTICK_DriverIRQHandler(void) +{ + s_utickIsr(UTICK, s_utickHandle[0]); + SDK_ISR_EXIT_BARRIER; +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_utick.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_utick.h new file mode 100644 index 00000000000..a3b734eae47 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_utick.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2019, 2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_UTICK_H_ +#define FSL_UTICK_H_ + +#include "fsl_common.h" +/*! + * @addtogroup utick + * @{ + */ + +/*! @file*/ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief UTICK driver version 2.0.5. */ +#define FSL_UTICK_DRIVER_VERSION (MAKE_VERSION(2, 0, 5)) +/*! @} */ + +/*! @brief UTICK timer operational mode. */ +typedef enum _utick_mode +{ + kUTICK_Onetime = 0x0U, /*!< Trigger once*/ + kUTICK_Repeat = 0x1U, /*!< Trigger repeatedly */ +} utick_mode_t; + +/*! @brief UTICK callback function. */ +typedef void (*utick_callback_t)(void); + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* _cplusplus */ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Initializes an UTICK by turning its bus clock on + * + */ +void UTICK_Init(UTICK_Type *base); + +/*! + * @brief Deinitializes a UTICK instance. + * + * This function shuts down Utick bus clock + * + * @param base UTICK peripheral base address. + */ +void UTICK_Deinit(UTICK_Type *base); +/*! + * @brief Get Status Flags. + * + * This returns the status flag + * + * @param base UTICK peripheral base address. + * @return status register value + */ +uint32_t UTICK_GetStatusFlags(UTICK_Type *base); +/*! + * @brief Clear Status Interrupt Flags. + * + * This clears intr status flag + * + * @param base UTICK peripheral base address. + * @return none + */ +void UTICK_ClearStatusFlags(UTICK_Type *base); + +/*! + * @brief Starts UTICK. + * + * This function starts a repeat/onetime countdown with an optional callback + * + * @param base UTICK peripheral base address. + * @param mode UTICK timer mode (ie kUTICK_onetime or kUTICK_repeat) + * @param count UTICK timer mode (ie kUTICK_onetime or kUTICK_repeat) + * @param cb UTICK callback (can be left as NULL if none, otherwise should be a void func(void)) + * @return none + */ +void UTICK_SetTick(UTICK_Type *base, utick_mode_t mode, uint32_t count, utick_callback_t cb); +/*! + * @brief UTICK Interrupt Service Handler. + * + * This function handles the interrupt and refers to the callback array in the driver to callback user (as per request + * in UTICK_SetTick()). + * if no user callback is scheduled, the interrupt will simply be cleared. + * + * @param base UTICK peripheral base address. + * @param cb callback scheduled for this instance of UTICK + * @return none + */ +void UTICK_HandleIRQ(UTICK_Type *base, utick_callback_t cb); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_UTICK_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_vbat.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_vbat.c new file mode 100644 index 00000000000..60f97571576 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_vbat.c @@ -0,0 +1,498 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_vbat.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.mcx_vbat" +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Configure internal 16kHz free running oscillator, including enabel FRO16k, gate FRO16k output. + * + * param base VBAT peripheral base address. + * param config Pointer to vbat_fro16k_config_t structure. + */ +void VBAT_ConfigFRO16k(VBAT_Type *base, const vbat_fro16k_config_t *config) +{ + assert(config != NULL); + + VBAT_EnableFRO16k(base, config->enableFRO16k); + VBAT_UngateFRO16k(base, config->enabledConnectionsMask); +} + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG) && FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG) +/*! + * brief Set 32k crystal oscillator mode and load capacitance for the XTAL/EXTAL pin. + * + * param base VBAT peripheral base address. + * param operateMode Specify the crystal oscillator mode, please refer to vbat_osc32k_operate_mode_t. + * param xtalCap Specify the internal capacitance for the XTAL pin from the capacitor bank. + * param extalCap Specify the internal capacitance for the EXTAL pin from the capacitor bank. + * + * retval kStatus_VBAT_WrongCapacitanceValue The load capacitance value to set is not align with operate mode's + * requirements. + * retval kStatus_Success Success to set operate mode and load capacitance. + */ +status_t VBAT_SetCrystalOsc32kModeAndLoadCapacitance(VBAT_Type *base, + vbat_osc32k_operate_mode_t operateMode, + vbat_osc32k_load_capacitance_select_t xtalCap, + vbat_osc32k_load_capacitance_select_t extalCap) +{ + if (operateMode == kVBAT_Osc32kEnabledToTransconductanceMode) + { + if (((uint8_t)extalCap & 0x1U) == 0U) + { + return kStatus_VBAT_WrongCapacitanceValue; + } + } + + if (operateMode == kVBAT_Osc32kEnabledToLowPowerSwitchedMode) + { + if ((extalCap != kVBAT_Osc32kCrystalLoadCap0pF) && (xtalCap != kVBAT_Osc32kCrystalLoadCap0pF)) + { + return kStatus_VBAT_WrongCapacitanceValue; + } + } + + if (operateMode == kVBAT_Osc32kEnabledToLowPowerBackupMode) + { + if (((uint8_t)extalCap & 0x1U) != 0U) + { + return kStatus_VBAT_WrongCapacitanceValue; + } + } + + if ((xtalCap != kVBAT_Osc32kCrystalLoadCapBankDisabled) && (extalCap != kVBAT_Osc32kCrystalLoadCapBankDisabled)) + { + base->OSCCTLA |= VBAT_OSCCTLA_CAP_SEL_EN_MASK; + base->OSCCTLB &= ~VBAT_OSCCTLA_CAP_SEL_EN_MASK; + base->OSCCTLA = ((base->OSCCTLA & ~(VBAT_OSCCTLA_EXTAL_CAP_SEL_MASK | VBAT_OSCCTLA_XTAL_CAP_SEL_MASK)) | + (VBAT_OSCCTLA_XTAL_CAP_SEL(xtalCap) | VBAT_OSCCTLA_EXTAL_CAP_SEL(extalCap))); + base->OSCCTLB = ((base->OSCCTLB & ~(VBAT_OSCCTLA_EXTAL_CAP_SEL_MASK | VBAT_OSCCTLA_XTAL_CAP_SEL_MASK)) | + VBAT_OSCCTLA_XTAL_CAP_SEL(~(uint32_t)xtalCap) | VBAT_OSCCTLA_EXTAL_CAP_SEL(~(uint32_t)extalCap)); + } + + base->OSCCTLA = (((base->OSCCTLA & ~VBAT_OSCCTLA_MODE_EN_MASK)) | VBAT_OSCCTLA_MODE_EN(operateMode)); + base->OSCCTLB = ((base->OSCCTLB & ~VBAT_OSCCTLA_MODE_EN_MASK) | VBAT_OSCCTLA_MODE_EN(~(uint32_t)operateMode)); + + return kStatus_Success; +} +#endif /* FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG) && FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG) +/*! + * brief Enable/disable Bandgap. + * + * note The FRO16K must be enabled before enableing the bandgap. + * note This setting can be locked by VBAT_LockRamLdoSettings() function. + * + * param base VBAT peripheral base address. + * param enable Used to enable/disable bandgap. + * - \b true Enable the bandgap. + * - \b false Disable the bandgap. + * + * retval kStatus_Success Success to enable/disable the bandgap. + * retval kStatus_VBAT_Fro16kNotEnabled Fail to enable the bandgap due to FRO16k is not enabled previously. + */ +status_t VBAT_EnableBandgap(VBAT_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + if (VBAT_CheckFRO16kEnabled(base)) + { + base->LDOCTLA |= VBAT_LDOCTLA_BG_EN_MASK; + base->LDOCTLB &= ~VBAT_LDOCTLA_BG_EN_MASK; + } + else + { + /* FRO16K must be enabled before enabling the Bandgap. */ + status = kStatus_VBAT_Fro16kNotEnabled; + } + } + else + { + base->LDOCTLA &= ~VBAT_LDOCTLA_BG_EN_MASK; + base->LDOCTLB |= VBAT_LDOCTLA_BG_EN_MASK; + } + + return status; +} + +/*! + * brief Enable/disable Backup RAM Regulator(RAM_LDO). + * + * note This setting can be locked by VBAT_LockRamLdoSettings() function. + * + * param base VBAT peripheral base address. + * param enable Used to enable/disable RAM_LDO. + * - \b true Enable backup SRAM regulator. + * - \b false Disable backup SRAM regulator. + * + * retval kStatusSuccess Success to enable/disable backup SRAM regulator. + * retval kStatus_VBAT_Fro16kNotEnabled Fail to enable backup SRAM regulator due to FRO16k is not enabled previously. + * retval kStatus_VBAT_BandgapNotEnabled Fail to enable backup SRAM regulator due to the bandgap is not enabled + * previously. + */ +status_t VBAT_EnableBackupSRAMRegulator(VBAT_Type *base, bool enable) +{ + status_t status = kStatus_Success; + + if (enable) + { + if (VBAT_CheckFRO16kEnabled(base)) + { + if (VBAT_CheckBandgapEnabled(base)) + { + base->LDOCTLA |= VBAT_LDOCTLA_LDO_EN_MASK; + base->LDOCTLB &= ~VBAT_LDOCTLA_LDO_EN_MASK; + /* Polling until LDO is enabled. */ + while ((base->STATUSA & VBAT_STATUSA_LDO_RDY_MASK) == 0UL) + { + } + } + else + { + /* The bandgap must be enabled previously. */ + status = kStatus_VBAT_BandgapNotEnabled; + } + } + else + { + /* FRO16k must be enabled previously. */ + status = kStatus_VBAT_Fro16kNotEnabled; + } + } + else + { + base->LDOCTLA &= ~VBAT_LDOCTLA_LDO_EN_MASK; + base->LDOCTLB |= VBAT_LDOCTLA_LDO_EN_MASK; + } + + return status; +} + +/*! + * brief Switch the SRAM to be powered by VBAT. + * + * param base VBAT peripheral base address. + * + * retval kStatusSuccess Success to Switch SRAM powered by VBAT. + * retval kStatus_VBAT_Fro16kNotEnabled Fail to switch SRAM powered by VBAT due to FRO16K not enabled previously. + */ +status_t VBAT_SwitchSRAMPowerByLDOSRAM(VBAT_Type *base) +{ + status_t status = kStatus_Success; + + status = VBAT_EnableBandgap(base, true); + + if (status == kStatus_Success) + { + VBAT_EnableBandgapRefreshMode(base, true); + (void)VBAT_EnableBackupSRAMRegulator(base, true); + + /* Isolate the SRAM array */ + base->LDORAMC |= VBAT_LDORAMC_ISO_MASK; + /* Switch the supply to VBAT LDO. */ + base->LDORAMC |= VBAT_LDORAMC_SWI_MASK; + } + + return status; +} +#endif /* FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER) && FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER) +/*! + * brief Enable/disable Bandgap timer. + * + * note The bandgap timer is available when the bandgap is enabled and are clocked by the FRO16k. + * + * param base VBAT peripheral base address. + * param enable Used to enable/disable bandgap timer. + * param timerIdMask The mask of bandgap timer Id, should be the OR'ed value of vbat_bandgap_timer_id_t. + * + * retval kStatus_Success Success to enable/disable selected bandgap timer. + * retval kStatus_VBAT_Fro16kNotEnabled Fail to enable/disable selected bandgap timer due to FRO16k not enabled + * previously. retval kStatus_VBAT_BandgapNotEnabled Fail to enable/disable selected bandgap timer due to bandgap not + * enabled previously. + */ +status_t VBAT_EnableBandgapTimer(VBAT_Type *base, bool enable, uint8_t timerIdMask) +{ + status_t status = kStatus_Success; + + if (enable) + { + if (VBAT_CheckFRO16kEnabled(base)) + { + if (VBAT_CheckBandgapEnabled(base)) + { + if ((timerIdMask & (uint8_t)kVBAT_BandgapTimer0) != 0U) + { + base->LDOTIMER0 |= VBAT_LDOTIMER0_TIMEN_MASK; + } + + if ((timerIdMask & (uint8_t)kVBAT_BandgapTimer1) != 0U) + { + base->LDOTIMER1 |= VBAT_LDOTIMER1_TIMEN_MASK; + } + } + else + { + /* Bandgap must be enabled previously. */ + status = kStatus_VBAT_BandgapNotEnabled; + } + } + else + { + /* FRO16K must be enabled previously. */ + status = kStatus_VBAT_Fro16kNotEnabled; + } + } + else + { + if ((timerIdMask & (uint8_t)kVBAT_BandgapTimer0) != 0U) + { + base->LDOTIMER0 &= ~VBAT_LDOTIMER0_TIMEN_MASK; + } + + if ((timerIdMask & (uint8_t)kVBAT_BandgapTimer1) != 0U) + { + base->LDOTIMER1 &= ~VBAT_LDOTIMER1_TIMEN_MASK; + } + } + + return status; +} + +/*! + * brief Set bandgap timer0 timeout value. + * + * param base VBAT peripheral base address. + * param timeoutPeriod Bandgap timer timeout value, please refer to vbat_bandgap_timer0_timeout_period_t. + */ +void VBAT_SetBandgapTimer0TimeoutValue(VBAT_Type *base, vbat_bandgap_timer0_timeout_period_t timeoutPeriod) +{ + bool timerEnabled = false; + + timerEnabled = ((base->LDOTIMER0 & VBAT_LDOTIMER0_TIMEN_MASK) != 0UL) ? true : false; + + if (timerEnabled) + { + base->LDOTIMER0 &= ~VBAT_LDOTIMER0_TIMEN_MASK; + } + + base->LDOTIMER0 = ((base->LDOTIMER0 & (~VBAT_LDOTIMER0_TIMCFG_MASK)) | VBAT_LDOTIMER0_TIMCFG(timeoutPeriod)); + + if (timerEnabled) + { + base->LDOTIMER0 |= VBAT_LDOTIMER0_TIMEN_MASK; + } +} + +/*! + * brief Set bandgap timer1 timeout value. + * + * note The timeout value can only be changed when the timer is disabled. + * + * param base VBAT peripheral base address. + * param timeoutPeriod The bandgap timerout 1 period, in number of seconds, ranging from 0 to 65535s. + */ +void VBAT_SetBandgapTimer1TimeoutValue(VBAT_Type *base, uint32_t timeoutPeriod) +{ + bool timerEnabled = false; + + timerEnabled = ((base->LDOTIMER1 & VBAT_LDOTIMER1_TIMEN_MASK) != 0UL) ? true : false; + + if (timerEnabled) + { + base->LDOTIMER1 &= ~VBAT_LDOTIMER1_TIMEN_MASK; + } + + base->LDOTIMER1 = ((base->LDOTIMER1 & (~VBAT_LDOTIMER1_TIMCFG_MASK)) | VBAT_LDOTIMER1_TIMCFG(timeoutPeriod)); + + if (timerEnabled) + { + base->LDOTIMER1 |= VBAT_LDOTIMER1_TIMEN_MASK; + } +} +#endif /* FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG) && FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG) +/*! + * brief Initializes the VBAT clock monitor, enable clock monitor and set the clock monitor configuration. + * + * note Both FRO16K and OSC32K should be enabled and stable before invoking this function. + * + * param base VBAT peripheral base address. + * param config Pointer to vbat_clock_monitor_config_t structure. + * + * retval kStatus_Success Clock monitor is initialized successfully. + * retval kStatus_VBAT_Fro16kNotEnabled FRO16K is not enabled. + * retval kStatus_VBAT_Osc32kNotReady OSC32K is not ready. + * retval kStatus_VBAT_ClockMonitorLocked Clock monitor is locked. + */ +status_t VBAT_InitClockMonitor(VBAT_Type *base, const vbat_clock_monitor_config_t *config) +{ + assert(config != NULL); + + status_t status = kStatus_Success; + + if (VBAT_CheckFRO16kEnabled(base)) + { + if ((VBAT_GetStatusFlags(base) & kVBAT_StatusFlagOsc32kReady) != 0UL) + { + if (VBAT_CheckClockMonitorControlLocked(base)) + { + status = kStatus_VBAT_ClockMonitorLocked; + } + else + { + /* Disable clock monitor before configuring clock monitor. */ + VBAT_EnableClockMonitor(base, false); + /* Set clock monitor divide trim value. */ + VBAT_SetClockMonitorDivideTrim(base, config->divideTrim); + /* Set clock monitor frequency trim value. */ + VBAT_SetClockMonitorFrequencyTrim(base, config->freqTrim); + /* Enable clock monitor. */ + VBAT_EnableClockMonitor(base, true); + + if (config->lock) + { + VBAT_LockClockMonitorControl(base); + } + } + } + else + { + status = kStatus_VBAT_OSC32KNotReady; + } + } + else + { + status = kStatus_VBAT_Fro16kNotEnabled; + } + + return status; +} + +/*! + * brief Deinitialize the VBAT clock monitor. + * + * param base VBAT peripheral base address. + * + * retval kStatus_Success Clock monitor is de-initialized successfully. + * retval kStatus_VBAT_ClockMonitorLocked Control of Clock monitor is locked. + */ +status_t VBAT_DeinitMonitor(VBAT_Type *base) +{ + if (VBAT_CheckClockMonitorControlLocked(base)) + { + return kStatus_VBAT_ClockMonitorLocked; + } + + VBAT_EnableClockMonitor(base, false); + + return kStatus_Success; +} +#endif /* FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG) && FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG) +/*! + * brief Initialize tamper control. + * + * note Both FRO16K and bandgap should be enabled before calling this function. + * + * param base VBAT peripheral base address. + * param config Pointer to vbat_tamper_config_t structure. + * + * retval kStatus_Success Tamper is initialized successfully. + * retval kStatus_VBAT_TamperLocked Tamper control is locked. + * retval kStatus_VBAT_BandgapNotEnabled Bandgap is not enabled. + * retval kStatus_VBAT_Fro16kNotEnabled FRO 16K is not enabled. + */ +status_t VBAT_InitTamper(VBAT_Type *base, const vbat_tamper_config_t *config) +{ + assert(config != NULL); + + status_t status = kStatus_Success; + + if (VBAT_CheckFRO16kEnabled(base)) + { + if (VBAT_CheckBandgapEnabled(base)) + { + if (VBAT_CheckTamperControlLocked(base)) + { + return kStatus_VBAT_TamperLocked; + } + else + { + base->TAMCTLA = ((base->TAMCTLA & (~VBAT_TAMCTLA_VOLT_EN_MASK | VBAT_TAMCTLA_TEMP_EN_MASK)) | + VBAT_TAMCTLA_VOLT_EN(config->enableVoltageDetect) | + VBAT_TAMCTLA_TEMP_EN(config->enableTemperatureDetect)); + base->TAMCTLB = ((base->TAMCTLB & (~VBAT_TAMCTLA_VOLT_EN_MASK | VBAT_TAMCTLA_TEMP_EN_MASK)) | + VBAT_TAMCTLA_VOLT_EN((config->enableVoltageDetect) ? 0U : 1U) | + VBAT_TAMCTLA_TEMP_EN((config->enableTemperatureDetect) ? 0U : 1U)); + + if (config->lock) + { + VBAT_LockTamperControl(base); + } + } + } + else + { + status = kStatus_VBAT_BandgapNotEnabled; + } + } + else + { + status = kStatus_VBAT_Fro16kNotEnabled; + } + + return status; +} + +/*! + * brief De-initialize tamper control. + * + * param base VBAT peripheral base address. + * + * retval kStatus_Success Tamper is de-initialized successfully. + * retval kStatus_VBAT_TamperLocked Tamper control is locked. + */ +status_t VBAT_DeinitTamper(VBAT_Type *base) +{ + if (VBAT_CheckTamperControlLocked(base)) + { + return kStatus_VBAT_TamperLocked; + } + + base->TAMCTLA &= ~(VBAT_TAMCTLA_VOLT_EN_MASK | VBAT_TAMCTLA_TEMP_EN_MASK); + base->TAMCTLB |= (VBAT_TAMCTLA_VOLT_EN_MASK | VBAT_TAMCTLA_TEMP_EN_MASK); + + return kStatus_Success; +} +#endif /* FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_vbat.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_vbat.h new file mode 100644 index 00000000000..5858b005eb9 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_vbat.h @@ -0,0 +1,1386 @@ +/* + * Copyright 2022-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef FSL_VBAT_H_ +#define FSL_VBAT_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup mcx_vbat + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*@{*/ +/*! @brief VBAT driver version 2.3.1. */ +#define FSL_VBAT_DRIVER_VERSION (MAKE_VERSION(2, 3, 1)) +/*@}*/ + +#if !defined(VBAT_LDORAMC_RET_MASK) +#define VBAT_LDORAMC_RET_MASK (0xF00U) +#define VBAT_LDORAMC_RET_SHIFT (8U) +#define VBAT_LDORAMC_RET(x) (((uint32_t)(((uint32_t)(x)) << VBAT_LDORAMC_RET_SHIFT)) & VBAT_LDORAMC_RET_MASK) +#endif + +/*! + * @brief The enumeration of VBAT module status. + */ +enum +{ + kStatus_VBAT_Fro16kNotEnabled = MAKE_STATUS(kStatusGroup_VBAT, 0), /*!< Internal 16kHz free running + oscillator not enabled. */ + kStatus_VBAT_BandgapNotEnabled = MAKE_STATUS(kStatusGroup_VBAT, 1), /*!< Bandgap not enabled. */ + kStatus_VBAT_WrongCapacitanceValue = MAKE_STATUS(kStatusGroup_VBAT, 2), /*!< Wrong capacitance for + selected oscillator mode. */ + kStatus_VBAT_ClockMonitorLocked = MAKE_STATUS(kStatusGroup_VBAT, 3), /*!< Clock monitor locked. */ + kStatus_VBAT_OSC32KNotReady = MAKE_STATUS(kStatusGroup_VBAT, 4), /*!< OSC32K not ready. */ + kStatus_VBAT_LDONotReady = MAKE_STATUS(kStatusGroup_VBAT, 5), /*!< LDO not ready. */ + kStatus_VBAT_TamperLocked = MAKE_STATUS(kStatusGroup_VBAT, 6), /*!< Tamper locked. */ +}; + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_STATUS_REG) && FSL_FEATURE_MCX_VBAT_HAS_STATUS_REG) +/*! + * @brief The enumeration of VBAT status flags. + * + * @anchor vbat_status_flag_t + */ +enum _vbat_status_flag +{ + kVBAT_StatusFlagPORDetect = VBAT_STATUSA_POR_DET_MASK, /*!< VBAT domain has been reset */ + kVBAT_StatusFlagWakeupPin = VBAT_STATUSA_WAKEUP_FLAG_MASK, /*!< A falling edge is detected on the wakeup pin. */ + kVBAT_StatusFlagBandgapTimer0 = VBAT_STATUSA_TIMER0_FLAG_MASK, /*!< Bandgap Timer0 period reached. */ + kVBAT_StatusFlagBandgapTimer1 = VBAT_STATUSA_TIMER1_FLAG_MASK, /*!< Bandgap Timer1 period reached. */ + kVBAT_StatusFlagLdoReady = VBAT_STATUSA_LDO_RDY_MASK, /*!< LDO is enabled and ready. */ + kVBAT_StatusFlagOsc32kReady = VBAT_STATUSA_OSC_RDY_MASK, /*!< OSC32k is enabled and clock is ready. */ +#if defined(VBAT_STATUSA_CLOCK_DET_MASK) + kVBAT_StatusFlagClockDetect = VBAT_STATUSA_CLOCK_DET_MASK, /*!< The clock monitor has detected an error. */ +#endif /* VBAT_STATUSA_CLOCK_DET_MASK */ + kVBAT_StatusFlagConfigDetect = VBAT_STATUSA_CONFIG_DET_MASK, /*!< Configuration error detected. */ +#if defined(VBAT_STATUSA_VOLT_DET_MASK) + kVBAT_StatusFlagVoltageDetect = VBAT_STATUSA_VOLT_DET_MASK, /*!< Voltage monitor has detected + an error with VBAT supply. */ +#endif /* VBAT_STATUSA_VOLT_DET_MASK */ +#if defined(VBAT_STATUSA_TEMP_DET_MASK) + kVBAT_StatusFlagTemperatureDetect = VBAT_STATUSA_TEMP_DET_MASK, /*!< Temperature monitor has detected an error. */ +#endif /* VBAT_STATUSA_TEMP_DET_MASK */ +#if defined(VBAT_STATUSA_SEC0_DET_MASK) + kVBAT_StatusFlagSec0Detect = VBAT_STATUSA_SEC0_DET_MASK, /*!< Security input 0 has detected an error. */ +#endif /* VBAT_STATUSA_SEC0_DET_MASK */ + kVBAT_StatusFlagInterrupt0Detect = VBAT_STATUSA_IRQ0_DET_MASK, /*!< Interrupt 0 asserted. */ + kVBAT_StatusFlagInterrupt1Detect = VBAT_STATUSA_IRQ1_DET_MASK, /*!< Interrupt 1 asserted. */ + kVBAT_StatusFlagInterrupt2Detect = VBAT_STATUSA_IRQ2_DET_MASK, /*!< Interrupt 2 asserted. */ + kVBAT_StatusFlagInterrupt3Detect = VBAT_STATUSA_IRQ3_DET_MASK, /*!< Interrupt 2 asserted. */ +}; + +/*! + * @brief The enumeration of VBAT interrupt enable. + * + * @anchor vbat_interrupt_enable_t + */ +enum _vbat_interrupt_enable +{ + kVBAT_InterruptEnablePORDetect = VBAT_IRQENA_POR_DET_MASK, /*!< Enable POR detect interrupt. */ + kVBAT_InterruptEnableWakeupPin = VBAT_IRQENA_WAKEUP_FLAG_MASK, /*!< Enable the interrupt when a falling edge is + detected on the wakeup pin. */ + kVBAT_InterruptEnableBandgapTimer0 = VBAT_IRQENA_TIMER0_FLAG_MASK, /*!< Enable the interrupt if Bandgap + Timer0 period reached. */ + kVBAT_InterruptEnableBandgapTimer1 = VBAT_IRQENA_TIMER1_FLAG_MASK, /*!< Enable the interrupt if Bandgap + Timer1 period reached. */ + kVBAT_InterruptEnableLdoReady = VBAT_IRQENA_LDO_RDY_MASK, /*!< Enable LDO ready interrupt. */ + kVBAT_InterruptEnableOsc32kReady = VBAT_IRQENA_OSC_RDY_MASK, /*!< Enable OSC32K ready interrupt. */ +#if defined(VBAT_IRQENA_CLOCK_DET_MASK) + kVBAT_InterruptEnableClockDetect = VBAT_IRQENA_CLOCK_DET_MASK, /*!< Enable clock monitor detect interrupt. */ +#endif /* VBAT_IRQENA_CLOCK_DET_MASK */ + kVBAT_InterruptEnableConfigDetect = + VBAT_IRQENA_CONFIG_DET_MASK, /*!< Enable configuration error detected interrupt. */ +#if defined(VBAT_IRQENA_VOLT_DET_MASK) + kVBAT_InterruptEnableVoltageDetect = VBAT_IRQENA_VOLT_DET_MASK, /*!< Enable voltage monitor detect interrupt. */ +#endif /* VBAT_IRQENA_VOLT_DET_MASK */ +#if defined(VBAT_IRQENA_TEMP_DET_MASK) + kVBAT_InterruptEnableTemperatureDetect = VBAT_IRQENA_TEMP_DET_MASK, /*!< Enable temperature monitor detect + interrupt. */ +#endif /* VBAT_IRQENA_TEMP_DET_MASK */ +#if defined(VBAT_IRQENA_SEC0_DET_MASK) + kVBAT_InterruptEnableSec0Detect = VBAT_IRQENA_SEC0_DET_MASK, /*!< Enable security input 0 detect interrupt. */ +#endif /* VBAT_IRQENA_SEC0_DET_MASK */ + kVBAT_InterruptEnableInterrupt0 = VBAT_IRQENA_IRQ0_DET_MASK, /*!< Enable the interrupt0. */ + kVBAT_InterruptEnableInterrupt1 = VBAT_IRQENA_IRQ1_DET_MASK, /*!< Enable the interrupt1. */ + kVBAT_InterruptEnableInterrupt2 = VBAT_IRQENA_IRQ2_DET_MASK, /*!< Enable the interrupt2. */ + kVBAT_InterruptEnableInterrupt3 = VBAT_IRQENA_IRQ3_DET_MASK, /*!< Enable the interrupt3. */ + + kVBAT_AllInterruptsEnable = + (VBAT_IRQENA_POR_DET_MASK | VBAT_IRQENA_WAKEUP_FLAG_MASK | VBAT_IRQENA_TIMER0_FLAG_MASK | + VBAT_IRQENA_TIMER1_FLAG_MASK | VBAT_IRQENA_LDO_RDY_MASK | VBAT_IRQENA_OSC_RDY_MASK | + VBAT_IRQENA_CONFIG_DET_MASK | VBAT_IRQENA_IRQ0_DET_MASK | VBAT_IRQENA_IRQ1_DET_MASK | + VBAT_IRQENA_IRQ2_DET_MASK | VBAT_IRQENA_IRQ3_DET_MASK), /*!< Enable all interrupts. */ +}; + +/*! + * @brief The enumeration of VBAT wakeup enable. + * + * @anchor vbat_wakeup_enable_t + */ +enum _vbat_wakeup_enable +{ + kVBAT_WakeupEnablePORDetect = VBAT_WAKENA_POR_DET_MASK, /*!< Enable POR detect wakeup. */ + kVBAT_WakeupEnableWakeupPin = VBAT_WAKENA_WAKEUP_FLAG_MASK, /*!< Enable wakeup feature when a falling edge is + detected on the wakeup pin. */ + kVBAT_WakeupEnableBandgapTimer0 = VBAT_WAKENA_TIMER0_FLAG_MASK, /*!< Enable wakeup feature when bandgap + timer0 period reached. */ + kVBAT_WakeupEnableBandgapTimer1 = VBAT_WAKENA_TIMER1_FLAG_MASK, /*!< Enable wakeup feature when bandgap + timer1 period reached. */ + kVBAT_WakeupEnableLdoReady = VBAT_WAKENA_LDO_RDY_MASK, /*!< Enable wakeup when LDO ready. */ + kVBAT_WakeupEnableOsc32kReady = VBAT_WAKENA_OSC_RDY_MASK, /*!< Enable wakeup when OSC32k ready. */ +#if defined(VBAT_WAKENA_CLOCK_DET_MASK) + kVBAT_WakeupEnableClockDetect = + VBAT_WAKENA_CLOCK_DET_MASK, /*!< Enable wakeup when clock monitor detect an error. */ +#endif /* VBAT_WAKENA_CLOCK_DET_MASK */ + kVBAT_WakeupEnableConfigDetect = VBAT_WAKENA_CONFIG_DET_MASK, /*!< Enable wakeup when + configuration error detected. */ +#if defined(VBAT_WAKENA_VOLT_DET_MASK) + kVBAT_WakeupEnableVoltageDetect = VBAT_WAKENA_VOLT_DET_MASK, /*!< Enable wakeup when voltage monitor detect an + error. */ +#endif /* VBAT_WAKENA_VOLT_DET_MASK */ +#if defined(VBAT_WAKENA_TEMP_DET_MASK) + kVBAT_WakeupEnableTemperatureDetect = VBAT_WAKENA_TEMP_DET_MASK, /*!< Enable wakeup when temperature monitor + detect an error. */ +#endif /* VBAT_WAKENA_TEMP_DET_MASK */ +#if defined(VBAT_WAKENA_SEC0_DET_MASK) + kVBAT_WakeupEnableSec0Detect = VBAT_WAKENA_SEC0_DET_MASK, /*!< Enable wakeup when security input 0 detect an + error. */ +#endif /* VBAT_WAKENA_SEC0_DET_MASK */ + kVBAT_WakeupEnableInterrupt0 = VBAT_WAKENA_IRQ0_DET_MASK, /*!< Enable wakeup when interrupt0 asserted. */ + kVBAT_WakeupEnableInterrupt1 = VBAT_WAKENA_IRQ1_DET_MASK, /*!< Enable wakeup when interrupt1 asserted. */ + kVBAT_WakeupEnableInterrupt2 = VBAT_WAKENA_IRQ2_DET_MASK, /*!< Enable wakeup when interrupt2 asserted. */ + kVBAT_WakeupEnableInterrupt3 = VBAT_WAKENA_IRQ3_DET_MASK, /*!< Enable wakeup when interrupt3 asserted. */ + + kVBAT_AllWakeupsEnable = (VBAT_WAKENA_POR_DET_MASK | VBAT_WAKENA_WAKEUP_FLAG_MASK | VBAT_WAKENA_TIMER0_FLAG_MASK | + VBAT_WAKENA_TIMER1_FLAG_MASK | VBAT_WAKENA_LDO_RDY_MASK | VBAT_WAKENA_OSC_RDY_MASK | + VBAT_WAKENA_CONFIG_DET_MASK | VBAT_WAKENA_IRQ0_DET_MASK | VBAT_WAKENA_IRQ1_DET_MASK | + VBAT_WAKENA_IRQ2_DET_MASK | VBAT_WAKENA_IRQ3_DET_MASK + +#if defined(VBAT_WAKENA_CLOCK_DET_MASK) + | VBAT_WAKENA_CLOCK_DET_MASK + +#endif /* VBAT_WAKENA_CLOCK_DET_MASK */ +#if defined(VBAT_WAKENA_VOLT_DET_MASK) + | VBAT_WAKENA_VOLT_DET_MASK + +#endif /* VBAT_WAKENA_VOLT_DET_MASK */ +#if defined(VBAT_WAKENA_TEMP_DET_MASK) + | VBAT_WAKENA_TEMP_DET_MASK + +#endif /* VBAT_WAKENA_TEMP_DET_MASK */ +#if defined(VBAT_WAKENA_SEC0_DET_MASK) + | VBAT_WAKENA_SEC0_DET_MASK + +#endif /* VBAT_WAKENA_SEC0_DET_MASK */ + ), /*!< Enable all wakeup. */ +}; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_STATUS_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG) && FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG) +/*! + * @brief The enumeration of VBAT tamper enable. + */ +enum _vbat_tamper_enable +{ + kVBAT_TamperEnablePOR = VBAT_TAMPERA_POR_DET_MASK, /*!< Enable tamper if POR asserted in STATUS register. */ + kVBAT_TamperEnableClockDetect = VBAT_TAMPERA_CLOCK_DET_MASK, /*!< Enable tamper if clock monitor detect an error. */ + kVBAT_TamperEnableConfigDetect = + VBAT_TAMPERA_CONFIG_DET_MASK, /*!< Enable tamper if configuration error detected. */ + kVBAT_TamperEnableVoltageDetect = VBAT_TAMPERA_VOLT_DET_MASK, /*!< Enable tamper if voltage monitor detect an + error. */ + kVBAT_TamperEnableTemperatureDetect = VBAT_TAMPERA_TEMP_DET_MASK, /*!< Enable tamper if temperature monitor + detect an error. */ + kVBAT_TamperEnableSec0Detect = VBAT_TAMPERA_SEC0_DET_MASK, /*!< Enable tamper if security input 0 detect an + error. */ +}; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER) && FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER) +/*! + * @brief The enumeration of bandgap timer id, VBAT support two bandgap timers. + * + * @anchor vbat_bandgap_timer_id_t + */ +enum _vbat_bandgap_timer_id +{ + kVBAT_BandgapTimer0 = 1U << 0U, /*!< Bandgap Timer0. */ + kVBAT_BandgapTimer1 = 1U << 1U, /*!< Bandgap Timer1. */ +}; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER */ + +/*! + * @brief The enumeration of connections for OSC32K/FRO32K output clock to other modules. + * + * @anchor vbat_clock_enable_t + */ +enum _vbat_clock_enable +{ + kVBAT_EnableClockToDomain0 = 1U << 0U, /*!< Enable clock to power domain0. */ + kVBAT_EnableClockToDomain1 = 1U << 1U, /*!< Enable clock to power domain1. */ + kVBAT_EnableClockToDomain2 = 1U << 2U, /*!< Enable clock to power domain2. */ + kVBAT_EnableClockToDomain3 = 1U << 3U, /*!< Enable clock to power domain3. */ +}; +#define kVBAT_EnableClockToVddBat kVBAT_EnableClockToDomain0 +#define kVBAT_EnableClockToVddSys kVBAT_EnableClockToDomain1 +#define kVBAT_EnableClockToVddWake kVBAT_EnableClockToDomain2 +#define kVBAT_EnableClockToVddMain kVBAT_EnableClockToDomain3 + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG) && FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG) +/*! + * @brief The enumeration of SRAM arrays that controlled by VBAT. + * @anchor vbat_ram_array_t + */ +enum _vbat_ram_array +{ + kVBAT_SramArray0 = 1U << 0U, /*!< Specify SRAM array0 that controlled by VBAT. */ + kVBAT_SramArray1 = 1U << 1U, /*!< Specify SRAM array1 that controlled by VBAT. */ + kVBAT_SramArray2 = 1U << 2U, /*!< Specify SRAM array2 that controlled by VBAT. */ + kVBAT_SramArray3 = 1U << 3U, /*!< Specify SRAM array3 that controlled by VBAT. */ +}; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG */ + +/*! + * @brief The enumeration of bandgap refresh period. + */ +typedef enum _vbat_bandgap_refresh_period +{ + kVBAT_BandgapRefresh7P8125ms = 0U, /*!< Bandgap refresh every 7.8125ms. */ + kVBAT_BandgapRefresh15P625ms = 1U, /*!< Bandgap refresh every 15.625ms. */ + kVBAT_BandgapRefresh31P25ms = 2U, /*!< Bandgap refresh every 31.25ms. */ + kVBAT_BandgapRefresh62P5ms = 3U, /*!< Bandgap refresh every 62.5ms. */ +} vbat_bandgap_refresh_period_t; + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER) && FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER) +/*! + * @brief The enumeration of bandgap timer0 timeout period. + */ +typedef enum _vbat_bandgap_timer0_timeout_period +{ + kVBAT_BangapTimer0Timeout1s = 0U, /*!< Bandgap timer0 timerout every 1s. */ + kVBAT_BangapTimer0Timeout500ms = 1U, /*!< Bandgap timer0 timerout every 500ms. */ + kVBAT_BangapTimer0Timeout250ms = 2U, /*!< Bandgap timer0 timerout every 250ms. */ + kVBAT_BangapTimer0Timeout125ms = 3U, /*!< Bandgap timer0 timerout every 125ms. */ + kVBAT_BangapTimer0Timeout62P5ms = 4U, /*!< Bandgap timer0 timerout every 62.5ms. */ + kVBAT_BangapTimer0Timeout31P25ms = 5U, /*!< Bandgap timer0 timerout every 31.25ms. */ +} vbat_bandgap_timer0_timeout_period_t; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG) && FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG) +/*! + * @brief The enumeration of osc32k operate mode, including Bypass mode, low power switched mode and so on. + */ +typedef enum _vbat_osc32k_operate_mode +{ + kVBAT_Osc32kEnabledToTransconductanceMode = 0U, /*!< Set to transconductance mode. */ + kVBAT_Osc32kEnabledToLowPowerBackupMode = 1U, /*!< Set to low power backup mode. */ + kVBAT_Osc32kEnabledToLowPowerSwitchedMode = 2U, /*!< Set to low power switched mode. */ +} vbat_osc32k_operate_mode_t; + +/*! + * @brief The enumeration of OSC32K load capacitance. + */ +typedef enum _vbat_osc32k_load_capacitance_select +{ + kVBAT_Osc32kCrystalLoadCap0pF = + 0U, /*!< Internal capacitance bank is enabled, set the internal capacitance to 0 pF. */ + kVBAT_Osc32kCrystalLoadCap2pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 2 pF. */ + kVBAT_Osc32kCrystalLoadCap4pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 4 pF. */ + kVBAT_Osc32kCrystalLoadCap6pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 6 pF. */ + kVBAT_Osc32kCrystalLoadCap8pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 8 pF. */ + kVBAT_Osc32kCrystalLoadCap10pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 10 pF. */ + kVBAT_Osc32kCrystalLoadCap12pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 12 pF. */ + kVBAT_Osc32kCrystalLoadCap14pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 14 pF. */ + kVBAT_Osc32kCrystalLoadCap16pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 16 pF. */ + kVBAT_Osc32kCrystalLoadCap18pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 18 pF. */ + kVBAT_Osc32kCrystalLoadCap20pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 20 pF. */ + kVBAT_Osc32kCrystalLoadCap22pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 22 pF. */ + kVBAT_Osc32kCrystalLoadCap24pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 24 pF. */ + kVBAT_Osc32kCrystalLoadCap26pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 26 pF. */ + kVBAT_Osc32kCrystalLoadCap28pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 28 pF. */ + kVBAT_Osc32kCrystalLoadCap30pF, /*!< Internal capacitance bank is enabled, set the internal capacitance to 30 pF. */ + kVBAT_Osc32kCrystalLoadCapBankDisabled = 0xF0U, /*!< Internal capacitance bank is disabled. */ +} vbat_osc32k_load_capacitance_select_t; + +/*! + * @brief The enumeration of start-up time of the oscillator. + */ +typedef enum _vbat_osc32k_start_up_time +{ + kVBAT_Osc32kStartUpTime8Sec = 0U, /*!< Configure the start-up time as 8 seconds. */ + kVBAT_Osc32kStartUpTime4Sec, /*!< Configure the start-up time as 4 seconds. */ + kVBAT_Osc32kStartUpTime2Sec, /*!< Configure the start-up time as 2 seconds. */ + kVBAT_Osc32kStartUpTime1Sec, /*!< Configure the start-up time as 1 seconds. */ + kVBAT_Osc32kStartUpTime0P5Sec, /*!< Configure the start-up time as 0.5 seconds. */ + kVBAT_Osc32kStartUpTime0P25Sec, /*!< Configure the start-up time as 0.25 seconds. */ + kVBAT_Osc32kStartUpTime0P125Sec, /*!< Configure the start-up time as 0.125 seconds. */ + kVBAT_Osc32kStartUpTime0P5MSec, /*!< Configure the start-up time as 0.5 milliseconds. */ +} vbat_osc32k_start_up_time_t; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_SWICTL_REG) && FSL_FEATURE_MCX_VBAT_HAS_SWICTL_REG) +/*! + * @brief The enumeration of VBAT module supplies. + */ +typedef enum _vbat_internal_module_supply +{ + kVBAT_ModuleSuppliedByVddBat = 0U, /*!< VDD_BAT supplies VBAT modules. */ + kVBAT_ModuleSuppliedByVddSys = 1U, /*!< VDD_SYS supplies VBAT modules. */ +} vbat_internal_module_supply_t; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_SWICTL_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG) && FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG) +/*! + * @brief The enumeration of VBAT clock monitor divide trim value + */ +typedef enum _vbat_clock_monitor_divide_trim +{ + kVBAT_ClockMonitorOperateAt1kHz = 0U, /*!< Clock monitor operates at 1 kHz. */ + kVBAT_ClockMonitorOperateAt64Hz = 1U, /*!< Clock monitor operates at 64 Hz. */ +} vbat_clock_monitor_divide_trim_t; + +/*! + * @brief The enumeration of VBAT clock monitor frequency trim value used to adjust the clock monitor assert. + */ +typedef enum _vbat_clock_monitor_freq_trim +{ + kVBAT_ClockMonitorAssert2Cycle = 0U, /*!< Clock monitor assert 2 cycles after expected edge. */ + kVBAT_ClockMonitorAssert4Cycle = 1U, /*!< Clock monitor assert 4 cycles after expected edge. */ + kVBAT_ClockMonitorAssert6Cycle = 2U, /*!< Clock monitor assert 8 cycles after expected edge. */ + kVBAT_ClockMonitorAssert8Cycle = 3U, /*!< Clock monitor assert 8 cycles after expected edge. */ +} vbat_clock_monitor_freq_trim_t; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG */ + +/*! + * @brief The structure of internal 16kHz free running oscillator attributes. + */ +typedef struct _vbat_fro16k_config +{ + bool enableFRO16k; /*!< Enable/disable internal 16kHz free running oscillator. */ + uint8_t enabledConnectionsMask; /*!< The mask of connected modules to enable FRO16k clock output. */ +} vbat_fro16k_config_t; + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG) && FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG) +/*! + * @brief The structure of internal clock monitor, including divide trim and frequency trim. + */ +typedef struct _vbat_clock_monitor_config +{ + vbat_clock_monitor_divide_trim_t divideTrim : 1U; /* !< Divide trim value, please + refer to @ref vbat_clock_monitor_divide_trim_t */ + vbat_clock_monitor_freq_trim_t freqTrim : 2U; /*!< Frequency trim value used to adjust the clock monitor + assert, please refer to @ref vbat_clock_monitor_freq_trim_t. */ + bool lock : 1U; /*!< Lock the clock monitor control after enabled. */ +} vbat_clock_monitor_config_t; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG) && FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG) +/*! + * @brief The structure of Tamper configuration. + */ +typedef struct _vbat_tamper_config +{ + bool enableVoltageDetect : 1U; /*!< Enable/disable voltage detection. */ + bool enableTemperatureDetect : 1U; /*!< Enable/disable temperature detection. */ + bool lock : 1U; /*!< Lock the tamper control after enabled. */ +} vbat_tamper_config_t; +#endif /* FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG */ + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name FRO16K Control Interfaces + * @{ + */ + +/*! + * @brief Configure internal 16kHz free running oscillator, including enabel FRO16k, gate FRO16k output. + * + * @param base VBAT peripheral base address. + * @param config Pointer to @ref vbat_fro16k_config_t structure. + */ +void VBAT_ConfigFRO16k(VBAT_Type *base, const vbat_fro16k_config_t *config); + +/*! + * @brief Enable/disable internal 16kHz free running oscillator. + * + * @param base VBAT peripheral base address. + * @param enable Used to enable/disable 16kHz FRO. + * - \b true Enable internal 16kHz free running oscillator. + * - \b false Disable internal 16kHz free running oscillator. + */ +static inline void VBAT_EnableFRO16k(VBAT_Type *base, bool enable) +{ + if (enable) + { + base->FROCTLA |= VBAT_FROCTLA_FRO_EN_MASK; +#if (defined(VBAT_FROCTLB_INVERSE_MASK)) + base->FROCTLB &= ~VBAT_FROCTLB_INVERSE_MASK; +#endif /* VBAT_FROCTLB_INVERSE_MASK */ + } + else + { + base->FROCTLA &= ~VBAT_FROCTLA_FRO_EN_MASK; +#if (defined(VBAT_FROCTLB_INVERSE_MASK)) + base->FROCTLB |= VBAT_FROCTLB_INVERSE_MASK; +#endif /* VBAT_FROCTLB_INVERSE_MASK */ + } +} + +/*! + * @brief Check if internal 16kHz free running oscillator is enabled. + * + * @param base VBAT peripheral base address. + * + * @retval true The internal 16kHz Free running oscillator is enabled. + * @retval false The internal 16kHz Free running oscillator is enabled. + */ +static inline bool VBAT_CheckFRO16kEnabled(VBAT_Type *base) +{ + return (bool)((base->FROCTLA & VBAT_FROCTLA_FRO_EN_MASK) == VBAT_FROCTLA_FRO_EN_MASK); +} + +/*! + * @brief Enable FRO16kHz output clock to selected modules. + * + * @param base VBAT peripheral base address. + * @param connectionsMask The mask of modules that FRO16k is connected, should be the OR'ed + * value of @ref vbat_clock_enable_t. + */ +static inline void VBAT_UngateFRO16k(VBAT_Type *base, uint8_t connectionsMask) +{ + base->FROCLKE |= VBAT_FROCLKE_CLKE(connectionsMask); +} + +/*! + * @brief Disable FRO16kHz output clock to selected modules. + * + * @param base VBAT peripheral base address. + * @param connectionsMask The OR'ed value of @ref vbat_clock_enable_t. + */ +static inline void VBAT_GateFRO16k(VBAT_Type *base, uint8_t connectionsMask) +{ + base->FROCLKE &= ~VBAT_FROCLKE_CLKE(connectionsMask); +} + +/*! + * @brief Lock settings of internal 16kHz free running oscillator, please note that if locked 16kHz FRO's settings can + * not be updated until the next POR. + * + * @note Please note that the operation to ungate/gate FRO 16kHz output clock can not be locked by this function. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_LockFRO16kSettings(VBAT_Type *base) +{ + base->FROLCKA |= VBAT_FROLCKA_LOCK_MASK; +#if (defined(VBAT_FROLCKB_LOCK_MASK)) + base->FROLCKB &= ~VBAT_FROLCKB_LOCK_MASK; +#endif /* VBAT_FROLCKB_LOCK_MASK */ +} + +/*! + * @brief Check if FRO16K settings are locked. + * + * @param base VBAT peripheral base address. + * + * @return @c true in case of FRO16k settings are locked, @c false in case of FRO16k settings are not locked. + */ +static inline bool VBAT_CheckFRO16kSettingsLocked(VBAT_Type *base) +{ + return ((base->FROLCKA & VBAT_FROLCKA_LOCK_MASK) != 0UL); +} + +/*! @} */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG) && FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG) +/*! + * @name OSC32K Control Interfaces + * @{ + */ + +/*! + * @brief Enable/disable 32K Crystal Oscillator. + * + * @param base VBAT peripheral base address. + * @param enable Used to enable/disable 32k Crystal Oscillator: + * - \b true Enable crystal oscillator and polling status register to check clock is ready. + * - \b false Disable crystal oscillator. + */ +static inline void VBAT_EnableCrystalOsc32k(VBAT_Type *base, bool enable) +{ + if (enable) + { + base->OSCCTLA |= VBAT_OSCCTLA_OSC_EN_MASK; + base->OSCCTLB &= ~VBAT_OSCCTLA_OSC_EN_MASK; + + /* Polling status register to check clock is ready. */ + while ((base->STATUSA & VBAT_STATUSA_OSC_RDY_MASK) == 0UL) + {} + } + else + { + base->OSCCTLA &= ~VBAT_OSCCTLA_OSC_EN_MASK; + base->OSCCTLB |= VBAT_OSCCTLA_OSC_EN_MASK; + } +} + +/*! + * @brief Bypass 32k crystal oscillator, the clock is still output by oscillator but this clock is the same as clock + * provided on EXTAL pin. + * + * @note In bypass mode, oscillator must be enabled; To exit bypass mode, oscillator must be disabled. + * + * @param base VBAT peripheral base address. + * @param enableBypass Used to enter/exit bypass mode: + * - \b true Enter into bypass mode; + * - \b false Exit bypass mode. + */ +static inline void VBAT_BypassCrystalOsc32k(VBAT_Type *base, bool enableBypass) +{ + if (enableBypass) + { + base->OSCCTLA |= (VBAT_OSCCTLA_OSC_EN_MASK | VBAT_OSCCTLA_OSC_BYP_EN_MASK); + base->OSCCTLB &= ~(VBAT_OSCCTLA_OSC_EN_MASK | VBAT_OSCCTLA_OSC_BYP_EN_MASK); + } + else + { + base->OSCCTLA &= ~(VBAT_OSCCTLA_OSC_EN_MASK | VBAT_OSCCTLA_OSC_BYP_EN_MASK); + base->OSCCTLB |= (VBAT_OSCCTLA_OSC_EN_MASK | VBAT_OSCCTLA_OSC_BYP_EN_MASK); + } +} + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_OSCCTLA_FINE_AMP_GAIN_BIT) && FSL_FEATURE_MCX_VBAT_HAS_OSCCTLA_FINE_AMP_GAIN_BIT) +/*! + * @brief Adjust 32k crystal oscillator amplifier gain. + * + * @param base VBAT peripheral base address. + * @param coarse Specify amplifier coarse trim value. + * @param fine Specify amplifier fine trim value. + */ +static inline void VBAT_AdjustCrystalOsc32kAmplifierGain(VBAT_Type *base, uint8_t coarse, uint8_t fine) +{ + base->OSCCTLA = ((base->OSCCTLA & ~(VBAT_OSCCTLA_COARSE_AMP_GAIN_MASK | VBAT_OSCCTLA_FINE_AMP_GAIN_MASK)) | + (VBAT_OSCCTLA_COARSE_AMP_GAIN(coarse) | VBAT_OSCCTLA_FINE_AMP_GAIN(fine))); + base->OSCCTLB = ((base->OSCCTLB & ~(VBAT_OSCCTLA_COARSE_AMP_GAIN_MASK | VBAT_OSCCTLA_FINE_AMP_GAIN_MASK)) | + (VBAT_OSCCTLA_COARSE_AMP_GAIN(~coarse) | VBAT_OSCCTLA_FINE_AMP_GAIN(~fine))); +} +#else +/*! + * @brief Adjust 32k crystal oscillator amplifier gain. + * + * @param base VBAT peripheral base address. + * @param coarse Specify amplifier coarse trim value. + */ +static inline void VBAT_AdjustCrystalOsc32kAmplifierGain(VBAT_Type *base, uint8_t coarse) +{ + base->OSCCTLA = (base->OSCCTLA & ~VBAT_OSCCTLA_COARSE_AMP_GAIN_MASK) | (VBAT_OSCCTLA_COARSE_AMP_GAIN(coarse)); + base->OSCCTLB = (base->OSCCTLB & ~VBAT_OSCCTLA_COARSE_AMP_GAIN_MASK) | (VBAT_OSCCTLA_COARSE_AMP_GAIN(~(uint32_t)coarse)); +} + +#endif /* */ + +/*! + * @brief Set 32k crystal oscillator mode and load capacitance for the XTAL/EXTAL pin. + * + * @param base VBAT peripheral base address. + * @param operateMode Specify the crystal oscillator mode, please refer to @ref vbat_osc32k_operate_mode_t. + * @param xtalCap Specify the internal capacitance for the XTAL pin from the capacitor bank. + * @param extalCap Specify the internal capacitance for the EXTAL pin from the capacitor bank. + * + * @retval kStatus_VBAT_WrongCapacitanceValue The load capacitance value to set is not align with operate mode's + * requirements. + * @retval kStatus_Success Success to set operate mode and load capacitance. + */ +status_t VBAT_SetCrystalOsc32kModeAndLoadCapacitance(VBAT_Type *base, + vbat_osc32k_operate_mode_t operateMode, + vbat_osc32k_load_capacitance_select_t xtalCap, + vbat_osc32k_load_capacitance_select_t extalCap); + +/*! + * @brief Trim 32k crystal oscillator startup time. + * + * @param base VBAT peripheral base address. + * @param startupTime Specify the startup time of the oscillator. + */ +static inline void VBAT_TrimCrystalOsc32kStartupTime(VBAT_Type *base, vbat_osc32k_start_up_time_t startupTime) +{ + base->OSCCFGA = ((base->OSCCFGA & ~(VBAT_OSCCFGA_INIT_TRIM_MASK)) | VBAT_OSCCFGA_INIT_TRIM(startupTime)); + base->OSCCFGB = ((base->OSCCFGB & ~(VBAT_OSCCFGA_INIT_TRIM_MASK)) | VBAT_OSCCFGA_INIT_TRIM(~((uint32_t)startupTime))); +} + +/*! + * @brief Set crystal oscillator comparator trim value when oscillator is set as low power switch mode. + * + * @param base VBAT peripheral base address. + * @param comparatorTrimValue Comparator trim value, ranges from 0 to 7. + */ +static inline void VBAT_SetOsc32kSwitchModeComparatorTrimValue(VBAT_Type *base, uint8_t comparatorTrimValue) +{ + base->OSCCFGA = ((base->OSCCFGA & ~VBAT_OSCCFGA_CMP_TRIM_MASK) | VBAT_OSCCFGA_CMP_TRIM(comparatorTrimValue)); + base->OSCCFGB = ((base->OSCCFGB & ~VBAT_OSCCFGA_CMP_TRIM_MASK) | VBAT_OSCCFGA_CMP_TRIM(~((uint32_t)comparatorTrimValue))); +} + +/*! + * @brief Set crystal oscillator delay trim value when oscillator is set as low power switch mode. + * + * @param base VBAT peripheral base address. + * @param delayTrimValue Delay trim value, ranges from 0 to 15. + */ +static inline void VBAT_SetOsc32kSwitchModeDelayTrimValue(VBAT_Type *base, uint8_t delayTrimValue) +{ + base->OSCCFGA = ((base->OSCCFGA & ~VBAT_OSCCFGA_DLY_TRIM_MASK) | VBAT_OSCCFGA_DLY_TRIM(delayTrimValue)); + base->OSCCFGB = ((base->OSCCFGB & ~VBAT_OSCCFGA_DLY_TRIM_MASK) | VBAT_OSCCFGA_DLY_TRIM(~((uint32_t)delayTrimValue))); +} + +/*! + * @brief Set crystal oscillator capacitor trim value when oscillator is set as low power switch mode. + * + * @param base VBAT peripheral base address. + * @param capacitorTrimValue Capacitor value to trim, ranges from 0 to 3. + */ +static inline void VBAT_SetOsc32kSwitchModeCapacitorTrimValue(VBAT_Type *base, uint8_t capacitorTrimValue) +{ + base->OSCCFGA = ((base->OSCCFGA & ~VBAT_OSCCFGA_CAP_TRIM_MASK) | VBAT_OSCCFGA_CAP_TRIM(capacitorTrimValue)); + base->OSCCFGB = ((base->OSCCFGB & ~VBAT_OSCCFGA_CAP_TRIM_MASK) | VBAT_OSCCFGA_CAP_TRIM(~((uint32_t)capacitorTrimValue))); +} + +/*! + * @brief Lock Osc32k settings, after locked all writes to the Oscillator registers are blocked. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_LookOsc32kSettings(VBAT_Type *base) +{ + base->OSCLCKA |= VBAT_OSCLCKA_LOCK_MASK; + base->OSCLCKB &= ~VBAT_OSCLCKB_LOCK_MASK; +} + +/*! + * @brief Unlock Osc32k settings. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_UnlockOsc32kSettings(VBAT_Type *base) +{ + base->OSCLCKA &= ~VBAT_OSCLCKA_LOCK_MASK; + base->OSCLCKB |= VBAT_OSCLCKB_LOCK_MASK; +} + +/*! + * @brief Check if osc32k settings are locked. + * + * @param base VBAT peripheral base address. + * @return \c true in case of osc32k settings are locked, \c false in case of osc32k settings are not locked. + */ +static inline bool VBAT_CheckOsc32kSettingsLocked(VBAT_Type *base) +{ + return ((base->OSCLCKA & VBAT_OSCLCKA_LOCK_MASK) != 0UL); +} + +/*! + * @brief Enable OSC32k output clock to selected modules. + * + * @param base VBAT peripheral base address. + * @param connectionsMask The OR'ed value of @ref vbat_clock_enable_t. + */ +static inline void VBAT_UngateOsc32k(VBAT_Type *base, uint8_t connectionsMask) +{ + base->OSCCLKE |= VBAT_OSCCLKE_CLKE(connectionsMask); +} + +/*! + * @brief Disable OSC32k output clock to selected modules. + * + * @param base VBAT peripheral base address. + * @param connectionsMask The OR'ed value of @ref vbat_clock_enable_t. + */ +static inline void VBAT_GateOsc32k(VBAT_Type *base, uint8_t connectionsMask) +{ + base->OSCCLKE &= ~VBAT_OSCCLKE_CLKE(connectionsMask); +} + +/*! @} */ +#endif /* FSL_FEATURE_MCX_VBAT_HAS_OSCCTL_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG) && FSL_FEATURE_MCX_VBAT_HAS_LDOCTL_REG) +/*! + * @name RAM_LDO Control Interfaces + * @{ + */ + +/*! + * @brief Enable/disable Bandgap. + * + * @note The FRO16K must be enabled before enabling the bandgap. + * @note This setting can be locked by VBAT_LockRamLdoSettings() function. + * + * @param base VBAT peripheral base address. + * @param enable Used to enable/disable bandgap. + * - \b true Enable the bandgap. + * - \b false Disable the bandgap. + * + * @retval kStatus_Success Success to enable/disable the bandgap. + * @retval kStatus_VBAT_Fro16kNotEnabled Fail to enable the bandgap due to FRO16k is not enabled previously. + */ +status_t VBAT_EnableBandgap(VBAT_Type *base, bool enable); + +/*! + * @brief Check if bandgap is enabled. + * + * @param base VBAT peripheral base address. + * + * @retval true The bandgap is enabled. + * @retval false The bandgap is disabled. + */ +static inline bool VBAT_CheckBandgapEnabled(VBAT_Type *base) +{ + return (bool)((base->LDOCTLA & VBAT_LDOCTLA_BG_EN_MASK) == VBAT_LDOCTLA_BG_EN_MASK); +} + +/*! + * @brief Enable/disable bandgap low power refresh mode. + * + * @note For lowest power consumption, refresh mode must be enabled. + * @note This setting can be locked by VBAT_LockRamLdoSettings() function. + * + * @param base VBAT peripheral base address. + * @param enableRefreshMode Used to enable/disable bandgap low power refresh mode. + * - \b true Enable bandgap low power refresh mode. + * - \b false Disable bandgap low power refresh mode. + */ +static inline void VBAT_EnableBandgapRefreshMode(VBAT_Type *base, bool enableRefreshMode) +{ + if (enableRefreshMode) + { + base->LDOCTLA |= VBAT_LDOCTLA_REFRESH_EN_MASK; + base->LDOCTLB &= ~VBAT_LDOCTLA_REFRESH_EN_MASK; + } + else + { + base->LDOCTLA &= ~VBAT_LDOCTLA_REFRESH_EN_MASK; + base->LDOCTLB |= VBAT_LDOCTLA_REFRESH_EN_MASK; + } +} + +/*! + * @brief Enable/disable Backup RAM Regulator(RAM_LDO). + * + * @note This setting can be locked by VBAT_LockRamLdoSettings() function. + * + * @param base VBAT peripheral base address. + * @param enable Used to enable/disable RAM_LDO. + * - \b true Enable backup SRAM regulator. + * - \b false Disable backup SRAM regulator. + * + * @retval kStatusSuccess Success to enable/disable backup SRAM regulator. + * @retval kStatus_VBAT_Fro16kNotEnabled Fail to enable backup SRAM regulator due to FRO16k is not enabled previously. + * @retval kStatus_VBAT_BandgapNotEnabled Fail to enable backup SRAM regulator due to the bandgap is not enabled + * previously. + */ +status_t VBAT_EnableBackupSRAMRegulator(VBAT_Type *base, bool enable); + +/*! + * @brief Lock settings of RAM_LDO, please note that if locked then RAM_LDO's settings + * can not be updated until the next POR. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_LockRamLdoSettings(VBAT_Type *base) +{ + base->LDOLCKA |= VBAT_LDOLCKA_LOCK_MASK; + base->LDOLCKB &= ~VBAT_LDOLCKA_LOCK_MASK; +} + +/*! + * @brief Check if RAM_LDO settings is locked. + * + * @param base VBAT peripheral base address. + * @return @c true in case of RAM_LDO settings are locked, @c false in case of RAM_LDO settings are unlocked. + */ +static inline bool VBAT_CheckRamLdoSettingsLocked(VBAT_Type *base) +{ + return ((base->LDOLCKA & VBAT_LDOLCKA_LOCK_MASK) != 0UL); +} + +/*! + * @brief Switch the SRAM to be powered by LDO_RAM. + * + * @note This function can be used to switch the SRAM to the VBAT retention supply at any time, but please note that the + * SRAM must not be accessed during this time. + * @note Invoke this function to switch power supply before switching off external power. + * @note RAM_LDO must be enabled before invoking this function. + * @note To access the SRAM arrays retained by the LDO_RAM, please invoke VBAT_SwitchSRAMPowerBySocSupply(), after + * external power is switched back on. + * + * @param base VBAT peripheral base address. + * + * @retval kStatusSuccess Success to Switch SRAM powered by VBAT. + * @retval kStatus_VBAT_Fro16kNotEnabled Fail to switch SRAM powered by VBAT due to FRO16K not enabled previously. + */ +status_t VBAT_SwitchSRAMPowerByLDOSRAM(VBAT_Type *base); + +/*! + * @brief Switch the RAM to be powered by Soc Supply in software mode. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_SwitchSRAMPowerBySocSupply(VBAT_Type *base) +{ + base->LDORAMC &= ~VBAT_LDORAMC_SWI_MASK; + base->LDORAMC &= ~VBAT_LDORAMC_ISO_MASK; +} + +/*! + * @brief Power off selected SRAM array in low power modes. + * + * @param base VBAT peripheral base address. + * @param sramMask The mask of SRAM array to power off, should be the OR'ed value of @ref vbat_ram_array_t. + */ +static inline void VBAT_PowerOffSRAMsInLowPowerModes(VBAT_Type *base, uint8_t sramMask) +{ + base->LDORAMC |= (uint32_t)VBAT_LDORAMC_RET(sramMask); +} + +/*! + * @brief Retain selected SRAM array in low power modes. + * + * @param base VBAT peripheral base address. + * @param sramMask The mask of SRAM array to retain, should be the OR'ed value of @ref vbat_ram_array_t. + */ +static inline void VBAT_RetainSRAMsInLowPowerModes(VBAT_Type *base, uint8_t sramMask) +{ + base->LDORAMC &= ~(uint32_t)VBAT_LDORAMC_RET(sramMask); +} + +/*! + * @brief Enable/disable SRAM isolation. + * + * @param base VBAT peripheral base address. + * @param enable Used to enable/disable SRAM violation. + * - \b true SRAM will be isolated. + * - \b false SRAM state follows the SoC power modes. + */ +static inline void VBAT_EnableSRAMIsolation(VBAT_Type *base, bool enable) +{ + if (enable) + { + base->LDORAMC |= VBAT_LDORAMC_ISO_MASK; + } + else + { + base->LDORAMC &= ~VBAT_LDORAMC_ISO_MASK; + } +} + +/*! @} */ +#endif /* FSL_FEATURE_MCX_VBAT_HAS_RAM_LDO */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER) && FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER) +/*! @name Bandgap Timer Control Interfaces + * @{ + */ + +/*! + * @brief Enable/disable Bandgap timer. + * + * @note The bandgap timer is available when the bandgap is enabled and are clocked by the FRO16k. + * + * @param base VBAT peripheral base address. + * @param enable Used to enable/disable bandgap timer. + * @param timerIdMask The mask of bandgap timer Id, should be the OR'ed value of @ref vbat_bandgap_timer_id_t. + * + * @retval kStatus_Success Success to enable/disable selected bandgap timer. + * @retval kStatus_VBAT_Fro16kNotEnabled Fail to enable/disable selected bandgap timer due to FRO16k not enabled + * previously. + * @retval kStatus_VBAT_BandgapNotEnabled Fail to enable/disable selected bandgap timer due to bandgap not enabled + * previously. + */ +status_t VBAT_EnableBandgapTimer(VBAT_Type *base, bool enable, uint8_t timerIdMask); + +/*! + * @brief Set bandgap timer0 timeout value. + * + * @note The timeout value can only be changed when the timer is disabled. + * + * @param base VBAT peripheral base address. + * @param timeoutPeriod Bandgap timer timeout value, please refer to @ref vbat_bandgap_timer0_timeout_period_t. + */ +void VBAT_SetBandgapTimer0TimeoutValue(VBAT_Type *base, vbat_bandgap_timer0_timeout_period_t timeoutPeriod); + +/*! + * @brief Set bandgap timer1 timeout value. + * + * @note The timeout value can only be changed when the timer is disabled. + * + * @param base VBAT peripheral base address. + * @param timeoutPeriod The bandgap timerout 1 period, in number of seconds, ranging from 0 to 65535s. + */ +void VBAT_SetBandgapTimer1TimeoutValue(VBAT_Type *base, uint32_t timeoutPeriod); + +/*! @} */ +#endif /* FSL_FEATURE_MCX_VBAT_HAS_BANDGAP_TIMER */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_SWICTL_REG) && FSL_FEATURE_MCX_VBAT_HAS_SWICTL_REG) +/*! @name Switch Control Interfaces + * @{ + */ + +/*! + * @brief Control the VBAT internal switch in active mode, VBAT modules can be suppiled by VDD_BAT and VDD_SYS. + * + * @param base VBAT peripheral base address. + * @param supply Used to control the VBAT internal switch. + */ +static inline void VBAT_SwitchVBATModuleSupplyActiveMode(VBAT_Type *base, vbat_internal_module_supply_t supply) +{ + if (supply == kVBAT_ModuleSuppliedByVddBat) + { + base->SWICTLA &= ~VBAT_SWICTLA_SWI_EN_MASK; + base->SWICTLB |= VBAT_SWICTLA_SWI_EN_MASK; + } + else + { + base->SWICTLA |= VBAT_SWICTLA_SWI_EN_MASK; + base->SWICTLB &= ~VBAT_SWICTLA_SWI_EN_MASK; + } +} + +/*! + * @brief Get VBAT module supply in active mode. + * + * @param base VBAT peripheral base address. + * @return VDD_SYS supplies VBAT modules or VDD_BAT supplies VBAT modules, in type of @ref + * vbat_internal_module_supply_t. + */ +static inline vbat_internal_module_supply_t VBAT_GetVBATModuleSupply(VBAT_Type *base) +{ + return (vbat_internal_module_supply_t)(uint8_t)(base->SWICTLA & VBAT_SWICTLA_SWI_EN_MASK); +} + +/*! + * @brief Control the VBAT internal switch in low power modes. + * + * @note If VBAT modules are supplied by VDD_SYS in low power modes, VBAT module will also supplied by VDD_SYS in active + * mode. + * + * @param base VBAT peripheral base address. + * @param supply Used to specify which voltage input supply VBAT modules in low power mode. + */ +static inline void VBAT_SwitchVBATModuleSupplyLowPowerMode(VBAT_Type *base, vbat_internal_module_supply_t supply) +{ + if (supply == kVBAT_ModuleSuppliedByVddBat) + { + base->SWICTLA &= ~VBAT_SWICTLA_LP_EN_MASK; + base->SWICTLB |= VBAT_SWICTLA_LP_EN_MASK; + } + else + { + base->SWICTLA |= VBAT_SWICTLA_SWI_EN_MASK; + base->SWICTLB &= ~VBAT_SWICTLA_SWI_EN_MASK; + base->SWICTLA |= VBAT_SWICTLA_LP_EN_MASK; + base->SWICTLB &= ~VBAT_SWICTLA_LP_EN_MASK; + } +} + +/*! + * @brief Lock switch control, if locked all writes to the switch registers will be blocked. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_LockSwitchControl(VBAT_Type *base) +{ + base->SWILCKA |= VBAT_SWILCKA_LOCK_MASK; + base->SWILCKB &= ~VBAT_SWILCKB_LOCK_MASK; +} + +/*! + * @brief Unlock switch control. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_UnlockSwitchControl(VBAT_Type *base) +{ + base->SWILCKA &= ~VBAT_SWILCKA_LOCK_MASK; + base->SWILCKB |= VBAT_SWILCKB_LOCK_MASK; +} + +/*! + * @brief Check if switch control is locked. + * + * @param base VBAT peripheral base address. + * + * @retval false switch control is not locked. + * @retval true switch control is locked, any writes to related registers are blocked. + */ +static inline bool VBAT_CheckSwitchControlLocked(VBAT_Type *base) +{ + return ((base->SWILCKA & VBAT_SWILCKA_LOCK_MASK) != 0UL); +} + +/*! @} */ +#endif /* FSL_FEATURE_MCX_VBAT_HAS_SWICTL_REG */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG) && FSL_FEATURE_MCX_VBAT_HAS_CLKMON_REG) +/*! + * @name Clock Monitor Interfaces + * @{ + */ + +/*! + * @brief Initialize the VBAT clock monitor, enable clock monitor and set the clock monitor configuration. + * + * @note Both FRO16K and OSC32K should be enabled and stable before invoking this function. + * + * @param base VBAT peripheral base address. + * @param config Pointer to @ref vbat_clock_monitor_config_t structure. + * + * @retval kStatus_Success Clock monitor is initialized successfully. + * @retval kStatus_VBAT_Fro16kNotEnabled FRO16K is not enabled. + * @retval kStatus_VBAT_Osc32kNotReady OSC32K is not ready. + * @retval kStatus_VBAT_ClockMonitorLocked Clock monitor is locked. + */ +status_t VBAT_InitClockMonitor(VBAT_Type *base, const vbat_clock_monitor_config_t *config); + +/*! + * @brief Deinitialize the VBAT clock monitor. + * + * @param base VBAT peripheral base address. + * + * @retval kStatus_Success Clock monitor is de-initialized successfully. + * @retval kStatus_VBAT_ClockMonitorLocked Control of Clock monitor is locked. + */ +status_t VBAT_DeinitMonitor(VBAT_Type *base); + +/*! + * @brief Enable/disable clock monitor. + * + * @param base VBAT peripheral base address. + * @param enable Switcher to enable/disable clock monitor: + * - true: enable clock monitor; + * - false: disable clock monitor. + */ +static inline void VBAT_EnableClockMonitor(VBAT_Type *base, bool enable) +{ + if (enable) + { + base->MONCTLA |= VBAT_MONCTLA_MON_EN_MASK; + base->MONCTLB &= ~VBAT_MONCTLA_MON_EN_MASK; + } + else + { + base->MONCTLA &= ~VBAT_MONCTLA_MON_EN_MASK; + base->MONCTLB |= VBAT_MONCTLA_MON_EN_MASK; + } +} + +/*! + * @brief Set clock monitor's divide trim, avaiable value is #kVBAT_ClockMonitorOperateAt1kHz and + * #kVBAT_ClockMonitorOperateAt64Hz + * + * @param base VBAT peripheral base address. + * @param divideTrim Specify divide trim value, please refer to @ref vbat_clock_monitor_divide_trim_t. + */ +static inline void VBAT_SetClockMonitorDivideTrim(VBAT_Type *base, vbat_clock_monitor_divide_trim_t divideTrim) +{ + base->MONCFGA = (base->MONCFGA & ~VBAT_MONCFGA_DIVIDE_TRIM_MASK) | VBAT_MONCFGA_DIVIDE_TRIM(divideTrim); + base->MONCFGB = (base->MONCFGB & ~VBAT_MONCFGA_DIVIDE_TRIM_MASK) | VBAT_MONCFGA_DIVIDE_TRIM(~divideTrim); +} + +/*! + * @brief Set clock monitor's frequency trim, avaiable value is #kVBAT_ClockMonitorAssert2Cycle, + * #kVBAT_ClockMonitorAssert4Cycle, #kVBAT_ClockMonitorAssert6Cycle and #kVBAT_ClockMonitorAssert8Cycle. + * + * @param base VBAT peripheral base address. + * @param freqTrim Specify frequency trim value, please refer to @ref vbat_clock_monitor_freq_trim_t. + */ +static inline void VBAT_SetClockMonitorFrequencyTrim(VBAT_Type *base, vbat_clock_monitor_freq_trim_t freqTrim) +{ + base->MONCFGA = (base->MONCFGA & ~VBAT_MONCFGA_FREQ_TRIM_MASK) | VBAT_MONCFGA_FREQ_TRIM(freqTrim); + base->MONCFGB = (base->MONCFGB & ~VBAT_MONCFGA_FREQ_TRIM_MASK) | VBAT_MONCFGA_FREQ_TRIM(~freqTrim); +} + +/*! + * @brief Lock clock monitor enable/disable control. + * + * @note If locked, it is not allowed to change clock monitor enable/disable control. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_LockClockMonitorControl(VBAT_Type *base) +{ + base->MONLCKA |= VBAT_MONLCKA_LOCK_MASK; + base->MONLCKB &= ~VBAT_MONLCKA_LOCK_MASK; +} + +/*! + * @brief Unlock clock monitor enable/disable control. + * + * @param base VBTA peripheral base address. + */ +static inline void VBAT_UnlockClockMonitorControl(VBAT_Type *base) +{ + base->MONLCKA &= ~VBAT_MONLCKA_LOCK_MASK; + base->MONLCKB |= VBAT_MONLCKA_LOCK_MASK; +} + +/*! + * @brief Check if clock monitor enable/disable control is locked. + * + * @note If locked, it is not allowed to change clock monitor enable/disable control. + * + * @param base VBAT peripheral base address. + * + * @retval false clock monitor enable/disable control is not locked. + * @retval true clock monitor enable/disable control is locked, any writes to related registers are blocked. + */ +static inline bool VBAT_CheckClockMonitorControlLocked(VBAT_Type *base) +{ + return ((base->MONLCKA & VBAT_MONLCKA_LOCK_MASK) != 0UL); +} + +/*! @} */ +#endif /* FSL_FEATURE_VBAT_HAS_CLOCK_MONITOR */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG) && FSL_FEATURE_MCX_VBAT_HAS_TAMPER_REG) +/*! @name Tamper Control Interfaces + * + */ + +/*! + * @brief Initialize tamper control. + * + * @note Both FRO16K and bandgap should be enabled before calling this function. + * + * @param base VBAT peripheral base address. + * @param config Pointer to @ref vbat_tamper_config_t structure. + * + * @retval kStatus_Success Tamper is initialized successfully. + * @retval kStatus_VBAT_TamperLocked Tamper control is locked. + * @retval kStatus_VBAT_BandgapNotEnabled Bandgap is not enabled. + * @retval kStatus_VBAT_Fro16kNotEnabled FRO 16K is not enabled. + */ +status_t VBAT_InitTamper(VBAT_Type *base, const vbat_tamper_config_t *config); + +/*! + * @brief De-initialize tamper control. + * + * @param base VBAT peripheral base address. + * + * @retval kStatus_Success Tamper is de-initialized successfully. + * @retval kStatus_VBAT_TamperLocked Tamper control is locked. + */ +status_t VBAT_DeinitTamper(VBAT_Type *base); + +/*! + * @brief Enable tampers for VBAT. + * + * @param base VBAT peripheral base address. + * @param tamperEnableMask Mask of tamper to be enabled, should be the OR'ed value of @ref _vbat_tamper_enable. + */ +static inline void VBAT_EnableTamper(VBAT_Type *base, uint32_t tamperEnableMask) +{ + base->TAMPERA |= tamperEnableMask; + base->TAMPERB &= ~tamperEnableMask; +} + +/*! + * @brief Disable tampers for VBAT. + * + * @param base VBAT peripheral base address. + * @param tamperEnableMask Mask of tamper to be disabled, should be the OR'ed value of @ref _vbat_tamper_enable. + */ +static inline void VBAT_DisableTamper(VBAT_Type *base, uint32_t tamperEnableMask) +{ + base->TAMPERA &= ~tamperEnableMask; + base->TAMPERB |= tamperEnableMask; +} + +/*! + * @brief Get tamper enable information. + * + * @param base VBAT peripheral base address. + * + * @return Mask of tamper enable information, should be the OR'ed value of @ref _vbat_tamper_enable. + */ +static inline uint32_t VBAT_GetTamperEnableInfo(VBAT_Type *base) +{ + return base->TAMPERA; +} + +/*! + * @brief Lock tamper control, if locked, it is not allowed to change tamper control. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_LockTamperControl(VBAT_Type *base) +{ + base->TAMLCKA |= VBAT_TAMLCKA_LOCK_MASK; + base->TAMLCKB &= ~VBAT_TAMLCKA_LOCK_MASK; +} + +/*! + * @brief Unlock tamper control. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_UnlockTamperControl(VBAT_Type *base) +{ + base->TAMLCKA &= ~VBAT_TAMLCKA_LOCK_MASK; + base->TAMLCKB |= VBAT_TAMLCKA_LOCK_MASK; +} + +/*! + * @brief Check if tamper control is locked. + * + * @param base VBAT peripheral base address. + * + * @retval false Tamper control is not locked. + * @retval true Tamper control is locked, any writes to related registers are blocked. + */ +static inline bool VBAT_CheckTamperControlLocked(VBAT_Type *base) +{ + return ((base->TAMLCKA & VBAT_TAMLCKA_LOCK_MASK) != 0UL); +} + +/*! @} */ +#endif /* FSL_FEATURE_VBAT_HAS_TAMPER */ + +#if (defined(FSL_FEATURE_MCX_VBAT_HAS_STATUS_REG) && FSL_FEATURE_MCX_VBAT_HAS_STATUS_REG) +/*! @name Status, Interrupt, Wakeup Control Interfaces + * @{ + */ + +/*! + * @brief Get VBAT status flags + * + * @param base VBAT peripheral base address. + * @return The asserted status flags, should be the OR'ed value of @ref vbat_status_flag_t. + */ +static inline uint32_t VBAT_GetStatusFlags(VBAT_Type *base) +{ + return (uint32_t)(base->STATUSA); +} + +/*! + * @brief Clear VBAT status flags. + * + * @param base VBAT peripheral base address. + * @param mask The mask of status flags to be cleared, should be the OR'ed value of @ref vbat_status_flag_t except + * @ref kVBAT_StatusFlagLdoReady, @ref kVBAT_StatusFlagOsc32kReady, @ref kVBAT_StatusFlagInterrupt0Detect, + * @ref kVBAT_StatusFlagInterrupt1Detect, @ref kVBAT_StatusFlagInterrupt2Detect, + * @ref kVBAT_StatusFlagInterrupt3Detect. + */ +static inline void VBAT_ClearStatusFlags(VBAT_Type *base, uint32_t mask) +{ + base->STATUSA = mask; + base->STATUSB = ~mask; +} + +/*! + * @brief Enable interrupts for the VBAT module, such as POR detect interrupt, Wakeup Pin interrupt and so on. + * + * @param base VBAT peripheral base address. + * @param mask The mask of interrupts to be enabled, should be the OR'ed value of @ref vbat_interrupt_enable_t. + */ +static inline void VBAT_EnableInterrupts(VBAT_Type *base, uint32_t mask) +{ + base->IRQENA |= mask; + base->IRQENB &= (uint32_t)~mask; +} + +/*! + * @brief Disable interrupts for the VBAT module, such as POR detect interrupt, wakeup pin interrupt and so on. + * + * @param base VBAT peripheral base address. + * @param mask The mask of interrupts to be disabled, should be the OR'ed value of @ref vbat_interrupt_enable_t. + */ +static inline void VBAT_DisableInterrupts(VBAT_Type *base, uint32_t mask) +{ + base->IRQENA &= ~mask; + base->IRQENB |= mask; +} + +/*! + * @brief Enable wakeup for the VBAT module, such as POR detect wakeup, wakeup pin wakeup and so on. + * + * @param base VBAT peripheral base address. + * @param mask The mask of enumerators in @ref vbat_wakeup_enable_t. + */ +static inline void VBAT_EnableWakeup(VBAT_Type *base, uint32_t mask) +{ + base->WAKENA |= mask; + base->WAKENB &= ~mask; +} + +/*! + * @brief Disable wakeup for VBAT module, such as POR detect wakeup, wakeup pin wakeup and so on. + * + * @param base VBAT peripheral base address. + * @param mask The mask of enumerators in @ref vbat_wakeup_enable_t. + */ +static inline void VBAT_DisableWakeup(VBAT_Type *base, uint32_t mask) +{ + base->WAKENA &= ~mask; + base->WAKENB |= mask; +} + +/*! + * @brief Lock VBAT interrupt and wakeup settings, please note that if locked the interrupt and wakeup settings can not + * be updated until the next POR. + * + * @param base VBAT peripheral base address. + */ +static inline void VBAT_LockInterruptWakeupSettings(VBAT_Type *base) +{ + base->LOCKA |= VBAT_LOCKA_LOCK_MASK; +} + +/*! + * @brief Set the default state of the WAKEUP_b pin output when no enabled wakeup source is asserted. + * + * @param base VBAT peripheral base address. + * @param assert Used to set default state of the WAKEUP_b pin output: + * - \b true WAKEUP_b output state is logic one; + * - \b false WAKEUP_b output state is logic zero. + */ +static inline void VBAT_SetWakeupPinDefaultState(VBAT_Type *base, bool assert) +{ + if (assert) + { + base->WAKECFG |= VBAT_WAKECFG_OUT_MASK; + } + else + { + base->WAKECFG &= ~VBAT_WAKECFG_OUT_MASK; + } +} + +/*! @} */ +#endif /* FSL_FEATURE_MCX_VBAT_HAS_STATUS_REG */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* FSL_VBAT_H__ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_waketimer.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_waketimer.c new file mode 100644 index 00000000000..d45699c605d --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_waketimer.c @@ -0,0 +1,253 @@ +/* + * Copyright 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_waketimer.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.waketimer" +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * brief Gets the instance from the base address + * + * param base WAKETIMER peripheral base address + * + * return The WAKETIMER instance + */ +static uint32_t WAKETIMER_GetInstance(WAKETIMER_Type *base); + +/*! + * brief WAKETIMER generic IRQ handle function. + * + * param index WAKETIMER peripheral instance index. + */ +static void WAKETIMER_GenericIRQHandler(WAKETIMER_Type *base, waketimer_callback_t callback); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* Array of WAKETIMER peripheral base address. */ +static WAKETIMER_Type *const s_waketimerBases[] = WAKETIMER_BASE_PTRS; +/* Array of WAKETIMER ISR. */ +static waketimer_callback_t s_waketimerCallback[sizeof(s_waketimerBases) / sizeof(s_waketimerBases[0])]; +/* Array of WAKETIMER IRQ number. */ +static const IRQn_Type s_waketimerIRQ[] = WAKETIMER_IRQS; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/* brief Function for getting the instance number of Waketimer. */ +static uint32_t WAKETIMER_GetInstance(WAKETIMER_Type *base) +{ + uint32_t instance; + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < ARRAY_SIZE(s_waketimerBases); instance++) + { + if (s_waketimerBases[instance] == base) + { + break; + } + } + + assert(instance < ARRAY_SIZE(s_waketimerBases)); + + return instance; +} + +/*! + * brief Initializes an WAKETIMER. + * param base WAKETIMER peripheral base address. + */ +void WAKETIMER_Init(WAKETIMER_Type *base, const waketimer_config_t *config) +{ + assert(NULL != base); + + uint32_t index = WAKETIMER_GetInstance(base); + + /* Halt timer */ + base->WAKE_TIMER_CTRL |= WAKETIMER_WAKE_TIMER_CTRL_CLR_WAKE_TIMER_MASK; + + /* Set OSC divide */ + if (config->enableOSCDivide) + { + base->WAKE_TIMER_CTRL |= WAKETIMER_WAKE_TIMER_CTRL_OSC_DIV_ENA_MASK; + } + else + { + base->WAKE_TIMER_CTRL &= ~WAKETIMER_WAKE_TIMER_CTRL_OSC_DIV_ENA_MASK; + } + + /* Set callback */ + s_waketimerCallback[index] = config->callback; + + /* Set interrupt */ + if (config->enableInterrupt) + { + base->WAKE_TIMER_CTRL |= WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_MASK; + (void)EnableIRQ(s_waketimerIRQ[index]); + } + else + { + base->WAKE_TIMER_CTRL &= ~WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_MASK; + (void)DisableIRQ(s_waketimerIRQ[index]); + } +} + +/*! + * brief Deinitializes a WAKETIMER instance. + * + * This function deinitializes the WAKETIMER. + * + * param base WAKETIMER peripheral base address. + */ +void WAKETIMER_Deinit(WAKETIMER_Type *base) +{ + assert(NULL != base); + + uint32_t index = WAKETIMER_GetInstance(base); + + /* Disable IRQ at NVIC Level */ + (void)DisableIRQ(s_waketimerIRQ[index]); +} + +/*! + * brief Fills in the WAKETIMER configuration structure with the default settings. + * + * The default values are: + * code + * config->enableInterrupt = true; + * config->enableOSCDivide = true; + * config->callback = NULL; + * endcode + * param config Pointer to the user configuration structure. + */ +void WAKETIMER_GetDefaultConfig(waketimer_config_t *config) +{ + config->enableInterrupt = true; + config->enableOSCDivide = true; + config->callback = NULL; +} + +/*! + * brief Enables the selected WAKETIMER interrupts. + * + * param base WAKETIMER peripheral base address + * param mask Mask value for interrupt events. See to #_waketimer_interrupt_enable + */ +void WAKETIMER_EnableInterrupts(WAKETIMER_Type *base, uint32_t mask) +{ + assert(NULL != base); + + if (0U != (mask & (uint32_t)kWAKETIMER_WakeInterruptEnable)) + { + base->WAKE_TIMER_CTRL |= WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_MASK; + } +} + +/*! + * brief Disable the selected WAKETIMER interrupts. + * + * param base WAKETIMER peripheral base address + * param mask Mask value for interrupt events. See to #_waketimer_interrupt_enable + */ +void WAKETIMER_DisableInterrupts(WAKETIMER_Type *base, uint32_t mask) +{ + assert(NULL != base); + + if (0U != (mask & (uint32_t)kWAKETIMER_WakeInterruptEnable)) + { + base->WAKE_TIMER_CTRL &= ~WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_MASK; + } +} + +/*! + * brief Clear Status Interrupt Flag. + * + * This clears intrrupt status flag. + * Currently, only match interrupt flag can be cleared. + * + * param base WAKETIMER peripheral base address. + * param mask Mask value for flags to be cleared. See to #_waketimer_status_flags. + * return none + */ +void WAKETIMER_ClearStatusFlags(WAKETIMER_Type *base, uint32_t mask) +{ + if (0U != (mask & (uint32_t)kWAKETIMER_WakeFlag)) + { + base->WAKE_TIMER_CTRL |= WAKETIMER_WAKE_TIMER_CTRL_WAKE_FLAG_MASK; + } +} + +/*! + * brief Receive noticification when waketime countdown. + * + * If the interrupt for the waketime countdown is enabled, then a callback can be registered + * which will be invoked when the event is triggered + * + * param base WAKETIMER peripheral base address + * param callback Function to invoke when the event is triggered + */ +void WAKETIMER_SetCallback(WAKETIMER_Type *base, waketimer_callback_t callback) +{ + assert(NULL != base); + + uint32_t index = WAKETIMER_GetInstance(base); + s_waketimerCallback[index] = callback; +} + +/*! + * brief Get current timer count value from WAKETIMER. + * + * This function will get a decimal timer count value. + * The RAW value of timer count is gray code format, will be translated to decimal data internally. + * + * param base WAKETIMER peripheral base address. + * return Value of WAKETIMER which will formated to decimal value. + */ +uint32_t WAKETIMER_GetCurrentTimerValue(WAKETIMER_Type *base) +{ + uint32_t value1 = 0; + uint32_t value2 = 0; + + do + { + value1 = base->WAKE_TIMER_CNT; + value2 = base->WAKE_TIMER_CNT; + } while (value1 != value2); + + return value1; +} + +static void WAKETIMER_GenericIRQHandler(WAKETIMER_Type *base, waketimer_callback_t callback) +{ + /* Clear interrupt flag. */ + WAKETIMER_ClearStatusFlags(base, (uint32_t)kWAKETIMER_WakeFlag); + + if (callback != NULL) + { + callback(); + } +} + +#if defined(WAKETIMER0) +void WAKETIMER0_DriverIRQHandler(void); +void WAKETIMER0_DriverIRQHandler(void) +{ + WAKETIMER_GenericIRQHandler(WAKETIMER0, s_waketimerCallback[0]); + SDK_ISR_EXIT_BARRIER; +} +#endif diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_waketimer.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_waketimer.h new file mode 100644 index 00000000000..9913ff96672 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_waketimer.h @@ -0,0 +1,212 @@ +/* + * Copyright 2023 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_WAKETIMER_H_ +#define FSL_WAKETIMER_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup waketimer + * @{ + */ + +/*! @file*/ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief WAKETIMER driver version. */ +#define FSL_WAKETIMER_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) +/*! @} */ + +/*! + * @brief WAKETIMER status flags. + */ +enum _waketimer_status_flags +{ + kWAKETIMER_WakeFlag = + (WAKETIMER_WAKE_TIMER_CTRL_WAKE_FLAG_MASK), /*!< Wake Timer Status Flag, sets wake timer has timed out. */ +}; + +/*! + * @brief Define interrupt switchers of the module. + */ +enum _waketimer_interrupt_enable +{ + kWAKETIMER_WakeInterruptEnable = WAKETIMER_WAKE_TIMER_CTRL_INTR_EN_MASK, /*!< Generate interrupt + requests when WAKE_FLAG is asserted. */ +}; + +/*! @brief waketimer callback function. */ +typedef void (*waketimer_callback_t)(void); + +/*! + * @brief WAKETIMER configuration structure + * + * This structure holds the configuration settings for the WAKETIMER peripheral. To initialize this + * structure to reasonable defaults, call the WAKETIMER_GetDefaultConfig() function and pass a + * pointer to the configuration structure instance. + * + * The configuration structure can be made constant so as to reside in flash. + */ +typedef struct _waketimer_config +{ + bool enableOSCDivide; /*!< true: Enable OSC Divide. + false: Disable OSC Divide. */ + bool enableInterrupt; /*!< true: Enable interrupt. + false: Disable interrupt. */ + waketimer_callback_t callback; /*!< timer countdown callback. */ +} waketimer_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* _cplusplus */ + +/*! + * @name Initialization and deinitialization + * @{ + */ + +/*! + * @brief Initializes an WAKETIMER + * + * This function initializes the WAKETIMER. + * + * @param base WAKETIMER peripheral base address. + * @param config Pointer to the user configuration structure. + */ +void WAKETIMER_Init(WAKETIMER_Type *base, const waketimer_config_t *config); + +/*! + * @brief Deinitializes a WAKETIMER instance. + * + * This function deinitialize the WAKETIMER. + * + * @param base WAKETIMER peripheral base address. + */ +void WAKETIMER_Deinit(WAKETIMER_Type *base); + +/*! + * @brief Fills in the WAKETIMER configuration structure with the default settings. + * + * The default values are: + * @code + * config->enableInterrupt = true; + * config->enableOSCDivide = true; + * config->callback = NULL; + * @endcode + * @param config Pointer to the user configuration structure. + */ +void WAKETIMER_GetDefaultConfig(waketimer_config_t *config); + +/*! @}*/ + +/*! + * @name Interrupt Interface + * @{ + */ + +/*! + * @brief Enables the selected WAKETIMER interrupts. + * + * @param base WAKETIMER peripheral base address + * @param mask Mask value for interrupt events. See to #_waketimer_interrupt_enable + */ +void WAKETIMER_EnableInterrupts(WAKETIMER_Type *base, uint32_t mask); + +/*! + * @brief Enables the selected WAKETIMER interrupts. + * + * @param base WAKETIMER peripheral base address + * @param mask Mask value for interrupt events. See to #_waketimer_interrupt_enable + */ +void WAKETIMER_DisableInterrupts(WAKETIMER_Type *base, uint32_t mask); + +/*! + * @brief Clear Status Interrupt Flag. + * + * This clears intrrupt status flag. + * Currently, only match interrupt flag can be cleared. + * + * @param base WAKETIMER peripheral base address. + * @param mask Mask value for flags to be cleared. See to #_waketimer_status_flags. + * @return none + */ +void WAKETIMER_ClearStatusFlags(WAKETIMER_Type *base, uint32_t mask); + +/*! + * @brief Receive noticification when waketime countdown. + * + * If the interrupt for the waketime countdown is enabled, then a callback can be registered + * which will be invoked when the event is triggered + * + * @param base WAKETIMER peripheral base address + * @param callback Function to invoke when the event is triggered + */ +void WAKETIMER_SetCallback(WAKETIMER_Type *base, waketimer_callback_t callback); + +/*! @}*/ + +/*! + * @name Timer Start and Stop + * @{ + */ + +/*! + * @brief Halt and clear timer counter. + * + * This halt and clear timer counter. + * + * @param base WAKETIMER peripheral base address. + * @return none + */ +static inline void WAKETIMER_HaltTimer(WAKETIMER_Type *base) +{ + base->WAKE_TIMER_CTRL |= WAKETIMER_WAKE_TIMER_CTRL_CLR_WAKE_TIMER_MASK; +} + +/*! + * @brief Set timer counter. + * + * This set the timer counter and start the timer countdown. + * + * @param base WAKETIMER peripheral base address. + * @param value countdown value. + * @return none + */ +static inline void WAKETIMER_StartTimer(WAKETIMER_Type *base, uint32_t value) +{ + base->WAKE_TIMER_CNT = value; +} + +/*! + * @brief Get current timer count value from WAKETIMER. + * + * This function will get a decimal timer count value. + * The RAW value of timer count is gray code format, will be translated to decimal data internally. + * + * @param base WAKETIMER peripheral base address. + * @return Value of WAKETIMER which will be formated to decimal value. + */ +uint32_t WAKETIMER_GetCurrentTimerValue(WAKETIMER_Type *base); + +/*! @}*/ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* FSL_WAKETIMER_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wuu.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wuu.c new file mode 100644 index 00000000000..214e7c07f08 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wuu.c @@ -0,0 +1,312 @@ +/* + * Copyright 2019-2024 NXP. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_wuu.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.wuu" +#endif + +#define WUU_PE_REG_BIT_FIELD_MASK 0x03UL +#define WUU_PDC_REG_BIT_FIELD_MASK 0x03UL +#define WUU_PMC_REG_BIT_FIELD_MASK 0x01UL + +#define WUU_ME_REG_WUME_FIELD_MASK 0x01UL +#define WUU_DE_REG_WUME_FIELD_MASK 0x01UL + +#define WUU_FILT_REG_FILTE_FIELD_MASK 0x60U +#define WUU_FILT_REG_FILTSET_FIELD_MASK 0x1FU +#define WUU_FDC_REG_FILTC_FIELD_MASK 0x3U +#define WUU_FMC_REG_FILTM_FIELD_MASK 0x1U + +#define WUU_FILT_REG_FILTSET_FIELD(x) (((uint32_t)(x) << 5UL) & WUU_FILT_REG_FILTE_FIELD_MASK) +#define WUU_CLEAR_BIT_FIELD_IN_REG(mask, offset) (~((uint32_t)(mask) << (offset))) +#define WUU_SET_BIT_FIELD_IN_REG(val, offset) ((uint32_t)(val) << (offset)) +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Enables and Configs External WakeUp Pins. + * + * This function enables/disables the external pin as wakeup input. What's more this + * function configs pins options, including edge detection wakeup event and operate mode. + * + * param base MUU peripheral base address. + * param pinIndex The index of the external input pin. See Reference Manual for the details. + * param config Pointer to wuu_external_wakeup_pin_config_t structure. + */ +void WUU_SetExternalWakeUpPinsConfig(WUU_Type *base, uint8_t pinIndex, const wuu_external_wakeup_pin_config_t *config) +{ + assert(config != NULL); + + volatile uint32_t *edgeRegBase = NULL; + volatile uint32_t *eventRegBase = NULL; + uint32_t edgeReg; + uint32_t eventReg; + uint32_t modeReg; + uint8_t offset; + + /* Calculate offset. */ + offset = 2U * (pinIndex & 0xFU); + + if (config->edge != kWUU_ExternalPinDisable) + { + /* Based on pin index, get register base address. */ + if ((pinIndex >> 4U) != 0U) + { + edgeRegBase = &base->PE2; + eventRegBase = &base->PDC2; + } + else + { + edgeRegBase = &base->PE1; + eventRegBase = &base->PDC1; + } + + /* Enable and config the edge detection. */ + edgeReg = *edgeRegBase; + edgeReg &= WUU_CLEAR_BIT_FIELD_IN_REG(WUU_PE_REG_BIT_FIELD_MASK, offset); + edgeReg |= WUU_SET_BIT_FIELD_IN_REG(config->edge, offset); + *edgeRegBase = edgeReg; + + /* Config the wakeup event. */ + eventReg = *eventRegBase; + eventReg &= WUU_CLEAR_BIT_FIELD_IN_REG(WUU_PDC_REG_BIT_FIELD_MASK, offset); + eventReg |= WUU_SET_BIT_FIELD_IN_REG(config->event, offset); + *eventRegBase = eventReg; + + /* Config operate mode. */ + modeReg = base->PMC; + modeReg &= WUU_CLEAR_BIT_FIELD_IN_REG(WUU_PMC_REG_BIT_FIELD_MASK, pinIndex); + modeReg |= WUU_SET_BIT_FIELD_IN_REG(config->mode, pinIndex); + + base->PMC = modeReg; + } + else + { + /* Based on pin index, get register base address. */ + if ((pinIndex >> 4U) != 0U) + { + edgeRegBase = &base->PE2; + } + else + { + edgeRegBase = &base->PE1; + } + + edgeReg = *edgeRegBase; + edgeReg &= WUU_CLEAR_BIT_FIELD_IN_REG(WUU_PE_REG_BIT_FIELD_MASK, offset); + *edgeRegBase = edgeReg; + } +} + +/*! + * brief Disable and clear external wakeup pin settings. + * + * param base MUU peripheral base address. + * param pinIndex The index of the external input pin. + */ +void WUU_ClearExternalWakeupPinsConfig(WUU_Type *base, uint8_t pinIndex) +{ + if (pinIndex <= 15U) + { + base->PE1 &= ~(WUU_PE_REG_BIT_FIELD_MASK << (2UL * (uint32_t)pinIndex)); + base->PDC1 &= ~(WUU_PDC_REG_BIT_FIELD_MASK << (2UL * (uint32_t)pinIndex)); + } + else + { + base->PE1 &= ~(WUU_PE_REG_BIT_FIELD_MASK << (2UL * (uint32_t)((uint32_t)pinIndex % 16UL))); + base->PDC1 &= ~(WUU_PDC_REG_BIT_FIELD_MASK << (2UL * (uint32_t)((uint32_t)pinIndex % 16UL))); + } +} + +/*! + * brief Config Internal modules' event as the wake up soures. + * + * This function configs the internal modules event as the wake up sources. + * + * param base WUU peripheral base address. + * param moduleIndex The selected internal module. See the Reference Manual for the details. + * param event Select interrupt or DMA/Trigger of the internal module as the wake up source. + */ +void WUU_SetInternalWakeUpModulesConfig(WUU_Type *base, uint8_t moduleIndex, wuu_internal_wakeup_module_event_t event) +{ + switch (event) + { + case kWUU_InternalModuleInterrupt: + base->ME |= WUU_SET_BIT_FIELD_IN_REG(WUU_ME_REG_WUME_FIELD_MASK, moduleIndex); + break; + case kWUU_InternalModuleDMATrigger: + base->DE |= WUU_SET_BIT_FIELD_IN_REG(WUU_DE_REG_WUME_FIELD_MASK, moduleIndex); + break; + default: + assert(false); + break; + } +} + +/*! + * brief Disable an on-chip internal modules' event as the wakeup sources. + * + * param base WUU peripheral base address. + * param moduleIndex The selected internal module. See the Reference Manual for the details. + * param event The event(interrupt or DMA/trigger) of the internal module to disable. + */ +void WUU_ClearInternalWakeUpModulesConfig(WUU_Type *base, uint8_t moduleIndex, wuu_internal_wakeup_module_event_t event) +{ + switch(event) + { + case kWUU_InternalModuleInterrupt: + base->ME &= ~WUU_SET_BIT_FIELD_IN_REG(WUU_ME_REG_WUME_FIELD_MASK, moduleIndex); + break; + case kWUU_InternalModuleDMATrigger: + base->DE &= ~WUU_SET_BIT_FIELD_IN_REG(WUU_DE_REG_WUME_FIELD_MASK, moduleIndex); + break; + default: + assert(false); + break; + } +} + +/*! + * brief Configs and Enables Pin filters. + * + * This function configs Pin filter, including pin select, filer operate mode + * filer wakeup event and filter edge detection. + * + * param base WUU peripheral base address. + * param filterIndex The index of the pin filer. + * param config Pointer to wuu_pin_filter_config_t structure. + */ +void WUU_SetPinFilterConfig(WUU_Type *base, uint8_t filterIndex, const wuu_pin_filter_config_t *config) +{ + assert(config != NULL); + + uint8_t shift; + uint32_t filterReg; + uint32_t eventReg; + uint32_t modeReg; + + shift = (filterIndex - 1U) * 8U; + filterReg = base->FILT; + filterReg &= WUU_CLEAR_BIT_FIELD_IN_REG(WUU_FILT_REG_FILTE_FIELD_MASK, shift); + filterReg |= WUU_SET_BIT_FIELD_IN_REG(WUU_FILT_REG_FILTSET_FIELD(config->edge), shift); + + if (config->edge != kWUU_FilterDisabled) + { + filterReg &= WUU_CLEAR_BIT_FIELD_IN_REG(WUU_FILT_REG_FILTSET_FIELD_MASK, shift); + filterReg |= WUU_SET_BIT_FIELD_IN_REG(config->pinIndex, shift); + + /* Config wake up event. */ + shift = (filterIndex - 1U) * 2U; + eventReg = base->FDC; + eventReg &= WUU_CLEAR_BIT_FIELD_IN_REG(WUU_FDC_REG_FILTC_FIELD_MASK, shift); + eventReg |= WUU_SET_BIT_FIELD_IN_REG(config->event, shift); + base->FDC = eventReg; + + /* Config operate mode. */ + shift = (filterIndex - 1U) * 1U; + modeReg = base->FMC; + modeReg &= WUU_CLEAR_BIT_FIELD_IN_REG(WUU_FMC_REG_FILTM_FIELD_MASK, shift); + modeReg |= WUU_SET_BIT_FIELD_IN_REG(config->mode, shift); + base->FMC = modeReg; + } + + base->FILT = filterReg; +} + +/*! + * brief Gets the pin filter configuration. + * + * This function gets the pin filter flag. + * + * param base WUU peripheral base address. + * param filterIndex A pin filter index, which starts from 1. + * return True if the flag is a source of the existing low-leakage power mode. + */ +bool WUU_GetPinFilterFlag(WUU_Type *base, uint8_t filterIndex) +{ + bool ret = false; + + switch (filterIndex) + { + case 1: + ret = ((base->FILT & WUU_FILT_FILTF1_MASK) != 0U); + break; + case 2: + ret = ((base->FILT & WUU_FILT_FILTF2_MASK) != 0U); + break; + default: + ret = false; + break; + } + + return ret; +} + +/*! + * brief Clears the pin filter configuration. + * + * This function clears the pin filter flag. + * + * param base WUU peripheral base address. + * param filterIndex A pin filter index to clear the flag, starting from 1. + */ +void WUU_ClearPinFilterFlag(WUU_Type *base, uint8_t filterIndex) +{ + uint32_t reg; + + reg = base->FILT; + /* Clean the W1C bits, in case the flags are cleared by mistake. */ + reg &= ~(WUU_FILT_FILTF1_MASK | WUU_FILT_FILTF2_MASK); + + reg |= WUU_SET_BIT_FIELD_IN_REG(WUU_FILT_FILTF1_MASK, ((filterIndex - 1U) * 8U)); + + base->FILT = reg; +} + +/*! + * brief Gets the external wakeup source flag. + * + * This function checks the external pin flag to detect whether the MCU is + * woken up by the specific pin. + * + * param base WUU peripheral base address. + * param pinIndex A pin index, which starts from 0. + * return True if the specific pin is a wakeup source. + */ +bool WUU_GetExternalWakeupPinFlag(WUU_Type *base, uint32_t pinIndex) +{ + return (0U != (base->PF & (1UL << pinIndex))); +} + +/*! + * brief Clears the external wakeup source flag. + * + * This function clears the external wakeup source flag for a specific pin. + * + * param base WUU peripheral base address. + * param pinIndex A pin index, which starts from 0. + */ +void WUU_ClearExternalWakeupPinFlag(WUU_Type *base, uint32_t pinIndex) +{ + base->PF = (1UL << pinIndex); +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wuu.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wuu.h new file mode 100644 index 00000000000..bedfde56859 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wuu.h @@ -0,0 +1,294 @@ +/* + * Copyright 2019-2024 NXP. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_WUU_H_ +#define FSL_WUU_H_ + +#include "fsl_common.h" + +/*! @addtogroup wuu */ +/*! @{ */ + +/******************************************************************************* + * Definitions + *******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief Defines WUU driver version 2.4.0. */ +#define FSL_WUU_DRIVER_VERSION (MAKE_VERSION(2, 4, 0)) +/*! @} */ + +/*! + * @brief External WakeUp pin edge detection enumeration. + */ +typedef enum _wuu_external_pin_edge_detection +{ + kWUU_ExternalPinDisable = 0x0U, /*!< External input Pin disabled as wake up input. */ + kWUU_ExternalPinRisingEdge = 0x1U, /*!< External input Pin enabled with the rising edge detection. */ + kWUU_ExternalPinFallingEdge = 0x2U, /*!< External input Pin enabled with the falling edge detection. */ + kWUU_ExternalPinAnyEdge = 0x3U, /*!< External input Pin enabled with any change detection. */ +} wuu_external_pin_edge_detection_t; + +/*! + * @brief External input wake up pin event enumeration. + */ +typedef enum _wuu_external_wakeup_pin_event +{ + kWUU_ExternalPinInterrupt = 0x0U, /*!< External input Pin configured as interrupt. */ + kWUU_ExternalPinDMARequest = 0x1U, /*!< External input Pin configured as DMA request. */ + kWUU_ExternalPinTriggerEvent = 0x2U, /*!< External input Pin configured as Trigger event. */ +} wuu_external_wakeup_pin_event_t; + +/*! + * @brief External input wake up pin mode enumeration. + */ +typedef enum _wuu_external_wakeup_pin_mode +{ + kWUU_ExternalPinActiveDSPD = 0x0U, /*!< External input Pin is active only during Deep Sleep/Power Down Mode. */ + kWUU_ExternalPinActiveAlways = 0x1U, /*!< External input Pin is active during all power modes. */ +} wuu_external_wakeup_pin_mode_t; + +/*! + * @brief Internal module wake up event enumeration. + */ +typedef enum _wuu_internal_wakeup_module_event +{ + kWUU_InternalModuleInterrupt = 0x0U, /*!< Internal modules' interrupt as a wakeup source. */ + kWUU_InternalModuleDMATrigger = 0x1U, /*!< Internal modules' DMA/Trigger as a wakeup source. */ +} wuu_internal_wakeup_module_event_t; + +/*! + * @brief Pin filter edge enumeration. + */ +typedef enum _wuu_filter_edge +{ + kWUU_FilterDisabled = 0x0U, /*!< Filter disabled. */ + kWUU_FilterPosedgeEnable = 0x1U, /*!< Filter posedge detect enabled. */ + kWUU_FilterNegedgeEnable = 0x2U, /*!< Filter negedge detect enabled. */ + kWUU_FilterAnyEdge = 0x3U, /*!< Filter any edge detect enabled. */ +} wuu_filter_edge_t; + +/*! + * @brief Pin Filter event enumeration. + */ +typedef enum _wuu_filter_event +{ + kWUU_FilterInterrupt = 0x0U, /*!< Filter output configured as interrupt. */ + kWUU_FilterDMARequest = 0x1U, /*!< Filter output configured as DMA request. */ + kWUU_FilterTriggerEvent = 0x2U, /*!< Filter output configured as Trigger event. */ +} wuu_filter_event_t; + +/*! + * @brief Pin filter mode enumeration. + */ +typedef enum _wuu_filter_mode +{ + kWUU_FilterActiveDSPD = 0x0U, /*!< External input pin filter is active only during Deep Sleep/Power Down Mode. */ + kWUU_FilterActiveAlways = 0x1U, /*!< External input Pin filter is active during all power modes. */ +} wuu_filter_mode_t; + +/*! + * @brief External WakeUp pin configuration + */ +typedef struct _wuu_external_wakeup_pin_config +{ + wuu_external_pin_edge_detection_t edge; /*!< External Input pin edge detection. */ + wuu_external_wakeup_pin_event_t event; /*!< External Input wakeup Pin event */ + wuu_external_wakeup_pin_mode_t mode; /*!< External Input wakeup Pin operate mode. */ +} wuu_external_wakeup_pin_config_t; + +/*! + * @brief Pin Filter configuration. + */ +typedef struct _wuu_pin_filter_config +{ + uint32_t pinIndex; /*!< The index of wakeup pin to be muxxed into filter. */ + wuu_filter_edge_t edge; /*!< The edge of the pin digital filter. */ + wuu_filter_event_t event; /*!< The event of the filter output. */ + wuu_filter_mode_t mode; /*!< The mode of the filter operate. */ +} wuu_pin_filter_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name External Wake up Pins Control APIs. + * @{ + */ +/*! + * @brief Enables and Configs External WakeUp Pins. + * + * This function enables/disables the external pin as wakeup input. What's more this + * function configs pins options, including edge detection wakeup event and operate mode. + * + * @param base MUU peripheral base address. + * @param pinIndex The index of the external input pin. See Reference Manual for the details. + * @param config Pointer to wuu_external_wakeup_pin_config_t structure. + */ +void WUU_SetExternalWakeUpPinsConfig(WUU_Type *base, uint8_t pinIndex, const wuu_external_wakeup_pin_config_t *config); + +/*! + * @brief Disable and clear external wakeup pin settings. + * + * @param base MUU peripheral base address. + * @param pinIndex The index of the external input pin. + */ +void WUU_ClearExternalWakeupPinsConfig(WUU_Type *base, uint8_t pinIndex); + +/*! + * @brief Gets External Wakeup pin flags. + * + * This function return the external wakeup pin flags. + * + * @param base WUU peripheral base address. + * @return Wakeup flags for all external wakeup pins. + */ +static inline uint32_t WUU_GetExternalWakeUpPinsFlag(WUU_Type *base) +{ + return base->PF; +} + +/*! + * @brief Clears External WakeUp Pin flags. + * + * This function clears external wakeup pins flags based on the mask. + * + * @param base WUU peripheral base address. + * @param mask The mask of Wakeup pin index to be cleared. + */ +static inline void WUU_ClearExternalWakeUpPinsFlag(WUU_Type *base, uint32_t mask) +{ + base->PF = mask; +} +/*! @} */ + +/*! + * @name Internal Wakeup Module control APIs. + * @{ + */ + +/*! + * @brief Config Internal modules' event as the wake up soures. + * + * This function configs the internal modules event as the wake up sources. + * + * @param base WUU peripheral base address. + * @param moduleIndex The selected internal module. See the Reference Manual for the details. + * @param event Select interrupt or DMA/Trigger of the internal module as the wake up source. + */ +void WUU_SetInternalWakeUpModulesConfig(WUU_Type *base, uint8_t moduleIndex, wuu_internal_wakeup_module_event_t event); + +/*! + * @brief Disable an on-chip internal modules' event as the wakeup sources. + * + * @param base WUU peripheral base address. + * @param moduleIndex The selected internal module. See the Reference Manual for the details. + * @param event The event(interrupt or DMA/trigger) of the internal module to disable. + */ +void WUU_ClearInternalWakeUpModulesConfig(WUU_Type *base, uint8_t moduleIndex, wuu_internal_wakeup_module_event_t event); + +#if (defined(FSL_FEATURE_WUU_HAS_MF) && FSL_FEATURE_WUU_HAS_MF) +/*! + * @brief Get wakeup flags for internal wakeup modules. + * + * @param base WUU peripheral base address. + * @return Wakeup flags for all internal wakeup modules. + */ +static inline uint32_t WUU_GetModuleInterruptFlag(WUU_Type *base) +{ + return base->MF; +} + +/*! + * @brief Gets the internal module wakeup source flag. + * + * This function checks the flag to detect whether the system is + * woken up by specific on-chip module interrupt. + * + * @param base WWU peripheral base address. + * @param moduleIndex A module index, which starts from 0. + * @return True if the specific pin is a wake up source. + */ +static inline bool WUU_GetInternalWakeupModuleFlag(WUU_Type *base, uint32_t moduleIndex) +{ + return ((1UL << moduleIndex) == (WUU_GetModuleInterruptFlag(base) & (1UL << moduleIndex))); +} +#endif /* FSL_FEATURE_WUU_HAS_MF */ + +/*! @} */ + +/*! + * @name Pin Filter Control APIs + * @{ + */ +/*! + * @brief Configs and Enables Pin filters. + * + * This function configs Pin filter, including pin select, filer operate mode + * filer wakeup event and filter edge detection. + * + * @param base WUU peripheral base address. + * @param filterIndex The index of the pin filer. + * @param config Pointer to wuu_pin_filter_config_t structure. + */ +void WUU_SetPinFilterConfig(WUU_Type *base, uint8_t filterIndex, const wuu_pin_filter_config_t *config); + +/*! + * @brief Gets the pin filter configuration. + * + * This function gets the pin filter flag. + * + * @param base WUU peripheral base address. + * @param filterIndex A pin filter index, which starts from 1. + * @return True if the flag is a source of the existing low-leakage power mode. + */ +bool WUU_GetPinFilterFlag(WUU_Type *base, uint8_t filterIndex); + +/*! + * @brief Clears the pin filter configuration. + * + * This function clears the pin filter flag. + * + * @param base WUU peripheral base address. + * @param filterIndex A pin filter index to clear the flag, starting from 1. + */ +void WUU_ClearPinFilterFlag(WUU_Type *base, uint8_t filterIndex); + +/*! + * brief Gets the external wakeup source flag. + * + * This function checks the external pin flag to detect whether the MCU is + * woken up by the specific pin. + * + * param base WUU peripheral base address. + * param pinIndex A pin index, which starts from 0. + * return True if the specific pin is a wakeup source. + */ +bool WUU_GetExternalWakeupPinFlag(WUU_Type *base, uint32_t pinIndex); + +/*! + * brief Clears the external wakeup source flag. + * + * This function clears the external wakeup source flag for a specific pin. + * + * param base WUU peripheral base address. + * param pinIndex A pin index, which starts from 0. + */ +void WUU_ClearExternalWakeupPinFlag(WUU_Type *base, uint32_t pinIndex); +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! @} */ + +#endif /*FSL_WUU_H_*/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wwdt.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wwdt.c new file mode 100644 index 00000000000..6680148acf7 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wwdt.c @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_wwdt.h" + +/* Component ID definition, used by tools. */ +#ifndef FSL_COMPONENT_ID +#define FSL_COMPONENT_ID "platform.drivers.wwdt" +#endif + +#define FREQUENCY_3MHZ (3000000U) +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/*! + * @brief Gets the instance from the base address + * + * @param base WWDT peripheral base address + * + * @return The WWDT instance + */ +static uint32_t WWDT_GetInstance(WWDT_Type *base); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Pointers to WWDT bases for each instance. */ +static WWDT_Type *const s_wwdtBases[] = WWDT_BASE_PTRS; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) +/*! @brief Pointers to WWDT clocks for each instance. */ +static const clock_ip_name_t s_wwdtClocks[] = WWDT_CLOCKS; +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) +#if !(defined(FSL_FEATURE_WWDT_HAS_NO_RESET) && FSL_FEATURE_WWDT_HAS_NO_RESET) +/*! @brief Pointers to WWDT resets for each instance. */ +static const reset_ip_name_t s_wwdtResets[] = WWDT_RSTS; +#endif +#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */ + +/******************************************************************************* + * Code + ******************************************************************************/ +static uint32_t WWDT_GetInstance(WWDT_Type *base) +{ + uint32_t instance; + uint32_t wwdtArrayCount = (sizeof(s_wwdtBases) / sizeof(s_wwdtBases[0])); + + /* Find the instance index from base address mappings. */ + for (instance = 0; instance < wwdtArrayCount; instance++) + { + if (s_wwdtBases[instance] == base) + { + break; + } + } + + assert(instance < wwdtArrayCount); + + return instance; +} + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * brief Initializes WWDT configure structure. + * + * This function initializes the WWDT configure structure to default value. The default + * value are: + * code + * config->enableWwdt = true; + * config->enableWatchdogReset = false; + * config->enableWatchdogProtect = false; + * config->enableLockOscillator = false; + * config->windowValue = 0xFFFFFFU; + * config->timeoutValue = 0xFFFFFFU; + * config->warningValue = 0; + * endcode + * + * param config Pointer to WWDT config structure. + * see wwdt_config_t + */ +void WWDT_GetDefaultConfig(wwdt_config_t *config) +{ + assert(NULL != config); + + /* Initializes the configure structure to zero. */ + (void)memset(config, 0, sizeof(*config)); + + /* Enable the watch dog */ + config->enableWwdt = true; + /* Disable the watchdog timeout reset */ + config->enableWatchdogReset = false; + /* Disable the watchdog protection for updating the timeout value */ + config->enableWatchdogProtect = false; +#if !(defined(FSL_FEATURE_WWDT_HAS_NO_OSCILLATOR_LOCK) && FSL_FEATURE_WWDT_HAS_NO_OSCILLATOR_LOCK) + /* Do not lock the watchdog oscillator */ + config->enableLockOscillator = false; +#endif + /* Windowing is not in effect */ + config->windowValue = 0xFFFFFFU; + /* Set the timeout value to the max */ + config->timeoutValue = 0xFFFFFFU; + /* No warning is provided */ + config->warningValue = 0; + /* Set clock frequency. */ + config->clockFreq_Hz = 0U; +} + +/*! + * brief Initializes the WWDT. + * + * This function initializes the WWDT. When called, the WWDT runs according to the configuration. + * + * Example: + * code + * wwdt_config_t config; + * WWDT_GetDefaultConfig(&config); + * config.timeoutValue = 0x7ffU; + * WWDT_Init(wwdt_base,&config); + * endcode + * + * param base WWDT peripheral base address + * param config The configuration of WWDT + */ +void WWDT_Init(WWDT_Type *base, const wwdt_config_t *config) +{ + assert(NULL != config); + + uint32_t value = 0U; + uint32_t DelayUs = 0U; + uint32_t primaskValue = 0U; + +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Enable the WWDT clock */ + CLOCK_EnableClock(s_wwdtClocks[WWDT_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ + +#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) +#if !(defined(FSL_FEATURE_WWDT_HAS_NO_RESET) && FSL_FEATURE_WWDT_HAS_NO_RESET) + /* Reset the module. */ + RESET_PeripheralReset(s_wwdtResets[WWDT_GetInstance(base)]); +#endif + +#if defined(FSL_FEATURE_WWDT_WDTRESET_FROM_PMC) && (FSL_FEATURE_WWDT_WDTRESET_FROM_PMC) + /* PMC RESETCAUSE: set bit to clear it by write 1. */ + PMC->RESETCAUSE = PMC_RESETCAUSE_WDTRESET_MASK; + /* Enable the watchdog reset event to affect the system in the Power Management Controller */ + PMC->CTRL |= PMC_CTRL_WDTRESETENABLE_MASK; +#endif /*FSL_FEATURE_WWDT_WDTRESET_FROM_PMC*/ + +#endif /* FSL_SDK_DISABLE_DRIVER_RESET_CONTROL */ + +#if !(defined(FSL_FEATURE_WWDT_HAS_NO_OSCILLATOR_LOCK) && FSL_FEATURE_WWDT_HAS_NO_OSCILLATOR_LOCK) + value = WWDT_MOD_WDEN(config->enableWwdt) | WWDT_MOD_WDRESET(config->enableWatchdogReset) | + WWDT_MOD_LOCK(config->enableLockOscillator); +#else + value = WWDT_MOD_WDEN(config->enableWwdt) | WWDT_MOD_WDRESET(config->enableWatchdogReset); +#endif + /* Clear legacy flag in the MOD register by software writing a "1" to this bit field.. */ + if (0U != (base->MOD & WWDT_MOD_WDINT_MASK)) + { + value |= WWDT_MOD_WDINT_MASK; + } + /* Set configuration */ + primaskValue = DisableGlobalIRQ(); + base->TC = WWDT_TC_COUNT(config->timeoutValue); + base->MOD = value; + base->WINDOW = WWDT_WINDOW_WINDOW(config->windowValue); + base->WARNINT = WWDT_WARNINT_WARNINT(config->warningValue); + /* Refreshes the WWDT timer. */ + base->FEED = WWDT_FIRST_WORD_OF_REFRESH; + base->FEED = WWDT_SECOND_WORD_OF_REFRESH; + EnableGlobalIRQ(primaskValue); + /* Read counter value to wait wwdt timer start*/ + if (config->enableWwdt) + { + while (base->TV == 0xFFUL) + { + } + } + + /* This WDPROTECT bit can be set once by software and is only cleared by a reset */ + if (config->enableWatchdogProtect && (0U == (base->MOD & WWDT_MOD_WDPROTECT_MASK))) + { + /* The config->clockFreq_Hz must be set in order to config the delay time. */ + assert(0U != config->clockFreq_Hz); + + /* Set the WDPROTECT bit after the Feed Sequence (0xAA, 0x55) with 3 WDCLK delay */ + DelayUs = FREQUENCY_3MHZ / config->clockFreq_Hz + 1U; + SDK_DelayAtLeastUs(DelayUs, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); + + base->MOD |= WWDT_MOD_WDPROTECT(1U); + } +} + +/*! + * brief Shuts down the WWDT. + * + * This function shuts down the WWDT. + * + * param base WWDT peripheral base address + */ +void WWDT_Deinit(WWDT_Type *base) +{ +#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) + /* Disable the WWDT clock */ + CLOCK_DisableClock(s_wwdtClocks[WWDT_GetInstance(base)]); +#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ +} + +/*! + * brief Refreshes the WWDT timer. + * + * This function feeds the WWDT. + * This function should be called before WWDT timer is in timeout. Otherwise, a reset is asserted. + * + * param base WWDT peripheral base address + */ +void WWDT_Refresh(WWDT_Type *base) +{ + uint32_t primaskValue = 0U; + + /* Disable the global interrupt to protect refresh sequence */ + primaskValue = DisableGlobalIRQ(); + base->FEED = WWDT_FIRST_WORD_OF_REFRESH; + base->FEED = WWDT_SECOND_WORD_OF_REFRESH; + EnableGlobalIRQ(primaskValue); +} + +/*! + * brief Clear WWDT flag. + * + * This function clears WWDT status flag. + * + * Example for clearing warning flag: + * code + * WWDT_ClearStatusFlags(wwdt_base, kWWDT_WarningFlag); + * endcode + * param base WWDT peripheral base address + * param mask The status flags to clear. This is a logical OR of members of the + * enumeration ::_wwdt_status_flags_t + */ +void WWDT_ClearStatusFlags(WWDT_Type *base, uint32_t mask) +{ + /* Clear the WDINT bit so that we don't accidentally clear it */ + uint32_t reg = (base->MOD & (~WWDT_MOD_WDINT_MASK)); + + /* Clear timeout by writing a zero */ + if (0U != (mask & (uint32_t)kWWDT_TimeoutFlag)) + { + reg &= ~WWDT_MOD_WDTOF_MASK; +#if defined(FSL_FEATURE_WWDT_WDTRESET_FROM_PMC) && (FSL_FEATURE_WWDT_WDTRESET_FROM_PMC) + /* PMC RESETCAUSE: set bit to clear it */ + PMC->RESETCAUSE = PMC_RESETCAUSE_WDTRESET_MASK; +#endif /*FSL_FEATURE_WWDT_WDTRESET_FROM_PMC*/ + } + + /* Clear warning interrupt flag by writing a one */ + if (0U != (mask & (uint32_t)kWWDT_WarningFlag)) + { + reg |= WWDT_MOD_WDINT_MASK; + } + + base->MOD = reg; +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wwdt.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wwdt.h new file mode 100644 index 00000000000..40c90e48b38 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/drivers/fsl_wwdt.h @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef FSL_WWDT_H_ +#define FSL_WWDT_H_ + +#include "fsl_common.h" + +/*! + * @addtogroup wwdt + * @{ + */ + +/*! @file */ + +/******************************************************************************* + * Definitions + *******************************************************************************/ + +/*! @name Driver version */ +/*! @{ */ +/*! @brief Defines WWDT driver version. */ +#define FSL_WWDT_DRIVER_VERSION (MAKE_VERSION(2, 1, 9)) +/*! @} */ + +/*! @name Refresh sequence */ +/*! @{ */ +#define WWDT_FIRST_WORD_OF_REFRESH (0xAAU) /*!< First word of refresh sequence */ +#define WWDT_SECOND_WORD_OF_REFRESH (0x55U) /*!< Second word of refresh sequence */ +/*! @} */ + +/*! @brief Describes WWDT configuration structure. */ +typedef struct _wwdt_config +{ + bool enableWwdt; /*!< Enables or disables WWDT */ + bool enableWatchdogReset; /*!< true: Watchdog timeout will cause a chip reset + false: Watchdog timeout will not cause a chip reset */ + bool enableWatchdogProtect; /*!< true: Enable watchdog protect i.e timeout value can only be + changed after counter is below warning & window values + false: Disable watchdog protect; timeout value can be changed + at any time */ +#if !(defined(FSL_FEATURE_WWDT_HAS_NO_OSCILLATOR_LOCK) && FSL_FEATURE_WWDT_HAS_NO_OSCILLATOR_LOCK) + bool enableLockOscillator; /*!< true: Disabling or powering down the watchdog oscillator is prevented + Once set, this bit can only be cleared by a reset + false: Do not lock oscillator */ +#endif + uint32_t windowValue; /*!< Window value, set this to 0xFFFFFF if windowing is not in effect */ + uint32_t timeoutValue; /*!< Timeout value */ + uint32_t warningValue; /*!< Watchdog time counter value that will generate a + warning interrupt. Set this to 0 for no warning */ + uint32_t clockFreq_Hz; /*!< Watchdog clock source frequency. */ +} wwdt_config_t; + +/*! + * @brief WWDT status flags. + * + * This structure contains the WWDT status flags for use in the WWDT functions. + */ +enum _wwdt_status_flags_t +{ + kWWDT_TimeoutFlag = WWDT_MOD_WDTOF_MASK, /*!< Time-out flag, set when the timer times out */ + kWWDT_WarningFlag = WWDT_MOD_WDINT_MASK /*!< Warning interrupt flag, set when timer is below the value WDWARNINT */ +}; + +/******************************************************************************* + * API + *******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*! + * @name WWDT Initialization and De-initialization + * @{ + */ + +/*! + * @brief Initializes WWDT configure structure. + * + * This function initializes the WWDT configure structure to default value. The default + * value are: + * @code + * config->enableWwdt = true; + * config->enableWatchdogReset = false; + * config->enableWatchdogProtect = false; + * config->enableLockOscillator = false; + * config->windowValue = 0xFFFFFFU; + * config->timeoutValue = 0xFFFFFFU; + * config->warningValue = 0; + * @endcode + * + * @param config Pointer to WWDT config structure. + * @see wwdt_config_t + */ +void WWDT_GetDefaultConfig(wwdt_config_t *config); + +/*! + * @brief Initializes the WWDT. + * + * This function initializes the WWDT. When called, the WWDT runs according to the configuration. + * + * Example: + * @code + * wwdt_config_t config; + * WWDT_GetDefaultConfig(&config); + * config.timeoutValue = 0x7ffU; + * WWDT_Init(wwdt_base,&config); + * @endcode + * + * @param base WWDT peripheral base address + * @param config The configuration of WWDT + */ +void WWDT_Init(WWDT_Type *base, const wwdt_config_t *config); + +/*! + * @brief Shuts down the WWDT. + * + * This function shuts down the WWDT. + * + * @param base WWDT peripheral base address + */ +void WWDT_Deinit(WWDT_Type *base); + +/*! @} */ + +/*! + * @name WWDT Functional Operation + * @{ + */ + +/*! + * @brief Enables the WWDT module. + * + * This function write value into WWDT_MOD register to enable the WWDT, it is a write-once bit; + * once this bit is set to one and a watchdog feed is performed, the watchdog timer will run + * permanently. + * + * @param base WWDT peripheral base address + */ +static inline void WWDT_Enable(WWDT_Type *base) +{ + base->MOD |= WWDT_MOD_WDEN_MASK; +} + +/*! + * @brief Disables the WWDT module. + * @deprecated Do not use this function. It will be deleted in next release version, for + * once the bit field of WDEN written with a 1, it can not be re-written with a 0. + * + * This function write value into WWDT_MOD register to disable the WWDT. + * + * @param base WWDT peripheral base address + */ +static inline void WWDT_Disable(WWDT_Type *base) +{ + base->MOD &= ~WWDT_MOD_WDEN_MASK; +} + +/*! + * @brief Gets all WWDT status flags. + * + * This function gets all status flags. + * + * Example for getting Timeout Flag: + * @code + * uint32_t status; + * status = WWDT_GetStatusFlags(wwdt_base) & kWWDT_TimeoutFlag; + * @endcode + * @param base WWDT peripheral base address + * @return The status flags. This is the logical OR of members of the + * enumeration ::_wwdt_status_flags_t + */ +static inline uint32_t WWDT_GetStatusFlags(WWDT_Type *base) +{ +#if defined(FSL_FEATURE_WWDT_WDTRESET_FROM_PMC) && (FSL_FEATURE_WWDT_WDTRESET_FROM_PMC) + uint32_t status; + /* WDTOF is not set in case of WD reset - get info from PMC instead */ + status = (base->MOD & (WWDT_MOD_WDTOF_MASK | WWDT_MOD_WDINT_MASK)); + if (PMC->RESETCAUSE & PMC_RESETCAUSE_WDTRESET_MASK) + { + status |= kWWDT_TimeoutFlag; + } + return status; +#else + return (base->MOD & (WWDT_MOD_WDTOF_MASK | WWDT_MOD_WDINT_MASK)); +#endif /*FSL_FEATURE_WWDT_WDTRESET_FROM_PMC*/ +} + +/*! + * @brief Clear WWDT flag. + * + * This function clears WWDT status flag. + * + * Example for clearing warning flag: + * @code + * WWDT_ClearStatusFlags(wwdt_base, kWWDT_WarningFlag); + * @endcode + * @param base WWDT peripheral base address + * @param mask The status flags to clear. This is a logical OR of members of the + * enumeration ::_wwdt_status_flags_t + */ +void WWDT_ClearStatusFlags(WWDT_Type *base, uint32_t mask); + +/*! + * @brief Set the WWDT warning value. + * + * The WDWARNINT register determines the watchdog timer counter value that will generate a watchdog + * interrupt. When the watchdog timer counter is no longer greater than the value defined by + * WARNINT, an interrupt will be generated after the subsequent WDCLK. + * + * @param base WWDT peripheral base address + * @param warningValue WWDT warning value. + */ +static inline void WWDT_SetWarningValue(WWDT_Type *base, uint32_t warningValue) +{ + base->WARNINT = WWDT_WARNINT_WARNINT(warningValue); +} + +/*! + * @brief Set the WWDT timeout value. + * + * This function sets the timeout value. Every time a feed sequence occurs the value in the TC + * register is loaded into the Watchdog timer. Writing a value below 0xFF will cause 0xFF to be + * loaded into the TC register. Thus the minimum time-out interval is TWDCLK*256*4. + * If enableWatchdogProtect flag is true in wwdt_config_t config structure, any attempt to change + * the timeout value before the watchdog counter is below the warning and window values + * will cause a watchdog reset and set the WDTOF flag. + * + * @param base WWDT peripheral base address + * @param timeoutCount WWDT timeout value, count of WWDT clock tick. + */ +static inline void WWDT_SetTimeoutValue(WWDT_Type *base, uint32_t timeoutCount) +{ + base->TC = WWDT_TC_COUNT(timeoutCount); +} + +/*! + * @brief Sets the WWDT window value. + * + * The WINDOW register determines the highest TV value allowed when a watchdog feed is performed. + * If a feed sequence occurs when timer value is greater than the value in WINDOW, a watchdog + * event will occur. To disable windowing, set windowValue to 0xFFFFFF (maximum possible timer + * value) so windowing is not in effect. + * + * @param base WWDT peripheral base address + * @param windowValue WWDT window value. + */ +static inline void WWDT_SetWindowValue(WWDT_Type *base, uint32_t windowValue) +{ + base->WINDOW = WWDT_WINDOW_WINDOW(windowValue); +} + +/*! + * @brief Refreshes the WWDT timer. + * + * This function feeds the WWDT. + * This function should be called before WWDT timer is in timeout. Otherwise, a reset is asserted. + * + * @param base WWDT peripheral base address + */ +void WWDT_Refresh(WWDT_Type *base); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @}*/ + +#endif /* FSL_WWDT_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/fsl_device_registers.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/fsl_device_registers.h new file mode 100644 index 00000000000..03536b56623 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/fsl_device_registers.h @@ -0,0 +1,33 @@ +/* + * Copyright 2014-2016 Freescale Semiconductor, Inc. + * Copyright 2016-2024 NXP + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#ifndef __FSL_DEVICE_REGISTERS_H__ +#define __FSL_DEVICE_REGISTERS_H__ + +/* + * Include the cpu specific register header files. + * + * The CPU macro should be declared in the project or makefile. + */ +#if (defined(CPU_MCXA156VLL) || defined(CPU_MCXA156VMP) || defined(CPU_MCXA156VPJ)) + +#define MCXA156_SERIES + +/* CMSIS-style register definitions */ +#include "MCXA156.h" +/* CPU specific feature definitions */ +#include "MCXA156_features.h" + +#else + #error "No valid CPU defined!" +#endif + +#endif /* __FSL_DEVICE_REGISTERS_H__ */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/MCXA156_flash.ld b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/MCXA156_flash.ld new file mode 100644 index 00000000000..efc24cbe150 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/MCXA156_flash.ld @@ -0,0 +1,200 @@ +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compiler: GNU C Compiler +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240104 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_text (RX) : ORIGIN = 0x00000200, LENGTH = 0x000FFE00 + m_data (RW) : ORIGIN = 0x20000000, LENGTH = 0x0001E000 + m_sramx0 (RW) : ORIGIN = 0x04000000, LENGTH = 0x00002000 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/MCXA156_ram.ld b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/MCXA156_ram.ld new file mode 100644 index 00000000000..0abc11aca2c --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/MCXA156_ram.ld @@ -0,0 +1,199 @@ +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compiler: GNU C Compiler +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240104 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x20000000, LENGTH = 0x00000200 + m_text (RX) : ORIGIN = 0x20000200, LENGTH = 0x00005E00 + m_data (RW) : ORIGIN = 0x20006000, LENGTH = 0x00018000 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/startup_MCXA156.S b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/startup_MCXA156.S new file mode 100644 index 00000000000..22c1e7ae379 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/gcc/startup_MCXA156.S @@ -0,0 +1,1211 @@ +/* ------------------------------------------------------------------------- */ +/* @file: startup_MCXA156.s */ +/* @purpose: CMSIS Cortex-M33 Core Device Startup File */ +/* MCXA156 */ +/* @version: 1.0 */ +/* @date: 2022-3-29 */ +/* @build: b231107 */ +/* ------------------------------------------------------------------------- */ +/* */ +/* Copyright 1997-2016 Freescale Semiconductor, Inc. */ +/* Copyright 2016-2023 NXP */ +/* SPDX-License-Identifier: BSD-3-Clause */ +/*****************************************************************************/ +/* Version: GCC for ARM Embedded Processors */ +/*****************************************************************************/ + .syntax unified + .arch armv8-m.main + + .section .isr_vector, "a" + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler*/ + .long HardFault_Handler /* Hard Fault Handler*/ + .long MemManage_Handler /* MPU Fault Handler*/ + .long BusFault_Handler /* Bus Fault Handler*/ + .long UsageFault_Handler /* Usage Fault Handler*/ + .long SecureFault_Handler /* Secure Fault Handler*/ + .long 0 /* Reserved*/ + .long 0 /* Reserved*/ + .long 0 /* Reserved*/ + .long SVC_Handler /* SVCall Handler*/ + .long DebugMon_Handler /* Debug Monitor Handler*/ + .long 0 /* Reserved*/ + .long PendSV_Handler /* PendSV Handler*/ + .long SysTick_Handler /* SysTick Handler*/ + + /* External Interrupts*/ + .long Reserved16_IRQHandler /* OR IRQ1 to IRQ53*/ + .long CMC_IRQHandler /* Core Mode Controller interrupt*/ + .long DMA_CH0_IRQHandler /* DMA3_0_CH0 error or transfer complete*/ + .long DMA_CH1_IRQHandler /* DMA3_0_CH1 error or transfer complete*/ + .long DMA_CH2_IRQHandler /* DMA3_0_CH2 error or transfer complete*/ + .long DMA_CH3_IRQHandler /* DMA3_0_CH3 error or transfer complete*/ + .long DMA_CH4_IRQHandler /* DMA3_0_CH4 error or transfer complete*/ + .long DMA_CH5_IRQHandler /* DMA3_0_CH5 error or transfer complete*/ + .long DMA_CH6_IRQHandler /* DMA3_0_CH6 error or transfer complete*/ + .long DMA_CH7_IRQHandler /* DMA3_0_CH7 error or transfer complete*/ + .long ERM0_SINGLE_BIT_IRQHandler /* ERM Single Bit error interrupt*/ + .long ERM0_MULTI_BIT_IRQHandler /* ERM Multi Bit error interrupt*/ + .long FMU0_IRQHandler /* Flash Management Unit interrupt*/ + .long GLIKEY0_IRQHandler /* GLIKEY Interrupt */ + .long MBC0_IRQHandler /* MBC secure violation interrupt*/ + .long SCG0_IRQHandler /* System Clock Generator interrupt*/ + .long SPC0_IRQHandler /* System Power Controller interrupt*/ + .long VBAT0_IRQHandler /* VBAT interrupt*/ + .long WUU0_IRQHandler /* Wake Up Unit interrupt*/ + .long CAN0_IRQHandler /* Controller Area Network 0 interrupt*/ + .long Reserved36_IRQHandler /* Reserved interrupt*/ + .long Reserved37_IRQHandler /* Reserved interrupt*/ + .long Reserved38_IRQHandler /* Reserved interrupt*/ + .long FLEXIO_IRQHandler /* Flexible Input/Output interrupt*/ + .long I3C0_IRQHandler /* Improved Inter Integrated Circuit interrupt 0*/ + .long Reserved41_IRQHandler /* Reserved interrupt*/ + .long LPI2C0_IRQHandler /* Low-Power Inter Integrated Circuit interrupt*/ + .long LPI2C1_IRQHandler /* Low-Power Inter Integrated Circuit interrupt*/ + .long LPSPI0_IRQHandler /* Low-Power Serial Peripheral Interface interrupt*/ + .long LPSPI1_IRQHandler /* Low-Power Serial Peripheral Interface interrupt*/ + .long Reserved46_IRQHandler /* Reserved interrupt*/ + .long LPUART0_IRQHandler /* Low-Power Universal Asynchronous Receive/Transmit interrupt*/ + .long LPUART1_IRQHandler /* Low-Power Universal Asynchronous Receive/Transmit interrupt*/ + .long LPUART2_IRQHandler /* Low-Power Universal Asynchronous Receive/Transmit interrupt*/ + .long LPUART3_IRQHandler /* Low-Power Universal Asynchronous Receive/Transmit interrupt*/ + .long LPUART4_IRQHandler /* Low-Power Universal Asynchronous Receive/Transmit interrupt*/ + .long USB0_IRQHandler /* Universal Serial Bus - Full Speed interrupt*/ + .long Reserved53_IRQHandler /* Reserved interrupt*/ + .long CDOG0_IRQHandler /* Code Watchdog Timer 0 interrupt*/ + .long CTIMER0_IRQHandler /* Standard counter/timer 0 interrupt*/ + .long CTIMER1_IRQHandler /* Standard counter/timer 1 interrupt*/ + .long CTIMER2_IRQHandler /* Standard counter/timer 2 interrupt*/ + .long CTIMER3_IRQHandler /* Standard counter/timer 3 interrupt*/ + .long CTIMER4_IRQHandler /* Standard counter/timer 4 interrupt*/ + .long FLEXPWM0_RELOAD_ERROR_IRQHandler /* FlexPWM0_reload_error interrupt*/ + .long FLEXPWM0_FAULT_IRQHandler /* FlexPWM0_fault interrupt*/ + .long FLEXPWM0_SUBMODULE0_IRQHandler /* FlexPWM0 Submodule 0 capture/compare/reload interrupt*/ + .long FLEXPWM0_SUBMODULE1_IRQHandler /* FlexPWM0 Submodule 1 capture/compare/reload interrupt*/ + .long FLEXPWM0_SUBMODULE2_IRQHandler /* FlexPWM0 Submodule 2 capture/compare/reload interrupt*/ + .long Reserved65_IRQHandler /* Reserved interrupt*/ + .long QDC0_COMPARE_IRQHandler /* Compare*/ + .long QDC0_HOME_IRQHandler /* Home*/ + .long QDC0_WATCHDOG_IRQHandler /* Watchdog / Simultaneous A and B Change*/ + .long QDC0_INDEX_IRQHandler /* Index / Roll Over / Roll Under*/ + .long FREQME0_IRQHandler /* Frequency Measurement interrupt*/ + .long LPTMR0_IRQHandler /* Low Power Timer 0 interrupt*/ + .long Reserved72_IRQHandler /* Reserved interrupt*/ + .long OS_EVENT_IRQHandler /* OS event timer interrupt*/ + .long WAKETIMER0_IRQHandler /* Wake Timer Interrupt*/ + .long UTICK0_IRQHandler /* Micro-Tick Timer interrupt*/ + .long WWDT0_IRQHandler /* Windowed Watchdog Timer 0 interrupt*/ + .long Reserved77_IRQHandler /* Reserved interrupt*/ + .long ADC0_IRQHandler /* Analog-to-Digital Converter interrupt*/ + .long ADC1_IRQHandler /* Analog-to-Digital Converter interrupt*/ + .long CMP0_IRQHandler /* Comparator interrupt*/ + .long CMP1_IRQHandler /* Comparator interrupt*/ + .long Reserved82_IRQHandler /* Reserved interrupt*/ + .long DAC0_IRQHandler /* Digital-to-Analog Converter 0 - General Purpose interrupt*/ + .long Reserved84_IRQHandler /* Reserved interrupt*/ + .long Reserved85_IRQHandler /* Reserved interrupt*/ + .long Reserved86_IRQHandler /* Reserved interrupt*/ + .long GPIO0_IRQHandler /* General Purpose Input/Output interrupt 0*/ + .long GPIO1_IRQHandler /* General Purpose Input/Output interrupt 1*/ + .long GPIO2_IRQHandler /* General Purpose Input/Output interrupt 2*/ + .long GPIO3_IRQHandler /* General Purpose Input/Output interrupt 3*/ + .long GPIO4_IRQHandler /* General Purpose Input/Output interrupt 4*/ + .long Reserved92_IRQHandler /* Reserved interrupt*/ + .long LPI2C2_IRQHandler /* Low-Power Inter Integrated Circuit interrupt*/ + .long LPI2C3_IRQHandler /* Low-Power Inter Integrated Circuit interrupt*/ + .long FLEXPWM1_RELOAD_ERROR_IRQHandler /* FlexPWM1_reload_error interrupt*/ + .long FLEXPWM1_FAULT_IRQHandler /* FlexPWM1_fault interrupt*/ + .long FLEXPWM1_SUBMODULE0_IRQHandler /* FlexPWM1 Submodule 0 capture/compare/reload interrupt*/ + .long FLEXPWM1_SUBMODULE1_IRQHandler /* FlexPWM1 Submodule 1 capture/compare/reload interrupt*/ + .long FLEXPWM1_SUBMODULE2_IRQHandler /* FlexPWM1 Submodule 2 capture/compare/reload interrupt*/ + .long Reserved100_IRQHandler /* Reserved interrupt*/ + .long QDC1_COMPARE_IRQHandler /* Compare*/ + .long QDC1_HOME_IRQHandler /* Home*/ + .long QDC1_WATCHDOG_IRQHandler /* Watchdog / Simultaneous A and B Change*/ + .long QDC1_INDEX_IRQHandler /* Index / Roll Over / Roll Under*/ + + .size __Vectors, . - __Vectors + + .text + .thumb + +#if defined (__cplusplus) +#ifdef __REDLIB__ +#error Redlib does not support C++ +#endif +#endif +/* Reset Handler */ + + .thumb_func + .align 2 + .globl Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + cpsid i /* Mask interrupts */ + .equ VTOR, 0xE000ED08 + ldr r0, =VTOR + ldr r1, =__Vectors + str r1, [r0] + ldr r2, [r1] + msr msp, r2 + ldr r0, =__StackLimit + msr msplim, r0 +#ifndef __NO_SYSTEM_INIT + ldr r0,=SystemInit + blx r0 +#endif +/* Loop to copy data from read only memory to RAM. The ranges + * of copy from/to are specified by following symbols evaluated in + * linker script. + * __etext: End of code section, i.e., begin of data sections to copy from. + * __data_start__/__data_end__: RAM address range that data should be + * copied to. Both must be aligned to 4 bytes boundary. */ + + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +#if 1 +/* Here are two copies of loop implemenations. First one favors code size + * and the second one favors performance. Default uses the first one. + * Change to "#if 0" to use the second one */ +.LC0: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .LC0 +#else + subs r3, r2 + ble .LC1 +.LC0: + subs r3, #4 + ldr r0, [r1, r3] + str r0, [r2, r3] + bgt .LC0 +.LC1: +#endif + +#ifdef __STARTUP_CLEAR_BSS +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * Loop to zero out BSS section, which uses following symbols + * in linker script: + * __bss_start__: start of BSS section. Must align to 4 + * __bss_end__: end of BSS section. Must align to 4 + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.LC2: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .LC2 +#endif /* __STARTUP_CLEAR_BSS */ + +/* Add stack / heap initializaiton */ + movs r0, 0 + ldr r1, =__HeapBase + ldr r2, =__HeapLimit +.LC3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .LC3 + + ldr r1, =__StackLimit + ldr r2, =__StackTop +.LC4: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .LC4 + +/*End of stack / heap initializaiton */ + cpsie i /* Unmask interrupts */ +#ifndef __START +#ifdef __REDLIB__ +#define __START __main +#else +#define __START _start +#endif +#endif +#ifndef __ATOLLIC__ + ldr r0,=__START + blx r0 +#else + ldr r0,=__libc_init_array + blx r0 + ldr r0,=main + bx r0 +#endif + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak DefaultISR + .type DefaultISR, %function +DefaultISR: + b DefaultISR + .size DefaultISR, . - DefaultISR + + .align 1 + .thumb_func + .weak NMI_Handler + .type NMI_Handler, %function +NMI_Handler: + ldr r0,=NMI_Handler + bx r0 + .size NMI_Handler, . - NMI_Handler + + .align 1 + .thumb_func + .weak HardFault_Handler + .type HardFault_Handler, %function +HardFault_Handler: + ldr r0,=HardFault_Handler + bx r0 + .size HardFault_Handler, . - HardFault_Handler + + .align 1 + .thumb_func + .weak SVC_Handler + .type SVC_Handler, %function +SVC_Handler: + ldr r0,=SVC_Handler + bx r0 + .size SVC_Handler, . - SVC_Handler + + .align 1 + .thumb_func + .weak PendSV_Handler + .type PendSV_Handler, %function +PendSV_Handler: + ldr r0,=PendSV_Handler + bx r0 + .size PendSV_Handler, . - PendSV_Handler + + .align 1 + .thumb_func + .weak SysTick_Handler + .type SysTick_Handler, %function +SysTick_Handler: + ldr r0,=SysTick_Handler + bx r0 + .size SysTick_Handler, . - SysTick_Handler + + .align 1 + .thumb_func + .weak Reserved16_IRQHandler + .type Reserved16_IRQHandler, %function +Reserved16_IRQHandler: + ldr r0,=Reserved16_DriverIRQHandler + bx r0 + .size Reserved16_IRQHandler, . - Reserved16_IRQHandler + + .align 1 + .thumb_func + .weak CMC_IRQHandler + .type CMC_IRQHandler, %function +CMC_IRQHandler: + ldr r0,=CMC_DriverIRQHandler + bx r0 + .size CMC_IRQHandler, . - CMC_IRQHandler + + .align 1 + .thumb_func + .weak DMA_CH0_IRQHandler + .type DMA_CH0_IRQHandler, %function +DMA_CH0_IRQHandler: + ldr r0,=DMA_CH0_DriverIRQHandler + bx r0 + .size DMA_CH0_IRQHandler, . - DMA_CH0_IRQHandler + + .align 1 + .thumb_func + .weak DMA_CH1_IRQHandler + .type DMA_CH1_IRQHandler, %function +DMA_CH1_IRQHandler: + ldr r0,=DMA_CH1_DriverIRQHandler + bx r0 + .size DMA_CH1_IRQHandler, . - DMA_CH1_IRQHandler + + .align 1 + .thumb_func + .weak DMA_CH2_IRQHandler + .type DMA_CH2_IRQHandler, %function +DMA_CH2_IRQHandler: + ldr r0,=DMA_CH2_DriverIRQHandler + bx r0 + .size DMA_CH2_IRQHandler, . - DMA_CH2_IRQHandler + + .align 1 + .thumb_func + .weak DMA_CH3_IRQHandler + .type DMA_CH3_IRQHandler, %function +DMA_CH3_IRQHandler: + ldr r0,=DMA_CH3_DriverIRQHandler + bx r0 + .size DMA_CH3_IRQHandler, . - DMA_CH3_IRQHandler + + .align 1 + .thumb_func + .weak DMA_CH4_IRQHandler + .type DMA_CH4_IRQHandler, %function +DMA_CH4_IRQHandler: + ldr r0,=DMA_CH4_DriverIRQHandler + bx r0 + .size DMA_CH4_IRQHandler, . - DMA_CH4_IRQHandler + + .align 1 + .thumb_func + .weak DMA_CH5_IRQHandler + .type DMA_CH5_IRQHandler, %function +DMA_CH5_IRQHandler: + ldr r0,=DMA_CH5_DriverIRQHandler + bx r0 + .size DMA_CH5_IRQHandler, . - DMA_CH5_IRQHandler + + .align 1 + .thumb_func + .weak DMA_CH6_IRQHandler + .type DMA_CH6_IRQHandler, %function +DMA_CH6_IRQHandler: + ldr r0,=DMA_CH6_DriverIRQHandler + bx r0 + .size DMA_CH6_IRQHandler, . - DMA_CH6_IRQHandler + + .align 1 + .thumb_func + .weak DMA_CH7_IRQHandler + .type DMA_CH7_IRQHandler, %function +DMA_CH7_IRQHandler: + ldr r0,=DMA_CH7_DriverIRQHandler + bx r0 + .size DMA_CH7_IRQHandler, . - DMA_CH7_IRQHandler + + .align 1 + .thumb_func + .weak ERM0_SINGLE_BIT_IRQHandler + .type ERM0_SINGLE_BIT_IRQHandler, %function +ERM0_SINGLE_BIT_IRQHandler: + ldr r0,=ERM0_SINGLE_BIT_DriverIRQHandler + bx r0 + .size ERM0_SINGLE_BIT_IRQHandler, . - ERM0_SINGLE_BIT_IRQHandler + + .align 1 + .thumb_func + .weak ERM0_MULTI_BIT_IRQHandler + .type ERM0_MULTI_BIT_IRQHandler, %function +ERM0_MULTI_BIT_IRQHandler: + ldr r0,=ERM0_MULTI_BIT_DriverIRQHandler + bx r0 + .size ERM0_MULTI_BIT_IRQHandler, . - ERM0_MULTI_BIT_IRQHandler + + .align 1 + .thumb_func + .weak FMU0_IRQHandler + .type FMU0_IRQHandler, %function +FMU0_IRQHandler: + ldr r0,=FMU0_DriverIRQHandler + bx r0 + .size FMU0_IRQHandler, . - FMU0_IRQHandler + + .align 1 + .thumb_func + .weak GLIKEY0_IRQHandler + .type GLIKEY0_IRQHandler, %function +GLIKEY0_IRQHandler: + ldr r0,=GLIKEY0_DriverIRQHandler + bx r0 + .size GLIKEY0_IRQHandler, . - GLIKEY0_IRQHandler + + .align 1 + .thumb_func + .weak MBC0_IRQHandler + .type MBC0_IRQHandler, %function +MBC0_IRQHandler: + ldr r0,=MBC0_DriverIRQHandler + bx r0 + .size MBC0_IRQHandler, . - MBC0_IRQHandler + + .align 1 + .thumb_func + .weak SCG0_IRQHandler + .type SCG0_IRQHandler, %function +SCG0_IRQHandler: + ldr r0,=SCG0_DriverIRQHandler + bx r0 + .size SCG0_IRQHandler, . - SCG0_IRQHandler + + .align 1 + .thumb_func + .weak SPC0_IRQHandler + .type SPC0_IRQHandler, %function +SPC0_IRQHandler: + ldr r0,=SPC0_DriverIRQHandler + bx r0 + .size SPC0_IRQHandler, . - SPC0_IRQHandler + + .align 1 + .thumb_func + .weak VBAT0_IRQHandler + .type VBAT0_IRQHandler, %function +VBAT0_IRQHandler: + ldr r0,=VBAT0_DriverIRQHandler + bx r0 + .size VBAT0_IRQHandler, . - VBAT0_IRQHandler + + .align 1 + .thumb_func + .weak WUU0_IRQHandler + .type WUU0_IRQHandler, %function +WUU0_IRQHandler: + ldr r0,=WUU0_DriverIRQHandler + bx r0 + .size WUU0_IRQHandler, . - WUU0_IRQHandler + + .align 1 + .thumb_func + .weak CAN0_IRQHandler + .type CAN0_IRQHandler, %function +CAN0_IRQHandler: + ldr r0,=CAN0_DriverIRQHandler + bx r0 + .size CAN0_IRQHandler, . - CAN0_IRQHandler + + .align 1 + .thumb_func + .weak Reserved36_IRQHandler + .type Reserved36_IRQHandler, %function +Reserved36_IRQHandler: + ldr r0,=Reserved36_DriverIRQHandler + bx r0 + .size Reserved36_IRQHandler, . - Reserved36_IRQHandler + + .align 1 + .thumb_func + .weak Reserved37_IRQHandler + .type Reserved37_IRQHandler, %function +Reserved37_IRQHandler: + ldr r0,=Reserved37_DriverIRQHandler + bx r0 + .size Reserved37_IRQHandler, . - Reserved37_IRQHandler + + .align 1 + .thumb_func + .weak Reserved38_IRQHandler + .type Reserved38_IRQHandler, %function +Reserved38_IRQHandler: + ldr r0,=Reserved38_DriverIRQHandler + bx r0 + .size Reserved38_IRQHandler, . - Reserved38_IRQHandler + + .align 1 + .thumb_func + .weak FLEXIO_IRQHandler + .type FLEXIO_IRQHandler, %function +FLEXIO_IRQHandler: + ldr r0,=FLEXIO_DriverIRQHandler + bx r0 + .size FLEXIO_IRQHandler, . - FLEXIO_IRQHandler + + .align 1 + .thumb_func + .weak I3C0_IRQHandler + .type I3C0_IRQHandler, %function +I3C0_IRQHandler: + ldr r0,=I3C0_DriverIRQHandler + bx r0 + .size I3C0_IRQHandler, . - I3C0_IRQHandler + + .align 1 + .thumb_func + .weak Reserved41_IRQHandler + .type Reserved41_IRQHandler, %function +Reserved41_IRQHandler: + ldr r0,=Reserved41_DriverIRQHandler + bx r0 + .size Reserved41_IRQHandler, . - Reserved41_IRQHandler + + .align 1 + .thumb_func + .weak LPI2C0_IRQHandler + .type LPI2C0_IRQHandler, %function +LPI2C0_IRQHandler: + ldr r0,=LPI2C0_DriverIRQHandler + bx r0 + .size LPI2C0_IRQHandler, . - LPI2C0_IRQHandler + + .align 1 + .thumb_func + .weak LPI2C1_IRQHandler + .type LPI2C1_IRQHandler, %function +LPI2C1_IRQHandler: + ldr r0,=LPI2C1_DriverIRQHandler + bx r0 + .size LPI2C1_IRQHandler, . - LPI2C1_IRQHandler + + .align 1 + .thumb_func + .weak LPSPI0_IRQHandler + .type LPSPI0_IRQHandler, %function +LPSPI0_IRQHandler: + ldr r0,=LPSPI0_DriverIRQHandler + bx r0 + .size LPSPI0_IRQHandler, . - LPSPI0_IRQHandler + + .align 1 + .thumb_func + .weak LPSPI1_IRQHandler + .type LPSPI1_IRQHandler, %function +LPSPI1_IRQHandler: + ldr r0,=LPSPI1_DriverIRQHandler + bx r0 + .size LPSPI1_IRQHandler, . - LPSPI1_IRQHandler + + .align 1 + .thumb_func + .weak Reserved46_IRQHandler + .type Reserved46_IRQHandler, %function +Reserved46_IRQHandler: + ldr r0,=Reserved46_DriverIRQHandler + bx r0 + .size Reserved46_IRQHandler, . - Reserved46_IRQHandler + + .align 1 + .thumb_func + .weak LPUART0_IRQHandler + .type LPUART0_IRQHandler, %function +LPUART0_IRQHandler: + ldr r0,=LPUART0_DriverIRQHandler + bx r0 + .size LPUART0_IRQHandler, . - LPUART0_IRQHandler + + .align 1 + .thumb_func + .weak LPUART1_IRQHandler + .type LPUART1_IRQHandler, %function +LPUART1_IRQHandler: + ldr r0,=LPUART1_DriverIRQHandler + bx r0 + .size LPUART1_IRQHandler, . - LPUART1_IRQHandler + + .align 1 + .thumb_func + .weak LPUART2_IRQHandler + .type LPUART2_IRQHandler, %function +LPUART2_IRQHandler: + ldr r0,=LPUART2_DriverIRQHandler + bx r0 + .size LPUART2_IRQHandler, . - LPUART2_IRQHandler + + .align 1 + .thumb_func + .weak LPUART3_IRQHandler + .type LPUART3_IRQHandler, %function +LPUART3_IRQHandler: + ldr r0,=LPUART3_DriverIRQHandler + bx r0 + .size LPUART3_IRQHandler, . - LPUART3_IRQHandler + + .align 1 + .thumb_func + .weak LPUART4_IRQHandler + .type LPUART4_IRQHandler, %function +LPUART4_IRQHandler: + ldr r0,=LPUART4_DriverIRQHandler + bx r0 + .size LPUART4_IRQHandler, . - LPUART4_IRQHandler + + .align 1 + .thumb_func + .weak USB0_IRQHandler + .type USB0_IRQHandler, %function +USB0_IRQHandler: + ldr r0,=USB0_DriverIRQHandler + bx r0 + .size USB0_IRQHandler, . - USB0_IRQHandler + + .align 1 + .thumb_func + .weak Reserved53_IRQHandler + .type Reserved53_IRQHandler, %function +Reserved53_IRQHandler: + ldr r0,=Reserved53_DriverIRQHandler + bx r0 + .size Reserved53_IRQHandler, . - Reserved53_IRQHandler + + .align 1 + .thumb_func + .weak CDOG0_IRQHandler + .type CDOG0_IRQHandler, %function +CDOG0_IRQHandler: + ldr r0,=CDOG0_DriverIRQHandler + bx r0 + .size CDOG0_IRQHandler, . - CDOG0_IRQHandler + + .align 1 + .thumb_func + .weak CTIMER0_IRQHandler + .type CTIMER0_IRQHandler, %function +CTIMER0_IRQHandler: + ldr r0,=CTIMER0_DriverIRQHandler + bx r0 + .size CTIMER0_IRQHandler, . - CTIMER0_IRQHandler + + .align 1 + .thumb_func + .weak CTIMER1_IRQHandler + .type CTIMER1_IRQHandler, %function +CTIMER1_IRQHandler: + ldr r0,=CTIMER1_DriverIRQHandler + bx r0 + .size CTIMER1_IRQHandler, . - CTIMER1_IRQHandler + + .align 1 + .thumb_func + .weak CTIMER2_IRQHandler + .type CTIMER2_IRQHandler, %function +CTIMER2_IRQHandler: + ldr r0,=CTIMER2_DriverIRQHandler + bx r0 + .size CTIMER2_IRQHandler, . - CTIMER2_IRQHandler + + .align 1 + .thumb_func + .weak CTIMER3_IRQHandler + .type CTIMER3_IRQHandler, %function +CTIMER3_IRQHandler: + ldr r0,=CTIMER3_DriverIRQHandler + bx r0 + .size CTIMER3_IRQHandler, . - CTIMER3_IRQHandler + + .align 1 + .thumb_func + .weak CTIMER4_IRQHandler + .type CTIMER4_IRQHandler, %function +CTIMER4_IRQHandler: + ldr r0,=CTIMER4_DriverIRQHandler + bx r0 + .size CTIMER4_IRQHandler, . - CTIMER4_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM0_RELOAD_ERROR_IRQHandler + .type FLEXPWM0_RELOAD_ERROR_IRQHandler, %function +FLEXPWM0_RELOAD_ERROR_IRQHandler: + ldr r0,=FLEXPWM0_RELOAD_ERROR_DriverIRQHandler + bx r0 + .size FLEXPWM0_RELOAD_ERROR_IRQHandler, . - FLEXPWM0_RELOAD_ERROR_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM0_FAULT_IRQHandler + .type FLEXPWM0_FAULT_IRQHandler, %function +FLEXPWM0_FAULT_IRQHandler: + ldr r0,=FLEXPWM0_FAULT_DriverIRQHandler + bx r0 + .size FLEXPWM0_FAULT_IRQHandler, . - FLEXPWM0_FAULT_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM0_SUBMODULE0_IRQHandler + .type FLEXPWM0_SUBMODULE0_IRQHandler, %function +FLEXPWM0_SUBMODULE0_IRQHandler: + ldr r0,=FLEXPWM0_SUBMODULE0_DriverIRQHandler + bx r0 + .size FLEXPWM0_SUBMODULE0_IRQHandler, . - FLEXPWM0_SUBMODULE0_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM0_SUBMODULE1_IRQHandler + .type FLEXPWM0_SUBMODULE1_IRQHandler, %function +FLEXPWM0_SUBMODULE1_IRQHandler: + ldr r0,=FLEXPWM0_SUBMODULE1_DriverIRQHandler + bx r0 + .size FLEXPWM0_SUBMODULE1_IRQHandler, . - FLEXPWM0_SUBMODULE1_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM0_SUBMODULE2_IRQHandler + .type FLEXPWM0_SUBMODULE2_IRQHandler, %function +FLEXPWM0_SUBMODULE2_IRQHandler: + ldr r0,=FLEXPWM0_SUBMODULE2_DriverIRQHandler + bx r0 + .size FLEXPWM0_SUBMODULE2_IRQHandler, . - FLEXPWM0_SUBMODULE2_IRQHandler + + .align 1 + .thumb_func + .weak Reserved65_IRQHandler + .type Reserved65_IRQHandler, %function +Reserved65_IRQHandler: + ldr r0,=Reserved65_DriverIRQHandler + bx r0 + .size Reserved65_IRQHandler, . - Reserved65_IRQHandler + + .align 1 + .thumb_func + .weak QDC0_COMPARE_IRQHandler + .type QDC0_COMPARE_IRQHandler, %function +QDC0_COMPARE_IRQHandler: + ldr r0,=QDC0_COMPARE_DriverIRQHandler + bx r0 + .size QDC0_COMPARE_IRQHandler, . - QDC0_COMPARE_IRQHandler + + .align 1 + .thumb_func + .weak QDC0_HOME_IRQHandler + .type QDC0_HOME_IRQHandler, %function +QDC0_HOME_IRQHandler: + ldr r0,=QDC0_HOME_DriverIRQHandler + bx r0 + .size QDC0_HOME_IRQHandler, . - QDC0_HOME_IRQHandler + + .align 1 + .thumb_func + .weak QDC0_WATCHDOG_IRQHandler + .type QDC0_WATCHDOG_IRQHandler, %function +QDC0_WATCHDOG_IRQHandler: + ldr r0,=QDC0_WATCHDOG_DriverIRQHandler + bx r0 + .size QDC0_WATCHDOG_IRQHandler, . - QDC0_WATCHDOG_IRQHandler + + .align 1 + .thumb_func + .weak QDC0_INDEX_IRQHandler + .type QDC0_INDEX_IRQHandler, %function +QDC0_INDEX_IRQHandler: + ldr r0,=QDC0_INDEX_DriverIRQHandler + bx r0 + .size QDC0_INDEX_IRQHandler, . - QDC0_INDEX_IRQHandler + + .align 1 + .thumb_func + .weak FREQME0_IRQHandler + .type FREQME0_IRQHandler, %function +FREQME0_IRQHandler: + ldr r0,=FREQME0_DriverIRQHandler + bx r0 + .size FREQME0_IRQHandler, . - FREQME0_IRQHandler + + .align 1 + .thumb_func + .weak LPTMR0_IRQHandler + .type LPTMR0_IRQHandler, %function +LPTMR0_IRQHandler: + ldr r0,=LPTMR0_DriverIRQHandler + bx r0 + .size LPTMR0_IRQHandler, . - LPTMR0_IRQHandler + + .align 1 + .thumb_func + .weak Reserved72_IRQHandler + .type Reserved72_IRQHandler, %function +Reserved72_IRQHandler: + ldr r0,=Reserved72_DriverIRQHandler + bx r0 + .size Reserved72_IRQHandler, . - Reserved72_IRQHandler + + .align 1 + .thumb_func + .weak OS_EVENT_IRQHandler + .type OS_EVENT_IRQHandler, %function +OS_EVENT_IRQHandler: + ldr r0,=OS_EVENT_DriverIRQHandler + bx r0 + .size OS_EVENT_IRQHandler, . - OS_EVENT_IRQHandler + + .align 1 + .thumb_func + .weak WAKETIMER0_IRQHandler + .type WAKETIMER0_IRQHandler, %function +WAKETIMER0_IRQHandler: + ldr r0,=WAKETIMER0_DriverIRQHandler + bx r0 + .size WAKETIMER0_IRQHandler, . - WAKETIMER0_IRQHandler + + .align 1 + .thumb_func + .weak UTICK0_IRQHandler + .type UTICK0_IRQHandler, %function +UTICK0_IRQHandler: + ldr r0,=UTICK0_DriverIRQHandler + bx r0 + .size UTICK0_IRQHandler, . - UTICK0_IRQHandler + + .align 1 + .thumb_func + .weak WWDT0_IRQHandler + .type WWDT0_IRQHandler, %function +WWDT0_IRQHandler: + ldr r0,=WWDT0_DriverIRQHandler + bx r0 + .size WWDT0_IRQHandler, . - WWDT0_IRQHandler + + .align 1 + .thumb_func + .weak Reserved77_IRQHandler + .type Reserved77_IRQHandler, %function +Reserved77_IRQHandler: + ldr r0,=Reserved77_DriverIRQHandler + bx r0 + .size Reserved77_IRQHandler, . - Reserved77_IRQHandler + + .align 1 + .thumb_func + .weak ADC0_IRQHandler + .type ADC0_IRQHandler, %function +ADC0_IRQHandler: + ldr r0,=ADC0_DriverIRQHandler + bx r0 + .size ADC0_IRQHandler, . - ADC0_IRQHandler + + .align 1 + .thumb_func + .weak ADC1_IRQHandler + .type ADC1_IRQHandler, %function +ADC1_IRQHandler: + ldr r0,=ADC1_DriverIRQHandler + bx r0 + .size ADC1_IRQHandler, . - ADC1_IRQHandler + + .align 1 + .thumb_func + .weak CMP0_IRQHandler + .type CMP0_IRQHandler, %function +CMP0_IRQHandler: + ldr r0,=CMP0_DriverIRQHandler + bx r0 + .size CMP0_IRQHandler, . - CMP0_IRQHandler + + .align 1 + .thumb_func + .weak CMP1_IRQHandler + .type CMP1_IRQHandler, %function +CMP1_IRQHandler: + ldr r0,=CMP1_DriverIRQHandler + bx r0 + .size CMP1_IRQHandler, . - CMP1_IRQHandler + + .align 1 + .thumb_func + .weak Reserved82_IRQHandler + .type Reserved82_IRQHandler, %function +Reserved82_IRQHandler: + ldr r0,=Reserved82_DriverIRQHandler + bx r0 + .size Reserved82_IRQHandler, . - Reserved82_IRQHandler + + .align 1 + .thumb_func + .weak DAC0_IRQHandler + .type DAC0_IRQHandler, %function +DAC0_IRQHandler: + ldr r0,=DAC0_DriverIRQHandler + bx r0 + .size DAC0_IRQHandler, . - DAC0_IRQHandler + + .align 1 + .thumb_func + .weak Reserved84_IRQHandler + .type Reserved84_IRQHandler, %function +Reserved84_IRQHandler: + ldr r0,=Reserved84_DriverIRQHandler + bx r0 + .size Reserved84_IRQHandler, . - Reserved84_IRQHandler + + .align 1 + .thumb_func + .weak Reserved85_IRQHandler + .type Reserved85_IRQHandler, %function +Reserved85_IRQHandler: + ldr r0,=Reserved85_DriverIRQHandler + bx r0 + .size Reserved85_IRQHandler, . - Reserved85_IRQHandler + + .align 1 + .thumb_func + .weak Reserved86_IRQHandler + .type Reserved86_IRQHandler, %function +Reserved86_IRQHandler: + ldr r0,=Reserved86_DriverIRQHandler + bx r0 + .size Reserved86_IRQHandler, . - Reserved86_IRQHandler + + .align 1 + .thumb_func + .weak GPIO0_IRQHandler + .type GPIO0_IRQHandler, %function +GPIO0_IRQHandler: + ldr r0,=GPIO0_DriverIRQHandler + bx r0 + .size GPIO0_IRQHandler, . - GPIO0_IRQHandler + + .align 1 + .thumb_func + .weak GPIO1_IRQHandler + .type GPIO1_IRQHandler, %function +GPIO1_IRQHandler: + ldr r0,=GPIO1_DriverIRQHandler + bx r0 + .size GPIO1_IRQHandler, . - GPIO1_IRQHandler + + .align 1 + .thumb_func + .weak GPIO2_IRQHandler + .type GPIO2_IRQHandler, %function +GPIO2_IRQHandler: + ldr r0,=GPIO2_DriverIRQHandler + bx r0 + .size GPIO2_IRQHandler, . - GPIO2_IRQHandler + + .align 1 + .thumb_func + .weak GPIO3_IRQHandler + .type GPIO3_IRQHandler, %function +GPIO3_IRQHandler: + ldr r0,=GPIO3_DriverIRQHandler + bx r0 + .size GPIO3_IRQHandler, . - GPIO3_IRQHandler + + .align 1 + .thumb_func + .weak GPIO4_IRQHandler + .type GPIO4_IRQHandler, %function +GPIO4_IRQHandler: + ldr r0,=GPIO4_DriverIRQHandler + bx r0 + .size GPIO4_IRQHandler, . - GPIO4_IRQHandler + + .align 1 + .thumb_func + .weak Reserved92_IRQHandler + .type Reserved92_IRQHandler, %function +Reserved92_IRQHandler: + ldr r0,=Reserved92_DriverIRQHandler + bx r0 + .size Reserved92_IRQHandler, . - Reserved92_IRQHandler + + .align 1 + .thumb_func + .weak LPI2C2_IRQHandler + .type LPI2C2_IRQHandler, %function +LPI2C2_IRQHandler: + ldr r0,=LPI2C2_DriverIRQHandler + bx r0 + .size LPI2C2_IRQHandler, . - LPI2C2_IRQHandler + + .align 1 + .thumb_func + .weak LPI2C3_IRQHandler + .type LPI2C3_IRQHandler, %function +LPI2C3_IRQHandler: + ldr r0,=LPI2C3_DriverIRQHandler + bx r0 + .size LPI2C3_IRQHandler, . - LPI2C3_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM1_RELOAD_ERROR_IRQHandler + .type FLEXPWM1_RELOAD_ERROR_IRQHandler, %function +FLEXPWM1_RELOAD_ERROR_IRQHandler: + ldr r0,=FLEXPWM1_RELOAD_ERROR_DriverIRQHandler + bx r0 + .size FLEXPWM1_RELOAD_ERROR_IRQHandler, . - FLEXPWM1_RELOAD_ERROR_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM1_FAULT_IRQHandler + .type FLEXPWM1_FAULT_IRQHandler, %function +FLEXPWM1_FAULT_IRQHandler: + ldr r0,=FLEXPWM1_FAULT_DriverIRQHandler + bx r0 + .size FLEXPWM1_FAULT_IRQHandler, . - FLEXPWM1_FAULT_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM1_SUBMODULE0_IRQHandler + .type FLEXPWM1_SUBMODULE0_IRQHandler, %function +FLEXPWM1_SUBMODULE0_IRQHandler: + ldr r0,=FLEXPWM1_SUBMODULE0_DriverIRQHandler + bx r0 + .size FLEXPWM1_SUBMODULE0_IRQHandler, . - FLEXPWM1_SUBMODULE0_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM1_SUBMODULE1_IRQHandler + .type FLEXPWM1_SUBMODULE1_IRQHandler, %function +FLEXPWM1_SUBMODULE1_IRQHandler: + ldr r0,=FLEXPWM1_SUBMODULE1_DriverIRQHandler + bx r0 + .size FLEXPWM1_SUBMODULE1_IRQHandler, . - FLEXPWM1_SUBMODULE1_IRQHandler + + .align 1 + .thumb_func + .weak FLEXPWM1_SUBMODULE2_IRQHandler + .type FLEXPWM1_SUBMODULE2_IRQHandler, %function +FLEXPWM1_SUBMODULE2_IRQHandler: + ldr r0,=FLEXPWM1_SUBMODULE2_DriverIRQHandler + bx r0 + .size FLEXPWM1_SUBMODULE2_IRQHandler, . - FLEXPWM1_SUBMODULE2_IRQHandler + + .align 1 + .thumb_func + .weak Reserved100_IRQHandler + .type Reserved100_IRQHandler, %function +Reserved100_IRQHandler: + ldr r0,=Reserved100_DriverIRQHandler + bx r0 + .size Reserved100_IRQHandler, . - Reserved100_IRQHandler + + .align 1 + .thumb_func + .weak QDC1_COMPARE_IRQHandler + .type QDC1_COMPARE_IRQHandler, %function +QDC1_COMPARE_IRQHandler: + ldr r0,=QDC1_COMPARE_DriverIRQHandler + bx r0 + .size QDC1_COMPARE_IRQHandler, . - QDC1_COMPARE_IRQHandler + + .align 1 + .thumb_func + .weak QDC1_HOME_IRQHandler + .type QDC1_HOME_IRQHandler, %function +QDC1_HOME_IRQHandler: + ldr r0,=QDC1_HOME_DriverIRQHandler + bx r0 + .size QDC1_HOME_IRQHandler, . - QDC1_HOME_IRQHandler + + .align 1 + .thumb_func + .weak QDC1_WATCHDOG_IRQHandler + .type QDC1_WATCHDOG_IRQHandler, %function +QDC1_WATCHDOG_IRQHandler: + ldr r0,=QDC1_WATCHDOG_DriverIRQHandler + bx r0 + .size QDC1_WATCHDOG_IRQHandler, . - QDC1_WATCHDOG_IRQHandler + + .align 1 + .thumb_func + .weak QDC1_INDEX_IRQHandler + .type QDC1_INDEX_IRQHandler, %function +QDC1_INDEX_IRQHandler: + ldr r0,=QDC1_INDEX_DriverIRQHandler + bx r0 + .size QDC1_INDEX_IRQHandler, . - QDC1_INDEX_IRQHandler + + +/* 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, DefaultISR + .endm +/* Exception Handlers */ + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SecureFault_Handler + def_irq_handler DebugMon_Handler + def_irq_handler Reserved16_DriverIRQHandler + def_irq_handler CMC_DriverIRQHandler + def_irq_handler DMA_CH0_DriverIRQHandler + def_irq_handler DMA_CH1_DriverIRQHandler + def_irq_handler DMA_CH2_DriverIRQHandler + def_irq_handler DMA_CH3_DriverIRQHandler + def_irq_handler DMA_CH4_DriverIRQHandler + def_irq_handler DMA_CH5_DriverIRQHandler + def_irq_handler DMA_CH6_DriverIRQHandler + def_irq_handler DMA_CH7_DriverIRQHandler + def_irq_handler ERM0_SINGLE_BIT_DriverIRQHandler + def_irq_handler ERM0_MULTI_BIT_DriverIRQHandler + def_irq_handler FMU0_DriverIRQHandler + def_irq_handler GLIKEY0_DriverIRQHandler + def_irq_handler MBC0_DriverIRQHandler + def_irq_handler SCG0_DriverIRQHandler + def_irq_handler SPC0_DriverIRQHandler + def_irq_handler VBAT0_DriverIRQHandler + def_irq_handler WUU0_DriverIRQHandler + def_irq_handler CAN0_DriverIRQHandler + def_irq_handler Reserved36_DriverIRQHandler + def_irq_handler Reserved37_DriverIRQHandler + def_irq_handler Reserved38_DriverIRQHandler + def_irq_handler FLEXIO_DriverIRQHandler + def_irq_handler I3C0_DriverIRQHandler + def_irq_handler Reserved41_DriverIRQHandler + def_irq_handler LPI2C0_DriverIRQHandler + def_irq_handler LPI2C1_DriverIRQHandler + def_irq_handler LPSPI0_DriverIRQHandler + def_irq_handler LPSPI1_DriverIRQHandler + def_irq_handler Reserved46_DriverIRQHandler + def_irq_handler LPUART0_DriverIRQHandler + def_irq_handler LPUART1_DriverIRQHandler + def_irq_handler LPUART2_DriverIRQHandler + def_irq_handler LPUART3_DriverIRQHandler + def_irq_handler LPUART4_DriverIRQHandler + def_irq_handler USB0_DriverIRQHandler + def_irq_handler Reserved53_DriverIRQHandler + def_irq_handler CDOG0_DriverIRQHandler + def_irq_handler CTIMER0_DriverIRQHandler + def_irq_handler CTIMER1_DriverIRQHandler + def_irq_handler CTIMER2_DriverIRQHandler + def_irq_handler CTIMER3_DriverIRQHandler + def_irq_handler CTIMER4_DriverIRQHandler + def_irq_handler FLEXPWM0_RELOAD_ERROR_DriverIRQHandler + def_irq_handler FLEXPWM0_FAULT_DriverIRQHandler + def_irq_handler FLEXPWM0_SUBMODULE0_DriverIRQHandler + def_irq_handler FLEXPWM0_SUBMODULE1_DriverIRQHandler + def_irq_handler FLEXPWM0_SUBMODULE2_DriverIRQHandler + def_irq_handler Reserved65_DriverIRQHandler + def_irq_handler QDC0_COMPARE_DriverIRQHandler + def_irq_handler QDC0_HOME_DriverIRQHandler + def_irq_handler QDC0_WATCHDOG_DriverIRQHandler + def_irq_handler QDC0_INDEX_DriverIRQHandler + def_irq_handler FREQME0_DriverIRQHandler + def_irq_handler LPTMR0_DriverIRQHandler + def_irq_handler Reserved72_DriverIRQHandler + def_irq_handler OS_EVENT_DriverIRQHandler + def_irq_handler WAKETIMER0_DriverIRQHandler + def_irq_handler UTICK0_DriverIRQHandler + def_irq_handler WWDT0_DriverIRQHandler + def_irq_handler Reserved77_DriverIRQHandler + def_irq_handler ADC0_DriverIRQHandler + def_irq_handler ADC1_DriverIRQHandler + def_irq_handler CMP0_DriverIRQHandler + def_irq_handler CMP1_DriverIRQHandler + def_irq_handler Reserved82_DriverIRQHandler + def_irq_handler DAC0_DriverIRQHandler + def_irq_handler Reserved84_DriverIRQHandler + def_irq_handler Reserved85_DriverIRQHandler + def_irq_handler Reserved86_DriverIRQHandler + def_irq_handler GPIO0_DriverIRQHandler + def_irq_handler GPIO1_DriverIRQHandler + def_irq_handler GPIO2_DriverIRQHandler + def_irq_handler GPIO3_DriverIRQHandler + def_irq_handler GPIO4_DriverIRQHandler + def_irq_handler Reserved92_DriverIRQHandler + def_irq_handler LPI2C2_DriverIRQHandler + def_irq_handler LPI2C3_DriverIRQHandler + def_irq_handler FLEXPWM1_RELOAD_ERROR_DriverIRQHandler + def_irq_handler FLEXPWM1_FAULT_DriverIRQHandler + def_irq_handler FLEXPWM1_SUBMODULE0_DriverIRQHandler + def_irq_handler FLEXPWM1_SUBMODULE1_DriverIRQHandler + def_irq_handler FLEXPWM1_SUBMODULE2_DriverIRQHandler + def_irq_handler Reserved100_DriverIRQHandler + def_irq_handler QDC1_COMPARE_DriverIRQHandler + def_irq_handler QDC1_HOME_DriverIRQHandler + def_irq_handler QDC1_WATCHDOG_DriverIRQHandler + def_irq_handler QDC1_INDEX_DriverIRQHandler + + .end diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/MCXA156_flash.icf b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/MCXA156_flash.icf new file mode 100644 index 00000000000..028999f4904 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/MCXA156_flash.icf @@ -0,0 +1,84 @@ +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compiler: IAR ANSI C/C++ Compiler for ARM +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240104 +** +** Abstract: +** Linker file for the IAR ANSI C/C++ Compiler for ARM +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + +/* Stack and Heap Sizes */ +if (isdefinedsymbol(__stack_size__)) { + define symbol __size_cstack__ = __stack_size__; +} else { + define symbol __size_cstack__ = 0x0400; +} + +if (isdefinedsymbol(__heap_size__)) { + define symbol __size_heap__ = __heap_size__; +} else { + define symbol __size_heap__ = 0x0400; +} + +define symbol m_interrupts_start = 0x00000000; +define symbol m_interrupts_end = 0x000001FF; + +define symbol m_text_start = 0x00000200; +define symbol m_text_end = 0x000FFFFF; + +define symbol m_data_start = 0x20000000; +define symbol m_data_end = 0x2001DFFF; + +define symbol m_sramx0_start = 0x04000000; +define symbol m_sramx0_end = 0x04001FFF; + +define memory mem with size = 4G; + +define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end] + | mem:[from m_text_start to m_text_end]; +define region DATA_region = mem:[from m_data_start to m_data_end-__size_cstack__] + | mem:[from m_sramx0_start to m_sramx0_end]; + +define region CSTACK_region = mem:[from m_data_end-__size_cstack__+1 to m_data_end]; +if (isdefinedsymbol(__use_shmem__)) { + define region rpmsg_sh_mem_region = mem:[from rpmsg_sh_mem_start to rpmsg_sh_mem_end]; +} + +define block CSTACK with alignment = 8, size = __size_cstack__ { }; +define block HEAP with alignment = 8, size = __size_heap__ { }; +define block RW { readwrite }; +define block ZI { zi }; + +initialize by copy { readwrite, section .textrw }; + +if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) +{ + /* Required in a multi-threaded application */ + initialize by copy with packing = none { section __DLIB_PERTHREAD }; +} + + +place at address mem: m_interrupts_start { readonly section .intvec }; +place in TEXT_region { readonly }; +place in DATA_region { block RW }; +place in DATA_region { block ZI }; +place in DATA_region { last block HEAP }; +place in CSTACK_region { block CSTACK }; + + diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/MCXA156_ram.icf b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/MCXA156_ram.icf new file mode 100644 index 00000000000..a1b3e4274b1 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/MCXA156_ram.icf @@ -0,0 +1,80 @@ +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compiler: IAR ANSI C/C++ Compiler for ARM +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240104 +** +** Abstract: +** Linker file for the IAR ANSI C/C++ Compiler for ARM +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + +/* Stack and Heap Sizes */ +if (isdefinedsymbol(__stack_size__)) { + define symbol __size_cstack__ = __stack_size__; +} else { + define symbol __size_cstack__ = 0x0400; +} + +if (isdefinedsymbol(__heap_size__)) { + define symbol __size_heap__ = __heap_size__; +} else { + define symbol __size_heap__ = 0x0400; +} + +define symbol m_interrupts_start = 0x20000000; +define symbol m_interrupts_end = 0x200001FF; + +define symbol m_text_start = 0x20000200; +define symbol m_text_end = 0x20005FFF; + +define symbol m_data_start = 0x20006000; +define symbol m_data_end = 0x2001DFFF; + +define memory mem with size = 4G; + +define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end] + | mem:[from m_text_start to m_text_end]; +define region DATA_region = mem:[from m_data_start to m_data_end-__size_cstack__]; + +define region CSTACK_region = mem:[from m_data_end-__size_cstack__+1 to m_data_end]; +if (isdefinedsymbol(__use_shmem__)) { + define region rpmsg_sh_mem_region = mem:[from rpmsg_sh_mem_start to rpmsg_sh_mem_end]; +} + +define block CSTACK with alignment = 8, size = __size_cstack__ { }; +define block HEAP with alignment = 8, size = __size_heap__ { }; +define block RW { readwrite }; +define block ZI { zi }; + +initialize by copy { readwrite, section .textrw }; + +if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) +{ + /* Required in a multi-threaded application */ + initialize by copy with packing = none { section __DLIB_PERTHREAD }; +} + + +place at address mem: m_interrupts_start { readonly section .intvec }; +place in TEXT_region { readonly }; +place in DATA_region { block RW }; +place in DATA_region { block ZI }; +place in DATA_region { last block HEAP }; +place in CSTACK_region { block CSTACK }; + + diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/startup_MCXA156.s b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/startup_MCXA156.s new file mode 100644 index 00000000000..00d2bccea5a --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/iar/startup_MCXA156.s @@ -0,0 +1,953 @@ +; ------------------------------------------------------------------------- +; @file: startup_MCXA156.s +; @purpose: CMSIS Cortex-M33 Core Device Startup File +; MCXA156 +; @version: 1.0 +; @date: 2022-3-29 +; @build: b231107 +; ------------------------------------------------------------------------- +; +; Copyright 1997-2016 Freescale Semiconductor, Inc. +; Copyright 2016-2023 NXP +; SPDX-License-Identifier: BSD-3-Clause +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + + DATA + +__iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__vector_table + DCD sfe(CSTACK) + DCD 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 +__vector_table_0x1c + DCD SecureFault_Handler ;Secure Fault Handler + 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 Reserved16_IRQHandler ;OR IRQ1 to IRQ53 + DCD CMC_IRQHandler ;Core Mode Controller interrupt + DCD DMA_CH0_IRQHandler ;DMA3_0_CH0 error or transfer complete + DCD DMA_CH1_IRQHandler ;DMA3_0_CH1 error or transfer complete + DCD DMA_CH2_IRQHandler ;DMA3_0_CH2 error or transfer complete + DCD DMA_CH3_IRQHandler ;DMA3_0_CH3 error or transfer complete + DCD DMA_CH4_IRQHandler ;DMA3_0_CH4 error or transfer complete + DCD DMA_CH5_IRQHandler ;DMA3_0_CH5 error or transfer complete + DCD DMA_CH6_IRQHandler ;DMA3_0_CH6 error or transfer complete + DCD DMA_CH7_IRQHandler ;DMA3_0_CH7 error or transfer complete + DCD ERM0_SINGLE_BIT_IRQHandler ;ERM Single Bit error interrupt + DCD ERM0_MULTI_BIT_IRQHandler ;ERM Multi Bit error interrupt + DCD FMU0_IRQHandler ;Flash Management Unit interrupt + DCD GLIKEY0_IRQHandler ;GLIKEY Interrupt + DCD MBC0_IRQHandler ;MBC secure violation interrupt + DCD SCG0_IRQHandler ;System Clock Generator interrupt + DCD SPC0_IRQHandler ;System Power Controller interrupt + DCD VBAT0_IRQHandler ;VBAT interrupt + DCD WUU0_IRQHandler ;Wake Up Unit interrupt + DCD CAN0_IRQHandler ;Controller Area Network 0 interrupt + DCD Reserved36_IRQHandler ;Reserved interrupt + DCD Reserved37_IRQHandler ;Reserved interrupt + DCD Reserved38_IRQHandler ;Reserved interrupt + DCD FLEXIO_IRQHandler ;Flexible Input/Output interrupt + DCD I3C0_IRQHandler ;Improved Inter Integrated Circuit interrupt 0 + DCD Reserved41_IRQHandler ;Reserved interrupt + DCD LPI2C0_IRQHandler ;Low-Power Inter Integrated Circuit interrupt + DCD LPI2C1_IRQHandler ;Low-Power Inter Integrated Circuit interrupt + DCD LPSPI0_IRQHandler ;Low-Power Serial Peripheral Interface interrupt + DCD LPSPI1_IRQHandler ;Low-Power Serial Peripheral Interface interrupt + DCD Reserved46_IRQHandler ;Reserved interrupt + DCD LPUART0_IRQHandler ;Low-Power Universal Asynchronous Receive/Transmit interrupt + DCD LPUART1_IRQHandler ;Low-Power Universal Asynchronous Receive/Transmit interrupt + DCD LPUART2_IRQHandler ;Low-Power Universal Asynchronous Receive/Transmit interrupt + DCD LPUART3_IRQHandler ;Low-Power Universal Asynchronous Receive/Transmit interrupt + DCD LPUART4_IRQHandler ;Low-Power Universal Asynchronous Receive/Transmit interrupt + DCD USB0_IRQHandler ;Universal Serial Bus - Full Speed interrupt + DCD Reserved53_IRQHandler ;Reserved interrupt + DCD CDOG0_IRQHandler ;Code Watchdog Timer 0 interrupt + DCD CTIMER0_IRQHandler ;Standard counter/timer 0 interrupt + DCD CTIMER1_IRQHandler ;Standard counter/timer 1 interrupt + DCD CTIMER2_IRQHandler ;Standard counter/timer 2 interrupt + DCD CTIMER3_IRQHandler ;Standard counter/timer 3 interrupt + DCD CTIMER4_IRQHandler ;Standard counter/timer 4 interrupt + DCD FLEXPWM0_RELOAD_ERROR_IRQHandler ;FlexPWM0_reload_error interrupt + DCD FLEXPWM0_FAULT_IRQHandler ;FlexPWM0_fault interrupt + DCD FLEXPWM0_SUBMODULE0_IRQHandler ;FlexPWM0 Submodule 0 capture/compare/reload interrupt + DCD FLEXPWM0_SUBMODULE1_IRQHandler ;FlexPWM0 Submodule 1 capture/compare/reload interrupt + DCD FLEXPWM0_SUBMODULE2_IRQHandler ;FlexPWM0 Submodule 2 capture/compare/reload interrupt + DCD Reserved65_IRQHandler ;Reserved interrupt + DCD QDC0_COMPARE_IRQHandler ;Compare + DCD QDC0_HOME_IRQHandler ;Home + DCD QDC0_WATCHDOG_IRQHandler ;Watchdog / Simultaneous A and B Change + DCD QDC0_INDEX_IRQHandler ;Index / Roll Over / Roll Under + DCD FREQME0_IRQHandler ;Frequency Measurement interrupt + DCD LPTMR0_IRQHandler ;Low Power Timer 0 interrupt + DCD Reserved72_IRQHandler ;Reserved interrupt + DCD OS_EVENT_IRQHandler ;OS event timer interrupt + DCD WAKETIMER0_IRQHandler ;Wake Timer Interrupt + DCD UTICK0_IRQHandler ;Micro-Tick Timer interrupt + DCD WWDT0_IRQHandler ;Windowed Watchdog Timer 0 interrupt + DCD Reserved77_IRQHandler ;Reserved interrupt + DCD ADC0_IRQHandler ;Analog-to-Digital Converter interrupt + DCD ADC1_IRQHandler ;Analog-to-Digital Converter interrupt + DCD CMP0_IRQHandler ;Comparator interrupt + DCD CMP1_IRQHandler ;Comparator interrupt + DCD Reserved82_IRQHandler ;Reserved interrupt + DCD DAC0_IRQHandler ;Digital-to-Analog Converter 0 - General Purpose interrupt + DCD Reserved84_IRQHandler ;Reserved interrupt + DCD Reserved85_IRQHandler ;Reserved interrupt + DCD Reserved86_IRQHandler ;Reserved interrupt + DCD GPIO0_IRQHandler ;General Purpose Input/Output interrupt 0 + DCD GPIO1_IRQHandler ;General Purpose Input/Output interrupt 1 + DCD GPIO2_IRQHandler ;General Purpose Input/Output interrupt 2 + DCD GPIO3_IRQHandler ;General Purpose Input/Output interrupt 3 + DCD GPIO4_IRQHandler ;General Purpose Input/Output interrupt 4 + DCD Reserved92_IRQHandler ;Reserved interrupt + DCD LPI2C2_IRQHandler ;Low-Power Inter Integrated Circuit interrupt + DCD LPI2C3_IRQHandler ;Low-Power Inter Integrated Circuit interrupt + DCD FLEXPWM1_RELOAD_ERROR_IRQHandler ;FlexPWM1_reload_error interrupt + DCD FLEXPWM1_FAULT_IRQHandler ;FlexPWM1_fault interrupt + DCD FLEXPWM1_SUBMODULE0_IRQHandler ;FlexPWM1 Submodule 0 capture/compare/reload interrupt + DCD FLEXPWM1_SUBMODULE1_IRQHandler ;FlexPWM1 Submodule 1 capture/compare/reload interrupt + DCD FLEXPWM1_SUBMODULE2_IRQHandler ;FlexPWM1 Submodule 2 capture/compare/reload interrupt + DCD Reserved100_IRQHandler ;Reserved interrupt + DCD QDC1_COMPARE_IRQHandler ;Compare + DCD QDC1_HOME_IRQHandler ;Home + DCD QDC1_WATCHDOG_IRQHandler ;Watchdog / Simultaneous A and B Change + DCD QDC1_INDEX_IRQHandler ;Index / Roll Over / Roll Under +__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 + CPSID I ; Mask interrupts + LDR R0, =0xE000ED08 + LDR R1, =__vector_table + STR R1, [R0] + LDR R2, [R1] + MSR MSP, R2 + LDR R0, =sfb(CSTACK) + MSR MSPLIM, R0 + CPSIE I ; Unmask interrupts + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B . + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + B . + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +MemManage_Handler + B . + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +BusFault_Handler + B . + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +UsageFault_Handler + B . + + PUBWEAK SecureFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SecureFault_Handler + B . + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B . + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +DebugMon_Handler + B . + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B . + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B . + + PUBWEAK Reserved16_IRQHandler + PUBWEAK Reserved16_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved16_IRQHandler + LDR R0, =Reserved16_DriverIRQHandler + BX R0 + + PUBWEAK CMC_IRQHandler + PUBWEAK CMC_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CMC_IRQHandler + LDR R0, =CMC_DriverIRQHandler + BX R0 + + PUBWEAK DMA_CH0_IRQHandler + PUBWEAK DMA_CH0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DMA_CH0_IRQHandler + LDR R0, =DMA_CH0_DriverIRQHandler + BX R0 + + PUBWEAK DMA_CH1_IRQHandler + PUBWEAK DMA_CH1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DMA_CH1_IRQHandler + LDR R0, =DMA_CH1_DriverIRQHandler + BX R0 + + PUBWEAK DMA_CH2_IRQHandler + PUBWEAK DMA_CH2_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DMA_CH2_IRQHandler + LDR R0, =DMA_CH2_DriverIRQHandler + BX R0 + + PUBWEAK DMA_CH3_IRQHandler + PUBWEAK DMA_CH3_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DMA_CH3_IRQHandler + LDR R0, =DMA_CH3_DriverIRQHandler + BX R0 + + PUBWEAK DMA_CH4_IRQHandler + PUBWEAK DMA_CH4_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DMA_CH4_IRQHandler + LDR R0, =DMA_CH4_DriverIRQHandler + BX R0 + + PUBWEAK DMA_CH5_IRQHandler + PUBWEAK DMA_CH5_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DMA_CH5_IRQHandler + LDR R0, =DMA_CH5_DriverIRQHandler + BX R0 + + PUBWEAK DMA_CH6_IRQHandler + PUBWEAK DMA_CH6_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DMA_CH6_IRQHandler + LDR R0, =DMA_CH6_DriverIRQHandler + BX R0 + + PUBWEAK DMA_CH7_IRQHandler + PUBWEAK DMA_CH7_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DMA_CH7_IRQHandler + LDR R0, =DMA_CH7_DriverIRQHandler + BX R0 + + PUBWEAK ERM0_SINGLE_BIT_IRQHandler + PUBWEAK ERM0_SINGLE_BIT_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +ERM0_SINGLE_BIT_IRQHandler + LDR R0, =ERM0_SINGLE_BIT_DriverIRQHandler + BX R0 + + PUBWEAK ERM0_MULTI_BIT_IRQHandler + PUBWEAK ERM0_MULTI_BIT_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +ERM0_MULTI_BIT_IRQHandler + LDR R0, =ERM0_MULTI_BIT_DriverIRQHandler + BX R0 + + PUBWEAK FMU0_IRQHandler + PUBWEAK FMU0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FMU0_IRQHandler + LDR R0, =FMU0_DriverIRQHandler + BX R0 + + PUBWEAK GLIKEY0_IRQHandler + PUBWEAK GLIKEY0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +GLIKEY0_IRQHandler + LDR R0, =GLIKEY0_DriverIRQHandler + BX R0 + + PUBWEAK MBC0_IRQHandler + PUBWEAK MBC0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +MBC0_IRQHandler + LDR R0, =MBC0_DriverIRQHandler + BX R0 + + PUBWEAK SCG0_IRQHandler + PUBWEAK SCG0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +SCG0_IRQHandler + LDR R0, =SCG0_DriverIRQHandler + BX R0 + + PUBWEAK SPC0_IRQHandler + PUBWEAK SPC0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +SPC0_IRQHandler + LDR R0, =SPC0_DriverIRQHandler + BX R0 + + PUBWEAK VBAT0_IRQHandler + PUBWEAK VBAT0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +VBAT0_IRQHandler + LDR R0, =VBAT0_DriverIRQHandler + BX R0 + + PUBWEAK WUU0_IRQHandler + PUBWEAK WUU0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +WUU0_IRQHandler + LDR R0, =WUU0_DriverIRQHandler + BX R0 + + PUBWEAK CAN0_IRQHandler + PUBWEAK CAN0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CAN0_IRQHandler + LDR R0, =CAN0_DriverIRQHandler + BX R0 + + PUBWEAK Reserved36_IRQHandler + PUBWEAK Reserved36_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved36_IRQHandler + LDR R0, =Reserved36_DriverIRQHandler + BX R0 + + PUBWEAK Reserved37_IRQHandler + PUBWEAK Reserved37_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved37_IRQHandler + LDR R0, =Reserved37_DriverIRQHandler + BX R0 + + PUBWEAK Reserved38_IRQHandler + PUBWEAK Reserved38_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved38_IRQHandler + LDR R0, =Reserved38_DriverIRQHandler + BX R0 + + PUBWEAK FLEXIO_IRQHandler + PUBWEAK FLEXIO_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXIO_IRQHandler + LDR R0, =FLEXIO_DriverIRQHandler + BX R0 + + PUBWEAK I3C0_IRQHandler + PUBWEAK I3C0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +I3C0_IRQHandler + LDR R0, =I3C0_DriverIRQHandler + BX R0 + + PUBWEAK Reserved41_IRQHandler + PUBWEAK Reserved41_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved41_IRQHandler + LDR R0, =Reserved41_DriverIRQHandler + BX R0 + + PUBWEAK LPI2C0_IRQHandler + PUBWEAK LPI2C0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPI2C0_IRQHandler + LDR R0, =LPI2C0_DriverIRQHandler + BX R0 + + PUBWEAK LPI2C1_IRQHandler + PUBWEAK LPI2C1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPI2C1_IRQHandler + LDR R0, =LPI2C1_DriverIRQHandler + BX R0 + + PUBWEAK LPSPI0_IRQHandler + PUBWEAK LPSPI0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPSPI0_IRQHandler + LDR R0, =LPSPI0_DriverIRQHandler + BX R0 + + PUBWEAK LPSPI1_IRQHandler + PUBWEAK LPSPI1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPSPI1_IRQHandler + LDR R0, =LPSPI1_DriverIRQHandler + BX R0 + + PUBWEAK Reserved46_IRQHandler + PUBWEAK Reserved46_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved46_IRQHandler + LDR R0, =Reserved46_DriverIRQHandler + BX R0 + + PUBWEAK LPUART0_IRQHandler + PUBWEAK LPUART0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPUART0_IRQHandler + LDR R0, =LPUART0_DriverIRQHandler + BX R0 + + PUBWEAK LPUART1_IRQHandler + PUBWEAK LPUART1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPUART1_IRQHandler + LDR R0, =LPUART1_DriverIRQHandler + BX R0 + + PUBWEAK LPUART2_IRQHandler + PUBWEAK LPUART2_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPUART2_IRQHandler + LDR R0, =LPUART2_DriverIRQHandler + BX R0 + + PUBWEAK LPUART3_IRQHandler + PUBWEAK LPUART3_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPUART3_IRQHandler + LDR R0, =LPUART3_DriverIRQHandler + BX R0 + + PUBWEAK LPUART4_IRQHandler + PUBWEAK LPUART4_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPUART4_IRQHandler + LDR R0, =LPUART4_DriverIRQHandler + BX R0 + + PUBWEAK USB0_IRQHandler + PUBWEAK USB0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +USB0_IRQHandler + LDR R0, =USB0_DriverIRQHandler + BX R0 + + PUBWEAK Reserved53_IRQHandler + PUBWEAK Reserved53_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved53_IRQHandler + LDR R0, =Reserved53_DriverIRQHandler + BX R0 + + PUBWEAK CDOG0_IRQHandler + PUBWEAK CDOG0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CDOG0_IRQHandler + LDR R0, =CDOG0_DriverIRQHandler + BX R0 + + PUBWEAK CTIMER0_IRQHandler + PUBWEAK CTIMER0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CTIMER0_IRQHandler + LDR R0, =CTIMER0_DriverIRQHandler + BX R0 + + PUBWEAK CTIMER1_IRQHandler + PUBWEAK CTIMER1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CTIMER1_IRQHandler + LDR R0, =CTIMER1_DriverIRQHandler + BX R0 + + PUBWEAK CTIMER2_IRQHandler + PUBWEAK CTIMER2_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CTIMER2_IRQHandler + LDR R0, =CTIMER2_DriverIRQHandler + BX R0 + + PUBWEAK CTIMER3_IRQHandler + PUBWEAK CTIMER3_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CTIMER3_IRQHandler + LDR R0, =CTIMER3_DriverIRQHandler + BX R0 + + PUBWEAK CTIMER4_IRQHandler + PUBWEAK CTIMER4_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CTIMER4_IRQHandler + LDR R0, =CTIMER4_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM0_RELOAD_ERROR_IRQHandler + PUBWEAK FLEXPWM0_RELOAD_ERROR_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM0_RELOAD_ERROR_IRQHandler + LDR R0, =FLEXPWM0_RELOAD_ERROR_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM0_FAULT_IRQHandler + PUBWEAK FLEXPWM0_FAULT_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM0_FAULT_IRQHandler + LDR R0, =FLEXPWM0_FAULT_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM0_SUBMODULE0_IRQHandler + PUBWEAK FLEXPWM0_SUBMODULE0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM0_SUBMODULE0_IRQHandler + LDR R0, =FLEXPWM0_SUBMODULE0_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM0_SUBMODULE1_IRQHandler + PUBWEAK FLEXPWM0_SUBMODULE1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM0_SUBMODULE1_IRQHandler + LDR R0, =FLEXPWM0_SUBMODULE1_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM0_SUBMODULE2_IRQHandler + PUBWEAK FLEXPWM0_SUBMODULE2_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM0_SUBMODULE2_IRQHandler + LDR R0, =FLEXPWM0_SUBMODULE2_DriverIRQHandler + BX R0 + + PUBWEAK Reserved65_IRQHandler + PUBWEAK Reserved65_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved65_IRQHandler + LDR R0, =Reserved65_DriverIRQHandler + BX R0 + + PUBWEAK QDC0_COMPARE_IRQHandler + PUBWEAK QDC0_COMPARE_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +QDC0_COMPARE_IRQHandler + LDR R0, =QDC0_COMPARE_DriverIRQHandler + BX R0 + + PUBWEAK QDC0_HOME_IRQHandler + PUBWEAK QDC0_HOME_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +QDC0_HOME_IRQHandler + LDR R0, =QDC0_HOME_DriverIRQHandler + BX R0 + + PUBWEAK QDC0_WATCHDOG_IRQHandler + PUBWEAK QDC0_WATCHDOG_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +QDC0_WATCHDOG_IRQHandler + LDR R0, =QDC0_WATCHDOG_DriverIRQHandler + BX R0 + + PUBWEAK QDC0_INDEX_IRQHandler + PUBWEAK QDC0_INDEX_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +QDC0_INDEX_IRQHandler + LDR R0, =QDC0_INDEX_DriverIRQHandler + BX R0 + + PUBWEAK FREQME0_IRQHandler + PUBWEAK FREQME0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FREQME0_IRQHandler + LDR R0, =FREQME0_DriverIRQHandler + BX R0 + + PUBWEAK LPTMR0_IRQHandler + PUBWEAK LPTMR0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPTMR0_IRQHandler + LDR R0, =LPTMR0_DriverIRQHandler + BX R0 + + PUBWEAK Reserved72_IRQHandler + PUBWEAK Reserved72_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved72_IRQHandler + LDR R0, =Reserved72_DriverIRQHandler + BX R0 + + PUBWEAK OS_EVENT_IRQHandler + PUBWEAK OS_EVENT_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +OS_EVENT_IRQHandler + LDR R0, =OS_EVENT_DriverIRQHandler + BX R0 + + PUBWEAK WAKETIMER0_IRQHandler + PUBWEAK WAKETIMER0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +WAKETIMER0_IRQHandler + LDR R0, =WAKETIMER0_DriverIRQHandler + BX R0 + + PUBWEAK UTICK0_IRQHandler + PUBWEAK UTICK0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +UTICK0_IRQHandler + LDR R0, =UTICK0_DriverIRQHandler + BX R0 + + PUBWEAK WWDT0_IRQHandler + PUBWEAK WWDT0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +WWDT0_IRQHandler + LDR R0, =WWDT0_DriverIRQHandler + BX R0 + + PUBWEAK Reserved77_IRQHandler + PUBWEAK Reserved77_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved77_IRQHandler + LDR R0, =Reserved77_DriverIRQHandler + BX R0 + + PUBWEAK ADC0_IRQHandler + PUBWEAK ADC0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +ADC0_IRQHandler + LDR R0, =ADC0_DriverIRQHandler + BX R0 + + PUBWEAK ADC1_IRQHandler + PUBWEAK ADC1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +ADC1_IRQHandler + LDR R0, =ADC1_DriverIRQHandler + BX R0 + + PUBWEAK CMP0_IRQHandler + PUBWEAK CMP0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CMP0_IRQHandler + LDR R0, =CMP0_DriverIRQHandler + BX R0 + + PUBWEAK CMP1_IRQHandler + PUBWEAK CMP1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +CMP1_IRQHandler + LDR R0, =CMP1_DriverIRQHandler + BX R0 + + PUBWEAK Reserved82_IRQHandler + PUBWEAK Reserved82_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved82_IRQHandler + LDR R0, =Reserved82_DriverIRQHandler + BX R0 + + PUBWEAK DAC0_IRQHandler + PUBWEAK DAC0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +DAC0_IRQHandler + LDR R0, =DAC0_DriverIRQHandler + BX R0 + + PUBWEAK Reserved84_IRQHandler + PUBWEAK Reserved84_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved84_IRQHandler + LDR R0, =Reserved84_DriverIRQHandler + BX R0 + + PUBWEAK Reserved85_IRQHandler + PUBWEAK Reserved85_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved85_IRQHandler + LDR R0, =Reserved85_DriverIRQHandler + BX R0 + + PUBWEAK Reserved86_IRQHandler + PUBWEAK Reserved86_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved86_IRQHandler + LDR R0, =Reserved86_DriverIRQHandler + BX R0 + + PUBWEAK GPIO0_IRQHandler + PUBWEAK GPIO0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +GPIO0_IRQHandler + LDR R0, =GPIO0_DriverIRQHandler + BX R0 + + PUBWEAK GPIO1_IRQHandler + PUBWEAK GPIO1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +GPIO1_IRQHandler + LDR R0, =GPIO1_DriverIRQHandler + BX R0 + + PUBWEAK GPIO2_IRQHandler + PUBWEAK GPIO2_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +GPIO2_IRQHandler + LDR R0, =GPIO2_DriverIRQHandler + BX R0 + + PUBWEAK GPIO3_IRQHandler + PUBWEAK GPIO3_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +GPIO3_IRQHandler + LDR R0, =GPIO3_DriverIRQHandler + BX R0 + + PUBWEAK GPIO4_IRQHandler + PUBWEAK GPIO4_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +GPIO4_IRQHandler + LDR R0, =GPIO4_DriverIRQHandler + BX R0 + + PUBWEAK Reserved92_IRQHandler + PUBWEAK Reserved92_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved92_IRQHandler + LDR R0, =Reserved92_DriverIRQHandler + BX R0 + + PUBWEAK LPI2C2_IRQHandler + PUBWEAK LPI2C2_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPI2C2_IRQHandler + LDR R0, =LPI2C2_DriverIRQHandler + BX R0 + + PUBWEAK LPI2C3_IRQHandler + PUBWEAK LPI2C3_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +LPI2C3_IRQHandler + LDR R0, =LPI2C3_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM1_RELOAD_ERROR_IRQHandler + PUBWEAK FLEXPWM1_RELOAD_ERROR_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM1_RELOAD_ERROR_IRQHandler + LDR R0, =FLEXPWM1_RELOAD_ERROR_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM1_FAULT_IRQHandler + PUBWEAK FLEXPWM1_FAULT_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM1_FAULT_IRQHandler + LDR R0, =FLEXPWM1_FAULT_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM1_SUBMODULE0_IRQHandler + PUBWEAK FLEXPWM1_SUBMODULE0_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM1_SUBMODULE0_IRQHandler + LDR R0, =FLEXPWM1_SUBMODULE0_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM1_SUBMODULE1_IRQHandler + PUBWEAK FLEXPWM1_SUBMODULE1_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM1_SUBMODULE1_IRQHandler + LDR R0, =FLEXPWM1_SUBMODULE1_DriverIRQHandler + BX R0 + + PUBWEAK FLEXPWM1_SUBMODULE2_IRQHandler + PUBWEAK FLEXPWM1_SUBMODULE2_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +FLEXPWM1_SUBMODULE2_IRQHandler + LDR R0, =FLEXPWM1_SUBMODULE2_DriverIRQHandler + BX R0 + + PUBWEAK Reserved100_IRQHandler + PUBWEAK Reserved100_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +Reserved100_IRQHandler + LDR R0, =Reserved100_DriverIRQHandler + BX R0 + + PUBWEAK QDC1_COMPARE_IRQHandler + PUBWEAK QDC1_COMPARE_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +QDC1_COMPARE_IRQHandler + LDR R0, =QDC1_COMPARE_DriverIRQHandler + BX R0 + + PUBWEAK QDC1_HOME_IRQHandler + PUBWEAK QDC1_HOME_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +QDC1_HOME_IRQHandler + LDR R0, =QDC1_HOME_DriverIRQHandler + BX R0 + + PUBWEAK QDC1_WATCHDOG_IRQHandler + PUBWEAK QDC1_WATCHDOG_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +QDC1_WATCHDOG_IRQHandler + LDR R0, =QDC1_WATCHDOG_DriverIRQHandler + BX R0 + + PUBWEAK QDC1_INDEX_IRQHandler + PUBWEAK QDC1_INDEX_DriverIRQHandler + SECTION .text:CODE:REORDER:NOROOT(2) +QDC1_INDEX_IRQHandler + LDR R0, =QDC1_INDEX_DriverIRQHandler + BX R0 + +Reserved16_DriverIRQHandler +CMC_DriverIRQHandler +DMA_CH0_DriverIRQHandler +DMA_CH1_DriverIRQHandler +DMA_CH2_DriverIRQHandler +DMA_CH3_DriverIRQHandler +DMA_CH4_DriverIRQHandler +DMA_CH5_DriverIRQHandler +DMA_CH6_DriverIRQHandler +DMA_CH7_DriverIRQHandler +ERM0_SINGLE_BIT_DriverIRQHandler +ERM0_MULTI_BIT_DriverIRQHandler +FMU0_DriverIRQHandler +GLIKEY0_DriverIRQHandler +MBC0_DriverIRQHandler +SCG0_DriverIRQHandler +SPC0_DriverIRQHandler +VBAT0_DriverIRQHandler +WUU0_DriverIRQHandler +CAN0_DriverIRQHandler +Reserved36_DriverIRQHandler +Reserved37_DriverIRQHandler +Reserved38_DriverIRQHandler +FLEXIO_DriverIRQHandler +I3C0_DriverIRQHandler +Reserved41_DriverIRQHandler +LPI2C0_DriverIRQHandler +LPI2C1_DriverIRQHandler +LPSPI0_DriverIRQHandler +LPSPI1_DriverIRQHandler +Reserved46_DriverIRQHandler +LPUART0_DriverIRQHandler +LPUART1_DriverIRQHandler +LPUART2_DriverIRQHandler +LPUART3_DriverIRQHandler +LPUART4_DriverIRQHandler +USB0_DriverIRQHandler +Reserved53_DriverIRQHandler +CDOG0_DriverIRQHandler +CTIMER0_DriverIRQHandler +CTIMER1_DriverIRQHandler +CTIMER2_DriverIRQHandler +CTIMER3_DriverIRQHandler +CTIMER4_DriverIRQHandler +FLEXPWM0_RELOAD_ERROR_DriverIRQHandler +FLEXPWM0_FAULT_DriverIRQHandler +FLEXPWM0_SUBMODULE0_DriverIRQHandler +FLEXPWM0_SUBMODULE1_DriverIRQHandler +FLEXPWM0_SUBMODULE2_DriverIRQHandler +Reserved65_DriverIRQHandler +QDC0_COMPARE_DriverIRQHandler +QDC0_HOME_DriverIRQHandler +QDC0_WATCHDOG_DriverIRQHandler +QDC0_INDEX_DriverIRQHandler +FREQME0_DriverIRQHandler +LPTMR0_DriverIRQHandler +Reserved72_DriverIRQHandler +OS_EVENT_DriverIRQHandler +WAKETIMER0_DriverIRQHandler +UTICK0_DriverIRQHandler +WWDT0_DriverIRQHandler +Reserved77_DriverIRQHandler +ADC0_DriverIRQHandler +ADC1_DriverIRQHandler +CMP0_DriverIRQHandler +CMP1_DriverIRQHandler +Reserved82_DriverIRQHandler +DAC0_DriverIRQHandler +Reserved84_DriverIRQHandler +Reserved85_DriverIRQHandler +Reserved86_DriverIRQHandler +GPIO0_DriverIRQHandler +GPIO1_DriverIRQHandler +GPIO2_DriverIRQHandler +GPIO3_DriverIRQHandler +GPIO4_DriverIRQHandler +Reserved92_DriverIRQHandler +LPI2C2_DriverIRQHandler +LPI2C3_DriverIRQHandler +FLEXPWM1_RELOAD_ERROR_DriverIRQHandler +FLEXPWM1_FAULT_DriverIRQHandler +FLEXPWM1_SUBMODULE0_DriverIRQHandler +FLEXPWM1_SUBMODULE1_DriverIRQHandler +FLEXPWM1_SUBMODULE2_DriverIRQHandler +Reserved100_DriverIRQHandler +QDC1_COMPARE_DriverIRQHandler +QDC1_HOME_DriverIRQHandler +QDC1_WATCHDOG_DriverIRQHandler +QDC1_INDEX_DriverIRQHandler +DefaultISR + B . + + END diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/system_MCXA156.c b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/system_MCXA156.c new file mode 100644 index 00000000000..95d57e74b70 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/system_MCXA156.c @@ -0,0 +1,139 @@ +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compilers: GNU C Compiler +** IAR ANSI C/C++ Compiler for ARM +** Keil ARM C/C++ Compiler +** MCUXpresso Compiler +** +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240328 +** +** Abstract: +** Provides a system configuration function and a global variable that +** contains the system frequency. It configures the device and initializes +** the oscillator (PLL) that is part of the microcontroller device. +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2022-03-29) +** Initial version based on v0.1UM +** +** ################################################################### +*/ + +/*! + * @file MCXA156 + * @version 1.0 + * @date 2022-03-29 + * @brief Device specific configuration file for MCXA156 (implementation file) + * + * Provides a system configuration function and a global variable that contains + * the system frequency. It configures the device and initializes the oscillator + * (PLL) that is part of the microcontroller device. + */ + +#include +#include "fsl_device_registers.h" + + + + + +/* ---------------------------------------------------------------------------- + -- Core clock + ---------------------------------------------------------------------------- */ + +uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; + +/* ---------------------------------------------------------------------------- + -- SystemInit() + ---------------------------------------------------------------------------- */ + +__attribute__ ((weak)) void SystemInit (void) { +#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) + SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access in Secure mode */ + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + SCB_NS->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access in Non-secure mode */ + #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +#endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */ + + SCB->CPACR |= ((3UL << 0*2) | (3UL << 1*2)); /* set CP0, CP1 Full Access in Secure mode (enable PowerQuad) */ +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + SCB_NS->CPACR |= ((3UL << 0*2) | (3UL << 1*2)); /* set CP0, CP1 Full Access in Normal mode (enable PowerQuad) */ +#endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + SCB->NSACR |= ((3UL << 0) | (3UL << 10)); /* enable CP0, CP1, CP10, CP11 Non-secure Access */ + +#if defined(__MCUXPRESSO) + extern void(*const g_pfnVectors[]) (void); + SCB->VTOR = (uint32_t) &g_pfnVectors; +#else + extern void *__Vectors; + SCB->VTOR = (uint32_t) &__Vectors; +#endif + /* Enable the LPCAC */ + SYSCON->LPCAC_CTRL |= SYSCON_LPCAC_CTRL_LPCAC_MEM_REQ_MASK; + SYSCON->LPCAC_CTRL &= ~SYSCON_LPCAC_CTRL_DIS_LPCAC_MASK; + + /* Enable flash RWX when FLASH_ACL in IFR0 is invalid */ + if ((*((volatile const uint32_t *)(0x1000000)) == 0xFFFFFFFFU) || + ((*((volatile const uint32_t *)(0x1000000)) == 0x59630000U) && + (*((volatile const uint32_t *)(0x1000040)) == 0xFFFFFFFFU) && + (*((volatile const uint32_t *)(0x1000044)) == 0xFFFFFFFFU) && + (*((volatile const uint32_t *)(0x1000048)) == 0xFFFFFFFFU) && + (*((volatile const uint32_t *)(0x100004C)) == 0xFFFFFFFFU) && + (*((volatile const uint32_t *)(0x1000050)) == 0xFFFFFFFFU) && + (*((volatile const uint32_t *)(0x1000054)) == 0xFFFFFFFFU) && + (*((volatile const uint32_t *)(0x1000058)) == 0xFFFFFFFFU) && + (*((volatile const uint32_t *)(0x100005C)) == 0xFFFFFFFFU))) + { + /* Enable MBC register written with GLIKEY index15 */ + GLIKEY0->CTRL_0 = 0x00060000U; + GLIKEY0->CTRL_0 = 0x0002000FU; + GLIKEY0->CTRL_0 = 0x0001000FU; + GLIKEY0->CTRL_1 = 0x00290000U; + GLIKEY0->CTRL_0 = 0x0002000FU; + GLIKEY0->CTRL_1 = 0x00280000U; + GLIKEY0->CTRL_0 = 0x0000000FU; + + /* Enable RWX for GLBAC0 */ + MBC0->MBC_INDEX[0].MBC_MEMN_GLBAC[0] = 0x7700U; + + /* Use GLBAC0 for all flash block */ + for (uint8_t i = 0; i < 8U; i++) + { + MBC0->MBC_INDEX[0].MBC_DOM0_MEM0_BLK_CFG_W[i] = 0x00000000U; + } + + /* Disable MBC register written */ + GLIKEY0->CTRL_0 = 0x0002000FU; + } + SystemInitHook(); +} + +/* ---------------------------------------------------------------------------- + -- SystemCoreClockUpdate() + ---------------------------------------------------------------------------- */ + +void SystemCoreClockUpdate (void) { + +} + +/* ---------------------------------------------------------------------------- + -- SystemInitHook() + ---------------------------------------------------------------------------- */ + +__attribute__ ((weak)) void SystemInitHook (void) { + /* Void implementation of the weak function. */ +} diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/system_MCXA156.h b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/system_MCXA156.h new file mode 100644 index 00000000000..ab51c2cecb8 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/MCXA156/system_MCXA156.h @@ -0,0 +1,107 @@ +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** +** Compilers: GNU C Compiler +** IAR ANSI C/C++ Compiler for ARM +** Keil ARM C/C++ Compiler +** MCUXpresso Compiler +** +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b230829 +** +** Abstract: +** Provides a system configuration function and a global variable that +** contains the system frequency. It configures the device and initializes +** the oscillator (PLL) that is part of the microcontroller device. +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2023 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2022-03-29) +** Initial version based on v0.1UM +** +** ################################################################### +*/ + +/*! + * @file MCXA156 + * @version 1.0 + * @date 2022-03-29 + * @brief Device specific configuration file for MCXA156 (header file) + * + * Provides a system configuration function and a global variable that contains + * the system frequency. It configures the device and initializes the oscillator + * (PLL) that is part of the microcontroller device. + */ + +#ifndef _SYSTEM_MCXA156_H_ +#define _SYSTEM_MCXA156_H_ /**< Symbol preventing repeated inclusion */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define DEFAULT_SYSTEM_CLOCK 12000000u /* Default System clock value */ +#define CLK_RTC_32K_CLK 32768u /* RTC oscillator 32 kHz output (32k_clk */ +#define CLK_FRO_12MHZ 12000000u /* FRO 12 MHz (fro_12m) */ +#define CLK_FRO_32MHZ 32000000u /* FRO 32 MHz (fro_32m) */ +#define CLK_FRO_48MHZ 48000000u /* FRO 48 MHz (fro_48m) */ +#define CLK_CLK_IN 16000000u /* Default CLK_IN pin clock */ + + +/** + * @brief System clock frequency (core clock) + * + * The system clock frequency supplied to the SysTick timer and the processor + * core clock. This variable can be used by the user application to setup the + * SysTick timer or configure other parameters. It may also be used by debugger to + * query the frequency of the debug timer or configure the trace clock speed + * SystemCoreClock is initialized with a correct predefined value. + */ +extern uint32_t SystemCoreClock; + +/** + * @brief Setup the microcontroller system. + * + * Typically this function configures the oscillator (PLL) that is part of the + * microcontroller device. For systems with variable clock speed it also updates + * the variable SystemCoreClock. SystemInit is called from startup_device file. + */ +void SystemInit (void); + +/** + * @brief Updates the SystemCoreClock variable. + * + * It must be called whenever the core clock is changed during program + * execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates + * the current core clock. + */ +void SystemCoreClockUpdate (void); + +/** + * @brief SystemInit function hook. + * + * This weak function allows to call specific initialization code during the + * SystemInit() execution.This can be used when an application specific code needs + * to be called as close to the reset entry as possible (for example the Multicore + * Manager MCMGR_EarlyInit() function call). + * NOTE: No global r/w variables can be used in this hook function because the + * initialization of these variables happens after this function. + */ +void SystemInitHook (void); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYSTEM_MCXA156_H_ */ diff --git a/bsp/nxp/mcx/mcxa/Libraries/MCXA156/SConscript b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/SConscript new file mode 100644 index 00000000000..4fd2f5dd8ce --- /dev/null +++ b/bsp/nxp/mcx/mcxa/Libraries/MCXA156/SConscript @@ -0,0 +1,54 @@ +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +path = [cwd + '/../CMSIS/Core/Include',cwd + '/components/codec', cwd + '/MCXA156', cwd + '/MCXA156/drivers', cwd + '/middleware/sdmmc/inc', cwd + '/middleware/sdmmc/port'] +src = Split(''' + MCXA156/system_MCXA156.c + ''') + +if rtconfig.PLATFORM in ['gcc']: + src += ['MCXA156/gcc/startup_MCXA156.S'] +elif rtconfig.PLATFORM in ['armcc', 'armclang']: + src += ['MCXA156/arm/startup_MCXA156.s'] +elif rtconfig.PLATFORM in ['iccarm']: + src += ['MCXA156/iar/startup_MCXA156.s'] + +src += ['MCXA156/drivers/fsl_aoi.c'] +src += ['MCXA156/drivers/fsl_clock.c'] +src += ['MCXA156/drivers/fsl_cmc.c'] +src += ['MCXA156/drivers/fsl_common.c'] +src += ['MCXA156/drivers/fsl_common_arm.c'] +src += ['MCXA156/drivers/fsl_crc.c'] +src += ['MCXA156/drivers/fsl_ctimer.c'] +src += ['MCXA156/drivers/fsl_edma.c'] +src += ['MCXA156/drivers/fsl_edma_soc.c'] +src += ['MCXA156/drivers/fsl_eim.c'] +src += ['MCXA156/drivers/fsl_eqdc.c'] +src += ['MCXA156/drivers/fsl_erm.c'] +src += ['MCXA156/drivers/fsl_freqme.c'] +src += ['MCXA156/drivers/fsl_glikey.c'] +src += ['MCXA156/drivers/fsl_gpio.c'] +src += ['MCXA156/drivers/fsl_i3c.c'] +src += ['MCXA156/drivers/fsl_i3c_edma.c'] +src += ['MCXA156/drivers/fsl_inputmux.c'] +src += ['MCXA156/drivers/fsl_lpadc.c'] +src += ['MCXA156/drivers/fsl_lpcmp.c'] +src += ['MCXA156/drivers/fsl_lpi2c.c'] +src += ['MCXA156/drivers/fsl_lpi2c_edma.c'] +src += ['MCXA156/drivers/fsl_lptmr.c'] +src += ['MCXA156/drivers/fsl_lpuart.c'] +src += ['MCXA156/drivers/fsl_lpuart_edma.c'] +src += ['MCXA156/drivers/fsl_ostimer.c'] +src += ['MCXA156/drivers/fsl_pwm.c'] +src += ['MCXA156/drivers/fsl_reset.c'] +src += ['MCXA156/drivers/fsl_spc.c'] +src += ['MCXA156/drivers/fsl_utick.c'] +src += ['MCXA156/drivers/fsl_vbat.c'] +src += ['MCXA156/drivers/fsl_waketimer.c'] +src += ['MCXA156/drivers/fsl_wuu.c'] +src += ['MCXA156/drivers/fsl_wwdt.c'] + +group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/.config b/bsp/nxp/mcx/mcxa/frdm-mcxa156/.config new file mode 100644 index 00000000000..58fca7b8af5 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/.config @@ -0,0 +1,1340 @@ +CONFIG_SOC_MCX=y + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y +CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y +CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y +CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y +CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y +CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER=y +# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set +CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32 +CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32 +CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6 +CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9 +CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4 +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options + +# CONFIG_RT_UTEST_TC_USING_KLIBC is not set +# end of klibc options + +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 +# CONFIG_RT_USING_TIMER_ALL_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_CI_ACTION is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" +CONFIG_RT_VER_NUM=0x50200 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +CONFIG_RT_USING_HW_ATOMIC=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_FPU=y +CONFIG_ARCH_ARM_CORTEX_SECURE=y +CONFIG_ARCH_ARM_CORTEX_M33=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +CONFIG_RT_USING_HWTIMER=y +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +CONFIG_RT_USING_ULOG=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 is not set +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=y +# CONFIG_ULOG_USING_COLOR is not set +# CONFIG_ULOG_OUTPUT_TIME is not set +CONFIG_ULOG_OUTPUT_LEVEL=y +CONFIG_ULOG_OUTPUT_TAG=y +# CONFIG_ULOG_OUTPUT_THREAD_NAME is not set +# end of log format + +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 is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# CONFIG_PKG_USING_PNET is not set +# CONFIG_PKG_USING_OPENER is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# CONFIG_PKG_USING_RYAN_JSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# CONFIG_PKG_USING_RVBACKTRACE is not set +# CONFIG_PKG_USING_HPATCHLITE is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_UART_FRAMEWORK is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_RMP is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# CONFIG_PKG_USING_HEARTBEAT is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32F4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_MM32 is not set +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_BT_MX02 is not set +# CONFIG_PKG_USING_GC9A01 is not set +# CONFIG_PKG_USING_IK485 is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# CONFIG_PKG_USING_LLMCHAT is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LIBCRC is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +# +# Hardware Drivers Config +# +CONFIG_SOC_MCXA156=y + +# +# On-chip Peripheral Drivers +# +# CONFIG_BSP_USING_DMA is not set +CONFIG_BSP_USING_PIN=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART0=y +# CONFIG_BSP_USING_I2C is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_HWTIMER is not set +# CONFIG_BSP_USING_PWM is not set +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/Kconfig b/bsp/nxp/mcx/mcxa/frdm-mcxa156/Kconfig new file mode 100644 index 00000000000..eb5f8d1f591 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/Kconfig @@ -0,0 +1,18 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../../.. + +PKGS_DIR := packages + +config SOC_MCX + bool + select ARCH_ARM_CORTEX_M33 + select ARCH_ARM_CORTEX_SECURE + default y + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/SConscript b/bsp/nxp/mcx/mcxa/frdm-mcxa156/SConscript new file mode 100644 index 00000000000..c7ef7659ece --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/SConscript @@ -0,0 +1,14 @@ +# for module compiling +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/nxp/mcx/mcxa/frdm-mcxa156/SConstruct b/bsp/nxp/mcx/mcxa/frdm-mcxa156/SConstruct new file mode 100644 index 00000000000..ed0bfe11ffd --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/SConstruct @@ -0,0 +1,67 @@ +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 + +if rtconfig.PLATFORM == 'armcc': + env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS, + # overwrite cflags, because cflags has '--C99' + CXXCOM = '$CXX -o $TARGET --cpp -c $CXXFLAGS $_CCCOMCOM $SOURCES') +else: + env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CFLAGS = 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) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/Libraries'): + libraries_path_prefix = SDK_ROOT + '/Libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/Libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'))) + +# include cmsis +objs.extend(SConscript(os.path.join(libraries_path_prefix, rtconfig.BSP_LIBRARY_TYPE, 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/applications/SConscript b/bsp/nxp/mcx/mcxa/frdm-mcxa156/applications/SConscript new file mode 100644 index 00000000000..f11833c8d8d --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +CPPPATH = [cwd] +src = Glob('*.c') + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/applications/main.c b/bsp/nxp/mcx/mcxa/frdm-mcxa156/applications/main.c new file mode 100644 index 00000000000..d229d56b1c1 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/applications/main.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-10-24 Magicoe first version + * 2020-01-10 Kevin/Karl Add PS demo + * 2020-09-21 supperthomas fix the main.c + * + */ + +#include +#include "drv_pin.h" + +#define LED_PIN ((3*32)+12) + +int main(void) +{ +#if defined(__CC_ARM) + rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION); +#elif defined(__clang__) + rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION); +#elif defined(__ICCARM__) + rt_kprintf("using iccarm, version: %d\n", __VER__); +#elif defined(__GNUC__) + rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__); +#endif + + while (1) + { + rt_thread_mdelay(1000); /* Delay 1S */ + rt_kprintf("MCXA156 HelloWorld\r\n"); + } +} + +// end file diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig new file mode 100644 index 00000000000..3b56d190ec5 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig @@ -0,0 +1,173 @@ +menu "Hardware Drivers Config" + +config SOC_MCXA156 + bool + select SOC_MCXA156_SERIES + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "On-chip Peripheral Drivers" + + config BSP_USING_DMA + bool "Enable DMA" + select RT_USING_DMA + default n + + config BSP_USING_PIN + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + config BSP_USING_UART + bool "Enable UART" + select RT_USING_UART + default y + + if BSP_USING_UART + config BSP_USING_UART0 + bool "Enable LPUART as UART" + default y + + endif + + + menuconfig BSP_USING_I2C + config BSP_USING_I2C + bool "Enable I2C" + select RT_USING_I2C + default y + + if BSP_USING_I2C + config BSP_USING_I2C0 + bool "Enable Flexcomm0 I2C" + default y + config BSP_USING_I2C1 + bool "Enable Flexcomm1 I2C" + default y + endif + + menuconfig BSP_USING_SPI + config BSP_USING_SPI + bool "Enable SPI" + select RT_USING_SPI + default y + + if BSP_USING_SPI + config BSP_USING_SPI3 + bool "Enable Flexcomm3 as SPI" + default n + + config BSP_USING_SPI8 + bool "Enable Flexcomm8 as High Speed SPI" + default y + endif + + menuconfig BSP_USING_ADC + config BSP_USING_ADC + bool "Enable ADC Channel" + select RT_USING_ADC + default y + + if BSP_USING_ADC + config BSP_USING_ADC0_CH0 + bool "Enable ADC0 Channel0" + default y + + config BSP_USING_ADC0_CH1 + bool "Enable ADC0 Channel1" + default n + + config BSP_USING_ADC0_CH8 + bool "Enable ADC0 Channel8" + default n + + + config BSP_USING_ADC0_CH13 + bool "Enable ADC0 Channel13" + default n + + + config BSP_USING_ADC0_CH26 + bool "Enable ADC0 Channel26" + default n + + endif + + config BSP_USING_SDIO + bool "Enable SDIO SD Card Interface" + select RT_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default y + + config BSP_USING_RTC + bool "Enable RTC" + select RT_USING_RTC + default y + + config BSP_USING_WDT + bool "Enable WatchDog" + select RT_USING_WDT + default n + + menuconfig BSP_USING_HWTIMER + config BSP_USING_HWTIMER + bool "Enable Timer" + select RT_USING_HWTIMER + default y + + if BSP_USING_HWTIMER + config BSP_USING_CTIMER0 + bool "Enable CIMER0" + default y + + config BSP_USING_CTIMER1 + bool "Enable CIMER1" + default n + + config BSP_USING_CTIMER3 + bool "Enable CIMER3" + default n + + config BSP_USING_CTIMER4 + bool "Enable CIMER4" + default n + endif + + menuconfig BSP_USING_PWM + config BSP_USING_PWM + bool "Enable PWM" + select RT_USING_PWM + default y + + if BSP_USING_PWM + config BSP_USING_CTIMER1_MAT0 + bool "Enable CIMER1 Match0 as PWM output" + default y + + config BSP_USING_CTIMER2_MAT0 + bool "Enable CIMER2 Match0 as PWM output" + default n + + config BSP_USING_CTIMER2_MAT1 + bool "Enable CIMER2 Match1 as PWM output" + default n + + config BSP_USING_CTIMER2_MAT2 + bool "Enable CIMER2 Match2 as PWM output" + default n + + config BSP_USING_CTIMER3_MAT2 + bool "Enable CIMER3 Match2 as PWM output" + default n + endif +endmenu + + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/clock_config.c b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/clock_config.c new file mode 100644 index 00000000000..11699f77e11 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/clock_config.c @@ -0,0 +1,482 @@ +/* + * Copyright 2024 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ +/* + * How to setup clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up wait states of the flash. + * + * 3. Set up all dividers. + * + * 4. Set up all selectors to provide selected clocks. + * + */ + +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v13.0 +processor: MCXA156 +package_id: MCXA156VLL +mcu_data: ksdk2_0 +processor_version: 0.15.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ + +#include "fsl_clock.h" +#include "clock_config.h" +#include "fsl_spc.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO96M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO12M ********************** + ******************************************************************************/ +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO12M +outputs: +- {id: CLK_1M_clock.outFreq, value: 1 MHz} +- {id: CPU_clock.outFreq, value: 12 MHz} +- {id: FRO_12M_clock.outFreq, value: 12 MHz} +- {id: MAIN_clock.outFreq, value: 12 MHz} +- {id: Slow_clock.outFreq, value: 3 MHz} +- {id: System_clock.outFreq, value: 12 MHz} +- {id: UTICK_clock.outFreq, value: 1 MHz} +settings: +- {id: SCGMode, value: SIRC} +- {id: FRO_HF_PERIPHERALS_EN_CFG, value: Disabled} +- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1} +- {id: SCG.SCSSEL.sel, value: SCG.SIRC} +- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO12M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO12M configuration + ******************************************************************************/ +void BOARD_BootClockFRO12M(void) +{ + uint32_t coreFreq; + spc_active_mode_core_ldo_option_t ldoOption; + spc_sram_voltage_config_t sramOption; + + /* Get the CPU Core frequency */ + coreFreq = CLOCK_GetCoreSysClkFreq(); + + /* The flow of increasing voltage and frequency */ + if (coreFreq <= BOARD_BOOTCLOCKFRO12M_CORE_CLOCK) { + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P0V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + } + + CLOCK_SetupFRO12MClocking(); /*!< Setup FRO12M clock */ + + CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /* !< Switch MAIN_CLK to FRO12M */ + + /* The flow of decreasing voltage and frequency */ + if (coreFreq > BOARD_BOOTCLOCKFRO12M_CORE_CLOCK) { + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P0V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + } + + /*!< Set up clock selectors - Attach clocks to the peripheries */ + + /*!< Set up dividers */ + CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U); /* !< Set AHBCLKDIV divider to value 1 */ + + /* Set SystemCoreClock variable */ + SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK; +} +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO24M ********************** + ******************************************************************************/ +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO24M +outputs: +- {id: CLK_1M_clock.outFreq, value: 1 MHz} +- {id: CLK_48M_clock.outFreq, value: 48 MHz} +- {id: CPU_clock.outFreq, value: 24 MHz} +- {id: FRO_12M_clock.outFreq, value: 12 MHz} +- {id: FRO_HF_DIV_clock.outFreq, value: 48 MHz} +- {id: FRO_HF_clock.outFreq, value: 48 MHz} +- {id: MAIN_clock.outFreq, value: 48 MHz} +- {id: Slow_clock.outFreq, value: 6 MHz} +- {id: System_clock.outFreq, value: 24 MHz} +- {id: UTICK_clock.outFreq, value: 1 MHz} +settings: +- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1} +- {id: SYSCON.AHBCLKDIV.scale, value: '2', locked: true} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO24M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO24M configuration + ******************************************************************************/ +void BOARD_BootClockFRO24M(void) +{ + uint32_t coreFreq; + spc_active_mode_core_ldo_option_t ldoOption; + spc_sram_voltage_config_t sramOption; + + /* Get the CPU Core frequency */ + coreFreq = CLOCK_GetCoreSysClkFreq(); + + /* The flow of increasing voltage and frequency */ + if (coreFreq <= BOARD_BOOTCLOCKFRO24M_CORE_CLOCK) { + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P0V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + } + + CLOCK_SetupFROHFClocking(48000000U); /*!< Enable FRO HF(48MHz) output */ + + CLOCK_SetupFRO12MClocking(); /*!< Setup FRO12M clock */ + + CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /* !< Switch MAIN_CLK to FRO_HF */ + + /* The flow of decreasing voltage and frequency */ + if (coreFreq > BOARD_BOOTCLOCKFRO24M_CORE_CLOCK) { + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P0V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + } + + /*!< Set up clock selectors - Attach clocks to the peripheries */ + + /*!< Set up dividers */ + CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 2U); /* !< Set AHBCLKDIV divider to value 2 */ + CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U); /* !< Set FROHFDIV divider to value 1 */ + + /* Set SystemCoreClock variable */ + SystemCoreClock = BOARD_BOOTCLOCKFRO24M_CORE_CLOCK; +} +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO48M ********************** + ******************************************************************************/ +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO48M +outputs: +- {id: CLK_1M_clock.outFreq, value: 1 MHz} +- {id: CLK_48M_clock.outFreq, value: 48 MHz} +- {id: CPU_clock.outFreq, value: 48 MHz} +- {id: FRO_12M_clock.outFreq, value: 12 MHz} +- {id: FRO_HF_DIV_clock.outFreq, value: 48 MHz} +- {id: FRO_HF_clock.outFreq, value: 48 MHz} +- {id: MAIN_clock.outFreq, value: 48 MHz} +- {id: Slow_clock.outFreq, value: 12 MHz} +- {id: System_clock.outFreq, value: 48 MHz} +- {id: UTICK_clock.outFreq, value: 1 MHz} +settings: +- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO48M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO48M configuration + ******************************************************************************/ +void BOARD_BootClockFRO48M(void) +{ + uint32_t coreFreq; + spc_active_mode_core_ldo_option_t ldoOption; + spc_sram_voltage_config_t sramOption; + + /* Get the CPU Core frequency */ + coreFreq = CLOCK_GetCoreSysClkFreq(); + + /* The flow of increasing voltage and frequency */ + if (coreFreq <= BOARD_BOOTCLOCKFRO48M_CORE_CLOCK) { + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P0V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + } + + CLOCK_SetupFROHFClocking(48000000U); /*!< Enable FRO HF(48MHz) output */ + + CLOCK_SetupFRO12MClocking(); /*!< Setup FRO12M clock */ + + CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /* !< Switch MAIN_CLK to FRO_HF */ + + /* The flow of decreasing voltage and frequency */ + if (coreFreq > BOARD_BOOTCLOCKFRO48M_CORE_CLOCK) { + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P0V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + } + + /*!< Set up clock selectors - Attach clocks to the peripheries */ + + /*!< Set up dividers */ + CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U); /* !< Set AHBCLKDIV divider to value 1 */ + CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U); /* !< Set FROHFDIV divider to value 1 */ + + /* Set SystemCoreClock variable */ + SystemCoreClock = BOARD_BOOTCLOCKFRO48M_CORE_CLOCK; +} +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO64M ********************** + ******************************************************************************/ +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO64M +outputs: +- {id: CLK_1M_clock.outFreq, value: 1 MHz} +- {id: CLK_48M_clock.outFreq, value: 48 MHz} +- {id: CPU_clock.outFreq, value: 64 MHz} +- {id: FRO_12M_clock.outFreq, value: 12 MHz} +- {id: FRO_HF_DIV_clock.outFreq, value: 64 MHz} +- {id: FRO_HF_clock.outFreq, value: 64 MHz} +- {id: MAIN_clock.outFreq, value: 64 MHz} +- {id: Slow_clock.outFreq, value: 16 MHz} +- {id: System_clock.outFreq, value: 64 MHz} +- {id: UTICK_clock.outFreq, value: 1 MHz} +settings: +- {id: VDD_CORE, value: voltage_1v1} +- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.FROHFDIV.scale, value: '1', locked: true} +- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1} +- {id: SYSCON.AHBCLKDIV.scale, value: '1', locked: true} +sources: +- {id: SCG.FIRC.outFreq, value: 64 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO64M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO64M configuration + ******************************************************************************/ +void BOARD_BootClockFRO64M(void) +{ + uint32_t coreFreq; + spc_active_mode_core_ldo_option_t ldoOption; + spc_sram_voltage_config_t sramOption; + + /* Get the CPU Core frequency */ + coreFreq = CLOCK_GetCoreSysClkFreq(); + + /* The flow of increasing voltage and frequency */ + if (coreFreq <= BOARD_BOOTCLOCKFRO64M_CORE_CLOCK) { + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P1V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + } + + CLOCK_SetupFROHFClocking(64000000U); /*!< Enable FRO HF(64MHz) output */ + + CLOCK_SetupFRO12MClocking(); /*!< Setup FRO12M clock */ + + CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /* !< Switch MAIN_CLK to FRO_HF */ + + /* The flow of decreasing voltage and frequency */ + if (coreFreq > BOARD_BOOTCLOCKFRO64M_CORE_CLOCK) { + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P1V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + } + + /*!< Set up clock selectors - Attach clocks to the peripheries */ + + /*!< Set up dividers */ + CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U); /* !< Set AHBCLKDIV divider to value 1 */ + CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U); /* !< Set FROHFDIV divider to value 1 */ + + /* Set SystemCoreClock variable */ + SystemCoreClock = BOARD_BOOTCLOCKFRO64M_CORE_CLOCK; +} +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO96M ********************** + ******************************************************************************/ +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO96M +called_from_default_init: true +outputs: +- {id: CLK_1M_clock.outFreq, value: 1 MHz} +- {id: CLK_48M_clock.outFreq, value: 48 MHz} +- {id: CPU_clock.outFreq, value: 96 MHz} +- {id: FRO_12M_clock.outFreq, value: 12 MHz} +- {id: FRO_HF_DIV_clock.outFreq, value: 96 MHz} +- {id: FRO_HF_clock.outFreq, value: 96 MHz} +- {id: MAIN_clock.outFreq, value: 96 MHz} +- {id: Slow_clock.outFreq, value: 24 MHz} +- {id: System_clock.outFreq, value: 96 MHz} +- {id: UTICK_clock.outFreq, value: 1 MHz} +settings: +- {id: VDD_CORE, value: voltage_1v1} +- {id: CLKOUTDIV_HALT, value: Enable} +- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0} +- {id: MRCC.FROHFDIV.scale, value: '1', locked: true} +- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1} +- {id: SYSCON.AHBCLKDIV.scale, value: '1', locked: true} +sources: +- {id: SCG.FIRC.outFreq, value: 96 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO96M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO96M configuration + ******************************************************************************/ +void BOARD_BootClockFRO96M(void) +{ + uint32_t coreFreq; + spc_active_mode_core_ldo_option_t ldoOption; + spc_sram_voltage_config_t sramOption; + + /* Get the CPU Core frequency */ + coreFreq = CLOCK_GetCoreSysClkFreq(); + + /* The flow of increasing voltage and frequency */ + if (coreFreq <= BOARD_BOOTCLOCKFRO96M_CORE_CLOCK) { + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x2U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P1V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + } + + CLOCK_SetupFROHFClocking(96000000U); /*!< Enable FRO HF(96MHz) output */ + + CLOCK_SetupFRO12MClocking(); /*!< Setup FRO12M clock */ + + CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /* !< Switch MAIN_CLK to FRO_HF */ + + /* The flow of decreasing voltage and frequency */ + if (coreFreq > BOARD_BOOTCLOCKFRO96M_CORE_CLOCK) { + /* Configure Flash to support different voltage level and frequency */ + FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x2U)); + /* Specifies the operating voltage for the SRAM's read/write timing margin */ + sramOption.operateVoltage = kSPC_sramOperateAt1P1V; + sramOption.requestVoltageUpdate = true; + (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption); + /* Set the LDO_CORE VDD regulator level */ + ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage; + ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength; + (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption); + } + + /*!< Set up clock selectors - Attach clocks to the peripheries */ + + /*!< Set up dividers */ + CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U); /* !< Set AHBCLKDIV divider to value 1 */ + CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U); /* !< Set FROHFDIV divider to value 1 */ + + /* Set SystemCoreClock variable */ + SystemCoreClock = BOARD_BOOTCLOCKFRO96M_CORE_CLOCK; +} diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/clock_config.h b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/clock_config.h new file mode 100644 index 00000000000..b2ecbd3500e --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/clock_config.h @@ -0,0 +1,170 @@ +/* + * Copyright 2024 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _CLOCK_CONFIG_H_ +#define _CLOCK_CONFIG_H_ + +#include "fsl_common.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes default configuration of clocks. + * + */ +void BOARD_InitBootClocks(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO12M ********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockFRO12M configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK 12000000U /*!< Core clock frequency: 12000000Hz */ + + +/******************************************************************************* + * API for BOARD_BootClockFRO12M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockFRO12M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO24M ********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockFRO24M configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKFRO24M_CORE_CLOCK 24000000U /*!< Core clock frequency: 24000000Hz */ + + +/******************************************************************************* + * API for BOARD_BootClockFRO24M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockFRO24M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO48M ********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockFRO48M configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKFRO48M_CORE_CLOCK 48000000U /*!< Core clock frequency: 48000000Hz */ + + +/******************************************************************************* + * API for BOARD_BootClockFRO48M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockFRO48M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO64M ********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockFRO64M configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKFRO64M_CORE_CLOCK 64000000U /*!< Core clock frequency: 64000000Hz */ + + +/******************************************************************************* + * API for BOARD_BootClockFRO64M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockFRO64M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO96M ********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockFRO96M configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKFRO96M_CORE_CLOCK 96000000U /*!< Core clock frequency: 96000000Hz */ + + +/******************************************************************************* + * API for BOARD_BootClockFRO96M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockFRO96M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +#endif /* _CLOCK_CONFIG_H_ */ + diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/pin_mux.c b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/pin_mux.c new file mode 100644 index 00000000000..c9be992461a --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/pin_mux.c @@ -0,0 +1,121 @@ +/* + * Copyright 2024 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v15.0 +processor: MCXA156 +package_id: MCXA156VLL +mcu_data: ksdk2_0 +processor_version: 0.15.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_port.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'} +- pin_list: + - {pin_num: '78', peripheral: LPUART0, signal: RX, pin_signal: P0_2/TDO/SWO/LPUART0_RXD/LPSPI0_SCK/CT0_MAT0/UTICK_CAP0/FLEXIO0_D2, slew_rate: fast, open_drain: disable, + drive_strength: low, pull_select: up, pull_enable: enable, input_buffer: enable, invert_input: normal} + - {pin_num: '79', peripheral: LPUART0, signal: TX, pin_signal: P0_3/TDI/LPUART0_TXD/LPSPI0_SDO/CT0_MAT1/UTICK_CAP1/FLEXIO0_D3/CMP0_OUT, slew_rate: fast, open_drain: disable, + drive_strength: low, pull_select: up, pull_enable: enable, input_buffer: enable, invert_input: normal} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +void BOARD_InitPins(void) +{ + /* PORT0: Peripheral clock is enabled */ + CLOCK_EnableClock(kCLOCK_GatePORT0); + /* LPUART0 peripheral is released from reset */ + RESET_ReleasePeripheralReset(kLPUART0_RST_SHIFT_RSTn); + /* PORT0 peripheral is released from reset */ + RESET_ReleasePeripheralReset(kPORT0_RST_SHIFT_RSTn); + + const port_pin_config_t port0_2_pin78_config = {/* Internal pull-up resistor is enabled */ + kPORT_PullUp, + /* Low internal pull resistor value is selected. */ + kPORT_LowPullResistor, + /* Fast slew rate is configured */ + kPORT_FastSlewRate, + /* Passive input filter is disabled */ + kPORT_PassiveFilterDisable, + /* Open drain output is disabled */ + kPORT_OpenDrainDisable, + /* Low drive strength is configured */ + kPORT_LowDriveStrength, + /* Normal drive strength is configured */ + kPORT_NormalDriveStrength, + /* Pin is configured as LPUART0_RXD */ + kPORT_MuxAlt2, + /* Digital input enabled */ + kPORT_InputBufferEnable, + /* Digital input is not inverted */ + kPORT_InputNormal, + /* Pin Control Register fields [15:0] are not locked */ + kPORT_UnlockRegister}; + /* PORT0_2 (pin 78) is configured as LPUART0_RXD */ + PORT_SetPinConfig(PORT0, 2U, &port0_2_pin78_config); + + const port_pin_config_t port0_3_pin79_config = {/* Internal pull-up resistor is enabled */ + kPORT_PullUp, + /* Low internal pull resistor value is selected. */ + kPORT_LowPullResistor, + /* Fast slew rate is configured */ + kPORT_FastSlewRate, + /* Passive input filter is disabled */ + kPORT_PassiveFilterDisable, + /* Open drain output is disabled */ + kPORT_OpenDrainDisable, + /* Low drive strength is configured */ + kPORT_LowDriveStrength, + /* Normal drive strength is configured */ + kPORT_NormalDriveStrength, + /* Pin is configured as LPUART0_TXD */ + kPORT_MuxAlt2, + /* Digital input enabled */ + kPORT_InputBufferEnable, + /* Digital input is not inverted */ + kPORT_InputNormal, + /* Pin Control Register fields [15:0] are not locked */ + kPORT_UnlockRegister}; + /* PORT0_3 (pin 79) is configured as LPUART0_TXD */ + PORT_SetPinConfig(PORT0, 3U, &port0_3_pin79_config); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/pin_mux.h b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/pin_mux.h new file mode 100644 index 00000000000..fb7d1fc04c7 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/MCUX_Config/board/pin_mux.h @@ -0,0 +1,51 @@ +/* + * Copyright 2024 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/SConscript b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/SConscript new file mode 100644 index 00000000000..660c64b385c --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/SConscript @@ -0,0 +1,17 @@ +from building import * + +cwd = GetCurrentDir() + +# add the general drivers. +src = Split(""" +board.c +MCUX_Config/board/clock_config.c +MCUX_Config/board/pin_mux.c +""") + +CPPPATH = [cwd, cwd + '/MCUX_Config/board'] +CPPDEFINES = ['DEBUG', 'CPU_MCXA156VLL'] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES) + +Return('group') diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.c b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.c new file mode 100644 index 00000000000..06bc6957533 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.c @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-02-06 yandld first implementation + */ + +#include +#include + +#include "board.h" +#include "clock_config.h" +#include "drv_uart.h" + +/** + * This is the timer interrupt service routine. + * + */ +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +/** + * This function will initial board. + */ +void rt_hw_board_init() +{ + BOARD_InitBootPins(); + + /* This init has finished in secure side of TF-M */ + BOARD_InitBootClocks(); + + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + /* set pend exception priority */ + NVIC_SetPriority(PendSV_IRQn, (1 << __NVIC_PRIO_BITS) - 1); + + /*init uart device*/ + rt_hw_uart_init(); + +#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#ifdef RT_USING_COMPONENTS_INIT + /* initialization board with RT-Thread Components */ + rt_components_board_init(); +#endif + +#ifdef RT_USING_HEAP + rt_kprintf("sram heap, begin: 0x%p, end: 0x%p\n", HEAP_BEGIN, HEAP_END); + rt_system_heap_init((void *)HEAP_BEGIN, (void *)(HEAP_END)); +#endif +} + +/** + * This function will called when memory fault. + */ +void MemManage_Handler(void) +{ + extern void HardFault_Handler(void); + + rt_kprintf("Memory Fault!\n"); + HardFault_Handler(); +} + +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; + } + } + } +} diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.h b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.h new file mode 100644 index 00000000000..c7021329151 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/board.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2009-09-22 Bernard add board.h to this bsp + * 2010-02-04 Magicoe add board.h to LPC176x bsp + * 2013-12-18 Bernard porting to LPC4088 bsp + * 2017-08-02 XiaoYang porting to LPC54608 bsp + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + + +#include + +#include + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_reset.h" +#include "fsl_gpio.h" +#include "pin_mux.h" +#include "fsl_edma.h" + +// + +// +#if defined(__ARMCC_VERSION) +extern int Image$$ARM_LIB_HEAP$$ZI$$Base; +extern int Image$$ARM_LIB_STACK$$ZI$$Base; +#define HEAP_BEGIN ((void *)&Image$$ARM_LIB_HEAP$$ZI$$Base) +#define HEAP_END ((void*)&Image$$ARM_LIB_STACK$$ZI$$Base) +#elif defined(__ICCARM__) +#pragma section="HEAP" +#define HEAP_BEGIN (__segment_end("HEAP")) +extern void __RTT_HEAP_END; +#define HEAP_END (&__RTT_HEAP_END) +#elif defined(__GNUC__) +extern int __HeapBase; +extern int __HeapLimit; +#define HEAP_BEGIN ((void *)&__HeapBase) +#define HEAP_END ((void *)&__HeapLimit) +#endif + +void rt_hw_board_init(void); + + +#endif + + diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/linker_scripts/MCXA156_flash.ld b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/linker_scripts/MCXA156_flash.ld new file mode 100644 index 00000000000..efc24cbe150 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/linker_scripts/MCXA156_flash.ld @@ -0,0 +1,200 @@ +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compiler: GNU C Compiler +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240104 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_text (RX) : ORIGIN = 0x00000200, LENGTH = 0x000FFE00 + m_data (RW) : ORIGIN = 0x20000000, LENGTH = 0x0001E000 + m_sramx0 (RW) : ORIGIN = 0x04000000, LENGTH = 0x00002000 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/linker_scripts/MCXA156_flash.scf b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/linker_scripts/MCXA156_flash.scf new file mode 100644 index 00000000000..265cd9533cc --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/linker_scripts/MCXA156_flash.scf @@ -0,0 +1,71 @@ +#!armclang --target=arm-arm-none-eabi -march=armv8-m.main -E -x c +/* +** ################################################################### +** Processors: MCXA156VLL +** MCXA156VMP +** MCXA156VPJ +** +** Compiler: Keil ARM C/C++ Compiler +** Reference manual: MCXA18 User manual +** Version: rev. 1.0, 2022-03-29 +** Build: b240104 +** +** Abstract: +** Linker file for the Keil ARM C/C++ Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2024 NXP +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + +/* Sizes */ +#if (defined(__stack_size__)) + #define Stack_Size __stack_size__ +#else + #define Stack_Size 0x0400 +#endif + +#if (defined(__heap_size__)) + #define Heap_Size __heap_size__ +#else + #define Heap_Size 0x0400 +#endif + +#define m_interrupts_start 0x00000000 +#define m_interrupts_size 0x00000200 + +#define m_text_start 0x00000200 +#define m_text_size 0x000FFE00 + +#define m_data_start 0x20000000 +#define m_data_size 0x0001E000 + +#define m_sramx0_start 0x04000000; +#define m_sramx0_size 0x00002000; + +LR_m_text m_interrupts_start m_interrupts_size+m_text_size { ; load region size_region + + VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address + * (.isr_vector,+FIRST) + } + + ER_m_text m_text_start FIXED m_text_size { ; load address = execution address + * (InRoot$$Sections) + .ANY (+RO) + } + + RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data + .ANY (+RW +ZI) + } + ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up + } + ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down + } + +} diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx b/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx new file mode 100644 index 00000000000..41ae9542dc6 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx @@ -0,0 +1,1355 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rtthread-frdm-mcxa156 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 0 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 13 + + + + + + + + + + + BIN\UL2V8M.DLL + + + + 0 + UL2V8M + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0MCXA15X_1024 -FS00 -FL0100000 -FP0($$Device:MCXA156VLL$devices\MCXA156\arm\MCXA15X_1024.FLM)) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 5000000 + + + + + + Applications + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\pin\pin.c + pin.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + board\MCUX_Config\board\clock_config.c + clock_config.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + board\MCUX_Config\board\pin_mux.c + pin_mux.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\Libraries\drivers\drv_pin.c + drv_pin.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\Libraries\drivers\drv_uart.c + drv_uart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 7 + 51 + 2 + 0 + 0 + 0 + ..\..\..\..\..\libcpu\arm\cortex-m33\context_rvds.S + context_rvds.S + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\..\libcpu\arm\cortex-m33\cpuport.c + cpuport.c + 0 + 0 + + + 7 + 53 + 2 + 0 + 0 + 0 + ..\..\..\..\..\libcpu\arm\cortex-m33\syscall_rvds.S + syscall_rvds.S + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\..\libcpu\arm\cortex-m33\trustzone.c + trustzone.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 55 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpadc.c + fsl_lpadc.c + 0 + 0 + + + 8 + 56 + 2 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\arm\startup_MCXA156.s + startup_MCXA156.s + 0 + 0 + + + 8 + 57 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_gpio.c + fsl_gpio.c + 0 + 0 + + + 8 + 58 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_crc.c + fsl_crc.c + 0 + 0 + + + 8 + 59 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_edma.c + fsl_edma.c + 0 + 0 + + + 8 + 60 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_ostimer.c + fsl_ostimer.c + 0 + 0 + + + 8 + 61 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_vbat.c + fsl_vbat.c + 0 + 0 + + + 8 + 62 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_common.c + fsl_common.c + 0 + 0 + + + 8 + 63 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_edma_soc.c + fsl_edma_soc.c + 0 + 0 + + + 8 + 64 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpuart_edma.c + fsl_lpuart_edma.c + 0 + 0 + + + 8 + 65 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_cmc.c + fsl_cmc.c + 0 + 0 + + + 8 + 66 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_eim.c + fsl_eim.c + 0 + 0 + + + 8 + 67 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_i3c.c + fsl_i3c.c + 0 + 0 + + + 8 + 68 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_freqme.c + fsl_freqme.c + 0 + 0 + + + 8 + 69 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpi2c.c + fsl_lpi2c.c + 0 + 0 + + + 8 + 70 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_reset.c + fsl_reset.c + 0 + 0 + + + 8 + 71 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_eqdc.c + fsl_eqdc.c + 0 + 0 + + + 8 + 72 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_waketimer.c + fsl_waketimer.c + 0 + 0 + + + 8 + 73 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_glikey.c + fsl_glikey.c + 0 + 0 + + + 8 + 74 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_inputmux.c + fsl_inputmux.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_pwm.c + fsl_pwm.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_erm.c + fsl_erm.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_spc.c + fsl_spc.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_i3c_edma.c + fsl_i3c_edma.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpuart.c + fsl_lpuart.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpi2c_edma.c + fsl_lpi2c_edma.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_utick.c + fsl_utick.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_ctimer.c + fsl_ctimer.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_common_arm.c + fsl_common_arm.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lptmr.c + fsl_lptmr.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_wuu.c + fsl_wuu.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\system_MCXA156.c + system_MCXA156.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_wwdt.c + fsl_wwdt.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_aoi.c + fsl_aoi.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpcmp.c + fsl_lpcmp.c + 0 + 0 + + + 8 + 90 + 1 + 0 + 0 + 0 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_clock.c + fsl_clock.c + 0 + 0 + + + + + Utilities + 0 + 0 + 0 + 0 + + 9 + 91 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\utilities\ulog\backend\console_be.c + console_be.c + 0 + 0 + + + 9 + 92 + 1 + 0 + 0 + 0 + ..\..\..\..\..\components\utilities\ulog\ulog.c + ulog.c + 0 + 0 + + + +
    diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx b/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx new file mode 100644 index 00000000000..4e8d74e1291 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx @@ -0,0 +1,2387 @@ + + + + 2.1 + +
    ### uVision Project, (C) Keil Software
    + + + + rtthread-frdm-mcxa156 + 0x4 + ARM-ADS + 6180000::V6.18::ARMCLANG + 1 + + + MCXA156VLL + NXP + NXP.MCXA156_DFP.19.0.0 + https://mcuxpresso.nxp.com/cmsis_pack/repo/ + IRAM(0x20000000,0x01e000) IRAM2(0x04000000,0x3000) IROM(0x03000000,0x2000) IROM2(0x00000000,0x100000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ELITTLE + + + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0MCXA15X_1024 -FS00 -FL0100000 -FP0($$Device:MCXA156VLL$devices\MCXA156\arm\MCXA15X_1024.FLM)) + 0 + $$Device:MCXA156VLL$devices\MCXA156\fsl_device_registers.h + + + + + + + + + + $$Device:MCXA156VLL$devices\MCXA156\MCXA156.xml + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + + + + SARMV8M.DLL + + TCM.DLL + -pCM33 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4102 + + 1 + BIN\UL2V8M.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M33" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 1 + 1 + 16 + 0 + 0 + 0 + 0 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1e000 + + + 1 + 0x3000000 + 0x2000 + + + 1 + 0x4002000 + 0x1000 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x3000000 + 0x2000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1e000 + + + 0 + 0x4000000 + 0x3000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + + --target=arm-arm-none-eabi + __RTTHREAD__, RT_USING_ARMLIBC, DEBUG, __STDC_LIMIT_MACROS, CPU_MCXA156VLL, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND + + ..\..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\..\components\libc\compilers\common\include;..\Libraries\MCXA156\MCXA156;..\..\..\..\..\components\libc\posix\io\epoll;..\Libraries\MCXA156\MCXA156\drivers;..\..\..\..\..\components\libc\posix\ipc;..\..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\..\components\drivers\include;..\..\..\..\..\components\utilities\ulog;..\Libraries\MCXA156\middleware\sdmmc\inc;..\..\..\..\..\components\drivers\include;board\MCUX_Config\board;..\..\..\..\..\libcpu\arm\common;..\..\..\..\..\libcpu\arm\cortex-m33;..\..\..\..\..\components\finsh;..\Libraries\CMSIS\Core\Include;board;..\Libraries\drivers\config;..\Libraries\MCXA156\middleware\sdmmc\port;..\..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\..\components\drivers\include;.;..\..\..\..\..\components\drivers\include;..\Libraries\drivers;..\..\..\..\..\components\libc\posix\io\poll;applications;..\Libraries\MCXA156\components\codec;..\..\..\..\..\components\drivers\include;..\..\..\..\..\include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + -x assembler-with-cpp + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x02000000 + + .\board\linker_scripts\MCXA156_flash.scf + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\..\..\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + hwtimer.c + 1 + ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\..\..\..\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\..\..\..\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\..\..\..\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\..\..\..\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\..\..\..\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\..\..\..\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\..\..\..\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\..\..\..\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pin.c + 1 + ..\..\..\..\..\components\drivers\pin\pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + serial.c + 1 + ..\..\..\..\..\components\drivers\serial\serial.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + clock_config.c + 1 + board\MCUX_Config\board\clock_config.c + + + pin_mux.c + 1 + board\MCUX_Config\board\pin_mux.c + + + board.c + 1 + board\board.c + + + drv_pin.c + 1 + ..\Libraries\drivers\drv_pin.c + + + drv_uart.c + 1 + ..\Libraries\drivers\drv_uart.c + + + + + Finsh + + + cmd.c + 1 + ..\..\..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\..\..\components\finsh\msh.c + + + shell.c + 1 + ..\..\..\..\..\components\finsh\shell.c + + + msh_parse.c + 1 + ..\..\..\..\..\components\finsh\msh_parse.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\..\..\src\clock.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\..\..\..\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\..\..\..\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\..\..\..\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\..\..\..\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kstdio.c + 1 + ..\..\..\..\..\src\klibc\kstdio.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kstring.c + 1 + ..\..\..\..\..\src\klibc\kstring.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\..\..\..\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\..\..\..\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\..\..\..\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\..\..\..\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\..\..\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\..\..\..\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\..\..\..\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\..\..\..\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + libcpu + + + atomic_arm.c + 1 + ..\..\..\..\..\libcpu\arm\common\atomic_arm.c + + + div0.c + 1 + ..\..\..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\..\..\libcpu\arm\cortex-m33\context_rvds.S + + + cpuport.c + 1 + ..\..\..\..\..\libcpu\arm\cortex-m33\cpuport.c + + + syscall_rvds.S + 2 + ..\..\..\..\..\libcpu\arm\cortex-m33\syscall_rvds.S + + + trustzone.c + 1 + ..\..\..\..\..\libcpu\arm\cortex-m33\trustzone.c + + + + + Libraries + + + fsl_lpadc.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpadc.c + + + startup_MCXA156.s + 2 + ..\Libraries\MCXA156\MCXA156\arm\startup_MCXA156.s + + + fsl_gpio.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_gpio.c + + + fsl_crc.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_crc.c + + + fsl_edma.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_edma.c + + + fsl_ostimer.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_ostimer.c + + + fsl_vbat.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_vbat.c + + + fsl_common.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_common.c + + + fsl_edma_soc.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_edma_soc.c + + + fsl_lpuart_edma.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpuart_edma.c + + + fsl_cmc.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_cmc.c + + + fsl_eim.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_eim.c + + + fsl_i3c.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_i3c.c + + + fsl_freqme.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_freqme.c + + + fsl_lpi2c.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpi2c.c + + + fsl_reset.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_reset.c + + + fsl_eqdc.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_eqdc.c + + + fsl_waketimer.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_waketimer.c + + + fsl_glikey.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_glikey.c + + + fsl_inputmux.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_inputmux.c + + + fsl_pwm.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_pwm.c + + + fsl_erm.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_erm.c + + + fsl_spc.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_spc.c + + + fsl_i3c_edma.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_i3c_edma.c + + + fsl_lpuart.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpuart.c + + + fsl_lpi2c_edma.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpi2c_edma.c + + + fsl_utick.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_utick.c + + + fsl_ctimer.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_ctimer.c + + + fsl_common_arm.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_common_arm.c + + + fsl_lptmr.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lptmr.c + + + fsl_wuu.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_wuu.c + + + system_MCXA156.c + 1 + ..\Libraries\MCXA156\MCXA156\system_MCXA156.c + + + fsl_wwdt.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_wwdt.c + + + fsl_aoi.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_aoi.c + + + fsl_lpcmp.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_lpcmp.c + + + fsl_clock.c + 1 + ..\Libraries\MCXA156\MCXA156\drivers\fsl_clock.c + + + + + Utilities + + + console_be.c + 1 + ..\..\..\..\..\components\utilities\ulog\backend\console_be.c + + + ulog.c + 1 + ..\..\..\..\..\components\utilities\ulog\ulog.c + + + + + + + + + + + + + + + + + template + 1 + + + + +
    diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.h b/bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.h new file mode 100644 index 00000000000..0a801c8a32f --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.h @@ -0,0 +1,420 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +#define SOC_MCX + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +#define RT_KLIBC_USING_VSNPRINTF_LONGLONG +#define RT_KLIBC_USING_VSNPRINTF_STANDARD +#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS +#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS +#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER +#define RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER +#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32 +#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32 +#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6 +#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9 +#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4 +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 8 +#define RT_CPUS_NR 1 +#define RT_ALIGN_SIZE 8 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* kservice options */ + +/* end of kservice options */ +#define RT_USING_DEBUG +#define RT_DEBUGING_ASSERT +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart0" +#define RT_VER_NUM 0x50200 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_FPU +#define ARCH_ARM_CORTEX_SECURE +#define ARCH_ARM_CORTEX_M33 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN +#define RT_USING_HWTIMER +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +#define RT_USING_ULOG +#define ULOG_OUTPUT_LVL_D +#define ULOG_OUTPUT_LVL 7 +#define ULOG_ASSERT_ENABLE +#define ULOG_LINE_BUF_SIZE 128 + +/* log format */ + +#define ULOG_OUTPUT_FLOAT +#define ULOG_OUTPUT_LEVEL +#define ULOG_OUTPUT_TAG +/* end of log format */ +#define ULOG_BACKEND_USING_CONSOLE +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ + +/* Hardware Drivers Config */ + +#define SOC_MCXA156 + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_PIN +#define BSP_USING_UART +#define BSP_USING_UART0 +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.py b/bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.py new file mode 100644 index 00000000000..d33db80d7ca --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/rtconfig.py @@ -0,0 +1,198 @@ +import os +import sys + +# toolchains options +ARCH='arm' +CPU='cortex-m33' +CROSS_TOOL='gcc' +BOARD_NAME = 'frdm-mcxa156' +BSP_LIBRARY_TYPE = 'MCXA156' + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armclang' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = r'C:\Program Files\IAR Systems\Embedded Workbench 9.1' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' +#BUILD = 'release' + +if PLATFORM == 'gcc': + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + CXX = PREFIX + 'g++' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + STRIP = PREFIX + 'strip' + + DEVICE = ' -mcpu=' + CPU + '+nodsp' + ' -mthumb -mfloat-abi=soft -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Wall' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__START=entry -D__STARTUP_CLEAR_BSS' + LFLAGS = DEVICE + ' -specs=nano.specs -specs=nosys.specs -Wl,--defsym=__heap_size__=0x2000,--gc-sections,-Map=rtthread.map,--print-memory-usage -Tboard/linker_scripts/MCXA156_flash.ld' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -gdwarf-2' + AFLAGS += ' -gdwarf-2' + CFLAGS += ' -O0' + else: + CFLAGS += ' -O2 -Os' + + POST_ACTION = OBJCPY + ' -O binary --remove-section=.boot_data --remove-section=.image_vertor_table --remove-section=.ncache $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + + # module setting + CXXFLAGS = ' -Woverloaded-virtual -fno-exceptions -fno-rtti' + CXXFLAGS += CFLAGS + + 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 -static-libgcc' + M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu ' + CPU + '.fp.sp' + CFLAGS = DEVICE + ' --apcs=interwork' + AFLAGS = DEVICE + LFLAGS = DEVICE + ' --libpath "' + EXEC_PATH + '/ARM/ARMCC/lib" --info sizes --info totals --info unused --info veneers --list rtthread.map --scatter "./MCXA156_flash.scf" ' + + LFLAGS += ' --keep *.o(.rti_fn.*) --keep *.o(FSymTab) --keep *.o(VSymTab)' + + CFLAGS += ' --diag_suppress=66,1296,186,6134' + 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' + + CXXFLAGS = CFLAGS + CFLAGS += ' --c99' + + POST_ACTION = 'fromelf -z $TARGET' + # POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'armclang': + # toolchains + CC = 'armclang' + CXX = 'armclang' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M33 ' + CFLAGS = ' --target=arm-arm-none-eabi' + CFLAGS += ' -mcpu=' + CPU + CFLAGS += ' -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar ' + CFLAGS += ' -gdwarf-3 -ffunction-sections ' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers ' + LFLAGS += ' --list rt-thread.map ' + LFLAGS += r' --strict --scatter "board\linker_scripts\MCXA156_flash.sct" ' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib' + + EXEC_PATH += '/ARM/ARMCLANG/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O1' # armclang recommend + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = ' -D__FPU_PRESENT' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --debug' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=' + CPU + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' -Ol' + CFLAGS += ' --use_c++_inline' + + AFLAGS = '' + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu ' + CPU + AFLAGS += ' --fpu None' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/MCXA156_flash.icf"' + LFLAGS += ' --redirect _Printf=_PrintfTiny' + LFLAGS += ' --redirect _Scanf=_ScanfSmall' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +def dist_handle(BSP_ROOT, dist_dir): + 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/nxp/mcx/mcxa/frdm-mcxa156/template.uvoptx b/bsp/nxp/mcx/mcxa/frdm-mcxa156/template.uvoptx new file mode 100644 index 00000000000..5d08ddb8408 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/template.uvoptx @@ -0,0 +1,179 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rtthread-frdm-mcxa153 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 8 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 13 + + + + + + + + + + + BIN\UL2V8M.DLL + + + + 0 + UL2V8M + UL2V8M(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0MCXA15X_1024 -FL0100000 -FS00 -FP0($$Device:MCXA156VLL$devices\MCXA156\arm\MCXA15X_1024.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 5000000 + + + + +
    diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/template.uvprojx b/bsp/nxp/mcx/mcxa/frdm-mcxa156/template.uvprojx new file mode 100644 index 00000000000..6d4efbd7883 --- /dev/null +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/template.uvprojx @@ -0,0 +1,401 @@ + + + + 2.1 + +
    ### uVision Project, (C) Keil Software
    + + + + rtthread-frdm-mcxa156 + 0x4 + ARM-ADS + 6190000::V6.19::ARMCLANG + 1 + + + MCXA156VLL + NXP + NXP.MCXA156_DFP.19.0.0 + https://mcuxpresso.nxp.com/cmsis_pack/repo/ + IRAM(0x20000000,0x01e000) IRAM2(0x04000000,0x3000) IROM(0x03000000,0x2000) IROM2(0x00000000,0x100000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ELITTLE + + + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0MCXA15X_1024 -FS00 -FL0100000 -FP0($$Device:MCXA156VLL$devices\MCXA156\arm\MCXA15X_1024.FLM)) + 0 + $$Device:MCXA156VLL$devices\MCXA156\fsl_device_registers.h + + + + + + + + + + $$Device:MCXA156VLL$devices\MCXA156\MCXA156.xml + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + + + + SARMV8M.DLL + + TCM.DLL + -pCM33 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4102 + + 1 + BIN\UL2V8M.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M33" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 1 + 1 + 16 + 0 + 0 + 0 + 0 + 4 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1e000 + + + 1 + 0x3000000 + 0x2000 + + + 1 + 0x4002000 + 0x1000 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x3000000 + 0x2000 + + + 1 + 0x0 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1e000 + + + 0 + 0x4000000 + 0x3000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 3 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + + --target=arm-arm-none-eabi + CPU_MCXA156VLL, ARM_MATH_CM33, RT_USING_ARM_LIBC + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + -x assembler-with-cpp + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x02000000 + + .\board\linker_scripts\MCXA156_flash.scf + + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) --keep *.o(VSymTab) + + + + + + + + + + + + + + + + + + template + 1 + + + + +
    From 6e3c9acd3907baad0fe7669d998b8748709b04f5 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Wed, 22 Jan 2025 14:26:05 +0800 Subject: [PATCH 45/51] =?UTF-8?q?[lwp]=E4=BF=AE=E6=AD=A3kill(pid=20<=20-1)?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E8=BF=94=E5=9B=9E=E5=80=BC=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp_syscall.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 72f5b87ba60..96bad92b51f 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -1000,6 +1000,7 @@ sysret_t sys_kill(int pid, int signo) switch (kret) { case -RT_ENOENT: + case -ECHILD: sysret = -ESRCH; break; case -RT_EINVAL: From d83d71cc057a32927a8156616339b776fa72af3f Mon Sep 17 00:00:00 2001 From: Rbb666 Date: Sat, 8 Feb 2025 13:15:30 +0800 Subject: [PATCH 46/51] =?UTF-8?q?[drivers/spi]=E7=BB=9F=E4=B8=80=E8=BD=AF?= =?UTF-8?q?=E4=BB=B6SPI=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lpc55sxx/lpc55s69_nxp_evk/board/Kconfig | 2 +- bsp/raspberry-pico/board/Kconfig | 2 +- bsp/renesas/ra6m3-hmi-board/board/Kconfig | 2 +- .../libraries/HAL_Drivers/drivers/SConscript | 2 +- .../HAL_Drivers/drivers/drv_soft_spi.c | 4 ++-- .../libraries/HAL_Drivers/drivers/drv_spi.c | 1 + .../stm32f407-atk-explorer/board/Kconfig | 2 +- .../stm32f407-fk407m2-zgt6/board/Kconfig | 2 +- .../stm32f407-lckfb-skystar/board/Kconfig | 2 +- bsp/stm32/stm32f407-rt-spark/board/Kconfig | 2 +- bsp/wch/risc-v/ch32v208w-r0/board/Kconfig | 2 +- bsp/wch/risc-v/ch32v307v-r1/board/Kconfig | 2 +- bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig | 2 +- components/drivers/spi/Kconfig | 19 ++++++------------- components/drivers/spi/SConscript | 4 +--- 15 files changed, 21 insertions(+), 29 deletions(-) diff --git a/bsp/nxp/lpc/lpc55sxx/lpc55s69_nxp_evk/board/Kconfig b/bsp/nxp/lpc/lpc55sxx/lpc55s69_nxp_evk/board/Kconfig index 18850d8bf26..1ca764c2950 100644 --- a/bsp/nxp/lpc/lpc55sxx/lpc55s69_nxp_evk/board/Kconfig +++ b/bsp/nxp/lpc/lpc55sxx/lpc55s69_nxp_evk/board/Kconfig @@ -174,7 +174,7 @@ menu "On-chip Peripheral Drivers" bool "Enable soft SPI BUS" default n select RT_USING_PIN - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI select RT_USING_SPI if BSP_USING_SOFT_SPI config BSP_USING_SOFT_SPI1 diff --git a/bsp/raspberry-pico/board/Kconfig b/bsp/raspberry-pico/board/Kconfig index b4201827b76..bffb545386a 100644 --- a/bsp/raspberry-pico/board/Kconfig +++ b/bsp/raspberry-pico/board/Kconfig @@ -154,7 +154,7 @@ menu "On-chip Peripheral Drivers" bool "Enable soft SPI BUS" default n select RT_USING_PIN - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI select RT_USING_SPI if BSP_USING_SOFT_SPI config BSP_USING_SOFT_SPI0 diff --git a/bsp/renesas/ra6m3-hmi-board/board/Kconfig b/bsp/renesas/ra6m3-hmi-board/board/Kconfig index 0c88511a258..db9325579df 100644 --- a/bsp/renesas/ra6m3-hmi-board/board/Kconfig +++ b/bsp/renesas/ra6m3-hmi-board/board/Kconfig @@ -202,7 +202,7 @@ menu "Hardware Drivers Config" bool "Enable soft SPI BUS" default n select RT_USING_PIN - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI select RT_USING_SPI if BSP_USING_SOFT_SPI config BSP_USING_SOFT_SPI1 diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/SConscript b/bsp/stm32/libraries/HAL_Drivers/drivers/SConscript index 3a836bd4279..12fac190617 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/SConscript +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/SConscript @@ -29,7 +29,7 @@ if GetDepend(['RT_USING_SPI']): if GetDepend(['RT_USING_QSPI']): src += ['drv_qspi.c'] -if GetDepend('RT_USING_SPI_BITOPS'): +if GetDepend('RT_USING_SOFT_SPI'): src += ['drv_soft_spi.c'] if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']): diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_spi.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_spi.c index ff9e12473d8..a612defa20f 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_spi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_soft_spi.c @@ -12,7 +12,7 @@ #include "drv_soft_spi.h" #include "drv_config.h" -#if defined(RT_USING_SPI) && defined(RT_USING_SPI_BITOPS) && defined(RT_USING_PIN) +#if defined(RT_USING_SPI) && defined(RT_USING_SOFT_SPI) && defined(RT_USING_PIN) //#define DRV_DEBUG #define LOG_TAG "drv.soft_spi" @@ -203,4 +203,4 @@ int rt_hw_softspi_init(void) } INIT_BOARD_EXPORT(rt_hw_softspi_init); -#endif /* defined(RT_USING_SPI) && defined(RT_USING_SPI_BITOPS) && defined(RT_USING_PIN) */ +#endif /* defined(RT_USING_SPI) && defined(RT_USING_SOFT_SPI) && defined(RT_USING_PIN) */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c index c08f33efcaf..3a7bf681258 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c @@ -534,6 +534,7 @@ static rt_err_t spi_configure(struct rt_spi_device *device, struct stm32_spi *spi_drv = rt_container_of(device->bus, struct stm32_spi, spi_bus); spi_drv->cfg = configuration; + rt_kprintf("@spi_configure\n"); return stm32_spi_init(spi_drv, configuration); } diff --git a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig index 864b89a841f..39abe46ffa4 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig +++ b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig @@ -288,7 +288,7 @@ menu "On-chip Peripheral Drivers" bool "Enable soft SPI BUS" default n select RT_USING_SPI - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI select RT_USING_PIN if BSP_USING_SOFT_SPI menuconfig BSP_USING_SOFT_SPI1 diff --git a/bsp/stm32/stm32f407-fk407m2-zgt6/board/Kconfig b/bsp/stm32/stm32f407-fk407m2-zgt6/board/Kconfig index 167b97c2c37..68188add695 100644 --- a/bsp/stm32/stm32f407-fk407m2-zgt6/board/Kconfig +++ b/bsp/stm32/stm32f407-fk407m2-zgt6/board/Kconfig @@ -161,7 +161,7 @@ menu "On-chip Peripheral Drivers" bool "Enable soft SPI BUS" default n select RT_USING_SPI - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI select RT_USING_PIN if BSP_USING_SOFT_SPI menuconfig BSP_USING_SOFT_SPI1 diff --git a/bsp/stm32/stm32f407-lckfb-skystar/board/Kconfig b/bsp/stm32/stm32f407-lckfb-skystar/board/Kconfig index 8e382b92c8a..56d04b4cd3a 100644 --- a/bsp/stm32/stm32f407-lckfb-skystar/board/Kconfig +++ b/bsp/stm32/stm32f407-lckfb-skystar/board/Kconfig @@ -231,7 +231,7 @@ menu "On-chip Peripheral Drivers" bool "Enable soft SPI BUS" default n select RT_USING_SPI - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI select RT_USING_PIN if BSP_USING_SOFT_SPI menuconfig BSP_USING_SOFT_SPI1 diff --git a/bsp/stm32/stm32f407-rt-spark/board/Kconfig b/bsp/stm32/stm32f407-rt-spark/board/Kconfig index 9df736bfeed..0a6fcc56420 100644 --- a/bsp/stm32/stm32f407-rt-spark/board/Kconfig +++ b/bsp/stm32/stm32f407-rt-spark/board/Kconfig @@ -454,7 +454,7 @@ menu "On-chip Peripheral Drivers" bool "Enable soft SPI BUS" default n select RT_USING_SPI - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI select RT_USING_PIN if BSP_USING_SOFT_SPI menuconfig BSP_USING_SOFT_SPI1 diff --git a/bsp/wch/risc-v/ch32v208w-r0/board/Kconfig b/bsp/wch/risc-v/ch32v208w-r0/board/Kconfig index 567e4ce6b52..4eb338e84d4 100644 --- a/bsp/wch/risc-v/ch32v208w-r0/board/Kconfig +++ b/bsp/wch/risc-v/ch32v208w-r0/board/Kconfig @@ -164,7 +164,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_SPI bool "Enable SPI" - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI select RT_USING_SPI if BSP_USING_SPI diff --git a/bsp/wch/risc-v/ch32v307v-r1/board/Kconfig b/bsp/wch/risc-v/ch32v307v-r1/board/Kconfig index 23c3f1eb3d2..d9275a620ea 100644 --- a/bsp/wch/risc-v/ch32v307v-r1/board/Kconfig +++ b/bsp/wch/risc-v/ch32v307v-r1/board/Kconfig @@ -222,7 +222,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_SOFT_SPI bool "Enable SOFT SPI" - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI if BSP_USING_SOFT_SPI config BSP_USING_SOFT_SPI1 diff --git a/bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig b/bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig index 331bb9c8cfc..c20f233f302 100644 --- a/bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig +++ b/bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig @@ -161,7 +161,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_SOFT_SPI bool "Enable SOFT SPI" - select RT_USING_SPI_BITOPS + select RT_USING_SOFT_SPI if BSP_USING_SOFT_SPI config BSP_USING_SOFT_SPI1 diff --git a/components/drivers/spi/Kconfig b/components/drivers/spi/Kconfig index f2fbd7edada..4b95a18bfed 100644 --- a/components/drivers/spi/Kconfig +++ b/components/drivers/spi/Kconfig @@ -3,22 +3,11 @@ config RT_USING_SPI default n if RT_USING_SPI - config RT_USING_SPI_BITOPS - select RT_USING_PIN - bool "Use GPIO to simulate SPI" - default n - - if RT_USING_SPI_BITOPS - config RT_SPI_BITOPS_DEBUG - bool "Use simulate SPI debug message" - default n - endif menuconfig RT_USING_SOFT_SPI - bool "Use GPIO to soft simulate SPI" + bool "Use GPIO to simulate SPI" default n select RT_USING_PIN - select RT_USING_SPI_BITOPS if RT_USING_SOFT_SPI menuconfig RT_USING_SOFT_SPI0 bool "Enable SPI0 Bus (software simulation)" @@ -188,9 +177,13 @@ config RT_USING_SPI range 0 32767 default 1 endif - endif + config RT_SPI_BITOPS_DEBUG + bool "Use simulate SPI debug message" + depends on RT_USING_SOFT_SPI + default n + config RT_USING_QSPI bool "Enable QSPI mode" default n diff --git a/components/drivers/spi/SConscript b/components/drivers/spi/SConscript index fc608c46aeb..df0ffb71410 100644 --- a/components/drivers/spi/SConscript +++ b/components/drivers/spi/SConscript @@ -7,10 +7,8 @@ src = ['dev_spi_core.c', 'dev_spi.c'] CPPPATH = [cwd, cwd + '/../include'] LOCAL_CFLAGS = '' -if GetDepend('RT_USING_SPI_BITOPS'): - src += ['dev_spi_bit_ops.c'] - if GetDepend('RT_USING_SOFT_SPI'): + src += ['dev_spi_bit_ops.c'] src += ['dev_soft_spi.c'] if GetDepend('RT_USING_QSPI'): From d3d33ff9835c6230152b8f8b6ceb30dbc93666e1 Mon Sep 17 00:00:00 2001 From: heyuanjie87 <943313837@qq.com> Date: Sun, 9 Feb 2025 15:55:30 +0800 Subject: [PATCH 47/51] =?UTF-8?q?[dfs]mmap=E7=9A=84=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=9C=A8=E5=85=B3=E9=97=AD=E5=90=8E=E9=87=8A=E6=94=BEfile?= =?UTF-8?q?=E6=8C=87=E9=92=88=20(#9917)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [dfs]mmap的文件在关闭后释放file指针 --- components/dfs/dfs_v2/include/dfs.h | 3 ++ components/dfs/dfs_v2/src/dfs.c | 41 ++++++++++++++++------- components/dfs/dfs_v2/src/dfs_file_mmap.c | 1 + 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/components/dfs/dfs_v2/include/dfs.h b/components/dfs/dfs_v2/include/dfs.h index 8b8c80188f8..582ec428aca 100644 --- a/components/dfs/dfs_v2/include/dfs.h +++ b/components/dfs/dfs_v2/include/dfs.h @@ -141,6 +141,9 @@ struct dfs_fdtable *dfs_fdtable_get_global(void); int dfs_dup(int oldfd, int startfd); #endif /* DFS_USING_POSIX */ +struct dfs_file* dfs_file_create(void); +void dfs_file_destroy(struct dfs_file *file); + #ifdef __cplusplus } #endif diff --git a/components/dfs/dfs_v2/src/dfs.c b/components/dfs/dfs_v2/src/dfs.c index 527ba896271..7e6b2c14ad4 100644 --- a/components/dfs/dfs_v2/src/dfs.c +++ b/components/dfs/dfs_v2/src/dfs.c @@ -190,6 +190,33 @@ int dfs_init(void) } INIT_PREV_EXPORT(dfs_init); +struct dfs_file* dfs_file_create(void) +{ + struct dfs_file *file; + + file = (struct dfs_file *)rt_calloc(1, sizeof(struct dfs_file)); + if (file) + { + file->magic = DFS_FD_MAGIC; + file->ref_count = 1; + rt_mutex_init(&file->pos_lock, "fpos", RT_IPC_FLAG_PRIO); + } + + return file; +} + +void dfs_file_destroy(struct dfs_file *file) +{ + rt_mutex_detach(&file->pos_lock); + + if (file->mmap_context) + { + rt_free(file->mmap_context); + } + + rt_free(file); +} + /** * @ingroup Fd * This function will allocate a file descriptor. @@ -217,13 +244,10 @@ int fdt_fd_new(struct dfs_fdtable *fdt) { struct dfs_file *file; - file = (struct dfs_file *)rt_calloc(1, sizeof(struct dfs_file)); + file = dfs_file_create(); if (file) { - file->magic = DFS_FD_MAGIC; - file->ref_count = 1; - rt_mutex_init(&file->pos_lock, "fpos", RT_IPC_FLAG_PRIO); fdt->fds[idx] = file; LOG_D("allocate a new fd @ %d", idx); @@ -255,14 +279,7 @@ void fdt_fd_release(struct dfs_fdtable *fdt, int fd) if (file && file->ref_count == 1) { - rt_mutex_detach(&file->pos_lock); - - if (file->mmap_context) - { - rt_free(file->mmap_context); - } - - rt_free(file); + dfs_file_destroy(file); } else { diff --git a/components/dfs/dfs_v2/src/dfs_file_mmap.c b/components/dfs/dfs_v2/src/dfs_file_mmap.c index b976a85a270..1555ae06874 100644 --- a/components/dfs/dfs_v2/src/dfs_file_mmap.c +++ b/components/dfs/dfs_v2/src/dfs_file_mmap.c @@ -152,6 +152,7 @@ static void on_varea_close(struct rt_varea *varea) if (rt_atomic_load(&(file->ref_count)) == 1) { dfs_file_close(file); + dfs_file_destroy(file); } else { From 12fded19f531a4711e36a19de1f1f5055c1be110 Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Sat, 18 Jan 2025 11:57:39 +0800 Subject: [PATCH 48/51] [DM/FDT] Fixup earlycon loss old messages. The `rt_fdt_scan_chosen_stdout` will init fdt_earlycon data without `msg` only, the `msg_idx` should not clean, too. Because we check if have old messages by `msg_idx` Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/drivers/ofw/fdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/drivers/ofw/fdt.c b/components/drivers/ofw/fdt.c index cca4cdd20d5..cfd6c32f23f 100644 --- a/components/drivers/ofw/fdt.c +++ b/components/drivers/ofw/fdt.c @@ -593,7 +593,7 @@ rt_err_t rt_fdt_scan_chosen_stdout(void) int len, options_len = 0; const char *options = RT_NULL, *con_type = RT_NULL; - rt_memset(&fdt_earlycon, 0, sizeof(fdt_earlycon) - sizeof(fdt_earlycon.msg)); + rt_memset(&fdt_earlycon, 0, rt_offsetof(struct rt_fdt_earlycon, msg_idx)); fdt_earlycon.nodeoffset = -1; offset = fdt_path_offset(_fdt, "/chosen"); From 4edfa4895c082fcca9143526af85a05f05339f3f Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Mon, 10 Feb 2025 17:06:43 +0800 Subject: [PATCH 49/51] ci: remove spell_check We often get wrong report when documentation related are changed, such as: ``` Getting action download info Error: This request has been automatically failed because it uses a deprecated version of `actions/download-artifact: v3`. Learn more: https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/. This request has been automatically failed because it uses a deprecated version of `actions/upload-artifact: v3`. Learn more: https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/ ``` Just remove this action till now. Signed-off-by: Chen Wang --- .github/workflows/spell_check.yml | 34 ------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 .github/workflows/spell_check.yml diff --git a/.github/workflows/spell_check.yml b/.github/workflows/spell_check.yml deleted file mode 100644 index b27d82fbb29..00000000000 --- a/.github/workflows/spell_check.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Check Spelling - -on: - pull_request: - branches: - - master - paths: - - 'documentation/**' -jobs: - spelling: - name: Check Spelling - runs-on: ubuntu-22.04 - if: github.repository_owner == 'RT-Thread' - steps: - - name: output ignore words info - run: | - echo "> If any words shown as incorrect are spelled correctly, please add them to .github/actions/spelling/allow.txt." >> $GITHUB_STEP_SUMMARY - - name: check spelling - id: spelling - uses: check-spelling/check-spelling@v0.0.20 - with: - checkout: true - check_file_names: 0 - only_check_changed_files: 1 - post_comment: 0 - extra_dictionaries: - cspell:en_US/src/en_US.txt - cspell:software-terms/softwareTerms.txt - cspell:python/python.txt - cspell:cpp/cpp.txt - check_extra_dictionaries: '' - - name: output Success info - run: | - echo "✅ Check spelling success." >> $GITHUB_STEP_SUMMARY From 21ea7c675ca5cd5f5add97995c55aa064bb62a60 Mon Sep 17 00:00:00 2001 From: Supper Thomas <78900636@qq.com> Date: Tue, 11 Feb 2025 08:36:16 +0800 Subject: [PATCH 50/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20bsp=5Fbuildings.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/bsp_buildings.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index dd14e2505b7..7726bbebca9 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -353,6 +353,7 @@ jobs: RTT_TOOL_CHAIN: "sourcery-riscv-none-embed" SUB_RTT_BSP: - "k210" + - "wch/risc-v/ch32v307v-r1" - RTT_BSP: "riscv64-unknown" RTT_TOOL_CHAIN: "sourcery-riscv64-unknown-elf" SUB_RTT_BSP: From f820c1948a268b8824077e3155986c8e2706391f Mon Sep 17 00:00:00 2001 From: Rbb666 <64397326+Rbb666@users.noreply.github.com> Date: Tue, 11 Feb 2025 13:04:31 +0800 Subject: [PATCH 51/51] =?UTF-8?q?[drivers/spi]=E4=BF=AE=E5=A4=8Dspi=20conf?= =?UTF-8?q?igure=E4=BC=9A=E6=89=A7=E8=A1=8C=E4=B8=A4=E6=AC=A1=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#9972)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [drivers/spi]修复spi configure会执行两次的问题 --- components/drivers/spi/dev_spi_core.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/components/drivers/spi/dev_spi_core.c b/components/drivers/spi/dev_spi_core.c index 3a3008d6e7c..978d5a4161c 100644 --- a/components/drivers/spi/dev_spi_core.c +++ b/components/drivers/spi/dev_spi_core.c @@ -64,7 +64,7 @@ rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus, for (int i = 0; i < pin_count; ++i) { bus->pins[i] = rt_pin_get_named_pin(&bus->parent, "cs", i, - RT_NULL, RT_NULL); + RT_NULL, RT_NULL); } } else if (pin_count == 0) @@ -103,12 +103,15 @@ rt_err_t rt_spi_bus_attach_device_cspin(struct rt_spi_device *device, { device->bus = (struct rt_spi_bus *)bus; + if (device->bus->owner == RT_NULL) + device->bus->owner = device; + /* initialize spidev device */ result = rt_spidev_device_init(device, name); if (result != RT_EOK) return result; - if(cs_pin != PIN_NONE) + if (cs_pin != PIN_NONE) { rt_pin_mode(cs_pin, PIN_MODE_OUTPUT); } @@ -140,7 +143,7 @@ rt_err_t rt_spi_bus_configure(struct rt_spi_device *device) result = rt_mutex_take(&(device->bus->lock), RT_WAITING_FOREVER); if (result == RT_EOK) { - if (device->bus->owner == RT_NULL || device->bus->owner == device) + if (device->bus->owner == device) { /* current device is using, re-configure SPI bus */ result = device->bus->ops->configure(device, &device->config); @@ -157,7 +160,6 @@ rt_err_t rt_spi_bus_configure(struct rt_spi_device *device) */ result = -RT_EBUSY; } - /* release lock */ rt_mutex_release(&(device->bus->lock)); } @@ -451,7 +453,7 @@ rt_err_t rt_spi_sendrecv16(struct rt_spi_device *device, } len = rt_spi_transfer(device, &senddata, recvdata, 2); - if(len < 0) + if (len < 0) { return (rt_err_t)len; } @@ -578,7 +580,7 @@ rt_err_t rt_spi_take(struct rt_spi_device *device) message.cs_take = 1; result = device->bus->ops->xfer(device, &message); - if(result < 0) + if (result < 0) { return (rt_err_t)result; } @@ -598,7 +600,7 @@ rt_err_t rt_spi_release(struct rt_spi_device *device) message.cs_release = 1; result = device->bus->ops->xfer(device, &message); - if(result < 0) + if (result < 0) { return (rt_err_t)result; }

O&WcF~Bp^1TbP9z8Pj*a9d-EZFs6qxUy>I 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� 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ℜ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�##=nc4?n6f=2;|UHYnS+&FaF<;Pi; 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

;-spNf4FGLD76iinC|( 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 Yl9 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 z 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